@mevdragon/vidfarm-devcli 0.13.0 → 0.15.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/.agents/skills/embedded-captions/CATALOG.md +93 -0
- package/.agents/skills/embedded-captions/SKILL.md +286 -0
- package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
- package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
- package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
- package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
- package/.agents/skills/embedded-captions/dna/README.md +148 -0
- package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
- package/.agents/skills/embedded-captions/dna/cream.json +69 -0
- package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
- package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
- package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
- package/.agents/skills/embedded-captions/dna/ink.json +65 -0
- package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
- package/.agents/skills/embedded-captions/dna/loud.json +75 -0
- package/.agents/skills/embedded-captions/dna/neon.json +58 -0
- package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
- package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
- package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
- package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
- package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
- package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
- package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
- package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
- package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
- package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
- package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
- package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
- package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
- package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
- package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
- package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
- package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
- package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
- package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
- package/.agents/skills/embedded-captions/references/rail.md +68 -0
- package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
- package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
- package/.agents/skills/embedded-captions/references/test-set.md +66 -0
- package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
- package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
- package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
- package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
- package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
- package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
- package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
- package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
- package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
- package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
- package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
- package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
- package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
- package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
- package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
- package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
- package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
- package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
- package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
- package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
- package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
- package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
- package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
- package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
- package/.agents/skills/embedded-captions/themes/README.md +244 -0
- package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
- package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
- package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
- package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
- package/.agents/skills/embedded-captions/themes/brush.json +74 -0
- package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
- package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
- package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
- package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
- package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
- package/.agents/skills/embedded-captions/themes/laser.json +46 -0
- package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
- package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
- package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
- package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
- package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
- package/.agents/skills/embedded-captions/themes/popup.json +46 -0
- package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
- package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
- package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
- package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
- package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
- package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
- package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
- package/.agents/skills/embedded-captions/themes/transit.json +44 -0
- package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
- package/.agents/skills/faceless-explainer/SKILL.md +209 -0
- package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
- package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
- package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
- package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
- package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
- package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
- package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
- package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
- package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
- package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/flockposter/LICENSE +17 -0
- package/.agents/skills/flockposter/README.md +72 -0
- package/.agents/skills/flockposter/SKILL.md +562 -0
- package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
- package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
- package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
- package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
- package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
- package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
- package/.agents/skills/general-video/SKILL.md +143 -0
- package/.agents/skills/hyperframes/SKILL.md +160 -0
- package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
- package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
- package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
- package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
- package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
- package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
- package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
- package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
- package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
- package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
- package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
- package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
- package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
- package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
- package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
- package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
- package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
- package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
- package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
- package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
- package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
- package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
- package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
- package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
- package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
- package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
- package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
- package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
- package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
- package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
- package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
- package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
- package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
- package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
- package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
- package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
- package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
- package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
- package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
- package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
- package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
- package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
- package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
- package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
- package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
- package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
- package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
- package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
- package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
- package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
- package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
- package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
- package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
- package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
- package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
- package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
- package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
- package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
- package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
- package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
- package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
- package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
- package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
- package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
- package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
- package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
- package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
- package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
- package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
- package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
- package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
- package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
- package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-animation/techniques.md +507 -0
- package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
- package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
- package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
- package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
- package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
- package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
- package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
- package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
- package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
- package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
- package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
- package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
- package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
- package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
- package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
- package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
- package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
- package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
- package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
- package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
- package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
- package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
- package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
- package/.agents/skills/hyperframes-core/SKILL.md +78 -0
- package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
- package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
- package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
- package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
- package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
- package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
- package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
- package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
- package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
- package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
- package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
- package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
- package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
- package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
- package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
- package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
- package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
- package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
- package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
- package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
- package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
- package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
- package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
- package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
- package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
- package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
- package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
- package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
- package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
- package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
- package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
- package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
- package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
- package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
- package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
- package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
- package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
- package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
- package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
- package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
- package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
- package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
- package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
- package/.agents/skills/motion-graphics/SKILL.md +172 -0
- package/.agents/skills/motion-graphics/agents/builder.md +40 -0
- package/.agents/skills/motion-graphics/agents/director.md +53 -0
- package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
- package/.agents/skills/motion-graphics/catalog-map.md +40 -0
- package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
- package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
- package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
- package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
- package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
- package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
- package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
- package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
- package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
- package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
- package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
- package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
- package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
- package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
- package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
- package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
- package/.agents/skills/product-launch-video/SKILL.md +208 -0
- package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
- package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
- package/.agents/skills/product-launch-video/references/story-design.md +373 -0
- package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
- package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
- package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
- package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
- package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
- package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
- package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
- package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
- package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
- package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
- package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
- package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
- package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
- package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
- package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
- package/.agents/skills/slideshow/SKILL.md +550 -0
- package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
- package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
- package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
- package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
- package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
- package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
- package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
- package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
- package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
- package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
- package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
- package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
- package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
- package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
- package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
- package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
- package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
- package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
- package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
- package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
- package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
- package/.agents/skills/vidfarm-media/SKILL.md +85 -0
- package/.agents/skills/vidfarm-media/references/tts.md +54 -0
- package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
- package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
- package/.agents/skills/website-to-video/SKILL.md +145 -0
- package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
- package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
- package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
- package/.agents/skills/website-to-video/references/capabilities.md +713 -0
- package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
- package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
- package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
- package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
- package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
- package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
- package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
- package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
- package/SKILL.director.md +60 -4
- package/SKILL.platform.md +7 -2
- package/demo/dist/app.css +1 -1
- package/demo/dist/app.js +485 -86
- package/dist/src/account-pages-legacy.js +9 -14
- package/dist/src/app.js +659 -159
- package/dist/src/cli.js +618 -17
- package/dist/src/composition-runtime.js +286 -6
- package/dist/src/devcli/composition-edit.js +176 -8
- package/dist/src/devcli/doctor.js +192 -0
- package/dist/src/devcli/hyperframes-cli.js +118 -0
- package/dist/src/devcli/skills.js +476 -0
- package/dist/src/devcli/stills.js +249 -0
- package/dist/src/devcli/transitions.js +205 -0
- package/dist/src/editor-chat.js +260 -4
- package/dist/src/frontend/template-editor-chat.js +6 -5
- package/dist/src/homepage.js +2 -48
- package/dist/src/hyperframes/composition.js +188 -7
- package/dist/src/services/composition-lint.js +199 -0
- package/dist/src/services/hyperframes.js +127 -28
- package/dist/src/services/serverless-records.js +7 -0
- package/dist/src/template-editor-shell.js +87 -48
- package/package.json +2 -1
- package/public/assets/page-runtime-client-app.js +31 -31
|
@@ -0,0 +1,313 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: depth-of-field-blur
|
|
3
|
+
description: Selective-focus rack-focus — pull the eye to a focal element by GSAP-tweening filter blur (+ a small opacity dim) on the off-focus layers while the focal one stays sharp. Drive blur via a `--dof` CSS var; finite tweens, no CSS transition, deterministic. Covers single focal pull, rack-focus between two depth planes, and blur-the-cluster-while-pushing-in.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: blur, focus, depth-of-field, dof, rack-focus, filter, dim, spotlight, cinematic, push-in
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Depth-of-Field Blur (Selective Focus / Rack Focus)
|
|
9
|
+
|
|
10
|
+
Pulls the eye to one focal element by **blurring** (and slightly **dimming**) everything around it while the focal layer stays sharp — the camera's depth-of-field falling off the background, or a rack-focus shifting which plane is in focus. The motion is `filter: blur(Npx)` plus a small `opacity` dim, tweened from sharp(0) to blurred over the focus-shift window — both seek-safe, since `filter` and `opacity` are paint-only properties HF interpolates correctly frame-by-frame.
|
|
11
|
+
|
|
12
|
+
This is the backing rule for the focus-falloff beat the blueprints keep reaching for: the outer nodes blurring during the push-in (`constellation-hub`), the rack-focus across a parallax card stack (`cursor-ui-demo`), and the non-highlighted cards dimming + blurring to spotlight the hero metric (`dataviz-countup`). Each of those flags "no backing rule" for the DoF half of the move — this is it.
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
Every layer carries a `--dof` custom property (px of blur), read by `filter: blur(var(--dof))`, plus its own `opacity`. A single GSAP tween advances each layer's `--dof` from `0` to its target blur and its opacity from `1` to a dim level, over the focus-shift window. The focal layer's tween targets `--dof: 0` (stays sharp); the off-focus layers target a positive blur.
|
|
17
|
+
|
|
18
|
+
Three mechanics, same primitive:
|
|
19
|
+
|
|
20
|
+
1. **Focal pull** — one window: off-focus layers go sharp(0) → blurred while the focal layer holds at 0. The eye is pulled to the only thing still crisp.
|
|
21
|
+
2. **Rack focus** — two adjacent windows on the same property: focus releases plane A (its blur ramps 0 → max) at the same position plane B's blur ramps max → 0. State continuity matters exactly as in `press-release-spring`: A's resting blur after the rack must be the value B held before it, so authoring the two as adjacent tweens on the same `--dof` is what makes the hand-off seamless.
|
|
22
|
+
3. **Blur-the-cluster-while-pushing-in** — the DoF tween runs concurrently with a camera push-in (`multi-phase-camera` / `coordinate-target-zoom`): the surrounding cluster blurs + dims on the SAME timeline position as the camera scales toward the focal core, so "the world recedes" and "we push in" read as one move.
|
|
23
|
+
|
|
24
|
+
Because the blur is a tween target (not a CSS `transition`), the renderer can land it at any frame — and because each layer's target is derived from its index / a data attribute (never `Math.random`), the falloff is identical on every seek.
|
|
25
|
+
|
|
26
|
+
## HTML
|
|
27
|
+
|
|
28
|
+
```html
|
|
29
|
+
<div
|
|
30
|
+
class="scene"
|
|
31
|
+
id="dof-scene"
|
|
32
|
+
data-composition-id="dof-scene"
|
|
33
|
+
data-start="0"
|
|
34
|
+
data-duration="DURATION"
|
|
35
|
+
data-track-index="0"
|
|
36
|
+
>
|
|
37
|
+
<div class="world" id="world">
|
|
38
|
+
<!-- Focal layer — stays sharp -->
|
|
39
|
+
<div class="layer focal" id="focal" data-dof="0">{FocalLabel}</div>
|
|
40
|
+
|
|
41
|
+
<!-- Off-focus layers — blur + dim. data-depth orders them near→far
|
|
42
|
+
so the falloff can scale blur by depth (see Variations). -->
|
|
43
|
+
<div class="layer ctx" data-depth="1">{Context A}</div>
|
|
44
|
+
<div class="layer ctx" data-depth="2">{Context B}</div>
|
|
45
|
+
<div class="layer ctx" data-depth="3">{Context C}</div>
|
|
46
|
+
</div>
|
|
47
|
+
</div>
|
|
48
|
+
```
|
|
49
|
+
|
|
50
|
+
## CSS
|
|
51
|
+
|
|
52
|
+
```css
|
|
53
|
+
.scene {
|
|
54
|
+
position: relative;
|
|
55
|
+
width: 100%;
|
|
56
|
+
height: 100%;
|
|
57
|
+
display: grid;
|
|
58
|
+
place-items: center;
|
|
59
|
+
background: {bgGradient};
|
|
60
|
+
}
|
|
61
|
+
.world {
|
|
62
|
+
/* Single wrapper so a concurrent camera push-in (multi-phase-camera)
|
|
63
|
+
transforms everything together; DoF is independent of the camera. */
|
|
64
|
+
position: relative;
|
|
65
|
+
width: 100%;
|
|
66
|
+
height: 100%;
|
|
67
|
+
transform-origin: 50% 50%;
|
|
68
|
+
}
|
|
69
|
+
.layer {
|
|
70
|
+
/* --dof is the px of blur; filter reads it. Starts sharp. */
|
|
71
|
+
--dof: 0px;
|
|
72
|
+
filter: blur(var(--dof));
|
|
73
|
+
/* will-change: filter — promotes the layer so the blur is cheap to
|
|
74
|
+
re-rasterize each frame. See the perf note in Key Principles. */
|
|
75
|
+
will-change: filter;
|
|
76
|
+
font-family: {font};
|
|
77
|
+
font-weight: 900;
|
|
78
|
+
color: {textColor};
|
|
79
|
+
}
|
|
80
|
+
.focal {
|
|
81
|
+
/* Sits above the context layers and never blurs. */
|
|
82
|
+
z-index: 2;
|
|
83
|
+
font-size: FOCAL_FONT_SIZE;
|
|
84
|
+
}
|
|
85
|
+
.ctx {
|
|
86
|
+
/* The off-focus plane(s). Smaller / grouped so the blur radius can
|
|
87
|
+
stay modest yet still read — blurring a small layer is cheap. */
|
|
88
|
+
z-index: 1;
|
|
89
|
+
font-size: CTX_FONT_SIZE;
|
|
90
|
+
opacity: 1;
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
## GSAP Timeline
|
|
95
|
+
|
|
96
|
+
```html
|
|
97
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
98
|
+
<script>
|
|
99
|
+
window.__timelines = window.__timelines || {};
|
|
100
|
+
const tl = gsap.timeline({ paused: true });
|
|
101
|
+
|
|
102
|
+
const ctx = gsap.utils.toArray(".ctx");
|
|
103
|
+
|
|
104
|
+
// ── Mechanic 1: FOCAL PULL ─────────────────────────────────────────
|
|
105
|
+
// Off-focus layers blur + dim from sharp to defocused over the
|
|
106
|
+
// focus-shift window. Blur scales with data-depth so far planes blur
|
|
107
|
+
// more than near ones (deterministic — derived from the attribute,
|
|
108
|
+
// never Math.random).
|
|
109
|
+
ctx.forEach((el) => {
|
|
110
|
+
const depth = Number(el.dataset.depth) || 1;
|
|
111
|
+
const targetBlur = BLUR_PER_DEPTH * depth; // px
|
|
112
|
+
tl.to(
|
|
113
|
+
el,
|
|
114
|
+
{
|
|
115
|
+
"--dof": `${targetBlur}px`,
|
|
116
|
+
opacity: DIM_LEVEL, // e.g. 0.55 — dim, not gone
|
|
117
|
+
duration: FOCUS_DUR,
|
|
118
|
+
ease: "power2.inOut",
|
|
119
|
+
},
|
|
120
|
+
FOCUS_START,
|
|
121
|
+
);
|
|
122
|
+
});
|
|
123
|
+
// Focal layer is already sharp (--dof:0, opacity:1) and untouched.
|
|
124
|
+
|
|
125
|
+
window.__timelines["dof-scene"] = tl;
|
|
126
|
+
</script>
|
|
127
|
+
```
|
|
128
|
+
|
|
129
|
+
## Variations
|
|
130
|
+
|
|
131
|
+
### Rack focus between two depth planes (foreground ⇄ background)
|
|
132
|
+
|
|
133
|
+
Two adjacent tweens on the same `--dof` per plane — focus leaves plane A as it lands on plane B. State continuity: B's _resting_ blur before the rack equals what A holds after, so the hand-off has no jump.
|
|
134
|
+
|
|
135
|
+
```js
|
|
136
|
+
// Start: A sharp, B pre-blurred (set BEFORE the rack so there's no pop).
|
|
137
|
+
gsap.set("#planeA", { "--dof": "0px", opacity: 1 });
|
|
138
|
+
gsap.set("#planeB", { "--dof": `${MAX_BLUR}px`, opacity: DIM_LEVEL });
|
|
139
|
+
|
|
140
|
+
// Rack: A defocuses while B comes into focus, same position + duration.
|
|
141
|
+
tl.to(
|
|
142
|
+
"#planeA",
|
|
143
|
+
{ "--dof": `${MAX_BLUR}px`, opacity: DIM_LEVEL, duration: RACK_DUR, ease: "power2.inOut" },
|
|
144
|
+
RACK_START,
|
|
145
|
+
);
|
|
146
|
+
tl.to(
|
|
147
|
+
"#planeB",
|
|
148
|
+
{ "--dof": "0px", opacity: 1, duration: RACK_DUR, ease: "power2.inOut" },
|
|
149
|
+
RACK_START,
|
|
150
|
+
);
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
### Blur the cluster while pushing in (DoF + camera, one beat)
|
|
154
|
+
|
|
155
|
+
Run the focal-pull tween at the **same timeline position** as a camera push-in so the surrounding cluster recedes into blur exactly as the camera scales toward the core. The camera transforms `.world`; the DoF tweens the layers — independent properties, no conflict.
|
|
156
|
+
|
|
157
|
+
```js
|
|
158
|
+
// Camera push-in toward the focal core (see multi-phase-camera / coordinate-target-zoom).
|
|
159
|
+
tl.to(
|
|
160
|
+
"#world",
|
|
161
|
+
{ scale: PUSH_SCALE, x: PUSH_X, y: PUSH_Y, duration: FOCUS_DUR, ease: "power2.inOut" },
|
|
162
|
+
FOCUS_START,
|
|
163
|
+
);
|
|
164
|
+
// Cluster blurs + dims on the SAME position — "the world recedes as we push in."
|
|
165
|
+
ctx.forEach((el) => {
|
|
166
|
+
const depth = Number(el.dataset.depth) || 1;
|
|
167
|
+
tl.to(
|
|
168
|
+
el,
|
|
169
|
+
{
|
|
170
|
+
"--dof": `${BLUR_PER_DEPTH * depth}px`,
|
|
171
|
+
opacity: DIM_LEVEL,
|
|
172
|
+
duration: FOCUS_DUR,
|
|
173
|
+
ease: "power2.inOut",
|
|
174
|
+
},
|
|
175
|
+
FOCUS_START,
|
|
176
|
+
);
|
|
177
|
+
});
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
### Spotlight a hero metric in a card grid (dim + blur the rest)
|
|
181
|
+
|
|
182
|
+
The `dataviz-countup` beat: a subset of grid cards stays sharp (the hero metric) while the remainder dim + blur. Tag the hero(es) and skip them; everything else defocuses on one shared window.
|
|
183
|
+
|
|
184
|
+
```js
|
|
185
|
+
gsap.utils.toArray(".card:not(.hero)").forEach((el) => {
|
|
186
|
+
tl.to(
|
|
187
|
+
el,
|
|
188
|
+
{ "--dof": `${GRID_BLUR}px`, opacity: DIM_LEVEL, duration: FOCUS_DUR, ease: "power2.out" },
|
|
189
|
+
FOCUS_START,
|
|
190
|
+
);
|
|
191
|
+
});
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
### Refocus / settle (release the blur before the scene ends)
|
|
195
|
+
|
|
196
|
+
If the beat resolves back to "everything visible" (or hands off to a crossfade that needs a clean outgoing frame), ramp the blur back to 0 over the tail so the scene settles sharp instead of mid-defocus.
|
|
197
|
+
|
|
198
|
+
```js
|
|
199
|
+
ctx.forEach((el) =>
|
|
200
|
+
tl.to(
|
|
201
|
+
el,
|
|
202
|
+
{ "--dof": "0px", opacity: 1, duration: REFOCUS_DUR, ease: "power2.inOut" },
|
|
203
|
+
REFOCUS_START,
|
|
204
|
+
),
|
|
205
|
+
);
|
|
206
|
+
```
|
|
207
|
+
|
|
208
|
+
### Bounded focus-breathing on the focal layer (optional)
|
|
209
|
+
|
|
210
|
+
For a subtle "rack settling" feel, let the focal layer's blur breathe a hair around 0 during its hold — a _finite_ `ease:"none"` driver writing `sin()` into `--dof` (never `repeat:-1`, never a CSS animation). Keep the amplitude well under 1px or it reads as "still focusing."
|
|
211
|
+
|
|
212
|
+
```js
|
|
213
|
+
const drift = { p: 0 };
|
|
214
|
+
tl.to(
|
|
215
|
+
drift,
|
|
216
|
+
{
|
|
217
|
+
p: Math.PI * 2 * BREATH_CYCLES,
|
|
218
|
+
duration: BREATH_DUR,
|
|
219
|
+
ease: "none",
|
|
220
|
+
onUpdate: () => {
|
|
221
|
+
const b = Math.max(0, Math.sin(drift.p)) * FOCAL_BREATH_PX; // ≤ ~0.6px
|
|
222
|
+
document.getElementById("focal").style.setProperty("--dof", `${b}px`);
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
BREATH_START,
|
|
226
|
+
);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
## How to Choose Values
|
|
230
|
+
|
|
231
|
+
### Geometry / layout
|
|
232
|
+
|
|
233
|
+
- **FOCAL_FONT_SIZE / CTX_FONT_SIZE** — focal vs context sizing.
|
|
234
|
+
- Range: focal is the visual lead; context layers smaller so a modest blur radius still reads as "out of focus."
|
|
235
|
+
- Effects: small context layers let you use a smaller `BLUR_PER_DEPTH` (cheaper) yet still look soft.
|
|
236
|
+
- **z-index** — focal `z-index: 2`, context `z-index: 1`.
|
|
237
|
+
- Constraints: the sharp focal layer must sit **above** the blurred ones, or its crisp edges read as bleeding into the haze.
|
|
238
|
+
|
|
239
|
+
### Blur amounts
|
|
240
|
+
|
|
241
|
+
- **BLUR_PER_DEPTH** — px of blur added per depth step (`data-depth`).
|
|
242
|
+
- Range: 3-6 px per step (a 3-plane stack tops out at ~9-18 px)
|
|
243
|
+
- Effects: low → gentle DoF; high → strong miniature/tilt-shift falloff
|
|
244
|
+
- Constraints: keep **per-layer blur ≤ ~24 px on large layers** — radius cost grows with both blur and area; large radius over a full-frame element is the expensive case (see Key Principles)
|
|
245
|
+
- **MAX_BLUR** — terminal blur for a fully-defocused plane (rack / focal-pull peak).
|
|
246
|
+
- Range: 8 (soft) → 16 (default) → 24 (heavy) px
|
|
247
|
+
- Constraints: above ~24 px on a big surface, prefer scaling the layer down or grouping its contents so the blurred footprint shrinks
|
|
248
|
+
- **GRID_BLUR** — blur on dimmed grid cards (spotlight variation).
|
|
249
|
+
- Range: 6-12 px — enough to push them back without losing the grid's shape
|
|
250
|
+
|
|
251
|
+
### Dim amounts
|
|
252
|
+
|
|
253
|
+
- **DIM_LEVEL** — opacity of off-focus layers at full defocus.
|
|
254
|
+
- Range: 0.4 (strong push-back) → 0.55 (default) → 0.7 (subtle)
|
|
255
|
+
- Effects: lower → context recedes hard / near-spotlight; higher → still legibly present, just secondary
|
|
256
|
+
- Constraints: rarely below 0.35 — fully dark off-focus layers read as "removed," not "defocused"
|
|
257
|
+
|
|
258
|
+
### Timing
|
|
259
|
+
|
|
260
|
+
- **FOCUS_START / FOCUS_DUR** — when the focal pull begins and how long the rack takes.
|
|
261
|
+
- Range: `FOCUS_DUR` 0.5-1.2 s — a rack/pull is a deliberate move, not a snap
|
|
262
|
+
- Effects: shorter → urgent "snap focus"; longer → languid cinematic rack
|
|
263
|
+
- **RACK_START / RACK_DUR** — rack-focus window (foreground ⇄ background).
|
|
264
|
+
- Constraints: both planes' tweens share `RACK_START` and `RACK_DUR` so they cross at the midpoint; `gsap.set` the pre-blurred plane BEFORE `RACK_START`
|
|
265
|
+
- **REFOCUS_START / REFOCUS_DUR** — settle-back window.
|
|
266
|
+
- Constraints: `REFOCUS_START + REFOCUS_DUR ≤ DURATION` so the scene actually reaches sharp before it ends / hands off
|
|
267
|
+
- **PUSH_SCALE / PUSH_X / PUSH_Y** (cluster-while-pushing-in variation) — camera move on `.world`.
|
|
268
|
+
- Constraints: shares `FOCUS_START` + `FOCUS_DUR` with the DoF tween so move and defocus read as one beat; counter-translate math lives in `coordinate-target-zoom` / `viewport-change`
|
|
269
|
+
- **BREATH_CYCLES / BREATH_DUR / FOCAL_BREATH_PX** (focus-breathing variation).
|
|
270
|
+
- Range: `FOCAL_BREATH_PX ≤ 0.6` px; period 2-3 s; this is a barely-there nicety, default to omitting it
|
|
271
|
+
|
|
272
|
+
### Tokens
|
|
273
|
+
|
|
274
|
+
- **{bgGradient}** — typically dark so the sharp focal layer reads as lit and forward
|
|
275
|
+
- **{textColor}** — high-contrast on `{bgGradient}`; the blur softens edges, so don't rely on hairline contrast
|
|
276
|
+
- **{font}** — display weight; blurred copy needs heavy weight to stay shape-legible when defocused
|
|
277
|
+
|
|
278
|
+
## Key Principles
|
|
279
|
+
|
|
280
|
+
- **`--dof` drives the blur; tween the variable, never a CSS `transition`.** Reading `filter: blur(var(--dof))` and animating `--dof` on the GSAP timeline keeps the blur on the HF seek clock. A CSS `transition` on `filter` interpolates on the browser's own clock and flickers/desyncs under frame-by-frame seek.
|
|
281
|
+
- **Blur the SMALL / GROUPED layers, not the giant one.** Filter-blur cost scales with both radius and the blurred element's pixel area. A 20 px blur on a full-frame background is the worst case; the same blur on a smaller context card, or on a single grouped wrapper, is cheap. Prefer pushing the focal plane _forward and sharp_ over cranking the background blur radius.
|
|
282
|
+
- **`will-change: filter`** on every layer that animates its blur — promotes it to its own layer so the re-rasterization each frame is cheap. Drop it once the blur settles if the layer also does heavy transform work.
|
|
283
|
+
- **Keep the radius modest.** ≤ ~24 px on large surfaces; lean on the `opacity` **dim** to do the "push it back" work alongside a smaller blur, rather than blur alone. Dim + modest blur reads more like real DoF than blur cranked to the max.
|
|
284
|
+
- **Focal layer stays genuinely sharp** — its `--dof` is `0` and untouched (or breathes ≤0.6 px). Any visible blur on the focal element kills the "this is the thing" read.
|
|
285
|
+
- **State continuity on a rack** — the plane coming OUT of focus must start the rack at the blur the incoming plane _was_ holding, and vice-versa; author both as tweens on the same `--dof` at the same position so the cross is seamless (same rule as `press-release-spring`'s press↔release).
|
|
286
|
+
- **DoF is independent of the camera** — blur the layers, transform `.world` for the push-in. They're different property channels, so they compose without fighting. Don't try to fake DoF with the camera transform or vice-versa.
|
|
287
|
+
- **Settle sharp before a hand-off** — if the next beat is a crossfade/push, refocus to `--dof:0` in the tail so the outgoing frame is crisp; handing off mid-defocus reads as "the render glitched."
|
|
288
|
+
|
|
289
|
+
## Critical Constraints
|
|
290
|
+
|
|
291
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
292
|
+
- **Registry key = `data-composition-id`**
|
|
293
|
+
- **No CSS `transition`** on `filter` / `opacity` — animate `--dof` and `opacity` on the timeline instead
|
|
294
|
+
- **No `repeat` / `yoyo` / infinite tweens** — the focus pull is a finite tween; any breathing is a bounded `onUpdate` reading the driver phase (or a finite tween), never `repeat:-1`
|
|
295
|
+
- **No `Math.random` / `Date.now`** — per-layer blur is derived from `data-depth` / element index so every seek is identical
|
|
296
|
+
- **Tween `filter` (blur) + `opacity` only here** — both paint-only and seek-safe. Use GSAP transform aliases (`x`, `y`, `scale`) for any concurrent camera move; never tween `width` / `height` / `left` / `top`
|
|
297
|
+
- **`will-change: filter`** on layers whose blur animates; keep the blurred footprint small
|
|
298
|
+
- **Per-layer blur radius ≤ ~24 px on large surfaces** — beyond that the cost (and visible banding) climbs; shrink/group the layer instead
|
|
299
|
+
|
|
300
|
+
## Combinations
|
|
301
|
+
|
|
302
|
+
- [multi-phase-camera.md](multi-phase-camera.md) — the push-in / push-through whose focus-falloff this rule supplies; run the DoF tween at the same position as the PUSH phase
|
|
303
|
+
- [coordinate-target-zoom.md](coordinate-target-zoom.md) — zoom onto the focal core while the off-center layers blur (the `constellation-hub` hook)
|
|
304
|
+
- [viewport-change.md](viewport-change.md) — pan across a tilted card plane with a rack-focus between near and far cards (the `cursor-ui-demo` focus-pull)
|
|
305
|
+
- [counting-dynamic-scale.md](counting-dynamic-scale.md) — the hero metric counts up sharp while the surrounding cards dim + blur (the `dataviz-countup` spotlight)
|
|
306
|
+
- [3d-page-scroll.md](3d-page-scroll.md) — the parallax card stack whose planes you rack focus between
|
|
307
|
+
- [sine-wave-loop.md](sine-wave-loop.md) — the focal layer idle-breathes after the rack settles (keep idle amplitude and focus-breath both tiny)
|
|
308
|
+
|
|
309
|
+
## Pairs with HF skills
|
|
310
|
+
|
|
311
|
+
- `/hyperframes-animation` — tweening a CSS custom property + multi-tween coordination
|
|
312
|
+
- `/hyperframes-core` — composition wiring
|
|
313
|
+
- `/hyperframes-cli` — `hyperframes lint`
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: depth-scatter-assemble
|
|
3
|
+
description: N elements scatter into / reassemble from a rotating 3D depth-cloud, each starting at a deterministic index-derived 3D offset and settling to a clean flat layout.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: 3d, scatter, assemble, depth, cloud, tumble, kinetic, letter, fragment, logo, reassemble
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Depth Scatter ↔ Assemble
|
|
9
|
+
|
|
10
|
+
N elements (glyphs, cards, icons, logo fragments) fly in from a rotating 3D depth-cloud and lock into a clean on-screen layout — or the reverse. Each element starts at a **deterministic** 3D offset (translateZ depth + rotateX/rotateY + an x/y scatter derived from its index), then tweens to its assembled flat position (`z: 0, rotation: 0`). Because every scattered position is computed by trig on the element's index — never `Math.random` — it renders identically every frame.
|
|
11
|
+
|
|
12
|
+
Distinct from `orbit-3d-entry` (flip-in then a continuous orbit) and `center-outward-expansion` (a flat 2D burst from one shared center): here each element has its **own** point in a 3D cloud, and the resolve is a flat assembled layout, not an orbit or a radial spray.
|
|
13
|
+
|
|
14
|
+
## How It Works
|
|
15
|
+
|
|
16
|
+
Each element resolves to a flat layout position (`targetX/Y`, set once in CSS or via `data-*`). Its **scattered** state is derived from its index `i`:
|
|
17
|
+
|
|
18
|
+
```js
|
|
19
|
+
const GOLDEN = Math.PI * (3 - Math.sqrt(5)); // ~2.39943 rad — even angular spread, no clumping
|
|
20
|
+
const a = i * GOLDEN; // this element's angle in the cloud
|
|
21
|
+
const scatterX = Math.cos(a) * RADIUS; // index-derived, deterministic
|
|
22
|
+
const scatterY = Math.sin(a) * RADIUS;
|
|
23
|
+
const scatterZ = Z_NEAR - (i / (n - 1)) * (Z_NEAR - Z_FAR); // stepped depth across the cloud
|
|
24
|
+
const rotX = Math.sin(a) * TUMBLE; // tumble orientation, also from the angle
|
|
25
|
+
const rotY = Math.cos(a) * TUMBLE;
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
A single 0→1 `progress` proxy interpolates each element between scattered and assembled (lerp every channel). At `progress = 0` the elements form the depth-cloud; at `progress = 1` they sit flat in the layout. Run it forward and it's **assemble**; the cloud itself slowly rotates (a stage `rotateY` tween) so the scatter has life before it locks.
|
|
29
|
+
|
|
30
|
+
Requires `perspective` on the stage and `transform-style: preserve-3d` on the stage AND each element, or the z-depth and tumble flatten to a 2D scale.
|
|
31
|
+
|
|
32
|
+
## HTML
|
|
33
|
+
|
|
34
|
+
```html
|
|
35
|
+
<div
|
|
36
|
+
class="scene"
|
|
37
|
+
id="assemble-scene"
|
|
38
|
+
data-composition-id="assemble-scene"
|
|
39
|
+
data-start="0"
|
|
40
|
+
data-duration="4"
|
|
41
|
+
data-track-index="0"
|
|
42
|
+
>
|
|
43
|
+
<!-- The cloud rotates; the layout lives inside it. targetX/Y = each
|
|
44
|
+
element's FLAT assembled offset from stage center (px). -->
|
|
45
|
+
<div class="cloud-stage">
|
|
46
|
+
<div class="frag" data-target-x="-260" data-target-y="0">{glyph1}</div>
|
|
47
|
+
<div class="frag" data-target-x="-130" data-target-y="0">{glyph2}</div>
|
|
48
|
+
<div class="frag" data-target-x="0" data-target-y="0">{glyph3}</div>
|
|
49
|
+
<div class="frag" data-target-x="130" data-target-y="0">{glyph4}</div>
|
|
50
|
+
<div class="frag" data-target-x="260" data-target-y="0">{glyph5}</div>
|
|
51
|
+
</div>
|
|
52
|
+
</div>
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
For a logo lockup, `targetX/Y` describe the parts' resting layout; for kinetic type, one `.frag` per glyph (inject spans from the phrase string at setup so width is exact — see Variations).
|
|
56
|
+
|
|
57
|
+
## CSS
|
|
58
|
+
|
|
59
|
+
```css
|
|
60
|
+
.scene {
|
|
61
|
+
position: relative;
|
|
62
|
+
width: 100%;
|
|
63
|
+
height: 100%;
|
|
64
|
+
display: grid;
|
|
65
|
+
place-items: center;
|
|
66
|
+
background: {bgColor};
|
|
67
|
+
perspective: 1400px; /* REQUIRED — without it, z-depth + tumble read as flat 2D scale */
|
|
68
|
+
}
|
|
69
|
+
.cloud-stage {
|
|
70
|
+
position: relative;
|
|
71
|
+
width: 100%;
|
|
72
|
+
height: 100%;
|
|
73
|
+
display: grid;
|
|
74
|
+
place-items: center;
|
|
75
|
+
transform-style: preserve-3d; /* REQUIRED — preserves child 3D context */
|
|
76
|
+
will-change: transform;
|
|
77
|
+
}
|
|
78
|
+
.frag {
|
|
79
|
+
position: absolute;
|
|
80
|
+
/* Live at stage center; GSAP translates each one to its layout / cloud point. */
|
|
81
|
+
top: 50%;
|
|
82
|
+
left: 50%;
|
|
83
|
+
display: grid;
|
|
84
|
+
place-items: center;
|
|
85
|
+
font-family: {font};
|
|
86
|
+
font-weight: 900;
|
|
87
|
+
font-size: 120px;
|
|
88
|
+
color: {textColor};
|
|
89
|
+
transform-style: preserve-3d; /* each fragment keeps its own 3D context */
|
|
90
|
+
backface-visibility: hidden; /* hides the mirrored face mid-tumble */
|
|
91
|
+
will-change: transform, opacity;
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## GSAP Timeline
|
|
96
|
+
|
|
97
|
+
```html
|
|
98
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
99
|
+
<script>
|
|
100
|
+
window.__timelines = window.__timelines || {};
|
|
101
|
+
const tl = gsap.timeline({ paused: true });
|
|
102
|
+
|
|
103
|
+
const frags = Array.from(document.querySelectorAll(".frag"));
|
|
104
|
+
const n = frags.length;
|
|
105
|
+
const GOLDEN = Math.PI * (3 - Math.sqrt(5)); // ~2.39943 — even spread, no clumps
|
|
106
|
+
|
|
107
|
+
// RADIUS, Z_NEAR, Z_FAR, TUMBLE, ASSEMBLE_DUR, ASSEMBLE_EASE, STAGGER,
|
|
108
|
+
// CLOUD_SPIN_DEG, CLOUD_SPIN_DUR — named constants per "How to Choose Values".
|
|
109
|
+
|
|
110
|
+
// Precompute each fragment's deterministic scattered state from its index.
|
|
111
|
+
const scatter = frags.map((el, i) => {
|
|
112
|
+
const a = i * GOLDEN;
|
|
113
|
+
const depthT = n > 1 ? i / (n - 1) : 0;
|
|
114
|
+
return {
|
|
115
|
+
x: Math.cos(a) * RADIUS,
|
|
116
|
+
y: Math.sin(a) * RADIUS,
|
|
117
|
+
z: Z_NEAR - depthT * (Z_NEAR - Z_FAR),
|
|
118
|
+
rotationX: Math.sin(a) * TUMBLE,
|
|
119
|
+
rotationY: Math.cos(a) * TUMBLE,
|
|
120
|
+
};
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
// 1) Park every fragment in the cloud BEFORE any tween fires.
|
|
124
|
+
frags.forEach((el, i) => {
|
|
125
|
+
const s = scatter[i];
|
|
126
|
+
gsap.set(el, {
|
|
127
|
+
xPercent: -50,
|
|
128
|
+
yPercent: -50, // bake self-centering so x/y are offsets from stage center
|
|
129
|
+
x: s.x,
|
|
130
|
+
y: s.y,
|
|
131
|
+
z: s.z,
|
|
132
|
+
rotationX: s.rotationX,
|
|
133
|
+
rotationY: s.rotationY,
|
|
134
|
+
opacity: 0,
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
// 2) The cloud rotates so the scatter has life before / during assembly.
|
|
139
|
+
tl.to(
|
|
140
|
+
".cloud-stage",
|
|
141
|
+
{ rotationY: CLOUD_SPIN_DEG, duration: CLOUD_SPIN_DUR, ease: "power1.out" },
|
|
142
|
+
0,
|
|
143
|
+
);
|
|
144
|
+
|
|
145
|
+
// 3) ASSEMBLE — each fragment tweens from its cloud point to its flat target.
|
|
146
|
+
frags.forEach((el, i) => {
|
|
147
|
+
tl.to(
|
|
148
|
+
el,
|
|
149
|
+
{
|
|
150
|
+
x: Number(el.dataset.targetX),
|
|
151
|
+
y: Number(el.dataset.targetY),
|
|
152
|
+
z: 0,
|
|
153
|
+
rotationX: 0,
|
|
154
|
+
rotationY: 0,
|
|
155
|
+
opacity: 1,
|
|
156
|
+
duration: ASSEMBLE_DUR,
|
|
157
|
+
ease: ASSEMBLE_EASE, // out-ease — fragments fly in then settle
|
|
158
|
+
},
|
|
159
|
+
i * STAGGER, // index stagger reads as "cloud collapsing inward"
|
|
160
|
+
);
|
|
161
|
+
});
|
|
162
|
+
|
|
163
|
+
window.__timelines["assemble-scene"] = tl;
|
|
164
|
+
</script>
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Variations
|
|
168
|
+
|
|
169
|
+
### Tumble-swap (mid-shot hand-off between two phrases)
|
|
170
|
+
|
|
171
|
+
The signature for `kinetic-type-beats` beat changes: one phrase's glyphs scatter **into** the cloud at the same moment the next phrase's glyphs assemble **out** of it — a 3D hand-off between two states, never an empty frame. Two glyph sets share the cloud; drive both with one shared 0→1 `progress` so they cross deterministically.
|
|
172
|
+
|
|
173
|
+
```js
|
|
174
|
+
// outgoing[] and incoming[] are two glyph arrays, each with precomputed scatter[] (above).
|
|
175
|
+
const swap = { p: 0 };
|
|
176
|
+
tl.to(
|
|
177
|
+
swap,
|
|
178
|
+
{
|
|
179
|
+
p: 1,
|
|
180
|
+
duration: SWAP_DUR,
|
|
181
|
+
ease: "power2.inOut",
|
|
182
|
+
onUpdate: () => {
|
|
183
|
+
const p = swap.p;
|
|
184
|
+
outgoing.forEach((el, i) => {
|
|
185
|
+
// 1 → 0: layout → cloud (scatters AWAY)
|
|
186
|
+
const s = outScatter[i];
|
|
187
|
+
const tx = Number(el.dataset.targetX);
|
|
188
|
+
const ty = Number(el.dataset.targetY);
|
|
189
|
+
el.style.opacity = String(1 - p);
|
|
190
|
+
el.style.transform =
|
|
191
|
+
`translate(-50%,-50%) translate3d(${tx + (s.x - tx) * p}px,${ty + (s.y - ty) * p}px,${s.z * p}px)` +
|
|
192
|
+
` rotateX(${s.rotationX * p}deg) rotateY(${s.rotationY * p}deg)`;
|
|
193
|
+
});
|
|
194
|
+
incoming.forEach((el, i) => {
|
|
195
|
+
// 0 → 1: cloud → layout (assembles IN)
|
|
196
|
+
const s = inScatter[i];
|
|
197
|
+
const tx = Number(el.dataset.targetX);
|
|
198
|
+
const ty = Number(el.dataset.targetY);
|
|
199
|
+
el.style.opacity = String(p);
|
|
200
|
+
el.style.transform =
|
|
201
|
+
`translate(-50%,-50%) translate3d(${s.x + (tx - s.x) * p}px,${s.y + (ty - s.y) * p}px,${s.z * (1 - p)}px)` +
|
|
202
|
+
` rotateX(${s.rotationX * (1 - p)}deg) rotateY(${s.rotationY * (1 - p)}deg)`;
|
|
203
|
+
});
|
|
204
|
+
},
|
|
205
|
+
},
|
|
206
|
+
SWAP_AT,
|
|
207
|
+
);
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
Inject a per-glyph span set for each phrase at setup (so `targetX` per glyph is the exact laid-out advance width — measure after `document.fonts.ready`), and hide each set's opacity to 0 until its window.
|
|
211
|
+
|
|
212
|
+
### Radial letter-explode → resolve
|
|
213
|
+
|
|
214
|
+
A flat-plane special case (the `kinetic-type-beats` "letters explode radially then resolve" GAP): set `Z_NEAR = Z_FAR = 0` and `TUMBLE` small so the cloud is a 2D ring, then reverse the assemble for the explode — fragments fling out to `scatter[i]` then snap back to layout. Pure in-plane, no depth.
|
|
215
|
+
|
|
216
|
+
### Scatter-OUT (final-frame exit only)
|
|
217
|
+
|
|
218
|
+
Reverse the assemble (layout → cloud, opacity 1→0) ONLY as the composition's last beat. A scatter-out mid-shot reads as an exit and breaks the shot — keep entrances and hand-offs as assemble or tumble-swap.
|
|
219
|
+
|
|
220
|
+
### Parallax depth slide-in (logo lockup)
|
|
221
|
+
|
|
222
|
+
For `logo-assemble-lockup`, give back layers a larger `|Z_FAR|` and a longer `ASSEMBLE_DUR`, foreground parts a shallower depth and shorter duration — parts at different depths slide in at different apparent speeds (parallax) and lock into the lockup.
|
|
223
|
+
|
|
224
|
+
## How to Choose Values
|
|
225
|
+
|
|
226
|
+
- **n (ELEMENT_COUNT)** — fragments / glyphs in the cloud
|
|
227
|
+
- Range: 4–14 (glyph sets follow the word length; for fragments/cards stay 4–9)
|
|
228
|
+
- Effects: few reads as deliberate assembly; many reads as a dense swarm condensing
|
|
229
|
+
- Constraints: above ~14 the cloud crowds the center and individual paths stop reading
|
|
230
|
+
|
|
231
|
+
- **RADIUS** — cloud spread in the x/y plane, px
|
|
232
|
+
- Range: 250–700 px
|
|
233
|
+
- Effects: small = a tight knot that barely separates; large = fragments arrive from the frame edges
|
|
234
|
+
- Constraints: keep the farthest scatter inside frame at the chosen `perspective`, or fragments pop in from off-screen with no travel read
|
|
235
|
+
|
|
236
|
+
- **Z_NEAR / Z_FAR** — depth band of the cloud, px (front / back)
|
|
237
|
+
- Range: Z_NEAR +150 to +450; Z_FAR −150 to −500
|
|
238
|
+
- Effects: a wide band (e.g. +400 / −400) gives strong fly-toward / recede-from camera depth; a narrow band keeps it nearly flat
|
|
239
|
+
- Constraints: very large `|z|` against a short `perspective` over-distorts (fragments smear huge then tiny) — widen `perspective` to match
|
|
240
|
+
|
|
241
|
+
- **TUMBLE** — peak rotateX/rotateY of scattered fragments, deg
|
|
242
|
+
- Range: 40–110°
|
|
243
|
+
- Effects: low = fragments drift in nearly upright; high = they tumble through space and rotate upright on arrival
|
|
244
|
+
- Constraints: with `backface-visibility: hidden`, glyphs past 90° show blank mid-tween (intended for the tumble); for cards with content on one face, cap near 80°
|
|
245
|
+
|
|
246
|
+
- **ASSEMBLE_DUR** — per-fragment cloud → layout tween, s
|
|
247
|
+
- Range: 0.7–1.4 s
|
|
248
|
+
- Effects: short = snappy lock-in; long = a floating condense
|
|
249
|
+
- Constraints: `(n − 1) × STAGGER + ASSEMBLE_DUR` must fit the scene's assembly window
|
|
250
|
+
|
|
251
|
+
- **ASSEMBLE_EASE** — shared ease across fragments
|
|
252
|
+
- Discrete choice: `power3.out`, `expo.out`, `back.out(1.4)`
|
|
253
|
+
- Selection: `power3.out` default (fly in, settle). `expo.out` snaps hard at the end. `back.out` adds a small overshoot as parts seat. Avoid `in` easings — fragments look sucked backward into the cloud mid-air.
|
|
254
|
+
|
|
255
|
+
- **STAGGER** — gap between successive fragments' assembly starts, s
|
|
256
|
+
- Range: 0.03–0.09 s
|
|
257
|
+
- Effects: < 0.03 = a single chord (whole cloud collapses at once); > 0.09 = a slow drip that loses the "swarm" read
|
|
258
|
+
- Constraints: `n × STAGGER` should stay below `ASSEMBLE_DUR` so the cloud is collapsing as one motion, not a queue
|
|
259
|
+
|
|
260
|
+
- **CLOUD_SPIN_DEG / CLOUD_SPIN_DUR** — stage rotateY over the assembly, deg / s
|
|
261
|
+
- Range: 15–60° over a duration ≥ `ASSEMBLE_DUR`
|
|
262
|
+
- Effects: a gentle spin gives the scatter life so it doesn't read as a frozen explosion diagram; too fast competes with the assembly
|
|
263
|
+
- Constraints: keep finite and ending by settle — no `repeat`
|
|
264
|
+
|
|
265
|
+
- **SWAP_DUR / SWAP_AT** (tumble-swap) — hand-off length / when it fires, s
|
|
266
|
+
- Range: SWAP_DUR 0.5–1.0 s; SWAP_AT on the beat boundary
|
|
267
|
+
- Effects: shorter = a hard cross; longer = a visible dissolve-through-cloud
|
|
268
|
+
- Constraints: outgoing and incoming MUST share one `progress` (one tween) so they cross at the same instant
|
|
269
|
+
|
|
270
|
+
## Key Principles
|
|
271
|
+
|
|
272
|
+
- **`perspective` on the scene root + `preserve-3d` on stage AND each fragment** — without all three, z-depth and tumble collapse to a flat scale
|
|
273
|
+
- **Every scattered value is index-derived** — `cos/sin(i × GOLDEN)`, stepped `z` by `i/(n−1)`. The golden angle spreads points evenly with no clumps and (critically) **no `Math.random`**, so the cloud is byte-identical every render
|
|
274
|
+
- **`gsap.set` the cloud BEFORE adding tweens** — park each fragment at its scatter point with `opacity: 0` first; the assemble tweens FROM there. Skipping the set leaves frame 0 showing the assembled layout, then a teleport when the first tween starts
|
|
275
|
+
- **Resolve flat** — the settled state is `z: 0, rotationX: 0, rotationY: 0` in the layout. A cloud that resolves still-tilted reads as unfinished
|
|
276
|
+
- **Assemble / hand-off only; scatter-OUT is an exit** — fragments leaving for the cloud mid-shot reads as the shot ending. Use forward assemble for entrances, tumble-swap for beat changes; reserve scatter-out for the final frame
|
|
277
|
+
- **Depth ordering is automatic** — inside `preserve-3d`, paint order follows actual Z, so nearer fragments correctly occlude farther ones with no manual z-index (unlike the orbit case, where the orbit is faked in 2D and needs capped z-index)
|
|
278
|
+
|
|
279
|
+
## Critical Constraints
|
|
280
|
+
|
|
281
|
+
- **No `Math.random` / `Date.now`** — derive every scatter coordinate from the index (golden-angle trig + stepped depth). This is the whole point of the rule: a randomized cloud renders differently each frame and the seek breaks
|
|
282
|
+
- **No CSS `transition`** — all motion is GSAP tweens on the paused timeline
|
|
283
|
+
- **No `repeat` / `yoyo` / infinite** — the cloud spin and every assemble are finite, one-shot tweens that end before settle
|
|
284
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
285
|
+
- **Registry key = `data-composition-id`**
|
|
286
|
+
- **Transform aliases only** — `x`, `y`, `z`, `scale`, `rotation`/`rotationX`/`rotationY`. Never `width`/`height`/`left`/`top`; `x`/`y` compose with the `xPercent/yPercent -50` self-centering
|
|
287
|
+
- **`will-change: transform`** on stage + fragments — many simultaneous 3D transforms benefit from compositor hints
|
|
288
|
+
- **In tumble-swap, one shared `progress` for both glyph sets** — two separate tweens can drift out of phase under seek and the cross stops looking like a single hand-off
|
|
289
|
+
|
|
290
|
+
## Combinations
|
|
291
|
+
|
|
292
|
+
- [orbit-3d-entry.md](orbit-3d-entry.md) — alternative 3D entrance (settles into a continuous orbit instead of a flat lockup); shares the `perspective` + `preserve-3d` stage setup
|
|
293
|
+
- [hacker-flip-3d.md](hacker-flip-3d.md) — per-glyph 3D flip/decode as the fragments seat; layer for a "letters tumble in AND decode on arrival" read
|
|
294
|
+
- [3d-text-depth-layers.md](3d-text-depth-layers.md) — give the assembled wordmark a stacked extrusion once it locks
|
|
295
|
+
- [center-outward-expansion.md](center-outward-expansion.md) — flat 2D cousin (single shared center, no depth) when perspective isn't wanted
|
|
296
|
+
- [press-release-spring.md](press-release-spring.md) — a spring settle on the assembled lockup once the cloud resolves
|
|
297
|
+
- [sine-wave-loop.md](sine-wave-loop.md) — idle breathe on the resolved layout instead of a frozen hold
|
|
298
|
+
|
|
299
|
+
## Pairs with HF skills
|
|
300
|
+
|
|
301
|
+
- `/hyperframes-animation` — timeline + `onUpdate` API (the shared-progress tumble-swap)
|
|
302
|
+
- `/hyperframes-core` — composition wiring
|
|
303
|
+
- `/hyperframes-cli` — `hyperframes lint`
|