@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,462 @@
1
+ /* BaroiPlayer Global Styles
2
+ * Modern media player with Tailwind CSS v4 integration
3
+ * Includes design tokens, accessibility features, and responsive design
4
+ */
5
+
6
+ /* Import Tailwind CSS base styles */
7
+ @import "tailwindcss";
8
+
9
+ /* Import design tokens from UI package if available */
10
+ @import "@rp/ui/styles/design-tokens.css";
11
+
12
+ /* ===== ROOT STYLES & CSS VARIABLES ===== */
13
+ :root {
14
+ /* Media Player Colors */
15
+ --media-primary: oklch(62% 0.25 240);
16
+ --media-secondary: oklch(75% 0.18 180);
17
+ --media-accent: oklch(85% 0.12 60);
18
+
19
+ /* Player Background */
20
+ --media-bg: oklch(8% 0.02 240);
21
+ --media-surface: oklch(12% 0.02 240);
22
+ --media-overlay: oklch(15% 0.02 240 / 0.9);
23
+
24
+ /* Text Colors */
25
+ --media-text-primary: oklch(95% 0.005 240);
26
+ --media-text-secondary: oklch(75% 0.008 240);
27
+ --media-text-muted: oklch(60% 0.01 240);
28
+
29
+ /* Control States */
30
+ --media-control-idle: oklch(68% 0.20 142);
31
+ --media-control-hover: oklch(85% 0.08 240);
32
+ --media-control-active: oklch(72% 0.15 30);
33
+ --media-control-disabled: oklch(45% 0.005 240);
34
+
35
+ /* Progress Bar */
36
+ --media-progress-bg: oklch(25% 0.02 240);
37
+ --media-progress-fill: oklch(75% 0.18 240);
38
+ --media-progress-buffered: oklch(60% 0.12 240);
39
+
40
+ /* Focus & Accessibility */
41
+ --media-focus-outline: 2px solid var(--media-secondary);
42
+ --media-focus-offset: 2px;
43
+
44
+ /* Animations */
45
+ --media-transition: 200ms;
46
+ --media-ease: cubic-bezier(0.4, 0, 0.2, 1);
47
+ }
48
+
49
+ /* Dark mode support */
50
+ @media (prefers-color-scheme: dark) {
51
+ :root {
52
+ --media-bg: oklch(6% 0.01 240);
53
+ --media-surface: oklch(10% 0.01 240);
54
+ --media-text-primary: oklch(98% 0.003 240);
55
+ }
56
+ }
57
+
58
+ /* ===== BASE STYLES ===== */
59
+ * {
60
+ box-sizing: border-box;
61
+ }
62
+
63
+ body {
64
+ margin: 0;
65
+ font-family: system-ui, -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
66
+ background-color: var(--media-bg);
67
+ color: var(--media-text-primary);
68
+ line-height: 1.5;
69
+ }
70
+
71
+ /* ===== MEDIA PLAYER COMPONENT STYLES ===== */
72
+
73
+ /* Base Player Container */
74
+ .media-player {
75
+ position: relative;
76
+ width: 100%;
77
+ height: 100%;
78
+ background-color: var(--media-bg);
79
+ border-radius: 0.5rem;
80
+ overflow: hidden;
81
+ }
82
+
83
+ /* Player Video Element */
84
+ .media-player video,
85
+ .media-player audio {
86
+ width: 100%;
87
+ height: 100%;
88
+ object-fit: contain;
89
+ }
90
+
91
+ /* Control Panel */
92
+ .media-player-controls {
93
+ position: absolute;
94
+ bottom: 0;
95
+ left: 0;
96
+ right: 0;
97
+ background: linear-gradient(to top, var(--media-overlay), transparent);
98
+ padding: 1rem;
99
+ display: flex;
100
+ align-items: center;
101
+ gap: 0.75rem;
102
+ transition: opacity var(--media-transition) var(--media-ease);
103
+ }
104
+
105
+ /* Play/Pause Button */
106
+ .media-player-play-button {
107
+ width: 2.5rem;
108
+ height: 2.5rem;
109
+ border-radius: 50%;
110
+ background-color: var(--media-control-idle);
111
+ border: none;
112
+ color: white;
113
+ cursor: pointer;
114
+ display: flex;
115
+ align-items: center;
116
+ justify-content: center;
117
+ transition: all var(--media-transition) var(--media-ease);
118
+ }
119
+
120
+ .media-player-play-button:hover {
121
+ background-color: var(--media-control-hover);
122
+ transform: scale(1.05);
123
+ }
124
+
125
+ .media-player-play-button:focus {
126
+ outline: var(--media-focus-outline);
127
+ outline-offset: var(--media-focus-offset);
128
+ }
129
+
130
+ /* Progress Bar */
131
+ .media-player-progress {
132
+ flex: 1;
133
+ height: 0.5rem;
134
+ background-color: var(--media-progress-bg);
135
+ border-radius: 0.25rem;
136
+ position: relative;
137
+ cursor: pointer;
138
+ overflow: hidden;
139
+ }
140
+
141
+ .media-player-progress-bar {
142
+ height: 100%;
143
+ background-color: var(--media-progress-fill);
144
+ border-radius: 0.25rem;
145
+ position: relative;
146
+ transition: width 0.1s linear;
147
+ }
148
+
149
+ .media-player-progress-buffered {
150
+ height: 100%;
151
+ background-color: var(--media-progress-buffered);
152
+ border-radius: 0.25rem;
153
+ position: absolute;
154
+ top: 0;
155
+ left: 0;
156
+ }
157
+
158
+ /* Volume Control */
159
+ .media-player-volume {
160
+ display: flex;
161
+ align-items: center;
162
+ gap: 0.5rem;
163
+ }
164
+
165
+ .media-player-volume-slider {
166
+ width: 6rem;
167
+ height: 0.25rem;
168
+ background-color: var(--media-progress-bg);
169
+ border-radius: 0.125rem;
170
+ outline: none;
171
+ cursor: pointer;
172
+ }
173
+
174
+ .media-player-volume-slider::-webkit-slider-thumb {
175
+ appearance: none;
176
+ width: 1rem;
177
+ height: 1rem;
178
+ border-radius: 50%;
179
+ background-color: var(--media-control-idle);
180
+ cursor: pointer;
181
+ }
182
+
183
+ /* Time Display */
184
+ .media-player-time {
185
+ font-size: 0.875rem;
186
+ color: var(--media-text-secondary);
187
+ font-variant-numeric: tabular-nums;
188
+ min-width: 5rem;
189
+ text-align: center;
190
+ }
191
+
192
+ /* Fullscreen Button */
193
+ .media-player-fullscreen-button {
194
+ width: 2rem;
195
+ height: 2rem;
196
+ border-radius: 0.25rem;
197
+ background-color: transparent;
198
+ border: 1px solid var(--media-control-idle);
199
+ color: var(--media-text-primary);
200
+ cursor: pointer;
201
+ display: flex;
202
+ align-items: center;
203
+ justify-content: center;
204
+ transition: all var(--media-transition) var(--media-ease);
205
+ }
206
+
207
+ .media-player-fullscreen-button:hover {
208
+ background-color: var(--media-control-hover);
209
+ }
210
+
211
+ /* Settings Menu */
212
+ .media-player-settings {
213
+ position: absolute;
214
+ bottom: 4rem;
215
+ right: 1rem;
216
+ background-color: var(--media-surface);
217
+ border: 1px solid var(--media-progress-bg);
218
+ border-radius: 0.5rem;
219
+ padding: 0.5rem;
220
+ min-width: 12rem;
221
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
222
+ }
223
+
224
+ .media-player-settings-item {
225
+ padding: 0.5rem 0.75rem;
226
+ border-radius: 0.25rem;
227
+ cursor: pointer;
228
+ color: var(--media-text-primary);
229
+ transition: background-color var(--media-transition) var(--media-ease);
230
+ }
231
+
232
+ .media-player-settings-item:hover {
233
+ background-color: var(--media-control-hover);
234
+ }
235
+
236
+ /* Loading Spinner */
237
+ .media-player-loading {
238
+ position: absolute;
239
+ top: 50%;
240
+ left: 50%;
241
+ transform: translate(-50%, -50%);
242
+ width: 3rem;
243
+ height: 3rem;
244
+ border: 3px solid var(--media-progress-bg);
245
+ border-top-color: var(--media-progress-fill);
246
+ border-radius: 50%;
247
+ animation: spin 1s linear infinite;
248
+ }
249
+
250
+ @keyframes spin {
251
+ to {
252
+ transform: translate(-50%, -50%) rotate(360deg);
253
+ }
254
+ }
255
+
256
+ /* Error Display */
257
+ .media-player-error {
258
+ position: absolute;
259
+ top: 50%;
260
+ left: 50%;
261
+ transform: translate(-50%, -50%);
262
+ background-color: var(--media-surface);
263
+ padding: 1.5rem;
264
+ border-radius: 0.5rem;
265
+ text-align: center;
266
+ max-width: 80%;
267
+ }
268
+
269
+ .media-player-error-title {
270
+ color: var(--media-text-primary);
271
+ font-weight: 600;
272
+ margin-bottom: 0.5rem;
273
+ }
274
+
275
+ .media-player-error-message {
276
+ color: var(--media-text-secondary);
277
+ font-size: 0.875rem;
278
+ }
279
+
280
+ /* Subtitle Display */
281
+ .media-player-subtitles {
282
+ position: absolute;
283
+ bottom: 4rem;
284
+ left: 0;
285
+ right: 0;
286
+ text-align: center;
287
+ padding: 0 1rem;
288
+ pointer-events: none;
289
+ }
290
+
291
+ .media-player-subtitle-text {
292
+ display: inline-block;
293
+ background-color: rgba(0, 0, 0, 0.8);
294
+ color: white;
295
+ padding: 0.25rem 0.5rem;
296
+ border-radius: 0.25rem;
297
+ font-size: 1rem;
298
+ line-height: 1.4;
299
+ }
300
+
301
+ /* Picture-in-Picture Button */
302
+ .media-player-pip-button {
303
+ width: 2rem;
304
+ height: 2rem;
305
+ border-radius: 0.25rem;
306
+ background-color: transparent;
307
+ border: 1px solid var(--media-control-idle);
308
+ color: var(--media-text-primary);
309
+ cursor: pointer;
310
+ display: flex;
311
+ align-items: center;
312
+ justify-content: center;
313
+ transition: all var(--media-transition) var(--media-ease);
314
+ }
315
+
316
+ .media-player-pip-button:hover {
317
+ background-color: var(--media-control-hover);
318
+ }
319
+
320
+ /* Responsive Design */
321
+ @media (max-width: 640px) {
322
+ .media-player-controls {
323
+ padding: 0.75rem;
324
+ gap: 0.5rem;
325
+ }
326
+
327
+ .media-player-play-button {
328
+ width: 2rem;
329
+ height: 2rem;
330
+ }
331
+
332
+ .media-player-volume-slider {
333
+ width: 4rem;
334
+ }
335
+
336
+ .media-player-time {
337
+ font-size: 0.75rem;
338
+ min-width: 4rem;
339
+ }
340
+
341
+ .media-player-fullscreen-button,
342
+ .media-player-pip-button {
343
+ width: 1.75rem;
344
+ height: 1.75rem;
345
+ }
346
+ }
347
+
348
+ /* ===== ACCESSIBILITY ENHANCEMENTS ===== */
349
+
350
+ /* Focus Management */
351
+ .media-player *:focus {
352
+ outline: var(--media-focus-outline);
353
+ outline-offset: var(--media-focus-offset);
354
+ }
355
+
356
+ /* High Contrast Mode */
357
+ @media (prefers-contrast: high) {
358
+ :root {
359
+ --media-focus-outline: 3px solid currentColor;
360
+ --media-focus-offset: 3px;
361
+ }
362
+
363
+ .media-player-play-button,
364
+ .media-player-fullscreen-button,
365
+ .media-player-pip-button {
366
+ border-width: 2px;
367
+ }
368
+ }
369
+
370
+ /* Reduced Motion */
371
+ @media (prefers-reduced-motion: reduce) {
372
+ * {
373
+ animation-duration: 0.01ms !important;
374
+ animation-iteration-count: 1 !important;
375
+ transition-duration: 0.01ms !important;
376
+ scroll-behavior: auto !important;
377
+ }
378
+ }
379
+
380
+ /* Screen Reader Only */
381
+ .sr-only {
382
+ position: absolute;
383
+ width: 1px;
384
+ height: 1px;
385
+ padding: 0;
386
+ margin: -1px;
387
+ overflow: hidden;
388
+ clip: rect(0, 0, 0, 0);
389
+ white-space: nowrap;
390
+ border: 0;
391
+ }
392
+
393
+ /* ===== MINIMAL PLAYER VARIANT ===== */
394
+
395
+ .minimal-player {
396
+ --minimal-bg: transparent;
397
+ --minimal-border: 1px solid rgba(255, 255, 255, 0.1);
398
+ }
399
+
400
+ .minimal-player .media-player-controls {
401
+ background: linear-gradient(to top, rgba(0, 0, 0, 0.8), transparent);
402
+ border-top: var(--minimal-border);
403
+ }
404
+
405
+ .minimal-player .media-player-play-button {
406
+ background-color: rgba(255, 255, 255, 0.1);
407
+ backdrop-filter: blur(8px);
408
+ }
409
+
410
+ .minimal-player .media-player-settings {
411
+ background-color: rgba(20, 20, 20, 0.95);
412
+ backdrop-filter: blur(12px);
413
+ }
414
+
415
+ /* ===== KEYBOARD NAVIGATION ===== */
416
+
417
+ /* Keyboard shortcut help */
418
+ .media-player-keyboard-help {
419
+ position: absolute;
420
+ top: 1rem;
421
+ right: 1rem;
422
+ background-color: var(--media-surface);
423
+ border: 1px solid var(--media-progress-bg);
424
+ border-radius: 0.5rem;
425
+ padding: 1rem;
426
+ min-width: 16rem;
427
+ box-shadow: 0 4px 6px rgba(0, 0, 0, 0.3);
428
+ z-index: 1000;
429
+ }
430
+
431
+ .media-player-keyboard-help h3 {
432
+ margin: 0 0 0.5rem 0;
433
+ color: var(--media-text-primary);
434
+ font-size: 0.875rem;
435
+ font-weight: 600;
436
+ }
437
+
438
+ .media-player-keyboard-help-item {
439
+ display: flex;
440
+ justify-content: space-between;
441
+ padding: 0.25rem 0;
442
+ font-size: 0.75rem;
443
+ }
444
+
445
+ .media-player-keyboard-help-key {
446
+ color: var(--media-text-secondary);
447
+ font-family: monospace;
448
+ }
449
+
450
+ /* ===== PRINT STYLES ===== */
451
+ @media print {
452
+ .media-player {
453
+ break-inside: avoid;
454
+ border: 1px solid currentColor;
455
+ }
456
+
457
+ .media-player-controls,
458
+ .media-player-loading,
459
+ .media-player-error {
460
+ display: none;
461
+ }
462
+ }