dsh-hyperframes 0.3.2 → 0.4.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.
Files changed (375) hide show
  1. package/README.en.md +4 -3
  2. package/README.md +5 -4
  3. package/lib/index.d.ts +1 -1
  4. package/lib/index.js +1 -0
  5. package/package.json +2 -2
  6. package/skills/embedded-captions/SKILL.md +28 -3
  7. package/skills/embedded-captions/references/aesthetic-principles.md +2 -3
  8. package/skills/embedded-captions/references/rail.md +1 -1
  9. package/skills/embedded-captions/scripts/check-occlusion.cjs +4 -1
  10. package/skills/embedded-captions/scripts/check-overflow.cjs +1 -0
  11. package/skills/embedded-captions/scripts/check-rail-climax.cjs +5 -1
  12. package/skills/embedded-captions/scripts/fixtures/heroless/theme.json +11 -0
  13. package/skills/embedded-captions/scripts/hf-cli.cjs +33 -0
  14. package/skills/embedded-captions/scripts/make-theme.cjs +95 -57
  15. package/skills/embedded-captions/scripts/make-theme.test.mjs +131 -0
  16. package/skills/embedded-captions/scripts/matte.cjs +1 -13
  17. package/skills/embedded-captions/scripts/measure-layout.cjs +2 -1
  18. package/skills/embedded-captions/scripts/preview-frames.cjs +39 -11
  19. package/skills/embedded-captions/scripts/preview-frames.test.mjs +24 -0
  20. package/skills/embedded-captions/scripts/render-and-composite.sh +8 -52
  21. package/skills/embedded-captions/scripts/safe-zones.cjs +4 -1
  22. package/skills/embedded-captions/scripts/transcribe.cjs +5 -14
  23. package/skills/embedded-captions/scripts/transcribe.test.mjs +41 -0
  24. package/skills/faceless-explainer/SKILL.md +20 -16
  25. package/skills/faceless-explainer/references/story-design.md +1 -1
  26. package/skills/faceless-explainer/scripts/assemble-index.mjs +6 -4
  27. package/skills/faceless-explainer/scripts/assemble-index.test.mjs +57 -2
  28. package/skills/faceless-explainer/scripts/audio.mjs +2 -0
  29. package/skills/faceless-explainer/scripts/build-frame.mjs +6 -3
  30. package/skills/faceless-explainer/scripts/captions.mjs +7 -4
  31. package/skills/faceless-explainer/scripts/frame-packets.mjs +4 -4
  32. package/skills/faceless-explainer/scripts/lib/bgm-volume.mjs +4 -0
  33. package/skills/faceless-explainer/scripts/lib/captured-fonts.mjs +58 -0
  34. package/skills/{hyperframes-core → faceless-explainer}/scripts/lib/frame-packets-core.mjs +5 -23
  35. package/skills/faceless-explainer/scripts/lib/storyboard.mjs +1 -1
  36. package/skills/faceless-explainer/scripts/lib/transitions.json +3 -3
  37. package/skills/faceless-explainer/scripts/transitions.mjs +1 -0
  38. package/skills/faceless-explainer/scripts/transitions.test.mjs +2 -0
  39. package/skills/faceless-explainer/sub-agents/frame-worker.md +1 -1
  40. package/skills/figma/SKILL.md +2 -0
  41. package/skills/general-video/SKILL.md +13 -11
  42. package/skills/general-video/scripts/frame-packets.mjs +4 -4
  43. package/skills/general-video/scripts/lib/frame-packets-core.mjs +194 -0
  44. package/skills/general-video/sub-agents/frame-worker.md +1 -1
  45. package/skills/hyperframes/SKILL.md +40 -30
  46. package/skills/{hyperframes-core → hyperframes}/references/brief-contract.md +15 -15
  47. package/skills/{hyperframes-core → hyperframes}/references/brief-format.md +8 -8
  48. package/skills/hyperframes/references/capability-menu.md +2 -2
  49. package/skills/{hyperframes-core → hyperframes}/references/frame-worker-core.md +1 -1
  50. package/skills/hyperframes/references/intent-interview.md +16 -16
  51. package/skills/hyperframes/references/plugin-installation.md +43 -0
  52. package/skills/{hyperframes-core → hyperframes}/references/production-loop.md +11 -11
  53. package/skills/hyperframes/references/review-loop.md +37 -0
  54. package/skills/hyperframes/references/route-briefs.md +1 -1
  55. package/skills/hyperframes/references/routes/motion-graphics.md +1 -1
  56. package/skills/{hyperframes-core → hyperframes}/references/script-format.md +3 -3
  57. package/skills/hyperframes/references/skill-lifecycle.md +2 -0
  58. package/skills/{hyperframes-core → hyperframes}/references/storyboard-format.md +3 -34
  59. package/skills/hyperframes/scripts/lib/frame-packets-core.mjs +194 -0
  60. package/skills/hyperframes/scripts/plugin-cli.mjs +88 -0
  61. package/skills/hyperframes/scripts/plugin-cli.test.mjs +117 -0
  62. package/skills/hyperframes-animation/SKILL.md +5 -1
  63. package/skills/hyperframes-animation/adapters/gsap.md +1 -1
  64. package/skills/hyperframes-animation/adapters/lottie.md +15 -2
  65. package/skills/hyperframes-animation/adapters/three.md +14 -0
  66. package/skills/hyperframes-animation/blueprints/titlecard-reveal.md +1 -1
  67. package/skills/hyperframes-animation/references/motion-blur.md +133 -0
  68. package/skills/hyperframes-animation/rules/cursor-click-ripple.md +1 -1
  69. package/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +1 -1
  70. package/skills/hyperframes-animation/rules/hacker-flip-3d.md +1 -1
  71. package/skills/hyperframes-animation/rules/kinetic-beat-slam.md +2 -2
  72. package/skills/hyperframes-animation/rules/motion-blur-streak.md +1 -1
  73. package/skills/hyperframes-animation/rules/vertical-spring-ticker.md +1 -1
  74. package/skills/hyperframes-animation/scripts/package-loader.mjs +47 -16
  75. package/skills/hyperframes-animation/scripts/package-loader.test.mjs +52 -0
  76. package/skills/hyperframes-animation/techniques.md +1 -1
  77. package/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +3 -3
  78. package/skills/hyperframes-animation/transitions/css-push.md +4 -4
  79. package/skills/hyperframes-audio/SKILL.md +30 -22
  80. package/skills/hyperframes-audio/scripts/carve.mjs +6 -3
  81. package/skills/hyperframes-audio/scripts/carve.test.mjs +16 -1
  82. package/skills/hyperframes-cli/SKILL.md +44 -35
  83. package/skills/hyperframes-cli/references/init-and-scaffold.md +8 -6
  84. package/skills/hyperframes-cli/references/lint-validate-inspect.md +3 -3
  85. package/skills/hyperframes-cli/references/preview-render.md +35 -32
  86. package/skills/hyperframes-cli/references/upgrade-info-misc.md +50 -1
  87. package/skills/hyperframes-core/SKILL.md +30 -24
  88. package/skills/hyperframes-core/references/composition-patterns.md +3 -42
  89. package/skills/hyperframes-core/references/creator-editing-recipes.md +131 -7
  90. package/skills/hyperframes-core/references/data-attributes.md +11 -11
  91. package/skills/hyperframes-core/references/determinism-rules.md +2 -19
  92. package/skills/hyperframes-core/references/full-screen-motion.md +0 -9
  93. package/skills/hyperframes-core/references/minimal-composition.md +2 -2
  94. package/skills/hyperframes-core/references/sub-compositions.md +3 -66
  95. package/skills/hyperframes-core/references/tailwind.md +1 -20
  96. package/skills/hyperframes-core/references/tracks-and-clips.md +2 -6
  97. package/skills/hyperframes-core/references/variables-and-media.md +3 -3
  98. package/skills/hyperframes-creative/SKILL.md +2 -0
  99. package/skills/hyperframes-creative/references/house-style.md +15 -15
  100. package/skills/hyperframes-creative/references/story-spine.md +3 -1
  101. package/skills/hyperframes-creative/references/storyboard-recipe.md +57 -0
  102. package/skills/hyperframes-creative/references/typography.md +1 -1
  103. package/skills/hyperframes-creative/scripts/package-loader.mjs +47 -16
  104. package/skills/hyperframes-creative/scripts/package-loader.test.mjs +52 -0
  105. package/skills/hyperframes-keyframes/SKILL.md +4 -2
  106. package/skills/hyperframes-registry/SKILL.md +3 -1
  107. package/skills/hyperframes-registry/references/contributing.md +8 -2
  108. package/skills/hyperframes-registry/references/discovery.md +20 -34
  109. package/skills/hyperframes-studio/SKILL.md +77 -0
  110. package/skills/media-use/SKILL.md +14 -12
  111. package/skills/media-use/audio/references/captions/authoring.md +4 -0
  112. package/skills/media-use/audio/references/remove-background.md +1 -1
  113. package/skills/media-use/audio/references/tts-to-captions.md +11 -2
  114. package/skills/media-use/audio/references/tts.md +84 -6
  115. package/skills/media-use/audio/scripts/audio.mjs +15 -6
  116. package/skills/media-use/audio/scripts/gemini-pipeline.test.mjs +113 -0
  117. package/skills/media-use/audio/scripts/lib/audio-meta.mjs +39 -0
  118. package/skills/media-use/audio/scripts/lib/audio-meta.test.mjs +136 -0
  119. package/skills/media-use/audio/scripts/lib/bgm-volume.mjs +4 -0
  120. package/skills/media-use/audio/scripts/lib/bgm.mjs +2 -6
  121. package/skills/media-use/audio/scripts/lib/gemini-auth.mjs +43 -0
  122. package/skills/media-use/audio/scripts/lib/gemini-auth.py +52 -0
  123. package/skills/media-use/audio/scripts/lib/gemini-auth.test.mjs +86 -0
  124. package/skills/media-use/audio/scripts/lib/gemini-auth_test.py +90 -0
  125. package/skills/media-use/audio/scripts/lib/gemini-tts.mjs +122 -0
  126. package/skills/media-use/audio/scripts/lib/gemini-tts.test.mjs +243 -0
  127. package/skills/media-use/audio/scripts/lib/heygen.mjs +2 -1
  128. package/skills/media-use/audio/scripts/lib/tts.mjs +15 -3
  129. package/skills/media-use/audio/scripts/wait-bgm.mjs +8 -4
  130. package/skills/media-use/audio/scripts/wait-bgm.test.mjs +65 -0
  131. package/skills/media-use/references/audio.md +3 -2
  132. package/skills/media-use/references/grading.md +7 -7
  133. package/skills/media-use/references/media-treatment-recipes.md +1 -1
  134. package/skills/media-use/references/memory.md +2 -2
  135. package/skills/media-use/references/meta.md +2 -2
  136. package/skills/media-use/references/operations.md +15 -13
  137. package/skills/media-use/references/resolve.md +22 -11
  138. package/skills/media-use/references/setup-providers.md +11 -11
  139. package/skills/media-use/scripts/audio-duck.mjs +19 -27
  140. package/skills/media-use/scripts/compatibility.test.mjs +96 -0
  141. package/skills/media-use/scripts/lib/config-lock.mjs +45 -0
  142. package/skills/media-use/scripts/lib/duck.mjs +16 -10
  143. package/skills/media-use/scripts/lib/media-fetch.mjs +85 -0
  144. package/skills/media-use/scripts/lib/media-home.mjs +20 -0
  145. package/skills/media-use/scripts/lib/npx-sync.mjs +28 -2
  146. package/skills/media-use/scripts/lib/prefs-store.mjs +2 -2
  147. package/skills/media-use/scripts/lib/recipe-store.mjs +2 -2
  148. package/skills/media-use/scripts/lib/telemetry.mjs +29 -41
  149. package/skills/media-use/scripts/lib/transcriptCutFade.mjs +21 -0
  150. package/skills/media-use/scripts/prefs.mjs +1 -1
  151. package/skills/media-use/scripts/recipe.mjs +1 -1
  152. package/skills/media-use/scripts/resolve-plugin.test.mjs +62 -0
  153. package/skills/media-use/scripts/resolve.mjs +27 -1267
  154. package/skills/media-use/scripts/transcribe.mjs +39 -25
  155. package/skills/media-use/scripts/transcribe.test.mjs +112 -0
  156. package/skills/media-use/scripts/transcript-cut.mjs +39 -8
  157. package/skills/media-use/scripts/transcript-cut.test.mjs +117 -0
  158. package/skills/motion-graphics/SKILL.md +3 -1
  159. package/skills/motion-graphics/agents/builder.md +1 -0
  160. package/skills/motion-graphics/agents/director.md +2 -1
  161. package/skills/motion-graphics/catalog-map.md +25 -13
  162. package/skills/motion-graphics/categories/charts/module.md +2 -1
  163. package/skills/motion-graphics/categories/lower-thirds/module.md +4 -0
  164. package/skills/motion-graphics/categories/news/module.md +1 -1
  165. package/skills/motion-graphics/references/motion-vocabulary.md +4 -0
  166. package/skills/music-to-video/SKILL.md +8 -6
  167. package/skills/music-to-video/references/montage.md +3 -6
  168. package/skills/music-to-video/references/motion-primitives/3d-card-flip/index.html +10 -111
  169. package/skills/music-to-video/references/motion-primitives/3d-card-flip/scene.html +119 -0
  170. package/skills/music-to-video/references/motion-primitives/bg-flow-field/index.html +11 -284
  171. package/skills/music-to-video/references/motion-primitives/bg-flow-field/scene.html +294 -0
  172. package/skills/music-to-video/references/motion-primitives/binary-decrypt/index.html +10 -76
  173. package/skills/music-to-video/references/motion-primitives/binary-decrypt/scene.html +85 -0
  174. package/skills/music-to-video/references/motion-primitives/blur-resolve/index.html +10 -52
  175. package/skills/music-to-video/references/motion-primitives/blur-resolve/scene.html +60 -0
  176. package/skills/music-to-video/references/motion-primitives/braam-punch/index.html +10 -92
  177. package/skills/music-to-video/references/motion-primitives/braam-punch/scene.html +100 -0
  178. package/skills/music-to-video/references/motion-primitives/chromatic-split/index.html +10 -103
  179. package/skills/music-to-video/references/motion-primitives/chromatic-split/scene.html +111 -0
  180. package/skills/music-to-video/references/motion-primitives/chrome-sweep/index.html +10 -60
  181. package/skills/music-to-video/references/motion-primitives/chrome-sweep/scene.html +68 -0
  182. package/skills/music-to-video/references/motion-primitives/counting-punch/index.html +10 -110
  183. package/skills/music-to-video/references/motion-primitives/counting-punch/scene.html +119 -0
  184. package/skills/music-to-video/references/motion-primitives/crash-zoom-in/index.html +10 -112
  185. package/skills/music-to-video/references/motion-primitives/crash-zoom-in/scene.html +120 -0
  186. package/skills/music-to-video/references/motion-primitives/datamosh-smear/index.html +10 -121
  187. package/skills/music-to-video/references/motion-primitives/datamosh-smear/scene.html +131 -0
  188. package/skills/music-to-video/references/motion-primitives/directional-fill/index.html +10 -90
  189. package/skills/music-to-video/references/motion-primitives/directional-fill/scene.html +103 -0
  190. package/skills/music-to-video/references/motion-primitives/dolly-zoom/index.html +10 -94
  191. package/skills/music-to-video/references/motion-primitives/dolly-zoom/scene.html +102 -0
  192. package/skills/music-to-video/references/motion-primitives/electric-arc/index.html +10 -100
  193. package/skills/music-to-video/references/motion-primitives/electric-arc/scene.html +105 -0
  194. package/skills/music-to-video/references/motion-primitives/flash-cut/index.html +10 -89
  195. package/skills/music-to-video/references/motion-primitives/flash-cut/scene.html +97 -0
  196. package/skills/music-to-video/references/motion-primitives/gooey-metaball/index.html +10 -197
  197. package/skills/music-to-video/references/motion-primitives/gooey-metaball/scene.html +206 -0
  198. package/skills/music-to-video/references/motion-primitives/hard-cut/index.html +10 -74
  199. package/skills/music-to-video/references/motion-primitives/hard-cut/scene.html +82 -0
  200. package/skills/music-to-video/references/motion-primitives/hypercut-whip/index.html +10 -36
  201. package/skills/music-to-video/references/motion-primitives/hypercut-whip/scene.html +44 -0
  202. package/skills/music-to-video/references/motion-primitives/iris-open/index.html +10 -61
  203. package/skills/music-to-video/references/motion-primitives/iris-open/scene.html +69 -0
  204. package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/index.html +10 -55
  205. package/skills/music-to-video/references/motion-primitives/kinetic-letter-in/scene.html +64 -0
  206. package/skills/music-to-video/references/motion-primitives/liquid-morph/index.html +10 -88
  207. package/skills/music-to-video/references/motion-primitives/liquid-morph/scene.html +96 -0
  208. package/skills/music-to-video/references/motion-primitives/mask-reveal/index.html +10 -66
  209. package/skills/music-to-video/references/motion-primitives/mask-reveal/scene.html +74 -0
  210. package/skills/music-to-video/references/motion-primitives/mosaic-pack/index.html +10 -81
  211. package/skills/music-to-video/references/motion-primitives/mosaic-pack/scene.html +89 -0
  212. package/skills/music-to-video/references/motion-primitives/neon-flicker/index.html +10 -65
  213. package/skills/music-to-video/references/motion-primitives/neon-flicker/scene.html +73 -0
  214. package/skills/music-to-video/references/motion-primitives/outline-to-fill/index.html +10 -74
  215. package/skills/music-to-video/references/motion-primitives/outline-to-fill/scene.html +82 -0
  216. package/skills/music-to-video/references/motion-primitives/palette-flip/index.html +10 -89
  217. package/skills/music-to-video/references/motion-primitives/palette-flip/scene.html +97 -0
  218. package/skills/music-to-video/references/motion-primitives/particle-burst/index.html +10 -98
  219. package/skills/music-to-video/references/motion-primitives/particle-burst/scene.html +106 -0
  220. package/skills/music-to-video/references/motion-primitives/pixel-dissolve/index.html +10 -78
  221. package/skills/music-to-video/references/motion-primitives/pixel-dissolve/scene.html +86 -0
  222. package/skills/music-to-video/references/motion-primitives/radial-burst-lines/index.html +10 -117
  223. package/skills/music-to-video/references/motion-primitives/radial-burst-lines/scene.html +130 -0
  224. package/skills/music-to-video/references/motion-primitives/screen-shake/index.html +10 -70
  225. package/skills/music-to-video/references/motion-primitives/screen-shake/scene.html +78 -0
  226. package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/index.html +10 -87
  227. package/skills/music-to-video/references/motion-primitives/slot-machine-reveal/scene.html +100 -0
  228. package/skills/music-to-video/references/motion-primitives/spotlight-sweep/index.html +10 -94
  229. package/skills/music-to-video/references/motion-primitives/spotlight-sweep/scene.html +102 -0
  230. package/skills/music-to-video/references/motion-primitives/staggered-exit/index.html +10 -74
  231. package/skills/music-to-video/references/motion-primitives/staggered-exit/scene.html +82 -0
  232. package/skills/music-to-video/references/motion-primitives/text-spectral-rays/index.html +11 -271
  233. package/skills/music-to-video/references/motion-primitives/text-spectral-rays/scene.html +280 -0
  234. package/skills/music-to-video/references/motion-primitives/text-wave-distort/index.html +10 -92
  235. package/skills/music-to-video/references/motion-primitives/text-wave-distort/scene.html +106 -0
  236. package/skills/music-to-video/references/motion-primitives/tile-mosaic/index.html +10 -101
  237. package/skills/music-to-video/references/motion-primitives/tile-mosaic/scene.html +109 -0
  238. package/skills/music-to-video/references/motion-primitives/typewriter-reveal/index.html +10 -79
  239. package/skills/music-to-video/references/motion-primitives/typewriter-reveal/scene.html +91 -0
  240. package/skills/music-to-video/references/motion-primitives/word-grid-burst/index.html +10 -83
  241. package/skills/music-to-video/references/motion-primitives/word-grid-burst/scene.html +96 -0
  242. package/skills/music-to-video/references/planning.md +2 -2
  243. package/skills/music-to-video/scripts/lib/storyboard.mjs +1 -1
  244. package/skills/music-to-video/sub-agents/frame-worker.md +2 -2
  245. package/skills/pr-to-video/SKILL.md +20 -16
  246. package/skills/pr-to-video/references/code-vocabulary.md +14 -12
  247. package/skills/pr-to-video/references/story-design.md +1 -1
  248. package/skills/pr-to-video/scripts/assemble-index.mjs +6 -4
  249. package/skills/pr-to-video/scripts/assemble-index.test.mjs +57 -2
  250. package/skills/pr-to-video/scripts/audio.mjs +2 -0
  251. package/skills/pr-to-video/scripts/build-frame.mjs +6 -3
  252. package/skills/pr-to-video/scripts/captions.mjs +7 -4
  253. package/skills/pr-to-video/scripts/captions.test.mjs +41 -0
  254. package/skills/pr-to-video/scripts/frame-packets.mjs +4 -4
  255. package/skills/pr-to-video/scripts/lib/bgm-volume.mjs +4 -0
  256. package/skills/pr-to-video/scripts/lib/captured-fonts.mjs +58 -0
  257. package/skills/pr-to-video/scripts/lib/frame-packets-core.mjs +194 -0
  258. package/skills/pr-to-video/scripts/lib/storyboard.mjs +1 -1
  259. package/skills/pr-to-video/scripts/lib/transitions.json +3 -3
  260. package/skills/pr-to-video/scripts/transitions.mjs +7 -5
  261. package/skills/pr-to-video/sub-agents/frame-worker.md +1 -1
  262. package/skills/product-launch-video/SKILL.md +20 -16
  263. package/skills/product-launch-video/references/story-design.md +1 -1
  264. package/skills/product-launch-video/scripts/assemble-index.mjs +6 -4
  265. package/skills/product-launch-video/scripts/assemble-index.test.mjs +57 -2
  266. package/skills/product-launch-video/scripts/audio.mjs +2 -0
  267. package/skills/product-launch-video/scripts/audio.test.mjs +16 -0
  268. package/skills/product-launch-video/scripts/build-frame-subsets.test.mjs +152 -0
  269. package/skills/product-launch-video/scripts/build-frame.mjs +6 -3
  270. package/skills/product-launch-video/scripts/captions.mjs +7 -4
  271. package/skills/product-launch-video/scripts/frame-packets.mjs +4 -4
  272. package/skills/product-launch-video/scripts/lib/bgm-volume.mjs +4 -0
  273. package/skills/product-launch-video/scripts/lib/captured-fonts.mjs +58 -0
  274. package/skills/product-launch-video/scripts/lib/frame-packets-core.mjs +194 -0
  275. package/skills/product-launch-video/scripts/lib/storyboard.mjs +1 -1
  276. package/skills/product-launch-video/scripts/lib/transitions.json +3 -3
  277. package/skills/product-launch-video/scripts/transitions.mjs +7 -5
  278. package/skills/product-launch-video/scripts/transitions.test.mjs +68 -0
  279. package/skills/product-launch-video/sub-agents/frame-worker.md +1 -1
  280. package/skills/remotion-to-hyperframes/SKILL.md +7 -4
  281. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/expected.json +5 -5
  282. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/compositions/title.html +31 -0
  283. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/index.html +10 -25
  284. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/README.md +8 -8
  285. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/expected.json +9 -9
  286. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-1.html +35 -0
  287. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-2.html +35 -0
  288. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/compositions/scene-3.html +36 -0
  289. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/index.html +28 -71
  290. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json +3 -3
  291. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-1.html +52 -0
  292. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-2.html +99 -0
  293. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/compositions/scene-3.html +55 -0
  294. package/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/index.html +13 -212
  295. package/skills/remotion-to-hyperframes/references/api-map.md +16 -16
  296. package/skills/remotion-to-hyperframes/references/limitations.md +7 -7
  297. package/skills/remotion-to-hyperframes/references/lottie.md +5 -7
  298. package/skills/remotion-to-hyperframes/references/media.md +3 -3
  299. package/skills/remotion-to-hyperframes/references/parameters.md +5 -0
  300. package/skills/remotion-to-hyperframes/references/sequencing.md +71 -18
  301. package/skills/slideshow/SKILL.md +4 -1
  302. package/skills/slideshow/references/standalone-harness.md +0 -3
  303. package/skills/talking-head-recut/SKILL.md +10 -1
  304. package/skills/hyperframes-core/references/review-loop.md +0 -41
  305. package/skills/media-use/scripts/lib/adopt.mjs +0 -128
  306. package/skills/media-use/scripts/lib/adopt.test.mjs +0 -95
  307. package/skills/media-use/scripts/lib/bgm-provider.mjs +0 -20
  308. package/skills/media-use/scripts/lib/brand-provider.mjs +0 -59
  309. package/skills/media-use/scripts/lib/bundled-sfx-provider.mjs +0 -108
  310. package/skills/media-use/scripts/lib/bundled-sfx-provider.test.mjs +0 -85
  311. package/skills/media-use/scripts/lib/cache.mjs +0 -150
  312. package/skills/media-use/scripts/lib/candidates.mjs +0 -91
  313. package/skills/media-use/scripts/lib/candidates.test.mjs +0 -155
  314. package/skills/media-use/scripts/lib/codex-provider.mjs +0 -161
  315. package/skills/media-use/scripts/lib/codex-provider.test.mjs +0 -34
  316. package/skills/media-use/scripts/lib/coverage.test.mjs +0 -117
  317. package/skills/media-use/scripts/lib/cube-build.mjs +0 -181
  318. package/skills/media-use/scripts/lib/cube-build.test.mjs +0 -80
  319. package/skills/media-use/scripts/lib/cube-validate.mjs +0 -198
  320. package/skills/media-use/scripts/lib/cube-validate.test.mjs +0 -125
  321. package/skills/media-use/scripts/lib/cutlist.test.mjs +0 -148
  322. package/skills/media-use/scripts/lib/duck.test.mjs +0 -118
  323. package/skills/media-use/scripts/lib/error-diffusion.test.mjs +0 -102
  324. package/skills/media-use/scripts/lib/freeze.mjs +0 -70
  325. package/skills/media-use/scripts/lib/freeze.test.mjs +0 -46
  326. package/skills/media-use/scripts/lib/grade-analyzer.mjs +0 -264
  327. package/skills/media-use/scripts/lib/grade-analyzer.test.mjs +0 -285
  328. package/skills/media-use/scripts/lib/heygen-cli.mjs +0 -191
  329. package/skills/media-use/scripts/lib/heygen-cli.test.mjs +0 -301
  330. package/skills/media-use/scripts/lib/heygen-search.mjs +0 -45
  331. package/skills/media-use/scripts/lib/heygen-search.test.mjs +0 -49
  332. package/skills/media-use/scripts/lib/heygen-video-provider.mjs +0 -127
  333. package/skills/media-use/scripts/lib/heygen-video-provider.test.mjs +0 -344
  334. package/skills/media-use/scripts/lib/image-provider.mjs +0 -44
  335. package/skills/media-use/scripts/lib/local-models.mjs +0 -318
  336. package/skills/media-use/scripts/lib/local-models.test.mjs +0 -220
  337. package/skills/media-use/scripts/lib/local-run.mjs +0 -78
  338. package/skills/media-use/scripts/lib/local-run.test.mjs +0 -121
  339. package/skills/media-use/scripts/lib/logo-provider.mjs +0 -222
  340. package/skills/media-use/scripts/lib/logo-provider.test.mjs +0 -137
  341. package/skills/media-use/scripts/lib/ltx-video-provider.mjs +0 -94
  342. package/skills/media-use/scripts/lib/ltx-video-provider.test.mjs +0 -316
  343. package/skills/media-use/scripts/lib/lut-preset-provider.mjs +0 -266
  344. package/skills/media-use/scripts/lib/lut-preset-provider.test.mjs +0 -176
  345. package/skills/media-use/scripts/lib/manifest.test.mjs +0 -388
  346. package/skills/media-use/scripts/lib/match.mjs +0 -47
  347. package/skills/media-use/scripts/lib/mflux-provider.mjs +0 -128
  348. package/skills/media-use/scripts/lib/mflux-provider.test.mjs +0 -174
  349. package/skills/media-use/scripts/lib/misses.mjs +0 -49
  350. package/skills/media-use/scripts/lib/misses.test.mjs +0 -78
  351. package/skills/media-use/scripts/lib/npx-sync.test.mjs +0 -50
  352. package/skills/media-use/scripts/lib/parakeet-words.test.mjs +0 -44
  353. package/skills/media-use/scripts/lib/prefs-store.test.mjs +0 -189
  354. package/skills/media-use/scripts/lib/probe.mjs +0 -39
  355. package/skills/media-use/scripts/lib/probe.test.mjs +0 -31
  356. package/skills/media-use/scripts/lib/providers.mjs +0 -5
  357. package/skills/media-use/scripts/lib/recipe-store.test.mjs +0 -367
  358. package/skills/media-use/scripts/lib/registry.mjs +0 -218
  359. package/skills/media-use/scripts/lib/registry.test.mjs +0 -261
  360. package/skills/media-use/scripts/lib/search.mjs +0 -24
  361. package/skills/media-use/scripts/lib/search.test.mjs +0 -32
  362. package/skills/media-use/scripts/lib/sfx-provider.mjs +0 -23
  363. package/skills/media-use/scripts/lib/specs.mjs +0 -132
  364. package/skills/media-use/scripts/lib/specs.test.mjs +0 -157
  365. package/skills/media-use/scripts/lib/stats.mjs +0 -117
  366. package/skills/media-use/scripts/lib/stats.test.mjs +0 -165
  367. package/skills/media-use/scripts/lib/telemetry.test.mjs +0 -373
  368. package/skills/media-use/scripts/lib/tts-local-provider.mjs +0 -92
  369. package/skills/media-use/scripts/lib/tts-local-provider.test.mjs +0 -72
  370. package/skills/media-use/scripts/lib/usage.mjs +0 -57
  371. package/skills/media-use/scripts/lib/usage.test.mjs +0 -54
  372. package/skills/media-use/scripts/lib/voice-provider.mjs +0 -57
  373. package/skills/media-use/scripts/lib/voice-provider.test.mjs +0 -46
  374. package/skills/media-use/scripts/resolve.test.mjs +0 -1120
  375. /package/skills/{hyperframes-core → hyperframes}/references/subagent-dispatch.md +0 -0
@@ -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="scene scene-1 clip"
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="scene scene-2 clip"
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="scene scene-3 clip"
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"] = tl;
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>` | siblings 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 |
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 supports static `data-volume` only. Translation: bake the ramp into
35
- the audio file at translation time using `ffmpeg afade`, OR drop the
36
- ramp with a note. The dropped-ramp path produces audibly different
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 dropped — added
124
- static `data-volume="0.5"`. To preserve the ramp, run
125
- `ffmpeg -i music.wav -af "afade=t=in:st=0:d=1" music.faded.wav` and
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 to
108
- the player option only after checking the generated frames. The HF
109
- adapter seeks absolute composition time; it does not add modulo looping
110
- or playback-rate scaling on top of the player. For exact repeating
111
- cycles or non-default playback rates, bake the timing into the Lottie
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
- HF supports static `data-volume` only for now. Volume ramps need to be
48
- applied to the audio file at translation time (with ffmpeg `afade`) or the
49
- ramp is dropped with a translation note.
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 HF's flat `data-start` /
4
- `data-duration` markup with a single paused GSAP timeline.
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 siblings on the same
15
- parent, each with their own time window.
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>` → time-windowed div
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
- <div data-start="0" data-duration="3" data-track-index="0">
70
- <!-- TitleCard children inlined -->
71
- </div>
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 HF div with the resolved
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 data-start="3" data-duration="2" data-track-index="0">
97
- <!-- ImageScene children -->
98
- </div>
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 data-start="0" data-duration="2" data-track-index="0">A</div>
122
- <div data-start="2" data-duration="4" data-track-index="0">B</div>
123
- <div data-start="6" data-duration="3" data-track-index="0">C</div>
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-core/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.
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-core/references/brief-contract.md` § 1) — **skip
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.