@remotion/studio 4.0.528 → 4.0.529

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 (185) hide show
  1. package/dist/Studio.js +2 -0
  2. package/dist/components/AgentPrompt.js +2 -2
  3. package/dist/components/AppLaunchButton.d.ts +0 -1
  4. package/dist/components/AppLaunchButton.js +2 -5
  5. package/dist/components/AssetAudioVolume.js +2 -2
  6. package/dist/components/AssetSelectorItem.js +5 -5
  7. package/dist/components/Button.d.ts +1 -1
  8. package/dist/components/Button.js +2 -2
  9. package/dist/components/CaptionInspector.js +1 -1
  10. package/dist/components/CaptionTextEditor.js +1 -1
  11. package/dist/components/CheckboardToggle.js +1 -1
  12. package/dist/components/CodingAgentButton.js +1 -1
  13. package/dist/components/ColorPicker/ColorPicker.d.ts +1 -1
  14. package/dist/components/ColorPicker/ColorPicker.js +2 -2
  15. package/dist/components/ColorPicker/ColorPickerPopup.js +1 -1
  16. package/dist/components/CompactExplanation.js +3 -3
  17. package/dist/components/CompositionSelectorItem.js +2 -2
  18. package/dist/components/ConfigSelect.js +1 -1
  19. package/dist/components/ConfigureDefaultEditorModal.js +2 -2
  20. package/dist/components/ControlButton.d.ts +0 -1
  21. package/dist/components/ControlButton.js +2 -2
  22. package/dist/components/CurrentAsset.js +1 -1
  23. package/dist/components/ElementLibrariesSettings.js +1 -1
  24. package/dist/components/ElementLibraryModal.js +1 -1
  25. package/dist/components/FramePersistor.js +3 -3
  26. package/dist/components/FullscreenToggle.js +1 -1
  27. package/dist/components/InitialCompositionLoader.js +3 -3
  28. package/dist/components/InlineAction.d.ts +2 -2
  29. package/dist/components/InlineAction.js +2 -3
  30. package/dist/components/InlineEditableTitle.d.ts +1 -1
  31. package/dist/components/InlineEditableTitle.js +3 -3
  32. package/dist/components/InspectorLocationCopy.js +1 -1
  33. package/dist/components/InspectorOpenInEditor.js +1 -3
  34. package/dist/components/InspectorPanel/AlignmentControls.js +3 -3
  35. package/dist/components/InspectorPanel/CompositionInspector.js +1 -5
  36. package/dist/components/InspectorPanel/CompositionMetadata.js +4 -4
  37. package/dist/components/InspectorPanel/EasingInspector.js +1 -1
  38. package/dist/components/InspectorPanel/ElementLibraryButton.js +3 -14
  39. package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +6 -8
  40. package/dist/components/InspectorPanel/KeyframeInspector.js +1 -1
  41. package/dist/components/InspectorPanel/KeyframeSettings.js +16 -11
  42. package/dist/components/InspectorPanel/MultiSequenceField.js +1 -1
  43. package/dist/components/InspectorPanel/MultiSequenceInspector.js +2 -7
  44. package/dist/components/InspectorPanel/MultiSequenceNumberField.js +2 -2
  45. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +1 -1
  46. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +4 -13
  47. package/dist/components/InspectorPanel/SequenceWrapAction.js +6 -14
  48. package/dist/components/InspectorPanel/common.d.ts +6 -2
  49. package/dist/components/InspectorPanel/common.js +25 -9
  50. package/dist/components/InspectorSequenceSection.js +5 -5
  51. package/dist/components/InspectorSourceLocation.js +2 -2
  52. package/dist/components/KeyboardShortcutsSettings.js +1 -1
  53. package/dist/components/LicenseKeyValidation.js +2 -2
  54. package/dist/components/LoopToggle.js +1 -1
  55. package/dist/components/Menu/MenuSubItem.js +4 -2
  56. package/dist/components/MenuBuildIndicator.js +1 -1
  57. package/dist/components/MenuCompositionName.js +1 -1
  58. package/dist/components/ModelManager.js +1 -1
  59. package/dist/components/MuteToggle.js +1 -1
  60. package/dist/components/NewComposition/ComboBox.d.ts +1 -1
  61. package/dist/components/NewComposition/ComboBox.js +2 -2
  62. package/dist/components/NewComposition/DuplicateComposition.js +1 -1
  63. package/dist/components/NewComposition/InputDragger.d.ts +1 -1
  64. package/dist/components/NewComposition/InputDragger.js +1 -1
  65. package/dist/components/NewComposition/NewComposition.js +1 -1
  66. package/dist/components/OpenIssueButton.js +1 -1
  67. package/dist/components/OutlineToggle.js +1 -1
  68. package/dist/components/PlayPause.js +1 -1
  69. package/dist/components/PlaybackRateSelector.js +1 -1
  70. package/dist/components/Preview.js +2 -3
  71. package/dist/components/PreviewToolbarOverflowButton.js +1 -1
  72. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +1 -1
  73. package/dist/components/RenderButton.js +2 -4
  74. package/dist/components/RenderModal/InfoBubble.d.ts +1 -1
  75. package/dist/components/RenderModal/InfoBubble.js +2 -2
  76. package/dist/components/RenderModal/NumberSetting.js +1 -1
  77. package/dist/components/RenderModal/OptionExplainerBubble.js +2 -2
  78. package/dist/components/RenderModal/RenderModalAdvanced.js +2 -2
  79. package/dist/components/RenderModal/RenderModalAudio.js +2 -2
  80. package/dist/components/RenderModal/RenderModalBasic.js +3 -3
  81. package/dist/components/RenderModal/RenderModalEncoding.js +4 -4
  82. package/dist/components/RenderModal/RenderModalOutputName.js +1 -1
  83. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +1 -1
  84. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +1 -1
  85. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  86. package/dist/components/RenderModal/SchemaEditor/ZodFieldValidation.js +1 -1
  87. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  88. package/dist/components/RenderModal/WebRenderModalAdvanced.js +2 -2
  89. package/dist/components/RenderModal/WebRenderModalAudio.js +2 -2
  90. package/dist/components/RenderModal/WebRenderModalBasic.js +3 -3
  91. package/dist/components/RenderModal/WebRenderModalPicture.js +1 -1
  92. package/dist/components/RenderQueue/CaptionQueueItem.js +1 -1
  93. package/dist/components/RenderQueue/QueueJobError.js +1 -1
  94. package/dist/components/RenderQueue/RenderQueueError.js +1 -1
  95. package/dist/components/RenderQueue/RenderQueueOutputName.js +1 -1
  96. package/dist/components/RenderQueue/RenderQueueProgressMessage.js +1 -1
  97. package/dist/components/RenderQueue/VideoMattingQueueItem.js +1 -1
  98. package/dist/components/RenderingSettings.js +6 -6
  99. package/dist/components/RulersAndGuidesToggle.js +1 -1
  100. package/dist/components/SegmentedButton.d.ts +0 -2
  101. package/dist/components/SegmentedButton.js +6 -6
  102. package/dist/components/SelectedOutlineOverlay.js +15 -2
  103. package/dist/components/SelectedOutlinePathPoints.js +45 -21
  104. package/dist/components/SelectedOutlineRenderer.js +1 -1
  105. package/dist/components/SettingsButton.js +1 -1
  106. package/dist/components/SettingsModalFooter.js +1 -1
  107. package/dist/components/SizeSelector.js +1 -1
  108. package/dist/components/SkillsSettings.js +2 -2
  109. package/dist/components/SnappingToggle.js +1 -1
  110. package/dist/components/StudioSettings.js +2 -2
  111. package/dist/components/TimeValue.js +1 -3
  112. package/dist/components/Timeline/EasingEditorModal.js +3 -3
  113. package/dist/components/Timeline/TimelineArrayField.js +2 -2
  114. package/dist/components/Timeline/TimelineAssetField.js +3 -3
  115. package/dist/components/Timeline/TimelineColorField.js +2 -2
  116. package/dist/components/Timeline/TimelineDragHandler.js +3 -3
  117. package/dist/components/Timeline/TimelineDuplicateCount.js +1 -1
  118. package/dist/components/Timeline/TimelineEffectItem.js +1 -1
  119. package/dist/components/Timeline/TimelineEnumField.js +1 -1
  120. package/dist/components/Timeline/TimelineFieldLabel.js +1 -1
  121. package/dist/components/Timeline/TimelineFontFamilyField.js +2 -2
  122. package/dist/components/Timeline/TimelineFontWeightField.js +1 -1
  123. package/dist/components/Timeline/TimelineKeyframeControls.js +4 -4
  124. package/dist/components/Timeline/TimelineKeyframeDiamond.js +1 -1
  125. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +1 -1
  126. package/dist/components/Timeline/TimelineLayerChildren.js +1 -1
  127. package/dist/components/Timeline/TimelineList.js +15 -7
  128. package/dist/components/Timeline/TimelineMediaInfo.js +1 -1
  129. package/dist/components/Timeline/TimelineScaleField.js +1 -1
  130. package/dist/components/Timeline/TimelineSchemaField.js +2 -2
  131. package/dist/components/Timeline/TimelineSequence.js +1 -1
  132. package/dist/components/Timeline/TimelineSequenceItem.js +34 -16
  133. package/dist/components/Timeline/TimelineSequenceName.d.ts +1 -0
  134. package/dist/components/Timeline/TimelineSequenceName.js +38 -6
  135. package/dist/components/Timeline/TimelineSequencePropItem.js +6 -4
  136. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +2 -2
  137. package/dist/components/Timeline/TimelineZoomControls.js +2 -2
  138. package/dist/components/Timeline/get-sequence-split-menu-item.js +2 -2
  139. package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +1 -1
  140. package/dist/components/Timeline/use-timeline-expanded-tree.js +3 -0
  141. package/dist/components/TimelineCombobox.d.ts +1 -1
  142. package/dist/components/TimelineCombobox.js +5 -6
  143. package/dist/components/TimelineInOutToggle.js +1 -1
  144. package/dist/components/Transcription/TranscriptionModal.js +6 -6
  145. package/dist/components/UndoRedoButtons.js +1 -1
  146. package/dist/components/UpdatesSettings.js +2 -2
  147. package/dist/components/VideoMatting/VideoMattingModal.js +4 -4
  148. package/dist/components/selected-outline-types.d.ts +2 -0
  149. package/dist/error-overlay/remotion-overlay/CompositionIdListItem.js +1 -1
  150. package/dist/error-overlay/remotion-overlay/OpenInEditor.js +1 -1
  151. package/dist/error-overlay/remotion-overlay/StackFrame.js +1 -1
  152. package/dist/esm/{CaptionQueueProcessor-nr7hjcga.mjs → CaptionQueueProcessor-qj37c6r2.mjs} +2 -2
  153. package/dist/esm/{LazyModels-ajkn7fs3.mjs → LazyModels-rjsrgap5.mjs} +4 -4
  154. package/dist/esm/{LazyModels-g1g7cf4e.mjs → LazyModels-rnbjx98t.mjs} +4 -4
  155. package/dist/esm/{TranscriptionModal-e18bzbkb.mjs → TranscriptionModal-y7zeqj2d.mjs} +15 -15
  156. package/dist/esm/{VideoMattingModal-5bz2s4rs.mjs → VideoMattingModal-jzrkhah1.mjs} +13 -13
  157. package/dist/esm/{index-s6qya2gg.mjs → index-19d05w9e.mjs} +1 -1
  158. package/dist/esm/{index-t7tbt980.mjs → index-24wge6y5.mjs} +2 -3
  159. package/dist/esm/{index-wqc43mw0.mjs → index-3qb54r5j.mjs} +4 -5
  160. package/dist/esm/{index-c2wabcdt.mjs → index-cakcjjy2.mjs} +6 -6
  161. package/dist/esm/{index-9q9w8v9p.mjs → index-f9hxt5yh.mjs} +1 -1
  162. package/dist/esm/{index-8nt6a0mw.mjs → index-jc22b2wb.mjs} +1 -1
  163. package/dist/esm/{index-890dd9b3.mjs → index-m01zjph7.mjs} +3 -5
  164. package/dist/esm/{index-x6r9bn12.mjs → index-m2a95v3p.mjs} +925 -237
  165. package/dist/esm/{index-xac20sv4.mjs → index-r9bj4tta.mjs} +7 -7
  166. package/dist/esm/{index-t7xnxdf8.mjs → index-vnc2wdfd.mjs} +4 -5
  167. package/dist/esm/{index-dh3zk2hv.mjs → index-vtr5qzam.mjs} +1 -1
  168. package/dist/esm/{index-dpyss74p.mjs → index-x7kg7jqv.mjs} +814 -723
  169. package/dist/esm/index.mjs +2 -2
  170. package/dist/esm/internals.mjs +9 -9
  171. package/dist/esm/previewEntry.mjs +9 -9
  172. package/dist/esm/renderEntry.mjs +2 -2
  173. package/dist/helpers/checkerboard-background.d.ts +2 -2
  174. package/dist/helpers/checkerboard-background.js +1 -1
  175. package/dist/helpers/colors.d.ts +1 -2
  176. package/dist/helpers/colors.js +7 -8
  177. package/dist/helpers/studio-css-variables.d.ts +1 -1
  178. package/dist/helpers/studio-css-variables.js +2 -3
  179. package/dist/icons/snowflake.js +1 -3
  180. package/dist/icons/{scissors.d.ts → split.d.ts} +1 -1
  181. package/dist/icons/split.js +8 -0
  182. package/dist/icons/trash.js +2 -2
  183. package/dist/icons/wrap.js +1 -1
  184. package/package.json +20 -20
  185. package/dist/icons/scissors.js +0 -8
@@ -229,7 +229,7 @@ const TimelineAssetField = ({ field, effectiveValue, propStatus, onSave, onDragV
229
229
  selectFile,
230
230
  setSelectedModal,
231
231
  ]);
232
- 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 }) }));
232
+ const action = (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: openAssetSelection, disabled: window.remotion_isReadOnlyStudio, "aria-label": "Change source", renderAction: (color) => jsx_runtime_1.jsx(pen_1.PenIcon, { color: color, style: penIcon }) }));
233
233
  if (imageLinkInfo !== null) {
234
234
  const linkInfo = imageLinkInfo;
235
235
  let name;
@@ -258,7 +258,7 @@ const TimelineAssetField = ({ field, effectiveValue, propStatus, onSave, onDragV
258
258
  const opensSource = linkInfo.kind === 'local' &&
259
259
  inlineSourceAction !== null &&
260
260
  inlineSourceAction.onClick !== null;
261
- const title = (_b = inlineSourceAction === null || inlineSourceAction === void 0 ? void 0 : inlineSourceAction.title) !== null && _b !== void 0 ? _b : linkInfo.title;
261
+ const sourceDescription = (_b = inlineSourceAction === null || inlineSourceAction === void 0 ? void 0 : inlineSourceAction['aria-label']) !== null && _b !== void 0 ? _b : linkInfo.title;
262
262
  const onPreviewClick = opensSource
263
263
  ? inlineSourceAction.onClick
264
264
  : openAssetSelection;
@@ -277,7 +277,7 @@ const TimelineAssetField = ({ field, effectiveValue, propStatus, onSave, onDragV
277
277
  hoverColor: previewDisabled ? colors_1.LIGHT_TEXT : colors_1.WHITE,
278
278
  }),
279
279
  };
280
- const previewAction = (jsx_runtime_1.jsxs("button", { "aria-label": previewLabel, className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, disabled: previewDisabled, onClick: onPreviewClick, style: previewButtonStyle, title: title, type: "button", children: [
280
+ const previewAction = (jsx_runtime_1.jsxs("button", { "aria-label": previewLabel, "aria-description": sourceDescription, className: `${hoverable_1.HOVERABLE_CLASS_NAME} ${hoverable_1.FOCUS_VISIBLE_ONLY_CLASS_NAME}`, disabled: previewDisabled, onClick: onPreviewClick, style: previewButtonStyle, type: "button", children: [
281
281
  jsx_runtime_1.jsx("span", { style: thumbnailContainer, children: jsx_runtime_1.jsx("img", { alt: "", draggable: false, src: previewSrc, style: thumbnail }) }), jsx_runtime_1.jsxs("span", { style: imageAssetInfo, children: [
282
282
  jsx_runtime_1.jsx("span", { style: imageAssetName, children: name }), source === null ? null : (jsx_runtime_1.jsx("span", { style: imageAssetSource, children: source }))] })
283
283
  ] }));
@@ -44,9 +44,9 @@ const TimelineColorField = ({ field, effectiveValue, propStatus, onSave, onDragV
44
44
  }, [onSave, onDragEnd, propStatus]);
45
45
  if (currentValue === 'none') {
46
46
  return (jsx_runtime_1.jsxs("span", { style: containerStyle, children: [
47
- 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" })
47
+ jsx_runtime_1.jsx("span", { style: noneLabelStyle, children: "None" }), jsx_runtime_1.jsx("button", { type: "button", style: setButtonStyle, "aria-label": `Set ${(_b = field.description) !== null && _b !== void 0 ? _b : field.key} to gray`, onClick: () => onChangeComplete(DEFAULT_SET_COLOR), children: "Set" })
48
48
  ] }));
49
49
  }
50
- 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 }) }));
50
+ 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, "aria-label": currentValue }) }));
51
51
  };
52
52
  exports.TimelineColorField = TimelineColorField;
@@ -122,7 +122,7 @@ const TimelineDragHandlerInner = () => {
122
122
  shouldApplyCssTransforms: true,
123
123
  });
124
124
  const { isHighestContext } = (0, z_index_1.useZIndex)();
125
- const setFrame = remotion_1.Internals.Timeline.useTimelineSeekFrame();
125
+ const seekFrame = remotion_1.Internals.Timeline.useTimelineSeekFrame();
126
126
  const width = (0, timeline_scroll_logic_1.getTimelineContentWidth)();
127
127
  const left = (_a = size === null || size === void 0 ? void 0 : size.left) !== null && _a !== void 0 ? _a : 0;
128
128
  const [dragging, setDragging] = (0, react_1.useState)({
@@ -238,7 +238,7 @@ const TimelineDragHandlerInner = () => {
238
238
  width,
239
239
  extrapolate: 'clamp',
240
240
  });
241
- setFrame((c) => {
241
+ seekFrame((c) => {
242
242
  if (c[videoConfig.id] === frame) {
243
243
  return c;
244
244
  }
@@ -249,7 +249,7 @@ const TimelineDragHandlerInner = () => {
249
249
  if (dragging.wasPlaying) {
250
250
  play();
251
251
  }
252
- }, [dragging, left, play, videoConfig, setFrame, width]);
252
+ }, [dragging, left, play, videoConfig, seekFrame, width]);
253
253
  const onPointerCancelScrubbing = (0, react_1.useCallback)(() => {
254
254
  var _a;
255
255
  (_a = autoScroller.current) === null || _a === void 0 ? void 0 : _a.stop();
@@ -23,6 +23,6 @@ const badgeStyle = {
23
23
  };
24
24
  const TimelineDuplicateCount = ({ count }) => {
25
25
  const label = `${count} other programmatically duplicated ${count === 1 ? 'instance is' : 'instances are'} hidden`;
26
- return (jsx_runtime_1.jsxs("span", { style: badgeStyle, title: label, "aria-label": label, children: ["+", count] }));
26
+ return (jsx_runtime_1.jsxs("span", { role: "group", style: badgeStyle, "aria-label": label, children: ["+", count] }));
27
27
  };
28
28
  exports.TimelineDuplicateCount = TimelineDuplicateCount;
@@ -351,7 +351,7 @@ const TimelineEffectItem = ({ label, nodePathInfo, effectIndex, effectSchema, do
351
351
  };
352
352
  }, [dropIndicator]);
353
353
  const row = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: rowDepth, eye: canToggle ? (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEye, { type: "effect", hidden: isDisabled, onInvoked: onToggle })) : (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {})), arrow: labelNextToToggle ? null : jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {}), style: rowStyle, selected: selection.selected, selectable: selection.selectable, onSelect: selection.onSelect, showSelectedBackground: true, containsSelection: containsSelection, outerHeight: null, children: jsx_runtime_1.jsxs("div", { style: labelContainerStyle, children: [
354
- jsx_runtime_1.jsx("span", { title: label, style: labelStyle, children: label }), jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowButton, { isExpanded: isExpanded, onClick: () => toggleTrack(nodePathInfo), label: `${label} section`, disabled: false })
354
+ jsx_runtime_1.jsx("span", { role: "group", "aria-label": label, style: labelStyle, children: label }), jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowButton, { isExpanded: isExpanded, onClick: () => toggleTrack(nodePathInfo), label: `${label} section`, disabled: false })
355
355
  ] }) }));
356
356
  const draggableRow = canReorder ? (jsx_runtime_1.jsxs("div", { draggable: true, onDragStart: onDragStart, onDragEnd: onDragEnd, onDragOver: onDragOver, onDragLeave: onDragLeave, onDrop: onDrop, style: reorderWrapper, children: [reorderLineStyle ? jsx_runtime_1.jsx("div", { style: reorderLineStyle }) : null, row] })) : (row);
357
357
  return previewConnected ? (jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: draggableRow })) : (draggableRow);
@@ -34,6 +34,6 @@ const TimelineEnumField = ({ field, propStatus, effectiveValue, onSave, onDragVa
34
34
  disabled: false,
35
35
  }));
36
36
  }, [variantKeys, onSelect]);
37
- return (jsx_runtime_1.jsx(ComboBox_1.Combobox, { size: "small", title: field.key, selectedId: current, values: items }));
37
+ return (jsx_runtime_1.jsx(ComboBox_1.Combobox, { size: "small", "aria-label": field.key, selectedId: current, values: items }));
38
38
  };
39
39
  exports.TimelineEnumField = TimelineEnumField;
@@ -33,6 +33,6 @@ const TimelineFieldLabel = ({ rowDepth, selected, label, stacked = false }) => {
33
33
  ...fieldNameBase,
34
34
  color: (0, TimelineSelection_1.getTimelineColor)(selected, true),
35
35
  }), [selected]);
36
- return (jsx_runtime_1.jsx("div", { style: labelRowStyle, children: jsx_runtime_1.jsx("span", { style: fieldNameStyle, title: label, children: label }) }));
36
+ return (jsx_runtime_1.jsx("div", { style: labelRowStyle, children: jsx_runtime_1.jsx("span", { role: "group", style: fieldNameStyle, "aria-label": label, children: label }) }));
37
37
  };
38
38
  exports.TimelineFieldLabel = TimelineFieldLabel;
@@ -495,7 +495,7 @@ const TimelineFontFamilyField = ({ field, propStatus, effectiveValue, onSave, on
495
495
  }, [hovered, opened]);
496
496
  const selectedPreviewStyle = getOptionPreviewStyle(selected);
497
497
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
498
- jsx_runtime_1.jsxs("button", { ref: buttonRef, title: field.key, tabIndex: tabIndex, type: "button", style: style, className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, onPointerDown: (event) => {
498
+ jsx_runtime_1.jsxs("button", { ref: buttonRef, "aria-label": field.key, tabIndex: tabIndex, type: "button", style: style, className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, onPointerDown: (event) => {
499
499
  event.stopPropagation();
500
500
  toggleOpened();
501
501
  }, onClick: (event) => {
@@ -504,7 +504,7 @@ const TimelineFontFamilyField = ({ field, propStatus, effectiveValue, onSave, on
504
504
  toggleOpened();
505
505
  }
506
506
  }, onMouseEnter: () => setHovered(true), onMouseLeave: () => setHovered(false), children: [
507
- jsx_runtime_1.jsx("div", { title: selected.label, style: { ...triggerLabel, ...selectedPreviewStyle }, children: selected.label }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(caret_1.CaretDown, { small: true })
507
+ jsx_runtime_1.jsx("div", { role: "group", "aria-label": selected.label, style: { ...triggerLabel, ...selectedPreviewStyle }, children: selected.label }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(caret_1.CaretDown, { small: true })
508
508
  ] }), saveError === null ? null : jsx_runtime_1.jsx("div", { style: errorText, children: saveError }), opened && size
509
509
  ? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, onPointerDown: (event) => event.stopPropagation(), children: jsx_runtime_1.jsx("div", { style: styles_1.outerPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: hide, onEscape: hide, children: jsx_runtime_1.jsxs("div", { style: portalStyle({ size }), children: [
510
510
  jsx_runtime_1.jsx("div", { style: { padding: 6 }, children: jsx_runtime_1.jsx("input", { ref: inputRef, value: query, onChange: (event) => setQuery(event.target.value), onKeyDown: onKeyDown, placeholder: "Search fonts", style: searchInput }) }), filteredOptions.length === 0 ? (jsx_runtime_1.jsx("div", { style: noResults, children: "No fonts found" })) : (jsx_runtime_1.jsxs("div", { ref: listRef, style: listStyle, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, onScroll: (event) => {
@@ -41,7 +41,7 @@ const TimelineFontWeightField = ({ field, propStatus, effectiveValue, onSave, on
41
41
  return (jsx_runtime_1.jsx(TimelineNumberField_1.TimelineNumberField, { effectiveValue: currentValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }));
42
42
  }
43
43
  if (FONT_WEIGHT_KEYWORDS.includes(sourceValue)) {
44
- return (jsx_runtime_1.jsx(ComboBox_1.Combobox, { size: "small", title: field.key, selectedId: String(currentValue), values: keywordItems }));
44
+ return (jsx_runtime_1.jsx(ComboBox_1.Combobox, { size: "small", "aria-label": field.key, selectedId: String(currentValue), values: keywordItems }));
45
45
  }
46
46
  return (jsx_runtime_1.jsx(RemInput_1.RemotionInput, { status: "ok", rightAlign: false, small: true, defaultValue: String(currentValue !== null && currentValue !== void 0 ? currentValue : ''), onBlur: (event) => {
47
47
  const newValue = event.currentTarget.value;
@@ -330,7 +330,7 @@ exports.shouldShowTimelineKeyframeNavigation = shouldShowTimelineKeyframeNavigat
330
330
  const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, keyframeDisplayOffset, keyframePlaybackRate, defaultValue, dragOverrideValue, schema, effectIndex, nodePathInfo, mode = 'timeline', }) => {
331
331
  const videoConfig = (0, remotion_1.useVideoConfig)();
332
332
  const timelinePosition = remotion_1.Internals.Timeline.useTimelinePosition();
333
- const setFrame = remotion_1.Internals.Timeline.useTimelineSeekFrame();
333
+ const seekFrame = remotion_1.Internals.Timeline.useTimelineSeekFrame();
334
334
  const { setPropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModeSettersContext);
335
335
  const { propStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
336
336
  const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
@@ -440,7 +440,7 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
440
440
  tracks,
441
441
  ]);
442
442
  const seekToDisplayFrame = (0, react_1.useCallback)((frame, direction) => {
443
- setFrame((current) => {
443
+ seekFrame((current) => {
444
444
  const next = { ...current, [videoConfig.id]: frame };
445
445
  remotion_1.Internals.persistCurrentFrame(next);
446
446
  return next;
@@ -450,7 +450,7 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
450
450
  durationInFrames: videoConfig.durationInFrames,
451
451
  frame,
452
452
  });
453
- }, [setFrame, videoConfig.durationInFrames, videoConfig.id]);
453
+ }, [seekFrame, videoConfig.durationInFrames, videoConfig.id]);
454
454
  const onPrevious = (0, react_1.useCallback)((e) => {
455
455
  e.stopPropagation();
456
456
  if (previousDisplayFrame !== null) {
@@ -549,7 +549,7 @@ const TimelineKeyframeControls = ({ fieldKey, propStatus, nodePath, fileName, ke
549
549
  return (jsx_runtime_1.jsxs("div", { style: mode === 'inspector'
550
550
  ? inspectorControlsContainerStyle
551
551
  : controlsContainerStyle, children: [
552
- jsx_runtime_1.jsx("button", { type: "button", style: previousStyle, disabled: previousDisabled, onPointerDown: previousDisabled ? undefined : onPrevious, "aria-label": "Go to previous keyframe", title: "Previous keyframe", children: jsx_runtime_1.jsx("svg", { width: "14", height: "14", viewBox: "0 0 10 10", style: svgStyle, children: jsx_runtime_1.jsx("path", { d: "M7 1.5L3 5L7 8.5Z", fill: colors_1.LIGHT_GRAY }) }) }), jsx_runtime_1.jsx("button", { type: "button", style: diamondStyle, disabled: !canToggleKeyframe || !clientId, onPointerDown: canToggleKeyframe && clientId ? onToggleKeyframe : undefined, "aria-label": hasKeyframeAtCurrentFrame ? 'Remove keyframe' : 'Add keyframe', title: hasKeyframeAtCurrentFrame ? 'Remove keyframe' : 'Add keyframe', children: jsx_runtime_1.jsx(TimelineKeyframeDiamondIcon_1.TimelineKeyframeDiamondIcon, { color: diamondColor, size: 12 }) }), jsx_runtime_1.jsx("button", { type: "button", style: nextStyle, disabled: nextDisabled, onPointerDown: nextDisabled ? undefined : onNext, "aria-label": "Go to next keyframe", title: "Next keyframe", children: jsx_runtime_1.jsx("svg", { width: "14", height: "14", viewBox: "0 0 10 10", style: svgStyle, children: jsx_runtime_1.jsx("path", { d: "M3 1.5L7 5L3 8.5Z", fill: colors_1.LIGHT_GRAY }) }) })
552
+ jsx_runtime_1.jsx("button", { type: "button", style: previousStyle, disabled: previousDisabled, onPointerDown: previousDisabled ? undefined : onPrevious, "aria-label": "Go to previous keyframe", children: jsx_runtime_1.jsx("svg", { width: "14", height: "14", viewBox: "0 0 10 10", style: svgStyle, children: jsx_runtime_1.jsx("path", { d: "M7 1.5L3 5L7 8.5Z", fill: colors_1.LIGHT_GRAY }) }) }), jsx_runtime_1.jsx("button", { type: "button", style: diamondStyle, disabled: !canToggleKeyframe || !clientId, onPointerDown: canToggleKeyframe && clientId ? onToggleKeyframe : undefined, "aria-label": hasKeyframeAtCurrentFrame ? 'Remove keyframe' : 'Add keyframe', children: jsx_runtime_1.jsx(TimelineKeyframeDiamondIcon_1.TimelineKeyframeDiamondIcon, { color: diamondColor, size: 12 }) }), jsx_runtime_1.jsx("button", { type: "button", style: nextStyle, disabled: nextDisabled, onPointerDown: nextDisabled ? undefined : onNext, "aria-label": "Go to next keyframe", children: jsx_runtime_1.jsx("svg", { width: "14", height: "14", viewBox: "0 0 10 10", style: svgStyle, children: jsx_runtime_1.jsx("path", { d: "M3 1.5L7 5L3 8.5Z", fill: colors_1.LIGHT_GRAY }) }) })
553
553
  ] }));
554
554
  };
555
555
  exports.TimelineKeyframeControls = TimelineKeyframeControls;
@@ -87,6 +87,6 @@ const TimelineKeyframeDiamondUnmemoized = ({ frame, rowHeight, nodePathInfo }) =
87
87
  if (style === null) {
88
88
  return null;
89
89
  }
90
- return (jsx_runtime_1.jsx("button", { ref: ref, [TimelineSelection_1.TIMELINE_MARQUEE_ITEM_ATTR]: true, type: "button", style: style, title: `Keyframe at frame ${frame}`, "aria-label": `Select keyframe at frame ${frame}`, onPointerDown: selectable ? onPointerDown : undefined, children: jsx_runtime_1.jsx(TimelineKeyframeDiamondIcon_1.TimelineKeyframeDiamondIcon, { color: colors_1.LIGHT_TEXT, selected: visuallySelected, size: diamondSize }) }));
90
+ return (jsx_runtime_1.jsx("button", { ref: ref, [TimelineSelection_1.TIMELINE_MARQUEE_ITEM_ATTR]: true, type: "button", style: style, "aria-label": `Select keyframe at frame ${frame}`, onPointerDown: selectable ? onPointerDown : undefined, children: jsx_runtime_1.jsx(TimelineKeyframeDiamondIcon_1.TimelineKeyframeDiamondIcon, { color: colors_1.LIGHT_TEXT, selected: visuallySelected, size: diamondSize }) }));
91
91
  };
92
92
  exports.TimelineKeyframeDiamond = react_1.default.memo(TimelineKeyframeDiamondUnmemoized);
@@ -167,7 +167,7 @@ const TimelineKeyframeEasingLineInteraction = ({ fromFrame, toFrame, nodePathInf
167
167
  selectionItem,
168
168
  });
169
169
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
170
- jsx_runtime_1.jsx("button", { ref: buttonRef, [TimelineSelection_1.TIMELINE_MARQUEE_ITEM_ATTR]: true, type: "button", style: interactiveStyle, title: `Easing from frame ${fromFrame} to ${toFrame}`, "aria-label": `Select easing from frame ${fromFrame} to ${toFrame}`, onPointerDown: selectable ? onPointerDown : undefined, children: jsx_runtime_1.jsx(exports.TimelineKeyframeEasingLineVisual, { selected: selected }) }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: buttonRef, getItems: getContextMenuItems })
170
+ jsx_runtime_1.jsx("button", { ref: buttonRef, [TimelineSelection_1.TIMELINE_MARQUEE_ITEM_ATTR]: true, type: "button", style: interactiveStyle, "aria-label": `Select easing from frame ${fromFrame} to ${toFrame}`, onPointerDown: selectable ? onPointerDown : undefined, children: jsx_runtime_1.jsx(exports.TimelineKeyframeEasingLineVisual, { selected: selected }) }), jsx_runtime_1.jsx(ContextMenu_1.ContextMenuForTarget, { triggerRef: buttonRef, getItems: getContextMenuItems })
171
171
  ] }));
172
172
  };
173
173
  const TimelineKeyframeEasingLineUnmemoized = ({ fromFrame, toFrame, rowHeight, nodePathInfo, segmentIndex }) => {
@@ -118,7 +118,7 @@ const TimelineLayerChildrenToggle = ({ sequence }) => {
118
118
  return jsx_runtime_1.jsx("div", { style: toggleLayout });
119
119
  }
120
120
  const label = `${isCollapsed ? 'Expand' : 'Collapse'} children of ${sequence.displayName}`;
121
- 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: {
121
+ 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, onClick: onClick, onPointerDown: stopPropagation, onDoubleClick: stopPropagation, style: {
122
122
  ...(0, hoverable_1.hoverableStyle)({
123
123
  idleBackground: colors_1.TRANSPARENT,
124
124
  hoverBackground: colors_1.TRANSPARENT,
@@ -23,12 +23,20 @@ const TimelineListTrack = react_1.default.memo(({ row }) => {
23
23
  });
24
24
  const TimelineList = () => {
25
25
  const { rows, tracksEnd, virtualItems } = (0, TimelineVirtualization_1.useTimelineVirtualization)();
26
- return (jsx_runtime_1.jsx("div", { style: { ...container, height: tracksEnd }, children: virtualItems.map((virtualItem) => (jsx_runtime_1.jsx("div", { style: {
27
- height: virtualItem.size,
28
- left: 0,
29
- position: 'absolute',
30
- top: virtualItem.start,
31
- width: '100%',
32
- }, children: jsx_runtime_1.jsx(TimelineListTrack, { row: rows[virtualItem.index] }) }, virtualItem.key))) }));
26
+ return (jsx_runtime_1.jsxs("div", { style: { ...container, height: tracksEnd }, children: [
27
+ jsx_runtime_1.jsx("style", { children: `.remotion-timeline-sequence-name-measure::before {
28
+ content: attr(data-name);
29
+ display: block;
30
+ font-family: Arial, Helvetica, sans-serif;
31
+ font-size: 12px;
32
+ line-height: normal;
33
+ visibility: hidden;
34
+ }` }), virtualItems.map((virtualItem) => (jsx_runtime_1.jsx("div", { style: {
35
+ height: virtualItem.size,
36
+ left: 0,
37
+ position: 'absolute',
38
+ top: virtualItem.start,
39
+ width: '100%',
40
+ }, children: jsx_runtime_1.jsx(TimelineListTrack, { row: rows[virtualItem.index] }) }, virtualItem.key)))] }));
33
41
  };
34
42
  exports.TimelineList = TimelineList;
@@ -36,6 +36,6 @@ const useAssetLink = (src) => {
36
36
  const TimelineMediaInfo = ({ src }) => {
37
37
  const fileName = (0, react_1.useMemo)(() => remotion_1.Internals.getAssetDisplayName(src), [src]);
38
38
  const { linkInfo, fileNameStyle } = useAssetLink(src);
39
- return (jsx_runtime_1.jsx("div", { style: fileNameStyle, title: linkInfo ? linkInfo.title : fileName, children: fileName }));
39
+ return (jsx_runtime_1.jsx("div", { role: "group", style: fileNameStyle, "aria-label": linkInfo ? linkInfo.title : fileName, children: fileName }));
40
40
  };
41
41
  exports.TimelineMediaInfo = TimelineMediaInfo;
@@ -81,7 +81,7 @@ const LinkToggle = ({ linked, onToggle }) => {
81
81
  e.stopPropagation();
82
82
  onToggle();
83
83
  }, [onToggle]);
84
- return (jsx_runtime_1.jsx("button", { type: "button", style: toggleStyle, onPointerDown: onPointerDown, title: linked ? 'Unlink scale axes' : 'Link scale axes', "aria-label": linked ? 'Unlink scale axes' : 'Link scale axes', children: linked ? (jsx_runtime_1.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 640 640", style: linkIconStyle, children: jsx_runtime_1.jsx("path", { fill: colors_1.CURRENT_COLOR_LOWERCASE, d: "M32 320C32 214 118 128 224 128L288 128L288 192L224 192C153.3 192 96 249.3 96 320C96 390.7 153.3 448 224 448L288 448L288 512L224 512C118 512 32 426 32 320zM608 320C608 426 522 512 416 512L352 512L352 448L416 448C486.7 448 544 390.7 544 320C544 249.3 486.7 192 416 192L352 192L352 128L416 128C522 128 608 214 608 320zM224 288L448 288L448 352L192 352L192 288L224 288z" }) })) : null }));
84
+ return (jsx_runtime_1.jsx("button", { type: "button", style: toggleStyle, onPointerDown: onPointerDown, "aria-label": linked ? 'Unlink scale axes' : 'Link scale axes', children: linked ? (jsx_runtime_1.jsx("svg", { xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 640 640", style: linkIconStyle, children: jsx_runtime_1.jsx("path", { fill: colors_1.CURRENT_COLOR_LOWERCASE, d: "M32 320C32 214 118 128 224 128L288 128L288 192L224 192C153.3 192 96 249.3 96 320C96 390.7 153.3 448 224 448L288 448L288 512L224 512C118 512 32 426 32 320zM608 320C608 426 522 512 416 512L352 512L352 448L416 448C486.7 448 544 390.7 544 320C544 249.3 486.7 192 416 192L352 192L352 128L416 128C522 128 608 214 608 320zM224 288L448 288L448 352L192 352L192 288L224 288z" }) })) : null }));
85
85
  };
86
86
  const TimelineScaleField = ({ field, propStatus, effectiveValue, onSave, onDragValueChange, onDragEnd, scaleLockNodePath, }) => {
87
87
  var _a, _b;
@@ -107,8 +107,8 @@ const UnsupportedStatus = ({ label, onFix, formattedValue }) => {
107
107
  const stopPointerPropagation = (event) => {
108
108
  event.stopPropagation();
109
109
  };
110
- return (jsx_runtime_1.jsxs("span", { style: unsupportedStatusWrapper, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), title: formattedValue && typeof label === 'string' ? label : undefined, children: [
111
- 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) => {
110
+ return (jsx_runtime_1.jsxs("span", { role: "group", style: unsupportedStatusWrapper, onPointerEnter: () => setHovered(true), onPointerLeave: () => setHovered(false), "aria-label": formattedValue && typeof label === 'string' ? label : undefined, children: [
111
+ 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, "aria-label": "Fix computed Studio value", onClick: (event) => {
112
112
  stopMousePropagation(event);
113
113
  onFix();
114
114
  }, onDoubleClick: stopMousePropagation, onPointerDown: stopPointerPropagation, onFocus: () => setFocused(true), onBlur: () => setFocused(false), tabIndex: visible ? 0 : -1, children: "Fix" })) : null] }));
@@ -207,7 +207,7 @@ const TimelineSequenceCurrentFrame = ({ s, displayDurationInFrames, premount, po
207
207
  display: 'flex',
208
208
  alignItems: 'center',
209
209
  }, children: jsx_runtime_1.jsx(TimelineSequenceFrame_1.TimelineSequenceFrame, { premounted: isPremounting, postmounted: isPostmounting ? s.duration - 1 : null, roundedFrame: roundedFrame, frozenFrame: frozenFrame }) })) : null] }));
210
- return (jsx_runtime_1.jsxs("div", { ref: ref, [TimelineSelection_1.TIMELINE_MARQUEE_ITEM_ATTR]: true, style: actualStyle, title: s.displayName, onPointerDownCapture: onPointerDownCapture, onPointerDown: selectable ? onPointerDown : undefined, onClick: onClick !== null && onClick !== void 0 ? onClick : undefined, children: [negativeStart ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
210
+ return (jsx_runtime_1.jsxs("div", { ref: ref, role: "group", [TimelineSelection_1.TIMELINE_MARQUEE_ITEM_ATTR]: true, style: actualStyle, "aria-label": s.displayName, onPointerDownCapture: onPointerDownCapture, onPointerDown: selectable ? onPointerDown : undefined, onClick: onClick !== null && onClick !== void 0 ? onClick : undefined, children: [negativeStart ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
211
211
  jsx_runtime_1.jsx(TimelineSequenceNegativeStart, { left: negativeStart.left, width: negativeStart.width, leftEdgeVisible: leftEdgeVisible, clipped: negativeStartClipped }), jsx_runtime_1.jsx("div", { style: {
212
212
  background: style.background,
213
213
  border: style.border,
@@ -108,31 +108,53 @@ const effectDropHighlight = {
108
108
  outline: colors_1.BORDER_TIMELINE_DROP_BLUE,
109
109
  outlineOffset: -1,
110
110
  };
111
- const TimelineSequenceExpandArrowInner = ({ disabled, isExpanded, nodePathInfo, selectedItems, sequence }) => {
111
+ const TimelineSequenceLabelInner = ({ disabled, isExpanded, nodePathInfo, selectedItems, sequence, canHaveExpandableContent, displayName, fallbackDisplayName, selected, containsSelection, editing, onCancelEditing, onSaveName, numberOfHiddenDuplicates, }) => {
112
112
  const { toggleTrack } = (0, react_1.useContext)(ExpandedTracksProvider_1.ExpandedTracksSetterContext);
113
113
  const hasExpandableContent = (0, use_timeline_expanded_tree_1.useTimelineSequenceHasExpandableContent)({
114
114
  sequence,
115
115
  nodePathInfo,
116
116
  selectedItems,
117
117
  });
118
- const onToggleExpand = (0, react_1.useCallback)(() => toggleTrack(nodePathInfo), [nodePathInfo, toggleTrack]);
119
- if (!hasExpandableContent) {
120
- return jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {});
121
- }
122
- return (jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowButton, { isExpanded: isExpanded, onClick: onToggleExpand, label: "track properties", disabled: disabled }));
118
+ const showChevronSlot = canHaveExpandableContent && nodePathInfo !== null;
119
+ const showChevron = showChevronSlot && hasExpandableContent;
120
+ const onToggleExpand = (0, react_1.useCallback)(() => {
121
+ if (nodePathInfo !== null) {
122
+ toggleTrack(nodePathInfo);
123
+ }
124
+ }, [nodePathInfo, toggleTrack]);
125
+ return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
126
+ jsx_runtime_1.jsx(TimelineSequenceName_1.TimelineSequenceName, { displayName: displayName, fallbackDisplayName: fallbackDisplayName, selected: selected, containsSelection: containsSelection, editing: editing, onCancelEditing: onCancelEditing, onSaveName: onSaveName, chevronSlot: showChevronSlot && !editing && numberOfHiddenDuplicates === 0
127
+ ? showChevron
128
+ ? 'occupied'
129
+ : 'empty'
130
+ : 'none' }), numberOfHiddenDuplicates > 0 ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
131
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(TimelineDuplicateCount_1.TimelineDuplicateCount, { count: numberOfHiddenDuplicates })
132
+ ] })) : null, showChevronSlot ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
133
+ jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), showChevron ? (jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowButton, { isExpanded: isExpanded, onClick: onToggleExpand, label: "track properties", disabled: disabled })) : (jsx_runtime_1.jsx(TimelineExpandArrowButton_1.TimelineExpandArrowSpacer, {}))] })) : null] }));
123
134
  };
124
- const areTimelineSequenceExpandArrowPropsEqual = (first, second) => {
135
+ const TimelineSequenceLabel = react_1.default.memo(TimelineSequenceLabelInner, (first, second) => {
125
136
  var _a, _b, _c, _d;
126
- return (first.disabled === second.disabled &&
137
+ return first.disabled === second.disabled &&
127
138
  first.isExpanded === second.isExpanded &&
128
139
  first.selectedItems === second.selectedItems &&
140
+ first.canHaveExpandableContent === second.canHaveExpandableContent &&
141
+ first.displayName === second.displayName &&
142
+ first.fallbackDisplayName === second.fallbackDisplayName &&
143
+ first.selected === second.selected &&
144
+ first.containsSelection === second.containsSelection &&
145
+ first.editing === second.editing &&
146
+ first.onCancelEditing === second.onCancelEditing &&
147
+ first.onSaveName === second.onSaveName &&
148
+ first.numberOfHiddenDuplicates === second.numberOfHiddenDuplicates &&
129
149
  ((_a = first.sequence.controls) === null || _a === void 0 ? void 0 : _a.schema) === ((_b = second.sequence.controls) === null || _b === void 0 ? void 0 : _b.schema) &&
130
150
  ((_c = first.sequence.controls) === null || _c === void 0 ? void 0 : _c.runtimeValues) ===
131
151
  ((_d = second.sequence.controls) === null || _d === void 0 ? void 0 : _d.runtimeValues) &&
132
152
  first.sequence.effects === second.sequence.effects &&
133
- (0, are_sequence_node_path_infos_equal_1.areSequenceNodePathInfosEqual)(first.nodePathInfo, second.nodePathInfo));
134
- };
135
- const TimelineSequenceExpandArrow = react_1.default.memo(TimelineSequenceExpandArrowInner, areTimelineSequenceExpandArrowPropsEqual);
153
+ (first.nodePathInfo === second.nodePathInfo ||
154
+ (first.nodePathInfo !== null &&
155
+ second.nodePathInfo !== null &&
156
+ (0, are_sequence_node_path_infos_equal_1.areSequenceNodePathInfosEqual)(first.nodePathInfo, second.nodePathInfo)));
157
+ });
136
158
  const sequenceReorderWrapper = {
137
159
  position: 'relative',
138
160
  };
@@ -1078,11 +1100,7 @@ const TimelineSequenceItemInner = ({ afterDropLineOffset, connectedCompositions,
1078
1100
  ]);
1079
1101
  const trackRow = (jsx_runtime_1.jsx(TimelineRowChrome_1.TimelineRowChrome, { depth: nestedDepth, eye: showVisibilityToggle ? (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEye, { type: sequence.type === 'audio' ? 'speaker' : 'eye', hidden: isItemHidden, onInvoked: canToggleVisibility ? onToggleVisibility : null })) : (jsx_runtime_1.jsx(TimelineLayerEye_1.TimelineLayerEyeSpacer, {})), arrow: jsx_runtime_1.jsx(TimelineLayerChildren_1.TimelineLayerChildrenToggle, { sequence: sequence }), style: rowStyle, selected: selected, selectable: selectable, onSelect: onSelect, showSelectedBackground: true, containsSelection: containsSelection, hovered: hovered, outerHeight: outerHeight, onDragLeave: canDropEffect ? onEffectDragLeave : undefined, onDragOver: canDropEffect ? onEffectDragOver : undefined, onDrop: canDropEffect ? onEffectDrop : undefined, onDoubleClick: canHandleSequenceDoubleClick ? onSequenceDoubleClick : undefined, onPointerEnter: onPointerEnter, onPointerLeave: onPointerLeave, children: jsx_runtime_1.jsxs("div", { style: labelContainerStyle, children: [connectedCompositions.length > 0 ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1080
1102
  jsx_runtime_1.jsx(CompositionOrStillIcon_1.CompositionOrStillIcon, { color: (0, TimelineSelection_1.getTimelineColor)(false, false), composition: connectedCompositions[0], style: connectedCompositionIconStyle }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 })
1081
- ] })) : null, jsx_runtime_1.jsx(TimelineSequenceName_1.TimelineSequenceName, { displayName: timelineDisplayName, fallbackDisplayName: fallbackDisplayName, selected: selected, containsSelection: containsSelection, editing: isRenaming, onCancelEditing: onCancelRenaming, onSaveName: onSaveName }), numberOfHiddenDuplicates > 0 ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1082
- jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(TimelineDuplicateCount_1.TimelineDuplicateCount, { count: numberOfHiddenDuplicates })
1083
- ] })) : null, hasExpandableContent && nodePathInfo !== null ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1084
- jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(TimelineSequenceExpandArrow, { disabled: !previewInteractive, isExpanded: isExpanded, nodePathInfo: nodePathInfo, selectedItems: selectedItems, sequence: sequence })
1085
- ] })) : null, mediaSrc ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1103
+ ] })) : null, jsx_runtime_1.jsx(TimelineSequenceLabel, { displayName: timelineDisplayName, fallbackDisplayName: fallbackDisplayName, selected: selected, containsSelection: containsSelection, editing: isRenaming, onCancelEditing: onCancelRenaming, onSaveName: onSaveName, numberOfHiddenDuplicates: numberOfHiddenDuplicates, canHaveExpandableContent: hasExpandableContent, disabled: !previewInteractive, isExpanded: isExpanded, nodePathInfo: nodePathInfo, selectedItems: selectedItems, sequence: sequence }), mediaSrc ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1086
1104
  jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }),
1087
1105
  " ",
1088
1106
  jsx_runtime_1.jsx(TimelineMediaInfo_1.TimelineMediaInfo, { src: mediaSrc })
@@ -7,4 +7,5 @@ export declare const TimelineSequenceName: React.FC<{
7
7
  readonly editing: boolean;
8
8
  readonly onCancelEditing: () => void;
9
9
  readonly onSaveName: (name: string) => Promise<void>;
10
+ readonly chevronSlot: 'none' | 'empty' | 'occupied';
10
11
  }>;
@@ -8,13 +8,16 @@ const TimelineSelection_1 = require("./TimelineSelection");
8
8
  const MAX_DISPLAY_NAME_LENGTH = 1000;
9
9
  const MAX_RENAME_INPUT_WIDTH = 240;
10
10
  const RENAME_INPUT_CLASS_NAME = 'remotion-timeline-sequence-name-input';
11
+ const LABEL_FONT_FAMILY = 'Arial, Helvetica, sans-serif';
12
+ // 4px gap + 12px chevron + 4px chevron margin.
13
+ const CHEVRON_SLOT_WIDTH = 20;
11
14
  const getTruncatedDisplayName = (displayName) => {
12
15
  if (displayName.length > MAX_DISPLAY_NAME_LENGTH) {
13
16
  return displayName.slice(0, MAX_DISPLAY_NAME_LENGTH) + '...';
14
17
  }
15
18
  return displayName;
16
19
  };
17
- const TimelineSequenceName = ({ displayName, fallbackDisplayName, selected, containsSelection, editing, onCancelEditing, onSaveName, }) => {
20
+ const TimelineSequenceName = ({ displayName, fallbackDisplayName, selected, containsSelection, editing, onCancelEditing, onSaveName, chevronSlot, }) => {
18
21
  const inputRef = (0, react_1.useRef)(null);
19
22
  const [draftName, setDraftName] = (0, react_1.useState)(displayName);
20
23
  const cancelNextBlurRef = (0, react_1.useRef)(false);
@@ -25,11 +28,12 @@ const TimelineSequenceName = ({ displayName, fallbackDisplayName, selected, cont
25
28
  ...(0, TimelineSelection_1.getTimelineSelectedLabelStyle)(selected, false),
26
29
  display: 'inline-flex',
27
30
  flexShrink: 1,
28
- fontFamily: 'inherit',
31
+ fontFamily: LABEL_FONT_FAMILY,
29
32
  fontSize: 12,
30
33
  lineHeight: 'normal',
31
34
  minWidth: 0,
32
- overflow: 'hidden',
35
+ overflow: chevronSlot === 'none' ? 'hidden' : 'visible',
36
+ position: chevronSlot === 'none' ? undefined : 'relative',
33
37
  whiteSpace: 'nowrap',
34
38
  textOverflow: 'ellipsis',
35
39
  color: (0, TimelineSelection_1.getTimelineColor)(selected, false),
@@ -40,14 +44,14 @@ const TimelineSequenceName = ({ displayName, fallbackDisplayName, selected, cont
40
44
  ? `inset 0 0 0 2px ${TimelineSelection_1.TIMELINE_SELECTED_LABEL_BACKGROUND}`
41
45
  : undefined,
42
46
  };
43
- }, [selected, containsSelection]);
47
+ }, [selected, containsSelection, chevronSlot]);
44
48
  const inputStyle = (0, react_1.useMemo)(() => {
45
49
  return {
46
50
  ...style,
47
51
  background: colors_1.TRANSPARENT,
48
52
  border: 0,
49
53
  color: (0, TimelineSelection_1.getTimelineColor)(false, false),
50
- fontFamily: 'inherit',
54
+ fontFamily: LABEL_FONT_FAMILY,
51
55
  fontSize: 12,
52
56
  outline: 'none',
53
57
  paddingBottom: 0,
@@ -101,6 +105,34 @@ const TimelineSequenceName = ({ displayName, fallbackDisplayName, selected, cont
101
105
  jsx_runtime_1.jsx("style", { children: `.${RENAME_INPUT_CLASS_NAME}::selection { background: ${colors_1.WHITE_ALPHA_72}; color: ${colors_1.BLACK}; }` }), jsx_runtime_1.jsx("input", { ref: inputRef, className: RENAME_INPUT_CLASS_NAME, value: draftName, onChange: (e) => setDraftName(e.target.value), onBlur: onBlur, onKeyDown: onKeyDown, size: Math.max(1, draftName.length), style: inputStyle })
102
106
  ] }));
103
107
  }
104
- return (jsx_runtime_1.jsx("div", { title: text, style: style, children: text }));
108
+ if (chevronSlot !== 'none') {
109
+ // Keep the name's flex width fixed while its visible text uses the empty slot.
110
+ return (jsx_runtime_1.jsx("div", { className: "remotion-timeline-sequence-name-measure", "data-name": text, title: text, style: {
111
+ ...style,
112
+ backgroundColor: undefined,
113
+ boxShadow: undefined,
114
+ clipPath: chevronSlot === 'occupied' ? 'inset(0)' : undefined,
115
+ }, children: jsx_runtime_1.jsx("div", { style: {
116
+ ...(0, TimelineSelection_1.getTimelineSelectedLabelStyle)(selected, false),
117
+ alignItems: 'center',
118
+ boxShadow: style.boxShadow,
119
+ boxSizing: 'border-box',
120
+ color: (0, TimelineSelection_1.getTimelineColor)(selected, false),
121
+ display: 'inline-flex',
122
+ fontFamily: LABEL_FONT_FAMILY,
123
+ fontSize: 12,
124
+ height: '100%',
125
+ left: 0,
126
+ lineHeight: 'normal',
127
+ maxWidth: `calc(100% + ${CHEVRON_SLOT_WIDTH}px)`,
128
+ overflow: 'hidden',
129
+ position: 'absolute',
130
+ textOverflow: 'ellipsis',
131
+ top: 0,
132
+ whiteSpace: 'nowrap',
133
+ width: 'max-content',
134
+ }, children: text }) }));
135
+ }
136
+ return (jsx_runtime_1.jsx("div", { role: "group", "aria-label": text, style: style, children: text }));
105
137
  };
106
138
  exports.TimelineSequenceName = TimelineSequenceName;
@@ -53,6 +53,7 @@ const get_timeline_keyframes_1 = require("./get-timeline-keyframes");
53
53
  const save_sequence_prop_1 = require("./save-sequence-prop");
54
54
  const timeline_field_row_layout_1 = require("./timeline-field-row-layout");
55
55
  const TimelineExpandArrowButton_1 = require("./TimelineExpandArrowButton");
56
+ const TimelineFieldLabel_1 = require("./TimelineFieldLabel");
56
57
  const TimelineFieldRowContent_1 = require("./TimelineFieldRowContent");
57
58
  const TimelineKeyframeControls_1 = require("./TimelineKeyframeControls");
58
59
  const TimelineKeyframedValue_1 = require("./TimelineKeyframedValue");
@@ -415,7 +416,7 @@ const TimelineSequenceKeyframedValueUnmemoized = (props) => {
415
416
  };
416
417
  exports.TimelineSequenceKeyframedValue = react_1.default.memo(TimelineSequenceKeyframedValueUnmemoized);
417
418
  const TimelineSequencePropItem = ({ field, validatedLocation, rowDepth, nodePath, nodePathInfo, schema, keyframeDisplayOffset, keyframePlaybackRate, keyframeControlsMode, runtimeValue, }) => {
418
- var _a, _b;
419
+ var _a, _b, _c;
419
420
  const { propStatuses: visualModePropStatuses } = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesContext);
420
421
  const propStatusesRef = (0, react_1.useContext)(remotion_1.Internals.VisualModePropStatusesRefContext);
421
422
  const sequencesRef = (0, react_1.useContext)(remotion_1.Internals.SequenceManagerRefContext);
@@ -445,11 +446,12 @@ const TimelineSequencePropItem = ({ field, validatedLocation, rowDepth, nodePath
445
446
  selected: selection.selected,
446
447
  keyframable,
447
448
  })) ? (jsx_runtime_1.jsx(TimelineKeyframeControls_1.TimelineKeyframeControls, { fieldKey: field.key, propStatus: propStatus, nodePath: nodePath, fileName: validatedLocation.source, keyframeDisplayOffset: keyframeDisplayOffset, keyframePlaybackRate: keyframePlaybackRate, defaultValue: field.fieldSchema.default, dragOverrideValue: dragOverrideValue, schema: schema, effectIndex: null, nodePathInfo: nodePathInfo, mode: keyframeControlsMode })) : null;
449
+ const hidePathValue = keyframeControlsMode === 'timeline' && field.typeName === 'svg-path';
448
450
  const style = (0, react_1.useMemo)(() => {
449
- return (0, timeline_field_row_layout_1.isTimelineFieldStacked)({ field, transform3DMode })
451
+ return !hidePathValue && (0, timeline_field_row_layout_1.isTimelineFieldStacked)({ field, transform3DMode })
450
452
  ? fieldRowBase
451
453
  : { ...fieldRowBase, height: field.rowHeight };
452
- }, [field, transform3DMode]);
454
+ }, [field, hidePathValue, transform3DMode]);
453
455
  const canResetToDefault = (0, react_1.useMemo)(() => {
454
456
  if (!propStatus || propStatus.status === 'computed') {
455
457
  return false;
@@ -614,7 +616,7 @@ const TimelineSequencePropItem = ({ field, validatedLocation, rowDepth, nodePath
614
616
  ...style,
615
617
  }, children: fieldValue }));
616
618
  }
617
- 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, onSelect: selection.onSelect, onDoubleClick: onPropertyDoubleClick, showSelectedBackground: true, containsSelection: containsSelection, outerHeight: null, children: jsx_runtime_1.jsx(TimelineFieldRowContent_1.TimelineFieldRowContent, { field: field, rowDepth: rowDepth, selected: selection.selected || containsSelection, children: fieldValue }) }));
619
+ 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, onSelect: selection.onSelect, onDoubleClick: onPropertyDoubleClick, showSelectedBackground: true, containsSelection: containsSelection, outerHeight: null, children: hidePathValue ? (jsx_runtime_1.jsx(TimelineFieldLabel_1.TimelineFieldLabel, { rowDepth: rowDepth, selected: selection.selected || containsSelection, label: (_c = field.description) !== null && _c !== void 0 ? _c : field.key })) : (jsx_runtime_1.jsx(TimelineFieldRowContent_1.TimelineFieldRowContent, { field: field, rowDepth: rowDepth, selected: selection.selected || containsSelection, children: fieldValue })) }));
618
620
  return jsx_runtime_1.jsx(ContextMenu_1.ContextMenu, { getItems: getContextMenuItems, children: row });
619
621
  };
620
622
  exports.TimelineSequencePropItem = TimelineSequencePropItem;
@@ -925,7 +925,7 @@ const TimelineSequenceLeftEdgeDragHandleInner = ({ cursor, nodePathInfo, windowW
925
925
  background: colors_1.TRANSPARENT,
926
926
  };
927
927
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
928
- jsx_runtime_1.jsx("div", { role: "separator", "aria-orientation": "vertical", title: "Drag to trim start", style: style, onPointerDown: onPointerDown }), trimTooltip === null ? null : (jsx_runtime_1.jsx(TimelineTrimTooltip_1.TimelineTrimTooltip, { state: trimTooltip, fps: fps }))] }));
928
+ jsx_runtime_1.jsx("div", { role: "separator", "aria-orientation": "vertical", "aria-label": "Drag to trim start", style: style, onPointerDown: onPointerDown }), trimTooltip === null ? null : (jsx_runtime_1.jsx(TimelineTrimTooltip_1.TimelineTrimTooltip, { state: trimTooltip, fps: fps }))] }));
929
929
  };
930
930
  exports.TimelineSequenceLeftEdgeDragHandle = react_1.default.memo(TimelineSequenceLeftEdgeDragHandleInner);
931
931
  const useTimelineSequenceFromDrag = ({ nodePathInfo, windowWidth, timelineDurationInFrames, onDragEnd, }) => {
@@ -1373,6 +1373,6 @@ const TimelineSequenceRightEdgeDragHandleInner = ({ cursor, nodePathInfo, mediaD
1373
1373
  background: colors_1.TRANSPARENT,
1374
1374
  };
1375
1375
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
1376
- jsx_runtime_1.jsx("div", { role: "separator", "aria-orientation": "vertical", title: "Drag to change duration", style: style, onPointerDown: onPointerDown }), trimTooltip === null ? null : (jsx_runtime_1.jsx(TimelineTrimTooltip_1.TimelineTrimTooltip, { state: trimTooltip, fps: fps }))] }));
1376
+ jsx_runtime_1.jsx("div", { role: "separator", "aria-orientation": "vertical", "aria-label": "Drag to change duration", style: style, onPointerDown: onPointerDown }), trimTooltip === null ? null : (jsx_runtime_1.jsx(TimelineTrimTooltip_1.TimelineTrimTooltip, { state: trimTooltip, fps: fps }))] }));
1377
1377
  };
1378
1378
  exports.TimelineSequenceRightEdgeDragHandle = react_1.default.memo(TimelineSequenceRightEdgeDragHandleInner);
@@ -85,7 +85,7 @@ const TimelineZoomSlider = ({ maxWidth, minZoom, timelineViewportWidth }) => {
85
85
  zoom: (_b = zoomMap[videoConfig.id]) !== null && _b !== void 0 ? _b : null,
86
86
  });
87
87
  const roundedZoom = Math.round(zoom * 100) / 100;
88
- return (jsx_runtime_1.jsx("input", { style: maxWidth === undefined ? undefined : { maxWidth }, title: `Timeline zoom (${roundedZoom}px/frame)`, alt: `Timeline zoom (${roundedZoom}px/frame)`, type: "range", min: get_timeline_max_zoom_1.TIMELINE_ZOOM_SLIDER_PROPS.min, max: get_timeline_max_zoom_1.TIMELINE_ZOOM_SLIDER_PROPS.max, step: get_timeline_max_zoom_1.TIMELINE_ZOOM_SLIDER_PROPS.step, value: (0, get_timeline_max_zoom_1.timelineZoomToSliderValue)({ zoom, minZoom }), onChange: onChange, className: "__remotion-timeline-slider", tabIndex: tabIndex }));
88
+ return (jsx_runtime_1.jsx("input", { style: maxWidth === undefined ? undefined : { maxWidth }, "aria-label": `Timeline zoom (${roundedZoom}px/frame)`, alt: `Timeline zoom (${roundedZoom}px/frame)`, type: "range", min: get_timeline_max_zoom_1.TIMELINE_ZOOM_SLIDER_PROPS.min, max: get_timeline_max_zoom_1.TIMELINE_ZOOM_SLIDER_PROPS.max, step: get_timeline_max_zoom_1.TIMELINE_ZOOM_SLIDER_PROPS.step, value: (0, get_timeline_max_zoom_1.timelineZoomToSliderValue)({ zoom, minZoom }), onChange: onChange, className: "__remotion-timeline-slider", tabIndex: tabIndex }));
89
89
  };
90
90
  const TimelineZoomControlsInner = ({ sliderMaxWidth }) => {
91
91
  var _a;
@@ -124,7 +124,7 @@ const TimelineZoomControlsInner = ({ sliderMaxWidth }) => {
124
124
  return null;
125
125
  }
126
126
  return (jsx_runtime_1.jsxs("div", { style: container, children: [
127
- jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: "Zoom out", shortcut: null, delay: 800, dismissOnClick: true, children: jsx_runtime_1.jsx(ControlButton_1.ControlButton, { onClick: onMinusClicked, style: buttonStyle, title: "", "aria-label": "Zoom out timeline", type: "button", children: (color) => jsx_runtime_1.jsx(canvas_zoom_1.CanvasZoomOutIcon, { color: color }) }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(TimelineZoomSlider, { maxWidth: sliderMaxWidth, minZoom: minZoom, timelineViewportWidth: timelineViewportWidth }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: "Zoom in", shortcut: null, delay: 800, dismissOnClick: true, children: jsx_runtime_1.jsx(ControlButton_1.ControlButton, { onClick: onPlusClicked, style: buttonStyle, title: "", "aria-label": "Zoom in timeline", type: "button", children: (color) => jsx_runtime_1.jsx(canvas_zoom_1.CanvasZoomIcon, { color: color }) }) })
127
+ jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: "Zoom out", shortcut: null, delay: 800, dismissOnClick: true, children: jsx_runtime_1.jsx(ControlButton_1.ControlButton, { onClick: onMinusClicked, style: buttonStyle, "aria-label": "Zoom out timeline", type: "button", children: (color) => jsx_runtime_1.jsx(canvas_zoom_1.CanvasZoomOutIcon, { color: color }) }) }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(TimelineZoomSlider, { maxWidth: sliderMaxWidth, minZoom: minZoom, timelineViewportWidth: timelineViewportWidth }), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: "Zoom in", shortcut: null, delay: 800, dismissOnClick: true, children: jsx_runtime_1.jsx(ControlButton_1.ControlButton, { onClick: onPlusClicked, style: buttonStyle, "aria-label": "Zoom in timeline", type: "button", children: (color) => jsx_runtime_1.jsx(canvas_zoom_1.CanvasZoomIcon, { color: color }) }) })
128
128
  ] }));
129
129
  };
130
130
  exports.TimelineZoomControls = react_1.default.memo(TimelineZoomControlsInner);
@@ -28,12 +28,12 @@ const getSequenceSplitMenuItem = ({ nodePathInfo, sequence, propStatuses, splitF
28
28
  return {
29
29
  type: 'item',
30
30
  id: 'split-sequence',
31
- label: (jsx_runtime_1.jsx("span", { style: {
31
+ label: (jsx_runtime_1.jsx("span", { role: "group", style: {
32
32
  fontFamily: 'inherit',
33
33
  fontSize: 'inherit',
34
34
  lineHeight: 'inherit',
35
35
  color: 'inherit',
36
- }, title: disabledReason !== null && disabledReason !== void 0 ? disabledReason : 'Split at the playhead', children: "Split clip" })),
36
+ }, "aria-label": disabledReason !== null && disabledReason !== void 0 ? disabledReason : 'Split at the playhead', children: "Split clip" })),
37
37
  value: 'split-sequence',
38
38
  keyHint: null,
39
39
  leftItem: null,
@@ -2,7 +2,7 @@ import { type TSequence } from 'remotion';
2
2
  import type { SequenceNodePathInfo } from '../../helpers/get-timeline-sequence-sort-key';
3
3
  export declare const useTimelineSequenceHasExpandableContent: ({ sequence, nodePathInfo, selectedItems, }: {
4
4
  readonly sequence: TSequence;
5
- readonly nodePathInfo: SequenceNodePathInfo;
5
+ readonly nodePathInfo: SequenceNodePathInfo | null;
6
6
  readonly selectedItems: readonly import("@remotion/canvas").CanvasSelectionItem[];
7
7
  }) => boolean;
8
8
  export declare const useTimelineExpandedTree: ({ sequence, nodePathInfo, includeTextContent, includeSourceControls, }: {
@@ -14,6 +14,9 @@ const useTimelineSequenceHasExpandableContent = ({ sequence, nodePathInfo, selec
14
14
  const { getDragOverrides, getEffectDragOverrides } = (0, react_1.useContext)(remotion_1.Internals.VisualModeDragOverridesContext);
15
15
  const selectedRowKeys = (0, react_1.useMemo)(() => (0, timeline_expanded_filter_1.getSelectedTimelineExpandedRowKeys)(selectedItems), [selectedItems]);
16
16
  const selectHasExpandableContent = (0, react_1.useCallback)((runtimeValues) => {
17
+ if (nodePathInfo === null) {
18
+ return false;
19
+ }
17
20
  const tree = (0, timeline_layout_1.buildTimelineTree)({
18
21
  sequence,
19
22
  nodePathInfo,