@remotion/studio 4.0.477 → 4.0.479

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 (191) hide show
  1. package/dist/components/AssetSelector.js +8 -14
  2. package/dist/components/Button.d.ts +1 -0
  3. package/dist/components/Button.js +8 -5
  4. package/dist/components/CanvasIfSizeIsAvailable.js +2 -6
  5. package/dist/components/CompactExplanation.d.ts +12 -0
  6. package/dist/components/CompactExplanation.js +52 -0
  7. package/dist/components/CompositionSelector.js +2 -4
  8. package/dist/components/CurrentAsset.d.ts +3 -1
  9. package/dist/components/CurrentAsset.js +42 -34
  10. package/dist/components/CurrentComposition.d.ts +1 -1
  11. package/dist/components/CurrentComposition.js +38 -31
  12. package/dist/components/DefaultPropsEditor.d.ts +12 -2
  13. package/dist/components/DefaultPropsEditor.js +2 -2
  14. package/dist/components/EditorGuides/Guide.js +37 -9
  15. package/dist/components/EditorRuler/Ruler.js +4 -14
  16. package/dist/components/EditorRuler/index.js +9 -4
  17. package/dist/components/EffectPickerModal.d.ts +5 -0
  18. package/dist/components/EffectPickerModal.js +179 -0
  19. package/dist/components/InlineAction.js +1 -0
  20. package/dist/components/InspectorInfoHeader.d.ts +11 -0
  21. package/dist/components/InspectorInfoHeader.js +55 -0
  22. package/dist/components/InspectorPanel/DefaultInspector.d.ts +8 -0
  23. package/dist/components/InspectorPanel/DefaultInspector.js +93 -0
  24. package/dist/components/InspectorPanel/EasingInspector.d.ts +5 -0
  25. package/dist/components/InspectorPanel/EasingInspector.js +41 -0
  26. package/dist/components/InspectorPanel/GuideInspector.d.ts +7 -0
  27. package/dist/components/InspectorPanel/GuideInspector.js +55 -0
  28. package/dist/components/InspectorPanel/KeyframeInspector.d.ts +7 -0
  29. package/dist/components/InspectorPanel/KeyframeInspector.js +109 -0
  30. package/dist/components/InspectorPanel/SelectedInspector.d.ts +5 -0
  31. package/dist/components/InspectorPanel/SelectedInspector.js +26 -0
  32. package/dist/components/InspectorPanel/SequenceSelectionInspector.d.ts +5 -0
  33. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +116 -0
  34. package/dist/components/InspectorPanel/common.d.ts +15 -0
  35. package/dist/components/InspectorPanel/common.js +18 -0
  36. package/dist/components/InspectorPanel/inspector-selection.d.ts +10 -0
  37. package/dist/components/InspectorPanel/inspector-selection.js +34 -0
  38. package/dist/components/InspectorPanel/styles.d.ts +27 -0
  39. package/dist/components/InspectorPanel/styles.js +178 -0
  40. package/dist/components/InspectorPanel/use-track-for-selection.d.ts +2 -0
  41. package/dist/components/InspectorPanel/use-track-for-selection.js +22 -0
  42. package/dist/components/InspectorPanel.d.ts +8 -0
  43. package/dist/components/InspectorPanel.js +26 -0
  44. package/dist/components/InspectorPanelLayout.d.ts +1 -0
  45. package/dist/components/InspectorPanelLayout.js +4 -0
  46. package/dist/components/InspectorSequenceSection.d.ts +16 -0
  47. package/dist/components/InspectorSequenceSection.js +147 -0
  48. package/dist/components/InspectorSourceLocation.d.ts +7 -0
  49. package/dist/components/InspectorSourceLocation.js +71 -0
  50. package/dist/components/MenuToolbar.d.ts +1 -0
  51. package/dist/components/MenuToolbar.js +4 -1
  52. package/dist/components/Modals.js +3 -3
  53. package/dist/components/NewComposition/InputDragger.js +1 -1
  54. package/dist/components/NewComposition/RemInput.d.ts +1 -0
  55. package/dist/components/NewComposition/RemInput.js +8 -2
  56. package/dist/components/NewComposition/RemTextarea.d.ts +1 -0
  57. package/dist/components/NewComposition/RemTextarea.js +8 -2
  58. package/dist/components/NewComposition/ValidationMessage.d.ts +3 -0
  59. package/dist/components/NewComposition/ValidationMessage.js +16 -5
  60. package/dist/components/OptionsPanel.d.ts +1 -1
  61. package/dist/components/OptionsPanel.js +8 -17
  62. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +2 -7
  63. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +3 -10
  64. package/dist/components/QuickSwitcher/shared.d.ts +4 -0
  65. package/dist/components/QuickSwitcher/shared.js +24 -0
  66. package/dist/components/RenderModal/DataEditor.d.ts +29 -2
  67. package/dist/components/RenderModal/DataEditor.js +107 -56
  68. package/dist/components/RenderModal/RenderModalJSONPropsEditor.d.ts +1 -0
  69. package/dist/components/RenderModal/RenderModalJSONPropsEditor.js +25 -7
  70. package/dist/components/RenderModal/SchemaEditor/Fieldset.d.ts +2 -1
  71. package/dist/components/RenderModal/SchemaEditor/Fieldset.js +10 -5
  72. package/dist/components/RenderModal/SchemaEditor/SchemaEditor.d.ts +4 -0
  73. package/dist/components/RenderModal/SchemaEditor/SchemaEditor.js +27 -4
  74. package/dist/components/RenderModal/SchemaEditor/SchemaErrorMessages.d.ts +12 -4
  75. package/dist/components/RenderModal/SchemaEditor/SchemaErrorMessages.js +23 -9
  76. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +3 -3
  77. package/dist/components/RenderModal/SchemaEditor/SchemaSeparationLine.js +8 -1
  78. package/dist/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  79. package/dist/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  80. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +1 -1
  81. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  82. package/dist/components/RenderModal/SchemaEditor/ZodErrorMessages.d.ts +1 -0
  83. package/dist/components/RenderModal/SchemaEditor/ZodErrorMessages.js +23 -6
  84. package/dist/components/RenderModal/SchemaEditor/ZodFieldValidation.js +2 -2
  85. package/dist/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +2 -1
  86. package/dist/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  87. package/dist/components/RenderModal/SchemaEditor/ZodObjectEditor.js +9 -11
  88. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +1 -1
  89. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  90. package/dist/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  91. package/dist/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  92. package/dist/components/RenderModal/WarningIndicatorButton.d.ts +1 -0
  93. package/dist/components/RenderModal/WarningIndicatorButton.js +17 -4
  94. package/dist/components/RenderModal/get-render-modal-warnings.d.ts +2 -1
  95. package/dist/components/RenderModal/get-render-modal-warnings.js +6 -3
  96. package/dist/components/RendersTab.js +1 -1
  97. package/dist/components/SegmentedControl.d.ts +3 -0
  98. package/dist/components/SegmentedControl.js +11 -5
  99. package/dist/components/SelectedOutlineElement.js +135 -31
  100. package/dist/components/SelectedOutlineOverlay.d.ts +1 -1
  101. package/dist/components/SelectedOutlineOverlay.js +45 -29
  102. package/dist/components/SelectedOutlineUvControls.d.ts +9 -0
  103. package/dist/components/SelectedOutlineUvControls.js +64 -10
  104. package/dist/components/Tabs/index.js +4 -4
  105. package/dist/components/Timeline/EasingEditorModal.d.ts +5 -4
  106. package/dist/components/Timeline/EasingEditorModal.js +597 -124
  107. package/dist/components/Timeline/KeyframeSettingsModal.d.ts +2 -2
  108. package/dist/components/Timeline/SubscribeToNodePaths.d.ts +2 -2
  109. package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +15 -3
  110. package/dist/components/Timeline/TimelineClipboardKeybindings.js +85 -1
  111. package/dist/components/Timeline/TimelineDeleteKeybindings.js +10 -3
  112. package/dist/components/Timeline/TimelineEffectItem.d.ts +2 -2
  113. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +8 -0
  114. package/dist/components/Timeline/TimelineEffectPropItem.js +24 -20
  115. package/dist/components/Timeline/TimelineExpandedRow.d.ts +5 -2
  116. package/dist/components/Timeline/TimelineExpandedRow.js +4 -4
  117. package/dist/components/Timeline/TimelineExpandedSection.d.ts +1 -1
  118. package/dist/components/Timeline/TimelineExpandedSection.js +5 -19
  119. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +8 -2
  120. package/dist/components/Timeline/TimelineKeyframeControls.js +24 -3
  121. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +2 -47
  122. package/dist/components/Timeline/TimelineKeyframedValue.d.ts +1 -1
  123. package/dist/components/Timeline/TimelineKeyframedValue.js +8 -10
  124. package/dist/components/Timeline/TimelineNumberField.js +5 -11
  125. package/dist/components/Timeline/TimelineRotationField.js +5 -6
  126. package/dist/components/Timeline/TimelineScaleField.js +4 -8
  127. package/dist/components/Timeline/TimelineSelection.d.ts +6 -0
  128. package/dist/components/Timeline/TimelineSelection.js +109 -14
  129. package/dist/components/Timeline/TimelineSequence.js +22 -14
  130. package/dist/components/Timeline/TimelineSequenceItem.js +12 -67
  131. package/dist/components/Timeline/TimelineSequencePropItem.d.ts +12 -2
  132. package/dist/components/Timeline/TimelineSequencePropItem.js +56 -52
  133. package/dist/components/Timeline/TimelineTransformOriginField.js +4 -5
  134. package/dist/components/Timeline/TimelineTranslateField.js +4 -5
  135. package/dist/components/Timeline/TimelineUvCoordinateField.js +4 -4
  136. package/dist/components/Timeline/TimelineVideoInfo.d.ts +1 -0
  137. package/dist/components/Timeline/TimelineVideoInfo.js +93 -8
  138. package/dist/components/Timeline/call-add-keyframe.d.ts +4 -4
  139. package/dist/components/Timeline/call-delete-keyframe.d.ts +4 -4
  140. package/dist/components/Timeline/call-move-keyframe.d.ts +2 -2
  141. package/dist/components/Timeline/call-update-keyframe-settings.d.ts +3 -3
  142. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +2 -1
  143. package/dist/components/Timeline/delete-selected-timeline-item.js +27 -1
  144. package/dist/components/Timeline/duplicate-selected-timeline-item.d.ts +7 -0
  145. package/dist/components/Timeline/duplicate-selected-timeline-item.js +32 -3
  146. package/dist/components/Timeline/parse-keyframe-field-from-node-path.js +2 -2
  147. package/dist/components/Timeline/reset-selected-timeline-props.d.ts +3 -3
  148. package/dist/components/Timeline/reset-selected-timeline-props.js +19 -5
  149. package/dist/components/Timeline/save-effect-prop.d.ts +2 -2
  150. package/dist/components/Timeline/save-sequence-prop.d.ts +2 -2
  151. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +3 -3
  152. package/dist/components/Timeline/timeline-field-display-utils.d.ts +5 -0
  153. package/dist/components/Timeline/timeline-field-display-utils.js +244 -0
  154. package/dist/components/Timeline/timeline-video-filmstrip-times.d.ts +17 -0
  155. package/dist/components/Timeline/timeline-video-filmstrip-times.js +22 -0
  156. package/dist/components/Timeline/update-selected-easing.d.ts +47 -4
  157. package/dist/components/Timeline/update-selected-easing.js +40 -9
  158. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.d.ts +13 -0
  159. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +73 -0
  160. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -3
  161. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +11 -0
  162. package/dist/components/Timeline/use-timeline-expanded-tree.js +33 -0
  163. package/dist/components/VisualControls/VisualControlsContent.d.ts +1 -1
  164. package/dist/components/VisualControls/VisualControlsContent.js +4 -5
  165. package/dist/components/effect-drag-and-drop.d.ts +10 -0
  166. package/dist/components/effect-drag-and-drop.js +17 -8
  167. package/dist/components/effect-picker-search.d.ts +5 -0
  168. package/dist/components/effect-picker-search.js +77 -0
  169. package/dist/components/import-assets.d.ts +11 -2
  170. package/dist/components/import-assets.js +61 -6
  171. package/dist/components/selected-outline-drag.d.ts +44 -2
  172. package/dist/components/selected-outline-drag.js +74 -1
  173. package/dist/components/selected-outline-types.d.ts +7 -7
  174. package/dist/components/selected-outline-uv.d.ts +4 -3
  175. package/dist/components/selected-outline-uv.js +6 -2
  176. package/dist/error-overlay/remotion-overlay/Overlay.js +3 -0
  177. package/dist/esm/{chunk-t8fjnw2d.js → chunk-fge2mq5p.js} +17004 -13432
  178. package/dist/esm/internals.mjs +17004 -13432
  179. package/dist/esm/previewEntry.mjs +26617 -23041
  180. package/dist/esm/renderEntry.mjs +1 -1
  181. package/dist/helpers/editor-guide-selection.js +1 -1
  182. package/dist/helpers/get-preview-file-type.js +1 -1
  183. package/dist/helpers/render-codec-label.d.ts +2 -0
  184. package/dist/helpers/render-codec-label.js +49 -0
  185. package/dist/helpers/ruler-canvas-size.d.ts +5 -0
  186. package/dist/helpers/ruler-canvas-size.js +17 -0
  187. package/dist/helpers/timeline-layout.d.ts +4 -4
  188. package/dist/helpers/use-media-metadata.d.ts +8 -2
  189. package/dist/helpers/use-media-metadata.js +17 -4
  190. package/dist/state/modals.d.ts +9 -4
  191. package/package.json +12 -12
@@ -1,6 +1,7 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.updateSelectedTimelineEasings = exports.getTimelineEasingValueForSelection = exports.getEasingSelections = void 0;
3
+ exports.updateSelectedTimelineEasings = exports.getTimelineEasingValueForSelection = exports.getEasingSelections = exports.makeEasingDragOverride = exports.getSelectedEasingUpdates = exports.getSelectedEasingUpdate = void 0;
4
+ const studio_shared_1 = require("@remotion/studio-shared");
4
5
  const remotion_1 = require("remotion");
5
6
  const call_update_keyframe_settings_1 = require("./call-update-keyframe-settings");
6
7
  const find_track_for_node_path_info_1 = require("./find-track-for-node-path-info");
@@ -42,7 +43,8 @@ const getSelectedEasingUpdate = ({ selection, sequences, overrideIdsToNodePaths,
42
43
  fieldKey: field.fieldKey,
43
44
  schema: sequence.controls.schema,
44
45
  segmentIndex: selection.segmentIndex,
45
- currentEasing: (_c = sequencePropStatus.easing[selection.segmentIndex]) !== null && _c !== void 0 ? _c : 'linear',
46
+ currentEasing: (_c = sequencePropStatus.easing[selection.segmentIndex]) !== null && _c !== void 0 ? _c : studio_shared_1.LINEAR_KEYFRAME_EASING,
47
+ propStatus: sequencePropStatus,
46
48
  };
47
49
  }
48
50
  const effect = sequence.effects[field.effectIndex];
@@ -69,15 +71,46 @@ const getSelectedEasingUpdate = ({ selection, sequences, overrideIdsToNodePaths,
69
71
  fieldKey: field.fieldKey,
70
72
  schema: effect.schema,
71
73
  segmentIndex: selection.segmentIndex,
72
- currentEasing: (_d = effectPropStatus.easing[selection.segmentIndex]) !== null && _d !== void 0 ? _d : 'linear',
74
+ currentEasing: (_d = effectPropStatus.easing[selection.segmentIndex]) !== null && _d !== void 0 ? _d : studio_shared_1.LINEAR_KEYFRAME_EASING,
75
+ propStatus: effectPropStatus,
73
76
  };
74
77
  };
78
+ exports.getSelectedEasingUpdate = getSelectedEasingUpdate;
79
+ const getSelectedEasingUpdates = ({ selections, sequences, overrideIdsToNodePaths, propStatuses, }) => {
80
+ return (0, exports.getEasingSelections)(selections)
81
+ .map((selection) => (0, exports.getSelectedEasingUpdate)({
82
+ selection,
83
+ sequences,
84
+ overrideIdsToNodePaths,
85
+ propStatuses,
86
+ }))
87
+ .filter((update) => update !== null);
88
+ };
89
+ exports.getSelectedEasingUpdates = getSelectedEasingUpdates;
90
+ const makeEasingDragOverride = ({ status, segmentIndex, easing, }) => {
91
+ const nextEasing = [...status.easing];
92
+ while (nextEasing.length < status.keyframes.length - 1) {
93
+ nextEasing.push(studio_shared_1.LINEAR_KEYFRAME_EASING);
94
+ }
95
+ if (nextEasing.length > status.keyframes.length - 1) {
96
+ nextEasing.length = status.keyframes.length - 1;
97
+ }
98
+ nextEasing[segmentIndex] = easing;
99
+ return {
100
+ type: 'keyframed',
101
+ status: {
102
+ ...status,
103
+ easing: nextEasing,
104
+ },
105
+ };
106
+ };
107
+ exports.makeEasingDragOverride = makeEasingDragOverride;
75
108
  const getEasingSelections = (selections) => selections.filter(isEasingSelection);
76
109
  exports.getEasingSelections = getEasingSelections;
77
110
  const getTimelineEasingValueForSelection = ({ selection, sequences, overrideIdsToNodePaths, propStatuses, }) => {
78
111
  var _a;
79
112
  var _b;
80
- return ((_b = (_a = getSelectedEasingUpdate({
113
+ return ((_b = (_a = (0, exports.getSelectedEasingUpdate)({
81
114
  selection,
82
115
  sequences,
83
116
  overrideIdsToNodePaths,
@@ -90,14 +123,12 @@ const updateSelectedTimelineEasings = ({ selections, sequences, overrideIdsToNod
90
123
  if (easingSelections.length === 0) {
91
124
  return null;
92
125
  }
93
- const updates = easingSelections
94
- .map((selection) => getSelectedEasingUpdate({
95
- selection,
126
+ const updates = (0, exports.getSelectedEasingUpdates)({
127
+ selections: easingSelections,
96
128
  sequences,
97
129
  overrideIdsToNodePaths,
98
130
  propStatuses,
99
- }))
100
- .filter((update) => update !== null);
131
+ });
101
132
  if (updates.length === 0) {
102
133
  return null;
103
134
  }
@@ -0,0 +1,13 @@
1
+ import type { CanUpdateSequencePropStatus, SequencePropsSubscriptionKey, TSequence } from 'remotion';
2
+ import type { ComboboxValue } from '../NewComposition/ComboBox';
3
+ import { type SetPropStatuses } from './save-sequence-prop';
4
+ export declare const useSequenceFreezeFrameMenuItem: ({ clientId, nodePath, propStatusesForOverride, sequence, sequenceFrameOffset, setPropStatuses, timelinePosition, validatedSource, }: {
5
+ readonly clientId: string | null;
6
+ readonly nodePath: SequencePropsSubscriptionKey | null;
7
+ readonly propStatusesForOverride: Record<string, CanUpdateSequencePropStatus> | undefined;
8
+ readonly sequence: TSequence;
9
+ readonly sequenceFrameOffset: number;
10
+ readonly setPropStatuses: SetPropStatuses;
11
+ readonly timelinePosition: number;
12
+ readonly validatedSource: string | null;
13
+ }) => ComboboxValue;
@@ -0,0 +1,73 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useSequenceFreezeFrameMenuItem = void 0;
4
+ const react_1 = require("react");
5
+ const save_sequence_prop_1 = require("./save-sequence-prop");
6
+ const useSequenceFreezeFrameMenuItem = ({ clientId, nodePath, propStatusesForOverride, sequence, sequenceFrameOffset, setPropStatuses, timelinePosition, validatedSource, }) => {
7
+ const freezeStatus = propStatusesForOverride === null || propStatusesForOverride === void 0 ? void 0 : propStatusesForOverride.freeze;
8
+ const isFrozen = (freezeStatus === null || freezeStatus === void 0 ? void 0 : freezeStatus.status) === 'static' &&
9
+ typeof freezeStatus.codeValue === 'number';
10
+ const canToggleFreeze = clientId !== null &&
11
+ Boolean(sequence.controls) &&
12
+ nodePath !== null &&
13
+ validatedSource !== null &&
14
+ freezeStatus !== undefined &&
15
+ freezeStatus !== null &&
16
+ freezeStatus.status === 'static';
17
+ const onToggleFreezeFrame = (0, react_1.useCallback)(() => {
18
+ if (!canToggleFreeze ||
19
+ !sequence.controls ||
20
+ nodePath === null ||
21
+ validatedSource === null ||
22
+ clientId === null) {
23
+ return;
24
+ }
25
+ const rawFreezeFrame = Math.round(timelinePosition - sequence.from + sequenceFrameOffset);
26
+ const maxFrame = Number.isFinite(sequence.duration)
27
+ ? Math.max(0, sequence.duration - 1)
28
+ : rawFreezeFrame;
29
+ const freezeFrame = Math.min(Math.max(0, rawFreezeFrame), maxFrame);
30
+ const remove = isFrozen;
31
+ (0, save_sequence_prop_1.saveSequenceProps)({
32
+ changes: [
33
+ {
34
+ fileName: validatedSource,
35
+ nodePath,
36
+ fieldKey: 'freeze',
37
+ value: remove ? null : freezeFrame,
38
+ defaultValue: null,
39
+ schema: sequence.controls.schema,
40
+ },
41
+ ],
42
+ setPropStatuses,
43
+ clientId,
44
+ undoLabel: remove ? 'Unfreeze sequence' : 'Freeze sequence',
45
+ redoLabel: remove ? 'Freeze sequence again' : 'Unfreeze sequence again',
46
+ });
47
+ }, [
48
+ canToggleFreeze,
49
+ clientId,
50
+ isFrozen,
51
+ nodePath,
52
+ sequence.controls,
53
+ sequence.duration,
54
+ sequence.from,
55
+ sequenceFrameOffset,
56
+ setPropStatuses,
57
+ timelinePosition,
58
+ validatedSource,
59
+ ]);
60
+ return (0, react_1.useMemo)(() => ({
61
+ type: 'item',
62
+ id: 'toggle-freeze-frame',
63
+ keyHint: null,
64
+ label: isFrozen ? 'Unfreeze frame' : 'Freeze frame',
65
+ leftItem: null,
66
+ disabled: !canToggleFreeze,
67
+ onClick: onToggleFreezeFrame,
68
+ quickSwitcherLabel: null,
69
+ subMenu: null,
70
+ value: 'toggle-freeze-frame',
71
+ }), [canToggleFreeze, isFrozen, onToggleFreezeFrame]);
72
+ };
73
+ exports.useSequenceFreezeFrameMenuItem = useSequenceFreezeFrameMenuItem;
@@ -1,9 +1,9 @@
1
- import type { SequenceSchema } from 'remotion';
1
+ import type { InteractivitySchema } from 'remotion';
2
2
  import type { OriginalPosition } from '../../error-overlay/react-overlay/utils/get-source-map';
3
3
  export declare const useSequencePropsSubscription: ({ originalLocation, overrideId, componentIdentity, schema, effects, }: {
4
4
  overrideId: string;
5
5
  componentIdentity: string | null;
6
- schema: SequenceSchema;
7
- effects: SequenceSchema[];
6
+ schema: InteractivitySchema;
7
+ effects: InteractivitySchema[];
8
8
  originalLocation: OriginalPosition | null;
9
9
  }) => void;
@@ -0,0 +1,11 @@
1
+ import { type TSequence } from 'remotion';
2
+ import type { SequenceNodePathInfo } from '../../helpers/get-timeline-sequence-sort-key';
3
+ export declare const useTimelineExpandedTree: ({ sequence, nodePathInfo, }: {
4
+ readonly sequence: TSequence;
5
+ readonly nodePathInfo: SequenceNodePathInfo;
6
+ }) => {
7
+ getIsExpanded: import("../ExpandedTracksProvider").GetIsExpanded;
8
+ propStatuses: import("remotion").PropStatuses;
9
+ toggleTrack: (nodePathInfo: SequenceNodePathInfo) => void;
10
+ tree: import("../../helpers/timeline-layout").TimelineTreeNode[];
11
+ };
@@ -0,0 +1,33 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useTimelineExpandedTree = void 0;
4
+ const react_1 = require("react");
5
+ const remotion_1 = require("remotion");
6
+ const timeline_layout_1 = require("../../helpers/timeline-layout");
7
+ const ExpandedTracksProvider_1 = require("../ExpandedTracksProvider");
8
+ const useTimelineExpandedTree = ({ sequence, nodePathInfo, }) => {
9
+ const { getIsExpanded } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksGetterContext);
10
+ const { toggleTrack } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksSetterContext);
11
+ const { propStatuses: visualModePropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
12
+ const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
13
+ const tree = (0, react_1.useMemo)(() => (0, timeline_layout_1.buildTimelineTree)({
14
+ sequence,
15
+ nodePathInfo,
16
+ getDragOverrides,
17
+ getEffectDragOverrides,
18
+ propStatuses: visualModePropStatuses,
19
+ }), [
20
+ sequence,
21
+ nodePathInfo,
22
+ getDragOverrides,
23
+ getEffectDragOverrides,
24
+ visualModePropStatuses,
25
+ ]);
26
+ return {
27
+ getIsExpanded,
28
+ propStatuses: visualModePropStatuses,
29
+ toggleTrack,
30
+ tree,
31
+ };
32
+ };
33
+ exports.useTimelineExpandedTree = useTimelineExpandedTree;
@@ -1 +1 @@
1
- export declare const VisualControlsContent: () => import("react/jsx-runtime").JSX.Element;
1
+ export declare const VisualControlsContent: () => import("react/jsx-runtime").JSX.Element | null;
@@ -37,16 +37,15 @@ exports.VisualControlsContent = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const VisualControls_1 = require("../../visual-controls/VisualControls");
40
- const is_menu_item_1 = require("../Menu/is-menu-item");
41
40
  const SchemaSeparationLine_1 = require("../RenderModal/SchemaEditor/SchemaSeparationLine");
42
41
  const VisualControlHandle_1 = require("./VisualControlHandle");
43
- const container = {
44
- overflowY: 'auto',
45
- };
46
42
  const VisualControlsContent = () => {
47
43
  const { handles } = (0, react_1.useContext)(VisualControls_1.VisualControlsContext);
48
44
  const entries = Object.entries(handles);
49
- return (jsx_runtime_1.jsx("div", { style: container, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: entries.map(([key, value], i) => {
45
+ if (entries.length === 0) {
46
+ return null;
47
+ }
48
+ return (jsx_runtime_1.jsx("div", { children: entries.map(([key, value], i) => {
50
49
  return (jsx_runtime_1.jsxs(react_1.default.Fragment, { children: [
51
50
  jsx_runtime_1.jsx(VisualControlHandle_1.VisualControlHandle, { keyName: key, value: value }), i === entries.length - 1 ? null : jsx_runtime_1.jsx(SchemaSeparationLine_1.SchemaSeparationLine, {})] }, key));
52
51
  }) }));
@@ -9,3 +9,13 @@ export declare const addEffectFromDragData: ({ clientId, dragData, fileName, nod
9
9
  readonly fileName: string;
10
10
  readonly nodePath: SequencePropsSubscriptionKey;
11
11
  }) => Promise<void>;
12
+ export declare const addEffectToSequence: ({ clientId, effect, fileName, nodePath, }: {
13
+ readonly clientId: string;
14
+ readonly effect: {
15
+ name: string;
16
+ importPath: string;
17
+ config: Record<string, unknown>;
18
+ };
19
+ readonly fileName: string;
20
+ readonly nodePath: SequencePropsSubscriptionKey;
21
+ }) => Promise<void>;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.addEffectFromDragData = exports.getEffectDragData = exports.hasExplicitEffectDragType = exports.hasEffectDragType = void 0;
3
+ exports.addEffectToSequence = exports.addEffectFromDragData = exports.getEffectDragData = exports.hasExplicitEffectDragType = exports.hasEffectDragType = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
5
  const install_required_package_1 = require("../helpers/install-required-package");
6
6
  const call_api_1 = require("./call-api");
@@ -47,20 +47,29 @@ const getEffectDragData = (dataTransfer) => {
47
47
  return null;
48
48
  };
49
49
  exports.getEffectDragData = getEffectDragData;
50
- const addEffectFromDragData = async ({ clientId, dragData, fileName, nodePath, }) => {
50
+ const addEffectFromDragData = ({ clientId, dragData, fileName, nodePath, }) => {
51
+ return (0, exports.addEffectToSequence)({
52
+ clientId,
53
+ effect: dragData.effect,
54
+ fileName,
55
+ nodePath,
56
+ });
57
+ };
58
+ exports.addEffectFromDragData = addEffectFromDragData;
59
+ const addEffectToSequence = async ({ clientId, effect, fileName, nodePath, }) => {
51
60
  try {
52
- const requiredPackage = (0, studio_shared_1.getRequiredPackageForEffectImportPath)(dragData.effect.importPath);
61
+ const requiredPackage = (0, studio_shared_1.getRequiredPackageForEffectImportPath)(effect.importPath);
53
62
  await (0, install_required_package_1.installRequiredPackages)(requiredPackage ? [requiredPackage] : []);
54
63
  const result = await (0, call_api_1.callApi)('/api/add-effect', {
55
64
  fileName,
56
65
  sequenceNodePath: nodePath,
57
- effectName: dragData.effect.name,
58
- effectImportPath: dragData.effect.importPath,
59
- effectConfig: dragData.effect.config,
66
+ effectName: effect.name,
67
+ effectImportPath: effect.importPath,
68
+ effectConfig: effect.config,
60
69
  clientId,
61
70
  });
62
71
  if (result.success) {
63
- (0, NotificationCenter_1.showNotification)(`Added ${dragData.effect.name}()`, 2000);
72
+ (0, NotificationCenter_1.showNotification)(`Added ${effect.name}()`, 2000);
64
73
  }
65
74
  else {
66
75
  (0, NotificationCenter_1.showNotification)(result.reason, 4000);
@@ -70,4 +79,4 @@ const addEffectFromDragData = async ({ clientId, dragData, fileName, nodePath, }
70
79
  (0, NotificationCenter_1.showNotification)(err.message, 4000);
71
80
  }
72
81
  };
73
- exports.addEffectFromDragData = addEffectFromDragData;
82
+ exports.addEffectToSequence = addEffectToSequence;
@@ -0,0 +1,5 @@
1
+ import type { EffectCatalogItem } from '@remotion/studio-shared';
2
+ export declare const filterEffectCatalog: ({ items, query, }: {
3
+ readonly items: readonly EffectCatalogItem[];
4
+ readonly query: string;
5
+ }) => EffectCatalogItem[];
@@ -0,0 +1,77 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.filterEffectCatalog = void 0;
4
+ const normalize = (value) => value.trim().toLowerCase();
5
+ const compact = (value) => normalize(value).replace(/[^a-z0-9]/g, '');
6
+ const fuzzyMatches = (query, value) => {
7
+ let index = -1;
8
+ for (const character of query) {
9
+ index = value.indexOf(character, index + 1);
10
+ if (index === -1) {
11
+ return false;
12
+ }
13
+ }
14
+ return true;
15
+ };
16
+ const getMatchScore = (item, query) => {
17
+ const normalizedQuery = normalize(query);
18
+ const compactQuery = compact(query);
19
+ if (normalizedQuery.length === 0) {
20
+ return 0;
21
+ }
22
+ const label = normalize(item.label);
23
+ const name = normalize(item.effect.name);
24
+ const primary = [label, name];
25
+ const compactPrimary = primary.map(compact);
26
+ if (primary.some((field) => field === normalizedQuery)) {
27
+ return 0;
28
+ }
29
+ if (compactQuery.length > 0) {
30
+ if (compactPrimary.some((field) => field === compactQuery)) {
31
+ return 1;
32
+ }
33
+ if (compactPrimary.some((field) => field.startsWith(compactQuery))) {
34
+ return 2;
35
+ }
36
+ }
37
+ if (primary.some((field) => field.startsWith(normalizedQuery))) {
38
+ return 2;
39
+ }
40
+ if (compactQuery.length > 0) {
41
+ if (compactPrimary.some((field) => field.includes(compactQuery))) {
42
+ return 3;
43
+ }
44
+ }
45
+ if (primary.some((field) => field.includes(normalizedQuery))) {
46
+ return 3;
47
+ }
48
+ const importPath = normalize(item.effect.importPath);
49
+ if (importPath.includes(normalizedQuery) ||
50
+ (compactQuery.length > 0 && compact(importPath).includes(compactQuery))) {
51
+ return 4;
52
+ }
53
+ const secondary = [normalize(item.category), normalize(item.description)];
54
+ const compactSecondary = secondary.map(compact);
55
+ if (secondary.some((field) => field.includes(normalizedQuery)) ||
56
+ (compactQuery.length > 0 &&
57
+ compactSecondary.some((field) => field.includes(compactQuery)))) {
58
+ return 5;
59
+ }
60
+ if (compactQuery.length > 0 &&
61
+ compactPrimary.some((field) => fuzzyMatches(compactQuery, field))) {
62
+ return 6;
63
+ }
64
+ return null;
65
+ };
66
+ const filterEffectCatalog = ({ items, query, }) => {
67
+ return items
68
+ .map((item, index) => ({
69
+ item,
70
+ index,
71
+ score: getMatchScore(item, query),
72
+ }))
73
+ .filter((candidate) => candidate.score !== null)
74
+ .sort((a, b) => a.score - b.score || a.index - b.index)
75
+ .map(({ item }) => item);
76
+ };
77
+ exports.filterEffectCatalog = filterEffectCatalog;
@@ -1,4 +1,5 @@
1
1
  import { type ComponentProp, type FileType, type InsertableCompositionElementPosition } from '@remotion/studio-shared';
2
+ import type { Dimensions } from '../helpers/is-current-selected-still';
2
3
  export type InsertElementDropPosition = {
3
4
  readonly centerX: number;
4
5
  readonly centerY: number;
@@ -8,7 +9,7 @@ export declare const getAssetElement: ({ fileType, src, }: {
8
9
  src: string;
9
10
  }) => {
10
11
  type: "asset";
11
- assetType: "audio" | "gif" | "image" | "video";
12
+ assetType: "animated-image" | "audio" | "gif" | "image" | "video";
12
13
  src: string;
13
14
  srcType: "remote" | "static";
14
15
  dimensions: {
@@ -19,7 +20,7 @@ export declare const getAssetElement: ({ fileType, src, }: {
19
20
  } | null;
20
21
  export declare const getAssetElementFromPath: (assetPath: string) => {
21
22
  type: "asset";
22
- assetType: "audio" | "gif" | "image" | "video";
23
+ assetType: "animated-image" | "audio" | "gif" | "image" | "video";
23
24
  src: string;
24
25
  srcType: "remote" | "static";
25
26
  dimensions: {
@@ -28,6 +29,13 @@ export declare const getAssetElementFromPath: (assetPath: string) => {
28
29
  } | null;
29
30
  position: InsertableCompositionElementPosition | null;
30
31
  } | null;
32
+ export declare const getComponentDimensions: (component: {
33
+ componentName: string;
34
+ dimensions?: import("@remotion/studio-shared").ComponentDimensions | undefined;
35
+ importName: string;
36
+ importPath: string;
37
+ props: ComponentProp[];
38
+ }) => Dimensions | null;
31
39
  export declare const pickFilesToImport: () => Promise<File[]>;
32
40
  export declare const importAssets: ({ compositionFile, compositionId, dropPosition, files, }: {
33
41
  compositionFile: string;
@@ -55,6 +63,7 @@ export declare const insertExistingAssets: ({ assetPaths, compositionFile, compo
55
63
  export declare const insertComponent: ({ component, compositionFile, compositionId, dropPosition, }: {
56
64
  component: {
57
65
  componentName: string;
66
+ dimensions?: import("@remotion/studio-shared").ComponentDimensions | undefined;
58
67
  importName: string;
59
68
  importPath: string;
60
69
  props: ComponentProp[];
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.insertComponent = exports.insertExistingAssets = exports.insertRemoteAudio = exports.importRemoteAsset = exports.importAssets = exports.pickFilesToImport = exports.getAssetElementFromPath = exports.getAssetElement = void 0;
3
+ exports.insertComponent = exports.insertExistingAssets = exports.insertRemoteAudio = exports.importRemoteAsset = exports.importAssets = exports.pickFilesToImport = exports.getComponentDimensions = exports.getAssetElementFromPath = exports.getAssetElement = void 0;
4
4
  const media_utils_1 = require("@remotion/media-utils");
5
5
  const studio_shared_1 = require("@remotion/studio-shared");
6
6
  const remotion_1 = require("remotion");
@@ -23,6 +23,16 @@ const getAssetElement = ({ fileType, src, }) => {
23
23
  position: null,
24
24
  };
25
25
  }
26
+ if (fileType.type === 'apng') {
27
+ return {
28
+ type: 'asset',
29
+ assetType: 'animated-image',
30
+ src,
31
+ srcType: 'static',
32
+ dimensions: fileType.dimensions,
33
+ position: null,
34
+ };
35
+ }
26
36
  if (fileType.type === 'gif') {
27
37
  return {
28
38
  type: 'asset',
@@ -81,6 +91,16 @@ const getAssetElementFromPath = (assetPath) => {
81
91
  position: null,
82
92
  };
83
93
  }
94
+ if (extension === 'apng') {
95
+ return {
96
+ type: 'asset',
97
+ assetType: 'animated-image',
98
+ src: assetPath,
99
+ srcType: 'static',
100
+ dimensions: null,
101
+ position: null,
102
+ };
103
+ }
84
104
  if (extension === 'gif') {
85
105
  return {
86
106
  type: 'asset',
@@ -127,6 +147,9 @@ const getAssetLabel = (element) => {
127
147
  if (element.assetType === 'gif') {
128
148
  return '<Gif>';
129
149
  }
150
+ if (element.assetType === 'animated-image') {
151
+ return '<AnimatedImage>';
152
+ }
130
153
  if (element.assetType === 'audio') {
131
154
  return '<Audio>';
132
155
  }
@@ -155,6 +178,9 @@ const getComponentPropNumber = (props, name) => {
155
178
  return typeof (prop === null || prop === void 0 ? void 0 : prop.value) === 'number' ? prop.value : null;
156
179
  };
157
180
  const getComponentDimensions = (component) => {
181
+ if (component.dimensions) {
182
+ return component.dimensions;
183
+ }
158
184
  const width = getComponentPropNumber(component.props, 'width');
159
185
  const height = getComponentPropNumber(component.props, 'height');
160
186
  if (width !== null && height !== null) {
@@ -166,6 +192,7 @@ const getComponentDimensions = (component) => {
166
192
  }
167
193
  return null;
168
194
  };
195
+ exports.getComponentDimensions = getComponentDimensions;
169
196
  const getImageDimensions = ({ revokeObjectUrl, src, }) => {
170
197
  return new Promise((resolve, reject) => {
171
198
  const image = new Image();
@@ -199,6 +226,7 @@ const getFileDimensions = async ({ file, fileType, }) => {
199
226
  fileType.type === 'jpeg' ||
200
227
  fileType.type === 'webp' ||
201
228
  fileType.type === 'bmp' ||
229
+ fileType.type === 'apng' ||
202
230
  fileType.type === 'gif') {
203
231
  if (fileType.dimensions) {
204
232
  return fileType.dimensions;
@@ -225,7 +253,7 @@ const getStaticAssetDimensions = (assetPath) => {
225
253
  const extension = (_a = assetPath.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
226
254
  const src = (0, remotion_1.staticFile)(assetPath);
227
255
  if (extension &&
228
- ['png', 'jpg', 'jpeg', 'webp', 'bmp', 'gif'].includes(extension)) {
256
+ ['png', 'jpg', 'jpeg', 'webp', 'bmp', 'gif', 'apng'].includes(extension)) {
229
257
  return getImageDimensions({ revokeObjectUrl: false, src });
230
258
  }
231
259
  if (extension &&
@@ -250,6 +278,33 @@ const getStaticAssetDimensionsOrNull = async (assetPath) => {
250
278
  return null;
251
279
  }
252
280
  };
281
+ const getStaticAssetFileType = async (assetPath) => {
282
+ var _a;
283
+ const extension = (_a = assetPath.split('.').pop()) === null || _a === void 0 ? void 0 : _a.toLowerCase();
284
+ if (extension !== 'png' && extension !== 'apng') {
285
+ return null;
286
+ }
287
+ try {
288
+ const response = await fetch((0, remotion_1.staticFile)(assetPath));
289
+ if (!response.ok) {
290
+ return null;
291
+ }
292
+ return (0, studio_shared_1.detectFileType)(new Uint8Array(await response.arrayBuffer()));
293
+ }
294
+ catch (_b) {
295
+ return null;
296
+ }
297
+ };
298
+ const getAssetElementFromStaticAsset = async (assetPath) => {
299
+ const fileType = await getStaticAssetFileType(assetPath);
300
+ if (fileType) {
301
+ const element = (0, exports.getAssetElement)({ fileType, src: assetPath });
302
+ if (element) {
303
+ return element;
304
+ }
305
+ }
306
+ return (0, exports.getAssetElementFromPath)(assetPath);
307
+ };
253
308
  const pickFilesToImport = () => {
254
309
  return new Promise((resolve) => {
255
310
  const input = document.createElement('input');
@@ -456,18 +511,18 @@ const insertExistingAssets = async ({ assetPaths, compositionFile, compositionId
456
511
  const unsupportedFiles = [];
457
512
  try {
458
513
  for (const assetPath of assetPaths) {
459
- const element = (0, exports.getAssetElementFromPath)(assetPath);
514
+ const element = await getAssetElementFromStaticAsset(assetPath);
460
515
  if (element === null) {
461
516
  unsupportedFiles.push(assetPath);
462
517
  continue;
463
518
  }
464
- const dimensions = await getStaticAssetDimensionsOrNull(assetPath);
519
+ const dimensions = (_a = element.dimensions) !== null && _a !== void 0 ? _a : (await getStaticAssetDimensionsOrNull(assetPath));
465
520
  const inserted = await insertAssetElement({
466
521
  compositionFile,
467
522
  compositionId,
468
523
  element: {
469
524
  ...element,
470
- dimensions: (_a = element.dimensions) !== null && _a !== void 0 ? _a : dimensions,
525
+ dimensions,
471
526
  position: getCenteredPosition({
472
527
  dimensions,
473
528
  dropPosition,
@@ -499,7 +554,7 @@ const insertComponent = async ({ component, compositionFile, compositionId, drop
499
554
  importPath: component.importPath,
500
555
  props: component.props,
501
556
  position: getCenteredPosition({
502
- dimensions: getComponentDimensions(component),
557
+ dimensions: (0, exports.getComponentDimensions)(component),
503
558
  dropPosition,
504
559
  }),
505
560
  },