Skip to content

[pull] main from remotion-dev:main#851

Merged
pull[bot] merged 49 commits into
code:mainfrom
remotion-dev:main
May 21, 2026
Merged

[pull] main from remotion-dev:main#851
pull[bot] merged 49 commits into
code:mainfrom
remotion-dev:main

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 21, 2026

See Commits and Changes for more details.


Created by pull[bot] (v2.0.0-alpha.4)

Can you help keep this open source service alive? 💖 Please sponsor : )

JonnyBurger and others added 30 commits May 20, 2026 16:16
Pass the composition registration stack through Studio codemods so
duplicate, rename, and delete edit the file where `<Composition>` is
defined instead of guessing the root file. Refactor template-recorder
registration to use the shared applyCodemodToFile helper.

Fixes #6992

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Export blur from the package root and @remotion/effects/blur subpath,
add horizontal/vertical axis options, document the effect, and update
examples to use the public import.

Closes #7495

Co-authored-by: Cursor <cursoragent@cursor.com>
When a <Composition> is the sole return value of a wrapper component
(e.g. `return (<Composition id="X" .../>)`) or the concise body of an
arrow function, the recast-mods walker only inspected JSX children and
never touched the element itself, so delete/rename/duplicate codemods
threw "Unable to calculate the changes needed for this file."

Now we detect this position and:
- delete-composition: replace the JSXElement with `null` (`return null;`)
- rename-composition: rewrite the id attribute in place
- duplicate-composition: wrap original + new element in a JSXFragment

When wrapping into a fragment we also strip Babel's `extra.parenthesized`
hint from the moved children so recast does not emit stray `(` / `)`
characters from the original `return (...)` parens.

Co-authored-by: Cursor <cursoragent@cursor.com>
Swap the flat #0b84f3 and pink scene backgrounds used in the transition
docs for textured photos so transitions and effects are easier to see.
Table of contents previews load smaller variants. The pre-rendered
html-in-canvas videos have been re-rendered to match.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Track delay-playback handles so in-flight decode/seek work arms the player
buffer when premount ends, and disarms again when re-entering premount.

Fixes #7510

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…cated-stack

`@remotion/studio`: Use symbolicated stack for composition codemods
Docs: Replace solid backgrounds in transition demos with textured images
- Remove `blur` from main package root entry; subpath import only
- Switch docs/README examples to `<Video>` from `@remotion/media`
- Add `typesVersions` for legacy moduleResolution to find `./blur`
- Wire `@remotion/effects` into docs package + tsconfig references
- Add a preview thumbnail to the @remotion/effects table of contents
- Simplify Studio schema labels (Blur / Horizontal / Vertical)
- Reorder sidebar alphabetically (effects, elevenlabs, enable-scss)
- Update package description in package.json and studio-shared
- Add effect-key regression test for axis flags
- Document the radius:0 shader passthrough trick

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
The Table of Contents on /docs/transitions/ uses `pointerenter` on each
preview tile to start the transition. The listener was attached
imperatively inside a `useEffect`, which runs after commit, hydration
and paint. `pointerenter` only fires on a transition *into* the element,
so whenever the user's cursor was already over a tile when the listener
was attached (very easy to do on this page: many small tiles, hydration
after SSR, the `<Player>` can briefly render `null` while its
composition config resolves and then mount again under the cursor), the
first hover was missed and the preview never played.

Wrap the `<Player>` in a div with React's synthetic `onPointerEnter` and
additionally trigger the preview once on mount if the wrapper already
matches `:hover`, so the cursor-already-inside case is also covered.

Fixes #7528

Co-authored-by: Cursor <cursoragent@cursor.com>
…ability

Docs: Make transition presentation hover-to-preview reliable
`@remotion/effects`: Promote blur() to public API with axis control
`<Img>` does not accept the `effects` prop, so it should not be listed
as an example of a Remotion-based canvas component that supports
effects. Use `<HtmlInCanvas>` instead, which actually supports the
`effects` prop.

Refs #7530

Co-authored-by: Cursor <cursoragent@cursor.com>
- Delete 3 unreferenced files from packages/example/public/ (~14 MB):
  long-video.mp4, spiral_.mp4, video.mp4.
- Move 12 largest referenced fixtures and sounds/1.wav-9.wav to
  https://remotion.media/... URLs (~157 MB removed from public/).
- Inline the remote URLs at the call sites in packages/example/src/.
- Add a small cached-example-media module in @remotion/example-videos
  that downloads the files into node_modules/.videos as part of make,
  so media-parser tests still see them as local file paths.

Co-authored-by: Cursor <cursoragent@cursor.com>
#7522)

* `@remotion/web-renderer`: Fix collapsed spaces between words in canvas text

Measure one token per visual line with the Range API instead of
per-word DOM mutations, so whitespace is not measured as zero width.

Fixes #7489

Co-authored-by: Aryan <aryan@heygaia.io>
Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix TypeScript and lint errors in findWords

- Use `instanceof Text` so the guard narrows `ChildNode` to `Text`,
  fixing 4 TS2345 errors at the `measureRange` call sites.
- Destructure `top` from `measureRange` to satisfy `prefer-destructuring`.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Add visual regression test for issue 7489

Mirrors the minimal repro from #7489 (`<span>ship it tomorrow?</span>`
inside an AbsoluteFill) so future regressions of the inter-word-space
collapsing bug are caught by snapshot diffs across chromium, firefox,
and webkit.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Revert findWords rewrite, keep issue-7489 fixture

The line-break-based rewrite of findWords caused regressions. Restore
the original Intl.Segmenter implementation and drop the regression
test + baseline snapshots that depended on the fix.

The issue-7489 fixture and its Root.tsx entry are kept so the bug stays
reproducible in the studio testbed for whoever picks this up next.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Restore issue-7489 visual test for debugging

Keep the test harness alongside the fixture so the next person can
iterate on a fix and see the snapshot diff change as they go.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Aryan <aryan@heygaia.io>
Co-authored-by: Cursor <cursoragent@cursor.com>
…sehood-7530

Docs: Replace `<Img>` with `<HtmlInCanvas>` in effects intro
Replace the experimental 2D slice renderer with a WebGL2 UV warp,
rename evolution to phase, add a direction enum, remove background and
sliceWidth, and export wave from @remotion/effects/wave with docs.

Co-authored-by: Cursor <cursoragent@cursor.com>
- turbo.json: cache node_modules/.videos for @remotion/example-videos#make
  so that downloaded test fixtures are restored on turbo cache hits.
  Without this, Ubuntu and browser-test jobs failed because the make task
  was cached, dist/ was restored, but the downloaded videos under
  node_modules/.videos/ were missing.
- AudioTesting/index.tsx: stop looking up music.mp3 via getStaticFiles()
  (the file no longer exists in public/) and inline the
  https://remotion.media/music.mp3 URL instead. Fixes the
  "audio-testing" composition rendering test on macOS.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Add HtmlInCanvas + Img preview compositions, regenerate blur at radius 15,
and render wave preview stills for the effects table of contents.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
PR #7529 tried to fix unreliable hover-to-preview on /docs/transitions/
by wrapping the Player and handling :hover on mount. That did not fix
the issue.

The player was blocked waiting for the AudioContext to resume while
unmuted. Set initiallyMuted on the preview tiles so playback can start
on hover without requiring user gesture for audio.

Reverts #7529
Fixes #7528

Co-authored-by: Cursor <cursoragent@cursor.com>
Wrap <Img> in <Sequence layout="none"> for timeline registration, matching the @remotion/media Video pattern. Remove useImageInTimeline and register image sequences in Sequence.tsx.

Fixes #6989

Co-authored-by: Cursor <cursoragent@cursor.com>
JonnyBurger and others added 19 commits May 21, 2026 17:35
Stop re-exporting docs components from @remotion/example; they lived
outside example's tsconfig rootDir and broke CI.

Co-authored-by: Cursor <cursoragent@cursor.com>
…n chain (#7535)

* Fix upside-down WebGL effects after 2D effects in chain

Only enable UNPACK_FLIP_Y_WEBGL when uploading raw DOM media. Skip the
flip for ImageBitmap bridge outputs and prior WebGL ping-pong canvases
so wave + blur and similar stacks render upright.

Fixes #7483

Co-authored-by: Cursor <cursoragent@cursor.com>

* Narrow WebGL Y-flip to actual effect-chain sources

Only flip 2D frame canvases and ImageBitmap/WebGL pool outputs from
runEffectChain — not HTMLVideoElement/HTMLImageElement, which are not
used as effect sources (@remotion/media uses WrappedCanvas.canvas).

Co-authored-by: Cursor <cursoragent@cursor.com>

* Fix 2D→WebGL effect bridge orientation in runEffectChain

Skip createImageBitmap when handing 2D output to WebGL so blur uses the
same canvas + UNPACK_FLIP_Y path as blur-only. Pass flipSourceY from the
chain runtime instead of guessing from source type.

Co-authored-by: Cursor <cursoragent@cursor.com>

* Use flipSourceY for light leak and starburst effect uploads

WebGL effects in @remotion/light-leaks and @remotion/starburst sample
uSource via texImage2D; respect flipSourceY from runEffectChain like blur
and halftone so 2D→WebGL chains stay upright.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
Pass only {type: 'image', src} to Sequence and let it handle registerSequence.

Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
…ially-muted

Docs: Fix transition hover preview with initiallyMuted (revert #7529)
Co-authored-by: Cursor <cursoragent@cursor.com>
`@remotion/effects`: Graduate wave() with WebGL2 warp
Implements a `dissolve()` HTML-in-canvas presentation ported from the
gl-transitions "dissolve" shader. The transition burns the outgoing
scene away using a luminance threshold, revealing the incoming scene
through a configurable glowing edge.

Closes #7513

Co-authored-by: Cursor <cursoragent@cursor.com>
Move large example public assets to remotion.media
Co-authored-by: Cursor <cursoragent@cursor.com>

# Conflicts:
#	packages/example/src/HtmlInCanvas/index.tsx
#	packages/example/src/Root.tsx
`remotion`: `<Img>` inherits from `<Sequence layout="none">`
`@remotion/transitions`: Add `dissolve()` HTML-in-canvas presentation
@pull pull Bot locked and limited conversation to collaborators May 21, 2026
@pull pull Bot added the ⤵️ pull label May 21, 2026
@pull pull Bot merged commit be1668b into code:main May 21, 2026
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant