@remotion/vercel 4.0.474 → 4.0.475

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 +278 -0
  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,
@@ -1495,6 +1634,32 @@ var lengthUnits = new Set([
1495
1634
  "vw"
1496
1635
  ]);
1497
1636
  var cssNumberRegex = /^([+-]?(?:\\d+\\.?\\d*|\\.\\d+))([a-zA-Z%]+)?$/;
1637
+ var transformOriginKeywords = new Set([
1638
+ "left",
1639
+ "center",
1640
+ "right",
1641
+ "top",
1642
+ "bottom"
1643
+ ]);
1644
+ var transformOriginKeywordOptions = (keyword) => {
1645
+ if (keyword === "left") {
1646
+ return [{ axis: "x", value: { value: 0, unit: "%" } }];
1647
+ }
1648
+ if (keyword === "right") {
1649
+ return [{ axis: "x", value: { value: 100, unit: "%" } }];
1650
+ }
1651
+ if (keyword === "top") {
1652
+ return [{ axis: "y", value: { value: 0, unit: "%" } }];
1653
+ }
1654
+ if (keyword === "bottom") {
1655
+ return [{ axis: "y", value: { value: 100, unit: "%" } }];
1656
+ }
1657
+ return [
1658
+ { axis: "x", value: { value: 50, unit: "%" } },
1659
+ { axis: "y", value: { value: 50, unit: "%" } }
1660
+ ];
1661
+ };
1662
+ var transformOriginCenter = { value: 50, unit: "%" };
1498
1663
  var stringifyNumber = (value) => {
1499
1664
  return String(normalizeNumber(value));
1500
1665
  };
@@ -1519,6 +1684,110 @@ var parseStringInterpolationComponent = (component, value) => {
1519
1684
  }
1520
1685
  throw new TypeError(\`Cannot interpolate "\${value}" because "\${unit}" is not a supported translate or rotate unit\`);
1521
1686
  };
1687
+ var parseTransformOriginLengthPercentage = ({
1688
+ component,
1689
+ value,
1690
+ allowPercentage
1691
+ }) => {
1692
+ const match = cssNumberRegex.exec(component);
1693
+ if (match === null) {
1694
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not a supported transform-origin \${allowPercentage ? "length-percentage" : "z length"}\`);
1695
+ }
1696
+ const unit = match[2] ?? null;
1697
+ const numberValue = Number(match[1]);
1698
+ if (!Number.isFinite(numberValue)) {
1699
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not finite\`);
1700
+ }
1701
+ if (unit === null || !lengthUnits.has(unit) || !allowPercentage && unit === "%") {
1702
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${component}" is not a supported transform-origin \${allowPercentage ? "length-percentage" : "z length"}\`);
1703
+ }
1704
+ return { value: numberValue, unit };
1705
+ };
1706
+ var parseTransformOriginToken = (component, value) => {
1707
+ const lower = component.toLowerCase();
1708
+ if (transformOriginKeywords.has(lower)) {
1709
+ return { type: "keyword", keyword: lower };
1710
+ }
1711
+ return {
1712
+ type: "length-percentage",
1713
+ parsed: parseTransformOriginLengthPercentage({
1714
+ component,
1715
+ value,
1716
+ allowPercentage: true
1717
+ })
1718
+ };
1719
+ };
1720
+ var parseTwoTransformOriginKeywords = (first, second, value) => {
1721
+ const candidates = [];
1722
+ for (const firstOption of transformOriginKeywordOptions(first)) {
1723
+ for (const secondOption of transformOriginKeywordOptions(second)) {
1724
+ if (firstOption.axis === secondOption.axis) {
1725
+ continue;
1726
+ }
1727
+ candidates.push(firstOption.axis === "x" ? [firstOption.value, secondOption.value] : [secondOption.value, firstOption.value]);
1728
+ }
1729
+ }
1730
+ if (candidates.length === 0) {
1731
+ throw new TypeError(\`Cannot interpolate "\${value}" because "\${first} \${second}" is not a valid transform-origin keyword pair\`);
1732
+ }
1733
+ return candidates[0];
1734
+ };
1735
+ var parseTransformOriginXY = (parts, value) => {
1736
+ if (parts.length === 1) {
1737
+ const token = parseTransformOriginToken(parts[0], value);
1738
+ if (token.type === "length-percentage") {
1739
+ return [token.parsed, transformOriginCenter];
1740
+ }
1741
+ if (token.keyword === "top" || token.keyword === "bottom") {
1742
+ return [
1743
+ transformOriginCenter,
1744
+ transformOriginKeywordOptions(token.keyword)[0].value
1745
+ ];
1746
+ }
1747
+ return [
1748
+ transformOriginKeywordOptions(token.keyword)[0].value,
1749
+ transformOriginCenter
1750
+ ];
1751
+ }
1752
+ const first = parseTransformOriginToken(parts[0], value);
1753
+ const second = parseTransformOriginToken(parts[1], value);
1754
+ if (first.type === "length-percentage" && second.type === "length-percentage") {
1755
+ return [first.parsed, second.parsed];
1756
+ }
1757
+ if (first.type === "keyword" && second.type === "keyword") {
1758
+ return parseTwoTransformOriginKeywords(first.keyword, second.keyword, value);
1759
+ }
1760
+ const keyword = first.type === "keyword" ? first : second.type === "keyword" ? second : null;
1761
+ const length = first.type === "length-percentage" ? first.parsed : second.type === "length-percentage" ? second.parsed : null;
1762
+ if (keyword === null || length === null) {
1763
+ throw new Error("Expected a keyword and a length-percentage value");
1764
+ }
1765
+ const keywordIsFirst = first.type === "keyword";
1766
+ if (keyword.keyword === "left" || keyword.keyword === "right") {
1767
+ if (!keywordIsFirst) {
1768
+ throw new TypeError(\`Cannot interpolate "\${value}" because horizontal transform-origin keywords must come before a length-percentage value\`);
1769
+ }
1770
+ return [transformOriginKeywordOptions(keyword.keyword)[0].value, length];
1771
+ }
1772
+ if (keyword.keyword === "top" || keyword.keyword === "bottom") {
1773
+ return [length, transformOriginKeywordOptions(keyword.keyword)[0].value];
1774
+ }
1775
+ return keywordIsFirst ? [transformOriginCenter, length] : [length, transformOriginCenter];
1776
+ };
1777
+ var parseTransformOriginValue = (output, parts) => {
1778
+ const [x, y] = parseTransformOriginXY(parts.slice(0, 2), output);
1779
+ const z = parts[2] === undefined ? { value: 0, unit: null } : parseTransformOriginLengthPercentage({
1780
+ component: parts[2],
1781
+ value: output,
1782
+ allowPercentage: false
1783
+ });
1784
+ return {
1785
+ kind: "translate",
1786
+ values: [x.value, y.value, z.value],
1787
+ units: [x.unit, y.unit, z.unit],
1788
+ dimensions: parts[2] === undefined ? 2 : 3
1789
+ };
1790
+ };
1522
1791
  var parseStringInterpolationValue = (output) => {
1523
1792
  if (typeof output === "number") {
1524
1793
  if (!Number.isFinite(output)) {
@@ -1535,6 +1804,9 @@ var parseStringInterpolationValue = (output) => {
1535
1804
  if (parts.length < 1 || parts.length > 3 || parts[0] === "") {
1536
1805
  throw new TypeError(\`String outputRange values must contain 1 to 3 components, but got "\${output}"\`);
1537
1806
  }
1807
+ if (parts.some((part) => transformOriginKeywords.has(part.toLowerCase()))) {
1808
+ return parseTransformOriginValue(output, parts);
1809
+ }
1538
1810
  const parsed = parts.map((part) => parseStringInterpolationComponent(part, output));
1539
1811
  const [{ kind }] = parsed;
1540
1812
  for (const part of parsed) {
@@ -2412,6 +2684,12 @@ var serializeScaleValue = ([x, y, z]) => {
2412
2684
  return \`\${normalizedX} \${normalizedY} \${normalizedZ}\`;
2413
2685
  };
2414
2686
  var sequenceVisualStyleSchema = {
2687
+ "style.transformOrigin": {
2688
+ type: "transform-origin",
2689
+ step: 1,
2690
+ default: "50% 50%",
2691
+ description: "Transform origin"
2692
+ },
2415
2693
  "style.translate": {
2416
2694
  type: "translate",
2417
2695
  step: 1,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remotion/vercel",
3
- "version": "4.0.474",
3
+ "version": "4.0.475",
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.475",
27
+ "remotion": "4.0.475"
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.475",
42
42
  "@vercel/blob": "2.3.0",
43
43
  "@vercel/sandbox": "1.6.0",
44
44
  "eslint": "9.19.0",