Skip to content

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

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

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

Conversation

@pull
Copy link
Copy Markdown

@pull pull Bot commented May 20, 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 10:47
Streamline timeline list and expanded rows to use a shared row chrome
with depth-based padding, fixed eye/arrow columns, and correct effect
field auxiliaryKeys for expansion state keys.

Closes #7469

Co-authored-by: Cursor <cursoragent@cursor.com>
Use valid SequencePropsSubscriptionKey shape, required schema defaults,
and type assertions so tsgo includes the test file without errors.

Co-authored-by: Cursor <cursoragent@cursor.com>
- Wrap `<RemotionRiveCanvas>` in a `<Sequence layout="none">` so it shows up in
  the timeline and supports inheritable Sequence props (`from`,
  `durationInFrames`, `name`, `showInTimeline`, `hidden`).
- Attach a schema (fit, alignment, visual style, hidden) so the studio can
  display draggable controls for the canvas.
- Hook into the effect chain via `_experimentalEffects`: Rive now draws to an
  internal source canvas and the result is composited onto the visible canvas
  through `runEffectChain`. When effects change without the frame advancing,
  the canvas is redrawn so the new effect parameters take effect immediately.
- Expose `className` and `style` props for the underlying `<canvas>`.

Closes #7470.

Co-authored-by: Cursor <cursoragent@cursor.com>
Apply nesting indent after the eye column so the visibility toggle
stays pinned to the left edge while depth padding shifts arrow and
content to the right.

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

- Add a `RemotionRiveCanvas` tile to `ExperimentalControlsShowcase` so we can
  verify schema + sequenceVisualStyleSchema controls (translate / scale /
  rotate / opacity / hidden) wire through.
- Add `rive-effects-testbed` composition (`packages/example/src/Rive/RiveEffects.tsx`)
  that mirrors `EffectsTestbed` but uses `<RemotionRiveCanvas>` to exercise
  the effects pipeline (baseline, tint, halftone, animated blur, animated
  wave, and a stacked chain). The animated blur tile also covers the
  "redraw on effect change" path: its radius pulses between frames.

Co-authored-by: Cursor <cursoragent@cursor.com>
Control fields (e.g. styles) now appear first in the expanded
timeline section, with the Effects group listed underneath.

Co-authored-by: Cursor <cursoragent@cursor.com>
Subtract the left chrome width (padding, eye, indent, arrow) from the
50% label column so value editors start at the same horizontal position
regardless of tree depth.

Co-authored-by: Cursor <cursoragent@cursor.com>
Give field label columns an extra 15px of width and remove the
timeline tree layout unit tests.

Co-authored-by: Cursor <cursoragent@cursor.com>
`addSequenceStackTraces(RemotionRiveCanvas)` injects a `stack` prop via the
React.createElement proxy, but the inner component was destructuring known
props and dropping the rest. Spread `...props` (which contains `stack`) onto
the wrapping `<Sequence>` so the studio can resolve the source location of
each Rive instance, matching what `<Solid>` does.

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

The previous draw path wrapped the rive draw ops in
\`riveCanvasInstance.requestAnimationFrame(...)\`. The Rive runtime only
flushes the renderer's queued draw calls at the *end* of that callback,
but \`runEffectChain\` reads from \`sourceCanvas\` from *inside* the same
callback - i.e. before the flush.

Symptom: the first paint after mount composites an empty source canvas
onto the visible canvas, so nothing is shown. After the user seeks (or
otherwise re-runs the effect), the source canvas has the *previous*
frame's pixels, which is why "it draws after seek".

Fix: drop the Rive-wrapped rAF and do the draw synchronously inside
\`useEffect\`, calling \`resolveAnimationFrame()\` ourselves between the
rive draw and the effect chain. This is exactly the pattern the
\`resolveAnimationFrame\` docstring describes for non-rive-rAF draw loops.

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

Once `CompositionErrorBoundary` caught a runtime error in a composition,
it stayed in `hasError = true` forever and never tried to render the
children again. After the user fixed the bug, the boundary's children
were never re-rendered, the studio's `renderError` was never cleared, and
the error UI persisted until a full page reload. See #7447.

This fixes it by giving the boundary a `resetKey` prop, sourced from a
new `FastRefreshSignalContext` that the studio bumps every time webpack
HMR settles. When the key changes, `getDerivedStateFromProps` drops the
error flag and the boundary retries rendering its children — either
catching a fresh error or, in the happy path, calling `onClear()` so the
error UI dismisses. `componentDidMount` also calls `onClear()` to cover
the case where Fast Refresh remounts the boundary entirely.

Covered by a new Playwright e2e test
(`packages/example/e2e/error-overlay.test.mts`) that toggles a `blur({})`
parameter to reproduce the original report.

Co-authored-by: Cursor <cursoragent@cursor.com>
`@remotion/studio`: Fix timeline indentation
`@remotion/rive`: Integrate effects system with Rive
Replaces the overlapping `isTrackHidden` helper and redundant
`showInTimeline` checks with a single `shouldShowTrackInTimeline`
predicate, so the rules for whether a track appears in the timeline
list live in one self-documenting place.

Closes #7471

Co-authored-by: Cursor <cursoragent@cursor.com>
The previous commit propagated a Fast Refresh counter through a new
`FastRefreshSignalContext` so `CompositionErrorBoundary` could see it as
a `resetKey` prop. That worked but re-rendered every consumer of the
context on every HMR cycle.

Move the HMR awareness into the boundary itself: while in the error
state, subscribe to `__webpack_module__.hot.addStatusHandler` and drop
`hasError` on the next `idle` status. Unsubscribe on success or unmount,
so there are no extra renders elsewhere in the tree when no error is
active.

`componentDidMount` still calls `onClear()` when mounted in the success
state to cover Fast Refresh remounting the errored boundary in place
during `apply` — the new instance has nothing to transition from, so the
status handler approach alone wouldn't dismiss the stale host error.

Reverts the context plumbing in `Composition.tsx`, `internals.ts`, and
`FastRefreshProvider.tsx`, and deletes `fast-refresh-signal-context.ts`.
The Playwright regression test in
`packages/example/e2e/error-overlay.test.mts` still passes.

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

`@remotion/studio`: Consolidate timeline `showInTimeline` filtering
Adds a third HMR cycle to the regression test for #7447: after the
boundary has reset once and successfully rendered the children, breaking
the composition again should bring the error UI back. Guards against
regressions where the boundary gets stuck in the success state after
the first HMR reset.

Also refactors the file-write + wait-for-rebuild dance into a local
helper to keep the three cycles readable.

Co-authored-by: Cursor <cursoragent@cursor.com>
Adds `_experimentalEffects` support, runs the chain at intrinsic GIF dimensions, and adds a Studio testbed composition. Fixes #7477.

Co-authored-by: Cursor <cursoragent@cursor.com>
Move Rive, Gif, AnimatedImage, and video effect compositions out of unrelated folders into a dedicated Effects folder.

Co-authored-by: Cursor <cursoragent@cursor.com>
Bumps [turbo](https://github.com/vercel/turborepo) from 2.9.3 to 2.9.14.
- [Release notes](https://github.com/vercel/turborepo/releases)
- [Changelog](https://github.com/vercel/turborepo/blob/main/RELEASE.md)
- [Commits](vercel/turborepo@v2.9.3...v2.9.14)

---
updated-dependencies:
- dependency-name: turbo
  dependency-version: 2.9.14
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Omit `_experimentalEffects` from inherited `SequenceProps` before re-adding it as `EffectsProp`, avoiding an intersection with `EffectDefinition[]` that broke effect factories in the example package.

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

Bump turbo from 2.9.3 to 2.9.14
Co-authored-by: pullfrog[bot] <226033991+pullfrog[bot]@users.noreply.github.com>
…ring-7447

`remotion`: Dismiss in-canvas error overlay after Fast Refresh fixes the bug
Co-authored-by: Cursor <cursoragent@cursor.com>
Fixes react-hooks/exhaustive-deps lint failure in CI.

Co-authored-by: Cursor <cursoragent@cursor.com>
Docs: Document PDF not supported on Lambda for still renders
`@remotion/gif`: Integrate effect system with `<Gif>`
* Rename effects API for launch (#7476)

Ship the public `effects` prop on canvas sources while keeping sequence
registration internal via `_remotionInternalEffects`. Consolidate
`@remotion/effects` presets under `EffectInternals` with no documented
subpath exports yet.

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

* Fix gif effects rename after merging main (#7476)

Update @remotion/gif and example compositions to use `effects` and
`_remotionInternalEffects`. Fix studio-server memfs assignment for tsgo.

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

* Fix lost-node-path e2e for renamed effects API

Update the issue #7393 refactor fixture to use memoizedEffects and
EffectInternals.tint so the Sequence line shifts after refactor.

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

* Rename findExperimentalEffectsAttr to findEffectsAttr

Remove the last experimental-effects naming from studio-server AST
helpers. They already match the `effects` JSX attribute.

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

* Remove dead empty index.mjs fallback in effects bundle

EffectInternals exports make the export {} workaround unnecessary.

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

---------

Co-authored-by: Cursor <cursoragent@cursor.com>
@pull pull Bot locked and limited conversation to collaborators May 20, 2026
@pull pull Bot added the ⤵️ pull label May 20, 2026
@pull pull Bot merged commit a431828 into code:main May 20, 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