@remotion/studio 4.0.460 → 4.0.462

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 (86) hide show
  1. package/dist/Studio.d.ts +0 -1
  2. package/dist/Studio.js +4 -4
  3. package/dist/components/AudioWaveform.js +17 -9
  4. package/dist/components/ExpandedTracksProvider.js +8 -3
  5. package/dist/components/MenuBuildIndicator.js +1 -1
  6. package/dist/components/MenuCompositionName.js +1 -0
  7. package/dist/components/RenderButton.js +1 -1
  8. package/dist/components/Timeline/SequencePropsObserver.js +1 -1
  9. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +4 -3
  10. package/dist/components/Timeline/SubscribeToNodePaths.js +11 -1
  11. package/dist/components/Timeline/Timeline.js +11 -10
  12. package/dist/components/Timeline/TimelineBooleanField.d.ts +4 -4
  13. package/dist/components/Timeline/TimelineBooleanField.js +5 -5
  14. package/dist/components/Timeline/TimelineColorField.d.ts +11 -0
  15. package/dist/components/Timeline/TimelineColorField.js +181 -0
  16. package/dist/components/Timeline/TimelineDragHandler.js +37 -3
  17. package/dist/components/Timeline/TimelineEffectFieldRow.d.ts +11 -0
  18. package/dist/components/Timeline/TimelineEffectFieldRow.js +177 -0
  19. package/dist/components/Timeline/TimelineEnumField.d.ts +5 -5
  20. package/dist/components/Timeline/TimelineEnumField.js +7 -7
  21. package/dist/components/Timeline/TimelineExpandArrowButton.js +1 -1
  22. package/dist/components/Timeline/TimelineExpandedRow.d.ts +3 -3
  23. package/dist/components/Timeline/TimelineExpandedRow.js +8 -1
  24. package/dist/components/Timeline/TimelineExpandedSection.d.ts +2 -2
  25. package/dist/components/Timeline/TimelineExpandedSection.js +8 -21
  26. package/dist/components/Timeline/TimelineFieldRow.d.ts +3 -3
  27. package/dist/components/Timeline/TimelineFieldRow.js +65 -26
  28. package/dist/components/Timeline/TimelineHeightContainer.d.ts +1 -1
  29. package/dist/components/Timeline/TimelineHeightContainer.js +36 -3
  30. package/dist/components/Timeline/TimelineListItem.js +20 -18
  31. package/dist/components/Timeline/TimelineNumberField.d.ts +5 -5
  32. package/dist/components/Timeline/TimelineNumberField.js +12 -10
  33. package/dist/components/Timeline/TimelineRotationField.d.ts +5 -5
  34. package/dist/components/Timeline/TimelineRotationField.js +10 -10
  35. package/dist/components/Timeline/TimelineSchemaField.d.ts +11 -7
  36. package/dist/components/Timeline/TimelineSchemaField.js +27 -21
  37. package/dist/components/Timeline/TimelineSequence.js +2 -2
  38. package/dist/components/Timeline/TimelineSlider.js +2 -2
  39. package/dist/components/Timeline/TimelineStack/get-stack.js +17 -31
  40. package/dist/components/Timeline/TimelineStack/index.js +0 -10
  41. package/dist/components/Timeline/TimelineTimeIndicators.js +2 -2
  42. package/dist/components/Timeline/TimelineTracks.d.ts +1 -1
  43. package/dist/components/Timeline/TimelineTracks.js +42 -12
  44. package/dist/components/Timeline/TimelineTranslateField.d.ts +5 -5
  45. package/dist/components/Timeline/TimelineTranslateField.js +21 -37
  46. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -1
  47. package/dist/components/Timeline/sequence-props-subscription-store.js +11 -5
  48. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +2 -1
  49. package/dist/components/Timeline/use-sequence-props-subscription.js +6 -4
  50. package/dist/components/Timeline/use-timeline-height.js +5 -14
  51. package/dist/error-overlay/react-overlay/utils/get-source-map.d.ts +3 -3
  52. package/dist/error-overlay/react-overlay/utils/get-source-map.js +5 -5
  53. package/dist/error-overlay/react-overlay/utils/unmapper.d.ts +0 -6
  54. package/dist/error-overlay/react-overlay/utils/unmapper.js +8 -1
  55. package/dist/esm/{chunk-nrgs0ad5.js → chunk-yvg1f56k.js} +4168 -3948
  56. package/dist/esm/index.mjs +20 -8
  57. package/dist/esm/internals.mjs +4168 -3948
  58. package/dist/esm/previewEntry.mjs +2913 -2705
  59. package/dist/esm/renderEntry.mjs +2 -5
  60. package/dist/helpers/calculate-timeline.js +34 -4
  61. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +4 -2
  62. package/dist/helpers/timeline-layout.d.ts +11 -15
  63. package/dist/helpers/timeline-layout.js +36 -28
  64. package/dist/icons/eyedropper.d.ts +4 -0
  65. package/dist/icons/eyedropper.js +6 -0
  66. package/dist/internals.d.ts +0 -1
  67. package/dist/previewEntry.js +1 -1
  68. package/dist/renderEntry.js +3 -3
  69. package/package.json +14 -24
  70. package/dist/audio-waveform-worker.d.ts +0 -1
  71. package/dist/audio-waveform-worker.js +0 -102
  72. package/dist/components/audio-waveform-worker-types.d.ts +0 -28
  73. package/dist/components/audio-waveform-worker-types.js +0 -2
  74. package/dist/components/draw-peaks.d.ts +0 -1
  75. package/dist/components/draw-peaks.js +0 -68
  76. package/dist/components/load-waveform-peaks.d.ts +0 -13
  77. package/dist/components/load-waveform-peaks.js +0 -76
  78. package/dist/components/parse-color.d.ts +0 -1
  79. package/dist/components/parse-color.js +0 -17
  80. package/dist/components/slice-waveform-peaks.d.ts +0 -7
  81. package/dist/components/slice-waveform-peaks.js +0 -15
  82. package/dist/components/waveform-peak-processor.d.ts +0 -23
  83. package/dist/components/waveform-peak-processor.js +0 -77
  84. package/dist/esm/audio-waveform-worker.mjs +0 -346
  85. package/dist/make-audio-waveform-worker.d.ts +0 -1
  86. package/dist/make-audio-waveform-worker.js +0 -10
@@ -166,7 +166,6 @@ var renderContent = (Root) => {
166
166
  logLevel: window.remotion_logLevel ?? "info",
167
167
  numberOfAudioTags: 0,
168
168
  audioLatencyHint: window.remotion_audioLatencyHint ?? "playback",
169
- visualModeEnabled: false,
170
169
  children: /* @__PURE__ */ jsxs(Internals.RenderAssetManagerProvider, {
171
170
  collectAssets: null,
172
171
  children: [
@@ -193,7 +192,6 @@ var renderContent = (Root) => {
193
192
  logLevel: window.remotion_logLevel ?? "info",
194
193
  numberOfAudioTags: 0,
195
194
  audioLatencyHint: window.remotion_audioLatencyHint ?? "playback",
196
- visualModeEnabled: false,
197
195
  children: /* @__PURE__ */ jsx(Internals.RenderAssetManagerProvider, {
198
196
  collectAssets: null,
199
197
  children: /* @__PURE__ */ jsx(Root, {})
@@ -209,14 +207,13 @@ var renderContent = (Root) => {
209
207
  renderToDOM(/* @__PURE__ */ jsx("div", {
210
208
  children: /* @__PURE__ */ jsx(DelayedSpinner, {})
211
209
  }));
212
- import("./chunk-nrgs0ad5.js").then(({ StudioInternals }) => {
210
+ import("./chunk-yvg1f56k.js").then(({ StudioInternals }) => {
213
211
  window.remotion_isStudio = true;
214
212
  window.remotion_isReadOnlyStudio = true;
215
213
  window.remotion_inputProps = "{}";
216
214
  renderToDOM(/* @__PURE__ */ jsx(StudioInternals.Studio, {
217
215
  readOnly: true,
218
- rootComponent: Root,
219
- visualModeEnabled: false
216
+ rootComponent: Root
220
217
  }));
221
218
  }).catch((err) => {
222
219
  renderToDOM(/* @__PURE__ */ jsxs("div", {
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.calculateTimeline = void 0;
4
+ const studio_shared_1 = require("@remotion/studio-shared");
4
5
  const get_sequence_visible_range_1 = require("./get-sequence-visible-range");
5
6
  const get_timeline_nestedness_1 = require("./get-timeline-nestedness");
6
7
  const get_timeline_sequence_hash_1 = require("./get-timeline-sequence-hash");
@@ -58,7 +59,14 @@ const calculateTimeline = ({ sequences, overrideIdsToNodePaths, }) => {
58
59
  hash: actualHash,
59
60
  cascadedStart,
60
61
  cascadedDuration: sequence.duration,
61
- nodePathInfo: nodePath ? { nodePath, index: 0 } : null,
62
+ nodePathInfo: nodePath
63
+ ? {
64
+ sequenceSubscriptionKey: nodePath,
65
+ auxiliaryKeys: [],
66
+ index: 0,
67
+ numberOfSequencesWithThisNodePath: 0,
68
+ }
69
+ : null,
62
70
  });
63
71
  }
64
72
  const uniqueTracks = [];
@@ -78,17 +86,39 @@ const calculateTimeline = ({ sequences, overrideIdsToNodePaths, }) => {
78
86
  return sortKeyA.localeCompare(sortKeyB);
79
87
  });
80
88
  const nodePathIndexCounters = new Map();
81
- return sortedTracks.map((track) => {
89
+ return sortedTracks
90
+ .map((track) => {
82
91
  var _a;
83
92
  if (track.nodePathInfo === null) {
84
93
  return track;
85
94
  }
86
- const key = JSON.stringify(track.nodePathInfo.nodePath);
95
+ const key = (0, studio_shared_1.stringifySequenceSubscriptionKey)(track.nodePathInfo.sequenceSubscriptionKey);
87
96
  const index = (_a = nodePathIndexCounters.get(key)) !== null && _a !== void 0 ? _a : 0;
88
97
  nodePathIndexCounters.set(key, index + 1);
89
98
  return {
90
99
  ...track,
91
- nodePathInfo: { nodePath: track.nodePathInfo.nodePath, index },
100
+ nodePathInfo: {
101
+ sequenceSubscriptionKey: track.nodePathInfo.sequenceSubscriptionKey,
102
+ auxiliaryKeys: track.nodePathInfo.auxiliaryKeys,
103
+ index,
104
+ numberOfSequencesWithThisNodePath: 0,
105
+ },
106
+ };
107
+ })
108
+ .map((track) => {
109
+ var _a;
110
+ if (track.nodePathInfo === null) {
111
+ return track;
112
+ }
113
+ const key = (0, studio_shared_1.stringifySequenceSubscriptionKey)(track.nodePathInfo.sequenceSubscriptionKey);
114
+ return {
115
+ ...track,
116
+ nodePathInfo: {
117
+ sequenceSubscriptionKey: track.nodePathInfo.sequenceSubscriptionKey,
118
+ auxiliaryKeys: track.nodePathInfo.auxiliaryKeys,
119
+ index: track.nodePathInfo.index,
120
+ numberOfSequencesWithThisNodePath: (_a = nodePathIndexCounters.get(key)) !== null && _a !== void 0 ? _a : 0,
121
+ },
92
122
  };
93
123
  });
94
124
  };
@@ -1,7 +1,9 @@
1
- import type { SequenceNodePath, TSequence } from 'remotion';
1
+ import type { SequencePropsSubscriptionKey, TSequence } from 'remotion';
2
2
  export type SequenceNodePathInfo = {
3
- nodePath: SequenceNodePath;
3
+ sequenceSubscriptionKey: SequencePropsSubscriptionKey;
4
+ auxiliaryKeys: string[];
4
5
  index: number;
6
+ numberOfSequencesWithThisNodePath: number;
5
7
  };
6
8
  type Track = {
7
9
  sequence: TSequence;
@@ -1,9 +1,9 @@
1
- import { type CodeValues, type DragOverrides, type SchemaFieldInfo, type SequenceControls } from '@remotion/studio-shared';
2
- import type { EffectDefinitionAndStack, GetCodeValues, GetDragOverrides, TSequence } from 'remotion';
1
+ import { type AnySchemaFieldInfo, type CodeValues, type DragOverrides, type EffectSchemaFieldInfo, type SchemaFieldInfo, type SequenceControls, type SequenceSchemaFieldInfo } from '@remotion/studio-shared';
2
+ import type { GetDragOverrides, TSequence } from 'remotion';
3
3
  import type { GetIsExpanded } from '../components/ExpandedTracksProvider';
4
4
  import type { SequenceNodePathInfo } from './get-timeline-sequence-sort-key';
5
- export type { CodeValues, DragOverrides, SchemaFieldInfo, SequenceControls };
6
- export { SCHEMA_FIELD_ROW_HEIGHT, UNSUPPORTED_FIELD_ROW_HEIGHT, getFieldsToShow, } from '@remotion/studio-shared';
5
+ export type { AnySchemaFieldInfo, CodeValues, DragOverrides, EffectSchemaFieldInfo, SchemaFieldInfo, SequenceControls, SequenceSchemaFieldInfo, };
6
+ export { SCHEMA_FIELD_ROW_HEIGHT, getEffectFieldsToShow, getFieldsToShow, } from '@remotion/studio-shared';
7
7
  export declare const TIMELINE_PADDING = 16;
8
8
  export declare const TIMELINE_BORDER = 1;
9
9
  export declare const TIMELINE_ITEM_BORDER_BOTTOM = 1;
@@ -11,11 +11,8 @@ export declare const TIMELINE_TRACK_EXPANDED_HEIGHT = 100;
11
11
  export declare const TREE_GROUP_ROW_HEIGHT = 22;
12
12
  export declare const EXPANDED_SECTION_PADDING_LEFT = 28;
13
13
  export declare const EXPANDED_SECTION_PADDING_RIGHT = 10;
14
- export type EffectSchemaFieldLabel = {
15
- key: string;
16
- description: string | undefined;
17
- };
18
- export declare const getEffectSchemaLabels: (effect: EffectDefinitionAndStack<unknown>) => EffectSchemaFieldLabel[];
14
+ export type TimelineFieldOnSave = (value: unknown) => Promise<void>;
15
+ export type TimelineFieldOnDragValueChange = (value: unknown) => void;
19
16
  export type TimelineTreeNode = {
20
17
  readonly kind: 'group';
21
18
  readonly nodePathInfo: SequenceNodePathInfo;
@@ -25,13 +22,13 @@ export type TimelineTreeNode = {
25
22
  readonly kind: 'field';
26
23
  readonly nodePathInfo: SequenceNodePathInfo;
27
24
  readonly label: string;
28
- readonly field: SchemaFieldInfo | null;
25
+ readonly field: AnySchemaFieldInfo | null;
29
26
  };
30
- export declare const buildTimelineTree: ({ sequence, nodePathInfo, getDragOverrides, getCodeValues, }: {
27
+ export declare const buildTimelineTree: ({ sequence, nodePathInfo, getDragOverrides, codeValues, }: {
31
28
  sequence: TSequence;
32
29
  nodePathInfo: SequenceNodePathInfo;
33
30
  getDragOverrides: GetDragOverrides;
34
- getCodeValues: GetCodeValues;
31
+ codeValues: CodeValues;
35
32
  }) => TimelineTreeNode[];
36
33
  export type FlatTreeRow = {
37
34
  readonly node: TimelineTreeNode;
@@ -43,12 +40,11 @@ export declare const flattenVisibleTreeNodes: ({ nodes, getIsExpanded, depth, }:
43
40
  depth?: number | undefined;
44
41
  }) => FlatTreeRow[];
45
42
  export declare const getTreeRowHeight: (node: TimelineTreeNode) => number;
46
- export declare const getExpandedTrackHeight: ({ sequence, nodePathInfo, getIsExpanded, getDragOverrides, getCodeValues, }: {
43
+ export declare const getExpandedTrackHeight: ({ sequence, nodePathInfo, getIsExpanded, codeValues, }: {
47
44
  sequence: TSequence;
48
45
  nodePathInfo: SequenceNodePathInfo;
49
46
  getIsExpanded: GetIsExpanded;
50
- getDragOverrides: GetDragOverrides;
51
- getCodeValues: GetCodeValues;
47
+ codeValues: CodeValues;
52
48
  }) => number;
53
49
  export declare const TIMELINE_LAYER_HEIGHT_VIDEO = 75;
54
50
  export declare const TIMELINE_LAYER_HEIGHT_IMAGE = 50;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.getTimelineLayerHeight = exports.TIMELINE_LAYER_HEIGHT_AUDIO = exports.TIMELINE_LAYER_HEIGHT_IMAGE = exports.TIMELINE_LAYER_HEIGHT_VIDEO = exports.getExpandedTrackHeight = exports.getTreeRowHeight = exports.flattenVisibleTreeNodes = exports.buildTimelineTree = exports.getEffectSchemaLabels = exports.EXPANDED_SECTION_PADDING_RIGHT = exports.EXPANDED_SECTION_PADDING_LEFT = exports.TREE_GROUP_ROW_HEIGHT = exports.TIMELINE_TRACK_EXPANDED_HEIGHT = exports.TIMELINE_ITEM_BORDER_BOTTOM = exports.TIMELINE_BORDER = exports.TIMELINE_PADDING = exports.getFieldsToShow = exports.UNSUPPORTED_FIELD_ROW_HEIGHT = exports.SCHEMA_FIELD_ROW_HEIGHT = void 0;
3
+ exports.getTimelineLayerHeight = exports.TIMELINE_LAYER_HEIGHT_AUDIO = exports.TIMELINE_LAYER_HEIGHT_IMAGE = exports.TIMELINE_LAYER_HEIGHT_VIDEO = exports.getExpandedTrackHeight = exports.getTreeRowHeight = exports.flattenVisibleTreeNodes = exports.buildTimelineTree = exports.EXPANDED_SECTION_PADDING_RIGHT = exports.EXPANDED_SECTION_PADDING_LEFT = exports.TREE_GROUP_ROW_HEIGHT = exports.TIMELINE_TRACK_EXPANDED_HEIGHT = exports.TIMELINE_ITEM_BORDER_BOTTOM = exports.TIMELINE_BORDER = exports.TIMELINE_PADDING = exports.getFieldsToShow = exports.getEffectFieldsToShow = exports.SCHEMA_FIELD_ROW_HEIGHT = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
5
  const studio_shared_2 = require("@remotion/studio-shared");
6
6
  Object.defineProperty(exports, "SCHEMA_FIELD_ROW_HEIGHT", { enumerable: true, get: function () { return studio_shared_2.SCHEMA_FIELD_ROW_HEIGHT; } });
7
- Object.defineProperty(exports, "UNSUPPORTED_FIELD_ROW_HEIGHT", { enumerable: true, get: function () { return studio_shared_2.UNSUPPORTED_FIELD_ROW_HEIGHT; } });
7
+ Object.defineProperty(exports, "getEffectFieldsToShow", { enumerable: true, get: function () { return studio_shared_2.getEffectFieldsToShow; } });
8
8
  Object.defineProperty(exports, "getFieldsToShow", { enumerable: true, get: function () { return studio_shared_2.getFieldsToShow; } });
9
9
  exports.TIMELINE_PADDING = 16;
10
10
  exports.TIMELINE_BORDER = 1;
@@ -13,41 +13,43 @@ exports.TIMELINE_TRACK_EXPANDED_HEIGHT = 100;
13
13
  exports.TREE_GROUP_ROW_HEIGHT = 22;
14
14
  exports.EXPANDED_SECTION_PADDING_LEFT = 28;
15
15
  exports.EXPANDED_SECTION_PADDING_RIGHT = 10;
16
- const getEffectSchemaLabels = (effect) => {
17
- if (!effect.definition.schema) {
18
- return [];
19
- }
20
- return Object.entries(effect.definition.schema).map(([key, fieldSchema]) => ({
21
- key,
22
- description: fieldSchema.description,
23
- }));
24
- };
25
- exports.getEffectSchemaLabels = getEffectSchemaLabels;
26
- const buildTimelineTree = ({ sequence, nodePathInfo, getDragOverrides, getCodeValues, }) => {
16
+ const buildTimelineTree = ({ sequence, nodePathInfo, getDragOverrides, codeValues, }) => {
27
17
  var _a;
28
18
  const roots = [];
29
- const { nodePath, index } = nodePathInfo;
19
+ const { sequenceSubscriptionKey, index, auxiliaryKeys } = nodePathInfo;
30
20
  if (sequence.effects.length > 0) {
31
21
  roots.push({
32
22
  kind: 'group',
33
- nodePathInfo: { nodePath: [...nodePath, 'effects'], index },
23
+ nodePathInfo: {
24
+ sequenceSubscriptionKey,
25
+ auxiliaryKeys: [...auxiliaryKeys, 'effects'],
26
+ index,
27
+ numberOfSequencesWithThisNodePath: 0,
28
+ },
34
29
  label: 'Effects',
35
30
  children: sequence.effects.map((effect, i) => {
36
- const effectNodePath = [...nodePath, 'effects', i];
31
+ const effectFields = (0, studio_shared_1.getEffectFieldsToShow)(effect, i);
37
32
  return {
38
33
  kind: 'group',
39
- nodePathInfo: { nodePath: effectNodePath, index },
40
- label: effect.definition.label,
41
- children: (0, exports.getEffectSchemaLabels)(effect).map((label) => {
34
+ nodePathInfo: {
35
+ sequenceSubscriptionKey,
36
+ auxiliaryKeys: [...auxiliaryKeys, 'effects', i.toString()],
37
+ index,
38
+ numberOfSequencesWithThisNodePath: 0,
39
+ },
40
+ label: effect.label,
41
+ children: effectFields.map((f) => {
42
42
  var _a;
43
43
  return ({
44
44
  kind: 'field',
45
45
  nodePathInfo: {
46
- nodePath: [...effectNodePath, label.key],
46
+ sequenceSubscriptionKey,
47
+ auxiliaryKeys: [...auxiliaryKeys, f.key],
47
48
  index,
49
+ numberOfSequencesWithThisNodePath: 0,
48
50
  },
49
- label: (_a = label.description) !== null && _a !== void 0 ? _a : label.key,
50
- field: null,
51
+ label: (_a = f.description) !== null && _a !== void 0 ? _a : f.key,
52
+ field: f,
51
53
  });
52
54
  }),
53
55
  };
@@ -58,14 +60,19 @@ const buildTimelineTree = ({ sequence, nodePathInfo, getDragOverrides, getCodeVa
58
60
  schema: sequence.controls.schema,
59
61
  currentRuntimeValueDotNotation: sequence.controls.currentRuntimeValueDotNotation,
60
62
  getDragOverrides,
61
- getCodeValues,
62
- nodePath,
63
+ codeValues,
64
+ nodePath: sequenceSubscriptionKey,
63
65
  });
64
66
  if (controlFields && controlFields.length > 0) {
65
67
  for (const f of controlFields) {
66
68
  roots.push({
67
69
  kind: 'field',
68
- nodePathInfo: { nodePath: [...nodePath, 'controls', f.key], index },
70
+ nodePathInfo: {
71
+ sequenceSubscriptionKey,
72
+ auxiliaryKeys: [...auxiliaryKeys, 'controls', f.key],
73
+ index,
74
+ numberOfSequencesWithThisNodePath: 0,
75
+ },
69
76
  label: (_a = f.description) !== null && _a !== void 0 ? _a : f.key,
70
77
  field: f,
71
78
  });
@@ -96,12 +103,13 @@ const getTreeRowHeight = (node) => {
96
103
  return exports.TREE_GROUP_ROW_HEIGHT;
97
104
  };
98
105
  exports.getTreeRowHeight = getTreeRowHeight;
99
- const getExpandedTrackHeight = ({ sequence, nodePathInfo, getIsExpanded, getDragOverrides, getCodeValues, }) => {
106
+ const getExpandedTrackHeight = ({ sequence, nodePathInfo, getIsExpanded, codeValues, }) => {
100
107
  const tree = (0, exports.buildTimelineTree)({
101
108
  sequence,
102
109
  nodePathInfo,
103
- getDragOverrides,
104
- getCodeValues,
110
+ // We assume that no drag overrides can change the timeline layout
111
+ getDragOverrides: () => ({}),
112
+ codeValues,
105
113
  });
106
114
  const flat = (0, exports.flattenVisibleTreeNodes)({ nodes: tree, getIsExpanded });
107
115
  if (flat.length === 0) {
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const EyedropperIcon: React.FC<SVGProps<SVGSVGElement> & {
3
+ color?: string;
4
+ }>;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EyedropperIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const EyedropperIcon = ({ color, ...props }) => (jsx_runtime_1.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 640 640", ...props, children: jsx_runtime_1.jsx("path", { fill: color !== null && color !== void 0 ? color : 'currentColor', d: "M263 233C278.6 248.6 315.3 285.3 373.1 343.1C400.1 370.1 414 384 415 385C424.4 394.4 439.6 394.4 448.9 385C458.2 375.6 458.3 360.4 448.9 351.1L440.9 343.1C457.3 326.7 492.4 291.6 546.1 237.9C565.2 218.8 575.9 192.9 575.9 165.9C575.9 109.7 530.3 64.1 474.1 64.1C447.1 64.1 421.2 74.8 402.1 93.9C348.4 147.6 313.3 182.7 296.9 199.1L288.9 191.1C279.5 181.7 264.3 181.7 255 191.1C245.7 200.5 245.6 215.7 255 225L255 225L263 233zM512.2 203.9L407 309.1L330.9 233L436.1 127.8C446.2 117.7 459.9 112 474.2 112C503.9 112 528 136.1 528 165.8C528 180.1 522.3 193.8 512.2 203.9zM117.1 393C103.6 406.5 96 424.8 96 443.9L96 496.8L68 538.8C61.7 548.3 62.9 561 71 569.1C79.1 577.2 91.8 578.4 101.3 572.1L143.3 544.1L196.2 544.1C215.3 544.1 233.6 536.5 247.1 523L366.1 404L332.2 370.1L213.2 489.1C208.7 493.6 202.6 496.1 196.2 496.1L144.1 496.1L144.1 444C144.1 437.6 146.6 431.5 151.1 427L270.1 308L236.2 274.1L117.2 393.1z" }) }));
6
+ exports.EyedropperIcon = EyedropperIcon;
@@ -2,6 +2,5 @@ export declare const StudioInternals: {
2
2
  Studio: import("react").FC<{
3
3
  readonly rootComponent: import("react").FC<{}>;
4
4
  readonly readOnly: boolean;
5
- readonly visualModeEnabled: boolean;
6
5
  }>;
7
6
  };
@@ -44,5 +44,5 @@ const renderToDOM = (content) => {
44
44
  };
45
45
  renderToDOM(jsx_runtime_1.jsx(NoRegisterRoot_1.NoRegisterRoot, {}));
46
46
  remotion_1.Internals.waitForRoot((NewRoot) => {
47
- renderToDOM(jsx_runtime_1.jsx(Studio_1.Studio, { readOnly: false, rootComponent: NewRoot, visualModeEnabled: Boolean(process.env.EXPERIMENTAL_VISUAL_MODE_ENABLED) }));
47
+ renderToDOM(jsx_runtime_1.jsx(Studio_1.Studio, { readOnly: false, rootComponent: NewRoot }));
48
48
  });
@@ -186,13 +186,13 @@ const renderContent = (Root) => {
186
186
  defaultPixelFormat: bundleMode.compositionDefaultPixelFormat,
187
187
  defaultProResProfile: bundleMode.compositionDefaultProResProfile,
188
188
  defaultSampleRate: bundleMode.compositionDefaultSampleRate,
189
- }, initialCompositions: [], children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_a = window.remotion_logLevel) !== null && _a !== void 0 ? _a : 'info', numberOfAudioTags: 0, audioLatencyHint: (_b = window.remotion_audioLatencyHint) !== null && _b !== void 0 ? _b : 'playback', visualModeEnabled: false, children: jsx_runtime_1.jsxs(remotion_1.Internals.RenderAssetManagerProvider, { collectAssets: null, children: [
189
+ }, initialCompositions: [], children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_a = window.remotion_logLevel) !== null && _a !== void 0 ? _a : 'info', numberOfAudioTags: 0, audioLatencyHint: (_b = window.remotion_audioLatencyHint) !== null && _b !== void 0 ? _b : 'playback', children: jsx_runtime_1.jsxs(remotion_1.Internals.RenderAssetManagerProvider, { collectAssets: null, children: [
190
190
  jsx_runtime_1.jsx(Root, {}), jsx_runtime_1.jsx(GetVideoComposition, { state: bundleMode })
191
191
  ] }) }) }));
192
192
  renderToDOM(markup);
193
193
  }
194
194
  if (bundleMode.type === 'evaluation') {
195
- const markup = (jsx_runtime_1.jsx(remotion_1.Internals.CompositionManagerProvider, { initialCanvasContent: null, onlyRenderComposition: null, currentCompositionMetadata: null, initialCompositions: [], children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_c = window.remotion_logLevel) !== null && _c !== void 0 ? _c : 'info', numberOfAudioTags: 0, audioLatencyHint: (_d = window.remotion_audioLatencyHint) !== null && _d !== void 0 ? _d : 'playback', visualModeEnabled: false, children: jsx_runtime_1.jsx(remotion_1.Internals.RenderAssetManagerProvider, { collectAssets: null, children: jsx_runtime_1.jsx(Root, {}) }) }) }));
195
+ const markup = (jsx_runtime_1.jsx(remotion_1.Internals.CompositionManagerProvider, { initialCanvasContent: null, onlyRenderComposition: null, currentCompositionMetadata: null, initialCompositions: [], children: jsx_runtime_1.jsx(remotion_1.Internals.RemotionRootContexts, { frameState: null, audioEnabled: window.remotion_audioEnabled, videoEnabled: window.remotion_videoEnabled, logLevel: (_c = window.remotion_logLevel) !== null && _c !== void 0 ? _c : 'info', numberOfAudioTags: 0, audioLatencyHint: (_d = window.remotion_audioLatencyHint) !== null && _d !== void 0 ? _d : 'playback', children: jsx_runtime_1.jsx(remotion_1.Internals.RenderAssetManagerProvider, { collectAssets: null, children: jsx_runtime_1.jsx(Root, {}) }) }) }));
196
196
  renderToDOM(markup);
197
197
  }
198
198
  if (bundleMode.type === 'index') {
@@ -204,7 +204,7 @@ const renderContent = (Root) => {
204
204
  window.remotion_isStudio = true;
205
205
  window.remotion_isReadOnlyStudio = true;
206
206
  window.remotion_inputProps = '{}';
207
- renderToDOM(jsx_runtime_1.jsx(StudioInternals.Studio, { readOnly: true, rootComponent: Root, visualModeEnabled: false }));
207
+ renderToDOM(jsx_runtime_1.jsx(StudioInternals.Studio, { readOnly: true, rootComponent: Root }));
208
208
  })
209
209
  .catch((err) => {
210
210
  renderToDOM(jsx_runtime_1.jsxs("div", { children: ["Failed to load Remotion Studio: ", err.message] }));
package/package.json CHANGED
@@ -3,10 +3,9 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio"
4
4
  },
5
5
  "name": "@remotion/studio",
6
- "version": "4.0.460",
6
+ "version": "4.0.462",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
- "sideEffects": false,
10
9
  "scripts": {
11
10
  "lint": "eslint src",
12
11
  "make": "tsgo -d && bun --env-file=../.env.bundle bundle.ts",
@@ -26,25 +25,25 @@
26
25
  },
27
26
  "dependencies": {
28
27
  "semver": "7.5.3",
29
- "remotion": "4.0.460",
30
- "@remotion/player": "4.0.460",
31
- "@remotion/media-utils": "4.0.460",
32
- "@remotion/renderer": "4.0.460",
33
- "@remotion/web-renderer": "4.0.460",
34
- "@remotion/studio-shared": "4.0.460",
35
- "@remotion/timeline-utils": "4.0.460",
36
- "@remotion/zod-types": "4.0.460",
37
- "mediabunny": "1.42.0",
28
+ "remotion": "4.0.462",
29
+ "@remotion/player": "4.0.462",
30
+ "@remotion/media-utils": "4.0.462",
31
+ "@remotion/renderer": "4.0.462",
32
+ "@remotion/web-renderer": "4.0.462",
33
+ "@remotion/studio-shared": "4.0.462",
34
+ "@remotion/timeline-utils": "4.0.462",
35
+ "@remotion/zod-types": "4.0.462",
36
+ "@jridgewell/trace-mapping": "0.3.31",
37
+ "mediabunny": "1.45.0",
38
38
  "memfs": "3.4.3",
39
- "source-map": "0.7.3",
40
- "open": "^8.4.2",
39
+ "open": "8.4.2",
41
40
  "zod": "4.3.6"
42
41
  },
43
42
  "devDependencies": {
44
43
  "react": "19.2.3",
45
44
  "react-dom": "19.2.3",
46
- "@types/semver": "^7.3.4",
47
- "@remotion/eslint-config-internal": "4.0.460",
45
+ "@types/semver": "7.5.3",
46
+ "@remotion/eslint-config-internal": "4.0.462",
48
47
  "eslint": "9.19.0",
49
48
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
50
49
  },
@@ -76,12 +75,6 @@
76
75
  "require": "./dist/previewEntry.js",
77
76
  "module": "./dist/esm/previewEntry.mjs",
78
77
  "import": "./dist/esm/previewEntry.mjs"
79
- },
80
- "./audio-waveform-worker": {
81
- "types": "./dist/audio-waveform-worker.d.ts",
82
- "require": "./dist/audio-waveform-worker.js",
83
- "module": "./dist/esm/audio-waveform-worker.mjs",
84
- "import": "./dist/esm/audio-waveform-worker.mjs"
85
78
  }
86
79
  },
87
80
  "homepage": "https://www.remotion.dev/docs/studio/api",
@@ -95,9 +88,6 @@
95
88
  ],
96
89
  "previewEntry": [
97
90
  "./dist/previewEntry.d.ts"
98
- ],
99
- "audio-waveform-worker": [
100
- "./dist/audio-waveform-worker.d.ts"
101
91
  ]
102
92
  }
103
93
  }
@@ -1 +0,0 @@
1
- export {};
@@ -1,102 +0,0 @@
1
- "use strict";
2
- /// <reference lib="webworker" />
3
- Object.defineProperty(exports, "__esModule", { value: true });
4
- const timeline_utils_1 = require("@remotion/timeline-utils");
5
- const draw_peaks_1 = require("./components/draw-peaks");
6
- const load_waveform_peaks_1 = require("./components/load-waveform-peaks");
7
- const slice_waveform_peaks_1 = require("./components/slice-waveform-peaks");
8
- let canvas = null;
9
- let currentController = null;
10
- let latestRequestId = 0;
11
- const postError = (requestId, error) => {
12
- const message = error instanceof Error ? error.message : 'Failed to render waveform';
13
- const payload = {
14
- type: 'error',
15
- requestId,
16
- message,
17
- };
18
- self.postMessage(payload);
19
- };
20
- const drawPartialWaveform = (message, peaks) => {
21
- if (!canvas) {
22
- return;
23
- }
24
- const portionPeaks = (0, slice_waveform_peaks_1.sliceWaveformPeaks)({
25
- durationInFrames: (0, timeline_utils_1.shouldTileLoopDisplay)(message.loopDisplay)
26
- ? message.loopDisplay.durationInFrames
27
- : message.durationInFrames,
28
- fps: message.fps,
29
- peaks,
30
- playbackRate: message.playbackRate,
31
- startFrom: message.startFrom,
32
- });
33
- if (!(0, timeline_utils_1.shouldTileLoopDisplay)(message.loopDisplay)) {
34
- (0, draw_peaks_1.drawBars)(canvas, portionPeaks, 'rgba(255, 255, 255, 0.6)', message.volume, message.width);
35
- return;
36
- }
37
- const loopWidth = (0, timeline_utils_1.getLoopDisplayWidth)({
38
- visualizationWidth: message.width,
39
- loopDisplay: message.loopDisplay,
40
- });
41
- const targetCanvas = new OffscreenCanvas(Math.max(1, Math.ceil(loopWidth)), message.height);
42
- (0, draw_peaks_1.drawBars)(targetCanvas, portionPeaks, 'rgba(255, 255, 255, 0.6)', message.volume, targetCanvas.width);
43
- const ctx = canvas.getContext('2d');
44
- if (!ctx) {
45
- throw new Error('Failed to get canvas context');
46
- }
47
- const pattern = ctx.createPattern(targetCanvas, 'repeat-x');
48
- if (!pattern) {
49
- return;
50
- }
51
- pattern.setTransform(new DOMMatrix().scaleSelf(loopWidth / targetCanvas.width, 1));
52
- ctx.clearRect(0, 0, message.width, message.height);
53
- ctx.fillStyle = pattern;
54
- ctx.fillRect(0, 0, message.width, message.height);
55
- };
56
- const renderWaveform = async (message) => {
57
- if (!canvas) {
58
- postError(message.requestId, new Error('Waveform canvas not initialized'));
59
- return;
60
- }
61
- const controller = new AbortController();
62
- currentController === null || currentController === void 0 ? void 0 : currentController.abort();
63
- currentController = controller;
64
- latestRequestId = message.requestId;
65
- try {
66
- canvas.width = message.width;
67
- canvas.height = message.height;
68
- const peaks = await (0, load_waveform_peaks_1.loadWaveformPeaks)(message.src, controller.signal, {
69
- onProgress: ({ peaks: nextPeaks }) => {
70
- if (controller.signal.aborted ||
71
- latestRequestId !== message.requestId) {
72
- return;
73
- }
74
- drawPartialWaveform(message, nextPeaks);
75
- },
76
- });
77
- if (controller.signal.aborted || latestRequestId !== message.requestId) {
78
- return;
79
- }
80
- drawPartialWaveform(message, peaks);
81
- }
82
- catch (error) {
83
- if (controller.signal.aborted || latestRequestId !== message.requestId) {
84
- return;
85
- }
86
- postError(message.requestId, error);
87
- }
88
- };
89
- self.addEventListener('message', (event) => {
90
- const message = event.data;
91
- if (message.type === 'init') {
92
- canvas = message.canvas;
93
- return;
94
- }
95
- if (message.type === 'dispose') {
96
- currentController === null || currentController === void 0 ? void 0 : currentController.abort();
97
- currentController = null;
98
- canvas = null;
99
- return;
100
- }
101
- renderWaveform(message);
102
- });
@@ -1,28 +0,0 @@
1
- import type { LoopDisplay } from 'remotion';
2
- export type AudioWaveformWorkerInitMessage = {
3
- readonly type: 'init';
4
- readonly canvas: OffscreenCanvas;
5
- };
6
- export type AudioWaveformWorkerRenderMessage = {
7
- readonly type: 'render';
8
- readonly requestId: number;
9
- readonly src: string;
10
- readonly width: number;
11
- readonly height: number;
12
- readonly volume: number;
13
- readonly startFrom: number;
14
- readonly durationInFrames: number;
15
- readonly fps: number;
16
- readonly playbackRate: number;
17
- readonly loopDisplay: LoopDisplay | undefined;
18
- };
19
- export type AudioWaveformWorkerDisposeMessage = {
20
- readonly type: 'dispose';
21
- };
22
- export type AudioWaveformWorkerIncomingMessage = AudioWaveformWorkerInitMessage | AudioWaveformWorkerRenderMessage | AudioWaveformWorkerDisposeMessage;
23
- export type AudioWaveformWorkerErrorMessage = {
24
- readonly type: 'error';
25
- readonly requestId: number;
26
- readonly message: string;
27
- };
28
- export type AudioWaveformWorkerOutgoingMessage = AudioWaveformWorkerErrorMessage;
@@ -1,2 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
@@ -1 +0,0 @@
1
- export declare const drawBars: (canvas: HTMLCanvasElement | OffscreenCanvas, peaks: Float32Array<ArrayBufferLike>, color: string, volume: number, width: number) => void;
@@ -1,68 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.drawBars = void 0;
4
- const parse_color_1 = require("./parse-color");
5
- const CLIPPING_COLOR = '#FF7F50';
6
- const drawBars = (canvas, peaks, color, volume, width) => {
7
- const ctx = canvas.getContext('2d');
8
- if (!ctx) {
9
- throw new Error('Failed to get canvas context');
10
- }
11
- const { height } = canvas;
12
- const w = canvas.width;
13
- // Skip drawing when the target canvas has not been laid out yet.
14
- // `createImageData(0, h)` / `(w, 0)` throws a DOMException, which
15
- // surfaces in Studio's console for compositions with many audio
16
- // sequences — some segments are 0 px wide at certain zoom levels.
17
- if (w === 0 || height === 0) {
18
- return;
19
- }
20
- ctx.clearRect(0, 0, w, height);
21
- if (volume === 0)
22
- return;
23
- const [r, g, b, a] = (0, parse_color_1.parseColor)(color);
24
- const [cr, cg, cb, ca] = (0, parse_color_1.parseColor)(CLIPPING_COLOR);
25
- const imageData = ctx.createImageData(w, height);
26
- const { data } = imageData;
27
- const numBars = width;
28
- for (let barIndex = 0; barIndex < numBars; barIndex++) {
29
- const x = barIndex;
30
- if (x >= w)
31
- break;
32
- const peakIndex = Math.floor((barIndex / numBars) * peaks.length);
33
- const peak = peaks[peakIndex] || 0;
34
- const scaledPeak = peak * volume;
35
- const halfBar = Math.max(0, Math.min(height / 2, (scaledPeak * height) / 2));
36
- if (halfBar === 0)
37
- continue;
38
- const mid = height / 2;
39
- const barY = Math.round(mid - halfBar);
40
- const barEnd = Math.round(mid + halfBar);
41
- const isClipping = scaledPeak > 1;
42
- const clipTopEnd = isClipping ? Math.min(barY + 2, barEnd) : barY;
43
- const clipBotStart = isClipping ? Math.max(barEnd - 2, barY) : barEnd;
44
- for (let y = barY; y < clipTopEnd; y++) {
45
- const idx = (y * w + x) * 4;
46
- data[idx] = cr;
47
- data[idx + 1] = cg;
48
- data[idx + 2] = cb;
49
- data[idx + 3] = ca;
50
- }
51
- for (let y = clipTopEnd; y < clipBotStart; y++) {
52
- const idx = (y * w + x) * 4;
53
- data[idx] = r;
54
- data[idx + 1] = g;
55
- data[idx + 2] = b;
56
- data[idx + 3] = a;
57
- }
58
- for (let y = clipBotStart; y < barEnd; y++) {
59
- const idx = (y * w + x) * 4;
60
- data[idx] = cr;
61
- data[idx + 1] = cg;
62
- data[idx + 2] = cb;
63
- data[idx + 3] = ca;
64
- }
65
- }
66
- ctx.putImageData(imageData, 0, 0);
67
- };
68
- exports.drawBars = drawBars;
@@ -1,13 +0,0 @@
1
- declare const TARGET_SAMPLE_RATE = 100;
2
- export { TARGET_SAMPLE_RATE };
3
- type Progress = {
4
- readonly peaks: Float32Array;
5
- readonly completedPeaks: number;
6
- readonly totalPeaks: number;
7
- readonly final: boolean;
8
- };
9
- type LoadWaveformPeaksOptions = {
10
- readonly onProgress?: (progress: Progress) => void;
11
- readonly progressIntervalInMs?: number;
12
- };
13
- export declare function loadWaveformPeaks(url: string, signal: AbortSignal, options?: LoadWaveformPeaksOptions): Promise<Float32Array>;