@remotion/player 4.0.225 → 4.0.227

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 (107) hide show
  1. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/BufferingIndicator.d.ts +5 -0
  2. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/BufferingIndicator.js +38 -0
  3. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/DefaultPlayPauseButton.d.ts +5 -0
  4. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/DefaultPlayPauseButton.js +12 -0
  5. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/EmitterProvider.d.ts +5 -0
  6. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/EmitterProvider.js +20 -0
  7. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/MediaVolumeSlider.d.ts +5 -0
  8. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/MediaVolumeSlider.js +129 -0
  9. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlaybackrateControl.d.ts +8 -0
  10. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlaybackrateControl.js +156 -0
  11. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/Player.d.ts +56 -0
  12. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/Player.js +143 -0
  13. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerControls.d.ts +47 -0
  14. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerControls.js +176 -0
  15. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerSeekBar.d.ts +8 -0
  16. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerSeekBar.js +145 -0
  17. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerUI.d.ts +46 -0
  18. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/PlayerUI.js +369 -0
  19. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/SharedPlayerContext.d.ts +15 -0
  20. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/SharedPlayerContext.js +55 -0
  21. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/Thumbnail.d.ts +23 -0
  22. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/Thumbnail.js +48 -0
  23. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/ThumbnailUI.d.ts +11 -0
  24. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/ThumbnailUI.js +89 -0
  25. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/calculate-next-frame.d.ts +14 -0
  26. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/calculate-next-frame.js +24 -0
  27. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/calculate-scale.d.ts +50 -0
  28. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/calculate-scale.js +72 -0
  29. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/emitter-context.d.ts +4 -0
  30. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/emitter-context.js +3 -0
  31. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/error-boundary.d.ts +19 -0
  32. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/error-boundary.js +32 -0
  33. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/event-emitter.d.ts +91 -0
  34. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/event-emitter.js +114 -0
  35. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/format-time.d.ts +1 -0
  36. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/format-time.js +5 -0
  37. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/icons.d.ts +10 -0
  38. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/icons.js +39 -0
  39. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/index.d.ts +64 -0
  40. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/index.js +23 -0
  41. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/is-backgrounded.d.ts +2 -0
  42. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/is-backgrounded.js +20 -0
  43. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/player-css-classname.d.ts +1 -0
  44. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/player-css-classname.js +1 -0
  45. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/player-methods.d.ts +25 -0
  46. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/player-methods.js +1 -0
  47. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/index.test.d.ts +1 -0
  48. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/index.test.js +7 -0
  49. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/test-utils.d.ts +6 -0
  50. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/test-utils.js +14 -0
  51. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/validate-in-out-frames.test.d.ts +1 -0
  52. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/validate-in-out-frames.test.js +54 -0
  53. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/validate-prop.test.d.ts +1 -0
  54. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/test/validate-prop.test.js +129 -0
  55. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-buffer-state-emitter.d.ts +2 -0
  56. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-buffer-state-emitter.js +22 -0
  57. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-hover-state.d.ts +1 -0
  58. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-hover-state.js +43 -0
  59. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-playback.d.ts +8 -0
  60. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-playback.js +157 -0
  61. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-player.d.ts +24 -0
  62. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-player.js +157 -0
  63. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-thumbnail.d.ts +6 -0
  64. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-thumbnail.js +14 -0
  65. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-video-controls-resize.d.ts +11 -0
  66. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/use-video-controls-resize.js +35 -0
  67. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/calculate-player-size.d.ts +9 -0
  68. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/calculate-player-size.js +24 -0
  69. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/cancellable-promise.d.ts +5 -0
  70. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/cancellable-promise.js +22 -0
  71. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/delay.d.ts +1 -0
  72. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/delay.js +2 -0
  73. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/is-node.d.ts +1 -0
  74. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/is-node.js +1 -0
  75. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/props-if-has-props.d.ts +10 -0
  76. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/props-if-has-props.js +1 -0
  77. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-cancellable-promises.d.ts +7 -0
  78. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-cancellable-promises.js +18 -0
  79. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-click-prevention-on-double-click.d.ts +3 -0
  80. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-click-prevention-on-double-click.js +41 -0
  81. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-component-visible.d.ts +6 -0
  82. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-component-visible.js +18 -0
  83. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-element-size.d.ts +16 -0
  84. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/use-element-size.js +127 -0
  85. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-in-out-frame.d.ts +6 -0
  86. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-in-out-frame.js +49 -0
  87. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-initial-frame.d.ts +4 -0
  88. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-initial-frame.js +23 -0
  89. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-playbackrate.d.ts +1 -0
  90. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/utils/validate-playbackrate.js +14 -0
  91. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/validate.d.ts +5 -0
  92. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/validate.js +6 -0
  93. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/volume-persistance.d.ts +2 -0
  94. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/esm/volume-persistance.js +29 -0
  95. package/.rollup.cache/Users/jonathanburger/remotion/packages/player/dist/tsconfig-esm.tsbuildinfo +1 -0
  96. package/dist/cjs/BufferingIndicator.d.ts +1 -1
  97. package/dist/cjs/EmitterProvider.d.ts +2 -2
  98. package/dist/cjs/PlaybackrateControl.d.ts +2 -2
  99. package/dist/cjs/ThumbnailUI.d.ts +6 -6
  100. package/dist/cjs/error-boundary.d.ts +1 -1
  101. package/dist/cjs/icons.d.ts +1 -1
  102. package/dist/cjs/index.d.ts +3 -3
  103. package/dist/cjs/test/test-utils.js +0 -1
  104. package/dist/cjs/volume-persistance.js +1 -1
  105. package/dist/esm/index.mjs +1 -1
  106. package/eslint.config.mjs +23 -0
  107. package/package.json +7 -5
@@ -0,0 +1,176 @@
1
+ import { jsx as _jsx, Fragment as _Fragment, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { Internals } from 'remotion';
4
+ import { DefaultPlayPauseButton } from './DefaultPlayPauseButton.js';
5
+ import { formatTime } from './format-time.js';
6
+ import { FullscreenIcon } from './icons.js';
7
+ import { MediaVolumeSlider } from './MediaVolumeSlider.js';
8
+ import { PlaybackrateControl, playerButtonStyle } from './PlaybackrateControl.js';
9
+ import { PlayerSeekBar } from './PlayerSeekBar.js';
10
+ import { useHoverState } from './use-hover-state.js';
11
+ import { useVideoControlsResize, X_PADDING, } from './use-video-controls-resize.js';
12
+ const gradientSteps = [
13
+ 0, 0.013, 0.049, 0.104, 0.175, 0.259, 0.352, 0.45, 0.55, 0.648, 0.741, 0.825,
14
+ 0.896, 0.951, 0.987,
15
+ ];
16
+ const gradientOpacities = [
17
+ 0, 8.1, 15.5, 22.5, 29, 35.3, 41.2, 47.1, 52.9, 58.8, 64.7, 71, 77.5, 84.5,
18
+ 91.9,
19
+ ];
20
+ const globalGradientOpacity = 1 / 0.7;
21
+ const containerStyle = {
22
+ boxSizing: 'border-box',
23
+ position: 'absolute',
24
+ bottom: 0,
25
+ width: '100%',
26
+ paddingTop: 40,
27
+ paddingBottom: 10,
28
+ backgroundImage: `linear-gradient(to bottom,${gradientSteps
29
+ .map((g, i) => {
30
+ return `hsla(0, 0%, 0%, ${g}) ${gradientOpacities[i] * globalGradientOpacity}%`;
31
+ })
32
+ .join(', ')}, hsl(0, 0%, 0%) 100%)`,
33
+ backgroundSize: 'auto 145px',
34
+ display: 'flex',
35
+ paddingRight: X_PADDING,
36
+ paddingLeft: X_PADDING,
37
+ flexDirection: 'column',
38
+ transition: 'opacity 0.3s',
39
+ };
40
+ const controlsRow = {
41
+ display: 'flex',
42
+ flexDirection: 'row',
43
+ width: '100%',
44
+ alignItems: 'center',
45
+ justifyContent: 'center',
46
+ userSelect: 'none',
47
+ };
48
+ const leftPartStyle = {
49
+ display: 'flex',
50
+ flexDirection: 'row',
51
+ userSelect: 'none',
52
+ alignItems: 'center',
53
+ };
54
+ const xSpacer = {
55
+ width: 12,
56
+ };
57
+ const ySpacer = {
58
+ height: 8,
59
+ };
60
+ const flex1 = {
61
+ flex: 1,
62
+ };
63
+ const fullscreen = {};
64
+ export const Controls = ({ durationInFrames, isFullscreen, fps, player, showVolumeControls, onFullscreenButtonClick, allowFullscreen, onExitFullscreenButtonClick, spaceKeyToPlayOrPause, onSeekEnd, onSeekStart, inFrame, outFrame, initiallyShowControls, canvasSize, renderPlayPauseButton, renderFullscreenButton, alwaysShowControls, showPlaybackRateControl, containerRef, buffering, hideControlsWhenPointerDoesntMove, onPointerUp, onDoubleClick, }) => {
65
+ var _a, _b;
66
+ const playButtonRef = useRef(null);
67
+ const frame = Internals.Timeline.useTimelinePosition();
68
+ const [supportsFullscreen, setSupportsFullscreen] = useState(false);
69
+ const hovered = useHoverState(containerRef, hideControlsWhenPointerDoesntMove);
70
+ const { maxTimeLabelWidth, displayVerticalVolumeSlider } = useVideoControlsResize({
71
+ allowFullscreen,
72
+ playerWidth: (_a = canvasSize === null || canvasSize === void 0 ? void 0 : canvasSize.width) !== null && _a !== void 0 ? _a : 0,
73
+ });
74
+ const [shouldShowInitially, setInitiallyShowControls] = useState(() => {
75
+ if (typeof initiallyShowControls === 'boolean') {
76
+ return initiallyShowControls;
77
+ }
78
+ if (typeof initiallyShowControls === 'number') {
79
+ if (initiallyShowControls % 1 !== 0) {
80
+ throw new Error('initiallyShowControls must be an integer or a boolean');
81
+ }
82
+ if (Number.isNaN(initiallyShowControls)) {
83
+ throw new Error('initiallyShowControls must not be NaN');
84
+ }
85
+ if (!Number.isFinite(initiallyShowControls)) {
86
+ throw new Error('initiallyShowControls must be finite');
87
+ }
88
+ if (initiallyShowControls <= 0) {
89
+ throw new Error('initiallyShowControls must be a positive integer');
90
+ }
91
+ return initiallyShowControls;
92
+ }
93
+ throw new TypeError('initiallyShowControls must be a number or a boolean');
94
+ });
95
+ const containerCss = useMemo(() => {
96
+ // Hide if playing and mouse outside
97
+ const shouldShow = hovered || !player.playing || shouldShowInitially || alwaysShowControls;
98
+ return {
99
+ ...containerStyle,
100
+ opacity: Number(shouldShow),
101
+ };
102
+ }, [hovered, shouldShowInitially, player.playing, alwaysShowControls]);
103
+ useEffect(() => {
104
+ if (playButtonRef.current && spaceKeyToPlayOrPause) {
105
+ // This switches focus to play button when player.playing flag changes
106
+ playButtonRef.current.focus({
107
+ preventScroll: true,
108
+ });
109
+ }
110
+ }, [player.playing, spaceKeyToPlayOrPause]);
111
+ useEffect(() => {
112
+ var _a;
113
+ // Must be handled client-side to avoid SSR hydration mismatch
114
+ setSupportsFullscreen((_a = (typeof document !== 'undefined' &&
115
+ (document.fullscreenEnabled || document.webkitFullscreenEnabled))) !== null && _a !== void 0 ? _a : false);
116
+ }, []);
117
+ useEffect(() => {
118
+ if (shouldShowInitially === false) {
119
+ return;
120
+ }
121
+ const time = shouldShowInitially === true ? 2000 : shouldShowInitially;
122
+ const timeout = setTimeout(() => {
123
+ setInitiallyShowControls(false);
124
+ }, time);
125
+ return () => {
126
+ clearInterval(timeout);
127
+ };
128
+ }, [shouldShowInitially]);
129
+ const timeLabel = useMemo(() => {
130
+ return {
131
+ color: 'white',
132
+ fontFamily: 'sans-serif',
133
+ fontSize: 14,
134
+ maxWidth: maxTimeLabelWidth === null ? undefined : maxTimeLabelWidth,
135
+ overflow: 'hidden',
136
+ textOverflow: 'ellipsis',
137
+ };
138
+ }, [maxTimeLabelWidth]);
139
+ const playbackRates = useMemo(() => {
140
+ if (showPlaybackRateControl === true) {
141
+ return [0.5, 0.8, 1, 1.2, 1.5, 1.8, 2, 2.5, 3];
142
+ }
143
+ if (Array.isArray(showPlaybackRateControl)) {
144
+ for (const rate of showPlaybackRateControl) {
145
+ if (typeof rate !== 'number') {
146
+ throw new Error('Every item in showPlaybackRateControl must be a number');
147
+ }
148
+ if (rate <= 0) {
149
+ throw new Error('Every item in showPlaybackRateControl must be positive');
150
+ }
151
+ }
152
+ return showPlaybackRateControl;
153
+ }
154
+ return null;
155
+ }, [showPlaybackRateControl]);
156
+ const ref = useRef(null);
157
+ const flexRef = useRef(null);
158
+ const onPointerUpIfContainer = useCallback((e) => {
159
+ // Only if pressing the container
160
+ if (e.target === ref.current || e.target === flexRef.current) {
161
+ onPointerUp === null || onPointerUp === void 0 ? void 0 : onPointerUp(e);
162
+ }
163
+ }, [onPointerUp]);
164
+ const onDoubleClickIfContainer = useCallback((e) => {
165
+ // Only if pressing the container
166
+ if (e.target === ref.current || e.target === flexRef.current) {
167
+ onDoubleClick === null || onDoubleClick === void 0 ? void 0 : onDoubleClick(e);
168
+ }
169
+ }, [onDoubleClick]);
170
+ return (_jsxs("div", { ref: ref, style: containerCss, onPointerUp: onPointerUpIfContainer, onDoubleClick: onDoubleClickIfContainer, children: [_jsxs("div", { ref: flexRef, style: controlsRow, children: [_jsxs("div", { style: leftPartStyle, children: [_jsx("button", { ref: playButtonRef, type: "button", style: playerButtonStyle, onClick: player.playing ? player.pause : player.play, "aria-label": player.playing ? 'Pause video' : 'Play video', title: player.playing ? 'Pause video' : 'Play video', children: renderPlayPauseButton === null ? (_jsx(DefaultPlayPauseButton, { buffering: buffering, playing: player.playing })) : ((_b = renderPlayPauseButton({
171
+ playing: player.playing,
172
+ isBuffering: buffering,
173
+ })) !== null && _b !== void 0 ? _b : (_jsx(DefaultPlayPauseButton, { buffering: buffering, playing: player.playing }))) }), showVolumeControls ? (_jsxs(_Fragment, { children: [_jsx("div", { style: xSpacer }), _jsx(MediaVolumeSlider, { displayVerticalVolumeSlider: displayVerticalVolumeSlider })] })) : null, _jsx("div", { style: xSpacer }), _jsxs("div", { style: timeLabel, children: [formatTime(frame / fps), " / ", formatTime(durationInFrames / fps)] }), _jsx("div", { style: xSpacer })] }), _jsx("div", { style: flex1 }), playbackRates && canvasSize && (_jsx(PlaybackrateControl, { canvasSize: canvasSize, playbackRates: playbackRates })), playbackRates && supportsFullscreen && allowFullscreen ? (_jsx("div", { style: xSpacer })) : null, _jsx("div", { style: fullscreen, children: supportsFullscreen && allowFullscreen ? (_jsx("button", { type: "button", "aria-label": isFullscreen ? 'Exit fullscreen' : 'Enter Fullscreen', title: isFullscreen ? 'Exit fullscreen' : 'Enter Fullscreen', style: playerButtonStyle, onClick: isFullscreen
174
+ ? onExitFullscreenButtonClick
175
+ : onFullscreenButtonClick, children: renderFullscreenButton === null ? (_jsx(FullscreenIcon, { isFullscreen: isFullscreen })) : (renderFullscreenButton({ isFullscreen })) })) : null })] }), _jsx("div", { style: ySpacer }), _jsx(PlayerSeekBar, { onSeekEnd: onSeekEnd, onSeekStart: onSeekStart, durationInFrames: durationInFrames, inFrame: inFrame, outFrame: outFrame })] }));
176
+ };
@@ -0,0 +1,8 @@
1
+ /// <reference types="react" />
2
+ export declare const PlayerSeekBar: React.FC<{
3
+ durationInFrames: number;
4
+ onSeekStart: () => void;
5
+ onSeekEnd: () => void;
6
+ inFrame: number | null;
7
+ outFrame: number | null;
8
+ }>;
@@ -0,0 +1,145 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useCallback, useEffect, useMemo, useRef, useState } from 'react';
3
+ import { Internals, interpolate } from 'remotion';
4
+ import { useHoverState } from './use-hover-state.js';
5
+ import { usePlayer } from './use-player.js';
6
+ import { useElementSize } from './utils/use-element-size.js';
7
+ const getFrameFromX = (clientX, durationInFrames, width) => {
8
+ var _a;
9
+ const pos = clientX;
10
+ const frame = Math.round(interpolate(pos, [0, width], [0, (_a = durationInFrames - 1) !== null && _a !== void 0 ? _a : 0], {
11
+ extrapolateLeft: 'clamp',
12
+ extrapolateRight: 'clamp',
13
+ }));
14
+ return frame;
15
+ };
16
+ const BAR_HEIGHT = 5;
17
+ const KNOB_SIZE = 12;
18
+ const VERTICAL_PADDING = 4;
19
+ const containerStyle = {
20
+ userSelect: 'none',
21
+ paddingTop: VERTICAL_PADDING,
22
+ paddingBottom: VERTICAL_PADDING,
23
+ boxSizing: 'border-box',
24
+ cursor: 'pointer',
25
+ position: 'relative',
26
+ touchAction: 'none',
27
+ };
28
+ const barBackground = {
29
+ height: BAR_HEIGHT,
30
+ backgroundColor: 'rgba(255, 255, 255, 0.25)',
31
+ width: '100%',
32
+ borderRadius: BAR_HEIGHT / 2,
33
+ };
34
+ const findBodyInWhichDivIsLocated = (div) => {
35
+ let current = div;
36
+ while (current.parentElement) {
37
+ current = current.parentElement;
38
+ }
39
+ return current;
40
+ };
41
+ export const PlayerSeekBar = ({ durationInFrames, onSeekEnd, onSeekStart, inFrame, outFrame }) => {
42
+ var _a;
43
+ const containerRef = useRef(null);
44
+ const barHovered = useHoverState(containerRef, false);
45
+ const size = useElementSize(containerRef, {
46
+ triggerOnWindowResize: true,
47
+ shouldApplyCssTransforms: true,
48
+ });
49
+ const { seek, play, pause, playing } = usePlayer();
50
+ const frame = Internals.Timeline.useTimelinePosition();
51
+ const [dragging, setDragging] = useState({
52
+ dragging: false,
53
+ });
54
+ const width = (_a = size === null || size === void 0 ? void 0 : size.width) !== null && _a !== void 0 ? _a : 0;
55
+ const onPointerDown = useCallback((e) => {
56
+ var _a;
57
+ if (e.button !== 0) {
58
+ return;
59
+ }
60
+ const posLeft = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left;
61
+ const _frame = getFrameFromX(e.clientX - posLeft, durationInFrames, width);
62
+ pause();
63
+ seek(_frame);
64
+ setDragging({
65
+ dragging: true,
66
+ wasPlaying: playing,
67
+ });
68
+ onSeekStart();
69
+ }, [durationInFrames, width, pause, seek, playing, onSeekStart]);
70
+ const onPointerMove = useCallback((e) => {
71
+ var _a;
72
+ if (!size) {
73
+ throw new Error('Player has no size');
74
+ }
75
+ if (!dragging.dragging) {
76
+ return;
77
+ }
78
+ const posLeft = (_a = containerRef.current) === null || _a === void 0 ? void 0 : _a.getBoundingClientRect().left;
79
+ const _frame = getFrameFromX(e.clientX - posLeft, durationInFrames, size.width);
80
+ seek(_frame);
81
+ }, [dragging.dragging, durationInFrames, seek, size]);
82
+ const onPointerUp = useCallback(() => {
83
+ setDragging({
84
+ dragging: false,
85
+ });
86
+ if (!dragging.dragging) {
87
+ return;
88
+ }
89
+ if (dragging.wasPlaying) {
90
+ play();
91
+ }
92
+ else {
93
+ pause();
94
+ }
95
+ onSeekEnd();
96
+ }, [dragging, onSeekEnd, pause, play]);
97
+ useEffect(() => {
98
+ if (!dragging.dragging) {
99
+ return;
100
+ }
101
+ const body = findBodyInWhichDivIsLocated(containerRef.current);
102
+ body.addEventListener('pointermove', onPointerMove);
103
+ body.addEventListener('pointerup', onPointerUp);
104
+ return () => {
105
+ body.removeEventListener('pointermove', onPointerMove);
106
+ body.removeEventListener('pointerup', onPointerUp);
107
+ };
108
+ }, [dragging.dragging, onPointerMove, onPointerUp]);
109
+ const knobStyle = useMemo(() => {
110
+ return {
111
+ height: KNOB_SIZE,
112
+ width: KNOB_SIZE,
113
+ borderRadius: KNOB_SIZE / 2,
114
+ position: 'absolute',
115
+ top: VERTICAL_PADDING - KNOB_SIZE / 2 + 5 / 2,
116
+ backgroundColor: 'white',
117
+ left: Math.max(0, (frame / Math.max(1, durationInFrames - 1)) * width - KNOB_SIZE / 2),
118
+ boxShadow: '0 0 2px black',
119
+ opacity: Number(barHovered),
120
+ };
121
+ }, [barHovered, durationInFrames, frame, width]);
122
+ const fillStyle = useMemo(() => {
123
+ return {
124
+ height: BAR_HEIGHT,
125
+ backgroundColor: 'rgba(255, 255, 255, 1)',
126
+ width: ((frame - (inFrame !== null && inFrame !== void 0 ? inFrame : 0)) / (durationInFrames - 1)) * 100 + '%',
127
+ marginLeft: ((inFrame !== null && inFrame !== void 0 ? inFrame : 0) / (durationInFrames - 1)) * 100 + '%',
128
+ borderRadius: BAR_HEIGHT / 2,
129
+ };
130
+ }, [durationInFrames, frame, inFrame]);
131
+ const active = useMemo(() => {
132
+ return {
133
+ height: BAR_HEIGHT,
134
+ backgroundColor: 'rgba(255, 255, 255, 0.25)',
135
+ width: (((outFrame !== null && outFrame !== void 0 ? outFrame : durationInFrames - 1) - (inFrame !== null && inFrame !== void 0 ? inFrame : 0)) /
136
+ (durationInFrames - 1)) *
137
+ 100 +
138
+ '%',
139
+ marginLeft: ((inFrame !== null && inFrame !== void 0 ? inFrame : 0) / (durationInFrames - 1)) * 100 + '%',
140
+ borderRadius: BAR_HEIGHT / 2,
141
+ position: 'absolute',
142
+ };
143
+ }, [durationInFrames, inFrame, outFrame]);
144
+ return (_jsxs("div", { ref: containerRef, onPointerDown: onPointerDown, style: containerStyle, children: [_jsxs("div", { style: barBackground, children: [_jsx("div", { style: active }), _jsx("div", { style: fillStyle })] }), _jsx("div", { style: knobStyle })] }));
145
+ };
@@ -0,0 +1,46 @@
1
+ import React from 'react';
2
+ import type { PlayerRef } from './player-methods.js';
3
+ import type { RenderFullscreenButton, RenderPlayPauseButton } from './PlayerControls.js';
4
+ export type ErrorFallback = (info: {
5
+ error: Error;
6
+ }) => React.ReactNode;
7
+ export type RenderLoading = (canvas: {
8
+ height: number;
9
+ width: number;
10
+ isBuffering: boolean;
11
+ }) => React.ReactNode;
12
+ export type RenderPoster = RenderLoading;
13
+ export type PosterFillMode = 'player-size' | 'composition-size';
14
+ declare const _default: React.ForwardRefExoticComponent<{
15
+ controls: boolean;
16
+ loop: boolean;
17
+ autoPlay: boolean;
18
+ allowFullscreen: boolean;
19
+ inputProps: Record<string, unknown>;
20
+ showVolumeControls: boolean;
21
+ style?: React.CSSProperties | undefined;
22
+ clickToPlay: boolean;
23
+ doubleClickToFullscreen: boolean;
24
+ spaceKeyToPlayOrPause: boolean;
25
+ errorFallback: ErrorFallback;
26
+ playbackRate: number;
27
+ renderLoading: RenderLoading | undefined;
28
+ renderPoster: RenderLoading | undefined;
29
+ className: string | undefined;
30
+ moveToBeginningWhenEnded: boolean;
31
+ showPosterWhenPaused: boolean;
32
+ showPosterWhenEnded: boolean;
33
+ showPosterWhenUnplayed: boolean;
34
+ showPosterWhenBuffering: boolean;
35
+ inFrame: number | null;
36
+ outFrame: number | null;
37
+ initiallyShowControls: number | boolean;
38
+ renderPlayPauseButton: RenderPlayPauseButton | null;
39
+ renderFullscreen: RenderFullscreenButton | null;
40
+ alwaysShowControls: boolean;
41
+ showPlaybackRateControl: boolean | number[];
42
+ posterFillMode: PosterFillMode;
43
+ bufferStateDelayInMilliseconds: number;
44
+ hideControlsWhenPointerDoesntMove: number | boolean;
45
+ } & React.RefAttributes<PlayerRef>>;
46
+ export default _default;