@remotion/player 4.0.485 → 4.0.487

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/LICENSE.md ADDED
@@ -0,0 +1,49 @@
1
+ # Remotion License
2
+
3
+ In Remotion 5.0, the license will slightly change. [View the changes here](https://github.com/remotion-dev/remotion/pull/3750).
4
+
5
+ ---
6
+
7
+ Depending on the type of your legal entity, you are granted permission to use Remotion for your project. Individuals and small companies are allowed to use Remotion to create videos for free (even commercial), while a company license is required for for-profit organizations of a certain size. This two-tier system was designed to ensure funding for this project while still allowing the source code to be available and the program to be free for most. Read below for the exact terms of use.
8
+
9
+ - [Free License](#free-license)
10
+ - [Company License](#company-license)
11
+
12
+ ## Free License
13
+
14
+ Copyright © 2026 [Remotion](https://www.remotion.dev)
15
+
16
+ ### Eligibility
17
+
18
+ You are eligible to use Remotion for free if you are:
19
+
20
+ - an individual
21
+ - a for-profit organization with up to 3 employees
22
+ - a non-profit or not-for-profit organization
23
+ - evaluating whether Remotion is a good fit, and are not yet using it in a commercial way
24
+
25
+ ### Allowed use cases
26
+
27
+ Permission is hereby granted, free of charge, to any person eligible for the "Free License", to use the software non-commercially or commercially for the purpose of creating videos and images and to modify the software to their own liking, for the purpose of fulfilling their custom use case or to contribute bug fixes or improvements back to Remotion.
28
+
29
+ ### Disallowed use cases
30
+
31
+ It is not allowed to copy or modify Remotion code for the purpose of selling, renting, licensing, relicensing, or sublicensing your own derivate of Remotion.
32
+
33
+ ### Warranty notice
34
+
35
+ The software is provided "as is", without warranty of any kind, express or implied, including but not limited to the warranties of merchantability, fitness for a particular purpose, and non-infringement. In no event shall the author or copyright holders be liable for any claim, damages or other liability, whether in an action of contract, tort or otherwise, arising from, out of or in connection with the software or the use or other dealings in the software.
36
+
37
+ ### Support
38
+
39
+ Support is provided on a best-we-can-do basis via GitHub Issues and Discord.
40
+
41
+ ## Company License
42
+
43
+ You are required to obtain a Company License to use Remotion if you are not within the group of entities eligible for a Free License. This license will enable you to use Remotion for the allowed use cases specified in the Free License, and give you access to prioritized support (read the [Support Policy](https://www.remotion.dev/docs/support)).
44
+
45
+ Visit [remotion.pro](https://www.remotion.pro/license) for pricing and to buy a license.
46
+
47
+ ### FAQs
48
+
49
+ Are you not sure whether you need a Company License because of an edge case? Here are some [frequently asked questions](https://www.remotion.pro/faq).
@@ -1,5 +1,4 @@
1
1
  export declare const DefaultPlayPauseButton: React.FC<{
2
2
  playing: boolean;
3
3
  buffering: boolean;
4
- focused: boolean;
5
4
  }>;
@@ -4,13 +4,13 @@ exports.DefaultPlayPauseButton = void 0;
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  const BufferingIndicator_js_1 = require("./BufferingIndicator.js");
6
6
  const icons_js_1 = require("./icons.js");
7
- const DefaultPlayPauseButton = ({ playing, buffering, focused }) => {
7
+ const DefaultPlayPauseButton = ({ playing, buffering }) => {
8
8
  if (playing && buffering) {
9
9
  return jsx_runtime_1.jsx(BufferingIndicator_js_1.BufferingIndicator, { type: "player" });
10
10
  }
11
11
  if (playing) {
12
- return jsx_runtime_1.jsx(icons_js_1.PauseIcon, { focused: focused });
12
+ return jsx_runtime_1.jsx(icons_js_1.PauseIcon, {});
13
13
  }
14
- return jsx_runtime_1.jsx(icons_js_1.PlayIcon, { focused: focused });
14
+ return jsx_runtime_1.jsx(icons_js_1.PlayIcon, {});
15
15
  };
16
16
  exports.DefaultPlayPauseButton = DefaultPlayPauseButton;
@@ -68,7 +68,6 @@ const fullscreen = {};
68
68
  const Controls = ({ durationInFrames, isFullscreen, fps, showVolumeControls, onFullscreenButtonClick, allowFullscreen, onExitFullscreenButtonClick, spaceKeyToPlayOrPause, onSeekEnd, onSeekStart, inFrame, outFrame, initiallyShowControls, canvasSize, renderPlayPauseButton, renderFullscreenButton, alwaysShowControls, showPlaybackRateControl, containerRef, buffering, hideControlsWhenPointerDoesntMove, onPointerDown, onDoubleClick, renderMuteButton, renderVolumeSlider, playing, toggle, renderCustomControls, }) => {
69
69
  var _a, _b;
70
70
  const playButtonRef = (0, react_1.useRef)(null);
71
- const [playButtonFocused, setPlayButtonFocused] = (0, react_1.useState)(false);
72
71
  const [supportsFullscreen, setSupportsFullscreen] = (0, react_1.useState)(false);
73
72
  const hovered = (0, use_hover_state_js_1.useHoverState)(containerRef, hideControlsWhenPointerDoesntMove);
74
73
  const { maxTimeLabelWidth, displayVerticalVolumeSlider } = (0, use_video_controls_resize_js_1.useVideoControlsResize)({
@@ -104,15 +103,6 @@ const Controls = ({ durationInFrames, isFullscreen, fps, showVolumeControls, onF
104
103
  opacity: Number(shouldShow),
105
104
  };
106
105
  }, [hovered, shouldShowInitially, playing, alwaysShowControls]);
107
- const playPauseButtonStyle = (0, react_1.useMemo)(() => {
108
- if (renderPlayPauseButton !== null || (playing && buffering)) {
109
- return PlaybackrateControl_js_1.playerButtonStyle;
110
- }
111
- return {
112
- ...PlaybackrateControl_js_1.playerButtonStyle,
113
- outline: 'none',
114
- };
115
- }, [buffering, playing, renderPlayPauseButton]);
116
106
  (0, react_1.useEffect)(() => {
117
107
  if (playButtonRef.current && spaceKeyToPlayOrPause) {
118
108
  // This switches focus to play button when player.playing flag changes
@@ -175,19 +165,13 @@ const Controls = ({ durationInFrames, isFullscreen, fps, showVolumeControls, onF
175
165
  onDoubleClick === null || onDoubleClick === void 0 ? void 0 : onDoubleClick(e);
176
166
  }
177
167
  }, [onDoubleClick]);
178
- const onPlayButtonFocus = (0, react_1.useCallback)(() => {
179
- setPlayButtonFocused(true);
180
- }, []);
181
- const onPlayButtonBlur = (0, react_1.useCallback)(() => {
182
- setPlayButtonFocused(false);
183
- }, []);
184
168
  return (jsx_runtime_1.jsxs("div", { ref: ref, style: containerCss, onPointerDown: onPointerDownIfContainer, onDoubleClick: onDoubleClickIfContainer, children: [
185
169
  jsx_runtime_1.jsxs("div", { ref: flexRef, style: controlsRow, children: [
186
170
  jsx_runtime_1.jsxs("div", { style: leftPartStyle, children: [
187
- jsx_runtime_1.jsx("button", { ref: playButtonRef, type: "button", style: playPauseButtonStyle, onClick: toggle, onFocus: onPlayButtonFocus, onBlur: onPlayButtonBlur, "aria-label": playing ? 'Pause video' : 'Play video', title: playing ? 'Pause video' : 'Play video', children: renderPlayPauseButton === null ? (jsx_runtime_1.jsx(DefaultPlayPauseButton_js_1.DefaultPlayPauseButton, { buffering: buffering, focused: playButtonFocused, playing: playing })) : (((_b = renderPlayPauseButton({
171
+ jsx_runtime_1.jsx("button", { ref: playButtonRef, type: "button", style: PlaybackrateControl_js_1.playerButtonStyle, onClick: toggle, "aria-label": playing ? 'Pause video' : 'Play video', title: playing ? 'Pause video' : 'Play video', children: renderPlayPauseButton === null ? (jsx_runtime_1.jsx(DefaultPlayPauseButton_js_1.DefaultPlayPauseButton, { buffering: buffering, playing: playing })) : (((_b = renderPlayPauseButton({
188
172
  playing,
189
173
  isBuffering: buffering,
190
- })) !== null && _b !== void 0 ? _b : (jsx_runtime_1.jsx(DefaultPlayPauseButton_js_1.DefaultPlayPauseButton, { buffering: buffering, focused: false, playing: playing })))) }), showVolumeControls ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
174
+ })) !== null && _b !== void 0 ? _b : (jsx_runtime_1.jsx(DefaultPlayPauseButton_js_1.DefaultPlayPauseButton, { buffering: buffering, playing: playing })))) }), showVolumeControls ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
191
175
  jsx_runtime_1.jsx("div", { style: xSpacer }), jsx_runtime_1.jsx(MediaVolumeSlider_js_1.MediaVolumeSlider, { renderMuteButton: renderMuteButton, renderVolumeSlider: renderVolumeSlider, displayVerticalVolumeSlider: displayVerticalVolumeSlider })
192
176
  ] })) : null, jsx_runtime_1.jsx("div", { style: xSpacer }), jsx_runtime_1.jsx(PlayerTimeLabel_js_1.PlayerTimeLabel, { durationInFrames: durationInFrames, fps: fps, maxTimeLabelWidth: maxTimeLabelWidth }), jsx_runtime_1.jsx("div", { style: xSpacer })
193
177
  ] }), jsx_runtime_1.jsx("div", { style: flex1 }), customControlsElement, customControlsElement && playbackRates && canvasSize ? (jsx_runtime_1.jsx("div", { style: xSpacer })) : null, playbackRates && canvasSize && (jsx_runtime_1.jsx(PlaybackrateControl_js_1.PlaybackrateControl, { canvasSize: canvasSize, playbackRates: playbackRates })), playbackRates && supportsFullscreen && allowFullscreen ? (jsx_runtime_1.jsx("div", { style: xSpacer })) : null, jsx_runtime_1.jsx("div", { style: fullscreen, children: supportsFullscreen && allowFullscreen ? (jsx_runtime_1.jsx("button", { type: "button", "aria-label": isFullscreen ? 'Exit fullscreen' : 'Enter Fullscreen', title: isFullscreen ? 'Exit fullscreen' : 'Enter Fullscreen', style: PlaybackrateControl_js_1.playerButtonStyle, onClick: isFullscreen
@@ -1,12 +1,8 @@
1
1
  import React from 'react';
2
2
  export declare const ICON_SIZE = 25;
3
3
  export declare const fullscreenIconSize = 16;
4
- export declare const PlayIcon: React.FC<{
5
- readonly focused?: boolean;
6
- }>;
7
- export declare const PauseIcon: React.FC<{
8
- readonly focused?: boolean;
9
- }>;
4
+ export declare const PlayIcon: React.FC;
5
+ export declare const PauseIcon: React.FC;
10
6
  export declare const FullscreenIcon: React.FC<{
11
7
  readonly isFullscreen: boolean;
12
8
  }>;
package/dist/cjs/icons.js CHANGED
@@ -4,62 +4,13 @@ exports.VolumeOnIcon = exports.VolumeOffIcon = exports.FullscreenIcon = exports.
4
4
  const jsx_runtime_1 = require("react/jsx-runtime");
5
5
  exports.ICON_SIZE = 25;
6
6
  exports.fullscreenIconSize = 16;
7
- const focusRingFallbackColor = 'Highlight';
8
- const focusRingColor = '-webkit-focus-ring-color';
9
- const focusRingStyle = {
10
- stroke: focusRingColor,
11
- };
12
- const playPath = 'M8 6.375C7.40904 8.17576 7.06921 10.2486 7.01438 12.3871C6.95955 14.5255 7.19163 16.6547 7.6875 18.5625C9.95364 18.2995 12.116 17.6164 14.009 16.5655C15.902 15.5147 17.4755 14.124 18.6088 12.5C17.5158 10.8949 15.9949 9.51103 14.1585 8.45082C12.3222 7.3906 10.2174 6.68116 8 6.375Z';
13
- const playFocusPath = 'M93.4691 0.0367432C84.4873 0.520935 77.2494 1.93634 69.9553 4.69266C66.3176 6.05219 60.3548 9.0134 57.0734 11.062C43.3476 19.6103 32.8846 32.4606 27.428 47.4154C26.3405 50.3766 23.3966 59.8188 21.5027 66.3185C8.88329 109.768 1.7204 157.277 0.182822 207.561C-0.0609408 215.569 -0.0609408 234.639 0.182822 242.517C1.21413 275.854 4.42055 305.949 10.2334 336.641C12.596 349.063 16.3837 365.75 18.5776 373.33C23.059 388.732 32.2095 401.843 45.2227 411.453C53.9419 417.896 63.8425 422.217 74.8118 424.34C80.0996 425.365 87.075 425.83 92.2127 425.495C99.3194 425.029 113.42 423.148 124.877 421.118C176.517 411.974 224.22 395.604 267.478 372.175C294.874 357.332 318.294 341.26 340.888 321.761C363.408 302.355 382.609 281.478 399.504 258.049C403.423 252.63 405.392 249.464 407.361 245.478C412.424 235.198 414.805 224.974 414.786 213.539C414.786 202.886 412.761 193.425 408.392 183.741C406.292 179.066 404.286 175.714 399.785 169.345C383.21 145.898 364.815 125.467 342.389 105.614C307.624 74.8481 266.335 49.613 220.226 30.9334C210.232 26.8921 200.387 23.335 188.537 19.4799C163.448 11.3413 132.396 4.28293 106.126 0.763062C102.001 0.204346 96.3942 -0.112244 93.4691 0.0367432Z';
14
- const playIconStrokeWidth = 6.25;
15
- const playFocusStrokeWidth = 1.5;
16
- const playFocusPadding = 2;
17
- // Derived with @remotion/paths getBoundingBox() from the paths above.
18
- const playPathBounds = {
19
- x1: 7.006500987565134,
20
- y1: 6.375,
21
- x2: 18.6088,
22
- y2: 18.5625,
23
- };
24
- const playFocusPathBounds = {
25
- x1: -9.999999999649709e-8,
26
- y1: 0.000013203698169792638,
27
- x2: 414.7861127950162,
28
- y2: 425.60252460486765,
29
- };
30
- const expandBounds = (bounds, padding) => {
31
- return {
32
- x1: bounds.x1 - padding,
33
- y1: bounds.y1 - padding,
34
- x2: bounds.x2 + padding,
35
- y2: bounds.y2 + padding,
36
- };
37
- };
38
- const getBoundsWidth = (bounds) => bounds.x2 - bounds.x1;
39
- const getBoundsHeight = (bounds) => bounds.y2 - bounds.y1;
40
- const fitBoundsTransform = ({ source, target, }) => {
41
- const scale = Math.min(getBoundsWidth(target) / getBoundsWidth(source), getBoundsHeight(target) / getBoundsHeight(source));
42
- const x = target.x1 +
43
- (getBoundsWidth(target) - getBoundsWidth(source) * scale) / 2 -
44
- source.x1 * scale;
45
- const y = target.y1 +
46
- (getBoundsHeight(target) - getBoundsHeight(source) * scale) / 2 -
47
- source.y1 * scale;
48
- return `translate(${x.toFixed(4)} ${y.toFixed(4)}) scale(${scale.toFixed(5)})`;
49
- };
50
- const playFocusTransform = fitBoundsTransform({
51
- source: playFocusPathBounds,
52
- target: expandBounds(expandBounds(playPathBounds, playIconStrokeWidth / 2), playFocusPadding),
53
- });
54
- const PlayIcon = ({ focused }) => {
55
- return (jsx_runtime_1.jsxs("svg", { width: exports.ICON_SIZE, height: exports.ICON_SIZE, viewBox: "0 0 25 25", fill: "none", children: [focused ? (jsx_runtime_1.jsx("path", { d: playFocusPath, fill: "none", stroke: focusRingFallbackColor, strokeWidth: playFocusStrokeWidth, style: focusRingStyle, transform: playFocusTransform, vectorEffect: "non-scaling-stroke" })) : null, jsx_runtime_1.jsx("path", { d: playPath, fill: "white", stroke: "white", strokeWidth: playIconStrokeWidth, strokeLinejoin: "round" })
56
- ] }));
7
+ const PlayIcon = () => {
8
+ return (jsx_runtime_1.jsx("svg", { width: exports.ICON_SIZE, height: exports.ICON_SIZE, viewBox: "0 0 25 25", fill: "none", children: jsx_runtime_1.jsx("path", { d: "M8 6.375C7.40904 8.17576 7.06921 10.2486 7.01438 12.3871C6.95955 14.5255 7.19163 16.6547 7.6875 18.5625C9.95364 18.2995 12.116 17.6164 14.009 16.5655C15.902 15.5147 17.4755 14.124 18.6088 12.5C17.5158 10.8949 15.9949 9.51103 14.1585 8.45082C12.3222 7.3906 10.2174 6.68116 8 6.375Z", fill: "white", stroke: "white", strokeWidth: "6.25", strokeLinejoin: "round" }) }));
57
9
  };
58
10
  exports.PlayIcon = PlayIcon;
59
- const PauseIcon = ({ focused, }) => {
60
- return (jsx_runtime_1.jsxs("svg", { viewBox: "0 0 100 100", width: exports.ICON_SIZE, height: exports.ICON_SIZE, children: [focused ? (jsx_runtime_1.jsxs(jsx_runtime_1.Fragment, { children: [
61
- jsx_runtime_1.jsx("rect", { x: "21", y: "16", width: "28", height: "68", fill: "none", stroke: focusRingFallbackColor, strokeWidth: "4", ry: "9", rx: "9", style: focusRingStyle }), jsx_runtime_1.jsx("rect", { x: "51", y: "16", width: "28", height: "68", fill: "none", stroke: focusRingFallbackColor, strokeWidth: "4", ry: "9", rx: "9", style: focusRingStyle })
62
- ] })) : null, jsx_runtime_1.jsx("rect", { x: "25", y: "20", width: "20", height: "60", fill: "#fff", ry: "5", rx: "5" }), jsx_runtime_1.jsx("rect", { x: "55", y: "20", width: "20", height: "60", fill: "#fff", ry: "5", rx: "5" })
11
+ const PauseIcon = () => {
12
+ return (jsx_runtime_1.jsxs("svg", { viewBox: "0 0 100 100", width: exports.ICON_SIZE, height: exports.ICON_SIZE, children: [
13
+ jsx_runtime_1.jsx("rect", { x: "25", y: "20", width: "20", height: "60", fill: "#fff", ry: "5", rx: "5" }), jsx_runtime_1.jsx("rect", { x: "55", y: "20", width: "20", height: "60", fill: "#fff", ry: "5", rx: "5" })
63
14
  ] }));
64
15
  };
65
16
  exports.PauseIcon = PauseIcon;
@@ -18,116 +18,30 @@ if (typeof createContext !== "function") {
18
18
  }
19
19
 
20
20
  // src/icons.tsx
21
- import { jsx, jsxs, Fragment } from "react/jsx-runtime";
21
+ import { jsx, jsxs } from "react/jsx-runtime";
22
22
  var ICON_SIZE = 25;
23
23
  var fullscreenIconSize = 16;
24
- var focusRingFallbackColor = "Highlight";
25
- var focusRingColor = "-webkit-focus-ring-color";
26
- var focusRingStyle = {
27
- stroke: focusRingColor
28
- };
29
- var playPath = "M8 6.375C7.40904 8.17576 7.06921 10.2486 7.01438 12.3871C6.95955 14.5255 7.19163 16.6547 7.6875 18.5625C9.95364 18.2995 12.116 17.6164 14.009 16.5655C15.902 15.5147 17.4755 14.124 18.6088 12.5C17.5158 10.8949 15.9949 9.51103 14.1585 8.45082C12.3222 7.3906 10.2174 6.68116 8 6.375Z";
30
- var playFocusPath = "M93.4691 0.0367432C84.4873 0.520935 77.2494 1.93634 69.9553 4.69266C66.3176 6.05219 60.3548 9.0134 57.0734 11.062C43.3476 19.6103 32.8846 32.4606 27.428 47.4154C26.3405 50.3766 23.3966 59.8188 21.5027 66.3185C8.88329 109.768 1.7204 157.277 0.182822 207.561C-0.0609408 215.569 -0.0609408 234.639 0.182822 242.517C1.21413 275.854 4.42055 305.949 10.2334 336.641C12.596 349.063 16.3837 365.75 18.5776 373.33C23.059 388.732 32.2095 401.843 45.2227 411.453C53.9419 417.896 63.8425 422.217 74.8118 424.34C80.0996 425.365 87.075 425.83 92.2127 425.495C99.3194 425.029 113.42 423.148 124.877 421.118C176.517 411.974 224.22 395.604 267.478 372.175C294.874 357.332 318.294 341.26 340.888 321.761C363.408 302.355 382.609 281.478 399.504 258.049C403.423 252.63 405.392 249.464 407.361 245.478C412.424 235.198 414.805 224.974 414.786 213.539C414.786 202.886 412.761 193.425 408.392 183.741C406.292 179.066 404.286 175.714 399.785 169.345C383.21 145.898 364.815 125.467 342.389 105.614C307.624 74.8481 266.335 49.613 220.226 30.9334C210.232 26.8921 200.387 23.335 188.537 19.4799C163.448 11.3413 132.396 4.28293 106.126 0.763062C102.001 0.204346 96.3942 -0.112244 93.4691 0.0367432Z";
31
- var playIconStrokeWidth = 6.25;
32
- var playFocusStrokeWidth = 1.5;
33
- var playFocusPadding = 2;
34
- var playPathBounds = {
35
- x1: 7.006500987565134,
36
- y1: 6.375,
37
- x2: 18.6088,
38
- y2: 18.5625
39
- };
40
- var playFocusPathBounds = {
41
- x1: -0.00000009999999999649709,
42
- y1: 0.000013203698169792638,
43
- x2: 414.7861127950162,
44
- y2: 425.60252460486765
45
- };
46
- var expandBounds = (bounds, padding) => {
47
- return {
48
- x1: bounds.x1 - padding,
49
- y1: bounds.y1 - padding,
50
- x2: bounds.x2 + padding,
51
- y2: bounds.y2 + padding
52
- };
53
- };
54
- var getBoundsWidth = (bounds) => bounds.x2 - bounds.x1;
55
- var getBoundsHeight = (bounds) => bounds.y2 - bounds.y1;
56
- var fitBoundsTransform = ({
57
- source,
58
- target
59
- }) => {
60
- const scale = Math.min(getBoundsWidth(target) / getBoundsWidth(source), getBoundsHeight(target) / getBoundsHeight(source));
61
- const x = target.x1 + (getBoundsWidth(target) - getBoundsWidth(source) * scale) / 2 - source.x1 * scale;
62
- const y = target.y1 + (getBoundsHeight(target) - getBoundsHeight(source) * scale) / 2 - source.y1 * scale;
63
- return `translate(${x.toFixed(4)} ${y.toFixed(4)}) scale(${scale.toFixed(5)})`;
64
- };
65
- var playFocusTransform = fitBoundsTransform({
66
- source: playFocusPathBounds,
67
- target: expandBounds(expandBounds(playPathBounds, playIconStrokeWidth / 2), playFocusPadding)
68
- });
69
- var PlayIcon = ({ focused }) => {
70
- return /* @__PURE__ */ jsxs("svg", {
24
+ var PlayIcon = () => {
25
+ return /* @__PURE__ */ jsx("svg", {
71
26
  width: ICON_SIZE,
72
27
  height: ICON_SIZE,
73
28
  viewBox: "0 0 25 25",
74
29
  fill: "none",
75
- children: [
76
- focused ? /* @__PURE__ */ jsx("path", {
77
- d: playFocusPath,
78
- fill: "none",
79
- stroke: focusRingFallbackColor,
80
- strokeWidth: playFocusStrokeWidth,
81
- style: focusRingStyle,
82
- transform: playFocusTransform,
83
- vectorEffect: "non-scaling-stroke"
84
- }) : null,
85
- /* @__PURE__ */ jsx("path", {
86
- d: playPath,
87
- fill: "white",
88
- stroke: "white",
89
- strokeWidth: playIconStrokeWidth,
90
- strokeLinejoin: "round"
91
- })
92
- ]
30
+ children: /* @__PURE__ */ jsx("path", {
31
+ d: "M8 6.375C7.40904 8.17576 7.06921 10.2486 7.01438 12.3871C6.95955 14.5255 7.19163 16.6547 7.6875 18.5625C9.95364 18.2995 12.116 17.6164 14.009 16.5655C15.902 15.5147 17.4755 14.124 18.6088 12.5C17.5158 10.8949 15.9949 9.51103 14.1585 8.45082C12.3222 7.3906 10.2174 6.68116 8 6.375Z",
32
+ fill: "white",
33
+ stroke: "white",
34
+ strokeWidth: "6.25",
35
+ strokeLinejoin: "round"
36
+ })
93
37
  });
94
38
  };
95
- var PauseIcon = ({
96
- focused
97
- }) => {
39
+ var PauseIcon = () => {
98
40
  return /* @__PURE__ */ jsxs("svg", {
99
41
  viewBox: "0 0 100 100",
100
42
  width: ICON_SIZE,
101
43
  height: ICON_SIZE,
102
44
  children: [
103
- focused ? /* @__PURE__ */ jsxs(Fragment, {
104
- children: [
105
- /* @__PURE__ */ jsx("rect", {
106
- x: "21",
107
- y: "16",
108
- width: "28",
109
- height: "68",
110
- fill: "none",
111
- stroke: focusRingFallbackColor,
112
- strokeWidth: "4",
113
- ry: "9",
114
- rx: "9",
115
- style: focusRingStyle
116
- }),
117
- /* @__PURE__ */ jsx("rect", {
118
- x: "51",
119
- y: "16",
120
- width: "28",
121
- height: "68",
122
- fill: "none",
123
- stroke: focusRingFallbackColor,
124
- strokeWidth: "4",
125
- ry: "9",
126
- rx: "9",
127
- style: focusRingStyle
128
- })
129
- ]
130
- }) : null,
131
45
  /* @__PURE__ */ jsx("rect", {
132
46
  x: "25",
133
47
  y: "20",
@@ -229,7 +143,7 @@ var VolumeOnIcon = () => {
229
143
  };
230
144
 
231
145
  // src/BufferingIndicator.tsx
232
- import { jsx as jsx2, jsxs as jsxs2, Fragment as Fragment2 } from "react/jsx-runtime";
146
+ import { jsx as jsx2, jsxs as jsxs2, Fragment } from "react/jsx-runtime";
233
147
  var className = "__remotion_buffering_indicator";
234
148
  var remotionBufferingAnimation = "__remotion_buffering_animation";
235
149
  var playerStyle = {
@@ -248,7 +162,7 @@ var studioStyle = {
248
162
  };
249
163
  var BufferingIndicator = ({ type }) => {
250
164
  const style = type === "player" ? playerStyle : studioStyle;
251
- return /* @__PURE__ */ jsxs2(Fragment2, {
165
+ return /* @__PURE__ */ jsxs2(Fragment, {
252
166
  children: [
253
167
  /* @__PURE__ */ jsx2("style", {
254
168
  type: "text/css",
@@ -1561,20 +1475,16 @@ import { useCallback as useCallback7, useEffect as useEffect11, useMemo as useMe
1561
1475
 
1562
1476
  // src/DefaultPlayPauseButton.tsx
1563
1477
  import { jsx as jsx6 } from "react/jsx-runtime";
1564
- var DefaultPlayPauseButton = ({ playing, buffering, focused }) => {
1478
+ var DefaultPlayPauseButton = ({ playing, buffering }) => {
1565
1479
  if (playing && buffering) {
1566
1480
  return /* @__PURE__ */ jsx6(BufferingIndicator, {
1567
1481
  type: "player"
1568
1482
  });
1569
1483
  }
1570
1484
  if (playing) {
1571
- return /* @__PURE__ */ jsx6(PauseIcon, {
1572
- focused
1573
- });
1485
+ return /* @__PURE__ */ jsx6(PauseIcon, {});
1574
1486
  }
1575
- return /* @__PURE__ */ jsx6(PlayIcon, {
1576
- focused
1577
- });
1487
+ return /* @__PURE__ */ jsx6(PlayIcon, {});
1578
1488
  };
1579
1489
 
1580
1490
  // src/MediaVolumeSlider.tsx
@@ -2230,7 +2140,7 @@ var useVideoControlsResize = ({
2230
2140
  };
2231
2141
 
2232
2142
  // src/PlayerControls.tsx
2233
- import { jsx as jsx11, jsxs as jsxs8, Fragment as Fragment3 } from "react/jsx-runtime";
2143
+ import { jsx as jsx11, jsxs as jsxs8, Fragment as Fragment2 } from "react/jsx-runtime";
2234
2144
  var gradientSteps = [
2235
2145
  0,
2236
2146
  0.013,
@@ -2340,7 +2250,6 @@ var Controls = ({
2340
2250
  renderCustomControls
2341
2251
  }) => {
2342
2252
  const playButtonRef = useRef8(null);
2343
- const [playButtonFocused, setPlayButtonFocused] = useState10(false);
2344
2253
  const [supportsFullscreen, setSupportsFullscreen] = useState10(false);
2345
2254
  const hovered = useHoverState(containerRef, hideControlsWhenPointerDoesntMove);
2346
2255
  const { maxTimeLabelWidth, displayVerticalVolumeSlider } = useVideoControlsResize({
@@ -2375,15 +2284,6 @@ var Controls = ({
2375
2284
  opacity: Number(shouldShow)
2376
2285
  };
2377
2286
  }, [hovered, shouldShowInitially, playing, alwaysShowControls]);
2378
- const playPauseButtonStyle = useMemo9(() => {
2379
- if (renderPlayPauseButton !== null || playing && buffering) {
2380
- return playerButtonStyle;
2381
- }
2382
- return {
2383
- ...playerButtonStyle,
2384
- outline: "none"
2385
- };
2386
- }, [buffering, playing, renderPlayPauseButton]);
2387
2287
  useEffect11(() => {
2388
2288
  if (playButtonRef.current && spaceKeyToPlayOrPause) {
2389
2289
  playButtonRef.current.focus({
@@ -2436,12 +2336,6 @@ var Controls = ({
2436
2336
  onDoubleClick?.(e);
2437
2337
  }
2438
2338
  }, [onDoubleClick]);
2439
- const onPlayButtonFocus = useCallback7(() => {
2440
- setPlayButtonFocused(true);
2441
- }, []);
2442
- const onPlayButtonBlur = useCallback7(() => {
2443
- setPlayButtonFocused(false);
2444
- }, []);
2445
2339
  return /* @__PURE__ */ jsxs8("div", {
2446
2340
  ref,
2447
2341
  style: containerCss,
@@ -2458,26 +2352,22 @@ var Controls = ({
2458
2352
  /* @__PURE__ */ jsx11("button", {
2459
2353
  ref: playButtonRef,
2460
2354
  type: "button",
2461
- style: playPauseButtonStyle,
2355
+ style: playerButtonStyle,
2462
2356
  onClick: toggle,
2463
- onFocus: onPlayButtonFocus,
2464
- onBlur: onPlayButtonBlur,
2465
2357
  "aria-label": playing ? "Pause video" : "Play video",
2466
2358
  title: playing ? "Pause video" : "Play video",
2467
2359
  children: renderPlayPauseButton === null ? /* @__PURE__ */ jsx11(DefaultPlayPauseButton, {
2468
2360
  buffering,
2469
- focused: playButtonFocused,
2470
2361
  playing
2471
2362
  }) : renderPlayPauseButton({
2472
2363
  playing,
2473
2364
  isBuffering: buffering
2474
2365
  }) ?? /* @__PURE__ */ jsx11(DefaultPlayPauseButton, {
2475
2366
  buffering,
2476
- focused: false,
2477
2367
  playing
2478
2368
  })
2479
2369
  }),
2480
- showVolumeControls ? /* @__PURE__ */ jsxs8(Fragment3, {
2370
+ showVolumeControls ? /* @__PURE__ */ jsxs8(Fragment2, {
2481
2371
  children: [
2482
2372
  /* @__PURE__ */ jsx11("div", {
2483
2373
  style: xSpacer
@@ -2641,7 +2531,7 @@ var useClickPreventionOnDoubleClick = (onClick, onDoubleClick, doubleClickToFull
2641
2531
  };
2642
2532
 
2643
2533
  // src/PlayerUI.tsx
2644
- import { jsx as jsx12, jsxs as jsxs9, Fragment as Fragment4 } from "react/jsx-runtime";
2534
+ import { jsx as jsx12, jsxs as jsxs9, Fragment as Fragment3 } from "react/jsx-runtime";
2645
2535
  var reactVersion = React10.version.split(".")[0];
2646
2536
  if (reactVersion === "0") {
2647
2537
  throw new Error(`Version ${reactVersion} of "react" is not supported by Remotion`);
@@ -3031,7 +2921,7 @@ var PlayerUI = ({
3031
2921
  showPosterWhenBufferingAndPaused && showBufferIndicator && !player.isPlaying()
3032
2922
  ].some(Boolean);
3033
2923
  const { left, top, width, height, ...outerWithoutScale } = outer;
3034
- const content = /* @__PURE__ */ jsxs9(Fragment4, {
2924
+ const content = /* @__PURE__ */ jsxs9(Fragment3, {
3035
2925
  children: [
3036
2926
  /* @__PURE__ */ jsxs9("div", {
3037
2927
  style: outer,
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "url": "https://github.com/remotion-dev/remotion/tree/main/packages/player"
4
4
  },
5
5
  "name": "@remotion/player",
6
- "version": "4.0.485",
6
+ "version": "4.0.487",
7
7
  "description": "React component for embedding a Remotion preview into your app",
8
8
  "main": "dist/cjs/index.js",
9
9
  "types": "dist/cjs/index.d.ts",
@@ -14,7 +14,7 @@
14
14
  "lint": "eslint src",
15
15
  "make": "tsgo -d && bun ensure-correct-version.ts && bun --env-file=../.env.bundle bundle.ts",
16
16
  "test": "bun test src",
17
- "prerelease": "cp ../../README.md ."
17
+ "prerelease": "cp ../../README.md . && cp ../../LICENSE.md ."
18
18
  },
19
19
  "exports": {
20
20
  "./package.json": "./package.json",
@@ -35,7 +35,7 @@
35
35
  ],
36
36
  "license": "SEE LICENSE IN LICENSE.md",
37
37
  "dependencies": {
38
- "remotion": "4.0.485"
38
+ "remotion": "4.0.487"
39
39
  },
40
40
  "peerDependencies": {
41
41
  "react": ">=16.8.0",
@@ -49,7 +49,7 @@
49
49
  "react-dom": "19.2.3",
50
50
  "webpack": "5.105.0",
51
51
  "zod": "4.3.6",
52
- "@remotion/eslint-config-internal": "4.0.485",
52
+ "@remotion/eslint-config-internal": "4.0.487",
53
53
  "eslint": "9.19.0",
54
54
  "@typescript/native-preview": "7.0.0-dev.20260217.1"
55
55
  },