@remotion/studio 4.0.474 → 4.0.475

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 (73) hide show
  1. package/dist/components/Canvas.js +6 -0
  2. package/dist/components/ColorPicker/ColorPicker.js +4 -31
  3. package/dist/components/CompositionSelectorItem.js +4 -4
  4. package/dist/components/Editor.js +4 -1
  5. package/dist/components/Modals.js +2 -1
  6. package/dist/components/NewComposition/ComboBox.js +1 -0
  7. package/dist/components/PreviewToolbar.js +2 -2
  8. package/dist/components/SelectedOutlineOverlay.d.ts +58 -32
  9. package/dist/components/SelectedOutlineOverlay.js +766 -315
  10. package/dist/components/SelectedOutlineUvControls.d.ts +17 -0
  11. package/dist/components/SelectedOutlineUvControls.js +167 -0
  12. package/dist/components/StudioCanvasCapture.d.ts +5 -0
  13. package/dist/components/StudioCanvasCapture.js +40 -0
  14. package/dist/components/Timeline/EasingEditorModal.d.ts +11 -0
  15. package/dist/components/Timeline/EasingEditorModal.js +247 -0
  16. package/dist/components/Timeline/KeyframeSettingsModal.js +1 -0
  17. package/dist/components/Timeline/Timeline.js +10 -7
  18. package/dist/components/Timeline/TimelineDeleteKeybindings.js +64 -35
  19. package/dist/components/Timeline/TimelineDragHandler.js +2 -2
  20. package/dist/components/Timeline/TimelineEffectItem.js +1 -2
  21. package/dist/components/Timeline/TimelineEffectPropItem.js +1 -1
  22. package/dist/components/Timeline/TimelineExpandedKeyframeRow.d.ts +1 -0
  23. package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +2 -2
  24. package/dist/components/Timeline/TimelineExpandedTrackKeyframes.js +1 -1
  25. package/dist/components/Timeline/TimelineHeightContainer.js +2 -0
  26. package/dist/components/Timeline/TimelineItemStack.js +3 -56
  27. package/dist/components/Timeline/TimelineKeyframeControls.d.ts +7 -0
  28. package/dist/components/Timeline/TimelineKeyframeControls.js +259 -62
  29. package/dist/components/Timeline/TimelineKeyframeDiamond.js +4 -2
  30. package/dist/components/Timeline/TimelineKeyframeEasingLine.js +128 -3
  31. package/dist/components/Timeline/TimelineKeyframeTracksContext.d.ts +7 -0
  32. package/dist/components/Timeline/TimelineKeyframeTracksContext.js +17 -0
  33. package/dist/components/Timeline/TimelineMediaInfo.js +4 -24
  34. package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +4 -0
  35. package/dist/components/Timeline/TimelineRotationField.js +5 -23
  36. package/dist/components/Timeline/TimelineScrollable.js +19 -3
  37. package/dist/components/Timeline/TimelineSelection.d.ts +67 -3
  38. package/dist/components/Timeline/TimelineSelection.js +289 -32
  39. package/dist/components/Timeline/TimelineSequence.js +17 -9
  40. package/dist/components/Timeline/TimelineSequenceItem.js +29 -61
  41. package/dist/components/Timeline/TimelineSequenceName.js +3 -17
  42. package/dist/components/Timeline/TimelineSequencePropItem.js +1 -1
  43. package/dist/components/Timeline/TimelineTimeIndicators.js +4 -2
  44. package/dist/components/Timeline/TimelineTransformOriginField.d.ts +11 -0
  45. package/dist/components/Timeline/TimelineTransformOriginField.js +138 -0
  46. package/dist/components/Timeline/call-add-keyframe.d.ts +17 -0
  47. package/dist/components/Timeline/call-add-keyframe.js +65 -1
  48. package/dist/components/Timeline/delete-selected-timeline-item.js +23 -13
  49. package/dist/components/Timeline/reset-selected-timeline-props.js +13 -5
  50. package/dist/components/Timeline/timeline-rotation-utils.d.ts +2 -0
  51. package/dist/components/Timeline/timeline-rotation-utils.js +32 -0
  52. package/dist/components/Timeline/transform-origin-utils.d.ts +24 -0
  53. package/dist/components/Timeline/transform-origin-utils.js +170 -0
  54. package/dist/components/Timeline/update-selected-easing.d.ts +35 -0
  55. package/dist/components/Timeline/update-selected-easing.js +133 -0
  56. package/dist/components/Timeline/use-expanded-track-keyframe-rows.d.ts +1 -0
  57. package/dist/components/Timeline/use-expanded-track-keyframe-rows.js +28 -0
  58. package/dist/components/canvas-capture-enabled.d.ts +1 -0
  59. package/dist/components/canvas-capture-enabled.js +4 -0
  60. package/dist/components/effect-drag-and-drop.d.ts +11 -0
  61. package/dist/components/effect-drag-and-drop.js +73 -0
  62. package/dist/components/selected-outline-geometry.d.ts +20 -0
  63. package/dist/components/selected-outline-geometry.js +18 -0
  64. package/dist/components/selected-outline-uv.d.ts +46 -0
  65. package/dist/components/selected-outline-uv.js +240 -0
  66. package/dist/esm/{chunk-xjvc8qen.js → chunk-qaqqvw4q.js} +7418 -4943
  67. package/dist/esm/internals.mjs +7418 -4943
  68. package/dist/esm/previewEntry.mjs +7426 -4951
  69. package/dist/esm/renderEntry.mjs +1 -1
  70. package/dist/helpers/colors.d.ts +0 -1
  71. package/dist/helpers/colors.js +1 -2
  72. package/dist/state/modals.d.ts +2 -1
  73. package/package.json +11 -10
@@ -8,6 +8,7 @@ const TimelineEnumField_1 = require("./TimelineEnumField");
8
8
  const TimelineNumberField_1 = require("./TimelineNumberField");
9
9
  const TimelineRotationField_1 = require("./TimelineRotationField");
10
10
  const TimelineScaleField_1 = require("./TimelineScaleField");
11
+ const TimelineTransformOriginField_1 = require("./TimelineTransformOriginField");
11
12
  const TimelineTranslateField_1 = require("./TimelineTranslateField");
12
13
  const TimelineUvCoordinateField_1 = require("./TimelineUvCoordinateField");
13
14
  const inlineWrapper = {
@@ -30,6 +31,9 @@ const TimelinePrimitiveFieldValue = ({ field, onSave, onDragValueChange, onDragE
30
31
  if (field.typeName === 'translate') {
31
32
  return (jsx_runtime_1.jsx("span", { children: jsx_runtime_1.jsx(TimelineTranslateField_1.TimelineTranslateField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
32
33
  }
34
+ if (field.typeName === 'transform-origin') {
35
+ return (jsx_runtime_1.jsx("span", { children: jsx_runtime_1.jsx(TimelineTransformOriginField_1.TimelineTransformOriginField, { effectiveValue: effectiveValue, field: field, onDragEnd: onDragEnd, onDragValueChange: onDragValueChange, onSave: onSave, propStatus: propStatus }) }));
36
+ }
33
37
  if (field.typeName === 'scale') {
34
38
  if (scaleLockNodePath === null) {
35
39
  throw new Error('Expected scale lock node path for scale field');
@@ -5,39 +5,21 @@ const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const InputDragger_1 = require("../NewComposition/InputDragger");
7
7
  const timeline_field_utils_1 = require("./timeline-field-utils");
8
- const unitPattern = /^([+-]?(?:\d+\.?\d*|\.\d+))(deg|rad|turn|grad)$/;
9
- const unitToDegrees = {
10
- deg: 1,
11
- rad: 180 / Math.PI,
12
- turn: 360,
13
- grad: 360 / 400,
14
- };
15
- const parseCssRotationToDegrees = (value) => {
16
- const match = value.trim().match(unitPattern);
17
- if (match) {
18
- return (0, timeline_field_utils_1.normalizeTimelineNumber)(Number(match[1]) * unitToDegrees[match[2]]);
19
- }
20
- try {
21
- const m = new DOMMatrix(`rotate(${value})`);
22
- return (0, timeline_field_utils_1.normalizeTimelineNumber)(Math.atan2(m.b, m.a) * (180 / Math.PI));
23
- }
24
- catch (_a) {
25
- return 0;
26
- }
27
- };
8
+ const timeline_rotation_utils_1 = require("./timeline-rotation-utils");
28
9
  const TimelineRotationField = ({ field, effectiveValue, propStatus, onSave, onDragValueChange, onDragEnd, }) => {
29
10
  var _a, _b;
30
11
  const [dragValue, setDragValue] = (0, react_1.useState)(null);
31
12
  const isCssRotation = field.fieldSchema.type === 'rotation-css';
32
13
  const degrees = (0, react_1.useMemo)(() => {
33
14
  if (isCssRotation) {
34
- return parseCssRotationToDegrees(String(effectiveValue !== null && effectiveValue !== void 0 ? effectiveValue : '0deg'));
15
+ return (0, timeline_rotation_utils_1.parseCssRotationToDegrees)(String(effectiveValue !== null && effectiveValue !== void 0 ? effectiveValue : '0deg'));
35
16
  }
36
17
  return typeof effectiveValue === 'number' ? effectiveValue : 0;
37
18
  }, [effectiveValue, isCssRotation]);
38
19
  const serializeValue = (0, react_1.useCallback)((value) => {
39
- const normalized = (0, timeline_field_utils_1.normalizeTimelineNumber)(value);
40
- return isCssRotation ? `${normalized}deg` : normalized;
20
+ return isCssRotation
21
+ ? (0, timeline_rotation_utils_1.serializeCssRotation)(value)
22
+ : (0, timeline_field_utils_1.normalizeTimelineNumber)(value);
41
23
  }, [isCssRotation]);
42
24
  const onValueChange = (0, react_1.useCallback)((newVal) => {
43
25
  setDragValue(newVal);
@@ -3,24 +3,40 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.TimelineScrollable = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
- const colors_1 = require("../../helpers/colors");
7
6
  const is_menu_item_1 = require("../Menu/is-menu-item");
8
7
  const timeline_refs_1 = require("./timeline-refs");
8
+ const TimelineSelection_1 = require("./TimelineSelection");
9
9
  const outer = {
10
10
  width: '100%',
11
11
  height: '100%',
12
12
  overflowX: 'auto',
13
13
  overflowY: 'hidden',
14
14
  position: 'relative',
15
- backgroundColor: colors_1.TIMELINE_BACKGROUND,
15
+ backgroundColor: TimelineSelection_1.TIMELINE_BACKGROUND,
16
+ };
17
+ const marqueeStyle = {
18
+ backgroundColor: 'rgba(70, 130, 255, 0.16)',
19
+ border: '1px solid rgba(70, 130, 255, 0.75)',
20
+ boxSizing: 'border-box',
21
+ pointerEvents: 'none',
22
+ position: 'fixed',
23
+ zIndex: 10,
16
24
  };
17
25
  const TimelineScrollable = ({ children }) => {
26
+ const { marqueeRect, onPointerDownCapture } = (0, TimelineSelection_1.useTimelineMarqueeSelection)();
18
27
  const containerStyle = (0, react_1.useMemo)(() => {
19
28
  return {
20
29
  width: '100%',
21
30
  minHeight: '100%',
22
31
  };
23
32
  }, []);
24
- return (jsx_runtime_1.jsx("div", { ref: timeline_refs_1.scrollableRef, style: outer, className: is_menu_item_1.HORIZONTAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx("div", { style: containerStyle, children: children }) }));
33
+ return (jsx_runtime_1.jsxs("div", { ref: timeline_refs_1.scrollableRef, style: outer, className: is_menu_item_1.HORIZONTAL_SCROLLBAR_CLASSNAME, onPointerDownCapture: onPointerDownCapture, children: [
34
+ jsx_runtime_1.jsx("div", { style: containerStyle, children: children }), marqueeRect === null ? null : (jsx_runtime_1.jsx("div", { style: {
35
+ ...marqueeStyle,
36
+ height: marqueeRect.bottom - marqueeRect.top,
37
+ left: marqueeRect.left,
38
+ top: marqueeRect.top,
39
+ width: marqueeRect.right - marqueeRect.left,
40
+ } }))] }));
25
41
  };
26
42
  exports.TimelineScrollable = TimelineScrollable;
@@ -7,9 +7,8 @@ export declare const TIMELINE_SELECTED_LABEL_HORIZONTAL_PADDING = 2;
7
7
  export declare const getTimelineSelectedLabelStyle: (selected: boolean, subcategory: boolean) => CSSProperties;
8
8
  export declare const getTimelineColor: (selected: boolean, subcategory: boolean) => "black" | "rgba(255, 255, 255, 0.8)";
9
9
  export declare const getTimelineSelectedTrackHighlightStyle: (timelineWidth: number) => CSSProperties;
10
- export declare const SELECTION_ENABLED = false;
11
- export declare const TIMELINE_TOP_DRAG = false;
12
- export declare const ENABLE_OUTLINES = false;
10
+ export declare const TIMELINE_BACKGROUND = "#0F1113";
11
+ export declare const TIMELINE_TICKS_BACKGROUND = "rgb(31,36,40)";
13
12
  type TimelineSelectionBase = {
14
13
  readonly nodePathInfo: SequenceNodePathInfo;
15
14
  };
@@ -36,6 +35,9 @@ export type TimelineSelection = (TimelineSelectionBase & {
36
35
  readonly toFrame: number;
37
36
  readonly segmentIndex: number;
38
37
  });
38
+ export type TimelineEasingSelection = Extract<TimelineSelection, {
39
+ type: 'easing';
40
+ }>;
39
41
  export type TimelineSelectionInteraction = {
40
42
  readonly shiftKey: boolean;
41
43
  readonly toggleKey: boolean;
@@ -45,27 +47,74 @@ export declare const isTimelineSelectionModifierEvent: ({ shiftKey, metaKey, ctr
45
47
  readonly metaKey: boolean;
46
48
  readonly ctrlKey: boolean;
47
49
  }) => boolean;
50
+ export declare const shouldSelectTimelineRowOnPointerDown: ({ selected, shiftKey, metaKey, ctrlKey, }: {
51
+ readonly selected: boolean;
52
+ readonly shiftKey: boolean;
53
+ readonly metaKey: boolean;
54
+ readonly ctrlKey: boolean;
55
+ }) => boolean;
48
56
  export type TimelineSelectionState = {
49
57
  readonly selectedItems: readonly TimelineSelection[];
50
58
  readonly anchor: TimelineSelection | null;
51
59
  };
60
+ export type TimelineMarqueeRect = {
61
+ readonly left: number;
62
+ readonly top: number;
63
+ readonly right: number;
64
+ readonly bottom: number;
65
+ };
66
+ export type TimelineMarqueeSelectionKind = 'sequence' | 'keyframes-and-easings';
67
+ export type TimelineMarqueeSelectionCandidate = {
68
+ readonly item: TimelineSelection;
69
+ readonly rect: TimelineMarqueeRect;
70
+ };
52
71
  export declare const getTimelineSelectionAfterInteraction: ({ currentState, clickedItem, interaction, allSelectableItems, }: {
53
72
  readonly currentState: TimelineSelectionState;
54
73
  readonly clickedItem: TimelineSelection;
55
74
  readonly interaction: TimelineSelectionInteraction;
56
75
  readonly allSelectableItems: readonly TimelineSelection[];
57
76
  }) => TimelineSelectionState;
77
+ export declare const getNormalizedTimelineMarqueeRect: ({ startX, startY, currentX, currentY, }: {
78
+ readonly startX: number;
79
+ readonly startY: number;
80
+ readonly currentX: number;
81
+ readonly currentY: number;
82
+ }) => TimelineMarqueeRect;
83
+ export declare const getClampedTimelineMarqueePoint: ({ x, y, bounds, }: {
84
+ readonly x: number;
85
+ readonly y: number;
86
+ readonly bounds: TimelineMarqueeRect;
87
+ }) => {
88
+ readonly x: number;
89
+ readonly y: number;
90
+ };
91
+ export declare const timelineMarqueeRectsIntersect: (a: TimelineMarqueeRect, b: TimelineMarqueeRect) => boolean;
92
+ export declare const getTimelineMarqueeSelection: ({ candidates, lockedSelectionKind, marqueeRect, }: {
93
+ readonly candidates: readonly TimelineMarqueeSelectionCandidate[];
94
+ readonly lockedSelectionKind: TimelineMarqueeSelectionKind | null;
95
+ readonly marqueeRect: TimelineMarqueeRect;
96
+ }) => {
97
+ readonly lockedSelectionKind: TimelineMarqueeSelectionKind | null;
98
+ readonly selectedItems: readonly TimelineSelection[];
99
+ };
58
100
  type TimelineSelectionContextValue = {
59
101
  readonly canSelect: boolean;
102
+ readonly canSelectEasing: boolean;
60
103
  readonly selectedItems: readonly TimelineSelection[];
61
104
  readonly isSelected: (item: TimelineSelection) => boolean;
62
105
  readonly selectItem: (item: TimelineSelection, interaction?: TimelineSelectionInteraction) => void;
63
106
  readonly selectItems: (items: readonly TimelineSelection[]) => void;
64
107
  readonly registerSelectableItem: (item: TimelineSelection) => () => void;
108
+ readonly registerMarqueeSelectableItem: (item: TimelineSelection, getRect: () => DOMRect | null) => () => void;
109
+ readonly getMarqueeSelection: (marqueeRect: TimelineMarqueeRect, lockedSelectionKind: TimelineMarqueeSelectionKind | null) => {
110
+ readonly lockedSelectionKind: TimelineMarqueeSelectionKind | null;
111
+ readonly selectedItems: readonly TimelineSelection[];
112
+ };
65
113
  readonly containsSelection: (nodePathInfo: SequenceNodePathInfo) => boolean;
66
114
  readonly clearSelection: () => void;
67
115
  };
68
116
  export declare const getTimelineSelectionFromNodePathInfo: (nodePathInfo: SequenceNodePathInfo | null) => TimelineSelection | null;
117
+ export declare const getTimelineSelectionKey: (item: TimelineSelection) => string;
69
118
  export declare const getSelectableTimelineSequenceSelections: (tracks: readonly Pick<TrackWithHash, "nodePathInfo">[]) => TimelineSelection[];
70
119
  export declare const getTimelineSequenceSelectionKey: (nodePathInfo: SequenceNodePathInfo) => string;
71
120
  export declare const TimelineSelectAllKeybindings: React.FC<{
@@ -75,15 +124,24 @@ export declare const TimelineSelectionProvider: React.FC<{
75
124
  readonly children: React.ReactNode;
76
125
  }>;
77
126
  export declare const useTimelineSelection: () => TimelineSelectionContextValue;
127
+ export declare const TIMELINE_MARQUEE_ITEM_ATTR = "data-timeline-marquee-item";
128
+ export declare const TIMELINE_SCRUBBER_ATTR = "data-timeline-scrubber";
78
129
  export declare const useCurrentTimelineSelectionStateAsRef: () => React.RefObject<TimelineSelectionContextValue>;
130
+ export declare const useTimelineMarqueeSelection: () => {
131
+ marqueeRect: TimelineMarqueeRect | null;
132
+ onPointerDownCapture: (event: React.PointerEvent<HTMLDivElement>) => void;
133
+ };
134
+ export declare const useTimelineMarqueeSelectableItem: (item: TimelineSelection | null, ref: React.RefObject<Element | null>) => void;
79
135
  export declare const useTimelineRowSelection: (nodePathInfo: SequenceNodePathInfo | null) => {
80
136
  onSelect: (interaction?: TimelineSelectionInteraction | undefined) => void;
81
137
  selectable: boolean;
138
+ selectionItem: TimelineSelection | null;
82
139
  selected: boolean;
83
140
  };
84
141
  export declare const useTimelineKeyframeSelection: (nodePathInfo: SequenceNodePathInfo, frame: number) => {
85
142
  onSelect: (interaction?: TimelineSelectionInteraction | undefined) => void;
86
143
  selectable: boolean;
144
+ selectionItem: TimelineSelection;
87
145
  selected: boolean;
88
146
  };
89
147
  export declare const useTimelineEasingSelection: ({ nodePathInfo, fromFrame, toFrame, segmentIndex, }: {
@@ -95,6 +153,12 @@ export declare const useTimelineEasingSelection: ({ nodePathInfo, fromFrame, toF
95
153
  onSelect: (interaction?: TimelineSelectionInteraction | undefined) => void;
96
154
  selectable: boolean;
97
155
  selected: boolean;
156
+ selectionItem: TimelineSelectionBase & {
157
+ readonly type: "easing";
158
+ readonly fromFrame: number;
159
+ readonly toFrame: number;
160
+ readonly segmentIndex: number;
161
+ };
98
162
  };
99
163
  export declare const useTimelineRowContainsSelection: (nodePathInfo: SequenceNodePathInfo | null) => boolean;
100
164
  export {};