@remotion/studio 4.0.499 → 4.0.501

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 (204) hide show
  1. package/dist/Studio.js +1 -1
  2. package/dist/api/delete-static-file.js +8 -3
  3. package/dist/api/rename-static-file.js +8 -0
  4. package/dist/api/watch-public-folder.js +2 -1
  5. package/dist/api/watch-static-file.js +2 -1
  6. package/dist/api/write-static-file.js +8 -3
  7. package/dist/components/AssetSelector.js +11 -7
  8. package/dist/components/AssetSelectorItem.d.ts +25 -0
  9. package/dist/components/AssetSelectorItem.js +116 -80
  10. package/dist/components/Canvas.js +6 -1
  11. package/dist/components/CaptionInspector.d.ts +10 -0
  12. package/dist/components/CaptionInspector.js +24 -0
  13. package/dist/components/CaptionTextEditor.d.ts +9 -0
  14. package/dist/components/CaptionTextEditor.js +132 -0
  15. package/dist/components/CompositionSelector.js +2 -32
  16. package/dist/components/ControlButton.js +1 -0
  17. package/dist/components/CurrentAsset.js +3 -2
  18. package/dist/components/EditorContexts.d.ts +0 -1
  19. package/dist/components/EditorContexts.js +2 -2
  20. package/dist/components/ExplorerPanel.js +2 -1
  21. package/dist/components/ExplorerPanelRef.d.ts +2 -0
  22. package/dist/components/FpsCounter.js +3 -3
  23. package/dist/components/FullscreenToggle.js +2 -1
  24. package/dist/components/GlobalKeybindings.js +9 -1
  25. package/dist/components/InitialCompositionLoader.d.ts +1 -1
  26. package/dist/components/InlineAction.d.ts +2 -1
  27. package/dist/components/InlineAction.js +3 -2
  28. package/dist/components/InlineCaptionInspector.d.ts +11 -0
  29. package/dist/components/InlineCaptionInspector.js +108 -0
  30. package/dist/components/InlineDropdown.d.ts +1 -1
  31. package/dist/components/InlineDropdown.js +3 -2
  32. package/dist/components/InspectorPanel/AlignmentControls.d.ts +2 -2
  33. package/dist/components/InspectorPanel/AlignmentControls.js +5 -2
  34. package/dist/components/InspectorPanel/CompositionInspector.js +12 -9
  35. package/dist/components/InspectorPanel/CompositionMetadata.js +170 -57
  36. package/dist/components/InspectorPanel/ConnectedCompositionsSection.d.ts +2 -2
  37. package/dist/components/InspectorPanel/SelectedInspector.d.ts +1 -0
  38. package/dist/components/InspectorPanel/SelectedInspector.js +2 -2
  39. package/dist/components/InspectorPanel/SequenceInspectorHeader.d.ts +3 -3
  40. package/dist/components/InspectorPanel/SequenceSelectionInspector.d.ts +1 -0
  41. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +10 -10
  42. package/dist/components/InspectorPanel/common.d.ts +17 -4
  43. package/dist/components/InspectorPanel/common.js +60 -6
  44. package/dist/components/InspectorPanel/inspector-section-collapse.d.ts +22 -0
  45. package/dist/components/InspectorPanel/inspector-section-collapse.js +165 -0
  46. package/dist/components/InspectorPanel/styles.js +7 -1
  47. package/dist/components/InspectorPanel/use-composition-actions.d.ts +3 -0
  48. package/dist/components/InspectorPanel/use-composition-actions.js +91 -5
  49. package/dist/components/InspectorPanel/use-track-for-selection.d.ts +1 -1
  50. package/dist/components/InspectorPanel.js +2 -2
  51. package/dist/components/InspectorSequenceSection.d.ts +2 -1
  52. package/dist/components/InspectorSequenceSection.js +279 -25
  53. package/dist/components/KeyboardShortcutsExplainer.js +4 -2
  54. package/dist/components/Menu/MenuItem.js +2 -1
  55. package/dist/components/MenuCompositionName.js +30 -7
  56. package/dist/components/MenuToolbar.d.ts +0 -1
  57. package/dist/components/MenuToolbar.js +15 -7
  58. package/dist/components/MobilePanel.d.ts +2 -1
  59. package/dist/components/MobilePanel.js +29 -25
  60. package/dist/components/ModalContainer.d.ts +1 -0
  61. package/dist/components/ModalContainer.js +2 -2
  62. package/dist/components/Modals.js +1 -1
  63. package/dist/components/NewComposition/DismissableModal.d.ts +1 -0
  64. package/dist/components/NewComposition/DismissableModal.js +2 -2
  65. package/dist/components/NewComposition/InputDragger.d.ts +7 -0
  66. package/dist/components/NewComposition/InputDragger.js +119 -8
  67. package/dist/components/OutlineToggle.d.ts +1 -3
  68. package/dist/components/OutlineToggle.js +2 -2
  69. package/dist/components/PreviewToolbar.js +10 -4
  70. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.d.ts +7 -0
  71. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +45 -0
  72. package/dist/components/QuickSwitcher/NoResults.d.ts +1 -1
  73. package/dist/components/QuickSwitcher/NoResults.js +1 -0
  74. package/dist/components/QuickSwitcher/QuickSwitcher.d.ts +10 -0
  75. package/dist/components/QuickSwitcher/QuickSwitcher.js +6 -2
  76. package/dist/components/QuickSwitcher/QuickSwitcherContent.d.ts +10 -0
  77. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +95 -13
  78. package/dist/components/QuickSwitcher/QuickSwitcherResult.d.ts +4 -0
  79. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +11 -8
  80. package/dist/components/QuickSwitcher/asset-search.d.ts +9 -0
  81. package/dist/components/QuickSwitcher/asset-search.js +42 -0
  82. package/dist/components/RenderQueue/ClientRenderQueueProcessor.d.ts +0 -1
  83. package/dist/components/RenderQueue/ClientRenderQueueProcessor.js +3 -14
  84. package/dist/components/RenderQueue/RenderQueueDownloadItem.js +2 -2
  85. package/dist/components/SelectedOutlineCropControls.d.ts +8 -0
  86. package/dist/components/SelectedOutlineCropControls.js +299 -0
  87. package/dist/components/SelectedOutlineElement.js +84 -47
  88. package/dist/components/SelectedOutlineOverlay.d.ts +2 -2
  89. package/dist/components/SelectedOutlineOverlay.js +147 -16
  90. package/dist/components/SequencePropsSubscriptionProvider.d.ts +2 -0
  91. package/dist/components/SequencePropsSubscriptionProvider.js +31 -3
  92. package/dist/components/ShowOutlinesProvider.js +4 -1
  93. package/dist/components/SidebarCollapserControls.d.ts +3 -1
  94. package/dist/components/SidebarCollapserControls.js +34 -29
  95. package/dist/components/SnappingToggle.d.ts +1 -3
  96. package/dist/components/SnappingToggle.js +2 -2
  97. package/dist/components/Timeline/Timeline.js +19 -5
  98. package/dist/components/Timeline/TimelineAssetField.d.ts +9 -1
  99. package/dist/components/Timeline/TimelineAssetField.js +53 -100
  100. package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +7 -3
  101. package/dist/components/Timeline/TimelineClipboardKeybindings.js +65 -38
  102. package/dist/components/Timeline/TimelineColorField.js +20 -1
  103. package/dist/components/Timeline/TimelineEffectPropItem.js +8 -77
  104. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +8 -1
  105. package/dist/components/Timeline/TimelineHeightContainer.d.ts +2 -2
  106. package/dist/components/Timeline/TimelineKeyframeTracksContext.d.ts +3 -3
  107. package/dist/components/Timeline/TimelineList.d.ts +2 -2
  108. package/dist/components/Timeline/TimelinePrimitiveFieldValue.d.ts +7 -2
  109. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +10 -2
  110. package/dist/components/Timeline/TimelineRowChrome.d.ts +3 -0
  111. package/dist/components/Timeline/TimelineRowChrome.js +4 -3
  112. package/dist/components/Timeline/TimelineSelection.d.ts +9 -7
  113. package/dist/components/Timeline/TimelineSelection.js +17 -12
  114. package/dist/components/Timeline/TimelineSequence.js +2 -9
  115. package/dist/components/Timeline/TimelineSequenceItem.js +61 -15
  116. package/dist/components/Timeline/TimelineSequencePropItem.js +36 -85
  117. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +0 -1
  118. package/dist/components/Timeline/TimelineTrack.d.ts +2 -2
  119. package/dist/components/Timeline/TimelineTrack.js +4 -2
  120. package/dist/components/Timeline/TimelineTracks.d.ts +2 -2
  121. package/dist/components/Timeline/border-radius-representation.d.ts +16 -0
  122. package/dist/components/Timeline/border-radius-representation.js +60 -0
  123. package/dist/components/Timeline/delete-selected-timeline-item.js +1 -6
  124. package/dist/components/Timeline/find-track-for-node-path-info.d.ts +1 -1
  125. package/dist/components/Timeline/get-sequence-context-menu-items.js +14 -12
  126. package/dist/components/Timeline/get-sequence-prop-reset-changes.d.ts +10 -0
  127. package/dist/components/Timeline/get-sequence-prop-reset-changes.js +33 -0
  128. package/dist/components/Timeline/reset-selected-timeline-props.js +20 -18
  129. package/dist/components/Timeline/save-effect-prop.d.ts +10 -0
  130. package/dist/components/Timeline/save-effect-prop.js +52 -1
  131. package/dist/components/Timeline/save-sequence-prop.d.ts +12 -1
  132. package/dist/components/Timeline/save-sequence-prop.js +25 -1
  133. package/dist/components/Timeline/should-show-track-in-timeline.d.ts +2 -2
  134. package/dist/components/Timeline/timeline-asset-link.js +17 -1
  135. package/dist/components/Timeline/timeline-field-display-utils.js +1 -0
  136. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.d.ts +4 -0
  137. package/dist/components/Timeline/use-sequence-freeze-frame-menu-item.js +9 -3
  138. package/dist/components/Timeline/use-timeline-asset-drop.js +4 -0
  139. package/dist/components/Timeline/use-timeline-height.d.ts +2 -2
  140. package/dist/components/TopPanel.js +2 -2
  141. package/dist/components/UndoRedoButtons.js +42 -11
  142. package/dist/components/composition-drop-preview.js +1 -0
  143. package/dist/components/handle-drop.d.ts +3 -2
  144. package/dist/components/handle-drop.js +2 -1
  145. package/dist/components/import-assets.d.ts +4 -2
  146. package/dist/components/import-assets.js +20 -7
  147. package/dist/components/menu-toolbar-height.d.ts +1 -0
  148. package/dist/components/menu-toolbar-height.js +4 -0
  149. package/dist/components/selected-outline-drag.d.ts +41 -4
  150. package/dist/components/selected-outline-drag.js +179 -2
  151. package/dist/components/selected-outline-geometry.d.ts +1 -0
  152. package/dist/components/selected-outline-measurement.d.ts +11 -0
  153. package/dist/components/selected-outline-measurement.js +64 -3
  154. package/dist/components/selected-outline-types.d.ts +44 -1
  155. package/dist/components/selected-outline-types.js +21 -1
  156. package/dist/components/use-element-overwrite-confirmation.d.ts +2 -0
  157. package/dist/components/use-element-overwrite-confirmation.js +73 -0
  158. package/dist/components/use-static-files.js +7 -2
  159. package/dist/error-overlay/react-overlay/effects/resolve-file-source.js +13 -2
  160. package/dist/error-overlay/remotion-overlay/Overlay.js +3 -3
  161. package/dist/error-overlay/remotion-overlay/ShortcutHint.js +2 -3
  162. package/dist/esm/{chunk-pk1zwsn1.js → chunk-n1kj09yv.js} +10618 -8002
  163. package/dist/esm/index.mjs +24 -8
  164. package/dist/esm/internals.mjs +10618 -8002
  165. package/dist/esm/previewEntry.mjs +40002 -37388
  166. package/dist/esm/renderEntry.mjs +1 -1
  167. package/dist/helpers/browser-studio-operations.d.ts +3 -0
  168. package/dist/helpers/browser-studio-operations.js +14 -0
  169. package/dist/helpers/calculate-timeline.d.ts +2 -2
  170. package/dist/helpers/calculate-timeline.js +8 -28
  171. package/dist/helpers/client-id.d.ts +0 -1
  172. package/dist/helpers/client-id.js +15 -10
  173. package/dist/helpers/download-blob.d.ts +1 -0
  174. package/dist/helpers/download-blob.js +15 -0
  175. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +3 -10
  176. package/dist/helpers/get-timeline-sequence-sort-key.js +5 -13
  177. package/dist/helpers/inject-css.js +5 -3
  178. package/dist/helpers/interactivity-enabled.d.ts +1 -0
  179. package/dist/helpers/interactivity-enabled.js +7 -2
  180. package/dist/helpers/is-mac.d.ts +1 -0
  181. package/dist/helpers/is-mac.js +4 -0
  182. package/dist/helpers/open-in-editor.d.ts +5 -1
  183. package/dist/helpers/open-in-editor.js +39 -4
  184. package/dist/helpers/preview-server-events.js +46 -9
  185. package/dist/helpers/sort-by-nonce-history.js +97 -19
  186. package/dist/helpers/use-create-composition.js +8 -6
  187. package/dist/helpers/use-keybinding.js +2 -3
  188. package/dist/helpers/use-menu-structure.js +39 -1
  189. package/dist/hot-middleware-client/client.js +3 -3
  190. package/dist/icons/border-radius.d.ts +4 -0
  191. package/dist/icons/border-radius.js +8 -0
  192. package/dist/icons/caret.d.ts +1 -0
  193. package/dist/icons/caret.js +2 -2
  194. package/dist/icons/fullscreen.d.ts +4 -0
  195. package/dist/icons/fullscreen.js +6 -0
  196. package/dist/icons/pen.d.ts +5 -0
  197. package/dist/icons/pen.js +8 -0
  198. package/dist/previewEntry.js +1 -1
  199. package/dist/state/modals.d.ts +9 -0
  200. package/dist/state/timeline-sequence-hover.d.ts +17 -0
  201. package/dist/state/timeline-sequence-hover.js +33 -0
  202. package/package.json +13 -12
  203. package/dist/helpers/get-timeline-sequence-hash.d.ts +0 -6
  204. package/dist/helpers/get-timeline-sequence-hash.js +0 -33
@@ -1,45 +1,46 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.TimelineAssetField = exports.isStaticFileAssetValue = void 0;
3
+ exports.TimelineAssetField = exports.toFileToken = exports.AssetSelectionContext = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const no_react_1 = require("remotion/no-react");
7
- const write_static_file_1 = require("../../api/write-static-file");
8
- const Checkmark_1 = require("../../icons/Checkmark");
9
- const import_assets_1 = require("../import-assets");
10
- const ComboBox_1 = require("../NewComposition/ComboBox");
11
- const NotificationCenter_1 = require("../Notifications/NotificationCenter");
12
- const use_static_files_1 = require("../use-static-files");
13
- const comboboxStyle = {
14
- marginLeft: 8,
15
- maxWidth: 180,
16
- };
17
- const remoteAssetStyle = {
18
- display: 'inline-block',
19
- marginLeft: 8,
20
- maxWidth: 180,
21
- overflow: 'hidden',
22
- textOverflow: 'ellipsis',
23
- verticalAlign: 'middle',
24
- whiteSpace: 'nowrap',
7
+ const pen_1 = require("../../icons/pen");
8
+ const modals_1 = require("../../state/modals");
9
+ const InlineAction_1 = require("../InlineAction");
10
+ const common_1 = require("../InspectorPanel/common");
11
+ const penIcon = {
12
+ display: 'block',
13
+ height: 14,
14
+ width: 14,
25
15
  };
16
+ exports.AssetSelectionContext = (0, react_1.createContext)({
17
+ getSourceAction: () => null,
18
+ initialQuery: '',
19
+ sourceAction: null,
20
+ });
26
21
  const toFileToken = (name) => {
27
22
  return `${no_react_1.NoReactInternals.FILE_TOKEN}${name
28
23
  .split('/')
29
24
  .map(encodeURIComponent)
30
25
  .join('/')}`;
31
26
  };
32
- const toStaticFileUrl = (fileToken) => {
33
- return `${window.remotion_staticBase}/${fileToken.slice(no_react_1.NoReactInternals.FILE_TOKEN.length)}`;
34
- };
35
- const isStaticFileAssetValue = (value) => {
36
- return (typeof value === 'string' && value.startsWith(no_react_1.NoReactInternals.FILE_TOKEN));
37
- };
38
- exports.isStaticFileAssetValue = isStaticFileAssetValue;
39
- const TimelineStaticFileAssetField = ({ propStatus, effectiveValue, onSave, onDragValueChange, onDragEnd, }) => {
40
- const staticFiles = (0, use_static_files_1.useStaticFiles)();
41
- const current = String(effectiveValue !== null && effectiveValue !== void 0 ? effectiveValue : '');
42
- const onSelect = (0, react_1.useCallback)((sourceValue, previewValue) => {
27
+ exports.toFileToken = toFileToken;
28
+ const TimelineAssetField = ({ field, effectiveValue, propStatus, onSave, onDragValueChange, onDragEnd, }) => {
29
+ if (field.fieldSchema.type !== 'asset') {
30
+ throw new Error('TimelineAssetField rendered for non-asset field');
31
+ }
32
+ const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
33
+ const { getSourceAction, initialQuery, sourceAction } = (0, react_1.useContext)(exports.AssetSelectionContext);
34
+ const inlineSourceAction = (0, react_1.useMemo)(() => {
35
+ if (field.key !== 'src') {
36
+ return null;
37
+ }
38
+ return typeof effectiveValue === 'string'
39
+ ? getSourceAction(effectiveValue)
40
+ : sourceAction;
41
+ }, [effectiveValue, field.key, getSourceAction, sourceAction]);
42
+ const onSelect = (0, react_1.useCallback)((assetName, previewValue) => {
43
+ const sourceValue = (0, exports.toFileToken)(assetName);
43
44
  if (sourceValue === propStatus.codeValue) {
44
45
  return;
45
46
  }
@@ -48,78 +49,30 @@ const TimelineStaticFileAssetField = ({ propStatus, effectiveValue, onSave, onDr
48
49
  onDragEnd();
49
50
  });
50
51
  }, [propStatus.codeValue, onDragValueChange, onSave, onDragEnd]);
51
- const upload = (0, react_1.useCallback)(async () => {
52
- const [file] = await (0, import_assets_1.pickFilesToImport)({ multiple: false });
53
- if (!file) {
54
- return;
55
- }
56
- const existing = staticFiles.find((candidate) => candidate.name === file.name);
57
- if (existing && existing.sizeInBytes !== file.size) {
58
- (0, NotificationCenter_1.showNotification)(`File with name ${file.name} already exists and is different`, 4000);
59
- return;
60
- }
61
- try {
62
- if (!existing) {
63
- await (0, write_static_file_1.writeStaticFile)({
64
- contents: await file.arrayBuffer(),
65
- filePath: file.name,
66
- });
67
- }
68
- const fileToken = toFileToken(file.name);
69
- onSelect(fileToken, toStaticFileUrl(fileToken));
70
- if (!existing) {
71
- (0, NotificationCenter_1.showNotification)(`Created ${file.name} in public folder`, 3000);
72
- }
73
- }
74
- catch (error) {
75
- (0, NotificationCenter_1.showNotification)(`Could not upload asset: ${error instanceof Error ? error.message : String(error)}`, 4000);
76
- }
77
- }, [onSelect, staticFiles]);
78
- const items = (0, react_1.useMemo)(() => {
79
- const publicFileItems = staticFiles.map((file) => {
80
- const fileToken = toFileToken(file.name);
81
- return {
82
- type: 'item',
83
- id: fileToken,
84
- value: fileToken,
85
- label: file.name,
86
- onClick: () => onSelect(fileToken, file.src),
87
- keyHint: null,
88
- leftItem: fileToken === current ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
89
- subMenu: null,
90
- quickSwitcherLabel: null,
91
- };
52
+ const openAssetSelection = (0, react_1.useCallback)(() => {
53
+ setSelectedModal({
54
+ type: 'quick-switcher',
55
+ mode: 'assets',
56
+ invocationTimestamp: Date.now(),
57
+ assetSelection: {
58
+ initialQuery,
59
+ onSelected: (asset) => onSelect(asset.name, asset.src),
60
+ },
61
+ compositionSelection: null,
92
62
  });
93
- return [
94
- ...publicFileItems,
95
- { type: 'divider', id: 'upload-asset-divider' },
96
- {
97
- type: 'item',
98
- id: 'upload-asset',
99
- value: 'upload-asset',
100
- label: 'Upload…',
101
- onClick: () => {
102
- upload().catch(() => undefined);
103
- },
104
- keyHint: null,
105
- leftItem: null,
106
- subMenu: null,
107
- quickSwitcherLabel: null,
63
+ }, [initialQuery, onSelect, setSelectedModal]);
64
+ const action = (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { onClick: openAssetSelection, disabled: window.remotion_isReadOnlyStudio, title: "Change source", renderAction: (color) => jsx_runtime_1.jsx(pen_1.PenIcon, { color: color, style: penIcon }) }));
65
+ if (inlineSourceAction === null) {
66
+ return action;
67
+ }
68
+ return (jsx_runtime_1.jsx(common_1.InspectorInlineAction, { ...inlineSourceAction, size: "compact", variant: {
69
+ type: 'segmented',
70
+ trailing: {
108
71
  disabled: window.remotion_isReadOnlyStudio,
72
+ onClick: openAssetSelection,
73
+ renderIcon: (color) => jsx_runtime_1.jsx(pen_1.PenIcon, { color: color, style: penIcon }),
74
+ title: 'Change source',
109
75
  },
110
- ];
111
- }, [current, onSelect, staticFiles, upload]);
112
- return (jsx_runtime_1.jsx(ComboBox_1.Combobox, { size: "small", title: current, selectedId: current, values: items, style: comboboxStyle }));
113
- };
114
- const TimelineAssetField = (props) => {
115
- var _a;
116
- if (props.field.fieldSchema.type !== 'asset') {
117
- throw new Error('TimelineAssetField rendered for non-asset field');
118
- }
119
- if (!(0, exports.isStaticFileAssetValue)(props.effectiveValue)) {
120
- const remote = String((_a = props.effectiveValue) !== null && _a !== void 0 ? _a : '');
121
- return (jsx_runtime_1.jsx("span", { style: remoteAssetStyle, title: remote, children: remote }));
122
- }
123
- return jsx_runtime_1.jsx(TimelineStaticFileAssetField, { ...props });
76
+ } }));
124
77
  };
125
78
  exports.TimelineAssetField = TimelineAssetField;
@@ -14,16 +14,19 @@ export type PasteEffectsTarget = {
14
14
  } | {
15
15
  readonly type: 'unsupported';
16
16
  };
17
- export type PasteEffectPropTarget = {
18
- readonly type: 'valid';
17
+ type PasteEffectPropEditTarget = {
19
18
  readonly fileName: string;
20
19
  readonly nodePath: SequencePropsSubscriptionKey;
21
20
  readonly effectIndex: number;
22
21
  readonly fieldKey: string;
23
22
  readonly defaultValue: string | null;
24
23
  readonly schema: InteractivitySchema;
24
+ };
25
+ export type PasteEffectPropTarget = {
26
+ readonly type: 'valid';
27
+ readonly targets: PasteEffectPropEditTarget[];
25
28
  } | {
26
- readonly type: 'none' | 'multiple' | 'unsupported' | 'effect-type-mismatch' | 'prop-mismatch' | 'uncopyable';
29
+ readonly type: 'none' | 'unsupported' | 'effect-type-mismatch' | 'prop-mismatch' | 'uncopyable';
27
30
  };
28
31
  export declare const getPasteEffectsTarget: (selectedItems: readonly TimelineSelection[]) => PasteEffectsTarget;
29
32
  export declare const getSnapshotsFromSelection: ({ selection, propStatuses, }: {
@@ -72,3 +75,4 @@ export declare const getPasteEffectPropTarget: ({ selectedItems, payload, propSt
72
75
  readonly overrideIdsToNodePaths: OverrideIdToNodePaths;
73
76
  }) => PasteEffectPropTarget;
74
77
  export declare const TimelineClipboardKeybindings: React.FC;
78
+ export {};
@@ -285,18 +285,8 @@ const getEasingClipboardDataFromSelection = ({ selection, sequences, overrideIds
285
285
  };
286
286
  };
287
287
  exports.getEasingClipboardDataFromSelection = getEasingClipboardDataFromSelection;
288
- const getPasteEffectPropTarget = ({ selectedItems, payload, propStatuses, sequences, overrideIdsToNodePaths, }) => {
288
+ const getPasteEffectPropTargetForSelection = ({ selection, payload, propStatuses, sequences, overrideIdsToNodePaths, }) => {
289
289
  var _a;
290
- if (selectedItems.length === 0) {
291
- return { type: 'none' };
292
- }
293
- if (selectedItems.length !== 1) {
294
- return { type: 'multiple' };
295
- }
296
- const [selection] = selectedItems;
297
- if (!selection) {
298
- return { type: 'none' };
299
- }
300
290
  if (selection.type !== 'sequence-effect-prop' &&
301
291
  selection.type !== 'sequence-effect') {
302
292
  return { type: 'none' };
@@ -348,12 +338,42 @@ const getPasteEffectPropTarget = ({ selectedItems, payload, propStatuses, sequen
348
338
  }
349
339
  return {
350
340
  type: 'valid',
351
- fileName: selection.nodePathInfo.sequenceSubscriptionKey.absolutePath,
352
- nodePath: selection.nodePathInfo.sequenceSubscriptionKey,
353
- effectIndex: target.effectIndex,
354
- fieldKey: target.fieldKey,
355
- defaultValue: getDefaultValue(fieldSchema),
356
- schema: effect.schema,
341
+ target: {
342
+ fileName: selection.nodePathInfo.sequenceSubscriptionKey.absolutePath,
343
+ nodePath: selection.nodePathInfo.sequenceSubscriptionKey,
344
+ effectIndex: target.effectIndex,
345
+ fieldKey: target.fieldKey,
346
+ defaultValue: getDefaultValue(fieldSchema),
347
+ schema: effect.schema,
348
+ },
349
+ };
350
+ };
351
+ const getPasteEffectPropTarget = ({ selectedItems, payload, propStatuses, sequences, overrideIdsToNodePaths, }) => {
352
+ if (selectedItems.length === 0) {
353
+ return { type: 'none' };
354
+ }
355
+ const targets = [];
356
+ for (const selection of selectedItems) {
357
+ const result = getPasteEffectPropTargetForSelection({
358
+ selection,
359
+ payload,
360
+ propStatuses,
361
+ sequences,
362
+ overrideIdsToNodePaths,
363
+ });
364
+ if (result.type !== 'valid') {
365
+ return result;
366
+ }
367
+ targets.push(result.target);
368
+ }
369
+ return {
370
+ type: 'valid',
371
+ targets: [
372
+ ...new Map(targets.map((target) => [
373
+ `${makeTargetKey(target.nodePath)}:${target.effectIndex}:${target.fieldKey}`,
374
+ target,
375
+ ])).values(),
376
+ ],
357
377
  };
358
378
  };
359
379
  exports.getPasteEffectPropTarget = getPasteEffectPropTarget;
@@ -730,11 +750,8 @@ const TimelineClipboardKeybindings = () => {
730
750
  });
731
751
  if (effectPropTarget.type !== 'valid') {
732
752
  switch (effectPropTarget.type) {
733
- case 'multiple':
734
- (0, NotificationCenter_1.showNotification)('Select one target effect prop or effect to paste onto', 3000);
735
- return;
736
753
  case 'none':
737
- (0, NotificationCenter_1.showNotification)('Select a matching effect prop or effect to paste onto', 3000);
754
+ (0, NotificationCenter_1.showNotification)('Select matching effect props or effects to paste onto', 3000);
738
755
  return;
739
756
  case 'unsupported':
740
757
  (0, NotificationCenter_1.showNotification)('This sequence does not support effects', 3000);
@@ -752,26 +769,36 @@ const TimelineClipboardKeybindings = () => {
752
769
  throw new Error(`Unexpected paste target: ${effectPropTarget}`);
753
770
  }
754
771
  }
755
- return (0, save_effect_prop_1.saveEffectProp)({
756
- fileName: effectPropTarget.fileName,
757
- nodePath: effectPropTarget.nodePath,
758
- effectIndex: effectPropTarget.effectIndex,
759
- fieldKey: effectPropTarget.fieldKey,
760
- ...(effectPropResult.data.param.type === 'static'
761
- ? {
762
- type: 'value',
763
- value: effectPropResult.data.param.value,
764
- }
765
- : {
766
- type: 'effect-param',
767
- effectParam: effectPropResult.data.param,
768
- }),
769
- defaultValue: effectPropTarget.defaultValue,
770
- schema: effectPropTarget.schema,
772
+ return (0, save_effect_prop_1.saveMultipleEffectProps)({
773
+ changes: effectPropTarget.targets.map((pasteTarget) => ({
774
+ fileName: pasteTarget.fileName,
775
+ nodePath: pasteTarget.nodePath,
776
+ effectIndex: pasteTarget.effectIndex,
777
+ fieldKey: pasteTarget.fieldKey,
778
+ ...(effectPropResult.data.param.type === 'static'
779
+ ? {
780
+ type: 'value',
781
+ value: effectPropResult.data.param.value,
782
+ }
783
+ : {
784
+ type: 'effect-param',
785
+ effectParam: effectPropResult.data.param,
786
+ }),
787
+ defaultValue: pasteTarget.defaultValue,
788
+ schema: pasteTarget.schema,
789
+ })),
771
790
  setPropStatuses,
772
791
  clientId,
792
+ undoLabel: effectPropTarget.targets.length > 1
793
+ ? 'Paste effect prop onto selected effects'
794
+ : 'Paste effect prop',
795
+ redoLabel: effectPropTarget.targets.length > 1
796
+ ? 'Reapply effect prop paste onto selected effects'
797
+ : 'Reapply effect prop paste',
773
798
  }).then(() => {
774
- (0, NotificationCenter_1.showNotification)('Pasted effect prop', 2000);
799
+ (0, NotificationCenter_1.showNotification)(effectPropTarget.targets.length > 1
800
+ ? 'Pasted effect prop onto selected effects'
801
+ : 'Pasted effect prop', 2000);
775
802
  });
776
803
  }
777
804
  const result = envelope === null
@@ -12,8 +12,22 @@ const containerStyle = {
12
12
  };
13
13
  const SWATCH_WIDTH = 20;
14
14
  const SWATCH_HEIGHT = 15;
15
+ const DEFAULT_SET_COLOR = '#808080';
16
+ const noneLabelStyle = {
17
+ color: colors_1.LIGHT_TEXT,
18
+ fontSize: 12,
19
+ };
20
+ const setButtonStyle = {
21
+ background: 'none',
22
+ border: 'none',
23
+ color: colors_1.BLUE,
24
+ cursor: 'pointer',
25
+ fontSize: 12,
26
+ margin: 0,
27
+ padding: 0,
28
+ };
15
29
  const TimelineColorField = ({ field, effectiveValue, propStatus, onSave, onDragValueChange, onDragEnd, }) => {
16
- var _a;
30
+ var _a, _b;
17
31
  const currentValue = typeof effectiveValue === 'string'
18
32
  ? effectiveValue
19
33
  : field.fieldSchema.type === 'color'
@@ -33,6 +47,11 @@ const TimelineColorField = ({ field, effectiveValue, propStatus, onSave, onDragV
33
47
  marginLeft: 5,
34
48
  };
35
49
  }, []);
50
+ if (currentValue === 'none') {
51
+ return (jsx_runtime_1.jsxs("span", { style: containerStyle, children: [
52
+ jsx_runtime_1.jsx("span", { style: noneLabelStyle, children: "None" }), jsx_runtime_1.jsx("button", { type: "button", style: setButtonStyle, title: `Set ${(_b = field.description) !== null && _b !== void 0 ? _b : field.key} to gray`, onClick: () => onChangeComplete(DEFAULT_SET_COLOR), children: "Set" })
53
+ ] }));
54
+ }
36
55
  return (jsx_runtime_1.jsx("span", { style: containerStyle, children: jsx_runtime_1.jsx(ColorPicker_1.ColorPicker, { value: currentValue, status: "ok", onChange: onChange, onChangeComplete: onChangeComplete, width: SWATCH_WIDTH, height: SWATCH_HEIGHT, disabled: false, name: field.key, title: currentValue, style: swatchStyle }) }));
37
56
  };
38
57
  exports.TimelineColorField = TimelineColorField;
@@ -6,10 +6,10 @@ const studio_shared_1 = require("@remotion/studio-shared");
6
6
  const react_1 = require("react");
7
7
  const remotion_1 = require("remotion");
8
8
  const client_id_1 = require("../../helpers/client-id");
9
+ const open_in_editor_1 = require("../../helpers/open-in-editor");
9
10
  const call_api_1 = require("../call-api");
10
11
  const ContextMenu_1 = require("../ContextMenu");
11
12
  const call_add_keyframe_1 = require("./call-add-keyframe");
12
- const get_animation_item_selection_for_frame_1 = require("./get-animation-item-selection-for-frame");
13
13
  const get_timeline_keyframes_1 = require("./get-timeline-keyframes");
14
14
  const save_effect_prop_1 = require("./save-effect-prop");
15
15
  const save_prop_queue_1 = require("./save-prop-queue");
@@ -21,7 +21,6 @@ const TimelineLayerEye_1 = require("./TimelineLayerEye");
21
21
  const TimelineRowChrome_1 = require("./TimelineRowChrome");
22
22
  const TimelineSchemaField_1 = require("./TimelineSchemaField");
23
23
  const TimelineSelection_1 = require("./TimelineSelection");
24
- const update_selected_easing_1 = require("./update-selected-easing");
25
24
  const fieldRowBase = {};
26
25
  const isKeyframedStatus = (status) => {
27
26
  return status.status === 'keyframed';
@@ -218,9 +217,6 @@ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath,
218
217
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
219
218
  const { getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
220
219
  const selection = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
221
- const { selectItems } = (0, TimelineSelection_1.useTimelineSelection)();
222
- const setFrame = remotion_1.Internals.useTimelineSetFrame();
223
- const videoConfig = (0, remotion_1.useVideoConfig)();
224
220
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
225
221
  const sourceFrame = timelinePosition - keyframeDisplayOffset;
226
222
  const style = (0, react_1.useMemo)(() => {
@@ -314,82 +310,17 @@ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath,
314
310
  },
315
311
  ];
316
312
  }, [canShowReset, onReset]);
317
- const seekToDisplayFrame = (0, react_1.useCallback)((frame) => {
318
- setFrame((current) => {
319
- const next = { ...current, [videoConfig.id]: frame };
320
- remotion_1.Internals.persistCurrentFrame(next);
321
- return next;
322
- });
323
- }, [setFrame, videoConfig.id]);
324
313
  const onPropertyDoubleClick = (0, react_1.useCallback)((event) => {
325
- if (propStatus === null || propStatus.status === 'computed') {
326
- return;
327
- }
328
- const keyframeSelection = {
329
- type: 'keyframe',
330
- nodePathInfo,
331
- frame: sourceFrame + keyframeDisplayOffset,
332
- };
333
- if (propStatus.status === 'static') {
334
- if (!keyframable || previewServerState.type !== 'connected') {
335
- return;
336
- }
337
- const value = remotion_1.Internals.getEffectiveVisualModeValue({
338
- propStatus,
339
- dragOverrideValue,
340
- frame: sourceFrame,
341
- defaultValue: field.fieldSchema.default,
342
- shouldResortToDefaultValueIfUndefined: true,
343
- });
344
- event.stopPropagation();
345
- (0, call_add_keyframe_1.callAddEffectKeyframe)({
346
- fileName: validatedLocation.source,
347
- nodePath,
348
- effectIndex: field.effectIndex,
349
- fieldKey: field.key,
350
- sourceFrame,
351
- value,
352
- schema: field.effectSchema,
353
- setPropStatuses,
354
- clientId: previewServerState.clientId,
355
- }).catch(() => undefined);
356
- selectItems([keyframeSelection], { reveal: true });
357
- seekToDisplayFrame(keyframeSelection.frame);
358
- return;
359
- }
360
- const targetSelection = (0, get_animation_item_selection_for_frame_1.getAnimationItemSelectionForSourceFrame)({
361
- includeEasings: (0, update_selected_easing_1.canEditEasingForInterpolationFunction)(propStatus.interpolationFunction),
362
- keyframeDisplayOffset,
363
- keyframes: propStatus.keyframes,
364
- nodePathInfo,
365
- sourceFrame,
366
- });
367
- if (targetSelection === null) {
314
+ if (!window.remotion_editorName ||
315
+ previewServerState.type !== 'connected') {
368
316
  return;
369
317
  }
370
318
  event.stopPropagation();
371
- selectItems([targetSelection], { reveal: true });
372
- if (targetSelection.type === 'keyframe') {
373
- seekToDisplayFrame(targetSelection.frame);
374
- }
375
- }, [
376
- dragOverrideValue,
377
- field.effectIndex,
378
- field.effectSchema,
379
- field.fieldSchema.default,
380
- field.key,
381
- keyframeDisplayOffset,
382
- keyframable,
383
- nodePath,
384
- nodePathInfo,
385
- previewServerState,
386
- propStatus,
387
- seekToDisplayFrame,
388
- selectItems,
389
- setPropStatuses,
390
- sourceFrame,
391
- validatedLocation.source,
392
- ]);
319
+ (0, open_in_editor_1.openOriginalPositionInEditorAtProperty)({
320
+ originalPosition: validatedLocation,
321
+ property: field.key,
322
+ }).catch(() => undefined);
323
+ }, [field.key, previewServerState.type, validatedLocation]);
393
324
  const row = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {}), keyframeControls: keyframeControls, arrow: jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {}), style: style, selected: selection.selected, selectable: selection.selectable, selectionItem: selection.selectionItem, onSelect: selection.onSelect, onDoubleClick: onPropertyDoubleClick, showSelectedBackground: true, containsSelection: false, outerHeight: null, children: jsx_runtime_1.jsx(TimelineFieldRowContent_1.TimelineFieldRowContent, { field: field, rowDepth: rowDepth, selected: selection.selected, children: jsx_runtime_1.jsx(exports.TimelineEffectPropValue, { field: field, nodePath: nodePath, validatedLocation: validatedLocation, sourceFrame: sourceFrame }) }) }));
394
325
  return (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { values: contextMenuValues, onOpen: selection.selectable ? selection.onSelect : null, children: row }));
395
326
  };
@@ -42,6 +42,13 @@ const TimelineKeyframeDiamond_1 = require("./TimelineKeyframeDiamond");
42
42
  const TimelineKeyframeEasingLine_1 = require("./TimelineKeyframeEasingLine");
43
43
  const TimelineSelection_1 = require("./TimelineSelection");
44
44
  const TimelineWidthProvider_1 = require("./TimelineWidthProvider");
45
+ const rowClipper = {
46
+ marginLeft: -timeline_layout_1.TIMELINE_PADDING,
47
+ marginRight: -timeline_layout_1.TIMELINE_PADDING,
48
+ overflow: 'hidden',
49
+ paddingLeft: timeline_layout_1.TIMELINE_PADDING,
50
+ paddingRight: timeline_layout_1.TIMELINE_PADDING,
51
+ };
45
52
  const row = {
46
53
  position: 'relative',
47
54
  };
@@ -54,7 +61,7 @@ const TimelineExpandedKeyframeRowUnmemoized = ({ height, keyframes, canEditEasin
54
61
  const easingSegments = canEditEasing
55
62
  ? (0, get_timeline_easing_segments_1.getTimelineEasingSegments)(keyframes)
56
63
  : [];
57
- return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [showSeparator ? jsx_runtime_1.jsx("div", { style: rowSeparator }) : null, jsx_runtime_1.jsxs("div", { style: { ...row, height }, children: [rowHighlightBackground && timelineWidth !== null ? (jsx_runtime_1.jsx("div", { style: (0, TimelineSelection_1.getTimelineSelectedTrackHighlightStyle)(timelineWidth, rowHighlightBackground) })) : null, easingSegments.map((segment) => (jsx_runtime_1.jsx(TimelineKeyframeEasingLine_1.TimelineKeyframeEasingLine, { fromFrame: segment.fromFrame, toFrame: segment.toFrame, rowHeight: height, nodePathInfo: nodePathInfo, segmentIndex: segment.segmentIndex }, `${segment.segmentIndex}-${segment.fromFrame}-${segment.toFrame}`))), keyframes.map((keyframe) => (jsx_runtime_1.jsx(TimelineKeyframeDiamond_1.TimelineKeyframeDiamond, { frame: keyframe.frame, rowHeight: height, nodePathInfo: nodePathInfo }, keyframe.frame)))] })
64
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [showSeparator ? jsx_runtime_1.jsx("div", { style: rowSeparator }) : null, jsx_runtime_1.jsx("div", { style: { ...rowClipper, height }, children: jsx_runtime_1.jsxs("div", { style: { ...row, height }, children: [rowHighlightBackground && timelineWidth !== null ? (jsx_runtime_1.jsx("div", { style: (0, TimelineSelection_1.getTimelineSelectedTrackHighlightStyle)(timelineWidth, rowHighlightBackground) })) : null, easingSegments.map((segment) => (jsx_runtime_1.jsx(TimelineKeyframeEasingLine_1.TimelineKeyframeEasingLine, { fromFrame: segment.fromFrame, toFrame: segment.toFrame, rowHeight: height, nodePathInfo: nodePathInfo, segmentIndex: segment.segmentIndex }, `${segment.segmentIndex}-${segment.fromFrame}-${segment.toFrame}`))), keyframes.map((keyframe) => (jsx_runtime_1.jsx(TimelineKeyframeDiamond_1.TimelineKeyframeDiamond, { frame: keyframe.frame, rowHeight: height, nodePathInfo: nodePathInfo }, keyframe.frame)))] }) })
58
65
  ] }));
59
66
  };
60
67
  exports.TimelineExpandedKeyframeRow = react_1.default.memo(TimelineExpandedKeyframeRowUnmemoized);
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const TimelineHeightContainer: React.NamedExoticComponent<{
4
- readonly shown: TrackWithHash[];
4
+ readonly shown: TimelineTrackData[];
5
5
  readonly hasBeenCut: boolean;
6
6
  readonly children: React.ReactNode;
7
7
  }>;
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const TimelineKeyframeTracksProvider: React.FC<{
4
- readonly tracks: readonly TrackWithHash[];
4
+ readonly tracks: readonly TimelineTrackData[];
5
5
  readonly children: React.ReactNode;
6
6
  }>;
7
- export declare const useTimelineKeyframeTracks: () => readonly TrackWithHash[];
7
+ export declare const useTimelineKeyframeTracks: () => readonly TimelineTrackData[];
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- import type { TrackWithHash } from '../../helpers/get-timeline-sequence-sort-key';
2
+ import type { TimelineTrackData } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const TimelineList: React.FC<{
4
- readonly timeline: TrackWithHash[];
4
+ readonly timeline: TimelineTrackData[];
5
5
  }>;
@@ -1,9 +1,13 @@
1
1
  import React from 'react';
2
2
  import type { ArrayFieldSchema, CanUpdateSequencePropStatusStatic, SequencePropsSubscriptionKey, VisibleFieldSchema } from 'remotion';
3
3
  import type { SchemaFieldInfo, TimelineFieldOnDragValueChange, TimelineFieldOnSave } from '../../helpers/timeline-layout';
4
+ type CaptionsFieldSchema = Extract<VisibleFieldSchema, {
5
+ type: 'remotion-captions';
6
+ }>;
7
+ type PrimitiveFieldSchema = Exclude<VisibleFieldSchema, ArrayFieldSchema | CaptionsFieldSchema>;
4
8
  export type TimelinePrimitiveFieldInfo = Omit<SchemaFieldInfo, 'fieldSchema' | 'typeName'> & {
5
- readonly fieldSchema: Exclude<VisibleFieldSchema, ArrayFieldSchema>;
6
- readonly typeName: Exclude<VisibleFieldSchema['type'], 'array'>;
9
+ readonly fieldSchema: PrimitiveFieldSchema;
10
+ readonly typeName: PrimitiveFieldSchema['type'];
7
11
  };
8
12
  export declare const isTimelinePrimitiveFieldInfo: (field: SchemaFieldInfo) => field is TimelinePrimitiveFieldInfo;
9
13
  export declare const TimelinePrimitiveFieldValue: React.FC<{
@@ -15,3 +19,4 @@ export declare const TimelinePrimitiveFieldValue: React.FC<{
15
19
  readonly effectiveValue: unknown;
16
20
  readonly scaleLockNodePath: SequencePropsSubscriptionKey | null;
17
21
  }>;
22
+ export {};
@@ -17,8 +17,16 @@ const TimelineUvCoordinateField_1 = require("./TimelineUvCoordinateField");
17
17
  const inlineWrapper = {
18
18
  fontSize: 12,
19
19
  };
20
+ const assetInlineWrapper = {
21
+ ...inlineWrapper,
22
+ display: 'flex',
23
+ flex: 1,
24
+ minWidth: 0,
25
+ };
20
26
  const isTimelinePrimitiveFieldInfo = (field) => {
21
- return field.typeName !== 'array' && field.fieldSchema.type !== 'array';
27
+ return (field.typeName !== 'array' &&
28
+ field.fieldSchema.type !== 'array' &&
29
+ field.fieldSchema.type !== 'remotion-captions');
22
30
  };
23
31
  exports.isTimelinePrimitiveFieldInfo = isTimelinePrimitiveFieldInfo;
24
32
  const TimelinePrimitiveFieldValue = ({ field, onSave, onDragValueChange, onDragEnd, propStatus, effectiveValue, scaleLockNodePath, }) => {
@@ -60,7 +68,7 @@ const TimelinePrimitiveFieldValue = ({ field, onSave, onDragValueChange, onDragE
60
68
  return (jsx_runtime_1.jsx("span", { style: inlineWrapper, children: jsx_runtime_1.jsx(TimelineFontFamilyField_1.TimelineFontFamilyField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
61
69
  }
62
70
  if (field.typeName === 'asset') {
63
- return (jsx_runtime_1.jsx("span", { style: inlineWrapper, children: jsx_runtime_1.jsx(TimelineAssetField_1.TimelineAssetField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
71
+ return (jsx_runtime_1.jsx("span", { style: assetInlineWrapper, children: jsx_runtime_1.jsx(TimelineAssetField_1.TimelineAssetField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
64
72
  }
65
73
  throw new Error(`Unsupported field type: ${field.typeName}`);
66
74
  };
@@ -14,9 +14,12 @@ export declare const TimelineRowChrome: React.FC<{
14
14
  readonly onSelect: (interaction?: TimelineSelectionInteraction) => void;
15
15
  readonly showSelectedBackground: boolean;
16
16
  readonly containsSelection: boolean;
17
+ readonly hovered?: boolean;
17
18
  readonly outerHeight: number | null;
18
19
  readonly onDragLeave?: (e: React.DragEvent<HTMLDivElement>) => void;
19
20
  readonly onDragOver?: (e: React.DragEvent<HTMLDivElement>) => void;
20
21
  readonly onDrop?: (e: React.DragEvent<HTMLDivElement>) => void;
21
22
  readonly onDoubleClick?: (e: React.MouseEvent<HTMLDivElement>) => void;
23
+ readonly onPointerEnter?: () => void;
24
+ readonly onPointerLeave?: () => void;
22
25
  }>;