@remotion/studio 4.0.290 → 4.0.292

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (81) hide show
  1. package/.turbo/turbo-make.log +2 -2
  2. package/dist/api/get-zod-schema-from-primitive.d.ts +2 -0
  3. package/dist/api/get-zod-schema-from-primitive.js +18 -0
  4. package/dist/api/save-default-props.js +13 -1
  5. package/dist/api/update-default-props.js +1 -1
  6. package/dist/api/use-visual-control.d.ts +7 -0
  7. package/dist/api/use-visual-control.js +57 -0
  8. package/dist/api/use-visual-controls.d.ts +7 -0
  9. package/dist/api/use-visual-controls.js +57 -0
  10. package/dist/api/visual-control.d.ts +2 -0
  11. package/dist/api/visual-control.js +11 -0
  12. package/dist/components/AskAiModal.d.ts +7 -0
  13. package/dist/components/AskAiModal.js +65 -0
  14. package/dist/components/Canvas.d.ts +0 -1
  15. package/dist/components/Canvas.js +2 -2
  16. package/dist/components/CanvasOrLoading.js +1 -1
  17. package/dist/components/EditorContexts.js +2 -1
  18. package/dist/components/GlobalKeybindings.js +14 -0
  19. package/dist/components/GlobalPropsEditorUpdateButton.js +6 -2
  20. package/dist/components/KeyboardShortcutsExplainer.js +1 -1
  21. package/dist/components/ModalContainer.d.ts +1 -0
  22. package/dist/components/ModalContainer.js +2 -2
  23. package/dist/components/ModalHeader.d.ts +1 -0
  24. package/dist/components/ModalHeader.js +2 -2
  25. package/dist/components/Modals.js +2 -1
  26. package/dist/components/OptionsPanel.d.ts +1 -1
  27. package/dist/components/OptionsPanel.js +12 -2
  28. package/dist/components/Preview.d.ts +0 -1
  29. package/dist/components/Preview.js +3 -5
  30. package/dist/components/QuickSwitcher/QuickSwitcherResult.js +1 -1
  31. package/dist/components/RenderModal/DataEditor.js +11 -4
  32. package/dist/components/RenderModal/RenderModalJSONPropsEditor.js +1 -1
  33. package/dist/components/RenderModal/SchemaEditor/Fieldset.d.ts +1 -0
  34. package/dist/components/RenderModal/SchemaEditor/Fieldset.js +5 -5
  35. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +1 -1
  36. package/dist/components/RenderModal/SchemaEditor/ZodArrayEditor.js +1 -1
  37. package/dist/components/RenderModal/SchemaEditor/ZodArrayItemEditor.d.ts +1 -0
  38. package/dist/components/RenderModal/SchemaEditor/ZodArrayItemEditor.js +2 -2
  39. package/dist/components/RenderModal/SchemaEditor/ZodMatrixEditor.d.ts +17 -0
  40. package/dist/components/RenderModal/SchemaEditor/ZodMatrixEditor.js +98 -0
  41. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +6 -0
  42. package/dist/components/RenderModal/SchemaEditor/create-zod-values.js +9 -0
  43. package/dist/components/RenderModal/SchemaEditor/extract-enum-json-paths.d.ts +7 -2
  44. package/dist/components/RenderModal/SchemaEditor/extract-enum-json-paths.js +96 -22
  45. package/dist/components/RenderQueue/actions.d.ts +5 -1
  46. package/dist/components/RenderQueue/actions.js +12 -5
  47. package/dist/components/Tabs/index.js +3 -1
  48. package/dist/components/Timeline/TimelineStack/get-stack.d.ts +1 -1
  49. package/dist/components/Timeline/TimelineStack/get-stack.js +4 -2
  50. package/dist/components/Timeline/TimelineStack/index.js +2 -8
  51. package/dist/components/VisualControls/ClickableFileName.d.ts +13 -0
  52. package/dist/components/VisualControls/ClickableFileName.js +43 -0
  53. package/dist/components/VisualControls/VisualControlHandle.d.ts +6 -0
  54. package/dist/components/VisualControls/VisualControlHandle.js +96 -0
  55. package/dist/components/VisualControls/VisualControlHandleHeader.d.ts +4 -0
  56. package/dist/components/VisualControls/VisualControlHandleHeader.js +9 -0
  57. package/dist/components/VisualControls/VisualControlsContent.d.ts +1 -0
  58. package/dist/components/VisualControls/VisualControlsContent.js +53 -0
  59. package/dist/components/VisualControls/get-original-stack-trace.d.ts +2 -0
  60. package/dist/components/VisualControls/get-original-stack-trace.js +31 -0
  61. package/dist/esm/index.mjs +153 -29
  62. package/dist/esm/internals.mjs +4430 -3644
  63. package/dist/esm/previewEntry.mjs +4520 -3734
  64. package/dist/esm/renderEntry.mjs +4545 -3721
  65. package/dist/helpers/get-location-of-sequence.d.ts +1 -0
  66. package/dist/helpers/get-location-of-sequence.js +18 -1
  67. package/dist/helpers/open-in-editor.d.ts +2 -0
  68. package/dist/helpers/open-in-editor.js +11 -1
  69. package/dist/helpers/retry-payload.js +3 -3
  70. package/dist/helpers/use-menu-structure.js +16 -0
  71. package/dist/index.d.ts +1 -0
  72. package/dist/index.js +3 -1
  73. package/dist/renderEntry.js +5 -5
  74. package/dist/state/z-index.d.ts +1 -0
  75. package/dist/state/z-index.js +13 -5
  76. package/dist/visual-controls/VisualControls.d.ts +29 -0
  77. package/dist/visual-controls/VisualControls.js +123 -0
  78. package/dist/visual-controls/get-current-edited-value.d.ts +5 -0
  79. package/dist/visual-controls/get-current-edited-value.js +9 -0
  80. package/package.json +9 -9
  81. package/tsconfig.tsbuildinfo +0 -1
@@ -1,6 +1,6 @@
1
1
 
2
2
  
3
- > @remotion/studio@4.0.290 make /Users/jonathanburger/remotion/packages/studio
3
+ > @remotion/studio@4.0.292 make /Users/jonathanburger/remotion/packages/studio
4
4
  > tsc -d && bun --env-file=../.env.bundle bundle.ts
5
5
 
6
- [88.33ms] Generated.
6
+ [72.15ms] Generated.
@@ -0,0 +1,2 @@
1
+ import type { ZodType } from '../components/get-zod-if-possible';
2
+ export declare const getZodSchemaFromPrimitive: (value: unknown, z: ZodType) => import("zod").ZodString | import("zod").ZodNumber;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getZodSchemaFromPrimitive = void 0;
4
+ const getZodSchemaFromPrimitive = (value, z) => {
5
+ if (typeof value === 'string') {
6
+ return z.string();
7
+ }
8
+ if (typeof value === 'number') {
9
+ return z.number();
10
+ }
11
+ let stringified;
12
+ try {
13
+ stringified = JSON.stringify(value);
14
+ }
15
+ catch (_a) { }
16
+ throw new Error(`visualControl(): Specify a schema for this value: ${stringified !== null && stringified !== void 0 ? stringified : '[non-serializable value]'}. See https://remotion.dev/docs/studio/visual-control`);
17
+ };
18
+ exports.getZodSchemaFromPrimitive = getZodSchemaFromPrimitive;
@@ -56,8 +56,20 @@ const saveDefaultProps = async ({ compositionId, defaultProps, }) => {
56
56
  throw new Error('"zod" is required to use saveDefaultProps(), but is not installed.');
57
57
  }
58
58
  const z = await Promise.resolve().then(() => __importStar(require('zod')));
59
+ let zodTypes = null;
60
+ try {
61
+ zodTypes = await Promise.resolve().then(() => __importStar(require('@remotion/zod-types')));
62
+ }
63
+ catch (_b) { }
59
64
  const { generatedDefaultProps, composition } = (0, calc_new_props_1.calcNewProps)(compositionId, defaultProps);
60
- const res = await (0, actions_1.callUpdateDefaultPropsApi)(compositionId, generatedDefaultProps, composition.schema ? (0, extract_enum_json_paths_1.extractEnumJsonPaths)(composition.schema, z, []) : []);
65
+ const res = await (0, actions_1.callUpdateDefaultPropsApi)(compositionId, generatedDefaultProps, composition.schema
66
+ ? (0, extract_enum_json_paths_1.extractEnumJsonPaths)({
67
+ schema: composition.schema,
68
+ zodRuntime: z,
69
+ currentPath: [],
70
+ zodTypes,
71
+ })
72
+ : []);
61
73
  if (res.success) {
62
74
  return Promise.resolve();
63
75
  }
@@ -17,7 +17,7 @@ const updateDefaultProps = ({ compositionId, defaultProps, }) => {
17
17
  });
18
18
  window.dispatchEvent(new CustomEvent(remotion_1.Internals.PROPS_UPDATED_EXTERNALLY, {
19
19
  detail: {
20
- resetUnsaved: false,
20
+ resetUnsaved: null,
21
21
  },
22
22
  }));
23
23
  };
@@ -0,0 +1,7 @@
1
+ import type { z } from 'zod';
2
+ type VisualControl = <T>(key: string, value: T, schema?: z.ZodTypeAny) => T;
3
+ type UseVisualControl = {
4
+ visualControl: VisualControl;
5
+ };
6
+ export declare const useVisualControl: () => UseVisualControl;
7
+ export {};
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useVisualControl = void 0;
4
+ const react_1 = require("react");
5
+ const remotion_1 = require("remotion");
6
+ const get_zod_if_possible_1 = require("../components/get-zod-if-possible");
7
+ const VisualControls_1 = require("../visual-controls/VisualControls");
8
+ const get_zod_schema_from_primitive_1 = require("./get-zod-schema-from-primitive");
9
+ const useVisualControl = () => {
10
+ const { addHook, removeHook, setControl, updateHandles } = (0, react_1.useContext)(VisualControls_1.SetVisualControlsContext);
11
+ const changed = (0, react_1.useRef)(false);
12
+ const [stack] = (0, react_1.useState)(() => {
13
+ return new Error().stack;
14
+ });
15
+ const [hook] = (0, react_1.useState)(() => {
16
+ return (0, VisualControls_1.makeHook)(stack);
17
+ });
18
+ (0, react_1.useEffect)(() => {
19
+ if (!(0, remotion_1.getRemotionEnvironment)().isStudio) {
20
+ return;
21
+ }
22
+ addHook(hook);
23
+ }, [addHook, hook]);
24
+ (0, react_1.useEffect)(() => {
25
+ return () => {
26
+ removeHook(hook);
27
+ };
28
+ }, [hook, removeHook]);
29
+ (0, react_1.useEffect)(() => {
30
+ if (changed.current) {
31
+ updateHandles();
32
+ changed.current = false;
33
+ }
34
+ }, [updateHandles]);
35
+ const z = (0, get_zod_if_possible_1.useZodIfPossible)();
36
+ return (0, react_1.useMemo)(() => ({
37
+ visualControl(key, value, schema) {
38
+ if (!(0, remotion_1.getRemotionEnvironment)().isStudio) {
39
+ return value;
40
+ }
41
+ if (!z) {
42
+ return value;
43
+ }
44
+ const { same, currentValue } = setControl(hook, key, {
45
+ valueInCode: value,
46
+ unsavedValue: value,
47
+ schema: schema !== null && schema !== void 0 ? schema : (0, get_zod_schema_from_primitive_1.getZodSchemaFromPrimitive)(value, z),
48
+ stack: new Error().stack,
49
+ });
50
+ if (!same) {
51
+ changed.current = true;
52
+ }
53
+ return currentValue;
54
+ },
55
+ }), [hook, setControl, z]);
56
+ };
57
+ exports.useVisualControl = useVisualControl;
@@ -0,0 +1,7 @@
1
+ import type { z } from 'zod';
2
+ type VisualControl = <T>(key: string, value: T, schema?: z.ZodTypeAny) => T;
3
+ type UseVisualControls = {
4
+ visualControl: VisualControl;
5
+ };
6
+ export declare const useVisualControls: () => UseVisualControls;
7
+ export {};
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.useVisualControls = void 0;
4
+ const react_1 = require("react");
5
+ const remotion_1 = require("remotion");
6
+ const get_zod_if_possible_1 = require("../components/get-zod-if-possible");
7
+ const VisualControls_1 = require("../visual-controls/VisualControls");
8
+ const get_zod_schema_from_primitive_1 = require("./get-zod-schema-from-primitive");
9
+ const useVisualControls = () => {
10
+ const { addHook, removeHook, setControl, updateHandles } = (0, react_1.useContext)(VisualControls_1.SetVisualControlsContext);
11
+ const { handles } = (0, react_1.useContext)(VisualControls_1.VisualControlsContext);
12
+ const changedRef = (0, react_1.useRef)(false);
13
+ const [stack] = (0, react_1.useState)(() => {
14
+ return new Error().stack;
15
+ });
16
+ const [hook] = (0, react_1.useState)(() => {
17
+ return (0, VisualControls_1.makeHook)(stack);
18
+ });
19
+ (0, react_1.useEffect)(() => {
20
+ if (!(0, remotion_1.getRemotionEnvironment)().isStudio) {
21
+ return;
22
+ }
23
+ addHook(hook);
24
+ }, [addHook, hook]);
25
+ (0, react_1.useEffect)(() => {
26
+ return () => {
27
+ removeHook(hook);
28
+ };
29
+ }, [hook, removeHook]);
30
+ (0, react_1.useEffect)(() => {
31
+ if (changedRef.current) {
32
+ updateHandles();
33
+ changedRef.current = false;
34
+ }
35
+ }, [updateHandles]);
36
+ const z = (0, get_zod_if_possible_1.useZodIfPossible)();
37
+ return (0, react_1.useMemo)(() => ({
38
+ visualControl(key, value, schema) {
39
+ if (!(0, remotion_1.getRemotionEnvironment)().isStudio) {
40
+ return value;
41
+ }
42
+ if (!z) {
43
+ return value;
44
+ }
45
+ const { changed, currentValue } = setControl(hook, key, {
46
+ valueInCode: value,
47
+ schema: schema !== null && schema !== void 0 ? schema : (0, get_zod_schema_from_primitive_1.getZodSchemaFromPrimitive)(value, z),
48
+ stack: new Error().stack,
49
+ });
50
+ if (changed) {
51
+ changedRef.current = true;
52
+ }
53
+ return currentValue;
54
+ },
55
+ }), [hook, setControl, handles, z]);
56
+ };
57
+ exports.useVisualControls = useVisualControls;
@@ -0,0 +1,2 @@
1
+ import { type VisualControlRef } from '../visual-controls/VisualControls';
2
+ export declare const visualControl: VisualControlRef['globalVisualControl'];
@@ -0,0 +1,11 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.visualControl = void 0;
4
+ const VisualControls_1 = require("../visual-controls/VisualControls");
5
+ const visualControl = (key, value, schema) => {
6
+ if (!VisualControls_1.visualControlRef.current) {
7
+ throw new Error('visualControlRef is not set');
8
+ }
9
+ return VisualControls_1.visualControlRef.current.globalVisualControl(key, value, schema);
10
+ };
11
+ exports.visualControl = visualControl;
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ type AskAiModalRef = {
3
+ toggle: () => void;
4
+ };
5
+ export declare const askAiModalRef: React.RefObject<AskAiModalRef | null>;
6
+ export declare const AskAiModal: React.FC;
7
+ export {};
@@ -0,0 +1,65 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AskAiModal = exports.askAiModalRef = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ const remotion_1 = require("remotion");
7
+ const ModalContainer_1 = require("./ModalContainer");
8
+ const ModalHeader_1 = require("./ModalHeader");
9
+ const container = {
10
+ height: 'calc(100vh - 100px)',
11
+ width: 'calc(100vw - 160px)',
12
+ maxWidth: 800,
13
+ maxHeight: 900,
14
+ display: 'block',
15
+ };
16
+ exports.askAiModalRef = (0, react_1.createRef)();
17
+ const AskAiModal = () => {
18
+ const [state, setState] = (0, react_1.useState)('never-opened');
19
+ const iframe = (0, react_1.useRef)(null);
20
+ (0, react_1.useImperativeHandle)(exports.askAiModalRef, () => ({
21
+ toggle: () => {
22
+ setState((s) => {
23
+ var _a, _b, _c;
24
+ if (s === 'visible') {
25
+ (_a = iframe.current) === null || _a === void 0 ? void 0 : _a.blur();
26
+ (_c = (_b = iframe.current) === null || _b === void 0 ? void 0 : _b.contentWindow) === null || _c === void 0 ? void 0 : _c.blur();
27
+ }
28
+ return s === 'visible' ? 'hidden' : 'visible';
29
+ });
30
+ },
31
+ }), []);
32
+ (0, react_1.useEffect)(() => {
33
+ const onMessage = (event) => {
34
+ var _a;
35
+ const json = typeof event.data === 'string' ? JSON.parse(event.data) : event.data;
36
+ if (json.type === 'cmd-j') {
37
+ (_a = exports.askAiModalRef.current) === null || _a === void 0 ? void 0 : _a.toggle();
38
+ }
39
+ };
40
+ window.addEventListener('message', onMessage);
41
+ return () => {
42
+ window.removeEventListener('message', onMessage);
43
+ };
44
+ }, []);
45
+ const onQuit = (0, react_1.useCallback)(() => {
46
+ setState('hidden');
47
+ }, [setState]);
48
+ // When re-toggling the modal, focus the text box
49
+ (0, react_1.useEffect)(() => {
50
+ var _a;
51
+ if (!iframe.current) {
52
+ return;
53
+ }
54
+ if (state === 'visible') {
55
+ (_a = iframe.current.contentWindow) === null || _a === void 0 ? void 0 : _a.postMessage({
56
+ type: 'focus',
57
+ }, '*');
58
+ }
59
+ }, [state]);
60
+ if (state === 'never-opened') {
61
+ return null;
62
+ }
63
+ return ((0, jsx_runtime_1.jsx)(remotion_1.AbsoluteFill, { style: { display: state === 'visible' ? 'block' : 'none' }, children: (0, jsx_runtime_1.jsxs)(ModalContainer_1.ModalContainer, { noZIndex: state === 'hidden', onOutsideClick: onQuit, onEscape: onQuit, children: [(0, jsx_runtime_1.jsx)(ModalHeader_1.ModalHeader, { title: "Ask AI", onClose: onQuit }), (0, jsx_runtime_1.jsx)("iframe", { ref: iframe, frameBorder: 0, style: container, src: "https://www.remotion.dev/ai-embed" })] }) }));
64
+ };
65
+ exports.AskAiModal = AskAiModal;
@@ -4,5 +4,4 @@ import type { CanvasContent } from 'remotion';
4
4
  export declare const Canvas: React.FC<{
5
5
  readonly canvasContent: CanvasContent;
6
6
  readonly size: Size;
7
- readonly isRefreshing: boolean;
8
7
  }>;
@@ -34,7 +34,7 @@ const resetZoom = {
34
34
  right: layout_1.SPACING_UNIT * 2,
35
35
  };
36
36
  const ZOOM_PX_FACTOR = 0.003;
37
- const Canvas = ({ canvasContent, size, isRefreshing }) => {
37
+ const Canvas = ({ canvasContent, size }) => {
38
38
  const { setSize, size: previewSize } = (0, react_1.useContext)(remotion_1.Internals.PreviewSizeContext);
39
39
  const { editorZoomGestures } = (0, react_1.useContext)(editor_zoom_gestures_1.EditorZoomGesturesContext);
40
40
  const keybindings = (0, use_keybinding_1.useKeybinding)();
@@ -260,6 +260,6 @@ const Canvas = ({ canvasContent, size, isRefreshing }) => {
260
260
  (0, react_1.useEffect)(() => {
261
261
  fetchMetadata();
262
262
  }, [fetchMetadata]);
263
- return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: canvas_ref_1.canvasRef, style: container, children: [size ? ((0, jsx_runtime_1.jsx)(Preview_1.VideoPreview, { canvasContent: canvasContent, contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, isRefreshing: isRefreshing })) : null, isFit ? null : ((0, jsx_runtime_1.jsx)("div", { style: resetZoom, className: "css-reset", children: (0, jsx_runtime_1.jsx)(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) })), editorShowGuides && canvasContent.type === 'composition' && ((0, jsx_runtime_1.jsx)(EditorGuides_1.default, { canvasSize: size, contentDimensions: contentDimensions, assetMetadata: assetResolution }))] }), areRulersVisible && ((0, jsx_runtime_1.jsx)(EditorRuler_1.EditorRulers, { contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, containerRef: canvas_ref_1.canvasRef }))] }));
263
+ return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsxs)("div", { ref: canvas_ref_1.canvasRef, style: container, children: [size ? ((0, jsx_runtime_1.jsx)(Preview_1.VideoPreview, { canvasContent: canvasContent, contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution })) : null, isFit ? null : ((0, jsx_runtime_1.jsx)("div", { style: resetZoom, className: "css-reset", children: (0, jsx_runtime_1.jsx)(ResetZoomButton_1.ResetZoomButton, { onClick: onReset }) })), editorShowGuides && canvasContent.type === 'composition' && ((0, jsx_runtime_1.jsx)(EditorGuides_1.default, { canvasSize: size, contentDimensions: contentDimensions, assetMetadata: assetResolution }))] }), areRulersVisible && ((0, jsx_runtime_1.jsx)(EditorRuler_1.EditorRulers, { contentDimensions: contentDimensions, canvasSize: size, assetMetadata: assetResolution, containerRef: canvas_ref_1.canvasRef }))] }));
264
264
  };
265
265
  exports.Canvas = Canvas;
@@ -46,7 +46,7 @@ const CanvasOrLoading = ({ size }) => {
46
46
  const compname = window.location.pathname.replace('/', '');
47
47
  return ((0, jsx_runtime_1.jsx)("div", { style: container, className: "css-reset", children: (0, jsx_runtime_1.jsxs)("div", { style: RunningCalculateMetadata_1.loaderLabel, children: ["Composition with ID ", compname, " not found."] }) }));
48
48
  }
49
- const content = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ZoomPersistor_1.ZoomPersistor, {}), (0, jsx_runtime_1.jsx)(Canvas_1.Canvas, { isRefreshing: (resolved === null || resolved === void 0 ? void 0 : resolved.type) === 'success-and-refreshing', size: size, canvasContent: canvasContent }), (resolved === null || resolved === void 0 ? void 0 : resolved.type) === 'success-and-refreshing' ? ((0, jsx_runtime_1.jsx)(RefreshCompositionOverlay_1.RefreshCompositionOverlay, {})) : null] }));
49
+ const content = ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [(0, jsx_runtime_1.jsx)(ZoomPersistor_1.ZoomPersistor, {}), (0, jsx_runtime_1.jsx)(Canvas_1.Canvas, { size: size, canvasContent: canvasContent }), (resolved === null || resolved === void 0 ? void 0 : resolved.type) === 'success-and-refreshing' ? ((0, jsx_runtime_1.jsx)(RefreshCompositionOverlay_1.RefreshCompositionOverlay, {})) : null] }));
50
50
  if (canvasContent.type === 'asset' || canvasContent.type === 'output') {
51
51
  return content;
52
52
  }
@@ -9,6 +9,7 @@ const highest_z_index_1 = require("../state/highest-z-index");
9
9
  const keybindings_1 = require("../state/keybindings");
10
10
  const preview_size_1 = require("../state/preview-size");
11
11
  const sidebar_1 = require("../state/sidebar");
12
+ const VisualControls_1 = require("../visual-controls/VisualControls");
12
13
  const CheckerboardProvider_1 = require("./CheckerboardProvider");
13
14
  const get_zod_if_possible_1 = require("./get-zod-if-possible");
14
15
  const MediaVolumeProvider_1 = require("./MediaVolumeProvider");
@@ -19,6 +20,6 @@ const ShowGuidesProvider_1 = require("./ShowGuidesProvider");
19
20
  const ShowRulersProvider_1 = require("./ShowRulersProvider");
20
21
  const ZoomGesturesProvider_1 = require("./ZoomGesturesProvider");
21
22
  const EditorContexts = ({ children, readOnlyStudio }) => {
22
- return ((0, jsx_runtime_1.jsx)(get_zod_if_possible_1.ZodProvider, { children: (0, jsx_runtime_1.jsx)(client_id_1.PreviewServerConnection, { readOnlyStudio: readOnlyStudio, children: (0, jsx_runtime_1.jsx)(context_1.RenderQueueContextProvider, { children: (0, jsx_runtime_1.jsx)(keybindings_1.KeybindingContextProvider, { children: (0, jsx_runtime_1.jsx)(CheckerboardProvider_1.CheckerboardProvider, { children: (0, jsx_runtime_1.jsx)(ZoomGesturesProvider_1.ZoomGesturesProvider, { children: (0, jsx_runtime_1.jsx)(ShowRulersProvider_1.ShowRulersProvider, { children: (0, jsx_runtime_1.jsx)(ShowGuidesProvider_1.ShowGuidesProvider, { children: (0, jsx_runtime_1.jsx)(preview_size_1.PreviewSizeProvider, { children: (0, jsx_runtime_1.jsx)(ModalsProvider_1.ModalsProvider, { children: (0, jsx_runtime_1.jsx)(MediaVolumeProvider_1.MediaVolumeProvider, { children: (0, jsx_runtime_1.jsx)(player_1.PlayerInternals.PlayerEmitterProvider, { currentPlaybackRate: null, children: (0, jsx_runtime_1.jsx)(sidebar_1.SidebarContextProvider, { children: (0, jsx_runtime_1.jsx)(folders_1.FolderContextProvider, { children: (0, jsx_runtime_1.jsx)(highest_z_index_1.HighestZIndexProvider, { children: (0, jsx_runtime_1.jsx)(SetTimelineInOutProvider_1.SetTimelineInOutProvider, { children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) }));
23
+ return ((0, jsx_runtime_1.jsx)(get_zod_if_possible_1.ZodProvider, { children: (0, jsx_runtime_1.jsx)(VisualControls_1.VisualControlsProvider, { children: (0, jsx_runtime_1.jsx)(client_id_1.PreviewServerConnection, { readOnlyStudio: readOnlyStudio, children: (0, jsx_runtime_1.jsx)(context_1.RenderQueueContextProvider, { children: (0, jsx_runtime_1.jsx)(keybindings_1.KeybindingContextProvider, { children: (0, jsx_runtime_1.jsx)(CheckerboardProvider_1.CheckerboardProvider, { children: (0, jsx_runtime_1.jsx)(ZoomGesturesProvider_1.ZoomGesturesProvider, { children: (0, jsx_runtime_1.jsx)(ShowRulersProvider_1.ShowRulersProvider, { children: (0, jsx_runtime_1.jsx)(ShowGuidesProvider_1.ShowGuidesProvider, { children: (0, jsx_runtime_1.jsx)(preview_size_1.PreviewSizeProvider, { children: (0, jsx_runtime_1.jsx)(ModalsProvider_1.ModalsProvider, { children: (0, jsx_runtime_1.jsx)(MediaVolumeProvider_1.MediaVolumeProvider, { children: (0, jsx_runtime_1.jsx)(player_1.PlayerInternals.PlayerEmitterProvider, { currentPlaybackRate: null, children: (0, jsx_runtime_1.jsx)(sidebar_1.SidebarContextProvider, { children: (0, jsx_runtime_1.jsx)(folders_1.FolderContextProvider, { children: (0, jsx_runtime_1.jsx)(highest_z_index_1.HighestZIndexProvider, { children: (0, jsx_runtime_1.jsx)(SetTimelineInOutProvider_1.SetTimelineInOutProvider, { children: children }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) }) }));
23
24
  };
24
25
  exports.EditorContexts = EditorContexts;
@@ -5,6 +5,7 @@ const react_1 = require("react");
5
5
  const use_keybinding_1 = require("../helpers/use-keybinding");
6
6
  const checkerboard_1 = require("../state/checkerboard");
7
7
  const modals_1 = require("../state/modals");
8
+ const AskAiModal_1 = require("./AskAiModal");
8
9
  const NotificationCenter_1 = require("./Notifications/NotificationCenter");
9
10
  const GlobalKeybindings = () => {
10
11
  const keybindings = (0, use_keybinding_1.useKeybinding)();
@@ -37,6 +38,18 @@ const GlobalKeybindings = () => {
37
38
  commandCtrlKey: true,
38
39
  preventDefault: true,
39
40
  });
41
+ const cmdJKey = keybindings.registerKeybinding({
42
+ event: 'keydown',
43
+ key: 'j',
44
+ callback: () => {
45
+ var _a;
46
+ (_a = AskAiModal_1.askAiModalRef.current) === null || _a === void 0 ? void 0 : _a.toggle();
47
+ },
48
+ triggerIfInputFieldFocused: true,
49
+ keepRegisteredWhenNotHighestContext: true,
50
+ commandCtrlKey: true,
51
+ preventDefault: true,
52
+ });
40
53
  const cKey = keybindings.registerKeybinding({
41
54
  event: 'keypress',
42
55
  key: 't',
@@ -68,6 +81,7 @@ const GlobalKeybindings = () => {
68
81
  cKey.unregister();
69
82
  questionMark.unregister();
70
83
  cmdKKey.unregister();
84
+ cmdJKey.unregister();
71
85
  };
72
86
  }, [keybindings, setCheckerboard, setSelectedModal]);
73
87
  return null;
@@ -64,8 +64,12 @@ const GlobalPropsEditorUpdateButton = ({ compositionId, currentDefaultProps }) =
64
64
  }, [compositionId, currentDefaultProps, fastRefreshes]);
65
65
  const onReset = (0, react_1.useCallback)(() => {
66
66
  window.remotion_ignoreFastRefreshUpdate = null;
67
- window.dispatchEvent(new CustomEvent(remotion_1.Internals.PROPS_UPDATED_EXTERNALLY));
68
- }, []);
67
+ window.dispatchEvent(new CustomEvent(remotion_1.Internals.PROPS_UPDATED_EXTERNALLY, {
68
+ detail: {
69
+ resetUnsaved: compositionId,
70
+ },
71
+ }));
72
+ }, [compositionId]);
69
73
  return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)(SchemaResetButton_1.SchemaResetButton, { onClick: onReset }), (0, jsx_runtime_1.jsx)(SchemaSaveButton_1.SchemaSaveButton, { disabled: disabled, onClick: onClicked })] }));
70
74
  };
71
75
  exports.GlobalPropsEditorUpdateButton = GlobalPropsEditorUpdateButton;
@@ -52,6 +52,6 @@ const li = {
52
52
  fontSize: 14,
53
53
  };
54
54
  const KeyboardShortcutsExplainer = () => {
55
- return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? ((0, jsx_runtime_1.jsxs)("div", { style: keyboardShortcutsDisabled, children: ["Keyboard shortcuts disabled either due to:", (0, jsx_runtime_1.jsxs)("ul", { style: ul, children: [(0, jsx_runtime_1.jsx)("li", { style: li, children: "a) --disable-keyboard-shortcuts being passed" }), (0, jsx_runtime_1.jsx)("li", { style: li, children: "b) Config.setKeyboardShortcutsEnabled(false) being set or" }), (0, jsx_runtime_1.jsx)("li", { style: li, children: " c) a Remotion version mismatch." })] })] })) : null, (0, jsx_runtime_1.jsxs)(layout_1.Row, { style: container, children: [(0, jsx_runtime_1.jsxs)(layout_1.Column, { children: [(0, jsx_runtime_1.jsx)("div", { style: title, children: "Playback" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ShiftIcon, {}) }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ArrowLeft, {}) })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "1 second back" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ArrowLeft, {}) }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Previous frame" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "Space" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Play / Pause" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ArrowRight, {}) }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Next frame" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ShiftIcon, {}) }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ArrowRight, {}) })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "1 second forward" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "A" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Jump to beginning" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "E" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Jump to end" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "J" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Reverse playback" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "K" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Pause" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "L" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Play / Speed up" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "G" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Go to frame" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "Enter" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Pause & return to playback start" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "Sidebar" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "B" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Toggle left sidebar" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "J" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Toggle right sidebar" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "G" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Toggle both sidebars" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "View" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "F" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Enter fullscreen" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "Esc" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Exit fullscreen" })] })] }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 8 }), (0, jsx_runtime_1.jsxs)(layout_1.Column, { children: [(0, jsx_runtime_1.jsx)("div", { style: title, children: "Navigation" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "R" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Render composition" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "T" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Toggle checkerboard background" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "?" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Show keyboard shortcuts" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "K" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Quick Switcher" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "Playback range" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "I" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Set In Point" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "O" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Set Out Point" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "X" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Clear In/Out Points" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "Zoom" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "+" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Zoom in" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "-" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Zoom out" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "0" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Reset zoom" })] }), ' ', (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "Props Editor" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "S" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Save" })] })] })] })] }));
55
+ return ((0, jsx_runtime_1.jsxs)("div", { children: [(0, use_keybinding_1.areKeyboardShortcutsDisabled)() ? ((0, jsx_runtime_1.jsxs)("div", { style: keyboardShortcutsDisabled, children: ["Keyboard shortcuts disabled either due to:", (0, jsx_runtime_1.jsxs)("ul", { style: ul, children: [(0, jsx_runtime_1.jsx)("li", { style: li, children: "a) --disable-keyboard-shortcuts being passed" }), (0, jsx_runtime_1.jsx)("li", { style: li, children: "b) Config.setKeyboardShortcutsEnabled(false) being set or" }), (0, jsx_runtime_1.jsx)("li", { style: li, children: " c) a Remotion version mismatch." })] })] })) : null, (0, jsx_runtime_1.jsxs)(layout_1.Row, { style: container, children: [(0, jsx_runtime_1.jsxs)(layout_1.Column, { children: [(0, jsx_runtime_1.jsx)("div", { style: title, children: "Playback" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ShiftIcon, {}) }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ArrowLeft, {}) })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "1 second back" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ArrowLeft, {}) }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Previous frame" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "Space" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Play / Pause" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ArrowRight, {}) }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Next frame" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ShiftIcon, {}) }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: (0, jsx_runtime_1.jsx)(keys_1.ArrowRight, {}) })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "1 second forward" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "A" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Jump to beginning" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "E" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Jump to end" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "J" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Reverse playback" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "K" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Pause" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "L" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Play / Speed up" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "G" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Go to frame" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "Enter" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Pause & return to playback start" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "Sidebar" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "B" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Toggle left sidebar" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "J" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Toggle right sidebar" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "G" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Toggle both sidebars" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "View" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "F" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Enter fullscreen" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "Esc" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Exit fullscreen" })] })] }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 8 }), (0, jsx_runtime_1.jsxs)(layout_1.Column, { children: [(0, jsx_runtime_1.jsx)("div", { style: title, children: "Navigation" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "R" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Render composition" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "T" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Toggle checkerboard background" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "?" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Show keyboard shortcuts" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "K" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Quick Switcher" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "Playback range" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "I" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Set In Point" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "O" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Set Out Point" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "X" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Clear In/Out Points" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "Zoom" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "+" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Zoom in" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "-" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Zoom out" })] }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsx)("div", { style: left, children: (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "0" }) }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Reset zoom" })] }), ' ', (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "Props Editor" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "S" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Save" })] }), (0, jsx_runtime_1.jsx)("br", {}), (0, jsx_runtime_1.jsx)("div", { style: title, children: "AI" }), (0, jsx_runtime_1.jsxs)(layout_1.Row, { align: "center", children: [(0, jsx_runtime_1.jsxs)("div", { style: left, children: [(0, jsx_runtime_1.jsx)("kbd", { style: key, children: ShortcutHint_1.cmdOrCtrlCharacter }), (0, jsx_runtime_1.jsx)(layout_1.Spacing, { x: 0.3 }), (0, jsx_runtime_1.jsx)("kbd", { style: key, children: "J" })] }), (0, jsx_runtime_1.jsx)("div", { style: right, children: "Ask AI" })] })] })] })] }));
56
56
  };
57
57
  exports.KeyboardShortcutsExplainer = KeyboardShortcutsExplainer;
@@ -5,4 +5,5 @@ export declare const ModalContainer: React.FC<{
5
5
  readonly onEscape: () => void;
6
6
  readonly onOutsideClick: () => void;
7
7
  readonly children: React.ReactNode;
8
+ readonly noZIndex?: boolean;
8
9
  }>;
@@ -28,7 +28,7 @@ const panel = {
28
28
  color: 'white',
29
29
  margin: 'auto',
30
30
  };
31
- const ModalContainer = ({ children, onEscape, onOutsideClick }) => {
32
- return ((0, jsx_runtime_1.jsx)("div", { className: "css-reset", style: backgroundOverlay, role: "dialog", "aria-modal": "true", children: (0, jsx_runtime_1.jsx)(z_index_1.HigherZIndex, { onOutsideClick: onOutsideClick, onEscape: onEscape, children: (0, jsx_runtime_1.jsx)("div", { style: panel, children: children }) }) }));
31
+ const ModalContainer = ({ children, onEscape, onOutsideClick, noZIndex }) => {
32
+ return ((0, jsx_runtime_1.jsx)("div", { className: "css-reset", style: backgroundOverlay, role: "dialog", "aria-modal": "true", children: (0, jsx_runtime_1.jsx)(z_index_1.HigherZIndex, { disabled: noZIndex, onOutsideClick: onOutsideClick, onEscape: onEscape, children: (0, jsx_runtime_1.jsx)("div", { style: panel, children: children }) }) }));
33
33
  };
34
34
  exports.ModalContainer = ModalContainer;
@@ -1,4 +1,5 @@
1
1
  import React from 'react';
2
2
  export declare const ModalHeader: React.FC<{
3
3
  readonly title: string;
4
+ readonly onClose?: () => void;
4
5
  }>;
@@ -22,11 +22,11 @@ const icon = {
22
22
  height: 20,
23
23
  width: 20,
24
24
  };
25
- const ModalHeader = ({ title }) => {
25
+ const ModalHeader = ({ title, onClose }) => {
26
26
  const { setSelectedModal } = (0, react_1.useContext)(modals_1.ModalsContext);
27
27
  const onPress = (0, react_1.useCallback)(() => {
28
28
  setSelectedModal(null);
29
29
  }, [setSelectedModal]);
30
- return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)("div", { style: titleStyle, children: title }), (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)(CancelButton_1.CancelButton, { style: icon, onPress: onPress })] }));
30
+ return ((0, jsx_runtime_1.jsxs)("div", { style: container, children: [(0, jsx_runtime_1.jsx)("div", { style: titleStyle, children: title }), (0, jsx_runtime_1.jsx)(layout_1.Flex, {}), (0, jsx_runtime_1.jsx)(CancelButton_1.CancelButton, { style: icon, onPress: onClose !== null && onClose !== void 0 ? onClose : onPress })] }));
31
31
  };
32
32
  exports.ModalHeader = ModalHeader;
@@ -8,6 +8,7 @@ const jsx_runtime_1 = require("react/jsx-runtime");
8
8
  const react_1 = require("react");
9
9
  const client_id_1 = require("../helpers/client-id");
10
10
  const modals_1 = require("../state/modals");
11
+ const AskAiModal_1 = require("./AskAiModal");
11
12
  const InstallPackage_1 = require("./InstallPackage");
12
13
  const DeleteComposition_1 = require("./NewComposition/DeleteComposition");
13
14
  const DuplicateComposition_1 = require("./NewComposition/DuplicateComposition");
@@ -22,6 +23,6 @@ const Modals = ({ readOnlyStudio }) => {
22
23
  'connected';
23
24
  return ((0, jsx_runtime_1.jsxs)(jsx_runtime_1.Fragment, { children: [modalContextType && modalContextType.type === 'duplicate-comp' && ((0, jsx_runtime_1.jsx)(DuplicateComposition_1.DuplicateComposition, { compositionType: modalContextType.compositionType, compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'delete-comp' && ((0, jsx_runtime_1.jsx)(DeleteComposition_1.DeleteComposition, { compositionId: modalContextType.compositionId })), modalContextType && modalContextType.type === 'rename-comp' && ((0, jsx_runtime_1.jsx)(RenameComposition_1.RenameComposition, { compositionId: modalContextType.compositionId })), modalContextType && canRender && modalContextType.type === 'render' && ((0, jsx_runtime_1.jsx)(RenderModal_1.RenderModalWithLoader, { initialFrame: modalContextType.initialFrame, compositionId: modalContextType.compositionId, initialVideoImageFormat: modalContextType.initialVideoImageFormat, initialJpegQuality: modalContextType.initialJpegQuality, initialScale: modalContextType.initialScale, initialLogLevel: modalContextType.initialLogLevel, initialOffthreadVideoCacheSizeInBytes: modalContextType.initialOffthreadVideoCacheSizeInBytes, initialOffthreadVideoThreads: modalContextType.initialOffthreadVideoThreads, initialConcurrency: modalContextType.initialConcurrency, maxConcurrency: modalContextType.maxConcurrency, minConcurrency: modalContextType.minConcurrency, initialStillImageFormat: modalContextType.initialStillImageFormat, initialMuted: modalContextType.initialMuted, initialEnforceAudioTrack: modalContextType.initialEnforceAudioTrack, initialProResProfile: modalContextType.initialProResProfile, initialx264Preset: modalContextType.initialx264Preset, initialPixelFormat: modalContextType.initialPixelFormat, initialAudioBitrate: modalContextType.initialAudioBitrate, initialVideoBitrate: modalContextType.initialVideoBitrate, initialEveryNthFrame: modalContextType.initialEveryNthFrame, initialNumberOfGifLoops: modalContextType.initialNumberOfGifLoops, initialDelayRenderTimeout: modalContextType.initialDelayRenderTimeout, initialEnvVariables: modalContextType.initialEnvVariables, initialDisableWebSecurity: modalContextType.initialDisableWebSecurity, initialGl: modalContextType.initialOpenGlRenderer, initialHeadless: modalContextType.initialHeadless, initialIgnoreCertificateErrors: modalContextType.initialIgnoreCertificateErrors, initialEncodingBufferSize: modalContextType.initialEncodingBufferSize, initialEncodingMaxRate: modalContextType.initialEncodingMaxRate, initialUserAgent: modalContextType.initialUserAgent, initialColorSpace: modalContextType.initialColorSpace, initialMultiProcessOnLinux: modalContextType.initialMultiProcessOnLinux, initialRepro: modalContextType.initialRepro, initialBeep: modalContextType.initialBeep, initialForSeamlessAacConcatenation: modalContextType.initialForSeamlessAacConcatenation, defaultProps: modalContextType.defaultProps, inFrameMark: modalContextType.inFrameMark, outFrameMark: modalContextType.outFrameMark, defaultConfigurationAudioCodec: modalContextType.defaultConfigurationAudioCodec, defaultConfigurationVideoCodec: modalContextType.defaultConfigurationVideoCodec, renderTypeOfLastRender: modalContextType.renderTypeOfLastRender, defaultMetadata: modalContextType.defaulMetadata, initialHardwareAcceleration: modalContextType.initialHardwareAcceleration, initialChromeMode: modalContextType.initialChromeMode })), modalContextType &&
24
25
  canRender &&
25
- modalContextType.type === 'render-progress' && ((0, jsx_runtime_1.jsx)(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && ((0, jsx_runtime_1.jsx)(UpdateModal_1.UpdateModal, { info: modalContextType.info, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'install-packages' && ((0, jsx_runtime_1.jsx)(InstallPackage_1.InstallPackageModal, { packageManager: modalContextType.packageManager })), modalContextType && modalContextType.type === 'quick-switcher' && ((0, jsx_runtime_1.jsx)(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode }))] }));
26
+ modalContextType.type === 'render-progress' && ((0, jsx_runtime_1.jsx)(RenderStatusModal_1.RenderStatusModal, { jobId: modalContextType.jobId })), modalContextType && modalContextType.type === 'update' && ((0, jsx_runtime_1.jsx)(UpdateModal_1.UpdateModal, { info: modalContextType.info, knownBugs: modalContextType.knownBugs })), modalContextType && modalContextType.type === 'install-packages' && ((0, jsx_runtime_1.jsx)(InstallPackage_1.InstallPackageModal, { packageManager: modalContextType.packageManager })), modalContextType && modalContextType.type === 'quick-switcher' && ((0, jsx_runtime_1.jsx)(QuickSwitcher_1.default, { readOnlyStudio: readOnlyStudio, invocationTimestamp: modalContextType.invocationTimestamp, initialMode: modalContextType.mode })), (0, jsx_runtime_1.jsx)(AskAiModal_1.AskAiModal, {})] }));
26
27
  };
27
28
  exports.Modals = Modals;
@@ -1,5 +1,5 @@
1
1
  import React from 'react';
2
- type OptionsSidebarPanel = 'input-props' | 'renders';
2
+ type OptionsSidebarPanel = 'input-props' | 'renders' | 'visual-controls';
3
3
  export declare const persistSelectedOptionsSidebarPanel: (panel: OptionsSidebarPanel) => void;
4
4
  export declare const optionsSidebarTabs: React.RefObject<{
5
5
  selectRendersPanel: () => void;
@@ -6,12 +6,14 @@ const react_1 = require("react");
6
6
  const remotion_1 = require("remotion");
7
7
  const colors_1 = require("../helpers/colors");
8
8
  const mobile_layout_1 = require("../helpers/mobile-layout");
9
+ const VisualControls_1 = require("../visual-controls/VisualControls");
9
10
  const GlobalPropsEditorUpdateButton_1 = require("./GlobalPropsEditorUpdateButton");
10
11
  const DataEditor_1 = require("./RenderModal/DataEditor");
11
12
  const deep_equal_1 = require("./RenderModal/SchemaEditor/deep-equal");
12
13
  const RenderQueue_1 = require("./RenderQueue");
13
14
  const RendersTab_1 = require("./RendersTab");
14
15
  const Tabs_1 = require("./Tabs");
16
+ const VisualControlsContent_1 = require("./VisualControls/VisualControlsContent");
15
17
  const localStorageKey = 'remotion.sidebarPanel';
16
18
  const getSelectedPanel = (readOnlyStudio) => {
17
19
  if (readOnlyStudio) {
@@ -21,6 +23,9 @@ const getSelectedPanel = (readOnlyStudio) => {
21
23
  if (panel === 'renders') {
22
24
  return 'renders';
23
25
  }
26
+ if (panel === 'visual-controls') {
27
+ return 'visual-controls';
28
+ }
24
29
  return 'input-props';
25
30
  };
26
31
  const tabsContainer = {
@@ -35,6 +40,7 @@ const OptionsPanel = ({ readOnlyStudio }) => {
35
40
  const { props, updateProps, resetUnsaved } = (0, react_1.useContext)(remotion_1.Internals.EditorPropsContext);
36
41
  const [saving, setSaving] = (0, react_1.useState)(false);
37
42
  const isMobileLayout = (0, mobile_layout_1.useMobileLayout)();
43
+ const visualControlsTabActivated = (0, react_1.useContext)(VisualControls_1.VisualControlsTabActivatedContext);
38
44
  const container = (0, react_1.useMemo)(() => ({
39
45
  height: '100%',
40
46
  width: '100%',
@@ -52,6 +58,10 @@ const OptionsPanel = ({ readOnlyStudio }) => {
52
58
  setPanel('renders');
53
59
  (0, exports.persistSelectedOptionsSidebarPanel)('renders');
54
60
  }, []);
61
+ const onVisualControlsSelected = (0, react_1.useCallback)(() => {
62
+ setPanel('visual-controls');
63
+ (0, exports.persistSelectedOptionsSidebarPanel)('visual-controls');
64
+ }, []);
55
65
  (0, react_1.useImperativeHandle)(exports.optionsSidebarTabs, () => {
56
66
  return {
57
67
  selectRendersPanel: () => {
@@ -98,7 +108,7 @@ const OptionsPanel = ({ readOnlyStudio }) => {
98
108
  }, [currentDefaultProps, composition]);
99
109
  const reset = (0, react_1.useCallback)((e) => {
100
110
  if (e.detail.resetUnsaved) {
101
- resetUnsaved();
111
+ resetUnsaved(e.detail.resetUnsaved);
102
112
  }
103
113
  }, [resetUnsaved]);
104
114
  (0, react_1.useEffect)(() => {
@@ -107,6 +117,6 @@ const OptionsPanel = ({ readOnlyStudio }) => {
107
117
  window.removeEventListener(remotion_1.Internals.PROPS_UPDATED_EXTERNALLY, reset);
108
118
  };
109
119
  }, [reset]);
110
- return ((0, jsx_runtime_1.jsxs)("div", { style: container, className: "css-reset", children: [(0, jsx_runtime_1.jsx)("div", { style: tabsContainer, children: (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [composition ? ((0, jsx_runtime_1.jsxs)(Tabs_1.Tab, { selected: panel === 'input-props', onClick: onPropsSelected, style: { justifyContent: 'space-between' }, children: ["Props", unsavedChangesExist ? ((0, jsx_runtime_1.jsx)(GlobalPropsEditorUpdateButton_1.GlobalPropsEditorUpdateButton, { compositionId: composition.id, currentDefaultProps: currentDefaultProps })) : null] })) : null, readOnlyStudio ? null : ((0, jsx_runtime_1.jsx)(RendersTab_1.RendersTab, { onClick: onRendersSelected, selected: panel === 'renders' }))] }) }), panel === `input-props` && composition ? ((0, jsx_runtime_1.jsx)(DataEditor_1.DataEditor, { unresolvedComposition: composition, defaultProps: currentDefaultProps, setDefaultProps: setDefaultProps, mayShowSaveButton: true, propsEditType: "default-props", saving: saving, setSaving: setSaving, readOnlyStudio: readOnlyStudio }, composition.id)) : readOnlyStudio ? null : ((0, jsx_runtime_1.jsx)(RenderQueue_1.RenderQueue, {}))] }));
120
+ return ((0, jsx_runtime_1.jsxs)("div", { style: container, className: "css-reset", children: [(0, jsx_runtime_1.jsx)("div", { style: tabsContainer, children: (0, jsx_runtime_1.jsxs)(Tabs_1.Tabs, { children: [visualControlsTabActivated ? ((0, jsx_runtime_1.jsx)(Tabs_1.Tab, { selected: panel === 'visual-controls', onClick: onVisualControlsSelected, children: "Controls" })) : null, composition ? ((0, jsx_runtime_1.jsxs)(Tabs_1.Tab, { selected: panel === 'input-props', onClick: onPropsSelected, style: { justifyContent: 'space-between' }, children: ["Props", unsavedChangesExist ? ((0, jsx_runtime_1.jsx)(GlobalPropsEditorUpdateButton_1.GlobalPropsEditorUpdateButton, { compositionId: composition.id, currentDefaultProps: currentDefaultProps })) : null] })) : null, readOnlyStudio ? null : ((0, jsx_runtime_1.jsx)(RendersTab_1.RendersTab, { onClick: onRendersSelected, selected: panel === 'renders' }))] }) }), panel === `input-props` && composition ? ((0, jsx_runtime_1.jsx)(DataEditor_1.DataEditor, { unresolvedComposition: composition, defaultProps: currentDefaultProps, setDefaultProps: setDefaultProps, mayShowSaveButton: true, propsEditType: "default-props", saving: saving, setSaving: setSaving, readOnlyStudio: readOnlyStudio }, composition.id)) : panel === 'visual-controls' && visualControlsTabActivated ? ((0, jsx_runtime_1.jsx)(VisualControlsContent_1.VisualControlsContent, {})) : readOnlyStudio ? null : ((0, jsx_runtime_1.jsx)(RenderQueue_1.RenderQueue, {}))] }));
111
121
  };
112
122
  exports.OptionsPanel = OptionsPanel;
@@ -10,5 +10,4 @@ export declare const VideoPreview: React.FC<{
10
10
  readonly contentDimensions: Dimensions | 'none' | null;
11
11
  readonly canvasContent: CanvasContent;
12
12
  readonly assetMetadata: AssetMetadata | null;
13
- readonly isRefreshing: boolean;
14
13
  }>;