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.
- package/dist/cjs/CompositionManager.d.ts +7 -0
- package/dist/cjs/Img.js +1 -1
- package/dist/cjs/PremountContext.d.ts +11 -0
- package/dist/cjs/PremountContext.js +14 -0
- package/dist/cjs/RemotionRoot.js +3 -3
- package/dist/cjs/ResolveCompositionConfig.js +1 -1
- package/dist/cjs/Sequence.d.ts +2 -1
- package/dist/cjs/Sequence.js +19 -6
- package/dist/cjs/SequenceManager.d.ts +6 -0
- package/dist/cjs/SequenceManager.js +40 -2
- package/dist/cjs/audio/Audio.js +1 -1
- package/dist/cjs/audio/AudioForPreview.js +2 -2
- package/dist/cjs/audio/AudioForRendering.js +2 -2
- package/dist/cjs/audio/use-audio-frame.js +1 -1
- package/dist/cjs/enable-sequence-stack-traces.d.ts +1 -1
- package/dist/cjs/enable-sequence-stack-traces.js +3 -37
- package/dist/cjs/index.d.ts +3 -2
- package/dist/cjs/index.js +1 -0
- package/dist/cjs/internals.d.ts +10 -2
- package/dist/cjs/internals.js +8 -1
- package/dist/cjs/sequence-field-schema.d.ts +15 -0
- package/dist/cjs/sequence-field-schema.js +2 -0
- package/dist/cjs/sequence-stack-traces.d.ts +12 -0
- package/dist/cjs/sequence-stack-traces.js +11 -0
- package/dist/cjs/series/index.js +1 -1
- package/dist/cjs/use-lazy-component.js +29 -2
- package/dist/cjs/use-media-in-timeline.js +4 -3
- package/dist/cjs/use-schema.d.ts +6 -0
- package/dist/cjs/use-schema.js +50 -0
- package/dist/cjs/use-sequence-control-override.d.ts +1 -0
- package/dist/cjs/use-sequence-control-override.js +16 -0
- package/dist/cjs/version.d.ts +1 -1
- package/dist/cjs/version.js +1 -1
- package/dist/cjs/video/OffthreadVideo.js +1 -1
- package/dist/cjs/video/OffthreadVideoForRendering.js +3 -3
- package/dist/cjs/video/Video.js +2 -2
- package/dist/cjs/video/VideoForPreview.js +2 -2
- package/dist/cjs/video/VideoForRendering.js +2 -2
- package/dist/esm/index.mjs +503 -398
- package/dist/esm/version.mjs +1 -1
- 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
|
+
});
|
package/dist/cjs/RemotionRoot.js
CHANGED
|
@@ -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");
|
package/dist/cjs/Sequence.d.ts
CHANGED
|
@@ -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
|
*/
|
package/dist/cjs/Sequence.js
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
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;
|
package/dist/cjs/audio/Audio.js
CHANGED
|
@@ -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
|
|
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.
|
|
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
|
|
14
|
-
|
|
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;
|
package/dist/cjs/index.d.ts
CHANGED
|
@@ -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
package/dist/cjs/internals.d.ts
CHANGED
|
@@ -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
|
|
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, };
|
package/dist/cjs/internals.js
CHANGED
|
@@ -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
|
-
|
|
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,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(() => { });
|
package/dist/cjs/series/index.js
CHANGED
|
@@ -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
|
-
|
|
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.
|
|
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
|
+
};
|