remotion 4.0.484 → 4.0.485

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/README.md CHANGED
@@ -12,31 +12,21 @@
12
12
  [![NPM Downloads](https://img.shields.io/npm/dm/remotion.svg?style=flat&color=black&label=Downloads)](https://npmcharts.com/compare/remotion?minimal=true)
13
13
  <a href="https://twitter.com/remotion"><img src="https://img.shields.io/twitter/follow/remotion?label=Twitter&color=black" alt="Twitter"></a>
14
14
 
15
- Remotion is a framework for **creating videos programmatically using React.**
16
-
17
- ## Why create videos in React?
18
-
19
- - **Leverage web technologies**: Use all of CSS, Canvas, SVG, WebGL, etc.
20
- - **Leverage programming**: Use variables, functions, APIs, math and algorithms to create new effects
21
- - **Leverage React**: Reusable components, Powerful composition, Fast Refresh, Package ecosystem
22
-
23
- ## Created with Remotion
24
-
25
- <table>
26
- <tr>
27
- <td align="center">
28
- <img style="width: 290px" src="https://pub-646d808d9cb240cea53bedc76dd3cd0c.r2.dev/fireship-quick.gif" />
29
- <p>"This video was made with code" <em>- Fireship</em> <a href="https://youtu.be/deg8bOoziaE">Watch</a> <a href="https://github.com/wcandillon/remotion-fireship">Source</a></p>
30
- </td>
31
- <td align="center">
32
- <img style="width: 240px" src="https://pub-646d808d9cb240cea53bedc76dd3cd0c.r2.dev/unwrapped-2023.gif" />
33
- <p>GitHub Unwrapped - Personalized Year in Review <a href="https://www.githubunwrapped.com">Try</a> • <a href="https://github.com/remotion-dev/github-unwrapped">Source</a></p>
34
- </td>
35
- <td align="center">
36
- <em>View more in the <a href="https://remotion.dev/showcase">Remotion Showcase</a>!</em>
37
- </td>
38
- </tr>
39
- </table>
15
+ Video tools for the agent era.
16
+
17
+ ## Video Creation
18
+
19
+ - **Make videos agentically**: Turn your idea into a video using your coding agent.
20
+ - **Make videos interactively**: Edit and animate using drag and drop.
21
+ - **Make videos programmatically**: Connect to data, and manage complexity with code.
22
+
23
+ React Code is the source of truth. Switch your workflow at any point.
24
+
25
+ ## Video Automation
26
+
27
+ - **Design systems**: Create a library of animated assets for your organization.
28
+ - **Batch rendering**: Render millions of videos on your own infrastructure.
29
+ - **Applications**: Publish a simple tool or a complex video editor.
40
30
 
41
31
  ## Get started
42
32
 
@@ -48,6 +38,50 @@ npx create-video@latest
48
38
 
49
39
  to get started. Otherwise, read the [installation page](https://www.remotion.dev/docs/) in the documentation.
50
40
 
41
+ ## Discover Remotion
42
+
43
+ Remotion is extensively documented over more than 1000 pages.
44
+
45
+ - Get Started
46
+ - [Installation](https://remotion.dev/docs)
47
+ - [Agent Skills](https://www.remotion.dev/docs/ai/skills)
48
+ - [Prompts](https://www.remotion.dev/prompts)
49
+ - [Templates](https://remotion.dev/templates)
50
+ - Components
51
+ - [Effects](https://remotion.dev/effects)
52
+ - [Shapes](https://remotion.dev/docs/shapes)
53
+ - [Transitions](https://remotion.dev/transitions)
54
+ - [Sound Effects](https://remotion.dev/docs/sfx)
55
+ - [Captions](https://remotion.dev/docs/captions)
56
+ - [Fonts](https://remotion.dev/docs/fonts)
57
+ - Rendering
58
+ - [Node.js APIs](https://www.remotion.dev/docs/ssr)
59
+ - [Lambda](https://www.remotion.dev/docs/lambda)
60
+ - [Vercel](https://www.remotion.dev/docs/vercel-sandbox)
61
+ - [Client-side rendering](https://www.remotion.dev/docs/client-side-rendering/)
62
+ - [Comparison of options](https://remotion.dev/docs/compare-ssr)
63
+ - Making apps
64
+ - [Player](https://remotion.dev/docs/player)
65
+ - [Editor Starter](https://remotion.dev/editor-starter)
66
+ - [Mediabunny](https://remotion.dev/docs/mediabunny)
67
+ - Community
68
+ - [Discord](https://remotion.dev/discord)
69
+ - [Experts](https://remotion.dev/experts)
70
+ - [Resources](https://remotion.dev/resources)
71
+ - [Contributing](https://remotion.dev/contributing)
72
+ - Follow us on [X](https://x.com/remotion), [YouTube](https://youtube.com/@remotion_dev), [Instagram](https://instagram.com/remotion), [LinkedIn](https://linkedin.com/company/remotion)
73
+ - Commercial
74
+ - [License](https://remotion.dev/license)
75
+ - [Store](https://remotion.pro/store)
76
+ - [About Remotion](https://remotion.dev/about)
77
+ - [Showcase](https://remotion.dev/showcase)
78
+ - Help
79
+ - [Support](https://remotion.dev/support)
80
+ - [Discord](https://remotion.dev/discord)
81
+ - [Search](https://remotion.dev/search)
82
+ - [Ask AI](https://remotion.dev/ai)
83
+ - [GitHub Issues](https://remotion.dev/issues)
84
+
51
85
  ## Documentation
52
86
 
53
87
  Documentation: [**remotion.dev/docs**](https://www.remotion.dev/docs)
@@ -44,6 +44,7 @@ const interactiveElementSchema = {
44
44
  ...interactivity_schema_js_1.baseSchema,
45
45
  ...interactivity_schema_js_1.transformSchema,
46
46
  ...interactivity_schema_js_1.textSchema,
47
+ ...interactivity_schema_js_1.textContentSchema,
47
48
  };
48
49
  const setRef = (ref, value) => {
49
50
  if (typeof ref === 'function') {
@@ -13,7 +13,7 @@ const getTimelineDuration = ({ compositionDurationInFrames, playbackRate, trimBe
13
13
  trimAfter,
14
14
  });
15
15
  if (parentSequenceDurationInFrames !== null) {
16
- const cappedDuration = Math.min(parentSequenceDurationInFrames * playbackRate, mediaDuration);
16
+ const cappedDuration = Math.min(parentSequenceDurationInFrames, mediaDuration);
17
17
  return Number(cappedDuration.toFixed(10));
18
18
  }
19
19
  return mediaDuration;
@@ -82,6 +82,12 @@ export type ColorFieldSchema = {
82
82
  description?: string;
83
83
  keyframable?: boolean;
84
84
  };
85
+ export type TextContentFieldSchema = {
86
+ type: 'text-content';
87
+ default: string;
88
+ description?: string;
89
+ keyframable?: false;
90
+ };
85
91
  export type EnumFieldSchema = {
86
92
  type: 'enum';
87
93
  default: string;
@@ -111,7 +117,7 @@ export type ArrayFieldSchema = {
111
117
  description?: string;
112
118
  keyframable?: false;
113
119
  };
114
- export type VisibleFieldSchema = NumberFieldSchema | BooleanFieldSchema | RotationCssFieldSchema | RotationDegreesFieldSchema | TranslateFieldSchema | TransformOriginFieldSchema | ScaleFieldSchema | UvCoordinateFieldSchema | ColorFieldSchema | ArrayFieldSchema | EnumFieldSchema;
120
+ export type VisibleFieldSchema = NumberFieldSchema | BooleanFieldSchema | RotationCssFieldSchema | RotationDegreesFieldSchema | TranslateFieldSchema | TransformOriginFieldSchema | ScaleFieldSchema | UvCoordinateFieldSchema | ColorFieldSchema | TextContentFieldSchema | ArrayFieldSchema | EnumFieldSchema;
115
121
  export type InteractivitySchemaField = VisibleFieldSchema | HiddenFieldSchema;
116
122
  export type InteractivitySchema = {
117
123
  [key: string]: InteractivitySchemaField;
@@ -260,6 +266,14 @@ export declare const textSchema: {
260
266
  readonly hiddenFromList: false;
261
267
  };
262
268
  };
269
+ export declare const textContentSchema: {
270
+ readonly children: {
271
+ readonly type: "text-content";
272
+ readonly default: "";
273
+ readonly description: "Text";
274
+ readonly keyframable: false;
275
+ };
276
+ };
263
277
  export declare const premountSchema: {
264
278
  readonly premountFor: {
265
279
  readonly type: "number";
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.sequenceSchemaDefaultLayoutNone = exports.sequenceSchemaWithoutFrom = exports.baseSchemaWithoutFrom = exports.sequenceSchema = exports.baseSchema = exports.freezeField = exports.trimBeforeField = exports.fromField = exports.durationInFramesField = exports.extendSchemaWithSequenceName = exports.sequenceNameField = exports.hiddenField = exports.sequenceStyleSchema = exports.sequencePremountSchema = exports.premountSchema = exports.textSchema = exports.sequenceVisualStyleSchema = exports.transformSchema = void 0;
3
+ exports.sequenceSchemaDefaultLayoutNone = exports.sequenceSchemaWithoutFrom = exports.baseSchemaWithoutFrom = exports.sequenceSchema = exports.baseSchema = exports.freezeField = exports.trimBeforeField = exports.fromField = exports.durationInFramesField = exports.extendSchemaWithSequenceName = exports.sequenceNameField = exports.hiddenField = exports.sequenceStyleSchema = exports.sequencePremountSchema = exports.premountSchema = exports.textContentSchema = exports.textSchema = exports.sequenceVisualStyleSchema = exports.transformSchema = void 0;
4
4
  exports.transformSchema = {
5
5
  'style.transformOrigin': {
6
6
  type: 'transform-origin',
@@ -109,6 +109,14 @@ exports.textSchema = {
109
109
  hiddenFromList: false,
110
110
  },
111
111
  };
112
+ exports.textContentSchema = {
113
+ children: {
114
+ type: 'text-content',
115
+ default: '',
116
+ description: 'Text',
117
+ keyframable: false,
118
+ },
119
+ };
112
120
  exports.premountSchema = {
113
121
  premountFor: {
114
122
  type: 'number',
@@ -3,4 +3,4 @@
3
3
  * @see [Documentation](https://remotion.dev/docs/version)
4
4
  * @returns {string} The current version of the remotion package
5
5
  */
6
- export declare const VERSION = "4.0.484";
6
+ export declare const VERSION = "4.0.485";
@@ -7,4 +7,4 @@ exports.VERSION = void 0;
7
7
  * @see [Documentation](https://remotion.dev/docs/version)
8
8
  * @returns {string} The current version of the remotion package
9
9
  */
10
- exports.VERSION = '4.0.484';
10
+ exports.VERSION = '4.0.485';
@@ -2,9 +2,15 @@ import React from 'react';
2
2
  import type { SequenceControls } from './CompositionManager.js';
3
3
  import { type InteractivitySchema } from './interactivity-schema.js';
4
4
  export declare const getNestedValue: (obj: Record<string, unknown>, key: string) => unknown;
5
- export declare const readValuesFromProps: (props: Record<string, unknown>, keys: string[]) => Record<string, unknown>;
5
+ export declare const getRuntimeValueForSchemaKey: ({ flatSchema, key, props, }: {
6
+ flatSchema: InteractivitySchema;
7
+ key: string;
8
+ props: Record<string, unknown>;
9
+ }) => unknown;
10
+ export declare const readValuesFromProps: (props: Record<string, unknown>, keys: string[], flatSchema?: InteractivitySchema | undefined) => Record<string, unknown>;
6
11
  export declare const selectActiveKeys: (schema: InteractivitySchema, values: Record<string, unknown>) => string[];
7
- export declare const mergeValues: ({ props, valuesDotNotation, schemaKeys, propsToDelete, }: {
12
+ export declare const mergeValues: ({ flatSchema, props, valuesDotNotation, schemaKeys, propsToDelete, }: {
13
+ flatSchema: InteractivitySchema;
8
14
  props: Record<string, unknown>;
9
15
  valuesDotNotation: Record<string, unknown>;
10
16
  schemaKeys: string[];
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.withInteractivitySchema = exports.mergeValues = exports.selectActiveKeys = exports.readValuesFromProps = exports.getNestedValue = void 0;
36
+ exports.withInteractivitySchema = exports.mergeValues = exports.selectActiveKeys = exports.readValuesFromProps = exports.getRuntimeValueForSchemaKey = exports.getNestedValue = void 0;
37
37
  const react_1 = __importStar(require("react"));
38
38
  const delete_nested_key_js_1 = require("./delete-nested-key.js");
39
39
  const use_memoized_effects_js_1 = require("./effects/use-memoized-effects.js");
@@ -57,10 +57,21 @@ const getNestedValue = (obj, key) => {
57
57
  return current;
58
58
  };
59
59
  exports.getNestedValue = getNestedValue;
60
- const readValuesFromProps = (props, keys) => {
60
+ const getRuntimeValueForSchemaKey = ({ flatSchema, key, props, }) => {
61
+ var _a;
62
+ const value = (0, exports.getNestedValue)(props, key);
63
+ if (((_a = flatSchema[key]) === null || _a === void 0 ? void 0 : _a.type) === 'text-content' && typeof value !== 'string') {
64
+ return undefined;
65
+ }
66
+ return value;
67
+ };
68
+ exports.getRuntimeValueForSchemaKey = getRuntimeValueForSchemaKey;
69
+ const readValuesFromProps = (props, keys, flatSchema) => {
61
70
  const out = {};
62
71
  for (const key of keys) {
63
- out[key] = (0, exports.getNestedValue)(props, key);
72
+ out[key] = flatSchema
73
+ ? (0, exports.getRuntimeValueForSchemaKey)({ flatSchema, key, props })
74
+ : (0, exports.getNestedValue)(props, key);
64
75
  }
65
76
  return out;
66
77
  };
@@ -69,10 +80,14 @@ const selectActiveKeys = (schema, values) => {
69
80
  return Object.keys((0, flatten_schema_js_1.flattenActiveSchema)(schema, (key) => values[key]));
70
81
  };
71
82
  exports.selectActiveKeys = selectActiveKeys;
72
- const mergeValues = ({ props, valuesDotNotation, schemaKeys, propsToDelete, }) => {
83
+ const mergeValues = ({ flatSchema, props, valuesDotNotation, schemaKeys, propsToDelete, }) => {
84
+ var _a;
73
85
  const merged = { ...props };
74
86
  for (const key of schemaKeys) {
75
87
  const value = valuesDotNotation[key];
88
+ if (((_a = flatSchema[key]) === null || _a === void 0 ? void 0 : _a.type) === 'text-content' && value === undefined) {
89
+ continue;
90
+ }
76
91
  const parts = key.split('.');
77
92
  if (parts.length === 1) {
78
93
  merged[key] = value;
@@ -93,7 +108,12 @@ const mergeValues = ({ props, valuesDotNotation, schemaKeys, propsToDelete, }) =
93
108
  }
94
109
  current[parts[parts.length - 1]] = value;
95
110
  }
96
- (0, delete_nested_key_js_1.deleteNestedKey)(merged, propsToDelete);
111
+ const propsToDeleteWithoutTextContent = new Set([...propsToDelete].filter((key) => {
112
+ var _a;
113
+ return !(((_a = flatSchema[key]) === null || _a === void 0 ? void 0 : _a.type) === 'text-content' &&
114
+ valuesDotNotation[key] === undefined);
115
+ }));
116
+ (0, delete_nested_key_js_1.deleteNestedKey)(merged, propsToDeleteWithoutTextContent);
97
117
  return merged;
98
118
  };
99
119
  exports.mergeValues = mergeValues;
@@ -148,9 +168,13 @@ const withInteractivitySchema = ({ Component, componentName, componentIdentity,
148
168
  // memoized on the leaf values so the object reference is stable
149
169
  // when nothing changed — otherwise downstream `useMemo`s churn and
150
170
  // effects (e.g. Sequence registration) re-fire every render.
151
- const runtimeValues = flatKeys.map((k) => (0, exports.getNestedValue)(props, k));
171
+ const runtimeValues = flatKeys.map((key) => (0, exports.getRuntimeValueForSchemaKey)({
172
+ flatSchema,
173
+ key,
174
+ props: props,
175
+ }));
152
176
  // eslint-disable-next-line react-hooks/rules-of-hooks
153
- const currentRuntimeValueDotNotation = (0, react_1.useMemo)(() => (0, exports.readValuesFromProps)(props, flatKeys),
177
+ const currentRuntimeValueDotNotation = (0, react_1.useMemo)(() => (0, exports.readValuesFromProps)(props, flatKeys, flatSchema),
154
178
  // eslint-disable-next-line react-hooks/exhaustive-deps
155
179
  runtimeValues);
156
180
  // eslint-disable-next-line react-hooks/rules-of-hooks
@@ -187,6 +211,7 @@ const withInteractivitySchema = ({ Component, componentName, componentIdentity,
187
211
  const activeKeys = (0, exports.selectActiveKeys)(schemaWithSequenceName, valuesDotNotation);
188
212
  // 5. Apply the active values back onto the props.
189
213
  const mergedProps = (0, exports.mergeValues)({
214
+ flatSchema,
190
215
  props: props,
191
216
  valuesDotNotation,
192
217
  schemaKeys: activeKeys,
@@ -1291,7 +1291,7 @@ var addSequenceStackTraces = (component) => {
1291
1291
  };
1292
1292
 
1293
1293
  // src/version.ts
1294
- var VERSION = "4.0.484";
1294
+ var VERSION = "4.0.485";
1295
1295
 
1296
1296
  // src/multiple-versions-warning.ts
1297
1297
  var checkMultipleRemotionVersions = () => {
@@ -1821,6 +1821,14 @@ var textSchema = {
1821
1821
  hiddenFromList: false
1822
1822
  }
1823
1823
  };
1824
+ var textContentSchema = {
1825
+ children: {
1826
+ type: "text-content",
1827
+ default: "",
1828
+ description: "Text",
1829
+ keyframable: false
1830
+ }
1831
+ };
1824
1832
  var premountSchema = {
1825
1833
  premountFor: {
1826
1834
  type: "number",
@@ -4246,10 +4254,21 @@ var getNestedValue = (obj, key) => {
4246
4254
  }
4247
4255
  return current;
4248
4256
  };
4249
- var readValuesFromProps = (props, keys) => {
4257
+ var getRuntimeValueForSchemaKey = ({
4258
+ flatSchema,
4259
+ key,
4260
+ props
4261
+ }) => {
4262
+ const value = getNestedValue(props, key);
4263
+ if (flatSchema[key]?.type === "text-content" && typeof value !== "string") {
4264
+ return;
4265
+ }
4266
+ return value;
4267
+ };
4268
+ var readValuesFromProps = (props, keys, flatSchema) => {
4250
4269
  const out = {};
4251
4270
  for (const key of keys) {
4252
- out[key] = getNestedValue(props, key);
4271
+ out[key] = flatSchema ? getRuntimeValueForSchemaKey({ flatSchema, key, props }) : getNestedValue(props, key);
4253
4272
  }
4254
4273
  return out;
4255
4274
  };
@@ -4257,6 +4276,7 @@ var selectActiveKeys = (schema, values) => {
4257
4276
  return Object.keys(flattenActiveSchema(schema, (key) => values[key]));
4258
4277
  };
4259
4278
  var mergeValues = ({
4279
+ flatSchema,
4260
4280
  props,
4261
4281
  valuesDotNotation,
4262
4282
  schemaKeys,
@@ -4265,6 +4285,9 @@ var mergeValues = ({
4265
4285
  const merged = { ...props };
4266
4286
  for (const key of schemaKeys) {
4267
4287
  const value = valuesDotNotation[key];
4288
+ if (flatSchema[key]?.type === "text-content" && value === undefined) {
4289
+ continue;
4290
+ }
4268
4291
  const parts = key.split(".");
4269
4292
  if (parts.length === 1) {
4270
4293
  merged[key] = value;
@@ -4282,7 +4305,8 @@ var mergeValues = ({
4282
4305
  }
4283
4306
  current[parts[parts.length - 1]] = value;
4284
4307
  }
4285
- deleteNestedKey(merged, propsToDelete);
4308
+ const propsToDeleteWithoutTextContent = new Set([...propsToDelete].filter((key) => !(flatSchema[key]?.type === "text-content" && valuesDotNotation[key] === undefined)));
4309
+ deleteNestedKey(merged, propsToDeleteWithoutTextContent);
4286
4310
  return merged;
4287
4311
  };
4288
4312
  var stackToOverrideMap = {};
@@ -4329,8 +4353,12 @@ var withInteractivitySchema = ({
4329
4353
  return newOverrideId;
4330
4354
  });
4331
4355
  const nodePath = nodePathMapping.overrideIdToNodePathMappings[overrideId] ?? null;
4332
- const runtimeValues = flatKeys.map((k) => getNestedValue(props, k));
4333
- const currentRuntimeValueDotNotation = useMemo13(() => readValuesFromProps(props, flatKeys), runtimeValues);
4356
+ const runtimeValues = flatKeys.map((key) => getRuntimeValueForSchemaKey({
4357
+ flatSchema,
4358
+ key,
4359
+ props
4360
+ }));
4361
+ const currentRuntimeValueDotNotation = useMemo13(() => readValuesFromProps(props, flatKeys, flatSchema), runtimeValues);
4334
4362
  const controls = useMemo13(() => {
4335
4363
  return {
4336
4364
  schema: schemaWithSequenceName,
@@ -4358,6 +4386,7 @@ var withInteractivitySchema = ({
4358
4386
  ]);
4359
4387
  const activeKeys = selectActiveKeys(schemaWithSequenceName, valuesDotNotation);
4360
4388
  const mergedProps = mergeValues({
4389
+ flatSchema,
4361
4390
  props,
4362
4391
  valuesDotNotation,
4363
4392
  schemaKeys: activeKeys,
@@ -7130,7 +7159,7 @@ var getTimelineDuration = ({
7130
7159
  trimAfter
7131
7160
  });
7132
7161
  if (parentSequenceDurationInFrames !== null) {
7133
- const cappedDuration = Math.min(parentSequenceDurationInFrames * playbackRate, mediaDuration);
7162
+ const cappedDuration = Math.min(parentSequenceDurationInFrames, mediaDuration);
7134
7163
  return Number(cappedDuration.toFixed(10));
7135
7164
  }
7136
7165
  return mediaDuration;
@@ -10084,7 +10113,8 @@ import { jsx as jsx29 } from "react/jsx-runtime";
10084
10113
  var interactiveElementSchema = {
10085
10114
  ...baseSchema,
10086
10115
  ...transformSchema,
10087
- ...textSchema
10116
+ ...textSchema,
10117
+ ...textContentSchema
10088
10118
  };
10089
10119
  var setRef = (ref, value) => {
10090
10120
  if (typeof ref === "function") {
@@ -1,5 +1,5 @@
1
1
  // src/version.ts
2
- var VERSION = "4.0.484";
2
+ var VERSION = "4.0.485";
3
3
  export {
4
4
  VERSION
5
5
  };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/core"
4
4
  },
5
5
  "name": "remotion",
6
- "version": "4.0.484",
6
+ "version": "4.0.485",
7
7
  "description": "Make videos programmatically",
8
8
  "main": "dist/cjs/index.js",
9
9
  "types": "dist/cjs/index.d.ts",
@@ -35,7 +35,7 @@
35
35
  "react-dom": "19.2.3",
36
36
  "webpack": "5.105.0",
37
37
  "zod": "4.3.6",
38
- "@remotion/eslint-config-internal": "4.0.484",
38
+ "@remotion/eslint-config-internal": "4.0.485",
39
39
  "eslint": "9.19.0",
40
40
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
41
41
  },