@therealtinhtute/baroiplayer 1.0.0

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 (244) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +384 -0
  3. package/dist/context/media.js +2 -0
  4. package/dist/context/media.js.map +1 -0
  5. package/dist/context/media.mjs +15 -0
  6. package/dist/context/media.mjs.map +1 -0
  7. package/dist/context/store.js +2 -0
  8. package/dist/context/store.js.map +1 -0
  9. package/dist/context/store.mjs +5 -0
  10. package/dist/context/store.mjs.map +1 -0
  11. package/dist/context-BMteAJDN.js +1140 -0
  12. package/dist/context-BMteAJDN.js.map +1 -0
  13. package/dist/context-DCJ_scmO.cjs +23 -0
  14. package/dist/context-DCJ_scmO.cjs.map +1 -0
  15. package/dist/core-events-B5W_j8yU.js +480 -0
  16. package/dist/core-events-B5W_j8yU.js.map +1 -0
  17. package/dist/core-events-CN0-Vhhq.cjs +2 -0
  18. package/dist/core-events-CN0-Vhhq.cjs.map +1 -0
  19. package/dist/core-plugins-Bq9KLany.js +696 -0
  20. package/dist/core-plugins-Bq9KLany.js.map +1 -0
  21. package/dist/core-plugins-CPDSHMiQ.cjs +2 -0
  22. package/dist/core-plugins-CPDSHMiQ.cjs.map +1 -0
  23. package/dist/core.js +37 -0
  24. package/dist/core.js.map +1 -0
  25. package/dist/core.mjs +1217 -0
  26. package/dist/core.mjs.map +1 -0
  27. package/dist/enhanced-components-DHv0MFvG.js +1073 -0
  28. package/dist/enhanced-components-DHv0MFvG.js.map +1 -0
  29. package/dist/enhanced-components-DTIObgB7.cjs +2 -0
  30. package/dist/enhanced-components-DTIObgB7.cjs.map +1 -0
  31. package/dist/hooks-C_r8wexn.cjs +4 -0
  32. package/dist/hooks-C_r8wexn.cjs.map +1 -0
  33. package/dist/hooks-Da2wVXlF.js +1630 -0
  34. package/dist/hooks-Da2wVXlF.js.map +1 -0
  35. package/dist/index.css +1 -0
  36. package/dist/index.js +112 -0
  37. package/dist/index.js.map +1 -0
  38. package/dist/index.mjs +6126 -0
  39. package/dist/index.mjs.map +1 -0
  40. package/dist/minimal-components-DSq5sQpy.js +2002 -0
  41. package/dist/minimal-components-DSq5sQpy.js.map +1 -0
  42. package/dist/minimal-components-DflWiihN.cjs +2 -0
  43. package/dist/minimal-components-DflWiihN.cjs.map +1 -0
  44. package/dist/minimal-components.css +1 -0
  45. package/dist/mona-loading.gif +0 -0
  46. package/dist/performance-monitor-CUW6f5ll.cjs +2 -0
  47. package/dist/performance-monitor-CUW6f5ll.cjs.map +1 -0
  48. package/dist/performance-monitor-rMW1RgV3.js +302 -0
  49. package/dist/performance-monitor-rMW1RgV3.js.map +1 -0
  50. package/dist/utils-BnscpYYd.js +2798 -0
  51. package/dist/utils-BnscpYYd.js.map +1 -0
  52. package/dist/utils-D_czS_0K.cjs +9 -0
  53. package/dist/utils-D_czS_0K.cjs.map +1 -0
  54. package/dist/utils.js +2 -0
  55. package/dist/utils.js.map +1 -0
  56. package/dist/utils.mjs +7 -0
  57. package/dist/utils.mjs.map +1 -0
  58. package/package.json +114 -0
  59. package/src/adapters/videojs-adapter.tsx +470 -0
  60. package/src/assets/mona-loading.gif +0 -0
  61. package/src/components/AnimateLoading.tsx +115 -0
  62. package/src/components/LoadingState.tsx +248 -0
  63. package/src/components/accessibility/keyboard-help-overlay.tsx +213 -0
  64. package/src/components/audio-player.tsx +85 -0
  65. package/src/components/basic/index.ts +37 -0
  66. package/src/components/enhanced/advanced-features.tsx +316 -0
  67. package/src/components/enhanced/debug-panel.tsx +422 -0
  68. package/src/components/enhanced/enhanced-controls.tsx +600 -0
  69. package/src/components/enhanced/enhanced-media-player.tsx +509 -0
  70. package/src/components/enhanced/error-handling.tsx +345 -0
  71. package/src/components/enhanced/index.ts +39 -0
  72. package/src/components/enhanced/media-player-enhanced.tsx +349 -0
  73. package/src/components/examples/basic-video-player.tsx +55 -0
  74. package/src/components/examples/custom-controls-example.tsx +63 -0
  75. package/src/components/examples/enhanced-controls-example.tsx +114 -0
  76. package/src/components/examples/enhanced-media-player-example.tsx +293 -0
  77. package/src/components/examples/loading-states-demo.tsx +142 -0
  78. package/src/components/examples/react-19-demo.tsx +381 -0
  79. package/src/components/examples/volume-orientation-demo.tsx +114 -0
  80. package/src/components/icon-demo.tsx +209 -0
  81. package/src/components/icons/index.tsx +166 -0
  82. package/src/components/icons/svg-icons/ArrowLeftIcon.tsx +18 -0
  83. package/src/components/icons/svg-icons/ArrowRightIcon.tsx +18 -0
  84. package/src/components/icons/svg-icons/AudioIcon.tsx +22 -0
  85. package/src/components/icons/svg-icons/BackwardIcon.tsx +12 -0
  86. package/src/components/icons/svg-icons/CameraIcon.tsx +19 -0
  87. package/src/components/icons/svg-icons/CheckIcon.tsx +19 -0
  88. package/src/components/icons/svg-icons/EnablePiPIcon.tsx +17 -0
  89. package/src/components/icons/svg-icons/ForwardIcon.tsx +12 -0
  90. package/src/components/icons/svg-icons/FullscreenEnterIcon.tsx +23 -0
  91. package/src/components/icons/svg-icons/FullscreenExitIcon.tsx +23 -0
  92. package/src/components/icons/svg-icons/LoadingIcon.tsx +32 -0
  93. package/src/components/icons/svg-icons/PauseIcon.tsx +23 -0
  94. package/src/components/icons/svg-icons/PlayIcon.tsx +21 -0
  95. package/src/components/icons/svg-icons/PlaybackSpeedIcon.tsx +23 -0
  96. package/src/components/icons/svg-icons/QualityIcon.tsx +21 -0
  97. package/src/components/icons/svg-icons/SettingsIcon.tsx +12 -0
  98. package/src/components/icons/svg-icons/SliderIcon.tsx +21 -0
  99. package/src/components/icons/svg-icons/SubtitleIcon.tsx +21 -0
  100. package/src/components/icons/svg-icons/SubtitleOffIcon.tsx +25 -0
  101. package/src/components/icons/svg-icons/UnPiPIcon.tsx +17 -0
  102. package/src/components/icons/svg-icons/VolumeMutedIcon.tsx +16 -0
  103. package/src/components/icons/svg-icons/VolumeOneIcon.tsx +22 -0
  104. package/src/components/icons/svg-icons/VolumeThreeIcon.tsx +16 -0
  105. package/src/components/icons/svg-icons/VolumeTwoIcon.tsx +16 -0
  106. package/src/components/legacy.tsx +93 -0
  107. package/src/components/media-metadata-display.tsx +100 -0
  108. package/src/components/media-player-audio.tsx +39 -0
  109. package/src/components/media-player-controls.tsx +226 -0
  110. package/src/components/media-player-error.tsx +163 -0
  111. package/src/components/media-player-fullscreen.tsx +109 -0
  112. package/src/components/media-player-hls.tsx +111 -0
  113. package/src/components/media-player-loading.tsx +76 -0
  114. package/src/components/media-player-play.tsx +75 -0
  115. package/src/components/media-player-root.tsx +340 -0
  116. package/src/components/media-player-seek.tsx +168 -0
  117. package/src/components/media-player-time.tsx +99 -0
  118. package/src/components/media-player-tooltip.tsx +58 -0
  119. package/src/components/media-player-video.tsx +39 -0
  120. package/src/components/media-player-volume.tsx +155 -0
  121. package/src/components/media-player.tsx +257 -0
  122. package/src/components/media-suspense.tsx +362 -0
  123. package/src/components/player-settings-form.tsx +163 -0
  124. package/src/components/react-player-wrapper.tsx +651 -0
  125. package/src/components/simple-video-player.tsx +60 -0
  126. package/src/components/ui/enhanced-seek-bar.tsx +235 -0
  127. package/src/components/ui/fullscreen-button.tsx +60 -0
  128. package/src/components/ui/media-resource-preloader.tsx +395 -0
  129. package/src/components/ui/play-button.tsx +107 -0
  130. package/src/components/ui/seek-bar.tsx +161 -0
  131. package/src/components/ui/time-display.tsx +40 -0
  132. package/src/components/ui/volume-control.tsx +143 -0
  133. package/src/components/unified/base-media-player.tsx +246 -0
  134. package/src/components/unified/media-player.tsx +75 -0
  135. package/src/components/variants/minimal/AccessibleMinimalPlayer.tsx +561 -0
  136. package/src/components/variants/minimal/EnhancedMinimalMediaPlayer.tsx +552 -0
  137. package/src/components/variants/minimal/MinimalControls.tsx +142 -0
  138. package/src/components/variants/minimal/MinimalLoading.tsx +32 -0
  139. package/src/components/variants/minimal/MinimalMediaPlayer.tsx +315 -0
  140. package/src/components/variants/minimal/MinimalOverlay.tsx +64 -0
  141. package/src/components/variants/minimal/MinimalPlayButton.tsx +65 -0
  142. package/src/components/variants/minimal/MinimalSeekBar.tsx +150 -0
  143. package/src/components/variants/minimal/MinimalVolumeControl.tsx +80 -0
  144. package/src/components/variants/minimal/SimpleMinimalPlayer.tsx +210 -0
  145. package/src/components/variants/minimal/components/CenterPlayButton.tsx +22 -0
  146. package/src/components/variants/minimal/components/ControlBar.tsx +146 -0
  147. package/src/components/variants/minimal/components/EnhancedSettingsMenu.tsx +361 -0
  148. package/src/components/variants/minimal/components/PlaybackControls.tsx +51 -0
  149. package/src/components/variants/minimal/components/RightControls.tsx +173 -0
  150. package/src/components/variants/minimal/components/SeekBar.tsx +131 -0
  151. package/src/components/variants/minimal/components/SettingsDropdown.tsx +70 -0
  152. package/src/components/variants/minimal/components/SubtitleDisplay.tsx +21 -0
  153. package/src/components/variants/minimal/components/TimeDisplay.tsx +18 -0
  154. package/src/components/variants/minimal/components/VideoElement.tsx +40 -0
  155. package/src/components/variants/minimal/components/VolumeControl.tsx +217 -0
  156. package/src/components/variants/minimal/index.ts +23 -0
  157. package/src/components/video-player.tsx +100 -0
  158. package/src/context/error-handling.ts +394 -0
  159. package/src/context/media-context.tsx +208 -0
  160. package/src/context/media-provider.tsx +265 -0
  161. package/src/context/media-store.ts +379 -0
  162. package/src/context/persistence.ts +453 -0
  163. package/src/core/events/event-system.ts +442 -0
  164. package/src/core/events/hooks.ts +302 -0
  165. package/src/core/events/index.ts +22 -0
  166. package/src/core/events/middleware.ts +269 -0
  167. package/src/core/index.ts +22 -0
  168. package/src/core/optimization/bundle-optimizer.tsx +308 -0
  169. package/src/core/performance/cicd.ts +96 -0
  170. package/src/core/performance/index.ts +38 -0
  171. package/src/core/performance/media-loading-optimizer.ts +538 -0
  172. package/src/core/performance/performance-budgets.ts +432 -0
  173. package/src/core/performance/performance-monitor.tsx +476 -0
  174. package/src/core/performance/performance-testing.ts +459 -0
  175. package/src/core/plugins/base-plugin.ts +224 -0
  176. package/src/core/plugins/enhanced-plugin-system.ts +411 -0
  177. package/src/core/plugins/examples/analytics-plugin.ts +242 -0
  178. package/src/core/plugins/index.ts +39 -0
  179. package/src/core/plugins/registry.ts +327 -0
  180. package/src/core/plugins/types.ts +159 -0
  181. package/src/core/plugins/utils.ts +316 -0
  182. package/src/core/progressive-loading.tsx +322 -0
  183. package/src/core/providers/enhanced-hls-provider.ts +339 -0
  184. package/src/core/providers/service-provider.tsx +168 -0
  185. package/src/core/utils.tsx +38 -0
  186. package/src/features/media-session/media-session-manager.ts +429 -0
  187. package/src/features/picture-in-picture/pip-manager.ts +429 -0
  188. package/src/features/playlist/playlist-manager.ts +606 -0
  189. package/src/features/subtitles/subtitle-manager.ts +441 -0
  190. package/src/features/subtitles/subtitle-parser.ts +280 -0
  191. package/src/features/thumbnails/thumbnail-generator.ts +519 -0
  192. package/src/hooks/accessibility/index.ts +27 -0
  193. package/src/hooks/accessibility/use-accessibility-preferences.ts +188 -0
  194. package/src/hooks/accessibility/use-focus-management.ts +176 -0
  195. package/src/hooks/accessibility/use-keyboard-shortcuts.ts +144 -0
  196. package/src/hooks/accessibility/use-screen-reader.ts +182 -0
  197. package/src/hooks/core/index.ts +47 -0
  198. package/src/hooks/legacy.ts +27 -0
  199. package/src/hooks/use-enhanced-media-player.ts +468 -0
  200. package/src/hooks/use-intelligent-preloading.ts +358 -0
  201. package/src/hooks/use-keyboard-controls.ts +115 -0
  202. package/src/hooks/use-media-actions.ts +175 -0
  203. package/src/hooks/use-media-metadata.ts +89 -0
  204. package/src/hooks/use-media-optimistic.ts +270 -0
  205. package/src/hooks/use-media-player.ts +312 -0
  206. package/src/hooks/use-media-state.ts +190 -0
  207. package/src/hooks/use-memory-optimization.ts +358 -0
  208. package/src/hooks/use-optimistic-controls.ts +92 -0
  209. package/src/hooks/use-optimized-media.ts +263 -0
  210. package/src/hooks/use-touch-gestures.ts +417 -0
  211. package/src/hooks/useEnhancedSubtitles.ts +258 -0
  212. package/src/hooks/useKeyboardShortcuts.ts +74 -0
  213. package/src/hooks/useMediaControls.ts +52 -0
  214. package/src/hooks/useScreenshot.ts +57 -0
  215. package/src/hooks/useSubtitles.ts +91 -0
  216. package/src/hooks/useVideoPlayer.ts +232 -0
  217. package/src/icons/components/FullscreenIcon.tsx +37 -0
  218. package/src/icons/components/SettingsIcon.tsx +38 -0
  219. package/src/icons/components/animated/LoadingIcon.tsx +43 -0
  220. package/src/icons/components/animated/PlayPauseIcon.tsx +50 -0
  221. package/src/icons/components/media/PauseIcon.tsx +39 -0
  222. package/src/icons/components/media/PlayIcon.tsx +38 -0
  223. package/src/icons/components/volume/VolumeIcon.tsx +39 -0
  224. package/src/icons/components/volume/VolumeOffIcon.tsx +39 -0
  225. package/src/icons/index.ts +56 -0
  226. package/src/icons/provider.tsx +64 -0
  227. package/src/icons/types.ts +40 -0
  228. package/src/index-enhanced.ts +35 -0
  229. package/src/index-legacy.ts +326 -0
  230. package/src/index.css +102 -0
  231. package/src/index.ts +216 -0
  232. package/src/lib/deprecation.ts +51 -0
  233. package/src/lib/format-time.ts +37 -0
  234. package/src/lib/index.ts +3 -0
  235. package/src/lib/utils.ts +6 -0
  236. package/src/styles/globals.css +462 -0
  237. package/src/styles/minimal-player.css +589 -0
  238. package/src/styles/pixel-art.css +46 -0
  239. package/src/styles/videojs.css +100 -0
  240. package/src/test/setup.ts +79 -0
  241. package/src/types/events.ts +47 -0
  242. package/src/types/formats.ts +95 -0
  243. package/src/types/index.ts +190 -0
  244. package/src/types/videojs-plugins.d.ts +14 -0
@@ -0,0 +1,210 @@
1
+ "use client"
2
+
3
+ import { useState, useEffect, useRef, useCallback } from "react"
4
+ import "../../../styles/minimal-player.css"
5
+ import { cn } from "../../../lib/utils"
6
+ import { useVideoPlayer } from "../../../hooks/useVideoPlayer"
7
+ import { useEnhancedSubtitles } from "../../../hooks/useEnhancedSubtitles"
8
+ import { useMediaControls } from "../../../hooks/useMediaControls"
9
+ import { useKeyboardShortcuts } from "../../../hooks/useKeyboardShortcuts"
10
+ import { useScreenshot } from "../../../hooks/useScreenshot"
11
+ import { VideoElement } from "./components/VideoElement"
12
+ import { SubtitleDisplay } from "./components/SubtitleDisplay"
13
+ import { CenterPlayButton } from "./components/CenterPlayButton"
14
+ import { ControlBar } from "./components/ControlBar"
15
+ import { LoadingState, CustomLoading, LoadingPresets } from "../../LoadingState"
16
+ import type { LoadingStateProps } from "../../LoadingState"
17
+
18
+ export interface SimpleMinimalPlayerProps {
19
+ src: string
20
+ poster?: string
21
+ className?: string
22
+ subtitleSrc?: string
23
+ subtitleTracks?: Array<{
24
+ id: string
25
+ label: string
26
+ language?: string
27
+ src?: string
28
+ }>
29
+ crossOrigin?: "anonymous" | "use-credentials"
30
+ volumeOrientation?: "horizontal" | "vertical"
31
+ loadingComponent?: React.ComponentType<{ context: "initial" | "seeking" | "buffering" }>
32
+ showLoadingState?: boolean
33
+ loadingProps?: Partial<LoadingStateProps>
34
+ }
35
+
36
+ export function SimpleMinimalPlayer(props: SimpleMinimalPlayerProps) {
37
+ const {
38
+ src,
39
+ poster,
40
+ className,
41
+ subtitleSrc,
42
+ subtitleTracks,
43
+ crossOrigin,
44
+ volumeOrientation = "horizontal",
45
+ loadingComponent: LoadingComponent = undefined,
46
+ showLoadingState = true,
47
+ loadingProps = {}
48
+ } = props
49
+ const containerRef = useRef<HTMLDivElement>(null)
50
+ const [showSettings, setShowSettings] = useState(false)
51
+ const [playbackRate, setPlaybackRate] = useState(1)
52
+
53
+ const { videoRef, state: videoState, controls: videoControls } = useVideoPlayer(containerRef)
54
+ const {
55
+ subtitlesEnabled,
56
+ currentSubtitle,
57
+ toggleSubtitles,
58
+ getCurrentSubtitle,
59
+ setCurrentSubtitle,
60
+ selectSubtitleTrack,
61
+ availableTracks,
62
+ currentTrackId,
63
+ loadError,
64
+ hasSubtitles
65
+ } = useEnhancedSubtitles({
66
+ subtitleSrc,
67
+ subtitleTracks,
68
+ onLoadError: (error) => console.error("Subtitle load error:", error)
69
+ })
70
+ const { takeScreenshot } = useScreenshot(videoRef)
71
+ const {
72
+ controlsVisible,
73
+ showVolumeSlider,
74
+ setShowVolumeSlider,
75
+ handleMouseMove,
76
+ handleMouseEnter,
77
+ handleMouseLeave
78
+ } = useMediaControls(videoState.isPlaying, showSettings)
79
+
80
+ // Update subtitle display based on current time
81
+ useEffect(() => {
82
+ if (subtitlesEnabled) {
83
+ const subtitle = getCurrentSubtitle(videoState.currentTime)
84
+ setCurrentSubtitle(subtitle)
85
+ }
86
+ }, [videoState.currentTime, subtitlesEnabled, getCurrentSubtitle, setCurrentSubtitle])
87
+
88
+ // Change playback rate
89
+ const changePlaybackRate = (rate: number) => {
90
+ if (!videoRef.current) return
91
+ videoRef.current.playbackRate = rate
92
+ setPlaybackRate(rate)
93
+ setShowSettings(false)
94
+ }
95
+
96
+ // Keyboard shortcuts
97
+ useKeyboardShortcuts({
98
+ videoControls,
99
+ toggleSubtitles,
100
+ takeScreenshot,
101
+ duration: videoState.duration
102
+ })
103
+
104
+ return (
105
+ <div
106
+ ref={containerRef}
107
+ className={cn("minimal-player relative rounded-lg bg-black", className)}
108
+ style={{ overflow: "hidden" }}
109
+ onMouseMove={handleMouseMove}
110
+ onMouseEnter={handleMouseEnter}
111
+ onMouseLeave={handleMouseLeave}
112
+ >
113
+ <VideoElement
114
+ videoRef={videoRef}
115
+ src={src}
116
+ poster={poster}
117
+ subtitleSrc={subtitleSrc}
118
+ subtitlesEnabled={subtitlesEnabled}
119
+ crossOrigin={crossOrigin}
120
+ onTogglePlay={videoControls.togglePlay}
121
+ />
122
+
123
+ <SubtitleDisplay
124
+ subtitlesEnabled={subtitlesEnabled}
125
+ subtitleText={currentSubtitle}
126
+ />
127
+
128
+ {/* Show center play button only when not loading */}
129
+ {!videoState.isLoading && (
130
+ <CenterPlayButton
131
+ isPlaying={videoState.isPlaying}
132
+ onTogglePlay={videoControls.togglePlay}
133
+ />
134
+ )}
135
+
136
+ <ControlBar
137
+ controlsVisible={controlsVisible}
138
+ currentTime={videoState.currentTime}
139
+ duration={videoState.duration}
140
+ isPlaying={videoState.isPlaying}
141
+ volume={videoState.volume}
142
+ isMuted={videoState.isMuted}
143
+ showVolumeSlider={showVolumeSlider}
144
+ isFullscreen={videoState.isFullscreen}
145
+ showSettings={showSettings}
146
+ playbackRate={playbackRate}
147
+ subtitleSrc={subtitleSrc}
148
+ subtitlesEnabled={subtitlesEnabled}
149
+ subtitleTracks={availableTracks}
150
+ currentTrackId={currentTrackId}
151
+ hasSubtitles={hasSubtitles}
152
+ subtitleLoadError={loadError}
153
+ volumeOrientation={volumeOrientation}
154
+ bufferedRanges={videoState.bufferedRanges}
155
+ isSeeking={videoState.isSeeking}
156
+ onSeek={videoControls.seekTo}
157
+ onTogglePlay={videoControls.togglePlay}
158
+ onSeekBackward={videoControls.seekBackward}
159
+ onSeekForward={videoControls.seekForward}
160
+ onToggleMute={videoControls.toggleMute}
161
+ onVolumeChange={videoControls.setVolume}
162
+ onShowVolumeSlider={setShowVolumeSlider}
163
+ onToggleSubtitles={toggleSubtitles}
164
+ onSelectSubtitleTrack={selectSubtitleTrack}
165
+ onTakeScreenshot={takeScreenshot}
166
+ onToggleFullscreen={videoControls.toggleFullscreen}
167
+ onToggleSettings={() => setShowSettings(!showSettings)}
168
+ onChangePlaybackRate={changePlaybackRate}
169
+ />
170
+
171
+ {/* Loading states */}
172
+ {showLoadingState && (
173
+ <>
174
+ {/* Initial loading */}
175
+ {videoState.isLoading && !videoState.isSeeking && !videoState.isBuffering && (
176
+ LoadingComponent ? (
177
+ <CustomLoading context="initial">
178
+ <LoadingComponent context="initial" />
179
+ </CustomLoading>
180
+ ) : (
181
+ <LoadingPresets.Initial {...loadingProps} />
182
+ )
183
+ )}
184
+
185
+ {/* Seeking */}
186
+ {videoState.isSeeking && (
187
+ LoadingComponent ? (
188
+ <CustomLoading context="seeking">
189
+ <LoadingComponent context="seeking" />
190
+ </CustomLoading>
191
+ ) : (
192
+ <LoadingPresets.Seeking {...loadingProps} />
193
+ )
194
+ )}
195
+
196
+ {/* Buffering */}
197
+ {videoState.isBuffering && !videoState.isSeeking && (
198
+ LoadingComponent ? (
199
+ <CustomLoading context="buffering">
200
+ <LoadingComponent context="buffering" />
201
+ </CustomLoading>
202
+ ) : (
203
+ <LoadingPresets.Buffering {...loadingProps} />
204
+ )
205
+ )}
206
+ </>
207
+ )}
208
+ </div>
209
+ )
210
+ }
@@ -0,0 +1,22 @@
1
+ import React, { memo } from "react"
2
+ import { defaultMinimalIcons } from "../../../icons"
3
+
4
+ interface CenterPlayButtonProps {
5
+ isPlaying: boolean
6
+ onTogglePlay: () => void
7
+ }
8
+
9
+ export const CenterPlayButton = function CenterPlayButton({
10
+ isPlaying,
11
+ onTogglePlay
12
+ }: CenterPlayButtonProps) {
13
+ if (isPlaying) return null
14
+
15
+ const PlayIcon = defaultMinimalIcons.play
16
+
17
+ return (
18
+ <div className="minimal-center-play cursor-pointer" onClick={onTogglePlay}>
19
+ {PlayIcon && <PlayIcon size={60} />}
20
+ </div>
21
+ )
22
+ }
@@ -0,0 +1,146 @@
1
+ import React, { memo } from "react"
2
+ import { cn } from "../../../../lib/utils"
3
+ import { SeekBar } from "./SeekBar"
4
+ import { PlaybackControls } from "./PlaybackControls"
5
+ import { VolumeControl } from "./VolumeControl"
6
+ import { TimeDisplay } from "./TimeDisplay"
7
+ import { RightControls } from "./RightControls"
8
+ import type { BufferedRange } from "../../../../hooks/useVideoPlayer"
9
+
10
+ interface ControlBarProps {
11
+ controlsVisible: boolean
12
+ currentTime: number
13
+ duration: number
14
+ isPlaying: boolean
15
+ volume: number
16
+ isMuted: boolean
17
+ showVolumeSlider: boolean
18
+ isFullscreen: boolean
19
+ showSettings: boolean
20
+ playbackRate: number
21
+ subtitleSrc?: string
22
+ subtitlesEnabled: boolean
23
+ subtitleTracks?: Array<{
24
+ id: string
25
+ label: string
26
+ language?: string
27
+ src?: string
28
+ }>
29
+ currentTrackId?: string | null
30
+ hasSubtitles?: boolean
31
+ subtitleLoadError?: Error | null
32
+ volumeOrientation?: "horizontal" | "vertical"
33
+ bufferedRanges?: BufferedRange[]
34
+ isSeeking?: boolean
35
+ onSeek: (time: number) => void
36
+ onTogglePlay: () => void
37
+ onSeekBackward: () => void
38
+ onSeekForward: () => void
39
+ onToggleMute: () => void
40
+ onVolumeChange: (volume: number) => void
41
+ onShowVolumeSlider: (show: boolean) => void
42
+ onToggleSubtitles: () => void
43
+ onSelectSubtitleTrack?: (trackId: string | null) => void
44
+ onTakeScreenshot: (ctrlKey: boolean) => void
45
+ onToggleFullscreen: () => void
46
+ onToggleSettings: () => void
47
+ onChangePlaybackRate: (rate: number) => void
48
+ }
49
+
50
+ export const ControlBar = function ControlBar({
51
+ controlsVisible,
52
+ currentTime,
53
+ duration,
54
+ isPlaying,
55
+ volume,
56
+ isMuted,
57
+ showVolumeSlider,
58
+ isFullscreen,
59
+ showSettings,
60
+ playbackRate,
61
+ subtitleSrc,
62
+ subtitlesEnabled,
63
+ subtitleTracks,
64
+ currentTrackId,
65
+ hasSubtitles,
66
+ subtitleLoadError,
67
+ volumeOrientation = "horizontal",
68
+ bufferedRanges,
69
+ isSeeking,
70
+ onSeek,
71
+ onTogglePlay,
72
+ onSeekBackward,
73
+ onSeekForward,
74
+ onToggleMute,
75
+ onVolumeChange,
76
+ onShowVolumeSlider,
77
+ onToggleSubtitles,
78
+ onSelectSubtitleTrack,
79
+ onTakeScreenshot,
80
+ onToggleFullscreen,
81
+ onToggleSettings,
82
+ onChangePlaybackRate
83
+ }: ControlBarProps) {
84
+ return (
85
+ <div
86
+ className={cn(
87
+ "minimal-control-bar",
88
+ "absolute right-0 bottom-0 left-0 z-40",
89
+ "px-6 py-3 transition-all duration-200",
90
+ controlsVisible ? "minimal-controls-visible" : "minimal-controls-hidden"
91
+ )}
92
+ >
93
+ <SeekBar
94
+ currentTime={currentTime}
95
+ duration={duration}
96
+ bufferedRanges={bufferedRanges}
97
+ isSeeking={isSeeking}
98
+ onSeek={onSeek}
99
+ />
100
+
101
+ <div className="flex items-center justify-between">
102
+ <div className="flex items-center gap-2">
103
+ <PlaybackControls
104
+ isPlaying={isPlaying}
105
+ onTogglePlay={onTogglePlay}
106
+ onSeekBackward={onSeekBackward}
107
+ onSeekForward={onSeekForward}
108
+ />
109
+
110
+ <VolumeControl
111
+ volume={volume}
112
+ isMuted={isMuted}
113
+ showVolumeSlider={showVolumeSlider}
114
+ onToggleMute={onToggleMute}
115
+ onVolumeChange={onVolumeChange}
116
+ onShowVolumeSlider={onShowVolumeSlider}
117
+ orientation={volumeOrientation}
118
+ />
119
+
120
+ <TimeDisplay
121
+ currentTime={currentTime}
122
+ duration={duration}
123
+ />
124
+ </div>
125
+
126
+ <RightControls
127
+ subtitleSrc={subtitleSrc}
128
+ subtitlesEnabled={subtitlesEnabled}
129
+ subtitleTracks={subtitleTracks}
130
+ currentTrackId={currentTrackId}
131
+ hasSubtitles={hasSubtitles}
132
+ subtitleLoadError={subtitleLoadError}
133
+ isFullscreen={isFullscreen}
134
+ showSettings={showSettings}
135
+ playbackRate={playbackRate}
136
+ onToggleSubtitles={onToggleSubtitles}
137
+ onSelectSubtitleTrack={onSelectSubtitleTrack}
138
+ onTakeScreenshot={onTakeScreenshot}
139
+ onToggleFullscreen={onToggleFullscreen}
140
+ onToggleSettings={onToggleSettings}
141
+ onChangePlaybackRate={onChangePlaybackRate}
142
+ />
143
+ </div>
144
+ </div>
145
+ )
146
+ }