diff --git a/bun.lock b/bun.lock index 6f99eebbb63..d0c18ec81a9 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "remotion-monorepo", "dependencies": { "p-limit": "7.2.0", - "turbo": "2.8.10", + "turbo": "2.8.11-canary.19", "typescript": "5.9.3", }, "devDependencies": { @@ -7544,21 +7544,21 @@ "tunnel-rat": ["tunnel-rat@0.1.2", "", { "dependencies": { "zustand": "4.5.5" } }, "sha512-lR5VHmkPhzdhrM092lI2nACsLO4QubF0/yoOhzX7c+wIpbN1GjHNzCc91QlpxBi+cnx8vVJ+Ur6vL5cEoQPFpQ=="], - "turbo": ["turbo@2.8.10", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.10", "turbo-darwin-arm64": "2.8.10", "turbo-linux-64": "2.8.10", "turbo-linux-arm64": "2.8.10", "turbo-windows-64": "2.8.10", "turbo-windows-arm64": "2.8.10" }, "bin": { "turbo": "bin/turbo" } }, "sha512-OxbzDES66+x7nnKGg2MwBA1ypVsZoDTLHpeaP4giyiHSixbsiTaMyeJqbEyvBdp5Cm28fc+8GG6RdQtic0ijwQ=="], + "turbo": ["turbo@2.8.11-canary.19", "", { "optionalDependencies": { "turbo-darwin-64": "2.8.11-canary.19", "turbo-darwin-arm64": "2.8.11-canary.19", "turbo-linux-64": "2.8.11-canary.19", "turbo-linux-arm64": "2.8.11-canary.19", "turbo-windows-64": "2.8.11-canary.19", "turbo-windows-arm64": "2.8.11-canary.19" }, "bin": { "turbo": "bin/turbo" } }, "sha512-5UnY8lKrWReaqO4TNh3VqWS6eS69aMJt6RXNfXNqSqrpqiz+VDMTqAoVjvMbfyRrF+FmTWbYPNYOMBiXmVOZdQ=="], - "turbo-darwin-64": ["turbo-darwin-64@2.8.10", "", { "os": "darwin", "cpu": "x64" }, "sha512-A03fXh+B7S8mL3PbdhTd+0UsaGrhfyPkODvzBDpKRY7bbeac4MDFpJ7I+Slf2oSkCEeSvHKR7Z4U71uKRUfX7g=="], + "turbo-darwin-64": ["turbo-darwin-64@2.8.11-canary.19", "", { "os": "darwin", "cpu": "x64" }, "sha512-d2duAxonNmyUNhk9rmfxs7m32G4ai/FaRk46RaNijJtV0TeveN+G9qMKljZWj6JFND4+WOQjx+La8uzQqdnKyg=="], - "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.10", "", { "os": "darwin", "cpu": "arm64" }, "sha512-sidzowgWL3s5xCHLeqwC9M3s9M0i16W1nuQF3Mc7fPHpZ+YPohvcbVFBB2uoRRHYZg6yBnwD4gyUHKTeXfwtXA=="], + "turbo-darwin-arm64": ["turbo-darwin-arm64@2.8.11-canary.19", "", { "os": "darwin", "cpu": "arm64" }, "sha512-6ciQwknypsxm/zVPd0vhT2I1T80Cjpq2KL4zQUx+QhHWvfSX7TnfIQ0CGm1KWH/nws6YzBgGY/Qid9yf5gUMnw=="], - "turbo-linux-64": ["turbo-linux-64@2.8.10", "", { "os": "linux", "cpu": "x64" }, "sha512-YK9vcpL3TVtqonB021XwgaQhY9hJJbKKUhLv16osxV0HkcQASQWUqR56yMge7puh6nxU67rQlTq1b7ksR1T3KA=="], + "turbo-linux-64": ["turbo-linux-64@2.8.11-canary.19", "", { "os": "linux", "cpu": "x64" }, "sha512-dE+2orDH0aqkfFzc58/JtAZ29gzKk14NnL/eOTG+Ye66YA5+22OQaBLz4SPjCXXmx21Uvb+CzvC0P5FTNTQsGg=="], - "turbo-linux-arm64": ["turbo-linux-arm64@2.8.10", "", { "os": "linux", "cpu": "arm64" }, "sha512-3+j2tL0sG95iBJTm+6J8/45JsETQABPqtFyYjVjBbi6eVGdtNTiBmHNKrbvXRlQ3ZbUG75bKLaSSDHSEEN+btQ=="], + "turbo-linux-arm64": ["turbo-linux-arm64@2.8.11-canary.19", "", { "os": "linux", "cpu": "arm64" }, "sha512-KoV8cfS0PYCoKHDQNsYSicmM0ePRnWiWPww0pyfpEV7hgp+AxCPv5MAkLS60uRtZ2AMKASxiMxOfOSTsEVNV/Q=="], "turbo-stream": ["turbo-stream@2.4.0", "", {}, "sha512-FHncC10WpBd2eOmGwpmQsWLDoK4cqsA/UT/GqNoaKOQnT8uzhtCbg3EoUDMvqpOSAI0S26mr0rkjzbOO6S3v1g=="], - "turbo-windows-64": ["turbo-windows-64@2.8.10", "", { "os": "win32", "cpu": "x64" }, "sha512-hdeF5qmVY/NFgiucf8FW0CWJWtyT2QPm5mIsX0W1DXAVzqKVXGq+Zf+dg4EUngAFKjDzoBeN6ec2Fhajwfztkw=="], + "turbo-windows-64": ["turbo-windows-64@2.8.11-canary.19", "", { "os": "win32", "cpu": "x64" }, "sha512-3QonSs9a+pQ+88qJq2fHJX6rboebMG2BuqO0k8k3XlXV1I0iMXPOqM49/8x7sq80mPiX60BOkN5EO9NuOuONnw=="], - "turbo-windows-arm64": ["turbo-windows-arm64@2.8.10", "", { "os": "win32", "cpu": "arm64" }, "sha512-QGdr/Q8LWmj+ITMkSvfiz2glf0d7JG0oXVzGL3jxkGqiBI1zXFj20oqVY0qWi+112LO9SVrYdpHS0E/oGFrMbQ=="], + "turbo-windows-arm64": ["turbo-windows-arm64@2.8.11-canary.19", "", { "os": "win32", "cpu": "arm64" }, "sha512-zWggjKxOmgGhLzVhphihO1ib0bzZZthBgzm2ypjmq8rj8UBy0FsM0rXQryU/iFUayrB3jdC6g/SO7wjCh/jpoQ=="], "tw-animate-css": ["tw-animate-css@1.4.0", "", {}, "sha512-7bziOlRqH0hJx80h/3mbicLW7o8qLsH5+RaLR2t+OHM3D0JlWGODQKQ4cxbK7WlvmUxpcj6Kgu6EKqjrGFe3QQ=="], diff --git a/package.json b/package.json index 598bb579a05..a964667206f 100644 --- a/package.json +++ b/package.json @@ -57,7 +57,7 @@ "dependencies": { "p-limit": "7.2.0", "typescript": "5.9.3", - "turbo": "2.8.10" + "turbo": "2.8.11-canary.19" }, "packageManager": "bun@1.3.3", "overrides": { diff --git a/packages/cli/src/config/index.ts b/packages/cli/src/config/index.ts index 7ac94ed151b..a45826667a0 100644 --- a/packages/cli/src/config/index.ts +++ b/packages/cli/src/config/index.ts @@ -94,6 +94,7 @@ const { askAIOption, publicLicenseKeyOption, experimentalClientSideRenderingOption, + experimentalVisualModeOption, keyboardShortcutsOption, forceNewStudioOption, numberOfSharedAudioTagsOption, @@ -190,6 +191,12 @@ declare global { * @default false */ readonly setExperimentalRspackEnabled: (enabled: boolean) => void; + /** + * Nothing here yet, but this is our playground for experiments. + * @param enabled Boolean whether to enable experimental visual mode + * @default false + */ + readonly setExperimentalVisualMode: (enabled: boolean) => void; /** * Set number of shared audio tags. https://www.remotion.dev/docs/player/autoplay#using-the-numberofsharedaudiotags-prop * @param numberOfAudioTags @@ -669,6 +676,7 @@ export const Config: FlatConfig = { setExperimentalClientSideRenderingEnabled: experimentalClientSideRenderingOption.setConfig, setExperimentalRspackEnabled: rspackOption.setConfig, + setExperimentalVisualMode: experimentalVisualModeOption.setConfig, setNumberOfSharedAudioTags: numberOfSharedAudioTagsOption.setConfig, setWebpackPollingInMilliseconds: webpackPollOption.setConfig, setShouldOpenBrowser: noOpenOption.setConfig, diff --git a/packages/cli/src/parsed-cli.ts b/packages/cli/src/parsed-cli.ts index 40172ec8086..08085e14742 100644 --- a/packages/cli/src/parsed-cli.ts +++ b/packages/cli/src/parsed-cli.ts @@ -48,6 +48,7 @@ const { webpackPollOption, keyboardShortcutsOption, experimentalClientSideRenderingOption, + experimentalVisualModeOption, imageSequencePatternOption, scaleOption, overwriteOption, @@ -143,6 +144,9 @@ export type CommandLineOptions = { [experimentalClientSideRenderingOption.cliFlag]: TypeOfOption< typeof experimentalClientSideRenderingOption >; + [experimentalVisualModeOption.cliFlag]: TypeOfOption< + typeof experimentalVisualModeOption + >; [mutedOption.cliFlag]: TypeOfOption; [overrideHeightOption.cliFlag]: TypeOfOption; [overrideWidthOption.cliFlag]: TypeOfOption; @@ -189,6 +193,7 @@ export const BooleanFlags = [ headlessOption.cliFlag, keyboardShortcutsOption.cliFlag, experimentalClientSideRenderingOption.cliFlag, + experimentalVisualModeOption.cliFlag, ipv4Option.cliFlag, beepOnFinishOption.cliFlag, disableGitSourceOption.cliFlag, @@ -206,6 +211,7 @@ export const parsedCli = minimist(process.argv.slice(2), { [overwriteOption.cliFlag]: true, [bundleCacheOption.cliFlag]: null, [experimentalClientSideRenderingOption.cliFlag]: null, + [experimentalVisualModeOption.cliFlag]: null, [mutedOption.cliFlag]: null, }, }) as CommandLineOptions & { diff --git a/packages/cli/src/studio.ts b/packages/cli/src/studio.ts index 9f9d706a853..dd1d9ff39f1 100644 --- a/packages/cli/src/studio.ts +++ b/packages/cli/src/studio.ts @@ -24,6 +24,7 @@ const { enableCrossSiteIsolationOption, askAIOption, experimentalClientSideRenderingOption, + experimentalVisualModeOption, keyboardShortcutsOption, forceNewStudioOption, numberOfSharedAudioTagsOption, @@ -146,6 +147,14 @@ export const studioCommand = async ( ); } + const useVisualMode = experimentalVisualModeOption.getValue({ + commandLine: parsedCli, + }).value; + + if (useVisualMode) { + Log.warn({indent: false, logLevel}, 'Enabling experimental visual mode.'); + } + const result = await StudioServerInternals.startStudio({ previewEntry: require.resolve('@remotion/studio/previewEntry'), browserArgs: parsedCli['browser-args'], diff --git a/packages/core/src/Sequence.tsx b/packages/core/src/Sequence.tsx index 136d57616af..bcda63462de 100644 --- a/packages/core/src/Sequence.tsx +++ b/packages/core/src/Sequence.tsx @@ -205,6 +205,8 @@ const RegularSequenceRefForwardingFunction: React.ForwardRefRenderFunction< const env = useRemotionEnvironment(); + const inheritedStack = (other as any)?.stack ?? null; + useEffect(() => { if (!env.isStudio) { return; @@ -221,7 +223,7 @@ const RegularSequenceRefForwardingFunction: React.ForwardRefRenderFunction< showInTimeline, nonce, loopDisplay, - stack: stack ?? null, + stack: stack ?? inheritedStack, premountDisplay: premountDisplay ?? null, postmountDisplay: postmountDisplay ?? null, }); @@ -246,6 +248,7 @@ const RegularSequenceRefForwardingFunction: React.ForwardRefRenderFunction< premountDisplay, postmountDisplay, env.isStudio, + inheritedStack, ]); // Ceil to support floats diff --git a/packages/docs/docs/config.mdx b/packages/docs/docs/config.mdx index fdcfdc03fde..18bf5fdb6e8 100644 --- a/packages/docs/docs/config.mdx +++ b/packages/docs/docs/config.mdx @@ -187,6 +187,18 @@ Config.setExperimentalRspackEnabled(true); The [command line flag](/docs/cli/studio#--experimental-rspack) `--experimental-rspack` will take precedence over this option. +## `setExperimentalVisualMode()` + + + +```ts twoslash title="remotion.config.ts" +import {Config} from '@remotion/cli/config'; +// ---cut--- +Config.setExperimentalVisualMode(true); +``` + +The [command line flag](/docs/cli/studio#--experimental-visual-mode) `--experimental-visual-mode` will take precedence over this option. + ## `setWebpackPollingInMilliseconds()` diff --git a/packages/example/remotion.config.ts b/packages/example/remotion.config.ts index 912bffef8bb..59f2c09b2e5 100644 --- a/packages/example/remotion.config.ts +++ b/packages/example/remotion.config.ts @@ -10,3 +10,4 @@ Config.overrideWebpackConfig(async (config) => { }); Config.setExperimentalClientSideRenderingEnabled(true); +Config.setExperimentalVisualMode(true); diff --git a/packages/it-tests/src/rendering/cancel-render.test.ts b/packages/it-tests/src/rendering/cancel-render.test.ts index d88e4af977c..ad7e2755885 100644 --- a/packages/it-tests/src/rendering/cancel-render.test.ts +++ b/packages/it-tests/src/rendering/cancel-render.test.ts @@ -3,7 +3,7 @@ import execa from 'execa'; import fs from 'fs'; import path from 'path'; -const outputPath = path.join(process.cwd(), 'packages/example/out.mp4'); +const outputPath = path.join(process.cwd(), 'packages/example/out-cancel.mp4'); beforeEach(() => { if (fs.existsSync(outputPath)) { diff --git a/packages/it-tests/src/rendering/render-scale.test.ts b/packages/it-tests/src/rendering/render-scale.test.ts index dbabed589cb..54359d34f34 100644 --- a/packages/it-tests/src/rendering/render-scale.test.ts +++ b/packages/it-tests/src/rendering/render-scale.test.ts @@ -5,7 +5,7 @@ import fs from 'fs'; import path from 'path'; import {NoReactInternals} from 'remotion/no-react'; -const outputPath = path.join(process.cwd(), 'packages/example/out.mp4'); +const outputPath = path.join(process.cwd(), 'packages/example/out-scale.mp4'); beforeEach(() => { if (fs.existsSync(outputPath)) { diff --git a/packages/light-leaks/src/LightLeak.tsx b/packages/light-leaks/src/LightLeak.tsx index d4fcb77d9bc..899c2910464 100644 --- a/packages/light-leaks/src/LightLeak.tsx +++ b/packages/light-leaks/src/LightLeak.tsx @@ -1,6 +1,7 @@ import React, {useCallback, useEffect, useRef, useState} from 'react'; import { AbsoluteFill, + Internals, Sequence, useCurrentFrame, useDelayRender, @@ -256,8 +257,14 @@ export const LightLeak: React.FC = ({ } return ( - + ); }; + +Internals.addSequenceStackTraces(LightLeak); diff --git a/packages/renderer/src/options/experimental-visual-mode.tsx b/packages/renderer/src/options/experimental-visual-mode.tsx new file mode 100644 index 00000000000..0eea99a3039 --- /dev/null +++ b/packages/renderer/src/options/experimental-visual-mode.tsx @@ -0,0 +1,33 @@ +import type {AnyRemotionOption} from './option'; + +let experimentalVisualModeEnabled = false; + +const cliFlag = 'experimental-visual-mode' as const; + +export const experimentalVisualModeOption = { + name: 'Experimental Visual Mode', + cliFlag, + description: () => ( + <>Nothing here yet, but this is our playground for experiments. + ), + ssrName: null, + docLink: 'https://www.remotion.dev/docs/config#setexperimentalvisualmode', + type: false as boolean, + getValue: ({commandLine}) => { + if (commandLine[cliFlag] !== null) { + return { + value: commandLine[cliFlag] as boolean, + source: 'cli', + }; + } + + return { + value: experimentalVisualModeEnabled, + source: 'config', + }; + }, + setConfig(value) { + experimentalVisualModeEnabled = value; + }, + id: cliFlag, +} satisfies AnyRemotionOption; diff --git a/packages/renderer/src/options/index.tsx b/packages/renderer/src/options/index.tsx index cce83ee3a10..8b9453cae73 100644 --- a/packages/renderer/src/options/index.tsx +++ b/packages/renderer/src/options/index.tsx @@ -26,6 +26,7 @@ import {enforceAudioOption} from './enforce-audio'; import {envFileOption} from './env-file'; import {everyNthFrameOption} from './every-nth-frame'; import {experimentalClientSideRenderingOption} from './experimental-client-side-rendering'; +import {experimentalVisualModeOption} from './experimental-visual-mode'; import {folderExpiryOption} from './folder-expiry'; import {forSeamlessAacConcatenationOption} from './for-seamless-aac-concatenation'; import {forceNewStudioOption} from './force-new-studio'; @@ -148,6 +149,7 @@ export const allOptions = { isProductionOption, askAIOption, experimentalClientSideRenderingOption, + experimentalVisualModeOption, keyboardShortcutsOption, framesOption, forceNewStudioOption,