zilmate 1.9.9 → 1.10.2

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 (287) hide show
  1. package/.agents/skills/ad-creative/SKILL.md +362 -0
  2. package/.agents/skills/ad-creative/evals/evals.json +90 -0
  3. package/.agents/skills/ad-creative/references/generative-tools.md +637 -0
  4. package/.agents/skills/ad-creative/references/platform-specs.md +213 -0
  5. package/.agents/skills/ai-seo/SKILL.md +489 -0
  6. package/.agents/skills/ai-seo/evals/evals.json +90 -0
  7. package/.agents/skills/ai-seo/references/content-patterns.md +285 -0
  8. package/.agents/skills/ai-seo/references/content-types.md +71 -0
  9. package/.agents/skills/ai-seo/references/okf.md +104 -0
  10. package/.agents/skills/ai-seo/references/platform-ranking-factors.md +154 -0
  11. package/.agents/skills/clerk-backend-api/SKILL.md +426 -0
  12. package/.agents/skills/clerk-backend-api/evals/evals.json +87 -0
  13. package/.agents/skills/clerk-backend-api/scripts/api-specs-context.sh +30 -0
  14. package/.agents/skills/clerk-backend-api/scripts/execute-request.sh +88 -0
  15. package/.agents/skills/clerk-backend-api/scripts/extract-endpoint-detail.sh +165 -0
  16. package/.agents/skills/clerk-backend-api/scripts/extract-tag-endpoints.sh +208 -0
  17. package/.agents/skills/clerk-backend-api/scripts/extract-tags.js +14 -0
  18. package/.agents/skills/copy-editing/SKILL.md +457 -0
  19. package/.agents/skills/copy-editing/evals/evals.json +89 -0
  20. package/.agents/skills/copy-editing/references/checklist.md +66 -0
  21. package/.agents/skills/copy-editing/references/content-refresh.md +38 -0
  22. package/.agents/skills/copy-editing/references/plain-english-alternatives.md +394 -0
  23. package/.agents/skills/hyperframes/SKILL.md +163 -0
  24. package/.agents/skills/hyperframes-cli/SKILL.md +109 -0
  25. package/.agents/skills/hyperframes-cli/references/doctor-browser.md +45 -0
  26. package/.agents/skills/hyperframes-cli/references/init-and-scaffold.md +51 -0
  27. package/.agents/skills/hyperframes-cli/references/lambda.md +132 -0
  28. package/.agents/skills/hyperframes-cli/references/lint-validate-inspect.md +121 -0
  29. package/.agents/skills/hyperframes-cli/references/preview-render.md +109 -0
  30. package/.agents/skills/hyperframes-cli/references/upgrade-info-misc.md +75 -0
  31. package/.agents/skills/hyperframes-media/SKILL.md +97 -0
  32. package/.agents/skills/hyperframes-media/assets/sfx/CREDITS.md +35 -0
  33. package/.agents/skills/hyperframes-media/assets/sfx/manifest.json +97 -0
  34. package/.agents/skills/hyperframes-media/references/bgm.md +72 -0
  35. package/.agents/skills/hyperframes-media/references/captions/authoring.md +159 -0
  36. package/.agents/skills/hyperframes-media/references/captions/motion.md +87 -0
  37. package/.agents/skills/hyperframes-media/references/captions/transcript-handling.md +97 -0
  38. package/.agents/skills/hyperframes-media/references/remove-background.md +143 -0
  39. package/.agents/skills/hyperframes-media/references/requirements.md +29 -0
  40. package/.agents/skills/hyperframes-media/references/sfx.md +42 -0
  41. package/.agents/skills/hyperframes-media/references/transcribe.md +52 -0
  42. package/.agents/skills/hyperframes-media/references/tts-to-captions.md +24 -0
  43. package/.agents/skills/hyperframes-media/references/tts.md +135 -0
  44. package/.agents/skills/hyperframes-media/scripts/audio.mjs +282 -0
  45. package/.agents/skills/hyperframes-media/scripts/heygen-tts.mjs +121 -0
  46. package/.agents/skills/hyperframes-media/scripts/lib/bgm.mjs +235 -0
  47. package/.agents/skills/hyperframes-media/scripts/lib/heygen.mjs +131 -0
  48. package/.agents/skills/hyperframes-media/scripts/lib/sfx.mjs +128 -0
  49. package/.agents/skills/hyperframes-media/scripts/lib/tts.mjs +220 -0
  50. package/.agents/skills/hyperframes-media/scripts/lyria-recipe.py +128 -0
  51. package/.agents/skills/hyperframes-media/scripts/wait-bgm.mjs +167 -0
  52. package/.agents/skills/hyperframes-registry/SKILL.md +101 -0
  53. package/.agents/skills/hyperframes-registry/examples/add-block.md +51 -0
  54. package/.agents/skills/hyperframes-registry/examples/add-component.md +73 -0
  55. package/.agents/skills/hyperframes-registry/references/contributing.md +166 -0
  56. package/.agents/skills/hyperframes-registry/references/demo-html-pattern.md +54 -0
  57. package/.agents/skills/hyperframes-registry/references/discovery.md +215 -0
  58. package/.agents/skills/hyperframes-registry/references/install-locations.md +45 -0
  59. package/.agents/skills/hyperframes-registry/references/templates.md +417 -0
  60. package/.agents/skills/hyperframes-registry/references/wiring-blocks.md +61 -0
  61. package/.agents/skills/hyperframes-registry/references/wiring-components.md +39 -0
  62. package/.agents/skills/marketing-psychology/SKILL.md +455 -0
  63. package/.agents/skills/marketing-psychology/evals/evals.json +88 -0
  64. package/.agents/skills/mintlify/SKILL.md +328 -0
  65. package/.agents/skills/product-launch-video/SKILL.md +206 -0
  66. package/.agents/skills/product-launch-video/references/cut-catalog.md +220 -0
  67. package/.agents/skills/product-launch-video/references/motion-language.md +156 -0
  68. package/.agents/skills/product-launch-video/references/story-design.md +373 -0
  69. package/.agents/skills/product-launch-video/references/visual-design.md +126 -0
  70. package/.agents/skills/product-launch-video/scripts/assemble-index.mjs +570 -0
  71. package/.agents/skills/product-launch-video/scripts/audio.mjs +253 -0
  72. package/.agents/skills/product-launch-video/scripts/build-frame.mjs +536 -0
  73. package/.agents/skills/product-launch-video/scripts/captions.mjs +508 -0
  74. package/.agents/skills/product-launch-video/scripts/lib/assets.mjs +55 -0
  75. package/.agents/skills/product-launch-video/scripts/lib/dimensions.mjs +45 -0
  76. package/.agents/skills/product-launch-video/scripts/lib/storyboard.mjs +249 -0
  77. package/.agents/skills/product-launch-video/scripts/lib/tokens.mjs +204 -0
  78. package/.agents/skills/product-launch-video/scripts/lib/transition-registry.mjs +38 -0
  79. package/.agents/skills/product-launch-video/scripts/lib/transitions.json +71 -0
  80. package/.agents/skills/product-launch-video/scripts/stage-assets.mjs +39 -0
  81. package/.agents/skills/product-launch-video/scripts/transitions.mjs +320 -0
  82. package/.agents/skills/product-launch-video/sub-agents/frame-worker.md +74 -0
  83. package/.agents/skills/prompt-engineering-patterns/SKILL.md +144 -0
  84. package/.agents/skills/prompt-engineering-patterns/assets/few-shot-examples.json +106 -0
  85. package/.agents/skills/prompt-engineering-patterns/assets/prompt-template-library.md +264 -0
  86. package/.agents/skills/prompt-engineering-patterns/references/chain-of-thought.md +412 -0
  87. package/.agents/skills/prompt-engineering-patterns/references/details.md +338 -0
  88. package/.agents/skills/prompt-engineering-patterns/references/few-shot-learning.md +386 -0
  89. package/.agents/skills/prompt-engineering-patterns/references/prompt-optimization.md +428 -0
  90. package/.agents/skills/prompt-engineering-patterns/references/prompt-templates.md +484 -0
  91. package/.agents/skills/prompt-engineering-patterns/references/system-prompts.md +195 -0
  92. package/.agents/skills/prompt-engineering-patterns/scripts/optimize-prompt.py +279 -0
  93. package/.agents/skills/remotion-to-hyperframes/SKILL.md +127 -0
  94. package/.agents/skills/remotion-to-hyperframes/assets/.gitkeep +0 -0
  95. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/run.sh +249 -0
  96. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/README.md +41 -0
  97. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/expected.json +26 -0
  98. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/hf-src/index.html +61 -0
  99. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/package.json +14 -0
  100. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/remotion.config.ts +13 -0
  101. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/Root.tsx +13 -0
  102. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/TitleCard.tsx +34 -0
  103. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/src/index.ts +4 -0
  104. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-1-title-card/remotion-src/tsconfig.json +15 -0
  105. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/README.md +54 -0
  106. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/expected.json +29 -0
  107. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/hf-src/index.html +118 -0
  108. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/package.json +14 -0
  109. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/remotion.config.ts +13 -0
  110. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/MultiScene.tsx +105 -0
  111. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/Root.tsx +13 -0
  112. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/src/index.ts +4 -0
  113. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/remotion-src/tsconfig.json +15 -0
  114. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-2-multi-scene/setup.sh +34 -0
  115. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/README.md +85 -0
  116. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/expected.json +41 -0
  117. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/hf-src/index.html +269 -0
  118. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/package.json +15 -0
  119. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/remotion.config.ts +13 -0
  120. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/Root.tsx +27 -0
  121. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/Stargazed.tsx +37 -0
  122. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/components/AnimatedNumber.tsx +23 -0
  123. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/components/StatCard.tsx +59 -0
  124. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/components/UnderlinedText.tsx +47 -0
  125. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/index.ts +4 -0
  126. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/scenes/OutroScene.tsx +18 -0
  127. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/scenes/StatsScene.tsx +34 -0
  128. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/src/scenes/TitleScene.tsx +55 -0
  129. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-3-data-driven/remotion-src/tsconfig.json +15 -0
  130. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/README.md +51 -0
  131. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/01-use-state.tsx +29 -0
  132. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/02-use-effect-deps.tsx +29 -0
  133. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/03-async-metadata.tsx +39 -0
  134. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/04-third-party-react.tsx +30 -0
  135. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/05-lambda-config.tsx +38 -0
  136. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/06-warnings-only.tsx +36 -0
  137. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/07-custom-hook.tsx +28 -0
  138. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/cases/08-mixed.tsx +41 -0
  139. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/expected.json +85 -0
  140. package/.agents/skills/remotion-to-hyperframes/assets/test-corpus/tier-4-escape-hatch/validate.sh +110 -0
  141. package/.agents/skills/remotion-to-hyperframes/references/api-map.md +142 -0
  142. package/.agents/skills/remotion-to-hyperframes/references/escape-hatch.md +115 -0
  143. package/.agents/skills/remotion-to-hyperframes/references/eval.md +140 -0
  144. package/.agents/skills/remotion-to-hyperframes/references/fonts.md +112 -0
  145. package/.agents/skills/remotion-to-hyperframes/references/limitations.md +136 -0
  146. package/.agents/skills/remotion-to-hyperframes/references/lottie.md +121 -0
  147. package/.agents/skills/remotion-to-hyperframes/references/media.md +149 -0
  148. package/.agents/skills/remotion-to-hyperframes/references/parameters.md +167 -0
  149. package/.agents/skills/remotion-to-hyperframes/references/sequencing.md +195 -0
  150. package/.agents/skills/remotion-to-hyperframes/references/timing.md +165 -0
  151. package/.agents/skills/remotion-to-hyperframes/references/transitions.md +114 -0
  152. package/.agents/skills/remotion-to-hyperframes/scripts/.gitkeep +0 -0
  153. package/.agents/skills/remotion-to-hyperframes/scripts/frame_strip.sh +107 -0
  154. package/.agents/skills/remotion-to-hyperframes/scripts/lint_source.py +358 -0
  155. package/.agents/skills/remotion-to-hyperframes/scripts/render_diff.sh +103 -0
  156. package/.agents/skills/remotion-to-hyperframes/scripts/tests/fixtures/blocker.tsx +50 -0
  157. package/.agents/skills/remotion-to-hyperframes/scripts/tests/fixtures/clean.tsx +46 -0
  158. package/.agents/skills/remotion-to-hyperframes/scripts/tests/smoke.sh +90 -0
  159. package/.agents/skills/seo-audit/SKILL.md +497 -0
  160. package/.agents/skills/seo-audit/evals/evals.json +136 -0
  161. package/.agents/skills/seo-audit/references/ai-writing-detection.md +200 -0
  162. package/.agents/skills/seo-audit/references/international-seo.md +230 -0
  163. package/README.md +4 -2
  164. package/SDK.md +64 -1
  165. package/dist/agents/coding.agent.d.ts +558 -0
  166. package/dist/agents/coding.agent.d.ts.map +1 -1
  167. package/dist/agents/coding.agent.js +8 -0
  168. package/dist/agents/coding.agent.js.map +1 -1
  169. package/dist/agents/developer-helper.agent.d.ts +712 -0
  170. package/dist/agents/developer-helper.agent.d.ts.map +1 -1
  171. package/dist/agents/developer-helper.agent.js +6 -0
  172. package/dist/agents/developer-helper.agent.js.map +1 -1
  173. package/dist/agents/docs-research.agent.d.ts +8 -0
  174. package/dist/agents/docs-research.agent.d.ts.map +1 -1
  175. package/dist/agents/finance.agent.d.ts +8 -0
  176. package/dist/agents/finance.agent.d.ts.map +1 -1
  177. package/dist/agents/manager.d.ts +837 -2
  178. package/dist/agents/manager.d.ts.map +1 -1
  179. package/dist/agents/manager.js +28 -0
  180. package/dist/agents/manager.js.map +1 -1
  181. package/dist/agents/security.agent.d.ts +165 -3
  182. package/dist/agents/security.agent.d.ts.map +1 -1
  183. package/dist/agents/security.agent.js +3 -0
  184. package/dist/agents/security.agent.js.map +1 -1
  185. package/dist/agents/swarm/main.js +1 -1
  186. package/dist/agents/swarm/main.js.map +1 -1
  187. package/dist/agents/swarm/registry.d.ts.map +1 -1
  188. package/dist/agents/swarm/registry.js +232 -26
  189. package/dist/agents/swarm/registry.js.map +1 -1
  190. package/dist/cli/doctor.d.ts +14 -0
  191. package/dist/cli/doctor.d.ts.map +1 -1
  192. package/dist/cli/doctor.js +91 -0
  193. package/dist/cli/doctor.js.map +1 -1
  194. package/dist/cli/menu.d.ts.map +1 -1
  195. package/dist/cli/menu.js +102 -0
  196. package/dist/cli/menu.js.map +1 -1
  197. package/dist/cli/setup.d.ts +10 -0
  198. package/dist/cli/setup.d.ts.map +1 -1
  199. package/dist/cli/setup.js +178 -0
  200. package/dist/cli/setup.js.map +1 -1
  201. package/dist/cli/swarm.d.ts +1 -0
  202. package/dist/cli/swarm.d.ts.map +1 -1
  203. package/dist/cli/swarm.js +47 -8
  204. package/dist/cli/swarm.js.map +1 -1
  205. package/dist/cli/theme.d.ts +0 -24
  206. package/dist/cli/theme.d.ts.map +1 -1
  207. package/dist/cli/theme.js +6 -2
  208. package/dist/cli/theme.js.map +1 -1
  209. package/dist/config/env.d.ts +10 -0
  210. package/dist/config/env.d.ts.map +1 -1
  211. package/dist/config/env.js +38 -17
  212. package/dist/config/env.js.map +1 -1
  213. package/dist/index.js +96 -5
  214. package/dist/index.js.map +1 -1
  215. package/dist/jobs/trigger-orchestrator.d.ts +5 -1
  216. package/dist/jobs/trigger-orchestrator.d.ts.map +1 -1
  217. package/dist/jobs/trigger-orchestrator.js +29 -9
  218. package/dist/jobs/trigger-orchestrator.js.map +1 -1
  219. package/dist/jobs/trigger-router.d.ts.map +1 -1
  220. package/dist/jobs/trigger-router.js +3 -2
  221. package/dist/jobs/trigger-router.js.map +1 -1
  222. package/dist/memory/corporate-wiki.d.ts +15 -0
  223. package/dist/memory/corporate-wiki.d.ts.map +1 -0
  224. package/dist/memory/corporate-wiki.js +152 -0
  225. package/dist/memory/corporate-wiki.js.map +1 -0
  226. package/dist/memory/scratchpad.d.ts +2 -0
  227. package/dist/memory/scratchpad.d.ts.map +1 -1
  228. package/dist/memory/scratchpad.js +27 -0
  229. package/dist/memory/scratchpad.js.map +1 -1
  230. package/dist/observability/doctor.d.ts.map +1 -1
  231. package/dist/observability/doctor.js +12 -4
  232. package/dist/observability/doctor.js.map +1 -1
  233. package/dist/observability/traces.d.ts +72 -0
  234. package/dist/observability/traces.d.ts.map +1 -0
  235. package/dist/observability/traces.js +1134 -0
  236. package/dist/observability/traces.js.map +1 -0
  237. package/dist/runtime/swarm.d.ts +1 -1
  238. package/dist/runtime/swarm.d.ts.map +1 -1
  239. package/dist/runtime/swarm.js +54 -25
  240. package/dist/runtime/swarm.js.map +1 -1
  241. package/dist/safety/approvals.d.ts +2 -2
  242. package/dist/safety/approvals.d.ts.map +1 -1
  243. package/dist/safety/approvals.js +47 -1
  244. package/dist/safety/approvals.js.map +1 -1
  245. package/dist/safety/redaction.d.ts.map +1 -1
  246. package/dist/safety/redaction.js +10 -0
  247. package/dist/safety/redaction.js.map +1 -1
  248. package/dist/tools/cloud.tool.d.ts +394 -0
  249. package/dist/tools/cloud.tool.d.ts.map +1 -0
  250. package/dist/tools/cloud.tool.js +784 -0
  251. package/dist/tools/cloud.tool.js.map +1 -0
  252. package/dist/tools/computer-use.tool.d.ts +2 -2
  253. package/dist/tools/corporate-wiki.tool.d.ts +22 -0
  254. package/dist/tools/corporate-wiki.tool.d.ts.map +1 -0
  255. package/dist/tools/corporate-wiki.tool.js +43 -0
  256. package/dist/tools/corporate-wiki.tool.js.map +1 -0
  257. package/dist/tools/devops.tool.d.ts +162 -0
  258. package/dist/tools/devops.tool.d.ts.map +1 -0
  259. package/dist/tools/devops.tool.js +377 -0
  260. package/dist/tools/devops.tool.js.map +1 -0
  261. package/dist/tools/multimedia.tool.d.ts +126 -0
  262. package/dist/tools/multimedia.tool.d.ts.map +1 -0
  263. package/dist/tools/multimedia.tool.js +533 -0
  264. package/dist/tools/multimedia.tool.js.map +1 -0
  265. package/dist/tools/osint.tool.d.ts +6 -6
  266. package/dist/tools/sandbox-dev.tool.d.ts +15 -0
  267. package/dist/tools/sandbox-dev.tool.d.ts.map +1 -0
  268. package/dist/tools/sandbox-dev.tool.js +146 -0
  269. package/dist/tools/sandbox-dev.tool.js.map +1 -0
  270. package/dist/tools/scratchpad.tool.d.ts +8 -0
  271. package/dist/tools/scratchpad.tool.d.ts.map +1 -1
  272. package/dist/tools/scratchpad.tool.js +40 -1
  273. package/dist/tools/scratchpad.tool.js.map +1 -1
  274. package/dist/tools/setup-assistant.tool.d.ts +1 -1
  275. package/dist/tools/swarm-ops.tool.d.ts +14 -0
  276. package/dist/tools/swarm-ops.tool.d.ts.map +1 -1
  277. package/dist/tools/swarm-ops.tool.js +47 -0
  278. package/dist/tools/swarm-ops.tool.js.map +1 -1
  279. package/dist/tools/sysops.tool.d.ts +157 -0
  280. package/dist/tools/sysops.tool.d.ts.map +1 -0
  281. package/dist/tools/sysops.tool.js +643 -0
  282. package/dist/tools/sysops.tool.js.map +1 -0
  283. package/dist/voice/deepgram.d.ts.map +1 -1
  284. package/dist/voice/deepgram.js +30 -2
  285. package/dist/voice/deepgram.js.map +1 -1
  286. package/package.json +8 -1
  287. package/scripts/release-github.mjs +23 -16
@@ -0,0 +1,85 @@
1
+ # Tier 3 — stargazed-data-driven
2
+
3
+ ## What it tests
4
+
5
+ A purpose-built data-driven fixture that exercises the realistic shape of a
6
+ production Remotion composition without using the runtime adapter from
7
+ PR #214. If a translation passes T3, the skill correctly handles:
8
+
9
+ - A `<Composition>` with a `z.object` schema and typed `defaultProps`
10
+ - Custom React subcomponents reused with different props across scenes
11
+ - A nested data structure (`stats[]`) materialized as repeated HTML with
12
+ per-instance attributes
13
+ - A frame-driven count-up animation (`AnimatedNumber` → GSAP `onUpdate`)
14
+ - Two different `spring` configs translated to two different `back.out` overshoots
15
+ - Per-instance delays via component props (`delayInFrames` → GSAP timeline offsets)
16
+
17
+ ## Composition shape
18
+
19
+ ```
20
+ Stargazed (10 s @ 30 fps, 1280×720)
21
+ ├── Sequence 0–3 s TitleScene
22
+ │ ├── title ← spring scale
23
+ │ └── subtitle ← linear fade
24
+ ├── Sequence 3–7 s StatsScene
25
+ │ ├── StatCard "Stars" 1247 #fbbf24 (delay 0 frames)
26
+ │ ├── StatCard "Forks" 312 #60a5fa (delay 12 frames)
27
+ │ └── StatCard "Issues" 48 #f87171 (delay 24 frames)
28
+ └── Sequence 7–10 s OutroScene
29
+ └── UnderlinedText "thanks for watching" ← scale-in underline
30
+ ```
31
+
32
+ Each `StatCard` is a custom subcomponent that internally uses `AnimatedNumber`
33
+ to count from 0 to the target. `AnimatedNumber` itself derives the displayed
34
+ value from `useCurrentFrame()` + a manual `1 - (1 - t)^3` ease.
35
+
36
+ ## The lossy parts (and why threshold = 0.90)
37
+
38
+ 1. **`spring → back.out(N)`**: two different spring configs in this composition.
39
+ - `{ damping: 12, stiffness: 100, mass: 1 }` (title) → `back.out(1.4)`
40
+ - `{ damping: 14, stiffness: 90, mass: 1 }` (stat card) → `back.out(1.2)`
41
+
42
+ Overshoot ratio (1.4 vs 1.2) approximates the damping difference. The
43
+ late-tail curve of GSAP's back ease and Remotion's spring don't match
44
+ exactly — costs ~0.03 mean SSIM per spring instance.
45
+
46
+ 2. **Count-up easing**: `AnimatedNumber` uses `1 - (1 - t)^3` (cubic ease-out)
47
+ manually computed in the component. GSAP's `power3.out` is the same curve
48
+ shape — should match closely. The displayed integer is rounded each frame
49
+ in both renderers; minor mismatches occur when the rounded value flips
50
+ between two numbers on a sub-frame timing difference.
51
+
52
+ 3. **Font rendering**: same caveat as T1/T2. System Helvetica/Arial fallback
53
+ produces minor anti-aliasing differences between renderers. Affects the
54
+ stat card numbers (large weight 800) most.
55
+
56
+ A mean SSIM below 0.90 in T3 indicates a _structural_ mismatch (wrong scene
57
+ durations, wrong stagger timing, missing prop wiring), not approximation
58
+ drift. That's the failure signal we care about. The calibrated mean against
59
+ Remotion @ 4.0 with PNG/BT.709 output is 0.953.
60
+
61
+ ## Translation walk-through (skill cheat sheet)
62
+
63
+ | Remotion | HyperFrames |
64
+ | --------------------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
65
+ | `<Composition schema={z.object({...})} defaultProps={...} />` | data-\* attributes on root `#stage` div |
66
+ | nested array prop (`stats[]`) | repeated HTML markup with per-instance `data-*` attrs |
67
+ | custom React subcomponent | inline repeated HTML using the component's prop interface as the template |
68
+ | `<AnimatedNumber from={0} to={value} dur={45} />` (cubic ease-out count-up) | tween on `{ v: 0 }` object with `onUpdate` rewriting `textContent`, ease `power3.out` |
69
+ | `spring({damping:12, stiffness:100})` | `back.out(1.4)` over ~0.7 s |
70
+ | `spring({damping:14, stiffness:90})` | `back.out(1.2)` over ~0.7 s |
71
+ | `delayInFrames={i * 12}` (per-instance) | GSAP timeline offset `(i * 0.4)` s |
72
+ | `useVideoConfig()` to get `fps` | dropped — composition fps is in `data-fps` on `#stage` |
73
+
74
+ ## How to render and evaluate
75
+
76
+ ```bash
77
+ # Render Remotion baseline (no setup.sh — no binary assets in this fixture)
78
+ cd remotion-src && npm install && npm run render
79
+
80
+ # Render HyperFrames translation
81
+ cd ../hf-src && npx hyperframes render --output ../hf.mp4
82
+
83
+ # Compare
84
+ ../../../scripts/render_diff.sh ./remotion-src/out/baseline.mp4 ./hf.mp4 ./diff
85
+ ```
@@ -0,0 +1,41 @@
1
+ {
2
+ "tier": 3,
3
+ "name": "stargazed-data-driven",
4
+ "composition_id": "Stargazed",
5
+ "description": "Data-driven 10-second composition with three scenes, custom React subcomponents reused across scenes, a Zod schema with defaultProps, and a count-up number animation. Translates the realistic shape of a production Remotion composition into HF — without using the runtime adapter from PR #214.",
6
+ "duration_seconds": 10,
7
+ "fps": 30,
8
+ "width": 1280,
9
+ "height": 720,
10
+ "ssim_threshold": 0.9,
11
+ "validation": {
12
+ "measured_mean_ssim": 0.953,
13
+ "measured_min_ssim": 0.927,
14
+ "measured_p05_ssim": 0.938,
15
+ "measured_p95_ssim": 0.977,
16
+ "measured_at": "2026-04-27",
17
+ "measured_against": "remotion@4.0 (PNG output, BT.709) vs hyperframes@0.4.15-alpha.1",
18
+ "notes": "Count-up timing in StatsScene shows a few-frame offset between Remotion's manual 1-(1-t)^3 and GSAP's power3.out — both formulas are identical, so the offset comes from sub-frame timing of when the seek + onUpdate fire. Final values converge correctly. Visible only as transient digit mismatches mid-animation; no SSIM impact above the noise floor."
19
+ },
20
+ "remotion_apis_exercised": [
21
+ "Composition with z.object schema and typed defaultProps",
22
+ "Sequence (3 nested with computed offsets)",
23
+ "AbsoluteFill",
24
+ "useCurrentFrame, useVideoConfig",
25
+ "interpolate (single-segment, multi-segment, with extrapolation)",
26
+ "spring (two configs: damping:12 and damping:14)",
27
+ "Custom React subcomponents reused with different props (StatCard ×3)",
28
+ "Custom React utility component (AnimatedNumber for count-up)",
29
+ "Custom React utility component (UnderlinedText)",
30
+ "Per-instance delay via prop (delayInFrames)"
31
+ ],
32
+ "translation_notes": [
33
+ "Zod schema + defaultProps → data-* attributes on the root #stage div. The skill emits one data attribute per scalar prop; nested arrays (stats[]) get materialized as repeated HTML markup with per-instance data attributes (data-stat-index, data-stat-value, --card-color).",
34
+ "Custom React subcomponents inline as repeated HTML divs. The component prop interface becomes the repeated markup template. This is lossy for components with internal state — fine here because StatCard, AnimatedNumber, UnderlinedText all derive from props alone.",
35
+ "AnimatedNumber's frame-driven count-up → a GSAP tween on a { v: 0 } counter object with onUpdate rewriting textContent. GSAP's power3.out is cubic easeOut, matching the Remotion 1-(1-t)^3 manual ease.",
36
+ "Two different springs in this composition: damping:12 → back.out(1.4) (snappy), damping:14 → back.out(1.2) (calmer). The 1.4 vs 1.2 overshoot ratio approximates the damping difference.",
37
+ "Per-instance stagger via delayInFrames prop translates to a GSAP timeline offset of (i * 0.4)s.",
38
+ "Threshold 0.90 reflects: spring → back.out approximation (×2 different configs), the count-up easing curve match (very close but not identical due to sub-frame seek timing), font/AA differences on body text. SSIM well below 0.90 indicates a structural mismatch, not approximation drift."
39
+ ],
40
+ "rationale": "Threshold 0.90 sits ~0.04 below measured p05 (0.938). The wider gap vs T1/T2 reflects T3's bigger approximation budget (2 spring instances + count-up timing + font fallback on multiple text sizes). Mean SSIM below 0.90 = structural mismatch (wrong durations, wrong stagger, missing prop wiring), not approximation drift."
41
+ }
@@ -0,0 +1,269 @@
1
+ <!doctype html>
2
+ <html lang="en">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <title>tier-3-data-driven</title>
6
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/gsap/3.12.5/gsap.min.js"></script>
7
+ <style>
8
+ html,
9
+ body {
10
+ margin: 0;
11
+ padding: 0;
12
+ width: 1280px;
13
+ height: 720px;
14
+ overflow: hidden;
15
+ background: #0a0a0a;
16
+ font-family: Helvetica, Arial, sans-serif;
17
+ color: #ffffff;
18
+ }
19
+ .scene {
20
+ position: absolute;
21
+ inset: 0;
22
+ display: flex;
23
+ align-items: center;
24
+ justify-content: center;
25
+ opacity: 0;
26
+ }
27
+
28
+ /* Scene 1 — Title */
29
+ .scene-1 {
30
+ flex-direction: column;
31
+ }
32
+ .scene-1 .title {
33
+ font-size: 160px;
34
+ font-weight: 900;
35
+ letter-spacing: 0.05em;
36
+ transform: scale(0);
37
+ }
38
+ .scene-1 .subtitle {
39
+ font-size: 36px;
40
+ font-weight: 400;
41
+ color: #9ca3af;
42
+ margin-top: 24px;
43
+ opacity: 0;
44
+ }
45
+
46
+ /* Scene 2 — Stats */
47
+ .scene-2 {
48
+ gap: 48px;
49
+ }
50
+ .stat-card {
51
+ width: 280px;
52
+ height: 220px;
53
+ background: #1a1a1a;
54
+ border-radius: 16px;
55
+ border: 2px solid var(--card-color);
56
+ display: flex;
57
+ flex-direction: column;
58
+ justify-content: center;
59
+ align-items: center;
60
+ opacity: 0;
61
+ transform: scale(0);
62
+ }
63
+ .stat-card .number {
64
+ font-size: 72px;
65
+ font-weight: 800;
66
+ color: var(--card-color);
67
+ line-height: 1;
68
+ }
69
+ .stat-card .label {
70
+ font-size: 24px;
71
+ font-weight: 500;
72
+ color: #9ca3af;
73
+ margin-top: 16px;
74
+ text-transform: uppercase;
75
+ letter-spacing: 0.1em;
76
+ }
77
+
78
+ /* Scene 3 — Outro */
79
+ .scene-3 .outro-wrap {
80
+ position: relative;
81
+ display: inline-block;
82
+ opacity: 0;
83
+ }
84
+ .scene-3 .outro-text {
85
+ font-size: 80px;
86
+ font-weight: 600;
87
+ }
88
+ .scene-3 .outro-underline {
89
+ position: absolute;
90
+ left: 0;
91
+ bottom: -8px;
92
+ width: 100%;
93
+ height: 6px;
94
+ background: #fbbf24;
95
+ border-radius: 3px;
96
+ transform: scaleX(0);
97
+ transform-origin: left center;
98
+ }
99
+ </style>
100
+ </head>
101
+ <body>
102
+ <div
103
+ id="stage"
104
+ data-composition-id="tier-3-data-driven"
105
+ data-start="0"
106
+ data-width="1280"
107
+ data-height="720"
108
+ data-duration="10"
109
+ data-fps="30"
110
+ data-title="STARGAZED"
111
+ data-subtitle="by HeyGen"
112
+ data-outro="thanks for watching"
113
+ >
114
+ <!-- Scene 1: Title -->
115
+ <div
116
+ id="scene-1"
117
+ class="scene scene-1 clip"
118
+ data-start="0"
119
+ data-duration="3"
120
+ data-track-index="0"
121
+ >
122
+ <div class="title">STARGAZED</div>
123
+ <div class="subtitle">by HeyGen</div>
124
+ </div>
125
+
126
+ <!-- Scene 2: Stats — three StatCards as repeated markup with per-instance data attrs -->
127
+ <div
128
+ id="scene-2"
129
+ class="scene scene-2 clip"
130
+ data-start="3"
131
+ data-duration="4"
132
+ data-track-index="0"
133
+ >
134
+ <div
135
+ class="stat-card"
136
+ data-stat-index="0"
137
+ data-stat-value="1247"
138
+ style="--card-color: #fbbf24"
139
+ >
140
+ <div class="number">0</div>
141
+ <div class="label">Stars</div>
142
+ </div>
143
+ <div
144
+ class="stat-card"
145
+ data-stat-index="1"
146
+ data-stat-value="312"
147
+ style="--card-color: #60a5fa"
148
+ >
149
+ <div class="number">0</div>
150
+ <div class="label">Forks</div>
151
+ </div>
152
+ <div
153
+ class="stat-card"
154
+ data-stat-index="2"
155
+ data-stat-value="48"
156
+ style="--card-color: #f87171"
157
+ >
158
+ <div class="number">0</div>
159
+ <div class="label">Issues</div>
160
+ </div>
161
+ </div>
162
+
163
+ <!-- Scene 3: Outro -->
164
+ <div
165
+ id="scene-3"
166
+ class="scene scene-3 clip"
167
+ data-start="7"
168
+ data-duration="3"
169
+ data-track-index="0"
170
+ >
171
+ <div class="outro-wrap">
172
+ <div class="outro-text">thanks for watching</div>
173
+ <div class="outro-underline"></div>
174
+ </div>
175
+ </div>
176
+
177
+ <script>
178
+ // ────────────────────────────────────────────────────────────────────
179
+ // Translation of Stargazed.tsx
180
+ //
181
+ // Remotion structure:
182
+ // <Composition schema={zod} defaultProps={...} fps=30 dur=300>
183
+ // <Sequence 0..90> <TitleScene title subtitle />
184
+ // <Sequence 90..210> <StatsScene stats />
185
+ // <Sequence 210..300><OutroScene text />
186
+ //
187
+ // HF structure:
188
+ // - root #stage carries data-* with the same props (title, subtitle, outro)
189
+ // - 3 scene divs with data-start/data-duration in seconds (frames/fps)
190
+ // - Custom React subcomponents inline as repeated HTML; their per-instance
191
+ // props become data-* attributes on the markup
192
+ // - Animation lives in a single paused GSAP timeline keyed by composition seconds
193
+ //
194
+ // Frame → time:
195
+ // Sequence(0,90) → 0s..3s (title)
196
+ // Sequence(90,210) → 3s..7s (stats; 4s window)
197
+ // Sequence(210,300) → 7s..10s (outro)
198
+ // Stagger(i*12) → i*0.4s (12 frames at 30fps)
199
+ // ────────────────────────────────────────────────────────────────────
200
+
201
+ const tl = gsap.timeline({ paused: true });
202
+
203
+ // ─── Scene 1: Title ─────────────────────────────────────────────────
204
+ const scene1 = document.querySelector("#scene-1");
205
+ const title = scene1.querySelector(".title");
206
+ const subtitle = scene1.querySelector(".subtitle");
207
+
208
+ tl.set(scene1, { opacity: 1 }, 0);
209
+ // spring({damping:12, stiffness:100, mass:1}) → back.out(1.4) ~0.7s
210
+ tl.to(title, { scale: 1, duration: 0.7, ease: "back.out(1.4)" }, 0);
211
+ // interpolate(frame, [20,40], [0,1]) at fps=30 → 0.667s..1.333s linear
212
+ tl.fromTo(subtitle, { opacity: 0 }, { opacity: 1, duration: 0.667, ease: "none" }, 0.667);
213
+ tl.set(scene1, { opacity: 0 }, 3);
214
+
215
+ // ─── Scene 2: Stats ─────────────────────────────────────────────────
216
+ const scene2 = document.querySelector("#scene-2");
217
+ const cards = scene2.querySelectorAll(".stat-card");
218
+
219
+ tl.set(scene2, { opacity: 1 }, 3);
220
+
221
+ cards.forEach((card, i) => {
222
+ const stagger = i * 0.4; // i * 12 frames at 30 fps
223
+ const start = 3 + stagger;
224
+ const value = Number(card.dataset.statValue);
225
+ const numberEl = card.querySelector(".number");
226
+
227
+ // StatCard entrance:
228
+ // spring({damping:14, stiffness:90, mass:1}) → back.out(1.2) ~0.7s
229
+ // interpolate(local, [0,12], [0,1]) → 0s..0.4s linear opacity
230
+ tl.to(card, { scale: 1, duration: 0.7, ease: "back.out(1.2)" }, start);
231
+ tl.to(card, { opacity: 1, duration: 0.4, ease: "none" }, start);
232
+
233
+ // AnimatedNumber: count from 0 → value with easeOutCubic over 45 frames (1.5s).
234
+ // GSAP equivalent: a tween on a counter object with onUpdate rewriting textContent.
235
+ // power3.out is GSAP's name for cubic easeOut.
236
+ const counter = { v: 0 };
237
+ tl.to(
238
+ counter,
239
+ {
240
+ v: value,
241
+ duration: 1.5,
242
+ ease: "power3.out",
243
+ onUpdate: () => {
244
+ numberEl.textContent = Math.round(counter.v).toLocaleString();
245
+ },
246
+ },
247
+ start,
248
+ );
249
+ });
250
+
251
+ tl.set(scene2, { opacity: 0 }, 7);
252
+
253
+ // ─── Scene 3: Outro ─────────────────────────────────────────────────
254
+ const scene3 = document.querySelector("#scene-3");
255
+ const outroWrap = scene3.querySelector(".outro-wrap");
256
+ const underline = scene3.querySelector(".outro-underline");
257
+
258
+ tl.set(scene3, { opacity: 1 }, 7);
259
+ // interpolate(frame, [0,12], [0,1]) → 0s..0.4s linear opacity
260
+ tl.to(outroWrap, { opacity: 1, duration: 0.4, ease: "none" }, 7);
261
+ // interpolate(frame, [10,40], [0,1]) for underline → starts at 7+0.333s, dur 1s
262
+ tl.to(underline, { scaleX: 1, duration: 1.0, ease: "none" }, 7.333);
263
+
264
+ window.__timelines = window.__timelines || {};
265
+ window.__timelines["tier-3-data-driven"] = tl;
266
+ </script>
267
+ </div>
268
+ </body>
269
+ </html>
@@ -0,0 +1,15 @@
1
+ {
2
+ "name": "tier-3-data-driven-remotion",
3
+ "version": "0.0.0",
4
+ "private": true,
5
+ "scripts": {
6
+ "render": "remotion render Stargazed out/baseline.mp4"
7
+ },
8
+ "dependencies": {
9
+ "@remotion/cli": "^4.0.0",
10
+ "react": "^18.3.1",
11
+ "react-dom": "^18.3.1",
12
+ "remotion": "^4.0.0",
13
+ "zod": "^3.22.0"
14
+ }
15
+ }
@@ -0,0 +1,13 @@
1
+ import { Config } from "@remotion/cli/config";
2
+
3
+ // Match HyperFrames' default render so SSIM diffs measure translation
4
+ // fidelity, not encoder differences.
5
+ //
6
+ // setVideoImageFormat("png") avoids the JPEG limited-range/full-range
7
+ // colorspace flag (yuvj420p vs yuv420p) that otherwise costs ~0.05 SSIM.
8
+ //
9
+ // setColorSpace("bt709") matches HF's BT.709 SDR output.
10
+ Config.setVideoImageFormat("png");
11
+ Config.setColorSpace("bt709");
12
+ Config.setOverwriteOutput(true);
13
+ Config.setConcurrency(1);
@@ -0,0 +1,27 @@
1
+ import { Composition } from "remotion";
2
+ import { z } from "zod";
3
+ import { Stargazed, stargazedSchema } from "./Stargazed";
4
+
5
+ const defaultProps: z.infer<typeof stargazedSchema> = {
6
+ title: "STARGAZED",
7
+ subtitle: "by HeyGen",
8
+ stats: [
9
+ { label: "Stars", value: 1247, color: "#fbbf24" },
10
+ { label: "Forks", value: 312, color: "#60a5fa" },
11
+ { label: "Issues", value: 48, color: "#f87171" },
12
+ ],
13
+ outro: "thanks for watching",
14
+ };
15
+
16
+ export const RemotionRoot = () => (
17
+ <Composition
18
+ id="Stargazed"
19
+ component={Stargazed}
20
+ schema={stargazedSchema}
21
+ durationInFrames={300}
22
+ fps={30}
23
+ width={1280}
24
+ height={720}
25
+ defaultProps={defaultProps}
26
+ />
27
+ );
@@ -0,0 +1,37 @@
1
+ import { AbsoluteFill, Sequence } from "remotion";
2
+ import { z } from "zod";
3
+ import { TitleScene } from "./scenes/TitleScene";
4
+ import { StatsScene } from "./scenes/StatsScene";
5
+ import { OutroScene } from "./scenes/OutroScene";
6
+
7
+ export const stargazedSchema = z.object({
8
+ title: z.string(),
9
+ subtitle: z.string(),
10
+ stats: z.array(
11
+ z.object({
12
+ label: z.string(),
13
+ value: z.number(),
14
+ color: z.string(),
15
+ }),
16
+ ),
17
+ outro: z.string(),
18
+ });
19
+
20
+ export const Stargazed: React.FC<z.infer<typeof stargazedSchema>> = ({
21
+ title,
22
+ subtitle,
23
+ stats,
24
+ outro,
25
+ }) => (
26
+ <AbsoluteFill style={{ backgroundColor: "#0a0a0a" }}>
27
+ <Sequence from={0} durationInFrames={90}>
28
+ <TitleScene title={title} subtitle={subtitle} />
29
+ </Sequence>
30
+ <Sequence from={90} durationInFrames={120}>
31
+ <StatsScene stats={stats} />
32
+ </Sequence>
33
+ <Sequence from={210} durationInFrames={90}>
34
+ <OutroScene text={outro} />
35
+ </Sequence>
36
+ </AbsoluteFill>
37
+ );
@@ -0,0 +1,23 @@
1
+ import { interpolate, useCurrentFrame } from "remotion";
2
+
3
+ interface Props {
4
+ from: number;
5
+ to: number;
6
+ durationInFrames: number;
7
+ }
8
+
9
+ /**
10
+ * Counts from `from` to `to` over `durationInFrames` with easeOut.
11
+ * Driven entirely by useCurrentFrame — deterministic.
12
+ */
13
+ export const AnimatedNumber: React.FC<Props> = ({ from, to, durationInFrames }) => {
14
+ const frame = useCurrentFrame();
15
+ const t = interpolate(frame, [0, durationInFrames], [0, 1], {
16
+ extrapolateLeft: "clamp",
17
+ extrapolateRight: "clamp",
18
+ });
19
+ // Ease-out cubic — fast start, slow finish, matches the ramp on data dashboards.
20
+ const eased = 1 - (1 - t) ** 3;
21
+ const value = Math.round(from + (to - from) * eased);
22
+ return <>{value.toLocaleString()}</>;
23
+ };
@@ -0,0 +1,59 @@
1
+ import { interpolate, spring, useCurrentFrame, useVideoConfig } from "remotion";
2
+ import { AnimatedNumber } from "./AnimatedNumber";
3
+
4
+ interface Props {
5
+ label: string;
6
+ value: number;
7
+ color: string;
8
+ delayInFrames: number;
9
+ }
10
+
11
+ export const StatCard: React.FC<Props> = ({ label, value, color, delayInFrames }) => {
12
+ const frame = useCurrentFrame();
13
+ const { fps } = useVideoConfig();
14
+ const local = frame - delayInFrames;
15
+
16
+ const scale = spring({
17
+ frame: local,
18
+ fps,
19
+ config: { damping: 14, stiffness: 90, mass: 1 },
20
+ });
21
+ const opacity = interpolate(local, [0, 12], [0, 1], {
22
+ extrapolateLeft: "clamp",
23
+ extrapolateRight: "clamp",
24
+ });
25
+
26
+ return (
27
+ <div
28
+ style={{
29
+ width: 280,
30
+ height: 220,
31
+ background: "#1a1a1a",
32
+ borderRadius: 16,
33
+ border: `2px solid ${color}`,
34
+ display: "flex",
35
+ flexDirection: "column",
36
+ justifyContent: "center",
37
+ alignItems: "center",
38
+ opacity,
39
+ transform: `scale(${scale})`,
40
+ }}
41
+ >
42
+ <div style={{ fontSize: 72, fontWeight: 800, color, lineHeight: 1 }}>
43
+ {local >= 0 ? <AnimatedNumber from={0} to={value} durationInFrames={45} /> : 0}
44
+ </div>
45
+ <div
46
+ style={{
47
+ fontSize: 24,
48
+ fontWeight: 500,
49
+ color: "#9ca3af",
50
+ marginTop: 16,
51
+ textTransform: "uppercase",
52
+ letterSpacing: "0.1em",
53
+ }}
54
+ >
55
+ {label}
56
+ </div>
57
+ </div>
58
+ );
59
+ };
@@ -0,0 +1,47 @@
1
+ import { interpolate, useCurrentFrame } from "remotion";
2
+
3
+ interface Props {
4
+ text: string;
5
+ color: string;
6
+ }
7
+
8
+ export const UnderlinedText: React.FC<Props> = ({ text, color }) => {
9
+ const frame = useCurrentFrame();
10
+ // Underline scales from left over 0-30 frames.
11
+ const underlineScaleX = interpolate(frame, [10, 40], [0, 1], {
12
+ extrapolateLeft: "clamp",
13
+ extrapolateRight: "clamp",
14
+ });
15
+ const opacity = interpolate(frame, [0, 12], [0, 1], {
16
+ extrapolateLeft: "clamp",
17
+ extrapolateRight: "clamp",
18
+ });
19
+
20
+ return (
21
+ <div style={{ position: "relative", display: "inline-block", opacity }}>
22
+ <div
23
+ style={{
24
+ fontSize: 80,
25
+ fontWeight: 600,
26
+ color: "#ffffff",
27
+ fontFamily: "Helvetica, Arial, sans-serif",
28
+ }}
29
+ >
30
+ {text}
31
+ </div>
32
+ <div
33
+ style={{
34
+ position: "absolute",
35
+ left: 0,
36
+ bottom: -8,
37
+ width: "100%",
38
+ height: 6,
39
+ background: color,
40
+ transform: `scaleX(${underlineScaleX})`,
41
+ transformOrigin: "left center",
42
+ borderRadius: 3,
43
+ }}
44
+ />
45
+ </div>
46
+ );
47
+ };
@@ -0,0 +1,4 @@
1
+ import { registerRoot } from "remotion";
2
+ import { RemotionRoot } from "./Root";
3
+
4
+ registerRoot(RemotionRoot);
@@ -0,0 +1,18 @@
1
+ import { AbsoluteFill } from "remotion";
2
+ import { UnderlinedText } from "../components/UnderlinedText";
3
+
4
+ interface Props {
5
+ text: string;
6
+ }
7
+
8
+ export const OutroScene: React.FC<Props> = ({ text }) => (
9
+ <AbsoluteFill
10
+ style={{
11
+ justifyContent: "center",
12
+ alignItems: "center",
13
+ fontFamily: "Helvetica, Arial, sans-serif",
14
+ }}
15
+ >
16
+ <UnderlinedText text={text} color="#fbbf24" />
17
+ </AbsoluteFill>
18
+ );