remotion 4.0.485 → 4.0.487

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/LICENSE.md ADDED
@@ -0,0 +1,49 @@
1
+ # Remotion License
2
+
3
+ In Remotion 5.0, the license will slightly change. [View the changes here](https://github.com/remotion-dev/remotion/pull/3750).
4
+
5
+ ---
6
+
7
+ Depending on the type of your legal entity, you are granted permission to use Remotion for your project. Individuals and small companies are allowed to use Remotion to create videos for free (even commercial), while a company license is required for for-profit organizations of a certain size. This two-tier system was designed to ensure funding for this project while still allowing the source code to be available and the program to be free for most. Read below for the exact terms of use.
8
+
9
+ - [Free License](#free-license)
10
+ - [Company License](#company-license)
11
+
12
+ ## Free License
13
+
14
+ Copyright © 2026 [Remotion](https://www.remotion.dev)
15
+
16
+ ### Eligibility
17
+
18
+ You are eligible to use Remotion for free if you are:
19
+
20
+ - an individual
21
+ - a for-profit organization with up to 3 employees
22
+ - a non-profit or not-for-profit organization
23
+ - evaluating whether Remotion is a good fit, and are not yet using it in a commercial way
24
+
25
+ ### Allowed use cases
26
+
27
+ Permission is hereby granted, free of charge, to any person eligible for the "Free License", to use the software non-commercially or commercially for the purpose of creating videos and images and to modify the software to their own liking, for the purpose of fulfilling their custom use case or to contribute bug fixes or improvements back to Remotion.
28
+
29
+ ### Disallowed use cases
30
+
31
+ It is not allowed to copy or modify Remotion code for the purpose of selling, renting, licensing, relicensing, or sublicensing your own derivate of Remotion.
32
+
33
+ ### Warranty notice
34
+
35
+ The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. In no event shall the author or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.
36
+
37
+ ### Support
38
+
39
+ Support is provided on a best-we-can-do basis via GitHub Issues and Discord.
40
+
41
+ ## Company License
42
+
43
+ You are required to obtain a Company License to use Remotion if you are not within the group of entities eligible for a Free License. This license will enable you to use Remotion for the allowed use cases specified in the Free License, and give you access to prioritized support (read the [Support Policy](https://www.remotion.dev/docs/support)).
44
+
45
+ Visit [remotion.pro](https://www.remotion.pro/license) for pricing and to buy a license.
46
+
47
+ ### FAQs
48
+
49
+ Are you not sure whether you need a Company License because of an edge case? Here are some [frequently asked questions](https://www.remotion.pro/faq).
@@ -1,4 +1,4 @@
1
- import type { FC } from 'react';
1
+ import type { FC, ReactNode } from 'react';
2
2
  import type { NonceHistory } from './nonce.js';
3
3
  export type TFolder = {
4
4
  name: string;
@@ -13,6 +13,6 @@ type FolderContextType = {
13
13
  export declare const FolderContext: import("react").Context<FolderContextType>;
14
14
  export declare const Folder: FC<{
15
15
  readonly name: string;
16
- readonly children: React.ReactNode;
16
+ readonly children?: ReactNode;
17
17
  }>;
18
18
  export {};
@@ -104,8 +104,7 @@ const HtmlInCanvasContent = (0, react_1.forwardRef)(({ width, height, effects, c
104
104
  ref(node);
105
105
  }
106
106
  else if (ref) {
107
- ref.current =
108
- node;
107
+ ref.current = node;
109
108
  }
110
109
  }, [ref]);
111
110
  const chainState = (0, use_effect_chain_state_js_1.useEffectChainState)();
@@ -319,8 +318,7 @@ const HtmlInCanvasInner = (0, react_1.forwardRef)(({ width, height, effects = []
319
318
  ref(node);
320
319
  }
321
320
  else if (ref) {
322
- ref.current =
323
- node;
321
+ ref.current = node;
324
322
  }
325
323
  }, [ref]);
326
324
  return (jsx_runtime_1.jsx(Sequence_js_1.Sequence, { durationInFrames: resolvedDuration, name: name !== null && name !== void 0 ? name : '<HtmlInCanvas>', _remotionInternalDocumentationLink: "https://www.remotion.dev/docs/remotion/html-in-canvas", controls: controls, _remotionInternalEffects: memoizedEffectDefinitions, outlineRef: actualRef, layout: "none", ...sequenceProps, children: jsx_runtime_1.jsx(HtmlInCanvasContent, { ref: setCanvasRef, width: width, height: height, effects: effects, onPaint: onPaint, onInit: onInit, pixelDensity: pixelDensity, controls: controls, style: style, children: children }) }));
@@ -94,6 +94,12 @@ export declare const Interactive: {
94
94
  readonly default: undefined;
95
95
  readonly description: "Color";
96
96
  };
97
+ readonly 'style.fontFamily': {
98
+ readonly type: "font-family";
99
+ readonly default: undefined;
100
+ readonly description: "Font family";
101
+ readonly keyframable: false;
102
+ };
97
103
  readonly 'style.fontSize': {
98
104
  readonly type: "number";
99
105
  readonly default: undefined;
@@ -5,6 +5,7 @@ export declare const ResolveCompositionContext: import("react").Context<ResolveC
5
5
  export declare const resolveCompositionsRef: import("react").RefObject<{
6
6
  setCurrentRenderModalComposition: (compositionId: string | null) => void;
7
7
  reloadCurrentlySelectedComposition: () => void;
8
+ resolveComposition: (compositionId: string) => Promise<VideoConfig>;
8
9
  } | null>;
9
10
  type VideoConfigState = {
10
11
  type: 'loading';
package/dist/cjs/Still.js CHANGED
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.Still = void 0;
7
7
  const react_1 = __importDefault(require("react"));
8
8
  const Composition_js_1 = require("./Composition.js");
9
+ const enable_sequence_stack_traces_js_1 = require("./enable-sequence-stack-traces.js");
9
10
  /*
10
11
  * @description A `<Still />` is a `<Composition />` that is only 1 frame long.
11
12
  * @see [Documentation](https://www.remotion.dev/docs/still)
@@ -20,3 +21,4 @@ const Still = (props) => {
20
21
  return react_1.default.createElement(Composition_js_1.Composition, newProps);
21
22
  };
22
23
  exports.Still = Still;
24
+ (0, enable_sequence_stack_traces_js_1.addSequenceStackTraces)(exports.Still);
@@ -1,12 +1,12 @@
1
- import type { MutableRefObject } from 'react';
1
+ import type { RefObject } from 'react';
2
2
  import React from 'react';
3
3
  import { type PlayableMediaTag } from './timeline-position-state';
4
4
  export type TimelineContextValue = {
5
5
  frame: Record<string, number>;
6
6
  playing: boolean;
7
7
  rootId: string;
8
- imperativePlaying: MutableRefObject<boolean>;
9
- audioAndVideoTags: MutableRefObject<PlayableMediaTag[]>;
8
+ imperativePlaying: RefObject<boolean>;
9
+ audioAndVideoTags: RefObject<PlayableMediaTag[]>;
10
10
  };
11
11
  export type PlaybackRateContextValue = {
12
12
  playbackRate: number;
@@ -17,7 +17,7 @@ type BufferManager = {
17
17
  addBlock: AddBlock;
18
18
  listenForBuffering: ListenForBuffering;
19
19
  listenForResume: ListenForResume;
20
- buffering: React.MutableRefObject<boolean>;
20
+ buffering: React.RefObject<boolean>;
21
21
  };
22
22
  export declare const BufferingContextReact: React.Context<BufferManager | null>;
23
23
  export declare const BufferingProvider: React.FC<{
@@ -90,7 +90,11 @@ const useBufferManager = (logLevel, mountTime) => {
90
90
  if (rendering) {
91
91
  return;
92
92
  }
93
- if (blocks.length > 0) {
93
+ // Only fire on the `false -> true` transition: adding a block while
94
+ // already buffering (e.g. a second media element starts loading) must
95
+ // not re-dispatch `waiting` to listeners.
96
+ if (blocks.length > 0 && !buffering.current) {
97
+ buffering.current = true;
94
98
  onBufferingCallbacks.forEach((c) => c());
95
99
  (0, playback_logging_1.playbackLogging)({
96
100
  logLevel,
@@ -110,7 +114,11 @@ const useBufferManager = (logLevel, mountTime) => {
110
114
  if (rendering) {
111
115
  return;
112
116
  }
113
- if (blocks.length === 0) {
117
+ // Only fire on the `true -> false` transition: the initial mount and
118
+ // a block that was added and removed within the same commit must not
119
+ // dispatch `resume` to listeners.
120
+ if (blocks.length === 0 && buffering.current) {
121
+ buffering.current = false;
114
122
  onResumeCallbacks.forEach((c) => c());
115
123
  (0, playback_logging_1.playbackLogging)({
116
124
  logLevel,
@@ -145,11 +153,11 @@ const useIsPlayerBuffering = (bufferManager) => {
145
153
  const onResume = () => {
146
154
  setIsBuffering(false);
147
155
  };
148
- bufferManager.listenForBuffering(onBuffer);
149
- bufferManager.listenForResume(onResume);
156
+ const buffer = bufferManager.listenForBuffering(onBuffer);
157
+ const resume = bufferManager.listenForResume(onResume);
150
158
  return () => {
151
- bufferManager.listenForBuffering(() => undefined);
152
- bufferManager.listenForResume(() => undefined);
159
+ buffer.remove();
160
+ resume.remove();
153
161
  };
154
162
  }, [bufferManager]);
155
163
  return isBuffering;
@@ -86,6 +86,14 @@ const loadImage = ({ src, signal, }) => {
86
86
  function exponentialBackoff(errorCount) {
87
87
  return 1000 * 2 ** (errorCount - 1);
88
88
  }
89
+ const waitForNextFrame = ({ onFrame, }) => {
90
+ if (typeof requestAnimationFrame === 'undefined') {
91
+ onFrame();
92
+ return () => undefined;
93
+ }
94
+ const frame = requestAnimationFrame(onFrame);
95
+ return () => cancelAnimationFrame(frame);
96
+ };
89
97
  const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit = 'fill', effects, controls, onError, className, style, id, pauseWhenLoading, maxRetries = 2, delayRenderRetries, delayRenderTimeoutInMilliseconds, refForOutline, ...canvasProps }, ref) => {
90
98
  var _a;
91
99
  const { delayRender, continueRender, cancelRender } = (0, use_delay_render_js_1.useDelayRender)();
@@ -99,6 +107,17 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
99
107
  overrideId: (_a = controls === null || controls === void 0 ? void 0 : controls.overrideId) !== null && _a !== void 0 ? _a : null,
100
108
  });
101
109
  const sequenceContext = (0, react_1.useContext)(SequenceContext_js_1.SequenceContext);
110
+ const pendingLoadDelayRef = (0, react_1.useRef)(null);
111
+ const continuePendingLoadDelay = (0, react_1.useCallback)(() => {
112
+ const pending = pendingLoadDelayRef.current;
113
+ if (!pending || pending.continued) {
114
+ return;
115
+ }
116
+ pending.continued = true;
117
+ pending.unblock();
118
+ continueRender(pending.handle);
119
+ pendingLoadDelayRef.current = null;
120
+ }, [continueRender]);
102
121
  const sourceCanvas = (0, react_1.useMemo)(() => {
103
122
  if (typeof document === 'undefined') {
104
123
  return null;
@@ -117,7 +136,7 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
117
136
  ref.current = canvas;
118
137
  }
119
138
  }, [ref, refForOutline]);
120
- (0, react_1.useEffect)(() => {
139
+ (0, react_1.useLayoutEffect)(() => {
121
140
  const isPremounting = Boolean(sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.premounting);
122
141
  const isPostmounting = Boolean(sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.postmounting);
123
142
  const handle = delayRender(`Rendering <CanvasImage> with src="${(0, truncate_src_for_label_js_1.truncateSrcForLabel)(actualSrc)}"`, {
@@ -129,17 +148,13 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
129
148
  : () => undefined;
130
149
  const controller = new AbortController();
131
150
  let cancelled = false;
132
- let continued = false;
133
151
  let errorCount = 0;
134
152
  let timeoutId = null;
135
153
  setLoadedImage(null);
136
- const continueRenderOnce = () => {
137
- if (continued) {
138
- return;
139
- }
140
- continued = true;
141
- unblock();
142
- continueRender(handle);
154
+ pendingLoadDelayRef.current = {
155
+ handle,
156
+ unblock,
157
+ continued: false,
143
158
  };
144
159
  const attemptLoad = () => {
145
160
  loadImage({ src: actualSrc, signal: controller.signal })
@@ -148,15 +163,10 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
148
163
  return;
149
164
  }
150
165
  setLoadedImage(image);
151
- })
152
- .then(() => {
153
- if (!cancelled) {
154
- continueRenderOnce();
155
- }
156
166
  })
157
167
  .catch((err) => {
158
168
  if (err.name === 'AbortError') {
159
- continueRenderOnce();
169
+ continuePendingLoadDelay();
160
170
  return;
161
171
  }
162
172
  errorCount++;
@@ -172,7 +182,7 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
172
182
  }
173
183
  else if (onError) {
174
184
  onError(err);
175
- continueRenderOnce();
185
+ continuePendingLoadDelay();
176
186
  }
177
187
  else {
178
188
  cancelRender(err);
@@ -186,12 +196,12 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
186
196
  clearTimeout(timeoutId);
187
197
  }
188
198
  controller.abort();
189
- continueRenderOnce();
199
+ continuePendingLoadDelay();
190
200
  };
191
201
  }, [
192
202
  actualSrc,
193
203
  cancelRender,
194
- continueRender,
204
+ continuePendingLoadDelay,
195
205
  delayPlayback,
196
206
  delayRender,
197
207
  delayRenderRetries,
@@ -202,13 +212,14 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
202
212
  sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.postmounting,
203
213
  sequenceContext === null || sequenceContext === void 0 ? void 0 : sequenceContext.premounting,
204
214
  ]);
205
- (0, react_1.useEffect)(() => {
215
+ (0, react_1.useLayoutEffect)(() => {
206
216
  if (!loadedImage || !outputCanvas || !sourceCanvas) {
207
217
  return;
208
218
  }
209
219
  const handle = delayRender(`Applying effects to <CanvasImage> with src="${(0, truncate_src_for_label_js_1.truncateSrcForLabel)(actualSrc)}"`);
210
220
  let cancelled = false;
211
221
  let continued = false;
222
+ let cancelWaitForNextFrame = () => undefined;
212
223
  const continueRenderOnce = () => {
213
224
  if (continued) {
214
225
  return;
@@ -244,7 +255,15 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
244
255
  })
245
256
  .then((completed) => {
246
257
  if (completed && !cancelled) {
247
- continueRenderOnce();
258
+ cancelWaitForNextFrame = waitForNextFrame({
259
+ onFrame: () => {
260
+ if (cancelled) {
261
+ return;
262
+ }
263
+ continueRenderOnce();
264
+ continuePendingLoadDelay();
265
+ },
266
+ });
248
267
  }
249
268
  })
250
269
  .catch((err) => {
@@ -254,6 +273,7 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
254
273
  if (onError) {
255
274
  onError(err);
256
275
  continueRenderOnce();
276
+ continuePendingLoadDelay();
257
277
  }
258
278
  else {
259
279
  cancelRender(err);
@@ -261,6 +281,7 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
261
281
  });
262
282
  return () => {
263
283
  cancelled = true;
284
+ cancelWaitForNextFrame();
264
285
  continueRenderOnce();
265
286
  };
266
287
  }, [
@@ -268,6 +289,7 @@ const CanvasImageContent = (0, react_1.forwardRef)(({ src, width, height, fit =
268
289
  cancelRender,
269
290
  chainState,
270
291
  continueRender,
292
+ continuePendingLoadDelay,
271
293
  delayRender,
272
294
  fit,
273
295
  height,
@@ -0,0 +1,44 @@
1
+ export type MediaSyncAction = {
2
+ type: 'seek-due-to-shift';
3
+ shouldBeTime: number;
4
+ why: string;
5
+ bufferUntilFirstFrame: boolean;
6
+ playReason: string | null;
7
+ warnAboutNonSeekable: boolean;
8
+ } | {
9
+ type: 'seek-if-not-playing';
10
+ shouldBeTime: number;
11
+ why: string | null;
12
+ } | {
13
+ type: 'play-and-seek';
14
+ shouldBeTime: number;
15
+ why: string | null;
16
+ playReason: string;
17
+ bufferUntilFirstFrame: boolean;
18
+ } | {
19
+ type: 'none';
20
+ };
21
+ export type GetMediaSyncActionInput = {
22
+ duration: number;
23
+ currentTime: number;
24
+ paused: boolean;
25
+ ended: boolean;
26
+ desiredUnclampedTime: number;
27
+ mediaTagTime: number;
28
+ mediaTagLastUpdate: number;
29
+ rvcTime: number | null;
30
+ rvcLastUpdate: number | null;
31
+ isVariableFpsVideo: boolean;
32
+ acceptableTimeShift: number;
33
+ lastSeekDueToShift: number | null;
34
+ playing: boolean;
35
+ playbackRate: number;
36
+ mediaTagBufferingOrStalled: boolean;
37
+ playerBuffering: boolean;
38
+ absoluteFrame: number;
39
+ onlyWarnForMediaSeekingError: boolean;
40
+ isPremounting: boolean;
41
+ isPostmounting: boolean;
42
+ pauseWhenBuffering: boolean;
43
+ };
44
+ export declare const getMediaSyncAction: (input: GetMediaSyncActionInput) => MediaSyncAction;
@@ -0,0 +1,78 @@
1
+ "use strict";
2
+ // Pure decision logic for `useMediaPlayback`.
3
+ //
4
+ // Every frame, the media element's clock has to be reconciled with the
5
+ // timeline clock. This function takes a snapshot of the relevant state and
6
+ // decides *what* should happen (seek / play / buffer / nothing). The effect in
7
+ // `use-media-playback.ts` is responsible for actually executing the returned
8
+ // action. Keeping the decision separate makes the branch ordering testable
9
+ // without a DOM or a real media element.
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.getMediaSyncAction = void 0;
12
+ const getMediaSyncAction = (input) => {
13
+ const { duration, currentTime, paused, ended, desiredUnclampedTime, mediaTagTime, mediaTagLastUpdate, rvcTime, rvcLastUpdate, isVariableFpsVideo, acceptableTimeShift, lastSeekDueToShift, playing, playbackRate, mediaTagBufferingOrStalled, playerBuffering, absoluteFrame, onlyWarnForMediaSeekingError, isPremounting, isPostmounting, pauseWhenBuffering, } = input;
14
+ const shouldBeTime = !Number.isNaN(duration) && Number.isFinite(duration)
15
+ ? Math.min(duration, desiredUnclampedTime)
16
+ : desiredUnclampedTime;
17
+ const timeShiftMediaTag = Math.abs(shouldBeTime - mediaTagTime);
18
+ const timeShiftRvcTag = rvcTime ? Math.abs(shouldBeTime - rvcTime) : null;
19
+ const mostRecentTimeshift = rvcLastUpdate && rvcTime > mediaTagLastUpdate
20
+ ? timeShiftRvcTag
21
+ : timeShiftMediaTag;
22
+ const timeShift = timeShiftRvcTag && !isVariableFpsVideo
23
+ ? mostRecentTimeshift
24
+ : timeShiftMediaTag;
25
+ if (timeShift > acceptableTimeShift && lastSeekDueToShift !== shouldBeTime) {
26
+ // If scrubbing around, adjust timing
27
+ // or if time shift is bigger than 0.45sec
28
+ return {
29
+ type: 'seek-due-to-shift',
30
+ shouldBeTime,
31
+ why: `because time shift is too big. shouldBeTime = ${shouldBeTime}, isTime = ${mediaTagTime}, requestVideoCallbackTime = ${rvcTime}, timeShift = ${timeShift}${isVariableFpsVideo ? ', isVariableFpsVideo = true' : ''}, isPremounting = ${isPremounting}, isPostmounting = ${isPostmounting}, pauseWhenBuffering = ${pauseWhenBuffering}`,
32
+ bufferUntilFirstFrame: playing && playbackRate > 0,
33
+ playReason: playing && paused
34
+ ? 'player is playing but media tag is paused, and just seeked'
35
+ : null,
36
+ warnAboutNonSeekable: !onlyWarnForMediaSeekingError,
37
+ };
38
+ }
39
+ const seekThreshold = playing ? 0.15 : 0.01;
40
+ // Only perform a seek if the time is not already the same.
41
+ // Chrome rounds to 6 digits, so 0.033333333 -> 0.033333,
42
+ // therefore a threshold is allowed.
43
+ // Refer to the https://github.com/remotion-dev/video-buffering-example
44
+ // which is fixed by only seeking conditionally.
45
+ const makesSenseToSeek = Math.abs(currentTime - shouldBeTime) > seekThreshold;
46
+ const isSomethingElseBuffering = playerBuffering && !mediaTagBufferingOrStalled;
47
+ if (!playing || isSomethingElseBuffering) {
48
+ return {
49
+ type: 'seek-if-not-playing',
50
+ shouldBeTime,
51
+ why: makesSenseToSeek
52
+ ? `not playing or something else is buffering. time offset is over seek threshold (${seekThreshold})`
53
+ : null,
54
+ };
55
+ }
56
+ if (!playing || playerBuffering) {
57
+ return { type: 'none' };
58
+ }
59
+ // We now assured we are in playing state and not buffering
60
+ const pausedCondition = paused && !ended;
61
+ const firstFrameCondition = absoluteFrame === 0;
62
+ if (pausedCondition || firstFrameCondition) {
63
+ const reason = pausedCondition
64
+ ? 'media tag is paused'
65
+ : 'absolute frame is 0';
66
+ return {
67
+ type: 'play-and-seek',
68
+ shouldBeTime,
69
+ why: makesSenseToSeek
70
+ ? `is over timeshift threshold (threshold = ${seekThreshold}) and ${reason}`
71
+ : null,
72
+ playReason: `player is playing and ${reason}`,
73
+ bufferUntilFirstFrame: !isVariableFpsVideo && playbackRate > 0,
74
+ };
75
+ }
76
+ return { type: 'none' };
77
+ };
78
+ exports.getMediaSyncAction = getMediaSyncAction;
@@ -88,6 +88,12 @@ export type TextContentFieldSchema = {
88
88
  description?: string;
89
89
  keyframable?: false;
90
90
  };
91
+ export type FontFamilyFieldSchema = {
92
+ type: 'font-family';
93
+ default: string | undefined;
94
+ description?: string;
95
+ keyframable?: false;
96
+ };
91
97
  export type EnumFieldSchema = {
92
98
  type: 'enum';
93
99
  default: string;
@@ -117,7 +123,7 @@ export type ArrayFieldSchema = {
117
123
  description?: string;
118
124
  keyframable?: false;
119
125
  };
120
- export type VisibleFieldSchema = NumberFieldSchema | BooleanFieldSchema | RotationCssFieldSchema | RotationDegreesFieldSchema | TranslateFieldSchema | TransformOriginFieldSchema | ScaleFieldSchema | UvCoordinateFieldSchema | ColorFieldSchema | TextContentFieldSchema | ArrayFieldSchema | EnumFieldSchema;
126
+ export type VisibleFieldSchema = NumberFieldSchema | BooleanFieldSchema | RotationCssFieldSchema | RotationDegreesFieldSchema | TranslateFieldSchema | TransformOriginFieldSchema | ScaleFieldSchema | UvCoordinateFieldSchema | ColorFieldSchema | TextContentFieldSchema | FontFamilyFieldSchema | ArrayFieldSchema | EnumFieldSchema;
121
127
  export type InteractivitySchemaField = VisibleFieldSchema | HiddenFieldSchema;
122
128
  export type InteractivitySchema = {
123
129
  [key: string]: InteractivitySchemaField;
@@ -201,6 +207,12 @@ export declare const textSchema: {
201
207
  readonly default: undefined;
202
208
  readonly description: "Color";
203
209
  };
210
+ readonly 'style.fontFamily': {
211
+ readonly type: "font-family";
212
+ readonly default: undefined;
213
+ readonly description: "Font family";
214
+ readonly keyframable: false;
215
+ };
204
216
  readonly 'style.fontSize': {
205
217
  readonly type: "number";
206
218
  readonly default: undefined;
@@ -44,6 +44,12 @@ exports.textSchema = {
44
44
  default: undefined,
45
45
  description: 'Color',
46
46
  },
47
+ 'style.fontFamily': {
48
+ type: 'font-family',
49
+ default: undefined,
50
+ description: 'Font family',
51
+ keyframable: false,
52
+ },
47
53
  'style.fontSize': {
48
54
  type: 'number',
49
55
  default: undefined,
@@ -327,6 +327,12 @@ export declare const Internals: {
327
327
  readonly default: undefined;
328
328
  readonly description: "Color";
329
329
  };
330
+ readonly 'style.fontFamily': {
331
+ readonly type: "font-family";
332
+ readonly default: undefined;
333
+ readonly description: "Font family";
334
+ readonly keyframable: false;
335
+ };
330
336
  readonly 'style.fontSize': {
331
337
  readonly type: "number";
332
338
  readonly default: undefined;
@@ -659,6 +665,7 @@ export declare const Internals: {
659
665
  readonly resolveCompositionsRef: import("react").RefObject<{
660
666
  setCurrentRenderModalComposition: (compositionId: string | null) => void;
661
667
  reloadCurrentlySelectedComposition: () => void;
668
+ resolveComposition: (compositionId: string) => Promise<import("./video-config.js").VideoConfig>;
662
669
  } | null>;
663
670
  readonly REMOTION_STUDIO_CONTAINER_ELEMENT: "__remotion-studio-container";
664
671
  readonly RenderAssetManager: import("react").Context<import("./RenderAssetManager.js").RenderAssetManagerContext>;
@@ -687,7 +694,7 @@ export declare const Internals: {
687
694
  listenForResume: (callback: () => void) => {
688
695
  remove: () => void;
689
696
  };
690
- buffering: import("react").MutableRefObject<boolean>;
697
+ buffering: import("react").RefObject<boolean>;
691
698
  } | null>;
692
699
  readonly getComponentsToAddStacksTo: () => unknown[];
693
700
  readonly CurrentScaleContext: import("react").Context<import("./use-current-scale.js").CurrentScaleContextType | null>;
@@ -816,7 +823,7 @@ export declare const Internals: {
816
823
  listenForResume: (callback: () => void) => {
817
824
  remove: () => void;
818
825
  };
819
- buffering: import("react").MutableRefObject<boolean>;
826
+ buffering: import("react").RefObject<boolean>;
820
827
  }) => boolean;
821
828
  readonly TimelinePosition: typeof TimelinePosition;
822
829
  readonly DelayRenderContextType: import("react").Context<import("./delay-render.js").DelayRenderScope | null>;
@@ -1,4 +1,4 @@
1
- import type { MutableRefObject } from 'react';
1
+ import type { RefObject } from 'react';
2
2
  import { type PlaybackRateContextValue, type TimelineContextValue } from './TimelineContext.js';
3
3
  export type PlayableMediaTag = {
4
4
  play: (reason: string) => void;
@@ -17,7 +17,7 @@ export declare const useTimelineSetFrame: () => (u: import("react").SetStateActi
17
17
  type PlayingReturnType = readonly [
18
18
  boolean,
19
19
  (u: React.SetStateAction<boolean>) => void,
20
- MutableRefObject<boolean>
20
+ RefObject<boolean>
21
21
  ];
22
22
  export declare const usePlayingState: () => PlayingReturnType;
23
23
  export {};