@autoaiai/aicut 0.1.11 → 0.1.13

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 (1063) hide show
  1. package/MANUAL.md +94 -94
  2. package/package.json +1 -1
  3. package/skills/aicut-motion/SKILL.md +69 -3
  4. package/skills/aicut-motion/THIRD_PARTY_NOTICES.md +14 -0
  5. package/skills/aicut-motion/assets/atlas/lib/harness.js +116 -0
  6. package/skills/aicut-motion/assets/atlas/lib/sound.js +274 -0
  7. package/skills/aicut-motion/assets/atlas/styles/001-flat-vector-science/code.js +937 -0
  8. package/skills/aicut-motion/assets/atlas/styles/001-flat-vector-science/poster.jpg +0 -0
  9. package/skills/aicut-motion/assets/atlas/styles/001-flat-vector-science/style.json +13 -0
  10. package/skills/aicut-motion/assets/atlas/styles/002-watercolor-wash/code.js +909 -0
  11. package/skills/aicut-motion/assets/atlas/styles/002-watercolor-wash/poster.jpg +0 -0
  12. package/skills/aicut-motion/assets/atlas/styles/002-watercolor-wash/style.json +13 -0
  13. package/skills/aicut-motion/assets/atlas/styles/003-shadow-puppet-theatre/code.js +881 -0
  14. package/skills/aicut-motion/assets/atlas/styles/003-shadow-puppet-theatre/poster.jpg +0 -0
  15. package/skills/aicut-motion/assets/atlas/styles/003-shadow-puppet-theatre/style.json +13 -0
  16. package/skills/aicut-motion/assets/atlas/styles/004-whiteboard-explainer/code.js +897 -0
  17. package/skills/aicut-motion/assets/atlas/styles/004-whiteboard-explainer/poster.jpg +0 -0
  18. package/skills/aicut-motion/assets/atlas/styles/004-whiteboard-explainer/style.json +13 -0
  19. package/skills/aicut-motion/assets/atlas/styles/005-psychedelic-poster/code.js +814 -0
  20. package/skills/aicut-motion/assets/atlas/styles/005-psychedelic-poster/poster.jpg +0 -0
  21. package/skills/aicut-motion/assets/atlas/styles/005-psychedelic-poster/style.json +13 -0
  22. package/skills/aicut-motion/assets/atlas/styles/006-tech-glow-explainer/code.js +990 -0
  23. package/skills/aicut-motion/assets/atlas/styles/006-tech-glow-explainer/poster.jpg +0 -0
  24. package/skills/aicut-motion/assets/atlas/styles/006-tech-glow-explainer/style.json +13 -0
  25. package/skills/aicut-motion/assets/atlas/styles/007-papercraft-models/code.js +994 -0
  26. package/skills/aicut-motion/assets/atlas/styles/007-papercraft-models/poster.jpg +0 -0
  27. package/skills/aicut-motion/assets/atlas/styles/007-papercraft-models/style.json +13 -0
  28. package/skills/aicut-motion/assets/atlas/styles/008-1940s-film-noir/code.js +792 -0
  29. package/skills/aicut-motion/assets/atlas/styles/008-1940s-film-noir/poster.jpg +0 -0
  30. package/skills/aicut-motion/assets/atlas/styles/008-1940s-film-noir/style.json +13 -0
  31. package/skills/aicut-motion/assets/atlas/styles/009-manim-style-math/code.js +840 -0
  32. package/skills/aicut-motion/assets/atlas/styles/009-manim-style-math/poster.jpg +0 -0
  33. package/skills/aicut-motion/assets/atlas/styles/009-manim-style-math/style.json +13 -0
  34. package/skills/aicut-motion/assets/atlas/styles/010-illuminated-manuscript/code.js +1126 -0
  35. package/skills/aicut-motion/assets/atlas/styles/010-illuminated-manuscript/poster.jpg +0 -0
  36. package/skills/aicut-motion/assets/atlas/styles/010-illuminated-manuscript/style.json +13 -0
  37. package/skills/aicut-motion/assets/atlas/styles/011-editorial-essay-collage/code.js +854 -0
  38. package/skills/aicut-motion/assets/atlas/styles/011-editorial-essay-collage/poster.jpg +0 -0
  39. package/skills/aicut-motion/assets/atlas/styles/011-editorial-essay-collage/style.json +13 -0
  40. package/skills/aicut-motion/assets/atlas/styles/012-bioluminescent-deep-sea/code.js +1124 -0
  41. package/skills/aicut-motion/assets/atlas/styles/012-bioluminescent-deep-sea/poster.jpg +0 -0
  42. package/skills/aicut-motion/assets/atlas/styles/012-bioluminescent-deep-sea/style.json +13 -0
  43. package/skills/aicut-motion/assets/atlas/styles/013-product-launch-reveal/code.js +728 -0
  44. package/skills/aicut-motion/assets/atlas/styles/013-product-launch-reveal/poster.jpg +0 -0
  45. package/skills/aicut-motion/assets/atlas/styles/013-product-launch-reveal/style.json +13 -0
  46. package/skills/aicut-motion/assets/atlas/styles/014-halftone-pop-panel/code.js +664 -0
  47. package/skills/aicut-motion/assets/atlas/styles/014-halftone-pop-panel/poster.jpg +0 -0
  48. package/skills/aicut-motion/assets/atlas/styles/014-halftone-pop-panel/style.json +13 -0
  49. package/skills/aicut-motion/assets/atlas/styles/015-isometric-pastel/code.js +991 -0
  50. package/skills/aicut-motion/assets/atlas/styles/015-isometric-pastel/poster.jpg +0 -0
  51. package/skills/aicut-motion/assets/atlas/styles/015-isometric-pastel/style.json +13 -0
  52. package/skills/aicut-motion/assets/atlas/styles/016-oscilloscope-vector-art/code.js +801 -0
  53. package/skills/aicut-motion/assets/atlas/styles/016-oscilloscope-vector-art/poster.jpg +0 -0
  54. package/skills/aicut-motion/assets/atlas/styles/016-oscilloscope-vector-art/style.json +13 -0
  55. package/skills/aicut-motion/assets/atlas/styles/017-risograph-zine/code.js +692 -0
  56. package/skills/aicut-motion/assets/atlas/styles/017-risograph-zine/poster.jpg +0 -0
  57. package/skills/aicut-motion/assets/atlas/styles/017-risograph-zine/style.json +13 -0
  58. package/skills/aicut-motion/assets/atlas/styles/018-claymation-set/code.js +756 -0
  59. package/skills/aicut-motion/assets/atlas/styles/018-claymation-set/poster.jpg +0 -0
  60. package/skills/aicut-motion/assets/atlas/styles/018-claymation-set/style.json +13 -0
  61. package/skills/aicut-motion/assets/atlas/styles/019-neon-sign-at-night/code.js +922 -0
  62. package/skills/aicut-motion/assets/atlas/styles/019-neon-sign-at-night/poster.jpg +0 -0
  63. package/skills/aicut-motion/assets/atlas/styles/019-neon-sign-at-night/style.json +13 -0
  64. package/skills/aicut-motion/assets/atlas/styles/020-kawaii-anime/code.js +852 -0
  65. package/skills/aicut-motion/assets/atlas/styles/020-kawaii-anime/poster.jpg +0 -0
  66. package/skills/aicut-motion/assets/atlas/styles/020-kawaii-anime/style.json +13 -0
  67. package/skills/aicut-motion/assets/atlas/styles/021-ukiyo-e-woodblock/code.js +724 -0
  68. package/skills/aicut-motion/assets/atlas/styles/021-ukiyo-e-woodblock/poster.jpg +0 -0
  69. package/skills/aicut-motion/assets/atlas/styles/021-ukiyo-e-woodblock/style.json +13 -0
  70. package/skills/aicut-motion/assets/atlas/styles/022-16-bit-pixel-odyssey/code.js +793 -0
  71. package/skills/aicut-motion/assets/atlas/styles/022-16-bit-pixel-odyssey/poster.jpg +0 -0
  72. package/skills/aicut-motion/assets/atlas/styles/022-16-bit-pixel-odyssey/style.json +13 -0
  73. package/skills/aicut-motion/assets/atlas/styles/023-chalkboard-lesson/code.js +846 -0
  74. package/skills/aicut-motion/assets/atlas/styles/023-chalkboard-lesson/poster.jpg +0 -0
  75. package/skills/aicut-motion/assets/atlas/styles/023-chalkboard-lesson/style.json +13 -0
  76. package/skills/aicut-motion/assets/atlas/styles/024-cut-paper-diorama/code.js +1008 -0
  77. package/skills/aicut-motion/assets/atlas/styles/024-cut-paper-diorama/poster.jpg +0 -0
  78. package/skills/aicut-motion/assets/atlas/styles/024-cut-paper-diorama/style.json +13 -0
  79. package/skills/aicut-motion/assets/atlas/styles/025-cathedral-glass/code.js +680 -0
  80. package/skills/aicut-motion/assets/atlas/styles/025-cathedral-glass/poster.jpg +0 -0
  81. package/skills/aicut-motion/assets/atlas/styles/025-cathedral-glass/style.json +13 -0
  82. package/skills/aicut-motion/assets/atlas/styles/026-editorial-chart/code.js +633 -0
  83. package/skills/aicut-motion/assets/atlas/styles/026-editorial-chart/poster.jpg +0 -0
  84. package/skills/aicut-motion/assets/atlas/styles/026-editorial-chart/style.json +13 -0
  85. package/skills/aicut-motion/assets/atlas/styles/027-synthwave-outrun/code.js +757 -0
  86. package/skills/aicut-motion/assets/atlas/styles/027-synthwave-outrun/poster.jpg +0 -0
  87. package/skills/aicut-motion/assets/atlas/styles/027-synthwave-outrun/style.json +13 -0
  88. package/skills/aicut-motion/assets/atlas/styles/028-origami-studio/code.js +828 -0
  89. package/skills/aicut-motion/assets/atlas/styles/028-origami-studio/poster.jpg +0 -0
  90. package/skills/aicut-motion/assets/atlas/styles/028-origami-studio/style.json +13 -0
  91. package/skills/aicut-motion/assets/atlas/styles/029-linocut-relief-print/code.js +697 -0
  92. package/skills/aicut-motion/assets/atlas/styles/029-linocut-relief-print/poster.jpg +0 -0
  93. package/skills/aicut-motion/assets/atlas/styles/029-linocut-relief-print/style.json +13 -0
  94. package/skills/aicut-motion/assets/atlas/styles/030-holographic-foil-card/code.js +687 -0
  95. package/skills/aicut-motion/assets/atlas/styles/030-holographic-foil-card/poster.jpg +0 -0
  96. package/skills/aicut-motion/assets/atlas/styles/030-holographic-foil-card/style.json +13 -0
  97. package/skills/aicut-motion/assets/atlas/styles/031-voxel-diorama/code.js +727 -0
  98. package/skills/aicut-motion/assets/atlas/styles/031-voxel-diorama/poster.jpg +0 -0
  99. package/skills/aicut-motion/assets/atlas/styles/031-voxel-diorama/style.json +13 -0
  100. package/skills/aicut-motion/assets/atlas/styles/032-sumi-e-ink-wash/code.js +903 -0
  101. package/skills/aicut-motion/assets/atlas/styles/032-sumi-e-ink-wash/poster.jpg +0 -0
  102. package/skills/aicut-motion/assets/atlas/styles/032-sumi-e-ink-wash/style.json +13 -0
  103. package/skills/aicut-motion/assets/atlas/styles/033-etch-a-sketch-toy/code.js +662 -0
  104. package/skills/aicut-motion/assets/atlas/styles/033-etch-a-sketch-toy/poster.jpg +0 -0
  105. package/skills/aicut-motion/assets/atlas/styles/033-etch-a-sketch-toy/style.json +13 -0
  106. package/skills/aicut-motion/assets/atlas/styles/034-cosmic-star-chart/code.js +951 -0
  107. package/skills/aicut-motion/assets/atlas/styles/034-cosmic-star-chart/poster.jpg +0 -0
  108. package/skills/aicut-motion/assets/atlas/styles/034-cosmic-star-chart/style.json +13 -0
  109. package/skills/aicut-motion/assets/atlas/styles/035-punk-zine-collage/code.js +759 -0
  110. package/skills/aicut-motion/assets/atlas/styles/035-punk-zine-collage/poster.jpg +0 -0
  111. package/skills/aicut-motion/assets/atlas/styles/035-punk-zine-collage/style.json +13 -0
  112. package/skills/aicut-motion/assets/atlas/styles/036-thermal-camera/code.js +738 -0
  113. package/skills/aicut-motion/assets/atlas/styles/036-thermal-camera/poster.jpg +0 -0
  114. package/skills/aicut-motion/assets/atlas/styles/036-thermal-camera/style.json +13 -0
  115. package/skills/aicut-motion/assets/atlas/styles/037-engineering-blueprint/code.js +793 -0
  116. package/skills/aicut-motion/assets/atlas/styles/037-engineering-blueprint/poster.jpg +0 -0
  117. package/skills/aicut-motion/assets/atlas/styles/037-engineering-blueprint/style.json +13 -0
  118. package/skills/aicut-motion/assets/atlas/styles/038-impasto-night/code.js +673 -0
  119. package/skills/aicut-motion/assets/atlas/styles/038-impasto-night/poster.jpg +0 -0
  120. package/skills/aicut-motion/assets/atlas/styles/038-impasto-night/style.json +13 -0
  121. package/skills/aicut-motion/assets/atlas/styles/039-win95-desktop/code.js +907 -0
  122. package/skills/aicut-motion/assets/atlas/styles/039-win95-desktop/poster.jpg +0 -0
  123. package/skills/aicut-motion/assets/atlas/styles/039-win95-desktop/style.json +13 -0
  124. package/skills/aicut-motion/assets/atlas/styles/040-low-poly-faceted/code.js +833 -0
  125. package/skills/aicut-motion/assets/atlas/styles/040-low-poly-faceted/poster.jpg +0 -0
  126. package/skills/aicut-motion/assets/atlas/styles/040-low-poly-faceted/style.json +13 -0
  127. package/skills/aicut-motion/assets/atlas/styles/041-manga-page/code.js +845 -0
  128. package/skills/aicut-motion/assets/atlas/styles/041-manga-page/poster.jpg +0 -0
  129. package/skills/aicut-motion/assets/atlas/styles/041-manga-page/style.json +13 -0
  130. package/skills/aicut-motion/assets/atlas/styles/042-wood-type-letterpress/code.js +496 -0
  131. package/skills/aicut-motion/assets/atlas/styles/042-wood-type-letterpress/poster.jpg +0 -0
  132. package/skills/aicut-motion/assets/atlas/styles/042-wood-type-letterpress/style.json +13 -0
  133. package/skills/aicut-motion/assets/atlas/styles/043-light-painting/code.js +635 -0
  134. package/skills/aicut-motion/assets/atlas/styles/043-light-painting/poster.jpg +0 -0
  135. package/skills/aicut-motion/assets/atlas/styles/043-light-painting/style.json +13 -0
  136. package/skills/aicut-motion/assets/atlas/styles/044-felt-patchwork/code.js +799 -0
  137. package/skills/aicut-motion/assets/atlas/styles/044-felt-patchwork/poster.jpg +0 -0
  138. package/skills/aicut-motion/assets/atlas/styles/044-felt-patchwork/style.json +13 -0
  139. package/skills/aicut-motion/assets/atlas/styles/045-phosphor-terminal/code.js +547 -0
  140. package/skills/aicut-motion/assets/atlas/styles/045-phosphor-terminal/poster.jpg +0 -0
  141. package/skills/aicut-motion/assets/atlas/styles/045-phosphor-terminal/style.json +13 -0
  142. package/skills/aicut-motion/assets/atlas/styles/046-glassmorphism-ui/code.js +592 -0
  143. package/skills/aicut-motion/assets/atlas/styles/046-glassmorphism-ui/poster.jpg +0 -0
  144. package/skills/aicut-motion/assets/atlas/styles/046-glassmorphism-ui/style.json +13 -0
  145. package/skills/aicut-motion/assets/atlas/styles/047-tarot-card/code.js +768 -0
  146. package/skills/aicut-motion/assets/atlas/styles/047-tarot-card/poster.jpg +0 -0
  147. package/skills/aicut-motion/assets/atlas/styles/047-tarot-card/style.json +13 -0
  148. package/skills/aicut-motion/assets/atlas/styles/048-transit-map/code.js +666 -0
  149. package/skills/aicut-motion/assets/atlas/styles/048-transit-map/poster.jpg +0 -0
  150. package/skills/aicut-motion/assets/atlas/styles/048-transit-map/style.json +13 -0
  151. package/skills/aicut-motion/assets/atlas/styles/049-gouache-travel-poster/code.js +559 -0
  152. package/skills/aicut-motion/assets/atlas/styles/049-gouache-travel-poster/poster.jpg +0 -0
  153. package/skills/aicut-motion/assets/atlas/styles/049-gouache-travel-poster/style.json +13 -0
  154. package/skills/aicut-motion/assets/atlas/styles/050-napkin-sketch/code.js +943 -0
  155. package/skills/aicut-motion/assets/atlas/styles/050-napkin-sketch/poster.jpg +0 -0
  156. package/skills/aicut-motion/assets/atlas/styles/050-napkin-sketch/style.json +13 -0
  157. package/skills/aicut-motion/assets/atlas/styles/051-art-deco-foil/code.js +606 -0
  158. package/skills/aicut-motion/assets/atlas/styles/051-art-deco-foil/poster.jpg +0 -0
  159. package/skills/aicut-motion/assets/atlas/styles/051-art-deco-foil/style.json +13 -0
  160. package/skills/aicut-motion/assets/atlas/styles/052-radiograph-on-lightbox/code.js +730 -0
  161. package/skills/aicut-motion/assets/atlas/styles/052-radiograph-on-lightbox/poster.jpg +0 -0
  162. package/skills/aicut-motion/assets/atlas/styles/052-radiograph-on-lightbox/style.json +13 -0
  163. package/skills/aicut-motion/assets/atlas/styles/053-vaporwave/code.js +782 -0
  164. package/skills/aicut-motion/assets/atlas/styles/053-vaporwave/poster.jpg +0 -0
  165. package/skills/aicut-motion/assets/atlas/styles/053-vaporwave/style.json +13 -0
  166. package/skills/aicut-motion/assets/atlas/styles/054-ebru-paper-marbling/code.js +504 -0
  167. package/skills/aicut-motion/assets/atlas/styles/054-ebru-paper-marbling/poster.jpg +0 -0
  168. package/skills/aicut-motion/assets/atlas/styles/054-ebru-paper-marbling/style.json +13 -0
  169. package/skills/aicut-motion/assets/atlas/styles/055-isotype-pictograms/code.js +517 -0
  170. package/skills/aicut-motion/assets/atlas/styles/055-isotype-pictograms/poster.jpg +0 -0
  171. package/skills/aicut-motion/assets/atlas/styles/055-isotype-pictograms/style.json +13 -0
  172. package/skills/aicut-motion/assets/atlas/styles/056-soft-3d-clay/code.js +713 -0
  173. package/skills/aicut-motion/assets/atlas/styles/056-soft-3d-clay/poster.jpg +0 -0
  174. package/skills/aicut-motion/assets/atlas/styles/056-soft-3d-clay/style.json +13 -0
  175. package/skills/aicut-motion/assets/atlas/styles/057-cross-stitch-sampler/code.js +717 -0
  176. package/skills/aicut-motion/assets/atlas/styles/057-cross-stitch-sampler/poster.jpg +0 -0
  177. package/skills/aicut-motion/assets/atlas/styles/057-cross-stitch-sampler/style.json +13 -0
  178. package/skills/aicut-motion/assets/atlas/styles/058-constructivist-propaganda/code.js +540 -0
  179. package/skills/aicut-motion/assets/atlas/styles/058-constructivist-propaganda/poster.jpg +0 -0
  180. package/skills/aicut-motion/assets/atlas/styles/058-constructivist-propaganda/style.json +13 -0
  181. package/skills/aicut-motion/assets/atlas/styles/059-pocket-monochrome/code.js +524 -0
  182. package/skills/aicut-motion/assets/atlas/styles/059-pocket-monochrome/poster.jpg +0 -0
  183. package/skills/aicut-motion/assets/atlas/styles/059-pocket-monochrome/style.json +13 -0
  184. package/skills/aicut-motion/assets/atlas/styles/060-botanical-plate/code.js +934 -0
  185. package/skills/aicut-motion/assets/atlas/styles/060-botanical-plate/poster.jpg +0 -0
  186. package/skills/aicut-motion/assets/atlas/styles/060-botanical-plate/style.json +13 -0
  187. package/skills/aicut-motion/assets/atlas/styles/061-kinetic-type/code.js +690 -0
  188. package/skills/aicut-motion/assets/atlas/styles/061-kinetic-type/poster.jpg +0 -0
  189. package/skills/aicut-motion/assets/atlas/styles/061-kinetic-type/style.json +13 -0
  190. package/skills/aicut-motion/assets/atlas/styles/062-byzantine-mosaic/code.js +612 -0
  191. package/skills/aicut-motion/assets/atlas/styles/062-byzantine-mosaic/poster.jpg +0 -0
  192. package/skills/aicut-motion/assets/atlas/styles/062-byzantine-mosaic/style.json +13 -0
  193. package/skills/aicut-motion/assets/atlas/styles/063-y2k-liquid-chrome/code.js +666 -0
  194. package/skills/aicut-motion/assets/atlas/styles/063-y2k-liquid-chrome/poster.jpg +0 -0
  195. package/skills/aicut-motion/assets/atlas/styles/063-y2k-liquid-chrome/style.json +13 -0
  196. package/skills/aicut-motion/assets/atlas/styles/064-sticky-note-wall/code.js +651 -0
  197. package/skills/aicut-motion/assets/atlas/styles/064-sticky-note-wall/poster.jpg +0 -0
  198. package/skills/aicut-motion/assets/atlas/styles/064-sticky-note-wall/style.json +13 -0
  199. package/skills/aicut-motion/assets/atlas/styles/065-vintage-newsprint/code.js +656 -0
  200. package/skills/aicut-motion/assets/atlas/styles/065-vintage-newsprint/poster.jpg +0 -0
  201. package/skills/aicut-motion/assets/atlas/styles/065-vintage-newsprint/style.json +13 -0
  202. package/skills/aicut-motion/assets/atlas/styles/066-hidden-line-wireframe/code.js +672 -0
  203. package/skills/aicut-motion/assets/atlas/styles/066-hidden-line-wireframe/poster.jpg +0 -0
  204. package/skills/aicut-motion/assets/atlas/styles/066-hidden-line-wireframe/style.json +13 -0
  205. package/skills/aicut-motion/assets/atlas/styles/067-memphis-group/code.js +548 -0
  206. package/skills/aicut-motion/assets/atlas/styles/067-memphis-group/poster.jpg +0 -0
  207. package/skills/aicut-motion/assets/atlas/styles/067-memphis-group/style.json +13 -0
  208. package/skills/aicut-motion/assets/atlas/styles/068-ballpoint-notebook/code.js +989 -0
  209. package/skills/aicut-motion/assets/atlas/styles/068-ballpoint-notebook/poster.jpg +0 -0
  210. package/skills/aicut-motion/assets/atlas/styles/068-ballpoint-notebook/style.json +13 -0
  211. package/skills/aicut-motion/assets/atlas/styles/069-op-art-sphere/code.js +440 -0
  212. package/skills/aicut-motion/assets/atlas/styles/069-op-art-sphere/poster.jpg +0 -0
  213. package/skills/aicut-motion/assets/atlas/styles/069-op-art-sphere/style.json +13 -0
  214. package/skills/aicut-motion/assets/atlas/styles/070-topographic-survey/code.js +895 -0
  215. package/skills/aicut-motion/assets/atlas/styles/070-topographic-survey/poster.jpg +0 -0
  216. package/skills/aicut-motion/assets/atlas/styles/070-topographic-survey/style.json +13 -0
  217. package/skills/aicut-motion/assets/atlas/styles/071-pointillist-afternoon/code.js +563 -0
  218. package/skills/aicut-motion/assets/atlas/styles/071-pointillist-afternoon/poster.jpg +0 -0
  219. package/skills/aicut-motion/assets/atlas/styles/071-pointillist-afternoon/style.json +13 -0
  220. package/skills/aicut-motion/assets/atlas/styles/072-vector-arcade-1980/code.js +627 -0
  221. package/skills/aicut-motion/assets/atlas/styles/072-vector-arcade-1980/poster.jpg +0 -0
  222. package/skills/aicut-motion/assets/atlas/styles/072-vector-arcade-1980/style.json +13 -0
  223. package/skills/aicut-motion/assets/atlas/styles/073-patent-drawing/code.js +1096 -0
  224. package/skills/aicut-motion/assets/atlas/styles/073-patent-drawing/poster.jpg +0 -0
  225. package/skills/aicut-motion/assets/atlas/styles/073-patent-drawing/style.json +13 -0
  226. package/skills/aicut-motion/assets/atlas/styles/074-bauhaus-poster/code.js +595 -0
  227. package/skills/aicut-motion/assets/atlas/styles/074-bauhaus-poster/poster.jpg +0 -0
  228. package/skills/aicut-motion/assets/atlas/styles/074-bauhaus-poster/style.json +13 -0
  229. package/skills/aicut-motion/assets/atlas/styles/075-bitmap-paint-doodle/code.js +665 -0
  230. package/skills/aicut-motion/assets/atlas/styles/075-bitmap-paint-doodle/poster.jpg +0 -0
  231. package/skills/aicut-motion/assets/atlas/styles/075-bitmap-paint-doodle/style.json +13 -0
  232. package/skills/aicut-motion/assets/atlas/styles/076-nail-thread-string-art/code.js +645 -0
  233. package/skills/aicut-motion/assets/atlas/styles/076-nail-thread-string-art/poster.jpg +0 -0
  234. package/skills/aicut-motion/assets/atlas/styles/076-nail-thread-string-art/style.json +13 -0
  235. package/skills/aicut-motion/assets/atlas/styles/077-ridgeline/code.js +436 -0
  236. package/skills/aicut-motion/assets/atlas/styles/077-ridgeline/poster.jpg +0 -0
  237. package/skills/aicut-motion/assets/atlas/styles/077-ridgeline/style.json +13 -0
  238. package/skills/aicut-motion/assets/atlas/styles/078-sketchbook-graphite/code.js +1237 -0
  239. package/skills/aicut-motion/assets/atlas/styles/078-sketchbook-graphite/poster.jpg +0 -0
  240. package/skills/aicut-motion/assets/atlas/styles/078-sketchbook-graphite/style.json +13 -0
  241. package/skills/aicut-motion/assets/atlas/styles/079-teletext-page/code.js +622 -0
  242. package/skills/aicut-motion/assets/atlas/styles/079-teletext-page/poster.jpg +0 -0
  243. package/skills/aicut-motion/assets/atlas/styles/079-teletext-page/style.json +13 -0
  244. package/skills/aicut-motion/assets/atlas/styles/080-silkscreen-grid/code.js +524 -0
  245. package/skills/aicut-motion/assets/atlas/styles/080-silkscreen-grid/poster.jpg +0 -0
  246. package/skills/aicut-motion/assets/atlas/styles/080-silkscreen-grid/style.json +13 -0
  247. package/skills/aicut-motion/assets/atlas/styles/081-guilloch-security-print/code.js +689 -0
  248. package/skills/aicut-motion/assets/atlas/styles/081-guilloch-security-print/poster.jpg +0 -0
  249. package/skills/aicut-motion/assets/atlas/styles/081-guilloch-security-print/style.json +13 -0
  250. package/skills/aicut-motion/assets/atlas/styles/082-ascii-demoscene/code.js +574 -0
  251. package/skills/aicut-motion/assets/atlas/styles/082-ascii-demoscene/poster.jpg +0 -0
  252. package/skills/aicut-motion/assets/atlas/styles/082-ascii-demoscene/style.json +13 -0
  253. package/skills/aicut-motion/assets/atlas/styles/083-international-typographic-style/code.js +469 -0
  254. package/skills/aicut-motion/assets/atlas/styles/083-international-typographic-style/poster.jpg +0 -0
  255. package/skills/aicut-motion/assets/atlas/styles/083-international-typographic-style/style.json +13 -0
  256. package/skills/aicut-motion/assets/atlas/styles/084-flow-field/code.js +531 -0
  257. package/skills/aicut-motion/assets/atlas/styles/084-flow-field/poster.jpg +0 -0
  258. package/skills/aicut-motion/assets/atlas/styles/084-flow-field/style.json +13 -0
  259. package/skills/aicut-motion/assets/atlas/styles/085-macpaint-1984/code.js +675 -0
  260. package/skills/aicut-motion/assets/atlas/styles/085-macpaint-1984/poster.jpg +0 -0
  261. package/skills/aicut-motion/assets/atlas/styles/085-macpaint-1984/style.json +13 -0
  262. package/skills/aicut-motion/assets/atlas/styles/086-multi-scale-truchet/code.js +609 -0
  263. package/skills/aicut-motion/assets/atlas/styles/086-multi-scale-truchet/poster.jpg +0 -0
  264. package/skills/aicut-motion/assets/atlas/styles/086-multi-scale-truchet/style.json +13 -0
  265. package/skills/aicut-motion/references/motion-delivery.md +55 -0
  266. package/skills/aicut-motion/references/style-index.json +690 -0
  267. package/skills/aicut-motion/references/style-research.md +73 -0
  268. package/skills/aicut-motion/references/style-selection.md +71 -0
  269. package/skills/aicut-motion/scripts/atlas-viewer.html +195 -0
  270. package/skills/aicut-motion/scripts/atlas.mjs +109 -0
  271. package/studio/server/fetch-github.mjs +14 -3
  272. package/studio/server/server.mjs +40 -3
  273. package/studio/server/skill-summaries.mjs +60 -0
  274. package/studio/server/skills.mjs +121 -7
  275. package/studio/server/styles-store.mjs +235 -0
  276. package/studio/server/template-posters.mjs +2 -2
  277. package/studio/server/templates-page.mjs +93 -93
  278. package/studio/server/templates.mjs +32 -7
  279. package/studio/ui/dist/assets/ExportCenter-DasulhAv.js +1 -0
  280. package/studio/ui/dist/assets/SettingsModal-BZw0Hz2_.js +2 -0
  281. package/studio/ui/dist/assets/es-C8XPZARI.js +1 -0
  282. package/studio/ui/dist/assets/index-BjJVmBzB.js +1623 -0
  283. package/studio/ui/dist/assets/index-C3BfKZFO.css +1 -0
  284. package/studio/ui/dist/assets/ja-BeNkdaEj.js +1 -0
  285. package/studio/ui/dist/assets/ko-DcTVhdzK.js +1 -0
  286. package/studio/ui/dist/assets/zh-CN-Cg51ctbL.js +1 -0
  287. package/studio/ui/dist/index.html +2 -2
  288. package/skills/30x-web-to-video/SKILL.md +0 -421
  289. package/skills/30x-web-to-video/examples/INDEX.md +0 -26
  290. package/skills/30x-web-to-video/references/animations.md +0 -539
  291. package/skills/30x-web-to-video/references/audio.md +0 -256
  292. package/skills/30x-web-to-video/references/components.md +0 -340
  293. package/skills/30x-web-to-video/references/lottie.md +0 -174
  294. package/skills/30x-web-to-video/references/visual-effects.md +0 -157
  295. package/skills/30x-web-to-video/remotion-best-practices/rules/audio.md +0 -169
  296. package/skills/30x-web-to-video/remotion-best-practices/rules/calculate-metadata.md +0 -134
  297. package/skills/30x-web-to-video/remotion-best-practices/rules/charts.md +0 -120
  298. package/skills/30x-web-to-video/remotion-best-practices/rules/compositions.md +0 -154
  299. package/skills/30x-web-to-video/remotion-best-practices/rules/ffmpeg.md +0 -38
  300. package/skills/30x-web-to-video/remotion-best-practices/rules/fonts.md +0 -152
  301. package/skills/3d-asset-generation/SKILL.md +0 -142
  302. package/skills/action-fight-prompt/SKILL.md +0 -136
  303. package/skills/action-fight-prompt/references/camera-and-impact.md +0 -64
  304. package/skills/action-fight-prompt/references/example-15s-duel.md +0 -59
  305. package/skills/action-fight-prompt/references/scene-patterns.md +0 -80
  306. package/skills/ad-creative-video/SKILL.md +0 -205
  307. package/skills/ad-creative-video/references/batch-ad-pipeline.md +0 -289
  308. package/skills/ad-creative-video/references/platform-specs.md +0 -72
  309. package/skills/after-effects/SKILL.md +0 -123
  310. package/skills/after-effects/references/export-recipes.md +0 -168
  311. package/skills/after-effects/references/expression-library.md +0 -184
  312. package/skills/after-effects/references/expressions.md +0 -134
  313. package/skills/after-effects/references/performance-triage.md +0 -138
  314. package/skills/after-effects/references/project-hygiene.md +0 -188
  315. package/skills/ai-media-quality-review/SKILL.md +0 -72
  316. package/skills/ai-product-video/SKILL.md +0 -296
  317. package/skills/ai-product-video/references/aesthetic-rules.md +0 -177
  318. package/skills/ai-product-video/references/final-review.md +0 -110
  319. package/skills/ai-product-video/references/guided-free-creation.md +0 -194
  320. package/skills/ai-product-video/references/music-beat-sync.md +0 -219
  321. package/skills/ai-product-video/references/pipeline.md +0 -392
  322. package/skills/ai-product-video/references/sequences/promo-energy-arc.md +0 -50
  323. package/skills/ai-product-video/references/shots/ATTRIBUTION.md +0 -65
  324. package/skills/ai-product-video/references/shots/camera/basic-3d-scene.md +0 -37
  325. package/skills/ai-product-video/references/shots/camera/crash-zoom-punch.md +0 -39
  326. package/skills/ai-product-video/references/shots/camera/cursor-flyover.md +0 -38
  327. package/skills/ai-product-video/references/shots/camera/depth-layer-moves.md +0 -40
  328. package/skills/ai-product-video/references/shots/camera/graze-face-tour.md +0 -57
  329. package/skills/anidoodle/SKILL.md +0 -185
  330. package/skills/anidoodle/references/anatomy.md +0 -91
  331. package/skills/anidoodle/references/backends-and-adapters.md +0 -82
  332. package/skills/anidoodle/references/camera.md +0 -148
  333. package/skills/anidoodle/references/craft-bar.md +0 -72
  334. package/skills/anidoodle/references/determinism-and-contract.md +0 -46
  335. package/skills/anidoodle/references/formats.md +0 -121
  336. package/skills/anidoodle/references/motion-grammar.md +0 -234
  337. package/skills/anidoodle/references/music/compose.md +0 -388
  338. package/skills/anidoodle/references/music/sound-design.md +0 -245
  339. package/skills/anidoodle/references/music/sounds-licenses.md +0 -69
  340. package/skills/anidoodle/references/music/styles/lofi-electronic.md +0 -112
  341. package/skills/anidoodle/references/music/styles/music-box.md +0 -57
  342. package/skills/animated-component-libraries/SKILL.md +0 -820
  343. package/skills/animated-component-libraries/references/customization_guide.md +0 -699
  344. package/skills/animated-component-libraries/references/magic_ui_components.md +0 -422
  345. package/skills/animated-component-libraries/references/react_bits_components.md +0 -587
  346. package/skills/animated-infographic/SKILL.md +0 -211
  347. package/skills/animated-infographic/references/sequenced-infographic.md +0 -286
  348. package/skills/appshot-core/SKILL.md +0 -872
  349. package/skills/article-highlights/SKILL.md +0 -151
  350. package/skills/avatar-mix/SKILL.md +0 -301
  351. package/skills/bang-motion/SKILL.md +0 -583
  352. package/skills/bang-motion/references/ae-bridge-higgsfield.md +0 -160
  353. package/skills/bang-motion/references/anti-ppt.md +0 -110
  354. package/skills/bang-motion/references/architecture.md +0 -188
  355. package/skills/bang-motion/references/explainer.md +0 -579
  356. package/skills/bang-motion/references/kartun-panggung.md +0 -221
  357. package/skills/bang-motion/references/opener-konsep.md +0 -817
  358. package/skills/bang-motion/references/roadmap.md +0 -85
  359. package/skills/bang-motion/references/techniques.md +0 -690
  360. package/skills/beat-sync-edit/SKILL.md +0 -148
  361. package/skills/book-video-factory/SKILL.md +0 -139
  362. package/skills/book-video-factory/references/first-run.md +0 -50
  363. package/skills/book-video-factory/references/paper-collage-explainer.md +0 -127
  364. package/skills/book-video-factory/references/quality-gates.md +0 -87
  365. package/skills/book-video-production/SKILL.md +0 -211
  366. package/skills/brag/SKILL.md +0 -195
  367. package/skills/brag/references/audio.md +0 -312
  368. package/skills/brag/references/step-1-inspect.md +0 -125
  369. package/skills/brag/references/step-2-plan.md +0 -234
  370. package/skills/brag/references/step-3-compose.md +0 -199
  371. package/skills/brag/references/step-4-deliver.md +0 -141
  372. package/skills/brag/references/tones.md +0 -231
  373. package/skills/brand-setup/SKILL.md +0 -228
  374. package/skills/brewreel/SKILL.md +0 -491
  375. package/skills/brewreel/docs/broll.en.md +0 -252
  376. package/skills/brewreel/docs/broll.md +0 -252
  377. package/skills/brewreel/docs/custom-shot.en.md +0 -66
  378. package/skills/brewreel/docs/custom-shot.md +0 -103
  379. package/skills/brewreel/docs/faq.en.md +0 -90
  380. package/skills/brewreel/docs/faq.md +0 -90
  381. package/skills/brewreel/docs/features.en.md +0 -157
  382. package/skills/brewreel/docs/features.md +0 -157
  383. package/skills/brewreel/docs/gallery.en.md +0 -44
  384. package/skills/brewreel/docs/gallery.md +0 -44
  385. package/skills/brewreel/docs/how-it-works.en.md +0 -64
  386. package/skills/brewreel/docs/how-it-works.md +0 -64
  387. package/skills/caption-animation/SKILL.md +0 -216
  388. package/skills/caption-animation/references/word-timed-captions.md +0 -254
  389. package/skills/cartcut-editing/SKILL.md +0 -615
  390. package/skills/cartcut-editing/references/html-typography.md +0 -277
  391. package/skills/cassette-video-edit/SKILL.md +0 -129
  392. package/skills/ccvideo/SKILL.md +0 -264
  393. package/skills/chekhov-dramaturgy/SKILL.md +0 -367
  394. package/skills/chekhov-dramaturgy/reference.md +0 -375
  395. package/skills/chengfeng-check-updates/SKILL.md +0 -283
  396. package/skills/cinematic-product-promo-skill/SKILL.md +0 -295
  397. package/skills/cinematic-product-promo-skill/references/aesthetic-rules.md +0 -187
  398. package/skills/cinematic-product-promo-skill/references/final-review.md +0 -116
  399. package/skills/cinematic-product-promo-skill/references/guided-free-creation.md +0 -199
  400. package/skills/cinematic-product-promo-skill/references/jianying-export.md +0 -183
  401. package/skills/cinematic-product-promo-skill/references/music-beat-sync.md +0 -257
  402. package/skills/cinematic-product-promo-skill/references/pipeline.md +0 -393
  403. package/skills/cinematic-product-promo-skill/references/sequences/promo-energy-arc.md +0 -50
  404. package/skills/cinematic-product-promo-skill/references/shots/ATTRIBUTION.md +0 -65
  405. package/skills/cinematic-product-promo-skill/references/shots/camera/basic-3d-scene.md +0 -37
  406. package/skills/cinematic-product-promo-skill/references/shots/camera/crash-zoom-punch.md +0 -39
  407. package/skills/cinematic-product-promo-skill/references/shots/camera/cursor-flyover.md +0 -38
  408. package/skills/cinematic-product-promo-skill/references/shots/camera/depth-layer-moves.md +0 -40
  409. package/skills/claude-gif/SKILL.md +0 -211
  410. package/skills/claude-gif/references/gif-optimization.md +0 -209
  411. package/skills/claude-gif/references/perfect-loops.md +0 -295
  412. package/skills/claude-gif/references/platform-specs.md +0 -138
  413. package/skills/claude-gif/references/prompt-engineering.md +0 -211
  414. package/skills/claude-gif/references/remotion-gif.md +0 -560
  415. package/skills/codex-video-pipeline/SKILL.md +0 -213
  416. package/skills/codex-video-pipeline/examples/ai-meeting-notes/INPUT.md +0 -10
  417. package/skills/codex-video-pipeline/examples/ai-meeting-notes/expected/action-list.md +0 -22
  418. package/skills/codex-video-pipeline/references/captions.md +0 -39
  419. package/skills/codex-video-pipeline/references/cover-system.md +0 -72
  420. package/skills/codex-video-pipeline/references/cross-platform.md +0 -77
  421. package/skills/codex-video-pipeline/references/example-run.md +0 -54
  422. package/skills/codex-video-pipeline/references/first-run.md +0 -130
  423. package/skills/codex-video-pipeline/references/project-contract.md +0 -54
  424. package/skills/codex-video-pipeline/references/quality-gates.md +0 -44
  425. package/skills/codex-video-pipeline/references/research-and-script.md +0 -50
  426. package/skills/collage-broll-explainers/SKILL.md +0 -429
  427. package/skills/create-onboarding-video/SKILL.md +0 -233
  428. package/skills/cs-shotcraft-skill/SKILL.md +0 -218
  429. package/skills/cs-shotcraft-skill/references/aesthetic-rules.md +0 -207
  430. package/skills/cs-shotcraft-skill/references/camera-table.md +0 -88
  431. package/skills/cs-shotcraft-skill/references/engineering.md +0 -132
  432. package/skills/cs-shotcraft-skill/references/final-review.md +0 -118
  433. package/skills/cs-shotcraft-skill/references/guided-free-creation.md +0 -199
  434. package/skills/cs-shotcraft-skill/references/jianying-export.md +0 -183
  435. package/skills/cs-shotcraft-skill/references/music-beat-sync.md +0 -257
  436. package/skills/cs-shotcraft-skill/references/pipeline.md +0 -408
  437. package/skills/cs-shotcraft-skill/references/product-machine.md +0 -56
  438. package/skills/cs-shotcraft-skill/references/sequences/promo-energy-arc.md +0 -50
  439. package/skills/cs-shotcraft-skill/references/shots/ATTRIBUTION.md +0 -65
  440. package/skills/cs-shotcraft-skill/references/shots/camera/basic-3d-scene.md +0 -37
  441. package/skills/cut-video/SKILL.md +0 -387
  442. package/skills/cyxj-hyperframes-overlay/SKILL.md +0 -75
  443. package/skills/cyxj-remotion-evolve/SKILL.md +0 -123
  444. package/skills/cyxj-remotion-evolve-vibe-motion/SKILL.md +0 -123
  445. package/skills/demo-video-creation-skill/SKILL.md +0 -152
  446. package/skills/demo-video-creation-skill/references/capture-workflow.md +0 -74
  447. package/skills/demo-video-creation-skill/references/qc-checklist.md +0 -61
  448. package/skills/demo-video-creation-skill/references/remotion-ffmpeg.md +0 -94
  449. package/skills/demo-video-creation-skill/references/storytelling.md +0 -86
  450. package/skills/demo-video-creation-skill/references/visual-system.md +0 -83
  451. package/skills/demoday/SKILL.md +0 -148
  452. package/skills/develop-premiere-pro-mcp/SKILL.md +0 -131
  453. package/skills/diagram-animation/SKILL.md +0 -200
  454. package/skills/diagram-animation/references/diagram-and-chart-recipes.md +0 -218
  455. package/skills/diagram-tour/SKILL.md +0 -287
  456. package/skills/diagram-tour/examples/agent-architecture/agent-architecture-tour.md +0 -78
  457. package/skills/docvideoer/SKILL.md +0 -139
  458. package/skills/draftcut/SKILL.md +0 -104
  459. package/skills/draftcut/docs/agent-bootstrap.md +0 -64
  460. package/skills/draftcut/docs/approvals.md +0 -45
  461. package/skills/draftcut/docs/audio-first-migration.md +0 -35
  462. package/skills/draftcut/docs/configuration.md +0 -54
  463. package/skills/draftcut/docs/getting-started.md +0 -63
  464. package/skills/draftcut/docs/harness-case-study.en.md +0 -23
  465. package/skills/draftcut/docs/harness-case-study.md +0 -47
  466. package/skills/draftcut/references/01-plan.md +0 -30
  467. package/skills/draftcut/references/03-deliver.md +0 -26
  468. package/skills/draftcut/references/04-reference-theme-prompt.md +0 -7
  469. package/skills/draftcut/references/05-social-loudness.md +0 -58
  470. package/skills/draftcut/references/06-modern-components.md +0 -72
  471. package/skills/easyedit/SKILL.md +0 -66
  472. package/skills/erduo-broll-loop-engineering/SKILL.md +0 -136
  473. package/skills/erduo-broll-loop-engineering/references/animation-craft.md +0 -208
  474. package/skills/erduo-broll-loop-engineering/references/first-run-onboarding.md +0 -107
  475. package/skills/erduo-broll-loop-engineering/references/handoff-template.md +0 -70
  476. package/skills/erduo-broll-loop-engineering/references/motion-layout-lint.md +0 -122
  477. package/skills/erduo-broll-loop-engineering/references/parent-review-checklist.md +0 -171
  478. package/skills/erduo-broll-loop-engineering/references/prompt-first-workflow.md +0 -322
  479. package/skills/erduo-broll-loop-engineering/references/remotion-backend.md +0 -334
  480. package/skills/erduo-broll-loop-engineering/references/runtime/remotion-hyperframes-map.md +0 -76
  481. package/skills/erduo-broll-loop-engineering/references/runtime/runtime-contract.md +0 -174
  482. package/skills/erduo-broll-loop-engineering/references/runtime/runtime-selection.md +0 -135
  483. package/skills/erduo-broll-loop-engineering/references/shotcraft/remotion-sources/SOURCE.md +0 -7
  484. package/skills/erduo-broll-loop-engineering/references/shotcraft/upstream-attribution.md +0 -65
  485. package/skills/explainer-assets/SKILL.md +0 -98
  486. package/skills/explainer-video/SKILL.md +0 -146
  487. package/skills/framewright/SKILL.md +0 -324
  488. package/skills/framewright/references/audio.md +0 -230
  489. package/skills/framewright/references/guide.md +0 -276
  490. package/skills/framewright/references/painting.md +0 -425
  491. package/skills/framewright/references/photo.md +0 -75
  492. package/skills/framewright/references/questionnaire.md +0 -115
  493. package/skills/framewright/references/styles.md +0 -388
  494. package/skills/framewright/references/troubleshooting.md +0 -119
  495. package/skills/framewright/references/world.md +0 -215
  496. package/skills/gbro-collage-broll/SKILL.md +0 -435
  497. package/skills/gbro-collage-info/SKILL.md +0 -135
  498. package/skills/gbro-collage-info/references/motion-grammar.md +0 -66
  499. package/skills/gbro-collage-info/references/production.md +0 -67
  500. package/skills/gbro-collage-info/references/style-system.md +0 -38
  501. package/skills/gemini-tts/SKILL.md +0 -208
  502. package/skills/gemini-tts/references/prompting-guide.md +0 -169
  503. package/skills/gen/SKILL.md +0 -282
  504. package/skills/ghost-editor/SKILL.md +0 -437
  505. package/skills/ghost-editor/docs/HOW-IT-WORKS.md +0 -82
  506. package/skills/ghost-editor/docs/PLAYBOOK.md +0 -139
  507. package/skills/ghost-editor/docs/THIRD_PARTY/audio.md +0 -17
  508. package/skills/ghost-editor/docs/THIRD_PARTY/audioqa.md +0 -13
  509. package/skills/ghost-editor/docs/THIRD_PARTY/captions.md +0 -20
  510. package/skills/ghost-editor/docs/THIRD_PARTY/fonts.md +0 -17
  511. package/skills/ghost-editor/docs/THIRD_PARTY/kinetic.md +0 -22
  512. package/skills/ghost-editor/docs/THIRD_PARTY/looks.md +0 -22
  513. package/skills/ghost-editor/docs/THIRD_PARTY/matte.md +0 -20
  514. package/skills/ghost-editor/docs/THIRD_PARTY/models.md +0 -11
  515. package/skills/ghost-editor/docs/THIRD_PARTY/runtime.md +0 -13
  516. package/skills/ghost-editor/docs/THIRD_PARTY/shaders.md +0 -15
  517. package/skills/git-story-film/SKILL.md +0 -220
  518. package/skills/git-story-film/examples/raven-story/FONTS.md +0 -8
  519. package/skills/git-story-film/examples/raven-story/OUTLINE.md +0 -93
  520. package/skills/git-story-film/references/craft.md +0 -148
  521. package/skills/git-story-film/references/directing.md +0 -185
  522. package/skills/git-story-film/references/forms.md +0 -150
  523. package/skills/git-story-film/references/production.md +0 -150
  524. package/skills/git-story-film/references/story.md +0 -137
  525. package/skills/git-story-film/references/text-and-fonts.md +0 -90
  526. package/skills/guizang-product-video-skill/SKILL.md +0 -96
  527. package/skills/guizang-product-video-skill/references/audio-and-qa.md +0 -113
  528. package/skills/guizang-product-video-skill/references/audio-sourcing.md +0 -80
  529. package/skills/guizang-product-video-skill/references/case-study.md +0 -63
  530. package/skills/guizang-product-video-skill/references/component-pipeline.md +0 -86
  531. package/skills/guizang-product-video-skill/references/cover.md +0 -43
  532. package/skills/guizang-product-video-skill/references/direction.md +0 -91
  533. package/skills/guizang-product-video-skill/references/onboarding.md +0 -98
  534. package/skills/guizang-product-video-skill/references/repo-and-style.md +0 -44
  535. package/skills/guizang-product-video-skill/references/review.md +0 -38
  536. package/skills/guizang-product-video-skill/references/starter.md +0 -168
  537. package/skills/guizang-product-video-skill/references/story-and-copy.md +0 -88
  538. package/skills/guizang-product-video-skill/references/visual-vocabulary.md +0 -78
  539. package/skills/guofeng-paper-video/SKILL.md +0 -159
  540. package/skills/guofeng-paper-video/style/design.md +0 -43
  541. package/skills/guofeng-paper-video/style/palette.md +0 -21
  542. package/skills/guofeng-paper-video/style/prompts/01-/345/210/206/351/225/234/350/241/250.md +0 -19
  543. package/skills/guofeng-paper-video/style/prompts/02-/347/224/237/346/210/220/347/272/270/347/211/207.md +0 -37
  544. package/skills/guofeng-paper-video/style/prompts/03-/351/205/215/351/237/263/350/204/232/346/234/254.md +0 -27
  545. package/skills/guofeng-paper-video/style//345/210/206/351/225/234/344/270/216/345/233/276/345/261/202/350/247/204/350/214/203.md +0 -67
  546. package/skills/guofeng-paper-video/style//347/272/270/347/211/207/347/264/240/346/235/220/350/247/204/350/214/203.md +0 -29
  547. package/skills/hand-drawn-explainer-video-nikola/SKILL.md +0 -113
  548. package/skills/hand-drawn-explainer-video-nikola/docs/ARCHITECTURE.md +0 -18
  549. package/skills/hand-drawn-explainer-video-nikola/docs/CONFIGURATION.md +0 -22
  550. package/skills/hand-drawn-explainer-video-nikola/docs/STYLES.md +0 -28
  551. package/skills/hand-drawn-explainer-video-nikola/docs/TROUBLESHOOTING.md +0 -35
  552. package/skills/hand-drawn-explainer-video-nikola/examples/program-animation/skill-demo/DESIGN.md +0 -24
  553. package/skills/hand-drawn-explainer-video-nikola/references/automation-workflow.md +0 -67
  554. package/skills/hand-drawn-explainer-video-nikola/references/output-example.md +0 -79
  555. package/skills/hand-drawn-explainer-video-nikola/references/preflight-and-recovery.md +0 -49
  556. package/skills/hand-drawn-explainer-video-nikola/references/style-guide.md +0 -82
  557. package/skills/hand-drawn-explainer-video-nikola/references/style-selection-and-updates.md +0 -39
  558. package/skills/hand-drawn-explainer-video-nikola/references/upstream-whiteboard-review.md +0 -30
  559. package/skills/hand-drawn-explainer-video-nikola/references/voiceover.md +0 -37
  560. package/skills/hbg-life-simulation/SKILL.md +0 -285
  561. package/skills/hbg-life-simulation/references/image-generation.md +0 -53
  562. package/skills/hbg-life-simulation/references/local-account-api.md +0 -112
  563. package/skills/hbg-life-simulation/references/opening-system.md +0 -45
  564. package/skills/hbg-life-simulation/references/project-spec.md +0 -62
  565. package/skills/hbg-life-simulation/references/render-and-qa.md +0 -107
  566. package/skills/hbg-life-simulation/references/storyboarding.md +0 -69
  567. package/skills/hbg-life-simulation/references/style-system.md +0 -80
  568. package/skills/hbg-life-simulation/references/visual-system.md +0 -44
  569. package/skills/heygen-avatar/SKILL.md +0 -489
  570. package/skills/heygen-avatar/references/asset-routing.md +0 -86
  571. package/skills/heygen-avatar/references/avatar-creation.md +0 -181
  572. package/skills/heygen-avatar/references/troubleshooting.md +0 -137
  573. package/skills/heytea-doodle-poster/SKILL.md +0 -132
  574. package/skills/heytea-doodle-poster/references/desktop-pet-character-modes.md +0 -103
  575. package/skills/heytea-doodle-poster/references/desktop-pet-environment.md +0 -122
  576. package/skills/heytea-doodle-poster/references/desktop-pet-pack.md +0 -106
  577. package/skills/heytea-doodle-poster/references/desktop-pet-workflow.md +0 -264
  578. package/skills/heytea-doodle-poster/references/evaluation.md +0 -246
  579. package/skills/heytea-doodle-poster/references/lettering-guide.md +0 -213
  580. package/skills/heytea-doodle-poster/references/mixed-media-style-guide.md +0 -101
  581. package/skills/heytea-doodle-poster/references/monster-poster-workflow.md +0 -56
  582. package/skills/heytea-doodle-poster/references/style-guide.md +0 -412
  583. package/skills/heytea-doodle-poster-hosted/SKILL.md +0 -132
  584. package/skills/heytea-doodle-poster-hosted/references/desktop-pet-character-modes.md +0 -103
  585. package/skills/heytea-doodle-poster-hosted/references/desktop-pet-environment.md +0 -122
  586. package/skills/heytea-doodle-poster-hosted/references/desktop-pet-pack.md +0 -106
  587. package/skills/heytea-doodle-poster-hosted/references/desktop-pet-workflow.md +0 -264
  588. package/skills/heytea-doodle-poster-hosted/references/evaluation.md +0 -246
  589. package/skills/heytea-doodle-poster-hosted/references/lettering-guide.md +0 -213
  590. package/skills/heytea-doodle-poster-hosted/references/mixed-media-style-guide.md +0 -101
  591. package/skills/heytea-doodle-poster-hosted/references/monster-poster-workflow.md +0 -56
  592. package/skills/heytea-doodle-poster-hosted/references/style-guide.md +0 -412
  593. package/skills/html2video/SKILL.md +0 -290
  594. package/skills/html2video/references/cjk-type.md +0 -173
  595. package/skills/html2video/references/editorial.md +0 -145
  596. package/skills/html2video/references/narration.md +0 -111
  597. package/skills/html2video/references/pitfalls.md +0 -238
  598. package/skills/html2video/references/shots.md +0 -198
  599. package/skills/html2video/references/storyboard.md +0 -323
  600. package/skills/hyperdirector/SKILL.md +0 -202
  601. package/skills/hyperdirector/docs/audio-workflow.md +0 -160
  602. package/skills/hyperdirector/docs/audio-workflow.zh-CN.md +0 -244
  603. package/skills/hyperdirector/docs/brand-kit-setup.md +0 -322
  604. package/skills/hyperdirector/docs/brand-kit-setup.zh-CN.md +0 -277
  605. package/skills/hyperdirector/docs/cursor-development-notes.md +0 -474
  606. package/skills/hyperdirector/docs/faq.md +0 -285
  607. package/skills/hyperdirector/docs/faq.zh-CN.md +0 -198
  608. package/skills/hyperdirector/docs/first-video.md +0 -320
  609. package/skills/hyperdirector/docs/first-video.zh-CN.md +0 -265
  610. package/skills/hyperdirector/docs/installation.md +0 -254
  611. package/skills/hyperdirector/docs/installation.zh-CN.md +0 -222
  612. package/skills/hyperdirector/docs/quickstart.md +0 -203
  613. package/skills/hyperframes/SKILL.md +0 -117
  614. package/skills/hyperframes/references/captions.md +0 -46
  615. package/skills/hyperframes/references/film.md +0 -48
  616. package/skills/hyperframes/references/format.md +0 -158
  617. package/skills/hyperframes/references/look.md +0 -69
  618. package/skills/hyperframes/references/motion.md +0 -95
  619. package/skills/hyperframes/references/overlays.md +0 -39
  620. package/skills/hyperframes/references/review.md +0 -51
  621. package/skills/hyperframes/references/runtimes.md +0 -69
  622. package/skills/hyperframes/references/skill-lifecycle.md +0 -49
  623. package/skills/hyperframes/references/sound.md +0 -43
  624. package/skills/hyperframes/references/spec.md +0 -76
  625. package/skills/hyperframes/references/story.md +0 -103
  626. package/skills/hyperframes-motion-director/SKILL.md +0 -920
  627. package/skills/hyperframes-motion-director/references/asset-choreography-and-render-qa.md +0 -185
  628. package/skills/hyperframes-motion-director/references/audio-sync.md +0 -83
  629. package/skills/hyperframes-motion-director/references/design-engineering.md +0 -156
  630. package/skills/hyperframes-motion-director/references/gsap-choreography.md +0 -202
  631. package/skills/hyperframes-motion-director/references/hyperframes-stability.md +0 -99
  632. package/skills/hyperframes-motion-director/references/imagegen-asset-pipeline.md +0 -227
  633. package/skills/hyperframes-motion-director/references/motion-background-system.md +0 -165
  634. package/skills/hyperframes-motion-director/references/motion-craft.md +0 -182
  635. package/skills/hyperframes-motion-director/references/premium-product-promo.md +0 -287
  636. package/skills/hyperframes-motion-director/references/text-over-background-layout.md +0 -221
  637. package/skills/hyperframes-motion-director/references/visual-standard.md +0 -174
  638. package/skills/hyperframes-motion-director/references/workflow.md +0 -320
  639. package/skills/hypit/SKILL.md +0 -367
  640. package/skills/hypit/references/creation/brief.md +0 -93
  641. package/skills/hypit/references/creation/script-and-time.md +0 -259
  642. package/skills/hypit/references/creation/transformations.md +0 -143
  643. package/skills/hypit/references/playbooks/craft/b-roll.md +0 -94
  644. package/skills/hypit/references/playbooks/craft/caption-tracking.md +0 -126
  645. package/skills/hypit/references/playbooks/craft/captions.md +0 -253
  646. package/skills/hypit/references/playbooks/craft/generated-dependencies.md +0 -38
  647. package/skills/hypit/references/playbooks/craft/graphic-compositions.md +0 -85
  648. package/skills/hypit/references/playbooks/craft/motion-graphics.md +0 -68
  649. package/skills/hypit/references/playbooks/craft/screen-demonstrations.md +0 -51
  650. package/skills/hypit/references/playbooks/craft/sound-mix.md +0 -70
  651. package/skills/hypit/references/playbooks/formats/narration-led-demo.md +0 -87
  652. package/skills/image/SKILL.md +0 -153
  653. package/skills/image/references/characters.md +0 -86
  654. package/skills/image/references/creative-direction.md +0 -137
  655. package/skills/image/references/de-slop.md +0 -95
  656. package/skills/image/references/dimensional.md +0 -88
  657. package/skills/image/references/editing.md +0 -112
  658. package/skills/image/references/golden-rules.md +0 -198
  659. package/skills/image/references/gpt-image.md +0 -228
  660. package/skills/image/references/models.md +0 -78
  661. package/skills/image/references/multi-panel.md +0 -354
  662. package/skills/image/references/nano-banana.md +0 -150
  663. package/skills/image/references/patterns/character-design.md +0 -150
  664. package/skills/image/references/patterns/ecommerce.md +0 -124
  665. package/skills/image-smixs/SKILL.md +0 -153
  666. package/skills/image-smixs/references/characters.md +0 -86
  667. package/skills/image-smixs/references/creative-direction.md +0 -137
  668. package/skills/image-smixs/references/de-slop.md +0 -95
  669. package/skills/image-smixs/references/dimensional.md +0 -88
  670. package/skills/image-smixs/references/editing.md +0 -112
  671. package/skills/image-smixs/references/golden-rules.md +0 -198
  672. package/skills/image-smixs/references/gpt-image.md +0 -228
  673. package/skills/image-smixs/references/models.md +0 -78
  674. package/skills/image-smixs/references/multi-panel.md +0 -354
  675. package/skills/image-smixs/references/nano-banana.md +0 -150
  676. package/skills/image-smixs/references/patterns/character-design.md +0 -150
  677. package/skills/image-smixs/references/patterns/ecommerce.md +0 -124
  678. package/skills/image-story-video-wizard/SKILL.md +0 -148
  679. package/skills/image-story-video-wizard/docs/ARTICLE_ALIGNMENT.md +0 -29
  680. package/skills/image-story-video-wizard/references/host-routing.md +0 -44
  681. package/skills/image-story-video-wizard/references/state-schema.md +0 -79
  682. package/skills/image-story-video-wizard/references/workflow.md +0 -203
  683. package/skills/image-story-video-wizard/references/writing-and-review.md +0 -60
  684. package/skills/ip-as-logo/SKILL.md +0 -151
  685. package/skills/ip-as-logo-s1dashu/SKILL.md +0 -151
  686. package/skills/jtxvideo-skill/SKILL.md +0 -337
  687. package/skills/kinetic-reel/SKILL.md +0 -140
  688. package/skills/kinetic-reel/examples/work-reel-26/STORYBOARD.md +0 -51
  689. package/skills/kinetic-reel/references/sound.md +0 -40
  690. package/skills/kinetic-reel/references/style-guide.md +0 -79
  691. package/skills/knowledge-explainer-skill/SKILL.md +0 -149
  692. package/skills/knowledge-explainer-skill/examples/ai_video_3steps.md +0 -61
  693. package/skills/knowledge-explainer-skill/examples/algorithm_bubble.md +0 -20
  694. package/skills/knowledge-explainer-skill/examples/before_after_demo.md +0 -38
  695. package/skills/knowledge-explainer-skill/examples/cta_outro.md +0 -11
  696. package/skills/knowledge-explainer-skill/examples/double_pendulum.md +0 -20
  697. package/skills/knowledge-explainer-skill/examples/paper_fold.md +0 -20
  698. package/skills/knowledge-explainer-skill/examples/script.md +0 -40
  699. package/skills/lanshu-create-ai-presenter-video/SKILL.md +0 -253
  700. package/skills/lanshu-create-ai-presenter-video/references/editing.md +0 -67
  701. package/skills/lanshu-create-ai-presenter-video/references/generation.md +0 -94
  702. package/skills/lanshu-create-ai-presenter-video/references/qa-recovery.md +0 -83
  703. package/skills/lanshu-create-ai-presenter-video/references/styled-explainer.md +0 -189
  704. package/skills/laoxu-video-script/SKILL.md +0 -117
  705. package/skills/laoxu-video-script/references/cases.md +0 -305
  706. package/skills/laoxu-video-script/references/de-ai.md +0 -32
  707. package/skills/laoxu-video-script/references/diagnostics.md +0 -67
  708. package/skills/laoxu-video-script/references/format.md +0 -62
  709. package/skills/laoxu-video-script/references/formulas.md +0 -43
  710. package/skills/laoxu-video-script/references/method.md +0 -115
  711. package/skills/laoxu-video-script/references/motifs-and-lines.md +0 -829
  712. package/skills/laoxu-video-script/references/persona.md +0 -38
  713. package/skills/laoxu-video-script/references/qihao-path.md +0 -35
  714. package/skills/laoxu-video-script/references/qihao-xinfa.md +0 -39
  715. package/skills/laoxu-video-script/references/redlines.md +0 -26
  716. package/skills/lemo-opuscar/SKILL.md +0 -67
  717. package/skills/lipnardo/SKILL.md +0 -308
  718. package/skills/lipnardo/examples/batch-personalized.md +0 -44
  719. package/skills/lipnardo/examples/photo-to-avatar-pipeline.md +0 -56
  720. package/skills/lipnardo/examples/single-video.md +0 -44
  721. package/skills/lipnardo/references/avatar-types.md +0 -42
  722. package/skills/lipnardo/references/credit-costs.md +0 -39
  723. package/skills/lipnardo/references/error-codes.md +0 -66
  724. package/skills/lipnardo/references/heygen-api-reference.md +0 -416
  725. package/skills/ll-video-decomposer/SKILL.md +0 -105
  726. package/skills/ll-video-decomposer/references/audiovisual-analysis-guide.md +0 -44
  727. package/skills/ll-video-decomposer/references/evidence-and-confidence-rules.md +0 -41
  728. package/skills/ll-video-decomposer/references/multi-video-comparison-template.md +0 -48
  729. package/skills/ll-video-decomposer/references/single-video-report-template.md +0 -47
  730. package/skills/ll-video-decomposer/references/tool-discovery-workflow.md +0 -30
  731. package/skills/ll-video-decomposer/references/transcription-routing.md +0 -65
  732. package/skills/ll-video-decomposer/references/video-acquisition-workflow.md +0 -30
  733. package/skills/ltx2-video/SKILL.md +0 -193
  734. package/skills/ltx2-video/references/mode_ux.md +0 -293
  735. package/skills/make-ai-short/SKILL.md +0 -130
  736. package/skills/make-blender-education-video/SKILL.md +0 -247
  737. package/skills/make-blender-education-video/references/evidence-and-explanation.md +0 -62
  738. package/skills/make-blender-education-video/references/github-workflow-discovery.md +0 -55
  739. package/skills/make-blender-education-video/references/production-workflow.md +0 -62
  740. package/skills/make-blender-education-video/references/story-patterns.md +0 -65
  741. package/skills/make-blender-education-video/references/visual-quality.md +0 -82
  742. package/skills/manage-storyboard-projects/SKILL.md +0 -128
  743. package/skills/manim-composer/SKILL.md +0 -176
  744. package/skills/manim-composer/references/narrative-patterns.md +0 -125
  745. package/skills/manim-composer/references/scene-examples.md +0 -216
  746. package/skills/manim-composer/references/visual-techniques.md +0 -223
  747. package/skills/manim-composer/templates/scenes-template.md +0 -147
  748. package/skills/monet-ai-editor-monet/SKILL.md +0 -367
  749. package/skills/motion-graphics/SKILL.md +0 -206
  750. package/skills/motion-graphics/references/craft.md +0 -136
  751. package/skills/motion-graphics/references/engine.md +0 -130
  752. package/skills/motion-graphics/references/export.md +0 -67
  753. package/skills/motion-graphics/references/physics.md +0 -100
  754. package/skills/motion-graphics/references/verify.md +0 -124
  755. package/skills/motion-video/SKILL.md +0 -133
  756. package/skills/motion-video/references/audio-and-beat-sync.md +0 -109
  757. package/skills/motion-video/references/composition-contract.md +0 -107
  758. package/skills/motion-video/references/production-pipeline.md +0 -147
  759. package/skills/motion-video/references/style-comic-spiderverse.md +0 -87
  760. package/skills/motion-video/references/style-glass-keynote.md +0 -69
  761. package/skills/motion-video-maker/SKILL.md +0 -1452
  762. package/skills/motion-video-maker/reference/components.md +0 -451
  763. package/skills/motion-video-maker/reference/workflow.md +0 -190
  764. package/skills/motioncraft/SKILL.md +0 -221
  765. package/skills/motioncraft/references/animation-system.md +0 -57
  766. package/skills/motioncraft/references/assets-and-licensing.md +0 -21
  767. package/skills/motioncraft/references/customization.md +0 -52
  768. package/skills/motioncraft/references/gpu-cloud-render.md +0 -15
  769. package/skills/motioncraft/references/music.md +0 -43
  770. package/skills/motioncraft/references/phase1-planning-and-preview.md +0 -74
  771. package/skills/motioncraft/references/phase2-timeline-audio.md +0 -33
  772. package/skills/motioncraft/references/phase3-pixel-review.md +0 -13
  773. package/skills/motioncraft/references/phase4-templates.md +0 -30
  774. package/skills/motioncraft/references/preflight.md +0 -27
  775. package/skills/motioncraft/references/qa.md +0 -53
  776. package/skills/motioncraft/references/reference-analysis.md +0 -37
  777. package/skills/narrator-ai-cli/SKILL.md +0 -256
  778. package/skills/narrator-ai-cli/references/magic-video.md +0 -205
  779. package/skills/narrator-ai-cli/references/operations.md +0 -230
  780. package/skills/narrator-ai-cli/references/resources.md +0 -126
  781. package/skills/narrator-ai-cli/references/workflows.md +0 -332
  782. package/skills/newcut-video-clipping/SKILL.md +0 -194
  783. package/skills/newcut-video-clipping/references/examples.md +0 -59
  784. package/skills/newcut-video-clipping/references/provider-config.md +0 -110
  785. package/skills/newcut-video-clipping/references/quality-check.md +0 -35
  786. package/skills/newcut-video-clipping/references/semantic-plan.md +0 -65
  787. package/skills/notes-to-video/SKILL.md +0 -476
  788. package/skills/openchatcut/SKILL.md +0 -100
  789. package/skills/openchatcut/references/editing-workflow.md +0 -54
  790. package/skills/openchatcut/references/getting-started.md +0 -106
  791. package/skills/openchatcut/references/known-errors.md +0 -62
  792. package/skills/openstoryline-install/SKILL.md +0 -228
  793. package/skills/orca-motion/SKILL.md +0 -100
  794. package/skills/orca-motion/references/api.md +0 -100
  795. package/skills/orca-motion/references/integration.md +0 -59
  796. package/skills/orca-motion/references/kinetic-type.md +0 -59
  797. package/skills/orca-motion/references/principles.md +0 -76
  798. package/skills/package-talking-head-video/SKILL.md +0 -90
  799. package/skills/package-talking-head-video/docs/EXAMPLES.md +0 -18
  800. package/skills/package-talking-head-video/docs/TROUBLESHOOTING.md +0 -29
  801. package/skills/package-talking-head-video/docs/USAGE.md +0 -83
  802. package/skills/package-talking-head-video/docs/superpowers/plans/2026-08-08-multicolor-center-speaker.md +0 -144
  803. package/skills/package-talking-head-video/docs/superpowers/plans/2026-08-08-semantic-template-system-v2.md +0 -1099
  804. package/skills/package-talking-head-video/docs/superpowers/specs/2026-08-08-multicolor-center-speaker-design.md +0 -154
  805. package/skills/package-talking-head-video/docs/superpowers/specs/2026-08-08-semantic-template-system-v2-design.md +0 -365
  806. package/skills/package-talking-head-video/examples/auto-editing-0/GATE_A.md +0 -56
  807. package/skills/package-talking-head-video/examples/auto-editing-0/GATE_D.md +0 -8
  808. package/skills/package-talking-head-video/examples/auto-editing-0/QA_REPORT.md +0 -34
  809. package/skills/package-talking-head-video/references/director-rules.md +0 -29
  810. package/skills/package-talking-head-video/references/motion-and-illustration.md +0 -25
  811. package/skills/paper-cut/SKILL.md +0 -164
  812. package/skills/paper-cut/references/asset-spec.md +0 -47
  813. package/skills/paper-cut/references/audio-and-chatcut.md +0 -26
  814. package/skills/paper-cut/references/hyperframes-assembly.md +0 -47
  815. package/skills/paper-cut/references/image-led-production.md +0 -65
  816. package/skills/paper-cut/references/storyboard-schema.md +0 -48
  817. package/skills/paper-cut/references/workflow.md +0 -39
  818. package/skills/personal-ip-brand-intro/SKILL.md +0 -216
  819. package/skills/personal-ip-brand-intro/references/intake-schema.md +0 -79
  820. package/skills/personal-ip-brand-intro/references/music-upload-workflow.md +0 -40
  821. package/skills/personal-ip-brand-intro/references/originality-rules.md +0 -42
  822. package/skills/personal-ip-brand-intro/references/qa-checklist.md +0 -60
  823. package/skills/personal-ip-brand-intro/references/rhythm-routing.md +0 -41
  824. package/skills/personal-ip-brand-intro/references/storyboard-contract.md +0 -42
  825. package/skills/pixel2motion/SKILL.md +0 -279
  826. package/skills/pixel2motion/references/html-delivery-template.md +0 -42
  827. package/skills/pixel2motion/references/motion-personality.md +0 -109
  828. package/skills/pixel2motion/references/reveal-patterns.md +0 -163
  829. package/skills/pixel2motion/references/ribbon-fitting.md +0 -90
  830. package/skills/pixel2motion/references/twelve-principles-for-logos.md +0 -116
  831. package/skills/premiere-batch-delivery/SKILL.md +0 -71
  832. package/skills/premiere-pro-mcp/SKILL.md +0 -161
  833. package/skills/promo-creator-skills/SKILL.md +0 -209
  834. package/skills/promo-creator-skills/references/mureka_prompt_guide.md +0 -251
  835. package/skills/promo-creator-skills/references/product_promo_bgm_prompting.md +0 -100
  836. package/skills/promo-video/SKILL.md +0 -408
  837. package/skills/qisi-video-remix/SKILL.md +0 -134
  838. package/skills/qisi-video-remix/examples/creative-plan.md +0 -133
  839. package/skills/qisi-video-remix/references/delivery-guide.md +0 -63
  840. package/skills/reel-video/SKILL.md +0 -237
  841. package/skills/remotion-ad-video/SKILL.md +0 -252
  842. package/skills/remotion-ad-video/references/ad-aesthetic-qa.md +0 -60
  843. package/skills/remotion-ad-video/references/ad-brief-contract.md +0 -235
  844. package/skills/remotion-ad-video/references/ad-exemplars.md +0 -186
  845. package/skills/remotion-ad-video/references/ad-intake.md +0 -54
  846. package/skills/remotion-ad-video/references/asset-harvest.md +0 -56
  847. package/skills/remotion-ad-video/references/audio-caption-system.md +0 -202
  848. package/skills/remotion-ad-video/references/concept-contract.md +0 -128
  849. package/skills/remotion-ad-video/references/creative-direction.md +0 -146
  850. package/skills/remotion-ad-video/references/fast-test-workflow.md +0 -86
  851. package/skills/remotion-ad-video/references/game-ad-patterns.md +0 -75
  852. package/skills/remotion-ad-video/references/hyperframes-output.md +0 -90
  853. package/skills/remotion-ad-video/references/industry-angle-library.md +0 -71
  854. package/skills/remotion-ads/SKILL.md +0 -278
  855. package/skills/remotion-ads/references/ad-copywriting.md +0 -229
  856. package/skills/remotion-ads/references/animations.md +0 -693
  857. package/skills/remotion-ads/references/brand-config-template.md +0 -355
  858. package/skills/remotion-ads/references/captions.md +0 -529
  859. package/skills/remotion-ads/references/carousels.md +0 -580
  860. package/skills/remotion-ads/references/components.md +0 -897
  861. package/skills/remotion-ads/references/copy-frameworks.md +0 -144
  862. package/skills/remotion-ads/references/formats.md +0 -436
  863. package/skills/remotion-ads/references/gemini-tts.md +0 -473
  864. package/skills/remotion-ads/references/html-in-canvas.md +0 -555
  865. package/skills/remotion-ads/references/local-assets.md +0 -543
  866. package/skills/remotion-ads/references/music.md +0 -656
  867. package/skills/remotion-code-motion-explainer/SKILL.md +0 -178
  868. package/skills/remotion-code-motion-explainer/references/code-motion-design.md +0 -86
  869. package/skills/remotion-code-motion-explainer/references/motion-production-patterns.md +0 -93
  870. package/skills/remotion-code-motion-explainer/references/production-and-qc.md +0 -99
  871. package/skills/remotion-code-motion-explainer/references/reference-reconstruction.md +0 -48
  872. package/skills/remotion-code-motion-explainer/references/ui-motion-shot-library.md +0 -62
  873. package/skills/remotion-motion-graphics/SKILL.md +0 -169
  874. package/skills/remotion-motion-graphics/references/patterns.md +0 -355
  875. package/skills/remotion-motion-graphics/references/polish.md +0 -102
  876. package/skills/remotion-motion-graphics/references/scaffold.md +0 -144
  877. package/skills/remotion-motion-graphics/references/traps.md +0 -152
  878. package/skills/remotion-resemble-ai/SKILL.md +0 -879
  879. package/skills/remotion-resemble-ai/rules/resemble-captions.md +0 -350
  880. package/skills/remotion-resemble-ai/rules/resemble-remotion-integration.md +0 -305
  881. package/skills/remotion-resemble-ai/rules/resemble-setup.md +0 -284
  882. package/skills/remotion-resemble-ai/rules/resemble-streaming-tts.md +0 -225
  883. package/skills/remotion-resemble-ai/rules/resemble-sync-tts.md +0 -239
  884. package/skills/remotion-resemble-ai/rules/resemble-voices.md +0 -213
  885. package/skills/remotion-resemble-ai/rules/visual-animations.md +0 -567
  886. package/skills/riffkit/SKILL.md +0 -196
  887. package/skills/riffkit/examples/any-look-styles.md +0 -11
  888. package/skills/riffkit/examples/faceless-and-auto.md +0 -16
  889. package/skills/riffkit/examples/localize-spanish.md +0 -18
  890. package/skills/riffkit/examples/tiktok-shop-product.md +0 -22
  891. package/skills/riffkit/references/anchor.md +0 -62
  892. package/skills/riffkit/references/api.md +0 -806
  893. package/skills/riffkit/references/details.md +0 -153
  894. package/skills/riffkit/references/errors.md +0 -69
  895. package/skills/riffkit/references/intents.md +0 -29
  896. package/skills/saas-motion-video/SKILL.md +0 -71
  897. package/skills/script-to-video/SKILL.md +0 -2627
  898. package/skills/shorts/SKILL.md +0 -372
  899. package/skills/shorts/references/caption-styles.md +0 -105
  900. package/skills/shorts/references/platform-specs.md +0 -149
  901. package/skills/shorts/references/remotion-patterns.md +0 -180
  902. package/skills/shorts/references/scoring-rubric.md +0 -106
  903. package/skills/smart-video-editor/SKILL.md +0 -327
  904. package/skills/smart-video-editor/docs/FONTS.md +0 -57
  905. package/skills/story-telling/SKILL.md +0 -222
  906. package/skills/story-telling/rules/composition.md +0 -130
  907. package/skills/story-telling/rules/images.md +0 -119
  908. package/skills/story-telling/rules/models.md +0 -98
  909. package/skills/story-telling/rules/narration.md +0 -87
  910. package/skills/story-telling/rules/pitfalls.md +0 -140
  911. package/skills/story-telling/rules/story-formats.md +0 -108
  912. package/skills/story-telling/rules/story-json.md +0 -143
  913. package/skills/story-telling/rules/voices.md +0 -114
  914. package/skills/story-telling/rules/workflow.md +0 -105
  915. package/skills/story-to-handdrawn-video/SKILL.md +0 -216
  916. package/skills/story-to-handdrawn-video/references/asset-workflow.md +0 -24
  917. package/skills/story-to-handdrawn-video/references/reference-style-workflow.md +0 -27
  918. package/skills/su-card-to-video/SKILL.md +0 -103
  919. package/skills/talking-head-video-pipeline/SKILL.md +0 -224
  920. package/skills/talking-head-video-pipeline/examples/prompts.md +0 -217
  921. package/skills/talking-head-video-pipeline/references/asr-adapters.md +0 -51
  922. package/skills/talking-head-video-pipeline/references/caption-workflow.md +0 -53
  923. package/skills/talking-head-video-pipeline/references/export-recipes.md +0 -78
  924. package/skills/talking-head-video-pipeline/references/layout-safety.md +0 -49
  925. package/skills/talking-head-video-pipeline/references/video-use-integration.md +0 -71
  926. package/skills/talking-head-video-pipeline/references/workflows/captions.md +0 -52
  927. package/skills/talking-head-video-pipeline/references/workflows/design.md +0 -77
  928. package/skills/talking-head-video-pipeline/references/workflows/doctor.md +0 -51
  929. package/skills/talking-head-video-pipeline/references/workflows/export.md +0 -50
  930. package/skills/talking-head-video-pipeline/references/workflows/init.md +0 -51
  931. package/skills/talking-head-video-pipeline/references/workflows/learn.md +0 -36
  932. package/skills/text-to-lottie/SKILL.md +0 -202
  933. package/skills/text-to-lottie/references/chapterization-transition-grammar.md +0 -132
  934. package/skills/text-to-lottie/references/design-taste.md +0 -292
  935. package/skills/text-to-lottie/references/lottie-spec-map.md +0 -82
  936. package/skills/text-to-lottie/references/motion-taste.md +0 -260
  937. package/skills/text-to-lottie/references/player-contract.md +0 -325
  938. package/skills/text-to-lottie/references/recipe-camera-scene-motion.md +0 -65
  939. package/skills/text-to-lottie/references/recipe-data-stats.md +0 -104
  940. package/skills/text-to-lottie/references/recipe-diagram-technical.md +0 -106
  941. package/skills/text-to-lottie/references/recipe-loaders-icons.md +0 -70
  942. package/skills/text-to-lottie/references/recipe-logo.md +0 -72
  943. package/skills/text-to-lottie/references/recipe-lower-thirds.md +0 -62
  944. package/skills/text-to-lottie/references/recipe-product-promo.md +0 -99
  945. package/skills/ultrademo/SKILL.md +0 -212
  946. package/skills/video-assemble/SKILL.md +0 -101
  947. package/skills/video-assemble-zenstory-ai/SKILL.md +0 -153
  948. package/skills/video-assemble-zenstory-ai/references/audio-modes.md +0 -63
  949. package/skills/video-assemble-zenstory-ai/references/explicit-audio-mix.md +0 -77
  950. package/skills/video-assemble-zenstory-ai/references/jianying/SOURCE.md +0 -14
  951. package/skills/video-assemble-zenstory-ai/references/narration-adoption.md +0 -103
  952. package/skills/video-assemble-zenstory-ai/references/packaging.md +0 -44
  953. package/skills/video-assemble-zenstory-ai/references/source-score.md +0 -146
  954. package/skills/video-assemble-zenstory-ai/references/subtitle-track.md +0 -202
  955. package/skills/video-editing/SKILL.md +0 -688
  956. package/skills/video-explainer/SKILL.md +0 -163
  957. package/skills/video-explainer/references/brief-to-script.md +0 -56
  958. package/skills/video-explainer/references/errors-and-privacy.md +0 -18
  959. package/skills/video-explainer/references/motion-storyboard.md +0 -82
  960. package/skills/video-explainer/references/render-and-verify.md +0 -62
  961. package/skills/video-explainer/references/review-gate.md +0 -82
  962. package/skills/video-explainer/references/setup-and-doctor.md +0 -33
  963. package/skills/video-script-builder/SKILL.md +0 -329
  964. package/skills/video-script-builder/examples/quick-start-transcript.md +0 -19
  965. package/skills/video-script-builder/references/audio-workflow.md +0 -84
  966. package/skills/video-script-builder/references/caption-components.md +0 -70
  967. package/skills/video-script-builder/references/common-pitfalls.md +0 -80
  968. package/skills/video-script-builder/references/component-catalog.md +0 -197
  969. package/skills/video-script-builder/references/component-recipes.md +0 -165
  970. package/skills/video-script-builder/references/gsap-patterns.md +0 -112
  971. package/skills/video-script-builder/references/pacing-rules.md +0 -78
  972. package/skills/video-script-builder/references/quality-checklist.md +0 -98
  973. package/skills/video-script-builder/references/remotion-patterns.md +0 -211
  974. package/skills/video-script-builder/references/shader-transitions.md +0 -115
  975. package/skills/video-script-builder/references/taste-principles.md +0 -160
  976. package/skills/video-scrub/SKILL.md +0 -216
  977. package/skills/video-scrub/references/profiles.md +0 -89
  978. package/skills/video-scrub/references/residue-map.md +0 -204
  979. package/skills/video-short-maker/SKILL.md +0 -182
  980. package/skills/video-shot-analysis-feishu/SKILL.md +0 -173
  981. package/skills/video-shotcraft/SKILL.md +0 -267
  982. package/skills/video-shotcraft/docs/deepseek-harness.md +0 -69
  983. package/skills/video-shotcraft/references/aesthetic-rules.md +0 -177
  984. package/skills/video-shotcraft/references/final-review.md +0 -112
  985. package/skills/video-shotcraft/references/guided-free-creation.md +0 -199
  986. package/skills/video-shotcraft/references/jianying-export.md +0 -182
  987. package/skills/video-shotcraft/references/music-beat-sync.md +0 -219
  988. package/skills/video-shotcraft/references/pipeline.md +0 -390
  989. package/skills/video-shotcraft/references/sequences/promo-energy-arc.md +0 -50
  990. package/skills/video-shotcraft/references/shots/ATTRIBUTION.md +0 -65
  991. package/skills/video-shotcraft/references/shots/camera/basic-3d-scene.md +0 -37
  992. package/skills/video-shotcraft/references/shots/camera/crash-zoom-punch.md +0 -39
  993. package/skills/video-shotcraft/references/shots/camera/cursor-flyover.md +0 -38
  994. package/skills/video-shotcraft-vincentwei10/SKILL.md +0 -316
  995. package/skills/video-shotcraft-vincentwei10/references/aesthetic-rules.md +0 -187
  996. package/skills/video-shotcraft-vincentwei10/references/final-review.md +0 -116
  997. package/skills/video-shotcraft-vincentwei10/references/guided-free-creation.md +0 -199
  998. package/skills/video-shotcraft-vincentwei10/references/jianying-export.md +0 -183
  999. package/skills/video-shotcraft-vincentwei10/references/music-beat-sync.md +0 -257
  1000. package/skills/video-shotcraft-vincentwei10/references/pipeline.md +0 -401
  1001. package/skills/video-shotcraft-vincentwei10/references/publish-upload-post.md +0 -111
  1002. package/skills/video-shotcraft-vincentwei10/references/sequences/promo-energy-arc.md +0 -50
  1003. package/skills/video-shotcraft-vincentwei10/references/shots/ATTRIBUTION.md +0 -62
  1004. package/skills/video-shotcraft-vincentwei10/references/shots/camera/basic-3d-scene.md +0 -41
  1005. package/skills/video-shotcraft-vincentwei10/references/shots/camera/crash-zoom-punch.md +0 -52
  1006. package/skills/video-shotcraft-vincentwei10/references/shots/camera/cursor-flyover.md +0 -39
  1007. package/skills/video-structure-analyzer/SKILL.md +0 -148
  1008. package/skills/video-structure-analyzer/examples/xhs-rook-time-spend/xhs-rook-time-spend_/346/213/211/347/211/207/346/213/206/350/247/243.md +0 -50
  1009. package/skills/video-structure-analyzer/examples/xhs-smelly-cat/xhs-smelly-cat_/346/213/211/347/211/207/346/213/206/350/247/243.md +0 -19
  1010. package/skills/video-toolkit/SKILL.md +0 -686
  1011. package/skills/videocut/SKILL.md +0 -159
  1012. package/skills/videodb/SKILL.md +0 -497
  1013. package/skills/videodb/reference/api-reference.md +0 -741
  1014. package/skills/videodb/reference/capture-reference.md +0 -399
  1015. package/skills/videodb/reference/capture.md +0 -110
  1016. package/skills/videodb/reference/editor-reference.md +0 -506
  1017. package/skills/videodb/reference/editor.md +0 -389
  1018. package/skills/videodb/reference/generative.md +0 -344
  1019. package/skills/videodb/reference/indexing-reference.md +0 -481
  1020. package/skills/videodb/reference/indexing.md +0 -537
  1021. package/skills/videodb/reference/legacy/index-reference.md +0 -223
  1022. package/skills/videodb/reference/legacy/index.md +0 -241
  1023. package/skills/videodb/reference/legacy/search.md +0 -249
  1024. package/skills/videodb/reference/migration.md +0 -113
  1025. package/skills/vlog-auto-edit/SKILL.md +0 -982
  1026. package/skills/vlog-auto-edit/examples/project_structure.md +0 -84
  1027. package/skills/vox-animated-ad-mcp/SKILL.md +0 -419
  1028. package/skills/vox-director/SKILL.md +0 -351
  1029. package/skills/vox-director/references/beat-layer.md +0 -143
  1030. package/skills/vox-director/references/host-mode.md +0 -120
  1031. package/skills/vox-director/references/local-engine.md +0 -73
  1032. package/skills/vox-director/references/models-and-gotchas.md +0 -91
  1033. package/skills/vox-director/references/prompt-guide.md +0 -275
  1034. package/skills/vox-director/references/voices.md +0 -59
  1035. package/skills/xingchen-vox-collage/SKILL.md +0 -251
  1036. package/skills/xingchen-vox-collage/references/asset-layer-contract.md +0 -98
  1037. package/skills/xingchen-vox-collage/references/creative-exploration.md +0 -19
  1038. package/skills/xingchen-vox-collage/references/learned-branches.md +0 -34
  1039. package/skills/xingchen-vox-collage/references/remotion-scene-contract.md +0 -77
  1040. package/skills/xingchen-vox-collage/references/visual-language.md +0 -74
  1041. package/skills/xingchen-vox-collage/references/visual-qa.md +0 -59
  1042. package/skills/youtube/SKILL.md +0 -147
  1043. package/skills/youtube/references/algorithm-guide.md +0 -59
  1044. package/skills/youtube/references/analytics-benchmarks.md +0 -67
  1045. package/skills/youtube/references/dataforseo-integration.md +0 -51
  1046. package/skills/youtube/references/monetization-guide.md +0 -62
  1047. package/skills/youtube/references/repurposing-guide.md +0 -54
  1048. package/skills/youtube/references/retention-scripting-guide.md +0 -75
  1049. package/skills/youtube/references/seo-playbook.md +0 -77
  1050. package/skills/youtube/references/shorts-playbook.md +0 -64
  1051. package/skills/youtube/references/thumbnail-ctr-guide.md +0 -73
  1052. package/skills/youtube-shorts-factory/SKILL.md +0 -358
  1053. package/skills/youtube-shorts-factory/resources/adaptation-guide.md +0 -133
  1054. package/skills/youtube-shorts-factory/resources/storyboard-template.md +0 -271
  1055. package/skills/youtube-shorts-factory/resources/workflow-steps.md +0 -139
  1056. package/studio/ui/dist/assets/ExportCenter-DEyy1vs_.js +0 -1
  1057. package/studio/ui/dist/assets/SettingsModal-CQmsA2A2.js +0 -2
  1058. package/studio/ui/dist/assets/es-AqUfIkAy.js +0 -1
  1059. package/studio/ui/dist/assets/index-C7moXjTY.css +0 -1
  1060. package/studio/ui/dist/assets/index-DdU5QNpY.js +0 -1623
  1061. package/studio/ui/dist/assets/ja-YwiCB4QQ.js +0 -1
  1062. package/studio/ui/dist/assets/ko-CKtBPDze.js +0 -1
  1063. package/studio/ui/dist/assets/zh-CN-DtNEwKWJ.js +0 -1
@@ -1,2627 +0,0 @@
1
- ---
2
- name: script-to-video
3
- description: "Full pipeline — topic/script/text file → OmiVoice TTS (Prince's voice) → Whisper word-level timestamps → AICUT synced video composition. Use when asked to \"make a video about\", \"create a voiced video\", \"script to video\", \"voice and animate\", \"narrate and compose\", or \"turn this into a video with audio\". Also handles \"catalog showcase\" (transcribe existing video or audio file → apply all scene types) and \"talking-cut\" (talking head video + graphic cutaway scenes). Runs in AICUT: the film is film.html, a page per shot, drawn by `aicut look` and `aicut render`."
4
- license: MIT
5
- source: "pjecuacion/script-to-video-skill"
6
- ---
7
-
8
- # Script-to-Video Pipeline
9
-
10
- ## Running it in AICUT
11
-
12
- AICUT's film is `film.html`: it cuts pages, footage, pictures and sound together on tracks. A page is a web page that
13
- sets `window.film = { frame(t) }` and draws that moment — no framework, no build step, no composition object, no
14
- `registerRoot`. Five shots are five pages cut together, not one page that changes scene, so each shot stays trimmable
15
- and replaceable in Studio.
16
-
17
- ```sh
18
- npx -y @autoaiai/aicut@latest # the manual: the format and the commands, always current
19
- npx -y @autoaiai/aicut@latest open . # make this folder a film and print Studio's address
20
- npx -y @autoaiai/aicut@latest look # a contact sheet of the whole film, its sound, and a determinism check
21
- npx -y @autoaiai/aicut@latest look 4.5 # one frame, full size — look at the PNG, not at the code
22
- npx -y @autoaiai/aicut@latest render # the MP4, beside film.html
23
- ```
24
-
25
- Run the manual before the first film: it is authoritative for the format, and this skill is about the method above it.
26
-
27
- Where the words below name another program's part, it becomes this:
28
-
29
- | elsewhere | in AICUT |
30
- |---|---|
31
- | composition, timeline, project file | `film.html`; tracks and clips inside it |
32
- | a scene, a sequence, a slide | a page (`pages/<name>.html`) cut onto a track |
33
- | `useCurrentFrame()`, `interpolate()` | `frame(t)` — the picture depends only on `t`, never on state or `Date.now()` |
34
- | a still, a screengrab | `aicut look <t>` |
35
- | `render` / `build` / `export` | `aicut render` (the person can also export from Studio) |
36
- | a dev server, a preview window | `aicut open` and the Studio address it prints |
37
-
38
- Hard rules that hold whatever the method says: the picture depends only on `t`; every value in the person's prompt is
39
- binding; look at the frames `look` writes before saying a film is done.
40
-
41
-
42
- Orchestrates four skills end-to-end:
43
-
44
- 1. **Script** — prepare the voiceover text
45
- 2. **Synthesize** — OmiVoice TTS → WAV
46
- 3. **Transcribe** — word-level timestamps via HyperFrames CLI
47
- 4. **Storyboard** — assign a unique scene type to every sentence
48
- 5. **Compose** — HyperFrames full video, one richly designed scene per sentence
49
-
50
- Default output: **1920×1080 landscape**, dark premium style, audio voiced as Prince.
51
-
52
- **The goal:** every sentence gets a visually distinct treatment. No two consecutive scenes look alike. Use all of HyperFrames' scene types — bar charts, flow steps, stat reveals, counter-ups, list reveals, progress rings, callouts, kinetic text, and more. This is a showcase of what the platform can do.
53
-
54
- **Public repo note:** this version uses placeholder local paths and environment variables for anything machine-specific or secret. Replace those values with paths that exist on your system before running the pipeline.
55
-
56
- ---
57
-
58
- ## Catalog Showcase Mode
59
-
60
- **Trigger phrases:** "catalog showcase", "showcase all scene types", "show me all the scenes"
61
-
62
- This mode skips TTS synthesis. It takes an **existing video or audio file** as the source, transcribes it, and builds a HyperFrames composition that uses as many unique scene types as possible — one per sentence, no repeats.
63
-
64
- **How to invoke:**
65
- > "catalog showcase from `<path-to-video-or-audio>`"
66
-
67
- **Source type detection:**
68
- - **Video file** (`.mp4`, `.mov`, `.mkv`, etc.) → extract audio with ffmpeg first, then transcribe
69
- - **Audio file** (`.wav`, `.mp3`, `.m4a`, `.aac`, etc.) → transcribe directly, skip ffmpeg extraction
70
-
71
- **What I'll do (video source):**
72
- 0. Detect source FPS with ffprobe — use it for the render command
73
- 1. Extract mono 16kHz WAV from the source video with ffmpeg
74
- 2. Transcribe with Whisper (`small.en` model)
75
- 3. Map each sentence to a unique scene type from the catalog (no two consecutive types the same)
76
- 4. Build the full composition in `C:\openclaw_files\projects\<slug>\`
77
- 5. Lint → Render → deliver MP4 (`npx hyperframes render --fps <mapped_fps> --output <slug>.mp4`, where mapped_fps is 24/30/60 — the nearest HyperFrames-supported value)
78
-
79
- **What I'll do (audio source):**
80
- 0. Skip ffmpeg extraction — use the audio file directly
81
- 1. Transcribe with Whisper (`small.en` model)
82
- 2. Map each sentence to a unique scene type from the catalog (no two consecutive types the same)
83
- 3. Copy audio into the project's `audio/` folder
84
- 4. Build the full composition in `C:\openclaw_files\projects\<slug>\`
85
- 5. Lint → Render → deliver MP4 at `--fps 60` (default, since there is no source video FPS to detect)
86
-
87
- **Detect source FPS before step 1 (video source only):**
88
- ```bash
89
- -show_entries stream=avg_frame_rate -of csv=p=0 source.mp4
90
- ```
91
-
92
- # → outputs e.g. "30/1" or "60000/1001". Round to nearest int → SRC_FPS (e.g. 30, 60, 25, 50).
93
-
94
- # HyperFrames render only accepts 24, 30, or 60. Map SRC_FPS to nearest supported value:
95
-
96
- # SRC_FPS ≤ 26 → --fps 24
97
-
98
- # SRC_FPS 27-45 → --fps 30
99
-
100
- # SRC_FPS ≥ 46 → --fps 60
101
-
102
- # Pass this to the render command: npx hyperframes render --fps <mapped_fps> --output <slug>.mp4
103
-
104
- # For audio-only sources: always use --fps 60
105
- ```
106
- **Reference project:** `C:\openclaw_files\projects\yt-create-app\` — 15 scenes, 15 unique types, 51.5s, Shadow Cut theme.
107
-
108
- **Scene type priority order for showcase builds** (use as many as possible before repeating):
109
- title-card → kinetic-impact → kinetic-slam → kinetic-text → quote-card → callout → comparison → bar-chart → stat-reveal → counter-up → split-layout → doodle-split → flow-steps-text → progress-ring → list-reveal-words → outro-card → list-reveal → flow-steps → icon-grid → comparison-verdict → cta-callout
110
-
111
- ---
112
- ```
113
-
114
- ## Talking-Cut Mode
115
-
116
- **Trigger phrases:** "talking-cut from `<path>`", "mix talking head with graphics", "cutaway style"
117
-
118
- Takes a **talking head video** and alternates between showing the raw footage and HyperFrames graphic cutaways. The VO audio continues during graphic scenes — same as how YouTube creators cut to a chart or kinetic text while still talking.
119
-
120
- **How to invoke:**
121
- > "talking-cut from `<path-to-video>`"
122
-
123
- **Architecture (critical rules):**
124
- - The full source video sits in a **plain non-timed wrapper div** (NOT a `.clip`) — `z-index:1`
125
- - Graphic cutaway scenes are `.clip` divs at `z-index:2` — they cover the video during their window
126
- - When no clip is active ("face cam" moments), the video shows through naturally
127
- - **No pre-cutting of segments needed** — video plays continuously; clips overlay on top
128
- - Source video MUST be re-encoded with dense keyframes before use (see Sync-Safe Encode below)
129
- - Audio is extracted separately as WAV and used as the HyperFrames audio track (video element is `muted`)
130
- - **Minimum gap between cutaway clips: ≥3 seconds** — gaps shorter than 3s feel like jarring micro-flashes of face-cam. If two storyboard scenes are close together, push the later one out until the gap is ≥3s and reduce its duration to compensate.
131
-
132
- ### ⚠️ Sync-Safe Encode — CRITICAL for lip sync (confirmed fix)
133
-
134
- **The #1 cause of lip-sync drift in talking-cut:** extracting audio from a VFR (variable frame-rate) source while re-encoding video to a different CFR. VFR→CFR conversion shifts video timestamps; the WAV retains original timing → progressive drift accumulates throughout the composition.
135
-
136
- **The fix — detect source FPS first, then extract audio from the SAME CFR encode as the video:**
137
-
138
- # Step 0: Detect source FPS — always run this before encoding
139
- ffprobe -v quiet -select_streams v:0 \
140
- -show_entries stream=avg_frame_rate -of csv=p=0 source.mp4
141
-
142
- # → outputs a fraction like "30/1" or "60000/1001"
143
-
144
- # Round to nearest integer → SRC_FPS (e.g. 30, 60, 25, 24)
145
-
146
- # Substitute SRC_FPS into all -r / -g / -keyint_min flags below.
147
-
148
- # Step 1: Re-encode source to SRC_FPS CFR WITH audio preserved
149
- ffmpeg -y -i source.mp4 -c:v libx264 -r SRC_FPS -g SRC_FPS -keyint_min SRC_FPS \
150
- -movflags +faststart -c:a copy assets/source-kf-audio.mp4
151
-
152
- # Step 2: Extract WAV from THAT same encode (not from the original!)
153
- ffmpeg -y -i assets/source-kf-audio.mp4 \
154
- -vn -ac 1 -ar 44100 -c:a pcm_s16le audio/<slug>.wav
155
-
156
- # Step 3: Strip audio for the muted face-cam video (same timing baseline)
157
- ffmpeg -y -i assets/source-kf-audio.mp4 -c:v copy -an assets/source-kf.mp4
158
- ```
159
- **Why this works:** All three outputs come from the same CFR encode — video timestamps and audio timestamps share the same baseline. No drift possible. Using the source FPS (instead of a fixed 30fps) also preserves the original motion cadence and avoids unnecessary frame interpolation or drop.
160
-
161
- **data-duration — use the actual video file duration, NOT Whisper's estimate:**
162
- ```
163
-
164
- # Get correct duration
165
- ffprobe -v quiet -show_entries format=duration -of csv=p=0 assets/source-kf.mp4
166
- ```
167
- Use this value for ALL `data-duration` attributes (root div, audio, video, s10 outro). Whisper's internal duration estimate is often off by 2–4 seconds and causes over-run at the end.
168
-
169
- **Track index rules for talking-cut:**
170
- - Face-cam `<video>` → `data-track-index="0"`
171
- - `<audio data-main-audio>` → **no `data-track-index` attribute** (omit it entirely — adding it causes `overlapping_clips_same_track` lint error when video is also on track 0)
172
- - Cutaway `.clip` divs → `data-track-index="1"`
173
-
174
- **Typical scene pattern for a 10–15s video:**
175
- ```
176
- ```
177
- 0–4s → face cam (no clip active)
178
- 4–7.5s → graphic cutaway: kinetic-text, stat-reveal, bar-chart, etc.
179
- 7.5–10.5s → face cam
180
- 10.5–end → graphic cutaway: callout or outro-card
181
- ```
182
- ```
183
- **Reference project:** `C:\openclaw_files\projects\talking-cut-sample\` — 12.89s, 2 cutaways (kinetic-text + callout), Shadow Cut theme.
184
-
185
- **Video wrapper pattern (copy exactly):**
186
- ```
187
- ```html
188
- <!-- Plain non-timed wrapper — NOT a .clip div -->
189
- <!-- No autoplay — HyperFrames owns playback via data-track-index -->
190
- <div id="v-wrap" style="position:absolute;inset:0;z-index:1;">
191
- <video id="bg-video" src="assets/source-kf.mp4" muted playsinline
192
- data-start="0" data-duration="TOTAL_DURATION" data-track-index="0"
193
- style="width:100%;height:100%;object-fit:cover;"></video>
194
- </div>
195
- ```
196
- **Audio element pattern (omit data-track-index):**
197
- ```
198
- ```html
199
- <!-- data-main-audio identifies this as the main audio track -->
200
- <!-- Do NOT add data-track-index — it will conflict with the video on track 0 -->
201
- <audio id="main-audio" data-start="0" data-duration="TOTAL_DURATION"
202
- src="audio/<slug>.wav" data-main-audio></audio>
203
- ```
204
- **Graphic cutaway clip pattern:**
205
- ```
206
- ```html
207
- <!-- z-index:2 covers the video when this clip is active -->
208
- <div id="sN" class="clip" data-start="4.0" data-duration="3.5" data-track-index="1"
209
- style="z-index:2;">
210
- <!-- any scene type from the catalog -->
211
- </div>
212
- ```
213
- ---
214
- ```
215
-
216
- ## Step 0: Derive a Slug
217
-
218
- ## Step 1: Script Preparation
219
-
220
- Three input modes:
221
-
222
- ### Topic only
223
- Write a voiceover script. Target ≤250 words (~90 seconds at natural speech pace).
224
- Structure: hook (1–2 sentences) → body (3–4 paragraphs) → close (1 sentence).
225
- Write for the ear: short sentences, no jargon, natural rhythm.
226
-
227
- ### Script text provided
228
- Use as-is. Clean up punctuation if needed for natural TTS delivery.
229
-
230
- ### File path provided
231
- Read the file. Treat contents as the script.
232
-
233
- ---
234
-
235
- ## Step 2: OmiVoice Synthesis
236
-
237
- ### Check server
238
- ```python
239
- import urllib.request
240
- try:
241
- urllib.request.urlopen("http://127.0.0.1:8261", timeout=3)
242
- print("Server up")
243
- except:
244
- print("Server offline — start it")
245
- ```
246
- If offline, run your local OmiVoice start script, for example `path\to\OmniVoice\start.bat`
247
- Wait ~10 seconds before proceeding.
248
- ```
249
-
250
- ### Synthesize
251
- ```python
252
- import os
253
- os.environ["PYTHONIOENCODING"] = "utf-8"
254
-
255
- from gradio_client import Client, handle_file
256
-
257
- OUTPUT_DIR = r"C:\\openclaw_files\outputs"
258
- os.makedirs(OUTPUT_DIR, exist_ok=True)
259
-
260
- client = Client("http://127.0.0.1:8261")
261
- result = client.predict(
262
- text=SCRIPT_TEXT,
263
- lang="Auto",
264
- ref_aud=handle_file(r"<path-to-reference-voice-sample>.mp3"),
265
- ref_text="",
266
- instruct="",
267
- ns=32,
268
- gs=2.0,
269
- dn=True,
270
- sp=1.0,
271
- du=0,
272
- pp=True,
273
- po=True,
274
- api_name="/_clone_fn",
275
- )
276
-
277
- # result is a filepath, list, or dict
278
- if isinstance(result, (list, tuple)):
279
- src = result[0]
280
- elif isinstance(result, dict) and "value" in result:
281
- src = result["value"]
282
- else:
283
- src = result
284
-
285
- import shutil
286
- wav_path = os.path.join(OUTPUT_DIR, f"{SLUG}.wav")
287
- shutil.copy(str(src), wav_path)
288
- print(f"Audio: {wav_path}")
289
- ```
290
- Output WAV: `C:\\openclaw_files\outputs\<slug>.wav`
291
-
292
- ---
293
- ```
294
-
295
- ## Step 3: Transcription
296
-
297
- ```bash
298
- npx -y @autoaiai/aicut@latest open .
299
- ```
300
- ```
301
- This produces `transcript.json` in the current directory. Move/copy it into the project folder after scaffolding (Step 4).
302
-
303
- > **Why `small.en`:** TTS audio is clean English speech — no background noise, no music. `small.en` is fast and accurate for this use case.
304
- ```
305
-
306
- ### Quality Check (mandatory)
307
-
308
- After transcription, load the JSON and run:
309
-
310
- ```js
311
- var raw = JSON.parse(transcriptJson);
312
- var words = raw.filter(function (w) {
313
- if (!w.text || w.text.trim().length === 0) return false;
314
- if (/^[♪♫♬♭♮♯\u{1F3B5}\u{1F3B6}]+$/u.test(w.text)) return false;
315
- if (/^(huh|uh|um|ah|oh)$/i.test(w.text) && w.end - w.start < 0.1) return false;
316
- return true;
317
- });
318
- ```
319
- If >20% entries are music tokens or garbled, retry with `--model medium.en`.
320
-
321
- ---
322
- ```
323
-
324
- ## Step 3.5: Storyboard
325
-
326
- **Do this before touching index.html.** Split the script into individual sentences. For each sentence, find its start/end time from the transcript (match the first and last word). Assign a scene type using the rules in Step 4c. Produce a storyboard JSON.
327
-
328
- ```python
329
- import json, re
330
-
331
- SCRIPT = """<your script here>"""
332
- WORDS = json.load(open("transcript.json")) # [{text, start, end}, ...]
333
-
334
- # Split script into sentences
335
- sentences = [s.strip() for s in re.split(r'(?<=[.!?])\s+', SCRIPT) if s.strip()]
336
-
337
- def find_time(word_text, words, from_index=0, last=False):
338
- """Find start/end time of a word in the transcript."""
339
- matches = [w for i, w in enumerate(words) if i >= from_index
340
- and w["text"].strip(".,!?").lower() == word_text.strip(".,!?").lower()]
341
- if not matches: return None
342
- return matches[-1] if last else matches[0]
343
-
344
- storyboard = []
345
- search_from = 0
346
- for i, sentence in enumerate(sentences):
347
- words_in_sentence = sentence.split()
348
- first_word = words_in_sentence[0] if words_in_sentence else ""
349
- last_word = words_in_sentence[-1] if words_in_sentence else ""
350
- start_w = find_time(first_word, WORDS, from_index=search_from)
351
- end_w = find_time(last_word, WORDS, from_index=search_from, last=True)
352
- storyboard.append({
353
- "id": i + 1,
354
- "sentence": sentence,
355
- "type": "TBD", # fill in from type assignment rules in Step 4c
356
- "startTime": start_w["start"] if start_w else None,
357
- "endTime": end_w["end"] if end_w else None,
358
- })
359
- if start_w:
360
- search_from = WORDS.index(start_w)
361
-
362
- print(json.dumps(storyboard, indent=2))
363
- ```
364
- After generating the storyboard, **manually assign scene types** from Step 4c rules. Print the final storyboard to confirm no two consecutive scenes share a type before proceeding.
365
-
366
- ---
367
- ```
368
-
369
- ## Step 3.6: Fetch Pexels Assets
370
-
371
- > **Only run this step if any scene has type `pexels-hero`.**
372
- > Run it after scaffolding the project (Step 4a) so the `assets/` folder exists.
373
-
374
- ### Storyboard extension for pexels-hero scenes
375
-
376
- Add a `pexels` object to any storyboard entry that uses this type:
377
-
378
- ```json
379
- {
380
- "id": 3,
381
- "sentence": "Behind every great product is a human struggling with a real problem.",
382
- "type": "pexels-hero",
383
- "pexels": {
384
- "query": "developer coding laptop focus",
385
- "media": "video",
386
- "file": "assets/pexels-s3.mp4"
387
- },
388
- "startTime": 8.1,
389
- "endTime": 12.6
390
- }
391
- ```
392
- - `query` — plain English Pexels search. Be specific: prefer `"developer typing code dark office"` over `"coding"`.
393
- - `media` — `"photo"` (static) or `"video"` (looping). Prefer video for emotional impact; photo for crisp product shots.
394
- - `file` — output path (filled in by the fetch script below; do not invent — run the script).
395
- ```
396
-
397
- ### Python fetch script
398
-
399
- Run once per project, after `npx hyperframes init`:
400
-
401
- ```python
402
- import os, requests, shutil
403
-
404
- PEXELS_API_KEY = os.environ.get("PEXELS_API_KEY")
405
- if not PEXELS_API_KEY:
406
- raise RuntimeError("Set PEXELS_API_KEY before running the fetch script.")
407
- HEADERS = {"Authorization": PEXELS_API_KEY}
408
- ASSETS_DIR = r"C:\openclaw_files\projects\<slug>\assets"
409
- os.makedirs(ASSETS_DIR, exist_ok=True)
410
-
411
- def fetch_photo(query, scene_id):
412
- r = requests.get("https://api.pexels.com/v1/search",
413
- params={"query": query, "per_page": 3, "orientation": "landscape"},
414
- headers=HEADERS)
415
- photos = r.json().get("photos", [])
416
- if not photos:
417
- print(f" [!] No photo for: {query}"); return None
418
- url = photos[0]["src"]["large2x"] # 2560px wide, landscape
419
- out = os.path.join(ASSETS_DIR, f"pexels-s{scene_id}.jpg")
420
- with requests.get(url, stream=True) as resp:
421
- with open(out, "wb") as f:
422
- shutil.copyfileobj(resp.raw, f)
423
- print(f" [photo] s{scene_id} → {out}")
424
- return out
425
-
426
- def fetch_video(query, scene_id):
427
- r = requests.get("https://api.pexels.com/videos/search",
428
- params={"query": query, "per_page": 3, "orientation": "landscape"},
429
- headers=HEADERS)
430
- videos = r.json().get("videos", [])
431
- if not videos:
432
- print(f" [!] No video for: {query}"); return None
433
- # Prefer HD (720p) — FHD may be too large for short clips
434
- files = videos[0]["video_files"]
435
- hd = next((f for f in files if f.get("quality") == "hd"), None) or files[0]
436
- out = os.path.join(ASSETS_DIR, f"pexels-s{scene_id}.mp4")
437
- with requests.get(hd["link"], stream=True) as resp:
438
- with open(out, "wb") as f:
439
- shutil.copyfileobj(resp.raw, f)
440
- print(f" [video] s{scene_id} → {out}")
441
- return out
442
-
443
- # ── Edit this list to match your storyboard pexels-hero scenes ──────────────
444
- PEXELS_SCENES = [
445
- # (scene_id, query, media_type)
446
- (3, "developer coding laptop dark", "video"),
447
- (7, "abstract technology neon data", "photo"),
448
- ]
449
-
450
- print("Fetching Pexels assets...")
451
- for scene_id, query, media in PEXELS_SCENES:
452
- if media == "video":
453
- fetch_video(query, scene_id)
454
- else:
455
- fetch_photo(query, scene_id)
456
- print("Done.")
457
- ```
458
- **Attribution note:** Pexels requires attribution when displaying images/videos publicly. Add a small credit in your project README or in the video description: *"Photos/videos provided by Pexels (pexels.com)"*.
459
-
460
- ---
461
- ```
462
-
463
- ## Step 4: HyperFrames Composition
464
-
465
- ### 4a. Scaffold the project
466
-
467
- ```bash
468
- cd C:\\openclaw_files\projects
469
- npx -y @autoaiai/aicut@latest open .
470
- cd <slug>
471
- ```
472
- ```
473
- Copy `transcript.json` into the project root.
474
- ```
475
-
476
- ### 4b. Visual Identity
477
-
478
- Themes are defined in `themes/` next to this skill file (one JSON file per theme).
479
- **Default theme: Shadow Cut** (`themes/shadow-cut.json`).
480
-
481
- **If the user specified a style or mood** → use the closest theme:
482
-
483
- | User says | Theme file |
484
- |-----------|-----------|
485
- | dark / cinematic / dramatic | `shadow-cut` |
486
- | light / white / handwriting / casual | `open-page` |
487
- | futuristic / AI / cyberpunk / neon / tech | `neon-tokyo` |
488
- | hacker / dev / coding / terminal / CLI | `terminal-green` |
489
- | editorial / journalism / newspaper | `broadsheet` |
490
- | technical / engineering / process / spec | `blueprint` |
491
- | luxury / premium / finance / gold | `velvet-standard` |
492
- | creator / lifestyle / sunset / personal brand | `dusk-gradient` |
493
- | SaaS / product / clean / modern / corporate | `frost` |
494
- | bold / raw / punchy / hot take / viral | `brutalist` |
495
-
496
- **If the user did not specify a style** → use **Shadow Cut** (dark canvas, high contrast, cinematic — works universally).
497
-
498
- **All saved themes** (read JSON for full CSS values):
499
-
500
- | Theme | Font | BG | Accent |
501
- |-------|------|----|--------|
502
- | `shadow-cut` | Outfit 900 | `#0a0a0a` | `#c0392b` deep red |
503
- | `open-page` | Patrick Hand 400 | `#ffffff` | `#e63946` warm red |
504
- | `neon-tokyo` | JetBrains Mono 800 | `#06061a` | `#00f5ff` cyan / `#ff2d78` pink |
505
- | `terminal-green` | JetBrains Mono 700 | `#0d0d0d` | `#00ff41` phosphor green |
506
- | `broadsheet` | Playfair Display 900 | `#f5f0e8` | `#1c1c1c` ink (no colour) |
507
- | `blueprint` | IBM Plex Mono 700 | `#0a1628` | `#4da6ff` electric blue | **Signature:** dashed-border spec-box (`border:2px dashed rgba(77,106,153,0.4); background:#0d1f3c`) wrapping content + `// ANNOTATION` label above. Grid bg on every scene. REQUIRED on title-card. |
508
- | `velvet-standard` | Cormorant Garamond 300 | `#0a0a0a` | `#c9a84c` gold |
509
- | `dusk-gradient` | Syne 800 | `#1a0533` gradient | `#ff6b35` orange |
510
- | `frost` | Inter 700 | `#ffffff` | `#1e3a5f` deep blue |
511
- | `brutalist` | Bebas Neue 400 | `#ffffff` | `#ff0000` pure red |
512
-
513
- Write a minimal `DESIGN.md` in the project root before touching `index.html`.
514
-
515
- ### 4c. Scene Structure — Sentence-Level Variety
516
-
517
- **One sentence = one scene.** Parse the script into individual sentences. For each sentence, pick a scene type from the Scene Type Catalog (see Appendix). No two consecutive scenes may share the same type. Vary visual weight: heavy (full-bleed, kinetic, bar chart) → lighter (quote, stat) → heavy.
518
-
519
- **Mandatory scene map (produce this JSON before writing any HTML):**
520
-
521
- ```json
522
- {
523
- "slug": "<slug>",
524
- "totalDuration": 0,
525
- "scenes": [
526
- {
527
- "id": 1,
528
- "sentence": "The opening hook sentence.",
529
- "type": "title-card",
530
- "startWord": "<first word from transcript>",
531
- "endWord": "<last word from transcript>",
532
- "startTime": 0.0,
533
- "endTime": 4.2,
534
- "note": "Why this type was chosen"
535
- }
536
- ]
537
- }
538
- ```
539
- **Type assignment rules — apply in this order:**
540
-
541
- | Content signal | Assign type |
542
- |---|---|
543
- | First sentence / topic intro | `title-card` |
544
- | Last sentence / CTA / farewell | `outro-card` |
545
- | Contains a number (%, count, stat) alone | `stat-reveal` |
546
- | Contains a number + counting up context | `counter-up` |
547
- | Lists 3+ items ("X, Y, and Z" / "first…second…third") | `list-reveal` |
548
- | Describes a process / steps / sequence | `flow-steps` |
549
- | Contains "vs" / "compared to" / two contrasting sides | `comparison` |
550
- | Strong single claim / punchline / declaration | `callout` |
551
- | Quote, attribution, or key phrase worth reading slowly | `quote-card` |
552
- | Definition, explanation, "what is" | `kinetic-text` |
553
- | Percentage or proportion to illustrate | `progress-ring` |
554
- | Multiple concepts that benefit from a visual grid | `icon-grid` |
555
- | Has a clear text + supporting visual split | `split-layout` |
556
- | Concrete noun, action, emotion, or metaphor that maps to a doodle illustration | `doodle-split` |
557
- | Two short paired concepts with equal visual weight (need → answer, problem → solution) | `split-screen` |
558
- | Data with relative values across categories | `bar-chart` |
559
- | Part-of-whole breakdown, market share, budget split | `donut-chart` |
560
- | Trend over time, growth curve, before/after over a timeline | `line-chart` |
561
- | Compares two named products, plans, tools, or pricing tiers with multiple attributes | `product-comparison` |
562
- | Sentence describing a 3D concept, tech, or "wow" moment worth a visual statement | `threejs-object` |
563
- | Atmospheric, contextual, or emotional sentence where real-world imagery adds impact | `pexels-hero` |
564
- | Presenter is on screen talking, with related text or data shown on the other side | `presenter-aside` |
565
- | Multi-element dashboard, HUD, terminal output, or floating card UI | `hud-overlay` |
566
- | Fallback | `kinetic-text` |
567
-
568
- **No-repeat rule:** if the rule above would repeat the previous scene type, move to the next best fit. E.g., two consecutive stat sentences → first gets `stat-reveal`, second gets `counter-up` or `bar-chart`.
569
-
570
- **Always include:**
571
- - **Title scene** at t=0 (3s): `title-card` with the topic name
572
- - **Caption overlay**: runs the full audio duration, sentence-level — uses **original script sentences** (NOT transcribed tokens)
573
- - Scene durations from transcript timestamps (not estimated)
574
- ```
575
-
576
- ### 4d. index.html Structure
577
-
578
- Each scene uses its own `data-composition-id` and maps to exactly one storyboard entry. The scene type determines the inner HTML and GSAP animation — see the **Scene Type Catalog** appendix for full patterns.
579
-
580
- ```html
581
- <!DOCTYPE html>
582
- <html>
583
- <head>
584
- <meta charset="utf-8">
585
- <meta name="viewport" content="width=1920, height=1080">
586
- <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
587
- <style>
588
- /* ── Viewport fill — REQUIRED for full-screen render ── */
589
- /* Use fixed 1920x1080 pixels — NOT percentages. The renderer sets the
590
- viewport to match, and clip divs need position:absolute to fill it. */
591
- html, body { width: 1920px; height: 1080px; margin: 0; padding: 0; overflow: hidden; }
592
- /* ── Shared scene shell ─────────────────────────────── */
593
- [data-composition-id] {
594
- position: absolute; inset: 0; overflow: hidden;
595
- }
596
- /* ⚠️ CRITICAL — NEVER OMIT THIS RULE IN ANY PROJECT (main or sample):
597
- Without it, clip divs have auto height → scene-content height:100% collapses
598
- → all content renders in the top-left corner, not full-screen.
599
- Verified broken: product-comparison-sample (missing) → fixed by adding this. */
600
- .clip { position: absolute; inset: 0; }
601
- .scene-bg { position: absolute; inset: 0; background: #0a0a0a; }
602
- .scene-content {
603
- position: relative; width: 100%; height: 100%;
604
- padding: 120px 160px;
605
- display: flex; flex-direction: column; justify-content: center;
606
- gap: 24px; box-sizing: border-box;
607
- }
608
- /* ── Typography ─────────────────────────────────────── */
609
- .hed { font-family: Outfit, sans-serif; font-weight: 900; font-size: 120px; color: #e2e2e2; line-height: 1.05; }
610
- .sub { font-family: Outfit, sans-serif; font-weight: 400; font-size: 52px; color: #8899aa; }
611
- .accent { color: #c0392b; }
612
- /* ── Captions ───────────────────────────────────────── */
613
- #captions { position:absolute; inset:0; pointer-events:none; z-index:50; }
614
- #cap-text { position:absolute; bottom:56px; left:0; right:0;
615
- text-align:center; font-family:'Outfit',sans-serif; font-size:34px; font-weight:500;
616
- color:#fff; text-shadow:0 2px 14px rgba(0,0,0,.95);
617
- padding:0 140px; opacity:0; line-height:1.4; }
618
- /* Subtitles off by default — HyperFrames overrides visibility:hidden on composition divs,
619
- so use a CSS class with !important to suppress captions when SUBTITLES_ON = false */
620
- #captions.subs-off #cap-text { opacity: 0 !important; }
621
- </style>
622
- </head>
623
- <body>
624
-
625
- <!-- ROOT COMPOSITION -->
626
- <div data-composition-id="<slug>" data-start="0" data-duration="TOTAL_DURATION"
627
- data-width="1920" data-height="1080">
628
-
629
- <!-- Audio track — id is REQUIRED; omitting it causes media_missing_id lint error -->
630
- <audio id="main-audio" data-start="0" data-duration="TOTAL_DURATION" data-track-index="0"
631
- src="audio/<slug>.wav" data-main-audio></audio>
632
-
633
- <!-- ── SCENE 1 (title-card) ──────────────────────────── -->
634
- <!-- IMPORTANT: scene divs use class="clip" — NOT data-composition-id -->
635
- <div id="s1" class="clip" data-start="0" data-duration="SCENE_1_DUR"
636
- data-track-index="1">
637
- <!-- see Scene Type Catalog: title-card -->
638
- </div>
639
-
640
- <!-- ── SCENE 2 (kinetic-text) ───────────────────────── -->
641
- <div id="s2" class="clip" data-start="SCENE_2_START" data-duration="SCENE_2_DUR"
642
- data-track-index="1">
643
- <!-- see Scene Type Catalog: kinetic-text -->
644
- </div>
645
-
646
- <!-- ... repeat for every storyboard entry ... -->
647
-
648
- <!-- ── Caption overlay (full duration) — has its own composition-id ── -->
649
- <!-- Do NOT use style="visibility:hidden" — HyperFrames overrides it on composition divs.
650
- Use class="subs-off" + CSS !important instead (see .subs-off rule above). -->
651
- <div id="captions" data-composition-id="captions-overlay"
652
- data-track-index="10" data-duration="TOTAL_DURATION" class="subs-off">
653
- <p id="cap-text"></p>
654
- </div>
655
-
656
- <script>
657
- window.__timelines = window.__timelines || {};
658
-
659
- // ── MAIN timeline: all scene entrance animations ──────
660
- var tl = gsap.timeline({ paused: true });
661
-
662
- // Scene 1 entrances (example title-card)
663
- tl.from("#s1-title", { y: 60, opacity: 0, duration: 0.7, ease: "power3.out" }, 0.2);
664
- tl.from("#s1-subtitle", { y: 40, opacity: 0, duration: 0.5, ease: "power2.out" }, 0.5);
665
- // ... add entrances per scene type (see Catalog) ...
666
-
667
- window.__timelines["<slug>"] = tl;
668
-
669
- // ── CAPTIONS timeline ─────────────────────────────────
670
- // Always use the ORIGINAL script sentences — never transcribed tokens.
671
- // Transcription models (especially small.en) mis-spell proper nouns
672
- // (e.g. "Qwen" → "QUEN"). Sentence start/end times come from the
673
- // storyboard, not the transcript text.
674
- // Press S in preview to toggle subtitles on/off.
675
- var SUBTITLES_ON = false;
676
- document.getElementById('captions').classList.add('subs-off');
677
- document.addEventListener('keydown', function(e) {
678
- if (e.key === 's' || e.key === 'S') {
679
- SUBTITLES_ON = !SUBTITLES_ON;
680
- document.getElementById('captions').classList.toggle('subs-off', !SUBTITLES_ON);
681
- }
682
- });
683
-
684
- var SENTENCES = [
685
- // { s: startTime, e: endTime, t: "Original script sentence." },
686
- // ... one entry per sentence, times from storyboard ...
687
- ];
688
-
689
- var capEl = document.getElementById("cap-text");
690
- var capTl = gsap.timeline({ paused: true });
691
- SENTENCES.forEach(function(sen) {
692
- capTl.call(function(txt){ capEl.textContent = txt; }, [sen.t], sen.s);
693
- capTl.set(capEl, { opacity: 1 }, sen.s);
694
- capTl.set(capEl, { opacity: 0 }, sen.e - 0.05);
695
- });
696
- window.__timelines["captions-overlay"] = capTl;
697
- </script>
698
- </div>
699
- </body>
700
- </html>
701
-
702
- ### 4e. Layout Rules
703
-
704
- - **Every timed scene div MUST have `class="clip"`** — HyperFrames uses this to schedule visibility. Without it, all scenes are visible at once.
705
- - Only two elements should have `data-composition-id`: the root composition div and the captions overlay div. Individual scene divs do NOT get `data-composition-id`.
706
- - **Use literal font names** in CSS (e.g., `font-family: 'Outfit', sans-serif`) — do NOT use CSS variables for font-family in the root composition. The renderer cannot resolve `var(--f)` and will fall back to a system font.
707
- - `scene-content`: `width:100%; height:100%; padding:120px 160px; display:flex; flex-direction:column; justify-content:center; gap:24px; box-sizing:border-box`
708
- - Headlines: 80–120px, weight 700–900
709
- - Body text: 42–56px, weight 400–500
710
- - Decorative bg element in non-title scenes (ghost text, hairline, grain, radial glow). **Title cards use a clean pure-dark background — no radial glow circle.** — see house-style.md
711
- - Enter with `gsap.from()`, NO exit tweens except on final scene
712
- - **Use Unicode glyphs, never emoji, in all scene HTML.** Emoji render as full-colour cartoons in Chromium (which HyperFrames uses for frame capture) and look out of place in a dark cinematic style. Unicode glyphs can be coloured via CSS and scale cleanly at any size.
713
- - **Choose glyphs that fit the semantic context of the scene** — do not default to a fixed set. A scalability scene might use `∞`, a contrast scene `≠`, a highlight `✸`, a warning `☠`, a direction `→`.
714
- - **Stick to these Unicode ranges** — they render as reliable monochrome text glyphs in Chromium, not emoji:
715
- - Geometric Shapes `U+25A0–U+25FF`: `◆ ▲ ▶ ■ ◉ ◈ ◎ ▣ ⬡`
716
- - Dingbats `U+2700–U+27BF`: `✦ ✧ ✕ ✗ ✓ ✸ ✶`
717
- - Arrows `U+2190–U+21FF`: `→ ← ↑ ↓ ⇒ ⇄`
718
- - Math Operators `U+2200–U+22FF`: `∞ ∑ ≠ ≈ ∆`
719
- - Misc Symbols `U+2600–U+26FF` (selective, avoid known emoji triggers like ⚡ U+26A1): `☠ ★ ☆ ♦ ♠`
720
- - **Avoid emoji codepoints** (`U+1F300–U+1FFFF`) entirely — they always render as colored emoji in Chromium regardless of CSS.
721
- - Transitions between scenes: use a CSS transition class from `references/transitions/catalog.md`
722
-
723
- ### 4f. Lint and Preview
724
-
725
- ```bash
726
- npx -y @autoaiai/aicut@latest open .
727
- ```
728
- ```
729
- ---
730
- ```
731
-
732
- ## Step 5: Output Summary
733
-
734
- Tell the user:
735
-
736
- ```
737
- ✅ Script-to-Video complete
738
-
739
- 📝 Script: <word count> words (~<duration>s)
740
- 🎙️ Audio: C:\\openclaw_files\outputs\<slug>.wav
741
- 📄 Transcript: C:\\openclaw_files\projects\<slug>\transcript.json
742
- 🎬 Project: C:\\openclaw_files\projects\<slug>\
743
- 🗂️ Scenes: <N> scenes — <list scene types used>
744
- 🔍 Preview: npx hyperframes preview (in project dir)
745
- 📦 Render: npx hyperframes render --fps 60 --output <slug>.mp4
746
- ```
747
- ```
748
- ---
749
- ```
750
-
751
- ## Error Handling
752
-
753
- | Problem | Action |
754
- |---------|--------|
755
- | OmiVoice server offline | Run your local OmiVoice start script, wait 10s, retry |
756
- | `cp1252` encoding error in Python | Set `PYTHONIOENCODING=utf-8` before running |
757
- | Transcript >20% music tokens | Retry with `--model medium.en` |
758
- | HyperFrames lint errors | Fix reported issues before preview |
759
- | `gradio_client` not installed | `pip install gradio_client` |
760
- | Two consecutive scenes same type | Re-assign second to next-best type from catalog |
761
- | `timed_element_missing_clip_class` lint error | Add `class="clip"` to every scene div — this is required for HyperFrames to show/hide scenes at the right times |
762
- | All scenes visible at once | Same fix: `class="clip"` missing from scene divs |
763
- | Font renders as system fallback | Use `font-family:'Outfit',sans-serif` literally — do NOT use a CSS variable like `var(--f)` for font-family |
764
- | Overlapping clips lint error | Two consecutive scenes share the same end/start time. Trim the earlier scene duration by 0.04s |
765
- | `gsap_animates_clip_element` lint error | You called `tl.set('#sN', { display:... })` on a `.clip` div. HyperFrames owns `display` on clip elements. Remove the `tl.set()` calls — `data-start`/`data-duration` controls clip scheduling |
766
- | `pexels-hero` video background bleeds through all clips in render | Wrong pattern: `<video autoplay>` inside a `.clip` div with no `data-track-index`. Correct pattern: `<video data-track-index="0">` in a plain non-timed wrapper div, outside all `.clip` divs |
767
- | Sparse keyframe warning during render (`max interval: Xs`) | Raw Pexels videos have infrequent keyframes. Detect source FPS first: `ffprobe -v quiet -select_streams v:0 -show_entries stream=avg_frame_rate -of csv=p=0 in.mp4` (round fraction to int → SRC_FPS), then re-encode: `ffmpeg -y -i in.mp4 -c:v libx264 -r SRC_FPS -g SRC_FPS -keyint_min SRC_FPS -movflags +faststart -an out.mp4` |
768
- | Captions show garbled words (e.g. "QUEN" for "Qwen") | Never use transcribed token text for captions. Use the original script sentences in a `SENTENCES` array with storyboard start/end times |
769
- | Chinese model names mis-transcribed | `small.en` splits "Qwen" into "QU"+"EN" tokens. Use `medium.en` for scripts containing Chinese product names, or always use original script for captions |
770
- | Composition not full-screen in preview/render (black bars, content in corner) | Three fixes required: (1) `<meta name="viewport" content="width=1920, height=1080">` in `<head>`, (2) `html, body { width:1920px; height:1080px; overflow:hidden }` — fixed pixels not percentages, (3) `.clip { position:absolute; inset:0; }` — without this, clip divs have auto height and content renders in a fraction of the canvas |
771
- | `presenter-aside` video wrapper bleeds through earlier title card / scenes | The plain wrapper div is always in the DOM and renders even before `data-start`. Fix: add `display:none` to the wrapper `<div id="v-wrap">` and add `tl.set('#v-wrap', { display:'block' }, VIDEO_START_TIME)` in the GSAP timeline |
772
- | Captions visible even when `SUBTITLES_ON = false` | HyperFrames overrides `style="visibility:hidden"` on `data-composition-id` elements. Use a CSS class instead: add `.subs-off #cap-text { opacity:0 !important; }` and toggle `classList.toggle('subs-off', !SUBTITLES_ON)` on the captions div |
773
- | Title card / first scene is completely blank (elements invisible) | Using `tl.from('#el', { opacity:0 })` on an element that already has `opacity:0` inline → GSAP animates 0→0, nothing appears. **Fix:** remove inline `opacity:0` from the element, OR switch to `tl.fromTo('#el', { opacity:0, y:60 }, { opacity:1, y:0, ... })` — always use `fromTo` when you need an explicit destination value |
774
- | `media_missing_id` lint error on `<video>` | Every `<video>` with `data-start` must also have a unique `id` attribute so the renderer can discover it. Add `id="bg-video"` (or any unique id) |
775
- | `media_missing_id` lint error on `<audio>` | Same rule applies to `<audio>` elements. Always add `id="main-audio"` to the audio element in the root composition template |
776
- | Serif font visible in `quote-card` scene | The decorative `"` mark defaulted to `font-family:Georgia,serif` in older versions of this skill. This is inconsistent with the Shadow Cut theme. Use `font-family:'Outfit',sans-serif` for ALL elements including decorative characters |
777
- | `hud-overlay` cards float on dark background instead of over a video | HUD overlay requires a background video. Add a `<div id="v-wrap" style="display:none">` outside all `.clip` divs containing the `<video id="bg-video" ...>`, then `tl.set('#v-wrap', { display:'block' }, HUD_START_TIME)` to reveal it. Add a semi-transparent dark overlay inside the wrapper (`rgba(8,8,16,0.55)`) so the HUD cards remain readable |
778
- | **Talking-cut:** lip sync drifts progressively — worse toward the end | Root cause: audio extracted from VFR source while video was re-encoded to CFR. Fix: always use the **sync-safe two-step encode** — re-encode with audio first, extract WAV from that encode, strip audio for face-cam. All three share identical timing baseline. |
779
- | **Talking-cut:** `overlapping_clips_same_track` lint error | `<audio data-main-audio>` has `data-track-index="0"` and the face-cam `<video>` is also on track 0. Fix: **remove `data-track-index` entirely from the `<audio>` element**. The `data-main-audio` attribute is sufficient; HyperFrames manages audio routing automatically. |
780
- | **Talking-cut:** `data-duration` causes 2–4s over-run at end | Whisper's internal duration estimate is not accurate — it may report 202s for a 198.8s video. Always run `ffprobe -v quiet -show_entries format=duration -of csv=p=0 assets/source-kf.mp4` and use that exact value for all `data-duration` attributes. |
781
- | **Talking-cut:** micro-flash of face-cam between two consecutive cutaway clips | Gap between clips was <3s (e.g. s3 ends at 27.9s, s4 starts at 28.0s → 0.1s flash). Enforce ≥3s minimum gap between consecutive cutaway clips. Move the later clip's `data-start` out and reduce its `data-duration` by the same amount to keep it in sync with the audio. |
782
- | **Talking-cut:** render stalls at ~60-70% during frame capture | Likely memory pressure or browser worker crash on long compositions (>3 min). Try `--workers 4` to reduce parallel load: `npx hyperframes render --workers 4 --output output.mp4` |
783
-
784
- ---
785
-
786
- ## File Layout
787
-
788
- ```
789
- C:\\openclaw_files\
790
- outputs\
791
- <slug>.wav ← synthesized audio
792
- projects\
793
- <slug>\
794
- DESIGN.md ← visual identity (write first!)
795
- storyboard.json ← sentence → scene type map
796
- index.html ← main composition
797
- transcript.json ← word-level timestamps
798
- audio\
799
- <slug>.wav ← copy of audio for HyperFrames
800
- assets\ ← talking-cut mode only
801
- source-kf-audio.mp4 ← Step 1: CFR re-encode WITH audio (keep for re-extraction)
802
- source-kf.mp4 ← Step 3: muted face-cam (stripped from source-kf-audio.mp4)
803
- ```
804
- ```
805
- ---
806
- ```
807
-
808
- ## Standalone Sample Boilerplate
809
-
810
- > **Use this shell for EVERY standalone sample project** (chart demos, scene type showcases, catalog entries). Never start from scratch — copy this exactly, then fill in the scene content.
811
- >
812
- > The #1 cause of "content not full-screen" bugs is missing `.clip { position:absolute; inset:0; }`. It is included here. Do NOT remove or abbreviate the CSS block.
813
-
814
- ```html
815
- <!DOCTYPE html>
816
- <html>
817
- <head>
818
- <meta charset="utf-8">
819
- <meta name="viewport" content="width=1920, height=1080">
820
- <script src="https://cdn.jsdelivr.net/npm/gsap@3.14.2/dist/gsap.min.js"></script>
821
- <style>
822
- /* ── Full-screen foundation — ALL THREE RULES are required ── */
823
- * { margin: 0; padding: 0; box-sizing: border-box; }
824
- html, body { width: 1920px; height: 1080px; overflow: hidden; background: #000; }
825
- [data-composition-id] { position: absolute; inset: 0; overflow: hidden; }
826
- /* ⚠️ NEVER OMIT: without this, clips have auto-height → content renders in a corner */
827
- .clip { position: absolute; inset: 0; }
828
- /* ── Scene shell ── */
829
- .scene-bg { position: absolute; inset: 0; background: #0a0a0a; }
830
- .scene-content {
831
- position: relative; width: 100%; height: 100%;
832
- padding: 80px 120px;
833
- display: flex; flex-direction: column; justify-content: center;
834
- gap: 24px; box-sizing: border-box;
835
- }
836
- </style>
837
- </head>
838
- <body>
839
-
840
- <div data-composition-id="<slug>" data-start="0" data-duration="TOTAL_DURATION"
841
- data-width="1920" data-height="1080">
842
-
843
- <!-- Scene 1 -->
844
- <div id="s1" class="clip" data-start="0" data-duration="SCENE_DUR" data-track-index="1">
845
- <div class="scene-bg"></div>
846
- <div class="scene-content">
847
- <!-- scene HTML here -->
848
- </div>
849
- </div>
850
-
851
- <!-- Add more scenes as needed -->
852
-
853
- <script>
854
- window.__timelines = window.__timelines || {};
855
- var tl = gsap.timeline({ paused: true });
856
-
857
- // GSAP tweens here
858
-
859
- window.__timelines['<slug>'] = tl;
860
- </script>
861
- </div>
862
- </body>
863
- </html>
864
- ```
865
- **Checklist before rendering any standalone sample:**
866
- - [ ] `<meta name="viewport" content="width=1920, height=1080">` present
867
- - [ ] `html, body { width:1920px; height:1080px; overflow:hidden }` present (pixels, not %)
868
- - [ ] `.clip { position:absolute; inset:0; }` present in `<style>` block
869
- - [ ] Every scene div has `class="clip"`
870
- - [ ] `data-composition-id` on root div matches `window.__timelines['<slug>']` key
871
- - [ ] Run `npx hyperframes lint` before render (catches clip class errors)
872
-
873
- ---
874
- ```
875
-
876
- ## Appendix: Scene Type Catalog
877
-
878
- All patterns use `#0a0a0a` bg / `#e2e2e2` text / `#c0392b` accent (Shadow Cut). Adjust to DESIGN.md palette.
879
- Every scene inner HTML goes inside `<div class="scene-bg"></div><div class="scene-content">...</div>`.
880
- All GSAP tweens go inside the main `tl` using the scene's `data-start` time as the base offset.
881
-
882
- ---
883
-
884
- ### Shared Atoms
885
-
886
- Reusable elements from the user-stories canonical reference. Use these inside any scene type.
887
-
888
- **`eyebrow`** — Small uppercase accent label above a title. Drops in before the headline.
889
-
890
- ```html
891
- <div id="sN-eye" style="font-size:22px;font-weight:700;letter-spacing:6px;
892
- color:#c0392b;text-transform:uppercase;opacity:0;">USER STORIES 101</div>
893
- ```js
894
- tl.fromTo('#sN-eye', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.3, ease:'power2.out' }, offset + 0.1);
895
- ```
896
- **`rule` bar** — 200px accent-colored horizontal rule that scales in from the left. Underlines a title.
897
- ```
898
- ```html
899
- <div id="sN-bar" style="width:200px;height:6px;background:#c0392b;
900
- transform-origin:left;transform:scaleX(0);margin:28px auto 0;"></div>
901
- ```js
902
- tl.fromTo('#sN-bar', { scaleX:0 }, { scaleX:1, duration:0.6, ease:'power2.inOut', transformOrigin:'left' }, offset + 0.45);
903
- ```
904
- **`sec-label`** — Same visual as eyebrow but used as a category header inside a scene (list-reveal, flow-steps). Slides down from above.
905
- ```
906
- ```html
907
- <div id="sN-lbl" style="font-size:22px;font-weight:700;letter-spacing:6px;
908
- color:#c0392b;text-transform:uppercase;margin-bottom:36px;opacity:0;">THE GPS OF PRODUCT DEV</div>
909
- ```js
910
- tl.fromTo('#sN-lbl', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.3 }, offset + 0.1);
911
- ```
912
- > **Reference:** All three atoms appear in S1–S2 of `C:\\openclaw_files\projects\user-stories\index.html`.
913
-
914
- ---
915
- ```
916
-
917
- ### 1. `title-card`
918
-
919
- Large centered title + subtitle. Used for opening and major transitions.
920
-
921
- ```html
922
- <div class="scene-bg" style="background:#0a0a0a;"></div>
923
- <div class="scene-content" style="align-items:center;text-align:center;">
924
- <h1 id="s1-title" class="hed" style="font-size:130px;">YOUR TOPIC</h1>
925
- <p id="s1-sub" class="sub">the sentence text here</p>
926
- </div>
927
- ```js
928
- // offset = scene startTime
929
- tl.from("#s1-title", { y:60, opacity:0, duration:0.7, ease:"power3.out" }, offset + 0.2);
930
- tl.from("#s1-sub", { y:40, opacity:0, duration:0.5, ease:"power2.out" }, offset + 0.5);
931
- ```
932
- ---
933
- ```
934
-
935
- ### 2. `kinetic-text`
936
-
937
- Definition / explanation sentence — each word flies in sequentially, full-bleed.
938
-
939
- ```html
940
- <div class="scene-bg"></div>
941
- <div class="scene-content" style="align-items:flex-start;">
942
- <div id="sN-kinetic" style="font-family:Outfit,sans-serif;font-weight:900;
943
- font-size:96px;color:#e2e2e2;line-height:1.1;max-width:1500px;">
944
- <!-- split sentence into spans: one per word -->
945
- <span class="kw">Each</span> <span class="kw">word</span> <span class="kw">flies</span> <span class="kw">in.</span>
946
- </div>
947
- </div>
948
- ```js
949
- // Generate spans dynamically if preferred:
950
- // sentence.split(" ").forEach((w, i) => { el.innerHTML += `<span class="kw" id="kw-${sceneId}-${i}">${w} </span>`; });
951
- tl.from("#sN-kinetic .kw", {
952
- y:80, opacity:0, duration:0.45, ease:"power3.out",
953
- stagger:{ each:0.07, from:"start" }
954
- }, offset + 0.15);
955
- ```
956
- ---
957
- ```
958
-
959
- ### 2b. `kinetic-impact`
960
-
961
- Three-tier text punch: muted setup line (small/faded) → large white emphasis word → XL accent slam word. Used when a sentence has a setup + payoff structure ("but when they get them right? → EVERYTHING → FLOWS."). Derived from the canonical user-stories project.
962
-
963
- ```html
964
- <div class="scene-bg"></div>
965
- <div class="scene-content" style="align-items:flex-start;justify-content:center;gap:24px;">
966
- <!-- Tier 1: muted setup — small, faded, sets context -->
967
- <div id="sN-ki1" style="font-family:Outfit,sans-serif;font-weight:400;
968
- font-size:40px;color:#8899aa;letter-spacing:0.02em;">but when they get them right?</div>
969
- <!-- Tier 2: large white punch word -->
970
- <div id="sN-ki2" style="font-family:Outfit,sans-serif;font-weight:900;
971
- font-size:120px;color:#e2e2e2;line-height:0.95;letter-spacing:-2px;">EVERYTHING</div>
972
- <!-- Tier 3: XL accent slam — biggest, colored -->
973
- <div id="sN-ki3" style="font-family:Outfit,sans-serif;font-weight:900;
974
- font-size:180px;color:#c0392b;line-height:0.9;letter-spacing:-4px;">FLOWS.</div>
975
- </div>
976
- ```js
977
- // Stagger ~0.7s between tiers — setup lands first, punch follows, slam closes
978
- tl.from("#sN-ki1", { y:40, opacity:0, duration:0.5, ease:"power2.out" }, offset + 0.15);
979
- tl.from("#sN-ki2", { y:80, opacity:0, duration:0.6, ease:"back.out(2)" }, offset + 0.85);
980
- tl.from("#sN-ki3", { y:100, opacity:0, scale:0.85, duration:0.55, ease:"back.out(2.5)" }, offset + 1.55);
981
- ```
982
- > **Reference:** Scene S4 and S10 of `C:\\openclaw_files\projects\user-stories\index.html`. CSS classes: `.kt-sm` (40px/400/muted), `.kt-lg` (120px/900/text), `.kt-xl` (180px/900/accent).
983
-
984
- ---
985
- ```
986
-
987
- ### 2c. `kinetic-slam`
988
-
989
- Single massive word that punches in as a one-word scene — used as a beat between heavier scenes. Ultra-short duration (0.6–1.0s). No setup, no sub-text, just the word.
990
-
991
- ```html
992
- <div class="scene-bg"></div>
993
- <div class="scene-content" style="align-items:center;justify-content:center;">
994
- <div id="sN-slam" style="font-family:Outfit,sans-serif;font-weight:900;
995
- font-size:240px;color:#e2e2e2;letter-spacing:-6px;text-align:center;opacity:0;">
996
- FLIP IT.
997
- </div>
998
- </div>
999
- ```js
1000
- // Ultra-fast entrance — back.out(3) gives maximum punch
1001
- tl.fromTo('#sN-slam', { opacity:0, scale:0.7 }, { opacity:1, scale:1, duration:0.2, ease:'back.out(3)' }, offset + 0.02);
1002
- ```
1003
- > **When to use:** One-word pivots ("FLIP IT.", "WRONG.", "STOP."), dramatic pauses, punctuation beats between comparison and flow scenes. Duration should match the word's audio timing — typically 0.5–0.8s. Reference: Scene S10 of `C:\\openclaw_files\projects\user-stories\index.html`, CSS class `.kt-slam`.
1004
-
1005
- ---
1006
- ```
1007
-
1008
- ### 3. `stat-reveal`
1009
-
1010
- Big isolated number/stat with a label and fill bar beneath.
1011
-
1012
- ```html
1013
- <div class="scene-bg"></div>
1014
- <div id="sN-bar-bg" style="position:absolute;bottom:0;left:0;width:100%;height:6px;background:#1a1a1a;"></div>
1015
- <div id="sN-bar" style="position:absolute;bottom:0;left:0;width:0%;height:6px;background:#c0392b;transform-origin:left;"></div>
1016
- <div class="scene-content" style="align-items:center;text-align:center;">
1017
- <div id="sN-num" class="hed" style="font-size:200px;color:#e2e2e2;font-variant-numeric:tabular-nums;">47</div>
1018
- <div id="sN-label" class="sub" style="font-size:56px;letter-spacing:0.08em;">THINGS SHIPPED</div>
1019
- </div>
1020
- ```js
1021
- tl.from("#sN-num", { scale:0.6, opacity:0, duration:0.6, ease:"back.out(2)" }, offset + 0.15);
1022
- tl.from("#sN-label", { y:30, opacity:0, duration:0.4, ease:"power2.out" }, offset + 0.55);
1023
- tl.to("#sN-bar", { width:"100%", duration:0.8, ease:"power2.out" }, offset + 0.4);
1024
- ```
1025
- ---
1026
- ```
1027
-
1028
- ### 4. `counter-up`
1029
-
1030
- Number counts up from 0 to target. Good for counts, years, totals.
1031
-
1032
- ```html
1033
- <div class="scene-bg"></div>
1034
- <div class="scene-content" style="align-items:center;text-align:center;">
1035
- <div id="sN-counter" class="hed" style="font-size:180px;font-variant-numeric:tabular-nums;">0</div>
1036
- <div id="sN-clabel" class="sub">LINES OF CODE GENERATED</div>
1037
- </div>
1038
- ```js
1039
- var counterObj = { val: 0 };
1040
- var TARGET = 1000000;
1041
- var sceneDur = endTime - startTime;
1042
- tl.to(counterObj, {
1043
- val: TARGET, duration: sceneDur * 0.75, ease: "power1.inOut",
1044
- onUpdate: function() {
1045
- var el = document.getElementById("sN-counter");
1046
- if (el) el.textContent = Math.round(counterObj.val).toLocaleString();
1047
- }
1048
- }, offset + 0.2);
1049
- tl.from("#sN-clabel", { y:30, opacity:0, duration:0.4, ease:"power2.out" }, offset + 0.3);
1050
- ```
1051
- > **Note:** `onUpdate` callbacks are allowed — they only update textContent, not GSAP visual props.
1052
-
1053
- ---
1054
- ```
1055
-
1056
- ### 5. `bar-chart`
1057
-
1058
- Horizontal CSS bars that grow from left. Max 5 bars. No axes, no gridlines, no legends.
1059
-
1060
- ```html
1061
- <div class="scene-bg"></div>
1062
- <div class="scene-content">
1063
- <div id="sN-chart-title" class="sub" style="font-size:48px;margin-bottom:32px;">Top 5 Languages</div>
1064
- <div style="display:flex;flex-direction:column;gap:28px;width:100%;">
1065
- <!-- Repeat for each bar -->
1066
- <div style="display:flex;align-items:center;gap:24px;">
1067
- <span style="font-family:Outfit;font-weight:700;font-size:40px;color:#e2e2e2;width:220px;text-align:right;">Python</span>
1068
- <div style="flex:1;background:#1a1a1a;border-radius:4px;height:44px;overflow:hidden;">
1069
- <div id="sN-bar1" style="width:0%;height:100%;background:#c0392b;border-radius:4px;transform-origin:left;"></div>
1070
- </div>
1071
- <span id="sN-pct1" style="font-family:Outfit;font-weight:900;font-size:44px;color:#e2e2e2;opacity:0;">78%</span>
1072
- </div>
1073
- <!-- ... repeat for bars 2-5 ... -->
1074
- </div>
1075
- </div>
1076
- ```js
1077
- tl.from("#sN-chart-title", { x:-40, opacity:0, duration:0.5, ease:"power2.out" }, offset + 0.15);
1078
- [1,2,3,4,5].forEach(function(i) {
1079
- var pct = [78, 65, 54, 48, 32][i-1];
1080
- tl.to("#sN-bar" + i, { width: pct+"%", duration:0.6, ease:"power2.out" }, offset + 0.3 + i*0.12);
1081
- tl.to("#sN-pct" + i, { opacity:1, duration:0.3, ease:"power1.out" }, offset + 0.7 + i*0.12);
1082
- });
1083
- ```
1084
- ---
1085
- ```
1086
-
1087
- ### 6. `list-reveal`
1088
-
1089
- 3–5 items stagger in one by one. Use for capability/feature lists.
1090
-
1091
- ```html
1092
- <div class="scene-bg"></div>
1093
- <div class="scene-content">
1094
- <div id="sN-lhead" class="hed" style="font-size:80px;">What it can do</div>
1095
- <ul style="list-style:none;padding:0;margin:0;display:flex;flex-direction:column;gap:20px;">
1096
- <li id="sN-li1" style="font-family:Outfit;font-weight:500;font-size:56px;color:#e2e2e2;display:flex;align-items:center;gap:24px;">
1097
- <span style="width:12px;height:12px;border-radius:50%;background:#c0392b;flex-shrink:0;"></span>Write code from natural language
1098
- </li>
1099
- <li id="sN-li2" style="font-family:Outfit;font-weight:500;font-size:56px;color:#e2e2e2;display:flex;align-items:center;gap:24px;">
1100
- <span style="width:12px;height:12px;border-radius:50%;background:#c0392b;flex-shrink:0;"></span>Run tests and fix failures
1101
- </li>
1102
- <li id="sN-li3" style="font-family:Outfit;font-weight:500;font-size:56px;color:#e2e2e2;display:flex;align-items:center;gap:24px;">
1103
- <span style="width:12px;height:12px;border-radius:50%;background:#c0392b;flex-shrink:0;"></span>Search and explore codebases
1104
- </li>
1105
- </ul>
1106
- </div>
1107
- ```js
1108
- tl.from("#sN-lhead", { x:-50, opacity:0, duration:0.6, ease:"expo.out" }, offset + 0.1);
1109
- tl.from("#sN-li1, #sN-li2, #sN-li3", {
1110
- x:-60, opacity:0, duration:0.45, ease:"power2.out",
1111
- stagger: { each:0.18, from:"start" }
1112
- }, offset + 0.4);
1113
- ```
1114
- ---
1115
- ```
1116
-
1117
- ### 6b. `list-reveal-words` (compact word-stack variant)
1118
-
1119
- No numbers, no bullets — just stacked giant words, each sliding in from the left. Use for 2–4 item lists where each item is a single phrase you want to hit like a drumbeat ("THE HUMAN / THE PAIN / THE DESIRE"). Faster timing, bigger type, no header needed.
1120
-
1121
- ```html
1122
- <div class="scene-bg"></div>
1123
- <div class="scene-content" style="align-items:flex-start;justify-content:center;">
1124
- <div id="sN-wlbl" style="font-size:22px;font-weight:700;letter-spacing:6px;
1125
- color:#c0392b;text-transform:uppercase;margin-bottom:24px;opacity:0;">START WITH</div>
1126
- <div style="display:flex;flex-direction:column;gap:8px;">
1127
- <div id="sN-w1" style="font-family:Outfit,sans-serif;font-weight:900;
1128
- font-size:100px;color:#e2e2e2;opacity:0;">THE HUMAN</div>
1129
- <div id="sN-w2" style="font-family:Outfit,sans-serif;font-weight:900;
1130
- font-size:100px;color:#e2e2e2;opacity:0;">THE PAIN</div>
1131
- <div id="sN-w3" style="font-family:Outfit,sans-serif;font-weight:900;
1132
- font-size:100px;color:#e2e2e2;opacity:0;">THE DESIRE</div>
1133
- </div>
1134
- </div>
1135
- ```js
1136
- // Each word individually timed — NOT stagger — so they can sync to audio words
1137
- tl.fromTo('#sN-wlbl', { opacity:0 }, { opacity:1, duration:0.2 }, offset + 0.06);
1138
- tl.fromTo('#sN-w1', { opacity:0, x:-50 }, { opacity:1, x:0, duration:0.25, ease:'power2.out' }, offset + 0.26);
1139
- tl.fromTo('#sN-w2', { opacity:0, x:-50 }, { opacity:1, x:0, duration:0.25, ease:'power2.out' }, offset + 0.66);
1140
- tl.fromTo('#sN-w3', { opacity:0, x:-50 }, { opacity:1, x:0, duration:0.25, ease:'power2.out' }, offset + 1.09);
1141
- ```
1142
- > **Reference:** Scene S11 of `C:\\openclaw_files\projects\user-stories\index.html`. CSS class `.lr-big` (100px/900/text). Each item timed individually to match audio word timestamps, not auto-staggered.
1143
-
1144
- ---
1145
- ```
1146
-
1147
- ### 7. `flow-steps`
1148
-
1149
- Numbered steps connected by an animated SVG arrow. Ideal for process sentences.
1150
-
1151
- > **⚠️ CRITICAL — Arrow arrowhead bug:** The `<polygon>` inside the SVG arrowhead is always visible unless the parent `<svg>` starts with `opacity:0` in its `style` attribute. Do NOT rely on GSAP alone — the `tl.set(…{opacity:1}…)` is NOT enough if the SVG element doesn't start hidden. Every SVG arrow MUST have `style="flex-shrink:0;opacity:0;"` (note `opacity:0`). The GSAP `tl.set("#sN-arr1",{opacity:1},…)` then reveals it at the right moment. Without this, the arrowhead triangle appears immediately at scene start before the line draws in.
1152
-
1153
- ```html
1154
- <div class="scene-bg"></div>
1155
- <div class="scene-content" style="align-items:center;">
1156
- <div id="sN-fhead" class="sub" style="margin-bottom:48px;">How it works</div>
1157
- <div style="display:flex;align-items:center;gap:0;width:100%;">
1158
-
1159
- <!-- Step 1 -->
1160
- <div id="sN-st1" style="flex:1;text-align:center;">
1161
- <div style="width:100px;height:100px;border-radius:50%;border:4px solid #c0392b;
1162
- display:flex;align-items:center;justify-content:center;margin:0 auto 20px;
1163
- font-family:Outfit;font-weight:900;font-size:52px;color:#c0392b;">1</div>
1164
- <div style="font-family:Outfit;font-weight:700;font-size:44px;color:#e2e2e2;">Write</div>
1165
- </div>
1166
-
1167
- <!-- Arrow: opacity:0 on the SVG is REQUIRED — polygon is visible by default -->
1168
- <svg id="sN-arr1" width="120" height="40" viewBox="0 0 120 40" style="flex-shrink:0;opacity:0;">
1169
- <line x1="0" y1="20" x2="100" y2="20" stroke="#c0392b" stroke-width="3" stroke-dasharray="100" stroke-dashoffset="100"/>
1170
- <polygon points="100,10 120,20 100,30" fill="#c0392b"/>
1171
- </svg>
1172
-
1173
- <!-- Step 2 -->
1174
- <div id="sN-st2" style="flex:1;text-align:center;">
1175
- <div style="width:100px;height:100px;border-radius:50%;border:4px solid #c0392b;
1176
- display:flex;align-items:center;justify-content:center;margin:0 auto 20px;
1177
- font-family:Outfit;font-weight:900;font-size:52px;color:#c0392b;">2</div>
1178
- <div style="font-family:Outfit;font-weight:700;font-size:44px;color:#e2e2e2;">Run</div>
1179
- </div>
1180
-
1181
- <!-- Arrow: opacity:0 on the SVG is REQUIRED — polygon is visible by default -->
1182
- <svg id="sN-arr2" width="120" height="40" viewBox="0 0 120 40" style="flex-shrink:0;opacity:0;">
1183
- <line x1="0" y1="20" x2="100" y2="20" stroke="#c0392b" stroke-width="3" stroke-dasharray="100" stroke-dashoffset="100"/>
1184
- <polygon points="100,10 120,20 100,30" fill="#c0392b"/>
1185
- </svg>
1186
-
1187
- <!-- Step 3 -->
1188
- <div id="sN-st3" style="flex:1;text-align:center;">
1189
- <div style="width:100px;height:100px;border-radius:50%;border:4px solid #c0392b;
1190
- display:flex;align-items:center;justify-content:center;margin:0 auto 20px;
1191
- font-family:Outfit;font-weight:900;font-size:52px;color:#c0392b;">3</div>
1192
- <div style="font-family:Outfit;font-weight:700;font-size:44px;color:#e2e2e2;">Ship</div>
1193
- </div>
1194
- </div>
1195
- </div>
1196
- ```js
1197
- tl.from("#sN-fhead", { y:-30, opacity:0, duration:0.5, ease:"power2.out" }, offset + 0.1);
1198
- tl.from("#sN-st1", { scale:0.7, opacity:0, duration:0.5, ease:"back.out(2)" }, offset + 0.3);
1199
- // tl.set reveals SVG (which starts opacity:0), then the line draws in
1200
- tl.set("#sN-arr1", { opacity:1 }, offset + 0.65);
1201
- tl.to("#sN-arr1 line", { strokeDashoffset:0, duration:0.35, ease:"power2.out" }, offset + 0.65);
1202
- tl.from("#sN-st2", { scale:0.7, opacity:0, duration:0.5, ease:"back.out(2)" }, offset + 0.85);
1203
- tl.set("#sN-arr2", { opacity:1 }, offset + 1.2);
1204
- tl.to("#sN-arr2 line", { strokeDashoffset:0, duration:0.35, ease:"power2.out" }, offset + 1.2);
1205
- tl.from("#sN-st3", { scale:0.7, opacity:0, duration:0.5, ease:"back.out(2)" }, offset + 1.4);
1206
- ```
1207
- ---
1208
- ```
1209
-
1210
- ### 7b. `flow-steps-text` (text-arrow variant)
1211
-
1212
- Simpler flow-steps using plain text `→` characters as arrows instead of SVG. No arrowhead bug possible. Use this when steps are card-based (flat background), step timing is tight, or you prefer cleaner markup. Derived from the canonical user-stories project.
1213
-
1214
- ```html
1215
- <div class="scene-bg"></div>
1216
- <div class="scene-content" style="align-items:center;flex-direction:column;">
1217
- <!-- sec-label drops in first -->
1218
- <div id="sN-fttl" style="font-size:24px;font-weight:700;letter-spacing:6px;
1219
- color:#c0392b;text-transform:uppercase;margin-bottom:56px;opacity:0;">THE CLARITY FORMULA</div>
1220
-
1221
- <div style="display:flex;align-items:center;justify-content:center;width:100%;">
1222
- <!-- Step 1 -->
1223
- <div id="sN-fs1" style="background:#111111;padding:48px 52px;flex:1;text-align:center;opacity:0;">
1224
- <div style="font-size:52px;font-weight:900;color:#c0392b;margin-bottom:12px;">1</div>
1225
- <div style="font-size:34px;font-weight:700;color:#e2e2e2;line-height:1.3;">Know Your<br>Audience</div>
1226
- </div>
1227
-
1228
- <!-- Text arrow — no SVG, no polygon bug -->
1229
- <div id="sN-fa1" style="font-size:60px;color:#6b7280;padding:0 16px;opacity:0;">→</div>
1230
-
1231
- <!-- Step 2 -->
1232
- <div id="sN-fs2" style="background:#111111;padding:48px 52px;flex:1;text-align:center;opacity:0;">
1233
- <div style="font-size:52px;font-weight:900;color:#c0392b;margin-bottom:12px;">2</div>
1234
- <div style="font-size:34px;font-weight:700;color:#e2e2e2;line-height:1.3;">Speak Their<br>Language</div>
1235
- </div>
1236
-
1237
- <!-- Text arrow -->
1238
- <div id="sN-fa2" style="font-size:60px;color:#6b7280;padding:0 16px;opacity:0;">→</div>
1239
-
1240
- <!-- Step 3 -->
1241
- <div id="sN-fs3" style="background:#111111;padding:48px 52px;flex:1;text-align:center;opacity:0;">
1242
- <div style="font-size:52px;font-weight:900;color:#c0392b;margin-bottom:12px;">3</div>
1243
- <div style="font-size:34px;font-weight:700;color:#e2e2e2;line-height:1.3;">Stop Over-<br>complicating</div>
1244
- </div>
1245
- </div>
1246
-
1247
- <!-- Tagline fades in after all steps -->
1248
- <div id="sN-fsub" style="font-size:28px;font-weight:400;color:#6b7280;margin-top:36px;opacity:0;">
1249
- The kind of clarity that works.
1250
- </div>
1251
- </div>
1252
- ```js
1253
- // Title drops, steps reveal, text arrows slide in between each step
1254
- tl.fromTo('#sN-fttl', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.4 }, offset + 0.1);
1255
- tl.fromTo('#sN-fs1', { opacity:0, y:30 }, { opacity:1, y:0, duration:0.4, ease:'power2.out' }, offset + 0.56);
1256
- tl.fromTo('#sN-fa1', { opacity:0, x:-20 }, { opacity:1, x:0, duration:0.2 }, offset + 1.11);
1257
- tl.fromTo('#sN-fs2', { opacity:0, y:30 }, { opacity:1, y:0, duration:0.4, ease:'power2.out' }, offset + 2.16);
1258
- tl.fromTo('#sN-fa2', { opacity:0, x:-20 }, { opacity:1, x:0, duration:0.2 }, offset + 2.66);
1259
- tl.fromTo('#sN-fs3', { opacity:0, y:30 }, { opacity:1, y:0, duration:0.4, ease:'power2.out' }, offset + 4.16);
1260
- tl.fromTo('#sN-fsub', { opacity:0 }, { opacity:1, duration:0.4 }, offset + 4.96);
1261
- ```
1262
- > **Reference:** Scene S7 of `C:\\openclaw_files\projects\user-stories\index.html`. CSS classes: `.fs-title`, `.fs-row`, `.fs-step`, `.fs-num`, `.fs-txt`, `.fs-arr` (the text arrow), `.fs-sub`. Each step/arrow is individually timed to audio, not auto-staggered.
1263
-
1264
- ---
1265
- ```
1266
-
1267
- ### 8. `quote-card`
1268
-
1269
- Pull quote — dark card with bold left border, 180px accent quote mark, and optional inline word highlights. For key phrases worth reading slowly.
1270
-
1271
- **Structure:** muted uppercase intro label above → dark card with left red border → red `"` inside the card → quote text (use `<em>` for accent word highlights, no extra CSS needed) → optional attribution line.
1272
-
1273
- ```html
1274
- <div class="scene-bg"></div>
1275
- <div class="scene-content" style="align-items:flex-start;justify-content:center;">
1276
- <div style="width:1400px;">
1277
-
1278
- <!-- Intro label — muted uppercase above the card -->
1279
- <div id="sN-intro" style="font-family:'Outfit',sans-serif;font-size:26px;font-weight:500;
1280
- color:#8899aa;letter-spacing:3px;text-transform:uppercase;margin-bottom:28px;opacity:0;">
1281
- A good user story sounds like this:
1282
- </div>
1283
-
1284
- <!-- Card: dark bg + thick left border -->
1285
- <div id="sN-card" style="background:#111111;padding:60px 80px;
1286
- border-left:8px solid #c0392b;position:relative;opacity:0;">
1287
-
1288
- <!-- 180px red quote mark — positioned inside card, hangs slightly above content -->
1289
- <div id="sN-mark" style="position:absolute;top:-30px;left:56px;
1290
- font-family:'Outfit',sans-serif;font-size:180px;color:#c0392b;line-height:1;opacity:0;">"</div>
1291
-
1292
- <!-- Quote text — use <em> for accent word highlights (no extra style needed) -->
1293
- <blockquote id="sN-qt" style="font-family:'Outfit',sans-serif;font-weight:400;font-size:50px;
1294
- color:#e2e2e2;line-height:1.5;padding-top:36px;margin:0;opacity:0;">
1295
- As a <em style="color:#c0392b;font-style:normal;font-weight:700;">user</em>,
1296
- I want to save my progress so I don't lose my work.
1297
- </blockquote>
1298
-
1299
- <!-- Attribution — optional, omit if not needed -->
1300
- <div id="sN-attr" style="font-family:'Outfit',sans-serif;font-size:24px;font-weight:500;
1301
- color:#8899aa;margin-top:20px;letter-spacing:2px;opacity:0;">— Clean. Human. Clear.</div>
1302
-
1303
- </div>
1304
- </div>
1305
- </div>
1306
- ```js
1307
- // offset = scene startTime
1308
- tl.fromTo('#sN-intro', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.4 }, offset + 0.12);
1309
- tl.fromTo('#sN-card', { opacity:0, y:30 }, { opacity:1, y:0, duration:0.5, ease:'power2.out' }, offset + 0.5);
1310
- tl.fromTo('#sN-mark', { opacity:0, scale:2 }, { opacity:1, scale:1, duration:0.35 }, offset + 0.5);
1311
- tl.fromTo('#sN-qt', { opacity:0 }, { opacity:1, duration:0.5 }, offset + 1.3);
1312
- tl.fromTo('#sN-attr', { opacity:0 }, { opacity:1, duration:0.3 }, offset + 3.5);
1313
- ```
1314
- > **Reference:** Scene S5 of `C:\openclaw_files\projects\user-stories\index.html`. CSS classes: `.qc-wrap` (width:1400px), `.qc-intro` (26px/500/muted/uppercase), `.qc-card` (background:#111111, border-left:8px), `.qc-mark` (180px/accent, inside card at top:-30px), `.qc-text` (50px/400, `em` for accent words), `.qc-attr` (24px/muted).
1315
-
1316
- ---
1317
- ```
1318
-
1319
- ### 9. `split-layout`
1320
-
1321
- Left column: sentence text. Right column: supporting visual (icon, shape, number).
1322
-
1323
- ```html
1324
- <div class="scene-bg"></div>
1325
- <div class="scene-content" style="flex-direction:row;align-items:center;gap:80px;">
1326
- <!-- Left: text -->
1327
- <div id="sN-left" style="flex:1;display:flex;flex-direction:column;gap:20px;">
1328
- <div class="hed" style="font-size:80px;">Key Point</div>
1329
- <div class="sub">The sentence text goes here, describing the concept clearly.</div>
1330
- </div>
1331
- <!-- Divider -->
1332
- <div id="sN-div" style="width:4px;height:400px;background:#c0392b;border-radius:2px;flex-shrink:0;opacity:0;"></div>
1333
- <!-- Right: visual -->
1334
- <div id="sN-right" style="flex:1;display:flex;align-items:center;justify-content:center;">
1335
- <!-- e.g. a large icon, number, shape, or decorative element -->
1336
- <div style="font-size:200px;line-height:1;color:#c0392b;">◆</div>
1337
- </div>
1338
- </div>
1339
- ```js
1340
- tl.from("#sN-left", { x:-60, opacity:0, duration:0.65, ease:"expo.out" }, offset + 0.2);
1341
- tl.to("#sN-div", { opacity:1, scaleY:0, transformOrigin:"top", duration:0 }, offset + 0.5);
1342
- tl.from("#sN-div", { scaleY:0, transformOrigin:"top", duration:0.5, ease:"power2.out" }, offset + 0.5);
1343
- tl.set("#sN-div", { opacity:1 }, offset + 0.5);
1344
- tl.from("#sN-right", { x:60, opacity:0, duration:0.65, ease:"expo.out" }, offset + 0.6);
1345
- ```
1346
- ---
1347
- ```
1348
-
1349
- ### 9b. `split-screen`
1350
-
1351
- Full-bleed 50/50 vertical split — each half fills its side of the canvas, text centered vertically within it. Left half uses the card background; right half uses the primary dark background. A large `→` floats absolutely at the center. No borders or card boxes — clean negative space carries the weight.
1352
-
1353
- **When to use:** Sentence that maps two paired concepts cleanly — need → answer, problem → solution, input → output. Ideal for short punchy contrasts where both sides need equal visual weight. NOT the same as `split-layout` (which is text + visual in a horizontal content row).
1354
-
1355
- **Type signal:** Sentence pairs two short concepts with a clear mapping ("Then build the feature as the answer", "Human pain → Build the feature").
1356
-
1357
- ```html
1358
- <div class="scene-bg"></div>
1359
- <!-- Full-bleed flex row — both halves stretch to full height -->
1360
- <div style="position:absolute;inset:0;display:flex;flex-direction:row;align-items:stretch;">
1361
-
1362
- <!-- Left half: slightly darker card bg, thin right border -->
1363
- <div id="sN-sl" style="width:50%;height:100%;display:flex;flex-direction:column;
1364
- align-items:center;justify-content:center;
1365
- background:#111111;border-right:2px solid #222;opacity:0;">
1366
- <div style="font-family:'Outfit',sans-serif;font-size:26px;font-weight:700;
1367
- letter-spacing:5px;color:#8899aa;text-transform:uppercase;margin-bottom:16px;">THE NEED</div>
1368
- <div style="font-family:'Outfit',sans-serif;font-size:64px;font-weight:900;
1369
- color:#e2e2e2;text-align:center;line-height:1.2;">Human pain<br>+ desire</div>
1370
- </div>
1371
-
1372
- <!-- Right half: primary dark bg -->
1373
- <div id="sN-sr" style="width:50%;height:100%;display:flex;flex-direction:column;
1374
- align-items:center;justify-content:center;
1375
- background:#0a0a0a;opacity:0;">
1376
- <div style="font-family:'Outfit',sans-serif;font-size:26px;font-weight:700;
1377
- letter-spacing:5px;color:#c0392b;text-transform:uppercase;margin-bottom:16px;">THE ANSWER</div>
1378
- <div style="font-family:'Outfit',sans-serif;font-size:64px;font-weight:900;
1379
- color:#e2e2e2;text-align:center;line-height:1.2;">Build the<br>feature</div>
1380
- </div>
1381
-
1382
- </div>
1383
-
1384
- <!-- Arrow floats absolutely at the vertical center seam -->
1385
- <div id="sN-sarr" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
1386
- font-family:'Outfit',sans-serif;font-size:120px;color:#c0392b;line-height:1;opacity:0;">→</div>
1387
- ```js
1388
- // offset = scene startTime
1389
- // Left flies in from left, arrow pops, right flies in from right
1390
- tl.fromTo('#sN-sl', { opacity:0, x:-40 }, { opacity:1, x:0, duration:0.3, ease:'power2.out' }, offset + 0.07);
1391
- tl.fromTo('#sN-sarr', { opacity:0, scale:0 }, { opacity:1, scale:1, duration:0.2 }, offset + 0.5);
1392
- tl.fromTo('#sN-sr', { opacity:0, x:40 }, { opacity:1, x:0, duration:0.3, ease:'power2.out' }, offset + 0.67);
1393
- ```
1394
- > **Reference:** Scene S12 of `C:\openclaw_files\projects\user-stories\index.html`. CSS classes: `.sl` (flex-direction:row on scene-content), `.sl-half` (50% width, full height, centered flex), `.sl-left` (card bg + right border), `.sl-right` (#0a0a0a), `.sl-lbl` (eyebrow, muted), `.sl-lbl.acc` (eyebrow, accent), `.sl-body` (64px/900), `.sl-arrow` (absolute center, 120px accent). Note: this scene can be very short (1–2s) since both sides land fast.
1395
-
1396
- ---
1397
- ```
1398
-
1399
- ### 9b. `doodle-split`
1400
-
1401
- Split layout — text on the left, a hand-drawn doodle illustration on the right. Uses the local doodle library at `E:\Doodle_Library`. Great for sentences with a concrete noun, action, emotion, or visual metaphor that can be illustrated.
1402
-
1403
- **Doodle selection (do this before writing HTML):**
1404
-
1405
- 1. Identify the key concept in the sentence (e.g., "collaboration", "rocket", "thinking").
1406
- 2. Search `<path-to-doodle-library>\_ALL\` for a filename that matches:
1407
- ```powershell
1408
- Get-ChildItem "<path-to-doodle-library>\_ALL" -File | Where-Object { $_.Name -match "keyword" }
1409
- ```
1410
- ```
1411
- 3. Copy the best match into the project's `assets/` folder:
1412
- ```
1413
- ```powershell
1414
- Copy-Item "<path-to-doodle-library>\_ALL\rocket.png" "C:\openclaw_files\projects\<slug>\assets\doodle-sN.png"
1415
- ```
1416
- ```
1417
- 4. Use `assets/doodle-sN.png` as the `src` in the HTML below.
1418
-
1419
- **Format preference:** SVG > PNG (SVGs scale perfectly at any size). Both work as `<img>` tags. PNG is fine if no SVG match exists.
1420
-
1421
- **Categories available for keyword ideas:** Active People, animals, Animated, casual, emotions, faces, Food and Drink, Mythical Beings, Objects, places, plants, Science and Technology, Shapes and Arrows, Special Characters, Transportation.
1422
-
1423
- **⚠️ Ink colour + theme rule:** Doodle Library assets are **black ink on transparent background**. Black ink is invisible on dark themes (`#0a0a0a`). Apply `filter: invert(1)` to the `<img>` when using a dark theme. On light themes (`#ffffff`, `open-page`, `broadsheet`) use no filter — black ink shows naturally.
1424
-
1425
- | Theme | `<img>` style |
1426
- |---|---|
1427
- | Dark (Shadow Cut, Neon Tokyo, Terminal Green, Blueprint, Velvet Standard, Dusk Gradient) | `filter:invert(1)` |
1428
- | Light (Open Page, Broadsheet, Frost, Brutalist) | no filter |
1429
- ```
1430
- ```html
1431
- <div class="scene-bg"></div>
1432
- <div class="scene-content" style="flex-direction:row;align-items:center;gap:80px;padding:80px 120px;">
1433
-
1434
- <!-- Left: text block -->
1435
- <div id="sN-dtxt" style="flex:1;display:flex;flex-direction:column;gap:24px;">
1436
- <div id="sN-deye" style="font-size:22px;font-weight:700;letter-spacing:6px;
1437
- color:#c0392b;text-transform:uppercase;opacity:0;">CONCEPT</div>
1438
- <div id="sN-dhed" style="font-family:Outfit,sans-serif;font-weight:900;
1439
- font-size:96px;color:#e2e2e2;line-height:1.05;opacity:0;">
1440
- The headline.
1441
- </div>
1442
- <div id="sN-dsub" style="font-family:Outfit,sans-serif;font-weight:400;
1443
- font-size:44px;color:#8899aa;line-height:1.4;opacity:0;">
1444
- The sentence text goes here.
1445
- </div>
1446
- </div>
1447
-
1448
- <!-- Vertical divider -->
1449
- <div id="sN-ddiv" style="width:3px;height:0px;background:#c0392b;border-radius:2px;flex-shrink:0;align-self:center;"></div>
1450
-
1451
- <!-- Right: doodle — filter:invert(1) for dark themes (black ink → white); remove for light themes -->
1452
- <div id="sN-dimg" style="flex-shrink:0;width:480px;display:flex;align-items:center;justify-content:center;opacity:0;">
1453
- <img src="assets/doodle-sN.png" alt="doodle"
1454
- style="width:480px;height:480px;object-fit:contain;display:block;filter:invert(1);">
1455
- </div>
1456
- </div>
1457
- ```js
1458
- // offset = scene startTime
1459
- tl.fromTo('#sN-deye', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.3, ease:'power2.out' }, offset + 0.15);
1460
- tl.fromTo('#sN-dhed', { opacity:0, x:-50 }, { opacity:1, x:0, duration:0.6, ease:'expo.out' }, offset + 0.3);
1461
- tl.fromTo('#sN-dsub', { opacity:0, x:-40 }, { opacity:1, x:0, duration:0.5, ease:'power2.out' }, offset + 0.65);
1462
- tl.to('#sN-ddiv', { height:'320px', duration:0.5, ease:'power2.inOut' }, offset + 0.5);
1463
- tl.fromTo('#sN-dimg', { opacity:0, scale:0.75, x:40 }, { opacity:1, scale:1, x:0, duration:0.65, ease:'back.out(1.8)' }, offset + 0.6);
1464
- ```
1465
- > **No-match fallback:** If no doodle closely matches the sentence, skip this type and use `split-layout` or `kinetic-text` instead. Don't force a poor match.
1466
-
1467
- **Reference projects (rendered, lint-clean, 12s, 60fps):**
1468
-
1469
- | Theme | Project path | Notes |
1470
- |---|---|---|
1471
- | Dark (Shadow Cut) | `C:\openclaw_files\projects\doodle-split-dark\` | `filter:invert(1)` on images. laptop + brain doodles. Accent `#c0392b`. |
1472
- | Light (Open Page) | `C:\openclaw_files\projects\doodle-split-light\` | No filter on images. coffee + book doodles. Accent `#e63946`, bg `#ffffff`, text `#1a1a1a`. |
1473
-
1474
- Both outputs are in the project root as `doodle-split-dark.mp4` and `doodle-split-light.mp4`. Use these as copy-paste starting points for new `doodle-split` scenes.
1475
-
1476
- ---
1477
- ```
1478
-
1479
- ### 10. `progress-ring`
1480
-
1481
- SVG circle that fills to a percentage. For proportions and completion metrics.
1482
-
1483
- ```html
1484
- <div class="scene-bg"></div>
1485
- <div class="scene-content" style="align-items:center;text-align:center;">
1486
- <div id="sN-prhead" class="sub" style="font-size:52px;margin-bottom:40px;">Developer Adoption</div>
1487
- <div style="position:relative;width:400px;height:400px;margin:0 auto;">
1488
- <!-- Track circle -->
1489
- <svg width="400" height="400" style="position:absolute;top:0;left:0;" viewBox="0 0 400 400">
1490
- <circle cx="200" cy="200" r="160" fill="none" stroke="#1a1a1a" stroke-width="20"/>
1491
- <!-- Animated fill — circumference = 2π×160 ≈ 1005 -->
1492
- <circle id="sN-ring" cx="200" cy="200" r="160" fill="none" stroke="#c0392b" stroke-width="20"
1493
- stroke-dasharray="1005" stroke-dashoffset="1005" stroke-linecap="round"
1494
- transform="rotate(-90 200 200)"/>
1495
- </svg>
1496
- <!-- Center number -->
1497
- <div id="sN-rpct" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
1498
- font-family:Outfit;font-weight:900;font-size:100px;color:#e2e2e2;">0%</div>
1499
- </div>
1500
- <div id="sN-rsub" class="sub" style="margin-top:32px;">of teams using AI tools daily</div>
1501
- </div>
1502
- ```js
1503
- var TARGET_PCT = 72; // e.g. 72%
1504
- var circumference = 1005;
1505
- var targetOffset = circumference * (1 - TARGET_PCT / 100);
1506
- var ringObj = { pct: 0 };
1507
- tl.from("#sN-prhead", { y:-30, opacity:0, duration:0.5, ease:"power2.out" }, offset + 0.15);
1508
- tl.to(ringObj, {
1509
- pct: TARGET_PCT, duration:1.0, ease:"power2.inOut",
1510
- onUpdate: function() {
1511
- var el = document.getElementById("sN-rpct");
1512
- var ring = document.getElementById("sN-ring");
1513
- if (el) el.textContent = Math.round(ringObj.pct) + "%";
1514
- if (ring) ring.setAttribute("stroke-dashoffset", String(circumference * (1 - ringObj.pct/100)));
1515
- }
1516
- }, offset + 0.3);
1517
- tl.from("#sN-rsub", { y:20, opacity:0, duration:0.4, ease:"power1.out" }, offset + 0.5);
1518
- ```
1519
- ---
1520
- ```
1521
-
1522
- ### 11. `comparison`
1523
-
1524
- Two columns side by side — contrast two things. Highlight the "winner" with accent color.
1525
-
1526
- ```html
1527
- <div class="scene-bg"></div>
1528
- <div class="scene-content" style="flex-direction:row;gap:60px;align-items:stretch;">
1529
- <!-- Left (loser) — centered content, muted glyph -->
1530
- <div id="sN-cola" style="flex:1;background:#111;border-radius:16px;padding:60px 48px;
1531
- display:flex;flex-direction:column;gap:20px;border:2px solid #222;
1532
- align-items:center;justify-content:center;text-align:center;">
1533
- <div style="font-family:Outfit,sans-serif;font-size:88px;color:#444;line-height:1;">✗</div>
1534
- <div style="font-family:Outfit;font-weight:900;font-size:56px;color:#8899aa;">BEFORE</div>
1535
- <div style="font-family:Outfit;font-weight:400;font-size:40px;color:#8899aa;line-height:1.4;">Manual, slow, error-prone</div>
1536
- </div>
1537
- <!-- VS badge -->
1538
- <div id="sN-vs" style="flex-shrink:0;align-self:center;font-family:Outfit;font-weight:900;
1539
- font-size:52px;color:#c0392b;">VS</div>
1540
- <!-- Right (winner) — centered content, accent glyph -->
1541
- <div id="sN-colb" style="flex:1;background:#150909;border-radius:16px;padding:60px 48px;
1542
- display:flex;flex-direction:column;gap:20px;border:2px solid #c0392b;
1543
- align-items:center;justify-content:center;text-align:center;">
1544
- <div style="font-family:Outfit,sans-serif;font-size:88px;color:#c0392b;line-height:1;">◆</div>
1545
- <div style="font-family:Outfit;font-weight:900;font-size:56px;color:#c0392b;">AFTER</div>
1546
- <div style="font-family:Outfit;font-weight:400;font-size:40px;color:#e2e2e2;line-height:1.4;">Automated, instant, reliable</div>
1547
- </div>
1548
- </div>
1549
- ```js
1550
- tl.from("#sN-cola", { x:-80, opacity:0, duration:0.6, ease:"expo.out" }, offset + 0.2);
1551
- tl.from("#sN-vs", { scale:0.5, opacity:0, duration:0.4, ease:"back.out(3)" }, offset + 0.6);
1552
- tl.from("#sN-colb", { x:80, opacity:0, duration:0.6, ease:"expo.out" }, offset + 0.8);
1553
- ```
1554
- ---
1555
- ```
1556
-
1557
- ### 11b. `comparison-verdict`
1558
-
1559
- Variant of comparison with a "SUDDENLY." (or similar impact word) header above the two cards. Cards use colored top borders (not full borders), an icon, label, descriptor, and an arrow connector (→) instead of VS. Ideal when the sentence has a reveal structure ("And SUDDENLY, bad vs good becomes obvious."). Derived from the canonical user-stories project.
1560
-
1561
- ```html
1562
- <div class="scene-bg"></div>
1563
- <div class="scene-content" style="align-items:center;gap:32px;">
1564
-
1565
- <!-- Impact header — reveals before cards -->
1566
- <div id="sN-suddenly" style="font-family:Outfit,sans-serif;font-weight:900;
1567
- font-size:96px;color:#e2e2e2;letter-spacing:-2px;align-self:flex-start;">SUDDENLY.</div>
1568
-
1569
- <!-- Card row -->
1570
- <div style="display:flex;align-items:stretch;gap:0;width:100%;">
1571
-
1572
- <!-- Bad card: red top border -->
1573
- <div id="sN-cbad" style="flex:1;background:#111;border-radius:16px;padding:48px 40px;
1574
- border-top:6px solid #c0392b;display:flex;flex-direction:column;align-items:center;gap:16px;text-align:center;">
1575
- <div style="font-size:72px;">☠</div>
1576
- <div style="font-family:Outfit;font-weight:900;font-size:44px;color:#e2e2e2;">RANSOM NOTE</div>
1577
- <div style="font-family:Outfit;font-weight:400;font-size:28px;color:#8899aa;line-height:1.4;">
1578
- Vague, uncheckable, nobody owns it
1579
- </div>
1580
- </div>
1581
-
1582
- <!-- Arrow connector -->
1583
- <div id="sN-cvs" style="flex-shrink:0;align-self:center;padding:0 32px;
1584
- font-family:Outfit;font-weight:900;font-size:52px;color:#8899aa;">→</div>
1585
-
1586
- <!-- Good card: green top border -->
1587
- <div id="sN-cgood" style="flex:1;background:#0a160a;border-radius:16px;padding:48px 40px;
1588
- border-top:6px solid #27ae60;display:flex;flex-direction:column;align-items:center;gap:16px;text-align:center;">
1589
- <div style="font-size:72px;">◆</div>
1590
- <div style="font-family:Outfit;font-weight:900;font-size:44px;color:#27ae60;">STRATEGY</div>
1591
- <div style="font-family:Outfit;font-weight:400;font-size:28px;color:#8899aa;line-height:1.4;">
1592
- Clear outcome, testable, owned
1593
- </div>
1594
- </div>
1595
-
1596
- </div>
1597
- </div>
1598
- ```js
1599
- // Header drops first, then bad card slides left, connector pops, good card slides right
1600
- tl.from("#sN-suddenly", { y:-50, opacity:0, duration:0.55, ease:"expo.out" }, offset + 0.1);
1601
- tl.from("#sN-cbad", { x:-80, opacity:0, duration:0.55, ease:"expo.out" }, offset + 0.55);
1602
- tl.from("#sN-cvs", { scale:0.4, opacity:0, duration:0.4, ease:"back.out(3)" }, offset + 0.9);
1603
- tl.from("#sN-cgood", { x:80, opacity:0, duration:0.55, ease:"expo.out" }, offset + 1.05);
1604
- ```
1605
- > **Reference:** Scene S13 of `C:\\openclaw_files\projects\user-stories\index.html` (lines 357–374 HTML, 544–550 GSAP). CSS classes: `.cmp-bad` (red top border), `.cmp-good` (green top border), `.cmp-ico` (72px emoji), `.cmp-lbl` (44px/900), `.cmp-desc` (28px/muted), `.cmp-vs` (arrow connector), `.suddenly` (impact header above row).
1606
-
1607
- ---
1608
- ```
1609
-
1610
- ### 11c. `product-comparison`
1611
-
1612
- Two product cards side-by-side separated by a VS divider. Left card: standard/challenger (muted, dark border). Right card: winner/recommended (accent border, floating badge). Feature rows stagger in row-by-row across both cards simultaneously, then the winner badge pops last.
1613
-
1614
- **Type signal:** sentence compares two named products, plans, tools, or pricing tiers with multiple attributes (e.g., "Pro has everything Starter does, plus unlimited seats and 100GB storage at a lower price").
1615
-
1616
- **Feature icon conventions:**
1617
-
1618
- | Indicator | HTML entity | Color |
1619
- |---|---|---|
1620
- | Not supported | `&#10007;` (✗) | `#444` (muted) |
1621
- | Supported | `&#10003;` (✓) | `#27ae60` (green) |
1622
- | Unlimited | `&#8734;` (∞) | `#c0392b` (accent, winner card) |
1623
- | Numeric value | text `<span>` | `#8899aa` dim (loser) / `#c0392b` accent (winner) |
1624
-
1625
- ```html
1626
- <div class="scene-bg"></div>
1627
- <!-- Accent glow behind winner card -->
1628
- <div style="position:absolute;top:50%;right:200px;width:600px;height:600px;
1629
- border-radius:50%;background:radial-gradient(circle,rgba(192,57,43,0.12) 0%,transparent 70%);
1630
- transform:translateY(-50%);pointer-events:none;"></div>
1631
-
1632
- <div class="scene-content" style="align-items:center;gap:24px;padding:60px 120px;">
1633
-
1634
- <!-- Eyebrow -->
1635
- <div id="sN-pclbl" style="font-family:Outfit,sans-serif;font-size:20px;font-weight:700;
1636
- letter-spacing:8px;color:#c0392b;text-transform:uppercase;opacity:0;">HEAD TO HEAD</div>
1637
-
1638
- <!-- Card row -->
1639
- <div style="display:flex;align-items:stretch;gap:0;width:100%;flex:1;min-height:0;">
1640
-
1641
- <!-- Card A: standard/loser — muted colors -->
1642
- <div id="sN-pca" style="flex:1;background:#111111;border-radius:20px 0 0 20px;
1643
- border:2px solid #222;border-right:none;padding:44px 48px;
1644
- display:flex;flex-direction:column;opacity:0;">
1645
-
1646
- <div style="margin-bottom:28px;padding-bottom:24px;border-bottom:1px solid #1e1e1e;">
1647
- <div style="font-family:Outfit,sans-serif;font-size:50px;font-weight:900;color:#8899aa;">Starter</div>
1648
- <div style="font-family:Outfit,sans-serif;font-size:22px;color:#444;margin:6px 0 14px;">For solo developers</div>
1649
- <div style="font-family:Outfit,sans-serif;font-size:60px;font-weight:900;color:#8899aa;line-height:1;">
1650
- $29<span style="font-size:24px;font-weight:400;color:#555;">/mo</span>
1651
- </div>
1652
- </div>
1653
-
1654
- <div style="display:flex;flex-direction:column;gap:18px;">
1655
- <!-- Feature row pattern: icon + label. Repeat for each feature. -->
1656
- <div id="sN-pca-f1" style="display:flex;align-items:center;gap:16px;opacity:0;">
1657
- <span style="font-size:28px;width:36px;text-align:center;color:#444;">&#10007;</span>
1658
- <span style="font-family:Outfit,sans-serif;font-size:30px;font-weight:600;color:#555;">API Access</span>
1659
- </div>
1660
- <!-- sN-pca-f2, f3, f4 follow same pattern -->
1661
- </div>
1662
- </div>
1663
-
1664
- <!-- VS divider -->
1665
- <div style="width:72px;background:#161616;display:flex;align-items:center;justify-content:center;flex-shrink:0;">
1666
- <div id="sN-pcvs" style="font-family:Outfit,sans-serif;font-size:22px;font-weight:900;
1667
- color:#c0392b;letter-spacing:6px;opacity:0;">VS</div>
1668
- </div>
1669
-
1670
- <!-- Card B: winner/recommended — accent border, red tint bg -->
1671
- <div id="sN-pcb" style="flex:1;background:#150909;border-radius:0 20px 20px 0;
1672
- border:2px solid #c0392b;border-left:none;padding:44px 48px;
1673
- display:flex;flex-direction:column;position:relative;opacity:0;">
1674
-
1675
- <!-- Winner badge — floats above card top edge; starts hidden, pops in last -->
1676
- <div id="sN-badge" style="position:absolute;top:-18px;left:50%;transform:translateX(-50%);
1677
- background:#c0392b;color:#fff;font-family:Outfit,sans-serif;font-size:16px;
1678
- font-weight:900;letter-spacing:5px;padding:6px 22px;border-radius:20px;
1679
- white-space:nowrap;opacity:0;">&#9733; RECOMMENDED</div>
1680
-
1681
- <div style="margin-bottom:28px;padding-bottom:24px;border-bottom:1px solid #2a1010;">
1682
- <div style="font-family:Outfit,sans-serif;font-size:50px;font-weight:900;color:#c0392b;">Pro</div>
1683
- <div style="font-family:Outfit,sans-serif;font-size:22px;color:#555;margin:6px 0 14px;">For growing teams</div>
1684
- <div style="font-family:Outfit,sans-serif;font-size:60px;font-weight:900;color:#e2e2e2;line-height:1;">
1685
- $19<span style="font-size:24px;font-weight:400;color:#666;">/mo</span>
1686
- </div>
1687
- </div>
1688
-
1689
- <div style="display:flex;flex-direction:column;gap:18px;">
1690
- <!-- Feature row pattern: icon + label. Repeat for each feature. -->
1691
- <div id="sN-pcb-f1" style="display:flex;align-items:center;gap:16px;opacity:0;">
1692
- <span style="font-size:28px;width:36px;text-align:center;color:#27ae60;">&#10003;</span>
1693
- <span style="font-family:Outfit,sans-serif;font-size:30px;font-weight:600;color:#e2e2e2;">API Access</span>
1694
- </div>
1695
- <!-- sN-pcb-f2, f3, f4 follow same pattern -->
1696
- </div>
1697
- </div>
1698
-
1699
- </div>
1700
- </div>
1701
- ```js
1702
- var offset = sceneStartTime;
1703
-
1704
- tl.fromTo('#sN-pclbl', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.4, ease:'power2.out' }, offset + 0.1);
1705
-
1706
- // Both cards fly in simultaneously from opposite sides
1707
- tl.fromTo('#sN-pca', { opacity:0, x:-60 }, { opacity:1, x:0, duration:0.55, ease:'expo.out' }, offset + 0.3);
1708
- tl.fromTo('#sN-pcb', { opacity:0, x:60 }, { opacity:1, x:0, duration:0.55, ease:'expo.out' }, offset + 0.3);
1709
-
1710
- // VS badge scales in between the two cards
1711
- tl.fromTo('#sN-pcvs', { opacity:0, scale:0.5 }, { opacity:1, scale:1, duration:0.4, ease:'back.out(2)' }, offset + 0.65);
1712
-
1713
- // Feature rows stagger — both cards reveal row-by-row in sync (mirrored entrance)
1714
- [1, 2, 3, 4].forEach(function(i) {
1715
- var t = offset + 0.9 + (i - 1) * 0.22;
1716
- tl.fromTo('#sN-pca-f' + i, { opacity:0, x:-20 }, { opacity:1, x:0, duration:0.3, ease:'power2.out' }, t);
1717
- tl.fromTo('#sN-pcb-f' + i, { opacity:0, x:20 }, { opacity:1, x:0, duration:0.3, ease:'power2.out' }, t);
1718
- });
1719
-
1720
- // Winner badge pops last — final emphasis on the recommended choice
1721
- tl.fromTo('#sN-badge', { opacity:0, scale:0.5, y:-8 }, { opacity:1, scale:1, y:0, duration:0.45, ease:'back.out(3)' }, offset + 1.85);
1722
- ```
1723
- > **Reference:** `C:\\openclaw_files\projects\product-comparison-sample\index.html`. Use 3–5 feature rows. Always keep feature row `opacity:0` as the default inline style — card entrance and row reveals are separate tweens. Scale down to 3 rows for short scenes (≤5s), use 5 rows for longer scenes (≥8s).
1724
-
1725
- ---
1726
-
1727
- Full-frame dark background + single bold punchline. Maximum impact. No radial glow — typography carries the weight.
1728
- ```
1729
- ```html
1730
- <div class="scene-bg"></div>
1731
- <div class="scene-content" style="align-items:center;text-align:center;">
1732
- <div id="sN-ctext" class="hed" style="font-size:110px;color:#e2e2e2;max-width:1400px;line-height:1.1;">
1733
- This is the one thing that matters.
1734
- </div>
1735
- </div>
1736
- ```js
1737
- tl.fromTo("#sN-ctext", { scale:0.85, opacity:0 }, { scale:1, opacity:1, duration:0.65, ease:"back.out(1.5)" }, offset + 0.1);
1738
- ```
1739
- **`callout` with `rotationZ` entrance (kinetic variant):** When the main word should feel like it slams into place — use `scale:1.3, rotationZ:-2` on the entrance. Most effective for single-word callouts like "BACKWARDS." or "WRONG." Derived from S8 of user-stories.
1740
- ```
1741
- ```html
1742
- <!-- Same HTML as above, just change the GSAP entrance: -->
1743
- ```js
1744
- tl.from("#sN-pre", { opacity:0, y:20 }, { duration:0.4 }, offset + 0.26);
1745
- tl.fromTo("#sN-main", { opacity:0, scale:1.3, rotationZ:-2 },
1746
- { opacity:1, scale:1, rotationZ:0, duration:0.5, ease:'power3.out' }, offset + 1.16);
1747
- tl.from("#sN-sub", { opacity:0 }, { duration:0.3 }, offset + 2.56);
1748
- ```
1749
- > **Reference:** Scene S8 of `C:\\openclaw_files\projects\user-stories\index.html` (line 513 GSAP). Use for single-word reveal sentences where the word itself carries maximum weight.
1750
-
1751
- ---
1752
- ```
1753
-
1754
- ### 12b. `cta-callout` (CTA box with bounce arrow)
1755
-
1756
- Callout variant with a framed CTA box and a bouncing directional arrow. Use for "click the link" or action-driving sentences at the end of a video. Pre-text + main sentence + box with arrow + hint text.
1757
-
1758
- ```html
1759
- <div class="scene-bg"></div>
1760
- <div class="scene-content" style="align-items:center;text-align:center;">
1761
- <div id="sN-ctapre" style="font-size:28px;font-weight:700;letter-spacing:4px;
1762
- color:#6b7280;text-transform:uppercase;margin-bottom:16px;opacity:0;">WANT THE QUICK HACK?</div>
1763
- <div id="sN-ctamain" style="font-family:Outfit,sans-serif;font-weight:900;font-size:68px;
1764
- color:#e2e2e2;max-width:1300px;line-height:1.2;opacity:0;">
1765
- Makes user stories practically write themselves.
1766
- </div>
1767
- <!-- Bordered CTA box with bouncing arrow -->
1768
- <div id="sN-ctabox" style="display:inline-flex;align-items:center;gap:24px;
1769
- margin-top:40px;border:3px solid #c0392b;padding:20px 48px;opacity:0;">
1770
- <span id="sN-ctaarr" style="font-size:60px;color:#c0392b;display:inline-block;">↓</span>
1771
- <div>
1772
- <div style="font-family:Outfit;font-weight:900;font-size:42px;color:#e2e2e2;letter-spacing:3px;">CLICK THE LINK</div>
1773
- <div style="font-size:22px;color:#6b7280;">lower left</div>
1774
- </div>
1775
- </div>
1776
- </div>
1777
- ```js
1778
- tl.fromTo('#sN-ctapre', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.4 }, offset + 0.23);
1779
- tl.fromTo('#sN-ctamain', { opacity:0, y:30 }, { opacity:1, y:0, duration:0.5, ease:'power2.out' }, offset + 0.68);
1780
- tl.fromTo('#sN-ctabox', { opacity:0, scale:0.85 }, { opacity:1, scale:1, duration:0.4, ease:'back.out(1.5)' }, offset + 3.18);
1781
- // Bouncing arrow — yoyo, finite repeats (calculate from remaining scene duration)
1782
- tl.to('#sN-ctaarr', { y:12, duration:0.35, ease:'sine.inOut', yoyo:true, repeat:5 }, offset + 3.68);
1783
- ```
1784
- > **Reference:** Scene S14 of `C:\\openclaw_files\projects\user-stories\index.html` (lines 379–393 HTML, 552–558 GSAP). CSS classes: `.cta-box`, `.cta-arrow`, `.cta-label`, `.cta-hint`. `repeat` value must be finite — calculate from remaining scene time.
1785
-
1786
- ---
1787
- ```
1788
-
1789
- ### 13. `icon-grid`
1790
-
1791
- 3–6 icons/emoji with labels, staggered reveal. For multi-concept sentences.
1792
-
1793
- ```html
1794
- <div class="scene-bg"></div>
1795
- <div class="scene-content">
1796
- <div id="sN-ighead" class="hed" style="font-size:80px;margin-bottom:48px;">All in one place</div>
1797
- <div style="display:grid;grid-template-columns:repeat(3,1fr);gap:40px;">
1798
- <!-- Repeat for each icon -->
1799
- <div id="sN-ic1" style="display:flex;flex-direction:column;align-items:center;gap:16px;
1800
- background:#111;border-radius:16px;padding:40px 24px;">
1801
- <div style="font-size:80px;line-height:1;color:#c0392b;">◈</div>
1802
- <div style="font-family:Outfit;font-weight:700;font-size:40px;color:#e2e2e2;text-align:center;">Fix</div>
1803
- </div>
1804
- <div id="sN-ic2" style="display:flex;flex-direction:column;align-items:center;gap:16px;
1805
- background:#111;border-radius:16px;padding:40px 24px;">
1806
- <div style="font-size:80px;line-height:1;color:#c0392b;">✦</div>
1807
- <div style="font-family:Outfit;font-weight:700;font-size:40px;color:#e2e2e2;text-align:center;">Write</div>
1808
- </div>
1809
- <div id="sN-ic3" style="display:flex;flex-direction:column;align-items:center;gap:16px;
1810
- background:#111;border-radius:16px;padding:40px 24px;">
1811
- <div style="font-size:80px;line-height:1;color:#c0392b;">▲</div>
1812
- <div style="font-family:Outfit;font-weight:700;font-size:40px;color:#e2e2e2;text-align:center;">Ship</div>
1813
- </div>
1814
- </div>
1815
- </div>
1816
- ```js
1817
- tl.from("#sN-ighead", { y:-40, opacity:0, duration:0.55, ease:"power3.out" }, offset + 0.1);
1818
- tl.from("#sN-ic1, #sN-ic2, #sN-ic3", {
1819
- y:60, opacity:0, scale:0.9, duration:0.5, ease:"back.out(1.8)",
1820
- stagger: { each:0.15, from:"start" }
1821
- }, offset + 0.4);
1822
- ```
1823
- ---
1824
- ```
1825
-
1826
- ### 14. `outro-card`
1827
-
1828
- Closing scene — eyebrow label drops first, big title slams up, sub line fades, accent rule bar grows, then everything stagger-fades out.
1829
-
1830
- **Three-beat structure:** eyebrow → title + sub → rule bar → hold → fade out.
1831
-
1832
- ```html
1833
- <div class="scene-bg"></div>
1834
- <!-- Optional: theme decoratives here (grid, corner brackets, etc.) -->
1835
- <div class="scene-content" style="align-items:center;text-align:center;gap:28px;">
1836
- <!-- 1. Eyebrow label — drops in before the headline -->
1837
- <div id="sN-olbl" style="font-size:22px;font-weight:700;letter-spacing:8px;
1838
- color:#c0392b;text-transform:uppercase;opacity:0;">YOUR CLOSING LABEL</div>
1839
-
1840
- <!-- 2. Main title — the action/takeaway (big, high contrast) -->
1841
- <div id="sN-otitle" class="hed" style="font-size:130px;opacity:0;">CLOSING WORDS.</div>
1842
-
1843
- <!-- 3. Sub line — supporting sentence -->
1844
- <div id="sN-osub" class="sub" style="font-size:38px;opacity:0;">
1845
- One short motivating or contextual line.
1846
- </div>
1847
-
1848
- <!-- 4. Rule bar — grows from left, accent colored -->
1849
- <div id="sN-orule" style="width:0px;height:3px;background:#c0392b;"></div>
1850
- </div>
1851
- ```js
1852
- var sceneDur = endTime - startTime;
1853
- tl.fromTo('#sN-olbl', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.4, ease:'power2.out' }, offset + 0.25);
1854
- tl.fromTo('#sN-otitle', { opacity:0, y:60 }, { opacity:1, y:0, duration:0.7, ease:'power3.out' }, offset + 0.55);
1855
- tl.fromTo('#sN-osub', { opacity:0, y:30 }, { opacity:1, y:0, duration:0.5, ease:'power2.out' }, offset + 0.9);
1856
- tl.to('#sN-orule', { width:'280px', duration:0.8, ease:'power2.inOut' }, offset + 1.2);
1857
- // Final fade-out — only outro is allowed exit tweens
1858
- tl.to('#sN-otitle, #sN-olbl, #sN-osub, #sN-orule', {
1859
- opacity:0, y:-30, duration:0.6, ease:'power2.in', stagger:0.08
1860
- }, offset + sceneDur - 1.4);
1861
- ```
1862
- > **Reference:** Scene S14 of `C:\openclaw_files\projects\agile-vs-waterfall\index.html`. The eyebrow and rule bar are Shared Atoms (see above). Adapt colors to theme accent. Rule bar width (280px) is intentionally narrow — it's a punctuation mark, not a full-width divider.
1863
-
1864
- ---
1865
- ```
1866
-
1867
- ### 15. `threejs-object`
1868
-
1869
- A full 3D scene rendered with Three.js inside a HyperFrames clip. The Three.js render loop runs via `requestAnimationFrame` — GSAP tweens a plain `state` object, and rAF reads that state to update the mesh and call `renderer.render()` each frame.
1870
-
1871
- **Why rAF, not `onUpdate`:** HyperFrames seeks the GSAP timeline with `suppressEvents=true` during frame capture, so `onUpdate` callbacks never fire during rendering. Use a `requestAnimationFrame` loop instead — HyperFrames captures the frame after rAF fires, so Three.js always has a fresh render ready.
1872
-
1873
- **Key rules:**
1874
- - `<canvas>` fills the clip (`position:absolute;inset:0;display:block`)
1875
- - `renderer.setSize(1920, 1080)` + `renderer.setPixelRatio(1)` — fixed size, no auto-resize
1876
- - ALL 3D state driven via a plain `state` object that GSAP tweens
1877
- - Start an `(function animate(){ requestAnimationFrame(animate); ... renderer.render(); })()` loop — no `onUpdate` on `tl`
1878
-
1879
- ```html
1880
- <!-- Canvas fills the clip as the scene background -->
1881
- <canvas id="sN-canvas" style="position:absolute;inset:0;display:block;"></canvas>
1882
-
1883
- <!-- Optional text overlay on the left, with gradient fade -->
1884
- <div style="position:absolute;inset:0;pointer-events:none;
1885
- background:linear-gradient(90deg,rgba(10,22,40,0.92) 40%,transparent 72%);">
1886
- <div style="display:flex;flex-direction:column;justify-content:center;height:100%;padding:120px 160px;max-width:900px;">
1887
- <div id="sN-label" style="font-size:22px;font-family:'IBM Plex Mono',monospace;color:#4d6a99;letter-spacing:5px;opacity:0;">// 3D SCENE</div>
1888
- <div id="sN-box" style="border:2px dashed rgba(77,106,153,0.4);background:#0d1f3c;padding:40px 48px;margin-top:20px;opacity:0;">
1889
- <h1 style="font-family:'IBM Plex Mono',monospace;font-weight:700;font-size:88px;color:#e8f0ff;line-height:1.05;">Your<br><span style="color:#4da6ff;">headline.</span></h1>
1890
- <p style="font-family:'IBM Plex Mono',monospace;font-size:38px;color:#4d6a99;margin-top:20px;">Supporting sentence here.</p>
1891
- </div>
1892
- <div id="sN-rule" style="width:0px;height:3px;background:#4da6ff;margin-top:32px;"></div>
1893
- </div>
1894
- </div>
1895
- ```js
1896
- // ── Three.js setup (runs once at load) ──────────────────────────────────
1897
- var canvas = document.getElementById('sN-canvas');
1898
- var renderer = new THREE.WebGLRenderer({ canvas: canvas, antialias: true });
1899
- renderer.setSize(1920, 1080);
1900
- renderer.setPixelRatio(1);
1901
- renderer.setClearColor(0x0a1628, 1); // match theme BG
1902
-
1903
- var scene = new THREE.Scene();
1904
- var camera = new THREE.PerspectiveCamera(55, 1920/1080, 0.1, 1000);
1905
- camera.position.set(4, 0, 7);
1906
- camera.lookAt(4, 0, 0); // object offset right, camera looks at it
1907
-
1908
- // Geometry — torus knot reads as complex/technical, great for Blueprint
1909
- var geo = new THREE.TorusKnotGeometry(1.5, 0.42, 160, 32);
1910
-
1911
- var solidMesh = new THREE.Mesh(geo, new THREE.MeshStandardMaterial({
1912
- color: 0x0d2a4a, emissive: 0x1a3d6b, roughness: 0.25, metalness: 0.85
1913
- }));
1914
- solidMesh.position.set(4, 0, 0);
1915
- scene.add(solidMesh);
1916
-
1917
- var wireMesh = new THREE.Mesh(geo, new THREE.MeshBasicMaterial({
1918
- color: 0x4da6ff, wireframe: true, opacity: 0.55, transparent: true
1919
- }));
1920
- wireMesh.position.set(4, 0, 0);
1921
- scene.add(wireMesh);
1922
-
1923
- scene.add(new THREE.AmbientLight(0x4da6ff, 0.3));
1924
- var key = new THREE.PointLight(0x4da6ff, 4, 30);
1925
- key.position.set(6, 4, 6);
1926
- scene.add(key);
1927
-
1928
- // State object — GSAP tweens these values, rAF reads them
1929
- var state = { rotX: 0, rotY: 0, scale: 0.01 };
1930
-
1931
- // ── requestAnimationFrame render loop ────────────────────────────────────
1932
- // HyperFrames captures frames after rAF fires — Three.js must render here.
1933
- // GSAP sets state values when it seeks the timeline; rAF picks them up.
1934
- (function animate() {
1935
- requestAnimationFrame(animate);
1936
- solidMesh.rotation.x = wireMesh.rotation.x = state.rotX;
1937
- solidMesh.rotation.y = wireMesh.rotation.y = state.rotY;
1938
- solidMesh.scale.setScalar(state.scale);
1939
- wireMesh.scale.setScalar(state.scale);
1940
- renderer.render(scene, camera);
1941
- })();
1942
-
1943
- // ── GSAP Timeline — no onUpdate needed ───────────────────────────────────
1944
- var tl = gsap.timeline({ paused: true });
1945
-
1946
- tl.to(state, { scale: 1, duration: 1.2, ease: 'back.out(1.5)' }, offset + 0.1);
1947
- tl.to(state, { rotY: Math.PI * 2, rotX: Math.PI * 0.6, duration: sceneDur, ease: 'none' }, offset);
1948
-
1949
- // Text entrances
1950
- tl.fromTo('#sN-label', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.4, ease:'power2.out' }, offset + 0.9);
1951
- tl.fromTo('#sN-box', { opacity:0, y:40 }, { opacity:1, y:0, duration:0.7, ease:'power3.out' }, offset + 1.2);
1952
- tl.to('#sN-rule', { width:'240px', duration:0.8, ease:'power2.inOut' }, offset + 1.8);
1953
- ```
1954
- **Geometry options** (swap `TorusKnotGeometry` for any of these):
1955
-
1956
- | Geometry | Constructor | Character |
1957
- |---|---|---|
1958
- | Torus knot | `TorusKnotGeometry(1.5, 0.42, 160, 32)` | Complex, technical, infinite |
1959
- | Icosahedron | `IcosahedronGeometry(2, 1)` | Geometric, clean, crystalline |
1960
- | Sphere | `SphereGeometry(2, 64, 64)` | Smooth, planetary, AI |
1961
- | Box | `BoxGeometry(2.5, 2.5, 2.5)` | Corporate, SaaS, structured |
1962
- | Torus | `TorusGeometry(1.8, 0.5, 32, 100)` | Loop, cycle, infinity |
1963
- | Octahedron | `OctahedronGeometry(2, 0)` | Sharp, crystalline, abstract |
1964
-
1965
- **More Three.js effects** — all work with the same rAF + state pattern:
1966
-
1967
- | Effect | How | Use when |
1968
- |---|---|---|
1969
- | **Particle system** | `THREE.Points` with `BufferGeometry` + `PointsMaterial`; tween `state.spread` → update `positions` array in rAF | Galaxy, code rain, data scatter |
1970
- | **Custom shader** | `ShaderMaterial` with GLSL `vertexShader`/`fragmentShader`; tween a `uniforms.uTime` value → glowing plasma, noise waves | Futuristic BG, neon glow |
1971
- | **Multi-object scene** | Add multiple meshes; tween separate `state.rot1`, `state.rot2` etc. | DNA helix, solar system, logo orbit |
1972
- | **Line/wireframe only** | `EdgesGeometry` + `LineSegments` (no solid mesh) | Minimal/editorial, Blueprint spec diagrams |
1973
- | **Post-processing** | Not recommended — requires `EffectComposer` which needs ES module imports; stick to material tricks instead | — |
1974
- | **Explosion / morph** | Tween `geometry.attributes.position` per-vertex in rAF | Data transform, reveal animations |
1975
-
1976
- **Spec-box sizing rule for `threejs-object`:** The text overlay column is `max-width:860px` with `padding:80px 120px`. Headline font size should be `≤68px` to fit inside the dashed spec-box without overflow. If the headline is short (1–2 words), 80px is safe.
1977
-
1978
- > **Reference:** `C:\openclaw_files\projects\threejs-test\index.html`.
1979
- >
1980
- > **Three.js must be bundled locally — do NOT use CDN.** HyperFrames tries to inline CDN scripts at compile time, and Three.js CDN may return 404 or be unavailable offline. Download once:
1981
- >
1982
- ```
1983
- ```bash
1984
- > Invoke-WebRequest -Uri "https://cdn.jsdelivr.net/npm/three@0.160.0/build/three.min.js" -OutFile "three.min.js"
1985
- >
1986
- ```
1987
- ```
1988
- > Then reference it as `<script src="three.min.js"></script>` (relative path in project root).
1989
- >
1990
- > **Confirmed working version:** `three@0.160.0`. Note: HyperFrames detects `requestAnimationFrame` and automatically switches to screenshot-capture mode with virtual time — this is the correct behavior and enables proper frame capture of Three.js scenes.
1991
-
1992
- ---
1993
- ```
1994
-
1995
- ### 15b. `canvas2d-scene` (Canvas 2D / p5.js / PixiJS)
1996
-
1997
- The same rAF pattern works for **any canvas-based JS library**. The pattern is always:
1998
- 1. Get a `<canvas>` element
1999
- 2. Start a `requestAnimationFrame` loop
2000
- 3. Let GSAP tween a `state` object
2001
- 4. In rAF, read `state` and draw to canvas
2002
-
2003
- **Supported libraries (all confirmed compatible with HyperFrames rAF mode):**
2004
-
2005
- | Library | Script | Best for |
2006
- |---|---|---|
2007
- | Canvas 2D API | Built-in (`canvas.getContext('2d')`) | Custom shapes, gradients, text effects |
2008
- | p5.js | `https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/p5.min.js` | Generative art, flow fields, noise |
2009
- | PixiJS | `https://cdn.jsdelivr.net/npm/pixi.js@8/dist/pixi.min.js` | 2D sprites, particle showers, filters |
2010
-
2011
- **Canvas 2D example (no external lib needed):**
2012
-
2013
- ```html
2014
- <canvas id="sN-c2d" style="position:absolute;inset:0;display:block;"></canvas>
2015
- ```js
2016
- var cv = document.getElementById('sN-c2d');
2017
- cv.width = 1920; cv.height = 1080;
2018
- var ctx = cv.getContext('2d');
2019
- var state = { progress: 0, glow: 0 };
2020
-
2021
- (function loop() {
2022
- requestAnimationFrame(loop);
2023
- ctx.clearRect(0, 0, 1920, 1080);
2024
- // Draw using state.progress (0→1) driven by GSAP
2025
- var r = state.progress * 960;
2026
- ctx.beginPath();
2027
- ctx.arc(960, 540, r, 0, Math.PI * 2);
2028
- ctx.strokeStyle = 'rgba(77,166,255,' + state.glow + ')';
2029
- ctx.lineWidth = 4;
2030
- ctx.stroke();
2031
- })();
2032
-
2033
- var tl = gsap.timeline({ paused: true });
2034
- tl.to(state, { progress: 1, glow: 1, duration: 2, ease: 'power2.out' }, offset);
2035
- ```
2036
- > **Bundle p5.js locally** (same reason as Three.js — CDN may 404 at render time):
2037
- >
2038
- ```
2039
- ```bash
2040
- > Invoke-WebRequest -Uri "https://cdn.jsdelivr.net/npm/p5@1.9.0/lib/p5.min.js" -OutFile "p5.min.js"
2041
- >
2042
- ```
2043
- ```
2044
- ---
2045
- ```
2046
-
2047
- ### 16. `donut-chart`
2048
-
2049
- Multi-segment SVG donut chart. Each slice draws on sequentially. Best for part-of-whole data: market share, budget splits, survey results. Max 5 segments.
2050
-
2051
- **How it works:** Each segment is an SVG `<circle>` with `stroke-dasharray="0 1005"` (1005 ≈ circumference of r=160). GSAP animates `stroke-dasharray` to `"segment_px rest_px"`. Segments are offset using `stroke-dashoffset` to position them around the ring. Rotate the whole SVG −90° so segment 1 starts at 12 o'clock.
2052
-
2053
- ```html
2054
- <div class="scene-bg"></div>
2055
- <div class="scene-content" style="flex-direction:row;align-items:center;gap:80px;">
2056
-
2057
- <!-- Donut SVG (right side) -->
2058
- <div style="position:relative;flex-shrink:0;width:480px;height:480px;">
2059
- <svg width="480" height="480" viewBox="0 0 400 400"
2060
- style="transform:rotate(-90deg);display:block;">
2061
- <!-- Track -->
2062
- <circle cx="200" cy="200" r="160" fill="none" stroke="#1a1a1a" stroke-width="60"/>
2063
- <!-- Segment 1: e.g. 40% → 402px of 1005 circumference -->
2064
- <circle id="sN-seg1" cx="200" cy="200" r="160" fill="none"
2065
- stroke="#c0392b" stroke-width="60"
2066
- stroke-dasharray="0 1005" stroke-dashoffset="0"/>
2067
- <!-- Segment 2: 30% → 302px; offset = -(segment1_px) = -402 -->
2068
- <circle id="sN-seg2" cx="200" cy="200" r="160" fill="none"
2069
- stroke="#4da6ff" stroke-width="60"
2070
- stroke-dasharray="0 1005" stroke-dashoffset="-402"/>
2071
- <!-- Segment 3: 30% → 301px; offset = -(402+302) = -704 -->
2072
- <circle id="sN-seg3" cx="200" cy="200" r="160" fill="none"
2073
- stroke="#27ae60" stroke-width="60"
2074
- stroke-dasharray="0 1005" stroke-dashoffset="-704"/>
2075
- </svg>
2076
- <!-- Centre label -->
2077
- <div id="sN-clbl" style="position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);
2078
- font-family:Outfit,sans-serif;font-weight:900;font-size:72px;color:#e2e2e2;text-align:center;opacity:0;">
2079
- 100%
2080
- </div>
2081
- </div>
2082
-
2083
- <!-- Legend (left side) -->
2084
- <div style="flex:1;display:flex;flex-direction:column;gap:28px;">
2085
- <div id="sN-dhead" class="sub" style="font-size:52px;margin-bottom:8px;">Where it goes</div>
2086
- <div id="sN-ll1" style="display:flex;align-items:center;gap:20px;opacity:0;">
2087
- <div style="width:20px;height:20px;border-radius:4px;background:#c0392b;flex-shrink:0;"></div>
2088
- <span style="font-family:Outfit;font-weight:600;font-size:44px;color:#e2e2e2;">Category A</span>
2089
- <span style="font-family:Outfit;font-weight:900;font-size:44px;color:#c0392b;margin-left:auto;">40%</span>
2090
- </div>
2091
- <div id="sN-ll2" style="display:flex;align-items:center;gap:20px;opacity:0;">
2092
- <div style="width:20px;height:20px;border-radius:4px;background:#4da6ff;flex-shrink:0;"></div>
2093
- <span style="font-family:Outfit;font-weight:600;font-size:44px;color:#e2e2e2;">Category B</span>
2094
- <span style="font-family:Outfit;font-weight:900;font-size:44px;color:#4da6ff;margin-left:auto;">30%</span>
2095
- </div>
2096
- <div id="sN-ll3" style="display:flex;align-items:center;gap:20px;opacity:0;">
2097
- <div style="width:20px;height:20px;border-radius:4px;background:#27ae60;flex-shrink:0;"></div>
2098
- <span style="font-family:Outfit;font-weight:600;font-size:44px;color:#e2e2e2;">Category C</span>
2099
- <span style="font-family:Outfit;font-weight:900;font-size:44px;color:#27ae60;margin-left:auto;">30%</span>
2100
- </div>
2101
- </div>
2102
- </div>
2103
- ```js
2104
- // Circumference = 2π × 160 ≈ 1005
2105
- // Segment px = percentage * 1005 / 100
2106
- // Segment dashoffset = -(sum of all previous segment px values)
2107
- var C = 1005;
2108
- var segs = [
2109
- { id: '#sN-seg1', pct: 40 }, // 402px, offset 0
2110
- { id: '#sN-seg2', pct: 30 }, // 302px, offset -402
2111
- { id: '#sN-seg3', pct: 30 }, // 301px, offset -704
2112
- ];
2113
-
2114
- tl.from('#sN-dhead', { x:-40, opacity:0, duration:0.5, ease:'power2.out' }, offset + 0.1);
2115
-
2116
- segs.forEach(function(seg, i) {
2117
- var px = seg.pct * C / 100;
2118
- tl.to(seg.id, {
2119
- strokeDasharray: px + ' ' + (C - px),
2120
- duration: 0.7, ease: 'power2.out'
2121
- }, offset + 0.4 + i * 0.25);
2122
- tl.fromTo('#sN-ll' + (i+1), { opacity:0, x:30 }, { opacity:1, x:0, duration:0.4 }, offset + 0.9 + i * 0.25);
2123
- });
2124
-
2125
- tl.fromTo('#sN-clbl', { opacity:0, scale:0.6 }, { opacity:1, scale:1, duration:0.5, ease:'back.out(2)' }, offset + 1.4);
2126
- ```
2127
- **Segment colours per theme:**
2128
-
2129
- | Theme | Seg 1 | Seg 2 | Seg 3 |
2130
- |---|---|---|---|
2131
- | shadow-cut | `#c0392b` | `#e67e22` | `#8899aa` |
2132
- | blueprint | `#4da6ff` | `#27ae60` | `#c0392b` |
2133
- | neon-tokyo | `#00f5ff` | `#ff2d78` | `#a855f7` |
2134
- | velvet-standard | `#c9a84c` | `#8899aa` | `#555` |
2135
-
2136
- ---
2137
- ```
2138
-
2139
- ### 17. `line-chart`
2140
-
2141
- Animated SVG line chart — the polyline draws on from left to right. Best for trends over time, growth curves, before/after timelines. X-axis labels and data point dots pop in after the line draws.
2142
-
2143
- ```html
2144
- <div class="scene-bg"></div>
2145
- <div class="scene-content">
2146
- <div id="sN-lchead" class="sub" style="font-size:52px;margin-bottom:40px;">Growth over time</div>
2147
-
2148
- <div style="position:relative;width:100%;height:520px;">
2149
- <svg id="sN-svg" width="100%" height="520" viewBox="0 0 1580 520" preserveAspectRatio="none"
2150
- style="position:absolute;top:0;left:0;overflow:visible;">
2151
-
2152
- <!-- Grid lines (horizontal, faint) -->
2153
- <line x1="0" y1="130" x2="1580" y2="130" stroke="#1a1a1a" stroke-width="1"/>
2154
- <line x1="0" y1="260" x2="1580" y2="260" stroke="#1a1a1a" stroke-width="1"/>
2155
- <line x1="0" y1="390" x2="1580" y2="390" stroke="#1a1a1a" stroke-width="1"/>
2156
- <line x1="0" y1="520" x2="1580" y2="520" stroke="#333" stroke-width="2"/>
2157
-
2158
- <!-- Area fill under line (optional gradient) -->
2159
- <defs>
2160
- <linearGradient id="sN-grad" x1="0" y1="0" x2="0" y2="1">
2161
- <stop offset="0%" stop-color="#c0392b" stop-opacity="0.18"/>
2162
- <stop offset="100%" stop-color="#c0392b" stop-opacity="0"/>
2163
- </linearGradient>
2164
- </defs>
2165
- <!-- Fill polygon — same x/y as polyline but closes at bottom -->
2166
- <polygon id="sN-fill"
2167
- points="0,520 0,440 263,380 527,280 790,200 1053,140 1317,100 1580,60 1580,520"
2168
- fill="url(#sN-grad)" opacity="0"/>
2169
-
2170
- <!-- The data line — stroke-dasharray trick for draw-on -->
2171
- <!-- Measure total length: for 7 points across 1580px, ~2100 is a safe overestimate -->
2172
- <polyline id="sN-line"
2173
- points="0,440 263,380 527,280 790,200 1053,140 1317,100 1580,60"
2174
- fill="none" stroke="#c0392b" stroke-width="4"
2175
- stroke-dasharray="2100" stroke-dashoffset="2100"/>
2176
-
2177
- <!-- Data point dots — start hidden -->
2178
- <circle id="sN-p1" cx="0" cy="440" r="8" fill="#c0392b" opacity="0"/>
2179
- <circle id="sN-p2" cx="263" cy="380" r="8" fill="#c0392b" opacity="0"/>
2180
- <circle id="sN-p3" cx="527" cy="280" r="8" fill="#c0392b" opacity="0"/>
2181
- <circle id="sN-p4" cx="790" cy="200" r="8" fill="#c0392b" opacity="0"/>
2182
- <circle id="sN-p5" cx="1053" cy="140" r="8" fill="#c0392b" opacity="0"/>
2183
- <circle id="sN-p6" cx="1317" cy="100" r="8" fill="#c0392b" opacity="0"/>
2184
- <circle id="sN-p7" cx="1580" cy="60" r="8" fill="#c0392b" opacity="0"/>
2185
- </svg>
2186
-
2187
- <!-- X-axis labels (positioned under each data point) -->
2188
- <div style="position:absolute;bottom:-48px;left:0;right:0;display:flex;justify-content:space-between;">
2189
- <span id="sN-xl1" style="font-family:Outfit;font-size:32px;color:#8899aa;opacity:0;">Q1</span>
2190
- <span id="sN-xl2" style="font-family:Outfit;font-size:32px;color:#8899aa;opacity:0;">Q2</span>
2191
- <span id="sN-xl3" style="font-family:Outfit;font-size:32px;color:#8899aa;opacity:0;">Q3</span>
2192
- <span id="sN-xl4" style="font-family:Outfit;font-size:32px;color:#8899aa;opacity:0;">Q4</span>
2193
- <span id="sN-xl5" style="font-family:Outfit;font-size:32px;color:#8899aa;opacity:0;">Q5</span>
2194
- <span id="sN-xl6" style="font-family:Outfit;font-size:32px;color:#8899aa;opacity:0;">Q6</span>
2195
- <span id="sN-xl7" style="font-family:Outfit;font-size:32px;color:#8899aa;opacity:0;">Q7</span>
2196
- </div>
2197
- </div>
2198
- </div>
2199
- ```js
2200
- var LINE_DUR = 1.2; // time for line to fully draw
2201
-
2202
- tl.from('#sN-lchead', { x:-40, opacity:0, duration:0.5, ease:'power2.out' }, offset + 0.1);
2203
-
2204
- // Line draws on left→right
2205
- tl.to('#sN-line', { strokeDashoffset: 0, duration: LINE_DUR, ease: 'power2.inOut' }, offset + 0.4);
2206
-
2207
- // Area fill fades in as line draws
2208
- tl.to('#sN-fill', { opacity: 1, duration: LINE_DUR * 0.8, ease: 'power1.out' }, offset + 0.6);
2209
-
2210
- // Dots pop in staggered along the line draw timeline
2211
- var dotInterval = LINE_DUR / 7;
2212
- [1,2,3,4,5,6,7].forEach(function(i) {
2213
- var t = offset + 0.4 + dotInterval * (i - 1);
2214
- tl.fromTo('#sN-p' + i, { opacity:0, scale:0, transformOrigin: 'center' },
2215
- { opacity:1, scale:1, duration:0.2, ease:'back.out(3)' }, t);
2216
- tl.fromTo('#sN-xl' + i, { opacity:0 }, { opacity:1, duration:0.2 }, t + 0.05);
2217
- });
2218
- ```
2219
- **To adapt to your data:**
2220
- 1. Calculate each point's `cy` value: `cy = 520 - (value / maxValue) * 520` (SVG origin is top-left)
2221
- 2. Space `cx` values evenly: `cx = (index / (numPoints-1)) * 1580`
2222
- 3. Update `<polyline points="...">` and `<polygon points="0,520 [all cx/cy] [last_cx],520">` to match
2223
- 4. Set `stroke-dasharray` to a safe overestimate of the polyline length (use 1.2× the width as a rough estimate)
2224
-
2225
- ---
2226
- ```
2227
-
2228
- ### 18. `pexels-hero`
2229
-
2230
- Full-bleed Pexels image or looping video as the scene background, with a dark gradient scrim and text overlay. Cinematic and documentary in feel.
2231
-
2232
- **When to use:** Atmospheric, contextual, or emotional sentences that benefit from real-world imagery — product environments, people working, cityscapes, abstract tech visuals. Ideal for opening hooks, emotional peaks, or any sentence that would feel flat with a plain dark background.
2233
-
2234
- **Pre-requisite:** Run Step 3.6 (Pexels asset fetch) before writing index.html. Files land in `assets/pexels-sN.jpg` or `assets/pexels-sN.mp4`.
2235
-
2236
- #### Photo variant
2237
-
2238
- ```html
2239
- <div class="scene-bg"></div>
2240
-
2241
- <!-- Full-bleed photo -->
2242
- <img id="sN-img" src="assets/pexels-s3.jpg"
2243
- style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;opacity:0;">
2244
-
2245
- <!-- Dark gradient scrim — left side stays readable, right side bleeds to photo -->
2246
- <div style="position:absolute;inset:0;
2247
- background:linear-gradient(90deg,rgba(10,10,10,0.88) 38%,rgba(10,10,10,0.30) 100%);
2248
- pointer-events:none;"></div>
2249
-
2250
- <div class="scene-content" style="align-items:flex-start;max-width:900px;">
2251
- <div id="sN-eye" style="font-size:20px;font-weight:700;letter-spacing:6px;
2252
- color:#c0392b;text-transform:uppercase;opacity:0;">THE REALITY</div>
2253
- <h2 id="sN-hed" style="font-family:Outfit,sans-serif;font-weight:900;
2254
- font-size:96px;color:#e2e2e2;line-height:1.05;margin-top:16px;opacity:0;">
2255
- The sentence text goes here.
2256
- </h2>
2257
- </div>
2258
- ```js
2259
- // Photo fades in first, text follows
2260
- tl.to('#sN-img', { opacity:1, duration:0.9, ease:'power1.inOut' }, offset + 0.05);
2261
- tl.fromTo('#sN-eye', { opacity:0, y:-16 }, { opacity:1, y:0, duration:0.35, ease:'power2.out' }, offset + 0.55);
2262
- tl.fromTo('#sN-hed', { opacity:0, y:40 }, { opacity:1, y:0, duration:0.65, ease:'power3.out' }, offset + 0.75);
2263
- ```
2264
- #### Ken Burns effect (recommended for photos)
2265
-
2266
- Add subtle camera motion to photos to give them life. Apply to the `<img>` element via GSAP on the main timeline:
2267
- ```
2268
- ```js
2269
- // Scale up gently over the scene duration — transformOrigin varies per scene for variety
2270
- tl.fromTo('#sN-img', { scale:1.0 }, { scale:1.06, duration: sceneDur, ease:'none' }, offset);
2271
- // Optionally drift vertically for a tilt-down feel:
2272
- tl.fromTo('#sN-img', { scale:1.0, y:0 }, { scale:1.05, y:-18, duration: sceneDur, ease:'none' }, offset);
2273
- ```
2274
- Vary `transformOrigin` across scenes: `'center center'` (default) → `'right center'` → `'left bottom'`. This prevents adjacent scenes from feeling like the same motion.
2275
-
2276
- #### ✅ Video backgrounds work in rendered output — with the right pattern
2277
-
2278
- The earlier "autoplay" approach failed because the video element was placed inside a `.clip` div with no `data-track-index`. HyperFrames only manages videos it knows about.
2279
-
2280
- **The correct pattern (fully supported in render):**
2281
- - `<video>` gets `data-start`, `data-duration`, `data-track-index` attributes
2282
- - `<video>` sits in a **plain non-timed wrapper div** — NOT inside a `.clip` div
2283
- - No `autoplay` attribute — HyperFrames owns media playback
2284
- - Videos must be re-encoded with dense keyframes before composing (see Video variant section below)
2285
-
2286
- **The broken anti-pattern (avoid):**
2287
- ```
2288
- ```html
2289
- <!-- ❌ WRONG — autoplay + inside .clip + no data-track-index -->
2290
- <div id="s1" class="clip" data-start="0" data-duration="5" data-track-index="1">
2291
- <video autoplay muted playsinline loop src="..."></video>
2292
- </div>
2293
-
2294
- <!-- ✅ CORRECT — outside .clip, framework owns timing -->
2295
- <div style="position:absolute;inset:0;">
2296
- <video id="v1" data-start="0" data-duration="5" data-track-index="0" muted playsinline src="..."></video>
2297
- </div>
2298
- <div id="s1" class="clip" data-start="0" data-duration="5" data-track-index="1">
2299
- <!-- scrim + text only -->
2300
- </div>
2301
- ```
2302
- #### ⚠️ Do NOT manually control `.clip` display
2303
-
2304
- npx -y @autoaiai/aicut@latest open .
2305
-
2306
- **Never do this:**
2307
- ```
2308
- ```js
2309
- tl.set('#s2', { display: 'none' }, 0); // ← gsap_animates_clip_element lint error
2310
- ```
2311
- The lint rule `gsap_animates_clip_element` will catch this and fail. Trust `data-start`/`data-duration` to handle clip scheduling.
2312
-
2313
- #### Video variant — rendered output ✅
2314
-
2315
- > **This works in rendered output.** HyperFrames recognises `<video>` elements with `data-track-index` and seeks `video.currentTime` per frame during render (`videoCount` in compiled metadata will be > 0).
2316
-
2317
- **Two critical rules for video elements:**
2318
- 1. **NEVER nest `<video>` inside a `.clip` div** (a timed element). Use a plain non-timed wrapper `<div>`.
2319
- 2. **Re-encode videos with dense keyframes** before composing — raw Pexels downloads have sparse keyframes that cause freeze artifacts. First detect source FPS, then re-encode every video:
2320
- ```
2321
-
2322
- # Detect source FPS (round fraction to int → SRC_FPS)
2323
- ffprobe -v quiet -select_streams v:0 -show_entries stream=avg_frame_rate -of csv=p=0 pexels-vN.mp4
2324
-
2325
- ffmpeg -y -i pexels-vN.mp4 -c:v libx264 -r SRC_FPS -g SRC_FPS -keyint_min SRC_FPS -movflags +faststart -an pexels-vN-enc.mp4
2326
- ```
2327
- **Structure — one video per scene, each with its own timing:**
2328
- ```
2329
- ```html
2330
- <!--
2331
- VIDEO BACKGROUNDS — sit directly under the root composition, NOT inside .clip divs.
2332
- HyperFrames recognises data-track-index and seeks video.currentTime during render.
2333
- Wrap each <video> in a plain (non-timed) <div> for positioning only.
2334
- -->
2335
-
2336
- <!-- Scene 1 video: 0-5s -->
2337
- <div style="position:absolute;inset:0;pointer-events:none;">
2338
- <video id="v1" data-start="0" data-duration="5" data-track-index="0"
2339
- muted playsinline src="assets/pexels-v1.mp4"
2340
- style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;"></video>
2341
- </div>
2342
-
2343
- <!-- Scene 2 video: 5-10s -->
2344
- <div style="position:absolute;inset:0;pointer-events:none;">
2345
- <video id="v2" data-start="5" data-duration="5" data-track-index="0"
2346
- muted playsinline src="assets/pexels-v2.mp4"
2347
- style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;"></video>
2348
- </div>
2349
-
2350
- <!-- Scene 3 video: 10-15s -->
2351
- <div style="position:absolute;inset:0;pointer-events:none;">
2352
- <video id="v3" data-start="10" data-duration="5" data-track-index="0"
2353
- muted playsinline src="assets/pexels-v3.mp4"
2354
- style="position:absolute;inset:0;width:100%;height:100%;object-fit:cover;"></video>
2355
- </div>
2356
-
2357
- <!-- Scrim + text overlays go in .clip divs ABOVE the videos -->
2358
- <div id="s1" class="clip" data-start="0" data-duration="5" data-track-index="1">
2359
- <div style="position:absolute;inset:0;background:linear-gradient(90deg,rgba(5,5,5,0.92) 36%,rgba(5,5,5,0.08) 100%);"></div>
2360
- <div class="scene-content" style="align-items:flex-start;max-width:900px;">
2361
- <div id="s1-eye" style="font-size:20px;font-weight:700;letter-spacing:6px;color:#c0392b;text-transform:uppercase;opacity:0;">LABEL</div>
2362
- <h2 id="s1-hed" style="font-family:Outfit,sans-serif;font-weight:900;font-size:96px;color:#e2e2e2;line-height:1.05;opacity:0;">
2363
- The sentence text goes here.
2364
- </h2>
2365
- </div>
2366
- </div>
2367
- ```js
2368
- // No need to fade-in videos — HyperFrames shows them at data-start.
2369
- // Just animate the text overlays inside .clip divs:
2370
- tl.fromTo('#s1-eye', { opacity:0, y:-16 }, { opacity:1, y:0, duration:0.35, ease:'power2.out' }, offset + 0.6);
2371
- tl.fromTo('#s1-hed', { opacity:0, y:40 }, { opacity:1, y:0, duration:0.65, ease:'power3.out' }, offset + 0.8);
2372
- ```
2373
- **What happens in render:**
2374
- - HyperFrames extracts frames from each video via ffmpeg before capture (`videoCount:N` in metadata)
2375
- - It seeks each video to the correct time per captured frame
2376
- - Dense keyframes (GOP = SRC_FPS frames = keyframe every 1s at source FPS) are required for accurate seeking
2377
-
2378
- #### Scrim direction guide
2379
-
2380
- | Content position | Gradient direction |
2381
- |---|---|
2382
- | Text on left, photo bleeds right (default) | `90deg` — dark left, light right |
2383
- | Text on right, photo bleeds left | `270deg` — dark right, light left |
2384
- | Text at bottom, photo fills top | `0deg` (top→bottom) — transparent top, dark bottom |
2385
- | Text centered, full-frame glow | `radial-gradient(ellipse at 40% 50%, rgba(0,0,0,0.6) 0%, transparent 70%)` |
2386
-
2387
- #### Query writing tips
2388
-
2389
- | Content | Good query | Avoid |
2390
- |---|---|---|
2391
- | AI / tech | `"developer typing code dark monitor"` | `"AI"` (abstract) |
2392
- | Speed / performance | `"race car highway motion blur"` | `"fast"` |
2393
- | Collaboration | `"team meeting whiteboard office"` | `"people"` |
2394
- | Growth / scale | `"cityscape aerial drone night"` | `"growth"` |
2395
- | Precision / quality | `"watchmaker craft hands close"` | `"quality"` |
2396
-
2397
- > **Pexels API key** should come from the `PEXELS_API_KEY` environment variable — never hard-code it in this skill or embed it in `index.html`.
2398
- > **Attribution:** Add *"Media provided by Pexels (pexels.com)"* to your video description or project README.
2399
-
2400
- ---
2401
- ```
2402
-
2403
- ### 19. `presenter-aside`
2404
-
2405
- Webcam / talking-head video pushed to the right half of the canvas. Text (eyebrow + headline + subtitle) fills the left half. Inspired by tutorial-style YouTube content where the presenter is visible but the frame is also doing work.
2406
-
2407
- > **Pre-requisite:** You must have a local webcam recording (e.g. `assets/webcam.mp4`). Detect its FPS first (`ffprobe -v quiet -select_streams v:0 -show_entries stream=avg_frame_rate -of csv=p=0 webcam.mp4` — round fraction to int → SRC_FPS), then re-encode with dense keyframes: `ffmpeg -y -i webcam.mp4 -c:v libx264 -r SRC_FPS -g SRC_FPS -keyint_min SRC_FPS -movflags +faststart -an webcam-enc.mp4`
2408
-
2409
- **Critical layout rules (same as pexels video variant):**
2410
- - The `<video>` element sits in a **plain non-timed wrapper div** — NEVER inside a `.clip` div.
2411
- - The `.clip` div covers the full canvas (`position:absolute;inset:0`) and only contains the left-side text.
2412
- - A gradient scrim on the left edge of the video blends the two halves.
2413
- - **⚠️ If there is a title card or any scene before the presenter video starts, add `display:none` to the wrapper div and reveal it with `tl.set('#v-wrap', { display:'block' }, VIDEO_START_TIME)`. Without this, the video wrapper bleeds through earlier scenes.**
2414
-
2415
- ```html
2416
- <!--
2417
- PRESENTER VIDEO — right half, plain non-timed wrapper.
2418
- id="v-wrap" starts hidden (display:none) to prevent bleed during any earlier scenes.
2419
- Revealed at VIDEO_START_TIME via tl.set() in the GSAP timeline.
2420
- No autoplay. No clip class.
2421
- -->
2422
- <div id="v-wrap" style="position:absolute;top:0;right:0;width:55%;height:100%;pointer-events:none;overflow:hidden;display:none;">
2423
- <video id="vN" data-start="SCENE_START" data-duration="SCENE_DUR" data-track-index="0"
2424
- muted playsinline src="assets/webcam-enc.mp4"
2425
- style="width:100%;height:100%;object-fit:cover;object-position:center top;"></video>
2426
- <!-- Left-edge scrim blends presenter into text area -->
2427
- <div style="position:absolute;inset:0;
2428
- background:linear-gradient(90deg,rgba(10,10,10,1) 0%,rgba(10,10,10,0.6) 20%,transparent 45%);"></div>
2429
- </div>
2430
-
2431
- <!-- Full-canvas clip — text content on the left side only -->
2432
- <div id="sN" class="clip" data-start="SCENE_START" data-duration="SCENE_DUR" data-track-index="1">
2433
- <div class="scene-content" style="align-items:flex-start;max-width:860px;">
2434
- <div id="sN-eye" style="font-size:22px;font-weight:700;letter-spacing:6px;
2435
- color:#c0392b;text-transform:uppercase;opacity:0;">INPUT</div>
2436
- <h2 id="sN-hed" style="font-family:Outfit,sans-serif;font-weight:900;font-size:100px;
2437
- color:#e2e2e2;line-height:1.05;margin:0;opacity:0;">
2438
- Natural<br>language.
2439
- </h2>
2440
- <p id="sN-sub" style="font-size:44px;font-weight:400;color:#8899aa;margin:0;opacity:0;">
2441
- Describe it. Claude builds it.
2442
- </p>
2443
- </div>
2444
- </div>
2445
- ```js
2446
- // offset = scene startTime (VIDEO_START_TIME = same value)
2447
- // MUST reveal the video wrapper at the same time the presenter scene starts:
2448
- tl.set('#v-wrap', { display:'block' }, offset);
2449
- tl.fromTo('#sN-eye', { opacity:0, y:-20 }, { opacity:1, y:0, duration:0.3, ease:'power2.out' }, offset + 0.3);
2450
- tl.fromTo('#sN-hed', { opacity:0, y:50 }, { opacity:1, y:0, duration:0.65, ease:'power3.out' }, offset + 0.55);
2451
- tl.fromTo('#sN-sub', { opacity:0, y:30 }, { opacity:1, y:0, duration:0.4, ease:'power2.out' }, offset + 1.0);
2452
- ```
2453
- **Layout variants:**
2454
-
2455
- | Presenter position | Video wrapper | Scrim direction | Text max-width |
2456
- |---|---|---|---|
2457
- | Right (default) | `right:0; width:55%` | `90deg` dark-left | `max-width:860px` |
2458
- | Left | `left:0; width:55%` | `270deg` dark-right | align `flex-end`, `max-width:860px` pushed right |
2459
- | Right, smaller (more text room) | `right:0; width:40%` | `90deg` dark-left | `max-width:1050px` |
2460
-
2461
- ---
2462
- ```
2463
-
2464
- ### 20. `hud-overlay`
2465
-
2466
- Floating glassmorphism UI cards overlaid on a **background video** — mimics a live dashboard or editor HUD. Typically two cards: a **terminal/code card** (upper-left) and a **stat card** (upper-right). Optionally a central text block at the bottom. Great for "tool in action" or "what this does under the hood" sentences.
2467
-
2468
- > **⚠️ CRITICAL — Background video is required.** HUD cards floating on a plain dark background look like a flat slide, not an overlay. Always add a real background video. Use the same `display:none` / `tl.set` reveal pattern as `presenter-aside`.
2469
-
2470
- > **⚠️ CRITICAL — `tl.fromTo()` required for elements without inline `opacity:0`.** If you remove `opacity:0` from element inline styles (recommended), you MUST use `tl.fromTo('#el', { opacity:0 }, { opacity:1 })`. Using `tl.from('#el', { opacity:0 })` on an element that already has no inline opacity will animate 0→current (which is 1), so it works. But if an element has inline `opacity:0` and you use `tl.from()`, GSAP targets the inline value and animates 0→0 — the element stays invisible. **Rule: use `fromTo` whenever you specify an explicit destination.**
2471
-
2472
- > **⚠️ CRITICAL — Mini bars must start at `height:0%` in HTML.** GSAP cannot animate `height` from 0 to X if the element already has `height:30%` in its inline style. Set all bar heights to `height:0%` in HTML and animate to target with GSAP.
2473
-
2474
- **Card anatomy:**
2475
- - Dark semi-transparent background (`rgba(10,10,18,0.90)`)
2476
- - Subtle border (`rgba(255,255,255,0.13)`)
2477
- - `backdrop-filter:blur(12px)` for glass effect
2478
- - Mono font for code lines; `#4da6ff` for command arrows; `#27ae60` green for "ok"
2479
-
2480
- ```html
2481
- <!-- ── BACKGROUND VIDEO (hidden until hud scene starts) ── -->
2482
- <!-- Place OUTSIDE all .clip divs, before scene divs -->
2483
- <div id="sN-vwrap" style="position:absolute;inset:0;display:none;z-index:0;">
2484
- <video id="sN-bgvid" data-start="SCENE_START" data-duration="SCENE_DUR"
2485
- data-track-index="0" muted playsinline
2486
- style="width:100%;height:100%;object-fit:cover;"
2487
- src="assets/bg.mp4"></video>
2488
- <!-- Dark overlay — keeps cards readable over video -->
2489
- <div style="position:absolute;inset:0;background:rgba(8,8,16,0.55);"></div>
2490
- </div>
2491
-
2492
- <!-- ── HUD SCENE (no background div — video shows through) ── -->
2493
- <div id="sN" class="clip" data-start="SCENE_START" data-duration="SCENE_DUR" data-track-index="1">
2494
-
2495
- <!-- ── LEFT HUD CARD: terminal / code ── -->
2496
- <div id="sN-left" style="position:absolute;top:80px;left:100px;width:520px;
2497
- background:rgba(10,10,18,0.90);border:1px solid rgba(255,255,255,0.13);border-radius:14px;
2498
- padding:28px 32px;backdrop-filter:blur(12px);">
2499
- <!-- Title bar with traffic light dots -->
2500
- <div style="display:flex;align-items:center;gap:10px;margin-bottom:18px;
2501
- padding-bottom:14px;border-bottom:1px solid rgba(255,255,255,0.08);">
2502
- <div style="width:10px;height:10px;border-radius:50%;background:#c0392b;"></div>
2503
- <div style="width:10px;height:10px;border-radius:50%;background:#f39c12;"></div>
2504
- <div style="width:10px;height:10px;border-radius:50%;background:#27ae60;"></div>
2505
- <div style="font-family:'JetBrains Mono',monospace;font-size:15px;color:#4da6ff;
2506
- font-weight:700;margin-left:8px;">editing.loop()</div>
2507
- </div>
2508
- <!-- Code lines (each individually animated) -->
2509
- <div style="display:flex;flex-direction:column;gap:12px;">
2510
- <div id="sN-l1" style="font-family:'JetBrains Mono',monospace;font-size:15px;color:#8899aa;
2511
- display:flex;justify-content:space-between;">
2512
- <span><span style="color:#4da6ff;">▸</span> analyze_clip <span style="color:#e2e2e2;">"intro.mp4"</span></span>
2513
- <span style="color:#27ae60;font-size:12px;">ok</span>
2514
- </div>
2515
- <div id="sN-l2" style="font-family:'JetBrains Mono',monospace;font-size:15px;color:#8899aa;
2516
- display:flex;justify-content:space-between;">
2517
- <span><span style="color:#4da6ff;">▸</span> sync_captions <span style="color:#e2e2e2;">114 words</span></span>
2518
- <span style="color:#27ae60;font-size:12px;">ok</span>
2519
- </div>
2520
- <div id="sN-l3" style="font-family:'JetBrains Mono',monospace;font-size:15px;color:#8899aa;
2521
- display:flex;justify-content:space-between;">
2522
- <span><span style="color:#4da6ff;">▸</span> add_motion_gfx <span style="color:#e2e2e2;">5 scenes</span></span>
2523
- <span style="color:#27ae60;font-size:12px;">ok</span>
2524
- </div>
2525
- <div id="sN-l4" style="font-family:'JetBrains Mono',monospace;font-size:15px;color:#e2e2e2;
2526
- display:flex;justify-content:space-between;">
2527
- <span><span style="color:#4da6ff;">▸</span> render_frame <span style="color:#e2e2e2;">1920×1080</span></span>
2528
- <span id="sN-cursor" style="color:#4da6ff;font-size:13px;">▌</span>
2529
- </div>
2530
- </div>
2531
- </div>
2532
-
2533
- <!-- ── RIGHT HUD CARD: stat + animated bar chart ── -->
2534
- <div id="sN-right" style="position:absolute;top:80px;right:100px;width:440px;
2535
- background:rgba(10,10,18,0.90);border:1px solid rgba(255,255,255,0.13);border-radius:14px;
2536
- padding:32px 36px;backdrop-filter:blur(12px);">
2537
- <div style="font-family:Outfit,sans-serif;font-size:16px;font-weight:700;letter-spacing:4px;
2538
- color:#8899aa;text-transform:uppercase;margin-bottom:8px;">monthly creator views</div>
2539
- <div id="sN-stat" style="font-family:Outfit,sans-serif;font-weight:900;font-size:88px;
2540
- color:#e2e2e2;line-height:1;margin-bottom:4px;">+0%</div>
2541
- <!-- Mini bar chart — all bars START at height:0% (GSAP animates them up) -->
2542
- <div style="display:flex;align-items:flex-end;gap:10px;height:80px;margin-top:20px;">
2543
- <div id="sN-b1" style="flex:1;background:#c0392b;opacity:0.4;border-radius:3px 3px 0 0;height:0%;"></div>
2544
- <div id="sN-b2" style="flex:1;background:#c0392b;opacity:0.5;border-radius:3px 3px 0 0;height:0%;"></div>
2545
- <div id="sN-b3" style="flex:1;background:#c0392b;opacity:0.6;border-radius:3px 3px 0 0;height:0%;"></div>
2546
- <div id="sN-b4" style="flex:1;background:#c0392b;opacity:0.75;border-radius:3px 3px 0 0;height:0%;"></div>
2547
- <div id="sN-b5" style="flex:1;background:#c0392b;border-radius:3px 3px 0 0;height:0%;"></div>
2548
- </div>
2549
- <!-- Trend arrow — starts opacity:0 to hide polygon -->
2550
- <svg id="sN-trend" width="100%" height="30" viewBox="0 0 360 30"
2551
- style="margin-top:8px;opacity:0;" preserveAspectRatio="none">
2552
- <polyline points="0,28 80,22 160,16 240,10 320,4"
2553
- fill="none" stroke="#c0392b" stroke-width="2"
2554
- stroke-dasharray="400" stroke-dashoffset="400"/>
2555
- <polygon points="315,0 330,8 315,16" fill="#c0392b"/>
2556
- </svg>
2557
- </div>
2558
-
2559
- <!-- ── OPTIONAL: Central sentence text ── -->
2560
- <div class="scene-content" style="align-items:center;text-align:center;
2561
- justify-content:flex-end;padding-bottom:100px;">
2562
- <div id="sN-hed" style="font-family:Outfit,sans-serif;font-weight:900;font-size:76px;
2563
- color:#e2e2e2;max-width:1200px;line-height:1.2;">
2564
- The sentence text goes here.
2565
- </div>
2566
- <div id="sN-sub" style="font-family:Outfit,sans-serif;font-weight:400;font-size:40px;
2567
- color:#8899aa;">Supporting detail line.</div>
2568
- </div>
2569
-
2570
- </div>
2571
- ```js
2572
- // offset = scene startTime (same value as SCENE_START above)
2573
-
2574
- // Reveal background video at scene start
2575
- tl.set('#sN-vwrap', { display:'block' }, offset);
2576
-
2577
- // Cards drop in from above (use fromTo — explicit opacity:1 destination)
2578
- tl.fromTo('#sN-left', { opacity:0, y:-30 }, { opacity:1, y:0, duration:0.55, ease:'expo.out' }, offset + 0.2);
2579
- tl.fromTo('#sN-right', { opacity:0, y:-30 }, { opacity:1, y:0, duration:0.55, ease:'expo.out' }, offset + 0.4);
2580
-
2581
- // Code lines appear one by one (typewriter feel)
2582
- tl.fromTo('#sN-l1', { opacity:0 }, { opacity:1, duration:0.2 }, offset + 0.7);
2583
- tl.fromTo('#sN-l2', { opacity:0 }, { opacity:1, duration:0.2 }, offset + 1.2);
2584
- tl.fromTo('#sN-l3', { opacity:0 }, { opacity:1, duration:0.2 }, offset + 1.7);
2585
- tl.fromTo('#sN-l4', { opacity:0 }, { opacity:1, duration:0.2 }, offset + 2.2);
2586
-
2587
- // Blinking cursor after last line (finite repeat — calculate from remaining scene time)
2588
- tl.to('#sN-cursor', { opacity:0, duration:0.35, repeat:8, yoyo:true, ease:'none' }, offset + 2.4);
2589
-
2590
- // Stat number counts up
2591
- var statObj = { val: 0 };
2592
- tl.to(statObj, {
2593
- val: 248, duration: 1.0, ease: 'power2.out',
2594
- onUpdate: function() {
2595
- var el = document.getElementById('sN-stat');
2596
- if (el) el.textContent = '+' + Math.round(statObj.val) + '%';
2597
- }
2598
- }, offset + 0.6);
2599
-
2600
- // Mini bars grow from 0% (height:0% already set in HTML)
2601
- var barTargets = ['30%','45%','58%','75%','100%'];
2602
- ['sN-b1','sN-b2','sN-b3','sN-b4','sN-b5'].forEach(function(id, i) {
2603
- tl.to('#' + id, { height: barTargets[i], duration:0.4, ease:'power2.out' }, offset + 0.6 + i * 0.08);
2604
- });
2605
-
2606
- // Trend arrow draws in
2607
- tl.set('#sN-trend', { opacity:1 }, offset + 1.2);
2608
- tl.to('#sN-trend polyline', { strokeDashoffset:0, duration:0.7, ease:'power2.out' }, offset + 1.2);
2609
-
2610
- // Central text fades in last
2611
- tl.fromTo('#sN-hed', { opacity:0, y:30 }, { opacity:1, y:0, duration:0.5, ease:'power2.out' }, offset + 3.0);
2612
- tl.fromTo('#sN-sub', { opacity:0, y:20 }, { opacity:1, y:0, duration:0.4, ease:'power2.out' }, offset + 3.5);
2613
- ```
2614
- **Customisation notes:**
2615
- - **Background video** — detect source FPS first (`ffprobe -v quiet -select_streams v:0 -show_entries stream=avg_frame_rate -of csv=p=0 in.mp4`), then re-encode: `ffmpeg -y -i in.mp4 -c:v libx264 -r SRC_FPS -g SRC_FPS -keyint_min SRC_FPS -movflags +faststart -an assets/bg.mp4`
2616
- - **Left card** — swap `editing.loop()` for any process name. Add/remove `<div id="sN-lN">` lines to match scene duration.
2617
- - **Right card** — change stat number, eyebrow label, and `barTargets` array to match actual data.
2618
- - **Trend arrow** — starts `opacity:0` to hide polygon (same rule as `flow-steps` arrows).
2619
- - **Overlay darkness** — adjust `rgba(8,8,16,0.55)` on the dark overlay div. Higher alpha = darker = more readable cards.
2620
-
2621
- **Reference:** `C:\openclaw_files\projects\hud-overlay-sample\index.html`
2622
- ```
2623
-
2624
- ## Source
2625
-
2626
- Rewritten for AICUT from [`pjecuacion/script-to-video-skill`](https://github.com/pjecuacion/script-to-video-skill)
2627
- (MIT), SKILL.md. The method is that skill's own; the way it runs is AICUT's.