@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,273 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: multi-phase-camera
|
|
3
|
+
description: Sequential camera zoom with 2-3 distinct phases (pull-back / focus / push) plus continuous micro-drift for organic cinematic feel.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: camera, zoom, phase, drift, scale, cinematic
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Multi-Phase Camera
|
|
9
|
+
|
|
10
|
+
A camera wrapper around the entire scene that progresses through discrete zoom phases at scripted triggers. Continuous sine-driven micro-drift overlays so the camera never feels static between phases. Distinct from a single linear zoom — multi-phase creates "cinematic pacing" (anticipation → reveal → settle).
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
The camera is a single wrapping `<div>` whose `transform: scale() translate(x, y)` is driven by:
|
|
15
|
+
|
|
16
|
+
1. **Phase scale** — a stepwise scale value that advances through phases at trigger times (e.g. `PHASE_1_SCALE` at t=0 → `PHASE_2_SCALE` at PHASE_2_AT → `PHASE_3_SCALE` at PHASE_3_AT)
|
|
17
|
+
2. **Drift offset** — a continuous sine-based `translateX` / `translateY` (small amplitude, slow frequency) ADDED to the phase transform
|
|
18
|
+
|
|
19
|
+
Both run inside the GSAP timeline so HF seeks frame-by-frame deterministically.
|
|
20
|
+
|
|
21
|
+
## HTML
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<div
|
|
25
|
+
class="scene"
|
|
26
|
+
data-composition-id="cam-scene"
|
|
27
|
+
data-start="0"
|
|
28
|
+
data-duration="6"
|
|
29
|
+
data-track-index="0"
|
|
30
|
+
>
|
|
31
|
+
<div class="camera" id="camera">
|
|
32
|
+
<div class="content">
|
|
33
|
+
<div class="hero">{Brand}</div>
|
|
34
|
+
<div class="tagline">{tagline}</div>
|
|
35
|
+
<div class="cta">{ctaText}</div>
|
|
36
|
+
</div>
|
|
37
|
+
</div>
|
|
38
|
+
</div>
|
|
39
|
+
```
|
|
40
|
+
|
|
41
|
+
## CSS
|
|
42
|
+
|
|
43
|
+
```css
|
|
44
|
+
.scene {
|
|
45
|
+
position: relative;
|
|
46
|
+
width: 100%;
|
|
47
|
+
height: 100%;
|
|
48
|
+
overflow: hidden;
|
|
49
|
+
background: {sceneBgColor};
|
|
50
|
+
}
|
|
51
|
+
.camera {
|
|
52
|
+
position: absolute;
|
|
53
|
+
inset: 0;
|
|
54
|
+
display: grid;
|
|
55
|
+
place-items: center;
|
|
56
|
+
transform-origin: 50% 50%;
|
|
57
|
+
will-change: transform;
|
|
58
|
+
}
|
|
59
|
+
.content {
|
|
60
|
+
display: flex;
|
|
61
|
+
flex-direction: column;
|
|
62
|
+
align-items: center;
|
|
63
|
+
gap: 32px;
|
|
64
|
+
text-align: center;
|
|
65
|
+
}
|
|
66
|
+
.hero {
|
|
67
|
+
font-family: {font};
|
|
68
|
+
font-weight: 900;
|
|
69
|
+
font-size: {heroSize};
|
|
70
|
+
letter-spacing: 8px;
|
|
71
|
+
color: {textColor};
|
|
72
|
+
text-transform: uppercase;
|
|
73
|
+
}
|
|
74
|
+
.tagline {
|
|
75
|
+
font-family: {font};
|
|
76
|
+
font-weight: 600;
|
|
77
|
+
font-size: {taglineSize};
|
|
78
|
+
color: {accentColor};
|
|
79
|
+
}
|
|
80
|
+
.cta {
|
|
81
|
+
font-family: {monoFont};
|
|
82
|
+
font-weight: 700;
|
|
83
|
+
font-size: {ctaSize};
|
|
84
|
+
letter-spacing: 6px;
|
|
85
|
+
color: {accentColor};
|
|
86
|
+
text-transform: uppercase;
|
|
87
|
+
}
|
|
88
|
+
```
|
|
89
|
+
|
|
90
|
+
## GSAP Timeline
|
|
91
|
+
|
|
92
|
+
```html
|
|
93
|
+
<script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
|
|
94
|
+
<script>
|
|
95
|
+
window.__timelines = window.__timelines || {};
|
|
96
|
+
const tl = gsap.timeline({ paused: true });
|
|
97
|
+
|
|
98
|
+
const camera = document.getElementById("camera");
|
|
99
|
+
|
|
100
|
+
// Three-phase scale plan: pullback → focus → push
|
|
101
|
+
const phase = { scale: PHASE_1_SCALE };
|
|
102
|
+
|
|
103
|
+
// Phase 1 — start pulled back
|
|
104
|
+
// (no tween needed for the initial value; set via the phase object)
|
|
105
|
+
|
|
106
|
+
// Phase 2 — settle to neutral focus
|
|
107
|
+
tl.to(
|
|
108
|
+
phase,
|
|
109
|
+
{
|
|
110
|
+
scale: PHASE_2_SCALE,
|
|
111
|
+
duration: PHASE_2_DUR,
|
|
112
|
+
ease: PHASE_2_EASE,
|
|
113
|
+
},
|
|
114
|
+
PHASE_2_AT,
|
|
115
|
+
);
|
|
116
|
+
|
|
117
|
+
// Phase 3 — slow push-in for the climax
|
|
118
|
+
tl.to(
|
|
119
|
+
phase,
|
|
120
|
+
{
|
|
121
|
+
scale: PHASE_3_SCALE,
|
|
122
|
+
duration: PHASE_3_DUR,
|
|
123
|
+
ease: PHASE_3_EASE,
|
|
124
|
+
},
|
|
125
|
+
PHASE_3_AT,
|
|
126
|
+
);
|
|
127
|
+
|
|
128
|
+
// Drift driver — continuous sine motion overlaid on the phase scale
|
|
129
|
+
const drift = { p: 0 };
|
|
130
|
+
|
|
131
|
+
tl.to(
|
|
132
|
+
drift,
|
|
133
|
+
{
|
|
134
|
+
p: Math.PI * 2 * DRIFT_CYCLES,
|
|
135
|
+
duration: TOTAL_DURATION,
|
|
136
|
+
ease: "none",
|
|
137
|
+
onUpdate: () => {
|
|
138
|
+
const dx = Math.sin(drift.p) * DRIFT_AMP_X;
|
|
139
|
+
const dy = Math.sin(drift.p * DRIFT_FREQ_RATIO) * DRIFT_AMP_Y;
|
|
140
|
+
camera.style.transform = `scale(${phase.scale}) translate(${dx}px, ${dy}px)`;
|
|
141
|
+
},
|
|
142
|
+
},
|
|
143
|
+
0,
|
|
144
|
+
);
|
|
145
|
+
|
|
146
|
+
// Content reveals (entry beats inside the camera frame)
|
|
147
|
+
tl.from(".hero", { opacity: 0, y: 32, scale: 0.96, duration: 0.9, ease: "power3.out" }, HERO_AT);
|
|
148
|
+
tl.from(".tagline", { opacity: 0, y: 16, duration: 0.7, ease: "power3.out" }, TAGLINE_AT);
|
|
149
|
+
tl.from(".cta", { opacity: 0, y: 8, duration: 0.7, ease: "power3.out" }, CTA_AT);
|
|
150
|
+
|
|
151
|
+
window.__timelines["cam-scene"] = tl;
|
|
152
|
+
</script>
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## How to Choose Values
|
|
156
|
+
|
|
157
|
+
- **PHASE_1_SCALE / PHASE_2_SCALE / PHASE_3_SCALE** — three-step zoom values
|
|
158
|
+
- Range: PHASE_1 0.88–0.96; PHASE_2 0.98–1.02; PHASE_3 1.04–1.15
|
|
159
|
+
- Effects: tighter spread = subtler camera; wider = more cinematic
|
|
160
|
+
- Constraints: at PHASE_1_SCALE < 1, `.scene` MUST have `overflow: hidden` or the inner content's edges leak outside the frame
|
|
161
|
+
|
|
162
|
+
- **PHASE_2_AT / PHASE_2_DUR** — when the focus phase starts and how long it takes
|
|
163
|
+
- Range: PHASE_2_AT 0.3–1.0 s; PHASE_2_DUR 1.0–1.8 s
|
|
164
|
+
- Effects: longer DUR = slower settle, more cinematic
|
|
165
|
+
|
|
166
|
+
- **PHASE_3_AT / PHASE_3_DUR** — when the push phase starts and how long it takes
|
|
167
|
+
- Range: PHASE_3_AT 2.0–4.0 s; PHASE_3_DUR 1.0–2.0 s
|
|
168
|
+
- Constraints: PHASE_3_AT must be ≥ PHASE_2_AT + PHASE_2_DUR (otherwise focus is preempted)
|
|
169
|
+
|
|
170
|
+
- **PHASE_2_EASE / PHASE_3_EASE** — ease per transition
|
|
171
|
+
- Discrete choice: `power2.out`, `power3.out`, `power2.inOut`
|
|
172
|
+
- Selection: cinematic feel; spring/back easing on a camera feels uncomfortable. Each later phase should imply more settling than the previous (longer dur OR more out-easing).
|
|
173
|
+
|
|
174
|
+
- **TOTAL_DURATION** — composition's total runtime (matches `data-duration`)
|
|
175
|
+
- Reference: the drift tween must span the whole composition
|
|
176
|
+
|
|
177
|
+
- **DRIFT_CYCLES** — number of sine cycles across TOTAL_DURATION
|
|
178
|
+
- Range: 1–3
|
|
179
|
+
- Effects: 1 = one slow breath; 3 = noticeably busier
|
|
180
|
+
- Constraints: high values read as mechanical wobble rather than organic drift
|
|
181
|
+
|
|
182
|
+
- **DRIFT_AMP_X / DRIFT_AMP_Y** — peak drift offset in pixels
|
|
183
|
+
- Range: DRIFT_AMP_X 2–8 px; DRIFT_AMP_Y 1–4 px
|
|
184
|
+
- Effects: per-frame imperceptible, visible over time. If drift is a discrete shake, it's too much.
|
|
185
|
+
|
|
186
|
+
- **DRIFT_FREQ_RATIO** — multiplier on the Y-axis sine frequency
|
|
187
|
+
- Range: 1.2–1.5
|
|
188
|
+
- Effects: 1.0 = perfect diagonal (reads mechanical); ~1.3 = organic Lissajous
|
|
189
|
+
|
|
190
|
+
- **HERO_AT / TAGLINE_AT / CTA_AT** — content reveal beats
|
|
191
|
+
- Constraints: HERO_AT should land AFTER PHASE_1 settles via PHASE_2 (otherwise the hero feels like it's flying away while camera is still pulling back)
|
|
192
|
+
|
|
193
|
+
## Phase Patterns
|
|
194
|
+
|
|
195
|
+
| Pattern | Scale Sequence (Phase 1 → 2 → 3) | Feel | When to use |
|
|
196
|
+
| ------------------- | --------------------------------- | ------------------------------- | ----------------------------- |
|
|
197
|
+
| **Focus-in** | back → neutral → slight push | Approach → settle → slight push | Default product reveal |
|
|
198
|
+
| **Dramatic reveal** | push → neutral → pull | Wide → focus → settle back | Hero shot with breathing room |
|
|
199
|
+
| **Steady push** | neutral → slight push → more push | Gradual forward momentum | Continuous narrative push |
|
|
200
|
+
| **Bookend pull** | neutral → strong push → neutral | Settle → push → release | CTA emphasis then release |
|
|
201
|
+
|
|
202
|
+
## Variations
|
|
203
|
+
|
|
204
|
+
### Phase trigger by content beat (not time)
|
|
205
|
+
|
|
206
|
+
If the composition has content phases (e.g. an entry completes, then orbit starts), align the camera tween start time with the content tween's end time rather than using a fixed clock value.
|
|
207
|
+
|
|
208
|
+
### Camera shake (panic / impact)
|
|
209
|
+
|
|
210
|
+
For a brief shake instead of drift, replace the drift tween with a higher-amplitude, higher-frequency one over a short window:
|
|
211
|
+
|
|
212
|
+
```js
|
|
213
|
+
tl.to(
|
|
214
|
+
drift,
|
|
215
|
+
{
|
|
216
|
+
p: Math.PI * 2 * SHAKE_CYCLES,
|
|
217
|
+
duration: SHAKE_DUR,
|
|
218
|
+
ease: "none",
|
|
219
|
+
onUpdate: () => {
|
|
220
|
+
const dx = Math.sin(drift.p) * SHAKE_AMP_X;
|
|
221
|
+
const dy = Math.sin(drift.p * SHAKE_FREQ_RATIO) * SHAKE_AMP_Y;
|
|
222
|
+
camera.style.transform = `scale(${phase.scale}) translate(${dx}px, ${dy}px)`;
|
|
223
|
+
},
|
|
224
|
+
},
|
|
225
|
+
SHAKE_AT,
|
|
226
|
+
);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
### Targeted zoom into off-center element
|
|
230
|
+
|
|
231
|
+
If the climax should zoom into a non-centered element, combine scale with counter-translation. Compute the offset so the target ends at viewport center after scale:
|
|
232
|
+
|
|
233
|
+
```js
|
|
234
|
+
const target = document.querySelector(".cta");
|
|
235
|
+
const tRect = target.getBoundingClientRect();
|
|
236
|
+
const viewportCenter = { x: STAGE_W / 2, y: STAGE_H / 2 };
|
|
237
|
+
const offsetX = (viewportCenter.x - (tRect.left + tRect.width / 2)) / phase.scale;
|
|
238
|
+
const offsetY = (viewportCenter.y - (tRect.top + tRect.height / 2)) / phase.scale;
|
|
239
|
+
// then in onUpdate: translate(offsetX + dx, offsetY + dy)
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
## Key Principles
|
|
243
|
+
|
|
244
|
+
- **Drift is imperceptible per-frame, visible over time** — if drift reads as discrete shake, the amplitude is too high
|
|
245
|
+
- **Drift X and Y at slightly different frequencies** — `DRIFT_FREQ_RATIO ≈ 1.3` prevents perfect-diagonal motion, which reads as mechanical
|
|
246
|
+
- **Phase springs softer than UI springs** — `power2.inOut` or `power3.out` for cinematic feel; spring/back easing on a camera feels uncomfortable
|
|
247
|
+
- **Each later phase settles "deeper"** — phase 2 ease should imply more settling than phase 1 (longer duration OR more out-easing). Wakes up → settles → settles deeper
|
|
248
|
+
- **Camera wraps EVERYTHING in the scene** — applying camera per-element creates parallax bugs and breaks "this is one viewpoint"
|
|
249
|
+
- **❗ overflow: hidden on .scene** — phases that pull back (`scale < 1`) reveal edges of the inner content. Without `overflow: hidden`, those edges leak outside the stage frame and HF renders them as visible content
|
|
250
|
+
- **❗ Hero reveal starts AFTER initial pullback ease lands** — if the camera is still pulling back when the headline fades in, the headline feels like it's flying away
|
|
251
|
+
|
|
252
|
+
## Critical Constraints
|
|
253
|
+
|
|
254
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
255
|
+
- **Registry key = `data-composition-id`**
|
|
256
|
+
- **No CSS `transition` on `.camera`** — competes with the GSAP transform
|
|
257
|
+
- **`transform-origin: 50% 50%`** on camera — off-center origin creates unpredictable phase-to-phase drift
|
|
258
|
+
- **`will-change: transform`** on `.camera` — the camera transform updates every frame
|
|
259
|
+
- **`overflow: hidden` on `.scene`** — required when any phase scale < 1
|
|
260
|
+
- **Scene background on `.scene`, not `.camera`** — if background is on camera, scaling/translating it reveals the outer void
|
|
261
|
+
|
|
262
|
+
## Combinations
|
|
263
|
+
|
|
264
|
+
- [orbit-3d-entry.md](orbit-3d-entry.md) — orbit motion inside a slowly drifting camera
|
|
265
|
+
- [counting-dynamic-scale.md](counting-dynamic-scale.md) — climax phase push synced to counter peak
|
|
266
|
+
- [3d-text-depth-layers.md](3d-text-depth-layers.md) — depth-stacked hero with cinematic camera moves
|
|
267
|
+
- [sine-wave-loop.md](sine-wave-loop.md) — element idle inside the camera (compound motion)
|
|
268
|
+
|
|
269
|
+
## Pairs with HF skills
|
|
270
|
+
|
|
271
|
+
- `/hyperframes-animation` — multi-phase tween + drift onUpdate
|
|
272
|
+
- `/hyperframes-core` — composition wiring, scene wrapper
|
|
273
|
+
- `/hyperframes-cli` — `hyperframes lint`
|
|
@@ -0,0 +1,301 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: orbit-3d-entry
|
|
3
|
+
description: Elements flip in from 3D space then settle into continuous elliptical orbit around a focal point.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: orbit, 3d, flip, ellipse, circular, icon, entry, continuous
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Orbit with 3D Entry
|
|
9
|
+
|
|
10
|
+
Elements flip in from 3D space (rotateX + rotateY + translateZ) then transition into a continuous elliptical orbit around a focal point. Distinct from one-shot reveals — the orbit keeps running.
|
|
11
|
+
|
|
12
|
+
## How It Works
|
|
13
|
+
|
|
14
|
+
Two phases per element:
|
|
15
|
+
|
|
16
|
+
1. **Entry (per element)**: GSAP tween from hidden 3D orientation (`rotateX`, `rotateY`, negative `z`) to flat (`rotateX: 0, rotateY: 0, z: 0`). Spring-like ease (`back.out`) for the flip-in.
|
|
17
|
+
2. **Orbit (after entry)**: Continuous trigonometric position around a center point. The element's `x` and `y` translate are driven by `cos(t)` and `sin(t)` at a slow angular speed.
|
|
18
|
+
|
|
19
|
+
The orbit runs **inside the timeline** — not via `requestAnimationFrame` — so HF seek-by-frame stays deterministic.
|
|
20
|
+
|
|
21
|
+
## HTML
|
|
22
|
+
|
|
23
|
+
```html
|
|
24
|
+
<div
|
|
25
|
+
class="scene"
|
|
26
|
+
id="orbit-scene"
|
|
27
|
+
data-composition-id="orbit-scene"
|
|
28
|
+
data-start="0"
|
|
29
|
+
data-duration="5"
|
|
30
|
+
data-track-index="0"
|
|
31
|
+
>
|
|
32
|
+
<div class="orbit-stage">
|
|
33
|
+
<div class="orbit-item" data-angle="0">{glyph1}</div>
|
|
34
|
+
<div class="orbit-item" data-angle="60">{glyph2}</div>
|
|
35
|
+
<div class="orbit-item" data-angle="120">{glyph3}</div>
|
|
36
|
+
<div class="orbit-item" data-angle="180">{glyph4}</div>
|
|
37
|
+
<div class="orbit-item" data-angle="240">{glyph5}</div>
|
|
38
|
+
<div class="orbit-item" data-angle="300">{glyph6}</div>
|
|
39
|
+
<div class="orbit-center">{centerLabel}</div>
|
|
40
|
+
</div>
|
|
41
|
+
</div>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
## CSS
|
|
45
|
+
|
|
46
|
+
```css
|
|
47
|
+
.scene {
|
|
48
|
+
position: relative;
|
|
49
|
+
width: 100%;
|
|
50
|
+
height: 100%;
|
|
51
|
+
display: grid;
|
|
52
|
+
place-items: center;
|
|
53
|
+
background: {sceneBackground};
|
|
54
|
+
perspective: 1800px; /* REQUIRED — without perspective, rotateX/Y flatten */
|
|
55
|
+
}
|
|
56
|
+
.orbit-stage {
|
|
57
|
+
position: relative;
|
|
58
|
+
width: 1000px;
|
|
59
|
+
height: 700px;
|
|
60
|
+
display: grid;
|
|
61
|
+
place-items: center;
|
|
62
|
+
transform-style: preserve-3d;
|
|
63
|
+
}
|
|
64
|
+
.orbit-item {
|
|
65
|
+
position: absolute;
|
|
66
|
+
/* Items live at stage center; GSAP translates them along the orbit. */
|
|
67
|
+
top: 50%;
|
|
68
|
+
left: 50%;
|
|
69
|
+
width: 140px;
|
|
70
|
+
height: 140px;
|
|
71
|
+
display: grid;
|
|
72
|
+
place-items: center;
|
|
73
|
+
background: {accentColor};
|
|
74
|
+
border-radius: 50%;
|
|
75
|
+
font-family: {font};
|
|
76
|
+
font-weight: 900;
|
|
77
|
+
font-size: 64px;
|
|
78
|
+
color: {itemTextColor};
|
|
79
|
+
transform-style: preserve-3d;
|
|
80
|
+
will-change: transform;
|
|
81
|
+
box-shadow: 0 12px 36px {accentShadowColor};
|
|
82
|
+
}
|
|
83
|
+
.orbit-center {
|
|
84
|
+
position: relative;
|
|
85
|
+
z-index: 5;
|
|
86
|
+
font-family: {font};
|
|
87
|
+
font-weight: 900;
|
|
88
|
+
font-size: 96px;
|
|
89
|
+
letter-spacing: 8px;
|
|
90
|
+
color: {centerTextColor};
|
|
91
|
+
text-transform: uppercase;
|
|
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 items = document.querySelectorAll(".orbit-item");
|
|
104
|
+
// RADIUS_X, RADIUS_Y, ORBIT_DURATION, ENTRY_DUR, STAGGER, FLIP_BACK, CENTER_BACK
|
|
105
|
+
// — all named constants; values per "How to Choose Values" below.
|
|
106
|
+
const RADIUS_Y = RADIUS_X * Y_TO_X_RATIO; // perspective-flattened ellipse
|
|
107
|
+
|
|
108
|
+
items.forEach((el, i) => {
|
|
109
|
+
const initialAngleDeg = Number(el.dataset.angle);
|
|
110
|
+
const initialAngleRad = (initialAngleDeg / 360) * Math.PI * 2;
|
|
111
|
+
const startX = Math.cos(initialAngleRad) * RADIUS_X;
|
|
112
|
+
const startY = Math.sin(initialAngleRad) * RADIUS_Y;
|
|
113
|
+
|
|
114
|
+
// 1) Place at orbital position with opacity 0 — BEFORE any tween fires
|
|
115
|
+
gsap.set(el, {
|
|
116
|
+
xPercent: -50,
|
|
117
|
+
yPercent: -50,
|
|
118
|
+
x: startX,
|
|
119
|
+
y: startY,
|
|
120
|
+
rotateX: ROTATE_X_FROM,
|
|
121
|
+
rotateY: ROTATE_Y_FROM,
|
|
122
|
+
z: Z_FROM,
|
|
123
|
+
opacity: 0,
|
|
124
|
+
scale: SCALE_FROM,
|
|
125
|
+
});
|
|
126
|
+
|
|
127
|
+
// 2) Phase 1 — flip in IN PLACE at orbital position
|
|
128
|
+
tl.to(
|
|
129
|
+
el,
|
|
130
|
+
{
|
|
131
|
+
rotateX: 0,
|
|
132
|
+
rotateY: 0,
|
|
133
|
+
z: 0,
|
|
134
|
+
opacity: 1,
|
|
135
|
+
scale: 1,
|
|
136
|
+
duration: ENTRY_DUR,
|
|
137
|
+
ease: `back.out(${FLIP_BACK})`,
|
|
138
|
+
},
|
|
139
|
+
i * STAGGER,
|
|
140
|
+
);
|
|
141
|
+
|
|
142
|
+
// 3) Phase 2 — continuous orbit driven via a 0→1 progress tween
|
|
143
|
+
const orbitState = { p: 0 };
|
|
144
|
+
tl.to(
|
|
145
|
+
orbitState,
|
|
146
|
+
{
|
|
147
|
+
p: 1,
|
|
148
|
+
duration: ORBIT_DURATION,
|
|
149
|
+
ease: "none",
|
|
150
|
+
onUpdate: () => {
|
|
151
|
+
const angle = initialAngleRad + orbitState.p * Math.PI * 2;
|
|
152
|
+
const x = Math.cos(angle) * RADIUS_X;
|
|
153
|
+
const y = Math.sin(angle) * RADIUS_Y;
|
|
154
|
+
// z-index by orbit Y — see "Center label clearance" in Key Principles
|
|
155
|
+
// for the capped-range form when a center label is present.
|
|
156
|
+
el.style.zIndex = String(Math.round(y + RADIUS_Y));
|
|
157
|
+
el.style.transform = `translate(-50%, -50%) translate(${x}px, ${y}px)`;
|
|
158
|
+
},
|
|
159
|
+
},
|
|
160
|
+
i * STAGGER + ENTRY_DUR,
|
|
161
|
+
);
|
|
162
|
+
});
|
|
163
|
+
|
|
164
|
+
// Center label fades in once a few orbit items have landed
|
|
165
|
+
tl.from(
|
|
166
|
+
".orbit-center",
|
|
167
|
+
{ opacity: 0, scale: 0.6, duration: ENTRY_DUR, ease: `back.out(${CENTER_BACK})` },
|
|
168
|
+
CENTER_FADE_AT,
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
window.__timelines["orbit-scene"] = tl;
|
|
172
|
+
</script>
|
|
173
|
+
```
|
|
174
|
+
|
|
175
|
+
## How to Choose Values
|
|
176
|
+
|
|
177
|
+
- **RADIUS_X** — horizontal radius of the orbit ellipse, in px
|
|
178
|
+
- Range: 300–900 px
|
|
179
|
+
- Effects: small radius reads as a tight cluster; large radius spreads the ring across the frame and lets a large center element breathe
|
|
180
|
+
- Constraints: must clear the center element horizontally at every angle — see Key Principles for the `RADIUS_X * min(|cos(θ)|) ≥ L_w + I_w + breathing_room` rule
|
|
181
|
+
- Reference: ../../examples/cta-orbit-collapse.html uses 480
|
|
182
|
+
|
|
183
|
+
- **Y_TO_X_RATIO** — `RADIUS_Y / RADIUS_X`, the orbit's perspective flattening
|
|
184
|
+
- Range: 0.4–0.7
|
|
185
|
+
- Effects: low values read as a near-horizontal disc seen from above; values approaching 1 read as a flat plane facing the camera
|
|
186
|
+
- Constraints: keep < 1 — the orbit should look like a tilted ring, not a frontal halo
|
|
187
|
+
- Reference: ../../examples/cta-orbit-collapse.html uses ≈ 0.58
|
|
188
|
+
|
|
189
|
+
- **ORBIT_DURATION** — seconds for one full revolution
|
|
190
|
+
- Range: 4–25 s (longer for ambient backdrop, shorter for active feature motion)
|
|
191
|
+
- Effects: short durations look frenetic; long durations read as drifting / calm
|
|
192
|
+
- Constraints: must be ≥ the time the orbit is on screen, otherwise the tween ends and items stop
|
|
193
|
+
- Reference: ../../examples/cta-orbit-collapse.html uses ~25 s effective (orbit speed 0.25 rad/s)
|
|
194
|
+
|
|
195
|
+
- **ENTRY_DUR** — per-element flip-in duration
|
|
196
|
+
- Range: 0.4–0.8 s
|
|
197
|
+
- Effects: short feels punchy; long feels stately
|
|
198
|
+
- Constraints: must be ≤ the gap between the first and last element's start so the cascade doesn't overlap to incoherence
|
|
199
|
+
- Reference: ../../examples/cta-orbit-collapse.html uses 0.55 s
|
|
200
|
+
|
|
201
|
+
- **STAGGER** — delay between consecutive element entries
|
|
202
|
+
- Range: 0.06–0.12 s
|
|
203
|
+
- Effects: below ~0.06 s reads as "popcorn"; above ~0.12 s reads as plodding
|
|
204
|
+
- Constraints: total cascade `(n - 1) * STAGGER` should still complete before the next scene phase begins
|
|
205
|
+
- Reference: ../../examples/cta-orbit-collapse.html uses 0.10 s
|
|
206
|
+
|
|
207
|
+
- **FLIP_BACK** — `back.out(<n>)` overshoot for the flip-in
|
|
208
|
+
- Range: 1.2–2.0
|
|
209
|
+
- Effects: low end is a soft arrive; high end snaps with visible overshoot
|
|
210
|
+
- Constraints: pair with a calmer `CENTER_BACK` if both fire close together — competing overshoots cancel each other
|
|
211
|
+
- Reference: ../../examples/cta-orbit-collapse.html uses 1.4
|
|
212
|
+
|
|
213
|
+
- **CENTER_BACK** — `back.out(<n>)` overshoot for the center label fade-in
|
|
214
|
+
- Range: 1.2–1.8
|
|
215
|
+
- Effects: low end keeps the label calm under the busy orbit; high end gives it a small "pop" of arrival
|
|
216
|
+
- Reference: ../../examples/cta-orbit-collapse.html uses 1.4
|
|
217
|
+
|
|
218
|
+
- **CENTER_FADE_AT** — when the center label fades in, in seconds
|
|
219
|
+
- Range: just after the first 2–4 elements have landed
|
|
220
|
+
- Effects: too early competes with the cascade; too late leaves a hole at the center of the orbit
|
|
221
|
+
- Reference: ../../examples/cta-orbit-collapse.html starts the center brand near the front of the scene
|
|
222
|
+
|
|
223
|
+
- **ROTATE_X_FROM / ROTATE_Y_FROM / Z_FROM / SCALE_FROM** — initial 3D orientation
|
|
224
|
+
- Range: rotateX ±60° to ±120°; rotateY ±45° to ±120°; z −200 to −400; scale 0.2–0.6
|
|
225
|
+
- Effects: higher absolute rotation + deeper negative z = more dramatic "card flipping out of depth"; lower = subtle reorientation
|
|
226
|
+
- Constraints: pick a direction consistent with the scene's perspective; mixing positive and negative rotateY across items reads as noise
|
|
227
|
+
- Reference: ../../examples/cta-orbit-collapse.html uses rotateX 90, rotateY −45, z −100, scale 0
|
|
228
|
+
|
|
229
|
+
## Variations
|
|
230
|
+
|
|
231
|
+
### Collapse to center
|
|
232
|
+
|
|
233
|
+
To reverse — orbit then collapse inward — interpolate `RADIUS_X` and `RADIUS_Y` to 0 in a final phase by multiplying both radii by a 1→0 driver:
|
|
234
|
+
|
|
235
|
+
```js
|
|
236
|
+
const collapse = { r: 1 };
|
|
237
|
+
tl.to(
|
|
238
|
+
collapse,
|
|
239
|
+
{
|
|
240
|
+
r: 0,
|
|
241
|
+
duration: COLLAPSE_DUR,
|
|
242
|
+
ease: "power3.inOut",
|
|
243
|
+
onUpdate: () =>
|
|
244
|
+
items.forEach((el) => {
|
|
245
|
+
const a = (Number(el.dataset.angle) / 360) * Math.PI * 2;
|
|
246
|
+
const x = Math.cos(a) * RADIUS_X * collapse.r;
|
|
247
|
+
const y = Math.sin(a) * RADIUS_Y * collapse.r;
|
|
248
|
+
el.style.transform = `translate(-50%,-50%) translate(${x}px,${y}px) scale(${collapse.r})`;
|
|
249
|
+
}),
|
|
250
|
+
},
|
|
251
|
+
COLLAPSE_AT,
|
|
252
|
+
);
|
|
253
|
+
```
|
|
254
|
+
|
|
255
|
+
### Tilted orbit plane
|
|
256
|
+
|
|
257
|
+
For a more dramatic 3D orbit, rotate the entire `.orbit-stage` on the X axis:
|
|
258
|
+
|
|
259
|
+
```css
|
|
260
|
+
.orbit-stage {
|
|
261
|
+
transform: rotateX(25deg);
|
|
262
|
+
}
|
|
263
|
+
```
|
|
264
|
+
|
|
265
|
+
Items rendered above/below the equator visually arc through the plane.
|
|
266
|
+
|
|
267
|
+
## Key Principles
|
|
268
|
+
|
|
269
|
+
- **`perspective` on scene root REQUIRED** — without it, rotateX/Y read as 2D scale and the flip-in looks flat
|
|
270
|
+
- **`transform-style: preserve-3d`** on both the stage and each item — preserves the 3D context as items have their own transforms
|
|
271
|
+
- **Stagger entries** — cascade reads as "swarm forming," simultaneous reads as "popcorn." See `STAGGER` in How to Choose Values
|
|
272
|
+
- **Element count 4-12** — fewer feels empty, more crowds the center
|
|
273
|
+
- **❗ Center label clearance — translateZ + capped item z-index** — `z-index` ALONE is unreliable inside a `transform-style: preserve-3d` stage (paint order follows Z position, not stacking-context z-index). For the orbit to NEVER occlude the headline:
|
|
274
|
+
1. Push the center label forward: `transform: translateZ(220px); z-index: 9999;`
|
|
275
|
+
2. Cap orbit-item dynamic z-index in `[1, 50]` so bottom-of-orbit items still read as "in front of" top-of-orbit items, but **never above the center label**. e.g.: `el.style.zIndex = String(1 + Math.round((y + RADIUS_Y) / (2 * RADIUS_Y) * 49));`
|
|
276
|
+
3. **Choose `RADIUS_X` so items also clear the center label HORIZONTALLY at all angles.** If the label's half-width is `L_w` and the item's half-width is `I_w`, then `RADIUS_X` must satisfy `RADIUS_X * min(|cos(θ_minimum)|) ≥ L_w + I_w + breathing_room`. For a 6-item orbit with 60° angular spacing, the worst case is `cos(30°) ≈ 0.866` between items. Scale `RADIUS_X` with the center label's width — a heavier wordmark needs a wider ring.
|
|
277
|
+
- **❗ Center element is the headline** — the orbit is ornamental motion around it. If the orbit dominates the eye, increase center element size or fade orbit items down
|
|
278
|
+
|
|
279
|
+
## Critical Constraints
|
|
280
|
+
|
|
281
|
+
- **No `requestAnimationFrame`** — orbit must run inside the timeline so HF seeks frame-by-frame deterministically
|
|
282
|
+
- **Timeline must be paused**: `gsap.timeline({ paused: true })`
|
|
283
|
+
- **Registry key = `data-composition-id`**
|
|
284
|
+
- **Each item gets its OWN orbit tween** — don't share one tween with `targets: '.orbit-item'` because each starts at a different `initialAngle`
|
|
285
|
+
- **`will-change: transform`** — many simultaneous orbital transforms benefit from compositor hints
|
|
286
|
+
- **Don't animate `left`/`top`** — use `translate()` (composes with `translate(-50%, -50%)` centering)
|
|
287
|
+
- **❗ Entry must flip IN PLACE at orbital position, NOT at center** — a fromTo whose "from" and "to" both have `x: 0, y: 0` keeps the item at the stage center during phase 1, so it collides with the center label during flip-in (and then snaps to orbit on phase 2 start — a visible teleport).
|
|
288
|
+
|
|
289
|
+
The correct pattern (see GSAP Timeline above) is to `gsap.set()` each item at `(cos(initialAngle)*RADIUS_X, sin(initialAngle)*RADIUS_Y)` with `opacity: 0` BEFORE adding tweens, then have phase 1 animate only rotation/opacity/scale — NOT translate. The item fades in IN PLACE at its orbital starting point, and phase 2 picks up the orbit smoothly from there.
|
|
290
|
+
|
|
291
|
+
## Combinations
|
|
292
|
+
|
|
293
|
+
- [center-outward-expansion.md](center-outward-expansion.md) — alternative entry pattern (burst, not orbit); also the reversed driver for an orbit-collapse finish
|
|
294
|
+
- [cursor-click-ripple.md](cursor-click-ripple.md) — pairs naturally when the center element is a CTA the user "clicks" to trigger the collapse
|
|
295
|
+
- [sine-wave-loop.md](sine-wave-loop.md) — per-item idle wobble layered on top of the orbit
|
|
296
|
+
|
|
297
|
+
## Pairs with HF skills
|
|
298
|
+
|
|
299
|
+
- `/hyperframes-animation` — timeline + `onUpdate` API
|
|
300
|
+
- `/hyperframes-core` — composition wiring
|
|
301
|
+
- `/hyperframes-cli` — `hyperframes lint`
|