@remotion/studio-shared 4.0.508 → 4.0.510

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.
@@ -4,6 +4,7 @@ import type { ComponentProp, ElementDragData } from '@remotion/studio-protocol';
4
4
  import type { _InternalTypes, CannotUpdateSequenceReason, CanUpdateEffectPropsResponse, CanUpdateSequencePropsResponseFalse, CanUpdateSequencePropsResponseTrue, CanUpdateSequencePropStatus, ExtrapolateType, InteractivitySchema, InterpolateOutputOption, JsxComponentIdentity, SequenceNodePath, SequencePropsSubscriptionKey, VideoConfigValues } from 'remotion';
5
5
  import type { RecastCodemod, VisualControlChange } from './codemods';
6
6
  import type { EffectClipboardParam, EffectClipboardPasteType, EffectClipboardSnapshot } from './effect-clipboard-data';
7
+ import type { GitClientId } from './git-client';
7
8
  import type { PackageManager } from './package-manager';
8
9
  import type { ProjectInfo } from './project-info';
9
10
  import type { CompletedClientRender, RequiredChromiumOptions } from './render-job';
@@ -38,6 +39,12 @@ export type OpenInTerminalRequest = {
38
39
  export type OpenInTerminalResponse = {
39
40
  success: boolean;
40
41
  };
42
+ export type OpenInGitClientRequest = {
43
+ gitClientId: GitClientId;
44
+ };
45
+ export type OpenInGitClientResponse = {
46
+ success: boolean;
47
+ };
41
48
  export type FindInFileRequest = {
42
49
  fileName: string;
43
50
  lineNumber: number;
@@ -270,6 +277,9 @@ export type GoogleFontSourceEdit = {
270
277
  export type SaveSequencePropSourceEdit = {
271
278
  type: 'google-font';
272
279
  font: GoogleFontSourceEdit;
280
+ } | {
281
+ type: 'clipboard-param';
282
+ param: EffectClipboardParam;
273
283
  };
274
284
  export type SaveSequencePropEdit = {
275
285
  fileName: string;
@@ -610,6 +620,7 @@ export type DuplicateJsxNodeResponse = {
610
620
  export type SplitJsxSequenceRequest = {
611
621
  fileName: string;
612
622
  nodePath: SequenceNodePath;
623
+ sequenceKeys: string[];
613
624
  splitFrame: number;
614
625
  };
615
626
  export type SplitJsxSequenceResponse = {
@@ -669,6 +680,7 @@ export type InsertJsxElementRequest = {
669
680
  };
670
681
  export type InsertJsxElementResponse = {
671
682
  success: true;
683
+ insertedNodePath: Pick<SequencePropsSubscriptionKey, 'absolutePath' | 'nodePath'> | null;
672
684
  nodePathMutation: SequenceNodePathMutation;
673
685
  } | {
674
686
  success: false;
@@ -830,6 +842,10 @@ export type GetDefaultCodingAgentInfoResponse = {
830
842
  id: TerminalId;
831
843
  name: string;
832
844
  }[];
845
+ installedGitClients: {
846
+ id: GitClientId;
847
+ name: string;
848
+ }[];
833
849
  };
834
850
  export type PackageInstallSpec = {
835
851
  readonly name: string;
@@ -875,6 +891,7 @@ export type ApiRoutes = {
875
891
  '/api/find-in-file': ReqAndRes<FindInFileRequest, FindInFileResponse>;
876
892
  '/api/open-in-file-explorer': ReqAndRes<OpenInFileExplorerRequest, void>;
877
893
  '/api/open-in-terminal': ReqAndRes<OpenInTerminalRequest, OpenInTerminalResponse>;
894
+ '/api/open-in-git-client': ReqAndRes<OpenInGitClientRequest, OpenInGitClientResponse>;
878
895
  '/api/register-client-render': ReqAndRes<CompletedClientRender, void>;
879
896
  '/api/unregister-client-render': ReqAndRes<{
880
897
  id: string;
@@ -0,0 +1,19 @@
1
+ export declare const CANVAS_CAPTURE_METADATA_TAG = "REMOTION_CAPTURE_DATA";
2
+ export type CanvasCaptureMouseMovement = {
3
+ readonly timeInSeconds: number;
4
+ readonly canvasX: number | null;
5
+ readonly canvasY: number | null;
6
+ readonly cursor: string;
7
+ };
8
+ export type CanvasCapturePointerClick = {
9
+ readonly timeInSeconds: number;
10
+ readonly type: 'pointer-down' | 'pointer-up';
11
+ };
12
+ export type CanvasCaptureData = {
13
+ readonly captureMetadata: {
14
+ readonly density: number;
15
+ };
16
+ readonly mouseMovements: CanvasCaptureMouseMovement[];
17
+ readonly pointerClicks: CanvasCapturePointerClick[];
18
+ };
19
+ export declare const parseCanvasCaptureData: (metadata: unknown) => CanvasCaptureData | null;
@@ -0,0 +1,70 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseCanvasCaptureData = exports.CANVAS_CAPTURE_METADATA_TAG = void 0;
4
+ exports.CANVAS_CAPTURE_METADATA_TAG = 'REMOTION_CAPTURE_DATA';
5
+ const isRecord = (value) => {
6
+ return typeof value === 'object' && value !== null;
7
+ };
8
+ const isFiniteNumber = (value) => {
9
+ return typeof value === 'number' && Number.isFinite(value);
10
+ };
11
+ const parseCanvasCaptureData = (metadata) => {
12
+ if (!isRecord(metadata) || !isRecord(metadata.raw)) {
13
+ return null;
14
+ }
15
+ const rawCaptureData = metadata.raw[exports.CANVAS_CAPTURE_METADATA_TAG];
16
+ if (typeof rawCaptureData !== 'string') {
17
+ return null;
18
+ }
19
+ let parsed;
20
+ try {
21
+ parsed = JSON.parse(rawCaptureData);
22
+ }
23
+ catch (_a) {
24
+ return null;
25
+ }
26
+ if (!isRecord(parsed) ||
27
+ !isRecord(parsed.captureMetadata) ||
28
+ !isFiniteNumber(parsed.captureMetadata.density) ||
29
+ parsed.captureMetadata.density <= 0 ||
30
+ !Array.isArray(parsed.mouseMovements) ||
31
+ !Array.isArray(parsed.pointerClicks)) {
32
+ return null;
33
+ }
34
+ const mouseMovements = [];
35
+ for (const movement of parsed.mouseMovements) {
36
+ if (!isRecord(movement) ||
37
+ !isFiniteNumber(movement.timeInSeconds) ||
38
+ movement.timeInSeconds < 0 ||
39
+ (movement.canvasX !== null && !isFiniteNumber(movement.canvasX)) ||
40
+ (movement.canvasY !== null && !isFiniteNumber(movement.canvasY)) ||
41
+ typeof movement.cursor !== 'string') {
42
+ return null;
43
+ }
44
+ mouseMovements.push({
45
+ timeInSeconds: movement.timeInSeconds,
46
+ canvasX: movement.canvasX,
47
+ canvasY: movement.canvasY,
48
+ cursor: movement.cursor,
49
+ });
50
+ }
51
+ const pointerClicks = [];
52
+ for (const click of parsed.pointerClicks) {
53
+ if (!isRecord(click) ||
54
+ !isFiniteNumber(click.timeInSeconds) ||
55
+ click.timeInSeconds < 0 ||
56
+ (click.type !== 'pointer-down' && click.type !== 'pointer-up')) {
57
+ return null;
58
+ }
59
+ pointerClicks.push({
60
+ timeInSeconds: click.timeInSeconds,
61
+ type: click.type,
62
+ });
63
+ }
64
+ return {
65
+ captureMetadata: { density: parsed.captureMetadata.density },
66
+ mouseMovements: mouseMovements.sort((a, b) => a.timeInSeconds - b.timeInSeconds),
67
+ pointerClicks: pointerClicks.sort((a, b) => a.timeInSeconds - b.timeInSeconds),
68
+ };
69
+ };
70
+ exports.parseCanvasCaptureData = parseCanvasCaptureData;
@@ -1,3 +1,4 @@
1
+ import type { CanvasCaptureData } from './canvas-capture';
1
2
  import type { EnumPath } from './stringify-default-props';
2
3
  export type VisualControlChange = {
3
4
  id: string;
@@ -20,6 +21,13 @@ export type RecastCodemod = {
20
21
  newWidth: number;
21
22
  newFps: number;
22
23
  newDurationInFrames: number;
24
+ canvasCapture: {
25
+ readonly videoFileName: string;
26
+ readonly videoHeight: number;
27
+ readonly videoWidth: number;
28
+ readonly keyframeFps: number;
29
+ readonly data: CanvasCaptureData;
30
+ } | null;
23
31
  } | {
24
32
  type: 'duplicate-composition';
25
33
  idToDuplicate: string;
@@ -45,6 +45,7 @@ export declare const configMethodLifecycles: {
45
45
  readonly setEnforceAudioTrack: "runtime";
46
46
  readonly setEntryPoint: "restart";
47
47
  readonly setEveryNthFrame: "runtime";
48
+ readonly setExperimentalKeepAudioContextAlive: "reload";
48
49
  readonly setExperimentalRspackEnabled: "restart";
49
50
  readonly setForSeamlessAacConcatenation: "runtime";
50
51
  readonly setForceNewStudioEnabled: "restart";
@@ -48,6 +48,7 @@ exports.configMethodLifecycles = {
48
48
  setEnforceAudioTrack: 'runtime',
49
49
  setEntryPoint: 'restart',
50
50
  setEveryNthFrame: 'runtime',
51
+ setExperimentalKeepAudioContextAlive: 'reload',
51
52
  setExperimentalRspackEnabled: 'restart',
52
53
  setForSeamlessAacConcatenation: 'runtime',
53
54
  setForceNewStudioEnabled: 'restart',
@@ -65,6 +65,17 @@ exports.EFFECT_CATALOG = [
65
65
  config: {},
66
66
  },
67
67
  },
68
+ {
69
+ id: 'effects-color-correction',
70
+ category: 'Color',
71
+ label: 'colorCorrection()',
72
+ description: 'Combined primary color adjustments',
73
+ effect: {
74
+ name: 'colorCorrection',
75
+ importPath: '@remotion/effects/color-correction',
76
+ config: {},
77
+ },
78
+ },
68
79
  {
69
80
  id: 'effects-color-key',
70
81
  category: 'Color',
@@ -67,6 +67,8 @@ export type EffectPropClipboardDataParseResult = {
67
67
  } | {
68
68
  readonly status: 'invalid';
69
69
  };
70
+ export declare const normalizeEffectClipboardParam: (param: EffectClipboardParam) => EffectClipboardParam;
71
+ export declare const isEffectClipboardParam: (value: unknown) => value is EffectClipboardParam;
70
72
  export declare const parseEffectClipboardDataResult: (value: string) => EffectClipboardDataParseResult;
71
73
  export declare const parseEffectClipboardData: (value: string) => EffectClipboardData | null;
72
74
  export declare const parseEffectPropClipboardDataResult: (value: string) => EffectPropClipboardDataParseResult;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseEffectPropClipboardData = exports.parseEffectPropClipboardDataResult = exports.parseEffectClipboardData = exports.parseEffectClipboardDataResult = void 0;
3
+ exports.parseEffectPropClipboardData = exports.parseEffectPropClipboardDataResult = exports.parseEffectClipboardData = exports.parseEffectClipboardDataResult = exports.isEffectClipboardParam = exports.normalizeEffectClipboardParam = void 0;
4
4
  const keyframe_interpolation_function_1 = require("./keyframe-interpolation-function");
5
5
  const isRecord = (value) => {
6
6
  return typeof value === 'object' && value !== null && !Array.isArray(value);
@@ -42,7 +42,7 @@ const normalizeEasing = (easing) => {
42
42
  durationRestThreshold: (_b = easing.durationRestThreshold) !== null && _b !== void 0 ? _b : null,
43
43
  };
44
44
  };
45
- const normalizeParam = (param) => {
45
+ const normalizeEffectClipboardParam = (param) => {
46
46
  if (param.type === 'static') {
47
47
  return param;
48
48
  }
@@ -51,12 +51,13 @@ const normalizeParam = (param) => {
51
51
  easing: param.easing.map(normalizeEasing),
52
52
  };
53
53
  };
54
+ exports.normalizeEffectClipboardParam = normalizeEffectClipboardParam;
54
55
  const normalizeSnapshot = (snapshot) => {
55
56
  return {
56
57
  ...snapshot,
57
58
  params: Object.fromEntries(Object.entries(snapshot.params).map(([key, param]) => [
58
59
  key,
59
- normalizeParam(param),
60
+ (0, exports.normalizeEffectClipboardParam)(param),
60
61
  ])),
61
62
  };
62
63
  };
@@ -100,6 +101,7 @@ const isEffectClipboardParam = (value) => {
100
101
  outputOptions.has(output))) &&
101
102
  (posterize === undefined || (isFiniteNumber(posterize) && posterize > 0)));
102
103
  };
104
+ exports.isEffectClipboardParam = isEffectClipboardParam;
103
105
  const isEffectClipboardSnapshotV3 = (value) => {
104
106
  if (!isRecord(value)) {
105
107
  return false;
@@ -107,7 +109,7 @@ const isEffectClipboardSnapshotV3 = (value) => {
107
109
  return (typeof value.callee === 'string' &&
108
110
  typeof value.importPath === 'string' &&
109
111
  isRecord(value.params) &&
110
- Object.values(value.params).every(isEffectClipboardParam));
112
+ Object.values(value.params).every(exports.isEffectClipboardParam));
111
113
  };
112
114
  const parseEffectClipboardDataResult = (value) => {
113
115
  try {
@@ -189,7 +191,7 @@ const parseEffectPropClipboardDataResult = (value) => {
189
191
  if (typeof parsed.key !== 'string') {
190
192
  return { status: 'invalid' };
191
193
  }
192
- if (!isEffectClipboardParam(parsed.param)) {
194
+ if (!(0, exports.isEffectClipboardParam)(parsed.param)) {
193
195
  return { status: 'invalid' };
194
196
  }
195
197
  return {
@@ -203,7 +205,7 @@ const parseEffectPropClipboardDataResult = (value) => {
203
205
  importPath: parsed.effect.importPath,
204
206
  },
205
207
  key: parsed.key,
206
- param: normalizeParam(parsed.param),
208
+ param: (0, exports.normalizeEffectClipboardParam)(parsed.param),
207
209
  },
208
210
  };
209
211
  }
@@ -37,6 +37,59 @@ var stripAnsi = (str) => {
37
37
  }
38
38
  return str.replace(ansiRegex(), "");
39
39
  };
40
+ // src/canvas-capture.ts
41
+ var CANVAS_CAPTURE_METADATA_TAG = "REMOTION_CAPTURE_DATA";
42
+ var isRecord = (value) => {
43
+ return typeof value === "object" && value !== null;
44
+ };
45
+ var isFiniteNumber = (value) => {
46
+ return typeof value === "number" && Number.isFinite(value);
47
+ };
48
+ var parseCanvasCaptureData = (metadata) => {
49
+ if (!isRecord(metadata) || !isRecord(metadata.raw)) {
50
+ return null;
51
+ }
52
+ const rawCaptureData = metadata.raw[CANVAS_CAPTURE_METADATA_TAG];
53
+ if (typeof rawCaptureData !== "string") {
54
+ return null;
55
+ }
56
+ let parsed;
57
+ try {
58
+ parsed = JSON.parse(rawCaptureData);
59
+ } catch {
60
+ return null;
61
+ }
62
+ if (!isRecord(parsed) || !isRecord(parsed.captureMetadata) || !isFiniteNumber(parsed.captureMetadata.density) || parsed.captureMetadata.density <= 0 || !Array.isArray(parsed.mouseMovements) || !Array.isArray(parsed.pointerClicks)) {
63
+ return null;
64
+ }
65
+ const mouseMovements = [];
66
+ for (const movement of parsed.mouseMovements) {
67
+ if (!isRecord(movement) || !isFiniteNumber(movement.timeInSeconds) || movement.timeInSeconds < 0 || movement.canvasX !== null && !isFiniteNumber(movement.canvasX) || movement.canvasY !== null && !isFiniteNumber(movement.canvasY) || typeof movement.cursor !== "string") {
68
+ return null;
69
+ }
70
+ mouseMovements.push({
71
+ timeInSeconds: movement.timeInSeconds,
72
+ canvasX: movement.canvasX,
73
+ canvasY: movement.canvasY,
74
+ cursor: movement.cursor
75
+ });
76
+ }
77
+ const pointerClicks = [];
78
+ for (const click of parsed.pointerClicks) {
79
+ if (!isRecord(click) || !isFiniteNumber(click.timeInSeconds) || click.timeInSeconds < 0 || click.type !== "pointer-down" && click.type !== "pointer-up") {
80
+ return null;
81
+ }
82
+ pointerClicks.push({
83
+ timeInSeconds: click.timeInSeconds,
84
+ type: click.type
85
+ });
86
+ }
87
+ return {
88
+ captureMetadata: { density: parsed.captureMetadata.density },
89
+ mouseMovements: mouseMovements.sort((a, b) => a.timeInSeconds - b.timeInSeconds),
90
+ pointerClicks: pointerClicks.sort((a, b) => a.timeInSeconds - b.timeInSeconds)
91
+ };
92
+ };
40
93
  // src/composition-drag-data.ts
41
94
  var compositionDragDataToSymbolicatedStack = (dragData) => {
42
95
  if (dragData.compositionFile === null) {
@@ -52,6 +105,11 @@ var compositionDragDataToSymbolicatedStack = (dragData) => {
52
105
  };
53
106
  // src/react-refresh-event.ts
54
107
  var REACT_REFRESH_FINISHED_EVENT = "remotion-react-refresh-finished";
108
+ // src/has-sequence-timing-traits.ts
109
+ var sequenceTimingTraits = ["from", "durationInFrames", "trimBefore"];
110
+ var hasSequenceTimingTraits = (sequenceKeys) => {
111
+ return sequenceTimingTraits.every((trait) => sequenceKeys.includes(trait));
112
+ };
55
113
  // src/config-file-change.ts
56
114
  var getConfigFileChangeMessage = (changeType) => {
57
115
  if (changeType === "restart") {
@@ -110,6 +168,7 @@ var configMethodLifecycles = {
110
168
  setEnforceAudioTrack: "runtime",
111
169
  setEntryPoint: "restart",
112
170
  setEveryNthFrame: "runtime",
171
+ setExperimentalKeepAudioContextAlive: "reload",
113
172
  setExperimentalRspackEnabled: "restart",
114
173
  setForSeamlessAacConcatenation: "runtime",
115
174
  setForceNewStudioEnabled: "restart",
@@ -465,14 +524,14 @@ var detectFileType = (data) => {
465
524
  return { type: "unknown" };
466
525
  };
467
526
  // src/easing-clipboard-data.ts
468
- var isRecord = (value) => {
527
+ var isRecord2 = (value) => {
469
528
  return typeof value === "object" && value !== null && !Array.isArray(value);
470
529
  };
471
- var isFiniteNumber = (value) => {
530
+ var isFiniteNumber2 = (value) => {
472
531
  return typeof value === "number" && Number.isFinite(value);
473
532
  };
474
533
  var isKeyframeEasing = (value) => {
475
- return isRecord(value) && (value.type === "linear" || value.type === "step1" || value.type === "bezier" && isFiniteNumber(value.x1) && isFiniteNumber(value.y1) && isFiniteNumber(value.x2) && isFiniteNumber(value.y2) || value.type === "spring" && isFiniteNumber(value.damping) && isFiniteNumber(value.mass) && isFiniteNumber(value.stiffness) && (value.allowTail === undefined || value.allowTail === null || typeof value.allowTail === "boolean") && (value.durationRestThreshold === undefined || value.durationRestThreshold === null || isFiniteNumber(value.durationRestThreshold)) && typeof value.overshootClamping === "boolean");
534
+ return isRecord2(value) && (value.type === "linear" || value.type === "step1" || value.type === "bezier" && isFiniteNumber2(value.x1) && isFiniteNumber2(value.y1) && isFiniteNumber2(value.x2) && isFiniteNumber2(value.y2) || value.type === "spring" && isFiniteNumber2(value.damping) && isFiniteNumber2(value.mass) && isFiniteNumber2(value.stiffness) && (value.allowTail === undefined || value.allowTail === null || typeof value.allowTail === "boolean") && (value.durationRestThreshold === undefined || value.durationRestThreshold === null || isFiniteNumber2(value.durationRestThreshold)) && typeof value.overshootClamping === "boolean");
476
535
  };
477
536
  var normalizeKeyframeEasing = (easing) => {
478
537
  if (easing.type !== "spring") {
@@ -487,7 +546,7 @@ var normalizeKeyframeEasing = (easing) => {
487
546
  var parseEasingClipboardDataResult = (value) => {
488
547
  try {
489
548
  const parsed = JSON.parse(value);
490
- if (!isRecord(parsed)) {
549
+ if (!isRecord2(parsed)) {
491
550
  return { status: "invalid" };
492
551
  }
493
552
  if (parsed.remotionClipboard !== "easing") {
@@ -577,6 +636,17 @@ var EFFECT_CATALOG = [
577
636
  config: {}
578
637
  }
579
638
  },
639
+ {
640
+ id: "effects-color-correction",
641
+ category: "Color",
642
+ label: "colorCorrection()",
643
+ description: "Combined primary color adjustments",
644
+ effect: {
645
+ name: "colorCorrection",
646
+ importPath: "@remotion/effects/color-correction",
647
+ config: {}
648
+ }
649
+ },
580
650
  {
581
651
  id: "effects-color-key",
582
652
  category: "Color",
@@ -1366,7 +1436,7 @@ var KEYFRAME_FIELD_TYPE_SUPPORT = {
1366
1436
  boolean: false,
1367
1437
  "remotion-captions": false,
1368
1438
  color: true,
1369
- enum: false,
1439
+ enum: true,
1370
1440
  "font-family": false,
1371
1441
  hidden: true,
1372
1442
  number: true,
@@ -1384,7 +1454,7 @@ var KEYFRAME_FIELD_TYPE_INTERPOLATION = {
1384
1454
  boolean: "unsupported",
1385
1455
  "remotion-captions": "unsupported",
1386
1456
  color: "interpolateColors",
1387
- enum: "unsupported",
1457
+ enum: "interpolate",
1388
1458
  "font-family": "unsupported",
1389
1459
  hidden: "infer",
1390
1460
  number: "infer",
@@ -1408,6 +1478,9 @@ var isInteractivitySchemaFieldKeyframable = (field) => {
1408
1478
  if (!field) {
1409
1479
  return true;
1410
1480
  }
1481
+ if (field.type === "enum") {
1482
+ return field.keyframable === true;
1483
+ }
1411
1484
  return KEYFRAME_FIELD_TYPE_SUPPORT[field.type] && field.keyframable !== false;
1412
1485
  };
1413
1486
  var findFieldInSchema = (schema, key) => {
@@ -1434,6 +1507,13 @@ var isSchemaFieldKeyframable = ({
1434
1507
  const field = schema ? findFieldInSchema(schema, key) : undefined;
1435
1508
  return isInteractivitySchemaFieldKeyframable(field);
1436
1509
  };
1510
+ var isSchemaFieldHoldOnly = ({
1511
+ schema,
1512
+ key
1513
+ }) => {
1514
+ const field = schema ? findFieldInSchema(schema, key) : undefined;
1515
+ return field?.type === "enum" && field.keyframable === true;
1516
+ };
1437
1517
  var getKeyframeInterpolationFunctionForSchemaField = ({
1438
1518
  schema,
1439
1519
  key
@@ -1462,16 +1542,16 @@ var getKeyframeInterpolationFunction = ({
1462
1542
  };
1463
1543
 
1464
1544
  // src/effect-clipboard-data.ts
1465
- var isRecord2 = (value) => {
1545
+ var isRecord3 = (value) => {
1466
1546
  return typeof value === "object" && value !== null && !Array.isArray(value);
1467
1547
  };
1468
1548
  var extrapolateTypes = new Set(["extend", "identity", "clamp", "wrap"]);
1469
1549
  var outputOptions = new Set(["linear", "perceptual-scale"]);
1470
- var isFiniteNumber2 = (value) => {
1550
+ var isFiniteNumber3 = (value) => {
1471
1551
  return typeof value === "number" && Number.isFinite(value);
1472
1552
  };
1473
1553
  var isEasing = (value) => {
1474
- return isRecord2(value) && (value.type === "linear" || value.type === "step1" || value.type === "bezier" && isFiniteNumber2(value.x1) && isFiniteNumber2(value.y1) && isFiniteNumber2(value.x2) && isFiniteNumber2(value.y2) || value.type === "spring" && isFiniteNumber2(value.damping) && isFiniteNumber2(value.mass) && isFiniteNumber2(value.stiffness) && (value.allowTail === undefined || value.allowTail === null || typeof value.allowTail === "boolean") && (value.durationRestThreshold === undefined || value.durationRestThreshold === null || isFiniteNumber2(value.durationRestThreshold)) && typeof value.overshootClamping === "boolean");
1554
+ return isRecord3(value) && (value.type === "linear" || value.type === "step1" || value.type === "bezier" && isFiniteNumber3(value.x1) && isFiniteNumber3(value.y1) && isFiniteNumber3(value.x2) && isFiniteNumber3(value.y2) || value.type === "spring" && isFiniteNumber3(value.damping) && isFiniteNumber3(value.mass) && isFiniteNumber3(value.stiffness) && (value.allowTail === undefined || value.allowTail === null || typeof value.allowTail === "boolean") && (value.durationRestThreshold === undefined || value.durationRestThreshold === null || isFiniteNumber3(value.durationRestThreshold)) && typeof value.overshootClamping === "boolean");
1475
1555
  };
1476
1556
  var normalizeEasing = (easing) => {
1477
1557
  if (easing.type !== "spring") {
@@ -1483,7 +1563,7 @@ var normalizeEasing = (easing) => {
1483
1563
  durationRestThreshold: easing.durationRestThreshold ?? null
1484
1564
  };
1485
1565
  };
1486
- var normalizeParam = (param) => {
1566
+ var normalizeEffectClipboardParam = (param) => {
1487
1567
  if (param.type === "static") {
1488
1568
  return param;
1489
1569
  }
@@ -1497,18 +1577,18 @@ var normalizeSnapshot = (snapshot) => {
1497
1577
  ...snapshot,
1498
1578
  params: Object.fromEntries(Object.entries(snapshot.params).map(([key, param]) => [
1499
1579
  key,
1500
- normalizeParam(param)
1580
+ normalizeEffectClipboardParam(param)
1501
1581
  ]))
1502
1582
  };
1503
1583
  };
1504
1584
  var isKeyframe = (value) => {
1505
- return isRecord2(value) && isFiniteNumber2(value.frame) && "value" in value;
1585
+ return isRecord3(value) && isFiniteNumber3(value.frame) && "value" in value;
1506
1586
  };
1507
1587
  var isClamping = (value) => {
1508
- return isRecord2(value) && typeof value.left === "string" && extrapolateTypes.has(value.left) && typeof value.right === "string" && extrapolateTypes.has(value.right);
1588
+ return isRecord3(value) && typeof value.left === "string" && extrapolateTypes.has(value.left) && typeof value.right === "string" && extrapolateTypes.has(value.right);
1509
1589
  };
1510
1590
  var isEffectClipboardParam = (value) => {
1511
- if (!isRecord2(value)) {
1591
+ if (!isRecord3(value)) {
1512
1592
  return false;
1513
1593
  }
1514
1594
  if (value.type === "static") {
@@ -1520,18 +1600,18 @@ var isEffectClipboardParam = (value) => {
1520
1600
  const { posterize } = value;
1521
1601
  const { output } = value;
1522
1602
  const easingLength = Array.isArray(value.keyframes) && value.keyframes.length > 0 ? value.keyframes.length - 1 : null;
1523
- return typeof value.interpolationFunction === "string" && isKeyframeInterpolationFunction(value.interpolationFunction) && Array.isArray(value.keyframes) && value.keyframes.length > 0 && value.keyframes.every(isKeyframe) && Array.isArray(value.easing) && value.easing.length === easingLength && value.easing.every(isEasing) && isClamping(value.clamping) && (output === undefined || value.interpolationFunction === "interpolate" && typeof output === "string" && outputOptions.has(output)) && (posterize === undefined || isFiniteNumber2(posterize) && posterize > 0);
1603
+ return typeof value.interpolationFunction === "string" && isKeyframeInterpolationFunction(value.interpolationFunction) && Array.isArray(value.keyframes) && value.keyframes.length > 0 && value.keyframes.every(isKeyframe) && Array.isArray(value.easing) && value.easing.length === easingLength && value.easing.every(isEasing) && isClamping(value.clamping) && (output === undefined || value.interpolationFunction === "interpolate" && typeof output === "string" && outputOptions.has(output)) && (posterize === undefined || isFiniteNumber3(posterize) && posterize > 0);
1524
1604
  };
1525
1605
  var isEffectClipboardSnapshotV3 = (value) => {
1526
- if (!isRecord2(value)) {
1606
+ if (!isRecord3(value)) {
1527
1607
  return false;
1528
1608
  }
1529
- return typeof value.callee === "string" && typeof value.importPath === "string" && isRecord2(value.params) && Object.values(value.params).every(isEffectClipboardParam);
1609
+ return typeof value.callee === "string" && typeof value.importPath === "string" && isRecord3(value.params) && Object.values(value.params).every(isEffectClipboardParam);
1530
1610
  };
1531
1611
  var parseEffectClipboardDataResult = (value) => {
1532
1612
  try {
1533
1613
  const parsed = JSON.parse(value);
1534
- if (!isRecord2(parsed)) {
1614
+ if (!isRecord3(parsed)) {
1535
1615
  return { status: "invalid" };
1536
1616
  }
1537
1617
  if (parsed.remotionClipboard !== "effects") {
@@ -1579,7 +1659,7 @@ var parseEffectClipboardData = (value) => {
1579
1659
  var parseEffectPropClipboardDataResult = (value) => {
1580
1660
  try {
1581
1661
  const parsed = JSON.parse(value);
1582
- if (!isRecord2(parsed)) {
1662
+ if (!isRecord3(parsed)) {
1583
1663
  return { status: "invalid" };
1584
1664
  }
1585
1665
  if (parsed.remotionClipboard !== "effect-prop") {
@@ -1594,7 +1674,7 @@ var parseEffectPropClipboardDataResult = (value) => {
1594
1674
  if (parsed.type !== "effect-prop") {
1595
1675
  return { status: "invalid" };
1596
1676
  }
1597
- if (!isRecord2(parsed.effect)) {
1677
+ if (!isRecord3(parsed.effect)) {
1598
1678
  return { status: "invalid" };
1599
1679
  }
1600
1680
  if (typeof parsed.effect.callee !== "string" || typeof parsed.effect.importPath !== "string") {
@@ -1617,7 +1697,7 @@ var parseEffectPropClipboardDataResult = (value) => {
1617
1697
  importPath: parsed.effect.importPath
1618
1698
  },
1619
1699
  key: parsed.key,
1620
- param: normalizeParam(parsed.param)
1700
+ param: normalizeEffectClipboardParam(parsed.param)
1621
1701
  }
1622
1702
  };
1623
1703
  } catch {
@@ -1631,6 +1711,131 @@ var parseEffectPropClipboardData = (value) => {
1631
1711
  }
1632
1712
  return result.data;
1633
1713
  };
1714
+ // src/keyframe-clipboard-data.ts
1715
+ var KEYFRAME_CLIPBOARD_FIELD_TYPE_SUPPORT = {
1716
+ array: false,
1717
+ asset: false,
1718
+ boolean: false,
1719
+ "remotion-captions": false,
1720
+ color: true,
1721
+ enum: false,
1722
+ "font-family": false,
1723
+ hidden: false,
1724
+ number: true,
1725
+ "rotation-css": true,
1726
+ "rotation-degrees": true,
1727
+ scale: true,
1728
+ "text-content": false,
1729
+ "transform-origin": true,
1730
+ translate: true,
1731
+ "uv-coordinate": true
1732
+ };
1733
+ var isRecord4 = (value) => {
1734
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1735
+ };
1736
+ var isKeyframeClipboardFieldType = (value) => {
1737
+ return typeof value === "string" && Object.hasOwn(KEYFRAME_CLIPBOARD_FIELD_TYPE_SUPPORT, value) && KEYFRAME_CLIPBOARD_FIELD_TYPE_SUPPORT[value];
1738
+ };
1739
+ var isKeyframeClipboardEntry = (value) => {
1740
+ return isRecord4(value) && Number.isInteger(value.frameOffset) && Object.hasOwn(value, "value");
1741
+ };
1742
+ var areValidKeyframes = (value) => {
1743
+ if (!Array.isArray(value) || value.length === 0) {
1744
+ return false;
1745
+ }
1746
+ let previousOffset = -1;
1747
+ for (const keyframe of value) {
1748
+ if (!isKeyframeClipboardEntry(keyframe) || keyframe.frameOffset <= previousOffset) {
1749
+ return false;
1750
+ }
1751
+ previousOffset = keyframe.frameOffset;
1752
+ }
1753
+ return value[0]?.frameOffset === 0;
1754
+ };
1755
+ var isKeyframeClipboardField = (value) => {
1756
+ return isRecord4(value) && (value.type === "sequence" || value.type === "effect") && typeof value.fieldKey === "string";
1757
+ };
1758
+ var parseEasings = ({
1759
+ value,
1760
+ keyframeCount
1761
+ }) => {
1762
+ if (Array.isArray(value) && value.length === Math.max(0, keyframeCount - 1) && value.every(isKeyframeEasing)) {
1763
+ return value.map(normalizeKeyframeEasing);
1764
+ }
1765
+ return null;
1766
+ };
1767
+ var parseKeyframeClipboardDataResult = (value) => {
1768
+ try {
1769
+ const parsed = JSON.parse(value);
1770
+ if (!isRecord4(parsed) || parsed.remotionClipboard !== "keyframe") {
1771
+ return { status: "invalid" };
1772
+ }
1773
+ if (parsed.version !== 1) {
1774
+ return { status: "unsupported-version", version: parsed.version };
1775
+ }
1776
+ const easing = parseEasings({
1777
+ value: parsed.easing,
1778
+ keyframeCount: Array.isArray(parsed.keyframes) ? parsed.keyframes.length : 0
1779
+ });
1780
+ if (parsed.type !== "keyframe" || !areValidKeyframes(parsed.keyframes) || easing === null || parsed.field !== null && !isKeyframeClipboardField(parsed.field) || parsed.fieldType !== null && !isKeyframeClipboardFieldType(parsed.fieldType)) {
1781
+ return { status: "invalid" };
1782
+ }
1783
+ return {
1784
+ status: "valid",
1785
+ data: {
1786
+ type: "keyframe",
1787
+ version: 1,
1788
+ remotionClipboard: "keyframe",
1789
+ fieldType: parsed.fieldType,
1790
+ field: parsed.field,
1791
+ keyframes: parsed.keyframes,
1792
+ easing
1793
+ }
1794
+ };
1795
+ } catch {
1796
+ return { status: "invalid" };
1797
+ }
1798
+ };
1799
+ var parseKeyframeClipboardData = (value) => {
1800
+ const result = parseKeyframeClipboardDataResult(value);
1801
+ return result.status === "valid" ? result.data : null;
1802
+ };
1803
+
1804
+ // src/sequence-prop-clipboard-data.ts
1805
+ var isRecord5 = (value) => {
1806
+ return typeof value === "object" && value !== null && !Array.isArray(value);
1807
+ };
1808
+ var parseSequencePropClipboardDataResult = (value) => {
1809
+ try {
1810
+ const parsed = JSON.parse(value);
1811
+ if (!isRecord5(parsed) || parsed.remotionClipboard !== "sequence-prop") {
1812
+ return { status: "invalid" };
1813
+ }
1814
+ if (parsed.version !== 1) {
1815
+ return { status: "unsupported-version", version: parsed.version };
1816
+ }
1817
+ if (parsed.type !== "sequence-prop" || typeof parsed.key !== "string" || !isKeyframeClipboardFieldType(parsed.fieldType) || !isEffectClipboardParam(parsed.param)) {
1818
+ return { status: "invalid" };
1819
+ }
1820
+ return {
1821
+ status: "valid",
1822
+ data: {
1823
+ type: "sequence-prop",
1824
+ version: 1,
1825
+ remotionClipboard: "sequence-prop",
1826
+ key: parsed.key,
1827
+ fieldType: parsed.fieldType,
1828
+ param: normalizeEffectClipboardParam(parsed.param)
1829
+ }
1830
+ };
1831
+ } catch {
1832
+ return { status: "invalid" };
1833
+ }
1834
+ };
1835
+ var parseSequencePropClipboardData = (value) => {
1836
+ const result = parseSequencePropClipboardDataResult(value);
1837
+ return result.status === "valid" ? result.data : null;
1838
+ };
1634
1839
  // src/format-bytes.ts
1635
1840
  var BYTE_UNITS = ["B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"];
1636
1841
  var BIBYTE_UNITS = [
@@ -1808,95 +2013,6 @@ var hotMiddlewareOptions = {
1808
2013
  reload: true,
1809
2014
  warn: true
1810
2015
  };
1811
- // src/keyframe-clipboard-data.ts
1812
- var KEYFRAME_CLIPBOARD_FIELD_TYPE_SUPPORT = {
1813
- array: false,
1814
- asset: false,
1815
- boolean: false,
1816
- "remotion-captions": false,
1817
- color: true,
1818
- enum: false,
1819
- "font-family": false,
1820
- hidden: false,
1821
- number: true,
1822
- "rotation-css": true,
1823
- "rotation-degrees": true,
1824
- scale: true,
1825
- "text-content": false,
1826
- "transform-origin": true,
1827
- translate: true,
1828
- "uv-coordinate": true
1829
- };
1830
- var isRecord3 = (value) => {
1831
- return typeof value === "object" && value !== null && !Array.isArray(value);
1832
- };
1833
- var isKeyframeClipboardFieldType = (value) => {
1834
- return typeof value === "string" && Object.hasOwn(KEYFRAME_CLIPBOARD_FIELD_TYPE_SUPPORT, value) && KEYFRAME_CLIPBOARD_FIELD_TYPE_SUPPORT[value];
1835
- };
1836
- var isKeyframeClipboardEntry = (value) => {
1837
- return isRecord3(value) && Number.isInteger(value.frameOffset) && Object.hasOwn(value, "value");
1838
- };
1839
- var areValidKeyframes = (value) => {
1840
- if (!Array.isArray(value) || value.length === 0) {
1841
- return false;
1842
- }
1843
- let previousOffset = -1;
1844
- for (const keyframe of value) {
1845
- if (!isKeyframeClipboardEntry(keyframe) || keyframe.frameOffset <= previousOffset) {
1846
- return false;
1847
- }
1848
- previousOffset = keyframe.frameOffset;
1849
- }
1850
- return value[0]?.frameOffset === 0;
1851
- };
1852
- var isKeyframeClipboardField = (value) => {
1853
- return isRecord3(value) && (value.type === "sequence" || value.type === "effect") && typeof value.fieldKey === "string";
1854
- };
1855
- var parseEasings = ({
1856
- value,
1857
- keyframeCount
1858
- }) => {
1859
- if (Array.isArray(value) && value.length === Math.max(0, keyframeCount - 1) && value.every(isKeyframeEasing)) {
1860
- return value.map(normalizeKeyframeEasing);
1861
- }
1862
- return null;
1863
- };
1864
- var parseKeyframeClipboardDataResult = (value) => {
1865
- try {
1866
- const parsed = JSON.parse(value);
1867
- if (!isRecord3(parsed) || parsed.remotionClipboard !== "keyframe") {
1868
- return { status: "invalid" };
1869
- }
1870
- if (parsed.version !== 1) {
1871
- return { status: "unsupported-version", version: parsed.version };
1872
- }
1873
- const easing = parseEasings({
1874
- value: parsed.easing,
1875
- keyframeCount: Array.isArray(parsed.keyframes) ? parsed.keyframes.length : 0
1876
- });
1877
- if (parsed.type !== "keyframe" || !areValidKeyframes(parsed.keyframes) || easing === null || parsed.field !== null && !isKeyframeClipboardField(parsed.field) || parsed.fieldType !== null && !isKeyframeClipboardFieldType(parsed.fieldType)) {
1878
- return { status: "invalid" };
1879
- }
1880
- return {
1881
- status: "valid",
1882
- data: {
1883
- type: "keyframe",
1884
- version: 1,
1885
- remotionClipboard: "keyframe",
1886
- fieldType: parsed.fieldType,
1887
- field: parsed.field,
1888
- keyframes: parsed.keyframes,
1889
- easing
1890
- }
1891
- };
1892
- } catch {
1893
- return { status: "invalid" };
1894
- }
1895
- };
1896
- var parseKeyframeClipboardData = (value) => {
1897
- const result = parseKeyframeClipboardDataResult(value);
1898
- return result.status === "valid" ? result.data : null;
1899
- };
1900
2016
  // src/keyframe-easing-presets.ts
1901
2017
  var LINEAR_KEYFRAME_EASING = { type: "linear" };
1902
2018
  var HOLD_KEYFRAME_EASING = { type: "step1" };
@@ -3061,6 +3177,7 @@ var studioHtml = ({
3061
3177
  installedDependencies,
3062
3178
  packageManager,
3063
3179
  audioLatencyHint,
3180
+ experimentalKeepAudioContextAlive,
3064
3181
  sampleRate,
3065
3182
  logLevel,
3066
3183
  mode,
@@ -3085,6 +3202,7 @@ var studioHtml = ({
3085
3202
  <body>
3086
3203
  <script>window.remotion_numberOfAudioTags = ${numberOfAudioTags};</script>
3087
3204
  <script>window.remotion_audioLatencyHint = "${audioLatencyHint}";</script>
3205
+ <script>window.remotion_experimentalKeepAudioContextAlive = ${experimentalKeepAudioContextAlive};</script>
3088
3206
  <script>window.remotion_sampleRate = ${sampleRate};</script>
3089
3207
  <script>window.remotion_previewSampleRate = ${sampleRate};</script>
3090
3208
  ${mode === "dev" ? `<script>window.remotion_logLevel = "${logLevel}";</script>` : ""}
@@ -3156,6 +3274,10 @@ var addKeyframeToPropStatus = ({
3156
3274
  schema
3157
3275
  }) => {
3158
3276
  if (status.status === "keyframed") {
3277
+ const defaultEasing = isSchemaFieldHoldOnly({
3278
+ schema,
3279
+ key: fieldKey
3280
+ }) ? HOLD_KEYFRAME_EASING : LINEAR_KEYFRAME_EASING;
3159
3281
  const existingIndex = status.keyframes.findIndex((kf) => kf.frame === frame);
3160
3282
  if (existingIndex !== -1) {
3161
3283
  const updatedKeyframes = status.keyframes.map((keyframe, index) => index === existingIndex ? { frame, value } : keyframe);
@@ -3172,10 +3294,10 @@ var addKeyframeToPropStatus = ({
3172
3294
  easingLength: easing.length,
3173
3295
  keyframeCount: keyframes.length
3174
3296
  });
3175
- const easingToDuplicate = easingIndexToDuplicate === null ? LINEAR_KEYFRAME_EASING : easing[easingIndexToDuplicate];
3297
+ const easingToDuplicate = easingIndexToDuplicate === null ? defaultEasing : easing[easingIndexToDuplicate];
3176
3298
  easing.splice(insertedKeyframeIndex, 0, easingToDuplicate);
3177
3299
  while (easing.length < keyframes.length - 1) {
3178
- easing.push(LINEAR_KEYFRAME_EASING);
3300
+ easing.push(defaultEasing);
3179
3301
  }
3180
3302
  return {
3181
3303
  ...status,
@@ -3804,6 +3926,8 @@ export {
3804
3926
  stringifyDefaultProps,
3805
3927
  splitAnsi,
3806
3928
  parseSpringEasingConfig,
3929
+ parseSequencePropClipboardDataResult,
3930
+ parseSequencePropClipboardData,
3807
3931
  parseKeyframeClipboardDataResult,
3808
3932
  parseKeyframeClipboardData,
3809
3933
  parseEffectPropClipboardDataResult,
@@ -3812,6 +3936,7 @@ export {
3812
3936
  parseEffectClipboardData,
3813
3937
  parseEasingClipboardDataResult,
3814
3938
  parseEasingClipboardData,
3939
+ parseCanvasCaptureData,
3815
3940
  packages,
3816
3941
  optimisticUpdateSequenceKeyframeSettings,
3817
3942
  optimisticUpdateForPropStatuses,
@@ -3830,12 +3955,14 @@ export {
3830
3955
  isValidPackageName,
3831
3956
  isUrl,
3832
3957
  isSchemaFieldKeyframable,
3958
+ isSchemaFieldHoldOnly,
3833
3959
  isKeyframeInterpolationFunction,
3834
3960
  isKeyframeClipboardFieldType,
3835
3961
  isInteractivitySchemaFieldKeyframable,
3836
3962
  isImageFileType,
3837
3963
  installableMap,
3838
3964
  hotMiddlewareOptions,
3965
+ hasSequenceTimingTraits,
3839
3966
  getStylePropertyLonghandKeys,
3840
3967
  getStudioEntryPoints,
3841
3968
  getSchemaFieldGroup,
@@ -3881,6 +4008,7 @@ export {
3881
4008
  DEFAULT_SPRING_EASING,
3882
4009
  DEFAULT_BUFFER_STATE_DELAY_IN_MILLISECONDS,
3883
4010
  CUBIC_KEYFRAME_EASING,
4011
+ CANVAS_CAPTURE_METADATA_TAG,
3884
4012
  BORDER_RADIUS_SHORTHAND_KEY,
3885
4013
  BORDER_RADIUS_LONGHAND_KEYS
3886
4014
  };
@@ -9,7 +9,7 @@ var KEYFRAME_FIELD_TYPE_SUPPORT = {
9
9
  boolean: false,
10
10
  "remotion-captions": false,
11
11
  color: true,
12
- enum: false,
12
+ enum: true,
13
13
  "font-family": false,
14
14
  hidden: true,
15
15
  number: true,
@@ -27,7 +27,7 @@ var KEYFRAME_FIELD_TYPE_INTERPOLATION = {
27
27
  boolean: "unsupported",
28
28
  "remotion-captions": "unsupported",
29
29
  color: "interpolateColors",
30
- enum: "unsupported",
30
+ enum: "interpolate",
31
31
  "font-family": "unsupported",
32
32
  hidden: "infer",
33
33
  number: "infer",
@@ -51,6 +51,9 @@ var isInteractivitySchemaFieldKeyframable = (field) => {
51
51
  if (!field) {
52
52
  return true;
53
53
  }
54
+ if (field.type === "enum") {
55
+ return field.keyframable === true;
56
+ }
54
57
  return KEYFRAME_FIELD_TYPE_SUPPORT[field.type] && field.keyframable !== false;
55
58
  };
56
59
  var findFieldInSchema = (schema, key) => {
@@ -77,6 +80,13 @@ var isSchemaFieldKeyframable = ({
77
80
  const field = schema ? findFieldInSchema(schema, key) : undefined;
78
81
  return isInteractivitySchemaFieldKeyframable(field);
79
82
  };
83
+ var isSchemaFieldHoldOnly = ({
84
+ schema,
85
+ key
86
+ }) => {
87
+ const field = schema ? findFieldInSchema(schema, key) : undefined;
88
+ return field?.type === "enum" && field.keyframable === true;
89
+ };
80
90
  var getKeyframeInterpolationFunctionForSchemaField = ({
81
91
  schema,
82
92
  key
@@ -106,6 +116,7 @@ var getKeyframeInterpolationFunction = ({
106
116
  export {
107
117
  keyframeInterpolationFunctions,
108
118
  isSchemaFieldKeyframable,
119
+ isSchemaFieldHoldOnly,
109
120
  isKeyframeInterpolationFunction,
110
121
  isInteractivitySchemaFieldKeyframable,
111
122
  getKeyframeInterpolationFunctionForSchemaField,
@@ -22,6 +22,7 @@ var studioHtml = ({
22
22
  installedDependencies,
23
23
  packageManager,
24
24
  audioLatencyHint,
25
+ experimentalKeepAudioContextAlive,
25
26
  sampleRate,
26
27
  logLevel,
27
28
  mode,
@@ -46,6 +47,7 @@ var studioHtml = ({
46
47
  <body>
47
48
  <script>window.remotion_numberOfAudioTags = ${numberOfAudioTags};</script>
48
49
  <script>window.remotion_audioLatencyHint = "${audioLatencyHint}";</script>
50
+ <script>window.remotion_experimentalKeepAudioContextAlive = ${experimentalKeepAudioContextAlive};</script>
49
51
  <script>window.remotion_sampleRate = ${sampleRate};</script>
50
52
  <script>window.remotion_previewSampleRate = ${sampleRate};</script>
51
53
  ${mode === "dev" ? `<script>window.remotion_logLevel = "${logLevel}";</script>` : ""}
@@ -0,0 +1 @@
1
+ export type GitClientId = 'github-desktop';
@@ -0,0 +1,2 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
@@ -0,0 +1 @@
1
+ export declare const hasSequenceTimingTraits: (sequenceKeys: readonly string[]) => boolean;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.hasSequenceTimingTraits = void 0;
4
+ const sequenceTimingTraits = ['from', 'durationInFrames', 'trimBefore'];
5
+ const hasSequenceTimingTraits = (sequenceKeys) => {
6
+ return sequenceTimingTraits.every((trait) => sequenceKeys.includes(trait));
7
+ };
8
+ exports.hasSequenceTimingTraits = hasSequenceTimingTraits;
package/dist/index.d.ts CHANGED
@@ -1,11 +1,15 @@
1
1
  export { splitAnsi, stripAnsi } from './ansi';
2
2
  export type { TerminalId } from './terminal';
3
- export { AddEffectKeyframeRequest, AddEffectKeyframeResponse, AddEffectRequest, AddEffectResponse, AddKeyframesRequest, AddKeyframesResponse, AddRenderRequest, AddSequenceKeyframeRequest, AddSequenceKeyframeResponse, ApiRoutes, ApplyCodemodRequest, ApplyCodemodResponse, ApplyVisualControlRequest, ApplyVisualControlResponse, BatchUpdateEffectKeyframeSettings, BatchUpdateKeyframeSettingsRequest, BatchUpdateKeyframeSettingsResponse, BatchUpdateSequenceKeyframeSettings, CanUpdateDefaultPropsResponse, CanUpdateSequencePropsRequest, CancelRenderRequest, CancelRenderResponse, CaptionPatch, CompositionComponentInfoRequest, CompositionComponentInfoResponse, ConvertFigmaClipboardToSvgRequest, ConvertFigmaClipboardToSvgResponse, CopyRenderOutputToAssetRequest, CopyRenderOutputToAssetResponse, CopyStillToClipboardRequest, DeleteEffectKeyframe, DeleteEffectRequest, DeleteEffectRequestItem, DeleteEffectResponse, DeleteJsxNodeRequest, DeleteJsxNodeRequestItem, DeleteJsxNodeResponse, DeleteKeyframesRequest, DeleteKeyframesResponse, DeleteSequenceKeyframe, DeleteStaticFileRequest, DeleteStaticFileResponse, DownloadRemoteAssetRequest, DownloadRemoteAssetResponse, DuplicateEffectRequest, DuplicateEffectRequestItem, DuplicateEffectResponse, DuplicateJsxNodeRequest, DuplicateJsxNodeResponse, EditorPickerId, ElementInstallExpectedFileState, ElementInstallRequest, ElementInstallSource, FindInFileRequest, FindInFileResponse, GetDefaultCodingAgentInfoRequest, GetDefaultCodingAgentInfoResponse, GetDefaultEditorInfoRequest, GetDefaultEditorInfoResponse, GoogleFontSourceEdit, InsertElementFileConflict, InsertElementRequest, InsertElementResponse, InsertJsxElementRequest, InsertJsxElementResponse, InsertableCompositionElement, InsertableCompositionElementPosition, InstallPackageRequest, InstallPackageResponse, LogStudioErrorRequest, LogStudioErrorResponse, MoveEffectKeyframe, MoveKeyframesRequest, MoveKeyframesResponse, MoveSequenceKeyframe, OpenInCodingAgentRequest, OpenInCodingAgentResponse, OpenInEditorRequest, OpenInEditorResponse, OpenInFileExplorerRequest, OpenInTerminalRequest, OpenInTerminalResponse, PackageInstallSpec, PasteEffectsRequest, PasteEffectsResponse, PrepareElementInstallRequest, PrepareElementInstallResponse, ProjectInfoRequest, ProjectInfoResponse, RedoRequest, RedoResponse, RemoveRenderRequest, RenameStaticFileRequest, RenameStaticFileResponse, ReorderEffectRequest, ReorderEffectResponse, ReorderSequencePosition, ReorderSequenceRequest, ReorderSequenceResponse, RestartStudioRequest, RestartStudioResponse, SaveEffectPropsRequest, SaveEffectPropsResponse, SaveInlineCaptionPatchesRequest, SaveMultipleEffectPropsEdit, SaveMultipleEffectPropsRequest, SaveMultipleEffectPropsResponse, SaveMultipleEffectPropsResult, SaveSequencePropEdit, SaveSequencePropSourceEdit, SaveSequencePropsRequest, SaveSequencePropsResponse, SaveSequencePropsResult, SimpleDiff, SplitJsxSequenceRequest, SplitJsxSequenceResponse, SubscribeToDefaultPropsRequest, SubscribeToDefaultPropsResponse, SubscribeToFileExistenceRequest, SubscribeToFileExistenceResponse, SubscribeToSequencePropsRequest, SubscribeToSequencePropsResponse, UndoRequest, UndoResponse, UnsubscribeFromDefaultPropsRequest, UnsubscribeFromFileExistenceRequest, UnsubscribeFromSequencePropsRequest, UpdateAvailableRequest, UpdateAvailableResponse, UpdateConfigRequest, UpdateConfigResponse, UpdateDefaultPropsRequest, UpdateDefaultPropsResponse, UpdateEffectKeyframeSettingsRequest, UpdateEffectKeyframeSettingsResponse, UpdateElementInstallTargetRequest, UpdateElementInstallTargetResponse, UpdateSequenceKeyframeSettingsRequest, UpdateSequenceKeyframeSettingsResponse, type AddEffectKeyframe, type AddSequenceKeyframe, type ConfigUpdate, type ConfigValue, type KeyframeSettings, } from './api-requests';
3
+ export type { GitClientId } from './git-client';
4
+ export { AddEffectKeyframeRequest, AddEffectKeyframeResponse, AddEffectRequest, AddEffectResponse, AddKeyframesRequest, AddKeyframesResponse, AddRenderRequest, AddSequenceKeyframeRequest, AddSequenceKeyframeResponse, ApiRoutes, ApplyCodemodRequest, ApplyCodemodResponse, ApplyVisualControlRequest, ApplyVisualControlResponse, BatchUpdateEffectKeyframeSettings, BatchUpdateKeyframeSettingsRequest, BatchUpdateKeyframeSettingsResponse, BatchUpdateSequenceKeyframeSettings, CanUpdateDefaultPropsResponse, CanUpdateSequencePropsRequest, CancelRenderRequest, CancelRenderResponse, CaptionPatch, CompositionComponentInfoRequest, CompositionComponentInfoResponse, ConvertFigmaClipboardToSvgRequest, ConvertFigmaClipboardToSvgResponse, CopyRenderOutputToAssetRequest, CopyRenderOutputToAssetResponse, CopyStillToClipboardRequest, DeleteEffectKeyframe, DeleteEffectRequest, DeleteEffectRequestItem, DeleteEffectResponse, DeleteJsxNodeRequest, DeleteJsxNodeRequestItem, DeleteJsxNodeResponse, DeleteKeyframesRequest, DeleteKeyframesResponse, DeleteSequenceKeyframe, DeleteStaticFileRequest, DeleteStaticFileResponse, DownloadRemoteAssetRequest, DownloadRemoteAssetResponse, DuplicateEffectRequest, DuplicateEffectRequestItem, DuplicateEffectResponse, DuplicateJsxNodeRequest, DuplicateJsxNodeResponse, EditorPickerId, ElementInstallExpectedFileState, ElementInstallRequest, ElementInstallSource, FindInFileRequest, FindInFileResponse, GetDefaultCodingAgentInfoRequest, GetDefaultCodingAgentInfoResponse, GetDefaultEditorInfoRequest, GetDefaultEditorInfoResponse, GoogleFontSourceEdit, InsertElementFileConflict, InsertElementRequest, InsertElementResponse, InsertJsxElementRequest, InsertJsxElementResponse, InsertableCompositionElement, InsertableCompositionElementPosition, InstallPackageRequest, InstallPackageResponse, LogStudioErrorRequest, LogStudioErrorResponse, MoveEffectKeyframe, MoveKeyframesRequest, MoveKeyframesResponse, MoveSequenceKeyframe, OpenInCodingAgentRequest, OpenInCodingAgentResponse, OpenInEditorRequest, OpenInEditorResponse, OpenInFileExplorerRequest, OpenInGitClientRequest, OpenInGitClientResponse, OpenInTerminalRequest, OpenInTerminalResponse, PackageInstallSpec, PasteEffectsRequest, PasteEffectsResponse, PrepareElementInstallRequest, PrepareElementInstallResponse, ProjectInfoRequest, ProjectInfoResponse, RedoRequest, RedoResponse, RemoveRenderRequest, RenameStaticFileRequest, RenameStaticFileResponse, ReorderEffectRequest, ReorderEffectResponse, ReorderSequencePosition, ReorderSequenceRequest, ReorderSequenceResponse, RestartStudioRequest, RestartStudioResponse, SaveEffectPropsRequest, SaveEffectPropsResponse, SaveInlineCaptionPatchesRequest, SaveMultipleEffectPropsEdit, SaveMultipleEffectPropsRequest, SaveMultipleEffectPropsResponse, SaveMultipleEffectPropsResult, SaveSequencePropEdit, SaveSequencePropSourceEdit, SaveSequencePropsRequest, SaveSequencePropsResponse, SaveSequencePropsResult, SimpleDiff, SplitJsxSequenceRequest, SplitJsxSequenceResponse, SubscribeToDefaultPropsRequest, SubscribeToDefaultPropsResponse, SubscribeToFileExistenceRequest, SubscribeToFileExistenceResponse, SubscribeToSequencePropsRequest, SubscribeToSequencePropsResponse, UndoRequest, UndoResponse, UnsubscribeFromDefaultPropsRequest, UnsubscribeFromFileExistenceRequest, UnsubscribeFromSequencePropsRequest, UpdateAvailableRequest, UpdateAvailableResponse, UpdateConfigRequest, UpdateConfigResponse, UpdateDefaultPropsRequest, UpdateDefaultPropsResponse, UpdateEffectKeyframeSettingsRequest, UpdateEffectKeyframeSettingsResponse, UpdateElementInstallTargetRequest, UpdateElementInstallTargetResponse, UpdateSequenceKeyframeSettingsRequest, UpdateSequenceKeyframeSettingsResponse, type AddEffectKeyframe, type AddSequenceKeyframe, type ConfigUpdate, type ConfigValue, type KeyframeSettings, } from './api-requests';
4
5
  export type { BrowserStudioOperations } from './browser-studio-operations';
6
+ export type { CanvasCaptureData, CanvasCaptureMouseMovement, CanvasCapturePointerClick, } from './canvas-capture';
7
+ export { CANVAS_CAPTURE_METADATA_TAG, parseCanvasCaptureData, } from './canvas-capture';
5
8
  export type { SequenceNodePathMutation, SequenceNodePathRemapping, } from './sequence-node-path-mutation';
6
9
  export type { ApplyVisualControlCodemod, RecastCodemod } from './codemods';
7
10
  export { compositionDragDataToSymbolicatedStack } from './composition-drag-data';
8
11
  export { REACT_REFRESH_FINISHED_EVENT } from './react-refresh-event';
12
+ export { hasSequenceTimingTraits } from './has-sequence-timing-traits';
9
13
  export { getConfigFileChangeMessage, type ConfigFileChangeType, } from './config-file-change';
10
14
  export { configMethodLifecycles } from './config-method-lifecycles';
11
15
  export { DEFAULT_BUFFER_STATE_DELAY_IN_MILLISECONDS } from './default-buffer-state-delay-in-milliseconds';
@@ -13,6 +17,7 @@ export { detectFileType, isImageFileType, type FileDimensions, type FileType, ty
13
17
  export { parseEasingClipboardData, parseEasingClipboardDataResult, type EasingClipboardData, type EasingClipboardDataParseResult, } from './easing-clipboard-data';
14
18
  export { EFFECT_CATALOG, getEffectCatalogCategories, getEffectDocumentationLink, getEffectDocumentationPath, getEffectPreviewAlt, getEffectPreviewSource, type EffectCatalogCategory, type EffectCatalogItem, } from './effect-catalog';
15
19
  export { parseEffectClipboardData, parseEffectClipboardDataResult, parseEffectPropClipboardData, parseEffectPropClipboardDataResult, type EffectClipboardClamping, type EffectClipboardData, type EffectClipboardDataParseResult, type EffectClipboardEasing, type EffectClipboardExtrapolateType, type EffectClipboardInterpolationFunction, type EffectClipboardKeyframe, type EffectClipboardKeyframedParam, type EffectClipboardParam, type EffectClipboardPasteType, type EffectClipboardSnapshot, type EffectClipboardStaticParam, type EffectPropClipboardData, type EffectPropClipboardDataParseResult, } from './effect-clipboard-data';
20
+ export { parseSequencePropClipboardData, parseSequencePropClipboardDataResult, type SequencePropClipboardData, type SequencePropClipboardDataParseResult, } from './sequence-prop-clipboard-data';
16
21
  export { EventSourceEvent } from './event-source-event';
17
22
  export { formatBytes } from './format-bytes';
18
23
  export { getAllSchemaKeys, getAssetSchemaKeys } from './get-all-keys';
@@ -23,7 +28,7 @@ export type { GitSource } from './git-source';
23
28
  export { HotMiddlewareMessage, HotMiddlewareOptions, ModuleMap, hotMiddlewareOptions, } from './hot-middleware';
24
29
  export { isKeyframeClipboardFieldType, parseKeyframeClipboardData, parseKeyframeClipboardDataResult, type KeyframeClipboardData, type KeyframeClipboardDataParseResult, type KeyframeClipboardFieldType, } from './keyframe-clipboard-data';
25
30
  export { CUBIC_KEYFRAME_EASING, EASE_KEYFRAME_EASING, HOLD_KEYFRAME_EASING, KEYFRAME_EASING_PRESETS, LINEAR_KEYFRAME_EASING, QUAD_KEYFRAME_EASING, getBackKeyframeEasing, getOutKeyframeEasing, getPolyKeyframeEasing, type KeyframeEasing, type KeyframeEasingPreset, } from './keyframe-easing-presets';
26
- export { canEditEasingForInterpolationFunction, getKeyframeInterpolationFunction, getKeyframeInterpolationFunctionForSchemaField, isInteractivitySchemaFieldKeyframable, isKeyframeInterpolationFunction, isSchemaFieldKeyframable, keyframeInterpolationFunctions, type KeyframeInterpolationFunction, } from './keyframe-interpolation-function';
31
+ export { canEditEasingForInterpolationFunction, getKeyframeInterpolationFunction, isSchemaFieldHoldOnly, getKeyframeInterpolationFunctionForSchemaField, isInteractivitySchemaFieldKeyframable, isKeyframeInterpolationFunction, isSchemaFieldKeyframable, keyframeInterpolationFunctions, type KeyframeInterpolationFunction, } from './keyframe-interpolation-function';
27
32
  export { DEFAULT_TIMELINE_TRACKS } from './max-timeline-tracks';
28
33
  export { Pkgs, apiDocs, descriptions, extraPackages, installableMap, packages, type ExtraPackage, } from './package-info';
29
34
  export { PackageManager } from './package-manager';
package/dist/index.js CHANGED
@@ -14,16 +14,21 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- exports.descriptions = exports.apiDocs = exports.DEFAULT_TIMELINE_TRACKS = exports.keyframeInterpolationFunctions = exports.isSchemaFieldKeyframable = exports.isKeyframeInterpolationFunction = exports.isInteractivitySchemaFieldKeyframable = exports.getKeyframeInterpolationFunctionForSchemaField = exports.getKeyframeInterpolationFunction = exports.canEditEasingForInterpolationFunction = exports.getPolyKeyframeEasing = exports.getOutKeyframeEasing = exports.getBackKeyframeEasing = exports.QUAD_KEYFRAME_EASING = exports.LINEAR_KEYFRAME_EASING = exports.KEYFRAME_EASING_PRESETS = exports.HOLD_KEYFRAME_EASING = exports.EASE_KEYFRAME_EASING = exports.CUBIC_KEYFRAME_EASING = exports.parseKeyframeClipboardDataResult = exports.parseKeyframeClipboardData = exports.isKeyframeClipboardFieldType = exports.hotMiddlewareOptions = exports.getProjectName = exports.getLocationFromBuildError = exports.getDefaultOutLocation = exports.getAssetSchemaKeys = exports.getAllSchemaKeys = exports.formatBytes = exports.parseEffectPropClipboardDataResult = exports.parseEffectPropClipboardData = exports.parseEffectClipboardDataResult = exports.parseEffectClipboardData = exports.getEffectPreviewSource = exports.getEffectPreviewAlt = exports.getEffectDocumentationPath = exports.getEffectDocumentationLink = exports.getEffectCatalogCategories = exports.EFFECT_CATALOG = exports.parseEasingClipboardDataResult = exports.parseEasingClipboardData = exports.isImageFileType = exports.detectFileType = exports.DEFAULT_BUFFER_STATE_DELAY_IN_MILLISECONDS = exports.configMethodLifecycles = exports.getConfigFileChangeMessage = exports.REACT_REFRESH_FINISHED_EVENT = exports.compositionDragDataToSymbolicatedStack = exports.stripAnsi = exports.splitAnsi = void 0;
18
- exports.isUrl = exports.stringifySequenceSubscriptionKey = exports.stringifySequenceExpandedRowKey = exports.optimisticUpdateSequenceKeyframeSettings = exports.optimisticUpdateEffectKeyframeSettings = exports.optimisticUpdateForPropStatuses = exports.optimisticUpdateForEffectPropStatuses = exports.optimisticMoveSequenceKeyframes = exports.optimisticMoveEffectKeyframes = exports.moveKeyframesInPropStatus = exports.canMoveKeyframesWithoutCollisions = exports.optimisticDeleteSequenceKeyframes = exports.optimisticDeleteSequenceKeyframe = exports.optimisticDeleteEffectKeyframes = exports.optimisticDeleteEffectKeyframe = exports.optimisticAddSequenceKeyframe = exports.optimisticAddEffectKeyframe = exports.getStylePropertyLonghandKeys = exports.BORDER_RADIUS_SHORTHAND_KEY = exports.BORDER_RADIUS_LONGHAND_KEYS = exports.studioHtml = exports.getStudioEntryPoints = exports.stringifyDefaultProps = exports.getSchemaFieldGroup = exports.getFieldsToShow = exports.getEffectFieldsToShow = exports.SCHEMA_FIELD_ROW_HEIGHT = exports.SCHEMA_FIELD_GROUPS = exports.isValidPackageName = exports.getRequiredPackageForInsertableElement = exports.getRequiredPackageForEffectImportPath = exports.parseSpringEasingConfig = exports.DEFAULT_SPRING_EASING = exports.packages = exports.installableMap = exports.extraPackages = void 0;
17
+ exports.isInteractivitySchemaFieldKeyframable = exports.getKeyframeInterpolationFunctionForSchemaField = exports.isSchemaFieldHoldOnly = exports.getKeyframeInterpolationFunction = exports.canEditEasingForInterpolationFunction = exports.getPolyKeyframeEasing = exports.getOutKeyframeEasing = exports.getBackKeyframeEasing = exports.QUAD_KEYFRAME_EASING = exports.LINEAR_KEYFRAME_EASING = exports.KEYFRAME_EASING_PRESETS = exports.HOLD_KEYFRAME_EASING = exports.EASE_KEYFRAME_EASING = exports.CUBIC_KEYFRAME_EASING = exports.parseKeyframeClipboardDataResult = exports.parseKeyframeClipboardData = exports.isKeyframeClipboardFieldType = exports.hotMiddlewareOptions = exports.getProjectName = exports.getLocationFromBuildError = exports.getDefaultOutLocation = exports.getAssetSchemaKeys = exports.getAllSchemaKeys = exports.formatBytes = exports.parseSequencePropClipboardDataResult = exports.parseSequencePropClipboardData = exports.parseEffectPropClipboardDataResult = exports.parseEffectPropClipboardData = exports.parseEffectClipboardDataResult = exports.parseEffectClipboardData = exports.getEffectPreviewSource = exports.getEffectPreviewAlt = exports.getEffectDocumentationPath = exports.getEffectDocumentationLink = exports.getEffectCatalogCategories = exports.EFFECT_CATALOG = exports.parseEasingClipboardDataResult = exports.parseEasingClipboardData = exports.isImageFileType = exports.detectFileType = exports.DEFAULT_BUFFER_STATE_DELAY_IN_MILLISECONDS = exports.configMethodLifecycles = exports.getConfigFileChangeMessage = exports.hasSequenceTimingTraits = exports.REACT_REFRESH_FINISHED_EVENT = exports.compositionDragDataToSymbolicatedStack = exports.parseCanvasCaptureData = exports.CANVAS_CAPTURE_METADATA_TAG = exports.stripAnsi = exports.splitAnsi = void 0;
18
+ exports.isUrl = exports.stringifySequenceSubscriptionKey = exports.stringifySequenceExpandedRowKey = exports.optimisticUpdateSequenceKeyframeSettings = exports.optimisticUpdateEffectKeyframeSettings = exports.optimisticUpdateForPropStatuses = exports.optimisticUpdateForEffectPropStatuses = exports.optimisticMoveSequenceKeyframes = exports.optimisticMoveEffectKeyframes = exports.moveKeyframesInPropStatus = exports.canMoveKeyframesWithoutCollisions = exports.optimisticDeleteSequenceKeyframes = exports.optimisticDeleteSequenceKeyframe = exports.optimisticDeleteEffectKeyframes = exports.optimisticDeleteEffectKeyframe = exports.optimisticAddSequenceKeyframe = exports.optimisticAddEffectKeyframe = exports.getStylePropertyLonghandKeys = exports.BORDER_RADIUS_SHORTHAND_KEY = exports.BORDER_RADIUS_LONGHAND_KEYS = exports.studioHtml = exports.getStudioEntryPoints = exports.stringifyDefaultProps = exports.getSchemaFieldGroup = exports.getFieldsToShow = exports.getEffectFieldsToShow = exports.SCHEMA_FIELD_ROW_HEIGHT = exports.SCHEMA_FIELD_GROUPS = exports.isValidPackageName = exports.getRequiredPackageForInsertableElement = exports.getRequiredPackageForEffectImportPath = exports.parseSpringEasingConfig = exports.DEFAULT_SPRING_EASING = exports.packages = exports.installableMap = exports.extraPackages = exports.descriptions = exports.apiDocs = exports.DEFAULT_TIMELINE_TRACKS = exports.keyframeInterpolationFunctions = exports.isSchemaFieldKeyframable = exports.isKeyframeInterpolationFunction = void 0;
19
19
  const ansi_1 = require("./ansi");
20
20
  Object.defineProperty(exports, "splitAnsi", { enumerable: true, get: function () { return ansi_1.splitAnsi; } });
21
21
  Object.defineProperty(exports, "stripAnsi", { enumerable: true, get: function () { return ansi_1.stripAnsi; } });
22
22
  __exportStar(require("./api-requests"), exports);
23
+ const canvas_capture_1 = require("./canvas-capture");
24
+ Object.defineProperty(exports, "CANVAS_CAPTURE_METADATA_TAG", { enumerable: true, get: function () { return canvas_capture_1.CANVAS_CAPTURE_METADATA_TAG; } });
25
+ Object.defineProperty(exports, "parseCanvasCaptureData", { enumerable: true, get: function () { return canvas_capture_1.parseCanvasCaptureData; } });
23
26
  const composition_drag_data_1 = require("./composition-drag-data");
24
27
  Object.defineProperty(exports, "compositionDragDataToSymbolicatedStack", { enumerable: true, get: function () { return composition_drag_data_1.compositionDragDataToSymbolicatedStack; } });
25
28
  const react_refresh_event_1 = require("./react-refresh-event");
26
29
  Object.defineProperty(exports, "REACT_REFRESH_FINISHED_EVENT", { enumerable: true, get: function () { return react_refresh_event_1.REACT_REFRESH_FINISHED_EVENT; } });
30
+ const has_sequence_timing_traits_1 = require("./has-sequence-timing-traits");
31
+ Object.defineProperty(exports, "hasSequenceTimingTraits", { enumerable: true, get: function () { return has_sequence_timing_traits_1.hasSequenceTimingTraits; } });
27
32
  const config_file_change_1 = require("./config-file-change");
28
33
  Object.defineProperty(exports, "getConfigFileChangeMessage", { enumerable: true, get: function () { return config_file_change_1.getConfigFileChangeMessage; } });
29
34
  const config_method_lifecycles_1 = require("./config-method-lifecycles");
@@ -48,6 +53,9 @@ Object.defineProperty(exports, "parseEffectClipboardData", { enumerable: true, g
48
53
  Object.defineProperty(exports, "parseEffectClipboardDataResult", { enumerable: true, get: function () { return effect_clipboard_data_1.parseEffectClipboardDataResult; } });
49
54
  Object.defineProperty(exports, "parseEffectPropClipboardData", { enumerable: true, get: function () { return effect_clipboard_data_1.parseEffectPropClipboardData; } });
50
55
  Object.defineProperty(exports, "parseEffectPropClipboardDataResult", { enumerable: true, get: function () { return effect_clipboard_data_1.parseEffectPropClipboardDataResult; } });
56
+ const sequence_prop_clipboard_data_1 = require("./sequence-prop-clipboard-data");
57
+ Object.defineProperty(exports, "parseSequencePropClipboardData", { enumerable: true, get: function () { return sequence_prop_clipboard_data_1.parseSequencePropClipboardData; } });
58
+ Object.defineProperty(exports, "parseSequencePropClipboardDataResult", { enumerable: true, get: function () { return sequence_prop_clipboard_data_1.parseSequencePropClipboardDataResult; } });
51
59
  const format_bytes_1 = require("./format-bytes");
52
60
  Object.defineProperty(exports, "formatBytes", { enumerable: true, get: function () { return format_bytes_1.formatBytes; } });
53
61
  const get_all_keys_1 = require("./get-all-keys");
@@ -78,6 +86,7 @@ Object.defineProperty(exports, "getPolyKeyframeEasing", { enumerable: true, get:
78
86
  const keyframe_interpolation_function_1 = require("./keyframe-interpolation-function");
79
87
  Object.defineProperty(exports, "canEditEasingForInterpolationFunction", { enumerable: true, get: function () { return keyframe_interpolation_function_1.canEditEasingForInterpolationFunction; } });
80
88
  Object.defineProperty(exports, "getKeyframeInterpolationFunction", { enumerable: true, get: function () { return keyframe_interpolation_function_1.getKeyframeInterpolationFunction; } });
89
+ Object.defineProperty(exports, "isSchemaFieldHoldOnly", { enumerable: true, get: function () { return keyframe_interpolation_function_1.isSchemaFieldHoldOnly; } });
81
90
  Object.defineProperty(exports, "getKeyframeInterpolationFunctionForSchemaField", { enumerable: true, get: function () { return keyframe_interpolation_function_1.getKeyframeInterpolationFunctionForSchemaField; } });
82
91
  Object.defineProperty(exports, "isInteractivitySchemaFieldKeyframable", { enumerable: true, get: function () { return keyframe_interpolation_function_1.isInteractivitySchemaFieldKeyframable; } });
83
92
  Object.defineProperty(exports, "isKeyframeInterpolationFunction", { enumerable: true, get: function () { return keyframe_interpolation_function_1.isKeyframeInterpolationFunction; } });
@@ -8,6 +8,10 @@ export declare const isSchemaFieldKeyframable: ({ schema, key, }: {
8
8
  schema: InteractivitySchema | null;
9
9
  key: string;
10
10
  }) => boolean;
11
+ export declare const isSchemaFieldHoldOnly: ({ schema, key, }: {
12
+ schema: InteractivitySchema | null;
13
+ key: string;
14
+ }) => boolean;
11
15
  export declare const getKeyframeInterpolationFunctionForSchemaField: ({ schema, key, }: {
12
16
  schema: InteractivitySchema | null;
13
17
  key: string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getKeyframeInterpolationFunction = exports.getKeyframeInterpolationFunctionForSchemaField = exports.isSchemaFieldKeyframable = exports.isInteractivitySchemaFieldKeyframable = exports.canEditEasingForInterpolationFunction = exports.isKeyframeInterpolationFunction = exports.keyframeInterpolationFunctions = void 0;
3
+ exports.getKeyframeInterpolationFunction = exports.getKeyframeInterpolationFunctionForSchemaField = exports.isSchemaFieldHoldOnly = exports.isSchemaFieldKeyframable = exports.isInteractivitySchemaFieldKeyframable = exports.canEditEasingForInterpolationFunction = exports.isKeyframeInterpolationFunction = exports.keyframeInterpolationFunctions = void 0;
4
4
  exports.keyframeInterpolationFunctions = [
5
5
  'interpolate',
6
6
  'interpolateColors',
@@ -13,7 +13,7 @@ const KEYFRAME_FIELD_TYPE_SUPPORT = {
13
13
  boolean: false,
14
14
  'remotion-captions': false,
15
15
  color: true,
16
- enum: false,
16
+ enum: true,
17
17
  'font-family': false,
18
18
  hidden: true,
19
19
  number: true,
@@ -31,7 +31,7 @@ const KEYFRAME_FIELD_TYPE_INTERPOLATION = {
31
31
  boolean: 'unsupported',
32
32
  'remotion-captions': 'unsupported',
33
33
  color: 'interpolateColors',
34
- enum: 'unsupported',
34
+ enum: 'interpolate',
35
35
  'font-family': 'unsupported',
36
36
  hidden: 'infer',
37
37
  number: 'infer',
@@ -58,6 +58,9 @@ const isInteractivitySchemaFieldKeyframable = (field) => {
58
58
  if (!field) {
59
59
  return true;
60
60
  }
61
+ if (field.type === 'enum') {
62
+ return field.keyframable === true;
63
+ }
61
64
  return KEYFRAME_FIELD_TYPE_SUPPORT[field.type] && field.keyframable !== false;
62
65
  };
63
66
  exports.isInteractivitySchemaFieldKeyframable = isInteractivitySchemaFieldKeyframable;
@@ -83,6 +86,11 @@ const isSchemaFieldKeyframable = ({ schema, key, }) => {
83
86
  return (0, exports.isInteractivitySchemaFieldKeyframable)(field);
84
87
  };
85
88
  exports.isSchemaFieldKeyframable = isSchemaFieldKeyframable;
89
+ const isSchemaFieldHoldOnly = ({ schema, key, }) => {
90
+ const field = schema ? findFieldInSchema(schema, key) : undefined;
91
+ return (field === null || field === void 0 ? void 0 : field.type) === 'enum' && field.keyframable === true;
92
+ };
93
+ exports.isSchemaFieldHoldOnly = isSchemaFieldHoldOnly;
86
94
  const getKeyframeInterpolationFunctionForSchemaField = ({ schema, key, }) => {
87
95
  const field = schema ? findFieldInSchema(schema, key) : undefined;
88
96
  if (!field) {
@@ -13,6 +13,12 @@ const getEasingIndexToDuplicate = ({ insertedKeyframeIndex, easingLength, keyfra
13
13
  const addKeyframeToPropStatus = ({ status, fieldKey, frame, value, schema, }) => {
14
14
  var _a;
15
15
  if (status.status === 'keyframed') {
16
+ const defaultEasing = (0, keyframe_interpolation_function_1.isSchemaFieldHoldOnly)({
17
+ schema,
18
+ key: fieldKey,
19
+ })
20
+ ? keyframe_easing_presets_1.HOLD_KEYFRAME_EASING
21
+ : keyframe_easing_presets_1.LINEAR_KEYFRAME_EASING;
16
22
  const existingIndex = status.keyframes.findIndex((kf) => kf.frame === frame);
17
23
  if (existingIndex !== -1) {
18
24
  const updatedKeyframes = status.keyframes.map((keyframe, index) => index === existingIndex ? { frame, value } : keyframe);
@@ -30,11 +36,11 @@ const addKeyframeToPropStatus = ({ status, fieldKey, frame, value, schema, }) =>
30
36
  keyframeCount: keyframes.length,
31
37
  });
32
38
  const easingToDuplicate = easingIndexToDuplicate === null
33
- ? keyframe_easing_presets_1.LINEAR_KEYFRAME_EASING
39
+ ? defaultEasing
34
40
  : easing[easingIndexToDuplicate];
35
41
  easing.splice(insertedKeyframeIndex, 0, easingToDuplicate);
36
42
  while (easing.length < keyframes.length - 1) {
37
- easing.push(keyframe_easing_presets_1.LINEAR_KEYFRAME_EASING);
43
+ easing.push(defaultEasing);
38
44
  }
39
45
  return {
40
46
  ...status,
@@ -0,0 +1,21 @@
1
+ import type { EffectClipboardParam } from './effect-clipboard-data';
2
+ import type { KeyframeClipboardFieldType } from './keyframe-clipboard-data';
3
+ export type SequencePropClipboardData = {
4
+ readonly type: 'sequence-prop';
5
+ readonly version: 1;
6
+ readonly remotionClipboard: 'sequence-prop';
7
+ readonly key: string;
8
+ readonly fieldType: KeyframeClipboardFieldType;
9
+ readonly param: EffectClipboardParam;
10
+ };
11
+ export type SequencePropClipboardDataParseResult = {
12
+ readonly status: 'valid';
13
+ readonly data: SequencePropClipboardData;
14
+ } | {
15
+ readonly status: 'unsupported-version';
16
+ readonly version: unknown;
17
+ } | {
18
+ readonly status: 'invalid';
19
+ };
20
+ export declare const parseSequencePropClipboardDataResult: (value: string) => SequencePropClipboardDataParseResult;
21
+ export declare const parseSequencePropClipboardData: (value: string) => SequencePropClipboardData | null;
@@ -0,0 +1,45 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.parseSequencePropClipboardData = exports.parseSequencePropClipboardDataResult = void 0;
4
+ const effect_clipboard_data_1 = require("./effect-clipboard-data");
5
+ const keyframe_clipboard_data_1 = require("./keyframe-clipboard-data");
6
+ const isRecord = (value) => {
7
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
8
+ };
9
+ const parseSequencePropClipboardDataResult = (value) => {
10
+ try {
11
+ const parsed = JSON.parse(value);
12
+ if (!isRecord(parsed) || parsed.remotionClipboard !== 'sequence-prop') {
13
+ return { status: 'invalid' };
14
+ }
15
+ if (parsed.version !== 1) {
16
+ return { status: 'unsupported-version', version: parsed.version };
17
+ }
18
+ if (parsed.type !== 'sequence-prop' ||
19
+ typeof parsed.key !== 'string' ||
20
+ !(0, keyframe_clipboard_data_1.isKeyframeClipboardFieldType)(parsed.fieldType) ||
21
+ !(0, effect_clipboard_data_1.isEffectClipboardParam)(parsed.param)) {
22
+ return { status: 'invalid' };
23
+ }
24
+ return {
25
+ status: 'valid',
26
+ data: {
27
+ type: 'sequence-prop',
28
+ version: 1,
29
+ remotionClipboard: 'sequence-prop',
30
+ key: parsed.key,
31
+ fieldType: parsed.fieldType,
32
+ param: (0, effect_clipboard_data_1.normalizeEffectClipboardParam)(parsed.param),
33
+ },
34
+ };
35
+ }
36
+ catch (_a) {
37
+ return { status: 'invalid' };
38
+ }
39
+ };
40
+ exports.parseSequencePropClipboardDataResult = parseSequencePropClipboardDataResult;
41
+ const parseSequencePropClipboardData = (value) => {
42
+ const result = (0, exports.parseSequencePropClipboardDataResult)(value);
43
+ return result.status === 'valid' ? result.data : null;
44
+ };
45
+ exports.parseSequencePropClipboardData = parseSequencePropClipboardData;
@@ -15,6 +15,7 @@ export type StudioHtmlOptions = {
15
15
  completedClientRenders?: unknown | null;
16
16
  numberOfAudioTags: number;
17
17
  audioLatencyHint: AudioContextLatencyCategory;
18
+ experimentalKeepAudioContextAlive: boolean;
18
19
  sampleRate: number | null;
19
20
  publicFiles: StaticFile[];
20
21
  publicFolderExists: string | null;
@@ -32,4 +33,4 @@ export type StudioHtmlOptions = {
32
33
  readOnlyStudio?: boolean;
33
34
  studioRuntimeConfig?: StudioRuntimeConfig;
34
35
  };
35
- export declare const studioHtml: ({ publicPath, editorName, inputProps, envVariables, staticHash, remotionRoot, studioServerCommand, renderQueue, completedClientRenders, numberOfAudioTags, publicFiles, includeFavicon, title, renderDefaults, publicFolderExists, fileSystemPlatform, gitSource, projectName, installedDependencies, packageManager, audioLatencyHint, sampleRate, logLevel, mode, bundleScriptUrl, readOnlyStudio, studioRuntimeConfig, }: StudioHtmlOptions) => string;
36
+ export declare const studioHtml: ({ publicPath, editorName, inputProps, envVariables, staticHash, remotionRoot, studioServerCommand, renderQueue, completedClientRenders, numberOfAudioTags, publicFiles, includeFavicon, title, renderDefaults, publicFolderExists, fileSystemPlatform, gitSource, projectName, installedDependencies, packageManager, audioLatencyHint, experimentalKeepAudioContextAlive, sampleRate, logLevel, mode, bundleScriptUrl, readOnlyStudio, studioRuntimeConfig, }: StudioHtmlOptions) => string;
@@ -2,7 +2,7 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.studioHtml = void 0;
4
4
  const remotion_1 = require("remotion");
5
- const studioHtml = ({ publicPath, editorName, inputProps, envVariables, staticHash, remotionRoot, studioServerCommand, renderQueue, completedClientRenders, numberOfAudioTags, publicFiles, includeFavicon, title, renderDefaults, publicFolderExists, fileSystemPlatform, gitSource, projectName, installedDependencies, packageManager, audioLatencyHint, sampleRate, logLevel, mode, bundleScriptUrl, readOnlyStudio, studioRuntimeConfig, }) => {
5
+ const studioHtml = ({ publicPath, editorName, inputProps, envVariables, staticHash, remotionRoot, studioServerCommand, renderQueue, completedClientRenders, numberOfAudioTags, publicFiles, includeFavicon, title, renderDefaults, publicFolderExists, fileSystemPlatform, gitSource, projectName, installedDependencies, packageManager, audioLatencyHint, experimentalKeepAudioContextAlive, sampleRate, logLevel, mode, bundleScriptUrl, readOnlyStudio, studioRuntimeConfig, }) => {
6
6
  const scriptUrl = bundleScriptUrl !== null && bundleScriptUrl !== void 0 ? bundleScriptUrl : `${publicPath}bundle.js`;
7
7
  const isRelativeBundle = mode === 'bundle' && publicPath === './';
8
8
  const staticBaseValue = isRelativeBundle
@@ -28,6 +28,7 @@ const studioHtml = ({ publicPath, editorName, inputProps, envVariables, staticHa
28
28
  <body>
29
29
  <script>window.remotion_numberOfAudioTags = ${numberOfAudioTags};</script>
30
30
  <script>window.remotion_audioLatencyHint = "${audioLatencyHint}";</script>
31
+ <script>window.remotion_experimentalKeepAudioContextAlive = ${experimentalKeepAudioContextAlive};</script>
31
32
  <script>window.remotion_sampleRate = ${sampleRate};</script>
32
33
  <script>window.remotion_previewSampleRate = ${sampleRate};</script>
33
34
  ${mode === 'dev' ? `<script>window.remotion_logLevel = "${logLevel}";</script>` : ''}
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio-shared"
4
4
  },
5
5
  "name": "@remotion/studio-shared",
6
- "version": "4.0.508",
6
+ "version": "4.0.510",
7
7
  "description": "Internal package for shared objects between the Studio backend and frontend",
8
8
  "main": "dist",
9
9
  "module": "dist/esm/index.mjs",
@@ -21,12 +21,12 @@
21
21
  "url": "https://github.com/remotion-dev/remotion/issues"
22
22
  },
23
23
  "dependencies": {
24
- "@remotion/studio-protocol": "4.0.508",
25
- "remotion": "4.0.508"
24
+ "@remotion/studio-protocol": "4.0.510",
25
+ "remotion": "4.0.510"
26
26
  },
27
27
  "devDependencies": {
28
- "@remotion/renderer": "4.0.508",
29
- "@remotion/eslint-config-internal": "4.0.508",
28
+ "@remotion/renderer": "4.0.510",
29
+ "@remotion/eslint-config-internal": "4.0.510",
30
30
  "eslint": "9.19.0",
31
31
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
32
32
  },