dsh-remotion 0.2.0 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.en.md +7 -5
- package/README.md +3 -3
- package/lib/index.d.ts +2 -2
- package/lib/index.js +15 -2
- package/package.json +1 -1
- package/skills/remotion-best-practices/SKILL.md +59 -0
- package/skills/remotion-best-practices/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-captions/SKILL.md +36 -0
- package/skills/remotion-best-practices/remotion-captions/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-captions/assets/remotion-icon.png +0 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-captions}/display-captions.md +9 -3
- package/skills/{remotion/rules → remotion-best-practices/remotion-captions}/import-srt-captions.md +5 -1
- package/skills/remotion-best-practices/remotion-create/SKILL.md +68 -0
- package/skills/remotion-best-practices/remotion-create/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-create/assets/remotion-icon.png +0 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-create}/tailwind.md +1 -1
- package/skills/remotion-best-practices/remotion-create/video-layout.md +9 -0
- package/skills/remotion-best-practices/remotion-docs/SKILL.md +46 -0
- package/skills/remotion-best-practices/remotion-docs/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-docs/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-interactivity/SKILL.md +247 -0
- package/skills/remotion-best-practices/remotion-interactivity/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-interactivity/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-maps/SKILL.md +36 -0
- package/skills/remotion-best-practices/remotion-maps/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-maps/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/TECHNIQUE.md +89 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx +284 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/assets/cesium-path.json +299 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/assets/city-path.json +12 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/assets/example-Root.tsx +39 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/assets/flight-path.ts +35 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/assets/sample-river.geojson +215 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-data-sources.md +43 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md +128 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/references/3d-troubleshooting.md +57 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs +161 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/mapbox/TECHNIQUE.md +449 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/mapbox/references/render-stability.md +64 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maplibre/TECHNIQUE.md +465 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maplibre/references/render-stability.md +64 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/TECHNIQUE.md +80 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx +70 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts +80 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx +363 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/assets/example-Root.tsx +22 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json +7535 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json +605 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/assets/tokens.ts +34 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-data-sources.md +91 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md +129 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/references/map-geo-prep.md +85 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/references/render-stability.md +64 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs +202 -0
- package/skills/remotion-best-practices/remotion-maps/techniques/static-map/TECHNIQUE.md +37 -0
- package/skills/remotion-best-practices/remotion-markup/SKILL.md +365 -0
- package/skills/remotion-best-practices/remotion-markup/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-markup/assets/remotion-icon.png +0 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/audio.md +4 -2
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/calculate-metadata.md +4 -2
- package/skills/remotion-best-practices/remotion-markup/compositions.md +117 -0
- package/skills/remotion-best-practices/remotion-markup/cropping.md +34 -0
- package/skills/remotion-best-practices/remotion-markup/effects.md +251 -0
- package/skills/{remotion/rules/videos.md → remotion-best-practices/remotion-markup/embedding-videos.md} +6 -4
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/ffmpeg.md +5 -1
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/gifs.md +55 -9
- package/skills/remotion-best-practices/remotion-markup/google-fonts.md +76 -0
- package/skills/remotion-best-practices/remotion-markup/html-in-canvas.md +128 -0
- package/skills/remotion-best-practices/remotion-markup/images.md +73 -0
- package/skills/remotion-best-practices/remotion-markup/light-leaks.md +106 -0
- package/skills/remotion-best-practices/remotion-markup/local-fonts.md +69 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/lottie.md +4 -1
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/measuring-dom-nodes.md +5 -1
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/measuring-text.md +8 -2
- package/skills/remotion-best-practices/remotion-markup/multi-scene-video.md +81 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/parameters.md +3 -1
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/SKILL.md +36 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/TECHNIQUE.md +89 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx +284 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/cesium-path.json +299 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/city-path.json +12 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/example-Root.tsx +39 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/flight-path.ts +35 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/assets/sample-river.geojson +215 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-data-sources.md +43 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md +128 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/references/3d-troubleshooting.md +57 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs +161 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/mapbox/TECHNIQUE.md +449 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/mapbox/references/render-stability.md +64 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/TECHNIQUE.md +465 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maplibre/references/render-stability.md +64 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/TECHNIQUE.md +80 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx +70 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts +80 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx +363 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/example-Root.tsx +22 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json +7535 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json +605 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/assets/tokens.ts +34 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-data-sources.md +91 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md +129 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/map-geo-prep.md +85 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/references/render-stability.md +64 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs +202 -0
- package/skills/remotion-best-practices/remotion-markup/remotion-maps/techniques/static-map/TECHNIQUE.md +37 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/sequencing.md +63 -12
- package/skills/remotion-best-practices/remotion-markup/sfx.md +51 -0
- package/skills/remotion-best-practices/remotion-markup/text-highlights.md +56 -0
- package/skills/remotion-best-practices/remotion-markup/timing.md +111 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/transitions.md +49 -7
- package/skills/remotion-best-practices/remotion-markup/video-editing.md +90 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/voiceover.md +2 -2
- package/skills/remotion-best-practices/remotion-multimedia/SKILL.md +20 -0
- package/skills/remotion-best-practices/remotion-multimedia/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-multimedia/assets/remotion-icon.png +0 -0
- package/skills/{remotion/rules → remotion-best-practices/remotion-multimedia}/get-audio-duration.md +1 -3
- package/skills/{remotion/rules → remotion-best-practices/remotion-multimedia}/get-video-dimensions.md +1 -3
- package/skills/{remotion/rules → remotion-best-practices/remotion-multimedia}/get-video-duration.md +1 -3
- package/skills/remotion-best-practices/remotion-render/SKILL.md +27 -0
- package/skills/remotion-best-practices/remotion-render/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-render/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-saas/SKILL.md +33 -0
- package/skills/remotion-best-practices/remotion-saas/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-saas/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-saas/framework.md +21 -0
- package/skills/remotion-best-practices/remotion-saas/player.md +33 -0
- package/skills/remotion-best-practices/remotion-saas/rendering.md +69 -0
- package/skills/remotion-best-practices/remotion-studio/SKILL.md +24 -0
- package/skills/remotion-best-practices/remotion-studio/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-studio/assets/remotion-icon.png +0 -0
- package/skills/remotion-best-practices/remotion-upgrade/SKILL.md +31 -0
- package/skills/remotion-best-practices/remotion-upgrade/agents/openai.yaml +7 -0
- package/skills/remotion-best-practices/remotion-upgrade/assets/remotion-icon.png +0 -0
- package/skills/remotion-captions/SKILL.md +36 -0
- package/skills/remotion-captions/agents/openai.yaml +7 -0
- package/skills/remotion-captions/assets/remotion-icon.png +0 -0
- package/skills/remotion-captions/display-captions.md +190 -0
- package/skills/remotion-captions/import-srt-captions.md +73 -0
- package/skills/remotion-captions/transcribe-captions.md +70 -0
- package/skills/remotion-create/SKILL.md +68 -0
- package/skills/remotion-create/agents/openai.yaml +7 -0
- package/skills/remotion-create/assets/remotion-icon.png +0 -0
- package/skills/remotion-create/tailwind.md +11 -0
- package/skills/remotion-create/video-layout.md +9 -0
- package/skills/remotion-docs/SKILL.md +46 -0
- package/skills/remotion-docs/agents/openai.yaml +7 -0
- package/skills/remotion-docs/assets/remotion-icon.png +0 -0
- package/skills/remotion-interactivity/SKILL.md +247 -0
- package/skills/remotion-interactivity/agents/openai.yaml +7 -0
- package/skills/remotion-interactivity/assets/remotion-icon.png +0 -0
- package/skills/remotion-maps/SKILL.md +36 -0
- package/skills/remotion-maps/agents/openai.yaml +7 -0
- package/skills/remotion-maps/assets/remotion-icon.png +0 -0
- package/skills/remotion-maps/techniques/cesium/TECHNIQUE.md +89 -0
- package/skills/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx +284 -0
- package/skills/remotion-maps/techniques/cesium/assets/cesium-path.json +299 -0
- package/skills/remotion-maps/techniques/cesium/assets/city-path.json +12 -0
- package/skills/remotion-maps/techniques/cesium/assets/example-Root.tsx +39 -0
- package/skills/remotion-maps/techniques/cesium/assets/flight-path.ts +35 -0
- package/skills/remotion-maps/techniques/cesium/assets/sample-river.geojson +215 -0
- package/skills/remotion-maps/techniques/cesium/references/3d-data-sources.md +43 -0
- package/skills/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md +128 -0
- package/skills/remotion-maps/techniques/cesium/references/3d-troubleshooting.md +57 -0
- package/skills/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs +161 -0
- package/skills/remotion-maps/techniques/mapbox/TECHNIQUE.md +449 -0
- package/skills/remotion-maps/techniques/mapbox/references/render-stability.md +64 -0
- package/skills/remotion-maps/techniques/maplibre/TECHNIQUE.md +465 -0
- package/skills/remotion-maps/techniques/maplibre/references/render-stability.md +64 -0
- package/skills/remotion-maps/techniques/maptiler/TECHNIQUE.md +80 -0
- package/skills/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx +70 -0
- package/skills/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts +80 -0
- package/skills/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx +363 -0
- package/skills/remotion-maps/techniques/maptiler/assets/example-Root.tsx +22 -0
- package/skills/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json +7535 -0
- package/skills/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json +605 -0
- package/skills/remotion-maps/techniques/maptiler/assets/tokens.ts +34 -0
- package/skills/remotion-maps/techniques/maptiler/references/map-data-sources.md +91 -0
- package/skills/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md +129 -0
- package/skills/remotion-maps/techniques/maptiler/references/map-geo-prep.md +85 -0
- package/skills/remotion-maps/techniques/maptiler/references/render-stability.md +64 -0
- package/skills/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs +202 -0
- package/skills/remotion-maps/techniques/static-map/TECHNIQUE.md +37 -0
- package/skills/remotion-markup/3d.md +86 -0
- package/skills/remotion-markup/SKILL.md +365 -0
- package/skills/remotion-markup/agents/openai.yaml +7 -0
- package/skills/remotion-markup/assets/remotion-icon.png +0 -0
- package/skills/remotion-markup/audio-visualization.md +198 -0
- package/skills/remotion-markup/audio.md +171 -0
- package/skills/remotion-markup/calculate-metadata.md +136 -0
- package/skills/remotion-markup/compositions.md +117 -0
- package/skills/remotion-markup/cropping.md +34 -0
- package/skills/remotion-markup/effects.md +251 -0
- package/skills/remotion-markup/embedding-videos.md +173 -0
- package/skills/remotion-markup/ffmpeg.md +38 -0
- package/skills/remotion-markup/gifs.md +187 -0
- package/skills/remotion-markup/google-fonts.md +76 -0
- package/skills/remotion-markup/html-in-canvas.md +128 -0
- package/skills/remotion-markup/images.md +73 -0
- package/skills/remotion-markup/light-leaks.md +106 -0
- package/skills/remotion-markup/local-fonts.md +69 -0
- package/skills/remotion-markup/lottie.md +73 -0
- package/skills/remotion-markup/measuring-dom-nodes.md +38 -0
- package/skills/remotion-markup/measuring-text.md +146 -0
- package/skills/remotion-markup/multi-scene-video.md +81 -0
- package/skills/remotion-markup/parameters.md +111 -0
- package/skills/remotion-markup/remotion-maps/SKILL.md +36 -0
- package/skills/remotion-markup/remotion-maps/agents/openai.yaml +7 -0
- package/skills/remotion-markup/remotion-maps/assets/remotion-icon.png +0 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/TECHNIQUE.md +89 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/assets/CesiumFlythrough.tsx +284 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/assets/cesium-path.json +299 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/assets/city-path.json +12 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/assets/example-Root.tsx +39 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/assets/flight-path.ts +35 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/assets/sample-river.geojson +215 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/references/3d-data-sources.md +43 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/references/3d-flyover-architecture.md +128 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/references/3d-troubleshooting.md +57 -0
- package/skills/remotion-markup/remotion-maps/techniques/cesium/scripts/prep-cesium-path.mjs +161 -0
- package/skills/remotion-markup/remotion-maps/techniques/mapbox/TECHNIQUE.md +449 -0
- package/skills/remotion-markup/remotion-maps/techniques/mapbox/references/render-stability.md +64 -0
- package/skills/remotion-markup/remotion-maps/techniques/maplibre/TECHNIQUE.md +465 -0
- package/skills/remotion-markup/remotion-maps/techniques/maplibre/references/render-stability.md +64 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/TECHNIQUE.md +80 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/assets/CountryLabel.tsx +70 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/assets/MapTilerVectorElement.ts +80 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/assets/RiverReveal.tsx +363 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/assets/example-Root.tsx +22 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/country-meta.json +7535 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/assets/sample-data/yarlung-flow.json +605 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/assets/tokens.ts +34 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/references/map-data-sources.md +91 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/references/map-explainer-architecture.md +129 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/references/map-geo-prep.md +85 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/references/render-stability.md +64 -0
- package/skills/remotion-markup/remotion-maps/techniques/maptiler/scripts/prep-geo.mjs +202 -0
- package/skills/remotion-markup/remotion-maps/techniques/static-map/TECHNIQUE.md +37 -0
- package/skills/remotion-markup/sequencing.md +169 -0
- package/skills/remotion-markup/sfx.md +51 -0
- package/skills/remotion-markup/silence-detection.md +71 -0
- package/skills/remotion-markup/text-highlights.md +56 -0
- package/skills/remotion-markup/timing.md +111 -0
- package/skills/remotion-markup/transitions.md +239 -0
- package/skills/remotion-markup/video-editing.md +90 -0
- package/skills/remotion-markup/voiceover.md +99 -0
- package/skills/remotion-multimedia/SKILL.md +20 -0
- package/skills/remotion-multimedia/agents/openai.yaml +7 -0
- package/skills/remotion-multimedia/assets/remotion-icon.png +0 -0
- package/skills/remotion-multimedia/get-audio-duration.md +56 -0
- package/skills/remotion-multimedia/get-video-dimensions.md +66 -0
- package/skills/remotion-multimedia/get-video-duration.md +58 -0
- package/skills/remotion-render/SKILL.md +27 -0
- package/skills/remotion-render/agents/openai.yaml +7 -0
- package/skills/remotion-render/assets/remotion-icon.png +0 -0
- package/skills/remotion-render/transparent-videos.md +106 -0
- package/skills/remotion-saas/SKILL.md +33 -0
- package/skills/remotion-saas/agents/openai.yaml +7 -0
- package/skills/remotion-saas/assets/remotion-icon.png +0 -0
- package/skills/remotion-saas/framework.md +21 -0
- package/skills/remotion-saas/player.md +33 -0
- package/skills/remotion-saas/rendering.md +69 -0
- package/skills/remotion-studio/SKILL.md +24 -0
- package/skills/remotion-studio/agents/openai.yaml +7 -0
- package/skills/remotion-studio/assets/remotion-icon.png +0 -0
- package/skills/remotion-upgrade/SKILL.md +31 -0
- package/skills/remotion-upgrade/agents/openai.yaml +7 -0
- package/skills/remotion-upgrade/assets/remotion-icon.png +0 -0
- package/skills/remotion/SKILL.md +0 -95
- package/skills/remotion/rules/animations.md +0 -31
- package/skills/remotion/rules/assets.md +0 -78
- package/skills/remotion/rules/can-decode.md +0 -81
- package/skills/remotion/rules/charts.md +0 -120
- package/skills/remotion/rules/compositions.md +0 -154
- package/skills/remotion/rules/extract-frames.md +0 -229
- package/skills/remotion/rules/fonts.md +0 -152
- package/skills/remotion/rules/images.md +0 -134
- package/skills/remotion/rules/light-leaks.md +0 -73
- package/skills/remotion/rules/maps.md +0 -412
- package/skills/remotion/rules/sfx.md +0 -30
- package/skills/remotion/rules/subtitles.md +0 -36
- package/skills/remotion/rules/text-animations.md +0 -20
- package/skills/remotion/rules/timing.md +0 -136
- package/skills/remotion/rules/trimming.md +0 -51
- /package/skills/{remotion/rules → remotion-best-practices/remotion-captions}/transcribe-captions.md +0 -0
- /package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/3d.md +0 -0
- /package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/audio-visualization.md +0 -0
- /package/skills/{remotion/rules → remotion-best-practices/remotion-markup}/silence-detection.md +0 -0
- /package/skills/{remotion/rules → remotion-best-practices/remotion-render}/transparent-videos.md +0 -0
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: embedding-videos
|
|
3
|
+
description: Embedding videos in Remotion - trimming, volume, speed, looping, pitch
|
|
4
|
+
metadata:
|
|
5
|
+
tags: video, media, trim, volume, speed, loop, pitch
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Using videos in Remotion
|
|
9
|
+
|
|
10
|
+
## Prerequisites
|
|
11
|
+
|
|
12
|
+
First, the @remotion/media package needs to be installed.
|
|
13
|
+
If it is not, use the following command:
|
|
14
|
+
|
|
15
|
+
```bash
|
|
16
|
+
npx remotion add @remotion/media # If project uses npm
|
|
17
|
+
bunx remotion add @remotion/media # If project uses bun
|
|
18
|
+
yarn remotion add @remotion/media # If project uses yarn
|
|
19
|
+
pnpm exec remotion add @remotion/media # If project uses pnpm
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Use `<Video>` from `@remotion/media` to embed videos into your composition.
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import { Video } from "@remotion/media";
|
|
26
|
+
import { staticFile } from "remotion";
|
|
27
|
+
|
|
28
|
+
export const MyComposition = () => {
|
|
29
|
+
return <Video src={staticFile("video.mp4")} />;
|
|
30
|
+
};
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
Remote URLs are also supported:
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
<Video src="https://remotion.media/video.mp4" />
|
|
37
|
+
```
|
|
38
|
+
|
|
39
|
+
## Trimming
|
|
40
|
+
|
|
41
|
+
Use `trimBefore` and `trimAfter` to remove portions of the video. Values are in seconds.
|
|
42
|
+
|
|
43
|
+
```tsx
|
|
44
|
+
const { fps } = useVideoConfig();
|
|
45
|
+
|
|
46
|
+
return (
|
|
47
|
+
<Video
|
|
48
|
+
src={staticFile("video.mp4")}
|
|
49
|
+
trimBefore={2 * fps} // Skip the first 2 seconds
|
|
50
|
+
trimAfter={10 * fps} // End at the 10 second mark
|
|
51
|
+
/>
|
|
52
|
+
);
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
## Delaying
|
|
56
|
+
|
|
57
|
+
Wrap the video in a `<Sequence>` to delay when it appears:
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
import { Sequence, staticFile } from "remotion";
|
|
61
|
+
import { Video } from "@remotion/media";
|
|
62
|
+
|
|
63
|
+
const { fps } = useVideoConfig();
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<Sequence from={1 * fps}>
|
|
67
|
+
<Video src={staticFile("video.mp4")} />
|
|
68
|
+
</Sequence>
|
|
69
|
+
);
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
The video will appear after 1 second.
|
|
73
|
+
|
|
74
|
+
## Sizing and Position
|
|
75
|
+
|
|
76
|
+
Use the `style` prop to control size and position:
|
|
77
|
+
|
|
78
|
+
```tsx
|
|
79
|
+
<Video
|
|
80
|
+
src={staticFile("video.mp4")}
|
|
81
|
+
style={{
|
|
82
|
+
width: 500,
|
|
83
|
+
height: 300,
|
|
84
|
+
position: "absolute",
|
|
85
|
+
top: 100,
|
|
86
|
+
left: 50,
|
|
87
|
+
}}
|
|
88
|
+
objectFit="cover"
|
|
89
|
+
/>
|
|
90
|
+
```
|
|
91
|
+
|
|
92
|
+
## Volume
|
|
93
|
+
|
|
94
|
+
Set a static volume (0 to 1):
|
|
95
|
+
|
|
96
|
+
```tsx
|
|
97
|
+
<Video src={staticFile("video.mp4")} volume={0.5} />
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
Or use a callback for dynamic volume based on the current frame:
|
|
101
|
+
|
|
102
|
+
```tsx
|
|
103
|
+
import { interpolate } from "remotion";
|
|
104
|
+
|
|
105
|
+
const { fps } = useVideoConfig();
|
|
106
|
+
|
|
107
|
+
return (
|
|
108
|
+
<Video
|
|
109
|
+
src={staticFile("video.mp4")}
|
|
110
|
+
volume={(f) =>
|
|
111
|
+
interpolate(f, [0, 1 * fps], [0, 1], { extrapolateRight: "clamp" })
|
|
112
|
+
}
|
|
113
|
+
/>
|
|
114
|
+
);
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
Use `muted` to silence the video entirely:
|
|
118
|
+
|
|
119
|
+
```tsx
|
|
120
|
+
<Video src={staticFile("video.mp4")} muted />
|
|
121
|
+
```
|
|
122
|
+
|
|
123
|
+
## Speed
|
|
124
|
+
|
|
125
|
+
Use `playbackRate` to change the playback speed:
|
|
126
|
+
|
|
127
|
+
```tsx
|
|
128
|
+
// 2x speed
|
|
129
|
+
<Video src={staticFile("video.mp4")} playbackRate={2} />
|
|
130
|
+
// Half speed
|
|
131
|
+
<Video src={staticFile("video.mp4")} playbackRate={0.5} />
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
Reverse playback is not supported.
|
|
135
|
+
|
|
136
|
+
## Looping
|
|
137
|
+
|
|
138
|
+
Use `loop` to loop the video indefinitely:
|
|
139
|
+
|
|
140
|
+
```tsx
|
|
141
|
+
<Video src={staticFile("video.mp4")} loop />
|
|
142
|
+
```
|
|
143
|
+
|
|
144
|
+
Use `loopVolumeCurveBehavior` to control how the frame count behaves when looping:
|
|
145
|
+
|
|
146
|
+
- `"repeat"`: Frame count resets to 0 each loop (for `volume` callback)
|
|
147
|
+
- `"extend"`: Frame count continues incrementing
|
|
148
|
+
|
|
149
|
+
```tsx
|
|
150
|
+
<Video
|
|
151
|
+
src={staticFile("video.mp4")}
|
|
152
|
+
loop
|
|
153
|
+
loopVolumeCurveBehavior="extend"
|
|
154
|
+
volume={(f) => interpolate(f, [0, 300], [1, 0])} // Fade out over multiple loops
|
|
155
|
+
/>
|
|
156
|
+
```
|
|
157
|
+
|
|
158
|
+
## Pitch
|
|
159
|
+
|
|
160
|
+
Use `toneFrequency` to adjust the pitch without affecting speed. Values range from 0.01 to 2:
|
|
161
|
+
|
|
162
|
+
```tsx
|
|
163
|
+
<Video
|
|
164
|
+
src={staticFile("video.mp4")}
|
|
165
|
+
toneFrequency={1.5} // Higher pitch
|
|
166
|
+
/>
|
|
167
|
+
<Video
|
|
168
|
+
src={staticFile("video.mp4")}
|
|
169
|
+
toneFrequency={0.8} // Lower pitch
|
|
170
|
+
/>
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
Pitch shifting only works during server-side rendering, not in the Remotion Studio preview or in the `<Player />`.
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: ffmpeg
|
|
3
|
+
description: Using FFmpeg and FFprobe in Remotion
|
|
4
|
+
metadata:
|
|
5
|
+
tags: ffmpeg, ffprobe, video, trimming
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## FFmpeg in Remotion
|
|
9
|
+
|
|
10
|
+
`ffmpeg` and `ffprobe` do not need to be installed. They are available via the `npx remotion ffmpeg` and `npx remotion ffprobe`:
|
|
11
|
+
|
|
12
|
+
```bash
|
|
13
|
+
npx remotion ffmpeg -i input.mp4 output.mp3
|
|
14
|
+
npx remotion ffprobe input.mp4
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
### Trimming videos
|
|
18
|
+
|
|
19
|
+
You have 2 options for trimming videos:
|
|
20
|
+
|
|
21
|
+
1. **Preferred**: Use the `trimBefore` and `trimAfter` props of the `<Video>` component. This is non-destructive, requires no re-encoding, and you can change the trim at any time.
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import {Video} from '@remotion/media';
|
|
25
|
+
|
|
26
|
+
<Video
|
|
27
|
+
src={staticFile('video.mp4')}
|
|
28
|
+
trimBefore={5 * fps}
|
|
29
|
+
trimAfter={10 * fps}
|
|
30
|
+
/>;
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
2. Use the FFmpeg command line. You MUST re-encode the video to avoid frozen frames at the start of the video. Only use this if you need a standalone trimmed file (e.g. for upload or external use).
|
|
34
|
+
|
|
35
|
+
```bash
|
|
36
|
+
# Re-encodes from the exact frame
|
|
37
|
+
npx remotion ffmpeg -ss 00:00:05 -i public/input.mp4 -to 00:00:10 -c:v libx264 -c:a aac public/output.mp4
|
|
38
|
+
```
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: gif
|
|
3
|
+
description: Displaying GIFs, APNG, AVIF and WebP in Remotion
|
|
4
|
+
metadata:
|
|
5
|
+
tags: gif, animation, images, animated, apng, avif, webp
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Using Animated images in Remotion
|
|
9
|
+
|
|
10
|
+
## Basic usage
|
|
11
|
+
|
|
12
|
+
Use `<AnimatedImage>` to display a GIF, APNG, AVIF or WebP image synchronized with Remotion's timeline:
|
|
13
|
+
|
|
14
|
+
```tsx
|
|
15
|
+
import { AnimatedImage, staticFile } from "remotion";
|
|
16
|
+
|
|
17
|
+
export const MyComposition = () => {
|
|
18
|
+
return (
|
|
19
|
+
<AnimatedImage
|
|
20
|
+
src={staticFile("animation.gif")}
|
|
21
|
+
width={500}
|
|
22
|
+
height={500}
|
|
23
|
+
/>
|
|
24
|
+
);
|
|
25
|
+
};
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
Remote URLs are also supported (must have CORS enabled):
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
<AnimatedImage
|
|
32
|
+
src="https://example.com/animation.gif"
|
|
33
|
+
width={500}
|
|
34
|
+
height={500}
|
|
35
|
+
/>
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Sizing and fit
|
|
39
|
+
|
|
40
|
+
Control how the image fills its container with the `fit` prop:
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
// Stretch to fill (default)
|
|
44
|
+
<AnimatedImage
|
|
45
|
+
src={staticFile("animation.gif")}
|
|
46
|
+
width={500}
|
|
47
|
+
height={300}
|
|
48
|
+
fit="fill"
|
|
49
|
+
/>
|
|
50
|
+
|
|
51
|
+
// Maintain aspect ratio, fit inside container
|
|
52
|
+
<AnimatedImage
|
|
53
|
+
src={staticFile("animation.gif")}
|
|
54
|
+
width={500}
|
|
55
|
+
height={300}
|
|
56
|
+
fit="contain"
|
|
57
|
+
/>
|
|
58
|
+
|
|
59
|
+
// Fill container, crop if needed
|
|
60
|
+
<AnimatedImage
|
|
61
|
+
src={staticFile("animation.gif")}
|
|
62
|
+
width={500}
|
|
63
|
+
height={300}
|
|
64
|
+
fit="cover"
|
|
65
|
+
/>
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## Playback speed
|
|
69
|
+
|
|
70
|
+
Use `playbackRate` to control the animation speed:
|
|
71
|
+
|
|
72
|
+
```tsx
|
|
73
|
+
// 2x speed
|
|
74
|
+
<AnimatedImage
|
|
75
|
+
src={staticFile("animation.gif")}
|
|
76
|
+
width={500}
|
|
77
|
+
height={500}
|
|
78
|
+
playbackRate={2}
|
|
79
|
+
/>
|
|
80
|
+
// Half speed
|
|
81
|
+
<AnimatedImage
|
|
82
|
+
src={staticFile("animation.gif")}
|
|
83
|
+
width={500}
|
|
84
|
+
height={500}
|
|
85
|
+
playbackRate={0.5}
|
|
86
|
+
/>
|
|
87
|
+
```
|
|
88
|
+
|
|
89
|
+
## Looping behavior
|
|
90
|
+
|
|
91
|
+
Control what happens when the animation finishes:
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
// Loop indefinitely (default)
|
|
95
|
+
<AnimatedImage
|
|
96
|
+
src={staticFile("animation.gif")}
|
|
97
|
+
width={500}
|
|
98
|
+
height={500}
|
|
99
|
+
loopBehavior="loop"
|
|
100
|
+
/>
|
|
101
|
+
|
|
102
|
+
// Play once, show final frame
|
|
103
|
+
<AnimatedImage
|
|
104
|
+
src={staticFile("animation.gif")}
|
|
105
|
+
width={500}
|
|
106
|
+
height={500}
|
|
107
|
+
loopBehavior="pause-after-finish"
|
|
108
|
+
/>
|
|
109
|
+
|
|
110
|
+
// Play once, then clear canvas
|
|
111
|
+
<AnimatedImage
|
|
112
|
+
src={staticFile("animation.gif")}
|
|
113
|
+
width={500}
|
|
114
|
+
height={500}
|
|
115
|
+
loopBehavior="clear-after-finish"
|
|
116
|
+
/>
|
|
117
|
+
```
|
|
118
|
+
|
|
119
|
+
## Styling
|
|
120
|
+
|
|
121
|
+
Use the `style` prop for additional CSS (use `width` and `height` props for sizing):
|
|
122
|
+
|
|
123
|
+
```tsx
|
|
124
|
+
<AnimatedImage
|
|
125
|
+
src={staticFile("animation.gif")}
|
|
126
|
+
width={500}
|
|
127
|
+
height={500}
|
|
128
|
+
style={{
|
|
129
|
+
borderRadius: 20,
|
|
130
|
+
position: "absolute",
|
|
131
|
+
top: 100,
|
|
132
|
+
left: 50,
|
|
133
|
+
}}
|
|
134
|
+
/>
|
|
135
|
+
```
|
|
136
|
+
|
|
137
|
+
## Getting GIF duration
|
|
138
|
+
|
|
139
|
+
Use `getGifDurationInSeconds()` from `@remotion/gif` to get the duration of a GIF.
|
|
140
|
+
|
|
141
|
+
```bash
|
|
142
|
+
npx remotion add @remotion/gif
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
```tsx
|
|
146
|
+
import { getGifDurationInSeconds } from "@remotion/gif";
|
|
147
|
+
import { staticFile } from "remotion";
|
|
148
|
+
|
|
149
|
+
const duration = await getGifDurationInSeconds(staticFile("animation.gif"));
|
|
150
|
+
console.log(duration); // e.g. 2.5
|
|
151
|
+
```
|
|
152
|
+
|
|
153
|
+
This is useful for setting the composition duration to match the GIF:
|
|
154
|
+
|
|
155
|
+
```tsx
|
|
156
|
+
import { getGifDurationInSeconds } from "@remotion/gif";
|
|
157
|
+
import { staticFile, CalculateMetadataFunction } from "remotion";
|
|
158
|
+
|
|
159
|
+
const calculateMetadata: CalculateMetadataFunction = async () => {
|
|
160
|
+
const duration = await getGifDurationInSeconds(staticFile("animation.gif"));
|
|
161
|
+
return {
|
|
162
|
+
durationInFrames: Math.ceil(duration * 30),
|
|
163
|
+
};
|
|
164
|
+
};
|
|
165
|
+
```
|
|
166
|
+
|
|
167
|
+
## Alternative
|
|
168
|
+
|
|
169
|
+
If `<AnimatedImage>` does not work (only supported in Chrome and Firefox), you can use `<Gif>` from `@remotion/gif` instead.
|
|
170
|
+
|
|
171
|
+
```bash
|
|
172
|
+
npx remotion add @remotion/gif # If project uses npm
|
|
173
|
+
bunx remotion add @remotion/gif # If project uses bun
|
|
174
|
+
yarn remotion add @remotion/gif # If project uses yarn
|
|
175
|
+
pnpm exec remotion add @remotion/gif # If project uses pnpm
|
|
176
|
+
```
|
|
177
|
+
|
|
178
|
+
```tsx
|
|
179
|
+
import { Gif } from "@remotion/gif";
|
|
180
|
+
import { staticFile } from "remotion";
|
|
181
|
+
|
|
182
|
+
export const MyComposition = () => {
|
|
183
|
+
return <Gif src={staticFile("animation.gif")} width={500} height={500} />;
|
|
184
|
+
};
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
The `<Gif>` component has the same props as `<AnimatedImage>` but only supports GIF files.
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: fonts
|
|
3
|
+
description: Loading Google Fonts and local fonts in Remotion
|
|
4
|
+
metadata:
|
|
5
|
+
tags: fonts, google-fonts, typography, text
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Using fonts in Remotion
|
|
9
|
+
|
|
10
|
+
## Google Fonts with @remotion/google-fonts
|
|
11
|
+
|
|
12
|
+
The recommended way to use Google Fonts. It's type-safe and automatically blocks rendering until the font is ready.
|
|
13
|
+
|
|
14
|
+
### Prerequisites
|
|
15
|
+
|
|
16
|
+
First, the @remotion/google-fonts package needs to be installed.
|
|
17
|
+
If it is not installed, use the following command:
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx remotion add @remotion/google-fonts # If project uses npm
|
|
21
|
+
bunx remotion add @remotion/google-fonts # If project uses bun
|
|
22
|
+
yarn remotion add @remotion/google-fonts # If project uses yarn
|
|
23
|
+
pnpm exec remotion add @remotion/google-fonts # If project uses pnpm
|
|
24
|
+
```
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
import { loadFont } from "@remotion/google-fonts/Lobster";
|
|
28
|
+
|
|
29
|
+
const { fontFamily } = loadFont();
|
|
30
|
+
|
|
31
|
+
export const MyComposition = () => {
|
|
32
|
+
return (
|
|
33
|
+
<div style={{ fontFamily }}>
|
|
34
|
+
Hello World
|
|
35
|
+
</div>
|
|
36
|
+
);
|
|
37
|
+
};
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
Preferrably, specify only needed weights and subsets to reduce file size:
|
|
41
|
+
|
|
42
|
+
```tsx
|
|
43
|
+
import { loadFont } from "@remotion/google-fonts/Roboto";
|
|
44
|
+
|
|
45
|
+
const { fontFamily } = loadFont("normal", {
|
|
46
|
+
weights: ["400", "700"],
|
|
47
|
+
subsets: ["latin"],
|
|
48
|
+
});
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Using in components
|
|
52
|
+
|
|
53
|
+
Call `loadFont()` at the top level of your component or in a separate file that's imported early:
|
|
54
|
+
|
|
55
|
+
```tsx
|
|
56
|
+
import { loadFont } from "@remotion/google-fonts/Montserrat";
|
|
57
|
+
|
|
58
|
+
const { fontFamily } = loadFont("normal", {
|
|
59
|
+
weights: ["400", "700"],
|
|
60
|
+
subsets: ["latin"],
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
export const Title: React.FC<{ text: string }> = ({ text }) => {
|
|
64
|
+
return (
|
|
65
|
+
<h1
|
|
66
|
+
style={{
|
|
67
|
+
fontFamily,
|
|
68
|
+
fontSize: 80,
|
|
69
|
+
fontWeight: "bold",
|
|
70
|
+
}}
|
|
71
|
+
>
|
|
72
|
+
{text}
|
|
73
|
+
</h1>
|
|
74
|
+
);
|
|
75
|
+
};
|
|
76
|
+
```
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
# Using `<HtmlInCanvas>` in Remotion
|
|
2
|
+
|
|
3
|
+
Renders children into a `<canvas>` so you can post-process them with the Canvas 2D API or WebGL.
|
|
4
|
+
|
|
5
|
+
Only works in Chrome 149+ with the `chrome://flags/#canvas-draw-element` flag enabled.
|
|
6
|
+
Give the user a notice.
|
|
7
|
+
|
|
8
|
+
## Nesting
|
|
9
|
+
|
|
10
|
+
Do not nest `<HtmlInCanvas>` components. Remotion rejects nesting because Chrome does not reliably render nested HTML-in-canvas subtrees.
|
|
11
|
+
|
|
12
|
+
## Enabling WebGL during renders
|
|
13
|
+
|
|
14
|
+
If you make use of WebGL during renders, you need to enable it:
|
|
15
|
+
|
|
16
|
+
From the CLI:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx remotion render --gl=angle
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
Set it as the default for Studio and CLI (advised):
|
|
23
|
+
|
|
24
|
+
```ts
|
|
25
|
+
import { Config } from "@remotion/cli/config";
|
|
26
|
+
|
|
27
|
+
Config.setChromiumOpenGlRenderer("angle");
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Basic usage
|
|
31
|
+
|
|
32
|
+
By default, draws to canvas with no effect applied:
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
import { HtmlInCanvas } from "remotion";
|
|
36
|
+
|
|
37
|
+
export const MyComp = () => {
|
|
38
|
+
return (
|
|
39
|
+
<HtmlInCanvas width={1280} height={720}>
|
|
40
|
+
<div style={{ fontSize: 80 }}>
|
|
41
|
+
Hello
|
|
42
|
+
</div>
|
|
43
|
+
</HtmlInCanvas>
|
|
44
|
+
);
|
|
45
|
+
};
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## 2D effect with `onPaint`
|
|
49
|
+
|
|
50
|
+
`onPaint` runs whenever the content updates. Call `ctx.drawElementImage(elementImage, 0, 0)` to draw the captured DOM, and assign the returned transform to `element.style.transform` so DOM selection still aligns with the painted output.
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
import {
|
|
54
|
+
AbsoluteFill,
|
|
55
|
+
HtmlInCanvas,
|
|
56
|
+
type HtmlInCanvasOnPaint,
|
|
57
|
+
useCurrentFrame,
|
|
58
|
+
useVideoConfig,
|
|
59
|
+
} from "remotion";
|
|
60
|
+
import { useCallback } from "react";
|
|
61
|
+
|
|
62
|
+
export const Blur = () => {
|
|
63
|
+
const frame = useCurrentFrame();
|
|
64
|
+
const { width, height, fps } = useVideoConfig();
|
|
65
|
+
|
|
66
|
+
const onPaint: HtmlInCanvasOnPaint = useCallback(
|
|
67
|
+
({ canvas, element, elementImage }) => {
|
|
68
|
+
const ctx = canvas.getContext("2d");
|
|
69
|
+
if (!ctx) throw new Error("Failed to acquire 2D context");
|
|
70
|
+
|
|
71
|
+
const blurPx = 4 + 18 * (0.5 + 0.5 * Math.sin((frame / fps) * Math.PI));
|
|
72
|
+
|
|
73
|
+
ctx.reset();
|
|
74
|
+
ctx.filter = `blur(${blurPx}px)`;
|
|
75
|
+
const transform = ctx.drawElementImage(elementImage, 0, 0);
|
|
76
|
+
element.style.transform = transform.toString();
|
|
77
|
+
},
|
|
78
|
+
[frame, fps],
|
|
79
|
+
);
|
|
80
|
+
|
|
81
|
+
return (
|
|
82
|
+
<HtmlInCanvas width={width} height={height} onPaint={onPaint}>
|
|
83
|
+
<AbsoluteFill
|
|
84
|
+
style={{
|
|
85
|
+
justifyContent: "center",
|
|
86
|
+
alignItems: "center",
|
|
87
|
+
fontSize: 120,
|
|
88
|
+
}}
|
|
89
|
+
>
|
|
90
|
+
<h1>
|
|
91
|
+
Hello
|
|
92
|
+
</h1>
|
|
93
|
+
</AbsoluteFill>
|
|
94
|
+
</HtmlInCanvas>
|
|
95
|
+
);
|
|
96
|
+
};
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
## WebGL effects
|
|
100
|
+
|
|
101
|
+
For WebGL, set up the context, program, and texture in `onInit` and return a cleanup function. Inside `onPaint`, upload the captured DOM with `gl.texElementImage2D(...)` and draw.
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
const onInit: HtmlInCanvasOnInit = useCallback(({ canvas }) => {
|
|
105
|
+
const gl = canvas.getContext("webgl2", { alpha: true, premultipliedAlpha: true });
|
|
106
|
+
if (!gl) {
|
|
107
|
+
throw new Error(
|
|
108
|
+
"WebGL2 unavailable. Try rendering with the --gl=angle option. See https://remotion.dev/docs/gl-options.",
|
|
109
|
+
);
|
|
110
|
+
}
|
|
111
|
+
gl.pixelStorei(gl.UNPACK_FLIP_Y_WEBGL, true);
|
|
112
|
+
// compile program, create texture, set up VAO...
|
|
113
|
+
return () => {
|
|
114
|
+
// delete program, texture, buffers...
|
|
115
|
+
};
|
|
116
|
+
}, []);
|
|
117
|
+
|
|
118
|
+
const onPaint: HtmlInCanvasOnPaint = useCallback(({ elementImage }) => {
|
|
119
|
+
gl.texElementImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, elementImage);
|
|
120
|
+
gl.drawArrays(gl.TRIANGLES, 0, 6);
|
|
121
|
+
}, []);
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
For a fully working minimal example, see https://github.com/remotion-dev/remotion/blob/main/packages/docs/components/demos/HtmlInCanvasDocsDemoWebGL.tsx.
|
|
125
|
+
|
|
126
|
+
## Async `onPaint`
|
|
127
|
+
|
|
128
|
+
`onPaint` may be `async`. Remotion holds the frame open via `delayRender()` until the promise resolves. Useful for multi-pass effects with `createImageBitmap`.
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
## Sizing and positioning
|
|
2
|
+
|
|
3
|
+
Use the `style` prop to control size and position:
|
|
4
|
+
|
|
5
|
+
```tsx
|
|
6
|
+
<Img
|
|
7
|
+
src={staticFile("photo.png")}
|
|
8
|
+
style={{
|
|
9
|
+
width: 500,
|
|
10
|
+
height: 300,
|
|
11
|
+
position: "absolute",
|
|
12
|
+
top: 100,
|
|
13
|
+
left: 50,
|
|
14
|
+
objectFit: "cover",
|
|
15
|
+
}}
|
|
16
|
+
/>
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
## Dynamic image paths
|
|
20
|
+
|
|
21
|
+
Use template literals for dynamic file references:
|
|
22
|
+
|
|
23
|
+
```tsx
|
|
24
|
+
import { Img, staticFile, useCurrentFrame } from "remotion";
|
|
25
|
+
|
|
26
|
+
const frame = useCurrentFrame();
|
|
27
|
+
|
|
28
|
+
// Image sequence
|
|
29
|
+
<Img src={staticFile(`frames/frame${frame}.png`)} />
|
|
30
|
+
|
|
31
|
+
// Selecting based on props
|
|
32
|
+
<Img src={staticFile(`avatars/${props.userId}.png`)} />
|
|
33
|
+
|
|
34
|
+
// Conditional images
|
|
35
|
+
<Img
|
|
36
|
+
src={staticFile(`icons/${isActive ? "active" : "inactive"}.svg`)}
|
|
37
|
+
/>
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
This pattern is useful for:
|
|
41
|
+
|
|
42
|
+
- Image sequences (frame-by-frame animations)
|
|
43
|
+
- User-specific avatars or profile images
|
|
44
|
+
- Theme-based icons
|
|
45
|
+
- State-dependent graphics
|
|
46
|
+
|
|
47
|
+
## Getting image dimensions
|
|
48
|
+
|
|
49
|
+
Use `getImageDimensions()` to get the dimensions of an image:
|
|
50
|
+
|
|
51
|
+
```tsx
|
|
52
|
+
import { getImageDimensions, staticFile } from "remotion";
|
|
53
|
+
|
|
54
|
+
const { width, height } = await getImageDimensions(staticFile("photo.png"));
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
This is useful for calculating aspect ratios or sizing compositions:
|
|
58
|
+
|
|
59
|
+
```tsx
|
|
60
|
+
import {
|
|
61
|
+
getImageDimensions,
|
|
62
|
+
staticFile,
|
|
63
|
+
CalculateMetadataFunction,
|
|
64
|
+
} from "remotion";
|
|
65
|
+
|
|
66
|
+
const calculateMetadata: CalculateMetadataFunction = async () => {
|
|
67
|
+
const { width, height } = await getImageDimensions(staticFile("photo.png"));
|
|
68
|
+
return {
|
|
69
|
+
width,
|
|
70
|
+
height,
|
|
71
|
+
};
|
|
72
|
+
};
|
|
73
|
+
```
|