@remotion/studio 4.0.524 → 4.0.526
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/focus-default-props-path.js +7 -1
- package/dist/api/restart-studio.d.ts +1 -1
- package/dist/api/restart-studio.js +1 -1
- package/dist/components/ActionTooltip.d.ts +2 -0
- package/dist/components/ActionTooltip.js +14 -4
- package/dist/components/AgentPrompt.d.ts +6 -0
- package/dist/components/AgentPrompt.js +107 -0
- package/dist/components/AppLaunchButton.js +2 -0
- package/dist/components/AssetFileIcon.js +2 -0
- package/dist/components/AssetSelectorItem.d.ts +1 -23
- package/dist/components/AssetSelectorItem.js +10 -200
- package/dist/components/AssetSelectorModal.d.ts +6 -0
- package/dist/components/AssetSelectorModal.js +174 -0
- package/dist/components/Canvas.js +21 -4
- package/dist/components/CaptionInspector.js +9 -3
- package/dist/components/CheckboardToggle.js +2 -1
- package/dist/{error-overlay/remotion-overlay → components}/CodeFrame.d.ts +2 -0
- package/dist/components/CodeFrame.js +77 -0
- package/dist/components/ColorPicker/AlphaSlider.js +1 -1
- package/dist/components/ColorPicker/HueSlider.js +1 -1
- package/dist/components/ColorPicker/SaturationValueArea.js +1 -1
- package/dist/components/CompositionSelector.js +1 -0
- package/dist/components/CompositionSelectorItem.js +7 -17
- package/dist/components/CurrentAsset.js +5 -4
- package/dist/components/EditorGuides/Guide.js +1 -1
- package/dist/components/ElementInstallConfirmation.js +100 -61
- package/dist/components/FilePreview.js +4 -0
- package/dist/components/FixComputedValueModal.js +64 -96
- package/dist/components/FullscreenToggle.js +1 -1
- package/dist/components/GenerateWithAgentModal.d.ts +9 -0
- package/dist/components/GenerateWithAgentModal.js +39 -0
- package/dist/components/GlobalKeybindings.js +14 -0
- package/dist/components/InlineEditableTitle.js +2 -0
- package/dist/components/InspectorLocationCopy.js +1 -1
- package/dist/components/InspectorOpenInEditor.d.ts +1 -0
- package/dist/components/InspectorOpenInEditor.js +25 -18
- package/dist/components/InspectorPanel/CollapsibleInspectorSection.d.ts +7 -0
- package/dist/components/InspectorPanel/CollapsibleInspectorSection.js +14 -0
- package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.d.ts +1 -1
- package/dist/components/InspectorPanel/CollapsibleInspectorSectionHeader.js +19 -8
- package/dist/components/InspectorPanel/CompositionInspector.js +30 -13
- package/dist/components/InspectorPanel/CompositionInspectorHeader.js +6 -7
- package/dist/components/InspectorPanel/CompositionMetadata.js +4 -0
- package/dist/components/InspectorPanel/ConnectedCompositionsSection.js +6 -12
- package/dist/components/InspectorPanel/ElementLibraryButton.js +2 -0
- package/dist/components/InspectorPanel/GuideInspector.js +2 -3
- package/dist/components/InspectorPanel/KeyframeSettings.js +5 -6
- package/dist/components/InspectorPanel/MultiSequenceInspector.js +2 -1
- package/dist/components/InspectorPanel/SequenceInspectorHeader.js +4 -12
- package/dist/components/InspectorPanel/SequenceSelectionInspector.js +4 -3
- package/dist/components/InspectorPanel/common.d.ts +4 -0
- package/dist/components/InspectorPanel/common.js +14 -2
- package/dist/components/InspectorPanel/styles.d.ts +0 -3
- package/dist/components/InspectorPanel/styles.js +1 -27
- package/dist/components/InspectorPanel/use-composition-actions.d.ts +2 -0
- package/dist/components/InspectorPanel/use-composition-actions.js +15 -0
- package/dist/components/InspectorPanel/use-inspector-section-expanded.d.ts +1 -0
- package/dist/components/InspectorPanel/use-inspector-section-expanded.js +21 -0
- package/dist/components/InspectorSequenceSection.js +61 -43
- package/dist/components/InspectorSourceLocation.js +1 -0
- package/dist/components/KeyboardShortcutsSettings.js +12 -4
- package/dist/components/LoopToggle.js +2 -1
- package/dist/components/LutPreview.d.ts +4 -0
- package/dist/components/LutPreview.js +192 -0
- package/dist/components/Menu/MenuItem.js +1 -2
- package/dist/components/MenuBuildIndicator.js +1 -1
- package/dist/components/MenuCompositionName.js +4 -9
- package/dist/components/Modals.js +4 -6
- package/dist/components/ModelsSettings.js +15 -4
- package/dist/components/MuteToggle.js +2 -1
- package/dist/components/NewComposition/CodemodFooter.js +1 -0
- package/dist/components/NewComposition/DeleteComposition.js +42 -6
- package/dist/components/NewComposition/DeleteFolder.js +1 -0
- package/dist/components/NewComposition/DuplicateComposition.js +5 -0
- package/dist/components/NewComposition/InputDragger.js +2 -2
- package/dist/components/NewComposition/NewFolder.js +29 -2
- package/dist/components/NewComposition/RenameFolder.js +1 -0
- package/dist/components/NewComposition/duplicate-composition-api.d.ts +3 -2
- package/dist/components/NewComposition/duplicate-composition-api.js +9 -2
- package/dist/components/OutlineToggle.js +2 -1
- package/dist/components/PlayPause.js +1 -1
- package/dist/components/Preview.js +0 -3
- package/dist/components/PreviewToolbar.js +3 -6
- package/dist/components/PreviewToolbarOverflowButton.js +2 -1
- package/dist/components/QuickSwitcher/QuickSwitcherContent.js +1 -1
- package/dist/components/QuickSwitcher/QuickSwitcherResult.js +4 -9
- package/dist/components/RenderButton.js +40 -4
- package/dist/components/RenderModal/SchemaEditor/scroll-to-default-props-path.d.ts +1 -0
- package/dist/components/RenderModal/SchemaEditor/scroll-to-default-props-path.js +2 -1
- package/dist/components/RenderModal/WebRenderModal.js +10 -2
- package/dist/components/RenderModal/WebRenderModalBasic.js +1 -1
- package/dist/components/RenderModal/render-modals.js +3 -0
- package/dist/components/RenderQueue/RenderQueueCopyToClipboard.js +1 -1
- package/dist/components/RenderQueue/RenderQueueItemCancelButton.js +1 -1
- package/dist/components/RenderQueue/actions.d.ts +2 -1
- package/dist/components/RenderQueue/actions.js +2 -1
- package/dist/components/RendersTab.js +2 -0
- package/dist/components/RulersAndGuidesToggle.js +2 -1
- package/dist/components/SegmentedButton.d.ts +1 -0
- package/dist/components/SegmentedButton.js +9 -3
- package/dist/components/SelectedOutlineElement.js +22 -6
- package/dist/components/SelectedOutlinePolygon.js +4 -2
- package/dist/components/SettingsButton.js +11 -2
- package/dist/components/SettingsContext.d.ts +8 -0
- package/dist/components/SettingsContext.js +57 -2
- package/dist/components/SettingsModal.d.ts +1 -2
- package/dist/components/SettingsModal.js +27 -6
- package/dist/components/SettingsModalFooter.js +17 -3
- package/dist/components/SidebarCollapserControls.js +1 -1
- package/dist/components/SkillsSettings.d.ts +5 -0
- package/dist/components/SkillsSettings.js +49 -15
- package/dist/components/SnappingToggle.js +2 -1
- package/dist/components/Splitter/SplitterHandle.js +1 -2
- package/dist/components/Tabs/vertical.d.ts +1 -1
- package/dist/components/Tabs/vertical.js +16 -2
- package/dist/components/Timeline/EasingEditorModal.js +2 -2
- package/dist/components/Timeline/Timeline.js +10 -11
- package/dist/components/Timeline/TimelineAssetField.js +178 -9
- package/dist/components/Timeline/TimelineDragHandler.js +1 -2
- package/dist/components/Timeline/TimelineEffectItem.d.ts +1 -0
- package/dist/components/Timeline/TimelineEffectItem.js +2 -2
- package/dist/components/Timeline/TimelineEffectPropItem.d.ts +1 -0
- package/dist/components/Timeline/TimelineEffectPropItem.js +2 -2
- package/dist/components/Timeline/TimelineExpandedRow.js +2 -2
- package/dist/components/Timeline/TimelineHeightContainer.js +11 -1
- package/dist/components/Timeline/TimelineInOutDragHandler.js +1 -2
- package/dist/components/Timeline/TimelineKeyframeControls.js +15 -1
- package/dist/components/Timeline/TimelineLayerChildren.d.ts +3 -3
- package/dist/components/Timeline/TimelineLayerChildren.js +11 -9
- package/dist/components/Timeline/TimelineLayerEye.d.ts +1 -1
- package/dist/components/Timeline/TimelineLayerEye.js +6 -3
- package/dist/components/Timeline/TimelineList.js +9 -3
- package/dist/components/Timeline/TimelineSchemaField.js +10 -7
- package/dist/components/Timeline/TimelineSelection.d.ts +17 -4
- package/dist/components/Timeline/TimelineSelection.js +121 -52
- package/dist/components/Timeline/TimelineSequence.js +8 -8
- package/dist/components/Timeline/TimelineSequenceItem.d.ts +2 -0
- package/dist/components/Timeline/TimelineSequenceItem.js +29 -23
- package/dist/components/Timeline/TimelineSequenceRightEdgeDragHandle.js +3 -12
- package/dist/components/Timeline/TimelineTranslateField.js +25 -12
- package/dist/components/Timeline/TimelineVirtualization.d.ts +3 -3
- package/dist/components/Timeline/TimelineZoomControls.js +1 -1
- package/dist/components/Timeline/get-sequence-context-menu-items.d.ts +3 -1
- package/dist/components/Timeline/get-sequence-context-menu-items.js +152 -51
- package/dist/components/Timeline/normalize-font-weight-for-keyframe.d.ts +1 -0
- package/dist/components/Timeline/normalize-font-weight-for-keyframe.js +19 -0
- package/dist/components/Timeline/timeline-display-groups.d.ts +9 -0
- package/dist/components/Timeline/timeline-display-groups.js +66 -0
- package/dist/components/Timeline/timeline-field-display-utils.js +4 -2
- package/dist/components/Timeline/timeline-translate-utils.d.ts +17 -0
- package/dist/components/Timeline/timeline-translate-utils.js +53 -12
- package/dist/components/Timeline/use-open-sequence-in-apps.d.ts +2 -0
- package/dist/components/Timeline/use-open-sequence-in-apps.js +17 -0
- package/dist/components/Timeline/use-timeline-asset-drop.js +20 -6
- package/dist/components/Timeline/use-timeline-expanded-tree.d.ts +2 -1
- package/dist/components/Timeline/use-timeline-expanded-tree.js +1 -2
- package/dist/components/Timeline/use-timeline-keyframe-drag.js +4 -4
- package/dist/components/TimelineCombobox.js +1 -0
- package/dist/components/UndoRedoButtons.js +11 -0
- package/dist/components/UpdateStatusContext.d.ts +2 -2
- package/dist/components/UpdateStatusContext.js +6 -7
- package/dist/components/UpdatesSettings.js +6 -6
- package/dist/components/WebMcp.js +40 -41
- package/dist/components/asset-context-menu.d.ts +32 -0
- package/dist/components/asset-context-menu.js +242 -0
- package/dist/components/composition-menu-items.d.ts +4 -6
- package/dist/components/composition-menu-items.js +212 -42
- package/dist/components/folder-menu-items.js +44 -0
- package/dist/components/get-open-in-menu-items.d.ts +6 -5
- package/dist/components/get-open-in-menu-items.js +16 -10
- package/dist/components/import-assets.d.ts +24 -1
- package/dist/components/import-assets.js +3 -1
- package/dist/components/keyboard-shortcuts.d.ts +4 -4
- package/dist/components/keyboard-shortcuts.js +5 -0
- package/dist/components/selected-outline-order.js +18 -12
- package/dist/components/use-open-in-menu-apps.d.ts +14 -0
- package/dist/components/use-open-in-menu-apps.js +33 -0
- package/dist/error-overlay/remotion-overlay/ErrorDisplay.js +2 -2
- package/dist/error-overlay/remotion-overlay/OpenInEditor.d.ts +1 -0
- package/dist/error-overlay/remotion-overlay/OpenInEditor.js +3 -3
- package/dist/error-overlay/remotion-overlay/StackFrame.d.ts +5 -1
- package/dist/error-overlay/remotion-overlay/StackFrame.js +26 -19
- package/dist/esm/{LazyModels-hc33szyn.mjs → LazyModels-mtggyjye.mjs} +3 -3
- package/dist/esm/{LazyModels-sg40rjw6.mjs → LazyModels-nk7py0zt.mjs} +3 -3
- package/dist/esm/{TranscriptionModal-3ctnxpt6.mjs → TranscriptionModal-ymnx1c7m.mjs} +6 -6
- package/dist/esm/{VideoMattingModal-b0r7e60n.mjs → VideoMattingModal-05vpczks.mjs} +6 -6
- package/dist/esm/{index-er3mh6em.mjs → index-0gewwxse.mjs} +7031 -5834
- package/dist/esm/{index-q5xv20xx.mjs → index-4dsz9035.mjs} +8 -8
- package/dist/esm/{index-wbmp5srk.mjs → index-5bfxbpca.mjs} +1 -1
- package/dist/esm/{index-e3zwf3e7.mjs → index-5gd8k9yv.mjs} +1 -1
- package/dist/esm/{index-c37kme2v.mjs → index-bs39wngg.mjs} +4929 -3801
- package/dist/esm/{index-yfrysr5f.mjs → index-cdy8v54v.mjs} +17 -3
- package/dist/esm/{index-9qtvmwtx.mjs → index-eb5txqp6.mjs} +12 -9
- package/dist/esm/{index-q2epbw93.mjs → index-f97r9e2g.mjs} +4 -21
- package/dist/esm/{index-2j3d1g81.mjs → index-g7k2dvar.mjs} +1 -1
- package/dist/esm/{index-1b9skrrd.mjs → index-x40wwfmt.mjs} +3 -3
- package/dist/esm/index.mjs +12 -6
- package/dist/esm/internals.mjs +7 -7
- package/dist/esm/previewEntry.mjs +7 -7
- package/dist/helpers/client-id.d.ts +1 -0
- package/dist/helpers/client-id.js +8 -4
- package/dist/helpers/cube-lut.d.ts +12 -0
- package/dist/helpers/cube-lut.js +160 -0
- package/dist/helpers/get-git-menu-item.d.ts +4 -0
- package/dist/helpers/get-git-menu-item.js +8 -1
- package/dist/helpers/get-preview-file-type.d.ts +1 -1
- package/dist/helpers/get-preview-file-type.js +3 -0
- package/dist/helpers/get-sequence-double-click-action.d.ts +3 -3
- package/dist/helpers/get-sequence-double-click-action.js +2 -2
- package/dist/helpers/open-in-editor.d.ts +5 -2
- package/dist/helpers/open-in-editor.js +12 -4
- package/dist/helpers/pointer-session.d.ts +1 -0
- package/dist/helpers/pointer-session.js +10 -1
- package/dist/helpers/settings-tab-availability.d.ts +14 -0
- package/dist/helpers/settings-tab-availability.js +35 -0
- package/dist/helpers/studio-runtime-config.d.ts +1 -1
- package/dist/helpers/use-create-composition.js +5 -0
- package/dist/helpers/use-keybinding.d.ts +1 -1
- package/dist/helpers/use-keyboard-shortcut-label.d.ts +2 -2
- package/dist/helpers/use-media-metadata.js +5 -1
- package/dist/helpers/use-menu-structure.js +21 -13
- package/dist/helpers/use-rename-composition.js +6 -1
- package/dist/icons/lut.d.ts +4 -0
- package/dist/icons/lut.js +6 -0
- package/dist/icons/sparkles.d.ts +4 -0
- package/dist/icons/sparkles.js +6 -0
- package/dist/state/modals.d.ts +25 -3
- package/dist/state/z-index.js +1 -3
- package/package.json +19 -19
- package/dist/error-overlay/remotion-overlay/CodeFrame.js +0 -62
|
@@ -262,7 +262,7 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
|
|
|
262
262
|
axisLocked = nextAxisLocked;
|
|
263
263
|
updateDragOverrides();
|
|
264
264
|
};
|
|
265
|
-
const onPointerUp = (reason) => {
|
|
265
|
+
const onPointerUp = (reason, endEvent) => {
|
|
266
266
|
dragAwareDoubleClick.endPointerGesture(dragStarted);
|
|
267
267
|
window.removeEventListener('keydown', onKeyChange);
|
|
268
268
|
window.removeEventListener('keyup', onKeyChange);
|
|
@@ -277,7 +277,9 @@ const SelectedOutlinePolygonUnmemoized = ({ compositionHeight, compositionWidth,
|
|
|
277
277
|
});
|
|
278
278
|
if (changes.length === 0) {
|
|
279
279
|
(0, selected_outline_drag_1.clearSelectedOutlineDragOverrides)({ clearDragOverrides, dragStates });
|
|
280
|
-
if (deferSelection &&
|
|
280
|
+
if (deferSelection &&
|
|
281
|
+
!dragStarted &&
|
|
282
|
+
(0, pointer_session_1.isPointerSessionRelease)(reason, endEvent)) {
|
|
281
283
|
onSelect(target.selection, interaction);
|
|
282
284
|
}
|
|
283
285
|
return;
|
|
@@ -4,7 +4,9 @@ exports.SettingsButton = void 0;
|
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
|
|
7
|
+
const client_id_1 = require("../helpers/client-id");
|
|
7
8
|
const colors_1 = require("../helpers/colors");
|
|
9
|
+
const settings_tab_availability_1 = require("../helpers/settings-tab-availability");
|
|
8
10
|
const gear_1 = require("../icons/gear");
|
|
9
11
|
const modals_1 = require("../state/modals");
|
|
10
12
|
const ActionTooltip_1 = require("./ActionTooltip");
|
|
@@ -12,11 +14,18 @@ const InlineAction_1 = require("./InlineAction");
|
|
|
12
14
|
const UpdateStatusContext_1 = require("./UpdateStatusContext");
|
|
13
15
|
const SettingsButton = ({ showUpdates }) => {
|
|
14
16
|
const { setSelectedModal } = (0, react_1.useContext)(modals_1.SetSelectedModalContext);
|
|
17
|
+
const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
|
|
15
18
|
const { info, knownBugs } = (0, UpdateStatusContext_1.useUpdateStatus)();
|
|
16
19
|
const updateAvailable = showUpdates &&
|
|
17
20
|
Boolean((info === null || info === void 0 ? void 0 : info.updateAvailable) || (info === null || info === void 0 ? void 0 : info.skillsUpdateAvailable));
|
|
18
21
|
const hasBugfixesAvailable = showUpdates &&
|
|
19
22
|
Boolean((info === null || info === void 0 ? void 0 : info.updateAvailable) && knownBugs && knownBugs.length > 0);
|
|
23
|
+
const isBrowserStudio = (0, browser_studio_operations_1.getBrowserStudioOperations)() !== null;
|
|
24
|
+
const canEditConfig = (0, settings_tab_availability_1.canEditStudioConfig)({
|
|
25
|
+
isBrowserStudio,
|
|
26
|
+
previewServerConnected: previewServerState.type === 'connected',
|
|
27
|
+
readOnlyStudio: window.remotion_isReadOnlyStudio,
|
|
28
|
+
});
|
|
20
29
|
const openModal = (0, react_1.useCallback)(() => {
|
|
21
30
|
var _a;
|
|
22
31
|
var _b;
|
|
@@ -24,12 +33,12 @@ const SettingsButton = ({ showUpdates }) => {
|
|
|
24
33
|
type: 'settings',
|
|
25
34
|
initialTab: updateAvailable
|
|
26
35
|
? 'updates'
|
|
27
|
-
:
|
|
36
|
+
: canEditConfig
|
|
28
37
|
? 'studio'
|
|
29
38
|
: 'shortcuts',
|
|
30
39
|
initialPublicLicenseKey: (_b = (_a = window.remotion_renderDefaults) === null || _a === void 0 ? void 0 : _a.publicLicenseKey) !== null && _b !== void 0 ? _b : null,
|
|
31
40
|
});
|
|
32
|
-
}, [setSelectedModal, updateAvailable]);
|
|
41
|
+
}, [canEditConfig, setSelectedModal, updateAvailable]);
|
|
33
42
|
const renderGearIcon = (0, react_1.useCallback)((color) => {
|
|
34
43
|
return jsx_runtime_1.jsx(gear_1.GearIcon, { color: color, width: 16, height: 16 });
|
|
35
44
|
}, []);
|
|
@@ -1,5 +1,9 @@
|
|
|
1
1
|
import type { GetDefaultCodingAgentInfoResponse, GetDefaultEditorInfoResponse, GetRemotionSkillsInfoResponse, RenderDefaults, StudioRuntimeConfig } from '@remotion/studio-shared';
|
|
2
2
|
import React from 'react';
|
|
3
|
+
type SkillAction = {
|
|
4
|
+
readonly skill: string;
|
|
5
|
+
readonly type: 'installing' | 'removing';
|
|
6
|
+
};
|
|
3
7
|
type SettingsContextValue = {
|
|
4
8
|
readonly codingAgentInfo: GetDefaultCodingAgentInfoResponse | null;
|
|
5
9
|
readonly editorInfo: GetDefaultEditorInfoResponse | null;
|
|
@@ -10,6 +14,10 @@ type SettingsContextValue = {
|
|
|
10
14
|
readonly studioRuntimeConfig: StudioRuntimeConfig | null;
|
|
11
15
|
readonly revision: number;
|
|
12
16
|
readonly setPublicLicenseKey: (publicLicenseKey: string | null) => void;
|
|
17
|
+
readonly installSkill: (skill: string) => Promise<void>;
|
|
18
|
+
readonly removeSkill: (skill: string) => Promise<void>;
|
|
19
|
+
readonly skillAction: SkillAction | null;
|
|
20
|
+
readonly skillActionError: string | null;
|
|
13
21
|
};
|
|
14
22
|
export declare const SettingsProvider: React.FC<{
|
|
15
23
|
readonly children: React.ReactNode;
|
|
@@ -6,6 +6,7 @@ const react_1 = require("react");
|
|
|
6
6
|
const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
|
|
7
7
|
const client_id_1 = require("../helpers/client-id");
|
|
8
8
|
const call_api_1 = require("./call-api");
|
|
9
|
+
const NotificationCenter_1 = require("./Notifications/NotificationCenter");
|
|
9
10
|
const UpdateStatusContext_1 = require("./UpdateStatusContext");
|
|
10
11
|
const SettingsContext = (0, react_1.createContext)(null);
|
|
11
12
|
const SettingsProvider = ({ children }) => {
|
|
@@ -21,6 +22,8 @@ const SettingsProvider = ({ children }) => {
|
|
|
21
22
|
renderDefaults: (_c = window.remotion_renderDefaults) !== null && _c !== void 0 ? _c : null,
|
|
22
23
|
studioRuntimeConfig: (_d = window.remotion_studioConfig) !== null && _d !== void 0 ? _d : null,
|
|
23
24
|
revision: 0,
|
|
25
|
+
skillAction: null,
|
|
26
|
+
skillActionError: null,
|
|
24
27
|
});
|
|
25
28
|
(0, react_1.useEffect)(() => {
|
|
26
29
|
if (previewServerState.type !== 'connected' ||
|
|
@@ -108,9 +111,61 @@ const SettingsProvider = ({ children }) => {
|
|
|
108
111
|
};
|
|
109
112
|
});
|
|
110
113
|
}, []);
|
|
114
|
+
const installSkill = (0, react_1.useCallback)(async (skill) => {
|
|
115
|
+
setSettings((currentSettings) => ({
|
|
116
|
+
...currentSettings,
|
|
117
|
+
skillAction: { skill, type: 'installing' },
|
|
118
|
+
skillActionError: null,
|
|
119
|
+
}));
|
|
120
|
+
try {
|
|
121
|
+
const remotionSkillsInfo = await (0, call_api_1.callApi)('/api/install-remotion-skill', {
|
|
122
|
+
skill,
|
|
123
|
+
});
|
|
124
|
+
setSettings((currentSettings) => ({
|
|
125
|
+
...currentSettings,
|
|
126
|
+
remotionSkillsInfo,
|
|
127
|
+
skillAction: null,
|
|
128
|
+
revision: currentSettings.revision + 1,
|
|
129
|
+
}));
|
|
130
|
+
(0, NotificationCenter_1.showNotification)(`Installed ${skill}.`, 5000);
|
|
131
|
+
}
|
|
132
|
+
catch (err) {
|
|
133
|
+
setSettings((currentSettings) => ({
|
|
134
|
+
...currentSettings,
|
|
135
|
+
skillAction: null,
|
|
136
|
+
skillActionError: err.message,
|
|
137
|
+
}));
|
|
138
|
+
}
|
|
139
|
+
}, []);
|
|
140
|
+
const removeSkill = (0, react_1.useCallback)(async (skill) => {
|
|
141
|
+
setSettings((currentSettings) => ({
|
|
142
|
+
...currentSettings,
|
|
143
|
+
skillAction: { skill, type: 'removing' },
|
|
144
|
+
skillActionError: null,
|
|
145
|
+
}));
|
|
146
|
+
try {
|
|
147
|
+
const remotionSkillsInfo = await (0, call_api_1.callApi)('/api/remove-remotion-skill', {
|
|
148
|
+
skill,
|
|
149
|
+
});
|
|
150
|
+
setSettings((currentSettings) => ({
|
|
151
|
+
...currentSettings,
|
|
152
|
+
remotionSkillsInfo,
|
|
153
|
+
skillAction: null,
|
|
154
|
+
revision: currentSettings.revision + 1,
|
|
155
|
+
}));
|
|
156
|
+
(0, NotificationCenter_1.showNotification)(`Removed ${skill}.`, 5000);
|
|
157
|
+
}
|
|
158
|
+
catch (err) {
|
|
159
|
+
setSettings((currentSettings) => ({
|
|
160
|
+
...currentSettings,
|
|
161
|
+
skillAction: null,
|
|
162
|
+
skillActionError: err.message,
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
}, []);
|
|
111
166
|
const value = (0, react_1.useMemo)(() => {
|
|
112
|
-
return { ...settings, setPublicLicenseKey };
|
|
113
|
-
}, [setPublicLicenseKey, settings]);
|
|
167
|
+
return { ...settings, setPublicLicenseKey, installSkill, removeSkill };
|
|
168
|
+
}, [installSkill, removeSkill, setPublicLicenseKey, settings]);
|
|
114
169
|
return (jsx_runtime_1.jsx(SettingsContext.Provider, { value: value, children: jsx_runtime_1.jsx(UpdateStatusContext_1.UpdateStatusProvider, { children: children }) }));
|
|
115
170
|
};
|
|
116
171
|
exports.SettingsProvider = SettingsProvider;
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
|
-
type SettingsTab
|
|
2
|
+
import { type SettingsTab } from '../helpers/settings-tab-availability';
|
|
3
3
|
export declare const SettingsModal: React.FC<{
|
|
4
4
|
readonly initialTab: SettingsTab;
|
|
5
5
|
readonly initialPublicLicenseKey: string | null;
|
|
6
6
|
}>;
|
|
7
|
-
export {};
|
|
@@ -6,6 +6,7 @@ const react_1 = require("react");
|
|
|
6
6
|
const browser_studio_operations_1 = require("../helpers/browser-studio-operations");
|
|
7
7
|
const can_show_updates_1 = require("../helpers/can-show-updates");
|
|
8
8
|
const client_id_1 = require("../helpers/client-id");
|
|
9
|
+
const settings_tab_availability_1 = require("../helpers/settings-tab-availability");
|
|
9
10
|
const apps_1 = require("../icons/apps");
|
|
10
11
|
const cloud_download_1 = require("../icons/cloud-download");
|
|
11
12
|
const keyboard_1 = require("../icons/keyboard");
|
|
@@ -77,8 +78,20 @@ const SettingsModal = ({ initialPublicLicenseKey, initialTab }) => {
|
|
|
77
78
|
const packageManager = window.remotion_packageManager === 'unknown'
|
|
78
79
|
? null
|
|
79
80
|
: window.remotion_packageManager;
|
|
80
|
-
const
|
|
81
|
-
const
|
|
81
|
+
const previewServerConnected = previewServerState.type === 'connected';
|
|
82
|
+
const canEditConfig = (0, settings_tab_availability_1.canEditStudioConfig)({
|
|
83
|
+
isBrowserStudio,
|
|
84
|
+
previewServerConnected,
|
|
85
|
+
readOnlyStudio: window.remotion_isReadOnlyStudio,
|
|
86
|
+
});
|
|
87
|
+
const availableTabs = (0, react_1.useMemo)(() => (0, settings_tab_availability_1.getAvailableSettingsTabs)({
|
|
88
|
+
isBrowserStudio,
|
|
89
|
+
packageManagerAvailable: packageManager !== null,
|
|
90
|
+
previewServerConnected,
|
|
91
|
+
readOnlyStudio: window.remotion_isReadOnlyStudio,
|
|
92
|
+
showUpdates,
|
|
93
|
+
}), [isBrowserStudio, packageManager, previewServerConnected, showUpdates]);
|
|
94
|
+
const safeInitialTab = (0, settings_tab_availability_1.getSafeSettingsTab)(initialTab, availableTabs);
|
|
82
95
|
const [tab, setTab] = (0, react_1.useState)(safeInitialTab);
|
|
83
96
|
const [openedTabs, setOpenedTabs] = (0, react_1.useState)([safeInitialTab]);
|
|
84
97
|
const [packagesFooterContainer, setPackagesFooterContainer] = (0, react_1.useState)(null);
|
|
@@ -95,15 +108,23 @@ const SettingsModal = ({ initialPublicLicenseKey, initialTab }) => {
|
|
|
95
108
|
});
|
|
96
109
|
}, []);
|
|
97
110
|
(0, react_1.useLayoutEffect)(() => {
|
|
98
|
-
|
|
99
|
-
|
|
111
|
+
const safeTab = (0, settings_tab_availability_1.getSafeSettingsTab)(tab, availableTabs);
|
|
112
|
+
if (safeTab !== tab) {
|
|
113
|
+
selectTab(safeTab);
|
|
100
114
|
}
|
|
101
|
-
}, [
|
|
115
|
+
}, [availableTabs, selectTab, tab]);
|
|
102
116
|
(0, react_1.useEffect)(() => {
|
|
103
117
|
setPublicLicenseKey(initialPublicLicenseKey);
|
|
104
118
|
}, [initialPublicLicenseKey, setPublicLicenseKey]);
|
|
105
119
|
return (jsx_runtime_1.jsx(DismissableModal_1.DismissableModal, { panelStyle: render_modals_1.outerModalStyle, children: jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
|
|
106
120
|
jsx_runtime_1.jsx(ModalHeader_1.ModalHeader, { title: "Settings", onClose: dismiss }), jsx_runtime_1.jsxs("div", { style: render_modals_1.horizontalLayout, children: [
|
|
107
|
-
jsx_runtime_1.jsxs("div", { style: settingsLeftSidebar, children: [
|
|
121
|
+
jsx_runtime_1.jsxs("div", { style: settingsLeftSidebar, children: [availableTabs.includes('studio') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'studio', onClick: () => selectTab('studio'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(remotion_triangle_1.RemotionTriangleIcon, { color: color, style: render_modals_1.icon }) })), children: "Studio" })) : null, availableTabs.includes('rendering') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'rendering', onClick: () => selectTab('rendering'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(video_1.FilmIcon, { color: color, style: render_modals_1.icon }) })), children: "Defaults" })) : null, jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'shortcuts', onClick: () => selectTab('shortcuts'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(keyboard_1.KeyboardIcon, { color: color, style: keyboardIcon }) })), children: "Shortcuts" }), availableTabs.includes('packages') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'packages', onClick: () => selectTab('packages'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(package_1.PackageIcon, { color: color, style: render_modals_1.icon }) })), children: "Packages" })) : null, availableTabs.includes('skills') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'skills', onClick: () => selectTab('skills'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(skills_1.SkillsIcon, { color: color, style: skillsIcon }) })), children: "Skills" })) : null, availableTabs.includes('models') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'models', onClick: () => selectTab('models'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(models_1.ModelsIcon, { color: color, style: render_modals_1.icon }) })), children: "Models" })) : null, availableTabs.includes('apps') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'apps', onClick: () => selectTab('apps'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(apps_1.AppsIcon, { color: color, style: appsIcon }) })), children: "Apps" })) : null, availableTabs.includes('license') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'license', onClick: () => selectTab('license'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(license_1.LicenseIcon, { color: color, style: render_modals_1.icon }) })), children: "License" })) : null, availableTabs.includes('updates') ? (jsx_runtime_1.jsx(vertical_1.VerticalTab, { style: render_modals_1.horizontalTab, selected: tab === 'updates', onClick: () => selectTab('updates'), renderIcon: (color) => (jsx_runtime_1.jsx("div", { style: render_modals_1.iconContainer, children: jsx_runtime_1.jsx(cloud_download_1.CloudDownloadIcon, { color: color, style: render_modals_1.icon }) })), children: "Updates" })) : null] }), availableTabs.includes('packages') &&
|
|
122
|
+
openedTabs.includes('packages') ? (jsx_runtime_1.jsx("div", { style: tab === 'packages' ? render_modals_1.optionsPanel : hiddenPanel, children: jsx_runtime_1.jsx(InstallPackage_1.InstallPackageSettings, { footerContainer: packagesFooterContainer, packageManager: packageManager }) })) : null, availableTabs.includes('apps') && openedTabs.includes('apps') ? (jsx_runtime_1.jsx("div", { style: tab === 'apps' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureDefaultEditorModal_1.DefaultEditorSettings, {}) })) : null, availableTabs.includes('models') && openedTabs.includes('models') ? (jsx_runtime_1.jsx("div", { style: tab === 'models' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ModelsSettings_1.ModelsSettings, {}) })) : null, availableTabs.includes('license') &&
|
|
123
|
+
openedTabs.includes('license') ? (jsx_runtime_1.jsx("div", { style: tab === 'license' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(ConfigureLicenseModal_1.LicenseSettings, {}) })) : null, availableTabs.includes('skills') && openedTabs.includes('skills') ? (jsx_runtime_1.jsx("div", { style: tab === 'skills' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(SkillsSettings_1.SkillsSettings, {}) })) : null, openedTabs.includes('shortcuts') ? (jsx_runtime_1.jsx("div", { style: tab === 'shortcuts' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(KeyboardShortcutsSettings_1.KeyboardShortcutsSettings, {}) })) : null, availableTabs.includes('rendering') &&
|
|
124
|
+
openedTabs.includes('rendering') ? (jsx_runtime_1.jsx("div", { style: tab === 'rendering' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(RenderingSettings_1.RenderingSettings, {}) })) : null, availableTabs.includes('studio') && openedTabs.includes('studio') ? (jsx_runtime_1.jsx("div", { style: tab === 'studio' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(StudioSettings_1.StudioSettings, {}) })) : null, availableTabs.includes('updates') &&
|
|
125
|
+
openedTabs.includes('updates') ? (jsx_runtime_1.jsx("div", { style: tab === 'updates' ? settingsOptionsPanel : hiddenPanel, className: is_menu_item_1.VERTICAL_SCROLLBAR_CLASSNAME, children: jsx_runtime_1.jsx(UpdatesSettings_1.UpdatesSettings, {}) })) : null] }), tab === 'packages' ? (jsx_runtime_1.jsx("div", { ref: setPackagesFooterContainer })) : !canEditConfig ||
|
|
126
|
+
tab === 'models' ||
|
|
127
|
+
tab === 'updates' ||
|
|
128
|
+
tab === 'skills' ? null : (jsx_runtime_1.jsx(SettingsModalFooter_1.SettingsModalFooter, { showLicenseFaq: tab === 'license' }))] }) }));
|
|
108
129
|
};
|
|
109
130
|
exports.SettingsModal = SettingsModal;
|
|
@@ -3,17 +3,22 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.SettingsModalFooter = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
|
+
const restart_studio_1 = require("../api/restart-studio");
|
|
7
|
+
const client_id_1 = require("../helpers/client-id");
|
|
6
8
|
const colors_1 = require("../helpers/colors");
|
|
7
9
|
const InspectorOpenInEditor_1 = require("./InspectorOpenInEditor");
|
|
8
10
|
const common_1 = require("./InspectorPanel/common");
|
|
9
11
|
const layout_1 = require("./layout");
|
|
12
|
+
const ModalButton_1 = require("./ModalButton");
|
|
10
13
|
const ModalFooter_1 = require("./ModalFooter");
|
|
14
|
+
const NotificationCenter_1 = require("./Notifications/NotificationCenter");
|
|
11
15
|
const footer = {
|
|
12
16
|
flex: 'none',
|
|
13
17
|
};
|
|
14
18
|
const footerRow = {
|
|
15
19
|
alignItems: 'center',
|
|
16
20
|
display: 'flex',
|
|
21
|
+
height: 28,
|
|
17
22
|
justifyContent: 'space-between',
|
|
18
23
|
};
|
|
19
24
|
const configFileHint = {
|
|
@@ -40,6 +45,8 @@ const externalLinkIndicator = {
|
|
|
40
45
|
width: 12,
|
|
41
46
|
};
|
|
42
47
|
const SettingsModalFooter = ({ showLicenseFaq }) => {
|
|
48
|
+
const { restartRequired } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
|
|
49
|
+
const [restarting, setRestarting] = (0, react_1.useState)(false);
|
|
43
50
|
const configFileLocation = (0, react_1.useMemo)(() => {
|
|
44
51
|
return {
|
|
45
52
|
source: 'remotion.config.ts',
|
|
@@ -50,10 +57,17 @@ const SettingsModalFooter = ({ showLicenseFaq }) => {
|
|
|
50
57
|
const openLicenseFaq = (0, react_1.useCallback)(() => {
|
|
51
58
|
window.open('https://www.remotion.dev/docs/license/faq', '_blank', 'noopener,noreferrer');
|
|
52
59
|
}, []);
|
|
60
|
+
const restart = (0, react_1.useCallback)(() => {
|
|
61
|
+
setRestarting(true);
|
|
62
|
+
(0, restart_studio_1.restartStudio)().catch((error) => {
|
|
63
|
+
setRestarting(false);
|
|
64
|
+
(0, NotificationCenter_1.showNotification)(`Could not restart Studio: ${error.message}`, 4000);
|
|
65
|
+
});
|
|
66
|
+
}, []);
|
|
53
67
|
return (jsx_runtime_1.jsx(ModalFooter_1.ModalFooterContainer, { style: footer, children: jsx_runtime_1.jsxs("div", { style: footerRow, children: [
|
|
54
|
-
jsx_runtime_1.
|
|
55
|
-
|
|
56
|
-
|
|
68
|
+
jsx_runtime_1.jsx("div", { style: configFileHint, children: restartRequired ? ('Restart the server to apply changes') : (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: ["Changes save to",
|
|
69
|
+
jsx_runtime_1.jsx(layout_1.Spacing, { x: 0.5 }), jsx_runtime_1.jsx(InspectorOpenInEditor_1.InspectorOpenInEditor, { locationType: null, location: configFileLocation, label: jsx_runtime_1.jsx("strong", { style: configFileName, children: "remotion.config.ts" }), showTooltips: false })
|
|
70
|
+
] })) }), restartRequired ? (jsx_runtime_1.jsx(ModalButton_1.ModalButton, { disabled: restarting, onClick: restart, size: "compact", title: "Restart Studio to apply config file changes", children: restarting ? 'Restarting...' : 'Restart Studio' })) : showLicenseFaq ? (jsx_runtime_1.jsxs(common_1.InspectorQuickAction, { disabled: false, onClick: openLicenseFaq, style: { flex: 'none', width: 'fit-content' }, title: "Open the Remotion License FAQ in a new tab", children: ["License FAQ",
|
|
57
71
|
jsx_runtime_1.jsx("svg", { "aria-hidden": "true", viewBox: "0 0 16 16", style: externalLinkIndicator, children: jsx_runtime_1.jsx("path", { d: "M4 12 12 4M6 4h6v6", fill: "none", stroke: colors_1.CURRENT_COLOR, strokeLinecap: "round", strokeLinejoin: "round", strokeWidth: "1.5" }) })
|
|
58
72
|
] })) : null] }) }));
|
|
59
73
|
};
|
|
@@ -143,6 +143,6 @@ const SidebarCollapserControl = ({ side }) => {
|
|
|
143
143
|
const toggleRightAction = (0, react_1.useCallback)((color) => {
|
|
144
144
|
return (jsx_runtime_1.jsx("div", { "data-sidebar-toggle": "right", style: colorStyle(color), children: jsx_runtime_1.jsx("div", { style: rightIcon(color) }) }));
|
|
145
145
|
}, [colorStyle, rightIcon]);
|
|
146
|
-
return (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: label, shortcut: shortcutsDisabled ? null : shortcut, delay: 800, dismissOnClick: true, children: jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: side === 'left' ? toggleLeft : toggleRight, renderAction: side === 'left' ? toggleLeftAction : toggleRightAction, style: side === 'left' ? { marginRight: 4 } : undefined, "aria-label": label, "aria-expanded": expanded, "aria-keyshortcuts": shortcutsDisabled ? undefined : ariaShortcut || undefined }) }));
|
|
146
|
+
return (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: label, shortcut: shortcutsDisabled ? null : shortcut, delay: 800, dismissOnClick: true, children: jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: side === 'left' ? toggleLeft : toggleRight, renderAction: side === 'left' ? toggleLeftAction : toggleRightAction, unhoveredColor: colors_1.WHITE_ALPHA_80, style: side === 'left' ? { marginRight: 4 } : undefined, "aria-label": label, "aria-expanded": expanded, "aria-keyshortcuts": shortcutsDisabled ? undefined : ariaShortcut || undefined }) }));
|
|
147
147
|
};
|
|
148
148
|
exports.SidebarCollapserControl = SidebarCollapserControl;
|
|
@@ -1,2 +1,7 @@
|
|
|
1
|
+
import type { GetRemotionSkillsInfoResponse } from '@remotion/studio-shared';
|
|
1
2
|
import React from 'react';
|
|
3
|
+
export declare const SkillSettingsRow: React.FC<{
|
|
4
|
+
readonly isLast: boolean;
|
|
5
|
+
readonly skill: GetRemotionSkillsInfoResponse['skills'][number];
|
|
6
|
+
}>;
|
|
2
7
|
export declare const SkillsSettings: React.FC;
|
|
@@ -1,17 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.SkillsSettings = void 0;
|
|
3
|
+
exports.SkillsSettings = exports.SkillSettingsRow = void 0;
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
|
+
const client_id_1 = require("../helpers/client-id");
|
|
6
7
|
const colors_1 = require("../helpers/colors");
|
|
7
8
|
const copy_text_1 = require("../helpers/copy-text");
|
|
8
9
|
const use_copy_feedback_1 = require("../helpers/use-copy-feedback");
|
|
9
10
|
const check_circle_filled_1 = require("../icons/check-circle-filled");
|
|
11
|
+
const cloud_download_1 = require("../icons/cloud-download");
|
|
10
12
|
const copy_1 = require("../icons/copy");
|
|
13
|
+
const trash_1 = require("../icons/trash");
|
|
11
14
|
const InlineAction_1 = require("./InlineAction");
|
|
12
15
|
const ValidationMessage_1 = require("./NewComposition/ValidationMessage");
|
|
13
16
|
const NotificationCenter_1 = require("./Notifications/NotificationCenter");
|
|
14
17
|
const SettingsContext_1 = require("./SettingsContext");
|
|
18
|
+
const Spinner_1 = require("./Spinner");
|
|
15
19
|
const INSTALL_COMMAND = 'npx remotion skills add';
|
|
16
20
|
const container = {
|
|
17
21
|
alignSelf: 'flex-start',
|
|
@@ -87,13 +91,54 @@ const status = {
|
|
|
87
91
|
lineHeight: 1.4,
|
|
88
92
|
whiteSpace: 'nowrap',
|
|
89
93
|
};
|
|
94
|
+
const actionIcon = {
|
|
95
|
+
height: 14,
|
|
96
|
+
width: 14,
|
|
97
|
+
};
|
|
98
|
+
const actionSlot = {
|
|
99
|
+
alignItems: 'center',
|
|
100
|
+
display: 'inline-flex',
|
|
101
|
+
flexShrink: 0,
|
|
102
|
+
height: 24,
|
|
103
|
+
justifyContent: 'center',
|
|
104
|
+
width: 24,
|
|
105
|
+
};
|
|
90
106
|
const loading = {
|
|
91
107
|
...description,
|
|
92
108
|
marginTop: 14,
|
|
93
109
|
};
|
|
110
|
+
const SkillSettingsRow = ({ isLast, skill }) => {
|
|
111
|
+
const { installSkill, removeSkill, skillAction } = (0, SettingsContext_1.useSettings)();
|
|
112
|
+
const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
|
|
113
|
+
const canInstall = !window.remotion_isReadOnlyStudio &&
|
|
114
|
+
previewServerState.type === 'connected';
|
|
115
|
+
const installed = skill.installedInProject || skill.installedGlobally;
|
|
116
|
+
const processingThisSkill = (skillAction === null || skillAction === void 0 ? void 0 : skillAction.skill) === skill.name;
|
|
117
|
+
const installedLocation = skill.installedInProject && skill.installedGlobally
|
|
118
|
+
? 'Project and global'
|
|
119
|
+
: skill.installedInProject
|
|
120
|
+
? 'Project'
|
|
121
|
+
: skill.installedGlobally
|
|
122
|
+
? 'Global'
|
|
123
|
+
: null;
|
|
124
|
+
const renderInstallAction = (0, react_1.useCallback)((color) => {
|
|
125
|
+
return jsx_runtime_1.jsx(cloud_download_1.CloudDownloadIcon, { color: color, style: actionIcon });
|
|
126
|
+
}, []);
|
|
127
|
+
const renderRemoveAction = (0, react_1.useCallback)((color) => {
|
|
128
|
+
return jsx_runtime_1.jsx(trash_1.TrashIcon, { color: color, style: actionIcon });
|
|
129
|
+
}, []);
|
|
130
|
+
return (jsx_runtime_1.jsxs("div", { role: "listitem", style: isLast ? lastSkillRow : skillRow, children: [
|
|
131
|
+
jsx_runtime_1.jsxs("span", { style: skillName, children: ["/", skill.name] }), processingThisSkill ? (jsx_runtime_1.jsx("span", { style: status, children: skillAction.type === 'installing' ? 'Installing…' : 'Removing…' })) : installedLocation ? (jsx_runtime_1.jsx("span", { style: status, children: installedLocation })) : null, installed ? (jsx_runtime_1.jsx(check_circle_filled_1.CheckCircleFilled, { "aria-hidden": true, style: { ...statusIcon, fill: colors_1.BLUE } })) : null, processingThisSkill ? (jsx_runtime_1.jsx("span", { style: actionSlot, children: jsx_runtime_1.jsx(Spinner_1.Spinner, { duration: 0.5, size: 14 }) })) : installed && canInstall ? (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { title: skill.installedInProject
|
|
132
|
+
? `Remove ${skill.name} from this project`
|
|
133
|
+
: `Remove ${skill.name} globally`, disabled: skillAction !== null, onClick: () => removeSkill(skill.name), renderAction: renderRemoveAction, variant: null })) : canInstall ? (jsx_runtime_1.jsx(InlineAction_1.InlineAction, { title: `Install ${skill.name} in this project`, disabled: skillAction !== null, onClick: () => installSkill(skill.name), renderAction: renderInstallAction, variant: null })) : null] }));
|
|
134
|
+
};
|
|
135
|
+
exports.SkillSettingsRow = SkillSettingsRow;
|
|
94
136
|
const SkillsSettings = () => {
|
|
95
137
|
var _a;
|
|
96
|
-
const { error, remotionSkillsInfo } = (0, SettingsContext_1.useSettings)();
|
|
138
|
+
const { error, remotionSkillsInfo, skillActionError } = (0, SettingsContext_1.useSettings)();
|
|
139
|
+
const { previewServerState } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx);
|
|
140
|
+
const canInstall = !window.remotion_isReadOnlyStudio &&
|
|
141
|
+
previewServerState.type === 'connected';
|
|
97
142
|
const { copied, markCopied } = (0, use_copy_feedback_1.useCopyFeedback)();
|
|
98
143
|
const installedSkills = (0, react_1.useMemo)(() => {
|
|
99
144
|
var _a;
|
|
@@ -110,23 +155,12 @@ const SkillsSettings = () => {
|
|
|
110
155
|
const renderCopyAction = (0, react_1.useCallback)((color) => {
|
|
111
156
|
return jsx_runtime_1.jsx(copy_1.CopyIcon, { copied: copied, color: color, style: copyIcon });
|
|
112
157
|
}, [copied]);
|
|
113
|
-
return (jsx_runtime_1.jsxs("div", { style: container, children: [remotionSkillsInfo === null && error === null ? (jsx_runtime_1.jsx("p", { style: loading, children: "Checking installed skills..." })) : null, remotionSkillsInfo === null && error ? (jsx_runtime_1.jsx("div", { style: { marginTop: 14 }, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { message: error, align: "flex-start", type: "error" }) })) : null, missingSkills > 0 ? (jsx_runtime_1.jsxs("div", { children: [
|
|
158
|
+
return (jsx_runtime_1.jsxs("div", { style: container, children: [remotionSkillsInfo === null && error === null ? (jsx_runtime_1.jsx("p", { style: loading, children: "Checking installed skills..." })) : null, remotionSkillsInfo === null && error ? (jsx_runtime_1.jsx("div", { style: { marginTop: 14 }, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { message: error, align: "flex-start", type: "error" }) })) : null, missingSkills > 0 && canInstall ? (jsx_runtime_1.jsx("p", { style: description, children: "Install skills in this project to use them with your coding agent." })) : null, skillActionError ? (jsx_runtime_1.jsx("div", { style: { marginTop: 14 }, children: jsx_runtime_1.jsx(ValidationMessage_1.ValidationMessage, { message: skillActionError, align: "flex-start", type: "error" }) })) : null, missingSkills > 0 && !canInstall ? (jsx_runtime_1.jsxs("div", { children: [
|
|
114
159
|
jsx_runtime_1.jsx("p", { style: description, children: "Not all skills are installed. Run this command in the project directory, then reload Studio and restart your coding agent." }), jsx_runtime_1.jsxs("div", { style: commandField, children: [
|
|
115
160
|
jsx_runtime_1.jsx("pre", { style: command, children: INSTALL_COMMAND }), jsx_runtime_1.jsx(InlineAction_1.InlineAction, { variant: null, onClick: onCopy, renderAction: renderCopyAction, title: "Copy install command" })
|
|
116
161
|
] })
|
|
117
162
|
] })) : null, remotionSkillsInfo ? (jsx_runtime_1.jsx("div", { style: list, role: "list", "aria-label": "Remotion Agent Skills", children: remotionSkillsInfo.skills.map((skill, index) => {
|
|
118
|
-
|
|
119
|
-
const installedLocation = skill.installedInProject && skill.installedGlobally
|
|
120
|
-
? 'Project and global'
|
|
121
|
-
: skill.installedInProject
|
|
122
|
-
? 'Project'
|
|
123
|
-
: skill.installedGlobally
|
|
124
|
-
? 'Global'
|
|
125
|
-
: 'Not installed';
|
|
126
|
-
return (jsx_runtime_1.jsxs("div", { role: "listitem", style: index === remotionSkillsInfo.skills.length - 1
|
|
127
|
-
? lastSkillRow
|
|
128
|
-
: skillRow, children: [
|
|
129
|
-
jsx_runtime_1.jsxs("span", { style: skillName, children: ["/", skill.name] }), jsx_runtime_1.jsx("span", { style: status, children: installedLocation }), installed ? (jsx_runtime_1.jsx(check_circle_filled_1.CheckCircleFilled, { "aria-hidden": true, style: { ...statusIcon, fill: colors_1.BLUE } })) : null] }, skill.name));
|
|
163
|
+
return (jsx_runtime_1.jsx(exports.SkillSettingsRow, { isLast: index === remotionSkillsInfo.skills.length - 1, skill: skill }, skill.name));
|
|
130
164
|
}) })) : null] }));
|
|
131
165
|
};
|
|
132
166
|
exports.SkillsSettings = SkillsSettings;
|
|
@@ -10,6 +10,7 @@ const magnet_1 = require("../icons/magnet");
|
|
|
10
10
|
const editor_snapping_1 = require("../state/editor-snapping");
|
|
11
11
|
const ActionTooltip_1 = require("./ActionTooltip");
|
|
12
12
|
const ControlButton_1 = require("./ControlButton");
|
|
13
|
+
const buttonStyle = { width: 26 };
|
|
13
14
|
const SnappingToggle = () => {
|
|
14
15
|
const { editorSnapping, setEditorSnapping } = (0, react_1.useContext)(editor_snapping_1.EditorSnappingContext);
|
|
15
16
|
const onClick = (0, react_1.useCallback)(() => {
|
|
@@ -21,6 +22,6 @@ const SnappingToggle = () => {
|
|
|
21
22
|
? 'Disable snapping'
|
|
22
23
|
: 'Enable snapping';
|
|
23
24
|
const shortcutsDisabled = (0, use_keybinding_1.areKeyboardShortcutsDisabled)();
|
|
24
|
-
return (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label:
|
|
25
|
+
return (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: "Snapping", shortcut: shortcutsDisabled ? null : shortcut, delay: 800, dismissOnClick: false, children: jsx_runtime_1.jsx(ControlButton_1.ControlButton, { title: "", "aria-label": accessibilityLabel, "aria-pressed": editorSnapping, "aria-keyshortcuts": shortcutsDisabled ? undefined : ariaKeyShortcuts || undefined, onClick: onClick, style: buttonStyle, children: (color) => (jsx_runtime_1.jsx(magnet_1.MagnetIcon, { style: { width: 18, height: 18, transform: 'translateY(1px)' }, color: editorSnapping ? colors_1.BLUE : color, "aria-hidden": "true", focusable: "false" })) }) }));
|
|
25
26
|
};
|
|
26
27
|
exports.SnappingToggle = SnappingToggle;
|
|
@@ -116,8 +116,7 @@ const SplitterHandle = ({ allowToCollapse, onCollapse, onCollapseDuringDrag }) =
|
|
|
116
116
|
onMove: onPointerMove,
|
|
117
117
|
onEnd: (reason, endEvent) => {
|
|
118
118
|
var _a, _b;
|
|
119
|
-
if ((
|
|
120
|
-
endEvent) {
|
|
119
|
+
if ((0, pointer_session_1.isPointerSessionRelease)(reason, endEvent)) {
|
|
121
120
|
lastFlex = getNewValue(endEvent, true);
|
|
122
121
|
lastCollapsedSide = getCollapsedSide(endEvent);
|
|
123
122
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import React from 'react';
|
|
2
2
|
export declare const VerticalTab: React.FC<{
|
|
3
|
-
readonly children:
|
|
3
|
+
readonly children: string;
|
|
4
4
|
readonly onClick: React.MouseEventHandler<HTMLButtonElement>;
|
|
5
5
|
readonly renderIcon?: (color: string) => React.ReactNode;
|
|
6
6
|
readonly style?: React.CSSProperties;
|
|
@@ -4,7 +4,10 @@ exports.VerticalTab = void 0;
|
|
|
4
4
|
const jsx_runtime_1 = require("react/jsx-runtime");
|
|
5
5
|
const react_1 = require("react");
|
|
6
6
|
const colors_1 = require("../../helpers/colors");
|
|
7
|
+
const use_breakpoint_1 = require("../../helpers/use-breakpoint");
|
|
7
8
|
const z_index_1 = require("../../state/z-index");
|
|
9
|
+
const ActionTooltip_1 = require("../ActionTooltip");
|
|
10
|
+
const compactTabBreakpoint = 700;
|
|
8
11
|
const selectorButton = {
|
|
9
12
|
border: 'none',
|
|
10
13
|
flex: 1,
|
|
@@ -19,9 +22,15 @@ const selectorButton = {
|
|
|
19
22
|
userSelect: 'none',
|
|
20
23
|
WebkitUserSelect: 'none',
|
|
21
24
|
};
|
|
25
|
+
const compactSelectorButton = {
|
|
26
|
+
width: 42,
|
|
27
|
+
paddingLeft: 12,
|
|
28
|
+
paddingRight: 4,
|
|
29
|
+
};
|
|
22
30
|
const VerticalTab = ({ children, onClick, renderIcon, style, selected, autoFocus }) => {
|
|
23
31
|
const [hovered, setHovered] = (0, react_1.useState)(false);
|
|
24
32
|
const { tabIndex } = (0, z_index_1.useZIndex)();
|
|
33
|
+
const isCompact = (0, use_breakpoint_1.useBreakpoint)(compactTabBreakpoint);
|
|
25
34
|
const onPointerEnter = (0, react_1.useCallback)(() => {
|
|
26
35
|
setHovered(true);
|
|
27
36
|
}, []);
|
|
@@ -36,8 +45,13 @@ const VerticalTab = ({ children, onClick, renderIcon, style, selected, autoFocus
|
|
|
36
45
|
color,
|
|
37
46
|
boxShadow: 'none',
|
|
38
47
|
...style,
|
|
48
|
+
...(isCompact ? compactSelectorButton : null),
|
|
39
49
|
};
|
|
40
|
-
}, [color, hovered, selected, style]);
|
|
41
|
-
|
|
50
|
+
}, [color, hovered, isCompact, selected, style]);
|
|
51
|
+
const button = (jsx_runtime_1.jsxs("button", { "aria-label": children, autoFocus: autoFocus, style: definiteStyle, type: "button", onClick: onClick, tabIndex: tabIndex, onPointerLeave: onPointerLeave, onPointerEnter: onPointerEnter, children: [renderIcon ? renderIcon(color) : null, isCompact ? null : children] }));
|
|
52
|
+
if (!isCompact) {
|
|
53
|
+
return button;
|
|
54
|
+
}
|
|
55
|
+
return (jsx_runtime_1.jsx(ActionTooltip_1.ActionTooltip, { label: children, shortcut: null, delay: 800, dismissOnClick: true, side: "right", children: button }));
|
|
42
56
|
};
|
|
43
57
|
exports.VerticalTab = VerticalTab;
|
|
@@ -687,8 +687,8 @@ const EasingEditor = ({ state, renderHeader }) => {
|
|
|
687
687
|
onMove: (moveEvent) => {
|
|
688
688
|
updateHandleFromPointer(handle, moveEvent);
|
|
689
689
|
},
|
|
690
|
-
onEnd: (reason) => {
|
|
691
|
-
if (
|
|
690
|
+
onEnd: (reason, endEvent) => {
|
|
691
|
+
if ((0, pointer_session_1.isPointerSessionRelease)(reason, endEvent)) {
|
|
692
692
|
commitEasing(serializeBezier(bezierRef.current), liveOverrideVersionRef.current);
|
|
693
693
|
}
|
|
694
694
|
else {
|
|
@@ -47,7 +47,6 @@ const interactivity_enabled_1 = require("../../helpers/interactivity-enabled");
|
|
|
47
47
|
const is_current_selected_still_1 = require("../../helpers/is-current-selected-still");
|
|
48
48
|
const open_in_editor_1 = require("../../helpers/open-in-editor");
|
|
49
49
|
const studio_runtime_config_1 = require("../../helpers/studio-runtime-config");
|
|
50
|
-
const timeline_node_path_key_1 = require("../../helpers/timeline-node-path-key");
|
|
51
50
|
const use_sync_external_store_1 = require("../../helpers/use-sync-external-store");
|
|
52
51
|
const call_api_1 = require("../call-api");
|
|
53
52
|
const ContextMenu_1 = require("../ContextMenu");
|
|
@@ -62,6 +61,7 @@ const should_show_track_in_timeline_1 = require("./should-show-track-in-timeline
|
|
|
62
61
|
const should_subscribe_to_sequence_props_1 = require("./should-subscribe-to-sequence-props");
|
|
63
62
|
const SubscribeToNodePaths_1 = require("./SubscribeToNodePaths");
|
|
64
63
|
const timeline_asset_drop_context_1 = require("./timeline-asset-drop-context");
|
|
64
|
+
const timeline_display_groups_1 = require("./timeline-display-groups");
|
|
65
65
|
const timeline_refs_1 = require("./timeline-refs");
|
|
66
66
|
const TimelineDragHandler_1 = require("./TimelineDragHandler");
|
|
67
67
|
const TimelineHeightContainer_1 = require("./TimelineHeightContainer");
|
|
@@ -248,11 +248,11 @@ const TimelineInner = () => {
|
|
|
248
248
|
if (videoConfigIsNull) {
|
|
249
249
|
return [];
|
|
250
250
|
}
|
|
251
|
-
return (0, calculate_timeline_1.calculateTimeline)({
|
|
251
|
+
return (0, timeline_display_groups_1.addTimelineDisplayGroups)((0, calculate_timeline_1.calculateTimeline)({
|
|
252
252
|
sequences,
|
|
253
253
|
overrideIdsToNodePaths: overrideIdToNodePathMappings,
|
|
254
254
|
compositions,
|
|
255
|
-
});
|
|
255
|
+
}));
|
|
256
256
|
}, [
|
|
257
257
|
sequences,
|
|
258
258
|
videoConfigIsNull,
|
|
@@ -277,16 +277,15 @@ const TimelineInner = () => {
|
|
|
277
277
|
// Keep `filtered` complete so a future toggle can show every programmatic
|
|
278
278
|
// instance without recalculating the timeline or losing its instance index.
|
|
279
279
|
const collapsed = (0, react_1.useMemo)(() => {
|
|
280
|
-
const
|
|
280
|
+
const seenDisplayGroups = new Set();
|
|
281
281
|
return filtered.filter((track) => {
|
|
282
|
-
if (track.
|
|
282
|
+
if (track.displayGroup === null) {
|
|
283
283
|
return true;
|
|
284
284
|
}
|
|
285
|
-
|
|
286
|
-
if (seenNodePaths.has(key)) {
|
|
285
|
+
if (seenDisplayGroups.has(track.displayGroup.key)) {
|
|
287
286
|
return false;
|
|
288
287
|
}
|
|
289
|
-
|
|
288
|
+
seenDisplayGroups.add(track.displayGroup.key);
|
|
290
289
|
return true;
|
|
291
290
|
});
|
|
292
291
|
}, [filtered]);
|
|
@@ -294,7 +293,7 @@ const TimelineInner = () => {
|
|
|
294
293
|
const pendingInsertedElementSelection = (0, use_sync_external_store_1.useSyncExternalStore)(inserted_element_selection_1.subscribeToInsertedElementSelection, inserted_element_selection_1.getInsertedElementSelection, inserted_element_selection_1.getInsertedElementSelection);
|
|
295
294
|
const { fastRefreshes } = (0, react_1.useContext)(fast_refresh_context_1.FastRefreshContext);
|
|
296
295
|
const pendingSelectionStart = (0, react_1.useRef)(null);
|
|
297
|
-
const
|
|
296
|
+
const currentSelection = (0, TimelineSelection_1.useCurrentTimelineSelectionStateAsRef)();
|
|
298
297
|
(0, react_1.useLayoutEffect)(() => {
|
|
299
298
|
var _a;
|
|
300
299
|
if (pendingInsertedElementSelection === null) {
|
|
@@ -342,17 +341,17 @@ const TimelineInner = () => {
|
|
|
342
341
|
if (insertedTrack.nodePathInfo === null) {
|
|
343
342
|
return;
|
|
344
343
|
}
|
|
345
|
-
selectItems([{ type: 'sequence', nodePathInfo: insertedTrack.nodePathInfo }], { reveal: true });
|
|
344
|
+
currentSelection.current.selectItems([{ type: 'sequence', nodePathInfo: insertedTrack.nodePathInfo }], { reveal: true });
|
|
346
345
|
(0, inserted_element_selection_1.clearInsertedElementSelection)(pendingInsertedElementSelection);
|
|
347
346
|
if (pendingInsertedElementSelection.notification !== null) {
|
|
348
347
|
(0, NotificationCenter_1.showNotification)(pendingInsertedElementSelection.notification, 3000);
|
|
349
348
|
}
|
|
350
349
|
}, [
|
|
351
350
|
canvasContent,
|
|
351
|
+
currentSelection,
|
|
352
352
|
fastRefreshes,
|
|
353
353
|
layerChildrenValue,
|
|
354
354
|
pendingInsertedElementSelection,
|
|
355
|
-
selectItems,
|
|
356
355
|
timeline,
|
|
357
356
|
]);
|
|
358
357
|
const maxTimelineTracks = (0, studio_runtime_config_1.getStudioMaxTimelineTracks)();
|