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,51 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sfx
|
|
3
|
+
description: Including sound effects
|
|
4
|
+
metadata:
|
|
5
|
+
tags: sfx, sound, effect, audio
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
To include a sound effect, use the `<Audio>` tag:
|
|
9
|
+
|
|
10
|
+
```tsx
|
|
11
|
+
import { Audio } from "@remotion/sfx";
|
|
12
|
+
|
|
13
|
+
<Audio src={"https://remotion.media/whoosh.wav"} />;
|
|
14
|
+
```
|
|
15
|
+
|
|
16
|
+
The following sound effects are available:
|
|
17
|
+
|
|
18
|
+
- `https://remotion.media/whoosh.wav`
|
|
19
|
+
- `https://remotion.media/whip.wav`
|
|
20
|
+
- `https://remotion.media/page-turn.wav`
|
|
21
|
+
- `https://remotion.media/switch.wav`
|
|
22
|
+
- `https://remotion.media/mouse-click.wav`
|
|
23
|
+
- `https://remotion.media/shutter-modern.wav`
|
|
24
|
+
- `https://remotion.media/shutter-old.wav`
|
|
25
|
+
- `https://remotion.media/ding.wav`
|
|
26
|
+
- `https://remotion.media/bruh.wav`
|
|
27
|
+
- `https://remotion.media/vine-boom.wav`
|
|
28
|
+
- `https://remotion.media/windows-xp-error.wav`
|
|
29
|
+
- `https://remotion.media/fah.wav`
|
|
30
|
+
- `https://remotion.media/spongebob-fail.wav`
|
|
31
|
+
- `https://remotion.media/omg-hell-nah.wav`
|
|
32
|
+
- `https://remotion.media/price-is-right-fail.wav`
|
|
33
|
+
- `https://remotion.media/romance-meme.wav`
|
|
34
|
+
- `https://remotion.media/bone-crack.wav`
|
|
35
|
+
- `https://remotion.media/anime-wow.wav`
|
|
36
|
+
- `https://remotion.media/yippee.wav`
|
|
37
|
+
- `https://remotion.media/loading-lag.wav`
|
|
38
|
+
- `https://remotion.media/wilhelm-scream.wav`
|
|
39
|
+
- `https://remotion.media/mac-quack.wav`
|
|
40
|
+
- `https://remotion.media/skedaddle.wav`
|
|
41
|
+
- `https://remotion.media/snapchat-notification.wav`
|
|
42
|
+
- `https://remotion.media/nelly-ahh.wav`
|
|
43
|
+
- `https://remotion.media/sanctuary-guardian-what.wav`
|
|
44
|
+
- `https://remotion.media/minecraft-hurt.wav`
|
|
45
|
+
- `https://remotion.media/oh-my-god-vine.wav`
|
|
46
|
+
- `https://remotion.media/illuminati-confirmed.wav`
|
|
47
|
+
- `https://remotion.media/dramatic-boomer.wav`
|
|
48
|
+
- `https://remotion.media/triggered.wav`
|
|
49
|
+
- `https://remotion.media/record-scratch.wav`
|
|
50
|
+
|
|
51
|
+
For more sound effects, search the internet. A good resource is https://github.com/kapishdima/soundcn/tree/main/assets.
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: silence-detection
|
|
3
|
+
description: Adaptive silence detection for video/audio files using FFmpeg loudnorm and silencedetect
|
|
4
|
+
metadata:
|
|
5
|
+
tags: silence, detection, trimming, ffmpeg, loudnorm, audio
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Adaptive Silence Detection
|
|
9
|
+
|
|
10
|
+
Detect silent segments in video or audio files.
|
|
11
|
+
|
|
12
|
+
Requires FFmpeg — see [ffmpeg.md](./ffmpeg.md) for how to invoke it in Remotion projects.
|
|
13
|
+
|
|
14
|
+
## Step 1: Measure loudness with `loudnorm`
|
|
15
|
+
|
|
16
|
+
Use the `loudnorm` filter in JSON mode to get the EBU R128 integrated loudness and gating threshold for each file:
|
|
17
|
+
|
|
18
|
+
```bash
|
|
19
|
+
npx remotion ffmpeg -i public/video.mov -map 0:a -af loudnorm=print_format=json -f null /dev/null
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
As output you will get:
|
|
23
|
+
- `input_i`: Integrated loudness (dB) — the overall perceived volume
|
|
24
|
+
- `input_thresh`: EBU R128 gating threshold (dB) — the level below which audio is considered too quiet to count toward loudness measurement
|
|
25
|
+
|
|
26
|
+
## Step 2: Detect silences using adaptive threshold
|
|
27
|
+
|
|
28
|
+
Pass the `input_thresh` value from step 1 as the `noise` parameter to `silencedetect`:
|
|
29
|
+
|
|
30
|
+
```bash
|
|
31
|
+
npx remotion ffmpeg -i public/video.mov -map 0:a -af "silencedetect=noise=${THRESH}dB:d=0.5" -f null /dev/null
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
Parameters:
|
|
35
|
+
- `noise`: The threshold below which audio is considered silent. Use `input_thresh` from step 1.
|
|
36
|
+
- `d`: Minimum silence duration in seconds. `0.5` is a good default.
|
|
37
|
+
|
|
38
|
+
## Interpreting the output
|
|
39
|
+
|
|
40
|
+
The filter outputs pairs of `silence_start` and `silence_end` timestamps:
|
|
41
|
+
|
|
42
|
+
```
|
|
43
|
+
[silencedetect] silence_start: 0
|
|
44
|
+
[silencedetect] silence_end: 2.241021 | silence_duration: 2.241021
|
|
45
|
+
[silencedetect] silence_start: 38.77425
|
|
46
|
+
[silencedetect] silence_end: 39.619604 | silence_duration: 0.845354
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
## Identifying leading and trailing silence
|
|
50
|
+
|
|
51
|
+
- **Leading silence**: Consecutive silence segments starting at or near 0. If the first `silence_start` is > 0.5s, there is no leading silence.
|
|
52
|
+
- **Trailing silence**: The last silence segment that extends to (or near) the end of the file. Compare the last `silence_end` with the file's total duration.
|
|
53
|
+
|
|
54
|
+
When multiple silences are nearly contiguous at the start or end (gap < 0.2s), treat them as a single leading/trailing silence block.
|
|
55
|
+
|
|
56
|
+
## Using with Remotion's `<Video>` component
|
|
57
|
+
|
|
58
|
+
Apply the detected trim points using `trimBefore` and `trimAfter` (values are in frames):
|
|
59
|
+
|
|
60
|
+
```tsx
|
|
61
|
+
import { Video } from "@remotion/media";
|
|
62
|
+
import { staticFile, useVideoConfig } from "remotion";
|
|
63
|
+
|
|
64
|
+
const { fps } = useVideoConfig();
|
|
65
|
+
|
|
66
|
+
<Video
|
|
67
|
+
src={staticFile("video.mov")}
|
|
68
|
+
trimBefore={Math.floor(leadingEnd * fps)}
|
|
69
|
+
trimAfter={Math.ceil(trailingStart * fps)}
|
|
70
|
+
/>
|
|
71
|
+
```
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: text-highlights
|
|
3
|
+
description: Animated text highlights and hand-drawn annotations using @remotion/rough-notation.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: text, highlights, annotations, circles, rough-notation
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Text highlights
|
|
9
|
+
|
|
10
|
+
Use `@remotion/rough-notation` to draw animated annotations around or behind text. It supports highlights, circles, underlines, strike-throughs, crossed-off text, boxes, and brackets.
|
|
11
|
+
|
|
12
|
+
Docs: https://www.remotion.dev/docs/text-highlights
|
|
13
|
+
|
|
14
|
+
Install the package using the same Remotion version as the project:
|
|
15
|
+
|
|
16
|
+
```bash
|
|
17
|
+
bunx remotion add @remotion/rough-notation
|
|
18
|
+
```
|
|
19
|
+
|
|
20
|
+
Choose the component that describes the annotation: `<Highlight>`, `<Circle>`, `<Underline>`, `<StrikeThrough>`, `<CrossedOff>`, `<Box>`, or `<Bracket>`. The component determines both the annotation style and whether it renders behind or on top of the text.
|
|
21
|
+
|
|
22
|
+
Drive `progress` from `useCurrentFrame()` so the annotation is deterministic and synchronized with the video:
|
|
23
|
+
|
|
24
|
+
```tsx
|
|
25
|
+
import {Circle, Highlight} from '@remotion/rough-notation';
|
|
26
|
+
import {interpolate, useCurrentFrame} from 'remotion';
|
|
27
|
+
|
|
28
|
+
export const TextAnnotations: React.FC = () => {
|
|
29
|
+
const frame = useCurrentFrame();
|
|
30
|
+
|
|
31
|
+
return (
|
|
32
|
+
<div style={{fontSize: 80}}>
|
|
33
|
+
This is{' '}
|
|
34
|
+
<Highlight
|
|
35
|
+
color="rgba(255, 236, 79, 0.62)"
|
|
36
|
+
progress={interpolate(frame, [15, 40], [0, 1], {
|
|
37
|
+
extrapolateLeft: 'clamp',
|
|
38
|
+
extrapolateRight: 'clamp',
|
|
39
|
+
})}
|
|
40
|
+
>
|
|
41
|
+
important
|
|
42
|
+
</Highlight>
|
|
43
|
+
, and this is{' '}
|
|
44
|
+
<Circle color="#2563eb" progress={interpolate(frame, [15, 40], [0, 1], {
|
|
45
|
+
extrapolateLeft: 'clamp',
|
|
46
|
+
extrapolateRight: 'clamp',
|
|
47
|
+
})}>
|
|
48
|
+
connected
|
|
49
|
+
</Circle>
|
|
50
|
+
.
|
|
51
|
+
</div>
|
|
52
|
+
);
|
|
53
|
+
};
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
Keep `progress` inline, hardcoded and use `interpolate` for maximum [Studio interactivity](../remotion-interactivity/SKILL.md).
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
Drive motion with `interpolate()` over an explicit frame range.
|
|
2
|
+
To customize timing, use **`Easing.bezier`** or `Easing.spring`.
|
|
3
|
+
|
|
4
|
+
A simple linear interpolation is done using the `interpolate` function.
|
|
5
|
+
|
|
6
|
+
```ts title="Going from 0 to 1 over 0.3 seconds"
|
|
7
|
+
import { interpolate } from "remotion";
|
|
8
|
+
|
|
9
|
+
const opacity = interpolate(frame, [0, 0.3 * fps], [0, 1]);
|
|
10
|
+
```
|
|
11
|
+
|
|
12
|
+
By default, the values are not clamped, so the value can go outside the range [0, 1].
|
|
13
|
+
Here is how they can be clamped:
|
|
14
|
+
|
|
15
|
+
```ts title="Going from 0 to 1 over 0.3 seconds with extrapolation"
|
|
16
|
+
const opacity = interpolate(frame, [0, 0.3 * fps], [0, 1], {
|
|
17
|
+
extrapolateRight: "clamp",
|
|
18
|
+
extrapolateLeft: "clamp",
|
|
19
|
+
});
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
## Studio-editable animation patterns
|
|
23
|
+
|
|
24
|
+
When an animation should be editable in Remotion Studio, keep the `interpolate()` call directly in the `style` prop and prefer individual CSS transform properties:
|
|
25
|
+
|
|
26
|
+
```tsx
|
|
27
|
+
// 👍 Inline editable keyframes and transform shorthands
|
|
28
|
+
style={{
|
|
29
|
+
scale: interpolate(frame, [0, 100], [0, 1]),
|
|
30
|
+
translate: interpolate(frame, [0, 100], ["0px 0px", "100px 100px"]),
|
|
31
|
+
rotate: interpolate(frame, [0, 100], ["20deg", "90deg"]),
|
|
32
|
+
}}
|
|
33
|
+
|
|
34
|
+
// 👎 Hidden values and transform strings become computed in Studio
|
|
35
|
+
const translateY = interpolate(frame, [0, 100], [0, 120]);
|
|
36
|
+
const rotation = interpolate(frame, [0, 100], [0, 20]);
|
|
37
|
+
|
|
38
|
+
style={{
|
|
39
|
+
transform: `translateY(${translateY}px) rotate(${rotation}deg)`,
|
|
40
|
+
}}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
Use `transform` strings only when individual CSS transform properties do not cover the effect, such as `skew()`, `perspective()`, or order-sensitive multi-transform chains.
|
|
44
|
+
|
|
45
|
+
## Spring easing
|
|
46
|
+
|
|
47
|
+
A nice push movement with no bounce:
|
|
48
|
+
|
|
49
|
+
```ts
|
|
50
|
+
import { interpolate, Easing } from "remotion";
|
|
51
|
+
|
|
52
|
+
const opacity = interpolate(frame, [0, 0.3 * fps], [0, 1], {
|
|
53
|
+
easing: Easing.spring({damping: 200}),
|
|
54
|
+
extrapolateLeft: "clamp",
|
|
55
|
+
extrapolateRight: "clamp",
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Bézier easing
|
|
60
|
+
|
|
61
|
+
Pass values like you would to a CSS cubic-bezier function.
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import { interpolate, Easing } from "remotion";
|
|
65
|
+
|
|
66
|
+
const opacity = interpolate(frame, [0, 0.3 * fps], [0, 1], {
|
|
67
|
+
easing: Easing.bezier(0.16, 1, 0.3, 1),
|
|
68
|
+
extrapolateLeft: "clamp",
|
|
69
|
+
extrapolateRight: "clamp",
|
|
70
|
+
});
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
## Animating scale
|
|
74
|
+
|
|
75
|
+
When animating scale, if the output is linear, the perceived scale would be smaller the larger the scale gets.
|
|
76
|
+
Use this option to compensate:
|
|
77
|
+
|
|
78
|
+
```ts
|
|
79
|
+
const scale = interpolate(frame, [0, 0.3 * fps], [0, 1], {
|
|
80
|
+
easing: Easing.bezier(0.16, 1, 0.3, 1),
|
|
81
|
+
extrapolateLeft: "clamp",
|
|
82
|
+
extrapolateRight: "clamp",
|
|
83
|
+
output: 'perceptual-scale' // <- Add this to scale animations
|
|
84
|
+
});
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
## Multiple keyframes
|
|
88
|
+
|
|
89
|
+
Add as many keyframes as you want. For multiple easings, pass an array with `n - 1` items:
|
|
90
|
+
|
|
91
|
+
```ts
|
|
92
|
+
const scale = interpolate(frame, [0, 1 * fps, 9 * fps, 10 * fps], [0, 1, 1, 0], {
|
|
93
|
+
easing: [Easing.bezier(0.16, 1, 0.3, 1), Easing.linear, Easing.spring({damping: 200})],
|
|
94
|
+
extrapolateLeft: "clamp",
|
|
95
|
+
extrapolateRight: "clamp",
|
|
96
|
+
output: 'perceptual-scale' // <- Add this to scale animations
|
|
97
|
+
});
|
|
98
|
+
```
|
|
99
|
+
|
|
100
|
+
## Posterization
|
|
101
|
+
|
|
102
|
+
You can intentionally reduce the frame rate for artistic reason. Use if it makes sense.
|
|
103
|
+
|
|
104
|
+
```ts
|
|
105
|
+
const scale = interpolate(frame, [0, 1 * fps], [0, 1], {
|
|
106
|
+
easing: Easing.bezier(0.16, 1, 0.3, 1),
|
|
107
|
+
extrapolateLeft: "clamp",
|
|
108
|
+
extrapolateRight: "clamp",
|
|
109
|
+
posterize: 3 // Only every 3rd frame is sampled
|
|
110
|
+
});
|
|
111
|
+
```
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: transitions
|
|
3
|
+
description: Scene transitions and overlays for Remotion using TransitionSeries.
|
|
4
|
+
metadata:
|
|
5
|
+
tags: transitions, overlays, fade, slide, wipe, scenes
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
## TransitionSeries
|
|
9
|
+
|
|
10
|
+
`<TransitionSeries>` arranges scenes and supports two ways to enhance the cut point between them:
|
|
11
|
+
|
|
12
|
+
- **Transitions** (`<TransitionSeries.Transition>`) — crossfade, slide, wipe, etc. between two scenes. Shortens the timeline because both scenes play simultaneously during the transition.
|
|
13
|
+
- **Overlays** (`<TransitionSeries.Overlay>`) — render an effect (e.g. a light leak) on top of the cut point without shortening the timeline.
|
|
14
|
+
|
|
15
|
+
Children are absolutely positioned.
|
|
16
|
+
|
|
17
|
+
## Prerequisites
|
|
18
|
+
|
|
19
|
+
```bash
|
|
20
|
+
npx remotion add @remotion/transitions
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Transition example
|
|
24
|
+
|
|
25
|
+
```tsx
|
|
26
|
+
import { TransitionSeries, linearTiming } from "@remotion/transitions";
|
|
27
|
+
import { fade } from "@remotion/transitions/fade";
|
|
28
|
+
|
|
29
|
+
<TransitionSeries>
|
|
30
|
+
<TransitionSeries.Sequence durationInFrames={60}>
|
|
31
|
+
<SceneA />
|
|
32
|
+
</TransitionSeries.Sequence>
|
|
33
|
+
<TransitionSeries.Transition
|
|
34
|
+
presentation={fade()}
|
|
35
|
+
timing={linearTiming({ durationInFrames: 15 })}
|
|
36
|
+
/>
|
|
37
|
+
<TransitionSeries.Sequence durationInFrames={60}>
|
|
38
|
+
<SceneB />
|
|
39
|
+
</TransitionSeries.Sequence>
|
|
40
|
+
</TransitionSeries>;
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Overlay example
|
|
44
|
+
|
|
45
|
+
Any React component can be used as an overlay. For a ready-made effect, see the **light-leaks** rule.
|
|
46
|
+
|
|
47
|
+
```tsx
|
|
48
|
+
import {lightLeak} from '@remotion/effects/light-leak';
|
|
49
|
+
import {TransitionSeries} from '@remotion/transitions';
|
|
50
|
+
import {interpolate, Solid, useCurrentFrame, useVideoConfig} from 'remotion';
|
|
51
|
+
|
|
52
|
+
const LightLeakOverlay: React.FC = () => {
|
|
53
|
+
const frame = useCurrentFrame();
|
|
54
|
+
const {durationInFrames, height, width} = useVideoConfig();
|
|
55
|
+
|
|
56
|
+
return (
|
|
57
|
+
<Solid
|
|
58
|
+
width={width}
|
|
59
|
+
height={height}
|
|
60
|
+
effects={[
|
|
61
|
+
lightLeak({
|
|
62
|
+
progress: interpolate(frame, [0, durationInFrames - 1], [0, 1], {
|
|
63
|
+
extrapolateLeft: 'clamp',
|
|
64
|
+
extrapolateRight: 'clamp',
|
|
65
|
+
}),
|
|
66
|
+
}),
|
|
67
|
+
]}
|
|
68
|
+
/>
|
|
69
|
+
);
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
<TransitionSeries>
|
|
73
|
+
<TransitionSeries.Sequence durationInFrames={60}>
|
|
74
|
+
<SceneA />
|
|
75
|
+
</TransitionSeries.Sequence>
|
|
76
|
+
<TransitionSeries.Overlay durationInFrames={20}>
|
|
77
|
+
<LightLeakOverlay />
|
|
78
|
+
</TransitionSeries.Overlay>
|
|
79
|
+
<TransitionSeries.Sequence durationInFrames={60}>
|
|
80
|
+
<SceneB />
|
|
81
|
+
</TransitionSeries.Sequence>
|
|
82
|
+
</TransitionSeries>;
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
## Mixing transitions and overlays
|
|
86
|
+
|
|
87
|
+
Transitions and overlays can coexist in the same `<TransitionSeries>`, but an overlay cannot be adjacent to a transition or another overlay.
|
|
88
|
+
|
|
89
|
+
```tsx
|
|
90
|
+
import {lightLeak} from '@remotion/effects/light-leak';
|
|
91
|
+
import {TransitionSeries, linearTiming} from '@remotion/transitions';
|
|
92
|
+
import {fade} from '@remotion/transitions/fade';
|
|
93
|
+
import {interpolate, Solid, useCurrentFrame, useVideoConfig} from 'remotion';
|
|
94
|
+
|
|
95
|
+
const LightLeakOverlay: React.FC = () => {
|
|
96
|
+
const frame = useCurrentFrame();
|
|
97
|
+
const {durationInFrames, height, width} = useVideoConfig();
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<Solid
|
|
101
|
+
width={width}
|
|
102
|
+
height={height}
|
|
103
|
+
effects={[
|
|
104
|
+
lightLeak({
|
|
105
|
+
progress: interpolate(frame, [0, durationInFrames - 1], [0, 1], {
|
|
106
|
+
extrapolateLeft: 'clamp',
|
|
107
|
+
extrapolateRight: 'clamp',
|
|
108
|
+
}),
|
|
109
|
+
}),
|
|
110
|
+
]}
|
|
111
|
+
/>
|
|
112
|
+
);
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
<TransitionSeries>
|
|
116
|
+
<TransitionSeries.Sequence durationInFrames={60}>
|
|
117
|
+
<SceneA />
|
|
118
|
+
</TransitionSeries.Sequence>
|
|
119
|
+
<TransitionSeries.Overlay durationInFrames={30}>
|
|
120
|
+
<LightLeakOverlay />
|
|
121
|
+
</TransitionSeries.Overlay>
|
|
122
|
+
<TransitionSeries.Sequence durationInFrames={60}>
|
|
123
|
+
<SceneB />
|
|
124
|
+
</TransitionSeries.Sequence>
|
|
125
|
+
<TransitionSeries.Transition
|
|
126
|
+
presentation={fade()}
|
|
127
|
+
timing={linearTiming({ durationInFrames: 15 })}
|
|
128
|
+
/>
|
|
129
|
+
<TransitionSeries.Sequence durationInFrames={60}>
|
|
130
|
+
<SceneC />
|
|
131
|
+
</TransitionSeries.Sequence>
|
|
132
|
+
</TransitionSeries>;
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## Transition props
|
|
136
|
+
|
|
137
|
+
`<TransitionSeries.Transition>` requires:
|
|
138
|
+
|
|
139
|
+
- `presentation` — the visual effect (e.g. `fade()`, `slide()`, `wipe()`).
|
|
140
|
+
- `timing` — controls speed and easing (e.g. `linearTiming()`, `springTiming()`).
|
|
141
|
+
|
|
142
|
+
## Overlay props
|
|
143
|
+
|
|
144
|
+
`<TransitionSeries.Overlay>` accepts:
|
|
145
|
+
|
|
146
|
+
- `durationInFrames` — how long the overlay is visible (positive integer).
|
|
147
|
+
- `offset?` — shifts the overlay relative to the cut point center. Positive = later, negative = earlier. Default: `0`.
|
|
148
|
+
|
|
149
|
+
## Available transition types
|
|
150
|
+
|
|
151
|
+
Import transitions from their respective modules:
|
|
152
|
+
|
|
153
|
+
```tsx
|
|
154
|
+
import { fade } from "@remotion/transitions/fade";
|
|
155
|
+
import { slide } from "@remotion/transitions/slide";
|
|
156
|
+
import { wipe } from "@remotion/transitions/wipe";
|
|
157
|
+
import { flip } from "@remotion/transitions/flip";
|
|
158
|
+
import { clockWipe } from "@remotion/transitions/clock-wipe";
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
## Slide transition with direction
|
|
162
|
+
|
|
163
|
+
```tsx
|
|
164
|
+
import { slide } from "@remotion/transitions/slide";
|
|
165
|
+
|
|
166
|
+
<TransitionSeries.Transition
|
|
167
|
+
presentation={slide({ direction: "from-left" })}
|
|
168
|
+
timing={linearTiming({ durationInFrames: 20 })}
|
|
169
|
+
/>;
|
|
170
|
+
```
|
|
171
|
+
|
|
172
|
+
Directions: `"from-left"`, `"from-right"`, `"from-top"`, `"from-bottom"`
|
|
173
|
+
|
|
174
|
+
## Timing options
|
|
175
|
+
|
|
176
|
+
```tsx
|
|
177
|
+
import { linearTiming, springTiming } from "@remotion/transitions";
|
|
178
|
+
|
|
179
|
+
// Linear timing - constant speed
|
|
180
|
+
linearTiming({ durationInFrames: 20 });
|
|
181
|
+
|
|
182
|
+
// Spring timing - organic motion
|
|
183
|
+
springTiming({ config: { damping: 200 }, durationInFrames: 25 });
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
## Duration calculation
|
|
187
|
+
|
|
188
|
+
Transitions overlap adjacent scenes, so the total composition length is **shorter** than the sum of all sequence durations. Overlays do **not** affect the total duration.
|
|
189
|
+
|
|
190
|
+
For example, with two 60-frame sequences and a 15-frame transition:
|
|
191
|
+
|
|
192
|
+
- Without transitions: `60 + 60 = 120` frames
|
|
193
|
+
- With transition: `60 + 60 - 15 = 105` frames
|
|
194
|
+
|
|
195
|
+
Adding an overlay between two other sequences does not change the total.
|
|
196
|
+
|
|
197
|
+
### Getting the duration of a transition
|
|
198
|
+
|
|
199
|
+
Use the `getDurationInFrames()` method on the timing object:
|
|
200
|
+
|
|
201
|
+
```tsx
|
|
202
|
+
import { linearTiming, springTiming } from "@remotion/transitions";
|
|
203
|
+
|
|
204
|
+
const linearDuration = linearTiming({
|
|
205
|
+
durationInFrames: 20,
|
|
206
|
+
}).getDurationInFrames({ fps: 30 });
|
|
207
|
+
// Returns 20
|
|
208
|
+
|
|
209
|
+
const springDuration = springTiming({
|
|
210
|
+
config: { damping: 200 },
|
|
211
|
+
}).getDurationInFrames({ fps: 30 });
|
|
212
|
+
// Returns calculated duration based on spring physics
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
For `springTiming` without an explicit `durationInFrames`, the duration depends on `fps` because it calculates when the spring animation settles.
|
|
216
|
+
|
|
217
|
+
### Calculating total composition duration
|
|
218
|
+
|
|
219
|
+
```tsx
|
|
220
|
+
import { linearTiming } from "@remotion/transitions";
|
|
221
|
+
|
|
222
|
+
const scene1Duration = 60;
|
|
223
|
+
const scene2Duration = 60;
|
|
224
|
+
const scene3Duration = 60;
|
|
225
|
+
|
|
226
|
+
const timing1 = linearTiming({ durationInFrames: 15 });
|
|
227
|
+
const timing2 = linearTiming({ durationInFrames: 20 });
|
|
228
|
+
|
|
229
|
+
const transition1Duration = timing1.getDurationInFrames({ fps: 30 });
|
|
230
|
+
const transition2Duration = timing2.getDurationInFrames({ fps: 30 });
|
|
231
|
+
|
|
232
|
+
const totalDuration =
|
|
233
|
+
scene1Duration +
|
|
234
|
+
scene2Duration +
|
|
235
|
+
scene3Duration -
|
|
236
|
+
transition1Duration -
|
|
237
|
+
transition2Duration;
|
|
238
|
+
// 60 + 60 + 60 - 15 - 20 = 145 frames
|
|
239
|
+
```
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
Remotion can be used for bare-bones video editing in the Studio. Choose the source structure based on the editing behavior you want:
|
|
2
|
+
|
|
3
|
+
- Use independently positioned clips when moving or resizing one clip should not affect any other clip.
|
|
4
|
+
- Use ripple editing when changing one clip's duration should reposition every clip after it.
|
|
5
|
+
|
|
6
|
+
Keep every editable clip as its own authored JSX node. Do not generate editable clips with `.map()` or another programmatic loop.
|
|
7
|
+
|
|
8
|
+
## Independently positioned clips
|
|
9
|
+
|
|
10
|
+
Place every `<Video>` directly in the composition and hardcode its timing props. `from={0}` may be omitted:
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
<Video
|
|
14
|
+
src="https://remotion.media/video.mp4"
|
|
15
|
+
trimBefore={0}
|
|
16
|
+
durationInFrames={78}
|
|
17
|
+
/>
|
|
18
|
+
<Video
|
|
19
|
+
src="https://remotion.media/video.webm"
|
|
20
|
+
trimBefore={12}
|
|
21
|
+
from={78}
|
|
22
|
+
durationInFrames={66}
|
|
23
|
+
/>
|
|
24
|
+
<Video
|
|
25
|
+
src="https://remotion.media/video.mp4"
|
|
26
|
+
trimBefore={72}
|
|
27
|
+
from={144}
|
|
28
|
+
durationInFrames={90}
|
|
29
|
+
/>
|
|
30
|
+
<Video
|
|
31
|
+
src="https://remotion.media/video.webm"
|
|
32
|
+
trimBefore={58}
|
|
33
|
+
from={234}
|
|
34
|
+
durationInFrames={72}
|
|
35
|
+
/>
|
|
36
|
+
<Video
|
|
37
|
+
src="https://remotion.media/video.mp4"
|
|
38
|
+
trimBefore={180}
|
|
39
|
+
from={306}
|
|
40
|
+
durationInFrames={60}
|
|
41
|
+
/>
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
- `from` is the clip's absolute start frame in its parent timeline.
|
|
45
|
+
- `durationInFrames` is how many frames the clip remains visible.
|
|
46
|
+
- `trimBefore` is how many source frames are skipped before playback begins.
|
|
47
|
+
- Each `<Video>` must be a separate JSX node. Add a descriptive `name` when useful in the Studio timeline.
|
|
48
|
+
- `from`, `durationInFrames`, and `trimBefore` must be hardcoded frame values. Do not compute them.
|
|
49
|
+
- Import `<Video>` from `@remotion/media`.
|
|
50
|
+
|
|
51
|
+
Moving or resizing one of these clips does not reposition later clips. Gaps and overlaps are therefore allowed.
|
|
52
|
+
|
|
53
|
+
## Ripple editing with `TransitionSeries`
|
|
54
|
+
|
|
55
|
+
“Ripple editing” is the standard video-editing term for changing one clip and automatically shifting everything after it.
|
|
56
|
+
In Remotion, a `<TransitionSeries>` provides this sequential, cascading timing model while also allowing transitions between clips.
|
|
57
|
+
|
|
58
|
+
Read [transitions.md](transitions.md) for transition types, timing options, installation instructions, and composition-duration calculation.
|
|
59
|
+
|
|
60
|
+
Keep the markup like this:
|
|
61
|
+
|
|
62
|
+
```tsx
|
|
63
|
+
<TransitionSeries name="Video timeline">
|
|
64
|
+
<TransitionSeries.Sequence name="Clip 1" durationInFrames={39}>
|
|
65
|
+
<Video
|
|
66
|
+
src="https://remotion.media/video.mp4"
|
|
67
|
+
trimBefore={0}
|
|
68
|
+
/>
|
|
69
|
+
</TransitionSeries.Sequence>
|
|
70
|
+
<TransitionSeries.Sequence name="Clip 2" durationInFrames={45}>
|
|
71
|
+
<Video
|
|
72
|
+
src="https://remotion.media/video.webm"
|
|
73
|
+
trimBefore={8}
|
|
74
|
+
/>
|
|
75
|
+
</TransitionSeries.Sequence>
|
|
76
|
+
<TransitionSeries.Sequence name="Clip 3" durationInFrames={43}>
|
|
77
|
+
<Video
|
|
78
|
+
src="https://remotion.media/video.mp4"
|
|
79
|
+
trimBefore={60}
|
|
80
|
+
/>
|
|
81
|
+
</TransitionSeries.Sequence>
|
|
82
|
+
</TransitionSeries>
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
- The `<TransitionSeries.Sequence>` is the editable clip row in the Studio timeline.
|
|
86
|
+
- Dragging its right edge changes `durationInFrames` and repositions every later sequence.
|
|
87
|
+
- Do not set `from` on `<TransitionSeries.Sequence>`; the series calculates each start frame.
|
|
88
|
+
- Hardcode all numeric values.
|
|
89
|
+
- Do not programmatically create multiple `<TransitionSeries.Sequence>` (no `.map`). Each instance must be hard-coded.
|
|
90
|
+
- Import `<Video>` from `@remotion/media`. Import `<TransitionSeries>` from `@remotion/transitions`. If needing to install: `npx remotion add @remotion/media @remotion/transitions`
|