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
@@ -0,0 +1,294 @@
1
+ <template id="bg-flow-field-template">
2
+ <div
3
+ data-composition-id="bg-flow-field"
4
+ data-composition-variables='[
5
+ {"id":"bgColor", "type":"color", "label":"Page background", "default":"#050507"},
6
+ {"id":"colorLow", "type":"color", "label":"Flow — shadow tone", "default":"#0a1430"},
7
+ {"id":"colorMid", "type":"color", "label":"Flow — mid tone", "default":"#6a6f9e"},
8
+ {"id":"colorHigh", "type":"color", "label":"Flow — highlight tone", "default":"#e8f0ff"},
9
+ {"id":"accentColor","type":"color", "label":"Core / glow accent", "default":"#aee4ff"},
10
+ {"id":"flowSpeed", "type":"number", "label":"Flow speed", "default":1, "min":0.1, "max":3, "step":0.1}
11
+ ]'
12
+ data-width="1920"
13
+ data-height="1080"
14
+ data-duration="4"
15
+ >
16
+ <style>
17
+ :root {
18
+ --hg-violet: #7c3aed;
19
+ --hg-violet-2: #a855f7;
20
+ --hg-bg: #050507;
21
+ --hg-fg: #f5f5fa;
22
+ --hg-dim: #6b6b78;
23
+ }
24
+ * {
25
+ margin: 0;
26
+ padding: 0;
27
+ box-sizing: border-box;
28
+ }
29
+ .field {
30
+ position: absolute;
31
+ inset: 0;
32
+ width: 1920px;
33
+ height: 1080px;
34
+ display: block;
35
+ }
36
+ .label {
37
+ position: absolute;
38
+ left: 48px;
39
+ bottom: 40px;
40
+ font-size: 22px;
41
+ font-weight: 600;
42
+ letter-spacing: 0.18em;
43
+ text-transform: uppercase;
44
+ color: rgba(255, 255, 255, 0.7);
45
+ mix-blend-mode: screen;
46
+ pointer-events: none;
47
+ }
48
+ </style>
49
+ <canvas class="field" width="1920" height="1080"></canvas>
50
+ <div class="label">bg_flow_field</div>
51
+ <script>
52
+ window.__timelines = window.__timelines || {};
53
+ const tl = gsap.timeline({ paused: true });
54
+
55
+ // ── Variables (palette + speed); falls back to defaults standalone ──
56
+ const defaults = {
57
+ bgColor: "#050507",
58
+ colorLow: "#0a1430",
59
+ colorMid: "#6a6f9e",
60
+ colorHigh: "#e8f0ff",
61
+ accentColor: "#aee4ff",
62
+ flowSpeed: 1,
63
+ };
64
+ const vars = Object.assign(
65
+ {},
66
+ defaults,
67
+ window.__hyperframes && window.__hyperframes.getVariables
68
+ ? window.__hyperframes.getVariables()
69
+ : {},
70
+ );
71
+
72
+ // sRGB hex -> linear-light [r,g,b] (shader works in linear, gamma-encodes at end)
73
+ function hexLin(hex) {
74
+ let h = String(hex).replace("#", "").trim();
75
+ if (h.length === 3) h = h[0] + h[0] + h[1] + h[1] + h[2] + h[2];
76
+ const r = parseInt(h.substr(0, 2), 16) / 255;
77
+ const g = parseInt(h.substr(2, 2), 16) / 255;
78
+ const b = parseInt(h.substr(4, 2), 16) / 255;
79
+ const lin = (c) => Math.pow(c, 2.2);
80
+ return [lin(r), lin(g), lin(b)];
81
+ }
82
+
83
+ const canvas = document.querySelector(".field");
84
+ const gl = canvas.getContext("webgl", {
85
+ antialias: false,
86
+ alpha: false,
87
+ preserveDrawingBuffer: true,
88
+ });
89
+
90
+ const VERT = [
91
+ "attribute vec2 position;",
92
+ "varying vec2 vUv;",
93
+ "void main(){",
94
+ " vUv = position * 0.5 + 0.5;",
95
+ " gl_Position = vec4(position, 0.0, 1.0);",
96
+ "}",
97
+ ].join("\n");
98
+
99
+ // Curl-noise flow field — ported verbatim from the held-message-living-field
100
+ // template's "living field" background. All visible state comes from uniforms.
101
+ const FRAG = [
102
+ "precision highp float;",
103
+ "varying vec2 vUv;",
104
+ "uniform float uTime;",
105
+ "uniform float uPhase;",
106
+ "uniform float uReveal;",
107
+ "uniform float uChromAb;",
108
+ "uniform float uVignette;",
109
+ "uniform float uIntensity;",
110
+ "uniform float uSpeed;",
111
+ "uniform vec2 uResolution;",
112
+ "uniform vec3 uColLow;",
113
+ "uniform vec3 uColMid;",
114
+ "uniform vec3 uColHigh;",
115
+ "uniform vec3 uAccent;",
116
+ "float hash21(vec2 p){",
117
+ " p = fract(p * vec2(123.34, 456.21));",
118
+ " p += dot(p, p + 45.32);",
119
+ " return fract(p.x * p.y);",
120
+ "}",
121
+ "float noise2(vec2 p){",
122
+ " vec2 i = floor(p);",
123
+ " vec2 f = fract(p);",
124
+ " vec2 u = f * f * (3.0 - 2.0 * f);",
125
+ " float a = hash21(i);",
126
+ " float b = hash21(i + vec2(1.0, 0.0));",
127
+ " float c = hash21(i + vec2(0.0, 1.0));",
128
+ " float d = hash21(i + vec2(1.0, 1.0));",
129
+ " return mix(mix(a,b,u.x), mix(c,d,u.x), u.y);",
130
+ "}",
131
+ "float fbm(vec2 p){",
132
+ " float v = 0.0;",
133
+ " float a = 0.5;",
134
+ " for(int i=0;i<5;i++){",
135
+ " v += a * noise2(p);",
136
+ " p *= 2.02;",
137
+ " a *= 0.5;",
138
+ " }",
139
+ " return v;",
140
+ "}",
141
+ "vec2 curl(vec2 p, float t){",
142
+ " float e = 0.6;",
143
+ " float n1 = fbm(p + vec2(0.0, e) + t*0.18);",
144
+ " float n2 = fbm(p + vec2(0.0, -e) + t*0.18);",
145
+ " float n3 = fbm(p + vec2( e, 0.0) + t*0.18);",
146
+ " float n4 = fbm(p + vec2(-e, 0.0) + t*0.18);",
147
+ " return vec2(n1 - n2, -(n3 - n4));",
148
+ "}",
149
+ "vec3 palette(float t){",
150
+ " t = clamp(t, 0.0, 1.0);",
151
+ " vec3 lowMid = mix(uColLow, uColMid, smoothstep(0.0, 0.5, t));",
152
+ " return mix(lowMid, uColHigh, smoothstep(0.5, 1.0, t));",
153
+ "}",
154
+ "vec3 sampleField(vec2 uv, float t, float energy){",
155
+ " vec2 p = (uv - 0.5) * vec2(uResolution.x/uResolution.y, 1.0) * 2.4;",
156
+ " vec2 c = curl(p * 0.9, t);",
157
+ " vec2 q = p + c * (0.45 + 0.55 * energy);",
158
+ " float flow = fbm(q * 1.6 + vec2(t * 0.11, -t * 0.07));",
159
+ " float bands = sin(flow * 14.0 + t * 1.1);",
160
+ " bands = smoothstep(0.0, 1.0, 0.5 + 0.5 * bands);",
161
+ " float r = length(p);",
162
+ " float core = smoothstep(1.5, 0.05, r) * (0.6 + 0.4 * energy);",
163
+ " float glow = exp(-r * 1.6) * (0.55 + 0.45 * energy);",
164
+ " float k = clamp(flow * 0.85 + 0.15 * bands + 0.25 * core + 0.6 * glow, 0.0, 1.4);",
165
+ " vec3 col = palette(k * 0.9 + 0.1 * sin(t * 0.4));",
166
+ " col *= 0.7 + 0.6 * energy;",
167
+ " col += uAccent * core * 0.55;",
168
+ " return col;",
169
+ "}",
170
+ "void main(){",
171
+ " vec2 uv = vUv;",
172
+ " float t = uTime * uSpeed;",
173
+ " float e = uIntensity;",
174
+ " vec2 dir = normalize(uv - 0.5 + 1e-6);",
175
+ " float ca = uChromAb * (0.004 + 0.012 * length(uv - 0.5));",
176
+ " vec3 cR = sampleField(uv + dir * ca, t, e);",
177
+ " vec3 cG = sampleField(uv, t, e);",
178
+ " vec3 cB = sampleField(uv - dir * ca, t, e);",
179
+ " vec3 col = vec3(cR.r, cG.g, cB.b);",
180
+ " float lum = dot(col, vec3(0.299, 0.587, 0.114));",
181
+ " col = mix(vec3(lum), col, 1.05);",
182
+ " float rev = uReveal;",
183
+ " float sweep = smoothstep(0.0, 0.6, rev) * (1.0 - smoothstep(0.6, 1.0, rev));",
184
+ " col += uColHigh * sweep * 0.35;",
185
+ " vec3 phaseTint = mix(vec3(0.85, 0.92, 1.05), vec3(1.05, 0.95, 0.85), uPhase);",
186
+ " col *= phaseTint;",
187
+ " float v = length(uv - 0.5);",
188
+ " col *= 1.0 - smoothstep(0.45, 0.95, v) * uVignette;",
189
+ " col = col / (col + 1.0);",
190
+ " col = pow(col, vec3(1.0/2.2));",
191
+ " gl_FragColor = vec4(col, 1.0);",
192
+ "}",
193
+ ].join("\n");
194
+
195
+ function compile(type, src) {
196
+ const s = gl.createShader(type);
197
+ gl.shaderSource(s, src);
198
+ gl.compileShader(s);
199
+ return s;
200
+ }
201
+ const prog = gl.createProgram();
202
+ gl.attachShader(prog, compile(gl.VERTEX_SHADER, VERT));
203
+ gl.attachShader(prog, compile(gl.FRAGMENT_SHADER, FRAG));
204
+ gl.linkProgram(prog);
205
+ gl.useProgram(prog);
206
+
207
+ // full-screen triangle
208
+ const buf = gl.createBuffer();
209
+ gl.bindBuffer(gl.ARRAY_BUFFER, buf);
210
+ gl.bufferData(gl.ARRAY_BUFFER, new Float32Array([-1, -1, 3, -1, -1, 3]), gl.STATIC_DRAW);
211
+ const posLoc = gl.getAttribLocation(prog, "position");
212
+ gl.enableVertexAttribArray(posLoc);
213
+ gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);
214
+ gl.viewport(0, 0, 1920, 1080);
215
+
216
+ const L = (n) => gl.getUniformLocation(prog, n);
217
+ const uLoc = {
218
+ uTime: L("uTime"),
219
+ uPhase: L("uPhase"),
220
+ uReveal: L("uReveal"),
221
+ uChromAb: L("uChromAb"),
222
+ uVignette: L("uVignette"),
223
+ uIntensity: L("uIntensity"),
224
+ uSpeed: L("uSpeed"),
225
+ uResolution: L("uResolution"),
226
+ uColLow: L("uColLow"),
227
+ uColMid: L("uColMid"),
228
+ uColHigh: L("uColHigh"),
229
+ uAccent: L("uAccent"),
230
+ };
231
+
232
+ // animated uniform state (GSAP tweens these .value fields)
233
+ const u = {
234
+ uTime: { value: 0 },
235
+ uPhase: { value: 0.1 },
236
+ uReveal: { value: 0 },
237
+ uChromAb: { value: 0 },
238
+ uVignette: { value: 0 },
239
+ uIntensity: { value: 0.3 },
240
+ };
241
+ const speed = Number(vars.flowSpeed) || 1;
242
+ const cLow = hexLin(vars.colorLow);
243
+ const cMid = hexLin(vars.colorMid);
244
+ const cHigh = hexLin(vars.colorHigh);
245
+ const cAcc = hexLin(vars.accentColor);
246
+
247
+ function render() {
248
+ gl.uniform1f(uLoc.uTime, u.uTime.value);
249
+ gl.uniform1f(uLoc.uPhase, u.uPhase.value);
250
+ gl.uniform1f(uLoc.uReveal, u.uReveal.value);
251
+ gl.uniform1f(uLoc.uChromAb, u.uChromAb.value);
252
+ gl.uniform1f(uLoc.uVignette, u.uVignette.value);
253
+ gl.uniform1f(uLoc.uIntensity, u.uIntensity.value);
254
+ gl.uniform1f(uLoc.uSpeed, speed);
255
+ gl.uniform2f(uLoc.uResolution, 1920, 1080);
256
+ gl.uniform3fv(uLoc.uColLow, cLow);
257
+ gl.uniform3fv(uLoc.uColMid, cMid);
258
+ gl.uniform3fv(uLoc.uColHigh, cHigh);
259
+ gl.uniform3fv(uLoc.uAccent, cAcc);
260
+ gl.drawArrays(gl.TRIANGLES, 0, 3);
261
+ }
262
+ render(); // initial frame so a seek to 0 / first paint is correct
263
+
264
+ // ── Energy-envelope drive (the "living field" breath): all repaint is via
265
+ // onUpdate, so the field is fully determined by the timeline position — no
266
+ // requestAnimationFrame, seek-safe. ──
267
+ tl.eventCallback("onUpdate", render);
268
+
269
+ tl.to(u.uTime, { value: 4, duration: 4, ease: "none" }, 0);
270
+
271
+ // energy: settle-in → breathe → SURGE → settle dark for the hold
272
+ tl.to(u.uIntensity, { value: 0.6, duration: 1.2, ease: "sine.inOut" }, 0);
273
+ tl.to(u.uIntensity, { value: 1.0, duration: 0.7, ease: "power2.in" }, 1.3);
274
+ tl.to(u.uIntensity, { value: 0.35, duration: 2.0, ease: "power2.out" }, 2.0);
275
+
276
+ // chromatic light-leak: light at entry, spikes on the surge, then settles
277
+ tl.fromTo(u.uChromAb, { value: 0 }, { value: 0.4, duration: 1.2, ease: "sine.in" }, 0);
278
+ tl.to(u.uChromAb, { value: 1.4, duration: 0.5, ease: "power3.in" }, 1.4);
279
+ tl.to(u.uChromAb, { value: 0.2, duration: 1.6, ease: "power2.out" }, 1.9);
280
+
281
+ // a brief highlight sweep across the surge
282
+ tl.fromTo(u.uReveal, { value: 0 }, { value: 1, duration: 0.7, ease: "none" }, 1.3);
283
+ tl.set(u.uReveal, { value: 0 }, 2.0);
284
+
285
+ // colour-temperature drift
286
+ tl.to(u.uPhase, { value: 0.6, duration: 2.2, ease: "sine.inOut" }, 0.6);
287
+
288
+ // black mask settles the field to near-black + central glow for the hold
289
+ tl.to(u.uVignette, { value: 0.85, duration: 1.6, ease: "power2.out" }, 1.9);
290
+
291
+ window.__timelines["bg-flow-field"] = tl;
292
+ </script>
293
+ </div>
294
+ </template>
@@ -14,11 +14,6 @@
14
14
  --hg-fg: #f5f5fa;
15
15
  --hg-dim: #6b6b78;
16
16
  }
17
- * {
18
- margin: 0;
19
- padding: 0;
20
- box-sizing: border-box;
21
- }
22
17
  html,
23
18
  body {
24
19
  margin: 0;
@@ -30,31 +25,6 @@
30
25
  color: var(--hg-fg);
31
26
  -webkit-font-smoothing: antialiased;
32
27
  }
33
- #scene {
34
- position: absolute;
35
- inset: 0;
36
- width: 1920px;
37
- height: 1080px;
38
- }
39
- .stage {
40
- position: absolute;
41
- inset: 0;
42
- display: flex;
43
- align-items: center;
44
- justify-content: center;
45
- }
46
- .crypt {
47
- font-family: "JetBrains Mono", monospace;
48
- font-weight: 700;
49
- font-size: 200px;
50
- letter-spacing: 0.02em;
51
- color: var(--hg-cyan);
52
- text-shadow: 0 0 30px rgba(42, 255, 240, 0.5);
53
- }
54
- .crypt .char {
55
- display: inline-block;
56
- min-width: 1ch;
57
- }
58
28
  </style>
59
29
  </head>
60
30
  <body>
@@ -66,55 +36,19 @@
66
36
  data-width="1920"
67
37
  data-height="1080"
68
38
  >
69
- <div id="scene" class="clip" data-start="0" data-duration="2" data-track-index="1">
70
- <div class="stage">
71
- <div class="crypt">
72
- <span class="char" data-target="D">_</span><span class="char" data-target="E">_</span
73
- ><span class="char" data-target="C">_</span><span class="char" data-target="R">_</span
74
- ><span class="char" data-target="Y">_</span><span class="char" data-target="P">_</span
75
- ><span class="char" data-target="T">_</span>
76
- </div>
77
- </div>
78
- </div>
39
+ <div
40
+ id="scene"
41
+ class="clip"
42
+ data-composition-id="binary-decrypt"
43
+ data-composition-src="scene.html"
44
+ data-start="0"
45
+ data-duration="2"
46
+ data-track-index="1"
47
+ ></div>
79
48
  </div>
80
49
  <script>
81
50
  window.__timelines = window.__timelines || {};
82
- const tl = gsap.timeline({ paused: true });
83
-
84
- const SCRAMBLE = "01█▓▒░▀▄■◆◇▪▫";
85
- function scrambleChar(charIdx, phase) {
86
- const tick = Math.floor(phase * 60);
87
- const i = (charIdx * 7 + tick * 13 + 3) % SCRAMBLE.length;
88
- return SCRAMBLE.charAt(i);
89
- }
90
- const cryptState = [{ p: 0 }, { p: 0 }, { p: 0 }, { p: 0 }, { p: 0 }, { p: 0 }, { p: 0 }];
91
- cryptState.forEach((state, idx) => {
92
- tl.to(
93
- state,
94
- {
95
- p: 1,
96
- duration: 0.85,
97
- delay: idx * 0.05,
98
- ease: "power2.out",
99
- onUpdate: function () {
100
- const spans = document.querySelectorAll(".crypt .char");
101
- const span = spans[idx];
102
- if (!span) return;
103
- const target = span.getAttribute("data-target");
104
- if (state.p >= 0.72) {
105
- span.textContent = target;
106
- span.style.color = "var(--hg-fg)";
107
- span.style.textShadow = "0 0 30px rgba(168, 85, 247, 0.8)";
108
- } else {
109
- span.textContent = scrambleChar(idx, state.p);
110
- }
111
- },
112
- },
113
- 0.15,
114
- );
115
- });
116
-
117
- window.__timelines["main"] = tl;
51
+ window.__timelines["main"] = gsap.timeline({ paused: true });
118
52
  </script>
119
53
  </body>
120
54
  </html>
@@ -0,0 +1,85 @@
1
+ <template id="binary-decrypt-template">
2
+ <div data-composition-id="binary-decrypt" data-width="1920" data-height="1080" data-duration="2">
3
+ <style>
4
+ :root {
5
+ --hg-violet: #7c3aed;
6
+ --hg-violet-2: #a855f7;
7
+ --hg-cyan: #2afff0;
8
+ --hg-bg: #0a0a0f;
9
+ --hg-fg: #f5f5fa;
10
+ --hg-dim: #6b6b78;
11
+ }
12
+ * {
13
+ margin: 0;
14
+ padding: 0;
15
+ box-sizing: border-box;
16
+ }
17
+ .stage {
18
+ position: absolute;
19
+ inset: 0;
20
+ display: flex;
21
+ align-items: center;
22
+ justify-content: center;
23
+ }
24
+ .crypt {
25
+ font-family: "JetBrains Mono", monospace;
26
+ font-weight: 700;
27
+ font-size: 200px;
28
+ letter-spacing: 0.02em;
29
+ color: var(--hg-cyan);
30
+ text-shadow: 0 0 30px rgba(42, 255, 240, 0.5);
31
+ }
32
+ .crypt .char {
33
+ display: inline-block;
34
+ min-width: 1ch;
35
+ }
36
+ </style>
37
+ <div class="stage">
38
+ <div class="crypt">
39
+ <span class="char" data-target="D">_</span><span class="char" data-target="E">_</span
40
+ ><span class="char" data-target="C">_</span><span class="char" data-target="R">_</span
41
+ ><span class="char" data-target="Y">_</span><span class="char" data-target="P">_</span
42
+ ><span class="char" data-target="T">_</span>
43
+ </div>
44
+ </div>
45
+ <script>
46
+ window.__timelines = window.__timelines || {};
47
+ const tl = gsap.timeline({ paused: true });
48
+
49
+ const SCRAMBLE = "01█▓▒░▀▄■◆◇▪▫";
50
+ function scrambleChar(charIdx, phase) {
51
+ const tick = Math.floor(phase * 60);
52
+ const i = (charIdx * 7 + tick * 13 + 3) % SCRAMBLE.length;
53
+ return SCRAMBLE.charAt(i);
54
+ }
55
+ const cryptState = [{ p: 0 }, { p: 0 }, { p: 0 }, { p: 0 }, { p: 0 }, { p: 0 }, { p: 0 }];
56
+ cryptState.forEach((state, idx) => {
57
+ tl.to(
58
+ state,
59
+ {
60
+ p: 1,
61
+ duration: 0.85,
62
+ delay: idx * 0.05,
63
+ ease: "power2.out",
64
+ onUpdate: function () {
65
+ const spans = document.querySelectorAll(".crypt .char");
66
+ const span = spans[idx];
67
+ if (!span) return;
68
+ const target = span.getAttribute("data-target");
69
+ if (state.p >= 0.72) {
70
+ span.textContent = target;
71
+ span.style.color = "var(--hg-fg)";
72
+ span.style.textShadow = "0 0 30px rgba(168, 85, 247, 0.8)";
73
+ } else {
74
+ span.textContent = scrambleChar(idx, state.p);
75
+ }
76
+ },
77
+ },
78
+ 0.15,
79
+ );
80
+ });
81
+
82
+ window.__timelines["binary-decrypt"] = tl;
83
+ </script>
84
+ </div>
85
+ </template>
@@ -13,11 +13,6 @@
13
13
  --hg-fg: #f5f5fa;
14
14
  --hg-dim: #6b6b78;
15
15
  }
16
- * {
17
- margin: 0;
18
- padding: 0;
19
- box-sizing: border-box;
20
- }
21
16
  html,
22
17
  body {
23
18
  margin: 0;
@@ -29,28 +24,6 @@
29
24
  color: var(--hg-fg);
30
25
  -webkit-font-smoothing: antialiased;
31
26
  }
32
- #scene {
33
- position: absolute;
34
- inset: 0;
35
- width: 1920px;
36
- height: 1080px;
37
- }
38
- .stage {
39
- position: absolute;
40
- inset: 0;
41
- display: flex;
42
- align-items: center;
43
- justify-content: center;
44
- }
45
- .hero {
46
- font-weight: 900;
47
- font-size: 320px;
48
- letter-spacing: -0.04em;
49
- line-height: 0.95;
50
- color: var(--hg-fg);
51
- white-space: nowrap;
52
- will-change: filter, transform, opacity;
53
- }
54
27
  </style>
55
28
  </head>
56
29
  <body>
@@ -62,34 +35,19 @@
62
35
  data-width="1920"
63
36
  data-height="1080"
64
37
  >
65
- <div id="scene" class="clip" data-start="0" data-duration="2" data-track-index="1">
66
- <div class="stage">
67
- <div class="hero" id="hero">FOCUS</div>
68
- </div>
69
- </div>
38
+ <div
39
+ id="scene"
40
+ class="clip"
41
+ data-composition-id="blur-resolve"
42
+ data-composition-src="scene.html"
43
+ data-start="0"
44
+ data-duration="2"
45
+ data-track-index="1"
46
+ ></div>
70
47
  </div>
71
48
  <script>
72
49
  window.__timelines = window.__timelines || {};
73
- const tl = gsap.timeline({ paused: true });
74
-
75
- // Resolve: heavy blur + scaled-up + dim settles into perfect crisp focus.
76
- tl.fromTo(
77
- "#hero",
78
- { filter: "blur(36px)", scale: 1.08, opacity: 0.25 },
79
- { filter: "blur(0px)", scale: 1, opacity: 1, duration: 0.7, ease: "power2.out" },
80
- 0.05,
81
- );
82
-
83
- // Hold crisp through the middle (no keys needed — state persists to ~1.5).
84
-
85
- // Blur-out near the end: brief defocus + dim, a cut-away that loops seamlessly.
86
- tl.to(
87
- "#hero",
88
- { filter: "blur(24px)", opacity: 0.25, duration: 0.25, ease: "power2.in" },
89
- 1.7,
90
- );
91
-
92
- window.__timelines["main"] = tl;
50
+ window.__timelines["main"] = gsap.timeline({ paused: true });
93
51
  </script>
94
52
  </body>
95
53
  </html>
@@ -0,0 +1,60 @@
1
+ <template id="blur-resolve-template">
2
+ <div data-composition-id="blur-resolve" data-width="1920" data-height="1080" data-duration="2">
3
+ <style>
4
+ :root {
5
+ --hg-violet: #7c3aed;
6
+ --hg-violet-2: #a855f7;
7
+ --hg-bg: #0a0a0f;
8
+ --hg-fg: #f5f5fa;
9
+ --hg-dim: #6b6b78;
10
+ }
11
+ * {
12
+ margin: 0;
13
+ padding: 0;
14
+ box-sizing: border-box;
15
+ }
16
+ .stage {
17
+ position: absolute;
18
+ inset: 0;
19
+ display: flex;
20
+ align-items: center;
21
+ justify-content: center;
22
+ }
23
+ .hero {
24
+ font-weight: 900;
25
+ font-size: 320px;
26
+ letter-spacing: -0.04em;
27
+ line-height: 0.95;
28
+ color: var(--hg-fg);
29
+ white-space: nowrap;
30
+ will-change: filter, transform, opacity;
31
+ }
32
+ </style>
33
+ <div class="stage">
34
+ <div class="hero" id="hero">FOCUS</div>
35
+ </div>
36
+ <script>
37
+ window.__timelines = window.__timelines || {};
38
+ const tl = gsap.timeline({ paused: true });
39
+
40
+ // Resolve: heavy blur + scaled-up + dim settles into perfect crisp focus.
41
+ tl.fromTo(
42
+ "#hero",
43
+ { filter: "blur(36px)", scale: 1.08, opacity: 0.25 },
44
+ { filter: "blur(0px)", scale: 1, opacity: 1, duration: 0.7, ease: "power2.out" },
45
+ 0.05,
46
+ );
47
+
48
+ // Hold crisp through the middle (no keys needed — state persists to ~1.5).
49
+
50
+ // Blur-out near the end: brief defocus + dim, a cut-away that loops seamlessly.
51
+ tl.to(
52
+ "#hero",
53
+ { filter: "blur(24px)", opacity: 0.25, duration: 0.25, ease: "power2.in" },
54
+ 1.7,
55
+ );
56
+
57
+ window.__timelines["blur-resolve"] = tl;
58
+ </script>
59
+ </div>
60
+ </template>