@remotion/studio 4.0.516 → 4.0.518

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 (157) hide show
  1. package/dist/components/AssetSelector.js +63 -22
  2. package/dist/components/AssetSelectorItem.d.ts +2 -1
  3. package/dist/components/AssetSelectorItem.js +41 -10
  4. package/dist/components/Canvas.js +15 -12
  5. package/dist/components/CanvasCaptureDropHandler.d.ts +4 -0
  6. package/dist/components/CanvasCaptureDropHandler.js +42 -0
  7. package/dist/components/CanvasOrLoading.js +4 -3
  8. package/dist/components/CaptionInspector.js +1 -1
  9. package/dist/components/CaptionTextEditor.js +32 -8
  10. package/dist/components/CheckboardToggle.js +1 -1
  11. package/dist/components/Checkbox.d.ts +0 -1
  12. package/dist/components/Checkbox.js +2 -19
  13. package/dist/components/CompositionContextButton.js +2 -1
  14. package/dist/components/CompositionSelector.js +1 -1
  15. package/dist/components/ConfigureLicenseModal.js +79 -46
  16. package/dist/components/CurrentAsset.d.ts +1 -1
  17. package/dist/components/CurrentAsset.js +9 -4
  18. package/dist/components/Editor.js +2 -1
  19. package/dist/components/EditorContent.js +11 -5
  20. package/dist/components/EditorContexts.js +2 -1
  21. package/dist/components/EditorRuler/Ruler.d.ts +1 -0
  22. package/dist/components/EditorRuler/Ruler.js +9 -8
  23. package/dist/components/EditorRuler/index.d.ts +1 -0
  24. package/dist/components/EditorRuler/index.js +3 -4
  25. package/dist/components/EditorRuler/use-is-ruler-visible.d.ts +1 -1
  26. package/dist/components/EditorRuler/use-is-ruler-visible.js +8 -2
  27. package/dist/components/ElementInstallConfirmation.d.ts +5 -0
  28. package/dist/components/ElementInstallConfirmation.js +25 -1
  29. package/dist/components/ElementLibraryModal.d.ts +5 -0
  30. package/dist/components/ElementLibraryModal.js +40 -0
  31. package/dist/components/FilePreview.js +71 -0
  32. package/dist/components/InlineCaptionInspector.js +13 -2
  33. package/dist/components/InlineEditableTitle.js +2 -2
  34. package/dist/components/InspectorPanel/CompositionInspector.js +11 -38
  35. package/dist/components/InspectorPanel/CompositionInspectorHeader.js +2 -2
  36. package/dist/components/InspectorPanel/CompositionMetadata.js +11 -4
  37. package/dist/components/InspectorPanel/EasingInspector.js +2 -2
  38. package/dist/components/InspectorPanel/ElementLibraryButton.d.ts +2 -0
  39. package/dist/components/InspectorPanel/ElementLibraryButton.js +139 -0
  40. package/dist/components/InspectorPanel/KeyframeInspector.js +1 -1
  41. package/dist/components/InspectorPanel/SequenceInspectorHeader.js +12 -5
  42. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -3
  43. package/dist/components/InspectorPanel/common.d.ts +0 -1
  44. package/dist/components/InspectorPanel/common.js +3 -7
  45. package/dist/components/InspectorPanel/inspector-selection.d.ts +2 -2
  46. package/dist/components/InspectorPanel/styles.d.ts +0 -1
  47. package/dist/components/InspectorPanel/styles.js +3 -4
  48. package/dist/components/InspectorPanel/use-track-for-selection.d.ts +1 -2
  49. package/dist/components/InspectorSequenceSection.d.ts +1 -2
  50. package/dist/components/InspectorSourceLocation.js +1 -1
  51. package/dist/components/Menu/MenuItem.js +15 -6
  52. package/dist/components/MenuToolbar.js +7 -3
  53. package/dist/components/Modals.js +51 -1
  54. package/dist/components/PlaybackRateSelector.js +3 -6
  55. package/dist/components/Preview.js +83 -5
  56. package/dist/components/PreviewToolbar.js +10 -4
  57. package/dist/components/PreviewToolbarOverflowButton.d.ts +1 -0
  58. package/dist/components/PreviewToolbarOverflowButton.js +9 -2
  59. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.d.ts +2 -0
  60. package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +28 -8
  61. package/dist/components/RadioButton.d.ts +6 -0
  62. package/dist/components/RadioButton.js +62 -0
  63. package/dist/components/RenderButton.js +2 -1
  64. package/dist/components/RulersAndGuidesToggle.d.ts +3 -1
  65. package/dist/components/RulersAndGuidesToggle.js +18 -7
  66. package/dist/components/SelectedOutlineKeyboardControls.d.ts +2 -2
  67. package/dist/components/SelectedOutlineOverlay.d.ts +1 -3
  68. package/dist/components/SelectedOutlineOverlay.js +21 -17
  69. package/dist/components/SelectedOutlinePolygon.d.ts +1 -2
  70. package/dist/components/SelectedOutlineRenderer.d.ts +2 -3
  71. package/dist/components/SelectedOutlineRenderer.js +9 -78
  72. package/dist/components/SelectedOutlineUvControls.d.ts +1 -1
  73. package/dist/components/SettingsModal.js +1 -1
  74. package/dist/components/SettingsModalFooter.d.ts +3 -1
  75. package/dist/components/SettingsModalFooter.js +19 -4
  76. package/dist/components/ShowPixelGridProvider.d.ts +4 -0
  77. package/dist/components/ShowPixelGridProvider.js +24 -0
  78. package/dist/components/SidebarCollapserControls.js +2 -2
  79. package/dist/components/SidebarRenderButton.js +2 -1
  80. package/dist/components/Timeline/Timeline.js +41 -0
  81. package/dist/components/Timeline/TimelineClipboardKeybindings.d.ts +6 -7
  82. package/dist/components/Timeline/TimelineDragHandler.js +11 -4
  83. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +1 -2
  84. package/dist/components/Timeline/TimelinePlayCursorSyncer.js +4 -2
  85. package/dist/components/Timeline/TimelineSelection.d.ts +29 -66
  86. package/dist/components/Timeline/TimelineSelection.js +30 -170
  87. package/dist/components/Timeline/TimelineSequenceItem.d.ts +1 -0
  88. package/dist/components/Timeline/TimelineSequenceItem.js +8 -6
  89. package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +3 -4
  90. package/dist/components/Timeline/delete-selected-timeline-item.d.ts +3 -4
  91. package/dist/components/Timeline/duplicate-selected-timeline-item.d.ts +3 -4
  92. package/dist/components/Timeline/find-track-for-node-path-info.d.ts +1 -1
  93. package/dist/components/Timeline/keyframe-clipboard.d.ts +2 -3
  94. package/dist/components/Timeline/reset-selected-timeline-props.d.ts +2 -3
  95. package/dist/components/Timeline/sequence-prop-clipboard.d.ts +2 -3
  96. package/dist/components/Timeline/split-selected-timeline-item.d.ts +2 -3
  97. package/dist/components/Timeline/timeline-expanded-filter.d.ts +1 -2
  98. package/dist/components/Timeline/timeline-scroll-logic.d.ts +7 -5
  99. package/dist/components/Timeline/timeline-scroll-logic.js +12 -7
  100. package/dist/components/Timeline/update-selected-easing.d.ts +7 -7
  101. package/dist/components/Timeline/use-timeline-asset-drop.js +24 -1
  102. package/dist/components/Timeline/use-timeline-keyframe-drag.d.ts +6 -7
  103. package/dist/components/WebMcp.d.ts +2 -0
  104. package/dist/components/WebMcp.js +945 -0
  105. package/dist/components/canvas-capture-drop.d.ts +4 -0
  106. package/dist/components/canvas-capture-drop.js +22 -0
  107. package/dist/components/composition-menu-items.js +26 -0
  108. package/dist/components/selected-outline-geometry.d.ts +2 -21
  109. package/dist/components/selected-outline-geometry.js +5 -16
  110. package/dist/components/selected-outline-measurement.d.ts +8 -37
  111. package/dist/components/selected-outline-measurement.js +1 -231
  112. package/dist/components/selected-outline-types.d.ts +2 -15
  113. package/dist/components/selected-outline-uv.js +3 -106
  114. package/dist/esm/{chunk-w4244j4n.js → chunk-7prjt5n5.js} +32831 -26820
  115. package/dist/esm/internals.mjs +32831 -26820
  116. package/dist/esm/previewEntry.mjs +17304 -11293
  117. package/dist/esm/renderEntry.mjs +1 -1
  118. package/dist/helpers/calculate-timeline.d.ts +1 -7
  119. package/dist/helpers/calculate-timeline.js +2 -146
  120. package/dist/helpers/create-folder-tree.js +16 -1
  121. package/dist/helpers/editor-ruler.js +6 -5
  122. package/dist/helpers/format-file-location.d.ts +8 -0
  123. package/dist/helpers/format-file-location.js +14 -3
  124. package/dist/helpers/get-asset-metadata.d.ts +19 -0
  125. package/dist/helpers/get-asset-metadata.js +51 -6
  126. package/dist/helpers/get-connected-compositions.d.ts +1 -6
  127. package/dist/helpers/get-connected-compositions.js +2 -8
  128. package/dist/helpers/get-sequence-visible-range.d.ts +1 -5
  129. package/dist/helpers/get-sequence-visible-range.js +6 -51
  130. package/dist/helpers/get-timeline-max-zoom.d.ts +8 -0
  131. package/dist/helpers/get-timeline-max-zoom.js +17 -6
  132. package/dist/helpers/get-timeline-nestedness.d.ts +1 -2
  133. package/dist/helpers/get-timeline-nestedness.js +2 -12
  134. package/dist/helpers/get-timeline-sequence-sort-key.d.ts +2 -22
  135. package/dist/helpers/get-timeline-sequence-sort-key.js +2 -16
  136. package/dist/helpers/hoverable.d.ts +1 -0
  137. package/dist/helpers/hoverable.js +4 -1
  138. package/dist/helpers/is-current-selected-still.js +4 -2
  139. package/dist/helpers/sort-by-nonce-history.d.ts +1 -5
  140. package/dist/helpers/sort-by-nonce-history.js +3 -148
  141. package/dist/helpers/timeline-node-path-key.d.ts +1 -2
  142. package/dist/helpers/timeline-node-path-key.js +2 -2
  143. package/dist/helpers/use-menu-structure.js +20 -0
  144. package/dist/icons/enter.d.ts +4 -0
  145. package/dist/icons/enter.js +10 -0
  146. package/dist/state/editor-pixel-grid.d.ts +8 -0
  147. package/dist/state/editor-pixel-grid.js +18 -0
  148. package/dist/state/modals.d.ts +4 -0
  149. package/dist/state/playbackrate.d.ts +1 -0
  150. package/dist/state/playbackrate.js +4 -1
  151. package/package.json +14 -12
  152. package/dist/components/selected-outline-order.d.ts +0 -12
  153. package/dist/components/selected-outline-order.js +0 -251
  154. package/dist/helpers/get-box-quads-polyfill-internals.d.ts +0 -82
  155. package/dist/helpers/get-box-quads-polyfill-internals.js +0 -2403
  156. package/dist/helpers/get-box-quads-ponyfill.d.ts +0 -10
  157. package/dist/helpers/get-box-quads-ponyfill.js +0 -23
@@ -1,19 +1,5 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getTimelineSequenceSortKey = void 0;
4
- const getTimelineSequenceSortKey = (track, tracks, nonceRanks) => {
5
- var _a;
6
- const rank = (_a = nonceRanks.get(track.sequence.id)) !== null && _a !== void 0 ? _a : 0;
7
- const id = String(rank).padStart(6, '0');
8
- if (!track.sequence.parent) {
9
- return id;
10
- }
11
- const parent = tracks.find((t) => t.sequence.id === track.sequence.parent);
12
- if (!parent) {
13
- // Due to effects and conditional `showInTimeline`, a parent
14
- // may not exist in the `allTracks` array.
15
- return id;
16
- }
17
- return `${(0, exports.getTimelineSequenceSortKey)(parent, tracks, nonceRanks)}-${id}`;
18
- };
19
- exports.getTimelineSequenceSortKey = getTimelineSequenceSortKey;
4
+ const canvas_1 = require("@remotion/canvas");
5
+ Object.defineProperty(exports, "getTimelineSequenceSortKey", { enumerable: true, get: function () { return canvas_1.getTimelineSequenceSortKey; } });
@@ -3,6 +3,7 @@ export declare const HOVERABLE_CLASS_NAME = "__remotion-hoverable";
3
3
  export declare const HOVER_GROUP_CLASS_NAME = "__remotion-hover-group";
4
4
  export declare const HOVER_GROUP_REVEAL_CLASS_NAME = "__remotion-hover-group-reveal";
5
5
  export declare const FOCUS_VISIBLE_ONLY_CLASS_NAME = "__remotion-focus-visible-only";
6
+ export declare const NO_HOVER_BACKGROUND_STYLE: React.CSSProperties;
6
7
  export declare const hoverableStyle: ({ idleBackground, hoverBackground, idleColor, hoverColor, }: {
7
8
  idleBackground: string;
8
9
  hoverBackground: string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.makeHoverableCSS = exports.hoverableStyle = exports.FOCUS_VISIBLE_ONLY_CLASS_NAME = exports.HOVER_GROUP_REVEAL_CLASS_NAME = exports.HOVER_GROUP_CLASS_NAME = exports.HOVERABLE_CLASS_NAME = void 0;
3
+ exports.makeHoverableCSS = exports.hoverableStyle = exports.NO_HOVER_BACKGROUND_STYLE = exports.FOCUS_VISIBLE_ONLY_CLASS_NAME = exports.HOVER_GROUP_REVEAL_CLASS_NAME = exports.HOVER_GROUP_CLASS_NAME = exports.HOVERABLE_CLASS_NAME = void 0;
4
4
  const colors_1 = require("./colors");
5
5
  // Purely visual hover styling must be driven by CSS `:hover` rather than
6
6
  // React state: When the Studio runs in an <iframe> (like in Browser Studio),
@@ -16,6 +16,9 @@ const BG_VARIABLE = '--remotion-hoverable-bg';
16
16
  const HOVER_BG_VARIABLE = '--remotion-hoverable-hover-bg';
17
17
  const COLOR_VARIABLE = '--remotion-hoverable-color';
18
18
  const HOVER_COLOR_VARIABLE = '--remotion-hoverable-hover-color';
19
+ exports.NO_HOVER_BACKGROUND_STYLE = {
20
+ [HOVER_BG_VARIABLE]: colors_1.TRANSPARENT,
21
+ };
19
22
  // To disable the hover effect (e.g. for a disabled control), pass the idle
20
23
  // values as the hover values.
21
24
  const hoverableStyle = ({ idleBackground, hoverBackground, idleColor, hoverColor, }) => {
@@ -14,13 +14,15 @@ const useIsStill = () => {
14
14
  exports.useIsStill = useIsStill;
15
15
  const useIsVideoComposition = () => {
16
16
  const isStill = (0, exports.useIsStill)();
17
- const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
17
+ const { canvasContent, currentAssetMetadata } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
18
18
  if (canvasContent === null) {
19
19
  return false;
20
20
  }
21
21
  if (isStill) {
22
22
  return false;
23
23
  }
24
- return canvasContent.type === 'composition';
24
+ return (canvasContent.type === 'composition' ||
25
+ (canvasContent.type === 'asset' &&
26
+ (currentAssetMetadata === null || currentAssetMetadata === void 0 ? void 0 : currentAssetMetadata.asset) === canvasContent.asset));
25
27
  };
26
28
  exports.useIsVideoComposition = useIsVideoComposition;
@@ -1,5 +1 @@
1
- import type { NonceHistory } from 'remotion';
2
- export declare const compareNonceHistories: (a: NonceHistory, b: NonceHistory) => number;
3
- export declare const sortItemsByNonceHistory: <T extends {
4
- nonce: NonceHistory;
5
- }>(items: T[]) => T[];
1
+ export { compareNonceHistories, sortItemsByNonceHistory } from '@remotion/canvas';
@@ -1,151 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.sortItemsByNonceHistory = exports.compareNonceHistories = void 0;
4
- const getSharedEpochOrder = (a, b) => {
5
- const aMap = new Map(a);
6
- const bMap = new Map(b);
7
- const allEpochs = [...new Set([...aMap.keys(), ...bMap.keys()])].sort((x, y) => y - x);
8
- for (const epoch of allEpochs) {
9
- const aNonce = aMap.get(epoch);
10
- const bNonce = bMap.get(epoch);
11
- if (aNonce !== undefined && bNonce !== undefined) {
12
- return aNonce - bNonce;
13
- }
14
- }
15
- return null;
16
- };
17
- const compareNonceHistories = (a, b) => {
18
- const shared = getSharedEpochOrder(a, b);
19
- if (shared !== null) {
20
- return shared;
21
- }
22
- // No shared epoch — items from a lower latest epoch come first
23
- const aLatestEpoch = a[a.length - 1][0];
24
- const bLatestEpoch = b[b.length - 1][0];
25
- return aLatestEpoch - bLatestEpoch;
26
- };
27
- exports.compareNonceHistories = compareNonceHistories;
28
- // Compare two histories, each pre-collapsed to parallel arrays of epochs and
29
- // nonces sorted by descending epoch, without rebuilding a Map per comparison.
30
- // Equivalent to getSharedEpochOrder: both find the newest shared epoch and
31
- // compare its nonces.
32
- const sharedEpochOrderFromSorted = (aEpochs, aNonces, bEpochs, bNonces) => {
33
- let i = 0;
34
- let j = 0;
35
- while (i < aEpochs.length && j < bEpochs.length) {
36
- const ae = aEpochs[i];
37
- const be = bEpochs[j];
38
- if (ae === be) {
39
- return aNonces[i] - bNonces[j];
40
- }
41
- if (ae > be) {
42
- i++;
43
- }
44
- else {
45
- j++;
46
- }
47
- }
48
- return null;
49
- };
50
- const sortItemsByNonceHistory = (items) => {
51
- const n = items.length;
52
- if (n <= 1) {
53
- return items.slice();
54
- }
55
- // Collapse each history once into epoch/nonce arrays sorted by descending
56
- // epoch. `new Map(nonce)` keeps the last value per duplicated epoch, matching
57
- // getSharedEpochOrder. This removes the per-pair Map/Set construction the
58
- // pairwise loop below would otherwise repeat O(n^2) times.
59
- const epochsOf = new Array(n);
60
- const noncesOf = new Array(n);
61
- for (let i = 0; i < n; i++) {
62
- const map = new Map(items[i].nonce);
63
- const epochs = [...map.keys()].sort((x, y) => y - x);
64
- epochsOf[i] = epochs;
65
- noncesOf[i] = epochs.map((e) => map.get(e));
66
- }
67
- // Pairwise "strictly before" relation, stored as bitsets: `before[i]` has
68
- // bit j set when i must come before j, `known[i]` has bit j set when the
69
- // pair (i, j) is directly determined by a shared epoch. Bitsets let the
70
- // transitive closure below combine 32 relationships per word.
71
- const words = (n + 31) >> 5;
72
- const before = new Uint32Array(n * words);
73
- const known = new Uint32Array(n * words);
74
- // Direct comparison sign per ordered pair; only read where `known` is set.
75
- const sign = new Int8Array(n * n);
76
- for (let i = 0; i < n; i++) {
77
- for (let j = i + 1; j < n; j++) {
78
- const cmp = sharedEpochOrderFromSorted(epochsOf[i], noncesOf[i], epochsOf[j], noncesOf[j]);
79
- if (cmp === null) {
80
- continue;
81
- }
82
- known[i * words + (j >> 5)] |= 1 << (j & 31);
83
- known[j * words + (i >> 5)] |= 1 << (i & 31);
84
- sign[i * n + j] = cmp < 0 ? -1 : cmp > 0 ? 1 : 0;
85
- sign[j * n + i] = cmp < 0 ? 1 : cmp > 0 ? -1 : 0;
86
- if (cmp < 0) {
87
- before[i * words + (j >> 5)] |= 1 << (j & 31);
88
- }
89
- else if (cmp > 0) {
90
- before[j * words + (i >> 5)] |= 1 << (i & 31);
91
- }
92
- }
93
- }
94
- // Transitive closure: if i < k and k < j, then i < j. This is the same
95
- // Floyd-Warshall relation as before, but the inner sweep is bitwise
96
- // (`before[k] & ~known[i]` finds all reachable j at once). A newly derived
97
- // edge is marked known immediately so the first path decides an otherwise
98
- // undetermined pair — preserving behavior on the inputs where the pairwise
99
- // comparison is intentionally non-transitive.
100
- for (let k = 0; k < n; k++) {
101
- const kBase = k * words;
102
- const kWord = k >> 5;
103
- const kBit = 1 << (k & 31);
104
- for (let i = 0; i < n; i++) {
105
- if (i === k) {
106
- continue;
107
- }
108
- const iBase = i * words;
109
- if ((before[iBase + kWord] & kBit) === 0) {
110
- continue; // i is not before k, so k adds nothing for i
111
- }
112
- for (let w = 0; w < words; w++) {
113
- const add = before[kBase + w] & ~known[iBase + w];
114
- if (add === 0) {
115
- continue;
116
- }
117
- before[iBase + w] |= add;
118
- known[iBase + w] |= add;
119
- // Set the mirror relationship (j after i) for each newly known pair.
120
- let bits = add;
121
- while (bits !== 0) {
122
- const lowest = bits & -bits;
123
- const j = (w << 5) + (31 - Math.clz32(lowest));
124
- sign[i * n + j] = -1;
125
- known[j * words + (i >> 5)] |= 1 << (i & 31);
126
- sign[j * n + i] = 1;
127
- bits ^= lowest;
128
- }
129
- }
130
- }
131
- }
132
- const indexMap = new Map(items.map((item, i) => [item, i]));
133
- const result = items.slice();
134
- result.sort((a, b) => {
135
- const ai = indexMap.get(a);
136
- const bi = indexMap.get(b);
137
- if ((known[ai * words + (bi >> 5)] >> (bi & 31)) & 1) {
138
- return sign[ai * n + bi];
139
- }
140
- if ((before[ai * words + (bi >> 5)] >> (bi & 31)) & 1) {
141
- return -1;
142
- }
143
- if ((before[bi * words + (ai >> 5)] >> (ai & 31)) & 1) {
144
- return 1;
145
- }
146
- // No transitive relationship — lower latest epoch first
147
- return a.nonce[a.nonce.length - 1][0] - b.nonce[b.nonce.length - 1][0];
148
- });
149
- return result;
150
- };
151
- exports.sortItemsByNonceHistory = sortItemsByNonceHistory;
4
+ const canvas_1 = require("@remotion/canvas");
5
+ Object.defineProperty(exports, "compareNonceHistories", { enumerable: true, get: function () { return canvas_1.compareNonceHistories; } });
6
+ Object.defineProperty(exports, "sortItemsByNonceHistory", { enumerable: true, get: function () { return canvas_1.sortItemsByNonceHistory; } });
@@ -1,4 +1,3 @@
1
- import type { SequencePropsSubscriptionKey } from 'remotion';
2
1
  import type { SequenceNodePathInfo } from './get-timeline-sequence-sort-key';
3
- export declare const timelineSequenceNodePathToKey: (key: SequencePropsSubscriptionKey) => string;
2
+ export { timelineSequenceNodePathToKey } from '@remotion/canvas';
4
3
  export declare const timelineNodePathInfoToKey: (info: SequenceNodePathInfo) => string;
@@ -2,8 +2,8 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.timelineNodePathInfoToKey = exports.timelineSequenceNodePathToKey = void 0;
4
4
  const studio_shared_1 = require("@remotion/studio-shared");
5
- const timelineSequenceNodePathToKey = (key) => `${key.absolutePath}:${JSON.stringify(key.nodePath)}`;
6
- exports.timelineSequenceNodePathToKey = timelineSequenceNodePathToKey;
5
+ const canvas_1 = require("@remotion/canvas");
6
+ Object.defineProperty(exports, "timelineSequenceNodePathToKey", { enumerable: true, get: function () { return canvas_1.timelineSequenceNodePathToKey; } });
7
7
  const timelineNodePathInfoToKey = (info) => [
8
8
  (0, studio_shared_1.stringifySequenceExpandedRowKey)(info.sequenceSubscriptionKey),
9
9
  info.auxiliaryKeys.join('.'),
@@ -20,6 +20,7 @@ const Checkmark_1 = require("../icons/Checkmark");
20
20
  const canvas_ref_1 = require("../state/canvas-ref");
21
21
  const checkerboard_1 = require("../state/checkerboard");
22
22
  const editor_guides_1 = require("../state/editor-guides");
23
+ const editor_pixel_grid_1 = require("../state/editor-pixel-grid");
23
24
  const editor_rulers_1 = require("../state/editor-rulers");
24
25
  const editor_snapping_1 = require("../state/editor-snapping");
25
26
  const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
@@ -234,6 +235,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
234
235
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
235
236
  const { checkerboard, setCheckerboard } = (0, react_1.useContext)(checkerboard_1.CheckerboardContext);
236
237
  const { editorZoomGestures, setEditorZoomGestures } = (0, react_1.useContext)(editor_zoom_gestures_1.EditorZoomGesturesContext);
238
+ const { editorShowPixelGrid, setEditorShowPixelGrid } = (0, react_1.useContext)(editor_pixel_grid_1.EditorShowPixelGridContext);
237
239
  const { editorShowRulers, setEditorShowRulers } = (0, react_1.useContext)(editor_rulers_1.EditorShowRulersContext);
238
240
  const { editorShowGuides, setEditorShowGuides } = (0, react_1.useContext)(editor_guides_1.EditorShowGuidesContext);
239
241
  const { editorSnapping, setEditorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
@@ -423,6 +425,22 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
423
425
  ? 'Disable Zoom and Pan Gestures'
424
426
  : 'Enable Zoom and Pan Gestures',
425
427
  },
428
+ {
429
+ id: 'pixel-grid',
430
+ keyHint: null,
431
+ label: 'Pixel Grid',
432
+ onClick: () => {
433
+ closeMenu();
434
+ setEditorShowPixelGrid((c) => !c);
435
+ },
436
+ type: 'item',
437
+ value: 'pixel-grid',
438
+ leftItem: editorShowPixelGrid ? jsx_runtime_1.jsx(Checkmark_1.Checkmark, {}) : null,
439
+ subMenu: null,
440
+ quickSwitcherLabel: editorShowPixelGrid
441
+ ? 'Hide Pixel Grid'
442
+ : 'Show Pixel Grid',
443
+ },
426
444
  {
427
445
  id: 'show-rulers',
428
446
  keyHint: null,
@@ -990,6 +1008,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
990
1008
  currentComposition,
991
1009
  resolvedCompositionLocation,
992
1010
  editorZoomGestures,
1011
+ editorShowPixelGrid,
993
1012
  editorShowRulers,
994
1013
  editorShowGuides,
995
1014
  editorSnapping,
@@ -1007,6 +1026,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
1007
1026
  size.size,
1008
1027
  setSize,
1009
1028
  setEditorZoomGestures,
1029
+ setEditorShowPixelGrid,
1010
1030
  setEditorShowRulers,
1011
1031
  setEditorShowGuides,
1012
1032
  setEditorSnapping,
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const EnterIcon: React.FC<SVGProps<SVGSVGElement> & {
3
+ readonly color: string;
4
+ }>;
@@ -0,0 +1,10 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EnterIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ // Font Awesome Pro v7.3.1, Copyright 2026 Fonticons, Inc.
6
+ // https://fontawesome.com/license (Commercial License)
7
+ const EnterIcon = ({ color, ...props }) => {
8
+ return (jsx_runtime_1.jsx("svg", { ...props, xmlns: "http://www.w3.org/2000/svg", viewBox: "0 0 640 640", children: jsx_runtime_1.jsx("path", { fill: color, d: "M544 144C544 135.2 551.2 128 560 128C568.8 128 576 135.2 576 144L576 240C576 293 533 336 480 336L118.6 336L235.3 452.7C241.5 458.9 241.5 469.1 235.3 475.3C229.1 481.5 218.9 481.5 212.7 475.3L68.7 331.3C65.7 328.3 64 324.2 64 320C64 315.8 65.7 311.7 68.7 308.7L212.7 164.7C218.9 158.5 229.1 158.5 235.3 164.7C241.5 170.9 241.5 181.1 235.3 187.3L118.6 304L480 304C515.3 304 544 275.3 544 240L544 144z" }) }));
9
+ };
10
+ exports.EnterIcon = EnterIcon;
@@ -0,0 +1,8 @@
1
+ type State = {
2
+ editorShowPixelGrid: boolean;
3
+ setEditorShowPixelGrid: (cb: (prevState: boolean) => boolean) => void;
4
+ };
5
+ export declare const persistEditorShowPixelGridOption: (option: boolean) => void;
6
+ export declare const loadEditorShowPixelGridOption: () => boolean;
7
+ export declare const EditorShowPixelGridContext: import("react").Context<State>;
8
+ export {};
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.EditorShowPixelGridContext = exports.loadEditorShowPixelGridOption = exports.persistEditorShowPixelGridOption = void 0;
4
+ const react_1 = require("react");
5
+ const key = 'remotion.editorShowPixelGrid';
6
+ const persistEditorShowPixelGridOption = (option) => {
7
+ localStorage.setItem(key, String(option));
8
+ };
9
+ exports.persistEditorShowPixelGridOption = persistEditorShowPixelGridOption;
10
+ const loadEditorShowPixelGridOption = () => {
11
+ const item = localStorage.getItem(key);
12
+ return item !== 'false';
13
+ };
14
+ exports.loadEditorShowPixelGridOption = loadEditorShowPixelGridOption;
15
+ exports.EditorShowPixelGridContext = (0, react_1.createContext)({
16
+ editorShowPixelGrid: true,
17
+ setEditorShowPixelGrid: () => undefined,
18
+ });
@@ -181,6 +181,10 @@ export type ModalState = {
181
181
  excludeCompositionId: string;
182
182
  onSelected: (composition: _InternalTypes['AnyComposition']) => void;
183
183
  } | null;
184
+ } | {
185
+ type: 'element-library';
186
+ name: string;
187
+ url: string;
184
188
  } | AddEffectModalState | ConfirmationDialogState | SvgImportDialogState;
185
189
  export type SetSelectedModalContextType = {
186
190
  setSelectedModal: React.Dispatch<React.SetStateAction<ModalState | null>>;
@@ -1,2 +1,3 @@
1
+ export declare const commonPlaybackRates: number[];
1
2
  export declare const persistPlaybackRate: (option: number) => void;
2
3
  export declare const loadPlaybackRate: () => number;
@@ -1,7 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.loadPlaybackRate = exports.persistPlaybackRate = void 0;
3
+ exports.loadPlaybackRate = exports.persistPlaybackRate = exports.commonPlaybackRates = void 0;
4
4
  const key = 'remotion.playbackrate';
5
+ exports.commonPlaybackRates = [
6
+ -4, -2, -1, -0.5, -0.25, 0.25, 0.5, 1, 1.5, 2, 4,
7
+ ];
5
8
  const persistPlaybackRate = (option) => {
6
9
  localStorage.setItem(key, String(option));
7
10
  };
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio"
4
4
  },
5
5
  "name": "@remotion/studio",
6
- "version": "4.0.516",
6
+ "version": "4.0.518",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -25,17 +25,19 @@
25
25
  },
26
26
  "dependencies": {
27
27
  "@tanstack/react-virtual": "3.14.9",
28
- "@remotion/studio-protocol": "4.0.516",
28
+ "@remotion/canvas": "4.0.518",
29
+ "@remotion/studio-protocol": "4.0.518",
29
30
  "semver": "7.5.3",
30
- "remotion": "4.0.516",
31
- "@remotion/captions": "4.0.516",
32
- "@remotion/player": "4.0.516",
33
- "@remotion/media-utils": "4.0.516",
34
- "@remotion/renderer": "4.0.516",
35
- "@remotion/web-renderer": "4.0.516",
36
- "@remotion/studio-shared": "4.0.516",
37
- "@remotion/timeline-utils": "4.0.516",
38
- "@remotion/zod-types": "4.0.516",
31
+ "remotion": "4.0.518",
32
+ "@remotion/captions": "4.0.518",
33
+ "@remotion/media": "4.0.518",
34
+ "@remotion/player": "4.0.518",
35
+ "@remotion/media-utils": "4.0.518",
36
+ "@remotion/renderer": "4.0.518",
37
+ "@remotion/web-renderer": "4.0.518",
38
+ "@remotion/studio-shared": "4.0.518",
39
+ "@remotion/timeline-utils": "4.0.518",
40
+ "@remotion/zod-types": "4.0.518",
39
41
  "@jridgewell/trace-mapping": "0.3.31",
40
42
  "mediabunny": "1.55.1",
41
43
  "memfs": "3.4.3",
@@ -46,7 +48,7 @@
46
48
  "react": "19.2.3",
47
49
  "react-dom": "19.2.3",
48
50
  "@types/semver": "7.5.3",
49
- "@remotion/eslint-config-internal": "4.0.516",
51
+ "@remotion/eslint-config-internal": "4.0.518",
50
52
  "eslint": "9.19.0",
51
53
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
52
54
  },
@@ -1,12 +0,0 @@
1
- import type { SelectedOutline } from './selected-outline-geometry';
2
- import type { SelectedOutlineLayoutTarget } from './selected-outline-types';
3
- type OutlineSequenceParent = {
4
- readonly id: string;
5
- readonly parent: string | null;
6
- };
7
- export declare const orderOutlinesForRendering: ({ outlines, sequences, targetsByKey, }: {
8
- readonly outlines: readonly SelectedOutline[];
9
- readonly sequences: readonly OutlineSequenceParent[];
10
- readonly targetsByKey: ReadonlyMap<string, SelectedOutlineLayoutTarget>;
11
- }) => readonly SelectedOutline[];
12
- export {};