remotion 4.0.428 → 4.0.430

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.
Files changed (41) hide show
  1. package/dist/cjs/CompositionManager.d.ts +7 -0
  2. package/dist/cjs/Img.js +1 -1
  3. package/dist/cjs/PremountContext.d.ts +11 -0
  4. package/dist/cjs/PremountContext.js +14 -0
  5. package/dist/cjs/RemotionRoot.js +3 -3
  6. package/dist/cjs/ResolveCompositionConfig.js +1 -1
  7. package/dist/cjs/Sequence.d.ts +2 -1
  8. package/dist/cjs/Sequence.js +19 -6
  9. package/dist/cjs/SequenceManager.d.ts +6 -0
  10. package/dist/cjs/SequenceManager.js +40 -2
  11. package/dist/cjs/audio/Audio.js +1 -1
  12. package/dist/cjs/audio/AudioForPreview.js +2 -2
  13. package/dist/cjs/audio/AudioForRendering.js +2 -2
  14. package/dist/cjs/audio/use-audio-frame.js +1 -1
  15. package/dist/cjs/enable-sequence-stack-traces.d.ts +1 -1
  16. package/dist/cjs/enable-sequence-stack-traces.js +3 -37
  17. package/dist/cjs/index.d.ts +3 -2
  18. package/dist/cjs/index.js +1 -0
  19. package/dist/cjs/internals.d.ts +10 -2
  20. package/dist/cjs/internals.js +8 -1
  21. package/dist/cjs/sequence-field-schema.d.ts +15 -0
  22. package/dist/cjs/sequence-field-schema.js +2 -0
  23. package/dist/cjs/sequence-stack-traces.d.ts +12 -0
  24. package/dist/cjs/sequence-stack-traces.js +11 -0
  25. package/dist/cjs/series/index.js +1 -1
  26. package/dist/cjs/use-lazy-component.js +29 -2
  27. package/dist/cjs/use-media-in-timeline.js +4 -3
  28. package/dist/cjs/use-schema.d.ts +6 -0
  29. package/dist/cjs/use-schema.js +50 -0
  30. package/dist/cjs/use-sequence-control-override.d.ts +1 -0
  31. package/dist/cjs/use-sequence-control-override.js +16 -0
  32. package/dist/cjs/version.d.ts +1 -1
  33. package/dist/cjs/version.js +1 -1
  34. package/dist/cjs/video/OffthreadVideo.js +1 -1
  35. package/dist/cjs/video/OffthreadVideoForRendering.js +3 -3
  36. package/dist/cjs/video/Video.js +2 -2
  37. package/dist/cjs/video/VideoForPreview.js +2 -2
  38. package/dist/cjs/video/VideoForRendering.js +2 -2
  39. package/dist/esm/index.mjs +503 -398
  40. package/dist/esm/version.mjs +1 -1
  41. package/package.json +4 -3
@@ -4,6 +4,7 @@ import type { AnyZodObject } from './any-zod-type.js';
4
4
  import type { CalculateMetadataFunction } from './Composition.js';
5
5
  import type { DownloadBehavior } from './download-behavior.js';
6
6
  import type { InferProps, PropsIfHasProps } from './props-if-has-props.js';
7
+ import type { SequenceSchema } from './sequence-field-schema.js';
7
8
  export type TComposition<Schema extends AnyZodObject, Props extends Record<string, unknown>> = {
8
9
  width: number | undefined;
9
10
  height: number | undefined;
@@ -43,6 +44,11 @@ export type LoopDisplay = {
43
44
  startOffset: number;
44
45
  durationInFrames: number;
45
46
  };
47
+ export type SequenceControls = {
48
+ schema: SequenceSchema;
49
+ currentValue: Record<string, unknown>;
50
+ overrideId: string;
51
+ };
46
52
  export type TSequence = {
47
53
  from: number;
48
54
  duration: number;
@@ -56,6 +62,7 @@ export type TSequence = {
56
62
  stack: string | null;
57
63
  premountDisplay: number | null;
58
64
  postmountDisplay: number | null;
65
+ controls: SequenceControls | null;
59
66
  } & EnhancedTSequenceData;
60
67
  export type AudioOrVideoAsset = {
61
68
  type: 'audio' | 'video';
package/dist/cjs/Img.js CHANGED
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Img = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const SequenceContext_js_1 = require("./SequenceContext.js");
7
6
  const cancel_render_js_1 = require("./cancel-render.js");
8
7
  const get_cross_origin_value_js_1 = require("./get-cross-origin-value.js");
9
8
  const prefetch_js_1 = require("./prefetch.js");
9
+ const SequenceContext_js_1 = require("./SequenceContext.js");
10
10
  const use_buffer_state_js_1 = require("./use-buffer-state.js");
11
11
  const use_delay_render_js_1 = require("./use-delay-render.js");
12
12
  const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
@@ -0,0 +1,11 @@
1
+ export type PremountContextValue = {
2
+ premountFramesRemaining: number;
3
+ playing: boolean;
4
+ };
5
+ /**
6
+ * @internal
7
+ * Provides premounting state to internal components.
8
+ * - premountFramesRemaining: accumulated frames remaining until premounting ends (0 if not premounting).
9
+ * - playing: whether the player is currently playing. Sticky true: if any parent is playing, this is true.
10
+ */
11
+ export declare const PremountContext: import("react").Context<PremountContextValue>;
@@ -0,0 +1,14 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PremountContext = void 0;
4
+ const react_1 = require("react");
5
+ /**
6
+ * @internal
7
+ * Provides premounting state to internal components.
8
+ * - premountFramesRemaining: accumulated frames remaining until premounting ends (0 if not premounting).
9
+ * - playing: whether the player is currently playing. Sticky true: if any parent is playing, this is true.
10
+ */
11
+ exports.PremountContext = (0, react_1.createContext)({
12
+ premountFramesRemaining: 0,
13
+ playing: false,
14
+ });
@@ -3,14 +3,14 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RemotionRootContexts = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const EditorProps_js_1 = require("./EditorProps.js");
7
- const SequenceManager_js_1 = require("./SequenceManager.js");
8
- const TimelineContext_js_1 = require("./TimelineContext.js");
9
6
  const shared_audio_tags_js_1 = require("./audio/shared-audio-tags.js");
10
7
  const buffering_js_1 = require("./buffering.js");
8
+ const EditorProps_js_1 = require("./EditorProps.js");
11
9
  const log_level_context_js_1 = require("./log-level-context.js");
12
10
  const nonce_js_1 = require("./nonce.js");
13
11
  const prefetch_state_js_1 = require("./prefetch-state.js");
12
+ const SequenceManager_js_1 = require("./SequenceManager.js");
13
+ const TimelineContext_js_1 = require("./TimelineContext.js");
14
14
  const use_media_enabled_js_1 = require("./use-media-enabled.js");
15
15
  const duration_state_js_1 = require("./video/duration-state.js");
16
16
  const RemotionRootContexts = ({ children, numberOfAudioTags, logLevel, audioLatencyHint, videoEnabled, audioEnabled, frameState, nonceContextSeed, }) => {
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useResolvedVideoConfig = exports.PROPS_UPDATED_EXTERNALLY = exports.needsResolution = exports.resolveCompositionsRef = exports.ResolveCompositionContext = void 0;
4
4
  const react_1 = require("react");
5
5
  const CompositionManagerContext_js_1 = require("./CompositionManagerContext.js");
6
- const EditorProps_js_1 = require("./EditorProps.js");
7
6
  const input_props_js_1 = require("./config/input-props.js");
7
+ const EditorProps_js_1 = require("./EditorProps.js");
8
8
  const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
9
9
  const validate_dimensions_js_1 = require("./validation/validate-dimensions.js");
10
10
  const validate_duration_in_frames_js_1 = require("./validation/validate-duration-in-frames.js");
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { LoopDisplay } from './CompositionManager.js';
2
+ import type { LoopDisplay, SequenceControls } from './CompositionManager.js';
3
3
  export type AbsoluteFillLayout = {
4
4
  layout?: 'absolute-fill';
5
5
  premountFor?: number;
@@ -19,6 +19,7 @@ export type SequencePropsWithoutDuration = {
19
19
  readonly from?: number;
20
20
  readonly name?: string;
21
21
  readonly showInTimeline?: boolean;
22
+ readonly controls?: SequenceControls;
22
23
  /**
23
24
  * @deprecated For internal use only.
24
25
  */
@@ -5,17 +5,18 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  /* eslint-disable @typescript-eslint/no-use-before-define */
6
6
  const react_1 = require("react");
7
7
  const AbsoluteFill_js_1 = require("./AbsoluteFill.js");
8
+ const freeze_js_1 = require("./freeze.js");
9
+ const nonce_js_1 = require("./nonce.js");
10
+ const PremountContext_js_1 = require("./PremountContext.js");
8
11
  const SequenceContext_js_1 = require("./SequenceContext.js");
9
12
  const SequenceManager_js_1 = require("./SequenceManager.js");
10
- const TimelineContext_js_1 = require("./TimelineContext.js");
11
- const nonce_js_1 = require("./nonce.js");
12
13
  const timeline_position_state_js_1 = require("./timeline-position-state.js");
13
- const use_video_config_js_1 = require("./use-video-config.js");
14
- const freeze_js_1 = require("./freeze.js");
14
+ const TimelineContext_js_1 = require("./TimelineContext.js");
15
15
  const use_current_frame_1 = require("./use-current-frame");
16
16
  const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
17
+ const use_video_config_js_1 = require("./use-video-config.js");
17
18
  const v5_flag_js_1 = require("./v5-flag.js");
18
- const RegularSequenceRefForwardingFunction = ({ from = 0, durationInFrames = Infinity, children, name, height, width, showInTimeline = true, _remotionInternalLoopDisplay: loopDisplay, _remotionInternalStack: stack, _remotionInternalPremountDisplay: premountDisplay, _remotionInternalPostmountDisplay: postmountDisplay, ...other }, ref) => {
19
+ const RegularSequenceRefForwardingFunction = ({ from = 0, durationInFrames = Infinity, children, name, height, width, showInTimeline = true, controls, _remotionInternalLoopDisplay: loopDisplay, _remotionInternalStack: stack, _remotionInternalPremountDisplay: premountDisplay, _remotionInternalPostmountDisplay: postmountDisplay, ...other }, ref) => {
19
20
  var _a, _b;
20
21
  const { layout = 'absolute-fill' } = other;
21
22
  const [id] = (0, react_1.useState)(() => String(Math.random()));
@@ -114,6 +115,7 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, durationInFrames = Inf
114
115
  stack: stack !== null && stack !== void 0 ? stack : inheritedStack,
115
116
  premountDisplay: premountDisplay !== null && premountDisplay !== void 0 ? premountDisplay : null,
116
117
  postmountDisplay: postmountDisplay !== null && postmountDisplay !== void 0 ? postmountDisplay : null,
118
+ controls: controls !== null && controls !== void 0 ? controls : null,
117
119
  });
118
120
  return () => {
119
121
  unregisterSequence(id);
@@ -137,6 +139,7 @@ const RegularSequenceRefForwardingFunction = ({ from = 0, durationInFrames = Inf
137
139
  postmountDisplay,
138
140
  env.isStudio,
139
141
  inheritedStack,
142
+ controls,
140
143
  ]);
141
144
  // Ceil to support floats
142
145
  // https://github.com/remotion-dev/remotion/issues/2958
@@ -199,7 +202,17 @@ const PremountedPostmountedSequenceRefForwardingFunction = (props, ref) => {
199
202
  styleWhilePremounted,
200
203
  styleWhilePostmounted,
201
204
  ]);
202
- return ((0, jsx_runtime_1.jsx)(freeze_js_1.Freeze, { frame: freezeFrame, active: isFreezingActive, children: (0, jsx_runtime_1.jsx)(exports.Sequence, { ref: ref, from: from, durationInFrames: durationInFrames, style: style, _remotionInternalPremountDisplay: premountFor, _remotionInternalPostmountDisplay: postmountFor, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, ...otherProps }) }));
205
+ const parentPremountContext = (0, react_1.useContext)(PremountContext_js_1.PremountContext);
206
+ const { playing } = (0, react_1.useContext)(TimelineContext_js_1.TimelineContext);
207
+ const premountFramesRemaining = parentPremountContext.premountFramesRemaining +
208
+ (premountingActive ? from - frame : 0);
209
+ const premountContextValue = (0, react_1.useMemo)(() => {
210
+ return {
211
+ premountFramesRemaining,
212
+ playing: parentPremountContext.playing || playing,
213
+ };
214
+ }, [premountFramesRemaining, parentPremountContext.playing, playing]);
215
+ return ((0, jsx_runtime_1.jsx)(PremountContext_js_1.PremountContext.Provider, { value: premountContextValue, children: (0, jsx_runtime_1.jsx)(freeze_js_1.Freeze, { frame: freezeFrame, active: isFreezingActive, children: (0, jsx_runtime_1.jsx)(exports.Sequence, { ref: ref, from: from, durationInFrames: durationInFrames, style: style, _remotionInternalPremountDisplay: premountFor, _remotionInternalPostmountDisplay: postmountFor, _remotionInternalIsPremounting: premountingActive, _remotionInternalIsPostmounting: postmountingActive, ...otherProps }) }) }));
203
216
  };
204
217
  const PremountedPostmountedSequence = (0, react_1.forwardRef)(PremountedPostmountedSequenceRefForwardingFunction);
205
218
  const SequenceRefForwardingFunction = (props, ref) => {
@@ -11,6 +11,12 @@ export type SequenceVisibilityToggleState = {
11
11
  setHidden: React.Dispatch<React.SetStateAction<Record<string, boolean>>>;
12
12
  };
13
13
  export declare const SequenceVisibilityToggleContext: React.Context<SequenceVisibilityToggleState>;
14
+ export type SequenceControlOverrideState = {
15
+ overrides: Record<string, Record<string, unknown>>;
16
+ setOverride: (sequenceId: string, key: string, value: unknown) => void;
17
+ clearOverrides: (sequenceId: string) => void;
18
+ };
19
+ export declare const SequenceControlOverrideContext: React.Context<SequenceControlOverrideState>;
14
20
  export declare const SequenceManagerProvider: React.FC<{
15
21
  readonly children: React.ReactNode;
16
22
  }>;
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.SequenceManagerProvider = exports.SequenceVisibilityToggleContext = exports.SequenceManager = void 0;
36
+ exports.SequenceManagerProvider = exports.SequenceControlOverrideContext = exports.SequenceVisibilityToggleContext = exports.SequenceManager = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  exports.SequenceManager = react_1.default.createContext({
@@ -51,9 +51,40 @@ exports.SequenceVisibilityToggleContext = react_1.default.createContext({
51
51
  throw new Error('SequenceVisibilityToggle not initialized');
52
52
  },
53
53
  });
54
+ exports.SequenceControlOverrideContext = react_1.default.createContext({
55
+ overrides: {},
56
+ setOverride: () => {
57
+ throw new Error('SequenceControlOverrideContext not initialized');
58
+ },
59
+ clearOverrides: () => {
60
+ throw new Error('SequenceControlOverrideContext not initialized');
61
+ },
62
+ });
54
63
  const SequenceManagerProvider = ({ children }) => {
55
64
  const [sequences, setSequences] = (0, react_1.useState)([]);
56
65
  const [hidden, setHidden] = (0, react_1.useState)({});
66
+ const [controlOverrides, setControlOverrides] = (0, react_1.useState)({});
67
+ const controlOverridesRef = (0, react_1.useRef)(controlOverrides);
68
+ controlOverridesRef.current = controlOverrides;
69
+ const setOverride = (0, react_1.useCallback)((sequenceId, key, value) => {
70
+ setControlOverrides((prev) => ({
71
+ ...prev,
72
+ [sequenceId]: {
73
+ ...prev[sequenceId],
74
+ [key]: value,
75
+ },
76
+ }));
77
+ }, []);
78
+ const clearOverrides = (0, react_1.useCallback)((sequenceId) => {
79
+ setControlOverrides((prev) => {
80
+ if (!prev[sequenceId]) {
81
+ return prev;
82
+ }
83
+ const next = { ...prev };
84
+ delete next[sequenceId];
85
+ return next;
86
+ });
87
+ }, []);
57
88
  const registerSequence = (0, react_1.useCallback)((seq) => {
58
89
  setSequences((seqs) => {
59
90
  return [...seqs, seq];
@@ -75,6 +106,13 @@ const SequenceManagerProvider = ({ children }) => {
75
106
  setHidden,
76
107
  };
77
108
  }, [hidden]);
78
- return ((0, jsx_runtime_1.jsx)(exports.SequenceManager.Provider, { value: sequenceContext, children: (0, jsx_runtime_1.jsx)(exports.SequenceVisibilityToggleContext.Provider, { value: hiddenContext, children: children }) }));
109
+ const overrideContext = (0, react_1.useMemo)(() => {
110
+ return {
111
+ overrides: controlOverrides,
112
+ setOverride,
113
+ clearOverrides,
114
+ };
115
+ }, [controlOverrides, setOverride, clearOverrides]);
116
+ return ((0, jsx_runtime_1.jsx)(exports.SequenceManager.Provider, { value: sequenceContext, children: (0, jsx_runtime_1.jsx)(exports.SequenceVisibilityToggleContext.Provider, { value: hiddenContext, children: (0, jsx_runtime_1.jsx)(exports.SequenceControlOverrideContext.Provider, { value: overrideContext, children: children }) }) }));
79
117
  };
80
118
  exports.SequenceManagerProvider = SequenceManagerProvider;
@@ -4,13 +4,13 @@ exports.Audio = exports.Html5Audio = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  /* eslint-disable @typescript-eslint/no-use-before-define */
6
6
  const react_1 = require("react");
7
- const Sequence_js_1 = require("../Sequence.js");
8
7
  const absolute_src_js_1 = require("../absolute-src.js");
9
8
  const calculate_media_duration_js_1 = require("../calculate-media-duration.js");
10
9
  const cancel_render_js_1 = require("../cancel-render.js");
11
10
  const enable_sequence_stack_traces_js_1 = require("../enable-sequence-stack-traces.js");
12
11
  const index_js_1 = require("../loop/index.js");
13
12
  const prefetch_js_1 = require("../prefetch.js");
13
+ const Sequence_js_1 = require("../Sequence.js");
14
14
  const use_remotion_environment_js_1 = require("../use-remotion-environment.js");
15
15
  const use_video_config_js_1 = require("../use-video-config.js");
16
16
  const validate_media_props_js_1 = require("../validate-media-props.js");
@@ -36,12 +36,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
36
36
  exports.AudioForPreview = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
- const SequenceContext_js_1 = require("../SequenceContext.js");
40
- const SequenceManager_js_1 = require("../SequenceManager.js");
41
39
  const get_cross_origin_value_js_1 = require("../get-cross-origin-value.js");
42
40
  const log_level_context_js_1 = require("../log-level-context.js");
43
41
  const prefetch_js_1 = require("../prefetch.js");
44
42
  const random_js_1 = require("../random.js");
43
+ const SequenceContext_js_1 = require("../SequenceContext.js");
44
+ const SequenceManager_js_1 = require("../SequenceManager.js");
45
45
  const use_amplification_js_1 = require("../use-amplification.js");
46
46
  const use_media_in_timeline_js_1 = require("../use-media-in-timeline.js");
47
47
  const use_media_playback_js_1 = require("../use-media-playback.js");
@@ -3,10 +3,10 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.AudioForRendering = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const RenderAssetManager_js_1 = require("../RenderAssetManager.js");
7
- const SequenceContext_js_1 = require("../SequenceContext.js");
8
6
  const absolute_src_js_1 = require("../absolute-src.js");
9
7
  const random_js_1 = require("../random.js");
8
+ const RenderAssetManager_js_1 = require("../RenderAssetManager.js");
9
+ const SequenceContext_js_1 = require("../SequenceContext.js");
10
10
  const timeline_position_state_js_1 = require("../timeline-position-state.js");
11
11
  const use_current_frame_js_1 = require("../use-current-frame.js");
12
12
  const use_delay_render_js_1 = require("../use-delay-render.js");
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useFrameForVolumeProp = exports.useMediaStartsAt = void 0;
4
4
  const react_1 = require("react");
5
- const SequenceContext_js_1 = require("../SequenceContext.js");
6
5
  const index_js_1 = require("../loop/index.js");
6
+ const SequenceContext_js_1 = require("../SequenceContext.js");
7
7
  const use_current_frame_js_1 = require("../use-current-frame.js");
8
8
  const useMediaStartsAt = () => {
9
9
  var _a;
@@ -1,2 +1,2 @@
1
- export declare const enableSequenceStackTraces: () => void;
1
+ export declare const getComponentsToAddStacksTo: () => unknown[];
2
2
  export declare const addSequenceStackTraces: (component: unknown) => void;
@@ -1,44 +1,10 @@
1
1
  "use strict";
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.addSequenceStackTraces = exports.enableSequenceStackTraces = void 0;
7
- const react_1 = __importDefault(require("react"));
8
- const jsx_runtime_1 = __importDefault(require("react/jsx-runtime"));
9
- const get_remotion_environment_1 = require("./get-remotion-environment");
10
- const originalCreateElement = react_1.default.createElement;
11
- const originalJsx = jsx_runtime_1.default.jsx;
3
+ exports.addSequenceStackTraces = exports.getComponentsToAddStacksTo = void 0;
12
4
  const componentsToAddStacksTo = [];
13
- const enableProxy = (api) => {
14
- return new Proxy(api, {
15
- apply(target, thisArg, argArray) {
16
- if (componentsToAddStacksTo.includes(argArray[0])) {
17
- const [first, props, ...rest] = argArray;
18
- const newProps = props.stack
19
- ? props
20
- : {
21
- ...(props !== null && props !== void 0 ? props : {}),
22
- stack: new Error().stack,
23
- };
24
- return Reflect.apply(target, thisArg, [first, newProps, ...rest]);
25
- }
26
- return Reflect.apply(target, thisArg, argArray);
27
- },
28
- });
29
- };
30
- // Gets called when a new component is added,
31
- // also when the Studio is mounted
32
- const enableSequenceStackTraces = () => {
33
- if (!(0, get_remotion_environment_1.getRemotionEnvironment)().isStudio) {
34
- return;
35
- }
36
- react_1.default.createElement = enableProxy(originalCreateElement);
37
- jsx_runtime_1.default.jsx = enableProxy(originalJsx);
38
- };
39
- exports.enableSequenceStackTraces = enableSequenceStackTraces;
5
+ const getComponentsToAddStacksTo = () => componentsToAddStacksTo;
6
+ exports.getComponentsToAddStacksTo = getComponentsToAddStacksTo;
40
7
  const addSequenceStackTraces = (component) => {
41
8
  componentsToAddStacksTo.push(component);
42
- (0, exports.enableSequenceStackTraces)();
43
9
  };
44
10
  exports.addSequenceStackTraces = addSequenceStackTraces;
@@ -1,12 +1,13 @@
1
1
  import './_check-rsc.js';
2
2
  import './asset-types.js';
3
3
  import type { Codec } from './codec.js';
4
- import type { AnyCompMetadata, AnyComposition, AudioOrVideoAsset, LoopDisplay, TRenderAsset } from './CompositionManager.js';
4
+ import type { AnyCompMetadata, AnyComposition, AudioOrVideoAsset, LoopDisplay, SequenceControls, TRenderAsset } from './CompositionManager.js';
5
5
  import type { DelayRenderScope } from './delay-render.js';
6
6
  import type { StaticFile } from './get-static-files.js';
7
7
  import type { LogLevel } from './log.js';
8
8
  import type { ProResProfile } from './prores-profile.js';
9
9
  import type { PixelFormat, VideoImageFormat } from './render-types.js';
10
+ import type { SequenceFieldSchema, SequenceSchema } from './sequence-field-schema.js';
10
11
  import type { UseBufferState } from './use-buffer-state';
11
12
  import type { VideoConfig } from './video-config.js';
12
13
  export type VideoConfigWithSerializedProps = Omit<VideoConfig, 'defaultProps' | 'props'> & {
@@ -158,4 +159,4 @@ export type _InternalTypes = {
158
159
  TRenderAsset: TRenderAsset;
159
160
  ProResProfile: ProResProfile;
160
161
  };
161
- export type { AnyComposition, DelayRenderScope, LoopDisplay, UseBufferState };
162
+ export type { AnyComposition, DelayRenderScope, LoopDisplay, SequenceControls, SequenceFieldSchema, SequenceSchema, UseBufferState, };
package/dist/cjs/index.js CHANGED
@@ -128,4 +128,5 @@ exports.Config = new Proxy(proxyObj, {
128
128
  };
129
129
  },
130
130
  });
131
+ Sequence_js_1.Sequence.displayName = 'Sequence';
131
132
  (0, enable_sequence_stack_traces_js_1.addSequenceStackTraces)(Sequence_js_1.Sequence);
@@ -5,6 +5,7 @@ import * as CSSUtils from './default-css.js';
5
5
  import type { SerializedJSONWithCustomFields } from './input-props-serialization.js';
6
6
  import type { LoggingContextValue } from './log-level-context.js';
7
7
  import type { RemotionEnvironment } from './remotion-environment-context.js';
8
+ import type { SequenceFieldSchema, SequenceSchema } from './sequence-field-schema.js';
8
9
  import * as TimelinePosition from './timeline-position-state.js';
9
10
  import { type SetTimelineContextValue, type TimelineContextValue } from './TimelineContext.js';
10
11
  import { truthy } from './truthy.js';
@@ -70,8 +71,14 @@ export declare const Internals: {
70
71
  }, "ref"> & import("react").RefAttributes<HTMLVideoElement>>;
71
72
  readonly CompositionManager: import("react").Context<CompositionManagerContext>;
72
73
  readonly CompositionSetters: import("react").Context<import("./CompositionManagerContext.js").CompositionManagerSetters>;
74
+ readonly SequenceControlOverrideContext: import("react").Context<import("./SequenceManager.js").SequenceControlOverrideState>;
73
75
  readonly SequenceManager: import("react").Context<import("./SequenceManager.js").SequenceManagerContext>;
74
76
  readonly SequenceVisibilityToggleContext: import("react").Context<import("./SequenceManager.js").SequenceVisibilityToggleState>;
77
+ readonly useSchema: <T extends Record<string, unknown>>(schema: SequenceSchema | null, currentValue: T | null) => {
78
+ controls: import("./CompositionManager.js").SequenceControls | undefined;
79
+ values: T;
80
+ };
81
+ readonly useSequenceControlOverride: (key: string) => unknown | undefined;
75
82
  readonly RemotionRootContexts: import("react").FC<{
76
83
  readonly children: React.ReactNode;
77
84
  readonly numberOfAudioTags: number;
@@ -118,6 +125,7 @@ export declare const Internals: {
118
125
  }) | import("react").ComponentType<Props>;
119
126
  readonly truthy: typeof truthy;
120
127
  readonly SequenceContext: import("react").Context<import("./SequenceContext.js").SequenceContextType | null>;
128
+ readonly PremountContext: import("react").Context<import("./PremountContext.js").PremountContextValue>;
121
129
  readonly useRemotionContexts: typeof useRemotionContexts;
122
130
  readonly RemotionContextProvider: (props: import("./wrap-remotion-context.js").RemotionContextProviderProps) => import("react/jsx-runtime.js").JSX.Element;
123
131
  readonly CSSUtils: typeof CSSUtils;
@@ -280,7 +288,7 @@ export declare const Internals: {
280
288
  };
281
289
  buffering: React.MutableRefObject<boolean>;
282
290
  } | null>;
283
- readonly enableSequenceStackTraces: () => void;
291
+ readonly getComponentsToAddStacksTo: () => unknown[];
284
292
  readonly CurrentScaleContext: import("react").Context<import("./use-current-scale.js").CurrentScaleContextType | null>;
285
293
  readonly PreviewSizeContext: import("react").Context<import("./use-current-scale.js").PreviewSizeCtx>;
286
294
  readonly calculateScale: ({ canvasSize, compositionHeight, compositionWidth, previewSize, }: {
@@ -419,4 +427,4 @@ export declare const Internals: {
419
427
  collectAssets: null | React.RefObject<import("./RenderAssetManager.js").CollectAssetsRef | null>;
420
428
  }>;
421
429
  };
422
- export type { CompositionManagerContext, CompProps, LoggingContextValue, MediaVolumeContextValue, RemotionEnvironment, SerializedJSONWithCustomFields, SetMediaVolumeContextValue, SetTimelineContextValue, TCompMetadata, TComposition, TimelineContextValue, TRenderAsset, TSequence, WatchRemotionStaticFilesPayload, };
430
+ export type { CompositionManagerContext, CompProps, LoggingContextValue, MediaVolumeContextValue, RemotionEnvironment, SequenceFieldSchema, SequenceSchema, SerializedJSONWithCustomFields, SetMediaVolumeContextValue, SetTimelineContextValue, TCompMetadata, TComposition, TimelineContextValue, TRenderAsset, TSequence, WatchRemotionStaticFilesPayload, };
@@ -61,6 +61,7 @@ const playback_logging_js_1 = require("./playback-logging.js");
61
61
  const portal_node_js_1 = require("./portal-node.js");
62
62
  const prefetch_state_js_1 = require("./prefetch-state.js");
63
63
  const prefetch_js_1 = require("./prefetch.js");
64
+ const PremountContext_js_1 = require("./PremountContext.js");
64
65
  const register_root_js_1 = require("./register-root.js");
65
66
  const remotion_environment_context_js_1 = require("./remotion-environment-context.js");
66
67
  const RemotionRoot_js_1 = require("./RemotionRoot.js");
@@ -79,6 +80,8 @@ const use_delay_render_js_1 = require("./use-delay-render.js");
79
80
  const use_lazy_component_js_1 = require("./use-lazy-component.js");
80
81
  const use_media_enabled_js_1 = require("./use-media-enabled.js");
81
82
  const use_media_in_timeline_js_1 = require("./use-media-in-timeline.js");
83
+ const use_schema_js_1 = require("./use-schema.js");
84
+ const use_sequence_control_override_js_1 = require("./use-sequence-control-override.js");
82
85
  const use_unsafe_video_config_js_1 = require("./use-unsafe-video-config.js");
83
86
  const use_video_js_1 = require("./use-video.js");
84
87
  const validate_media_props_js_1 = require("./validate-media-props.js");
@@ -112,8 +115,11 @@ exports.Internals = {
112
115
  VideoForPreview: VideoForPreview_js_1.VideoForPreview,
113
116
  CompositionManager: CompositionManagerContext_js_1.CompositionManager,
114
117
  CompositionSetters: CompositionManagerContext_js_1.CompositionSetters,
118
+ SequenceControlOverrideContext: SequenceManager_js_1.SequenceControlOverrideContext,
115
119
  SequenceManager: SequenceManager_js_1.SequenceManager,
116
120
  SequenceVisibilityToggleContext: SequenceManager_js_1.SequenceVisibilityToggleContext,
121
+ useSchema: use_schema_js_1.useSchema,
122
+ useSequenceControlOverride: use_sequence_control_override_js_1.useSequenceControlOverride,
117
123
  RemotionRootContexts: RemotionRoot_js_1.RemotionRootContexts,
118
124
  CompositionManagerProvider: CompositionManagerProvider_js_1.CompositionManagerProvider,
119
125
  useVideo: use_video_js_1.useVideo,
@@ -124,6 +130,7 @@ exports.Internals = {
124
130
  useLazyComponent: use_lazy_component_js_1.useLazyComponent,
125
131
  truthy: truthy_js_1.truthy,
126
132
  SequenceContext: SequenceContext_js_1.SequenceContext,
133
+ PremountContext: PremountContext_js_1.PremountContext,
127
134
  useRemotionContexts: wrap_remotion_context_js_1.useRemotionContexts,
128
135
  RemotionContextProvider: wrap_remotion_context_js_1.RemotionContextProvider,
129
136
  CSSUtils,
@@ -166,7 +173,7 @@ exports.Internals = {
166
173
  useMediaStartsAt: use_audio_frame_js_1.useMediaStartsAt,
167
174
  BufferingProvider: buffering_js_1.BufferingProvider,
168
175
  BufferingContextReact: buffering_js_1.BufferingContextReact,
169
- enableSequenceStackTraces: enable_sequence_stack_traces_js_1.enableSequenceStackTraces,
176
+ getComponentsToAddStacksTo: enable_sequence_stack_traces_js_1.getComponentsToAddStacksTo,
170
177
  CurrentScaleContext: use_current_scale_js_1.CurrentScaleContext,
171
178
  PreviewSizeContext: use_current_scale_js_1.PreviewSizeContext,
172
179
  calculateScale: use_current_scale_js_1.calculateScale,
@@ -0,0 +1,15 @@
1
+ export type NumberFieldSchema = {
2
+ type: 'number';
3
+ min?: number;
4
+ max?: number;
5
+ step?: number;
6
+ default?: number;
7
+ description?: string;
8
+ };
9
+ export type BooleanFieldSchema = {
10
+ type: 'boolean';
11
+ default?: boolean;
12
+ description?: string;
13
+ };
14
+ export type SequenceFieldSchema = NumberFieldSchema | BooleanFieldSchema;
15
+ export type SequenceSchema = Record<string, SequenceFieldSchema>;
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1,12 @@
1
+ import React from 'react';
2
+ export type ResolvedStackLocation = {
3
+ line: number | null;
4
+ column: number | null;
5
+ source: string | null;
6
+ };
7
+ export type SequenceStackTracesContextType = {
8
+ resolvedStacks: Record<string, ResolvedStackLocation | null>;
9
+ };
10
+ export declare const SequenceStackTracesContext: React.Context<SequenceStackTracesContextType>;
11
+ export type UpdateResolvedStackTraceFn = (stack: string, location: ResolvedStackLocation | null) => void;
12
+ export declare const SequenceStackTracesUpdateContext: React.Context<UpdateResolvedStackTraceFn>;
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.SequenceStackTracesUpdateContext = exports.SequenceStackTracesContext = void 0;
7
+ const react_1 = __importDefault(require("react"));
8
+ exports.SequenceStackTracesContext = react_1.default.createContext({
9
+ resolvedStacks: {},
10
+ });
11
+ exports.SequenceStackTracesUpdateContext = react_1.default.createContext(() => { });
@@ -3,8 +3,8 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.Series = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const Sequence_js_1 = require("../Sequence.js");
7
6
  const enable_sequence_stack_traces_js_1 = require("../enable-sequence-stack-traces.js");
7
+ const Sequence_js_1 = require("../Sequence.js");
8
8
  const v5_flag_js_1 = require("../v5-flag.js");
9
9
  const validate_duration_in_frames_js_1 = require("../validation/validate-duration-in-frames.js");
10
10
  const flatten_children_js_1 = require("./flatten-children.js");
@@ -37,6 +37,27 @@ exports.useLazyComponent = void 0;
37
37
  const react_1 = __importStar(require("react"));
38
38
  // Expected, it can be any component props
39
39
  const useLazyComponent = ({ compProps, componentName, noSuspense, }) => {
40
+ // Why a ref + stable wrapper instead of returning compProps.component directly?
41
+ //
42
+ // When a user edits their component and saves, React Fast Refresh re-executes
43
+ // the module, giving compProps.component a new function reference.
44
+ // Previously, this new reference flowed into useMemo (which depended on
45
+ // compProps.component), producing a new `lazy` value. Composition.tsx then
46
+ // rendered `<Comp />` where Comp had a different identity, so React unmounted
47
+ // the old tree and mounted a fresh one — losing all component state.
48
+ //
49
+ // To fix this, we store the latest component in a ref (updated every render)
50
+ // and return a stable Wrapper from useMemo (created once). React sees the same
51
+ // Wrapper component across Fast Refresh updates, preserves the tree and state,
52
+ // while the ref ensures the Wrapper always delegates to the latest code.
53
+ //
54
+ // To reproduce: use packages/example/src/NewVideo.tsx, edit Component
55
+ // (e.g. change volume={1} to volume={2}) and save. Without this fix,
56
+ // Component would fully remount instead of fast-refreshing in place.
57
+ const componentRef = (0, react_1.useRef)(null);
58
+ if ('component' in compProps) {
59
+ componentRef.current = compProps.component;
60
+ }
40
61
  const lazy = (0, react_1.useMemo)(() => {
41
62
  if ('component' in compProps) {
42
63
  // In SSR, suspense is not yet supported, we cannot use React.lazy
@@ -46,7 +67,11 @@ const useLazyComponent = ({ compProps, componentName, noSuspense, }) => {
46
67
  if (typeof compProps.component === 'undefined') {
47
68
  throw new Error(`A value of \`undefined\` was passed to the \`component\` prop. Check the value you are passing to the <${componentName}/> component.`);
48
69
  }
49
- return compProps.component;
70
+ const Wrapper = (props) => {
71
+ const Comp = componentRef.current;
72
+ return react_1.default.createElement(Comp, props);
73
+ };
74
+ return Wrapper;
50
75
  }
51
76
  if ('lazyComponent' in compProps &&
52
77
  typeof compProps.lazyComponent !== 'undefined') {
@@ -58,9 +83,11 @@ const useLazyComponent = ({ compProps, componentName, noSuspense, }) => {
58
83
  throw new Error("You must pass either 'component' or 'lazyComponent'");
59
84
  // Very important to leave the dependencies as they are, or instead
60
85
  // the player will remount on every frame.
86
+ // For the 'component' case, we intentionally do NOT depend on
87
+ // compProps.component — the stable wrapper reads from componentRef instead.
61
88
  // @ts-expect-error
62
89
  // eslint-disable-next-line react-hooks/exhaustive-deps
63
- }, [compProps.component, compProps.lazyComponent]);
90
+ }, [compProps.lazyComponent]);
64
91
  return lazy;
65
92
  };
66
93
  exports.useLazyComponent = useLazyComponent;
@@ -2,13 +2,13 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.useMediaInTimeline = exports.useBasicMediaInTimeline = void 0;
4
4
  const react_1 = require("react");
5
- const SequenceContext_js_1 = require("./SequenceContext.js");
6
- const SequenceManager_js_1 = require("./SequenceManager.js");
7
- const TimelineContext_js_1 = require("./TimelineContext.js");
8
5
  const use_audio_frame_js_1 = require("./audio/use-audio-frame.js");
9
6
  const calculate_media_duration_js_1 = require("./calculate-media-duration.js");
10
7
  const get_asset_file_name_js_1 = require("./get-asset-file-name.js");
11
8
  const nonce_js_1 = require("./nonce.js");
9
+ const SequenceContext_js_1 = require("./SequenceContext.js");
10
+ const SequenceManager_js_1 = require("./SequenceManager.js");
11
+ const TimelineContext_js_1 = require("./TimelineContext.js");
12
12
  const use_remotion_environment_js_1 = require("./use-remotion-environment.js");
13
13
  const use_video_config_js_1 = require("./use-video-config.js");
14
14
  const volume_prop_js_1 = require("./volume-prop.js");
@@ -117,6 +117,7 @@ const useMediaInTimeline = ({ volume, mediaVolume, src, mediaType, playbackRate,
117
117
  stack,
118
118
  premountDisplay,
119
119
  postmountDisplay,
120
+ controls: null,
120
121
  });
121
122
  return () => {
122
123
  unregisterSequence(id);
@@ -0,0 +1,6 @@
1
+ import type { SequenceControls } from './CompositionManager.js';
2
+ import type { SequenceSchema } from './sequence-field-schema.js';
3
+ export declare const useSchema: <T extends Record<string, unknown>>(schema: SequenceSchema | null, currentValue: T | null) => {
4
+ controls: SequenceControls | undefined;
5
+ values: T;
6
+ };