@remotion/vercel 4.0.474 → 4.0.476

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 (2) hide show
  1. package/dist/esm/index.mjs +314 -8
  2. package/package.json +4 -4
@@ -156,6 +156,32 @@ var lengthUnits = new Set([
156
156
  "vw"
157
157
  ]);
158
158
  var cssNumberRegex = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))([a-zA-Z%]+)?$/;
159
+ var transformOriginKeywords = new Set([
160
+ "left",
161
+ "center",
162
+ "right",
163
+ "top",
164
+ "bottom"
165
+ ]);
166
+ var transformOriginKeywordOptions = (keyword) => {
167
+ if (keyword === "left") {
168
+ return [{ axis: "x", value: { value: 0, unit: "%" } }];
169
+ }
170
+ if (keyword === "right") {
171
+ return [{ axis: "x", value: { value: 100, unit: "%" } }];
172
+ }
173
+ if (keyword === "top") {
174
+ return [{ axis: "y", value: { value: 0, unit: "%" } }];
175
+ }
176
+ if (keyword === "bottom") {
177
+ return [{ axis: "y", value: { value: 100, unit: "%" } }];
178
+ }
179
+ return [
180
+ { axis: "x", value: { value: 50, unit: "%" } },
181
+ { axis: "y", value: { value: 50, unit: "%" } }
182
+ ];
183
+ };
184
+ var transformOriginCenter = { value: 50, unit: "%" };
159
185
  var stringifyNumber = (value) => {
160
186
  return String(normalizeNumber(value));
161
187
  };
@@ -180,6 +206,110 @@ var parseStringInterpolationComponent = (component, value) => {
180
206
  }
181
207
  throw new TypeError(\`Cannot interpolate "\${value}" because "\${unit}" is not a supported translate or rotate unit\`);
182
208
  };
209
+ var parseTransformOriginLengthPercentage = ({
210
+ component,
211
+ value,
212
+ allowPercentage
213
+ }) => {
214
+ const match = cssNumberRegex.exec(component);
215
+ if (match === null) {
216
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not a supported transform-origin \${allowPercentage ? "length-percentage" : "z length"}\`);
217
+ }
218
+ const unit = match[2] ?? null;
219
+ const numberValue = Number(match[1]);
220
+ if (!Number.isFinite(numberValue)) {
221
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not finite\`);
222
+ }
223
+ if (unit === null || !lengthUnits.has(unit) || !allowPercentage && unit === "%") {
224
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not a supported transform-origin \${allowPercentage ? "length-percentage" : "z length"}\`);
225
+ }
226
+ return { value: numberValue, unit };
227
+ };
228
+ var parseTransformOriginToken = (component, value) => {
229
+ const lower = component.toLowerCase();
230
+ if (transformOriginKeywords.has(lower)) {
231
+ return { type: "keyword", keyword: lower };
232
+ }
233
+ return {
234
+ type: "length-percentage",
235
+ parsed: parseTransformOriginLengthPercentage({
236
+ component,
237
+ value,
238
+ allowPercentage: true
239
+ })
240
+ };
241
+ };
242
+ var parseTwoTransformOriginKeywords = (first, second, value) => {
243
+ const candidates = [];
244
+ for (const firstOption of transformOriginKeywordOptions(first)) {
245
+ for (const secondOption of transformOriginKeywordOptions(second)) {
246
+ if (firstOption.axis === secondOption.axis) {
247
+ continue;
248
+ }
249
+ candidates.push(firstOption.axis === "x" ? [firstOption.value, secondOption.value] : [secondOption.value, firstOption.value]);
250
+ }
251
+ }
252
+ if (candidates.length === 0) {
253
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${first} \${second}" is not a valid transform-origin keyword pair\`);
254
+ }
255
+ return candidates[0];
256
+ };
257
+ var parseTransformOriginXY = (parts, value) => {
258
+ if (parts.length === 1) {
259
+ const token = parseTransformOriginToken(parts[0], value);
260
+ if (token.type === "length-percentage") {
261
+ return [token.parsed, transformOriginCenter];
262
+ }
263
+ if (token.keyword === "top" || token.keyword === "bottom") {
264
+ return [
265
+ transformOriginCenter,
266
+ transformOriginKeywordOptions(token.keyword)[0].value
267
+ ];
268
+ }
269
+ return [
270
+ transformOriginKeywordOptions(token.keyword)[0].value,
271
+ transformOriginCenter
272
+ ];
273
+ }
274
+ const first = parseTransformOriginToken(parts[0], value);
275
+ const second = parseTransformOriginToken(parts[1], value);
276
+ if (first.type === "length-percentage" && second.type === "length-percentage") {
277
+ return [first.parsed, second.parsed];
278
+ }
279
+ if (first.type === "keyword" && second.type === "keyword") {
280
+ return parseTwoTransformOriginKeywords(first.keyword, second.keyword, value);
281
+ }
282
+ const keyword = first.type === "keyword" ? first : second.type === "keyword" ? second : null;
283
+ const length = first.type === "length-percentage" ? first.parsed : second.type === "length-percentage" ? second.parsed : null;
284
+ if (keyword === null || length === null) {
285
+ throw new Error("Expected a keyword and a length-percentage value");
286
+ }
287
+ const keywordIsFirst = first.type === "keyword";
288
+ if (keyword.keyword === "left" || keyword.keyword === "right") {
289
+ if (!keywordIsFirst) {
290
+ throw new TypeError(\`Cannot interpolate "\${value}" because horizontal transform-origin keywords must come before a length-percentage value\`);
291
+ }
292
+ return [transformOriginKeywordOptions(keyword.keyword)[0].value, length];
293
+ }
294
+ if (keyword.keyword === "top" || keyword.keyword === "bottom") {
295
+ return [length, transformOriginKeywordOptions(keyword.keyword)[0].value];
296
+ }
297
+ return keywordIsFirst ? [transformOriginCenter, length] : [length, transformOriginCenter];
298
+ };
299
+ var parseTransformOriginValue = (output, parts) => {
300
+ const [x, y] = parseTransformOriginXY(parts.slice(0, 2), output);
301
+ const z = parts[2] === undefined ? { value: 0, unit: null } : parseTransformOriginLengthPercentage({
302
+ component: parts[2],
303
+ value: output,
304
+ allowPercentage: false
305
+ });
306
+ return {
307
+ kind: "translate",
308
+ values: [x.value, y.value, z.value],
309
+ units: [x.unit, y.unit, z.unit],
310
+ dimensions: parts[2] === undefined ? 2 : 3
311
+ };
312
+ };
183
313
  var parseStringInterpolationValue = (output) => {
184
314
  if (typeof output === "number") {
185
315
  if (!Number.isFinite(output)) {
@@ -196,6 +326,9 @@ var parseStringInterpolationValue = (output) => {
196
326
  if (parts.length < 1 || parts.length > 3 || parts[0] === "") {
197
327
  throw new TypeError(\`String outputRange values must contain 1 to 3 components, but got "\${output}"\`);
198
328
  }
329
+ if (parts.some((part) => transformOriginKeywords.has(part.toLowerCase()))) {
330
+ return parseTransformOriginValue(output, parts);
331
+ }
199
332
  const parsed = parts.map((part) => parseStringInterpolationComponent(part, output));
200
333
  const [{ kind }] = parsed;
201
334
  for (const part of parsed) {
@@ -1073,6 +1206,12 @@ var serializeScaleValue = ([x, y, z]) => {
1073
1206
  return \`\${normalizedX} \${normalizedY} \${normalizedZ}\`;
1074
1207
  };
1075
1208
  var sequenceVisualStyleSchema = {
1209
+ "style.transformOrigin": {
1210
+ type: "transform-origin",
1211
+ step: 1,
1212
+ default: "50% 50%",
1213
+ description: "Transform origin"
1214
+ },
1076
1215
  "style.translate": {
1077
1216
  type: "translate",
1078
1217
  step: 1,
@@ -1134,6 +1273,18 @@ var hiddenField = {
1134
1273
  default: false,
1135
1274
  description: "Hidden"
1136
1275
  };
1276
+ var showInTimelineField = {
1277
+ type: "hidden"
1278
+ };
1279
+ var sequenceNameField = {
1280
+ type: "hidden"
1281
+ };
1282
+ var extendSchemaWithSequenceName = (schema) => {
1283
+ return {
1284
+ name: sequenceNameField,
1285
+ ...schema
1286
+ };
1287
+ };
1137
1288
  var durationInFramesField = {
1138
1289
  type: "number",
1139
1290
  default: undefined,
@@ -1147,8 +1298,9 @@ var fromField = {
1147
1298
  step: 1,
1148
1299
  hiddenFromList: true
1149
1300
  };
1150
- var sequenceSchema = {
1301
+ var sequenceSchema = extendSchemaWithSequenceName({
1151
1302
  hidden: hiddenField,
1303
+ showInTimeline: showInTimelineField,
1152
1304
  from: fromField,
1153
1305
  durationInFrames: durationInFramesField,
1154
1306
  layout: {
@@ -1160,12 +1312,13 @@ var sequenceSchema = {
1160
1312
  none: {}
1161
1313
  }
1162
1314
  }
1163
- };
1164
- var sequenceSchemaWithoutFrom = {
1315
+ });
1316
+ var sequenceSchemaWithoutFrom = extendSchemaWithSequenceName({
1165
1317
  hidden: hiddenField,
1318
+ showInTimeline: showInTimelineField,
1166
1319
  durationInFrames: durationInFramesField,
1167
1320
  layout: sequenceSchema.layout
1168
- };
1321
+ });
1169
1322
  var sequenceSchemaDefaultLayoutNone = {
1170
1323
  ...sequenceSchema,
1171
1324
  layout: {
@@ -1495,6 +1648,32 @@ var lengthUnits = new Set([
1495
1648
  "vw"
1496
1649
  ]);
1497
1650
  var cssNumberRegex = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))([a-zA-Z%]+)?$/;
1651
+ var transformOriginKeywords = new Set([
1652
+ "left",
1653
+ "center",
1654
+ "right",
1655
+ "top",
1656
+ "bottom"
1657
+ ]);
1658
+ var transformOriginKeywordOptions = (keyword) => {
1659
+ if (keyword === "left") {
1660
+ return [{ axis: "x", value: { value: 0, unit: "%" } }];
1661
+ }
1662
+ if (keyword === "right") {
1663
+ return [{ axis: "x", value: { value: 100, unit: "%" } }];
1664
+ }
1665
+ if (keyword === "top") {
1666
+ return [{ axis: "y", value: { value: 0, unit: "%" } }];
1667
+ }
1668
+ if (keyword === "bottom") {
1669
+ return [{ axis: "y", value: { value: 100, unit: "%" } }];
1670
+ }
1671
+ return [
1672
+ { axis: "x", value: { value: 50, unit: "%" } },
1673
+ { axis: "y", value: { value: 50, unit: "%" } }
1674
+ ];
1675
+ };
1676
+ var transformOriginCenter = { value: 50, unit: "%" };
1498
1677
  var stringifyNumber = (value) => {
1499
1678
  return String(normalizeNumber(value));
1500
1679
  };
@@ -1519,6 +1698,110 @@ var parseStringInterpolationComponent = (component, value) => {
1519
1698
  }
1520
1699
  throw new TypeError(\`Cannot interpolate "\${value}" because "\${unit}" is not a supported translate or rotate unit\`);
1521
1700
  };
1701
+ var parseTransformOriginLengthPercentage = ({
1702
+ component,
1703
+ value,
1704
+ allowPercentage
1705
+ }) => {
1706
+ const match = cssNumberRegex.exec(component);
1707
+ if (match === null) {
1708
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not a supported transform-origin \${allowPercentage ? "length-percentage" : "z length"}\`);
1709
+ }
1710
+ const unit = match[2] ?? null;
1711
+ const numberValue = Number(match[1]);
1712
+ if (!Number.isFinite(numberValue)) {
1713
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not finite\`);
1714
+ }
1715
+ if (unit === null || !lengthUnits.has(unit) || !allowPercentage && unit === "%") {
1716
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not a supported transform-origin \${allowPercentage ? "length-percentage" : "z length"}\`);
1717
+ }
1718
+ return { value: numberValue, unit };
1719
+ };
1720
+ var parseTransformOriginToken = (component, value) => {
1721
+ const lower = component.toLowerCase();
1722
+ if (transformOriginKeywords.has(lower)) {
1723
+ return { type: "keyword", keyword: lower };
1724
+ }
1725
+ return {
1726
+ type: "length-percentage",
1727
+ parsed: parseTransformOriginLengthPercentage({
1728
+ component,
1729
+ value,
1730
+ allowPercentage: true
1731
+ })
1732
+ };
1733
+ };
1734
+ var parseTwoTransformOriginKeywords = (first, second, value) => {
1735
+ const candidates = [];
1736
+ for (const firstOption of transformOriginKeywordOptions(first)) {
1737
+ for (const secondOption of transformOriginKeywordOptions(second)) {
1738
+ if (firstOption.axis === secondOption.axis) {
1739
+ continue;
1740
+ }
1741
+ candidates.push(firstOption.axis === "x" ? [firstOption.value, secondOption.value] : [secondOption.value, firstOption.value]);
1742
+ }
1743
+ }
1744
+ if (candidates.length === 0) {
1745
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${first} \${second}" is not a valid transform-origin keyword pair\`);
1746
+ }
1747
+ return candidates[0];
1748
+ };
1749
+ var parseTransformOriginXY = (parts, value) => {
1750
+ if (parts.length === 1) {
1751
+ const token = parseTransformOriginToken(parts[0], value);
1752
+ if (token.type === "length-percentage") {
1753
+ return [token.parsed, transformOriginCenter];
1754
+ }
1755
+ if (token.keyword === "top" || token.keyword === "bottom") {
1756
+ return [
1757
+ transformOriginCenter,
1758
+ transformOriginKeywordOptions(token.keyword)[0].value
1759
+ ];
1760
+ }
1761
+ return [
1762
+ transformOriginKeywordOptions(token.keyword)[0].value,
1763
+ transformOriginCenter
1764
+ ];
1765
+ }
1766
+ const first = parseTransformOriginToken(parts[0], value);
1767
+ const second = parseTransformOriginToken(parts[1], value);
1768
+ if (first.type === "length-percentage" && second.type === "length-percentage") {
1769
+ return [first.parsed, second.parsed];
1770
+ }
1771
+ if (first.type === "keyword" && second.type === "keyword") {
1772
+ return parseTwoTransformOriginKeywords(first.keyword, second.keyword, value);
1773
+ }
1774
+ const keyword = first.type === "keyword" ? first : second.type === "keyword" ? second : null;
1775
+ const length = first.type === "length-percentage" ? first.parsed : second.type === "length-percentage" ? second.parsed : null;
1776
+ if (keyword === null || length === null) {
1777
+ throw new Error("Expected a keyword and a length-percentage value");
1778
+ }
1779
+ const keywordIsFirst = first.type === "keyword";
1780
+ if (keyword.keyword === "left" || keyword.keyword === "right") {
1781
+ if (!keywordIsFirst) {
1782
+ throw new TypeError(\`Cannot interpolate "\${value}" because horizontal transform-origin keywords must come before a length-percentage value\`);
1783
+ }
1784
+ return [transformOriginKeywordOptions(keyword.keyword)[0].value, length];
1785
+ }
1786
+ if (keyword.keyword === "top" || keyword.keyword === "bottom") {
1787
+ return [length, transformOriginKeywordOptions(keyword.keyword)[0].value];
1788
+ }
1789
+ return keywordIsFirst ? [transformOriginCenter, length] : [length, transformOriginCenter];
1790
+ };
1791
+ var parseTransformOriginValue = (output, parts) => {
1792
+ const [x, y] = parseTransformOriginXY(parts.slice(0, 2), output);
1793
+ const z = parts[2] === undefined ? { value: 0, unit: null } : parseTransformOriginLengthPercentage({
1794
+ component: parts[2],
1795
+ value: output,
1796
+ allowPercentage: false
1797
+ });
1798
+ return {
1799
+ kind: "translate",
1800
+ values: [x.value, y.value, z.value],
1801
+ units: [x.unit, y.unit, z.unit],
1802
+ dimensions: parts[2] === undefined ? 2 : 3
1803
+ };
1804
+ };
1522
1805
  var parseStringInterpolationValue = (output) => {
1523
1806
  if (typeof output === "number") {
1524
1807
  if (!Number.isFinite(output)) {
@@ -1535,6 +1818,9 @@ var parseStringInterpolationValue = (output) => {
1535
1818
  if (parts.length < 1 || parts.length > 3 || parts[0] === "") {
1536
1819
  throw new TypeError(\`String outputRange values must contain 1 to 3 components, but got "\${output}"\`);
1537
1820
  }
1821
+ if (parts.some((part) => transformOriginKeywords.has(part.toLowerCase()))) {
1822
+ return parseTransformOriginValue(output, parts);
1823
+ }
1538
1824
  const parsed = parts.map((part) => parseStringInterpolationComponent(part, output));
1539
1825
  const [{ kind }] = parsed;
1540
1826
  for (const part of parsed) {
@@ -2412,6 +2698,12 @@ var serializeScaleValue = ([x, y, z]) => {
2412
2698
  return \`\${normalizedX} \${normalizedY} \${normalizedZ}\`;
2413
2699
  };
2414
2700
  var sequenceVisualStyleSchema = {
2701
+ "style.transformOrigin": {
2702
+ type: "transform-origin",
2703
+ step: 1,
2704
+ default: "50% 50%",
2705
+ description: "Transform origin"
2706
+ },
2415
2707
  "style.translate": {
2416
2708
  type: "translate",
2417
2709
  step: 1,
@@ -2473,6 +2765,18 @@ var hiddenField = {
2473
2765
  default: false,
2474
2766
  description: "Hidden"
2475
2767
  };
2768
+ var showInTimelineField = {
2769
+ type: "hidden"
2770
+ };
2771
+ var sequenceNameField = {
2772
+ type: "hidden"
2773
+ };
2774
+ var extendSchemaWithSequenceName = (schema) => {
2775
+ return {
2776
+ name: sequenceNameField,
2777
+ ...schema
2778
+ };
2779
+ };
2476
2780
  var durationInFramesField = {
2477
2781
  type: "number",
2478
2782
  default: undefined,
@@ -2486,8 +2790,9 @@ var fromField = {
2486
2790
  step: 1,
2487
2791
  hiddenFromList: true
2488
2792
  };
2489
- var sequenceSchema = {
2793
+ var sequenceSchema = extendSchemaWithSequenceName({
2490
2794
  hidden: hiddenField,
2795
+ showInTimeline: showInTimelineField,
2491
2796
  from: fromField,
2492
2797
  durationInFrames: durationInFramesField,
2493
2798
  layout: {
@@ -2499,12 +2804,13 @@ var sequenceSchema = {
2499
2804
  none: {}
2500
2805
  }
2501
2806
  }
2502
- };
2503
- var sequenceSchemaWithoutFrom = {
2807
+ });
2808
+ var sequenceSchemaWithoutFrom = extendSchemaWithSequenceName({
2504
2809
  hidden: hiddenField,
2810
+ showInTimeline: showInTimelineField,
2505
2811
  durationInFrames: durationInFramesField,
2506
2812
  layout: sequenceSchema.layout
2507
- };
2813
+ });
2508
2814
  var sequenceSchemaDefaultLayoutNone = {
2509
2815
  ...sequenceSchema,
2510
2816
  layout: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/vercel",
3
- "version": "4.0.474",
3
+ "version": "4.0.476",
4
4
  "description": "Render Remotion videos on Vercel Sandbox",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -23,8 +23,8 @@
23
23
  "url": "https://github.com/remotion-dev/remotion/issues"
24
24
  },
25
25
  "dependencies": {
26
- "@remotion/renderer": "4.0.474",
27
- "remotion": "4.0.474"
26
+ "@remotion/renderer": "4.0.476",
27
+ "remotion": "4.0.476"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "@vercel/sandbox": ">=1.0.0"
@@ -38,7 +38,7 @@
38
38
  "./package.json": "./package.json"
39
39
  },
40
40
  "devDependencies": {
41
- "@remotion/eslint-config-internal": "4.0.474",
41
+ "@remotion/eslint-config-internal": "4.0.476",
42
42
  "@vercel/blob": "2.3.0",
43
43
  "@vercel/sandbox": "1.6.0",
44
44
  "eslint": "9.19.0",