@remotion/studio 4.0.178 → 4.0.180

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.
@@ -1,4 +1,4 @@
1
1
 
2
- > @remotion/studio@4.0.177 build /Users/jonathanburger/remotion/packages/studio
2
+ > @remotion/studio@4.0.179 build /Users/jonathanburger/remotion/packages/studio
3
3
  > bun --env-file=../.env.bundle bundle.ts
4
4
 
@@ -10,7 +10,7 @@ const folders_1 = require("../state/folders");
10
10
  const sidebar_1 = require("../state/sidebar");
11
11
  const CompositionSelector_1 = require("./CompositionSelector");
12
12
  const ExplorerPanel_1 = require("./ExplorerPanel");
13
- const ZoomPersistor_1 = require("./ZoomPersistor");
13
+ const load_canvas_content_from_url_1 = require("./load-canvas-content-from-url");
14
14
  const useSelectAsset = () => {
15
15
  const { setCanvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
16
16
  const { setAssetFoldersExpanded } = (0, react_1.useContext)(folders_1.FolderContext);
@@ -73,7 +73,7 @@ const InitialCompositionLoader = () => {
73
73
  if (canvasContent) {
74
74
  return;
75
75
  }
76
- const canvasContentFromUrl = (0, ZoomPersistor_1.deriveCanvasContentFromUrl)();
76
+ const canvasContentFromUrl = (0, load_canvas_content_from_url_1.deriveCanvasContentFromUrl)();
77
77
  if (canvasContentFromUrl && canvasContentFromUrl.type === 'composition') {
78
78
  const exists = compositions.find((c) => c.id === canvasContentFromUrl.compositionId);
79
79
  if (exists) {
@@ -101,7 +101,7 @@ const InitialCompositionLoader = () => {
101
101
  ]);
102
102
  (0, react_1.useEffect)(() => {
103
103
  const onchange = () => {
104
- const newCanvas = (0, ZoomPersistor_1.deriveCanvasContentFromUrl)();
104
+ const newCanvas = (0, load_canvas_content_from_url_1.deriveCanvasContentFromUrl)();
105
105
  if (newCanvas && newCanvas.type === 'composition') {
106
106
  const newComp = (0, url_state_1.getRoute)().substring(1);
107
107
  const exists = compositions.find((c) => c.id === newComp);
@@ -4,6 +4,7 @@ exports.PreviewToolbar = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
+ const check_fullscreen_support_1 = require("../helpers/check-fullscreen-support");
7
8
  const colors_1 = require("../helpers/colors");
8
9
  const is_current_selected_still_1 = require("../helpers/is-current-selected-still");
9
10
  const timeline_layout_1 = require("../helpers/timeline-layout");
@@ -49,7 +50,7 @@ const PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
49
50
  const isVideoComposition = (0, is_current_selected_still_1.useIsVideoComposition)();
50
51
  const isStill = (0, is_current_selected_still_1.useIsStill)();
51
52
  const [loop, setLoop] = (0, react_1.useState)((0, loop_1.loadLoopOption)());
52
- const isFullscreenSupported = document.fullscreenEnabled || document.webkitFullscreenEnabled;
53
+ const isFullscreenSupported = (0, check_fullscreen_support_1.checkFullscreenSupport)();
53
54
  return ((0, jsx_runtime_1.jsxs)("div", { style: container, className: "css-reset", children: [(0, jsx_runtime_1.jsxs)("div", { style: sideContainer, children: [(0, jsx_runtime_1.jsx)("div", { style: padding }), (0, jsx_runtime_1.jsx)(TimelineZoomControls_1.TimelineZoomControls, {})] }), (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)(SizeSelector_1.SizeSelector, {}), isStill || isVideoComposition ? ((0, jsx_runtime_1.jsx)(PlaybackRateSelector_1.PlaybackRateSelector, { setPlaybackRate: setPlaybackRate, playbackRate: playbackRate })) : null, isVideoComposition ? ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), (0, jsx_runtime_1.jsx)(PlayPause_1.PlayPause, { bufferStateDelayInMilliseconds: bufferStateDelayInMilliseconds, loop: loop, playbackRate: playbackRate }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), (0, jsx_runtime_1.jsx)(LoopToggle_1.LoopToggle, { loop: loop, setLoop: setLoop }), (0, jsx_runtime_1.jsx)(MuteToggle_1.MuteToggle, { muted: mediaMuted, setMuted: setMediaMuted }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), (0, jsx_runtime_1.jsx)(TimelineInOutToggle_1.TimelineInOutPointToggle, {}), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 })] })) : null, (0, jsx_runtime_1.jsx)(CheckboardToggle_1.CheckboardToggle, {}), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1 }), isFullscreenSupported && (0, jsx_runtime_1.jsx)(FullscreenToggle_1.FullScreenToggle, {}), (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsxs)("div", { style: sideContainer, children: [(0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)(FpsCounter_1.FpsCounter, { playbackSpeed: playbackRate }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 2 }), readOnlyStudio ? null : (0, jsx_runtime_1.jsx)(RenderButton_1.RenderButton, {}), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 1.5 })] }), (0, jsx_runtime_1.jsx)(PlaybackKeyboardShortcutsManager_1.PlaybackKeyboardShortcutsManager, { setPlaybackRate: setPlaybackRate }), (0, jsx_runtime_1.jsx)(PlaybackRatePersistor_1.PlaybackRatePersistor, {})] }));
54
55
  };
55
56
  exports.PreviewToolbar = PreviewToolbar;
@@ -1,5 +1,3 @@
1
1
  import type React from 'react';
2
- import type { CanvasContent } from 'remotion';
3
2
  export declare const getZoomFromLocalStorage: () => Record<string, number>;
4
- export declare const deriveCanvasContentFromUrl: () => CanvasContent | null;
5
3
  export declare const ZoomPersistor: React.FC;
@@ -1,10 +1,10 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.ZoomPersistor = exports.deriveCanvasContentFromUrl = exports.getZoomFromLocalStorage = void 0;
3
+ exports.ZoomPersistor = exports.getZoomFromLocalStorage = void 0;
4
4
  const react_1 = require("react");
5
5
  const remotion_1 = require("remotion");
6
- const url_state_1 = require("../helpers/url-state");
7
6
  const timeline_zoom_1 = require("../state/timeline-zoom");
7
+ const load_canvas_content_from_url_1 = require("./load-canvas-content-from-url");
8
8
  const makeKey = () => {
9
9
  return `remotion.zoom-map`;
10
10
  };
@@ -16,35 +16,11 @@ const getZoomFromLocalStorage = () => {
16
16
  return zoom ? JSON.parse(zoom) : {};
17
17
  };
18
18
  exports.getZoomFromLocalStorage = getZoomFromLocalStorage;
19
- const deriveCanvasContentFromUrl = () => {
20
- const substrings = (0, url_state_1.getRoute)().split('/').filter(Boolean);
21
- const lastPart = substrings[substrings.length - 1];
22
- if (substrings[0] === 'assets') {
23
- return {
24
- type: 'asset',
25
- asset: decodeURIComponent((0, url_state_1.getRoute)().substring('/assets/'.length)),
26
- };
27
- }
28
- if (substrings[0] === 'outputs') {
29
- return {
30
- type: 'output',
31
- path: decodeURIComponent((0, url_state_1.getRoute)().substring('/outputs/'.length)),
32
- };
33
- }
34
- if (lastPart) {
35
- return {
36
- type: 'composition',
37
- compositionId: lastPart,
38
- };
39
- }
40
- return null;
41
- };
42
- exports.deriveCanvasContentFromUrl = deriveCanvasContentFromUrl;
43
19
  const ZoomPersistor = () => {
44
20
  const [playing] = remotion_1.Internals.Timeline.usePlayingState();
45
21
  const { zoom } = (0, react_1.useContext)(timeline_zoom_1.TimelineZoomCtx);
46
22
  const { canvasContent } = (0, react_1.useContext)(remotion_1.Internals.CompositionManager);
47
- const urlState = (0, exports.deriveCanvasContentFromUrl)();
23
+ const urlState = (0, load_canvas_content_from_url_1.deriveCanvasContentFromUrl)();
48
24
  const isActive = urlState &&
49
25
  urlState.type === 'composition' &&
50
26
  canvasContent &&
@@ -0,0 +1,2 @@
1
+ import type { CanvasContent } from 'remotion';
2
+ export declare const deriveCanvasContentFromUrl: () => CanvasContent | null;
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.deriveCanvasContentFromUrl = void 0;
4
+ const url_state_1 = require("../helpers/url-state");
5
+ const deriveCanvasContentFromUrl = () => {
6
+ const route = (0, url_state_1.getRoute)();
7
+ const substrings = route.split('/').filter(Boolean);
8
+ // CJK-named composition IDs are not automatically reselected after page refresh
9
+ const lastPart = substrings[substrings.length - 1];
10
+ if (substrings[0] === 'assets') {
11
+ return {
12
+ type: 'asset',
13
+ asset: decodeURIComponent(route.substring('/assets/'.length)),
14
+ };
15
+ }
16
+ if (substrings[0] === 'outputs') {
17
+ return {
18
+ type: 'output',
19
+ path: decodeURIComponent(route.substring('/outputs/'.length)),
20
+ };
21
+ }
22
+ if (lastPart) {
23
+ return {
24
+ type: 'composition',
25
+ compositionId: decodeURIComponent(lastPart),
26
+ };
27
+ }
28
+ return null;
29
+ };
30
+ exports.deriveCanvasContentFromUrl = deriveCanvasContentFromUrl;
@@ -0,0 +1 @@
1
+ export declare const handleUploadFile: (file: File, assetPath: string) => Promise<void>;
@@ -0,0 +1,32 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.handleUploadFile = void 0;
4
+ const NotificationCenter_1 = require("./Notifications/NotificationCenter");
5
+ const handleUploadFile = async (file, assetPath) => {
6
+ if (!file) {
7
+ (0, NotificationCenter_1.showNotification)('Please select a file first!', 3000);
8
+ return;
9
+ }
10
+ try {
11
+ const url = new URL('/api/add-asset', window.location.origin);
12
+ url.search = new URLSearchParams({
13
+ folder: assetPath,
14
+ file: file.name,
15
+ }).toString();
16
+ const response = await fetch(url, {
17
+ method: 'POST',
18
+ body: file,
19
+ });
20
+ if (response.ok) {
21
+ (0, NotificationCenter_1.showNotification)(`Added ${file.name} to ${assetPath}`, 3000);
22
+ }
23
+ else {
24
+ const jsonResponse = await response.json();
25
+ (0, NotificationCenter_1.showNotification)(`Upload failed: ${jsonResponse.error}`, 3000);
26
+ }
27
+ }
28
+ catch (error) {
29
+ (0, NotificationCenter_1.showNotification)(`Error during upload: ${error}`, 3000);
30
+ }
31
+ };
32
+ exports.handleUploadFile = handleUploadFile;
@@ -498,40 +498,43 @@ var getRoute = () => {
498
498
  return window.location.pathname;
499
499
  };
500
500
 
501
- // src/components/ZoomPersistor.tsx
502
- var makeKey = () => {
503
- return `remotion.zoom-map`;
504
- };
505
- var persistCurrentZoom = (zoom) => {
506
- localStorage.setItem(makeKey(), JSON.stringify(zoom));
507
- };
508
- var getZoomFromLocalStorage = () => {
509
- const zoom = localStorage.getItem(makeKey());
510
- return zoom ? JSON.parse(zoom) : {};
511
- };
501
+ // src/components/load-canvas-content-from-url.ts
512
502
  var deriveCanvasContentFromUrl = () => {
513
- const substrings = getRoute().split("/").filter(Boolean);
503
+ const route = getRoute();
504
+ const substrings = route.split("/").filter(Boolean);
514
505
  const lastPart = substrings[substrings.length - 1];
515
506
  if (substrings[0] === "assets") {
516
507
  return {
517
508
  type: "asset",
518
- asset: decodeURIComponent(getRoute().substring("/assets/".length))
509
+ asset: decodeURIComponent(route.substring("/assets/".length))
519
510
  };
520
511
  }
521
512
  if (substrings[0] === "outputs") {
522
513
  return {
523
514
  type: "output",
524
- path: decodeURIComponent(getRoute().substring("/outputs/".length))
515
+ path: decodeURIComponent(route.substring("/outputs/".length))
525
516
  };
526
517
  }
527
518
  if (lastPart) {
528
519
  return {
529
520
  type: "composition",
530
- compositionId: lastPart
521
+ compositionId: decodeURIComponent(lastPart)
531
522
  };
532
523
  }
533
524
  return null;
534
525
  };
526
+
527
+ // src/components/ZoomPersistor.tsx
528
+ var makeKey = () => {
529
+ return `remotion.zoom-map`;
530
+ };
531
+ var persistCurrentZoom = (zoom) => {
532
+ localStorage.setItem(makeKey(), JSON.stringify(zoom));
533
+ };
534
+ var getZoomFromLocalStorage = () => {
535
+ const zoom = localStorage.getItem(makeKey());
536
+ return zoom ? JSON.parse(zoom) : {};
537
+ };
535
538
  var ZoomPersistor = () => {
536
539
  const [playing] = Internals2.Timeline.usePlayingState();
537
540
  const { zoom } = useContext2(TimelineZoomCtx);
@@ -6042,6 +6045,11 @@ var EditorZoomGesturesContext = createContext13({
6042
6045
  }
6043
6046
  });
6044
6047
 
6048
+ // src/helpers/check-fullscreen-support.ts
6049
+ var checkFullscreenSupport = () => {
6050
+ return document.fullscreenEnabled || document.webkitFullscreenEnabled;
6051
+ };
6052
+
6045
6053
  // src/helpers/get-git-menu-item.ts
6046
6054
  var getGitSourceName = (gitSource) => {
6047
6055
  if (gitSource.type === "github") {
@@ -6258,7 +6266,7 @@ var useMenuStructure = (closeMenu, readOnlyStudio) => {
6258
6266
  sidebarCollapsedStateRight
6259
6267
  } = useContext18(SidebarContext);
6260
6268
  const sizes = getUniqueSizes(size);
6261
- const isFullscreenSupported = document.fullscreenEnabled || document.webkitFullscreenEnabled;
6269
+ const isFullscreenSupported = checkFullscreenSupport();
6262
6270
  const mobileLayout = useMobileLayout();
6263
6271
  const structure = useMemo36(() => {
6264
6272
  let struct = [
@@ -16856,7 +16864,7 @@ var PreviewToolbar = ({ readOnlyStudio, bufferStateDelayInMilliseconds }) => {
16856
16864
  const isVideoComposition = useIsVideoComposition();
16857
16865
  const isStill = useIsStill();
16858
16866
  const [loop3, setLoop] = useState50(loadLoopOption());
16859
- const isFullscreenSupported = document.fullscreenEnabled || document.webkitFullscreenEnabled;
16867
+ const isFullscreenSupported = checkFullscreenSupport();
16860
16868
  return jsxs76("div", {
16861
16869
  style: container31,
16862
16870
  className: "css-reset",
@@ -0,0 +1 @@
1
+ export declare const checkFullscreenSupport: () => any;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.checkFullscreenSupport = void 0;
4
+ const checkFullscreenSupport = () => {
5
+ return (document.fullscreenEnabled ||
6
+ // @ts-expect-error Types not defined
7
+ document.webkitFullscreenEnabled);
8
+ };
9
+ exports.checkFullscreenSupport = checkFullscreenSupport;
@@ -1,8 +1,2 @@
1
- export declare const envVariablesObjectToArray: (envVariables: Record<string, string>) => [
2
- string,
3
- string
4
- ][];
5
- export declare const envVariablesArrayToObject: (envVariables: [
6
- string,
7
- string
8
- ][]) => Record<string, string>;
1
+ export declare const envVariablesObjectToArray: (envVariables: Record<string, string>) => [string, string][];
2
+ export declare const envVariablesArrayToObject: (envVariables: [string, string][]) => Record<string, string>;
@@ -19,6 +19,7 @@ const editor_rulers_1 = require("../state/editor-rulers");
19
19
  const editor_zoom_gestures_1 = require("../state/editor-zoom-gestures");
20
20
  const modals_1 = require("../state/modals");
21
21
  const sidebar_1 = require("../state/sidebar");
22
+ const check_fullscreen_support_1 = require("./check-fullscreen-support");
22
23
  const client_id_1 = require("./client-id");
23
24
  const get_git_menu_item_1 = require("./get-git-menu-item");
24
25
  const mobile_layout_1 = require("./mobile-layout");
@@ -116,7 +117,7 @@ const useMenuStructure = (closeMenu, readOnlyStudio) => {
116
117
  const { type } = (0, react_1.useContext)(client_id_1.StudioServerConnectionCtx).previewServerState;
117
118
  const { setSidebarCollapsedState, sidebarCollapsedStateLeft, sidebarCollapsedStateRight, } = (0, react_1.useContext)(sidebar_1.SidebarContext);
118
119
  const sizes = (0, SizeSelector_1.getUniqueSizes)(size);
119
- const isFullscreenSupported = document.fullscreenEnabled || document.webkitFullscreenEnabled;
120
+ const isFullscreenSupported = (0, check_fullscreen_support_1.checkFullscreenSupport)();
120
121
  const mobileLayout = (0, mobile_layout_1.useMobileLayout)();
121
122
  const structure = (0, react_1.useMemo)(() => {
122
123
  let struct = [
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/studio"
4
4
  },
5
5
  "name": "@remotion/studio",
6
- "version": "4.0.178",
6
+ "version": "4.0.180",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "sideEffects": false,
@@ -18,18 +18,18 @@
18
18
  "memfs": "3.4.3",
19
19
  "source-map": "0.7.3",
20
20
  "open": "^8.4.2",
21
- "@remotion/player": "4.0.178",
22
- "@remotion/renderer": "4.0.178",
23
- "remotion": "4.0.178",
24
- "@remotion/studio-shared": "4.0.178",
25
- "@remotion/media-utils": "4.0.178"
21
+ "remotion": "4.0.180",
22
+ "@remotion/media-utils": "4.0.180",
23
+ "@remotion/player": "4.0.180",
24
+ "@remotion/studio-shared": "4.0.180",
25
+ "@remotion/renderer": "4.0.180"
26
26
  },
27
27
  "devDependencies": {
28
28
  "react": "18.3.1",
29
29
  "react-dom": "18.3.1",
30
30
  "@types/semver": "^7.3.4",
31
31
  "zod": "3.22.3",
32
- "@remotion/zod-types": "4.0.178"
32
+ "@remotion/zod-types": "4.0.180"
33
33
  },
34
34
  "publishConfig": {
35
35
  "access": "public"