@amg555/frameforge-mcp 2.7.3 → 2.7.7

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 (565) hide show
  1. package/.claude-plugin/marketplace.json +3 -3
  2. package/AGENTS.md +33 -0
  3. package/CHANGELOG.md +49 -0
  4. package/CLAUDE.md +17 -6
  5. package/GEMINI.md +63 -0
  6. package/README.md +216 -426
  7. package/START_HERE.md +4 -2
  8. package/package.json +5 -3
  9. package/plugins/ai-video-editor/README.md +32 -0
  10. package/plugins/ai-video-editor/SKILL.md +152 -0
  11. package/plugins/ai-video-editor/assets/fonts/fonts.css +2409 -0
  12. package/plugins/ai-video-editor/assets/fonts/ttf/anton-400.ttf +0 -0
  13. package/plugins/ai-video-editor/assets/fonts/ttf/archivo-800.ttf +0 -0
  14. package/plugins/ai-video-editor/assets/fonts/ttf/cabin-sketch-700.ttf +0 -0
  15. package/plugins/ai-video-editor/assets/fonts/ttf/dm-sans-700.ttf +0 -0
  16. package/plugins/ai-video-editor/assets/fonts/ttf/fraunces-600.ttf +0 -0
  17. package/plugins/ai-video-editor/assets/fonts/ttf/fraunces-700.ttf +0 -0
  18. package/plugins/ai-video-editor/assets/fonts/ttf/fredoka-700.ttf +0 -0
  19. package/plugins/ai-video-editor/assets/fonts/ttf/inter-700.ttf +0 -0
  20. package/plugins/ai-video-editor/assets/fonts/ttf/inter-800.ttf +0 -0
  21. package/plugins/ai-video-editor/assets/fonts/ttf/inter-tight-800.ttf +0 -0
  22. package/plugins/ai-video-editor/assets/fonts/ttf/kalam-700.ttf +0 -0
  23. package/plugins/ai-video-editor/assets/fonts/ttf/noto-sans-devanagari-700.ttf +0 -0
  24. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-400-normal.woff2 +0 -0
  25. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-500-normal.woff2 +0 -0
  26. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-600-normal.woff2 +0 -0
  27. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-700-normal.woff2 +0 -0
  28. package/plugins/ai-video-editor/assets/fonts/web/noto-sans-devanagari-devanagari-800-normal.woff2 +0 -0
  29. package/plugins/ai-video-editor/engine/hidpi.js +117 -0
  30. package/plugins/ai-video-editor/engine/page.html +43 -0
  31. package/plugins/ai-video-editor/engine/player.js +145 -0
  32. package/plugins/ai-video-editor/references/example-story-warm-canvas.js +95 -0
  33. package/plugins/ai-video-editor/references/story-guide.md +112 -0
  34. package/plugins/ai-video-editor/requirements.txt +4 -0
  35. package/plugins/ai-video-editor/styles/chalk-talk/base.js +490 -0
  36. package/plugins/ai-video-editor/styles/chalk-talk/style.json +14 -0
  37. package/plugins/ai-video-editor/styles/chalk-talk/style.md +41 -0
  38. package/plugins/ai-video-editor/styles/clean-tech/base.js +447 -0
  39. package/plugins/ai-video-editor/styles/clean-tech/style.json +15 -0
  40. package/plugins/ai-video-editor/styles/clean-tech/style.md +38 -0
  41. package/plugins/ai-video-editor/styles/creator-motion-graphics/base.js +698 -0
  42. package/plugins/ai-video-editor/styles/creator-motion-graphics/style.json +16 -0
  43. package/plugins/ai-video-editor/styles/creator-motion-graphics/style.md +39 -0
  44. package/plugins/ai-video-editor/styles/data-story/base.js +432 -0
  45. package/plugins/ai-video-editor/styles/data-story/style.json +14 -0
  46. package/plugins/ai-video-editor/styles/data-story/style.md +38 -0
  47. package/plugins/ai-video-editor/styles/index.json +103 -0
  48. package/plugins/ai-video-editor/styles/pop-info/base.js +570 -0
  49. package/plugins/ai-video-editor/styles/pop-info/style.json +13 -0
  50. package/plugins/ai-video-editor/styles/pop-info/style.md +37 -0
  51. package/plugins/ai-video-editor/styles/software-walkthrough/base.js +544 -0
  52. package/plugins/ai-video-editor/styles/software-walkthrough/style.json +15 -0
  53. package/plugins/ai-video-editor/styles/software-walkthrough/style.md +38 -0
  54. package/plugins/ai-video-editor/styles/warm-canvas/base.js +610 -0
  55. package/plugins/ai-video-editor/styles/warm-canvas/style.json +14 -0
  56. package/plugins/ai-video-editor/styles/warm-canvas/style.md +37 -0
  57. package/plugins/aiinsight-shorts/CHANGELOG.md +6 -0
  58. package/plugins/aiinsight-shorts/README.md +43 -0
  59. package/plugins/aiinsight-shorts/SKILL.md +138 -0
  60. package/plugins/aiinsight-shorts/styles/deep-dive/STYLE.md +58 -0
  61. package/plugins/aiinsight-shorts/styles/deep-dive/example/data/cues.json +140 -0
  62. package/plugins/aiinsight-shorts/styles/deep-dive/example/data/lines.json +67 -0
  63. package/plugins/aiinsight-shorts/styles/deep-dive/example/data/words.json +614 -0
  64. package/plugins/aiinsight-shorts/styles/deep-dive/example/data/words.txt +102 -0
  65. package/plugins/aiinsight-shorts/styles/deep-dive/example/fonts/Inter-Black.otf +0 -0
  66. package/plugins/aiinsight-shorts/styles/deep-dive/example/fonts/Inter-ExtraBold.otf +0 -0
  67. package/plugins/aiinsight-shorts/styles/deep-dive/example/index.html +17 -0
  68. package/plugins/aiinsight-shorts/styles/deep-dive/example/script.json +27 -0
  69. package/plugins/aiinsight-shorts/styles/deep-dive/example/sheet.html +11 -0
  70. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/board.js +62 -0
  71. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/captions.js +68 -0
  72. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/engine.js +65 -0
  73. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/human.js +128 -0
  74. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/lib.js +44 -0
  75. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/look2d.js +33 -0
  76. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/sdf.js +79 -0
  77. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/sets.js +107 -0
  78. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/core/timing.js +23 -0
  79. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/main.js +56 -0
  80. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/sheet.js +79 -0
  81. package/plugins/aiinsight-shorts/styles/deep-dive/example/src/shots.js +136 -0
  82. package/plugins/aiinsight-shorts/styles/deep-dive/example/tools/capture.mjs +122 -0
  83. package/plugins/aiinsight-shorts/styles/deep-dive/example/tools/mix.py +172 -0
  84. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/LICENSE-three.txt +21 -0
  85. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  86. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  87. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  88. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  89. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  90. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/Pass.js +95 -0
  91. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  92. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  93. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  94. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/BokehShader.js +145 -0
  95. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/CopyShader.js +45 -0
  96. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  97. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/addons/shaders/OutputShader.js +85 -0
  98. package/plugins/aiinsight-shorts/styles/deep-dive/example/vendor/three.module.js +6 -0
  99. package/plugins/aiinsight-shorts/styles/deep-dive/style-sheet.png +0 -0
  100. package/plugins/aiinsight-shorts/styles/inside-out/STYLE.md +97 -0
  101. package/plugins/aiinsight-shorts/styles/inside-out/example/data/cues.json +178 -0
  102. package/plugins/aiinsight-shorts/styles/inside-out/example/data/lines.json +73 -0
  103. package/plugins/aiinsight-shorts/styles/inside-out/example/data/words.json +662 -0
  104. package/plugins/aiinsight-shorts/styles/inside-out/example/fonts/Inter-Black.otf +0 -0
  105. package/plugins/aiinsight-shorts/styles/inside-out/example/index.html +17 -0
  106. package/plugins/aiinsight-shorts/styles/inside-out/example/script.json +26 -0
  107. package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/captions.js +68 -0
  108. package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/kit.js +345 -0
  109. package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/lib.js +44 -0
  110. package/plugins/aiinsight-shorts/styles/inside-out/example/src/core/timing.js +23 -0
  111. package/plugins/aiinsight-shorts/styles/inside-out/example/src/main.js +62 -0
  112. package/plugins/aiinsight-shorts/styles/inside-out/example/src/shots.js +195 -0
  113. package/plugins/aiinsight-shorts/styles/inside-out/example/tools/capture.mjs +122 -0
  114. package/plugins/aiinsight-shorts/styles/inside-out/example/tools/mix.py +172 -0
  115. package/plugins/aiinsight-shorts/styles/inside-out/style-sheet.png +0 -0
  116. package/plugins/aiinsight-shorts/styles/night-file/STYLE.md +36 -0
  117. package/plugins/aiinsight-shorts/styles/night-file/example/data/cues.json +146 -0
  118. package/plugins/aiinsight-shorts/styles/night-file/example/data/lines.json +73 -0
  119. package/plugins/aiinsight-shorts/styles/night-file/example/data/words.json +572 -0
  120. package/plugins/aiinsight-shorts/styles/night-file/example/data/words.txt +95 -0
  121. package/plugins/aiinsight-shorts/styles/night-file/example/fonts/FreeMonoBold.ttf +0 -0
  122. package/plugins/aiinsight-shorts/styles/night-file/example/fonts/Inter-Black.otf +0 -0
  123. package/plugins/aiinsight-shorts/styles/night-file/example/index.html +18 -0
  124. package/plugins/aiinsight-shorts/styles/night-file/example/script.json +26 -0
  125. package/plugins/aiinsight-shorts/styles/night-file/example/sheet.html +13 -0
  126. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/board.js +62 -0
  127. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/captions.js +49 -0
  128. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/engine.js +65 -0
  129. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/human.js +128 -0
  130. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/kit.js +151 -0
  131. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/lib.js +44 -0
  132. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/sdf.js +79 -0
  133. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/sets3d.js +106 -0
  134. package/plugins/aiinsight-shorts/styles/night-file/example/src/core/timing.js +23 -0
  135. package/plugins/aiinsight-shorts/styles/night-file/example/src/main.js +56 -0
  136. package/plugins/aiinsight-shorts/styles/night-file/example/src/sheet.js +86 -0
  137. package/plugins/aiinsight-shorts/styles/night-file/example/src/shots.js +130 -0
  138. package/plugins/aiinsight-shorts/styles/night-file/example/tools/capture.mjs +122 -0
  139. package/plugins/aiinsight-shorts/styles/night-file/example/tools/mix.py +172 -0
  140. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/LICENSE-three.txt +21 -0
  141. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  142. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  143. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  144. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  145. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  146. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/Pass.js +95 -0
  147. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  148. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  149. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  150. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/BokehShader.js +145 -0
  151. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/CopyShader.js +45 -0
  152. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  153. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/addons/shaders/OutputShader.js +85 -0
  154. package/plugins/aiinsight-shorts/styles/night-file/example/vendor/three.module.js +6 -0
  155. package/plugins/aiinsight-shorts/styles/night-file/style-sheet.png +0 -0
  156. package/plugins/aiinsight-shorts/styles/paper-atlas/STYLE.md +30 -0
  157. package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/cues.json +167 -0
  158. package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/lines.json +67 -0
  159. package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/words.json +614 -0
  160. package/plugins/aiinsight-shorts/styles/paper-atlas/example/data/words.txt +102 -0
  161. package/plugins/aiinsight-shorts/styles/paper-atlas/example/fonts/Caladea-Bold.ttf +0 -0
  162. package/plugins/aiinsight-shorts/styles/paper-atlas/example/fonts/Inter-Black.otf +0 -0
  163. package/plugins/aiinsight-shorts/styles/paper-atlas/example/index.html +15 -0
  164. package/plugins/aiinsight-shorts/styles/paper-atlas/example/script.json +26 -0
  165. package/plugins/aiinsight-shorts/styles/paper-atlas/example/sheet.html +12 -0
  166. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/board.js +62 -0
  167. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/captions.js +47 -0
  168. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/kit.js +152 -0
  169. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/lib.js +44 -0
  170. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/core/timing.js +23 -0
  171. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/main.js +62 -0
  172. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/sheet.js +61 -0
  173. package/plugins/aiinsight-shorts/styles/paper-atlas/example/src/shots.js +139 -0
  174. package/plugins/aiinsight-shorts/styles/paper-atlas/example/tools/capture.mjs +122 -0
  175. package/plugins/aiinsight-shorts/styles/paper-atlas/example/tools/mix.py +172 -0
  176. package/plugins/aiinsight-shorts/styles/paper-atlas/style-sheet.png +0 -0
  177. package/plugins/aiinsight-shorts/styles/stick-story/STYLE.md +32 -0
  178. package/plugins/aiinsight-shorts/styles/stick-story/example/data/cues.json +182 -0
  179. package/plugins/aiinsight-shorts/styles/stick-story/example/data/lines.json +79 -0
  180. package/plugins/aiinsight-shorts/styles/stick-story/example/data/words.json +662 -0
  181. package/plugins/aiinsight-shorts/styles/stick-story/example/data/words.txt +110 -0
  182. package/plugins/aiinsight-shorts/styles/stick-story/example/fonts/Inter-Black.otf +0 -0
  183. package/plugins/aiinsight-shorts/styles/stick-story/example/fonts/Inter-ExtraBold.otf +0 -0
  184. package/plugins/aiinsight-shorts/styles/stick-story/example/index.html +13 -0
  185. package/plugins/aiinsight-shorts/styles/stick-story/example/script.json +27 -0
  186. package/plugins/aiinsight-shorts/styles/stick-story/example/sheet.html +10 -0
  187. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/board.js +62 -0
  188. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/captions.js +47 -0
  189. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/kit.js +166 -0
  190. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/lib.js +44 -0
  191. package/plugins/aiinsight-shorts/styles/stick-story/example/src/core/timing.js +23 -0
  192. package/plugins/aiinsight-shorts/styles/stick-story/example/src/main.js +62 -0
  193. package/plugins/aiinsight-shorts/styles/stick-story/example/src/sheet.js +64 -0
  194. package/plugins/aiinsight-shorts/styles/stick-story/example/src/shots.js +148 -0
  195. package/plugins/aiinsight-shorts/styles/stick-story/example/tools/capture.mjs +122 -0
  196. package/plugins/aiinsight-shorts/styles/stick-story/example/tools/mix.py +172 -0
  197. package/plugins/aiinsight-shorts/styles/stick-story/style-sheet.png +0 -0
  198. package/plugins/aiinsight-shorts/styles/tall-tale/STYLE.md +51 -0
  199. package/plugins/aiinsight-shorts/styles/tall-tale/example/data/cues.json +271 -0
  200. package/plugins/aiinsight-shorts/styles/tall-tale/example/data/lines.json +127 -0
  201. package/plugins/aiinsight-shorts/styles/tall-tale/example/data/words.json +908 -0
  202. package/plugins/aiinsight-shorts/styles/tall-tale/example/data/words.txt +151 -0
  203. package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Caladea-Bold.ttf +0 -0
  204. package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Inter-Black.otf +0 -0
  205. package/plugins/aiinsight-shorts/styles/tall-tale/example/fonts/Inter-ExtraBold.otf +0 -0
  206. package/plugins/aiinsight-shorts/styles/tall-tale/example/index.html +19 -0
  207. package/plugins/aiinsight-shorts/styles/tall-tale/example/script.json +37 -0
  208. package/plugins/aiinsight-shorts/styles/tall-tale/example/sheet.html +13 -0
  209. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/board.js +62 -0
  210. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/captions.js +56 -0
  211. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/engine.js +65 -0
  212. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/lib.js +44 -0
  213. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/props.js +166 -0
  214. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/timing.js +23 -0
  215. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/toon.js +352 -0
  216. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/core/world.js +340 -0
  217. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/main.js +56 -0
  218. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/sheet.js +99 -0
  219. package/plugins/aiinsight-shorts/styles/tall-tale/example/src/shots.js +377 -0
  220. package/plugins/aiinsight-shorts/styles/tall-tale/example/tools/capture.mjs +122 -0
  221. package/plugins/aiinsight-shorts/styles/tall-tale/example/tools/mix.py +204 -0
  222. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/LICENSE-three.txt +21 -0
  223. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  224. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  225. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  226. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  227. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  228. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/Pass.js +95 -0
  229. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  230. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  231. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  232. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/BokehShader.js +145 -0
  233. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/CopyShader.js +45 -0
  234. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  235. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/addons/shaders/OutputShader.js +85 -0
  236. package/plugins/aiinsight-shorts/styles/tall-tale/example/vendor/three.module.js +6 -0
  237. package/plugins/aiinsight-shorts/styles/tall-tale/style-sheet.png +0 -0
  238. package/plugins/faceless-shorts/README.md +34 -0
  239. package/plugins/faceless-shorts/SKILL.md +124 -0
  240. package/plugins/faceless-shorts/styles/deep-dive/STYLE.md +58 -0
  241. package/plugins/faceless-shorts/styles/deep-dive/example/data/cues.json +140 -0
  242. package/plugins/faceless-shorts/styles/deep-dive/example/data/lines.json +67 -0
  243. package/plugins/faceless-shorts/styles/deep-dive/example/data/words.json +614 -0
  244. package/plugins/faceless-shorts/styles/deep-dive/example/data/words.txt +102 -0
  245. package/plugins/faceless-shorts/styles/deep-dive/example/fonts/Inter-Black.otf +0 -0
  246. package/plugins/faceless-shorts/styles/deep-dive/example/fonts/Inter-ExtraBold.otf +0 -0
  247. package/plugins/faceless-shorts/styles/deep-dive/example/index.html +16 -0
  248. package/plugins/faceless-shorts/styles/deep-dive/example/script.json +27 -0
  249. package/plugins/faceless-shorts/styles/deep-dive/example/sheet.html +10 -0
  250. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/board.js +62 -0
  251. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/captions.js +68 -0
  252. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/engine.js +65 -0
  253. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/human.js +128 -0
  254. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/lib.js +44 -0
  255. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/look2d.js +33 -0
  256. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/sdf.js +79 -0
  257. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/sets.js +107 -0
  258. package/plugins/faceless-shorts/styles/deep-dive/example/src/core/timing.js +23 -0
  259. package/plugins/faceless-shorts/styles/deep-dive/example/src/main.js +56 -0
  260. package/plugins/faceless-shorts/styles/deep-dive/example/src/sheet.js +79 -0
  261. package/plugins/faceless-shorts/styles/deep-dive/example/src/shots.js +136 -0
  262. package/plugins/faceless-shorts/styles/deep-dive/example/tools/capture.mjs +122 -0
  263. package/plugins/faceless-shorts/styles/deep-dive/example/tools/mix.py +172 -0
  264. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/LICENSE-three.txt +21 -0
  265. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  266. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  267. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  268. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  269. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  270. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/Pass.js +95 -0
  271. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  272. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  273. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  274. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/BokehShader.js +145 -0
  275. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/CopyShader.js +45 -0
  276. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  277. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/addons/shaders/OutputShader.js +85 -0
  278. package/plugins/faceless-shorts/styles/deep-dive/example/vendor/three.module.js +6 -0
  279. package/plugins/faceless-shorts/styles/deep-dive/style-sheet.png +0 -0
  280. package/plugins/faceless-shorts/styles/inside-out/STYLE.md +97 -0
  281. package/plugins/faceless-shorts/styles/inside-out/example/data/cues.json +178 -0
  282. package/plugins/faceless-shorts/styles/inside-out/example/data/lines.json +73 -0
  283. package/plugins/faceless-shorts/styles/inside-out/example/data/words.json +662 -0
  284. package/plugins/faceless-shorts/styles/inside-out/example/fonts/Inter-Black.otf +0 -0
  285. package/plugins/faceless-shorts/styles/inside-out/example/index.html +16 -0
  286. package/plugins/faceless-shorts/styles/inside-out/example/script.json +26 -0
  287. package/plugins/faceless-shorts/styles/inside-out/example/src/core/captions.js +68 -0
  288. package/plugins/faceless-shorts/styles/inside-out/example/src/core/kit.js +345 -0
  289. package/plugins/faceless-shorts/styles/inside-out/example/src/core/lib.js +44 -0
  290. package/plugins/faceless-shorts/styles/inside-out/example/src/core/timing.js +23 -0
  291. package/plugins/faceless-shorts/styles/inside-out/example/src/main.js +62 -0
  292. package/plugins/faceless-shorts/styles/inside-out/example/src/shots.js +195 -0
  293. package/plugins/faceless-shorts/styles/inside-out/example/tools/capture.mjs +122 -0
  294. package/plugins/faceless-shorts/styles/inside-out/example/tools/mix.py +172 -0
  295. package/plugins/faceless-shorts/styles/inside-out/style-sheet.png +0 -0
  296. package/plugins/faceless-shorts/styles/night-file/STYLE.md +36 -0
  297. package/plugins/faceless-shorts/styles/night-file/example/data/cues.json +146 -0
  298. package/plugins/faceless-shorts/styles/night-file/example/data/lines.json +73 -0
  299. package/plugins/faceless-shorts/styles/night-file/example/data/words.json +572 -0
  300. package/plugins/faceless-shorts/styles/night-file/example/data/words.txt +95 -0
  301. package/plugins/faceless-shorts/styles/night-file/example/fonts/FreeMonoBold.ttf +0 -0
  302. package/plugins/faceless-shorts/styles/night-file/example/fonts/Inter-Black.otf +0 -0
  303. package/plugins/faceless-shorts/styles/night-file/example/index.html +16 -0
  304. package/plugins/faceless-shorts/styles/night-file/example/script.json +26 -0
  305. package/plugins/faceless-shorts/styles/night-file/example/sheet.html +11 -0
  306. package/plugins/faceless-shorts/styles/night-file/example/src/core/board.js +62 -0
  307. package/plugins/faceless-shorts/styles/night-file/example/src/core/captions.js +49 -0
  308. package/plugins/faceless-shorts/styles/night-file/example/src/core/engine.js +65 -0
  309. package/plugins/faceless-shorts/styles/night-file/example/src/core/human.js +128 -0
  310. package/plugins/faceless-shorts/styles/night-file/example/src/core/kit.js +151 -0
  311. package/plugins/faceless-shorts/styles/night-file/example/src/core/lib.js +44 -0
  312. package/plugins/faceless-shorts/styles/night-file/example/src/core/sdf.js +79 -0
  313. package/plugins/faceless-shorts/styles/night-file/example/src/core/sets3d.js +106 -0
  314. package/plugins/faceless-shorts/styles/night-file/example/src/core/timing.js +23 -0
  315. package/plugins/faceless-shorts/styles/night-file/example/src/main.js +56 -0
  316. package/plugins/faceless-shorts/styles/night-file/example/src/sheet.js +86 -0
  317. package/plugins/faceless-shorts/styles/night-file/example/src/shots.js +130 -0
  318. package/plugins/faceless-shorts/styles/night-file/example/tools/capture.mjs +122 -0
  319. package/plugins/faceless-shorts/styles/night-file/example/tools/mix.py +172 -0
  320. package/plugins/faceless-shorts/styles/night-file/example/vendor/LICENSE-three.txt +21 -0
  321. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  322. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  323. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  324. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  325. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  326. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/Pass.js +95 -0
  327. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  328. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  329. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  330. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/BokehShader.js +145 -0
  331. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/CopyShader.js +45 -0
  332. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  333. package/plugins/faceless-shorts/styles/night-file/example/vendor/addons/shaders/OutputShader.js +85 -0
  334. package/plugins/faceless-shorts/styles/night-file/example/vendor/three.module.js +6 -0
  335. package/plugins/faceless-shorts/styles/night-file/style-sheet.png +0 -0
  336. package/plugins/faceless-shorts/styles/paper-atlas/STYLE.md +30 -0
  337. package/plugins/faceless-shorts/styles/paper-atlas/example/data/cues.json +167 -0
  338. package/plugins/faceless-shorts/styles/paper-atlas/example/data/lines.json +67 -0
  339. package/plugins/faceless-shorts/styles/paper-atlas/example/data/words.json +614 -0
  340. package/plugins/faceless-shorts/styles/paper-atlas/example/data/words.txt +102 -0
  341. package/plugins/faceless-shorts/styles/paper-atlas/example/fonts/Caladea-Bold.ttf +0 -0
  342. package/plugins/faceless-shorts/styles/paper-atlas/example/fonts/Inter-Black.otf +0 -0
  343. package/plugins/faceless-shorts/styles/paper-atlas/example/index.html +13 -0
  344. package/plugins/faceless-shorts/styles/paper-atlas/example/script.json +26 -0
  345. package/plugins/faceless-shorts/styles/paper-atlas/example/sheet.html +10 -0
  346. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/board.js +62 -0
  347. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/captions.js +47 -0
  348. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/kit.js +152 -0
  349. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/lib.js +44 -0
  350. package/plugins/faceless-shorts/styles/paper-atlas/example/src/core/timing.js +23 -0
  351. package/plugins/faceless-shorts/styles/paper-atlas/example/src/main.js +62 -0
  352. package/plugins/faceless-shorts/styles/paper-atlas/example/src/sheet.js +61 -0
  353. package/plugins/faceless-shorts/styles/paper-atlas/example/src/shots.js +139 -0
  354. package/plugins/faceless-shorts/styles/paper-atlas/example/tools/capture.mjs +122 -0
  355. package/plugins/faceless-shorts/styles/paper-atlas/example/tools/mix.py +172 -0
  356. package/plugins/faceless-shorts/styles/paper-atlas/style-sheet.png +0 -0
  357. package/plugins/faceless-shorts/styles/stick-story/STYLE.md +32 -0
  358. package/plugins/faceless-shorts/styles/stick-story/example/data/cues.json +182 -0
  359. package/plugins/faceless-shorts/styles/stick-story/example/data/lines.json +79 -0
  360. package/plugins/faceless-shorts/styles/stick-story/example/data/words.json +662 -0
  361. package/plugins/faceless-shorts/styles/stick-story/example/data/words.txt +110 -0
  362. package/plugins/faceless-shorts/styles/stick-story/example/fonts/Inter-Black.otf +0 -0
  363. package/plugins/faceless-shorts/styles/stick-story/example/fonts/Inter-ExtraBold.otf +0 -0
  364. package/plugins/faceless-shorts/styles/stick-story/example/index.html +12 -0
  365. package/plugins/faceless-shorts/styles/stick-story/example/script.json +27 -0
  366. package/plugins/faceless-shorts/styles/stick-story/example/sheet.html +9 -0
  367. package/plugins/faceless-shorts/styles/stick-story/example/src/core/board.js +62 -0
  368. package/plugins/faceless-shorts/styles/stick-story/example/src/core/captions.js +47 -0
  369. package/plugins/faceless-shorts/styles/stick-story/example/src/core/kit.js +166 -0
  370. package/plugins/faceless-shorts/styles/stick-story/example/src/core/lib.js +44 -0
  371. package/plugins/faceless-shorts/styles/stick-story/example/src/core/timing.js +23 -0
  372. package/plugins/faceless-shorts/styles/stick-story/example/src/main.js +62 -0
  373. package/plugins/faceless-shorts/styles/stick-story/example/src/sheet.js +64 -0
  374. package/plugins/faceless-shorts/styles/stick-story/example/src/shots.js +148 -0
  375. package/plugins/faceless-shorts/styles/stick-story/example/tools/capture.mjs +122 -0
  376. package/plugins/faceless-shorts/styles/stick-story/example/tools/mix.py +172 -0
  377. package/plugins/faceless-shorts/styles/stick-story/style-sheet.png +0 -0
  378. package/plugins/faceless-shorts/styles/tall-tale/STYLE.md +51 -0
  379. package/plugins/faceless-shorts/styles/tall-tale/example/data/cues.json +271 -0
  380. package/plugins/faceless-shorts/styles/tall-tale/example/data/lines.json +127 -0
  381. package/plugins/faceless-shorts/styles/tall-tale/example/data/words.json +908 -0
  382. package/plugins/faceless-shorts/styles/tall-tale/example/data/words.txt +151 -0
  383. package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Caladea-Bold.ttf +0 -0
  384. package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Inter-Black.otf +0 -0
  385. package/plugins/faceless-shorts/styles/tall-tale/example/fonts/Inter-ExtraBold.otf +0 -0
  386. package/plugins/faceless-shorts/styles/tall-tale/example/index.html +17 -0
  387. package/plugins/faceless-shorts/styles/tall-tale/example/script.json +37 -0
  388. package/plugins/faceless-shorts/styles/tall-tale/example/sheet.html +11 -0
  389. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/board.js +62 -0
  390. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/captions.js +56 -0
  391. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/engine.js +65 -0
  392. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/lib.js +44 -0
  393. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/props.js +166 -0
  394. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/timing.js +23 -0
  395. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/toon.js +352 -0
  396. package/plugins/faceless-shorts/styles/tall-tale/example/src/core/world.js +340 -0
  397. package/plugins/faceless-shorts/styles/tall-tale/example/src/main.js +56 -0
  398. package/plugins/faceless-shorts/styles/tall-tale/example/src/sheet.js +99 -0
  399. package/plugins/faceless-shorts/styles/tall-tale/example/src/shots.js +377 -0
  400. package/plugins/faceless-shorts/styles/tall-tale/example/tools/capture.mjs +122 -0
  401. package/plugins/faceless-shorts/styles/tall-tale/example/tools/mix.py +204 -0
  402. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/LICENSE-three.txt +21 -0
  403. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/environments/RoomEnvironment.js +144 -0
  404. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/BokehPass.js +141 -0
  405. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/EffectComposer.js +231 -0
  406. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/MaskPass.js +104 -0
  407. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/OutputPass.js +97 -0
  408. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/Pass.js +95 -0
  409. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/RenderPass.js +99 -0
  410. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/ShaderPass.js +77 -0
  411. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/postprocessing/UnrealBloomPass.js +415 -0
  412. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/BokehShader.js +145 -0
  413. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/CopyShader.js +45 -0
  414. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/LuminosityHighPassShader.js +64 -0
  415. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/addons/shaders/OutputShader.js +85 -0
  416. package/plugins/faceless-shorts/styles/tall-tale/example/vendor/three.module.js +6 -0
  417. package/plugins/faceless-shorts/styles/tall-tale/style-sheet.png +0 -0
  418. package/plugins/motion-styles/LIBRARY.md +896 -0
  419. package/plugins/motion-styles/README.md +29 -0
  420. package/plugins/motion-styles/SKILL.md +70 -0
  421. package/plugins/motion-styles/catalog.json +2253 -0
  422. package/plugins/motion-styles/prompts/bio-glow.md +149 -0
  423. package/plugins/motion-styles/prompts/blueprint.md +145 -0
  424. package/plugins/motion-styles/prompts/breaking-desk.md +147 -0
  425. package/plugins/motion-styles/prompts/callout-kit.md +147 -0
  426. package/plugins/motion-styles/prompts/chalk-talk.md +153 -0
  427. package/plugins/motion-styles/prompts/chat-story.md +143 -0
  428. package/plugins/motion-styles/prompts/clay-diorama.md +149 -0
  429. package/plugins/motion-styles/prompts/clean-tech.md +147 -0
  430. package/plugins/motion-styles/prompts/comic-panels.md +145 -0
  431. package/plugins/motion-styles/prompts/cosmic-scale.md +147 -0
  432. package/plugins/motion-styles/prompts/creator-motion.md +149 -0
  433. package/plugins/motion-styles/prompts/data-city.md +149 -0
  434. package/plugins/motion-styles/prompts/data-story.md +147 -0
  435. package/plugins/motion-styles/prompts/deep-layers.md +147 -0
  436. package/plugins/motion-styles/prompts/doc-cinema.md +145 -0
  437. package/plugins/motion-styles/prompts/evidence-board.md +145 -0
  438. package/plugins/motion-styles/prompts/exploded-view.md +149 -0
  439. package/plugins/motion-styles/prompts/glass-icons.md +147 -0
  440. package/plugins/motion-styles/prompts/glitch-pack.md +145 -0
  441. package/plugins/motion-styles/prompts/globe-arcs.md +147 -0
  442. package/plugins/motion-styles/prompts/headline-backdrop.md +145 -0
  443. package/plugins/motion-styles/prompts/iso-cutaway.md +147 -0
  444. package/plugins/motion-styles/prompts/isotype.md +145 -0
  445. package/plugins/motion-styles/prompts/karaoke-subs.md +145 -0
  446. package/plugins/motion-styles/prompts/low-poly-atlas.md +149 -0
  447. package/plugins/motion-styles/prompts/lower-thirds.md +147 -0
  448. package/plugins/motion-styles/prompts/marker-board.md +145 -0
  449. package/plugins/motion-styles/prompts/market-tape.md +145 -0
  450. package/plugins/motion-styles/prompts/math-canvas.md +145 -0
  451. package/plugins/motion-styles/prompts/myth-or-fact.md +145 -0
  452. package/plugins/motion-styles/prompts/neon-line.md +145 -0
  453. package/plugins/motion-styles/prompts/paper-craft.md +145 -0
  454. package/plugins/motion-styles/prompts/parchment-map.md +147 -0
  455. package/plugins/motion-styles/prompts/physics-toybox.md +147 -0
  456. package/plugins/motion-styles/prompts/pixel-quest.md +145 -0
  457. package/plugins/motion-styles/prompts/podcast-clip.md +147 -0
  458. package/plugins/motion-styles/prompts/pop-info.md +145 -0
  459. package/plugins/motion-styles/prompts/product-turntable.md +149 -0
  460. package/plugins/motion-styles/prompts/punch-captions.md +145 -0
  461. package/plugins/motion-styles/prompts/quiz-countdown.md +145 -0
  462. package/plugins/motion-styles/prompts/quote-cinema.md +145 -0
  463. package/plugins/motion-styles/prompts/recipe-steps.md +145 -0
  464. package/plugins/motion-styles/prompts/rubber-hose-reel.md +145 -0
  465. package/plugins/motion-styles/prompts/shadow-puppets.md +145 -0
  466. package/plugins/motion-styles/prompts/size-lineup.md +149 -0
  467. package/plugins/motion-styles/prompts/software-walkthrough.md +147 -0
  468. package/plugins/motion-styles/prompts/stack-split.md +145 -0
  469. package/plugins/motion-styles/prompts/sticker-pop.md +145 -0
  470. package/plugins/motion-styles/prompts/storybook.md +145 -0
  471. package/plugins/motion-styles/prompts/swiss-grid.md +145 -0
  472. package/plugins/motion-styles/prompts/synth-grid.md +147 -0
  473. package/plugins/motion-styles/prompts/tactics-board.md +145 -0
  474. package/plugins/motion-styles/prompts/terminal.md +145 -0
  475. package/plugins/motion-styles/prompts/tier-list.md +143 -0
  476. package/plugins/motion-styles/prompts/timeline-rail.md +145 -0
  477. package/plugins/motion-styles/prompts/top-5-countdown.md +145 -0
  478. package/plugins/motion-styles/prompts/versus-split.md +145 -0
  479. package/plugins/motion-styles/prompts/vhs-camcorder.md +145 -0
  480. package/plugins/motion-styles/prompts/visual-novel.md +145 -0
  481. package/plugins/motion-styles/prompts/warm-canvas.md +145 -0
  482. package/plugins/motion-styles/prompts/woodcut-tale.md +145 -0
  483. package/plugins/motion-styles/prompts/zine-collage.md +145 -0
  484. package/plugins/motion-styles/sources/bio-glow.html +639 -0
  485. package/plugins/motion-styles/sources/blueprint.html +617 -0
  486. package/plugins/motion-styles/sources/breaking-desk.html +585 -0
  487. package/plugins/motion-styles/sources/callout-kit.html +586 -0
  488. package/plugins/motion-styles/sources/chalk-talk.html +597 -0
  489. package/plugins/motion-styles/sources/chat-story.html +597 -0
  490. package/plugins/motion-styles/sources/clay-diorama.html +681 -0
  491. package/plugins/motion-styles/sources/clean-tech.html +554 -0
  492. package/plugins/motion-styles/sources/comic-panels.html +608 -0
  493. package/plugins/motion-styles/sources/cosmic-scale.html +628 -0
  494. package/plugins/motion-styles/sources/creator-motion.html +805 -0
  495. package/plugins/motion-styles/sources/data-city.html +613 -0
  496. package/plugins/motion-styles/sources/data-story.html +539 -0
  497. package/plugins/motion-styles/sources/deep-layers.html +624 -0
  498. package/plugins/motion-styles/sources/doc-cinema.html +590 -0
  499. package/plugins/motion-styles/sources/evidence-board.html +610 -0
  500. package/plugins/motion-styles/sources/exploded-view.html +618 -0
  501. package/plugins/motion-styles/sources/glass-icons.html +612 -0
  502. package/plugins/motion-styles/sources/glitch-pack.html +583 -0
  503. package/plugins/motion-styles/sources/globe-arcs.html +621 -0
  504. package/plugins/motion-styles/sources/headline-backdrop.html +584 -0
  505. package/plugins/motion-styles/sources/iso-cutaway.html +621 -0
  506. package/plugins/motion-styles/sources/isotype.html +588 -0
  507. package/plugins/motion-styles/sources/karaoke-subs.html +577 -0
  508. package/plugins/motion-styles/sources/low-poly-atlas.html +621 -0
  509. package/plugins/motion-styles/sources/lower-thirds.html +582 -0
  510. package/plugins/motion-styles/sources/marker-board.html +598 -0
  511. package/plugins/motion-styles/sources/market-tape.html +598 -0
  512. package/plugins/motion-styles/sources/math-canvas.html +592 -0
  513. package/plugins/motion-styles/sources/myth-or-fact.html +587 -0
  514. package/plugins/motion-styles/sources/neon-line.html +597 -0
  515. package/plugins/motion-styles/sources/paper-craft.html +612 -0
  516. package/plugins/motion-styles/sources/parchment-map.html +624 -0
  517. package/plugins/motion-styles/sources/physics-toybox.html +617 -0
  518. package/plugins/motion-styles/sources/pixel-quest.html +609 -0
  519. package/plugins/motion-styles/sources/podcast-clip.html +585 -0
  520. package/plugins/motion-styles/sources/pop-info.html +677 -0
  521. package/plugins/motion-styles/sources/product-turntable.html +611 -0
  522. package/plugins/motion-styles/sources/punch-captions.html +583 -0
  523. package/plugins/motion-styles/sources/quiz-countdown.html +593 -0
  524. package/plugins/motion-styles/sources/quote-cinema.html +581 -0
  525. package/plugins/motion-styles/sources/recipe-steps.html +599 -0
  526. package/plugins/motion-styles/sources/rubber-hose-reel.html +627 -0
  527. package/plugins/motion-styles/sources/shadow-puppets.html +609 -0
  528. package/plugins/motion-styles/sources/size-lineup.html +620 -0
  529. package/plugins/motion-styles/sources/software-walkthrough.html +651 -0
  530. package/plugins/motion-styles/sources/stack-split.html +588 -0
  531. package/plugins/motion-styles/sources/sticker-pop.html +587 -0
  532. package/plugins/motion-styles/sources/storybook.html +600 -0
  533. package/plugins/motion-styles/sources/swiss-grid.html +590 -0
  534. package/plugins/motion-styles/sources/synth-grid.html +614 -0
  535. package/plugins/motion-styles/sources/tactics-board.html +608 -0
  536. package/plugins/motion-styles/sources/terminal.html +593 -0
  537. package/plugins/motion-styles/sources/tier-list.html +600 -0
  538. package/plugins/motion-styles/sources/timeline-rail.html +598 -0
  539. package/plugins/motion-styles/sources/top-5-countdown.html +589 -0
  540. package/plugins/motion-styles/sources/versus-split.html +592 -0
  541. package/plugins/motion-styles/sources/vhs-camcorder.html +587 -0
  542. package/plugins/motion-styles/sources/visual-novel.html +623 -0
  543. package/plugins/motion-styles/sources/warm-canvas.html +742 -0
  544. package/plugins/motion-styles/sources/woodcut-tale.html +598 -0
  545. package/plugins/motion-styles/sources/zine-collage.html +594 -0
  546. package/plugins/video-pipeline/.claude-plugin/plugin.json +2 -2
  547. package/plugins/video-pipeline/skills/.upstream-skills.json +156 -143
  548. package/plugins/video-pipeline/skills/video-pipeline/references/mcp-tools.md +3 -3
  549. package/scripts/deep-validate.js +3 -2
  550. package/src/audio-mixer/mixer.js +69 -0
  551. package/src/cli/make.js +19 -0
  552. package/src/harness/lib/browser.mjs +22 -1
  553. package/src/harness/lib/capture.mjs +33 -11
  554. package/src/harness/lib/jobs.mjs +16 -1
  555. package/src/mcp-server/server.js +726 -10
  556. package/src/pipeline/providers.js +77 -17
  557. package/src/skills/sync-upstream.js +15 -3
  558. package/src/utils/media-downloader.js +7 -0
  559. package/src/utils/tool-installer.js +212 -0
  560. package/src/utils/transcribe.js +9 -1
  561. package/src/video-renderer/renderer.js +68 -38
  562. package/src/video-renderer/scene-animator.js +50 -15
  563. package/src/workflows/assets.js +49 -5
  564. package/src/workflows/render.js +2 -0
  565. package/src/workflows/script.js +14 -3
@@ -0,0 +1,117 @@
1
+ // HiDPI shim for the style engines.
2
+ // Every style draws in a fixed 1280x720 design space. When window.__RENDER.scale (S) is above 1, this file
3
+ // makes every canvas S times bigger internally while the style code still sees 1280x720: canvas sizes,
4
+ // transforms, drawImage of other canvases, patterns, shadows, blur filters and putImageData are all
5
+ // translated. Result: sharp 1080p (S = 1.5) or 4K (S = 3) frames with no change to the style code.
6
+ (function () {
7
+ const S = (window.__RENDER && window.__RENDER.scale) || 1;
8
+ if (S === 1) return;
9
+ const CP = HTMLCanvasElement.prototype;
10
+ const X = CanvasRenderingContext2D.prototype;
11
+ const wD = Object.getOwnPropertyDescriptor(CP, 'width');
12
+ const hD = Object.getOwnPropertyDescriptor(CP, 'height');
13
+ const LOG = new WeakMap(); // canvas -> { w, h } logical size
14
+
15
+ function init(c) {
16
+ let o = LOG.get(c);
17
+ if (o) return o;
18
+ o = { w: wD.get.call(c), h: hD.get.call(c) };
19
+ LOG.set(c, o);
20
+ wD.set.call(c, Math.round(o.w * S));
21
+ hD.set.call(c, Math.round(o.h * S));
22
+ return o;
23
+ }
24
+ const baseT = (ctx) => setT.call(ctx, S, 0, 0, S, 0, 0);
25
+
26
+ Object.defineProperty(CP, 'width', {
27
+ configurable: true, enumerable: true,
28
+ get() { return init(this).w; },
29
+ set(v) { const o = init(this); o.w = +v; wD.set.call(this, Math.round(o.w * S)); const x = CTX.get(this); if (x) baseT(x); },
30
+ });
31
+ Object.defineProperty(CP, 'height', {
32
+ configurable: true, enumerable: true,
33
+ get() { return init(this).h; },
34
+ set(v) { const o = init(this); o.h = +v; hD.set.call(this, Math.round(o.h * S)); const x = CTX.get(this); if (x) baseT(x); },
35
+ });
36
+
37
+ const CTX = new WeakMap();
38
+ const getCtx = CP.getContext;
39
+ CP.getContext = function (type, opts) {
40
+ init(this);
41
+ const x = getCtx.call(this, type, opts);
42
+ if (type === '2d' && x && !CTX.has(this)) { CTX.set(this, x); baseT(x); }
43
+ return x;
44
+ };
45
+
46
+ const setT = X.setTransform;
47
+ X.setTransform = function (a, b, c, d, e, f) {
48
+ if (typeof a === 'object' && a !== null) { const m = a; return setT.call(this, (m.a ?? m.m11) * S, (m.b ?? m.m12) * S, (m.c ?? m.m21) * S, (m.d ?? m.m22) * S, (m.e ?? m.m41) * S, (m.f ?? m.m42) * S); }
49
+ if (a === undefined) return baseT(this);
50
+ return setT.call(this, a * S, b * S, c * S, d * S, e * S, f * S);
51
+ };
52
+ X.resetTransform = function () { return baseT(this); };
53
+ const getT = X.getTransform;
54
+ X.getTransform = function () { const m = getT.call(this); return new DOMMatrix([m.a / S, m.b / S, m.c / S, m.d / S, m.e / S, m.f / S]); };
55
+
56
+ const scaled = (src) => src instanceof HTMLCanvasElement && LOG.has(src);
57
+ const draw = X.drawImage;
58
+ X.drawImage = function (src, ...a) {
59
+ if (scaled(src)) {
60
+ const o = LOG.get(src);
61
+ if (a.length === 2) return draw.call(this, src, a[0], a[1], o.w, o.h);
62
+ if (a.length === 8) return draw.call(this, src, a[0] * S, a[1] * S, a[2] * S, a[3] * S, a[4], a[5], a[6], a[7]);
63
+ }
64
+ return draw.call(this, src, ...a);
65
+ };
66
+
67
+ const cpat = X.createPattern;
68
+ const PT = CanvasPattern.prototype, pset = PT.setTransform, SCALED_PAT = new WeakSet();
69
+ X.createPattern = function (src, rep) {
70
+ const p = cpat.call(this, src, rep);
71
+ if (p && scaled(src)) { SCALED_PAT.add(p); pset.call(p, new DOMMatrix().scaleSelf(1 / S, 1 / S)); }
72
+ return p;
73
+ };
74
+ PT.setTransform = function (m) {
75
+ if (!SCALED_PAT.has(this)) return pset.call(this, m);
76
+ const M = DOMMatrix.fromMatrix(m || new DOMMatrix()).scaleSelf(1 / S, 1 / S);
77
+ return pset.call(this, M);
78
+ };
79
+
80
+ // putImageData ignores the transform: draw the pixels through a temporary canvas instead
81
+ const put = X.putImageData;
82
+ X.putImageData = function (img, dx, dy, ...rest) {
83
+ if (!CTX.has(this.canvas)) return put.call(this, img, dx, dy, ...rest);
84
+ const t = document.createElement('canvas'); LOG.set(t, { w: img.width, h: img.height });
85
+ wD.set.call(t, img.width); hD.set.call(t, img.height); put.call(getCtx.call(t, '2d'), img, 0, 0);
86
+ this.save(); setT.call(this, 1, 0, 0, 1, 0, 0); this.globalAlpha = 1; this.globalCompositeOperation = 'source-over'; this.filter = 'none';
87
+ this.clearRect(dx * S, dy * S, img.width * S, img.height * S);
88
+ draw.call(this, t, 0, 0, img.width, img.height, dx * S, dy * S, img.width * S, img.height * S);
89
+ this.restore();
90
+ };
91
+ const gid = X.getImageData;
92
+ X.getImageData = function (x, y, w, h, o) {
93
+ if (!CTX.has(this.canvas)) return gid.call(this, x, y, w, h, o);
94
+ // sample the scaled backing store down to logical pixels
95
+ const t = document.createElement('canvas'); wD.set.call(t, w); hD.set.call(t, h);
96
+ const tc = getCtx.call(t, '2d'); draw.call(tc, this.canvas, x * S, y * S, w * S, h * S, 0, 0, w, h);
97
+ return gid.call(tc, 0, 0, w, h, o);
98
+ };
99
+
100
+ // shadows and filters live in device pixels, so scale them too
101
+ for (const k of ['shadowBlur', 'shadowOffsetX', 'shadowOffsetY']) {
102
+ const d = Object.getOwnPropertyDescriptor(X, k);
103
+ Object.defineProperty(X, k, { configurable: true, enumerable: true, get() { return d.get.call(this) / S; }, set(v) { d.set.call(this, v * S); } });
104
+ }
105
+ const fD = Object.getOwnPropertyDescriptor(X, 'filter');
106
+ if (fD) {
107
+ const FL = new WeakMap();
108
+ Object.defineProperty(X, 'filter', {
109
+ configurable: true, enumerable: true,
110
+ get() { return FL.has(this) ? FL.get(this) : fD.get.call(this); },
111
+ set(v) { FL.set(this, v); fD.set.call(this, String(v).replace(/(-?\d*\.?\d+)px/g, (m, n) => (parseFloat(n) * S) + 'px')); },
112
+ });
113
+ const sv = X.save, rs = X.restore, STK = new WeakMap();
114
+ X.save = function () { (STK.get(this) || STK.set(this, []).get(this)).push(FL.get(this)); return sv.call(this); };
115
+ X.restore = function () { const s = STK.get(this); if (s && s.length) { const v = s.pop(); if (v === undefined) FL.delete(this); else FL.set(this, v); } return rs.call(this); };
116
+ }
117
+ })();
@@ -0,0 +1,43 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="utf-8">
5
+ <meta name="viewport" content="width=device-width,initial-scale=1">
6
+ <title>{{TITLE}}</title>
7
+ <link rel="stylesheet" href="{{SKILL}}/assets/fonts/fonts.css">
8
+ <style>
9
+ :root { color-scheme: dark; --bg: #0b0b0d; --panel: #141417; --ink: #f2f0ea; --dim: #8d8c93; --line: #26262c; --acc: #7aa7ff; }
10
+ html, body { margin: 0; background: var(--bg); color: var(--ink); font: 14px "Inter", system-ui, sans-serif; }
11
+ .wrap { max-width: 1180px; margin: 0 auto; padding: 20px 16px 28px; display: grid; gap: 12px; }
12
+ h1 { font-size: 20px; margin: 0; font-weight: 700; }
13
+ .meta { color: var(--dim); margin: 0; }
14
+ .stage { position: relative; width: 100%; aspect-ratio: 16 / 9; background: #000; border-radius: 10px; overflow: hidden; border: 1px solid var(--line); }
15
+ .stage canvas { position: absolute; inset: 0; width: 100%; height: 100%; display: block; }
16
+ .bar { display: flex; flex-wrap: wrap; align-items: center; gap: 10px 12px; background: var(--panel); border: 1px solid var(--line); border-radius: 10px; padding: 10px 12px; }
17
+ .bar button { font: 600 14px inherit; font-family: inherit; color: var(--ink); background: transparent; border: 1px solid var(--line); border-radius: 7px; padding: 8px 12px; cursor: pointer; }
18
+ #play { min-width: 82px; background: var(--ink); color: #0b0b0d; border-color: var(--ink); }
19
+ .track { position: relative; flex: 1 1 260px; min-width: 0; }
20
+ #scrub { width: 100%; accent-color: var(--acc); }
21
+ #marks { position: absolute; left: 0; right: 0; top: -6px; height: 4px; pointer-events: none; }
22
+ #marks i { position: absolute; top: 0; height: 4px; border-radius: 2px; background: var(--acc); opacity: 0.8; }
23
+ #time { font-variant-numeric: tabular-nums; color: var(--dim); min-width: 110px; text-align: right; }
24
+ </style>
25
+ </head>
26
+ <body>
27
+ <div class="wrap">
28
+ <h1>{{TITLE}}</h1>
29
+ <p class="meta">Preview of the edit. Blue marks on the timeline are where graphics play. Space to play or pause.</p>
30
+ <div class="stage"><canvas id="stage" width="1280" height="720"></canvas></div>
31
+ <div class="bar">
32
+ <button id="play" type="button">Play</button>
33
+ <div class="track"><div id="marks"></div><input id="scrub" type="range" min="0" max="1" step="0.01" value="0" aria-label="Timeline"></div>
34
+ <span id="time">0:00.0</span>
35
+ <button id="sound" type="button" aria-pressed="true">Effects on</button>
36
+ </div>
37
+ </div>
38
+ <script>window.STYLE_FONTS = {{FONTS}}; window.FOOTAGE_URL = {{FOOTAGE}};</script>
39
+ <script src="{{SKILL}}/styles/{{STYLE}}/base.js"></script>
40
+ <script src="{{STORY}}"></script>
41
+ <script src="{{SKILL}}/engine/player.js"></script>
42
+ </body>
43
+ </html>
@@ -0,0 +1,145 @@
1
+ // Editor player for the ai-video-editor skill. Loaded after the style's base.js and your story.js.
2
+ // story.js must define:
3
+ // var EDIT = {
4
+ // D: <edited video length in seconds>,
5
+ // SPANS: [[t0, t1], ...], // where graphics are on screen; outside them the plain footage plays
6
+ // draw(ctx, t) { ... }, // draws frame t (only called inside a span); draw the footage yourself with FOOTAGE
7
+ // score(k) { ... }, // sound effects for the whole timeline, same times as the picture
8
+ // };
9
+ // FOOTAGE gives the edited A-roll at the current time (the renderer swaps in the exact frame before each draw).
10
+ (function () {
11
+ const W0 = 1280, H0 = 720;
12
+ const RENDER = !!window.__RENDER;
13
+ const clampN = (v, a, b) => (v < a ? a : v > b ? b : v);
14
+
15
+ // ---------------- footage source ----------------
16
+ let el; // <video> in preview, <img> while rendering
17
+ if (RENDER) {
18
+ el = new Image();
19
+ Object.defineProperty(el, 'videoWidth', { get: () => el.naturalWidth });
20
+ Object.defineProperty(el, 'videoHeight', { get: () => el.naturalHeight });
21
+ } else {
22
+ el = document.createElement('video');
23
+ el.src = window.FOOTAGE_URL || 'cut.mp4'; el.preload = 'auto'; el.playsInline = true; el.crossOrigin = 'anonymous';
24
+ }
25
+ const size = () => (RENDER ? [el.naturalWidth, el.naturalHeight] : [el.videoWidth, el.videoHeight]);
26
+ const FOOTAGE = {
27
+ el,
28
+ ready() { const [w] = size(); return w > 0; },
29
+ // cover-fit the footage into a rect, zoomed by z around the face point (fx, fy as 0..1 of the frame)
30
+ draw(c, x, y, w, h, z = 1, fx = 0.5, fy = 0.38) {
31
+ const [sw, sh] = size(); if (!sw) { c.save(); c.fillStyle = '#222'; c.fillRect(x, y, w, h); c.restore(); return; }
32
+ const s = Math.max(w / sw, h / sh) * z, dw = sw * s, dh = sh * s;
33
+ let dx = x + w / 2 - fx * dw, dy = y + h * 0.42 - fy * dh;
34
+ dx = clampN(dx, x + w - dw, x); dy = clampN(dy, y + h - dh, y);
35
+ c.save(); c.beginPath(); c.rect(x, y, w, h); c.clip(); c.drawImage(el, dx, dy, dw, dh); c.restore();
36
+ },
37
+ full(c, z = 1, fx = 0.5, fy = 0.38) { c.save(); c.fillStyle = '#000'; c.fillRect(0, 0, W0, H0); c.restore(); this.draw(c, 0, 0, W0, H0, z, fx, fy); },
38
+ };
39
+ window.FOOTAGE = FOOTAGE;
40
+
41
+ // Transition between the footage and a full-screen graphics span [a, b], at both edges.
42
+ // type: 'cut' (none), 'fade', 'push' (sideways), 'up' (vertical). d: seconds per transition.
43
+ let GL = null;
44
+ window.gfxInOut = (c, t, a, b, draw, o = {}) => {
45
+ const type = o.type || 'push', d = o.d == null ? 0.4 : o.d;
46
+ const u = d > 0 ? Math.min(clampN((t - a) / d, 0, 1), clampN((b - t) / d, 0, 1)) : 1;
47
+ if (type === 'cut' || u >= 1) { draw(c, t); return; }
48
+ const entering = t - a < b - t, e = u < 0.5 ? 4 * u * u * u : 1 - Math.pow(-2 * u + 2, 3) / 2;
49
+ if (!GL) { GL = document.createElement('canvas'); GL.width = W0; GL.height = H0; }
50
+ const g = GL.getContext('2d'); g.setTransform(1, 0, 0, 1, 0, 0); g.globalAlpha = 1; g.globalCompositeOperation = 'source-over'; g.filter = 'none'; g.clearRect(0, 0, W0, H0);
51
+ draw(g, t);
52
+ if (type === 'fade') { FOOTAGE.full(c); c.save(); c.globalAlpha = e; c.drawImage(GL, 0, 0); c.restore(); return; }
53
+ const dir = entering ? 1 : -1;
54
+ if (type === 'up') {
55
+ c.save(); c.translate(0, -e * H0 * dir); FOOTAGE.full(c); c.restore();
56
+ c.save(); c.translate(0, (1 - e) * H0 * dir); c.drawImage(GL, 0, 0); c.restore(); return;
57
+ }
58
+ c.save(); c.translate(-e * W0 * dir, 0); FOOTAGE.full(c); c.restore();
59
+ c.save(); c.translate((1 - e) * W0 * dir, 0); c.drawImage(GL, 0, 0); c.restore();
60
+ };
61
+ // styles built around A-roll (Warm Canvas) read AR.el: point it at the real footage
62
+ try { if (typeof AR !== 'undefined') AR = { el }; } catch (e) {}
63
+ try { if (typeof OVERLAY !== 'undefined') OVERLAY = false; } catch (e) {}
64
+
65
+ if (typeof EDIT === 'undefined') throw new Error('story.js must define var EDIT = { D, SPANS, draw, score }');
66
+ const D = EDIT.D, SPANS = (EDIT.SPANS || []).map((s) => [+s[0], +s[1]]).sort((a, b) => a[0] - b[0]);
67
+ const inSpan = (t) => SPANS.some(([a, b]) => t >= a && t < b);
68
+ const cvs = document.getElementById('stage'), ctx = cvs.getContext('2d');
69
+ function frame(t) {
70
+ ctx.setTransform(1, 0, 0, 1, 0, 0); ctx.globalAlpha = 1; ctx.globalCompositeOperation = 'source-over'; ctx.filter = 'none';
71
+ if (inSpan(t)) EDIT.draw(ctx, t); else FOOTAGE.full(ctx);
72
+ }
73
+
74
+ // note: never assign window.scoreSound here, it would replace a style's own scoreSound function
75
+ const SCORE = (k) => EDIT.score(k);
76
+ window.DURATION = D; window.SPANS = SPANS; window.EDIT_SCORE = SCORE;
77
+ window.drawAt = frame;
78
+
79
+ // ---------------- render hooks (used by scripts/render.py) ----------------
80
+ window.__renderFrame = async (t, jpegB64, quality) => {
81
+ if (jpegB64) { el.src = 'data:image/jpeg;base64,' + jpegB64; await el.decode(); }
82
+ frame(t);
83
+ return cvs.toDataURL('image/jpeg', quality || 0.93).slice(23);
84
+ };
85
+ window.__renderStill = async (t, jpegB64) => {
86
+ if (jpegB64) { el.src = 'data:image/jpeg;base64,' + jpegB64; await el.decode(); }
87
+ frame(t); return cvs.toDataURL('image/png').slice(22);
88
+ };
89
+ let SFXBUF = null;
90
+ window.__renderSfx = async (sr) => {
91
+ const r = await SFX.render(SCORE, D, sr || 48000, { voiceover: true });
92
+ const n = r.inter.length, pcm = new Int16Array(n);
93
+ for (let i = 0; i < n; i++) { const v = Math.max(-1, Math.min(1, r.inter[i])); pcm[i] = v < 0 ? v * 32768 : v * 32767; }
94
+ SFXBUF = new Uint8Array(pcm.buffer); return { bytes: SFXBUF.length, peak: r.peak, frames: r.frames };
95
+ };
96
+ window.__sfxChunk = (off, len) => {
97
+ const part = SFXBUF.subarray(off, Math.min(off + len, SFXBUF.length)); let s = '';
98
+ for (let i = 0; i < part.length; i += 0x8000) s += String.fromCharCode.apply(null, part.subarray(i, i + 0x8000));
99
+ return btoa(s);
100
+ };
101
+
102
+ // ---------------- preview player ----------------
103
+ const ui = { play: document.getElementById('play'), scrub: document.getElementById('scrub'), time: document.getElementById('time'), sound: document.getElementById('sound'), marks: document.getElementById('marks') };
104
+ let T = 0, playing = false, last = 0, soundOn = true, stopSound = null;
105
+ const fmt = (t) => { const m = Math.floor(t / 60), s = (t % 60).toFixed(1).padStart(4, '0'); return m + ':' + s; };
106
+ async function show() {
107
+ if (!RENDER && !playing && el.readyState >= 1 && Math.abs(el.currentTime - T) > 0.02) {
108
+ await new Promise((res) => { el.addEventListener('seeked', res, { once: true }); el.currentTime = Math.min(T, (el.duration || D) - 0.02); });
109
+ }
110
+ frame(T); if (ui.scrub) ui.scrub.value = T; if (ui.time) ui.time.textContent = fmt(T) + ' / ' + fmt(D);
111
+ }
112
+ window.seek = (t) => { T = clampN(t, 0, D); return show(); };
113
+ function startSound() { stopSnd(); if (playing && soundOn) stopSound = SFX.live(SCORE, T, { voiceover: true }); }
114
+ function stopSnd() { if (stopSound) { stopSound(); stopSound = null; } }
115
+ function setPlaying(p) {
116
+ playing = p; if (ui.play) ui.play.textContent = p ? 'Pause' : 'Play';
117
+ if (p) { el.currentTime = T; el.muted = false; el.play().catch(() => {}); last = performance.now(); startSound(); } else { el.pause(); stopSnd(); }
118
+ }
119
+ function tick(now) {
120
+ if (playing) {
121
+ T = el.readyState >= 2 && !el.paused ? el.currentTime : T + (now - last) / 1000; last = now;
122
+ if (T >= D) { T = D; setPlaying(false); }
123
+ frame(T); if (ui.scrub) ui.scrub.value = T; if (ui.time) ui.time.textContent = fmt(T) + ' / ' + fmt(D);
124
+ }
125
+ requestAnimationFrame(tick);
126
+ }
127
+ if (!RENDER && ui.play) {
128
+ ui.scrub.max = D;
129
+ ui.play.addEventListener('click', () => { if (!playing && T >= D - 0.01) T = 0; setPlaying(!playing); });
130
+ ui.scrub.addEventListener('input', () => { T = parseFloat(ui.scrub.value); if (playing) { el.currentTime = T; startSound(); } else show(); });
131
+ ui.sound.addEventListener('click', () => { soundOn = !soundOn; ui.sound.setAttribute('aria-pressed', soundOn); ui.sound.textContent = soundOn ? 'Effects on' : 'Effects off'; startSound(); });
132
+ if (ui.marks) ui.marks.innerHTML = SPANS.map(([a, b]) => `<i style="left:${(a / D) * 100}%;width:${((b - a) / D) * 100}%"></i>`).join('');
133
+ document.addEventListener('keydown', (e) => { if (e.code === 'Space') { e.preventDefault(); ui.play.click(); } });
134
+ }
135
+
136
+ // ---------------- startup: fonts first, then the first frame ----------------
137
+ (async () => {
138
+ const want = window.STYLE_FONTS || [];
139
+ try { await Promise.all(want.map((f) => document.fonts.load(f, 'AaZz09'))); await document.fonts.ready; } catch (e) {}
140
+ if (!RENDER) { await new Promise((res) => { if (el.readyState >= 2) res(); else { el.addEventListener('loadeddata', res, { once: true }); setTimeout(res, 4000); } }); }
141
+ T = SPANS.length ? SPANS[0][0] + 0.5 : 0; await show();
142
+ window.__ready = true;
143
+ if (!RENDER) requestAnimationFrame((n) => { last = n; tick(n); });
144
+ })();
145
+ })();
@@ -0,0 +1,95 @@
1
+ // Example story.js (Warm Canvas) for a 21.8 s edited clip. Times are seconds in cut.mp4 (transcript_edited.txt).
2
+ // Script of the clip: "Hey everyone, welcome back to the channel. Today I'm going to show you how to edit a video with AI
3
+ // for free. The first step is cutting out the silent parts. Then we add motion graphics that explain the idea. Most editors
4
+ // charge around five hundred dollars for this. And the best part is, it costs nothing."
5
+ var TL = {
6
+ cap1: { words: [5.29, 5.61, 5.75, 6.13, 6.45, 6.65, 6.91], out: 7.45 },
7
+ steps: { title: 7.75, cardA: 8.36, waveCut: 9.9, arrow: 11.15, cardB: 11.7, out: 14.55 },
8
+ cost: { title: 14.96, cardA: 15.3, cnt: [16.6, 17.5], cardB: 19.3, zero: 20.7 },
9
+ };
10
+
11
+ // a voice waveform; the quiet gaps shrink away when cut
12
+ function waveStrip(c, x, y, w, h, cutP) {
13
+ const r = CM.rng('wave'), bars = 34, gaps = [9, 10, 22, 23, 24];
14
+ let cx = x; const bw = w / bars;
15
+ for (let i = 0; i < bars; i++) {
16
+ const gap = gaps.includes(i), k = gap ? 1 - cutP : 1;
17
+ const amp = gap ? 0.08 : 0.25 + r() * 0.7;
18
+ if (k > 0.02) {
19
+ c.fillStyle = gap ? C.red : C.sky; c.globalAlpha = gap ? 0.55 * k : 1;
20
+ rr(c, cx + 2, y + h / 2 - (amp * h) / 2, Math.max(1, bw * k - 4), amp * h, 3); c.fill(); c.globalAlpha = 1;
21
+ }
22
+ cx += bw * k;
23
+ }
24
+ }
25
+ function stepCard(c, x, y, n, title, sub, draw) {
26
+ const w = 360, h = 330; shadowCard(c, x, y, w, h, 22);
27
+ c.save(); c.fillStyle = C.sky; rr(c, x + 26, y + 26, 52, 52, 14); c.fill(); c.font = SERIF(32, 600); c.fillStyle = '#fff'; c.textAlign = 'center'; c.fillText(String(n), x + 52, y + 63); c.restore();
28
+ c.font = SERIF(32, 600); c.letterSpacing = LS(32); c.fillStyle = C.ink; c.fillText(title, x + 96, y + 62); c.letterSpacing = '0px';
29
+ c.font = SANS(18, 500); c.fillStyle = C.sub; c.fillText(sub, x + 28, y + 118);
30
+ draw(x + 28, y + 150, w - 56, 140);
31
+ }
32
+
33
+ function sceneTalk(c, t) {
34
+ FOOTAGE.full(c, 1.08, 0.5, 0.36);
35
+ const k = TL.cap1.words;
36
+ caption(c, t, [[['Edit', k[0]], ['a', k[1]], ['video', k[2]]], [['with', k[3]], ['AI', k[4], C.sky], ['for', k[5], C.sky], ['free', k[6], C.sky]]], TL.cap1.out);
37
+ }
38
+
39
+ function sceneSteps(c, t) {
40
+ canvasBG(c); pip(c, t);
41
+ const S = TL.steps;
42
+ titleChip(c, [['Two ', C.ink], ['steps', C.sky]], t, S.title, S.out);
43
+ const a = fadeOut(t, S.out);
44
+ if (t > S.cardA) { c.save(); c.globalAlpha = a; enter(c, t, S.cardA);
45
+ stepCard(c, 70, 220, 1, 'Cut the pauses', 'Silent gaps get removed', (x, y, w, h) => {
46
+ c.save(); c.fillStyle = C.head; rr(c, x, y, w, h, 14); c.fill(); c.restore();
47
+ waveStrip(c, x + 14, y + 10, w - 28, h - 20, inout(span(t, S.waveCut, S.waveCut + 0.7)));
48
+ }); c.restore(); }
49
+ c.save(); c.globalAlpha = a; dashArrow(c, 448, 385, 64, span(t, S.arrow, S.arrow + 0.35)); c.restore();
50
+ if (t > S.cardB) { c.save(); c.globalAlpha = a; enter(c, t, S.cardB);
51
+ stepCard(c, 532, 220, 2, 'Add graphics', 'Only where they explain', (x, y, w, h) => {
52
+ c.save(); c.fillStyle = C.head; rr(c, x, y, w, h, 14); c.fill();
53
+ const p = outC(span(t, S.cardB + 0.4, S.cardB + 0.9));
54
+ shadowCard(c, x + 24, y + 22, (w - 48) * p, 40, 10, { blur: 12, offY: 4 });
55
+ c.globalAlpha *= p; tag(c, x + 36, y + 30, 'Title', C.skyTint, C.skyDeep, 15);
56
+ const q = outC(span(t, S.cardB + 0.8, S.cardB + 1.3)); c.globalAlpha = a * q;
57
+ shadowCard(c, x + 24, y + 76, (w - 48) * 0.7, 40, 10, { blur: 12, offY: 4 }); tag(c, x + 36, y + 84, 'Chart', C.purpleTint, C.purple, 15);
58
+ c.restore();
59
+ }); c.restore(); }
60
+ }
61
+
62
+ function sceneCost(c, t) {
63
+ canvasBG(c); pip(c, t);
64
+ const K = TL.cost;
65
+ titleChip(c, [['What it ', C.ink], ['costs', C.sky]], t, K.title, 99);
66
+ const card = (x, t0, label, tagBg, value, valCol, footOk, foot, footT) => {
67
+ if (t < t0) return; c.save(); enter(c, t, t0);
68
+ shadowCard(c, x, 220, 360, 330, 22);
69
+ c.font = SERIF(96, 600); c.letterSpacing = LS(96); c.fillStyle = valCol; c.textAlign = 'center'; c.fillText(value, x + 180, 380); c.letterSpacing = '0px';
70
+ c.font = SANS(22, 600); c.fillStyle = C.sub; c.fillText(label, x + 180, 430); c.textAlign = 'left';
71
+ cardFooter(c, x, 515, 360, footOk, foot, span(t, footT, footT + 0.3)); c.restore();
72
+ };
73
+ const n = Math.round(500 * outC(span(t, K.cnt[0], K.cnt[1])));
74
+ card(70, K.cardA, 'Hiring an editor', C.purpleSoft, '$' + n, C.ink, false, 'Per video', K.cnt[1]);
75
+ card(532, K.cardB, 'This skill', C.sky, '$0', C.skyDeep, true, 'Runs on your computer', K.zero);
76
+ }
77
+
78
+ var SCENES = [sceneTalk, sceneSteps, sceneCost];
79
+ var CUTS = [{ t: 7.6 }, { t: 14.85 }];
80
+ function storyDraw(c, t) { let i = 0; for (const cu of CUTS) if (t >= cu.t) i++; SCENES[i](c, t); }
81
+
82
+ function storyScore(k) {
83
+ const tap = (t, g = 1, pan = 0) => { k.voice(t, { f: [[0, 120], [0.12, 60]], dur: 0.2, gain: 0.16 * g, pan, soft: true }); k.hiss(t, { color: 'brown', dur: 0.06, filter: 'lowpass', ff: 650, gain: 0.06 * g, pan, soft: true }); };
84
+ const slide = (t, g = 1, pan = 0) => k.hiss(t, { color: 'pink', dur: 0.32, filter: 'bandpass', ff: [[0, 380], [0.3, 1100]], q: 0.8, gain: 0.08 * g, a: 0.12, pan, soft: true });
85
+ const S = TL.steps, K = TL.cost;
86
+ k.voice(S.title - 0.2, { type: 'triangle', f: 'D3', dur: 14.4, gain: 0.022, a: 1.2, hold: 12, filter: 'lowpass', ff: 700, verb: 0.3, bus: 'music' });
87
+ slide(S.title, 0.7); slide(S.cardA, 0.9, -0.4);
88
+ k.hiss(S.waveCut, { color: 'pink', dur: 0.6, filter: 'bandpass', ff: [[0, 1200], [0.6, 420]], q: 0.9, gain: 0.07, a: 0.1 });
89
+ slide(S.arrow, 0.5); slide(S.cardB, 0.9, 0.4); tap(S.cardB + 0.45, 0.5); tap(S.cardB + 0.85, 0.5);
90
+ slide(K.title, 0.7); slide(K.cardA, 0.9, -0.4);
91
+ const r = CM.rng('cnt'); for (let x = K.cnt[0]; x < K.cnt[1]; x += 0.07 + r() * 0.05) k.hiss(x, { dur: 0.014, filter: 'bandpass', ff: 1500 + r() * 500, q: 1.8, gain: 0.05, soft: true });
92
+ tap(K.cnt[1], 0.8); slide(K.cardB, 0.9, 0.4); tap(K.zero, 0.8, 0.4);
93
+ }
94
+
95
+ var EDIT = { D: 21.8, SPANS: [[5.2, 7.5], [7.6, 21.8]], draw: storyDraw, score: storyScore };
@@ -0,0 +1,112 @@
1
+ # Writing story.js
2
+
3
+ story.js is the only code you write for an edit. It draws the motion graphics for the edited video
4
+ (cut.mp4) in one of the seven styles. The page loads, in order:
5
+
6
+ 1. `styles/<style>/base.js`: the style engine, unchanged from the Motion Graphics Style Library reference. It holds
7
+ CM (helpers and seeded randomness), SFX (synthesized sound kit), the style's palette `C`, fonts, drawing
8
+ helpers, and the reference demo (scene functions, `explainer`, `scoreSound`) as a worked example.
9
+ 2. `story.js`: yours.
10
+ 3. `engine/player.js`: the editor player. It defines `FOOTAGE`, `gfxInOut`, `window.seek` and the render hooks.
11
+
12
+ ## The contract
13
+
14
+ ```js
15
+ var EDIT = {
16
+ D: 312.4, // length of cut.mp4 in seconds (edit.json "cut_seconds")
17
+ SPANS: [[12.1, 18.6], [40.0, 52.3]], // where graphics are on screen. Outside them the plain footage plays.
18
+ draw(ctx, t) { ... }, // draws frame t, only called inside a span. Design space is 1280 x 720.
19
+ score(k) { ... }, // all sound effects for the whole video, at the same times as the picture
20
+ };
21
+ ```
22
+
23
+ - Times are seconds of the EDITED video. Take them from `transcript_edited.txt` / `transcript_edited.json`.
24
+ - Start a span about 0.1 to 0.3 s before the first word it illustrates; end it when the idea is done.
25
+ Leave plain footage between spans. Spans must not overlap.
26
+ - Every frame is a pure function of t (the renderer draws frames out of order on several workers).
27
+ Use `CM.rng(seed)` and `CM.noise1(seed)`, never `Math.random`. Caching static layers is fine.
28
+ - Keep each frame fast (well under 50 ms). Make offscreen canvases once (`CM.layer(w, h)`), not per frame.
29
+ - Declare `TL`, `CUTS`, `PUNCH`, `SCENES` with `var` if you reuse those names (base.js declares them with var
30
+ so you can redefine them). Name your own scene functions freshly (for example `gfxIntro`, `gfxSteps`).
31
+ - Never assign `window.scoreSound` or `window.seek`, and do not redefine the style's helpers unless you mean to
32
+ change them everywhere.
33
+ - Draw at 1280 x 720 always. The renderer makes it sharp at 1080p or 4K by itself.
34
+ - Text in any script works: Devanagari falls back to Noto Sans Devanagari inside every style font.
35
+
36
+ ## Footage
37
+
38
+ ```js
39
+ FOOTAGE.full(c, z = 1, fx = 0.5, fy = 0.38) // the footage full frame, zoomed z around the face point
40
+ FOOTAGE.draw(c, x, y, w, h, z, fx, fy) // cover-fit into any rect (picture-in-picture, cards, phones)
41
+ gfxInOut(c, t, a, b, drawFn, { type, d }) // full-screen graphics for span [a, b] with an entrance and exit
42
+ // from/to the footage: type 'push' | 'up' | 'fade' | 'cut'
43
+ ```
44
+
45
+ `FOOTAGE` is always the footage at time t. Warm Canvas's own A-roll helpers (`fullARoll`, `pip`,
46
+ `arollFeed`) already use it, so call them directly.
47
+
48
+ ## Two ways to use a style
49
+
50
+ **Talking-head styles (Warm Canvas):** the speaker stays the star. Mode 1 is full-frame footage with a caption
51
+ (`caption()`) or side chips (`sideChip()`); mode 2 is the warm canvas with the speaker in the PiP (`canvasBG()`,
52
+ `pip()`) and cards in the left column (`COLX`). See `references/example-story-warm-canvas.js`, a complete,
53
+ rendered example.
54
+
55
+ **Full-screen styles (Creator Motion Graphics, Chalk Talk, Clean Tech, Software Walkthrough, Data Story,
56
+ Pop Info):** the graphics replace the picture for a beat while the voice continues, then cut back to the
57
+ speaker. Wrap each beat in `gfxInOut` (or use the style's own transitions between beats inside one span).
58
+ Creator Motion Graphics also works over the footage: draw `FOOTAGE.full(c)`, darken it
59
+ (`c.fillStyle = 'rgba(0,0,0,0.55)'; c.fillRect(0, 0, 1280, 720)`), then its kinetic words on top.
60
+
61
+ To learn a style, read in base.js everything after the `STYLE:` banner: the palette, the helpers, and the demo
62
+ scene functions (`sceneXxx`), which show exactly how backgrounds, type, cards and motion are built. Copy their
63
+ patterns and invent new content for this video. The demo's own `explainer(ctx, t)` composites its scenes with
64
+ `CUTS`; you can build your own small compositor the same way, or call one scene function per span.
65
+
66
+ A useful pattern for long videos: one function per beat, each with its own local time.
67
+
68
+ ```js
69
+ var BEATS = [
70
+ { a: 12.1, b: 18.6, draw: gfxIntro },
71
+ { a: 40.0, b: 52.3, draw: gfxSteps },
72
+ ];
73
+ var EDIT = {
74
+ D: 312.4,
75
+ SPANS: BEATS.map((x) => [x.a, x.b]),
76
+ draw(c, t) { const x = BEATS.find((x) => t >= x.a && t < x.b); gfxInOut(c, t, x.a, x.b, (g, tt) => x.draw(g, tt, tt - x.a), { type: 'push' }); },
77
+ score(k) { BEATS.forEach((x) => x.sound && x.sound(k, x.a)); },
78
+ };
79
+ ```
80
+
81
+ ## Sound
82
+
83
+ - `score(k)` gets the SFX kit: `k.play(name, t, opts)` for the named sounds in base.js (`slam`, `whoosh`, `click`,
84
+ `tick`, `keys`, `marker`, `strike`, `stamp`, `boom`, ...), plus `k.voice()`, `k.hiss()`, `k.drone()`.
85
+ Each style's demo `scoreSound` shows its own palette (Warm Canvas: soft paper slides, low wooden taps).
86
+ - The mix is always rendered in voiceover mode (music bus low, `soft` sounds at 55%), because it sits under
87
+ a real voice. Keep it sparse: one sound per visual event that deserves one, never more than two at once.
88
+ - No chimes, bells, pings, sparkles or high-pitched game-style pops (`ping`, `shimmer`, `sparkle`, `pop`).
89
+ No music beat under speech.
90
+ - Every sound time must come from the same TL numbers as the picture.
91
+
92
+ ## Taste rules (the user's defaults)
93
+
94
+ - Add motion graphics only where they communicate something: a list, a number, a comparison, a process, a
95
+ definition, a before/after. Never decoration for its own sake. Plenty of the video stays plain footage.
96
+ - Never put a small coloured label or tag above a title or heading. Put supporting text below or beside.
97
+ - One idea per beat; on-screen words are short (2 to 6 words), spelled exactly as spoken where possible.
98
+ - Double-check any facts and numbers you show; if the speaker says them, match what they said.
99
+ - Follow the style's own rules in `styles/<style>/style.md`. Ignore the parts of that file about storyboards,
100
+ asking for a topic, the player, target duration or rendering: this skill handles those.
101
+
102
+ ## Checking your work
103
+
104
+ ```
105
+ python scripts/render.py WORK --check # loads the page; prints errors, spans, output size
106
+ python scripts/render.py WORK --stills auto # 3 stills per span -> WORK/stills/contact.png
107
+ python scripts/render.py WORK --stills 14.2,15 # stills at chosen times
108
+ ```
109
+
110
+ Open the contact sheet (it is an image file) and look at it: text inside the frame and not overlapping,
111
+ nothing covering the speaker's face in a PiP, readable sizes, the style's look. Fix and re-check before
112
+ the full render.
@@ -0,0 +1,4 @@
1
+ faster-whisper>=1.1
2
+ playwright>=1.40
3
+ numpy
4
+ pillow