@mevdragon/vidfarm-devcli 0.14.0 → 0.16.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 (427) hide show
  1. package/.agents/skills/embedded-captions/CATALOG.md +93 -0
  2. package/.agents/skills/embedded-captions/SKILL.md +286 -0
  3. package/.agents/skills/embedded-captions/assets/brand/CDPR-fankit-terms.txt +35 -0
  4. package/.agents/skills/embedded-captions/assets/brand/cyberpunk-widths.json +115 -0
  5. package/.agents/skills/embedded-captions/assets/fonts/char-widths.json +2211 -0
  6. package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScript1.svg +242 -0
  7. package/.agents/skills/embedded-captions/assets/strokefonts/HersheyScriptMed.svg +242 -0
  8. package/.agents/skills/embedded-captions/dna/README.md +148 -0
  9. package/.agents/skills/embedded-captions/dna/chrome.json +68 -0
  10. package/.agents/skills/embedded-captions/dna/cream.json +69 -0
  11. package/.agents/skills/embedded-captions/dna/documentary.json +62 -0
  12. package/.agents/skills/embedded-captions/dna/editorial.json +70 -0
  13. package/.agents/skills/embedded-captions/dna/glitch.json +82 -0
  14. package/.agents/skills/embedded-captions/dna/ink.json +65 -0
  15. package/.agents/skills/embedded-captions/dna/keynote.json +62 -0
  16. package/.agents/skills/embedded-captions/dna/loud.json +75 -0
  17. package/.agents/skills/embedded-captions/dna/neon.json +58 -0
  18. package/.agents/skills/embedded-captions/dna/velocity.json +89 -0
  19. package/.agents/skills/embedded-captions/modes/cinematic/README.md +48 -0
  20. package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/spec.md +98 -0
  21. package/.agents/skills/embedded-captions/modes/cinematic/_archive/champion/template.html +188 -0
  22. package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/spec.md +134 -0
  23. package/.agents/skills/embedded-captions/modes/cinematic/_archive/memory-wall/template.html +179 -0
  24. package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/spec.md +81 -0
  25. package/.agents/skills/embedded-captions/modes/cinematic/_archive/portrait-header/template.html +170 -0
  26. package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/spec.md +16 -0
  27. package/.agents/skills/embedded-captions/modes/cinematic/cinematic-cream/template.html +226 -0
  28. package/.agents/skills/embedded-captions/modes/cinematic/engine.html +355 -0
  29. package/.agents/skills/embedded-captions/modes/standard/_anatomy.md +233 -0
  30. package/.agents/skills/embedded-captions/modes/standard/_motion.md +192 -0
  31. package/.agents/skills/embedded-captions/modes/standard/fonts/build-fonts-css.cjs +97 -0
  32. package/.agents/skills/embedded-captions/references/aesthetic-principles.md +168 -0
  33. package/.agents/skills/embedded-captions/references/anti-patterns.md +188 -0
  34. package/.agents/skills/embedded-captions/references/bespoke-vs-presets.md +178 -0
  35. package/.agents/skills/embedded-captions/references/caption-grouping.md +130 -0
  36. package/.agents/skills/embedded-captions/references/composition-craft.md +522 -0
  37. package/.agents/skills/embedded-captions/references/direction-catalog.md +138 -0
  38. package/.agents/skills/embedded-captions/references/example-renders/champion.html +371 -0
  39. package/.agents/skills/embedded-captions/references/example-renders/memory-wall.html +334 -0
  40. package/.agents/skills/embedded-captions/references/failure-modes.md +145 -0
  41. package/.agents/skills/embedded-captions/references/layout-heuristics.md +238 -0
  42. package/.agents/skills/embedded-captions/references/motion-vocabulary.md +148 -0
  43. package/.agents/skills/embedded-captions/references/rail.md +68 -0
  44. package/.agents/skills/embedded-captions/references/reference-bar.md +47 -0
  45. package/.agents/skills/embedded-captions/references/scene-types.md +94 -0
  46. package/.agents/skills/embedded-captions/references/test-set.md +66 -0
  47. package/.agents/skills/embedded-captions/references/typographic-moves.md +266 -0
  48. package/.agents/skills/embedded-captions/references/typography-presets.md +63 -0
  49. package/.agents/skills/embedded-captions/scripts/audio-envelope.cjs +95 -0
  50. package/.agents/skills/embedded-captions/scripts/check-occlusion.cjs +250 -0
  51. package/.agents/skills/embedded-captions/scripts/check-overflow.cjs +194 -0
  52. package/.agents/skills/embedded-captions/scripts/check-rail-climax.cjs +233 -0
  53. package/.agents/skills/embedded-captions/scripts/check-timing.cjs +173 -0
  54. package/.agents/skills/embedded-captions/scripts/fill-timings.cjs +124 -0
  55. package/.agents/skills/embedded-captions/scripts/fit-fonts.cjs +158 -0
  56. package/.agents/skills/embedded-captions/scripts/gen-stroke-path.py +46 -0
  57. package/.agents/skills/embedded-captions/scripts/inject-fonts.cjs +169 -0
  58. package/.agents/skills/embedded-captions/scripts/lib-dna.cjs +201 -0
  59. package/.agents/skills/embedded-captions/scripts/make-cinematic.cjs +1205 -0
  60. package/.agents/skills/embedded-captions/scripts/make-composition.cjs +404 -0
  61. package/.agents/skills/embedded-captions/scripts/make-theme.cjs +8781 -0
  62. package/.agents/skills/embedded-captions/scripts/matte.cjs +294 -0
  63. package/.agents/skills/embedded-captions/scripts/measure-layout.cjs +293 -0
  64. package/.agents/skills/embedded-captions/scripts/prepare.sh +39 -0
  65. package/.agents/skills/embedded-captions/scripts/preview-frames.cjs +268 -0
  66. package/.agents/skills/embedded-captions/scripts/render-and-composite.sh +509 -0
  67. package/.agents/skills/embedded-captions/scripts/render-theme.sh +34 -0
  68. package/.agents/skills/embedded-captions/scripts/safe-zones.cjs +813 -0
  69. package/.agents/skills/embedded-captions/scripts/transcribe.cjs +349 -0
  70. package/.agents/skills/embedded-captions/themes/PORTING.md +49 -0
  71. package/.agents/skills/embedded-captions/themes/README.md +244 -0
  72. package/.agents/skills/embedded-captions/themes/anchor.json +27 -0
  73. package/.agents/skills/embedded-captions/themes/arcade.json +51 -0
  74. package/.agents/skills/embedded-captions/themes/aurora.json +41 -0
  75. package/.agents/skills/embedded-captions/themes/biolume.json +35 -0
  76. package/.agents/skills/embedded-captions/themes/brush.json +74 -0
  77. package/.agents/skills/embedded-captions/themes/chalkboard.json +52 -0
  78. package/.agents/skills/embedded-captions/themes/dossier.json +56 -0
  79. package/.agents/skills/embedded-captions/themes/graffiti.json +62 -0
  80. package/.agents/skills/embedded-captions/themes/hologram.json +41 -0
  81. package/.agents/skills/embedded-captions/themes/inkwater.json +43 -0
  82. package/.agents/skills/embedded-captions/themes/laser.json +46 -0
  83. package/.agents/skills/embedded-captions/themes/lastpage.json +33 -0
  84. package/.agents/skills/embedded-captions/themes/neonsign.json +53 -0
  85. package/.agents/skills/embedded-captions/themes/nightcity.json +56 -0
  86. package/.agents/skills/embedded-captions/themes/ordnance.json +54 -0
  87. package/.agents/skills/embedded-captions/themes/papercut.json +37 -0
  88. package/.agents/skills/embedded-captions/themes/popup.json +46 -0
  89. package/.agents/skills/embedded-captions/themes/ransom.json +62 -0
  90. package/.agents/skills/embedded-captions/themes/scoreboard.json +54 -0
  91. package/.agents/skills/embedded-captions/themes/spectrum.json +46 -0
  92. package/.agents/skills/embedded-captions/themes/stardust.json +29 -0
  93. package/.agents/skills/embedded-captions/themes/stomp.json +43 -0
  94. package/.agents/skills/embedded-captions/themes/terminal.json +49 -0
  95. package/.agents/skills/embedded-captions/themes/thunder.json +44 -0
  96. package/.agents/skills/embedded-captions/themes/transit.json +44 -0
  97. package/.agents/skills/embedded-captions/themes/vhs.json +47 -0
  98. package/.agents/skills/faceless-explainer/SKILL.md +209 -0
  99. package/.agents/skills/faceless-explainer/references/cut-catalog.md +215 -0
  100. package/.agents/skills/faceless-explainer/references/motion-language.md +156 -0
  101. package/.agents/skills/faceless-explainer/references/story-design.md +248 -0
  102. package/.agents/skills/faceless-explainer/references/visual-design.md +146 -0
  103. package/.agents/skills/faceless-explainer/scripts/assemble-index.mjs +570 -0
  104. package/.agents/skills/faceless-explainer/scripts/audio.mjs +260 -0
  105. package/.agents/skills/faceless-explainer/scripts/build-frame.mjs +536 -0
  106. package/.agents/skills/faceless-explainer/scripts/captions.mjs +508 -0
  107. package/.agents/skills/faceless-explainer/scripts/lib/assets.mjs +55 -0
  108. package/.agents/skills/faceless-explainer/scripts/lib/dimensions.mjs +45 -0
  109. package/.agents/skills/faceless-explainer/scripts/lib/storyboard.mjs +249 -0
  110. package/.agents/skills/faceless-explainer/scripts/lib/tokens.mjs +204 -0
  111. package/.agents/skills/faceless-explainer/scripts/lib/transition-registry.mjs +38 -0
  112. package/.agents/skills/faceless-explainer/scripts/lib/transitions.json +71 -0
  113. package/.agents/skills/faceless-explainer/scripts/transitions.mjs +320 -0
  114. package/.agents/skills/faceless-explainer/sub-agents/frame-worker.md +75 -0
  115. package/.agents/skills/flockposter/LICENSE +17 -0
  116. package/.agents/skills/flockposter/README.md +72 -0
  117. package/.agents/skills/flockposter/SKILL.md +562 -0
  118. package/.agents/skills/flockposter/examples/cli-instagram-reel.sh +21 -0
  119. package/.agents/skills/flockposter/examples/cli-multi-platform.json +69 -0
  120. package/.agents/skills/flockposter/examples/cli-tiktok-upload-only.sh +22 -0
  121. package/.agents/skills/flockposter/examples/cli-x-thread.sh +17 -0
  122. package/.agents/skills/flockposter/examples/cli-youtube-short.sh +21 -0
  123. package/.agents/skills/flockposter/examples/public-api-instagram-reel.json +28 -0
  124. package/.agents/skills/general-video/SKILL.md +143 -0
  125. package/.agents/skills/hyperframes/SKILL.md +160 -0
  126. package/.agents/skills/hyperframes-animation/SKILL.md +84 -0
  127. package/.agents/skills/hyperframes-animation/adapters/animate-text.md +64 -0
  128. package/.agents/skills/hyperframes-animation/adapters/animejs.md +114 -0
  129. package/.agents/skills/hyperframes-animation/adapters/css-animations.md +143 -0
  130. package/.agents/skills/hyperframes-animation/adapters/gsap-easing-and-stagger.md +118 -0
  131. package/.agents/skills/hyperframes-animation/adapters/gsap-timeline-and-labels.md +96 -0
  132. package/.agents/skills/hyperframes-animation/adapters/gsap-transforms-and-perf.md +96 -0
  133. package/.agents/skills/hyperframes-animation/adapters/gsap.md +105 -0
  134. package/.agents/skills/hyperframes-animation/adapters/html-in-canvas-patterns.md +507 -0
  135. package/.agents/skills/hyperframes-animation/adapters/lottie.md +117 -0
  136. package/.agents/skills/hyperframes-animation/adapters/three.md +131 -0
  137. package/.agents/skills/hyperframes-animation/adapters/typegpu.md +178 -0
  138. package/.agents/skills/hyperframes-animation/adapters/waapi.md +101 -0
  139. package/.agents/skills/hyperframes-animation/blueprints/comparison-split.md +27 -0
  140. package/.agents/skills/hyperframes-animation/blueprints/constellation-hub.md +44 -0
  141. package/.agents/skills/hyperframes-animation/blueprints/cta-morph-press.md +28 -0
  142. package/.agents/skills/hyperframes-animation/blueprints/cursor-ui-demo.md +57 -0
  143. package/.agents/skills/hyperframes-animation/blueprints/dataviz-countup.md +46 -0
  144. package/.agents/skills/hyperframes-animation/blueprints/device-surface-showcase.md +53 -0
  145. package/.agents/skills/hyperframes-animation/blueprints/grid-card-assemble.md +66 -0
  146. package/.agents/skills/hyperframes-animation/blueprints/kinetic-type-beats.md +78 -0
  147. package/.agents/skills/hyperframes-animation/blueprints/logo-assemble-lockup.md +69 -0
  148. package/.agents/skills/hyperframes-animation/blueprints/overwhelm-surround.md +28 -0
  149. package/.agents/skills/hyperframes-animation/blueprints/spatial-pan-stations.md +37 -0
  150. package/.agents/skills/hyperframes-animation/blueprints/ticker-takeover.md +29 -0
  151. package/.agents/skills/hyperframes-animation/blueprints/titlecard-reveal.md +42 -0
  152. package/.agents/skills/hyperframes-animation/blueprints/typewriter-reveal.md +51 -0
  153. package/.agents/skills/hyperframes-animation/blueprints/video-text-pivot.md +30 -0
  154. package/.agents/skills/hyperframes-animation/blueprints-index.md +146 -0
  155. package/.agents/skills/hyperframes-animation/examples/assets/avatars/02.avif +0 -0
  156. package/.agents/skills/hyperframes-animation/examples/assets/brands/github.avif +0 -0
  157. package/.agents/skills/hyperframes-animation/examples/assets/brands/nvidia.avif +0 -0
  158. package/.agents/skills/hyperframes-animation/examples/assets/brands/visa.avif +0 -0
  159. package/.agents/skills/hyperframes-animation/examples/assets/brands/zoominfo.avif +0 -0
  160. package/.agents/skills/hyperframes-animation/examples/brand-reveal-assemble-zoom.html +382 -0
  161. package/.agents/skills/hyperframes-animation/examples/comparison-split-cards.html +649 -0
  162. package/.agents/skills/hyperframes-animation/examples/concept-demo-decode-pan.html +520 -0
  163. package/.agents/skills/hyperframes-animation/examples/cta-morph-press.html +468 -0
  164. package/.agents/skills/hyperframes-animation/examples/cta-orbit-collapse.html +1298 -0
  165. package/.agents/skills/hyperframes-animation/examples/demo-page-scroll-spotlight.html +759 -0
  166. package/.agents/skills/hyperframes-animation/examples/hook-counter-burst.html +729 -0
  167. package/.agents/skills/hyperframes-animation/examples/messaging-multi-phrase.html +352 -0
  168. package/.agents/skills/hyperframes-animation/examples/metric-video-text-pivot.html +779 -0
  169. package/.agents/skills/hyperframes-animation/examples/problem-mockup-overwhelm.html +1374 -0
  170. package/.agents/skills/hyperframes-animation/examples/proof-logo-chain.html +861 -0
  171. package/.agents/skills/hyperframes-animation/examples/takeover-ticker-displace.html +347 -0
  172. package/.agents/skills/hyperframes-animation/examples/workflow-approve-press.html +606 -0
  173. package/.agents/skills/hyperframes-animation/rules/3d-page-scroll.md +227 -0
  174. package/.agents/skills/hyperframes-animation/rules/3d-text-depth-layers.md +297 -0
  175. package/.agents/skills/hyperframes-animation/rules/ai-tracking-box.md +382 -0
  176. package/.agents/skills/hyperframes-animation/rules/ambient-glow-bloom.md +305 -0
  177. package/.agents/skills/hyperframes-animation/rules/asr-keyword-glow.md +286 -0
  178. package/.agents/skills/hyperframes-animation/rules/avatar-cloud-network.md +371 -0
  179. package/.agents/skills/hyperframes-animation/rules/camera-cursor-tracking.md +246 -0
  180. package/.agents/skills/hyperframes-animation/rules/card-morph-anchor.md +267 -0
  181. package/.agents/skills/hyperframes-animation/rules/center-outward-expansion.md +227 -0
  182. package/.agents/skills/hyperframes-animation/rules/context-sensitive-cursor.md +257 -0
  183. package/.agents/skills/hyperframes-animation/rules/coordinate-target-zoom.md +332 -0
  184. package/.agents/skills/hyperframes-animation/rules/counting-dynamic-scale.md +283 -0
  185. package/.agents/skills/hyperframes-animation/rules/css-marker-patterns.md +373 -0
  186. package/.agents/skills/hyperframes-animation/rules/cursor-click-ripple.md +262 -0
  187. package/.agents/skills/hyperframes-animation/rules/depth-of-field-blur.md +313 -0
  188. package/.agents/skills/hyperframes-animation/rules/depth-scatter-assemble.md +303 -0
  189. package/.agents/skills/hyperframes-animation/rules/discrete-text-sequence.md +273 -0
  190. package/.agents/skills/hyperframes-animation/rules/dynamic-content-sequencing.md +307 -0
  191. package/.agents/skills/hyperframes-animation/rules/gsap-effects.md +299 -0
  192. package/.agents/skills/hyperframes-animation/rules/hacker-flip-3d.md +223 -0
  193. package/.agents/skills/hyperframes-animation/rules/kinetic-beat-slam.md +183 -0
  194. package/.agents/skills/hyperframes-animation/rules/motion-blur-streak.md +328 -0
  195. package/.agents/skills/hyperframes-animation/rules/multi-phase-camera.md +273 -0
  196. package/.agents/skills/hyperframes-animation/rules/orbit-3d-entry.md +301 -0
  197. package/.agents/skills/hyperframes-animation/rules/physics-press-reaction.md +350 -0
  198. package/.agents/skills/hyperframes-animation/rules/press-release-spring.md +296 -0
  199. package/.agents/skills/hyperframes-animation/rules/reactive-displacement.md +277 -0
  200. package/.agents/skills/hyperframes-animation/rules/scale-swap-transition.md +298 -0
  201. package/.agents/skills/hyperframes-animation/rules/sine-wave-loop.md +278 -0
  202. package/.agents/skills/hyperframes-animation/rules/split-tilt-cards.md +277 -0
  203. package/.agents/skills/hyperframes-animation/rules/spring-pop-entrance.md +273 -0
  204. package/.agents/skills/hyperframes-animation/rules/stat-bars-and-fills.md +156 -0
  205. package/.agents/skills/hyperframes-animation/rules/svg-icon-enrichment.md +329 -0
  206. package/.agents/skills/hyperframes-animation/rules/svg-path-draw.md +274 -0
  207. package/.agents/skills/hyperframes-animation/rules/vertical-spring-ticker.md +239 -0
  208. package/.agents/skills/hyperframes-animation/rules/viewport-change.md +349 -0
  209. package/.agents/skills/hyperframes-animation/rules-index.md +86 -0
  210. package/.agents/skills/hyperframes-animation/scripts/animation-map.mjs +606 -0
  211. package/.agents/skills/hyperframes-animation/scripts/package-loader.mjs +288 -0
  212. package/.agents/skills/hyperframes-animation/scripts/package-loader.test.mjs +62 -0
  213. package/.agents/skills/hyperframes-animation/techniques.md +507 -0
  214. package/.agents/skills/hyperframes-animation/transitions/TRANSITION-REGISTRY.md +167 -0
  215. package/.agents/skills/hyperframes-animation/transitions/catalog.md +127 -0
  216. package/.agents/skills/hyperframes-animation/transitions/css-3d.md +12 -0
  217. package/.agents/skills/hyperframes-animation/transitions/css-blur.md +51 -0
  218. package/.agents/skills/hyperframes-animation/transitions/css-cover.md +43 -0
  219. package/.agents/skills/hyperframes-animation/transitions/css-destruction.md +95 -0
  220. package/.agents/skills/hyperframes-animation/transitions/css-dissolve.md +66 -0
  221. package/.agents/skills/hyperframes-animation/transitions/css-distortion.md +45 -0
  222. package/.agents/skills/hyperframes-animation/transitions/css-grid.md +10 -0
  223. package/.agents/skills/hyperframes-animation/transitions/css-light.md +49 -0
  224. package/.agents/skills/hyperframes-animation/transitions/css-mechanical.md +30 -0
  225. package/.agents/skills/hyperframes-animation/transitions/css-other.md +25 -0
  226. package/.agents/skills/hyperframes-animation/transitions/css-push.md +41 -0
  227. package/.agents/skills/hyperframes-animation/transitions/css-radial.md +37 -0
  228. package/.agents/skills/hyperframes-animation/transitions/css-scale.md +24 -0
  229. package/.agents/skills/hyperframes-animation/transitions/overview.md +153 -0
  230. package/.agents/skills/hyperframes-cli/SKILL.md +113 -0
  231. package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
  232. package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +55 -0
  233. package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
  234. package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
  235. package/.agents/skills/hyperframes-cli/references/preview-render.md +149 -0
  236. package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
  237. package/.agents/skills/hyperframes-core/SKILL.md +78 -0
  238. package/.agents/skills/hyperframes-core/references/composition-patterns.md +263 -0
  239. package/.agents/skills/hyperframes-core/references/data-attributes.md +70 -0
  240. package/.agents/skills/hyperframes-core/references/determinism-rules.md +68 -0
  241. package/.agents/skills/hyperframes-core/references/full-screen-motion.md +62 -0
  242. package/.agents/skills/hyperframes-core/references/minimal-composition.md +66 -0
  243. package/.agents/skills/hyperframes-core/references/script-format.md +49 -0
  244. package/.agents/skills/hyperframes-core/references/storyboard-format.md +95 -0
  245. package/.agents/skills/hyperframes-core/references/sub-compositions.md +237 -0
  246. package/.agents/skills/hyperframes-core/references/subagent-dispatch.md +41 -0
  247. package/.agents/skills/hyperframes-core/references/tailwind.md +125 -0
  248. package/.agents/skills/hyperframes-core/references/tracks-and-clips.md +76 -0
  249. package/.agents/skills/hyperframes-core/references/variables-and-media.md +90 -0
  250. package/.agents/skills/hyperframes-creative/SKILL.md +70 -0
  251. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/FRAME.md +289 -0
  252. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/caption-skin.html +221 -0
  253. package/.agents/skills/hyperframes-creative/frame-presets/biennale-yellow/frame-showcase.html +1214 -0
  254. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/FRAME.md +275 -0
  255. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/caption-skin.html +224 -0
  256. package/.agents/skills/hyperframes-creative/frame-presets/blockframe/frame-showcase.html +1347 -0
  257. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/FRAME.md +307 -0
  258. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/caption-skin.html +223 -0
  259. package/.agents/skills/hyperframes-creative/frame-presets/blue-professional/frame-showcase.html +1372 -0
  260. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/FRAME.md +275 -0
  261. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/caption-skin.html +230 -0
  262. package/.agents/skills/hyperframes-creative/frame-presets/bold-poster/frame-showcase.html +1140 -0
  263. package/.agents/skills/hyperframes-creative/frame-presets/broadside/FRAME.md +284 -0
  264. package/.agents/skills/hyperframes-creative/frame-presets/broadside/caption-skin.html +225 -0
  265. package/.agents/skills/hyperframes-creative/frame-presets/broadside/frame-showcase.html +1166 -0
  266. package/.agents/skills/hyperframes-creative/frame-presets/capsule/FRAME.md +284 -0
  267. package/.agents/skills/hyperframes-creative/frame-presets/capsule/caption-skin.html +224 -0
  268. package/.agents/skills/hyperframes-creative/frame-presets/capsule/frame-showcase.html +1465 -0
  269. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/FRAME.md +278 -0
  270. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/caption-skin.html +222 -0
  271. package/.agents/skills/hyperframes-creative/frame-presets/cartesian/frame-showcase.html +1263 -0
  272. package/.agents/skills/hyperframes-creative/frame-presets/claude/FRAME.md +277 -0
  273. package/.agents/skills/hyperframes-creative/frame-presets/claude/caption-skin.html +224 -0
  274. package/.agents/skills/hyperframes-creative/frame-presets/claude/frame-showcase.html +1439 -0
  275. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/FRAME.md +265 -0
  276. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/caption-skin.html +238 -0
  277. package/.agents/skills/hyperframes-creative/frame-presets/cobalt-grid/frame-showcase.html +1468 -0
  278. package/.agents/skills/hyperframes-creative/frame-presets/coral/FRAME.md +314 -0
  279. package/.agents/skills/hyperframes-creative/frame-presets/coral/caption-skin.html +226 -0
  280. package/.agents/skills/hyperframes-creative/frame-presets/coral/frame-showcase.html +1268 -0
  281. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/FRAME.md +333 -0
  282. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/caption-skin.html +227 -0
  283. package/.agents/skills/hyperframes-creative/frame-presets/creative-mode/frame-showcase.html +1330 -0
  284. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/FRAME.md +274 -0
  285. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/caption-skin.html +230 -0
  286. package/.agents/skills/hyperframes-creative/frame-presets/daisy-days/frame-showcase.html +1444 -0
  287. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/FRAME.md +265 -0
  288. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/caption-skin.html +223 -0
  289. package/.agents/skills/hyperframes-creative/frame-presets/editorial-forest/frame-showcase.html +1273 -0
  290. package/.agents/skills/hyperframes-creative/palettes/bold-energetic.md +14 -0
  291. package/.agents/skills/hyperframes-creative/palettes/clean-corporate.md +14 -0
  292. package/.agents/skills/hyperframes-creative/palettes/dark-premium.md +14 -0
  293. package/.agents/skills/hyperframes-creative/palettes/jewel-rich.md +14 -0
  294. package/.agents/skills/hyperframes-creative/palettes/monochrome.md +14 -0
  295. package/.agents/skills/hyperframes-creative/palettes/nature-earth.md +14 -0
  296. package/.agents/skills/hyperframes-creative/palettes/neon-electric.md +14 -0
  297. package/.agents/skills/hyperframes-creative/palettes/pastel-soft.md +14 -0
  298. package/.agents/skills/hyperframes-creative/palettes/warm-editorial.md +14 -0
  299. package/.agents/skills/hyperframes-creative/references/audio-reactive.md +76 -0
  300. package/.agents/skills/hyperframes-creative/references/beat-direction.md +164 -0
  301. package/.agents/skills/hyperframes-creative/references/composition-patterns.md +199 -0
  302. package/.agents/skills/hyperframes-creative/references/data-in-motion.md +19 -0
  303. package/.agents/skills/hyperframes-creative/references/design-adherence.md +19 -0
  304. package/.agents/skills/hyperframes-creative/references/design-picker.md +123 -0
  305. package/.agents/skills/hyperframes-creative/references/design-spec.md +55 -0
  306. package/.agents/skills/hyperframes-creative/references/house-style.md +73 -0
  307. package/.agents/skills/hyperframes-creative/references/motion-principles.md +150 -0
  308. package/.agents/skills/hyperframes-creative/references/narration.md +92 -0
  309. package/.agents/skills/hyperframes-creative/references/prompt-expansion.md +68 -0
  310. package/.agents/skills/hyperframes-creative/references/typography.md +218 -0
  311. package/.agents/skills/hyperframes-creative/references/video-composition.md +63 -0
  312. package/.agents/skills/hyperframes-creative/references/visual-styles.md +457 -0
  313. package/.agents/skills/hyperframes-creative/scripts/contrast-report.mjs +353 -0
  314. package/.agents/skills/hyperframes-creative/scripts/extract-audio-data.py +188 -0
  315. package/.agents/skills/hyperframes-creative/scripts/package-loader.mjs +288 -0
  316. package/.agents/skills/hyperframes-creative/scripts/package-loader.test.mjs +62 -0
  317. package/.agents/skills/hyperframes-creative/templates/design-picker.html +1432 -0
  318. package/.agents/skills/hyperframes-keyframes/SKILL.md +237 -0
  319. package/.agents/skills/hyperframes-keyframes/agents/openai.yaml +4 -0
  320. package/.agents/skills/hyperframes-keyframes/references/keyframe-patterns.md +106 -0
  321. package/.agents/skills/motion-graphics/SKILL.md +172 -0
  322. package/.agents/skills/motion-graphics/agents/builder.md +40 -0
  323. package/.agents/skills/motion-graphics/agents/director.md +53 -0
  324. package/.agents/skills/motion-graphics/agents/finalize.md +17 -0
  325. package/.agents/skills/motion-graphics/catalog-map.md +40 -0
  326. package/.agents/skills/motion-graphics/categories/asset-fusion/module.md +37 -0
  327. package/.agents/skills/motion-graphics/categories/charts/module.md +21 -0
  328. package/.agents/skills/motion-graphics/categories/kinetic-type/module.md +19 -0
  329. package/.agents/skills/motion-graphics/categories/logo-reveal/module.md +17 -0
  330. package/.agents/skills/motion-graphics/categories/lower-thirds/module.md +16 -0
  331. package/.agents/skills/motion-graphics/categories/maps/bake-basemap.mjs +273 -0
  332. package/.agents/skills/motion-graphics/categories/maps/module.md +61 -0
  333. package/.agents/skills/motion-graphics/categories/news/module.md +56 -0
  334. package/.agents/skills/motion-graphics/categories/stat/module.md +21 -0
  335. package/.agents/skills/motion-graphics/categories/tweet/module.md +16 -0
  336. package/.agents/skills/motion-graphics/categories/webpage/module.md +21 -0
  337. package/.agents/skills/motion-graphics/grounding/PROTOCOL.md +64 -0
  338. package/.agents/skills/motion-graphics/grounding/locate.mjs +227 -0
  339. package/.agents/skills/motion-graphics/phases/source/guide.md +21 -0
  340. package/.agents/skills/motion-graphics/references/builder-contract.md +38 -0
  341. package/.agents/skills/motion-graphics/references/motion-vocabulary.md +43 -0
  342. package/.agents/skills/motion-graphics/references/shot-plan-ir.md +54 -0
  343. package/.agents/skills/motion-graphics/samples/asset-fusion/_ref-circle-highlight.html +306 -0
  344. package/.agents/skills/product-launch-video/SKILL.md +208 -0
  345. package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
  346. package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
  347. package/.agents/skills/product-launch-video/references/story-design.md +373 -0
  348. package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
  349. package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
  350. package/.agents/skills/product-launch-video/scripts/audio.mjs +260 -0
  351. package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
  352. package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
  353. package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
  354. package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
  355. package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.mjs +36 -0
  356. package/.agents/skills/product-launch-video/scripts/lib/pad-frame-duration.test.mjs +76 -0
  357. package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
  358. package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
  359. package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
  360. package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
  361. package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
  362. package/.agents/skills/product-launch-video/scripts/transitions.mjs +327 -0
  363. package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +75 -0
  364. package/.agents/skills/slideshow/SKILL.md +550 -0
  365. package/.agents/skills/slideshow/references/standalone-harness.md +1020 -0
  366. package/.agents/skills/talking-head-recut/NOTICE.md +39 -0
  367. package/.agents/skills/talking-head-recut/SKILL.md +1195 -0
  368. package/.agents/skills/talking-head-recut/assets/vendor/gsap.min.js +10 -0
  369. package/.agents/skills/talking-head-recut/references/DESIGN_INDEX.md +145 -0
  370. package/.agents/skills/talking-head-recut/references/frames/clean.html +92 -0
  371. package/.agents/skills/talking-head-recut/references/frames/hairline.html +171 -0
  372. package/.agents/skills/talking-head-recut/references/frames/polaroid.html +131 -0
  373. package/.agents/skills/talking-head-recut/references/layouts/overlay.html +164 -0
  374. package/.agents/skills/talking-head-recut/references/layouts/pip.html +143 -0
  375. package/.agents/skills/talking-head-recut/references/layouts/split.html +121 -0
  376. package/.agents/skills/talking-head-recut/references/layouts/stack.html +109 -0
  377. package/.agents/skills/talking-head-recut/references/styles/academic.html +172 -0
  378. package/.agents/skills/talking-head-recut/references/styles/audit.html +170 -0
  379. package/.agents/skills/talking-head-recut/references/styles/editorial.html +189 -0
  380. package/.agents/skills/talking-head-recut/references/styles/geom.html +181 -0
  381. package/.agents/skills/talking-head-recut/references/styles/minimal.html +130 -0
  382. package/.agents/skills/talking-head-recut/references/styles/spotlight.html +142 -0
  383. package/.agents/skills/talking-head-recut/references/styles/swiss.html +188 -0
  384. package/.agents/skills/talking-head-recut/references/styles/terminal.html +196 -0
  385. package/.agents/skills/talking-head-recut/references/styles/whiteboard.html +170 -0
  386. package/.agents/skills/talking-head-recut/references/styles/xhs.html +206 -0
  387. package/.agents/skills/vidfarm-media/SKILL.md +85 -0
  388. package/.agents/skills/vidfarm-media/references/tts.md +54 -0
  389. package/.agents/skills/vidfarm-media/scripts/audio.mjs +628 -0
  390. package/.agents/skills/vidfarm-media/scripts/wait-bgm.mjs +31 -0
  391. package/.agents/skills/website-to-video/SKILL.md +145 -0
  392. package/.agents/skills/website-to-video/assets/sfx/CREDITS.md +35 -0
  393. package/.agents/skills/website-to-video/assets/sfx/manifest.json +97 -0
  394. package/.agents/skills/website-to-video/references/beat-builder-guide.md +263 -0
  395. package/.agents/skills/website-to-video/references/capabilities.md +713 -0
  396. package/.agents/skills/website-to-video/references/step-0-capture.md +55 -0
  397. package/.agents/skills/website-to-video/references/step-1-design.md +333 -0
  398. package/.agents/skills/website-to-video/references/step-2-brief.md +178 -0
  399. package/.agents/skills/website-to-video/references/step-3-storyboard.md +572 -0
  400. package/.agents/skills/website-to-video/references/step-4-vo.md +225 -0
  401. package/.agents/skills/website-to-video/references/step-5-build.md +483 -0
  402. package/.agents/skills/website-to-video/references/step-6-validate.md +341 -0
  403. package/.agents/skills/website-to-video/scripts/w2h-verify.mjs +759 -0
  404. package/SKILL.director.md +37 -0
  405. package/SKILL.platform.md +6 -1
  406. package/demo/dist/app.css +1 -1
  407. package/demo/dist/app.js +369 -85
  408. package/dist/src/app.js +630 -140
  409. package/dist/src/cli.js +529 -12
  410. package/dist/src/composition-runtime.js +262 -3
  411. package/dist/src/config.js +13 -0
  412. package/dist/src/devcli/doctor.js +192 -0
  413. package/dist/src/devcli/hyperframes-cli.js +118 -0
  414. package/dist/src/devcli/skills.js +476 -0
  415. package/dist/src/devcli/stills.js +249 -0
  416. package/dist/src/editor-chat.js +256 -0
  417. package/dist/src/frontend/homepage-client.js +50 -1
  418. package/dist/src/frontend/homepage-shared.js +197 -0
  419. package/dist/src/frontend/homepage-store.js +10 -1
  420. package/dist/src/frontend/homepage-view.js +43 -5
  421. package/dist/src/homepage.js +51 -18
  422. package/dist/src/hyperframes/composition.js +5 -5
  423. package/dist/src/services/composition-lint.js +199 -0
  424. package/dist/src/services/hyperframes.js +67 -13
  425. package/dist/src/services/serverless-records.js +9 -0
  426. package/package.json +2 -1
  427. package/public/assets/homepage-client-app.js +23 -23
@@ -0,0 +1,246 @@
1
+ ---
2
+ name: camera-cursor-tracking
3
+ description: Two-phase virtual camera that locks viewport to a moving focal point with configurable initial positioning.
4
+ metadata:
5
+ tags: camera, tracking, viewport, two-phase, spring
6
+ ---
7
+
8
+ # Two-Phase Camera Cursor Tracking
9
+
10
+ Keeps a horizontally-growing element (e.g. a search bar with typing text, a long URL animating in) visible by switching between two camera modes.
11
+
12
+ ## How It Works
13
+
14
+ Separate **World Space** (the full target element with all content) from **Screen Space** (the viewport). Two phases:
15
+
16
+ - **Phase 1 (Static)** — The world container sits at a fixed initial offset. Camera doesn't move. This anchors the viewer's eye to the composition before tracking begins.
17
+ - **Phase 2 (Tracking)** — Activates when the focal point (cursor, highlight, last typed glyph) exceeds a target screen position (e.g. a configurable fraction `CURSOR_TARGET_FRACTION` of viewport width from the left). The world container translates leftward (`x: -<delta>`) keeping the focal point pinned at that screen position.
18
+
19
+ The offset math is **mathematically continuous** at the phase boundary — at the instant tracking starts, the world position equals what the static phase had. So the transition is seamless.
20
+
21
+ The piecewise form used in code is:
22
+
23
+ ```
24
+ finalWorldX = Math.min(INITIAL_OFFSET, trackingOffset)
25
+ ```
26
+
27
+ `INITIAL_OFFSET` is the static-phase value; `trackingOffset` is whatever shift keeps the focal point at `CURSOR_TARGET_FRACTION × viewportWidth`. While the focal point hasn't grown past the target screen X, `trackingOffset` exceeds `INITIAL_OFFSET` (it's a less-negative number) and `Math.min` returns the static value. Once the focal point would cross the target, `trackingOffset` overtakes `INITIAL_OFFSET` and tracking takes over.
28
+
29
+ ## HTML
30
+
31
+ ```html
32
+ <div
33
+ class="scene"
34
+ id="tracking-scene"
35
+ data-composition-id="tracking-scene"
36
+ data-start="0"
37
+ data-duration="5"
38
+ data-track-index="0"
39
+ >
40
+ <div class="viewport">
41
+ <div class="world">
42
+ <div class="search-bar">
43
+ <span class="text" id="reveal-text">{phrase}</span><span class="cursor">|</span>
44
+ </div>
45
+ </div>
46
+ </div>
47
+ </div>
48
+ ```
49
+
50
+ ## CSS (hero-frame layout)
51
+
52
+ ```css
53
+ .scene {
54
+ position: relative;
55
+ width: 100%;
56
+ height: 100%;
57
+ }
58
+
59
+ .viewport {
60
+ position: absolute;
61
+ inset: 0;
62
+ overflow: hidden; /* clip the world content */
63
+ display: flex;
64
+ align-items: center;
65
+ justify-content: flex-start;
66
+ padding-left: VIEWPORT_PAD_LEFT; /* "left margin" — variation: left-aligned init */
67
+ }
68
+
69
+ .world {
70
+ display: flex;
71
+ align-items: center;
72
+ white-space: nowrap; /* keep text on one line for camera-tracking */
73
+ transform: translateX(0); /* GSAP will animate this */
74
+ }
75
+
76
+ .search-bar {
77
+ font-family: {font};
78
+ font-size: BAR_FONT_SIZE;
79
+ font-weight: BAR_FONT_WEIGHT;
80
+ color: {textColor};
81
+ letter-spacing: BAR_LETTER_SPACING;
82
+ }
83
+
84
+ .search-bar .text {
85
+ /* Width grows as more characters reveal */
86
+ display: inline-block;
87
+ overflow: hidden;
88
+ vertical-align: bottom;
89
+ }
90
+
91
+ .search-bar .cursor {
92
+ display: inline-block;
93
+ width: CURSOR_WIDTH;
94
+ margin-left: CURSOR_GAP;
95
+ background: {accentColor};
96
+ height: CURSOR_HEIGHT_EM;
97
+ vertical-align: bottom;
98
+ /* No `animation: blink` CSS keyframe here — HF renders by seeking a paused
99
+ timeline, and CSS animation clocks are NOT synced to that seek. A CSS
100
+ blink will flicker non-deterministically. Drive cursor blink as a finite
101
+ yoyo tween on the GSAP timeline instead — see GSAP Timeline section. */
102
+ }
103
+ ```
104
+
105
+ ## GSAP Timeline
106
+
107
+ ```html
108
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
109
+ <script>
110
+ window.__timelines = window.__timelines || {};
111
+ const tl = gsap.timeline({ paused: true });
112
+
113
+ // Pre-measure target text width to compute tracking distance.
114
+ // Build the timeline SYNCHRONOUSLY — see Critical Constraints for why
115
+ // a fonts.ready gate causes worker-race flicker.
116
+ const textEl = document.getElementById("reveal-text");
117
+ const fullText = textEl.textContent;
118
+ const targetCursorScreenX = CURSOR_TARGET_FRACTION * VIEWPORT_WIDTH;
119
+ const fullWidth = textEl.scrollWidth; // total text width after full reveal
120
+ const trackingDelta = Math.max(0, VIEWPORT_PAD_LEFT + fullWidth - targetCursorScreenX);
121
+
122
+ // Phase 1 — text reveals progressively; camera holds.
123
+ // Reveal via max-width tween (no layout-property tweens on width/left/top).
124
+ tl.fromTo(
125
+ ".search-bar .text",
126
+ { maxWidth: 0 },
127
+ {
128
+ maxWidth: fullWidth,
129
+ duration: REVEAL_DUR,
130
+ ease: "none", // linear typing rate
131
+ },
132
+ REVEAL_START,
133
+ );
134
+
135
+ // Phase 2 — camera tracks. Begin BEFORE full reveal so the boundary feels
136
+ // continuous (text is still revealing as camera starts moving). The
137
+ // Math.min(INITIAL_OFFSET, trackingOffset) formulation makes the handoff
138
+ // mathematically continuous; see How It Works.
139
+ tl.to(
140
+ ".world",
141
+ {
142
+ x: -trackingDelta,
143
+ duration: TRACK_DUR,
144
+ ease: "power2.inOut",
145
+ },
146
+ TRACK_START,
147
+ );
148
+
149
+ // Cursor blink — GSAP-driven (NEVER CSS @keyframes infinite, which doesn't
150
+ // sync with HF's seek-by-frame). Finite yoyo, repeats computed from scene
151
+ // length so blinks land deterministically across frames.
152
+ const blinkRepeats = Math.ceil(SCENE_DURATION / BLINK_HALF_PERIOD) - 1;
153
+ tl.to(
154
+ ".search-bar .cursor",
155
+ {
156
+ opacity: 0,
157
+ duration: BLINK_HALF_PERIOD,
158
+ ease: "steps(1)", // hard on/off, no fade
159
+ yoyo: true,
160
+ repeat: blinkRepeats,
161
+ },
162
+ 0,
163
+ );
164
+
165
+ window.__timelines["tracking-scene"] = tl;
166
+ </script>
167
+ ```
168
+
169
+ ### Variations
170
+
171
+ - **Centered → Center-Tracked**: set `.viewport { justify-content: center; padding: 0; }`. Camera tracks once the focal point crosses the midline (`CURSOR_TARGET_FRACTION = 0.5`).
172
+ - **Left-Aligned → Right-Tracked**: as written above. Best when content exceeds viewport width from the start.
173
+ - **Continuous typing driver**: replace the `maxWidth` tween with an `onUpdate` typing clock (`charsTyped = Math.floor(progress)`) plus per-frame `measureNodeWidth` to drive the cursor screen X. Required when the typed text is consumed elsewhere in the scene (e.g. by a parent strip's camera offset).
174
+
175
+ ## How to Choose Values
176
+
177
+ - **VIEWPORT_PAD_LEFT** — left-edge padding of the world inside the viewport (Phase 1 anchor X).
178
+ - Range: 0 → ~10% of viewport width
179
+ - Effects: 0 hugs the left edge; larger inset feels more like a centered hero frame
180
+ - Constraints: must match the CSS `padding-left` on `.viewport` or the camera math drifts
181
+ - **VIEWPORT_WIDTH** — the composition's `data-width` in CSS pixels.
182
+ - Constraints: must equal the scene root's `data-width`; never tweened
183
+ - **CURSOR_TARGET_FRACTION** — fraction of viewport width where the focal point locks during Phase 2.
184
+ - Range: 0.5 (center-tracked) → 0.75 (right-leaning, more text visible behind cursor)
185
+ - Effects: lower values leave less revealed text in frame; higher values delay tracking
186
+ - **BAR_FONT_SIZE** — hero element font size.
187
+ - Range: ~8-12% of viewport height; below ~6% reads as a UI widget rather than a cinematic element
188
+ - **BAR_FONT_WEIGHT** — weight of the search-bar text.
189
+ - Range: discrete; 400 for neutral demo text, 700 for hero / headline framing
190
+ - **BAR_LETTER_SPACING** — `letter-spacing` for the bar text.
191
+ - Range: slight negative (tighter, more cinematic) → 0 (default)
192
+ - **CURSOR_WIDTH** — visual cursor stroke width in CSS pixels.
193
+ - Range: ~4-10 px at 1080p; thinner reads as typed text, thicker reads as a block caret
194
+ - **CURSOR_GAP** — `margin-left` between text and cursor.
195
+ - Range: a few px of breathing room; do not exceed the cursor width or it visually detaches
196
+ - **CURSOR_HEIGHT_EM** — cursor height as an em multiple of the font.
197
+ - Range: 0.85-1.0; matches the visual height of the typed glyphs
198
+ - **REVEAL_START** — when Phase 1 typing begins.
199
+ - Constraints: typically 0; if preceded by another phase, ≥ that phase's end + small buffer
200
+ - **REVEAL_DUR** — duration of the Phase 1 reveal tween.
201
+ - Range: scale with character count (target an average per-character cadence in the 0.05-0.15s range)
202
+ - Constraints: must end before `SCENE_DURATION` and ideally overlap slightly with the tracking phase
203
+ - **TRACK_START** — when Phase 2 camera motion begins.
204
+ - Range: usually before reveal completes so the handoff feels continuous; can equal `REVEAL_START` if the focal point is already past the target at t=0
205
+ - Constraints: `TRACK_START < REVEAL_START + REVEAL_DUR` for a smooth crossfade
206
+ - **TRACK_DUR** — duration of the camera pan.
207
+ - Range: 0.8-2.0s; under 0.5s reads as a snap, over 2.5s drags
208
+ - **SCENE_DURATION** — must match the scene root's `data-duration`.
209
+ - Constraints: feeds the blink repeat count; mismatch causes blinks to truncate or run past the end
210
+ - **BLINK_HALF_PERIOD** — half-period of the cursor blink (one on-state OR one off-state).
211
+ - Range: 0.2-0.4s; 0.3s reads as a natural caret blink
212
+ - Constraints: derived value `Math.ceil(SCENE_DURATION / BLINK_HALF_PERIOD) - 1` must be ≥ 0
213
+ - **Ease choices** — discrete:
214
+ - Camera pan: `power2.inOut` or `power3.inOut` for cinematic settle; avoid `back.out` (overshoot reads as UI bounce, not camera)
215
+ - Reveal: `"none"` for linear typing; any easing distorts the per-keystroke cadence
216
+ - Blink: `"steps(1)"` for hard on/off; any easing fades the cursor and breaks the caret feel
217
+
218
+ ## Key Principles
219
+
220
+ - **Measure with `getBoundingClientRect()` / probe nodes**, not by character count × font-size. Proportional fonts have variable glyph widths.
221
+ - **`white-space: nowrap`** on the world — text must stay on one line for camera math to work
222
+ - **Pre-allocate the world width** by setting `maxWidth` at full target width — prevents layout shift mid-tween
223
+ - **Eased camera** (`power2.inOut` / `power3.inOut`), not linear — natural pan feel
224
+ - **Spring-like via easing**, not via stiffness/damping params — GSAP doesn't have a built-in spring, but `back.out(${BOUNCE_FACTOR})` or `power4.out` approximate the settling feel
225
+
226
+ ## Critical Constraints
227
+
228
+ - **Build the timeline SYNCHRONOUSLY, no fonts.ready gate** — HF renders frames in parallel workers, each a fresh browser. If you wrap the timeline build in `document.fonts.ready.then(...)`, some workers will seek frames BEFORE the Promise resolves and find no timeline registered → those frames render at CSS initial state (e.g. `max-width: 0` ⇒ empty text), other workers render correctly → visible flicker between empty and filled. Register `window.__timelines[id] = tl` at script-parse time, even if fonts haven't loaded yet — the camera math can tolerate a few percent width error from fallback-font measurement, but worker-race flicker is unacceptable.
229
+ - **If precise post-font measurement matters**, re-measure inside the tween's `onUpdate` (still deterministic per-frame seek), not via a Promise gate. Or set `font-display: block` on the @font-face to force the browser to wait for the font before painting any text.
230
+ - **Timeline must be paused**: `gsap.timeline({ paused: true })`. Never `tl.play()`
231
+ - **Registry key = `data-composition-id`**: `window.__timelines["tracking-scene"]` must match scene root
232
+ - **Continuous math at phase boundary**: the world's `x` at the moment tracking starts must equal the static-phase offset. The `Math.min(INITIAL_OFFSET, trackingOffset)` formulation guarantees this; do NOT switch to a hard `if (typingProgress > threshold)` branch or the camera will visibly jump.
233
+ - **Inline cursor, not absolutely positioned**: cursor should be a sibling of the text (inline-block) so it follows text flow naturally — absolute positioning misaligns with the camera math
234
+ - **`overflow: hidden` on `.viewport`**: clip the world's left edge as it pans off-screen
235
+ - **Cursor blink via GSAP, NOT CSS `@keyframes ... infinite`** — HF renders by seeking the paused timeline; CSS animation clocks are NOT synchronized with that seek, so any CSS-driven blink will flicker non-deterministically across frames. Always drive blink as a finite yoyo tween on the paused GSAP timeline (repeat count computed from scene length).
236
+
237
+ ## Combinations
238
+
239
+ - [context-sensitive-cursor.md](context-sensitive-cursor.md) — change cursor color/style per text segment during typing
240
+ - [discrete-text-sequence.md](discrete-text-sequence.md) — non-linear text reveals that pair with this camera
241
+
242
+ ## Pairs with HF skills
243
+
244
+ - `/hyperframes-animation` — timeline + tween API
245
+ - `/hyperframes-core` — composition wiring + `data-*` attributes
246
+ - `/hyperframes-cli` — `hyperframes lint` to validate the registry key + duration
@@ -0,0 +1,267 @@
1
+ ---
2
+ name: card-morph-anchor
3
+ description: Container morphs dimensions and border-radius between shots, serving as a visual transition anchor.
4
+ metadata:
5
+ tags: morph, anchor, transition, border-radius, container, shape
6
+ ---
7
+
8
+ # Card Morph Anchor
9
+
10
+ A container smoothly transforms its width, height, border-radius, and (optionally) background between two visual states. The morph itself **IS the shot transition** — no separate transition effect needed. The viewer's eye tracks the morphing container as the anchor between shots.
11
+
12
+ ## How It Works
13
+
14
+ A single GSAP tween animates multiple container properties simultaneously (width / height / border-radius / background). At the same time:
15
+
16
+ 1. **Old content** fades out during the first ~40% of the morph
17
+ 2. **New content** fades in during the last ~40% of the morph
18
+ 3. **Optional final fade** — the morph container itself fades to 0, revealing the actual next-shot element rendered behind it
19
+
20
+ The persistent container provides visual continuity even as content and shape change.
21
+
22
+ ## HTML
23
+
24
+ ```html
25
+ <div
26
+ class="scene"
27
+ id="morph-scene"
28
+ data-composition-id="morph-scene"
29
+ data-start="0"
30
+ data-duration="4"
31
+ data-track-index="0"
32
+ >
33
+ <!-- The persistent morph container -->
34
+ <div class="morph-card">
35
+ <div class="content-old">
36
+ <h2>{shotOneHeadline}</h2>
37
+ <p>{shotOneSubcopy}</p>
38
+ </div>
39
+ <div class="content-new">
40
+ <img src="{shotTwoIcon}" alt="logo" />
41
+ </div>
42
+ </div>
43
+
44
+ <!-- Optional: actual next-shot element behind the morph -->
45
+ <div class="next-shot-anchor">
46
+ <img src="{nextShotAnchor}" alt="anchor" />
47
+ </div>
48
+ </div>
49
+ ```
50
+
51
+ ## CSS (hero-frame layout)
52
+
53
+ Card starts as a wide rectangle (shot 1 state). All properties present from the start; only opacities differ:
54
+
55
+ ```css
56
+ .scene {
57
+ position: relative;
58
+ width: 100%;
59
+ height: 100%;
60
+ display: grid;
61
+ place-items: center;
62
+ }
63
+
64
+ .morph-card {
65
+ position: relative;
66
+ width: {SHOT_ONE_W}px;
67
+ height: {SHOT_ONE_H}px;
68
+ border-radius: {SHOT_ONE_RADIUS}px;
69
+ background: {surfaceShotOne};
70
+ overflow: hidden;
71
+ box-shadow: 0 20px 60px rgba(0, 0, 0, 0.4);
72
+ display: grid;
73
+ place-items: center;
74
+ }
75
+
76
+ .content-old,
77
+ .content-new {
78
+ position: absolute;
79
+ inset: 0;
80
+ display: grid;
81
+ place-items: center;
82
+ padding: 32px;
83
+ }
84
+
85
+ .content-old {
86
+ opacity: 1;
87
+ }
88
+ .content-new {
89
+ opacity: 0;
90
+ }
91
+
92
+ .next-shot-anchor {
93
+ position: absolute;
94
+ left: 50%;
95
+ top: 50%;
96
+ transform: translate(-50%, -50%);
97
+ opacity: 0; /* GSAP fades this in as morph card fades out */
98
+ /* Use DOM ORDER for stacking — render .next-shot-anchor BEFORE .morph-card
99
+ in markup so the morph card is naturally on top. Do NOT use z-index: -1
100
+ and then snap it positive mid-fade — that causes a visible pop. */
101
+ }
102
+ ```
103
+
104
+ ## GSAP Timeline
105
+
106
+ ```html
107
+ <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
108
+ <script>
109
+ window.__timelines = window.__timelines || {};
110
+ const tl = gsap.timeline({ paused: true });
111
+
112
+ // Named constants — assign in your example only. See "How to Choose Values".
113
+ const HOLD_BEAT; // s — pre-morph dwell on shot 1
114
+ const MORPH_START; // s — usually = HOLD_BEAT
115
+ const MORPH_DUR; // s — full container morph length
116
+ const SHOT_TWO_W; // px — final container width
117
+ const SHOT_TWO_H; // px — final container height
118
+ const SHOT_TWO_RADIUS; // px — ≤ min(SHOT_TWO_W, SHOT_TWO_H) / 2
119
+ const OLD_FADE_FRAC; // 0..0.5 — fraction of MORPH_DUR for old content fade
120
+ const NEW_FADE_FRAC; // 0..0.5 — fraction of MORPH_DUR for new content fade
121
+ const FINAL_FADE_FRAC; // 0..0.3 — optional tail fade for handoff
122
+ // {surfaceShotTwo} is a CSS background token (solid or gradient).
123
+
124
+ // Hold shot 1 — let the viewer register the wide banner before morphing.
125
+
126
+ // Phase 1 — Morph container properties simultaneously
127
+ tl.to(
128
+ ".morph-card",
129
+ {
130
+ width: SHOT_TWO_W,
131
+ height: SHOT_TWO_H,
132
+ borderRadius: SHOT_TWO_RADIUS,
133
+ background: "{surfaceShotTwo}",
134
+ duration: MORPH_DUR,
135
+ ease: "power2.inOut",
136
+ },
137
+ MORPH_START,
138
+ );
139
+
140
+ // Phase 2 — Old content fades during the FIRST OLD_FADE_FRAC of the morph
141
+ tl.to(
142
+ ".content-old",
143
+ {
144
+ opacity: 0,
145
+ duration: MORPH_DUR * OLD_FADE_FRAC,
146
+ ease: "power1.in",
147
+ },
148
+ MORPH_START,
149
+ );
150
+
151
+ // Phase 3 — New content fades in during the LAST NEW_FADE_FRAC of the morph
152
+ tl.to(
153
+ ".content-new",
154
+ {
155
+ opacity: 1,
156
+ duration: MORPH_DUR * NEW_FADE_FRAC,
157
+ ease: "power1.out",
158
+ },
159
+ MORPH_START + MORPH_DUR * (1 - NEW_FADE_FRAC),
160
+ );
161
+
162
+ // Optional Phase 4 — Final fade: morph container disappears at the very end,
163
+ // revealing the actual next-shot element behind it.
164
+ tl.to(
165
+ ".morph-card",
166
+ {
167
+ opacity: 0,
168
+ duration: MORPH_DUR * FINAL_FADE_FRAC,
169
+ ease: "power1.in",
170
+ },
171
+ MORPH_START + MORPH_DUR * (1 - FINAL_FADE_FRAC),
172
+ );
173
+
174
+ window.__timelines["morph-scene"] = tl;
175
+ </script>
176
+ ```
177
+
178
+ ## Key Properties to Morph
179
+
180
+ | Property | Shape of change | Visual effect |
181
+ | ------------------ | -------------------------------------------------------------- | ---------------------------- |
182
+ | `width` / `height` | `SHOT_ONE_W × SHOT_ONE_H` → `SHOT_TWO_W × SHOT_TWO_H` | wide card shrinks to an icon |
183
+ | `borderRadius` | `SHOT_ONE_RADIUS` → `SHOT_TWO_RADIUS` (≤ half of smaller side) | rectangle becomes a circle |
184
+ | `background` | `{surfaceShotOne}` → `{surfaceShotTwo}` (solid or gradient) | container identity shifts |
185
+ | `boxShadow` | base shadow → accent glow token | emphasis changes |
186
+
187
+ GSAP tweens all of these simultaneously when included in one `tl.to(...)` call.
188
+
189
+ ## How to Choose Values
190
+
191
+ - **HOLD_BEAT** — pre-morph dwell so the viewer registers shot 1 before it changes
192
+ - Range: 0.6-1.5 s
193
+ - Effects: low end feels rushed / glitchy; high end stalls pacing
194
+ - Constraints: must be ≥ shot 1's content entry settle time
195
+ - **MORPH_START** — when the container morph begins
196
+ - Range: equal to `HOLD_BEAT` in the canonical pattern
197
+ - Constraints: must be > any shot-1 entry tween end
198
+ - **MORPH_DUR** — full length of the simultaneous container morph
199
+ - Range: 0.6-1.2 s
200
+ - Effects: low end reads as a snap; high end loses momentum
201
+ - Constraints: short morphs (<0.5s) cannot fit both old-fade and new-fade
202
+ - **SHOT_TWO_W / SHOT_TWO_H** — final container dimensions
203
+ - Range: 80-400 px when handing off to an icon-sized anchor
204
+ - Constraints: if handing off (`.next-shot-anchor`), MUST match the anchor's dimensions exactly to avoid a visible pop
205
+ - **SHOT_TWO_RADIUS** — final corner radius (use to read as circle / pill / soft-rect)
206
+ - Range: 0 to `min(SHOT_TWO_W, SHOT_TWO_H) / 2`
207
+ - Effects: half-of-smaller-side = perfect circle; smaller = soft rect
208
+ - Constraints: > half is visually clamped — wastes the tween
209
+ - **OLD_FADE_FRAC** — fraction of `MORPH_DUR` over which shot-1 content fades out, starting at `MORPH_START`
210
+ - Range: 0.3-0.5
211
+ - Effects: low end clips shot 1 too early; high end overlaps with shot 2 content
212
+ - Constraints: `OLD_FADE_FRAC + NEW_FADE_FRAC ≤ 1` (gap between is the "shape-only" moment)
213
+ - **NEW_FADE_FRAC** — fraction of `MORPH_DUR` over which shot-2 content fades in, ending at `MORPH_START + MORPH_DUR`
214
+ - Range: 0.3-0.5
215
+ - Effects: symmetric to OLD_FADE_FRAC
216
+ - **FINAL_FADE_FRAC** — optional tail fraction during which the morph container itself fades to 0 for handoff
217
+ - Range: 0 (no handoff) or 0.1-0.2
218
+ - Constraints: only use when `.next-shot-anchor` matches the morph's final visual exactly
219
+ - **Ease family** — discrete choice
220
+ - Options: `power2.inOut` (canonical, balanced), `power3.inOut` (snappier), `expo.inOut` (most cinematic but can feel sluggish at low durations)
221
+ - Avoid `back.out` / `elastic.out` on the morph itself — overshoot fights the dimensional change
222
+
223
+ CSS-side placeholders (`SHOT_ONE_W`, `SHOT_ONE_H`, `SHOT_ONE_RADIUS`, `{surfaceShotOne}`, `{surfaceShotTwo}`) take real values in the example. Pick `{surfaceShotOne}` and `{surfaceShotTwo}` so the gradient/solid stops counts match (GSAP can interpolate background gradients only when stop counts agree).
224
+
225
+ ## Key Principles
226
+
227
+ - **All target properties in one tween** — they share a single ease and duration so they morph in lockstep
228
+ - **Old content fades early, new content fades late** — the container shape change happens between, providing a natural "blink" moment
229
+ - **Final fade is optional** — use it when the next shot has a real anchor element to hand off to (e.g. avatar that the icon morphed into "is")
230
+ - **Same easing for shape and crossfade** — avoid mixing `power2.inOut` morph with `bounce.out` content, looks unsynchronized
231
+ - **❗ If you use `.next-shot-anchor` for handoff, its visuals must be pixel-identical to `.morph-card`'s final state** — same `width` / `height`, same `border-radius`, same `background`, same `box-shadow`, same internal icon dimensions. Any visual delta between the two = visible pop during the crossfade. If you can't match exactly, **drop the handoff** and just hold the morph card at its final state (add a breath if needed for life).
232
+
233
+ ## Critical Constraints
234
+
235
+ - **`overflow: hidden`** on the morph container — content must clip during shape change, otherwise content overflows the morphing border radius
236
+ - **Hold a beat before morphing** — let the viewer register shot 1's content before morphing; instant morph reads as glitchy
237
+ - **Timeline must be paused**: `gsap.timeline({ paused: true })`. Never `tl.play()`
238
+ - **Registry key = `data-composition-id`**: `window.__timelines["morph-scene"]` must match scene root
239
+ - **Use `background` tween, not `background-color`**: gradients need `background` (GSAP supports gradient interpolation when targets are gradients with same number of stops). For solid → solid, `backgroundColor` works.
240
+ - **`borderRadius` should be ≤ half the smaller dimension** at end state — otherwise the radius is visually clamped and the morph looks abrupt at the boundary
241
+ - **❗ Don't snap `z-index` mid-fade** — if you need `.next-shot-anchor` to appear from behind the morph card, use **DOM order** (render `.next-shot-anchor` BEFORE `.morph-card` so the morph card is naturally on top), then crossfade their opacities. A `tl.set({ zIndex: ... })` call during an active opacity tween causes a visible flicker as the stacking order flips before the opacity transition finishes.
242
+
243
+ ## Variation: Morphing to a target element's position
244
+
245
+ When shot 2 isn't centered (e.g. the morph card "lands" on a specific icon in a dock, sidebar, or grid), compute the target `top` / `left` from the **target element's element-position**, not its visual center. Common mistake: subtracting `height/2` to get center, then applying that to the morph-card's `top` — but if `.morph-card` uses absolute positioning with `top` + `margin: 0` (no transform-centering), `top` represents the **element top edge**, not the center.
246
+
247
+ Math template (example: morph card lands on icon at bottom dock):
248
+
249
+ ```
250
+ target_element_top = viewport_height − dock_bottom_offset − dock_padding_y − icon_height
251
+ = 1080 − 60 − 22 − 110 = 888 px
252
+ ```
253
+
254
+ Then tween `.morph-card { top: 888 }` so its element-top aligns with the target icon's element-top. If you mistakenly tween to `888 + icon_height/2 = 943` you'll land below; tweening to a "center" value like `top: 933` (off-by-arithmetic) will be even worse.
255
+
256
+ Always **measure the target element with `getBoundingClientRect()`** before the timeline starts, and use those numbers — don't hand-compute from CSS values, since paddings, borders, and parent transforms compound.
257
+
258
+ ## Combinations
259
+
260
+ - [scale-swap-transition.md](scale-swap-transition.md) — simpler morph without dimension change (just scale + content swap)
261
+ - [sine-wave-loop.md](sine-wave-loop.md) — gentle breathing on the final state (e.g. final small circular icon idles with a breath)
262
+
263
+ ## Pairs with HF skills
264
+
265
+ - `/hyperframes-animation` — timeline + multi-property tween reference
266
+ - `/hyperframes-core` — composition wiring, `data-*` attributes
267
+ - `/hyperframes-cli` — `hyperframes lint` to verify scene structure