@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 +49 -0
- package/dist/cjs/DefaultPlayPauseButton.d.ts +0 -1
- package/dist/cjs/DefaultPlayPauseButton.js +3 -3
- package/dist/cjs/PlayerControls.js +2 -18
- package/dist/cjs/icons.d.ts +2 -6
- package/dist/cjs/icons.js +5 -54
- package/dist/esm/index.mjs +21 -131
- package/package.json +4 -4
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).
|
|
@@ -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
|
|
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, {
|
|
12
|
+
return jsx_runtime_1.jsx(icons_js_1.PauseIcon, {});
|
|
13
13
|
}
|
|
14
|
-
return jsx_runtime_1.jsx(icons_js_1.PlayIcon, {
|
|
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:
|
|
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,
|
|
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
|
package/dist/cjs/icons.d.ts
CHANGED
|
@@ -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
|
-
|
|
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
|
|
8
|
-
|
|
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 = (
|
|
60
|
-
return (jsx_runtime_1.jsxs("svg", { viewBox: "0 0 100 100", width: exports.ICON_SIZE, height: exports.ICON_SIZE, children: [
|
|
61
|
-
|
|
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;
|
package/dist/esm/index.mjs
CHANGED
|
@@ -18,116 +18,30 @@ if (typeof createContext !== "function") {
|
|
|
18
18
|
}
|
|
19
19
|
|
|
20
20
|
// src/icons.tsx
|
|
21
|
-
import { jsx, jsxs
|
|
21
|
+
import { jsx, jsxs } from "react/jsx-runtime";
|
|
22
22
|
var ICON_SIZE = 25;
|
|
23
23
|
var fullscreenIconSize = 16;
|
|
24
|
-
var
|
|
25
|
-
|
|
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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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:
|
|
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(
|
|
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
|
|
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(
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
},
|