@remotion/studio 4.0.494 → 4.0.495

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 (96) hide show
  1. package/dist/api/get-static-files.d.ts +1 -1
  2. package/dist/components/AssetFileIcon.d.ts +7 -0
  3. package/dist/components/AssetFileIcon.js +24 -0
  4. package/dist/components/AssetSelectorItem.js +13 -7
  5. package/dist/components/Canvas.js +191 -36
  6. package/dist/components/CompositionSelectorItem.js +15 -8
  7. package/dist/components/CurrentAsset.d.ts +1 -0
  8. package/dist/components/CurrentAsset.js +17 -1
  9. package/dist/components/Editor.js +2 -4
  10. package/dist/components/InspectorPanel/AssetInspector.d.ts +4 -0
  11. package/dist/components/InspectorPanel/AssetInspector.js +11 -0
  12. package/dist/components/InspectorPanel/{DefaultInspector.d.ts → CompositionInspector.d.ts} +2 -2
  13. package/dist/components/InspectorPanel/CompositionInspector.js +114 -0
  14. package/dist/components/InspectorPanel/CompositionInspectorHeader.d.ts +1 -0
  15. package/dist/components/{CurrentComposition.js → InspectorPanel/CompositionInspectorHeader.js} +16 -16
  16. package/dist/components/InspectorPanel/{CompositionDimensions.d.ts → CompositionMetadata.d.ts} +1 -1
  17. package/dist/components/InspectorPanel/{CompositionDimensions.js → CompositionMetadata.js} +17 -8
  18. package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +2 -2
  19. package/dist/components/InspectorPanel/EasingInspector.js +3 -5
  20. package/dist/components/InspectorPanel/KeyframeInspector.js +2 -2
  21. package/dist/components/InspectorPanel/SequenceSelectionInspector.js +34 -1
  22. package/dist/components/InspectorPanel/common.d.ts +8 -0
  23. package/dist/components/InspectorPanel/common.js +31 -8
  24. package/dist/components/InspectorPanel/styles.d.ts +5 -3
  25. package/dist/components/InspectorPanel/styles.js +13 -4
  26. package/dist/components/InspectorPanel/use-composition-actions.d.ts +8 -0
  27. package/dist/components/InspectorPanel/use-composition-actions.js +114 -0
  28. package/dist/components/InspectorPanel.js +11 -2
  29. package/dist/components/InspectorSequenceSection.d.ts +0 -1
  30. package/dist/components/InspectorSequenceSection.js +9 -48
  31. package/dist/components/Modals.js +2 -1
  32. package/dist/components/NewComposition/InputDragger.d.ts +6 -0
  33. package/dist/components/NewComposition/InputDragger.js +26 -13
  34. package/dist/components/NewComposition/NewComposition.js +8 -1
  35. package/dist/components/NewComposition/ValidationMessage.d.ts +1 -1
  36. package/dist/components/Preview.js +15 -7
  37. package/dist/components/RenderModal/RenderModalOutputName.js +34 -1
  38. package/dist/components/SelectedOutlineOverlay.js +1 -0
  39. package/dist/components/SvgImportDialog.d.ts +7 -0
  40. package/dist/components/SvgImportDialog.js +103 -0
  41. package/dist/components/Timeline/Timeline.js +1 -0
  42. package/dist/components/Timeline/TimelineClipboardKeybindings.js +8 -1
  43. package/dist/components/Timeline/TimelineList.js +9 -4
  44. package/dist/components/Timeline/TimelineSequenceItem.d.ts +2 -1
  45. package/dist/components/Timeline/TimelineSequenceItem.js +19 -11
  46. package/dist/components/Timeline/nest-timeline-tracks.d.ts +8 -0
  47. package/dist/components/Timeline/nest-timeline-tracks.js +25 -0
  48. package/dist/components/Timeline/timeline-scroll-logic.d.ts +8 -4
  49. package/dist/components/Timeline/timeline-scroll-logic.js +29 -15
  50. package/dist/components/import-assets.d.ts +17 -1
  51. package/dist/components/import-assets.js +96 -11
  52. package/dist/components/layout.d.ts +1 -0
  53. package/dist/components/layout.js +2 -1
  54. package/dist/components/selected-outline-measurement.d.ts +2 -1
  55. package/dist/components/selected-outline-measurement.js +3 -1
  56. package/dist/esm/{chunk-tdncqycp.js → chunk-784jbkzs.js} +8428 -7246
  57. package/dist/esm/internals.mjs +8428 -7246
  58. package/dist/esm/previewEntry.mjs +8577 -7395
  59. package/dist/esm/renderEntry.mjs +1 -1
  60. package/dist/helpers/client-id.js +2 -1
  61. package/dist/helpers/clipboard-figma.d.ts +4 -0
  62. package/dist/helpers/clipboard-figma.js +41 -0
  63. package/dist/helpers/clipboard-images.d.ts +10 -0
  64. package/dist/helpers/clipboard-images.js +77 -0
  65. package/dist/helpers/clipboard-svg.d.ts +3 -0
  66. package/dist/helpers/clipboard-svg.js +47 -0
  67. package/dist/helpers/get-effective-translation.d.ts +2 -1
  68. package/dist/helpers/get-effective-translation.js +15 -7
  69. package/dist/helpers/get-preview-file-type.d.ts +1 -1
  70. package/dist/helpers/get-preview-file-type.js +5 -1
  71. package/dist/helpers/inject-css.js +9 -0
  72. package/dist/helpers/studio-fit-padding.d.ts +41 -0
  73. package/dist/helpers/studio-fit-padding.js +64 -0
  74. package/dist/helpers/use-image-metadata.d.ts +8 -0
  75. package/dist/helpers/use-image-metadata.js +82 -0
  76. package/dist/helpers/use-studio-canvas-dimensions.js +2 -2
  77. package/dist/icons/audio.d.ts +3 -0
  78. package/dist/icons/audio.js +3 -1
  79. package/dist/icons/font.d.ts +4 -0
  80. package/dist/icons/font.js +8 -0
  81. package/dist/icons/frame.d.ts +3 -1
  82. package/dist/icons/frame.js +1 -1
  83. package/dist/icons/json.d.ts +4 -0
  84. package/dist/icons/json.js +8 -0
  85. package/dist/icons/magnet.js +1 -1
  86. package/dist/icons/scissors.d.ts +5 -0
  87. package/dist/icons/scissors.js +8 -0
  88. package/dist/icons/solid.d.ts +5 -0
  89. package/dist/icons/solid.js +8 -0
  90. package/dist/icons/video.d.ts +3 -0
  91. package/dist/icons/video.js +5 -1
  92. package/dist/state/modals.d.ts +8 -1
  93. package/dist/state/timeline-zoom.js +12 -11
  94. package/package.json +11 -11
  95. package/dist/components/CurrentComposition.d.ts +0 -2
  96. package/dist/components/InspectorPanel/DefaultInspector.js +0 -97
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.keyframeEditorValue = exports.keyframeEditorLabel = exports.keyframeEditorRow = exports.detailValue = exports.detailLabel = exports.detailRow = exports.guideDetailsContainer = exports.detailsBeforeInlineAction = exports.detailsWithInlineAction = exports.detailsContainer = exports.centeredMessage = exports.selectedContainer = exports.resolveLinkStyle = exports.defaultPropsWarningMessages = exports.defaultPropsWarningContainer = exports.sectionHeaderEnd = exports.sectionHeaderStart = exports.sectionHeaderTitle = exports.sectionHeaderRow = exports.sequenceHeaderSubtitle = exports.sequenceHeaderTitle = exports.sequenceHeader = exports.sectionHeader = exports.sequenceHeaderDivider = exports.inspectorSectionDivider = exports.compositionSection = exports.visualControlsSection = exports.defaultPropsSection = exports.scrollableContainer = exports.container = void 0;
3
+ exports.keyframeEditorValue = exports.keyframeEditorLabel = exports.keyframeEditorRow = exports.detailValue = exports.detailLabel = exports.detailRow = exports.guideDetailsContainer = exports.detailsBeforeInlineAction = exports.inspectorActionSection = exports.detailsWithInlineAction = exports.detailsContainer = exports.centeredMessage = exports.selectedContainer = exports.resolveLinkStyle = exports.defaultPropsWarningMessages = exports.defaultPropsWarningContainer = exports.sectionHeaderEnd = exports.sectionHeaderStart = exports.sectionHeaderTitle = exports.sectionHeaderRow = exports.sequenceHeaderSubtitle = exports.sequenceHeaderTitle = exports.sequenceHeader = exports.inspectorSectionBody = exports.sectionHeader = exports.sequenceHeaderDivider = exports.inspectorSectionDivider = exports.inspectorOverviewSection = exports.compositionVisualControlsSection = exports.compositionDefaultPropsSection = exports.scrollableContainer = exports.container = void 0;
4
4
  const colors_1 = require("../../helpers/colors");
5
5
  const InspectorPanelLayout_1 = require("../InspectorPanelLayout");
6
6
  exports.container = {
@@ -16,15 +16,15 @@ exports.scrollableContainer = {
16
16
  ...exports.container,
17
17
  overflowY: 'auto',
18
18
  };
19
- exports.defaultPropsSection = {
19
+ exports.compositionDefaultPropsSection = {
20
20
  display: 'flex',
21
21
  flexDirection: 'column',
22
22
  };
23
- exports.visualControlsSection = {
23
+ exports.compositionVisualControlsSection = {
24
24
  display: 'flex',
25
25
  flexDirection: 'column',
26
26
  };
27
- exports.compositionSection = {
27
+ exports.inspectorOverviewSection = {
28
28
  display: 'flex',
29
29
  flexDirection: 'column',
30
30
  };
@@ -44,6 +44,12 @@ exports.sectionHeader = {
44
44
  padding: `8px ${InspectorPanelLayout_1.INSPECTOR_PANEL_HORIZONTAL_PADDING}px`,
45
45
  userSelect: 'none',
46
46
  };
47
+ exports.inspectorSectionBody = {
48
+ display: 'flex',
49
+ flexDirection: 'column',
50
+ minWidth: 0,
51
+ paddingBottom: 8,
52
+ };
47
53
  exports.sequenceHeader = {
48
54
  backgroundColor: colors_1.BACKGROUND,
49
55
  display: 'flex',
@@ -158,6 +164,9 @@ exports.detailsContainer = {
158
164
  exports.detailsWithInlineAction = {
159
165
  paddingBottom: InspectorPanelLayout_1.INSPECTOR_PANEL_HORIZONTAL_PADDING,
160
166
  };
167
+ exports.inspectorActionSection = {
168
+ padding: '4px 0',
169
+ };
161
170
  exports.detailsBeforeInlineAction = {
162
171
  padding: `0 ${InspectorPanelLayout_1.INSPECTOR_PANEL_HORIZONTAL_PADDING}px`,
163
172
  };
@@ -0,0 +1,8 @@
1
+ export declare const useCompositionActions: () => {
2
+ canInsertAsset: boolean;
3
+ canInsertSolid: boolean;
4
+ canShowInsertAsset: boolean;
5
+ canShowInsertSolid: boolean;
6
+ insertAsset: () => Promise<void>;
7
+ insertSolid: () => Promise<void>;
8
+ };
@@ -0,0 +1,114 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useCompositionActions = void 0;
4
+ const react_1 = require("react");
5
+ const remotion_1 = require("remotion");
6
+ const client_id_1 = require("../../helpers/client-id");
7
+ const interactivity_enabled_1 = require("../../helpers/interactivity-enabled");
8
+ const open_in_editor_1 = require("../../helpers/open-in-editor");
9
+ const call_api_1 = require("../call-api");
10
+ const import_assets_1 = require("../import-assets");
11
+ const NotificationCenter_1 = require("../Notifications/NotificationCenter");
12
+ const use_resolved_stack_1 = require("../Timeline/use-resolved-stack");
13
+ const useCompositionActions = () => {
14
+ var _a, _b;
15
+ const { compositions, canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
16
+ const videoConfig = remotion_1.Internals.useUnsafeVideoConfig();
17
+ const [isAddingSolid, setIsAddingSolid] = (0, react_1.useState)(false);
18
+ const [isAddingAsset, setIsAddingAsset] = (0, react_1.useState)(false);
19
+ const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
20
+ const previewConnected = previewServerState.type === 'connected';
21
+ const previewInteractive = previewConnected && interactivity_enabled_1.studioInteractivityEnabled;
22
+ const currentCompositionId = (canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'composition' ? canvasContent.compositionId : null;
23
+ const currentComposition = (0, react_1.useMemo)(() => {
24
+ var _a;
25
+ if (currentCompositionId === null) {
26
+ return null;
27
+ }
28
+ return ((_a = compositions.find((composition) => composition.id === currentCompositionId)) !== null && _a !== void 0 ? _a : null);
29
+ }, [compositions, currentCompositionId]);
30
+ const resolvedCompositionLocation = (0, use_resolved_stack_1.useResolvedStack)((_a = currentComposition === null || currentComposition === void 0 ? void 0 : currentComposition.stack) !== null && _a !== void 0 ? _a : null);
31
+ const compositionFile = (_b = resolvedCompositionLocation === null || resolvedCompositionLocation === void 0 ? void 0 : resolvedCompositionLocation.source) !== null && _b !== void 0 ? _b : null;
32
+ const compositionComponentInfo = (0, open_in_editor_1.useCachedCompositionComponentInfo)({
33
+ compositionFile,
34
+ compositionId: currentCompositionId,
35
+ });
36
+ const canShowInsertSolid = previewInteractive &&
37
+ (compositionComponentInfo === null || compositionComponentInfo === void 0 ? void 0 : compositionComponentInfo.canAddSequence) === true &&
38
+ currentCompositionId !== null &&
39
+ compositionFile !== null &&
40
+ videoConfig !== null;
41
+ const canInsertSolid = canShowInsertSolid && !isAddingSolid;
42
+ const canShowInsertAsset = previewInteractive &&
43
+ !window.remotion_isReadOnlyStudio &&
44
+ (compositionComponentInfo === null || compositionComponentInfo === void 0 ? void 0 : compositionComponentInfo.canAddSequence) === true &&
45
+ currentCompositionId !== null &&
46
+ compositionFile !== null;
47
+ const canInsertAsset = canShowInsertAsset && !isAddingAsset;
48
+ const insertSolid = (0, react_1.useCallback)(async () => {
49
+ if (!canInsertSolid ||
50
+ currentCompositionId === null ||
51
+ compositionFile === null ||
52
+ videoConfig === null) {
53
+ return;
54
+ }
55
+ setIsAddingSolid(true);
56
+ try {
57
+ const result = await (0, call_api_1.callApi)('/api/insert-jsx-element', {
58
+ compositionFile,
59
+ compositionId: currentCompositionId,
60
+ element: {
61
+ type: 'solid',
62
+ width: videoConfig.width,
63
+ height: videoConfig.height,
64
+ position: null,
65
+ },
66
+ });
67
+ if (result.success) {
68
+ (0, NotificationCenter_1.showNotification)('Added <Solid> to source file', 2000);
69
+ return;
70
+ }
71
+ (0, NotificationCenter_1.showNotification)(result.reason, 4000);
72
+ }
73
+ catch (err) {
74
+ (0, NotificationCenter_1.showNotification)(err.message, 4000);
75
+ }
76
+ finally {
77
+ setIsAddingSolid(false);
78
+ }
79
+ }, [canInsertSolid, compositionFile, currentCompositionId, videoConfig]);
80
+ const insertAsset = (0, react_1.useCallback)(async () => {
81
+ if (!canInsertAsset ||
82
+ currentCompositionId === null ||
83
+ compositionFile === null) {
84
+ return;
85
+ }
86
+ const files = await (0, import_assets_1.pickFilesToImport)();
87
+ if (files.length === 0) {
88
+ return;
89
+ }
90
+ setIsAddingAsset(true);
91
+ try {
92
+ await (0, import_assets_1.importAssets)({
93
+ files,
94
+ compositionFile,
95
+ compositionId: currentCompositionId,
96
+ destinationDimensions: null,
97
+ dropPosition: null,
98
+ svgImportMode: 'image',
99
+ });
100
+ }
101
+ finally {
102
+ setIsAddingAsset(false);
103
+ }
104
+ }, [canInsertAsset, compositionFile, currentCompositionId]);
105
+ return {
106
+ canInsertAsset,
107
+ canInsertSolid,
108
+ canShowInsertAsset,
109
+ canShowInsertSolid,
110
+ insertAsset,
111
+ insertSolid,
112
+ };
113
+ };
114
+ exports.useCompositionActions = useCompositionActions;
@@ -3,17 +3,26 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.InspectorPanel = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
7
+ const AssetInspector_1 = require("./InspectorPanel/AssetInspector");
6
8
  const common_1 = require("./InspectorPanel/common");
7
- const DefaultInspector_1 = require("./InspectorPanel/DefaultInspector");
9
+ const CompositionInspector_1 = require("./InspectorPanel/CompositionInspector");
8
10
  const inspector_selection_1 = require("./InspectorPanel/inspector-selection");
9
11
  const SelectedInspector_1 = require("./InspectorPanel/SelectedInspector");
10
12
  const styles_1 = require("./InspectorPanel/styles");
11
13
  const TimelineSelection_1 = require("./Timeline/TimelineSelection");
12
14
  const InspectorPanel = ({ composition, currentDefaultProps, readOnlyStudio, setDefaultProps }) => {
15
+ const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
13
16
  const { selectedItems } = (0, TimelineSelection_1.useTimelineSelection)();
14
17
  const sameSequenceInspectorSelection = (0, react_1.useMemo)(() => (0, inspector_selection_1.getSameSequenceInspectorSelection)(selectedItems), [selectedItems]);
15
18
  if (selectedItems.length === 0) {
16
- return (jsx_runtime_1.jsx(DefaultInspector_1.DefaultInspector, { composition: composition, currentDefaultProps: currentDefaultProps, readOnlyStudio: readOnlyStudio, setDefaultProps: setDefaultProps }));
19
+ if ((canvasContent === null || canvasContent === void 0 ? void 0 : canvasContent.type) === 'asset') {
20
+ return jsx_runtime_1.jsx(AssetInspector_1.AssetInspector, { readOnlyStudio: readOnlyStudio });
21
+ }
22
+ if (composition === null) {
23
+ return jsx_runtime_1.jsx("div", { style: styles_1.container });
24
+ }
25
+ return (jsx_runtime_1.jsx(CompositionInspector_1.CompositionInspector, { composition: composition, currentDefaultProps: currentDefaultProps, readOnlyStudio: readOnlyStudio, setDefaultProps: setDefaultProps }));
17
26
  }
18
27
  if (selectedItems.length > 1) {
19
28
  if (sameSequenceInspectorSelection) {
@@ -14,7 +14,6 @@ export declare const InspectorSequenceSection: React.FC<{
14
14
  readonly validatedLocation: CodePosition;
15
15
  readonly nodePathInfo: SequenceNodePathInfo;
16
16
  readonly keyframeDisplayOffset: number;
17
- readonly renderSectionHeader: (children: React.ReactNode) => React.ReactNode;
18
17
  readonly renderTransformControls: () => React.ReactNode;
19
18
  }>;
20
19
  export {};
@@ -1,41 +1,8 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
3
  exports.InspectorSequenceSection = exports.hasSequenceControls = exports.getInspectorSelectableItems = void 0;
37
4
  const jsx_runtime_1 = require("react/jsx-runtime");
38
- const react_1 = __importStar(require("react"));
5
+ const react_1 = require("react");
39
6
  const client_id_1 = require("../helpers/client-id");
40
7
  const colors_1 = require("../helpers/colors");
41
8
  const timeline_layout_1 = require("../helpers/timeline-layout");
@@ -43,6 +10,7 @@ const plus_1 = require("../icons/plus");
43
10
  const modals_1 = require("../state/modals");
44
11
  const CurrentAsset_1 = require("./CurrentAsset");
45
12
  const InlineAction_1 = require("./InlineAction");
13
+ const common_1 = require("./InspectorPanel/common");
46
14
  const styles_1 = require("./InspectorPanel/styles");
47
15
  const InspectorPanelLayout_1 = require("./InspectorPanelLayout");
48
16
  const timeline_asset_link_1 = require("./Timeline/timeline-asset-link");
@@ -63,11 +31,7 @@ const emptyState = {
63
31
  fontFamily: 'sans-serif',
64
32
  fontSize: 12,
65
33
  lineHeight: 1.4,
66
- padding: '0 12px 8px',
67
- };
68
- const controlsEffectsDivider = {
69
- ...styles_1.sequenceHeaderDivider,
70
- margin: '8px 0 4px',
34
+ padding: '0 12px',
71
35
  };
72
36
  const effectsHeaderTitle = {
73
37
  ...styles_1.sectionHeaderTitle,
@@ -170,7 +134,7 @@ const hasSequenceControls = (sequence) => {
170
134
  return sequence.controls !== null;
171
135
  };
172
136
  exports.hasSequenceControls = hasSequenceControls;
173
- const InspectorSequenceSection = ({ sequence, validatedLocation, nodePathInfo, keyframeDisplayOffset, renderSectionHeader, renderTransformControls, }) => {
137
+ const InspectorSequenceSection = ({ sequence, validatedLocation, nodePathInfo, keyframeDisplayOffset, renderTransformControls, }) => {
174
138
  const { tree } = (0, use_timeline_expanded_tree_1.useTimelineExpandedTree)({
175
139
  sequence,
176
140
  nodePathInfo,
@@ -240,7 +204,6 @@ const InspectorSequenceSection = ({ sequence, validatedLocation, nodePathInfo, k
240
204
  const controlGroups = (0, react_1.useMemo)(() => getInspectorControlGroups(controlRows), [controlRows]);
241
205
  const { schema } = sequence.controls;
242
206
  const showEffectsSection = nodePathInfo.supportsEffects || effectRows.length > 0;
243
- const showControlsEffectsDivider = controlRows.length > 0 && showEffectsSection;
244
207
  const canAddEffect = nodePathInfo.supportsEffects &&
245
208
  previewServerState.type === 'connected' &&
246
209
  Boolean(validatedLocation.source);
@@ -261,18 +224,16 @@ const InspectorSequenceSection = ({ sequence, validatedLocation, nodePathInfo, k
261
224
  setSelectedModal,
262
225
  validatedLocation.source,
263
226
  ]);
264
- const renderEffectsHeader = () => {
265
- return renderSectionHeader(jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderRow, children: [
266
- jsx_runtime_1.jsx("div", { style: effectsHeaderTitle, children: "Effects" }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { disabled: !canAddEffect, onClick: onAddEffect, title: canAddEffect ? 'Add effect' : undefined, renderAction: (color) => jsx_runtime_1.jsx(plus_1.Plus, { color: color, style: plusIcon }) })] }));
267
- };
227
+ const effectsHeader = (jsx_runtime_1.jsxs("div", { style: styles_1.sectionHeaderRow, children: [
228
+ jsx_runtime_1.jsx("div", { style: effectsHeaderTitle, children: "Effects" }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { disabled: !canAddEffect, onClick: onAddEffect, title: canAddEffect ? 'Add effect' : undefined, renderAction: (color) => jsx_runtime_1.jsx(plus_1.Plus, { color: color, style: plusIcon }) })] }));
268
229
  const renderRow = ({ node, depth }) => {
269
230
  return (jsx_runtime_1.jsx(TimelineRowLayoutContext_1.TimelineRowLayoutContext.Provider, { value: TimelineRowLayoutContext_1.INSPECTOR_TIMELINE_ROW_LAYOUT, children: jsx_runtime_1.jsx(TimelineExpandedRow_1.TimelineExpandedRow, { node: node, depth: depth, nestedDepth: 0, rowDepthBase: 0, getIsExpanded: getIsExpanded, toggleTrack: toggleTrack, validatedLocation: validatedLocation, nodePath: nodePathInfo.sequenceSubscriptionKey, schema: schema, keyframeDisplayOffset: keyframeDisplayOffset, keyframeControlsMode: "inspector" }) }, JSON.stringify(node.nodePathInfo)));
270
231
  };
271
232
  if (controlRows.length === 0 && !showEffectsSection) {
272
- return (jsx_runtime_1.jsx("div", { style: container, children: jsx_runtime_1.jsx("div", { style: emptyState, children: "No schema" }) }));
233
+ return (jsx_runtime_1.jsx("div", { style: container, children: jsx_runtime_1.jsx(common_1.InspectorSection, { header: "Controls", children: jsx_runtime_1.jsx("div", { style: emptyState, children: "No schema" }) }) }));
273
234
  }
274
- return (jsx_runtime_1.jsxs("div", { style: container, children: [controlRows.length > 0 ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: controlSelectableItems, children: controlGroups.map((group, i) => (jsx_runtime_1.jsxs(react_1.default.Fragment, { children: [i === 0 ? null : jsx_runtime_1.jsx("div", { style: controlsEffectsDivider }), renderSectionHeader(group.label), group.id === 'source' && localAsset ? (jsx_runtime_1.jsx(CurrentAsset_1.AssetInfo, { assetName: localAsset.assetPath, contentSized: true, onAssetClick: jumpToAsset, readOnlyStudio: true })) : null, group.id === 'source' && remoteAsset && remoteSourceParts ? (jsx_runtime_1.jsxs("div", { style: remoteSourceLabel, title: remoteAsset.href, children: [
235
+ return (jsx_runtime_1.jsxs("div", { style: container, children: [controlRows.length > 0 ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: controlSelectableItems, children: controlGroups.map((group) => (jsx_runtime_1.jsxs(common_1.InspectorSection, { header: group.label, children: [group.id === 'source' && localAsset ? (jsx_runtime_1.jsx(CurrentAsset_1.AssetInfo, { assetName: localAsset.assetPath, contentSized: true, onAssetClick: jumpToAsset, readOnlyStudio: true })) : null, group.id === 'source' && remoteAsset && remoteSourceParts ? (jsx_runtime_1.jsxs("div", { style: remoteSourceLabel, title: remoteAsset.href, children: [
275
236
  jsx_runtime_1.jsx("span", { style: remoteSourceLeading, children: remoteSourceParts.leading }), jsx_runtime_1.jsx("span", { style: remoteSourceTrailing, children: remoteSourceParts.trailing })
276
- ] })) : null, group.id === 'transforms' ? renderTransformControls() : null, group.id === 'source' ? null : group.rows.map(renderRow)] }, group.id))) })) : null, showEffectsSection ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [showControlsEffectsDivider ? (jsx_runtime_1.jsx("div", { style: controlsEffectsDivider })) : null, renderEffectsHeader(), effectRows.length > 0 ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: effectSelectableItems, children: effectRows.map(renderRow) })) : null] })) : null] }));
237
+ ] })) : null, group.id === 'transforms' ? renderTransformControls() : null, group.id === 'source' ? null : group.rows.map(renderRow)] }, group.id))) })) : null, showEffectsSection ? (jsx_runtime_1.jsx(common_1.InspectorSection, { header: effectsHeader, children: effectRows.length > 0 ? (jsx_runtime_1.jsx(TimelineSelection_1.TimelineSelectionOrderProvider, { items: effectSelectableItems, children: effectRows.map(renderRow) })) : null })) : null] }));
277
238
  };
278
239
  exports.InspectorSequenceSection = InspectorSequenceSection;
@@ -26,6 +26,7 @@ const QuickSwitcher_1 = __importDefault(require("./QuickSwitcher/QuickSwitcher")
26
26
  const RenderStatusModal_1 = require("./RenderModal/RenderStatusModal");
27
27
  const ServerRenderModal_1 = require("./RenderModal/ServerRenderModal");
28
28
  const WebRenderModal_1 = require("./RenderModal/WebRenderModal");
29
+ const SvgImportDialog_1 = require("./SvgImportDialog");
29
30
  const UpdateModal_1 = require("./UpdateModal/UpdateModal");
30
31
  const Modals = ({ readOnlyStudio }) => {
31
32
  var _a;
@@ -34,6 +35,6 @@ const Modals = ({ readOnlyStudio }) => {
34
35
  'connected';
35
36
  return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'new-comp' && (jsx_runtime_1.jsx(NewComposition_1.NewComposition, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'new-folder' && (jsx_runtime_1.jsx(NewFolder_1.NewFolder, { parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'duplicate-comp' && (jsx_runtime_1.jsx(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && (jsx_runtime_1.jsx(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && (jsx_runtime_1.jsx(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-folder' && (jsx_runtime_1.jsx(DeleteFolder_1.DeleteFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-folder' && (jsx_runtime_1.jsx(RenameFolder_1.RenameFolder, { folderName: modalContextType.folderName, parentName: modalContextType.parentName, stack: modalContextType.stack })), modalContextType && modalContextType.type === 'rename-static-file' && (jsx_runtime_1.jsx(RenameStaticFile_1.RenameStaticFileModal, { relativePath: modalContextType.relativePath })), modalContextType && modalContextType.type === 'input-props-override' && (jsx_runtime_1.jsx(OverrideInputProps_1.OverrideInputPropsModal, {})), modalContextType && modalContextType.type === 'web-render' && (jsx_runtime_1.jsx(WebRenderModal_1.WebRenderModalWithLoader, { ...modalContextType })), modalContextType &&
36
37
  modalContextType.type === 'server-render' &&
37
- (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && (jsx_runtime_1.jsx(UpdateModal_1.UpdateModal, { info: modalContextType.info, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'install-packages' && (jsx_runtime_1.jsx(InstallPackage_1.InstallPackageModal, { packageManager: modalContextType.packageManager })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
38
+ (canRender || modalContextType.readOnlyStudio) ? (jsx_runtime_1.jsx(ServerRenderModal_1.RenderModalWithLoader, { readOnlyStudio: (_a = modalContextType.readOnlyStudio) !== null && _a !== void 0 ? _a : false, initialFrame: modalContextType.initialFrame, initialDarkMode: modalContextType.initialDarkMode, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialMediaCacheSizeInBytes: modalContextType.initialMediaCacheSizeInBytes, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialGopSize: modalContextType.initialGopSize, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialSampleRate: modalContextType.initialSampleRate, initialChromeMode: modalContextType.initialChromeMode, renderDefaults: modalContextType.renderDefaults })) : null, modalContextType && modalContextType.type === 'render-progress' && (jsx_runtime_1.jsx(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && (jsx_runtime_1.jsx(UpdateModal_1.UpdateModal, { info: modalContextType.info, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'install-packages' && (jsx_runtime_1.jsx(InstallPackage_1.InstallPackageModal, { packageManager: modalContextType.packageManager })), modalContextType && modalContextType.type === 'quick-switcher' && (jsx_runtime_1.jsx(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode })), modalContextType && modalContextType.type === 'add-effect' && (jsx_runtime_1.jsx(EffectPickerModal_1.EffectPickerModal, { state: modalContextType })), modalContextType && modalContextType.type === 'confirmation-dialog' && (jsx_runtime_1.jsx(ConfirmationDialog_1.ConfirmationDialog, { state: modalContextType })), modalContextType && modalContextType.type === 'svg-import-dialog' && (jsx_runtime_1.jsx(SvgImportDialog_1.SvgImportDialog, { state: modalContextType })), (0, studio_runtime_config_1.getStudioAskAIEnabled)() && jsx_runtime_1.jsx(AskAiModal_1.AskAiModal, {})] }));
38
39
  };
39
40
  exports.Modals = Modals;
@@ -1,6 +1,7 @@
1
1
  import type { InputHTMLAttributes } from 'react';
2
2
  import React from 'react';
3
3
  import type { RemInputStatus } from './RemInput';
4
+ export declare const inputDraggerContainerStyle: React.CSSProperties;
4
5
  export declare const deriveInputDraggerStep: ({ min, snapToStep, step, }: {
5
6
  readonly min: string | number | undefined;
6
7
  readonly snapToStep: boolean;
@@ -10,6 +11,11 @@ export declare const deriveInputDraggerDragStartValue: ({ min, value, }: {
10
11
  readonly min: string | number | undefined;
11
12
  readonly value: string | number | readonly string[] | undefined;
12
13
  }) => number;
14
+ export declare const isInputDraggerValueInRange: ({ max, min, value, }: {
15
+ readonly max: string | number | undefined;
16
+ readonly min: string | number | undefined;
17
+ readonly value: number;
18
+ }) => boolean;
13
19
  export declare const InputDragger: React.ForwardRefExoticComponent<InputHTMLAttributes<HTMLInputElement> & {
14
20
  readonly onValueChange: (newVal: number) => void;
15
21
  readonly onValueChangeEnd?: ((newVal: number) => void) | undefined;
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.InputDragger = exports.deriveInputDraggerDragStartValue = exports.deriveInputDraggerStep = void 0;
36
+ exports.InputDragger = exports.isInputDraggerValueInRange = exports.deriveInputDraggerDragStartValue = exports.deriveInputDraggerStep = exports.inputDraggerContainerStyle = void 0;
37
37
  const jsx_runtime_1 = require("react/jsx-runtime");
38
38
  const react_1 = __importStar(require("react"));
39
39
  const remotion_1 = require("remotion");
@@ -43,6 +43,15 @@ const input_dragger_click_lock_1 = require("../../state/input-dragger-click-lock
43
43
  const z_index_1 = require("../../state/z-index");
44
44
  const ForceSpecificCursor_1 = require("../ForceSpecificCursor");
45
45
  const RemInput_1 = require("./RemInput");
46
+ exports.inputDraggerContainerStyle = {
47
+ ...RemInput_1.inputBaseStyle,
48
+ backgroundColor: colors_1.TRANSPARENT,
49
+ borderColor: colors_1.TRANSPARENT,
50
+ display: 'inline-block',
51
+ lineHeight: 1.5,
52
+ outline: 'none',
53
+ padding: '4px 6px',
54
+ };
46
55
  const isInt = (num) => {
47
56
  return num % 1 === 0;
48
57
  };
@@ -76,20 +85,18 @@ const deriveInputDraggerDragStartValue = ({ min, value, }) => {
76
85
  return 0;
77
86
  };
78
87
  exports.deriveInputDraggerDragStartValue = deriveInputDraggerDragStartValue;
88
+ const isInputDraggerValueInRange = ({ max, min, value, }) => {
89
+ const numericMin = Number(min);
90
+ const numericMax = Number(max);
91
+ return ((!Number.isFinite(numericMin) || value >= numericMin) &&
92
+ (!Number.isFinite(numericMax) || value <= numericMax));
93
+ };
94
+ exports.isInputDraggerValueInRange = isInputDraggerValueInRange;
79
95
  const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min, max: _max, step: _step, value, onTextChange, formatter = (q) => String(q), status, rightAlign, small, snapToStep = true, dragDecimalPlaces, ...props }, ref) => {
80
96
  const [inputFallback, setInputFallback] = (0, react_1.useState)(false);
81
97
  const [dragging, setDragging] = (0, react_1.useState)(false);
82
98
  const fallbackRef = (0, react_1.useRef)(null);
83
99
  const pointerDownRef = (0, react_1.useRef)(false);
84
- const style = (0, react_1.useMemo)(() => {
85
- return {
86
- ...RemInput_1.inputBaseStyle,
87
- backgroundColor: colors_1.TRANSPARENT,
88
- borderColor: colors_1.TRANSPARENT,
89
- padding: '4px 6px',
90
- ...{ outline: 'none' },
91
- };
92
- }, []);
93
100
  const span = (0, react_1.useMemo)(() => ({
94
101
  color: dragging ? 'var(--remotion-cli-internals-blue-hovered)' : colors_1.BLUE,
95
102
  cursor: 'ew-resize',
@@ -126,10 +133,16 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
126
133
  }, []);
127
134
  const onInputChange = (0, react_1.useCallback)((e) => {
128
135
  const parsed = Number(e.target.value);
129
- if (e.target.value !== '' && !Number.isNaN(parsed)) {
136
+ if (e.target.value !== '' &&
137
+ !Number.isNaN(parsed) &&
138
+ (0, exports.isInputDraggerValueInRange)({
139
+ max: _max,
140
+ min: _min,
141
+ value: parsed,
142
+ })) {
130
143
  onValueChange(parsed);
131
144
  }
132
- }, [onValueChange]);
145
+ }, [_max, _min, onValueChange]);
133
146
  const onBlur = (0, react_1.useCallback)(() => {
134
147
  if (!fallbackRef.current) {
135
148
  return;
@@ -233,6 +246,6 @@ const InputDraggerForwardRefFn = ({ onValueChange, onValueChangeEnd, min: _min,
233
246
  if (inputFallback) {
234
247
  return (jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onEscape: onEscape, onOutsideClick: noop_1.noop, children: jsx_runtime_1.jsx(RemInput_1.RemotionInput, { ref: fallbackRef, autoFocus: true, onKeyPress: onKeyPress, onBlur: onBlur, onChange: onInputChange, min: _min, max: _max, step: deriveStep, defaultValue: value, status: status, pattern: '[0-9]*[.]?[0-9]*', rightAlign: rightAlign, small: small, ...props }) }));
235
248
  }
236
- return (jsx_runtime_1.jsx("button", { ref: ref, type: "button", className: '__remotion_input_dragger', style: style, onClick: onClick, onFocus: onFocus, onKeyDown: onKeyDown, onPointerDown: onPointerDown, children: jsx_runtime_1.jsx("span", { style: span, children: formatter(value) }) }));
249
+ return (jsx_runtime_1.jsx("button", { ref: ref, type: "button", className: '__remotion_input_dragger', style: exports.inputDraggerContainerStyle, onClick: onClick, onFocus: onFocus, onKeyDown: onKeyDown, onPointerDown: onPointerDown, children: jsx_runtime_1.jsx("span", { style: span, children: formatter(value) }) }));
237
250
  };
238
251
  exports.InputDragger = react_1.default.forwardRef(InputDraggerForwardRefFn);
@@ -36,6 +36,13 @@ const NewCompositionLoaded = ({ folderName, parentName, stack }) => {
36
36
  : null;
37
37
  const initialDimensions = (0, get_new_composition_defaults_1.getNewCompositionDefaults)(initialComposition);
38
38
  const [newId, setName] = (0, react_1.useState)(() => (0, use_create_composition_1.getUniqueCompositionName)(compositions));
39
+ const inputRef = (0, react_1.useRef)(null);
40
+ (0, react_1.useEffect)(() => {
41
+ const input = inputRef.current;
42
+ if (!input)
43
+ return;
44
+ input.select();
45
+ }, []);
39
46
  const [selectedFrameRate, setFrameRate] = (0, react_1.useState)(initialDimensions.fps);
40
47
  const [size, setSize] = (0, react_1.useState)(() => ({
41
48
  width: initialDimensions.width,
@@ -102,7 +109,7 @@ const NewCompositionLoaded = ({ folderName, parentName, stack }) => {
102
109
  jsx_runtime_1.jsx("div", { style: layout_2.label, children: "Folder" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsx("span", { style: folderPathStyle, children: folderPath }) })
103
110
  ] })) : null, jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
104
111
  jsx_runtime_1.jsx("div", { style: layout_2.label, children: "ID" }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs(InputAndValidationContainer_1.InputAndValidationContainer, { children: [
105
- jsx_runtime_1.jsx(RemInput_1.RemotionInput, { value: newId, onChange: onNameChange, type: "text", autoFocus: true, placeholder: "Composition ID", status: "ok", rightAlign: true }), compNameErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
112
+ jsx_runtime_1.jsx(RemInput_1.RemotionInput, { ref: inputRef, value: newId, onChange: onNameChange, type: "text", autoFocus: true, placeholder: "Composition ID", status: "ok", rightAlign: true }), compNameErrMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
106
113
  jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-start", message: compNameErrMessage, type: "error" })
107
114
  ] })) : null] }) })
108
115
  ] }), jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
@@ -3,7 +3,7 @@ import React from 'react';
3
3
  export declare const WarningTriangle: React.FC<SVGProps<SVGSVGElement>>;
4
4
  type ValidationMessageSize = 'default' | 'compact';
5
5
  export declare const ValidationMessage: React.FC<{
6
- readonly message: string;
6
+ readonly message: React.ReactNode;
7
7
  readonly align: 'flex-start' | 'flex-end';
8
8
  readonly type: 'warning' | 'error';
9
9
  readonly action?: React.ReactNode;
@@ -9,6 +9,7 @@ const ErrorLoader_1 = require("../error-overlay/remotion-overlay/ErrorLoader");
9
9
  const checkerboard_background_1 = require("../helpers/checkerboard-background");
10
10
  const colors_1 = require("../helpers/colors");
11
11
  const get_preview_file_type_1 = require("../helpers/get-preview-file-type");
12
+ const studio_fit_padding_1 = require("../helpers/studio-fit-padding");
12
13
  const checkerboard_1 = require("../state/checkerboard");
13
14
  const is_menu_item_1 = require("./Menu/is-menu-item");
14
15
  const RenderPreview_1 = require("./RenderPreview");
@@ -78,13 +79,20 @@ const CompWhenItHasDimensions = ({ contentDimensions, canvasSize, canvasContent,
78
79
  scale: 1,
79
80
  };
80
81
  }
81
- return player_1.PlayerInternals.calculateCanvasTransformation({
82
- canvasSize,
83
- compositionHeight: contentDimensions.height,
84
- compositionWidth: contentDimensions.width,
85
- previewSize: previewSize.size,
86
- });
87
- }, [canvasSize, contentDimensions, previewSize.size]);
82
+ return canvasContent.type === 'composition'
83
+ ? (0, studio_fit_padding_1.calculateStudioCanvasTransformation)({
84
+ canvasSize,
85
+ compositionHeight: contentDimensions.height,
86
+ compositionWidth: contentDimensions.width,
87
+ previewSize: previewSize.size,
88
+ })
89
+ : player_1.PlayerInternals.calculateCanvasTransformation({
90
+ canvasSize,
91
+ compositionHeight: contentDimensions.height,
92
+ compositionWidth: contentDimensions.width,
93
+ previewSize: previewSize.size,
94
+ });
95
+ }, [canvasContent.type, canvasSize, contentDimensions, previewSize.size]);
88
96
  const outer = (0, react_1.useMemo)(() => {
89
97
  return {
90
98
  width: contentDimensions === 'none' ? '100%' : contentDimensions.width * scale,
@@ -2,17 +2,50 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.RenderModalOutputName = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const colors_1 = require("../../helpers/colors");
7
+ const get_file_manager_name_1 = require("../../helpers/get-file-manager-name");
8
+ const folder_1 = require("../../icons/folder");
9
+ const InlineAction_1 = require("../InlineAction");
5
10
  const layout_1 = require("../layout");
6
11
  const RemInput_1 = require("../NewComposition/RemInput");
7
12
  const ValidationMessage_1 = require("../NewComposition/ValidationMessage");
13
+ const NotificationCenter_1 = require("../Notifications/NotificationCenter");
14
+ const actions_1 = require("../RenderQueue/actions");
8
15
  const layout_2 = require("./layout");
16
+ const existsMessageStyle = {
17
+ display: 'inline-flex',
18
+ alignItems: 'center',
19
+ minWidth: 0,
20
+ fontFamily: 'sans-serif',
21
+ fontSize: 13,
22
+ lineHeight: '18px',
23
+ color: colors_1.WHITE,
24
+ whiteSpace: 'nowrap',
25
+ };
26
+ const openIconStyle = {
27
+ width: 12,
28
+ height: 12,
29
+ flexShrink: 0,
30
+ };
9
31
  const RenderModalOutputName = ({ existence, inputStyle, outName, onValueChange, validationMessage, label: labelText, }) => {
32
+ const openExistingOutput = (0, react_1.useCallback)(() => {
33
+ (0, actions_1.openInFileExplorer)({ directory: outName }).catch((err) => {
34
+ (0, NotificationCenter_1.showNotification)(`Could not open file: ${err.message}`, 2000);
35
+ });
36
+ }, [outName]);
37
+ const renderOpenIcon = (0, react_1.useCallback)((color) => {
38
+ return jsx_runtime_1.jsx(folder_1.ExpandedFolderIconSolid, { style: openIconStyle, color: color });
39
+ }, []);
40
+ const fileManagerName = (0, get_file_manager_name_1.getFileManagerName)(window.remotion_fileSystemPlatform);
10
41
  return (jsx_runtime_1.jsxs("div", { style: layout_2.optionRow, children: [
11
42
  jsx_runtime_1.jsx(layout_1.Column, { children: jsx_runtime_1.jsx("div", { style: layout_2.label, children: labelText }) }), jsx_runtime_1.jsx("div", { style: layout_2.rightRow, children: jsx_runtime_1.jsxs("div", { children: [
12
43
  jsx_runtime_1.jsx(RemInput_1.RemotionInput, { status: validationMessage ? 'error' : existence ? 'warning' : 'ok', style: inputStyle, type: "text", value: outName, onChange: onValueChange, rightAlign: true }), validationMessage ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
13
44
  jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: validationMessage, type: 'error' })
14
45
  ] })) : existence ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
15
- jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: "Will be overwritten", type: 'warning' })
46
+ jsx_runtime_1.jsx(layout_1.Spacing, { y: 1, block: true }), jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { align: "flex-end", message: jsx_runtime_1.jsxs("span", { style: existsMessageStyle, children: [
47
+ jsx_runtime_1.jsx(InlineAction_1.InlineAction, { onClick: openExistingOutput, renderAction: renderOpenIcon, title: `Open in ${fileManagerName}` }),
48
+ "Exists, will be overwritten"] }), type: 'warning' })
16
49
  ] })) : null] }) })
17
50
  ] }));
18
51
  };
@@ -411,6 +411,7 @@ const SelectedOutlineOverlay = ({ compositionHeight, compositionWidth, scale, tr
411
411
  sequences,
412
412
  overrideIdsToNodePaths: overrideIdToNodePathMappings,
413
413
  compositions,
414
+ timelinePosition,
414
415
  }).map(({ key, keyframeDisplayOffset, nodePathInfo, sequence }) => {
415
416
  var _a, _b, _c, _d, _e, _f;
416
417
  if (sequence.refForOutline === null) {
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import type { SvgImportDialogState } from '../state/modals';
3
+ export type SvgImportMode = 'image' | 'inline';
4
+ export declare const useSvgImportDialog: () => () => Promise<SvgImportMode | null>;
5
+ export declare const SvgImportDialog: React.FC<{
6
+ readonly state: SvgImportDialogState;
7
+ }>;