@remotion/studio 4.0.507 → 4.0.508

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 (130) hide show
  1. package/dist/FastRefreshProvider.js +13 -9
  2. package/dist/components/CodingAgentIcon.d.ts +3 -1
  3. package/dist/components/CodingAgentIcon.js +4 -9
  4. package/dist/components/ConfigureDefaultEditorModal.js +1 -1
  5. package/dist/components/ContextMenu.d.ts +1 -0
  6. package/dist/components/ContextMenu.js +32 -5
  7. package/dist/components/EditorContent.js +4 -3
  8. package/dist/components/InlineAction.d.ts +2 -1
  9. package/dist/components/InlineAction.js +3 -3
  10. package/dist/components/InspectorLocationCopy.js +1 -1
  11. package/dist/components/InspectorOpenInEditor.d.ts +1 -0
  12. package/dist/components/InspectorOpenInEditor.js +44 -3
  13. package/dist/components/InspectorPanel/AlignmentControls.js +2 -2
  14. package/dist/components/InspectorPanel/CompositionInspector.js +3 -1
  15. package/dist/components/InspectorPanel/styles.js +1 -1
  16. package/dist/components/InspectorSequenceSection.js +36 -4
  17. package/dist/components/MenuBuildIndicator.js +1 -1
  18. package/dist/components/PlayPause.d.ts +1 -1
  19. package/dist/components/PlayPause.js +61 -12
  20. package/dist/components/RenderButton.js +16 -12
  21. package/dist/components/RenderModal/GuiRenderStatus.js +23 -6
  22. package/dist/components/RenderModal/InfoBubble.d.ts +1 -0
  23. package/dist/components/RenderModal/InfoBubble.js +6 -4
  24. package/dist/components/RenderModal/InfoTooltip.d.ts +1 -0
  25. package/dist/components/RenderModal/InfoTooltip.js +12 -12
  26. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.d.ts +5 -0
  27. package/dist/components/RenderModal/SchemaEditor/SchemaLabel.js +16 -3
  28. package/dist/components/RenderModal/SchemaEditor/ZodArrayEditor.js +1 -1
  29. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.d.ts +2 -0
  30. package/dist/components/RenderModal/SchemaEditor/ZodBooleanEditor.js +3 -2
  31. package/dist/components/RenderModal/SchemaEditor/ZodColorEditor.js +1 -1
  32. package/dist/components/RenderModal/SchemaEditor/ZodDateEditor.js +1 -1
  33. package/dist/components/RenderModal/SchemaEditor/ZodDiscriminatedUnionEditor.js +2 -1
  34. package/dist/components/RenderModal/SchemaEditor/ZodEnumEditor.js +1 -1
  35. package/dist/components/RenderModal/SchemaEditor/ZodMatrixEditor.js +1 -1
  36. package/dist/components/RenderModal/SchemaEditor/ZodNonEditableValue.js +1 -1
  37. package/dist/components/RenderModal/SchemaEditor/ZodNumberEditor.js +1 -1
  38. package/dist/components/RenderModal/SchemaEditor/ZodObjectEditor.js +1 -1
  39. package/dist/components/RenderModal/SchemaEditor/ZodOrNullishEditor.js +6 -1
  40. package/dist/components/RenderModal/SchemaEditor/ZodStaticFileEditor.js +1 -1
  41. package/dist/components/RenderModal/SchemaEditor/ZodStringEditor.js +1 -1
  42. package/dist/components/RenderModal/SchemaEditor/ZodSwitch.js +1 -1
  43. package/dist/components/RenderModal/SchemaEditor/ZodTextareaEditor.js +1 -1
  44. package/dist/components/RenderModal/SchemaEditor/ZodTupleEditor.js +1 -1
  45. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.d.ts +1 -0
  46. package/dist/components/RenderModal/SchemaEditor/zod-schema-type.js +12 -1
  47. package/dist/components/SelectedOutlineCanvasRotation.d.ts +9 -0
  48. package/dist/components/SelectedOutlineCanvasRotation.js +237 -0
  49. package/dist/components/SelectedOutlineElement.d.ts +2 -1
  50. package/dist/components/SelectedOutlineElement.js +36 -5
  51. package/dist/components/SelectedOutlineOverlay.d.ts +1 -1
  52. package/dist/components/SelectedOutlineOverlay.js +55 -26
  53. package/dist/components/SelectedOutlinePolygon.d.ts +1 -0
  54. package/dist/components/SelectedOutlinePolygon.js +4 -3
  55. package/dist/components/SelectedOutlineRenderer.d.ts +1 -0
  56. package/dist/components/SelectedOutlineRenderer.js +24 -7
  57. package/dist/components/SelectedOutlineRotationCornerHandle.d.ts +1 -0
  58. package/dist/components/SelectedOutlineRotationCornerHandle.js +7 -5
  59. package/dist/components/SelectedOutlineScaleEdgeLine.d.ts +1 -0
  60. package/dist/components/SelectedOutlineScaleEdgeLine.js +9 -5
  61. package/dist/components/SelectedOutlineTransformOriginHandle.js +48 -22
  62. package/dist/components/SequencePropsSubscriptionProvider.js +8 -0
  63. package/dist/components/SettingsModalFooter.js +1 -1
  64. package/dist/components/Timeline/SequencePropsObserver.js +97 -1
  65. package/dist/components/Timeline/SubscribeToNodePaths.js +4 -2
  66. package/dist/components/Timeline/TimelineEffectItem.js +1 -4
  67. package/dist/components/Timeline/TimelineFieldRowContent.js +10 -3
  68. package/dist/components/Timeline/TimelineRotationField.js +84 -12
  69. package/dist/components/Timeline/TimelineScaleField.js +58 -4
  70. package/dist/components/Timeline/TimelineSelection.d.ts +4 -0
  71. package/dist/components/Timeline/TimelineSelection.js +45 -2
  72. package/dist/components/Timeline/TimelineSequenceItem.js +42 -1
  73. package/dist/components/Timeline/TimelineSequencePropItem.js +5 -2
  74. package/dist/components/Timeline/TimelineTransformOriginField.js +78 -4
  75. package/dist/components/Timeline/TimelineTranslateField.js +55 -15
  76. package/dist/components/Timeline/Transform3DModeContext.d.ts +1 -0
  77. package/dist/components/Timeline/Transform3DModeContext.js +5 -0
  78. package/dist/components/Timeline/delete-selected-timeline-item.js +0 -6
  79. package/dist/components/Timeline/get-sequence-context-menu-items.js +13 -6
  80. package/dist/components/Timeline/sequence-props-subscription-store.d.ts +2 -1
  81. package/dist/components/Timeline/sequence-props-subscription-store.js +5 -2
  82. package/dist/components/Timeline/timeline-field-display-utils.js +2 -2
  83. package/dist/components/Timeline/timeline-field-row-layout.d.ts +6 -0
  84. package/dist/components/Timeline/timeline-field-row-layout.js +16 -1
  85. package/dist/components/Timeline/timeline-rotation-utils.d.ts +16 -0
  86. package/dist/components/Timeline/timeline-rotation-utils.js +145 -4
  87. package/dist/components/Timeline/timeline-translate-utils.d.ts +3 -2
  88. package/dist/components/Timeline/timeline-translate-utils.js +8 -4
  89. package/dist/components/Timeline/transform-3d-mode.d.ts +6 -0
  90. package/dist/components/Timeline/transform-3d-mode.js +36 -0
  91. package/dist/components/Timeline/transform-origin-utils.d.ts +4 -0
  92. package/dist/components/Timeline/transform-origin-utils.js +12 -6
  93. package/dist/components/Timeline/use-open-sequence-in-apps.js +1 -1
  94. package/dist/components/Timeline/use-resolved-stack-react-to-change.d.ts +5 -1
  95. package/dist/components/Timeline/use-resolved-stack-react-to-change.js +45 -9
  96. package/dist/components/Timeline/use-sequence-props-subscription.d.ts +3 -1
  97. package/dist/components/Timeline/use-sequence-props-subscription.js +7 -2
  98. package/dist/components/call-api.js +2 -0
  99. package/dist/components/canvas-rotation-cursor.d.ts +1 -0
  100. package/dist/components/canvas-rotation-cursor.js +14 -0
  101. package/dist/components/get-open-in-menu-items.d.ts +6 -1
  102. package/dist/components/get-open-in-menu-items.js +69 -8
  103. package/dist/components/selected-outline-drag.d.ts +11 -5
  104. package/dist/components/selected-outline-drag.js +80 -42
  105. package/dist/components/selected-outline-measurement.d.ts +5 -0
  106. package/dist/components/selected-outline-measurement.js +28 -1
  107. package/dist/components/selected-outline-types.d.ts +6 -0
  108. package/dist/esm/{chunk-ptnd65a9.js → chunk-zpn4m49r.js} +8458 -6911
  109. package/dist/esm/index.mjs +357 -2
  110. package/dist/esm/internals.mjs +8458 -6911
  111. package/dist/esm/previewEntry.mjs +8363 -6816
  112. package/dist/esm/renderEntry.mjs +1 -1
  113. package/dist/helpers/get-box-quads-polyfill-internals.js +10 -2
  114. package/dist/helpers/open-in-editor.d.ts +3 -1
  115. package/dist/helpers/open-in-editor.js +5 -1
  116. package/dist/helpers/preview-server-events.js +4 -0
  117. package/dist/helpers/sequence-node-path-mutations.d.ts +4 -0
  118. package/dist/helpers/sequence-node-path-mutations.js +31 -0
  119. package/dist/icons/cube.d.ts +4 -0
  120. package/dist/icons/cube.js +6 -0
  121. package/dist/icons/finder.d.ts +4 -0
  122. package/dist/icons/finder.js +8 -0
  123. package/dist/icons/terminal.d.ts +6 -0
  124. package/dist/icons/terminal.js +46 -0
  125. package/dist/index.d.ts +15 -0
  126. package/dist/index.js +8 -0
  127. package/dist/state/transform-3d-mode.d.ts +10 -0
  128. package/dist/state/transform-3d-mode.js +27 -0
  129. package/dist/state/z-index.js +5 -8
  130. package/package.json +12 -12
@@ -212,7 +212,7 @@ var renderContent = (Root) => {
212
212
  renderToDOM(/* @__PURE__ */ jsx("div", {
213
213
  children: /* @__PURE__ */ jsx(DelayedSpinner, {})
214
214
  }));
215
- import("./chunk-ptnd65a9.js").then(({ StudioInternals }) => {
215
+ import("./chunk-zpn4m49r.js").then(({ StudioInternals }) => {
216
216
  window.remotion_isStudio = true;
217
217
  window.remotion_isReadOnlyStudio = true;
218
218
  window.remotion_inputProps = "{}";
@@ -1658,10 +1658,18 @@ function getElementCombinedTransform(element, iframes) {
1658
1658
  m.multiplySelf(new DOMMatrix('translate(' + tr.replaceAll(' ', ',') + ')'));
1659
1659
  }
1660
1660
  if (hasRotate) {
1661
- m.multiplySelf(new DOMMatrix('rotate(' + s.rotate.replaceAll(' ', ',') + ')'));
1661
+ const rotateParts = s.rotate.trim().split(/\s+/);
1662
+ const rotateTransform = rotateParts.length === 1
1663
+ ? `rotate(${rotateParts[0]})`
1664
+ : rotateParts.length === 2 && /^[xyz]$/i.test(rotateParts[0])
1665
+ ? `rotate${rotateParts[0].toUpperCase()}(${rotateParts[1]})`
1666
+ : `rotate3d(${rotateParts.join(',')})`;
1667
+ m.multiplySelf(new DOMMatrix(rotateTransform));
1662
1668
  }
1663
1669
  if (hasScale) {
1664
- m.multiplySelf(new DOMMatrix('scale(' + s.scale.replaceAll(' ', ',') + ')'));
1670
+ const scaleParts = s.scale.trim().split(/\s+/);
1671
+ const scaleFunction = scaleParts.length === 3 ? 'scale3d' : 'scale';
1672
+ m.multiplySelf(new DOMMatrix(`${scaleFunction}(${scaleParts.join(',')})`));
1665
1673
  }
1666
1674
  if (hasOffsetPath) {
1667
1675
  m.multiplySelf(computeOffsetTransformMatrix(element));
@@ -1,7 +1,9 @@
1
- import type { CompositionComponentInfoResponse, EditorPickerId, SymbolicatedStackFrame } from '@remotion/studio-shared';
1
+ import type { TerminalId } from '@remotion/studio-shared';
2
+ import type { CompositionComponentInfoResponse, EditorPickerId, OpenInTerminalResponse, SymbolicatedStackFrame } from '@remotion/studio-shared';
2
3
  import type { CodePosition, OriginalPosition } from '../error-overlay/react-overlay/utils/get-source-map';
3
4
  export declare const openInEditor: (stack: SymbolicatedStackFrame, editorId: EditorPickerId | null) => Promise<import("@remotion/studio-shared").OpenInEditorResponse>;
4
5
  export declare const openInCodingAgent: (codingAgentId: "claude-code" | "codex" | "copilot" | "cursor", prompt: string | null) => Promise<import("@remotion/studio-shared").OpenInCodingAgentResponse>;
6
+ export declare const openInTerminal: (terminalId: TerminalId, directory: string) => Promise<OpenInTerminalResponse>;
5
7
  export declare const openOriginalPositionInEditor: (originalPosition: OriginalPosition, editorId: EditorPickerId | null) => Promise<void>;
6
8
  export declare const openOriginalPositionInEditorAtProperty: ({ originalPosition, property, }: {
7
9
  originalPosition: CodePosition;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.openCompositionComponentInEditor = exports.preloadCompositionComponentInfo = exports.loadCompositionComponentInfo = exports.useCachedCompositionComponentInfo = exports.getCachedCompositionComponentInfo = exports.subscribeToCompositionComponentInfo = exports.openOriginalPositionInEditorAtProperty = exports.openOriginalPositionInEditor = exports.openInCodingAgent = exports.openInEditor = void 0;
3
+ exports.openCompositionComponentInEditor = exports.preloadCompositionComponentInfo = exports.loadCompositionComponentInfo = exports.useCachedCompositionComponentInfo = exports.getCachedCompositionComponentInfo = exports.subscribeToCompositionComponentInfo = exports.openOriginalPositionInEditorAtProperty = exports.openOriginalPositionInEditor = exports.openInTerminal = exports.openInCodingAgent = exports.openInEditor = void 0;
4
4
  const react_1 = require("react");
5
5
  const call_api_1 = require("../components/call-api");
6
6
  const browser_studio_operations_1 = require("./browser-studio-operations");
@@ -22,6 +22,10 @@ const openInCodingAgent = (codingAgentId, prompt) => {
22
22
  return (0, call_api_1.callApi)('/api/open-in-coding-agent', { codingAgentId, prompt });
23
23
  };
24
24
  exports.openInCodingAgent = openInCodingAgent;
25
+ const openInTerminal = (terminalId, directory) => {
26
+ return (0, call_api_1.callApi)('/api/open-in-terminal', { directory, terminalId });
27
+ };
28
+ exports.openInTerminal = openInTerminal;
25
29
  const openOriginalPositionInEditor = async (originalPosition, editorId) => {
26
30
  const response = await (0, exports.openInEditor)({
27
31
  originalColumnNumber: originalPosition.column,
@@ -4,6 +4,7 @@
4
4
  Object.defineProperty(exports, "__esModule", { value: true });
5
5
  exports.subscribeToPreviewServerConnectionState = exports.subscribeToPreviewServerEvents = exports.ensurePreviewServerEventSource = void 0;
6
6
  const browser_studio_operations_1 = require("./browser-studio-operations");
7
+ const sequence_node_path_mutations_1 = require("./sequence-node-path-mutations");
7
8
  let source = null;
8
9
  let unsubscribeFromBrowserStudio = null;
9
10
  let browserStudioReadyListenerInstalled = false;
@@ -18,6 +19,9 @@ const notifyConnectionState = () => {
18
19
  }
19
20
  };
20
21
  const dispatch = (event) => {
22
+ if (event.type === 'sequence-node-paths-remapped') {
23
+ (0, sequence_node_path_mutations_1.queueSequenceNodePathMutation)(event.mutation);
24
+ }
21
25
  if (event.type === 'init') {
22
26
  lastInitEvent = event;
23
27
  connectionState = {
@@ -0,0 +1,4 @@
1
+ import type { SequenceNodePathMutation } from '@remotion/studio-shared';
2
+ export declare const queueSequenceNodePathMutation: (mutation: SequenceNodePathMutation) => void;
3
+ export declare const queueSequenceNodePathMutationFromApiResponse: (response: unknown) => void;
4
+ export declare const takePendingSequenceNodePathMutations: () => SequenceNodePathMutation[];
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.takePendingSequenceNodePathMutations = exports.queueSequenceNodePathMutationFromApiResponse = exports.queueSequenceNodePathMutation = void 0;
4
+ const pendingMutations = [];
5
+ const seenMutationIds = new Set();
6
+ const queueSequenceNodePathMutation = (mutation) => {
7
+ if (seenMutationIds.has(mutation.mutationId)) {
8
+ return;
9
+ }
10
+ seenMutationIds.add(mutation.mutationId);
11
+ pendingMutations.push(mutation);
12
+ };
13
+ exports.queueSequenceNodePathMutation = queueSequenceNodePathMutation;
14
+ const queueSequenceNodePathMutationFromApiResponse = (response) => {
15
+ if (typeof response !== 'object' ||
16
+ response === null ||
17
+ !('nodePathMutation' in response)) {
18
+ return;
19
+ }
20
+ const { nodePathMutation } = response;
21
+ if (typeof nodePathMutation !== 'object' ||
22
+ nodePathMutation === null ||
23
+ !('mutationId' in nodePathMutation) ||
24
+ typeof nodePathMutation.mutationId !== 'string') {
25
+ return;
26
+ }
27
+ (0, exports.queueSequenceNodePathMutation)(nodePathMutation);
28
+ };
29
+ exports.queueSequenceNodePathMutationFromApiResponse = queueSequenceNodePathMutationFromApiResponse;
30
+ const takePendingSequenceNodePathMutations = () => pendingMutations.splice(0);
31
+ exports.takePendingSequenceNodePathMutations = takePendingSequenceNodePathMutations;
@@ -0,0 +1,4 @@
1
+ import type { SVGProps } from 'react';
2
+ export declare const CubeIcon: ({ color, ...props }: SVGProps<SVGSVGElement> & {
3
+ readonly color: string;
4
+ }) => import("react/jsx-runtime").JSX.Element;
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CubeIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const CubeIcon = ({ color, ...props }) => (jsx_runtime_1.jsx("svg", { viewBox: "0 0 512 512", ...props, children: jsx_runtime_1.jsx("path", { fill: color, d: "M234.5 5.7c13.6-7.6 29.3-7.6 42.9 0l192 107.3c14.2 7.9 22.9 22.9 22.9 39.2v207.6c0 16.3-8.8 31.2-22.9 39.2l-192 107.3c-13.6 7.6-29.3 7.6-42.9 0l-192-107.3c-14.2-7.9-22.9-22.9-22.9-39.2V152.2c0-16.3 8.8-31.2 22.9-39.2l192-107.3zM256 50.4L82.2 147.5 256 244.7l173.8-97.2L256 50.4zm-192 137v172.4l168 93.9V281.3L64 187.4zm216 266.3l168-93.9V187.4l-168 93.9v172.4z" }) }));
6
+ exports.CubeIcon = CubeIcon;
@@ -0,0 +1,4 @@
1
+ import React from 'react';
2
+ export declare const FinderIcon: React.FC<{
3
+ readonly size: number;
4
+ }>;
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.FinderIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const FinderIcon = ({ size }) => {
6
+ return (jsx_runtime_1.jsx("img", { alt: "", "aria-hidden": true, "data-file-manager-icon": "finder", draggable: false, src: "/api/app-icon/file-manager/finder.png", style: { flexShrink: 0, height: size, width: size } }));
7
+ };
8
+ exports.FinderIcon = FinderIcon;
@@ -0,0 +1,6 @@
1
+ import type { TerminalId } from '@remotion/studio-shared';
2
+ import React from 'react';
3
+ export declare const TerminalIcon: React.FC<{
4
+ readonly terminalId: TerminalId;
5
+ readonly size: number;
6
+ }>;
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.TerminalIcon = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const colors_1 = require("../helpers/colors");
6
+ const apps_1 = require("./apps");
7
+ // Brand shapes adapted from Simple Icons (CC0 1.0):
8
+ // https://github.com/simple-icons/simple-icons/tree/34c22501f9ac9f22b12f825677ccbab1fb22e14b/icons
9
+ const iconStyle = (size) => ({
10
+ flexShrink: 0,
11
+ height: size,
12
+ width: size,
13
+ });
14
+ const simpleTerminalIcons = {
15
+ warp: {
16
+ color: '#01A4FF',
17
+ path: 'M12.035 2.723h9.253A2.712 2.712 0 0 1 24 5.435v10.529a2.712 2.712 0 0 1-2.712 2.713H8.047Zm-1.681 2.6L6.766 19.677h5.598l-.399 1.6H2.712A2.712 2.712 0 0 1 0 18.565V8.036a2.712 2.712 0 0 1 2.712-2.712Z',
18
+ },
19
+ wezterm: {
20
+ color: '#4E49EE',
21
+ path: 'M3.27 8.524c0-.623.62-1.007 2.123-1.007l-.5 2.757c-.931-.623-1.624-1.199-1.624-1.75zm4.008 6.807c0 .647-.644 1.079-2.123 1.15l.524-2.924c.931.624 1.6 1.175 1.6 1.774zm-2.625 5.992.454-2.708c3.603-.336 5.01-1.798 5.01-3.404 0-1.653-2.004-2.948-3.841-4.074l.668-3.548c.764.072 1.67.216 2.744.432l.31-2.469c-.81-.12-1.575-.168-2.29-.216L8.257 2.7l-2.363-.024-.453 2.684C1.838 5.648.43 7.158.43 8.764c0 1.63 2.004 2.876 3.841 3.954l-.668 3.716c-.859-.048-1.908-.192-3.125-.408L0 18.495c1.026.12 1.98.192 2.84.216l-.525 2.588zm15.553-1.894h2.673c.334-2.804.81-8.46 1.121-14.86h-2.553c-.071 1.51-.334 10.498-.43 11.241h-.071c-.644-2.42-1.169-4.386-1.813-6.782h-1.456c-.62 2.396-1.05 4.194-1.694 6.782h-.096c-.071-.743-.477-9.73-.525-11.24h-2.648c.31 6.399.763 12.055 1.097 14.86h2.625l1.838-7.12z',
22
+ },
23
+ alacritty: {
24
+ color: '#F46D01',
25
+ path: 'm10.065 0-8.57 21.269h3.595l6.91-16.244 6.91 16.244h3.594l-8.57-21.269zm1.935 9.935c-.76666 1.8547-1.5334 3.7094-2.298 5.565 1.475 4.54 1.475 4.54 2.298 8.5.823-3.96.823-3.96 2.297-8.5-.76637-1.8547-1.5315-3.7099-2.297-5.565z',
26
+ },
27
+ 'gnome-terminal': {
28
+ color: colors_1.CURRENT_COLOR,
29
+ path: 'M1.846 0A1.841 1.841 0 000 1.846v18.463c0 1.022.823 1.845 1.846 1.845h20.308A1.841 1.841 0 0024 20.31V1.846A1.841 1.841 0 0022.154 0H1.846zm0 .924h20.308c.512 0 .922.41.922.922v18.463c0 .511-.41.921-.922.921H1.846a.919.919 0 01-.922-.921V1.846c0-.512.41-.922.922-.922zm0 .922v18.463h20.308V1.846H1.846zm1.845 2.14l3.235 1.758v.836L3.69 8.477V7.385l2.243-1.207v-.033L3.69 5.076v-1.09zM7.846 9.23h3.693v.924H7.846V9.23zM0 21.736v.418C0 23.177.823 24 1.846 24h20.308A1.841 1.841 0 0024 22.154v-.418a2.334 2.334 0 01-1.846.918H1.846A2.334 2.334 0 010 21.736Z',
30
+ },
31
+ };
32
+ const TerminalIcon = ({ terminalId, size }) => {
33
+ const hasArtwork = terminalId === 'terminal' ||
34
+ terminalId === 'iterm2' ||
35
+ terminalId === 'ghostty' ||
36
+ terminalId === 'windows-terminal';
37
+ if (hasArtwork) {
38
+ return (jsx_runtime_1.jsx("img", { alt: "", "aria-hidden": true, "data-terminal-icon": terminalId, draggable: false, src: `/api/app-icon/terminal/${terminalId}.png`, style: iconStyle(size) }));
39
+ }
40
+ const icon = simpleTerminalIcons[terminalId];
41
+ if (!icon) {
42
+ return (jsx_runtime_1.jsx(apps_1.AppsIcon, { "aria-hidden": true, "data-terminal-icon": terminalId, height: size, width: size }));
43
+ }
44
+ return (jsx_runtime_1.jsx("svg", { "aria-hidden": true, "data-terminal-icon": terminalId, style: iconStyle(size), viewBox: "0 0 24 24", children: jsx_runtime_1.jsx("path", { d: icon.path, fill: icon.color }) }));
45
+ };
46
+ exports.TerminalIcon = TerminalIcon;
package/dist/index.d.ts CHANGED
@@ -16,6 +16,21 @@ export { watchPublicFolder } from './api/watch-public-folder';
16
16
  export { watchStaticFile } from './api/watch-static-file';
17
17
  export { writeStaticFile } from './api/write-static-file';
18
18
  export declare const StudioInternals: {
19
+ CodingAgentIcon: import("react").FC<{
20
+ readonly codingAgentId: "claude-code" | "codex" | "copilot" | "cursor" | null;
21
+ readonly size: number;
22
+ }>;
23
+ EditorIcon: import("react").FC<{
24
+ readonly editorId: import("@remotion/studio-shared").EditorPickerId | null;
25
+ readonly size: number | null;
26
+ }>;
27
+ FinderIcon: import("react").FC<{
28
+ readonly size: number;
29
+ }>;
30
+ TerminalIcon: import("react").FC<{
31
+ readonly terminalId: import("@remotion/studio-shared").TerminalId;
32
+ readonly size: number;
33
+ }>;
19
34
  createComposition: <Schema extends import("remotion").AnyZodObject, Props extends Record<string, unknown>>({ ...other }: import("remotion").CompositionProps<Schema, Props>) => () => import("react/jsx-runtime").JSX.Element;
20
35
  createStill: <Schema extends import("remotion").AnyZodObject, Props extends Record<string, unknown>>({ ...other }: import("remotion").StillProps<Schema, Props>) => () => import("react/jsx-runtime").JSX.Element;
21
36
  };
package/dist/index.js CHANGED
@@ -2,6 +2,10 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.StudioInternals = exports.writeStaticFile = exports.watchStaticFile = exports.watchPublicFolder = exports.visualControl = exports.updateDefaultProps = exports.toggle = exports.seek = exports.saveDefaultProps = exports.restartStudio = exports.reevaluateComposition = exports.play = exports.pause = exports.goToComposition = exports.getStaticFiles = exports.focusDefaultPropsPath = exports.deleteStaticFile = void 0;
4
4
  const create_composition_1 = require("./api/create-composition");
5
+ const CodingAgentIcon_1 = require("./components/CodingAgentIcon");
6
+ const editor_1 = require("./icons/editor");
7
+ const finder_1 = require("./icons/finder");
8
+ const terminal_1 = require("./icons/terminal");
5
9
  const delete_static_file_1 = require("./api/delete-static-file");
6
10
  Object.defineProperty(exports, "deleteStaticFile", { enumerable: true, get: function () { return delete_static_file_1.deleteStaticFile; } });
7
11
  const focus_default_props_path_1 = require("./api/focus-default-props-path");
@@ -35,6 +39,10 @@ Object.defineProperty(exports, "watchStaticFile", { enumerable: true, get: funct
35
39
  const write_static_file_1 = require("./api/write-static-file");
36
40
  Object.defineProperty(exports, "writeStaticFile", { enumerable: true, get: function () { return write_static_file_1.writeStaticFile; } });
37
41
  exports.StudioInternals = {
42
+ CodingAgentIcon: CodingAgentIcon_1.CodingAgentIcon,
43
+ EditorIcon: editor_1.EditorIcon,
44
+ FinderIcon: finder_1.FinderIcon,
45
+ TerminalIcon: terminal_1.TerminalIcon,
38
46
  createComposition: create_composition_1.createComposition,
39
47
  createStill: create_composition_1.createStill,
40
48
  };
@@ -0,0 +1,10 @@
1
+ import React from 'react';
2
+ type Transform3DModeState = {
3
+ readonly manuallyEnabledSequenceKeys: ReadonlySet<string>;
4
+ readonly setManuallyEnabled: (sequenceKey: string, enabled: boolean) => void;
5
+ };
6
+ export declare const Transform3DModeStateContext: React.Context<Transform3DModeState>;
7
+ export declare const Transform3DModeStateProvider: React.FC<{
8
+ readonly children: React.ReactNode;
9
+ }>;
10
+ export {};
@@ -0,0 +1,27 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Transform3DModeStateProvider = exports.Transform3DModeStateContext = void 0;
4
+ const jsx_runtime_1 = require("react/jsx-runtime");
5
+ const react_1 = require("react");
6
+ exports.Transform3DModeStateContext = (0, react_1.createContext)({
7
+ manuallyEnabledSequenceKeys: new Set(),
8
+ setManuallyEnabled: () => undefined,
9
+ });
10
+ const Transform3DModeStateProvider = ({ children }) => {
11
+ const [manuallyEnabledSequenceKeys, setManuallyEnabledSequenceKeys] = (0, react_1.useState)(() => new Set());
12
+ const setManuallyEnabled = (0, react_1.useCallback)((sequenceKey, enabled) => {
13
+ setManuallyEnabledSequenceKeys((previous) => {
14
+ const next = new Set(previous);
15
+ if (enabled) {
16
+ next.add(sequenceKey);
17
+ }
18
+ else {
19
+ next.delete(sequenceKey);
20
+ }
21
+ return next;
22
+ });
23
+ }, []);
24
+ const value = (0, react_1.useMemo)(() => ({ manuallyEnabledSequenceKeys, setManuallyEnabled }), [manuallyEnabledSequenceKeys, setManuallyEnabled]);
25
+ return (jsx_runtime_1.jsx(exports.Transform3DModeStateContext.Provider, { value: value, children: children }));
26
+ };
27
+ exports.Transform3DModeStateProvider = Transform3DModeStateProvider;
@@ -89,14 +89,11 @@ const HigherZIndex = ({ children, onEscape, onOutsideClick, disabled, outsideCli
89
89
  },
90
90
  });
91
91
  };
92
- // If a menu is opened, then this component will also still receive the pointerdown event.
93
- // However we may not interpret it as a outside click, so we need to wait for the next tick
94
- requestAnimationFrame(() => {
95
- // The third argument `true` registers a capture-phase listener. Some Studio
96
- // elements stop pointerdown propagation while still being outside the menu,
97
- // so bubbling listeners would miss those clicks and keep the menu open.
98
- window.addEventListener('pointerdown', listener, true);
99
- });
92
+ // The capture phase for the pointerdown that opened this layer has already
93
+ // passed, so installing the listener immediately cannot dismiss the new layer.
94
+ // Waiting for the next animation frame would leave a window in which a fast
95
+ // outside click is missed.
96
+ window.addEventListener('pointerdown', listener, true);
100
97
  return () => {
101
98
  endPointerSession === null || endPointerSession === void 0 ? void 0 : endPointerSession();
102
99
  endPointerSession = null;
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.507",
6
+ "version": "4.0.508",
7
7
  "description": "APIs for interacting with the Remotion Studio",
8
8
  "main": "dist",
9
9
  "scripts": {
@@ -24,17 +24,17 @@
24
24
  "react-dom": ">=16.8.0"
25
25
  },
26
26
  "dependencies": {
27
- "@remotion/studio-protocol": "4.0.507",
27
+ "@remotion/studio-protocol": "4.0.508",
28
28
  "semver": "7.5.3",
29
- "remotion": "4.0.507",
30
- "@remotion/captions": "4.0.507",
31
- "@remotion/player": "4.0.507",
32
- "@remotion/media-utils": "4.0.507",
33
- "@remotion/renderer": "4.0.507",
34
- "@remotion/web-renderer": "4.0.507",
35
- "@remotion/studio-shared": "4.0.507",
36
- "@remotion/timeline-utils": "4.0.507",
37
- "@remotion/zod-types": "4.0.507",
29
+ "remotion": "4.0.508",
30
+ "@remotion/captions": "4.0.508",
31
+ "@remotion/player": "4.0.508",
32
+ "@remotion/media-utils": "4.0.508",
33
+ "@remotion/renderer": "4.0.508",
34
+ "@remotion/web-renderer": "4.0.508",
35
+ "@remotion/studio-shared": "4.0.508",
36
+ "@remotion/timeline-utils": "4.0.508",
37
+ "@remotion/zod-types": "4.0.508",
38
38
  "@jridgewell/trace-mapping": "0.3.31",
39
39
  "mediabunny": "1.50.8",
40
40
  "memfs": "3.4.3",
@@ -45,7 +45,7 @@
45
45
  "react": "19.2.3",
46
46
  "react-dom": "19.2.3",
47
47
  "@types/semver": "7.5.3",
48
- "@remotion/eslint-config-internal": "4.0.507",
48
+ "@remotion/eslint-config-internal": "4.0.508",
49
49
  "eslint": "9.19.0",
50
50
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
51
51
  },