dsh-hyperframes 0.3.2 → 0.4.1
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/README.en.md +5 -4
- package/README.md +6 -5
- package/lib/index.d.ts +1 -1
- package/lib/index.js +1 -0
- package/package.json +2 -2
- package/skills/embedded-captions/SKILL.md +28 -3
- package/skills/embedded-captions/references/aesthetic-principles.md +2 -3
- package/skills/embedded-captions/references/rail.md +1 -1
- package/skills/embedded-captions/scripts/check-occlusion.cjs +4 -1
- package/skills/embedded-captions/scripts/check-overflow.cjs +1 -0
- package/skills/embedded-captions/scripts/check-rail-climax.cjs +5 -1
- package/skills/embedded-captions/scripts/fixtures/heroless/theme.json +11 -0
- package/skills/embedded-captions/scripts/hf-cli.cjs +33 -0
- package/skills/embedded-captions/scripts/make-theme.cjs +95 -57
- package/skills/embedded-captions/scripts/make-theme.test.mjs +131 -0
- package/skills/embedded-captions/scripts/matte.cjs +1 -13
- package/skills/embedded-captions/scripts/measure-layout.cjs +2 -1
- package/skills/embedded-captions/scripts/preview-frames.cjs +39 -11
- package/skills/embedded-captions/scripts/preview-frames.test.mjs +24 -0
- package/skills/embedded-captions/scripts/render-and-composite.sh +8 -52
- package/skills/embedded-captions/scripts/safe-zones.cjs +4 -1
- package/skills/embedded-captions/scripts/transcribe.cjs +5 -14
- package/skills/embedded-captions/scripts/transcribe.test.mjs +41 -0
- package/skills/faceless-explainer/SKILL.md +20 -16
- package/skills/faceless-explainer/references/story-design.md +1 -1
- package/skills/faceless-explainer/scripts/assemble-index.mjs +6 -4
- package/skills/faceless-explainer/scripts/assemble-index.test.mjs +57 -2
- package/skills/faceless-explainer/scripts/audio.mjs +2 -0
- package/skills/faceless-explainer/scripts/build-frame.mjs +6 -3
- package/skills/faceless-explainer/scripts/captions.mjs +7 -4
- package/skills/faceless-explainer/scripts/frame-packets.mjs +4 -4
- package/skills/faceless-explainer/scripts/lib/bgm-volume.mjs +4 -0
- package/skills/faceless-explainer/scripts/lib/captured-fonts.mjs +58 -0
- package/skills/{hyperframes-core → faceless-explainer}/scripts/lib/frame-packets-core.mjs +5 -23
- package/skills/faceless-explainer/scripts/lib/storyboard.mjs +1 -1
- package/skills/faceless-explainer/scripts/lib/transitions.json +3 -3
- package/skills/faceless-explainer/scripts/transitions.mjs +1 -0
- package/skills/faceless-explainer/scripts/transitions.test.mjs +2 -0
- package/skills/faceless-explainer/sub-agents/frame-worker.md +1 -1
- package/skills/figma/SKILL.md +2 -0
- package/skills/general-video/SKILL.md +13 -11
- package/skills/general-video/scripts/frame-packets.mjs +4 -4
- package/skills/general-video/scripts/lib/frame-packets-core.mjs +194 -0
- package/skills/general-video/sub-agents/frame-worker.md +1 -1
- package/skills/hyperframes/SKILL.md +40 -30
- package/skills/{hyperframes-core → hyperframes}/references/brief-contract.md +15 -15
- package/skills/{hyperframes-core → hyperframes}/references/brief-format.md +8 -8
- package/skills/hyperframes/references/capability-menu.md +2 -2
- package/skills/{hyperframes-core → hyperframes}/references/frame-worker-core.md +1 -1
- package/skills/hyperframes/references/intent-interview.md +16 -16
- package/skills/hyperframes/references/plugin-installation.md +43 -0
- package/skills/{hyperframes-core → hyperframes}/references/production-loop.md +11 -11
- package/skills/hyperframes/references/review-loop.md +37 -0
- package/skills/hyperframes/references/route-briefs.md +1 -1
- package/skills/hyperframes/references/routes/motion-graphics.md +1 -1
- package/skills/{hyperframes-core → hyperframes}/references/script-format.md +3 -3
- package/skills/hyperframes/references/skill-lifecycle.md +2 -0
- package/skills/{hyperframes-core → hyperframes}/references/storyboard-format.md +3 -34
- package/skills/hyperframes/scripts/lib/frame-packets-core.mjs +194 -0
- package/skills/hyperframes/scripts/plugin-cli.mjs +88 -0
- package/skills/hyperframes/scripts/plugin-cli.test.mjs +117 -0
- package/skills/hyperframes-animation/SKILL.md +5 -1
- package/skills/hyperframes-animation/adapters/gsap.md +1 -1
- package/skills/hyperframes-animation/adapters/lottie.md +15 -2
- package/skills/hyperframes-animation/adapters/three.md +14 -0
- package/skills/hyperframes-animation/blueprints/titlecard-reveal.md +1 -1
- package/skills/hyperframes-animation/references/motion-blur.md +133 -0
- package/skills/hyperframes-animation/rules/cursor-click-ripple.md +1 -1
- package/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +1 -1
- package/skills/hyperframes-animation/rules/hacker-flip-3d.md +1 -1
- package/skills/hyperframes-animation/rules/kinetic-beat-slam.md +2 -2
- package/skills/hyperframes-animation/rules/motion-blur-streak.md +1 -1
- package/skills/hyperframes-animation/rules/vertical-spring-ticker.md +1 -1
- package/skills/hyperframes-animation/scripts/package-loader.mjs +47 -16
- package/skills/hyperframes-animation/scripts/package-loader.test.mjs +52 -0
- package/skills/hyperframes-animation/techniques.md +1 -1
- package/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +3 -3
- package/skills/hyperframes-animation/transitions/css-push.md +4 -4
- package/skills/hyperframes-audio/SKILL.md +30 -22
- package/skills/hyperframes-audio/scripts/carve.mjs +6 -3
- package/skills/hyperframes-audio/scripts/carve.test.mjs +16 -1
- package/skills/hyperframes-cli/SKILL.md +44 -35
- package/skills/hyperframes-cli/references/init-and-scaffold.md +8 -6
- package/skills/hyperframes-cli/references/lint-validate-inspect.md +3 -3
- package/skills/hyperframes-cli/references/preview-render.md +35 -32
- package/skills/hyperframes-cli/references/upgrade-info-misc.md +50 -1
- package/skills/hyperframes-core/SKILL.md +30 -24
- package/skills/hyperframes-core/references/composition-patterns.md +3 -42
- package/skills/hyperframes-core/references/creator-editing-recipes.md +131 -7
- package/skills/hyperframes-core/references/data-attributes.md +11 -11
- package/skills/hyperframes-core/references/determinism-rules.md +2 -19
- package/skills/hyperframes-core/references/full-screen-motion.md +0 -9
- package/skills/hyperframes-core/references/minimal-composition.md +2 -2
- package/skills/hyperframes-core/references/sub-compositions.md +3 -66
- package/skills/hyperframes-core/references/tailwind.md +1 -20
- package/skills/hyperframes-core/references/tracks-and-clips.md +2 -6
- package/skills/hyperframes-core/references/variables-and-media.md +3 -3
- package/skills/hyperframes-creative/SKILL.md +2 -0
- package/skills/hyperframes-creative/references/house-style.md +15 -15
- package/skills/hyperframes-creative/references/story-spine.md +3 -1
- package/skills/hyperframes-creative/references/storyboard-recipe.md +57 -0
- package/skills/hyperframes-creative/references/typography.md +1 -1
- package/skills/hyperframes-creative/scripts/package-loader.mjs +47 -16
- package/skills/hyperframes-creative/scripts/package-loader.test.mjs +52 -0
- package/skills/hyperframes-keyframes/SKILL.md +4 -2
- package/skills/hyperframes-registry/SKILL.md +3 -1
- package/skills/hyperframes-registry/references/contributing.md +8 -2
- package/skills/hyperframes-registry/references/discovery.md +20 -34
- package/skills/hyperframes-studio/SKILL.md +77 -0
- package/skills/media-use/SKILL.md +14 -12
- package/skills/media-use/audio/references/captions/authoring.md +4 -0
- package/skills/media-use/audio/references/remove-background.md +1 -1
- package/skills/media-use/audio/references/tts-to-captions.md +11 -2
- package/skills/media-use/audio/references/tts.md +84 -6
- package/skills/media-use/audio/scripts/audio.mjs +15 -6
- package/skills/media-use/audio/scripts/gemini-pipeline.test.mjs +113 -0
- package/skills/media-use/audio/scripts/lib/audio-meta.mjs +39 -0
- package/skills/media-use/audio/scripts/lib/audio-meta.test.mjs +136 -0
- package/skills/media-use/audio/scripts/lib/bgm-volume.mjs +4 -0
- package/skills/media-use/audio/scripts/lib/bgm.mjs +2 -6
- package/skills/media-use/audio/scripts/lib/gemini-auth.mjs +43 -0
- package/skills/media-use/audio/scripts/lib/gemini-auth.py +52 -0
- package/skills/media-use/audio/scripts/lib/gemini-auth.test.mjs +86 -0
- package/skills/media-use/audio/scripts/lib/gemini-auth_test.py +90 -0
- package/skills/media-use/audio/scripts/lib/gemini-tts.mjs +122 -0
- package/skills/media-use/audio/scripts/lib/gemini-tts.test.mjs +243 -0
- package/skills/media-use/audio/scripts/lib/heygen.mjs +2 -1
- package/skills/media-use/audio/scripts/lib/tts.mjs +15 -3
- package/skills/media-use/audio/scripts/wait-bgm.mjs +8 -4
- package/skills/media-use/audio/scripts/wait-bgm.test.mjs +65 -0
- package/skills/media-use/references/audio.md +3 -2
- package/skills/media-use/references/grading.md +7 -7
- package/skills/media-use/references/media-treatment-recipes.md +1 -1
- package/skills/media-use/references/memory.md +2 -2
- package/skills/media-use/references/meta.md +2 -2
- package/skills/media-use/references/operations.md +15 -13
- package/skills/media-use/references/resolve.md +22 -11
- package/skills/media-use/references/setup-providers.md +11 -11
- package/skills/media-use/scripts/audio-duck.mjs +19 -27
- package/skills/media-use/scripts/compatibility.test.mjs +96 -0
- package/skills/media-use/scripts/lib/config-lock.mjs +45 -0
- package/skills/media-use/scripts/lib/duck.mjs +16 -10
- package/skills/media-use/scripts/lib/media-fetch.mjs +85 -0
- package/skills/media-use/scripts/lib/media-home.mjs +20 -0
- package/skills/media-use/scripts/lib/npx-sync.mjs +28 -2
- package/skills/media-use/scripts/lib/prefs-store.mjs +2 -2
- package/skills/media-use/scripts/lib/recipe-store.mjs +2 -2
- package/skills/media-use/scripts/lib/telemetry.mjs +29 -41
- package/skills/media-use/scripts/lib/transcriptCutFade.mjs +21 -0
- package/skills/media-use/scripts/prefs.mjs +1 -1
- package/skills/media-use/scripts/recipe.mjs +1 -1
- package/skills/media-use/scripts/resolve-plugin.test.mjs +62 -0
- package/skills/media-use/scripts/resolve.mjs +27 -1267
- package/skills/media-use/scripts/transcribe.mjs +39 -25
- package/skills/media-use/scripts/transcribe.test.mjs +112 -0
- package/skills/media-use/scripts/transcript-cut.mjs +39 -8
- package/skills/media-use/scripts/transcript-cut.test.mjs +117 -0
- package/skills/motion-graphics/SKILL.md +3 -1
- package/skills/motion-graphics/agents/builder.md +1 -0
- package/skills/motion-graphics/agents/director.md +2 -1
- package/skills/motion-graphics/catalog-map.md +25 -13
- package/skills/motion-graphics/categories/charts/module.md +2 -1
- package/skills/motion-graphics/categories/lower-thirds/module.md +4 -0
- package/skills/motion-graphics/categories/news/module.md +1 -1
- package/skills/motion-graphics/references/motion-vocabulary.md +4 -0
- package/skills/music-to-video/SKILL.md +8 -6
- package/skills/music-to-video/references/montage.md +3 -6
- package/skills/music-to-video/references/motion-primitives/3d-card-flip/index.html +10 -111
- package/skills/music-to-video/references/motion-primitives/3d-card-flip/scene.html +119 -0
- package/skills/music-to-video/references/motion-primitives/bg-flow-field/index.html +11 -284
- package/skills/music-to-video/references/motion-primitives/bg-flow-field/scene.html +294 -0
- package/skills/music-to-video/references/motion-primitives/binary-decrypt/index.html +10 -76
- package/skills/music-to-video/references/motion-primitives/binary-decrypt/scene.html +85 -0
- package/skills/music-to-video/references/motion-primitives/blur-resolve/index.html +10 -52
- package/skills/music-to-video/references/motion-primitives/blur-resolve/scene.html +60 -0
- package/skills/music-to-video/references/motion-primitives/braam-punch/index.html +10 -92
- package/skills/music-to-video/references/motion-primitives/braam-punch/scene.html +100 -0
- package/skills/music-to-video/references/motion-primitives/chromatic-split/index.html +10 -103
- package/skills/music-to-video/references/motion-primitives/chromatic-split/scene.html +111 -0
- package/skills/music-to-video/references/motion-primitives/chrome-sweep/index.html +10 -60
- package/skills/music-to-video/references/motion-primitives/chrome-sweep/scene.html +68 -0
- package/skills/music-to-video/references/motion-primitives/counting-punch/index.html +10 -110
- package/skills/music-to-video/references/motion-primitives/counting-punch/scene.html +119 -0
- package/skills/music-to-video/references/motion-primitives/crash-zoom-in/index.html +10 -112
- package/skills/music-to-video/references/motion-primitives/crash-zoom-in/scene.html +120 -0
- package/skills/music-to-video/references/motion-primitives/datamosh-smear/index.html +10 -121
- package/skills/music-to-video/references/motion-primitives/datamosh-smear/scene.html +131 -0
- package/skills/music-to-video/references/motion-primitives/directional-fill/index.html +10 -90
- package/skills/music-to-video/references/motion-primitives/directional-fill/scene.html +103 -0
- package/skills/music-to-video/references/motion-primitives/dolly-zoom/index.html +10 -94
- package/skills/music-to-video/references/motion-primitives/dolly-zoom/scene.html +102 -0
- package/skills/music-to-video/references/motion-primitives/electric-arc/index.html +10 -100
- package/skills/music-to-video/references/motion-primitives/electric-arc/scene.html +105 -0
- package/skills/music-to-video/references/motion-primitives/flash-cut/index.html +10 -89
- package/skills/music-to-video/references/motion-primitives/flash-cut/scene.html +97 -0
- package/skills/music-to-video/references/motion-primitives/gooey-metaball/index.html +10 -197
- package/skills/music-to-video/references/motion-primitives/gooey-metaball/scene.html +206 -0
- package/skills/music-to-video/references/motion-primitives/hard-cut/index.html +10 -74
- package/skills/music-to-video/references/motion-primitives/hard-cut/scene.html +82 -0
- package/skills/music-to-video/references/motion-primitives/hypercut-whip/index.html +10 -36
- package/skills/music-to-video/references/motion-primitives/hypercut-whip/scene.html +44 -0
- package/skills/music-to-video/references/motion-primitives/iris-open/index.html +10 -61
- package/skills/music-to-video/references/motion-primitives/iris-open/scene.html +69 -0
- package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/index.html +10 -55
- package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/scene.html +64 -0
- package/skills/music-to-video/references/motion-primitives/liquid-morph/index.html +10 -88
- package/skills/music-to-video/references/motion-primitives/liquid-morph/scene.html +96 -0
- package/skills/music-to-video/references/motion-primitives/mask-reveal/index.html +10 -66
- package/skills/music-to-video/references/motion-primitives/mask-reveal/scene.html +74 -0
- package/skills/music-to-video/references/motion-primitives/mosaic-pack/index.html +10 -81
- package/skills/music-to-video/references/motion-primitives/mosaic-pack/scene.html +89 -0
- package/skills/music-to-video/references/motion-primitives/neon-flicker/index.html +10 -65
- package/skills/music-to-video/references/motion-primitives/neon-flicker/scene.html +73 -0
- package/skills/music-to-video/references/motion-primitives/outline-to-fill/index.html +10 -74
- package/skills/music-to-video/references/motion-primitives/outline-to-fill/scene.html +82 -0
- package/skills/music-to-video/references/motion-primitives/palette-flip/index.html +10 -89
- package/skills/music-to-video/references/motion-primitives/palette-flip/scene.html +97 -0
- package/skills/music-to-video/references/motion-primitives/particle-burst/index.html +10 -98
- package/skills/music-to-video/references/motion-primitives/particle-burst/scene.html +106 -0
- package/skills/music-to-video/references/motion-primitives/pixel-dissolve/index.html +10 -78
- package/skills/music-to-video/references/motion-primitives/pixel-dissolve/scene.html +86 -0
- package/skills/music-to-video/references/motion-primitives/radial-burst-lines/index.html +10 -117
- package/skills/music-to-video/references/motion-primitives/radial-burst-lines/scene.html +130 -0
- package/skills/music-to-video/references/motion-primitives/screen-shake/index.html +10 -70
- package/skills/music-to-video/references/motion-primitives/screen-shake/scene.html +78 -0
- package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/index.html +10 -87
- package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/scene.html +100 -0
- package/skills/music-to-video/references/motion-primitives/spotlight-sweep/index.html +10 -94
- package/skills/music-to-video/references/motion-primitives/spotlight-sweep/scene.html +102 -0
- package/skills/music-to-video/references/motion-primitives/staggered-exit/index.html +10 -74
- package/skills/music-to-video/references/motion-primitives/staggered-exit/scene.html +82 -0
- package/skills/music-to-video/references/motion-primitives/text-spectral-rays/index.html +11 -271
- package/skills/music-to-video/references/motion-primitives/text-spectral-rays/scene.html +280 -0
- package/skills/music-to-video/references/motion-primitives/text-wave-distort/index.html +10 -92
- package/skills/music-to-video/references/motion-primitives/text-wave-distort/scene.html +106 -0
- package/skills/music-to-video/references/motion-primitives/tile-mosaic/index.html +10 -101
- package/skills/music-to-video/references/motion-primitives/tile-mosaic/scene.html +109 -0
- package/skills/music-to-video/references/motion-primitives/typewriter-reveal/index.html +10 -79
- package/skills/music-to-video/references/motion-primitives/typewriter-reveal/scene.html +91 -0
- package/skills/music-to-video/references/motion-primitives/word-grid-burst/index.html +10 -83
- package/skills/music-to-video/references/motion-primitives/word-grid-burst/scene.html +96 -0
- package/skills/music-to-video/references/planning.md +2 -2
- package/skills/music-to-video/scripts/lib/storyboard.mjs +1 -1
- package/skills/music-to-video/sub-agents/frame-worker.md +2 -2
- package/skills/pr-to-video/SKILL.md +20 -16
- package/skills/pr-to-video/references/code-vocabulary.md +14 -12
- package/skills/pr-to-video/references/story-design.md +1 -1
- package/skills/pr-to-video/scripts/assemble-index.mjs +6 -4
- package/skills/pr-to-video/scripts/assemble-index.test.mjs +57 -2
- package/skills/pr-to-video/scripts/audio.mjs +2 -0
- package/skills/pr-to-video/scripts/build-frame.mjs +6 -3
- package/skills/pr-to-video/scripts/captions.mjs +7 -4
- package/skills/pr-to-video/scripts/captions.test.mjs +41 -0
- package/skills/pr-to-video/scripts/frame-packets.mjs +4 -4
- package/skills/pr-to-video/scripts/lib/bgm-volume.mjs +4 -0
- package/skills/pr-to-video/scripts/lib/captured-fonts.mjs +58 -0
- package/skills/pr-to-video/scripts/lib/frame-packets-core.mjs +194 -0
- package/skills/pr-to-video/scripts/lib/storyboard.mjs +1 -1
- package/skills/pr-to-video/scripts/lib/transitions.json +3 -3
- package/skills/pr-to-video/scripts/transitions.mjs +7 -5
- package/skills/pr-to-video/sub-agents/frame-worker.md +1 -1
- package/skills/product-launch-video/SKILL.md +20 -16
- package/skills/product-launch-video/references/story-design.md +1 -1
- package/skills/product-launch-video/scripts/assemble-index.mjs +6 -4
- package/skills/product-launch-video/scripts/assemble-index.test.mjs +57 -2
- package/skills/product-launch-video/scripts/audio.mjs +2 -0
- package/skills/product-launch-video/scripts/audio.test.mjs +16 -0
- package/skills/product-launch-video/scripts/build-frame-subsets.test.mjs +152 -0
- package/skills/product-launch-video/scripts/build-frame.mjs +6 -3
- package/skills/product-launch-video/scripts/captions.mjs +7 -4
- package/skills/product-launch-video/scripts/frame-packets.mjs +4 -4
- package/skills/product-launch-video/scripts/lib/bgm-volume.mjs +4 -0
- package/skills/product-launch-video/scripts/lib/captured-fonts.mjs +58 -0
- package/skills/product-launch-video/scripts/lib/frame-packets-core.mjs +194 -0
- package/skills/product-launch-video/scripts/lib/storyboard.mjs +1 -1
- package/skills/product-launch-video/scripts/lib/transitions.json +3 -3
- package/skills/product-launch-video/scripts/transitions.mjs +7 -5
- package/skills/product-launch-video/scripts/transitions.test.mjs +68 -0
- package/skills/product-launch-video/sub-agents/frame-worker.md +1 -1
- package/skills/remotion-to-hyperframes/SKILL.md +7 -4
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/expected.json +5 -5
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/compositions/title.html +31 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/index.html +10 -25
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/README.md +8 -8
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/expected.json +9 -9
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-1.html +35 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-2.html +35 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-3.html +36 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/index.html +28 -71
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json +3 -3
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-1.html +52 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-2.html +99 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-3.html +55 -0
- package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/index.html +13 -212
- package/skills/remotion-to-hyperframes/references/api-map.md +16 -16
- package/skills/remotion-to-hyperframes/references/limitations.md +7 -7
- package/skills/remotion-to-hyperframes/references/lottie.md +5 -7
- package/skills/remotion-to-hyperframes/references/media.md +3 -3
- package/skills/remotion-to-hyperframes/references/parameters.md +5 -0
- package/skills/remotion-to-hyperframes/references/sequencing.md +71 -18
- package/skills/slideshow/SKILL.md +4 -1
- package/skills/slideshow/references/standalone-harness.md +0 -3
- package/skills/talking-head-recut/SKILL.md +10 -1
- package/skills/hyperframes-core/references/review-loop.md +0 -41
- package/skills/media-use/scripts/lib/adopt.mjs +0 -128
- package/skills/media-use/scripts/lib/adopt.test.mjs +0 -95
- package/skills/media-use/scripts/lib/bgm-provider.mjs +0 -20
- package/skills/media-use/scripts/lib/brand-provider.mjs +0 -59
- package/skills/media-use/scripts/lib/bundled-sfx-provider.mjs +0 -108
- package/skills/media-use/scripts/lib/bundled-sfx-provider.test.mjs +0 -85
- package/skills/media-use/scripts/lib/cache.mjs +0 -150
- package/skills/media-use/scripts/lib/candidates.mjs +0 -91
- package/skills/media-use/scripts/lib/candidates.test.mjs +0 -155
- package/skills/media-use/scripts/lib/codex-provider.mjs +0 -161
- package/skills/media-use/scripts/lib/codex-provider.test.mjs +0 -34
- package/skills/media-use/scripts/lib/coverage.test.mjs +0 -117
- package/skills/media-use/scripts/lib/cube-build.mjs +0 -181
- package/skills/media-use/scripts/lib/cube-build.test.mjs +0 -80
- package/skills/media-use/scripts/lib/cube-validate.mjs +0 -198
- package/skills/media-use/scripts/lib/cube-validate.test.mjs +0 -125
- package/skills/media-use/scripts/lib/cutlist.test.mjs +0 -148
- package/skills/media-use/scripts/lib/duck.test.mjs +0 -118
- package/skills/media-use/scripts/lib/error-diffusion.test.mjs +0 -102
- package/skills/media-use/scripts/lib/freeze.mjs +0 -70
- package/skills/media-use/scripts/lib/freeze.test.mjs +0 -46
- package/skills/media-use/scripts/lib/grade-analyzer.mjs +0 -264
- package/skills/media-use/scripts/lib/grade-analyzer.test.mjs +0 -285
- package/skills/media-use/scripts/lib/heygen-cli.mjs +0 -191
- package/skills/media-use/scripts/lib/heygen-cli.test.mjs +0 -301
- package/skills/media-use/scripts/lib/heygen-search.mjs +0 -45
- package/skills/media-use/scripts/lib/heygen-search.test.mjs +0 -49
- package/skills/media-use/scripts/lib/heygen-video-provider.mjs +0 -127
- package/skills/media-use/scripts/lib/heygen-video-provider.test.mjs +0 -344
- package/skills/media-use/scripts/lib/image-provider.mjs +0 -44
- package/skills/media-use/scripts/lib/local-models.mjs +0 -318
- package/skills/media-use/scripts/lib/local-models.test.mjs +0 -220
- package/skills/media-use/scripts/lib/local-run.mjs +0 -78
- package/skills/media-use/scripts/lib/local-run.test.mjs +0 -121
- package/skills/media-use/scripts/lib/logo-provider.mjs +0 -222
- package/skills/media-use/scripts/lib/logo-provider.test.mjs +0 -137
- package/skills/media-use/scripts/lib/ltx-video-provider.mjs +0 -94
- package/skills/media-use/scripts/lib/ltx-video-provider.test.mjs +0 -316
- package/skills/media-use/scripts/lib/lut-preset-provider.mjs +0 -266
- package/skills/media-use/scripts/lib/lut-preset-provider.test.mjs +0 -176
- package/skills/media-use/scripts/lib/manifest.test.mjs +0 -388
- package/skills/media-use/scripts/lib/match.mjs +0 -47
- package/skills/media-use/scripts/lib/mflux-provider.mjs +0 -128
- package/skills/media-use/scripts/lib/mflux-provider.test.mjs +0 -174
- package/skills/media-use/scripts/lib/misses.mjs +0 -49
- package/skills/media-use/scripts/lib/misses.test.mjs +0 -78
- package/skills/media-use/scripts/lib/npx-sync.test.mjs +0 -50
- package/skills/media-use/scripts/lib/parakeet-words.test.mjs +0 -44
- package/skills/media-use/scripts/lib/prefs-store.test.mjs +0 -189
- package/skills/media-use/scripts/lib/probe.mjs +0 -39
- package/skills/media-use/scripts/lib/probe.test.mjs +0 -31
- package/skills/media-use/scripts/lib/providers.mjs +0 -5
- package/skills/media-use/scripts/lib/recipe-store.test.mjs +0 -367
- package/skills/media-use/scripts/lib/registry.mjs +0 -218
- package/skills/media-use/scripts/lib/registry.test.mjs +0 -261
- package/skills/media-use/scripts/lib/search.mjs +0 -24
- package/skills/media-use/scripts/lib/search.test.mjs +0 -32
- package/skills/media-use/scripts/lib/sfx-provider.mjs +0 -23
- package/skills/media-use/scripts/lib/specs.mjs +0 -132
- package/skills/media-use/scripts/lib/specs.test.mjs +0 -157
- package/skills/media-use/scripts/lib/stats.mjs +0 -117
- package/skills/media-use/scripts/lib/stats.test.mjs +0 -165
- package/skills/media-use/scripts/lib/telemetry.test.mjs +0 -373
- package/skills/media-use/scripts/lib/tts-local-provider.mjs +0 -92
- package/skills/media-use/scripts/lib/tts-local-provider.test.mjs +0 -72
- package/skills/media-use/scripts/lib/usage.mjs +0 -57
- package/skills/media-use/scripts/lib/usage.test.mjs +0 -54
- package/skills/media-use/scripts/lib/voice-provider.mjs +0 -57
- package/skills/media-use/scripts/lib/voice-provider.test.mjs +0 -46
- package/skills/media-use/scripts/resolve.test.mjs +0 -1120
- /package/skills/{hyperframes-core → hyperframes}/references/subagent-dispatch.md +0 -0
package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/index.html
CHANGED
|
@@ -16,86 +16,6 @@
|
|
|
16
16
|
font-family: Helvetica, Arial, sans-serif;
|
|
17
17
|
color: #ffffff;
|
|
18
18
|
}
|
|
19
|
-
.scene {
|
|
20
|
-
position: absolute;
|
|
21
|
-
inset: 0;
|
|
22
|
-
display: flex;
|
|
23
|
-
align-items: center;
|
|
24
|
-
justify-content: center;
|
|
25
|
-
opacity: 0;
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
/* Scene 1 — Title */
|
|
29
|
-
.scene-1 {
|
|
30
|
-
flex-direction: column;
|
|
31
|
-
}
|
|
32
|
-
.scene-1 .title {
|
|
33
|
-
font-size: 160px;
|
|
34
|
-
font-weight: 900;
|
|
35
|
-
letter-spacing: 0.05em;
|
|
36
|
-
transform: scale(0);
|
|
37
|
-
}
|
|
38
|
-
.scene-1 .subtitle {
|
|
39
|
-
font-size: 36px;
|
|
40
|
-
font-weight: 400;
|
|
41
|
-
color: #9ca3af;
|
|
42
|
-
margin-top: 24px;
|
|
43
|
-
opacity: 0;
|
|
44
|
-
}
|
|
45
|
-
|
|
46
|
-
/* Scene 2 — Stats */
|
|
47
|
-
.scene-2 {
|
|
48
|
-
gap: 48px;
|
|
49
|
-
}
|
|
50
|
-
.stat-card {
|
|
51
|
-
width: 280px;
|
|
52
|
-
height: 220px;
|
|
53
|
-
background: #1a1a1a;
|
|
54
|
-
border-radius: 16px;
|
|
55
|
-
border: 2px solid var(--card-color);
|
|
56
|
-
display: flex;
|
|
57
|
-
flex-direction: column;
|
|
58
|
-
justify-content: center;
|
|
59
|
-
align-items: center;
|
|
60
|
-
opacity: 0;
|
|
61
|
-
transform: scale(0);
|
|
62
|
-
}
|
|
63
|
-
.stat-card .number {
|
|
64
|
-
font-size: 72px;
|
|
65
|
-
font-weight: 800;
|
|
66
|
-
color: var(--card-color);
|
|
67
|
-
line-height: 1;
|
|
68
|
-
}
|
|
69
|
-
.stat-card .label {
|
|
70
|
-
font-size: 24px;
|
|
71
|
-
font-weight: 500;
|
|
72
|
-
color: #9ca3af;
|
|
73
|
-
margin-top: 16px;
|
|
74
|
-
text-transform: uppercase;
|
|
75
|
-
letter-spacing: 0.1em;
|
|
76
|
-
}
|
|
77
|
-
|
|
78
|
-
/* Scene 3 — Outro */
|
|
79
|
-
.scene-3 .outro-wrap {
|
|
80
|
-
position: relative;
|
|
81
|
-
display: inline-block;
|
|
82
|
-
opacity: 0;
|
|
83
|
-
}
|
|
84
|
-
.scene-3 .outro-text {
|
|
85
|
-
font-size: 80px;
|
|
86
|
-
font-weight: 600;
|
|
87
|
-
}
|
|
88
|
-
.scene-3 .outro-underline {
|
|
89
|
-
position: absolute;
|
|
90
|
-
left: 0;
|
|
91
|
-
bottom: -8px;
|
|
92
|
-
width: 100%;
|
|
93
|
-
height: 6px;
|
|
94
|
-
background: #fbbf24;
|
|
95
|
-
border-radius: 3px;
|
|
96
|
-
transform: scaleX(0);
|
|
97
|
-
transform-origin: left center;
|
|
98
|
-
}
|
|
99
19
|
</style>
|
|
100
20
|
</head>
|
|
101
21
|
<body>
|
|
@@ -111,158 +31,39 @@
|
|
|
111
31
|
data-subtitle="by HeyGen"
|
|
112
32
|
data-outro="thanks for watching"
|
|
113
33
|
>
|
|
114
|
-
<!-- Scene 1: Title -->
|
|
115
34
|
<div
|
|
116
35
|
id="scene-1"
|
|
117
|
-
class="
|
|
36
|
+
class="clip"
|
|
37
|
+
data-composition-id="scene-1"
|
|
38
|
+
data-composition-src="compositions/scene-1.html"
|
|
118
39
|
data-start="0"
|
|
119
40
|
data-duration="3"
|
|
120
41
|
data-track-index="0"
|
|
121
|
-
>
|
|
122
|
-
<div class="title">STARGAZED</div>
|
|
123
|
-
<div class="subtitle">by HeyGen</div>
|
|
124
|
-
</div>
|
|
42
|
+
></div>
|
|
125
43
|
|
|
126
|
-
<!-- Scene 2: Stats — three StatCards as repeated markup with per-instance data attrs -->
|
|
127
44
|
<div
|
|
128
45
|
id="scene-2"
|
|
129
|
-
class="
|
|
46
|
+
class="clip"
|
|
47
|
+
data-composition-id="scene-2"
|
|
48
|
+
data-composition-src="compositions/scene-2.html"
|
|
130
49
|
data-start="3"
|
|
131
50
|
data-duration="4"
|
|
132
51
|
data-track-index="0"
|
|
133
|
-
>
|
|
134
|
-
<div
|
|
135
|
-
class="stat-card"
|
|
136
|
-
data-stat-index="0"
|
|
137
|
-
data-stat-value="1247"
|
|
138
|
-
style="--card-color: #fbbf24"
|
|
139
|
-
>
|
|
140
|
-
<div class="number">0</div>
|
|
141
|
-
<div class="label">Stars</div>
|
|
142
|
-
</div>
|
|
143
|
-
<div
|
|
144
|
-
class="stat-card"
|
|
145
|
-
data-stat-index="1"
|
|
146
|
-
data-stat-value="312"
|
|
147
|
-
style="--card-color: #60a5fa"
|
|
148
|
-
>
|
|
149
|
-
<div class="number">0</div>
|
|
150
|
-
<div class="label">Forks</div>
|
|
151
|
-
</div>
|
|
152
|
-
<div
|
|
153
|
-
class="stat-card"
|
|
154
|
-
data-stat-index="2"
|
|
155
|
-
data-stat-value="48"
|
|
156
|
-
style="--card-color: #f87171"
|
|
157
|
-
>
|
|
158
|
-
<div class="number">0</div>
|
|
159
|
-
<div class="label">Issues</div>
|
|
160
|
-
</div>
|
|
161
|
-
</div>
|
|
52
|
+
></div>
|
|
162
53
|
|
|
163
|
-
<!-- Scene 3: Outro -->
|
|
164
54
|
<div
|
|
165
55
|
id="scene-3"
|
|
166
|
-
class="
|
|
56
|
+
class="clip"
|
|
57
|
+
data-composition-id="scene-3"
|
|
58
|
+
data-composition-src="compositions/scene-3.html"
|
|
167
59
|
data-start="7"
|
|
168
60
|
data-duration="3"
|
|
169
61
|
data-track-index="0"
|
|
170
|
-
>
|
|
171
|
-
<div class="outro-wrap">
|
|
172
|
-
<div class="outro-text">thanks for watching</div>
|
|
173
|
-
<div class="outro-underline"></div>
|
|
174
|
-
</div>
|
|
175
|
-
</div>
|
|
62
|
+
></div>
|
|
176
63
|
|
|
177
64
|
<script>
|
|
178
|
-
// ────────────────────────────────────────────────────────────────────
|
|
179
|
-
// Translation of Stargazed.tsx
|
|
180
|
-
//
|
|
181
|
-
// Remotion structure:
|
|
182
|
-
// <Composition schema={zod} defaultProps={...} fps=30 dur=300>
|
|
183
|
-
// <Sequence 0..90> <TitleScene title subtitle />
|
|
184
|
-
// <Sequence 90..210> <StatsScene stats />
|
|
185
|
-
// <Sequence 210..300><OutroScene text />
|
|
186
|
-
//
|
|
187
|
-
// HF structure:
|
|
188
|
-
// - root #stage carries data-* with the same props (title, subtitle, outro)
|
|
189
|
-
// - 3 scene divs with data-start/data-duration in seconds (frames/fps)
|
|
190
|
-
// - Custom React subcomponents inline as repeated HTML; their per-instance
|
|
191
|
-
// props become data-* attributes on the markup
|
|
192
|
-
// - Animation lives in a single paused GSAP timeline keyed by composition seconds
|
|
193
|
-
//
|
|
194
|
-
// Frame → time:
|
|
195
|
-
// Sequence(0,90) → 0s..3s (title)
|
|
196
|
-
// Sequence(90,210) → 3s..7s (stats; 4s window)
|
|
197
|
-
// Sequence(210,300) → 7s..10s (outro)
|
|
198
|
-
// Stagger(i*12) → i*0.4s (12 frames at 30fps)
|
|
199
|
-
// ────────────────────────────────────────────────────────────────────
|
|
200
|
-
|
|
201
|
-
const tl = gsap.timeline({ paused: true });
|
|
202
|
-
|
|
203
|
-
// ─── Scene 1: Title ─────────────────────────────────────────────────
|
|
204
|
-
const scene1 = document.querySelector("#scene-1");
|
|
205
|
-
const title = scene1.querySelector(".title");
|
|
206
|
-
const subtitle = scene1.querySelector(".subtitle");
|
|
207
|
-
|
|
208
|
-
tl.set(scene1, { opacity: 1 }, 0);
|
|
209
|
-
// spring({damping:12, stiffness:100, mass:1}) → back.out(1.4) ~0.7s
|
|
210
|
-
tl.to(title, { scale: 1, duration: 0.7, ease: "back.out(1.4)" }, 0);
|
|
211
|
-
// interpolate(frame, [20,40], [0,1]) at fps=30 → 0.667s..1.333s linear
|
|
212
|
-
tl.fromTo(subtitle, { opacity: 0 }, { opacity: 1, duration: 0.667, ease: "none" }, 0.667);
|
|
213
|
-
tl.set(scene1, { opacity: 0 }, 3);
|
|
214
|
-
|
|
215
|
-
// ─── Scene 2: Stats ─────────────────────────────────────────────────
|
|
216
|
-
const scene2 = document.querySelector("#scene-2");
|
|
217
|
-
const cards = scene2.querySelectorAll(".stat-card");
|
|
218
|
-
|
|
219
|
-
tl.set(scene2, { opacity: 1 }, 3);
|
|
220
|
-
|
|
221
|
-
cards.forEach((card, i) => {
|
|
222
|
-
const stagger = i * 0.4; // i * 12 frames at 30 fps
|
|
223
|
-
const start = 3 + stagger;
|
|
224
|
-
const value = Number(card.dataset.statValue);
|
|
225
|
-
const numberEl = card.querySelector(".number");
|
|
226
|
-
|
|
227
|
-
// StatCard entrance:
|
|
228
|
-
// spring({damping:14, stiffness:90, mass:1}) → back.out(1.2) ~0.7s
|
|
229
|
-
// interpolate(local, [0,12], [0,1]) → 0s..0.4s linear opacity
|
|
230
|
-
tl.to(card, { scale: 1, duration: 0.7, ease: "back.out(1.2)" }, start);
|
|
231
|
-
tl.to(card, { opacity: 1, duration: 0.4, ease: "none" }, start);
|
|
232
|
-
|
|
233
|
-
// AnimatedNumber: count from 0 → value with easeOutCubic over 45 frames (1.5s).
|
|
234
|
-
// GSAP equivalent: a tween on a counter object with onUpdate rewriting textContent.
|
|
235
|
-
// power3.out is GSAP's name for cubic easeOut.
|
|
236
|
-
const counter = { v: 0 };
|
|
237
|
-
tl.to(
|
|
238
|
-
counter,
|
|
239
|
-
{
|
|
240
|
-
v: value,
|
|
241
|
-
duration: 1.5,
|
|
242
|
-
ease: "power3.out",
|
|
243
|
-
onUpdate: () => {
|
|
244
|
-
numberEl.textContent = Math.round(counter.v).toLocaleString();
|
|
245
|
-
},
|
|
246
|
-
},
|
|
247
|
-
start,
|
|
248
|
-
);
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
tl.set(scene2, { opacity: 0 }, 7);
|
|
252
|
-
|
|
253
|
-
// ─── Scene 3: Outro ─────────────────────────────────────────────────
|
|
254
|
-
const scene3 = document.querySelector("#scene-3");
|
|
255
|
-
const outroWrap = scene3.querySelector(".outro-wrap");
|
|
256
|
-
const underline = scene3.querySelector(".outro-underline");
|
|
257
|
-
|
|
258
|
-
tl.set(scene3, { opacity: 1 }, 7);
|
|
259
|
-
// interpolate(frame, [0,12], [0,1]) → 0s..0.4s linear opacity
|
|
260
|
-
tl.to(outroWrap, { opacity: 1, duration: 0.4, ease: "none" }, 7);
|
|
261
|
-
// interpolate(frame, [10,40], [0,1]) for underline → starts at 7+0.333s, dur 1s
|
|
262
|
-
tl.to(underline, { scaleX: 1, duration: 1.0, ease: "none" }, 7.333);
|
|
263
|
-
|
|
264
65
|
window.__timelines = window.__timelines || {};
|
|
265
|
-
window.__timelines["tier-3-data-driven"] =
|
|
66
|
+
window.__timelines["tier-3-data-driven"] = gsap.timeline({ paused: true });
|
|
266
67
|
</script>
|
|
267
68
|
</div>
|
|
268
69
|
</body>
|
|
@@ -27,12 +27,12 @@ details (timing, transitions, etc.).
|
|
|
27
27
|
|
|
28
28
|
See [sequencing.md](sequencing.md) for nesting and stagger details.
|
|
29
29
|
|
|
30
|
-
| Remotion | HyperFrames
|
|
31
|
-
| ------------------------------------------ |
|
|
32
|
-
| `<Sequence from={F} durationInFrames={D}>` | `<div data-start="<F/fps>" data-duration="<D/fps>" data-track-index="N">`
|
|
33
|
-
| `<Series>` + `<Series.Sequence>` |
|
|
34
|
-
| `<Loop durationInFrames={D}>` | not a primitive — emit a bounded GSAP repeat from the available duration
|
|
35
|
-
| `<Freeze frame={F}>` | drop the wrapper; HF doesn't have running animation outside the seek-driven timeline so freeze is a no-op
|
|
30
|
+
| Remotion | HyperFrames |
|
|
31
|
+
| ------------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
|
32
|
+
| `<Sequence from={F} durationInFrames={D}>` | a host `<div data-composition-src="compositions/<name>.html" data-start="<F/fps>" data-duration="<D/fps>" data-track-index="N">` in the root, its content in that sub-composition file (see [sequencing.md](sequencing.md)) |
|
|
33
|
+
| `<Series>` + `<Series.Sequence>` | sibling scene hosts with sequential `data-start` values |
|
|
34
|
+
| `<Loop durationInFrames={D}>` | not a primitive — emit a bounded GSAP repeat from the available duration |
|
|
35
|
+
| `<Freeze frame={F}>` | drop the wrapper; HF doesn't have running animation outside the seek-driven timeline so freeze is a no-op |
|
|
36
36
|
|
|
37
37
|
## Timing
|
|
38
38
|
|
|
@@ -53,16 +53,16 @@ See [timing.md](timing.md) — this is the highest-leverage section.
|
|
|
53
53
|
|
|
54
54
|
See [media.md](media.md) for trim, volume ramps, and decoder notes.
|
|
55
55
|
|
|
56
|
-
| Remotion | HyperFrames
|
|
57
|
-
| -------------------------------------- |
|
|
58
|
-
| `<Audio src volume>` | `<audio data-start data-duration data-track-index data-volume src>`
|
|
59
|
-
| `<Audio playbackRate startFrom endAt>` | `data-playback-rate`, `data-trim-start`, `data-trim-end`
|
|
60
|
-
| `<Video src>` | `<video muted playsinline data-start data-duration data-track-index src>`
|
|
61
|
-
| `<OffthreadVideo>` | `<video>` — HF doesn't need the off-thread variant (uses headless Chrome)
|
|
62
|
-
| `<Img src>` | `<img>`
|
|
63
|
-
| `<IFrame src>` | `<iframe>` — HF auto-falls back to screenshot mode for nested iframes
|
|
64
|
-
| `staticFile("x.png")` | `"assets/x.png"` — copy the file into `hf-src/assets/` next to `index.html` |
|
|
65
|
-
| `delayRender()` / `continueRender()` | drop — HF waits on asset readiness via the Frame Adapter pattern
|
|
56
|
+
| Remotion | HyperFrames |
|
|
57
|
+
| -------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------ |
|
|
58
|
+
| `<Audio src volume>` | `<audio data-start data-duration data-track-index data-volume src>` |
|
|
59
|
+
| `<Audio playbackRate startFrom endAt>` | `data-playback-rate`, `data-trim-start`, `data-trim-end` |
|
|
60
|
+
| `<Video src>` | `<video muted playsinline data-start data-duration data-track-index src>` |
|
|
61
|
+
| `<OffthreadVideo>` | `<video>` — HF doesn't need the off-thread variant (uses headless Chrome) |
|
|
62
|
+
| `<Img src>` | `<img>` |
|
|
63
|
+
| `<IFrame src>` | `<iframe>` — HF auto-falls back to screenshot mode for nested iframes |
|
|
64
|
+
| `staticFile("x.png")` | `"assets/x.png"` in the root, `"../assets/x.png"` inside a `compositions/` scene file — copy the file into `hf-src/assets/` next to `index.html` |
|
|
65
|
+
| `delayRender()` / `continueRender()` | drop — HF waits on asset readiness via the Frame Adapter pattern |
|
|
66
66
|
|
|
67
67
|
## Transitions
|
|
68
68
|
|
|
@@ -31,9 +31,10 @@ Remotion accepts a function for `volume`:
|
|
|
31
31
|
<Audio src={...} volume={(f) => interpolate(f, [0, 30], [0, 1])} />
|
|
32
32
|
```
|
|
33
33
|
|
|
34
|
-
HF
|
|
35
|
-
|
|
36
|
-
|
|
34
|
+
HF ramps volume with a `data-automation` volume lane on the `<audio>`
|
|
35
|
+
(form in `hyperframes-core/references/creator-editing-recipes.md`).
|
|
36
|
+
Translation: write the lane from the `interpolate` points, OR bake the ramp
|
|
37
|
+
into the audio file with `ffmpeg afade`. The dropped-ramp path produces audibly different
|
|
37
38
|
output but visually-identical video, so SSIM passes — just flag it.
|
|
38
39
|
|
|
39
40
|
### `<Loop>` with stateful children
|
|
@@ -120,10 +121,9 @@ a `TRANSLATION_NOTES.md` next to the output:
|
|
|
120
121
|
|
|
121
122
|
The following Remotion patterns were translated with caveats:
|
|
122
123
|
|
|
123
|
-
- `<Audio volume={(f) => ...}>` (line 15): volume ramp
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
swap the source file.
|
|
124
|
+
- `<Audio volume={(f) => ...}>` (line 15): volume ramp written as a
|
|
125
|
+
`data-automation` volume lane (see `creator-editing-recipes.md`); the
|
|
126
|
+
ffmpeg `afade` bake-in is the alternative.
|
|
127
127
|
- `<HeavyChart>` (line 30): translated as inline HTML. The original
|
|
128
128
|
React.lazy boundary was dropped — bundle size unchanged because HF
|
|
129
129
|
serves a single HTML file.
|
|
@@ -104,13 +104,11 @@ for the full supported feature list.
|
|
|
104
104
|
|
|
105
105
|
## Loop behavior
|
|
106
106
|
|
|
107
|
-
Remotion's `loop={true}` plays the animation continuously. Translate
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
asset or author an explicit timeline around the Lottie layer and verify
|
|
113
|
-
the rendered output.
|
|
107
|
+
Remotion's `loop={true}` plays the animation continuously. Translate it
|
|
108
|
+
to `loop: true` on the player: the HF adapter wraps composition time into
|
|
109
|
+
the animation's own length, so the cycle repeats for the whole scene. It
|
|
110
|
+
does not add playback-rate scaling; bake a non-default rate into the
|
|
111
|
+
Lottie asset and verify the rendered output.
|
|
114
112
|
|
|
115
113
|
## Performance note
|
|
116
114
|
|
|
@@ -44,9 +44,9 @@ didn't specify trim.
|
|
|
44
44
|
<Audio src={staticFile("music.wav")} volume={(f) => interpolate(f, [0, 30], [0, 1])} />
|
|
45
45
|
```
|
|
46
46
|
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
47
|
+
Volume ramps become a `data-automation` volume lane on the `<audio>`
|
|
48
|
+
(form in `hyperframes-core/references/creator-editing-recipes.md`); `data-volume`
|
|
49
|
+
is the static baseline.
|
|
50
50
|
|
|
51
51
|
### Trim / playbackRate
|
|
52
52
|
|
|
@@ -37,6 +37,11 @@ The `data-title` attribute carries the value through. Code that originally
|
|
|
37
37
|
read `props.title` reads `document.getElementById("stage").dataset.title`
|
|
38
38
|
in HF.
|
|
39
39
|
|
|
40
|
+
Inside a scene sub-composition file that lookup does not reach the root
|
|
41
|
+
`#stage`. Pass a prop to a scene with `data-variable-values` on its host and
|
|
42
|
+
read it there with `window.__hyperframes.getVariables()` (declare defaults with
|
|
43
|
+
`data-composition-variables` on the scene's composition element).
|
|
44
|
+
|
|
40
45
|
## Async calculateMetadata (NOT translatable)
|
|
41
46
|
|
|
42
47
|
```tsx
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Sequencing translation: Sequence, Series, Composition root
|
|
2
2
|
|
|
3
|
-
How Remotion's nested `Sequence` tree maps to
|
|
4
|
-
|
|
3
|
+
How Remotion's nested `Sequence` tree maps to one sub-composition host per
|
|
4
|
+
scene in the root, each with its own paused GSAP timeline in local time.
|
|
5
5
|
|
|
6
6
|
## The core idea
|
|
7
7
|
|
|
@@ -11,8 +11,9 @@ component to the window `[F, F+D]`. HF doesn't have a per-element
|
|
|
11
11
|
"current frame" — there's a single composition seek time and the
|
|
12
12
|
runtime hides/shows elements based on their `data-start` / `data-duration`.
|
|
13
13
|
|
|
14
|
-
Result: the nested tree flattens into a list of
|
|
15
|
-
parent, each with
|
|
14
|
+
Result: the nested tree flattens into a list of scene hosts on the same
|
|
15
|
+
parent, each with its own time window; each scene's content lives in its
|
|
16
|
+
own sub-composition file.
|
|
16
17
|
|
|
17
18
|
## `<Composition>` → root `#stage`
|
|
18
19
|
|
|
@@ -57,7 +58,7 @@ playback; missing it triggers a lint warning).
|
|
|
57
58
|
`AbsoluteFill` is just a styled div in Remotion. Translate to a div with
|
|
58
59
|
`position:absolute; inset:0` and copy through any other style props.
|
|
59
60
|
|
|
60
|
-
## `<Sequence>` →
|
|
61
|
+
## `<Sequence>` → sub-composition host
|
|
61
62
|
|
|
62
63
|
```tsx
|
|
63
64
|
<Sequence from={0} durationInFrames={90}>
|
|
@@ -65,15 +66,42 @@ playback; missing it triggers a lint warning).
|
|
|
65
66
|
</Sequence>
|
|
66
67
|
```
|
|
67
68
|
|
|
69
|
+
The root `#stage` only holds a host per scene; the scene's markup, styles
|
|
70
|
+
and timeline live in their own sub-composition file, so the Studio timeline
|
|
71
|
+
gets one readable row per scene and the lint has no nested structure to flag.
|
|
72
|
+
|
|
68
73
|
```html
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
74
|
+
<!-- index.html -->
|
|
75
|
+
<div
|
|
76
|
+
id="scene-1"
|
|
77
|
+
class="clip"
|
|
78
|
+
data-composition-id="scene-1"
|
|
79
|
+
data-composition-src="compositions/scene-1.html"
|
|
80
|
+
data-start="0"
|
|
81
|
+
data-duration="3"
|
|
82
|
+
data-track-index="0"
|
|
83
|
+
></div>
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
```html
|
|
87
|
+
<!-- compositions/scene-1.html: TitleCard children inlined, timeline keyed "scene-1", local time starts at 0 -->
|
|
88
|
+
<template id="scene-1-template">
|
|
89
|
+
<div data-composition-id="scene-1" data-width="1280" data-height="720" data-duration="3">
|
|
90
|
+
<!-- TitleCard children -->
|
|
91
|
+
<script>
|
|
92
|
+
const tl = gsap.timeline({ paused: true });
|
|
93
|
+
window.__timelines["scene-1"] = tl;
|
|
94
|
+
</script>
|
|
95
|
+
</div>
|
|
96
|
+
</template>
|
|
72
97
|
```
|
|
73
98
|
|
|
74
99
|
Convert frames to seconds: `from/fps`, `durationInFrames/fps`. Pick a
|
|
75
100
|
`data-track-index` per parallel rendering layer (background = 0,
|
|
76
101
|
overlays = 1, audio = 2, etc.). Sequential scenes can share an index.
|
|
102
|
+
Inside the sub-composition, time is local: a tween that started at `F/fps`
|
|
103
|
+
in the root starts at `0` here. Asset paths are relative to the
|
|
104
|
+
sub-composition file (`../assets/x.png`).
|
|
77
105
|
|
|
78
106
|
## Nested `<Sequence>` flattens
|
|
79
107
|
|
|
@@ -89,13 +117,17 @@ Remotion adds offsets when sequences nest:
|
|
|
89
117
|
|
|
90
118
|
The inner sequence's effective window is `[60+30, 60+30+60] = [90, 150]`.
|
|
91
119
|
|
|
92
|
-
Translate by computing the sum and emitting one
|
|
93
|
-
window:
|
|
120
|
+
Translate by computing the sum and emitting one host with the resolved
|
|
121
|
+
window; the scene's children go in its sub-composition file:
|
|
94
122
|
|
|
95
123
|
```html
|
|
96
|
-
<div
|
|
97
|
-
|
|
98
|
-
|
|
124
|
+
<div
|
|
125
|
+
data-composition-id="image-scene"
|
|
126
|
+
data-composition-src="compositions/image-scene.html"
|
|
127
|
+
data-start="3"
|
|
128
|
+
data-duration="2"
|
|
129
|
+
data-track-index="0"
|
|
130
|
+
></div>
|
|
99
131
|
```
|
|
100
132
|
|
|
101
133
|
## `<Series>` → siblings with sequential offsets
|
|
@@ -115,19 +147,40 @@ window:
|
|
|
115
147
|
```
|
|
116
148
|
|
|
117
149
|
Each `Sequence.Sequence` lives in the next time slot. Emit siblings
|
|
118
|
-
with `data-start` accumulating:
|
|
150
|
+
with `data-start` accumulating (each host mounts its scene file):
|
|
119
151
|
|
|
120
152
|
```html
|
|
121
|
-
<div
|
|
122
|
-
|
|
123
|
-
|
|
153
|
+
<div
|
|
154
|
+
data-composition-id="a"
|
|
155
|
+
data-composition-src="compositions/a.html"
|
|
156
|
+
data-start="0"
|
|
157
|
+
data-duration="2"
|
|
158
|
+
data-track-index="0"
|
|
159
|
+
></div>
|
|
160
|
+
<div
|
|
161
|
+
data-composition-id="b"
|
|
162
|
+
data-composition-src="compositions/b.html"
|
|
163
|
+
data-start="2"
|
|
164
|
+
data-duration="4"
|
|
165
|
+
data-track-index="0"
|
|
166
|
+
></div>
|
|
167
|
+
<div
|
|
168
|
+
data-composition-id="c"
|
|
169
|
+
data-composition-src="compositions/c.html"
|
|
170
|
+
data-start="6"
|
|
171
|
+
data-duration="3"
|
|
172
|
+
data-track-index="0"
|
|
173
|
+
></div>
|
|
124
174
|
```
|
|
125
175
|
|
|
126
176
|
## Crossfading scene boundaries
|
|
127
177
|
|
|
128
178
|
Remotion `<Sequence>` shows/hides at hard boundaries by default. HF does
|
|
129
179
|
the same — but if your composition needs a smooth fade between scenes,
|
|
130
|
-
you have to drive opacity explicitly with GSAP at the boundary
|
|
180
|
+
you have to drive opacity explicitly with GSAP at the boundary. A scene can
|
|
181
|
+
hard-cut itself with `gsap.set` at its local end (the corpus fixtures do). A
|
|
182
|
+
fade between two scenes goes on the scene hosts from the root timeline, since
|
|
183
|
+
a scene's own timeline only sees its own file:
|
|
131
184
|
|
|
132
185
|
```js
|
|
133
186
|
const tl = gsap.timeline({ paused: true });
|
|
@@ -9,6 +9,8 @@ description: >
|
|
|
9
9
|
Unclear → /hyperframes.
|
|
10
10
|
---
|
|
11
11
|
|
|
12
|
+
**Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below.
|
|
13
|
+
|
|
12
14
|
> **First, keep this skill fresh — confirm with the user before running:** `npx hyperframes skills update slideshow`. A fast no-op when everything is current; otherwise it refreshes this skill plus the core domain skills it depends on before you rely on them.
|
|
13
15
|
|
|
14
16
|
> **figma source**: If the deck's content or storyboard comes from a figma.com URL, run `/figma` first — asset export, brand tokens, and storyboard reconstruction if the source is a strip of scene frames — then build from its output. Don't drive Figma via raw MCP tools directly: that skips SVG sanitization, `.media/manifest.jsonl` provenance, and brand-token `var()` binding, so a later brand change can't propagate without a full re-import.
|
|
@@ -37,7 +39,7 @@ Then ask a short confirmation question:
|
|
|
37
39
|
|
|
38
40
|
Use a yes/no choice UI when the environment provides one; otherwise ask the question in plain text.
|
|
39
41
|
|
|
40
|
-
Do not implement the slideshow until the user says yes. If they say no, stop using this skill — read `/hyperframes` and let the intent layer re-route. This confirmation is a **routing decision**, not a preference gate — per `../hyperframes
|
|
42
|
+
Do not implement the slideshow until the user says yes. If they say no, stop using this skill — read `/hyperframes` and let the intent layer re-route. This confirmation is a **routing decision**, not a preference gate — per `../hyperframes/references/brief-contract.md` § 1 it survives autonomous mode ("surprise me" does not skip it): building the wrong deliverable type is a quality failure, not a creative call.
|
|
41
43
|
|
|
42
44
|
---
|
|
43
45
|
|
|
@@ -164,6 +166,7 @@ These are hard constraints, not suggestions. A slide that violates them will be
|
|
|
164
166
|
- **Lead with the punchline.** The strongest point goes first — on the slide and in the deck order. Investors read left-to-right, top-to-bottom, and they stop.
|
|
165
167
|
- **Bottom-up market sizing only.** Never write "$50B TAM" without showing the math. Build from unit economics up: accounts × ACV, or transactions × take-rate.
|
|
166
168
|
- **Font minimum 30pt equivalent.** At 1920×1080, a headline is 72–96px; body copy is 48px. Never go below 40px for any text the audience must read.
|
|
169
|
+
- **Search the live catalog before hand-building any named visual.** For every look, effect, chart, treatment or transition a slide needs — "CRT scanlines", "glitch", "bar chart race", "shimmer sweep", "terminal window" — run `npx hyperframes catalog --query "<the visual, in plain English>" --json` and read the top results before you author the slide's clips. The search needs **nothing installed**: no project, no prior `add`, no account. It ranks the whole hosted registry (~400 blocks and components) from any directory. `npx hyperframes add <name>` drops the block's source into the deck, where you customize it in place. This applies with extra force when porting a source page: a real block beats the simplified approximation the porting rules below forbid.
|
|
167
170
|
|
|
168
171
|
## Porting source pages
|
|
169
172
|
|
|
@@ -14,9 +14,6 @@ Do not treat these as the blessed authoring model. When the engine-hosted path s
|
|
|
14
14
|
|
|
15
15
|
**Living reference implementations:**
|
|
16
16
|
|
|
17
|
-
- `registry/examples/airbnb-deck/index.html` + `demo.html` — full pattern set (Three.js, fragments, SFX, branch slide)
|
|
18
|
-
- `registry/examples/startup-pitch/index.html` — minimal version (no 3D), good starting point
|
|
19
|
-
|
|
20
17
|
---
|
|
21
18
|
|
|
22
19
|
## 2. The parent wrapper (`index.html` for deliverables, `demo.html` in examples)
|
|
@@ -3,6 +3,8 @@ name: talking-head-recut
|
|
|
3
3
|
description: Package an existing talking-head / interview / podcast video with timed, designed GRAPHIC OVERLAY cards — kinetic titles, lower-thirds, data callouts, quotes, side panels, picture-in-picture — synced to the transcript, on a 16:9 / 9:16 / 4:5 canvas of your choice; the clip plays untouched underneath. Trigger on "graphic overlays", "on-screen graphics", "package / dress up my video". Not plain subtitles (/embedded-captions). Unclear → /hyperframes.
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
+
**Plugin installs:** Before setup or freshness commands, follow [plugin execution rules](../hyperframes/references/plugin-installation.md) when this skill is inside a HyperFrames plugin. Standalone installs keep the update instructions below.
|
|
7
|
+
|
|
6
8
|
> **First, keep this skill fresh — confirm with the user before running:** `npx hyperframes skills update talking-head-recut`. A fast no-op when everything is current; otherwise it refreshes this skill plus the core domain skills it depends on before you rely on them.
|
|
7
9
|
|
|
8
10
|
# Talking Head Recut
|
|
@@ -298,7 +300,7 @@ Rules that apply to every channel:
|
|
|
298
300
|
- If the user has already pre-approved defaults ("just use defaults",
|
|
299
301
|
"no need to ask", "auto-pick everything"), asked you not to ask, or the
|
|
300
302
|
run carries an ongoing autonomous signal ("surprise me" / "decide for me" —
|
|
301
|
-
`../hyperframes
|
|
303
|
+
`../hyperframes/references/brief-contract.md` § 1) — **skip
|
|
302
304
|
the question entirely** and use: `recommendedRatio`, `layout="stack"`
|
|
303
305
|
(safest cross-ratio default), `style` chosen from transcript tone in
|
|
304
306
|
the most neutral group (editorial/data), `autoCount`. Tell the user
|
|
@@ -755,6 +757,13 @@ table column that matches the storyboard's `layout` field.
|
|
|
755
757
|
|
|
756
758
|
#### Available `data-anim` Kinds
|
|
757
759
|
|
|
760
|
+
This list is closed, and deliberately so: a card is an HTML fragment whose motion this
|
|
761
|
+
skill compiles into the shared overlay timeline in Step 9 (see the GSAP mapping table
|
|
762
|
+
there). That is why this workflow does not search the HyperFrames component registry the
|
|
763
|
+
way the composition workflows do — `npx hyperframes catalog` returns standalone
|
|
764
|
+
compositions that carry their own timeline, and a card has no place to mount one. Reach a
|
|
765
|
+
look the kinds below cannot express with plain CSS inside the card's scoped `<style>`.
|
|
766
|
+
|
|
758
767
|
| kind | use for | key params |
|
|
759
768
|
| --------------- | ------------------- | ----------------------------------------------------------------------------------------------- |
|
|
760
769
|
| `fade-in` | enter | `at`, `duration`, `ease?` |
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# The review loop — plan, sketch, build
|
|
2
|
-
|
|
3
|
-
How a `storyboard: yes` run earns fidelity one pass at a time: the plan is reviewed as text on a live board, the layouts as wireframe sketches, and the finished piece as the assembled video. Collaborative mode waits at each checkpoint. Autonomous mode posts the same checkpoint summaries and continues, keeping exactly one question before render.
|
|
4
|
-
|
|
5
|
-
This is the shared process for any workflow that plans on a storyboard. The contracts it leans on live next door: interaction mode, gate types, and the comments channel in `brief-contract.md`; the `STORYBOARD.md` format, the `outline → built → animated` statuses, and the comments sidecar in `storyboard-format.md`. A workflow's SKILL.md says **when** its steps hit each pass and supplies its **sketch stand-ins** (what the plain blocks represent); how the loop runs is defined here, once. The stage mechanics between the passes — audio, frames, assembly, transitions, captions, verify — live in `production-loop.md`; this file owns only the user-facing pauses.
|
|
6
|
-
|
|
7
|
-
## § 1 — The plan, on a live board
|
|
8
|
-
|
|
9
|
-
Open the **storyboard board** before presenting the plan: run `npx hyperframes preview --background` from the project directory, confirm it is serving, and open `http://localhost:<port>/?view=storyboard#project/<project-name>`. This is an early planning surface, not the final composition preview; it may open before composition checks. The plan appears as frame cards and refreshes as work lands.
|
|
10
|
-
|
|
11
|
-
Present the plan as a proposal (shape: `hyperframes-creative/references/story-spine.md` § 3): open by echoing **"This video tells [audience] that [message]"**, then the frame table — one row per frame: frame · beat (type, duration) · on screen · why (its `narrativeRole`, traced to the message). Hand the board URL with it, noting feedback lands in both places — comment on the board or reply here, one revision loop — and that a board submit still needs one reply here (anything) to get picked up.
|
|
12
|
-
|
|
13
|
-
In the same message ask two things: **(a)** approve or request changes, and **(b)** **sketches first** (recommended — a quick wireframe look check right after this approval) or skip sketches and build in one go. Iterate until approved — feedback arrives in chat or as the comments file (`brief-contract.md` § 1, the comments channel): revise exactly the frames it names, clear the file, re-present.
|
|
14
|
-
|
|
15
|
-
This is a **checkpoint gate** (`brief-contract.md` § 1). A run that starts autonomous normally has `storyboard: no` and does not enter this loop. If mode switches to autonomous after a board exists, keep updating the board, post the same summary as a heads-up, and continue without waiting; the one kept question comes at § 4.
|
|
16
|
-
|
|
17
|
-
## § 2 — The sketch pass (collaborative, unless skipped)
|
|
18
|
-
|
|
19
|
-
The moment the plan is approved, wireframe every frame yourself — no sub-agents, no waiting on other steps (sketches don't use timings), straight from the approved frame table.
|
|
20
|
-
|
|
21
|
-
A sketch is a **wireframe with the real words, not a styled frame**: the frame's layout at its key moment — the actual headline / stat / label text placed where it will live, plain blocks for panels, charts, diagrams, and media (the workflow says what its blocks stand in for), `frame.md`'s background and ink plus one accent on the focal, nothing else. No decoration, no full brand treatment, **no motion** — all of that arrives with the build pass.
|
|
22
|
-
|
|
23
|
-
Keep each sketch a real composition file at `compositions/frames/NN-*.html` (template wrapper, `data-composition-id`, `#root` styling, one paused **empty** timeline registered at `window.__timelines["<frame_id>"]`) so the Studio poster renders — and the poster is the only picture this pass needs: **run no CLI here** — no `snapshot`, no `lint` / `check`, no rendering. A sketch is a few dozen lines of HTML; the whole board lands in minutes.
|
|
24
|
-
|
|
25
|
-
Mark each frame `built` as its sketch lands — the user's open board fills in blue by itself. When every frame is `built`, pause and ask one thing: does the board look right, or which frames change? This is a **checkpoint gate**; the user reviews in Studio (open since § 1 — restart and re-hand the same URL if the server died), and feedback arrives in chat or as the comments file — check the file first when the reply arrives: revise **only the sketches named**, re-present, and loop until the layout is confirmed. Only then does the workflow's visual design get written onto the confirmed layouts.
|
|
26
|
-
|
|
27
|
-
A confirmed board is also a valid place to **stop**. When the user asked for a storyboard rather than a finished video — a plan to pitch, review, or hand off — the sketched board is the deliverable: confirm it, hand the board URL, and go no further unless asked to build.
|
|
28
|
-
|
|
29
|
-
In autonomous mode, or when the user chose to skip sketches at § 1, skip this pass — frames go straight from `outline` to `animated` in the build.
|
|
30
|
-
|
|
31
|
-
## § 3 — Building on confirmed layouts
|
|
32
|
-
|
|
33
|
-
However the workflow builds — sub-agent workers per frame, or inline scene by scene — a confirmed sketch's **composition is settled**: placement, hierarchy, and copy were approved on the board, so building means dressing that layout (full design treatment, real assets, motion), never redrawing it. Workflows that dispatch workers put "this frame has a **confirmed sketch** on disk" in the worker's context and carry the keep-the-layout rule in their worker prompt; a landed frame must still read as the approved wireframe, fully dressed.
|
|
34
|
-
|
|
35
|
-
Mark each frame `animated` as it lands. The build gate carries the loop's condition: in collaborative mode, the sketch board was confirmed at § 2.
|
|
36
|
-
|
|
37
|
-
## § 4 — The final look
|
|
38
|
-
|
|
39
|
-
After the workflow's checks pass, use the **final composition preview**. In collaborative mode Studio may already be serving from § 1; hand the timeline URL and ask one thing: render now, or what changes? In autonomous mode this is the one question the mode keeps: ask “preview first, or render?” Open the final preview on yes; render on an explicit render answer. Render only on approval.
|
|
40
|
-
|
|
41
|
-
**After approval, offer the recipe — once.** An approved run is a proven bundle. At delivery, offer to freeze it: `media-use` → `scripts/recipe.mjs freeze --name <name>` (the workflow comes from BRIEF.md; pass `--workflow` only in a project without one) keeps the design spec, the storyboard skeleton (structure kept, content blanked), the brief skeleton, and the confirmed brief values, and the next run of this type starts from it (the intent layer checks for a matching recipe before its first question). When the freeze lands, teach the recall in the confirmation — "Saved as **<name>** (v<N>). Next time say _make another <name>_, or just _like last time_." — the name is something the system reminds the user of, never something they must remember. In autonomous mode don't ask — name the freeze command in the delivery note instead.
|