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
|
@@ -1,229 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: extract-frames
|
|
3
|
-
description: Extract frames from videos at specific timestamps using Mediabunny
|
|
4
|
-
metadata:
|
|
5
|
-
tags: frames, extract, video, thumbnail, filmstrip, canvas
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Extracting frames from videos
|
|
9
|
-
|
|
10
|
-
Use Mediabunny to extract frames from videos at specific timestamps. This is useful for generating thumbnails, filmstrips, or processing individual frames.
|
|
11
|
-
|
|
12
|
-
## The `extractFrames()` function
|
|
13
|
-
|
|
14
|
-
This function can be copy-pasted into any project.
|
|
15
|
-
|
|
16
|
-
```tsx
|
|
17
|
-
import {
|
|
18
|
-
ALL_FORMATS,
|
|
19
|
-
Input,
|
|
20
|
-
UrlSource,
|
|
21
|
-
VideoSample,
|
|
22
|
-
VideoSampleSink,
|
|
23
|
-
} from "mediabunny";
|
|
24
|
-
|
|
25
|
-
type Options = {
|
|
26
|
-
track: { width: number; height: number };
|
|
27
|
-
container: string;
|
|
28
|
-
durationInSeconds: number | null;
|
|
29
|
-
};
|
|
30
|
-
|
|
31
|
-
export type ExtractFramesTimestampsInSecondsFn = (
|
|
32
|
-
options: Options,
|
|
33
|
-
) => Promise<number[]> | number[];
|
|
34
|
-
|
|
35
|
-
export type ExtractFramesProps = {
|
|
36
|
-
src: string;
|
|
37
|
-
timestampsInSeconds: number[] | ExtractFramesTimestampsInSecondsFn;
|
|
38
|
-
onVideoSample: (sample: VideoSample) => void;
|
|
39
|
-
signal?: AbortSignal;
|
|
40
|
-
};
|
|
41
|
-
|
|
42
|
-
export async function extractFrames({
|
|
43
|
-
src,
|
|
44
|
-
timestampsInSeconds,
|
|
45
|
-
onVideoSample,
|
|
46
|
-
signal,
|
|
47
|
-
}: ExtractFramesProps): Promise<void> {
|
|
48
|
-
using input = new Input({
|
|
49
|
-
formats: ALL_FORMATS,
|
|
50
|
-
source: new UrlSource(src),
|
|
51
|
-
});
|
|
52
|
-
|
|
53
|
-
const [durationInSeconds, format, videoTrack] = await Promise.all([
|
|
54
|
-
input.computeDuration(),
|
|
55
|
-
input.getFormat(),
|
|
56
|
-
input.getPrimaryVideoTrack(),
|
|
57
|
-
]);
|
|
58
|
-
|
|
59
|
-
if (!videoTrack) {
|
|
60
|
-
throw new Error("No video track found in the input");
|
|
61
|
-
}
|
|
62
|
-
|
|
63
|
-
if (signal?.aborted) {
|
|
64
|
-
throw new Error("Aborted");
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
const timestamps =
|
|
68
|
-
typeof timestampsInSeconds === "function"
|
|
69
|
-
? await timestampsInSeconds({
|
|
70
|
-
track: {
|
|
71
|
-
width: videoTrack.displayWidth,
|
|
72
|
-
height: videoTrack.displayHeight,
|
|
73
|
-
},
|
|
74
|
-
container: format.name,
|
|
75
|
-
durationInSeconds,
|
|
76
|
-
})
|
|
77
|
-
: timestampsInSeconds;
|
|
78
|
-
|
|
79
|
-
if (timestamps.length === 0) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
if (signal?.aborted) {
|
|
84
|
-
throw new Error("Aborted");
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
const sink = new VideoSampleSink(videoTrack);
|
|
88
|
-
|
|
89
|
-
for await (using videoSample of sink.samplesAtTimestamps(timestamps)) {
|
|
90
|
-
if (signal?.aborted) {
|
|
91
|
-
break;
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
if (!videoSample) {
|
|
95
|
-
continue;
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
onVideoSample(videoSample);
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
```
|
|
102
|
-
|
|
103
|
-
## Basic usage
|
|
104
|
-
|
|
105
|
-
Extract frames at specific timestamps:
|
|
106
|
-
|
|
107
|
-
```tsx
|
|
108
|
-
await extractFrames({
|
|
109
|
-
src: "https://remotion.media/video.mp4",
|
|
110
|
-
timestampsInSeconds: [0, 1, 2, 3, 4],
|
|
111
|
-
onVideoSample: (sample) => {
|
|
112
|
-
const canvas = document.createElement("canvas");
|
|
113
|
-
canvas.width = sample.displayWidth;
|
|
114
|
-
canvas.height = sample.displayHeight;
|
|
115
|
-
const ctx = canvas.getContext("2d");
|
|
116
|
-
sample.draw(ctx!, 0, 0);
|
|
117
|
-
},
|
|
118
|
-
});
|
|
119
|
-
```
|
|
120
|
-
|
|
121
|
-
## Creating a filmstrip
|
|
122
|
-
|
|
123
|
-
Use a callback function to dynamically calculate timestamps based on video metadata:
|
|
124
|
-
|
|
125
|
-
```tsx
|
|
126
|
-
const canvasWidth = 500;
|
|
127
|
-
const canvasHeight = 80;
|
|
128
|
-
const fromSeconds = 0;
|
|
129
|
-
const toSeconds = 10;
|
|
130
|
-
|
|
131
|
-
await extractFrames({
|
|
132
|
-
src: "https://remotion.media/video.mp4",
|
|
133
|
-
timestampsInSeconds: async ({ track, durationInSeconds }) => {
|
|
134
|
-
const aspectRatio = track.width / track.height;
|
|
135
|
-
const amountOfFramesFit = Math.ceil(
|
|
136
|
-
canvasWidth / (canvasHeight * aspectRatio),
|
|
137
|
-
);
|
|
138
|
-
const segmentDuration = toSeconds - fromSeconds;
|
|
139
|
-
const timestamps: number[] = [];
|
|
140
|
-
|
|
141
|
-
for (let i = 0; i < amountOfFramesFit; i++) {
|
|
142
|
-
timestamps.push(
|
|
143
|
-
fromSeconds + (segmentDuration / amountOfFramesFit) * (i + 0.5),
|
|
144
|
-
);
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
return timestamps;
|
|
148
|
-
},
|
|
149
|
-
onVideoSample: (sample) => {
|
|
150
|
-
console.log(`Frame at ${sample.timestamp}s`);
|
|
151
|
-
|
|
152
|
-
const canvas = document.createElement("canvas");
|
|
153
|
-
canvas.width = sample.displayWidth;
|
|
154
|
-
canvas.height = sample.displayHeight;
|
|
155
|
-
const ctx = canvas.getContext("2d");
|
|
156
|
-
sample.draw(ctx!, 0, 0);
|
|
157
|
-
},
|
|
158
|
-
});
|
|
159
|
-
```
|
|
160
|
-
|
|
161
|
-
## Cancellation with AbortSignal
|
|
162
|
-
|
|
163
|
-
Cancel frame extraction after a timeout:
|
|
164
|
-
|
|
165
|
-
```tsx
|
|
166
|
-
const controller = new AbortController();
|
|
167
|
-
|
|
168
|
-
setTimeout(() => controller.abort(), 5000);
|
|
169
|
-
|
|
170
|
-
try {
|
|
171
|
-
await extractFrames({
|
|
172
|
-
src: "https://remotion.media/video.mp4",
|
|
173
|
-
timestampsInSeconds: [0, 1, 2, 3, 4],
|
|
174
|
-
onVideoSample: (sample) => {
|
|
175
|
-
using frame = sample;
|
|
176
|
-
const canvas = document.createElement("canvas");
|
|
177
|
-
canvas.width = frame.displayWidth;
|
|
178
|
-
canvas.height = frame.displayHeight;
|
|
179
|
-
const ctx = canvas.getContext("2d");
|
|
180
|
-
frame.draw(ctx!, 0, 0);
|
|
181
|
-
},
|
|
182
|
-
signal: controller.signal,
|
|
183
|
-
});
|
|
184
|
-
|
|
185
|
-
console.log("Frame extraction complete!");
|
|
186
|
-
} catch (error) {
|
|
187
|
-
console.error("Frame extraction was aborted or failed:", error);
|
|
188
|
-
}
|
|
189
|
-
```
|
|
190
|
-
|
|
191
|
-
## Timeout with Promise.race
|
|
192
|
-
|
|
193
|
-
```tsx
|
|
194
|
-
const controller = new AbortController();
|
|
195
|
-
|
|
196
|
-
const timeoutPromise = new Promise<never>((_, reject) => {
|
|
197
|
-
const timeoutId = setTimeout(() => {
|
|
198
|
-
controller.abort();
|
|
199
|
-
reject(new Error("Frame extraction timed out after 10 seconds"));
|
|
200
|
-
}, 10000);
|
|
201
|
-
|
|
202
|
-
controller.signal.addEventListener("abort", () => clearTimeout(timeoutId), {
|
|
203
|
-
once: true,
|
|
204
|
-
});
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
try {
|
|
208
|
-
await Promise.race([
|
|
209
|
-
extractFrames({
|
|
210
|
-
src: "https://remotion.media/video.mp4",
|
|
211
|
-
timestampsInSeconds: [0, 1, 2, 3, 4],
|
|
212
|
-
onVideoSample: (sample) => {
|
|
213
|
-
using frame = sample;
|
|
214
|
-
const canvas = document.createElement("canvas");
|
|
215
|
-
canvas.width = frame.displayWidth;
|
|
216
|
-
canvas.height = frame.displayHeight;
|
|
217
|
-
const ctx = canvas.getContext("2d");
|
|
218
|
-
frame.draw(ctx!, 0, 0);
|
|
219
|
-
},
|
|
220
|
-
signal: controller.signal,
|
|
221
|
-
}),
|
|
222
|
-
timeoutPromise,
|
|
223
|
-
]);
|
|
224
|
-
|
|
225
|
-
console.log("Frame extraction complete!");
|
|
226
|
-
} catch (error) {
|
|
227
|
-
console.error("Frame extraction was aborted or failed:", error);
|
|
228
|
-
}
|
|
229
|
-
```
|
|
@@ -1,152 +0,0 @@
|
|
|
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 <div style={{ fontFamily }}>Hello World</div>;
|
|
33
|
-
};
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
Preferrably, specify only needed weights and subsets to reduce file size:
|
|
37
|
-
|
|
38
|
-
```tsx
|
|
39
|
-
import { loadFont } from "@remotion/google-fonts/Roboto";
|
|
40
|
-
|
|
41
|
-
const { fontFamily } = loadFont("normal", {
|
|
42
|
-
weights: ["400", "700"],
|
|
43
|
-
subsets: ["latin"],
|
|
44
|
-
});
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
### Waiting for font to load
|
|
48
|
-
|
|
49
|
-
Use `waitUntilDone()` if you need to know when the font is ready:
|
|
50
|
-
|
|
51
|
-
```tsx
|
|
52
|
-
import { loadFont } from "@remotion/google-fonts/Lobster";
|
|
53
|
-
|
|
54
|
-
const { fontFamily, waitUntilDone } = loadFont();
|
|
55
|
-
|
|
56
|
-
await waitUntilDone();
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Local fonts with @remotion/fonts
|
|
60
|
-
|
|
61
|
-
For local font files, use the `@remotion/fonts` package.
|
|
62
|
-
|
|
63
|
-
### Prerequisites
|
|
64
|
-
|
|
65
|
-
First, install @remotion/fonts:
|
|
66
|
-
|
|
67
|
-
```bash
|
|
68
|
-
npx remotion add @remotion/fonts # If project uses npm
|
|
69
|
-
bunx remotion add @remotion/fonts # If project uses bun
|
|
70
|
-
yarn remotion add @remotion/fonts # If project uses yarn
|
|
71
|
-
pnpm exec remotion add @remotion/fonts # If project uses pnpm
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
### Loading a local font
|
|
75
|
-
|
|
76
|
-
Place your font file in the `public/` folder and use `loadFont()`:
|
|
77
|
-
|
|
78
|
-
```tsx
|
|
79
|
-
import { loadFont } from "@remotion/fonts";
|
|
80
|
-
import { staticFile } from "remotion";
|
|
81
|
-
|
|
82
|
-
await loadFont({
|
|
83
|
-
family: "MyFont",
|
|
84
|
-
url: staticFile("MyFont-Regular.woff2"),
|
|
85
|
-
});
|
|
86
|
-
|
|
87
|
-
export const MyComposition = () => {
|
|
88
|
-
return <div style={{ fontFamily: "MyFont" }}>Hello World</div>;
|
|
89
|
-
};
|
|
90
|
-
```
|
|
91
|
-
|
|
92
|
-
### Loading multiple weights
|
|
93
|
-
|
|
94
|
-
Load each weight separately with the same family name:
|
|
95
|
-
|
|
96
|
-
```tsx
|
|
97
|
-
import { loadFont } from "@remotion/fonts";
|
|
98
|
-
import { staticFile } from "remotion";
|
|
99
|
-
|
|
100
|
-
await Promise.all([
|
|
101
|
-
loadFont({
|
|
102
|
-
family: "Inter",
|
|
103
|
-
url: staticFile("Inter-Regular.woff2"),
|
|
104
|
-
weight: "400",
|
|
105
|
-
}),
|
|
106
|
-
loadFont({
|
|
107
|
-
family: "Inter",
|
|
108
|
-
url: staticFile("Inter-Bold.woff2"),
|
|
109
|
-
weight: "700",
|
|
110
|
-
}),
|
|
111
|
-
]);
|
|
112
|
-
```
|
|
113
|
-
|
|
114
|
-
### Available options
|
|
115
|
-
|
|
116
|
-
```tsx
|
|
117
|
-
loadFont({
|
|
118
|
-
family: "MyFont", // Required: name to use in CSS
|
|
119
|
-
url: staticFile("font.woff2"), // Required: font file URL
|
|
120
|
-
format: "woff2", // Optional: auto-detected from extension
|
|
121
|
-
weight: "400", // Optional: font weight
|
|
122
|
-
style: "normal", // Optional: normal or italic
|
|
123
|
-
display: "block", // Optional: font-display behavior
|
|
124
|
-
});
|
|
125
|
-
```
|
|
126
|
-
|
|
127
|
-
## Using in components
|
|
128
|
-
|
|
129
|
-
Call `loadFont()` at the top level of your component or in a separate file that's imported early:
|
|
130
|
-
|
|
131
|
-
```tsx
|
|
132
|
-
import { loadFont } from "@remotion/google-fonts/Montserrat";
|
|
133
|
-
|
|
134
|
-
const { fontFamily } = loadFont("normal", {
|
|
135
|
-
weights: ["400", "700"],
|
|
136
|
-
subsets: ["latin"],
|
|
137
|
-
});
|
|
138
|
-
|
|
139
|
-
export const Title: React.FC<{ text: string }> = ({ text }) => {
|
|
140
|
-
return (
|
|
141
|
-
<h1
|
|
142
|
-
style={{
|
|
143
|
-
fontFamily,
|
|
144
|
-
fontSize: 80,
|
|
145
|
-
fontWeight: "bold",
|
|
146
|
-
}}
|
|
147
|
-
>
|
|
148
|
-
{text}
|
|
149
|
-
</h1>
|
|
150
|
-
);
|
|
151
|
-
};
|
|
152
|
-
```
|
|
@@ -1,134 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: images
|
|
3
|
-
description: Embedding images in Remotion using the <Img> component
|
|
4
|
-
metadata:
|
|
5
|
-
tags: images, img, staticFile, png, jpg, svg, webp
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
# Using images in Remotion
|
|
9
|
-
|
|
10
|
-
## The `<Img>` component
|
|
11
|
-
|
|
12
|
-
Always use the `<Img>` component from `remotion` to display images:
|
|
13
|
-
|
|
14
|
-
```tsx
|
|
15
|
-
import { Img, staticFile } from "remotion";
|
|
16
|
-
|
|
17
|
-
export const MyComposition = () => {
|
|
18
|
-
return <Img src={staticFile("photo.png")} />;
|
|
19
|
-
};
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Important restrictions
|
|
23
|
-
|
|
24
|
-
**You MUST use the `<Img>` component from `remotion`.** Do not use:
|
|
25
|
-
|
|
26
|
-
- Native HTML `<img>` elements
|
|
27
|
-
- Next.js `<Image>` component
|
|
28
|
-
- CSS `background-image`
|
|
29
|
-
|
|
30
|
-
The `<Img>` component ensures images are fully loaded before rendering, preventing flickering and blank frames during video export.
|
|
31
|
-
|
|
32
|
-
## Local images with staticFile()
|
|
33
|
-
|
|
34
|
-
Place images in the `public/` folder and use `staticFile()` to reference them:
|
|
35
|
-
|
|
36
|
-
```
|
|
37
|
-
my-video/
|
|
38
|
-
├─ public/
|
|
39
|
-
│ ├─ logo.png
|
|
40
|
-
│ ├─ avatar.jpg
|
|
41
|
-
│ └─ icon.svg
|
|
42
|
-
├─ src/
|
|
43
|
-
├─ package.json
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
```tsx
|
|
47
|
-
import { Img, staticFile } from "remotion";
|
|
48
|
-
|
|
49
|
-
<Img src={staticFile("logo.png")} />;
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## Remote images
|
|
53
|
-
|
|
54
|
-
Remote URLs can be used directly without `staticFile()`:
|
|
55
|
-
|
|
56
|
-
```tsx
|
|
57
|
-
<Img src="https://example.com/image.png" />
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
Ensure remote images have CORS enabled.
|
|
61
|
-
|
|
62
|
-
For animated GIFs, use the `<Gif>` component from `@remotion/gif` instead.
|
|
63
|
-
|
|
64
|
-
## Sizing and positioning
|
|
65
|
-
|
|
66
|
-
Use the `style` prop to control size and position:
|
|
67
|
-
|
|
68
|
-
```tsx
|
|
69
|
-
<Img
|
|
70
|
-
src={staticFile("photo.png")}
|
|
71
|
-
style={{
|
|
72
|
-
width: 500,
|
|
73
|
-
height: 300,
|
|
74
|
-
position: "absolute",
|
|
75
|
-
top: 100,
|
|
76
|
-
left: 50,
|
|
77
|
-
objectFit: "cover",
|
|
78
|
-
}}
|
|
79
|
-
/>
|
|
80
|
-
```
|
|
81
|
-
|
|
82
|
-
## Dynamic image paths
|
|
83
|
-
|
|
84
|
-
Use template literals for dynamic file references:
|
|
85
|
-
|
|
86
|
-
```tsx
|
|
87
|
-
import { Img, staticFile, useCurrentFrame } from "remotion";
|
|
88
|
-
|
|
89
|
-
const frame = useCurrentFrame();
|
|
90
|
-
|
|
91
|
-
// Image sequence
|
|
92
|
-
<Img src={staticFile(`frames/frame${frame}.png`)} />
|
|
93
|
-
|
|
94
|
-
// Selecting based on props
|
|
95
|
-
<Img src={staticFile(`avatars/${props.userId}.png`)} />
|
|
96
|
-
|
|
97
|
-
// Conditional images
|
|
98
|
-
<Img src={staticFile(`icons/${isActive ? "active" : "inactive"}.svg`)} />
|
|
99
|
-
```
|
|
100
|
-
|
|
101
|
-
This pattern is useful for:
|
|
102
|
-
|
|
103
|
-
- Image sequences (frame-by-frame animations)
|
|
104
|
-
- User-specific avatars or profile images
|
|
105
|
-
- Theme-based icons
|
|
106
|
-
- State-dependent graphics
|
|
107
|
-
|
|
108
|
-
## Getting image dimensions
|
|
109
|
-
|
|
110
|
-
Use `getImageDimensions()` to get the dimensions of an image:
|
|
111
|
-
|
|
112
|
-
```tsx
|
|
113
|
-
import { getImageDimensions, staticFile } from "remotion";
|
|
114
|
-
|
|
115
|
-
const { width, height } = await getImageDimensions(staticFile("photo.png"));
|
|
116
|
-
```
|
|
117
|
-
|
|
118
|
-
This is useful for calculating aspect ratios or sizing compositions:
|
|
119
|
-
|
|
120
|
-
```tsx
|
|
121
|
-
import {
|
|
122
|
-
getImageDimensions,
|
|
123
|
-
staticFile,
|
|
124
|
-
CalculateMetadataFunction,
|
|
125
|
-
} from "remotion";
|
|
126
|
-
|
|
127
|
-
const calculateMetadata: CalculateMetadataFunction = async () => {
|
|
128
|
-
const { width, height } = await getImageDimensions(staticFile("photo.png"));
|
|
129
|
-
return {
|
|
130
|
-
width,
|
|
131
|
-
height,
|
|
132
|
-
};
|
|
133
|
-
};
|
|
134
|
-
```
|
|
@@ -1,73 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: light-leaks
|
|
3
|
-
description: Light leak overlay effects for Remotion using @remotion/light-leaks.
|
|
4
|
-
metadata:
|
|
5
|
-
tags: light-leaks, overlays, effects, transitions
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Light Leaks
|
|
9
|
-
|
|
10
|
-
This only works from Remotion 4.0.415 and up. Use `npx remotion versions` to check your Remotion version and `npx remotion upgrade` to upgrade your Remotion version.
|
|
11
|
-
|
|
12
|
-
`<LightLeak>` from `@remotion/light-leaks` renders a WebGL-based light leak effect. It reveals during the first half of its duration and retracts during the second half.
|
|
13
|
-
|
|
14
|
-
Typically used inside a `<TransitionSeries.Overlay>` to play over the cut point between two scenes. See the **transitions** rule for `<TransitionSeries>` and overlay usage.
|
|
15
|
-
|
|
16
|
-
## Prerequisites
|
|
17
|
-
|
|
18
|
-
```bash
|
|
19
|
-
npx remotion add @remotion/light-leaks
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
## Basic usage with TransitionSeries
|
|
23
|
-
|
|
24
|
-
```tsx
|
|
25
|
-
import { TransitionSeries } from "@remotion/transitions";
|
|
26
|
-
import { LightLeak } from "@remotion/light-leaks";
|
|
27
|
-
|
|
28
|
-
<TransitionSeries>
|
|
29
|
-
<TransitionSeries.Sequence durationInFrames={60}>
|
|
30
|
-
<SceneA />
|
|
31
|
-
</TransitionSeries.Sequence>
|
|
32
|
-
<TransitionSeries.Overlay durationInFrames={30}>
|
|
33
|
-
<LightLeak />
|
|
34
|
-
</TransitionSeries.Overlay>
|
|
35
|
-
<TransitionSeries.Sequence durationInFrames={60}>
|
|
36
|
-
<SceneB />
|
|
37
|
-
</TransitionSeries.Sequence>
|
|
38
|
-
</TransitionSeries>;
|
|
39
|
-
```
|
|
40
|
-
|
|
41
|
-
## Props
|
|
42
|
-
|
|
43
|
-
- `durationInFrames?` — defaults to the parent sequence/composition duration. The effect reveals during the first half and retracts during the second half.
|
|
44
|
-
- `seed?` — determines the shape of the light leak pattern. Different seeds produce different patterns. Default: `0`.
|
|
45
|
-
- `hueShift?` — rotates the hue in degrees (`0`–`360`). Default: `0` (yellow-to-orange). `120` = green, `240` = blue.
|
|
46
|
-
|
|
47
|
-
## Customizing the look
|
|
48
|
-
|
|
49
|
-
```tsx
|
|
50
|
-
import { LightLeak } from "@remotion/light-leaks";
|
|
51
|
-
|
|
52
|
-
// Blue-tinted light leak with a different pattern
|
|
53
|
-
<LightLeak seed={5} hueShift={240} />;
|
|
54
|
-
|
|
55
|
-
// Green-tinted light leak
|
|
56
|
-
<LightLeak seed={2} hueShift={120} />;
|
|
57
|
-
```
|
|
58
|
-
|
|
59
|
-
## Standalone usage
|
|
60
|
-
|
|
61
|
-
`<LightLeak>` can also be used outside of `<TransitionSeries>`, for example as a decorative overlay in any composition:
|
|
62
|
-
|
|
63
|
-
```tsx
|
|
64
|
-
import { AbsoluteFill } from "remotion";
|
|
65
|
-
import { LightLeak } from "@remotion/light-leaks";
|
|
66
|
-
|
|
67
|
-
const MyComp: React.FC = () => (
|
|
68
|
-
<AbsoluteFill>
|
|
69
|
-
<MyContent />
|
|
70
|
-
<LightLeak durationInFrames={60} seed={3} />
|
|
71
|
-
</AbsoluteFill>
|
|
72
|
-
);
|
|
73
|
-
```
|