@remotion/studio 4.0.523 → 4.0.525

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 (182) hide show
  1. package/dist/components/ActionTooltip.d.ts +11 -0
  2. package/dist/components/ActionTooltip.js +153 -0
  3. package/dist/components/AppLaunchButton.js +2 -0
  4. package/dist/components/AssetSelectorModal.d.ts +6 -0
  5. package/dist/components/AssetSelectorModal.js +174 -0
  6. package/dist/components/Canvas.js +18 -3
  7. package/dist/components/CheckboardToggle.js +8 -10
  8. package/dist/components/ColorPicker/AlphaSlider.js +1 -1
  9. package/dist/components/ColorPicker/HueSlider.js +1 -1
  10. package/dist/components/ColorPicker/SaturationValueArea.js +1 -1
  11. package/dist/components/CompositionSelector.js +1 -0
  12. package/dist/components/CompositionSelectorItem.js +1 -0
  13. package/dist/components/EditorGuides/Guide.js +1 -1
  14. package/dist/components/ElementInstallConfirmation.js +35 -62
  15. package/dist/components/FullscreenToggle.js +5 -8
  16. package/dist/components/GlobalKeybindings.js +71 -0
  17. package/dist/components/InspectorLocationCopy.js +1 -1
  18. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  19. package/dist/components/InspectorOpenInEditor.js +18 -15
  20. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +6 -7
  21. package/dist/components/InspectorPanel/CompositionMetadata.js +1 -0
  22. package/dist/components/InspectorPanel/ElementLibraryButton.js +1 -0
  23. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +4 -12
  24. package/dist/components/InspectorSequenceSection.js +23 -14
  25. package/dist/components/LazySyntaxHighlightedSource.d.ts +4 -0
  26. package/dist/components/LazySyntaxHighlightedSource.js +43 -0
  27. package/dist/components/LoopToggle.js +9 -2
  28. package/dist/components/Menu/MenuItem.js +1 -2
  29. package/dist/components/MenuBuildIndicator.js +1 -1
  30. package/dist/components/MenuToolbar.js +6 -4
  31. package/dist/components/Modals.js +2 -1
  32. package/dist/components/MuteToggle.d.ts +1 -0
  33. package/dist/components/MuteToggle.js +17 -6
  34. package/dist/components/NewComposition/CodemodFooter.js +1 -0
  35. package/dist/components/NewComposition/DeleteComposition.js +42 -6
  36. package/dist/components/NewComposition/DeleteFolder.js +1 -0
  37. package/dist/components/NewComposition/DuplicateComposition.js +5 -0
  38. package/dist/components/NewComposition/InputDragger.js +2 -2
  39. package/dist/components/NewComposition/NewComposition.d.ts +1 -0
  40. package/dist/components/NewComposition/NewComposition.js +5 -4
  41. package/dist/components/NewComposition/NewFolder.js +31 -6
  42. package/dist/components/NewComposition/RenameComposition.js +3 -2
  43. package/dist/components/NewComposition/RenameFolder.js +3 -4
  44. package/dist/components/NewComposition/SlugPreview.d.ts +7 -0
  45. package/dist/components/NewComposition/SlugPreview.js +18 -0
  46. package/dist/components/NewComposition/duplicate-composition-api.d.ts +3 -2
  47. package/dist/components/NewComposition/duplicate-composition-api.js +9 -2
  48. package/dist/components/Notifications/NotificationCenter.d.ts +1 -0
  49. package/dist/components/Notifications/NotificationCenter.js +22 -1
  50. package/dist/components/OutlineToggle.js +17 -10
  51. package/dist/components/PlayPause.js +7 -1
  52. package/dist/components/PlaybackKeyboardShortcutsManager.d.ts +2 -0
  53. package/dist/components/PlaybackKeyboardShortcutsManager.js +36 -1
  54. package/dist/components/PlaybackRateSelector.js +2 -2
  55. package/dist/components/Preview.js +0 -3
  56. package/dist/components/PreviewToolbar.js +4 -7
  57. package/dist/components/PreviewToolbarOverflowButton.js +10 -3
  58. package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
  59. package/dist/components/RenderButton.js +40 -4
  60. package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
  61. package/dist/components/RenderModal/render-modals.js +3 -0
  62. package/dist/components/RenderQueue/CaptionQueueItem.js +2 -1
  63. package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +2 -1
  64. package/dist/components/RenderQueue/RenderQueueDownloadItem.js +2 -1
  65. package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +2 -1
  66. package/dist/components/RenderQueue/RenderQueueOpenInFolder.js +2 -1
  67. package/dist/components/RenderQueue/RenderQueueRemoveItem.js +2 -1
  68. package/dist/components/RenderQueue/RenderQueueRepeat.js +2 -1
  69. package/dist/components/RenderQueue/VideoMattingQueueItem.js +2 -1
  70. package/dist/components/RenderQueue/actions.d.ts +2 -1
  71. package/dist/components/RenderQueue/actions.js +2 -1
  72. package/dist/components/RulersAndGuidesToggle.js +8 -1
  73. package/dist/components/SegmentedButton.d.ts +1 -0
  74. package/dist/components/SegmentedButton.js +9 -3
  75. package/dist/components/SelectedOutlineElement.js +16 -6
  76. package/dist/components/SelectedOutlinePolygon.js +4 -2
  77. package/dist/components/SettingsButton.js +8 -6
  78. package/dist/components/SettingsContext.d.ts +8 -0
  79. package/dist/components/SettingsContext.js +57 -2
  80. package/dist/components/SettingsModal.js +4 -1
  81. package/dist/components/SettingsModalFooter.js +1 -1
  82. package/dist/components/SidebarCollapserControls.js +13 -16
  83. package/dist/components/SizeSelector.js +2 -2
  84. package/dist/components/SkillsSettings.js +35 -4
  85. package/dist/components/SnappingToggle.js +7 -8
  86. package/dist/components/Splitter/SplitterHandle.js +1 -2
  87. package/dist/components/StudioSettings.js +32 -18
  88. package/dist/components/SyntaxHighlightedSource.d.ts +5 -0
  89. package/dist/components/{HighlightedElementSource.js → SyntaxHighlightedSource.js} +2 -2
  90. package/dist/components/Tabs/vertical.d.ts +1 -1
  91. package/dist/components/Tabs/vertical.js +16 -2
  92. package/dist/components/Timeline/EasingEditorModal.js +2 -2
  93. package/dist/components/Timeline/Timeline.js +47 -39
  94. package/dist/components/Timeline/TimelineAssetField.js +148 -9
  95. package/dist/components/Timeline/TimelineDragHandler.js +1 -2
  96. package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
  97. package/dist/components/Timeline/TimelineEffectItem.js +2 -2
  98. package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
  99. package/dist/components/Timeline/TimelineEffectPropItem.js +2 -2
  100. package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
  101. package/dist/components/Timeline/TimelineInOutDragHandler.js +1 -2
  102. package/dist/components/Timeline/TimelineLayerChildren.js +12 -9
  103. package/dist/components/Timeline/TimelineSchemaField.js +8 -1
  104. package/dist/components/Timeline/TimelineSelection.d.ts +3 -1
  105. package/dist/components/Timeline/TimelineSelection.js +32 -5
  106. package/dist/components/Timeline/TimelineSequence.js +6 -6
  107. package/dist/components/Timeline/TimelineSequenceItem.js +12 -10
  108. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +3 -12
  109. package/dist/components/Timeline/TimelineTranslateField.js +25 -12
  110. package/dist/components/Timeline/TimelineZoomControls.js +2 -1
  111. package/dist/components/Timeline/get-sequence-context-menu-items.js +22 -6
  112. package/dist/components/Timeline/timeline-field-display-utils.js +12 -7
  113. package/dist/components/Timeline/timeline-translate-utils.d.ts +17 -0
  114. package/dist/components/Timeline/timeline-translate-utils.js +53 -12
  115. package/dist/components/Timeline/use-open-sequence-in-apps.d.ts +2 -0
  116. package/dist/components/Timeline/use-open-sequence-in-apps.js +17 -0
  117. package/dist/components/Timeline/use-timeline-asset-drop.js +17 -3
  118. package/dist/components/Timeline/use-timeline-keyframe-drag.js +4 -4
  119. package/dist/components/TimelineCombobox.d.ts +1 -0
  120. package/dist/components/TimelineCombobox.js +9 -4
  121. package/dist/components/TimelineInOutToggle.js +8 -15
  122. package/dist/components/UndoRedoButtons.js +11 -0
  123. package/dist/components/composition-menu-items.js +56 -2
  124. package/dist/components/folder-menu-items.js +44 -0
  125. package/dist/components/get-open-in-menu-items.js +1 -1
  126. package/dist/components/handle-drop.js +3 -2
  127. package/dist/components/import-assets.d.ts +24 -1
  128. package/dist/components/import-assets.js +3 -1
  129. package/dist/components/keyboard-shortcuts.d.ts +4 -4
  130. package/dist/components/keyboard-shortcuts.js +28 -9
  131. package/dist/error-overlay/remotion-overlay/CodeFrame.js +29 -18
  132. package/dist/esm/LazyModels-gfmpcy4h.mjs +11 -0
  133. package/dist/esm/LazyModels-m1rf06wh.mjs +11 -0
  134. package/dist/esm/{HighlightedElementSource-jfc66k4p.mjs → SyntaxHighlightedSource-3xks91rz.mjs} +4 -4
  135. package/dist/esm/{TranscriptionModal-916jqhry.mjs → TranscriptionModal-8pvrehg4.mjs} +7 -7
  136. package/dist/esm/{VideoMattingModal-2tm79s9b.mjs → VideoMattingModal-fefbzgka.mjs} +7 -7
  137. package/dist/esm/{index-xhe2m2qr.mjs → index-0x13f28h.mjs} +35 -13
  138. package/dist/esm/{index-sgtmgc4h.mjs → index-1089795y.mjs} +3 -3
  139. package/dist/esm/{index-hy4xcgty.mjs → index-41kqns5c.mjs} +5 -3
  140. package/dist/esm/{index-6cvm9a65.mjs → index-ggqpre9v.mjs} +2868 -2099
  141. package/dist/esm/{index-czwvnn9g.mjs → index-hbezgbbq.mjs} +1 -1
  142. package/dist/esm/{index-1x7bsdh6.mjs → index-jrw61pkj.mjs} +2 -2
  143. package/dist/esm/{index-jg13hf2g.mjs → index-k426ye99.mjs} +2 -1
  144. package/dist/esm/{index-te66vvrp.mjs → index-mww32xc8.mjs} +4 -4
  145. package/dist/esm/{index-x7t2y7ws.mjs → index-s848rffx.mjs} +6985 -5956
  146. package/dist/esm/{index-3hgr6gjx.mjs → index-tzxb8808.mjs} +1 -1
  147. package/dist/esm/{index-5qddp5h7.mjs → index-vsxrxfpj.mjs} +1 -1
  148. package/dist/esm/index.mjs +3 -3
  149. package/dist/esm/internals.mjs +8 -8
  150. package/dist/esm/previewEntry.mjs +8 -8
  151. package/dist/esm/renderEntry.mjs +3 -3
  152. package/dist/helpers/colors.d.ts +1 -0
  153. package/dist/helpers/colors.js +4 -3
  154. package/dist/helpers/get-git-menu-item.d.ts +4 -0
  155. package/dist/helpers/get-git-menu-item.js +8 -1
  156. package/dist/helpers/get-sequence-double-click-action.d.ts +3 -3
  157. package/dist/helpers/get-sequence-double-click-action.js +2 -2
  158. package/dist/helpers/inject-css.js +2 -2
  159. package/dist/helpers/pointer-session.d.ts +1 -0
  160. package/dist/helpers/pointer-session.js +10 -1
  161. package/dist/helpers/prism-vsc-dark-plus.d.ts +1 -0
  162. package/dist/helpers/prism-vsc-dark-plus.js +305 -0
  163. package/dist/helpers/studio-runtime-config.d.ts +1 -1
  164. package/dist/helpers/use-create-composition.d.ts +1 -0
  165. package/dist/helpers/use-create-composition.js +17 -7
  166. package/dist/helpers/use-keybinding.d.ts +1 -1
  167. package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
  168. package/dist/helpers/use-media-metadata.js +5 -1
  169. package/dist/helpers/use-menu-structure.js +6 -2
  170. package/dist/helpers/use-rename-composition.d.ts +1 -0
  171. package/dist/helpers/use-rename-composition.js +16 -5
  172. package/dist/icons/skills.js +1 -1
  173. package/dist/renderEntry.js +2 -2
  174. package/dist/state/modals.d.ts +13 -1
  175. package/dist/state/z-index.js +1 -3
  176. package/package.json +20 -20
  177. package/dist/components/HighlightedElementSource.d.ts +0 -5
  178. package/dist/esm/LazyModels-2trdm224.mjs +0 -11
  179. package/dist/esm/LazyModels-fjb5ckaq.mjs +0 -11
  180. package/dist/helpers/prism-tomorrow.d.ts +0 -1
  181. package/dist/helpers/prism-tomorrow.js +0 -151
  182. /package/dist/esm/{resolve-composition-component-location-14148845.mjs → resolve-composition-component-location-bt2d6qxq.mjs} +0 -0
@@ -6,6 +6,8 @@ const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
7
  const no_react_1 = require("remotion/no-react");
8
8
  const write_static_file_1 = require("../../api/write-static-file");
9
+ const colors_1 = require("../../helpers/colors");
10
+ const hoverable_1 = require("../../helpers/hoverable");
9
11
  const pen_1 = require("../../icons/pen");
10
12
  const modals_1 = require("../../state/modals");
11
13
  const import_assets_1 = require("../import-assets");
@@ -13,6 +15,7 @@ const InlineAction_1 = require("../InlineAction");
13
15
  const common_1 = require("../InspectorPanel/common");
14
16
  const NotificationCenter_1 = require("../Notifications/NotificationCenter");
15
17
  const use_static_files_1 = require("../use-static-files");
18
+ const timeline_asset_link_1 = require("./timeline-asset-link");
16
19
  const penIcon = {
17
20
  display: 'block',
18
21
  height: 14,
@@ -37,6 +40,72 @@ const assetTypeToAccept = {
37
40
  video: 'video/*',
38
41
  image: 'image/*',
39
42
  };
43
+ const imageAssetField = {
44
+ alignItems: 'center',
45
+ display: 'flex',
46
+ flex: 1,
47
+ gap: 8,
48
+ minWidth: 0,
49
+ padding: '4px 12px',
50
+ };
51
+ const thumbnailButton = {
52
+ ...(0, hoverable_1.hoverableStyle)({
53
+ idleBackground: colors_1.TRANSPARENT,
54
+ hoverBackground: colors_1.TRANSPARENT,
55
+ idleColor: colors_1.LIGHT_TEXT,
56
+ hoverColor: colors_1.WHITE,
57
+ }),
58
+ appearance: 'none',
59
+ border: 'none',
60
+ cursor: 'default',
61
+ flexShrink: 0,
62
+ height: 40,
63
+ margin: 0,
64
+ padding: 0,
65
+ width: 40,
66
+ };
67
+ const thumbnail = {
68
+ display: 'block',
69
+ height: '100%',
70
+ objectFit: 'contain',
71
+ width: '100%',
72
+ };
73
+ const imageAssetInfo = {
74
+ ...(0, hoverable_1.hoverableStyle)({
75
+ idleBackground: colors_1.TRANSPARENT,
76
+ hoverBackground: colors_1.TRANSPARENT,
77
+ idleColor: colors_1.LIGHT_TEXT,
78
+ hoverColor: colors_1.WHITE,
79
+ }),
80
+ appearance: 'none',
81
+ border: 'none',
82
+ display: 'flex',
83
+ flex: 1,
84
+ flexDirection: 'column',
85
+ gap: 2,
86
+ margin: 0,
87
+ minWidth: 0,
88
+ padding: 0,
89
+ textAlign: 'left',
90
+ };
91
+ const imageAssetName = {
92
+ color: colors_1.WHITE,
93
+ fontFamily: 'sans-serif',
94
+ fontSize: 12,
95
+ lineHeight: '16px',
96
+ overflow: 'hidden',
97
+ textOverflow: 'ellipsis',
98
+ whiteSpace: 'nowrap',
99
+ };
100
+ const imageAssetSource = {
101
+ color: colors_1.LIGHT_TEXT,
102
+ fontFamily: 'sans-serif',
103
+ fontSize: 11,
104
+ lineHeight: '14px',
105
+ overflow: 'hidden',
106
+ textOverflow: 'ellipsis',
107
+ whiteSpace: 'nowrap',
108
+ };
40
109
  exports.AssetSelectionContext = (0, react_1.createContext)({
41
110
  getSourceAction: () => null,
42
111
  sourceAction: null,
@@ -49,6 +118,7 @@ const toFileToken = (name) => {
49
118
  };
50
119
  exports.toFileToken = toFileToken;
51
120
  const TimelineAssetField = ({ field, effectiveValue, propStatus, onSave, onDragValueChange, onDragEnd, }) => {
121
+ var _a, _b;
52
122
  if (field.fieldSchema.type !== 'asset') {
53
123
  throw new Error('TimelineAssetField rendered for non-asset field');
54
124
  }
@@ -73,6 +143,15 @@ const TimelineAssetField = ({ field, effectiveValue, propStatus, onSave, onDragV
73
143
  onDragEnd();
74
144
  });
75
145
  }, [propStatus.codeValue, onDragValueChange, onSave, onDragEnd]);
146
+ const onSelectUrl = (0, react_1.useCallback)((url) => {
147
+ if (url === propStatus.codeValue) {
148
+ return;
149
+ }
150
+ onDragValueChange(url);
151
+ onSave(url).finally(() => {
152
+ onDragEnd();
153
+ });
154
+ }, [propStatus.codeValue, onDragValueChange, onDragEnd, onSave]);
76
155
  const selectFile = (0, react_1.useCallback)(async () => {
77
156
  const [file] = await (0, import_assets_1.pickFilesToImport)({
78
157
  multiple: false,
@@ -103,25 +182,85 @@ const TimelineAssetField = ({ field, effectiveValue, propStatus, onSave, onDragV
103
182
  }
104
183
  }, [assetType, onSelect, staticFiles]);
105
184
  const openAssetSelection = (0, react_1.useCallback)(() => {
185
+ const assetSelection = {
186
+ initialQuery,
187
+ onSelectFile: () => {
188
+ selectFile().catch(() => undefined);
189
+ },
190
+ onSelected: (asset) => onSelect(asset.name, asset.src),
191
+ };
192
+ if (assetType !== undefined) {
193
+ const linkInfo = typeof effectiveValue === 'string'
194
+ ? (0, timeline_asset_link_1.getTimelineAssetLinkInfo)(effectiveValue)
195
+ : null;
196
+ setSelectedModal({
197
+ type: 'asset-selection',
198
+ assetType,
199
+ initialUrl: (linkInfo === null || linkInfo === void 0 ? void 0 : linkInfo.kind) === 'remote' ? linkInfo.href : null,
200
+ invocationTimestamp: Date.now(),
201
+ assetSelection,
202
+ onSelectedUrl: onSelectUrl,
203
+ });
204
+ return;
205
+ }
106
206
  setSelectedModal({
107
207
  type: 'quick-switcher',
108
208
  mode: 'assets',
109
209
  invocationTimestamp: Date.now(),
110
- assetSelection: {
111
- initialQuery,
112
- onSelectFile: () => {
113
- selectFile().catch(() => undefined);
114
- },
115
- onSelected: (asset) => onSelect(asset.name, asset.src),
116
- },
210
+ assetSelection,
117
211
  compositionSelection: null,
118
212
  });
119
- }, [initialQuery, onSelect, selectFile, setSelectedModal]);
213
+ }, [
214
+ assetType,
215
+ effectiveValue,
216
+ initialQuery,
217
+ onSelect,
218
+ onSelectUrl,
219
+ selectFile,
220
+ setSelectedModal,
221
+ ]);
120
222
  const action = (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: openAssetSelection, disabled: window.remotion_isReadOnlyStudio, title: "Change source", renderAction: (color) => jsx_runtime_1.jsx(pen_1.PenIcon, { color: color, style: penIcon }) }));
223
+ if (assetType === 'image' && typeof effectiveValue === 'string') {
224
+ const linkInfo = (0, timeline_asset_link_1.getTimelineAssetLinkInfo)(effectiveValue);
225
+ if (linkInfo !== null) {
226
+ let name;
227
+ let source;
228
+ let previewSrc;
229
+ if (linkInfo.kind === 'local') {
230
+ name = (_a = linkInfo.assetPath.split('/').pop()) !== null && _a !== void 0 ? _a : linkInfo.assetPath;
231
+ source = 'Project asset';
232
+ previewSrc = (0, remotion_1.staticFile)(linkInfo.assetPath);
233
+ }
234
+ else {
235
+ previewSrc = linkInfo.href.startsWith('//')
236
+ ? `https:${linkInfo.href}`
237
+ : linkInfo.href;
238
+ try {
239
+ const url = new URL(previewSrc);
240
+ const encodedName = url.pathname.split('/').filter(Boolean).pop();
241
+ name = encodedName ? decodeURIComponent(encodedName) : url.hostname;
242
+ source = url.hostname;
243
+ }
244
+ catch (_c) {
245
+ name = 'Remote image';
246
+ source = linkInfo.href;
247
+ }
248
+ }
249
+ const title = (_b = inlineSourceAction === null || inlineSourceAction === void 0 ? void 0 : inlineSourceAction.title) !== null && _b !== void 0 ? _b : linkInfo.title;
250
+ return (jsx_runtime_1.jsxs("div", { style: imageAssetField, children: [
251
+ jsx_runtime_1.jsx("button", { "aria-label": `Replace ${name}`, className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, disabled: window.remotion_isReadOnlyStudio, onClick: openAssetSelection, style: thumbnailButton, title: title, type: "button", children: jsx_runtime_1.jsx("img", { alt: "", src: previewSrc, style: thumbnail }) }), jsx_runtime_1.jsxs("button", { "aria-label": `Replace ${name}`, className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, disabled: window.remotion_isReadOnlyStudio, onClick: openAssetSelection, style: imageAssetInfo, title: title, type: "button", children: [
252
+ jsx_runtime_1.jsx("span", { style: imageAssetName, children: name }), jsx_runtime_1.jsx("span", { style: imageAssetSource, children: source })
253
+ ] }), action] }));
254
+ }
255
+ }
121
256
  if (inlineSourceAction === null) {
122
257
  return action;
123
258
  }
124
259
  return (jsx_runtime_1.jsxs("div", { style: sourceActions, children: [
125
- jsx_runtime_1.jsx(common_1.InspectorQuickAction, { ...inlineSourceAction, size: "compact", style: standaloneSourceActionStyle }), action] }));
260
+ jsx_runtime_1.jsx(common_1.InspectorQuickAction, { ...inlineSourceAction, disabled: assetType === undefined
261
+ ? inlineSourceAction.disabled
262
+ : window.remotion_isReadOnlyStudio, onClick: assetType === undefined
263
+ ? inlineSourceAction.onClick
264
+ : openAssetSelection, size: "compact", style: standaloneSourceActionStyle }), action] }));
126
265
  };
127
266
  exports.TimelineAssetField = TimelineAssetField;
@@ -279,8 +279,7 @@ const TimelineDragHandlerInner = () => {
279
279
  captureTarget: dragging.target,
280
280
  onMove: onPointerMoveScrubbing,
281
281
  onEnd: (reason, endEvent) => {
282
- if ((reason === 'pointerup' || reason === 'buttons-released') &&
283
- endEvent) {
282
+ if ((0, pointer_session_1.isPointerSessionRelease)(reason, endEvent)) {
284
283
  onPointerUpScrubbing(endEvent);
285
284
  }
286
285
  else {
@@ -13,6 +13,7 @@ export declare const TimelineEffectItem: React.FC<{
13
13
  readonly validatedLocation: CodePosition;
14
14
  readonly rowDepth: number;
15
15
  readonly labelNextToToggle: boolean;
16
+ readonly revealInInspector: boolean;
16
17
  readonly getIsExpanded: GetIsExpanded;
17
18
  readonly toggleTrack: (nodePathInfo: SequenceNodePathInfo) => void;
18
19
  }>;
@@ -75,7 +75,7 @@ const getEffectReorderDragData = (dataTransfer) => {
75
75
  const getDestinationIndex = ({ fromIndex, insertionIndex, }) => {
76
76
  return insertionIndex > fromIndex ? insertionIndex - 1 : insertionIndex;
77
77
  };
78
- const TimelineEffectItem = ({ label, nodePathInfo, effectIndex, effectSchema, documentationLink, nodePath, validatedLocation, rowDepth, labelNextToToggle, getIsExpanded, toggleTrack, }) => {
78
+ const TimelineEffectItem = ({ label, nodePathInfo, effectIndex, effectSchema, documentationLink, nodePath, validatedLocation, rowDepth, labelNextToToggle, revealInInspector, getIsExpanded, toggleTrack, }) => {
79
79
  var _a;
80
80
  var _b;
81
81
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
@@ -83,7 +83,7 @@ const TimelineEffectItem = ({ label, nodePathInfo, effectIndex, effectSchema, do
83
83
  const canMutateEffects = (0, browser_studio_operations_1.canUseEffectOperations)();
84
84
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
85
85
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
86
- const selection = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
86
+ const selection = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo, revealInInspector);
87
87
  const containsSelection = (0, TimelineSelection_1.useTimelineRowContainsSelection)(nodePathInfo);
88
88
  const [dropIndicator, setDropIndicator] = (0, react_1.useState)(null);
89
89
  const effectStatus = (0, react_1.useMemo)(() => remotion_1.Internals.getEffectPropStatusesCtx({
@@ -19,5 +19,6 @@ export declare const TimelineEffectPropItem: React.FC<{
19
19
  readonly nodePathInfo: SequenceNodePathInfo;
20
20
  readonly keyframeDisplayOffset: number;
21
21
  readonly keyframeControlsMode: TimelineKeyframeControlsMode;
22
+ readonly revealInInspector: boolean;
22
23
  readonly runtimeValueStore: RuntimeValueStore | null;
23
24
  }>;
@@ -232,7 +232,7 @@ const TimelineEffectPropValueAtCurrentFrame = ({ field, nodePath, validatedLocat
232
232
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
233
233
  return (jsx_runtime_1.jsx(exports.TimelineEffectPropValue, { field: field, nodePath: nodePath, validatedLocation: validatedLocation, sourceFrame: timelinePosition - keyframeDisplayOffset, runtimeValueStore: runtimeValueStore }));
234
234
  };
235
- const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath, nodePathInfo, keyframeDisplayOffset, keyframeControlsMode, runtimeValueStore, }) => {
235
+ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath, nodePathInfo, keyframeDisplayOffset, keyframeControlsMode, revealInInspector, runtimeValueStore, }) => {
236
236
  var _a;
237
237
  var _b;
238
238
  const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
@@ -240,7 +240,7 @@ const TimelineEffectPropItem = ({ field, validatedLocation, rowDepth, nodePath,
240
240
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
241
241
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
242
242
  const { getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
243
- const selection = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo);
243
+ const selection = (0, TimelineSelection_1.useTimelineRowSelection)(nodePathInfo, revealInInspector);
244
244
  const style = (0, react_1.useMemo)(() => {
245
245
  return field.typeName === 'text-content'
246
246
  ? fieldRowBase
@@ -40,7 +40,7 @@ const TimelineExpandedRowInner = ({ node, depth, nestedDepth, rowDepthBase, getI
40
40
  if (node.effectInfo) {
41
41
  return (
42
42
  // A single effect
43
- jsx_runtime_1.jsx(TimelineEffectItem_1.TimelineEffectItem, { label: node.label, nodePathInfo: node.nodePathInfo, effectIndex: node.effectInfo.effectIndex, effectSchema: node.effectInfo.effectSchema, documentationLink: node.effectInfo.documentationLink, nodePath: nodePath, validatedLocation: validatedLocation, rowDepth: rowDepth, labelNextToToggle: isInspector, getIsExpanded: getIsExpanded, toggleTrack: toggleTrack }));
43
+ jsx_runtime_1.jsx(TimelineEffectItem_1.TimelineEffectItem, { label: node.label, nodePathInfo: node.nodePathInfo, effectIndex: node.effectInfo.effectIndex, effectSchema: node.effectInfo.effectSchema, documentationLink: node.effectInfo.documentationLink, nodePath: nodePath, validatedLocation: validatedLocation, rowDepth: rowDepth, labelNextToToggle: isInspector, revealInInspector: !isInspector, getIsExpanded: getIsExpanded, toggleTrack: toggleTrack }));
44
44
  }
45
45
  // Group like "Effects"
46
46
  const isExpanded = getIsExpanded(node.nodePathInfo);
@@ -50,7 +50,7 @@ const TimelineExpandedRowInner = ({ node, depth, nestedDepth, rowDepthBase, getI
50
50
  }
51
51
  if (node.field) {
52
52
  if (node.field.kind === 'effect-field') {
53
- return (jsx_runtime_1.jsx(TimelineEffectPropItem_1.TimelineEffectPropItem, { field: node.field, validatedLocation: validatedLocation, rowDepth: isInspector ? rowDepth - 1 : rowDepth, nodePath: nodePath, nodePathInfo: node.nodePathInfo, keyframeDisplayOffset: keyframeDisplayOffset, keyframeControlsMode: keyframeControlsMode, runtimeValueStore: node.runtimeValueStore }));
53
+ return (jsx_runtime_1.jsx(TimelineEffectPropItem_1.TimelineEffectPropItem, { field: node.field, validatedLocation: validatedLocation, rowDepth: isInspector ? rowDepth - 1 : rowDepth, nodePath: nodePath, nodePathInfo: node.nodePathInfo, keyframeDisplayOffset: keyframeDisplayOffset, keyframeControlsMode: keyframeControlsMode, revealInInspector: !isInspector, runtimeValueStore: node.runtimeValueStore }));
54
54
  }
55
55
  if (node.field.kind === 'sequence-field') {
56
56
  return (jsx_runtime_1.jsx(TimelineSequencePropItem_1.TimelineSequencePropItem, { field: node.field, validatedLocation: validatedLocation, rowDepth: rowDepth, nodePath: nodePath, nodePathInfo: node.nodePathInfo, schema: schema, keyframeDisplayOffset: keyframeDisplayOffset, keyframeControlsMode: keyframeControlsMode, runtimeValue: node.runtimeValue }));
@@ -279,8 +279,7 @@ const TimelineInOutDragHandlerInner = () => {
279
279
  captureTarget: inOutDragging.target,
280
280
  onMove: onPointerMoveInOut,
281
281
  onEnd: (reason, endEvent) => {
282
- if ((reason === 'pointerup' || reason === 'buttons-released') &&
283
- endEvent) {
282
+ if ((0, pointer_session_1.isPointerSessionRelease)(reason, endEvent)) {
284
283
  onPointerUpInOut(endEvent);
285
284
  }
286
285
  else {
@@ -8,7 +8,16 @@ const hoverable_1 = require("../../helpers/hoverable");
8
8
  const persist_boolean_map_1 = require("../../helpers/persist-boolean-map");
9
9
  const timeline_node_path_key_1 = require("../../helpers/timeline-node-path-key");
10
10
  const TimelineCollapseToggle_1 = require("./TimelineCollapseToggle");
11
- const TimelineExpandArrowButton_1 = require("./TimelineExpandArrowButton");
11
+ // Reserve the same space before and after children register or unregister.
12
+ const toggleLayout = {
13
+ display: 'flex',
14
+ alignItems: 'center',
15
+ justifyContent: 'center',
16
+ width: 12,
17
+ height: 16,
18
+ marginRight: 0,
19
+ flexShrink: 0,
20
+ };
12
21
  const STORAGE_KEY = 'remotion.editor.collapsedLayerChildren.v1';
13
22
  const TimelineLayerChildrenContext = (0, react_1.createContext)(null);
14
23
  exports.TimelineLayerChildrenProvider = TimelineLayerChildrenContext.Provider;
@@ -104,7 +113,7 @@ const TimelineLayerChildrenToggle = ({ sequence }) => {
104
113
  }, [context, key]);
105
114
  const stopPropagation = (0, react_1.useCallback)((event) => event.stopPropagation(), []);
106
115
  if (!(context === null || context === void 0 ? void 0 : context.parents.has(sequence.id)) || key === undefined) {
107
- return jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {});
116
+ return jsx_runtime_1.jsx("div", { style: toggleLayout });
108
117
  }
109
118
  const label = `${isCollapsed ? 'Expand' : 'Collapse'} children of ${sequence.displayName}`;
110
119
  return (jsx_runtime_1.jsx("button", { type: "button", className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, "aria-label": label, "aria-expanded": !isCollapsed, title: label, onClick: onClick, onPointerDown: stopPropagation, onDoubleClick: stopPropagation, style: {
@@ -114,16 +123,10 @@ const TimelineLayerChildrenToggle = ({ sequence }) => {
114
123
  idleColor: colors_1.LIGHT_TEXT,
115
124
  hoverColor: colors_1.WHITE,
116
125
  }),
126
+ ...toggleLayout,
117
127
  border: 'none',
118
128
  padding: 0,
119
129
  cursor: 'default',
120
- display: 'flex',
121
- alignItems: 'center',
122
- justifyContent: 'center',
123
- width: 12,
124
- height: 16,
125
- marginRight: 0,
126
- flexShrink: 0,
127
130
  }, children: jsx_runtime_1.jsx(TimelineCollapseToggle_1.TimelineCollapseToggle, { collapsed: isCollapsed, color: "currentColor" }) }));
128
131
  };
129
132
  exports.TimelineLayerChildrenToggle = TimelineLayerChildrenToggle;
@@ -47,6 +47,8 @@ const unsupportedStatusWrapper = {
47
47
  alignItems: 'center',
48
48
  display: 'inline-flex',
49
49
  gap: 4,
50
+ maxWidth: '100%',
51
+ minWidth: 0,
50
52
  userSelect: 'none',
51
53
  WebkitUserSelect: 'none',
52
54
  };
@@ -62,7 +64,11 @@ const computedValue = {
62
64
  fontFamily: 'Arial, Helvetica, sans-serif',
63
65
  fontSize: 12,
64
66
  lineHeight: '18px',
67
+ minWidth: 0,
68
+ overflow: 'hidden',
65
69
  pointerEvents: 'none',
70
+ textOverflow: 'ellipsis',
71
+ whiteSpace: 'nowrap',
66
72
  };
67
73
  const fixLinkBase = {
68
74
  ...(0, hoverable_1.hoverableStyle)({
@@ -72,6 +78,7 @@ const fixLinkBase = {
72
78
  hoverColor: colors_1.WHITE,
73
79
  }),
74
80
  display: 'inline-block',
81
+ flexShrink: 0,
75
82
  fontSize: 10,
76
83
  fontStyle: 'normal',
77
84
  fontWeight: 600,
@@ -101,7 +108,7 @@ const UnsupportedStatus = ({ label, onFix, formattedValue }) => {
101
108
  const stopPointerPropagation = (event) => {
102
109
  event.stopPropagation();
103
110
  };
104
- return (jsx_runtime_1.jsxs("span", { style: unsupportedStatusWrapper, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), children: [
111
+ return (jsx_runtime_1.jsxs("span", { style: unsupportedStatusWrapper, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), title: formattedValue && typeof label === 'string' ? label : undefined, children: [
105
112
  jsx_runtime_1.jsx("span", { style: formattedValue ? computedValue : unsupportedLabel, inert: formattedValue, children: label }), onFix ? (jsx_runtime_1.jsx("button", { type: "button", className: `${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME} ${hoverable_1.HOVERABLE_CLASS_NAME}`, style: fixLink, title: "Fix computed Studio value", onClick: (event) => {
106
113
  stopMousePropagation(event);
107
114
  onFix();
@@ -91,6 +91,7 @@ export declare const extendTimelineMarqueeSelection: ({ currentSelection, marque
91
91
  }) => readonly CanvasSelectionItem[];
92
92
  type TimelineSelectionContextValue = {
93
93
  readonly canSelect: boolean;
94
+ readonly inspectorRevealRequest: TimelineSelectionRevealRequest | null;
94
95
  readonly revealRequest: TimelineSelectionRevealRequest | null;
95
96
  readonly selectedItems: readonly TimelineSelection[];
96
97
  readonly isSelected: (item: TimelineSelection) => boolean;
@@ -111,6 +112,7 @@ export declare const TimelineSelectionOrderProvider: React.FC<{
111
112
  }>;
112
113
  type TimelineSelectionOptions = {
113
114
  readonly reveal?: boolean;
115
+ readonly revealInInspector?: boolean;
114
116
  };
115
117
  type TimelineSelectionRevealRequest = {
116
118
  readonly item: TimelineSelection;
@@ -152,7 +154,7 @@ export declare const useTimelineMarqueeSelection: () => {
152
154
  onPointerDownCapture: (event: React.PointerEvent<HTMLDivElement>) => void;
153
155
  };
154
156
  export declare const useTimelineMarqueeSelectableItem: (item: CanvasSelectionItem | null, ref: React.RefObject<Element | null>) => void;
155
- export declare const useTimelineRowSelection: (nodePathInfo: SequenceNodePathInfo | null) => {
157
+ export declare const useTimelineRowSelection: (nodePathInfo: SequenceNodePathInfo | null, revealInInspector?: boolean) => {
156
158
  onSelect: (interaction?: CanvasSelectionInteraction | undefined) => void;
157
159
  selectable: boolean;
158
160
  selectionItem: CanvasSelectionItem | null;
@@ -209,6 +209,7 @@ const extendTimelineMarqueeSelection = ({ currentSelection, marqueeSelection, })
209
209
  exports.extendTimelineMarqueeSelection = extendTimelineMarqueeSelection;
210
210
  const defaultTimelineSelectionContextValue = {
211
211
  canSelect: false,
212
+ inspectorRevealRequest: null,
212
213
  revealRequest: null,
213
214
  selectedItems: [],
214
215
  isSelected: () => false,
@@ -542,9 +543,12 @@ const TimelineSelectionProvider = ({ children }) => {
542
543
  const marqueeSelectableItems = (0, react_1.useRef)(new Map());
543
544
  const marqueeRegistrationCounter = (0, react_1.useRef)(0);
544
545
  const [revealRequest, setRevealRequest] = (0, react_1.useState)(null);
546
+ const [inspectorRevealRequest, setInspectorRevealRequest] = (0, react_1.useState)(null);
547
+ const inspectorRevealTokenCounter = (0, react_1.useRef)(0);
545
548
  (0, react_1.useEffect)(() => {
546
549
  if (!canSelect) {
547
550
  selectionScope.current = null;
551
+ setInspectorRevealRequest(null);
548
552
  setRevealRequest(null);
549
553
  selectionController.clear();
550
554
  }
@@ -566,6 +570,13 @@ const TimelineSelectionProvider = ({ children }) => {
566
570
  });
567
571
  });
568
572
  }, []);
573
+ const requestRevealSelectionItemInInspector = (0, react_1.useCallback)((item) => {
574
+ inspectorRevealTokenCounter.current += 1;
575
+ setInspectorRevealRequest({
576
+ item,
577
+ token: inspectorRevealTokenCounter.current,
578
+ });
579
+ }, []);
569
580
  const expandParentsForSelectionItems = (0, react_1.useCallback)((items) => {
570
581
  for (const item of items) {
571
582
  if (item.type === 'guide') {
@@ -603,6 +614,12 @@ const TimelineSelectionProvider = ({ children }) => {
603
614
  if (options.reveal) {
604
615
  requestRevealSelectionItem(item);
605
616
  }
617
+ if (options.revealInInspector) {
618
+ requestRevealSelectionItemInInspector(item);
619
+ }
620
+ else {
621
+ setInspectorRevealRequest(null);
622
+ }
606
623
  if (selectionScope.current !== timelineSelectionScope) {
607
624
  selectionController.clear();
608
625
  }
@@ -611,6 +628,7 @@ const TimelineSelectionProvider = ({ children }) => {
611
628
  }, [
612
629
  canSelectItem,
613
630
  expandParentsForSelectionItem,
631
+ requestRevealSelectionItemInInspector,
614
632
  requestRevealSelectionItem,
615
633
  selectionController,
616
634
  timelineSelectionScope,
@@ -627,10 +645,17 @@ const TimelineSelectionProvider = ({ children }) => {
627
645
  if (options.reveal && items.length === 1) {
628
646
  requestRevealSelectionItem(items[0]);
629
647
  }
648
+ if (options.revealInInspector && items.length === 1) {
649
+ requestRevealSelectionItemInInspector(items[0]);
650
+ }
651
+ else {
652
+ setInspectorRevealRequest(null);
653
+ }
630
654
  selectionController.setSelectedItems(items);
631
655
  }, [
632
656
  canSelectItem,
633
657
  expandParentsForSelectionItems,
658
+ requestRevealSelectionItemInInspector,
634
659
  requestRevealSelectionItem,
635
660
  selectionController,
636
661
  timelineSelectionScope,
@@ -679,6 +704,7 @@ const TimelineSelectionProvider = ({ children }) => {
679
704
  }, [canSelectItem]);
680
705
  const clearSelection = (0, react_1.useCallback)(() => {
681
706
  selectionScope.current = null;
707
+ setInspectorRevealRequest(null);
682
708
  selectionController.clear();
683
709
  }, [selectionController]);
684
710
  const containsSelection = (0, react_1.useCallback)((nodePathInfo) => {
@@ -737,6 +763,7 @@ const TimelineSelectionProvider = ({ children }) => {
737
763
  }, [selectionController]);
738
764
  const value = (0, react_1.useMemo)(() => ({
739
765
  canSelect,
766
+ inspectorRevealRequest,
740
767
  revealRequest,
741
768
  selectedItems: availableSelectedItems,
742
769
  isSelected,
@@ -749,6 +776,7 @@ const TimelineSelectionProvider = ({ children }) => {
749
776
  clearSelection,
750
777
  }), [
751
778
  canSelect,
779
+ inspectorRevealRequest,
752
780
  revealRequest,
753
781
  availableSelectedItems,
754
782
  isSelected,
@@ -929,8 +957,7 @@ const useTimelineMarqueeSelection = () => {
929
957
  captureTarget: target,
930
958
  onMove: onPointerMove,
931
959
  onEnd: (reason, endEvent) => {
932
- if ((reason === 'pointerup' || reason === 'buttons-released') &&
933
- endEvent) {
960
+ if ((0, pointer_session_1.isPointerSessionRelease)(reason, endEvent)) {
934
961
  updateSelection(endEvent.clientX, endEvent.clientY);
935
962
  }
936
963
  cleanup();
@@ -960,7 +987,7 @@ const useTimelineMarqueeSelectableItem = (item, ref) => {
960
987
  }, [item, ref, registerMarqueeSelectableItem]);
961
988
  };
962
989
  exports.useTimelineMarqueeSelectableItem = useTimelineMarqueeSelectableItem;
963
- const useTimelineRowSelection = (nodePathInfo) => {
990
+ const useTimelineRowSelection = (nodePathInfo, revealInInspector = false) => {
964
991
  const { canSelect, isSelected, selectItem } = (0, exports.useTimelineSelection)();
965
992
  const selectableTimelineItemsRef = (0, react_1.useContext)(SelectableTimelineItemsContext);
966
993
  const selectionItem = (0, react_1.useMemo)(() => (0, exports.getTimelineSelectionFromNodePathInfo)(nodePathInfo), [nodePathInfo]);
@@ -969,8 +996,8 @@ const useTimelineRowSelection = (nodePathInfo) => {
969
996
  if (selectionItem === null) {
970
997
  return;
971
998
  }
972
- selectItem(selectionItem, interaction, selectableTimelineItemsRef.current);
973
- }, [selectItem, selectableTimelineItemsRef, selectionItem]);
999
+ selectItem(selectionItem, interaction, selectableTimelineItemsRef.current, { revealInInspector });
1000
+ }, [revealInInspector, selectItem, selectableTimelineItemsRef, selectionItem]);
974
1001
  return {
975
1002
  onSelect,
976
1003
  selectable: canSelect && selectionItem !== null,
@@ -263,7 +263,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
263
263
  ? Infinity
264
264
  : naturalMediaDuration;
265
265
  const effectiveMaxMediaDuration = s.loopDisplay ? null : maxMediaDuration;
266
- const { canOpenInEditor, canConfigureApps, codingAgentInfo, editorInfo, openInCodingAgent, openInEditor, originalLocation, } = (0, use_open_sequence_in_apps_1.useOpenSequenceInApps)(s);
266
+ const { canConfigureApps, canOpenInEditor, canOpenSource, codingAgentInfo, editorInfo, openInCodingAgent, openInEditor, openSource, originalLocation, } = (0, use_open_sequence_in_apps_1.useOpenSequenceInApps)(s);
267
267
  const validatedLocation = (0, react_1.useMemo)(() => {
268
268
  var _a;
269
269
  if (!originalLocation ||
@@ -321,7 +321,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
321
321
  }
322
322
  const action = (0, get_sequence_double_click_action_1.getSequenceDoubleClickAction)({
323
323
  button: e.button,
324
- canOpenInEditor,
324
+ canOpenSource,
325
325
  numberOfConnectedCompositions: connectedCompositions.length,
326
326
  sequenceWasDragged: dragAwareDoubleClick.consumePointerGestureWasDragged(),
327
327
  });
@@ -338,12 +338,12 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
338
338
  }));
339
339
  return;
340
340
  }
341
- openInEditor(null);
341
+ openSource();
342
342
  }, [
343
- canOpenInEditor,
343
+ canOpenSource,
344
344
  connectedCompositions,
345
345
  dragAwareDoubleClick,
346
- openInEditor,
346
+ openSource,
347
347
  s,
348
348
  selectComposition,
349
349
  sequenceFrameOffset,
@@ -354,7 +354,7 @@ const TimelineSequenceInner = ({ s, connectedCompositions, windowWidth, nodePath
354
354
  }
355
355
  performSequenceDoubleClick(e);
356
356
  }, [dragAwareDoubleClick, performSequenceDoubleClick]);
357
- const canHandleSequenceDoubleClick = connectedCompositions.length === 1 || canOpenInEditor;
357
+ const canHandleSequenceDoubleClick = connectedCompositions.length === 1 || canOpenSource;
358
358
  const canDeleteFromSource = Boolean(nodePath && (validatedLocation === null || validatedLocation === void 0 ? void 0 : validatedLocation.source));
359
359
  const deleteDisabled = !previewInteractive || !s.controls || !canDeleteFromSource;
360
360
  const isProgrammaticallyDuplicated = ((_h = nodePathInfo === null || nodePathInfo === void 0 ? void 0 : nodePathInfo.numberOfSequencesWithThisNodePath) !== null && _h !== void 0 ? _h : 1) > 1;
@@ -204,7 +204,7 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
204
204
  const sequenceReorderWrapperRef = (0, react_1.useRef)(null);
205
205
  const stopSequencePointerSession = (0, react_1.useRef)(null);
206
206
  const suppressNextClick = (0, react_1.useRef)(false);
207
- const { canOpenInEditor, canConfigureApps, codingAgentInfo, editorInfo, openInCodingAgent, openInEditor, originalLocation, } = (0, use_open_sequence_in_apps_1.useOpenSequenceInApps)(sequence);
207
+ const { canConfigureApps, canOpenInEditor, canOpenSource, codingAgentInfo, editorInfo, openInCodingAgent, openInEditor, openSource, originalLocation, } = (0, use_open_sequence_in_apps_1.useOpenSequenceInApps)(sequence);
208
208
  const validatedLocation = (0, react_1.useMemo)(() => {
209
209
  var _a;
210
210
  if (!originalLocation ||
@@ -477,10 +477,10 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
477
477
  updateDropTarget(currentClientY);
478
478
  },
479
479
  });
480
- stopSequencePointerSession.current = (0, pointer_session_1.startCapturedPointerSession)({
480
+ stopSequencePointerSession.current = (0, pointer_session_1.startDeferredCapturedPointerSession)({
481
481
  captureTarget: sourceElement,
482
482
  event: e.nativeEvent,
483
- onMove: (pointerEvent) => {
483
+ onMove: (pointerEvent, capturePointer) => {
484
484
  currentClientY = pointerEvent.clientY;
485
485
  if (!didDrag &&
486
486
  Math.hypot(pointerEvent.clientX - startX, pointerEvent.clientY - startY) < SEQUENCE_REORDER_POINTER_THRESHOLD) {
@@ -488,6 +488,7 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
488
488
  }
489
489
  if (!didDrag) {
490
490
  didDrag = true;
491
+ capturePointer();
491
492
  previousUserSelect = document.body.style.userSelect;
492
493
  previousWebkitUserSelect = document.body.style.webkitUserSelect;
493
494
  document.body.style.userSelect = 'none';
@@ -515,7 +516,8 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
515
516
  autoScroll.update({ clientX: startX, clientY: pointerEvent.clientY });
516
517
  },
517
518
  onEnd: (reason, pointerEvent) => {
518
- if (reason === 'pointerup' && pointerEvent && didDrag) {
519
+ const released = (0, pointer_session_1.isPointerSessionRelease)(reason, pointerEvent);
520
+ if (released && didDrag) {
519
521
  updateDropTarget(pointerEvent.clientY);
520
522
  }
521
523
  autoScroll.stop();
@@ -531,7 +533,7 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
531
533
  setTimeout(() => {
532
534
  suppressNextClick.current = false;
533
535
  }, 0);
534
- if (reason === 'pointerup' && pointerEvent && activeDrop) {
536
+ if (released && activeDrop) {
535
537
  activeDropTarget === null || activeDropTarget === void 0 ? void 0 : activeDropTarget.reorder(activeDrop);
536
538
  }
537
539
  },
@@ -646,7 +648,7 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
646
648
  }
647
649
  const action = (0, get_sequence_double_click_action_1.getSequenceDoubleClickAction)({
648
650
  button: e.button,
649
- canOpenInEditor,
651
+ canOpenSource,
650
652
  numberOfConnectedCompositions: connectedCompositions.length,
651
653
  // The track list row reorders via native drag-and-drop, which
652
654
  // already suppresses `dblclick` after a drag.
@@ -665,16 +667,16 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
665
667
  }));
666
668
  return;
667
669
  }
668
- openInEditor(null);
670
+ openSource();
669
671
  }, [
670
- canOpenInEditor,
672
+ canOpenSource,
671
673
  connectedCompositions,
672
- openInEditor,
674
+ openSource,
673
675
  selectComposition,
674
676
  sequence,
675
677
  sequenceFrameOffset,
676
678
  ]);
677
- const canHandleSequenceDoubleClick = connectedCompositions.length === 1 || canOpenInEditor;
679
+ const canHandleSequenceDoubleClick = connectedCompositions.length === 1 || canOpenSource;
678
680
  const canRenameSelectedSequence = canRenameThisSequence &&
679
681
  selected &&
680
682
  selectedItems.length === 1 &&