@remotion/studio 4.0.514 → 4.0.516
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.
- package/dist/api/install-package.js +14 -1
- package/dist/api/restart-studio.js +4 -0
- package/dist/components/AssetSelector.js +3 -9
- package/dist/components/AssetSelectorItem.d.ts +3 -1
- package/dist/components/AssetSelectorItem.js +41 -42
- package/dist/components/AudioWaveform.js +17 -139
- package/dist/components/Canvas.js +7 -4
- package/dist/components/CaptionInspector.d.ts +2 -0
- package/dist/components/CaptionInspector.js +3 -5
- package/dist/components/CompositionSelector.js +6 -3
- package/dist/components/CompositionSelectorItem.js +9 -10
- package/dist/components/ConfigSelect.d.ts +17 -0
- package/dist/components/ConfigSelect.js +50 -0
- package/dist/components/CurrentAsset.d.ts +10 -2
- package/dist/components/CurrentAsset.js +139 -46
- package/dist/components/FixComputedValueModal.js +54 -51
- package/dist/components/GlobalKeybindings.js +5 -5
- package/dist/components/InlineAction.d.ts +1 -1
- package/dist/components/InlineAction.js +12 -2
- package/dist/components/InlineCaptionInspector.d.ts +2 -0
- package/dist/components/InlineCaptionInspector.js +2 -2
- package/dist/components/InlineCompositionName.js +1 -1
- package/dist/components/InlineEditableTitle.js +3 -2
- package/dist/components/InspectorInfoHeader.js +1 -1
- package/dist/components/InspectorOpenInEditor.js +48 -72
- package/dist/components/InspectorPanel/AlignmentControls.js +2 -3
- package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +7 -0
- package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +39 -0
- package/dist/components/InspectorPanel/CompositionInspector.js +41 -12
- package/dist/components/InspectorPanel/KeyframeEasingNavigator.js +10 -4
- package/dist/components/InspectorPanel/SequenceInspectorHeader.js +2 -1
- package/dist/components/InspectorPanel/SequenceSelectionInspector.js +1 -4
- package/dist/components/InspectorPanel/common.d.ts +0 -12
- package/dist/components/InspectorPanel/common.js +3 -52
- package/dist/components/InspectorPanel/use-composition-actions.js +0 -1
- package/dist/components/InspectorPanelLayout.d.ts +1 -1
- package/dist/components/InspectorPanelLayout.js +1 -1
- package/dist/components/InspectorSequenceSection.js +40 -54
- package/dist/components/InstallPackage.d.ts +3 -2
- package/dist/components/InstallPackage.js +90 -28
- package/dist/components/InstallablePackage.js +37 -11
- package/dist/components/KeyboardShortcutsSettings.d.ts +2 -0
- package/dist/components/KeyboardShortcutsSettings.js +177 -0
- package/dist/components/Menu/MenuDivider.js +1 -1
- package/dist/components/MenuBuildIndicator.js +1 -1
- package/dist/components/Modals.js +12 -4
- package/dist/components/NewComposition/CodemodFooter.d.ts +0 -1
- package/dist/components/NewComposition/CodemodFooter.js +2 -8
- package/dist/components/NewComposition/DeleteComposition.js +1 -1
- package/dist/components/NewComposition/DeleteFolder.js +1 -1
- package/dist/components/NewComposition/DuplicateComposition.js +1 -1
- package/dist/components/NewComposition/InputDragger.js +27 -4
- package/dist/components/NewComposition/NewComposition.js +1 -1
- package/dist/components/NewComposition/NewFolder.js +1 -3
- package/dist/components/NewComposition/RenameComposition.js +1 -1
- package/dist/components/NewComposition/RenameFolder.js +1 -1
- package/dist/components/NewComposition/use-rename-static-file.js +1 -1
- package/dist/components/Notifications/NotificationCenter.d.ts +1 -0
- package/dist/components/Notifications/NotificationCenter.js +5 -0
- package/dist/components/OptionsPanel.js +9 -12
- package/dist/components/PreviewToolbar.js +5 -2
- package/dist/components/PreviewToolbarOverflowButton.js +30 -0
- package/dist/components/QuickSwitcher/ExplorerQuickSwitcherTrigger.js +2 -2
- package/dist/components/QuickSwitcher/QuickSwitcherContent.js +14 -30
- package/dist/components/RenderButton.js +66 -183
- package/dist/components/RenderModal/DataEditor.js +15 -12
- package/dist/components/RenderModal/GuiRenderStatus.js +3 -1
- package/dist/components/RenderModal/RenderModalOutputName.js +3 -3
- package/dist/components/RenderModal/RenderStatusModal.js +0 -1
- package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +3 -1
- package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.d.ts +15 -0
- package/dist/components/RenderModal/SchemaEditor/infer-zod-schema-from-value.js +95 -0
- package/dist/components/RenderModal/WebRenderModal.js +4 -2
- package/dist/components/RenderQueue/RenderQueueItem.js +3 -1
- package/dist/components/RenderQueue/RenderQueueOpenInFolder.js +3 -1
- package/dist/components/RenderQueue/RenderQueueRemoveItem.js +2 -7
- package/dist/components/RenderingSettings.js +7 -4
- package/dist/components/RulersAndGuidesToggle.d.ts +2 -0
- package/dist/components/RulersAndGuidesToggle.js +23 -0
- package/dist/components/SegmentedButton.d.ts +29 -0
- package/dist/components/SegmentedButton.js +226 -0
- package/dist/components/SelectedOutlineCanvasRotation.d.ts +1 -0
- package/dist/components/SelectedOutlineCanvasRotation.js +11 -4
- package/dist/components/SelectedOutlineEditingHandles.d.ts +16 -0
- package/dist/components/SelectedOutlineEditingHandles.js +66 -0
- package/dist/components/SelectedOutlineElement.d.ts +2 -4
- package/dist/components/SelectedOutlineElement.js +15 -54
- package/dist/components/SelectedOutlineOverlay.js +32 -6
- package/dist/components/SelectedOutlinePolygon.d.ts +4 -4
- package/dist/components/SelectedOutlinePolygon.js +20 -17
- package/dist/components/SelectedOutlineRenderer.js +66 -14
- package/dist/components/SettingsModal.d.ts +1 -1
- package/dist/components/SettingsModal.js +30 -7
- package/dist/components/SettingsModalFooter.js +2 -1
- package/dist/components/SkillsSettings.d.ts +2 -0
- package/dist/components/SkillsSettings.js +129 -0
- package/dist/components/StaticFilePreview.js +7 -1
- package/dist/components/StudioSettings.js +7 -48
- package/dist/components/Tabs/index.js +1 -1
- package/dist/components/Timeline/Timeline.js +0 -1
- package/dist/components/Timeline/TimelineAssetField.d.ts +1 -1
- package/dist/components/Timeline/TimelineAssetField.js +15 -9
- package/dist/components/Timeline/TimelineBooleanField.js +1 -4
- package/dist/components/Timeline/TimelineClipboardKeybindings.js +13 -12
- package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
- package/dist/components/Timeline/TimelineEffectItem.js +45 -15
- package/dist/components/Timeline/TimelineEffectPropItem.js +21 -4
- package/dist/components/Timeline/TimelineExpandArrowButton.js +10 -7
- package/dist/components/Timeline/TimelineExpandedKeyframeRow.js +4 -1
- package/dist/components/Timeline/TimelineExpandedRow.js +5 -4
- package/dist/components/Timeline/TimelineExpandedSection.js +8 -5
- package/dist/components/Timeline/TimelineFieldLabel.js +4 -2
- package/dist/components/Timeline/TimelineFieldRowContent.d.ts +1 -2
- package/dist/components/Timeline/TimelineFieldRowContent.js +8 -21
- package/dist/components/Timeline/TimelineImageInfo.d.ts +0 -1
- package/dist/components/Timeline/TimelineImageInfo.js +13 -32
- package/dist/components/Timeline/TimelineKeyframeControls.js +10 -4
- package/dist/components/Timeline/TimelinePrimitiveFieldValue.js +1 -1
- package/dist/components/Timeline/TimelineRotationField.js +0 -2
- package/dist/components/Timeline/TimelineRowChrome.d.ts +1 -1
- package/dist/components/Timeline/TimelineRowChrome.js +41 -6
- package/dist/components/Timeline/TimelineRowLayoutContext.d.ts +0 -1
- package/dist/components/Timeline/TimelineRowLayoutContext.js +1 -4
- package/dist/components/Timeline/TimelineScaleField.js +2 -6
- package/dist/components/Timeline/TimelineSchemaField.js +9 -3
- package/dist/components/Timeline/TimelineSelection.d.ts +8 -3
- package/dist/components/Timeline/TimelineSelection.js +7 -5
- package/dist/components/Timeline/TimelineSequence.d.ts +2 -0
- package/dist/components/Timeline/TimelineSequence.js +110 -19
- package/dist/components/Timeline/TimelineSequenceItem.js +11 -8
- package/dist/components/Timeline/TimelineSequenceName.js +1 -1
- package/dist/components/Timeline/TimelineSequencePropItem.js +15 -2
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.d.ts +4 -2
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +85 -91
- package/dist/components/Timeline/TimelineTrack.js +5 -2
- package/dist/components/Timeline/TimelineTransformOriginField.js +0 -4
- package/dist/components/Timeline/TimelineTranslateField.js +0 -4
- package/dist/components/Timeline/TimelineVideoInfo.js +4 -2
- package/dist/components/Timeline/TimelineVirtualization.js +3 -1
- package/dist/components/Timeline/delete-selected-timeline-item.js +6 -2
- package/dist/components/Timeline/duplicate-selected-timeline-item.js +7 -14
- package/dist/components/Timeline/get-copy-context-for-agents-menu-item.d.ts +4 -0
- package/dist/components/Timeline/get-copy-context-for-agents-menu-item.js +26 -0
- package/dist/components/Timeline/get-sequence-context-menu-items.js +2 -19
- package/dist/components/Timeline/get-timeline-sequence-visible-layout.d.ts +6 -1
- package/dist/components/Timeline/get-timeline-sequence-visible-layout.js +11 -4
- package/dist/components/Timeline/save-effect-prop.js +3 -3
- package/dist/components/Timeline/split-selected-timeline-item.js +0 -1
- package/dist/components/Timeline/timeline-field-row-layout.d.ts +1 -1
- package/dist/components/Timeline/timeline-field-row-layout.js +4 -7
- package/dist/components/Timeline/timeline-field-utils.js +0 -2
- package/dist/components/Timeline/use-timeline-asset-drop.js +1 -0
- package/dist/components/TimelineCombobox.js +25 -160
- package/dist/components/TimelineInOutToggle.js +4 -1
- package/dist/components/duplicate-jsx-node-api.d.ts +2 -0
- package/dist/components/duplicate-jsx-node-api.js +12 -0
- package/dist/components/effect-drag-and-drop.js +7 -7
- package/dist/components/effect-operations-api.d.ts +8 -0
- package/dist/components/effect-operations-api.js +52 -0
- package/dist/components/handle-drop.d.ts +2 -1
- package/dist/components/handle-drop.js +3 -3
- package/dist/components/import-assets.js +9 -65
- package/dist/components/keyboard-shortcuts.d.ts +10 -0
- package/dist/components/keyboard-shortcuts.js +135 -0
- package/dist/components/selected-outline-control-layout.js +2 -6
- package/dist/components/selected-outline-measurement.d.ts +1 -1
- package/dist/components/selected-outline-measurement.js +16 -3
- package/dist/components/use-delete-asset.d.ts +1 -0
- package/dist/components/use-delete-asset.js +40 -0
- package/dist/components/use-selected-outline-control-target.d.ts +11 -0
- package/dist/components/use-selected-outline-control-target.js +79 -0
- package/dist/error-overlay/remotion-overlay/log-studio-error.js +4 -0
- package/dist/esm/{chunk-r46yxrjr.js → chunk-4bxz1d3g.js} +4 -3
- package/dist/esm/{chunk-xn2q7eem.js → chunk-w4244j4n.js} +14747 -14549
- package/dist/esm/index.mjs +3 -0
- package/dist/esm/internals.mjs +14747 -14549
- package/dist/esm/previewEntry.mjs +14557 -14359
- package/dist/esm/renderEntry.mjs +2 -2
- package/dist/helpers/add-asset-cache-bust.d.ts +4 -0
- package/dist/helpers/add-asset-cache-bust.js +10 -0
- package/dist/helpers/browser-studio-operations.d.ts +3 -0
- package/dist/helpers/browser-studio-operations.js +18 -1
- package/dist/helpers/calculate-timeline.js +2 -1
- package/dist/helpers/colors.d.ts +3 -1
- package/dist/helpers/colors.js +7 -3
- package/dist/helpers/drag-aware-double-click.d.ts +6 -0
- package/dist/helpers/drag-aware-double-click.js +20 -0
- package/dist/helpers/get-asset-metadata.js +25 -16
- package/dist/helpers/get-sequence-double-click-action.d.ts +2 -1
- package/dist/helpers/get-sequence-double-click-action.js +7 -1
- package/dist/helpers/get-timeline-sequence-layout.d.ts +4 -1
- package/dist/helpers/get-timeline-sequence-layout.js +15 -6
- package/dist/helpers/get-timeline-sequence-sort-key.d.ts +2 -1
- package/dist/helpers/hoverable.d.ts +1 -0
- package/dist/helpers/hoverable.js +2 -1
- package/dist/helpers/inject-css.js +7 -3
- package/dist/helpers/open-in-remotion-convert.d.ts +7 -0
- package/dist/helpers/open-in-remotion-convert.js +18 -0
- package/dist/helpers/use-max-media-duration.js +5 -3
- package/dist/helpers/use-media-metadata.d.ts +2 -1
- package/dist/helpers/use-media-metadata.js +49 -25
- package/dist/helpers/use-menu-structure.js +54 -67
- package/dist/icons/align-center-horizontal.js +1 -1
- package/dist/icons/align-left.js +1 -1
- package/dist/icons/align-right.js +1 -1
- package/dist/icons/cloud-download.d.ts +4 -0
- package/dist/icons/cloud-download.js +8 -0
- package/dist/icons/keyboard.d.ts +4 -0
- package/dist/icons/keyboard.js +10 -0
- package/dist/icons/license.d.ts +4 -0
- package/dist/icons/license.js +8 -0
- package/dist/icons/package.d.ts +4 -0
- package/dist/icons/package.js +8 -0
- package/dist/icons/react.js +1 -1
- package/dist/icons/remotion-convert.d.ts +4 -0
- package/dist/icons/remotion-convert.js +10 -0
- package/dist/icons/skills.d.ts +4 -0
- package/dist/icons/skills.js +10 -0
- package/dist/state/modals.d.ts +2 -5
- package/package.json +12 -12
- package/dist/components/KeyboardShortcutsExplainer.d.ts +0 -2
- package/dist/components/KeyboardShortcutsExplainer.js +0 -194
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.saveEffectProp = exports.saveMultipleEffectProps = void 0;
|
|
4
4
|
const studio_shared_1 = require("@remotion/studio-shared");
|
|
5
|
-
const
|
|
5
|
+
const effect_operations_api_1 = require("../effect-operations-api");
|
|
6
6
|
const apply_effect_response_to_prop_statuses_1 = require("./apply-effect-response-to-prop-statuses");
|
|
7
7
|
const save_prop_queue_1 = require("./save-prop-queue");
|
|
8
8
|
const saveMultipleEffectProps = ({ changes, setPropStatuses, clientId, undoLabel, redoLabel, }) => {
|
|
@@ -21,7 +21,7 @@ const saveMultipleEffectProps = ({ changes, setPropStatuses, clientId, undoLabel
|
|
|
21
21
|
schema: change.schema,
|
|
22
22
|
}));
|
|
23
23
|
}
|
|
24
|
-
return (0,
|
|
24
|
+
return (0, effect_operations_api_1.saveMultipleEffectProps)({
|
|
25
25
|
edits: changes.map((change) => change.type === 'effect-param'
|
|
26
26
|
? {
|
|
27
27
|
type: 'effect-param',
|
|
@@ -71,7 +71,7 @@ const saveEffectProp = (input) => {
|
|
|
71
71
|
schema,
|
|
72
72
|
}),
|
|
73
73
|
applyServerResponse: (prev, response) => (0, apply_effect_response_to_prop_statuses_1.applyEffectResponseToPropStatuses)({ previous: prev, response }),
|
|
74
|
-
apiCall: () => (0,
|
|
74
|
+
apiCall: () => (0, effect_operations_api_1.saveEffectProps)(input.type === 'effect-param'
|
|
75
75
|
? {
|
|
76
76
|
type: 'effect-param',
|
|
77
77
|
fileName,
|
|
@@ -97,7 +97,6 @@ const splitTimelineSequenceFromSource = ({ nodePathInfo, splitFrame, }) => {
|
|
|
97
97
|
})
|
|
98
98
|
.then((result) => {
|
|
99
99
|
if (result.success) {
|
|
100
|
-
(0, NotificationCenter_1.showNotification)('Split sequence', 2000);
|
|
101
100
|
return true;
|
|
102
101
|
}
|
|
103
102
|
(0, NotificationCenter_1.showNotification)(result.reason, 4000);
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import type React from 'react';
|
|
2
2
|
import { type SchemaFieldInfo } from '../../helpers/timeline-layout';
|
|
3
|
+
export declare const TIMELINE_STACKED_FIELD_HEADER_HEIGHT = 14;
|
|
3
4
|
export declare const isTimelineFieldStacked: ({ field, transform3DMode, }: {
|
|
4
5
|
readonly field: SchemaFieldInfo;
|
|
5
6
|
readonly transform3DMode: boolean;
|
|
6
7
|
}) => boolean;
|
|
7
8
|
export declare const getTimelineFieldLabelRowStyle: (depth: number, basePadding?: number | undefined) => React.CSSProperties;
|
|
8
9
|
export declare const timelineFieldValueColumnStyle: React.CSSProperties;
|
|
9
|
-
export declare const timelineCompactStackedFieldValueColumnStyle: React.CSSProperties;
|
|
10
10
|
export declare const timelineStackedFieldContentStyle: React.CSSProperties;
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.timelineStackedFieldContentStyle = exports.
|
|
3
|
+
exports.timelineStackedFieldContentStyle = exports.timelineFieldValueColumnStyle = exports.getTimelineFieldLabelRowStyle = exports.isTimelineFieldStacked = exports.TIMELINE_STACKED_FIELD_HEADER_HEIGHT = void 0;
|
|
4
4
|
const timeline_layout_1 = require("../../helpers/timeline-layout");
|
|
5
5
|
const timeline_row_layout_1 = require("./timeline-row-layout");
|
|
6
|
+
exports.TIMELINE_STACKED_FIELD_HEADER_HEIGHT = 14;
|
|
6
7
|
const isTimelineFieldStacked = ({ field, transform3DMode, }) => {
|
|
7
8
|
return (field.typeName === 'text-content' ||
|
|
8
9
|
(transform3DMode &&
|
|
@@ -31,16 +32,12 @@ exports.timelineFieldValueColumnStyle = {
|
|
|
31
32
|
minWidth: 0,
|
|
32
33
|
paddingRight: timeline_layout_1.EXPANDED_SECTION_PADDING_RIGHT,
|
|
33
34
|
};
|
|
34
|
-
exports.timelineCompactStackedFieldValueColumnStyle = {
|
|
35
|
-
...exports.timelineFieldValueColumnStyle,
|
|
36
|
-
marginBottom: -3,
|
|
37
|
-
position: 'relative',
|
|
38
|
-
top: -3,
|
|
39
|
-
};
|
|
40
35
|
exports.timelineStackedFieldContentStyle = {
|
|
41
36
|
alignSelf: 'stretch',
|
|
37
|
+
boxSizing: 'border-box',
|
|
42
38
|
display: 'flex',
|
|
43
39
|
flex: 1,
|
|
44
40
|
flexDirection: 'column',
|
|
45
41
|
minWidth: 0,
|
|
42
|
+
paddingBlock: 3,
|
|
46
43
|
};
|
|
@@ -1,181 +1,46 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.TimelineCombobox = void 0;
|
|
7
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
8
|
-
const player_1 = require("@remotion/player");
|
|
9
|
-
const react_1 = require("react");
|
|
10
|
-
const react_dom_1 = __importDefault(require("react-dom"));
|
|
11
5
|
const colors_1 = require("../helpers/colors");
|
|
12
|
-
const mobile_layout_1 = require("../helpers/mobile-layout");
|
|
13
|
-
const noop_1 = require("../helpers/noop");
|
|
14
6
|
const caret_1 = require("../icons/caret");
|
|
15
|
-
const z_index_1 = require("../state/z-index");
|
|
16
7
|
const layout_1 = require("./layout");
|
|
17
|
-
const
|
|
18
|
-
const
|
|
19
|
-
|
|
20
|
-
const MenuContent_1 = require("./NewComposition/MenuContent");
|
|
21
|
-
const container = {
|
|
22
|
-
boxSizing: 'border-box',
|
|
23
|
-
border: 'none',
|
|
24
|
-
borderRadius: 3,
|
|
25
|
-
height: 24,
|
|
26
|
-
padding: '0 4px',
|
|
27
|
-
fontFamily: 'inherit',
|
|
28
|
-
maxWidth: '100%',
|
|
8
|
+
const SegmentedButton_1 = require("./SegmentedButton");
|
|
9
|
+
const segmentedButtonStyle = {
|
|
10
|
+
height: 28,
|
|
29
11
|
};
|
|
30
12
|
const label = {
|
|
31
13
|
flex: 'none',
|
|
32
|
-
overflow: 'hidden',
|
|
33
|
-
textOverflow: 'ellipsis',
|
|
34
14
|
fontFamily: 'inherit',
|
|
35
15
|
fontSize: 12,
|
|
36
16
|
lineHeight: '16px',
|
|
37
|
-
color: colors_1.WHITE_ALPHA_80,
|
|
38
17
|
minWidth: 0,
|
|
18
|
+
overflow: 'hidden',
|
|
39
19
|
textAlign: 'left',
|
|
20
|
+
textOverflow: 'ellipsis',
|
|
40
21
|
whiteSpace: 'nowrap',
|
|
41
22
|
};
|
|
42
23
|
const TimelineCombobox = ({ values, selectedId, title, labelWidth = 32, renderLeftItem, unhoveredIconColor = colors_1.LIGHT_TEXT, }) => {
|
|
43
|
-
const [hovered, setIsHovered] = (0, react_1.useState)(false);
|
|
44
|
-
const [opened, setOpened] = (0, react_1.useState)(false);
|
|
45
|
-
const ref = (0, react_1.useRef)(null);
|
|
46
|
-
const { tabIndex, currentZIndex } = (0, z_index_1.useZIndex)();
|
|
47
|
-
const size = player_1.PlayerInternals.useElementSize(ref, {
|
|
48
|
-
triggerOnWindowResize: true,
|
|
49
|
-
shouldApplyCssTransforms: true,
|
|
50
|
-
});
|
|
51
|
-
const refresh = size === null || size === void 0 ? void 0 : size.refresh;
|
|
52
|
-
const onHide = (0, react_1.useCallback)(() => {
|
|
53
|
-
setOpened(false);
|
|
54
|
-
}, []);
|
|
55
|
-
const onOverlayPointerDown = (0, react_1.useCallback)((e) => {
|
|
56
|
-
e.stopPropagation();
|
|
57
|
-
}, []);
|
|
58
|
-
(0, react_1.useEffect)(() => {
|
|
59
|
-
const { current } = ref;
|
|
60
|
-
if (!current) {
|
|
61
|
-
return;
|
|
62
|
-
}
|
|
63
|
-
const onMouseEnter = () => setIsHovered(true);
|
|
64
|
-
const onMouseLeave = () => setIsHovered(false);
|
|
65
|
-
const onPointerDown = (e) => {
|
|
66
|
-
e.stopPropagation();
|
|
67
|
-
return setOpened((isOpened) => {
|
|
68
|
-
if (!isOpened) {
|
|
69
|
-
refresh === null || refresh === void 0 ? void 0 : refresh();
|
|
70
|
-
}
|
|
71
|
-
return !isOpened;
|
|
72
|
-
});
|
|
73
|
-
};
|
|
74
|
-
const onClick = (e) => {
|
|
75
|
-
e.stopPropagation();
|
|
76
|
-
const isKeyboardInitiated = e.detail === 0;
|
|
77
|
-
if (!isKeyboardInitiated) {
|
|
78
|
-
return;
|
|
79
|
-
}
|
|
80
|
-
return setOpened((isOpened) => {
|
|
81
|
-
if (!isOpened) {
|
|
82
|
-
refresh === null || refresh === void 0 ? void 0 : refresh();
|
|
83
|
-
window.addEventListener('pointerup', (evt) => {
|
|
84
|
-
if (!(0, is_menu_item_1.isMenuItem)(evt.target)) {
|
|
85
|
-
setOpened(false);
|
|
86
|
-
}
|
|
87
|
-
}, { once: true });
|
|
88
|
-
}
|
|
89
|
-
return !isOpened;
|
|
90
|
-
});
|
|
91
|
-
};
|
|
92
|
-
current.addEventListener('mouseenter', onMouseEnter);
|
|
93
|
-
current.addEventListener('mouseleave', onMouseLeave);
|
|
94
|
-
current.addEventListener('pointerdown', onPointerDown);
|
|
95
|
-
current.addEventListener('click', onClick);
|
|
96
|
-
return () => {
|
|
97
|
-
current.removeEventListener('mouseenter', onMouseEnter);
|
|
98
|
-
current.removeEventListener('mouseleave', onMouseLeave);
|
|
99
|
-
current.removeEventListener('pointerdown', onPointerDown);
|
|
100
|
-
current.removeEventListener('click', onClick);
|
|
101
|
-
};
|
|
102
|
-
}, [refresh]);
|
|
103
|
-
const spaceToBottom = (0, react_1.useMemo)(() => {
|
|
104
|
-
const margin = 10;
|
|
105
|
-
if (size && opened) {
|
|
106
|
-
return size.windowSize.height - (size.top + size.height) - margin;
|
|
107
|
-
}
|
|
108
|
-
return 0;
|
|
109
|
-
}, [opened, size]);
|
|
110
|
-
const spaceToTop = (0, react_1.useMemo)(() => {
|
|
111
|
-
const margin = 10;
|
|
112
|
-
if (size && opened) {
|
|
113
|
-
return size.top - margin;
|
|
114
|
-
}
|
|
115
|
-
return 0;
|
|
116
|
-
}, [opened, size]);
|
|
117
|
-
const derivedMaxHeight = (0, react_1.useMemo)(() => {
|
|
118
|
-
return spaceToTop > spaceToBottom ? spaceToTop : spaceToBottom;
|
|
119
|
-
}, [spaceToBottom, spaceToTop]);
|
|
120
|
-
const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
|
|
121
|
-
const portalStyle = (0, react_1.useMemo)(() => {
|
|
122
|
-
if (!opened || !size) {
|
|
123
|
-
return null;
|
|
124
|
-
}
|
|
125
|
-
const spaceToRight = size.windowSize.width - size.left;
|
|
126
|
-
const spaceToLeft = size.left + size.width;
|
|
127
|
-
const minSpaceRequired = isMobileLayout
|
|
128
|
-
? styles_1.MAX_MOBILE_MENU_WIDTH
|
|
129
|
-
: styles_1.MAX_MENU_WIDTH;
|
|
130
|
-
const verticalLayout = spaceToTop > spaceToBottom ? 'bottom' : 'top';
|
|
131
|
-
const canOpenOnLeft = spaceToLeft >= minSpaceRequired;
|
|
132
|
-
const canOpenOnRight = spaceToRight >= minSpaceRequired;
|
|
133
|
-
const horizontalLayout = canOpenOnRight ? 'left' : 'right';
|
|
134
|
-
return {
|
|
135
|
-
...(verticalLayout === 'top'
|
|
136
|
-
? {
|
|
137
|
-
...styles_1.menuContainerTowardsBottom,
|
|
138
|
-
top: size.top + size.height,
|
|
139
|
-
}
|
|
140
|
-
: {
|
|
141
|
-
...styles_1.menuContainerTowardsTop,
|
|
142
|
-
bottom: size.windowSize.height - size.top,
|
|
143
|
-
}),
|
|
144
|
-
...(horizontalLayout === 'left'
|
|
145
|
-
? { left: size.left }
|
|
146
|
-
: canOpenOnLeft
|
|
147
|
-
? { right: size.windowSize.width - size.left - size.width }
|
|
148
|
-
: { left: 0 }),
|
|
149
|
-
};
|
|
150
|
-
}, [isMobileLayout, opened, size, spaceToBottom, spaceToTop]);
|
|
151
24
|
const selected = values.find((value) => value.id === selectedId);
|
|
152
|
-
const
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
};
|
|
173
|
-
}, [foregroundColor, labelWidth]);
|
|
174
|
-
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
175
|
-
jsx_runtime_1.jsxs("button", { ref: ref, title: title, "aria-label": title, tabIndex: tabIndex, type: "button", style: style, className: is_menu_item_1.MENU_INITIATOR_CLASSNAME, children: [renderLeftItem ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderLeftItem(foregroundColor), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 })
|
|
176
|
-
] })) : null, selected ? (jsx_runtime_1.jsx("div", { title: typeof selected.label === 'string' ? selected.label : undefined, style: labelStyle, children: selected.label })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(caret_1.CaretDown, { color: hovered || opened ? colors_1.WHITE : unhoveredIconColor })
|
|
177
|
-
] }), portalStyle
|
|
178
|
-
? react_dom_1.default.createPortal(jsx_runtime_1.jsx("div", { style: styles_1.fullScreenOverlay, onPointerDown: onOverlayPointerDown, children: jsx_runtime_1.jsx("div", { style: styles_1.outerPortal, className: "css-reset", children: jsx_runtime_1.jsx(z_index_1.HigherZIndex, { onOutsideClick: onHide, onEscape: onHide, children: jsx_runtime_1.jsx("div", { style: portalStyle, children: jsx_runtime_1.jsx(MenuContent_1.MenuContent, { onNextMenu: noop_1.noop, onPreviousMenu: noop_1.noop, values: values, onHide: onHide, leaveLeftSpace: true, preselectIndex: values.findIndex((value) => selected && value.id === selected.id), topItemCanBeUnselected: false, fixedHeight: derivedMaxHeight }) }) }) }) }), (0, portals_1.getPortal)(currentZIndex))
|
|
179
|
-
: null] }));
|
|
25
|
+
const segments = [
|
|
26
|
+
{
|
|
27
|
+
ariaLabel: title,
|
|
28
|
+
buttonId: null,
|
|
29
|
+
disabled: false,
|
|
30
|
+
idleColor: unhoveredIconColor,
|
|
31
|
+
leaveLeftSpace: true,
|
|
32
|
+
onOpenChange: null,
|
|
33
|
+
renderContent: (color) => (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderLeftItem ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [renderLeftItem(color), jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 })
|
|
34
|
+
] })) : null, selected ? (jsx_runtime_1.jsx("div", { title: typeof selected.label === 'string' ? selected.label : undefined, style: { ...label, width: labelWidth }, children: selected.label })) : null, jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(caret_1.CaretDown, { color: color })
|
|
35
|
+
] })),
|
|
36
|
+
segmentId: 'selector',
|
|
37
|
+
selectedId,
|
|
38
|
+
style: { fontFamily: 'inherit', padding: '0 4px' },
|
|
39
|
+
title,
|
|
40
|
+
type: 'menu',
|
|
41
|
+
values,
|
|
42
|
+
},
|
|
43
|
+
];
|
|
44
|
+
return (jsx_runtime_1.jsx(SegmentedButton_1.SegmentedButton, { segments: segments, style: segmentedButtonStyle, title: null }));
|
|
180
45
|
};
|
|
181
46
|
exports.TimelineCombobox = TimelineCombobox;
|
|
@@ -22,6 +22,9 @@ const style = {
|
|
|
22
22
|
width: 17,
|
|
23
23
|
height: 17,
|
|
24
24
|
};
|
|
25
|
+
const buttonStyle = {
|
|
26
|
+
width: 18,
|
|
27
|
+
};
|
|
25
28
|
exports.inOutHandles = (0, react_1.createRef)();
|
|
26
29
|
exports.defaultInOutValue = { inFrame: null, outFrame: null };
|
|
27
30
|
const TimelineInOutPointToggle = () => {
|
|
@@ -243,7 +246,7 @@ const TimelineInOutPointToggle = () => {
|
|
|
243
246
|
};
|
|
244
247
|
}, [confId, onInMark, onInOutClear, onOutMark]);
|
|
245
248
|
return (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
246
|
-
jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: getTooltipText('In', 'I'), "aria-label": getTooltipText('In', 'I'), onClick: onInMark, onContextMenu: clearInMark, disabled: !videoConfig || isFirstFrame, children: (color) => (jsx_runtime_1.jsx(timelineInOutPointer_1.TimelineInPointer, { color: inFrame === null ? color : colors_1.BLUE, style: style })) }), jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: getTooltipText('Out', 'O'), "aria-label": getTooltipText('Out', 'O'), onClick: onOutMark, onContextMenu: clearOutMark, disabled: !videoConfig || isLastFrame, children: (color) => (jsx_runtime_1.jsx(timelineInOutPointer_1.TimelineOutPointer, { color: outFrame === null ? color : colors_1.BLUE, style: style })) })
|
|
249
|
+
jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: getTooltipText('In', 'I'), "aria-label": getTooltipText('In', 'I'), style: buttonStyle, onClick: onInMark, onContextMenu: clearInMark, disabled: !videoConfig || isFirstFrame, children: (color) => (jsx_runtime_1.jsx(timelineInOutPointer_1.TimelineInPointer, { color: inFrame === null ? color : colors_1.BLUE, style: style })) }), jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: getTooltipText('Out', 'O'), "aria-label": getTooltipText('Out', 'O'), style: buttonStyle, onClick: onOutMark, onContextMenu: clearOutMark, disabled: !videoConfig || isLastFrame, children: (color) => (jsx_runtime_1.jsx(timelineInOutPointer_1.TimelineOutPointer, { color: outFrame === null ? color : colors_1.BLUE, style: style })) })
|
|
247
250
|
] }));
|
|
248
251
|
};
|
|
249
252
|
exports.TimelineInOutPointToggle = TimelineInOutPointToggle;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.duplicateJsxNode = void 0;
|
|
4
|
+
const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
|
|
5
|
+
const call_api_1 = require("./call-api");
|
|
6
|
+
const duplicateJsxNode = (request) => {
|
|
7
|
+
const browserStudioOperations = (0, browser_studio_operations_1.getBrowserStudioOperations)();
|
|
8
|
+
return browserStudioOperations
|
|
9
|
+
? browserStudioOperations.duplicateJsxNode(request)
|
|
10
|
+
: (0, call_api_1.callApi)('/api/duplicate-jsx-node', request);
|
|
11
|
+
};
|
|
12
|
+
exports.duplicateJsxNode = duplicateJsxNode;
|
|
@@ -3,8 +3,9 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.addEffectToSequence = exports.addEffectFromDragData = exports.getEffectDragData = exports.hasExplicitEffectDragType = exports.hasEffectDragType = void 0;
|
|
4
4
|
const studio_protocol_1 = require("@remotion/studio-protocol");
|
|
5
5
|
const studio_shared_1 = require("@remotion/studio-shared");
|
|
6
|
+
const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
|
|
6
7
|
const install_required_package_1 = require("../helpers/install-required-package");
|
|
7
|
-
const
|
|
8
|
+
const effect_operations_api_1 = require("./effect-operations-api");
|
|
8
9
|
const NotificationCenter_1 = require("./Notifications/NotificationCenter");
|
|
9
10
|
const hasEffectDragType = (dataTransfer) => {
|
|
10
11
|
var _a;
|
|
@@ -33,8 +34,10 @@ exports.addEffectFromDragData = addEffectFromDragData;
|
|
|
33
34
|
const addEffectToSequence = async ({ clientId, effect, fileName, nodePath, }) => {
|
|
34
35
|
try {
|
|
35
36
|
const requiredPackage = (0, studio_shared_1.getRequiredPackageForEffectImportPath)(effect.importPath);
|
|
36
|
-
|
|
37
|
-
|
|
37
|
+
if ((0, browser_studio_operations_1.getBrowserStudioEffectOperations)() === null) {
|
|
38
|
+
await (0, install_required_package_1.installRequiredPackages)(requiredPackage ? [{ name: requiredPackage, version: null }] : []);
|
|
39
|
+
}
|
|
40
|
+
const result = await (0, effect_operations_api_1.addEffect)({
|
|
38
41
|
fileName,
|
|
39
42
|
sequenceNodePath: nodePath,
|
|
40
43
|
effectName: effect.name,
|
|
@@ -42,10 +45,7 @@ const addEffectToSequence = async ({ clientId, effect, fileName, nodePath, }) =>
|
|
|
42
45
|
effectConfig: effect.config,
|
|
43
46
|
clientId,
|
|
44
47
|
});
|
|
45
|
-
if (result.success) {
|
|
46
|
-
(0, NotificationCenter_1.showNotification)(`Added ${effect.name}()`, 2000);
|
|
47
|
-
}
|
|
48
|
-
else {
|
|
48
|
+
if (!result.success) {
|
|
49
49
|
(0, NotificationCenter_1.showNotification)(result.reason, 4000);
|
|
50
50
|
}
|
|
51
51
|
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { AddEffectRequest, DeleteEffectRequest, DuplicateEffectRequest, PasteEffectsRequest, ReorderEffectRequest, SaveEffectPropsRequest, SaveMultipleEffectPropsRequest } from '@remotion/studio-shared';
|
|
2
|
+
export declare const addEffect: (request: AddEffectRequest) => Promise<import("@remotion/studio-shared").AddEffectResponse>;
|
|
3
|
+
export declare const deleteEffects: (request: DeleteEffectRequest) => Promise<import("@remotion/studio-shared").DeleteEffectResponse>;
|
|
4
|
+
export declare const duplicateEffects: (request: DuplicateEffectRequest) => Promise<import("@remotion/studio-shared").DuplicateEffectResponse>;
|
|
5
|
+
export declare const pasteEffects: (request: PasteEffectsRequest) => Promise<import("@remotion/studio-shared").PasteEffectsResponse>;
|
|
6
|
+
export declare const reorderEffect: (request: ReorderEffectRequest) => Promise<import("@remotion/studio-shared").ReorderEffectResponse>;
|
|
7
|
+
export declare const saveEffectProps: (request: SaveEffectPropsRequest) => Promise<import("remotion").CanUpdateEffectPropsResponse>;
|
|
8
|
+
export declare const saveMultipleEffectProps: (request: SaveMultipleEffectPropsRequest) => Promise<import("@remotion/studio-shared").SaveMultipleEffectPropsResponse>;
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.saveMultipleEffectProps = exports.saveEffectProps = exports.reorderEffect = exports.pasteEffects = exports.duplicateEffects = exports.deleteEffects = exports.addEffect = void 0;
|
|
4
|
+
const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
|
|
5
|
+
const call_api_1 = require("./call-api");
|
|
6
|
+
const getBrowserEffectOperations = () => {
|
|
7
|
+
var _a;
|
|
8
|
+
var _b;
|
|
9
|
+
return (_b = (_a = (0, browser_studio_operations_1.getBrowserStudioOperations)()) === null || _a === void 0 ? void 0 : _a.effects) !== null && _b !== void 0 ? _b : null;
|
|
10
|
+
};
|
|
11
|
+
const addEffect = (request) => {
|
|
12
|
+
var _a;
|
|
13
|
+
var _b;
|
|
14
|
+
return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.addEffect(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/add-effect', request);
|
|
15
|
+
};
|
|
16
|
+
exports.addEffect = addEffect;
|
|
17
|
+
const deleteEffects = (request) => {
|
|
18
|
+
var _a;
|
|
19
|
+
var _b;
|
|
20
|
+
return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.deleteEffects(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/delete-effect', request);
|
|
21
|
+
};
|
|
22
|
+
exports.deleteEffects = deleteEffects;
|
|
23
|
+
const duplicateEffects = (request) => {
|
|
24
|
+
var _a;
|
|
25
|
+
var _b;
|
|
26
|
+
return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.duplicateEffects(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/duplicate-effect', request);
|
|
27
|
+
};
|
|
28
|
+
exports.duplicateEffects = duplicateEffects;
|
|
29
|
+
const pasteEffects = (request) => {
|
|
30
|
+
var _a;
|
|
31
|
+
var _b;
|
|
32
|
+
return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.pasteEffects(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/paste-effects', request);
|
|
33
|
+
};
|
|
34
|
+
exports.pasteEffects = pasteEffects;
|
|
35
|
+
const reorderEffect = (request) => {
|
|
36
|
+
var _a;
|
|
37
|
+
var _b;
|
|
38
|
+
return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.reorderEffect(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/reorder-effect', request);
|
|
39
|
+
};
|
|
40
|
+
exports.reorderEffect = reorderEffect;
|
|
41
|
+
const saveEffectProps = (request) => {
|
|
42
|
+
var _a;
|
|
43
|
+
var _b;
|
|
44
|
+
return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.saveEffectProps(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/save-effect-props', request);
|
|
45
|
+
};
|
|
46
|
+
exports.saveEffectProps = saveEffectProps;
|
|
47
|
+
const saveMultipleEffectProps = (request) => {
|
|
48
|
+
var _a;
|
|
49
|
+
var _b;
|
|
50
|
+
return (_b = (_a = getBrowserEffectOperations()) === null || _a === void 0 ? void 0 : _a.saveMultipleEffectProps(request)) !== null && _b !== void 0 ? _b : (0, call_api_1.callApi)('/api/save-multiple-effect-props', request);
|
|
51
|
+
};
|
|
52
|
+
exports.saveMultipleEffectProps = saveMultipleEffectProps;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { Dimensions } from '../helpers/is-current-selected-still';
|
|
2
2
|
import { type InsertElementDropPosition } from './import-assets';
|
|
3
3
|
import type { SvgImportMode } from './SvgImportDialog';
|
|
4
|
-
export declare const handleDrop: ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, preferCompositionStart, }: {
|
|
4
|
+
export declare const handleDrop: ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, localFiles, preferCompositionStart, }: {
|
|
5
5
|
chooseSvgImportMode: () => Promise<SvgImportMode | null>;
|
|
6
6
|
compositionFile: string;
|
|
7
7
|
compositionId: string;
|
|
@@ -10,5 +10,6 @@ export declare const handleDrop: ({ chooseSvgImportMode, compositionFile, compos
|
|
|
10
10
|
event: DragEvent;
|
|
11
11
|
fps: number;
|
|
12
12
|
from: number | null;
|
|
13
|
+
localFiles: File[] | null;
|
|
13
14
|
preferCompositionStart: boolean;
|
|
14
15
|
}) => Promise<void>;
|
|
@@ -6,11 +6,11 @@ const drop_handler_data_1 = require("./drop-handler-data");
|
|
|
6
6
|
const element_drag_and_drop_1 = require("./element-drag-and-drop");
|
|
7
7
|
const element_install_request_1 = require("./element-install-request");
|
|
8
8
|
const import_assets_1 = require("./import-assets");
|
|
9
|
-
const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, preferCompositionStart, }) => {
|
|
9
|
+
const handleDrop = async ({ chooseSvgImportMode, compositionFile, compositionId, destinationDimensions, dropPosition, event, fps, from, localFiles, preferCompositionStart, }) => {
|
|
10
10
|
var _a;
|
|
11
11
|
var _b;
|
|
12
|
-
if ((0, drop_handler_data_1.isFileDragEvent)(event)) {
|
|
13
|
-
const files = Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []);
|
|
12
|
+
if (localFiles !== null || (0, drop_handler_data_1.isFileDragEvent)(event)) {
|
|
13
|
+
const files = localFiles !== null && localFiles !== void 0 ? localFiles : Array.from((_b = (_a = event.dataTransfer) === null || _a === void 0 ? void 0 : _a.files) !== null && _b !== void 0 ? _b : []);
|
|
14
14
|
if (files.length === 0) {
|
|
15
15
|
return;
|
|
16
16
|
}
|