ts-video-player 0.1.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 (251) hide show
  1. package/LICENSE.md +21 -0
  2. package/README.md +438 -0
  3. package/dist/cdn.d.ts +10 -0
  4. package/dist/cdn.d.ts.map +1 -0
  5. package/dist/cdn.min.js +1046 -0
  6. package/dist/cdn.min.js.map +54 -0
  7. package/dist/cdn.test.d.ts +2 -0
  8. package/dist/cdn.test.d.ts.map +1 -0
  9. package/dist/chunk-36x4yhjn.js +765 -0
  10. package/dist/chunk-36x4yhjn.js.map +12 -0
  11. package/dist/chunk-eajts2jv.js +4243 -0
  12. package/dist/chunk-eajts2jv.js.map +42 -0
  13. package/dist/chunk-z1ehbz9f.js +380 -0
  14. package/dist/chunk-z1ehbz9f.js.map +19 -0
  15. package/dist/config.d.ts +9 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/core/audio-gain.d.ts +67 -0
  18. package/dist/core/audio-gain.d.ts.map +1 -0
  19. package/dist/core/caption-styles.d.ts +121 -0
  20. package/dist/core/caption-styles.d.ts.map +1 -0
  21. package/dist/core/chapters.d.ts +150 -0
  22. package/dist/core/chapters.d.ts.map +1 -0
  23. package/dist/core/error-overlay.d.ts +71 -0
  24. package/dist/core/error-overlay.d.ts.map +1 -0
  25. package/dist/core/events.d.ts +119 -0
  26. package/dist/core/events.d.ts.map +1 -0
  27. package/dist/core/features.d.ts +64 -0
  28. package/dist/core/features.d.ts.map +1 -0
  29. package/dist/core/i18n.d.ts +132 -0
  30. package/dist/core/i18n.d.ts.map +1 -0
  31. package/dist/core/index.d.ts +37 -0
  32. package/dist/core/index.d.ts.map +1 -0
  33. package/dist/core/live.d.ts +130 -0
  34. package/dist/core/live.d.ts.map +1 -0
  35. package/dist/core/media-session.d.ts +38 -0
  36. package/dist/core/media-session.d.ts.map +1 -0
  37. package/dist/core/orientation.d.ts +22 -0
  38. package/dist/core/orientation.d.ts.map +1 -0
  39. package/dist/core/popover.d.ts +42 -0
  40. package/dist/core/popover.d.ts.map +1 -0
  41. package/dist/core/remote-playback.d.ts +195 -0
  42. package/dist/core/remote-playback.d.ts.map +1 -0
  43. package/dist/core/settings-menu.d.ts +132 -0
  44. package/dist/core/settings-menu.d.ts.map +1 -0
  45. package/dist/core/spinner.d.ts +67 -0
  46. package/dist/core/spinner.d.ts.map +1 -0
  47. package/dist/core/state.d.ts +142 -0
  48. package/dist/core/state.d.ts.map +1 -0
  49. package/dist/core/text-tracks.d.ts +162 -0
  50. package/dist/core/text-tracks.d.ts.map +1 -0
  51. package/dist/core/themes.d.ts +213 -0
  52. package/dist/core/themes.d.ts.map +1 -0
  53. package/dist/core/thumbnails.d.ts +124 -0
  54. package/dist/core/thumbnails.d.ts.map +1 -0
  55. package/dist/core/tooltips.d.ts +100 -0
  56. package/dist/core/tooltips.d.ts.map +1 -0
  57. package/dist/elements/base.d.ts +3 -0
  58. package/dist/elements/base.d.ts.map +1 -0
  59. package/dist/elements/index.d.ts +33 -0
  60. package/dist/elements/index.d.ts.map +1 -0
  61. package/dist/elements/index.js +55 -0
  62. package/dist/elements/index.js.map +9 -0
  63. package/dist/elements/media-airplay-button.d.ts +13 -0
  64. package/dist/elements/media-airplay-button.d.ts.map +1 -0
  65. package/dist/elements/media-error-display.d.ts +13 -0
  66. package/dist/elements/media-error-display.d.ts.map +1 -0
  67. package/dist/elements/media-fullscreen-button.d.ts +13 -0
  68. package/dist/elements/media-fullscreen-button.d.ts.map +1 -0
  69. package/dist/elements/media-live-button.d.ts +13 -0
  70. package/dist/elements/media-live-button.d.ts.map +1 -0
  71. package/dist/elements/media-mute-button.d.ts +13 -0
  72. package/dist/elements/media-mute-button.d.ts.map +1 -0
  73. package/dist/elements/media-pip-button.d.ts +13 -0
  74. package/dist/elements/media-pip-button.d.ts.map +1 -0
  75. package/dist/elements/media-play-button.d.ts +14 -0
  76. package/dist/elements/media-play-button.d.ts.map +1 -0
  77. package/dist/elements/media-playback-rate-button.d.ts +10 -0
  78. package/dist/elements/media-playback-rate-button.d.ts.map +1 -0
  79. package/dist/elements/media-preview-time.d.ts +18 -0
  80. package/dist/elements/media-preview-time.d.ts.map +1 -0
  81. package/dist/elements/media-progress-bar.d.ts +16 -0
  82. package/dist/elements/media-progress-bar.d.ts.map +1 -0
  83. package/dist/elements/media-remote-playback-button.d.ts +16 -0
  84. package/dist/elements/media-remote-playback-button.d.ts.map +1 -0
  85. package/dist/elements/media-seek-button.d.ts +9 -0
  86. package/dist/elements/media-seek-button.d.ts.map +1 -0
  87. package/dist/elements/media-settings-menu.d.ts +32 -0
  88. package/dist/elements/media-settings-menu.d.ts.map +1 -0
  89. package/dist/elements/media-time-display.d.ts +21 -0
  90. package/dist/elements/media-time-display.d.ts.map +1 -0
  91. package/dist/elements/media-time-group.d.ts +22 -0
  92. package/dist/elements/media-time-group.d.ts.map +1 -0
  93. package/dist/elements/media-time-separator.d.ts +13 -0
  94. package/dist/elements/media-time-separator.d.ts.map +1 -0
  95. package/dist/elements/media-volume-slider.d.ts +16 -0
  96. package/dist/elements/media-volume-slider.d.ts.map +1 -0
  97. package/dist/elements/utils.d.ts +27 -0
  98. package/dist/elements/utils.d.ts.map +1 -0
  99. package/dist/elements/video-player.d.ts +23 -0
  100. package/dist/elements/video-player.d.ts.map +1 -0
  101. package/dist/elements/video-skin.d.ts +23 -0
  102. package/dist/elements/video-skin.d.ts.map +1 -0
  103. package/dist/features/captions.d.ts +8 -0
  104. package/dist/features/captions.d.ts.map +1 -0
  105. package/dist/features/create-player.d.ts +45 -0
  106. package/dist/features/create-player.d.ts.map +1 -0
  107. package/dist/features/fullscreen.d.ts +8 -0
  108. package/dist/features/fullscreen.d.ts.map +1 -0
  109. package/dist/features/gestures.d.ts +8 -0
  110. package/dist/features/gestures.d.ts.map +1 -0
  111. package/dist/features/index.d.ts +26 -0
  112. package/dist/features/index.d.ts.map +1 -0
  113. package/dist/features/index.js +31 -0
  114. package/dist/features/index.js.map +9 -0
  115. package/dist/features/keyboard.d.ts +8 -0
  116. package/dist/features/keyboard.d.ts.map +1 -0
  117. package/dist/features/pip.d.ts +8 -0
  118. package/dist/features/pip.d.ts.map +1 -0
  119. package/dist/features/playback.d.ts +8 -0
  120. package/dist/features/playback.d.ts.map +1 -0
  121. package/dist/features/quality.d.ts +8 -0
  122. package/dist/features/quality.d.ts.map +1 -0
  123. package/dist/features/types.d.ts +26 -0
  124. package/dist/features/types.d.ts.map +1 -0
  125. package/dist/features/volume.d.ts +8 -0
  126. package/dist/features/volume.d.ts.map +1 -0
  127. package/dist/index.d.ts +84 -0
  128. package/dist/index.d.ts.map +1 -0
  129. package/dist/index.js +8149 -0
  130. package/dist/index.js.map +31 -0
  131. package/dist/layouts/index.d.ts +58 -0
  132. package/dist/layouts/index.d.ts.map +1 -0
  133. package/dist/player.d.ts +90 -0
  134. package/dist/player.d.ts.map +1 -0
  135. package/dist/plugins/ads.d.ts +311 -0
  136. package/dist/plugins/ads.d.ts.map +1 -0
  137. package/dist/plugins/analytics.d.ts +203 -0
  138. package/dist/plugins/analytics.d.ts.map +1 -0
  139. package/dist/plugins/end-screen.d.ts +184 -0
  140. package/dist/plugins/end-screen.d.ts.map +1 -0
  141. package/dist/plugins/index.d.ts +13 -0
  142. package/dist/plugins/index.d.ts.map +1 -0
  143. package/dist/plugins/index.js +20 -0
  144. package/dist/plugins/index.js.map +9 -0
  145. package/dist/plugins/skip-segments.d.ts +159 -0
  146. package/dist/plugins/skip-segments.d.ts.map +1 -0
  147. package/dist/plugins/watermark.d.ts +157 -0
  148. package/dist/plugins/watermark.d.ts.map +1 -0
  149. package/dist/providers/base.d.ts +56 -0
  150. package/dist/providers/base.d.ts.map +1 -0
  151. package/dist/providers/dash.d.ts +94 -0
  152. package/dist/providers/dash.d.ts.map +1 -0
  153. package/dist/providers/hls.d.ts +182 -0
  154. package/dist/providers/hls.d.ts.map +1 -0
  155. package/dist/providers/html5.d.ts +64 -0
  156. package/dist/providers/html5.d.ts.map +1 -0
  157. package/dist/providers/index.d.ts +41 -0
  158. package/dist/providers/index.d.ts.map +1 -0
  159. package/dist/providers/vimeo.d.ts +157 -0
  160. package/dist/providers/vimeo.d.ts.map +1 -0
  161. package/dist/providers/youtube.d.ts +134 -0
  162. package/dist/providers/youtube.d.ts.map +1 -0
  163. package/dist/stx/index.d.ts +59 -0
  164. package/dist/stx/index.d.ts.map +1 -0
  165. package/dist/stx/index.js +480 -0
  166. package/dist/stx/index.js.map +11 -0
  167. package/dist/types.d.ts +724 -0
  168. package/dist/types.d.ts.map +1 -0
  169. package/dist/ui/components.d.ts +121 -0
  170. package/dist/ui/components.d.ts.map +1 -0
  171. package/dist/ui/index.d.ts +9 -0
  172. package/dist/ui/index.d.ts.map +1 -0
  173. package/dist/ui/index.js +16 -0
  174. package/dist/ui/index.js.map +9 -0
  175. package/package.json +109 -0
  176. package/src/cdn.test.ts +10 -0
  177. package/src/cdn.ts +60 -0
  178. package/src/config.ts +25 -0
  179. package/src/core/audio-gain.ts +171 -0
  180. package/src/core/caption-styles.ts +568 -0
  181. package/src/core/chapters.ts +551 -0
  182. package/src/core/error-overlay.ts +354 -0
  183. package/src/core/events.ts +552 -0
  184. package/src/core/features.ts +287 -0
  185. package/src/core/i18n.ts +590 -0
  186. package/src/core/index.ts +249 -0
  187. package/src/core/live.ts +472 -0
  188. package/src/core/media-session.ts +137 -0
  189. package/src/core/orientation.ts +57 -0
  190. package/src/core/popover.ts +143 -0
  191. package/src/core/remote-playback.ts +661 -0
  192. package/src/core/settings-menu.ts +630 -0
  193. package/src/core/spinner.ts +310 -0
  194. package/src/core/state.ts +476 -0
  195. package/src/core/text-tracks.ts +599 -0
  196. package/src/core/themes.ts +607 -0
  197. package/src/core/thumbnails.ts +457 -0
  198. package/src/core/tooltips.ts +370 -0
  199. package/src/elements/base.ts +2 -0
  200. package/src/elements/index.ts +82 -0
  201. package/src/elements/media-airplay-button.ts +78 -0
  202. package/src/elements/media-error-display.ts +47 -0
  203. package/src/elements/media-fullscreen-button.ts +72 -0
  204. package/src/elements/media-live-button.ts +65 -0
  205. package/src/elements/media-mute-button.ts +69 -0
  206. package/src/elements/media-pip-button.ts +66 -0
  207. package/src/elements/media-play-button.ts +69 -0
  208. package/src/elements/media-playback-rate-button.ts +59 -0
  209. package/src/elements/media-preview-time.ts +75 -0
  210. package/src/elements/media-progress-bar.ts +200 -0
  211. package/src/elements/media-remote-playback-button.ts +108 -0
  212. package/src/elements/media-seek-button.ts +50 -0
  213. package/src/elements/media-settings-menu.ts +302 -0
  214. package/src/elements/media-time-display.ts +99 -0
  215. package/src/elements/media-time-group.ts +41 -0
  216. package/src/elements/media-time-separator.ts +35 -0
  217. package/src/elements/media-volume-slider.ts +140 -0
  218. package/src/elements/utils.ts +82 -0
  219. package/src/elements/video-player.ts +175 -0
  220. package/src/elements/video-skin.ts +127 -0
  221. package/src/features/captions.ts +56 -0
  222. package/src/features/create-player.ts +91 -0
  223. package/src/features/fullscreen.ts +44 -0
  224. package/src/features/gestures.ts +44 -0
  225. package/src/features/index.ts +44 -0
  226. package/src/features/keyboard.ts +89 -0
  227. package/src/features/pip.ts +47 -0
  228. package/src/features/playback.ts +68 -0
  229. package/src/features/quality.ts +19 -0
  230. package/src/features/types.ts +28 -0
  231. package/src/features/volume.ts +46 -0
  232. package/src/index.ts +635 -0
  233. package/src/layouts/index.ts +672 -0
  234. package/src/player.ts +821 -0
  235. package/src/plugins/ads.ts +1045 -0
  236. package/src/plugins/analytics.ts +673 -0
  237. package/src/plugins/end-screen.ts +793 -0
  238. package/src/plugins/index.ts +61 -0
  239. package/src/plugins/skip-segments.ts +537 -0
  240. package/src/plugins/watermark.ts +537 -0
  241. package/src/providers/base.ts +197 -0
  242. package/src/providers/dash.ts +588 -0
  243. package/src/providers/hls.ts +624 -0
  244. package/src/providers/html5.ts +473 -0
  245. package/src/providers/index.ts +97 -0
  246. package/src/providers/vimeo.ts +533 -0
  247. package/src/providers/youtube.ts +542 -0
  248. package/src/stx/index.ts +606 -0
  249. package/src/types.ts +874 -0
  250. package/src/ui/components.ts +910 -0
  251. package/src/ui/index.ts +29 -0
@@ -0,0 +1,724 @@
1
+ /**
2
+ * ts-video-player Types
3
+ *
4
+ * Core type definitions for the video player library.
5
+ *
6
+ * @module types
7
+ */
8
+ /**
9
+ * Supported media source types
10
+ */
11
+ export type MediaType = 'video' | 'audio' | 'unknown';
12
+ /**
13
+ * Stream types
14
+ */
15
+ export type StreamType = 'on-demand' | 'live' | 'live:dvr' | 'll-live' | 'unknown';
16
+ /**
17
+ * Provider types
18
+ */
19
+ export type ProviderType = 'video' | 'audio' | 'hls' | 'dash' | 'youtube' | 'vimeo' | 'unknown';
20
+ /**
21
+ * Media source
22
+ */
23
+ export interface MediaSource {
24
+ /** Source URL */
25
+ src: string;
26
+ /** MIME type (e.g., 'video/mp4', 'application/x-mpegURL') */
27
+ type?: string;
28
+ /** Source quality label */
29
+ quality?: string;
30
+ /** Source width */
31
+ width?: number;
32
+ /** Source height */
33
+ height?: number;
34
+ /** Bitrate in bps */
35
+ bitrate?: number;
36
+ /** Codec string */
37
+ codec?: string;
38
+ }
39
+ /**
40
+ * YouTube source configuration
41
+ */
42
+ export interface YouTubeSource {
43
+ src: string;
44
+ type: 'youtube';
45
+ /** Video ID extracted from URL */
46
+ videoId?: string;
47
+ /** Start time in seconds */
48
+ startTime?: number;
49
+ /** End time in seconds */
50
+ endTime?: number;
51
+ }
52
+ /**
53
+ * Vimeo source configuration
54
+ */
55
+ export interface VimeoSource {
56
+ src: string;
57
+ type: 'vimeo';
58
+ /** Video ID extracted from URL */
59
+ videoId?: string;
60
+ /** Hash for private videos */
61
+ hash?: string;
62
+ }
63
+ /**
64
+ * HLS source configuration
65
+ */
66
+ export interface HLSSource {
67
+ src: string;
68
+ type: 'application/x-mpegURL' | 'application/vnd.apple.mpegurl';
69
+ /** HLS.js configuration overrides */
70
+ config?: Record<string, unknown>;
71
+ }
72
+ export interface DRMConfig {
73
+ widevine?: {
74
+ url: string;
75
+ headers?: Record<string, string>;
76
+ };
77
+ playready?: {
78
+ url: string;
79
+ headers?: Record<string, string>;
80
+ };
81
+ fairplay?: {
82
+ url: string;
83
+ certificateUrl: string;
84
+ headers?: Record<string, string>;
85
+ };
86
+ }
87
+ /**
88
+ * DASH source configuration
89
+ */
90
+ export interface DASHSource {
91
+ src: string;
92
+ type: 'application/dash+xml';
93
+ /** dash.js configuration overrides */
94
+ config?: Record<string, unknown>;
95
+ /** License endpoints for encrypted DASH content. */
96
+ drm?: DRMConfig;
97
+ }
98
+ /**
99
+ * Any supported source type
100
+ */
101
+ export type Src = string | MediaSource | YouTubeSource | VimeoSource | HLSSource | DASHSource;
102
+ /**
103
+ * Preload strategy
104
+ */
105
+ export type PreloadStrategy = 'none' | 'metadata' | 'auto';
106
+ /**
107
+ * Crossorigin attribute
108
+ */
109
+ export type CrossOrigin = 'anonymous' | 'use-credentials' | '';
110
+ /**
111
+ * Loading state
112
+ */
113
+ export type LoadingState = 'idle' | 'loading' | 'loaded' | 'error';
114
+ /**
115
+ * Playback state
116
+ */
117
+ export type PlaybackState = 'idle' | 'buffering' | 'playing' | 'paused' | 'ended';
118
+ /**
119
+ * Feature availability state.
120
+ * - 'available': Feature is supported and can be used right now
121
+ * - 'unavailable': Feature could work but isn't ready yet (e.g., waiting for media to load)
122
+ * - 'unsupported': Feature is not supported on this platform/browser
123
+ */
124
+ export type FeatureAvailability = 'available' | 'unavailable' | 'unsupported';
125
+ /**
126
+ * Time range representation
127
+ */
128
+ export interface TimeRange {
129
+ start: number;
130
+ end: number;
131
+ }
132
+ /**
133
+ * Video quality representation
134
+ */
135
+ export interface VideoQuality {
136
+ id: string;
137
+ width: number;
138
+ height: number;
139
+ bitrate: number;
140
+ codec?: string;
141
+ selected: boolean;
142
+ }
143
+ /**
144
+ * Audio track representation
145
+ */
146
+ export interface AudioTrack {
147
+ id: string;
148
+ label: string;
149
+ language: string;
150
+ kind: string;
151
+ selected: boolean;
152
+ }
153
+ /**
154
+ * Text track/caption representation
155
+ */
156
+ export interface TextTrack {
157
+ id: string;
158
+ kind: 'subtitles' | 'captions' | 'descriptions' | 'chapters' | 'metadata';
159
+ label: string;
160
+ language: string;
161
+ src?: string;
162
+ default?: boolean;
163
+ mode: 'disabled' | 'hidden' | 'showing';
164
+ cues: TextTrackCue[];
165
+ }
166
+ export interface TextTrackSource {
167
+ src: string;
168
+ kind: TextTrack['kind'];
169
+ label?: string;
170
+ language?: string;
171
+ default?: boolean;
172
+ }
173
+ /**
174
+ * Text track cue
175
+ */
176
+ export interface TextTrackCue {
177
+ id: string;
178
+ startTime: number;
179
+ endTime: number;
180
+ text: string;
181
+ position?: 'auto' | number;
182
+ line?: 'auto' | number;
183
+ align?: 'start' | 'center' | 'end' | 'left' | 'right';
184
+ }
185
+ /**
186
+ * Player state
187
+ */
188
+ export interface PlayerState {
189
+ /** Current source */
190
+ src: Src | null;
191
+ /** All available sources */
192
+ sources: Src[];
193
+ /** Current source index */
194
+ currentSourceIndex: number;
195
+ /** Media type (video/audio) */
196
+ mediaType: MediaType;
197
+ /** Stream type (on-demand/live) */
198
+ streamType: StreamType;
199
+ /** Provider type */
200
+ providerType: ProviderType;
201
+ /** Loading state */
202
+ loadingState: LoadingState;
203
+ /** Preload strategy */
204
+ preload: PreloadStrategy;
205
+ /** Whether media can play */
206
+ canPlay: boolean;
207
+ /** Whether media can play through without buffering */
208
+ canPlayThrough: boolean;
209
+ /** Error if any */
210
+ error: MediaError | null;
211
+ /** Playback state */
212
+ playbackState: PlaybackState;
213
+ /** Whether media is paused */
214
+ paused: boolean;
215
+ /** Whether media is playing */
216
+ playing: boolean;
217
+ /** Whether playback has started at least once */
218
+ started: boolean;
219
+ /** Whether media has ended */
220
+ ended: boolean;
221
+ /** Whether media is seeking */
222
+ seeking: boolean;
223
+ /** Whether media is waiting/buffering */
224
+ waiting: boolean;
225
+ /** Current time in seconds */
226
+ currentTime: number;
227
+ /** Duration in seconds */
228
+ duration: number;
229
+ /** Playback rate (1.0 = normal) */
230
+ playbackRate: number;
231
+ /** Whether to loop playback */
232
+ loop: boolean;
233
+ /** Whether to autoplay */
234
+ autoplay: boolean;
235
+ /** Whether to play inline on mobile */
236
+ playsinline: boolean;
237
+ /** Whether muted */
238
+ muted: boolean;
239
+ /** Volume (0-1) */
240
+ volume: number;
241
+ /** Buffered time ranges */
242
+ buffered: TimeRange[];
243
+ /** Total buffered percentage (0-1) */
244
+ bufferedAmount: number;
245
+ /** Seekable time ranges */
246
+ seekable: TimeRange[];
247
+ /** Video width */
248
+ videoWidth: number;
249
+ /** Video height */
250
+ videoHeight: number;
251
+ /** Aspect ratio */
252
+ aspectRatio: number;
253
+ /** Available qualities */
254
+ qualities: VideoQuality[];
255
+ /** Auto quality selection enabled */
256
+ autoQuality: boolean;
257
+ /** Available audio tracks */
258
+ audioTracks: AudioTrack[];
259
+ /** Available text tracks */
260
+ textTracks: TextTrack[];
261
+ /** Whether in fullscreen */
262
+ fullscreen: boolean;
263
+ /** Whether Picture-in-Picture is active */
264
+ pictureInPicture: boolean;
265
+ /** @deprecated Use fullscreenAvailability instead */
266
+ canFullscreen: boolean;
267
+ /** @deprecated Use pipAvailability instead */
268
+ canPictureInPicture: boolean;
269
+ /** Volume control availability (iOS Safari silently ignores volume changes) */
270
+ volumeAvailability: FeatureAvailability;
271
+ /** Fullscreen API availability */
272
+ fullscreenAvailability: FeatureAvailability;
273
+ /** Picture-in-Picture availability */
274
+ pipAvailability: FeatureAvailability;
275
+ /** Whether controls are visible */
276
+ controlsVisible: boolean;
277
+ /** Whether user is interacting */
278
+ userActive: boolean;
279
+ /** Whether pointer is over player */
280
+ pointerOver: boolean;
281
+ /** Video title */
282
+ title: string;
283
+ /** Poster image URL */
284
+ poster: string;
285
+ }
286
+ /**
287
+ * Player initialization options
288
+ */
289
+ export interface PlayerOptions {
290
+ /** Media source(s) */
291
+ src?: Src | Src[];
292
+ /** Media type */
293
+ mediaType?: MediaType;
294
+ /** Poster image URL */
295
+ poster?: string;
296
+ /** Video title for accessibility */
297
+ title?: string;
298
+ /** External captions, subtitles, chapters, and metadata tracks */
299
+ tracks?: TextTrackSource[];
300
+ /** Autoplay on load */
301
+ autoplay?: boolean;
302
+ /** Loop playback */
303
+ loop?: boolean;
304
+ /** Mute audio */
305
+ muted?: boolean;
306
+ /** Initial volume (0-1) */
307
+ volume?: number;
308
+ /** Playback rate */
309
+ playbackRate?: number;
310
+ /** Play inline on mobile */
311
+ playsinline?: boolean;
312
+ /** Preload strategy */
313
+ preload?: PreloadStrategy;
314
+ /** Crossorigin attribute */
315
+ crossorigin?: CrossOrigin;
316
+ /** Native media controls restrictions */
317
+ controlsList?: Array<'nodownload' | 'nofullscreen' | 'noremoteplayback'>;
318
+ /** Disable native Picture-in-Picture */
319
+ disablePictureInPicture?: boolean;
320
+ /** Show native controls */
321
+ controls?: boolean;
322
+ /** Custom control configuration */
323
+ controlsConfig?: ControlsConfig;
324
+ /** Keyboard shortcuts */
325
+ keyboard?: boolean | KeyboardConfig;
326
+ /** Auto-hide controls timeout in ms */
327
+ controlsTimeout?: number;
328
+ /** Language for accessibility */
329
+ language?: string;
330
+ /** Enable/disable captions by default */
331
+ captions?: boolean;
332
+ /** Screen reader announcements */
333
+ announcements?: boolean;
334
+ /** Fullscreen container element */
335
+ fullscreenContainer?: HTMLElement;
336
+ /** Preferred fullscreen mode */
337
+ fullscreenMode?: 'native' | 'fallback';
338
+ /** HLS.js configuration */
339
+ hlsConfig?: Record<string, unknown>;
340
+ /** Custom HLS.js CDN URL (overrides default jsdelivr URL) */
341
+ hlsCdnUrl?: string;
342
+ /** dash.js configuration */
343
+ dashConfig?: Record<string, unknown>;
344
+ /** Custom dash.js CDN URL (overrides default dashjs.org URL) */
345
+ dashCdnUrl?: string;
346
+ /** YouTube player parameters */
347
+ youtubeParams?: Record<string, string | number | boolean>;
348
+ /** Vimeo player parameters */
349
+ vimeoParams?: Record<string, string | number | boolean>;
350
+ /** Media Session API integration for lock screen / notification controls */
351
+ mediaSession?: boolean | MediaSessionConfig;
352
+ /** Lock orientation to landscape when entering fullscreen on mobile */
353
+ fullscreenOrientationLock?: boolean;
354
+ /** Event listeners */
355
+ on?: Partial<PlayerEventMap>;
356
+ /** Persist volume/muted state */
357
+ storage?: boolean | StorageConfig;
358
+ }
359
+ /**
360
+ * Media Session configuration
361
+ */
362
+ export interface MediaSessionConfig {
363
+ /** Title to display on lock screen */
364
+ title?: string;
365
+ /** Artist name */
366
+ artist?: string;
367
+ /** Album name */
368
+ album?: string;
369
+ /** Artwork images for lock screen */
370
+ artwork?: MediaImage[];
371
+ }
372
+ /**
373
+ * Controls configuration
374
+ */
375
+ export interface ControlsConfig {
376
+ /** Show play button */
377
+ play?: boolean;
378
+ /** Show progress/seek bar */
379
+ progress?: boolean;
380
+ /** Show current time */
381
+ currentTime?: boolean;
382
+ /** Show duration */
383
+ duration?: boolean;
384
+ /** Show volume slider */
385
+ volume?: boolean;
386
+ /** Show mute button */
387
+ mute?: boolean;
388
+ /** Show captions button */
389
+ captions?: boolean;
390
+ /** Show settings menu */
391
+ settings?: boolean;
392
+ /** Show fullscreen button */
393
+ fullscreen?: boolean;
394
+ /** Show PiP button */
395
+ pip?: boolean;
396
+ /** Show playback speed selector */
397
+ speed?: boolean;
398
+ /** Show quality selector */
399
+ quality?: boolean;
400
+ /** Custom controls to add */
401
+ custom?: CustomControl[];
402
+ }
403
+ /**
404
+ * Custom control definition
405
+ */
406
+ export interface CustomControl {
407
+ /** Control name/id */
408
+ name: string;
409
+ /** Position in controls bar */
410
+ position: 'left' | 'center' | 'right';
411
+ /** Control HTML or render function */
412
+ content: string | (() => HTMLElement);
413
+ /** Click handler */
414
+ onClick?: (player: Player) => void;
415
+ }
416
+ /**
417
+ * Keyboard configuration
418
+ */
419
+ export interface KeyboardConfig {
420
+ /** Enable global keyboard shortcuts */
421
+ global?: boolean;
422
+ /** Seek step in seconds */
423
+ seekStep?: number;
424
+ /** Volume step (0-1) */
425
+ volumeStep?: number;
426
+ /** Custom key bindings */
427
+ bindings?: Record<string, string | ((player: Player) => void)>;
428
+ }
429
+ /**
430
+ * Storage configuration
431
+ */
432
+ export interface StorageConfig {
433
+ /** Storage key prefix */
434
+ prefix?: string;
435
+ /** Storage type */
436
+ type?: 'local' | 'session';
437
+ /** Properties to persist */
438
+ persist?: ('volume' | 'muted' | 'playbackRate' | 'quality' | 'captions')[];
439
+ }
440
+ /**
441
+ * Provider interface for different media sources
442
+ */
443
+ export interface Provider {
444
+ /** Provider name */
445
+ readonly name: string;
446
+ /** Provider type */
447
+ readonly type: ProviderType;
448
+ /** Current media element */
449
+ readonly mediaElement: HTMLVideoElement | HTMLAudioElement | HTMLIFrameElement | null;
450
+ /** Whether provider is ready */
451
+ readonly ready: boolean;
452
+ /** Setup the provider */
453
+ setup(container: HTMLElement, options: PlayerOptions): Promise<void>;
454
+ /** Destroy the provider */
455
+ destroy(): void;
456
+ /** Load a source */
457
+ load(src: Src | Src[]): Promise<void>;
458
+ /** Check if provider can play source */
459
+ canPlay(src: Src): boolean;
460
+ /** Play media */
461
+ play(): Promise<void>;
462
+ /** Pause media */
463
+ pause(): void;
464
+ /** Stop media (reset) */
465
+ stop(): void;
466
+ /** Seek to time */
467
+ seekTo(time: number): void;
468
+ /** Get current time */
469
+ getCurrentTime(): number;
470
+ /** Get duration */
471
+ getDuration(): number;
472
+ /** Set volume */
473
+ setVolume(volume: number): void;
474
+ /** Get volume */
475
+ getVolume(): number;
476
+ /** Set muted */
477
+ setMuted(muted: boolean): void;
478
+ /** Get muted */
479
+ getMuted(): boolean;
480
+ /** Set playback rate */
481
+ setPlaybackRate(rate: number): void;
482
+ /** Get playback rate */
483
+ getPlaybackRate(): number;
484
+ /** Get available qualities */
485
+ getQualities(): VideoQuality[];
486
+ /** Set quality */
487
+ setQuality(quality: VideoQuality | 'auto'): void;
488
+ /** Get text tracks */
489
+ getTextTracks(): TextTrack[];
490
+ /** Set text track mode */
491
+ setTextTrackMode(trackId: string, mode: 'disabled' | 'hidden' | 'showing'): void;
492
+ /** Get audio tracks */
493
+ getAudioTracks(): AudioTrack[];
494
+ /** Set audio track */
495
+ setAudioTrack(trackId: string): void;
496
+ /** Enter fullscreen */
497
+ enterFullscreen(): Promise<void>;
498
+ /** Exit fullscreen */
499
+ exitFullscreen(): Promise<void>;
500
+ /** Enter Picture-in-Picture */
501
+ enterPiP(): Promise<void>;
502
+ /** Exit Picture-in-Picture */
503
+ exitPiP(): Promise<void>;
504
+ /** Check feature availability */
505
+ getFeatureAvailability(feature: 'volume' | 'fullscreen' | 'pip'): FeatureAvailability;
506
+ /** Add event listener */
507
+ on<K extends keyof ProviderEventMap>(event: K, handler: ProviderEventMap[K]): void;
508
+ /** Remove event listener */
509
+ off<K extends keyof ProviderEventMap>(event: K, handler: ProviderEventMap[K]): void;
510
+ }
511
+ /**
512
+ * Provider loader interface
513
+ */
514
+ export interface ProviderLoader {
515
+ /** Loader name */
516
+ name: string;
517
+ /** Provider type this loader creates */
518
+ type: ProviderType;
519
+ /** Check if loader can play source */
520
+ canPlay(src: Src): boolean;
521
+ /** Detect media type from source */
522
+ mediaType(src: Src): MediaType;
523
+ /** Preconnect hint URLs */
524
+ preconnect?(): string[];
525
+ /** Load/create the provider */
526
+ load(container: HTMLElement, options: PlayerOptions): Promise<Provider>;
527
+ }
528
+ /**
529
+ * Media error
530
+ */
531
+ export interface MediaError {
532
+ code: number;
533
+ message: string;
534
+ details?: unknown;
535
+ }
536
+ /**
537
+ * Provider event map (internal events)
538
+ */
539
+ export interface ProviderEventMap {
540
+ ready: () => void;
541
+ loadstart: () => void;
542
+ loadedmetadata: () => void;
543
+ loadeddata: () => void;
544
+ canplay: () => void;
545
+ canplaythrough: () => void;
546
+ play: () => void;
547
+ pause: () => void;
548
+ playing: () => void;
549
+ waiting: () => void;
550
+ seeking: () => void;
551
+ seeked: () => void;
552
+ timeupdate: (time: number) => void;
553
+ durationchange: (duration: number) => void;
554
+ volumechange: (volume: number, muted: boolean) => void;
555
+ ratechange: (rate: number) => void;
556
+ progress: (buffered: TimeRange[]) => void;
557
+ ended: () => void;
558
+ error: (error: MediaError) => void;
559
+ statechange: (state: Partial<PlayerState>) => void;
560
+ qualitychange: (quality: VideoQuality | null) => void;
561
+ audiotrackchange: (track: AudioTrack | null) => void;
562
+ texttrackchange: (track: TextTrack | null) => void;
563
+ fullscreenchange: (fullscreen: boolean) => void;
564
+ pipchange: (pip: boolean) => void;
565
+ availabilitychange: (feature: string, availability: FeatureAvailability) => void;
566
+ }
567
+ /**
568
+ * Player event map (public events)
569
+ */
570
+ export interface PlayerEventMap extends ProviderEventMap {
571
+ init: () => void;
572
+ destroy: () => void;
573
+ sourceschange: (sources: Src[]) => void;
574
+ providerchange: (provider: Provider | null) => void;
575
+ controlschange: (visible: boolean) => void;
576
+ useractivitychange: (active: boolean) => void;
577
+ }
578
+ /**
579
+ * UI component interface
580
+ */
581
+ export interface UIComponent {
582
+ /** Component name */
583
+ name: string;
584
+ /** Render the component */
585
+ render(player: Player): HTMLElement;
586
+ /** Update the component */
587
+ update?(state: PlayerState): void;
588
+ /** Destroy the component */
589
+ destroy?(): void;
590
+ }
591
+ /**
592
+ * Tooltip options
593
+ */
594
+ export interface TooltipOptions {
595
+ content: string | (() => string);
596
+ position?: 'top' | 'bottom' | 'left' | 'right';
597
+ delay?: number;
598
+ }
599
+ /**
600
+ * Menu item
601
+ */
602
+ export interface MenuItem {
603
+ id: string;
604
+ label: string;
605
+ value?: unknown;
606
+ checked?: boolean;
607
+ disabled?: boolean;
608
+ icon?: string;
609
+ children?: MenuItem[];
610
+ }
611
+ /**
612
+ * Slider options
613
+ */
614
+ export interface SliderOptions {
615
+ min: number;
616
+ max: number;
617
+ step: number;
618
+ value: number;
619
+ orientation?: 'horizontal' | 'vertical';
620
+ disabled?: boolean;
621
+ onChange?: (value: number) => void;
622
+ onInput?: (value: number) => void;
623
+ }
624
+ /**
625
+ * Player instance (forward declaration for circular refs)
626
+ */
627
+ export interface Player {
628
+ readonly el: HTMLElement;
629
+ readonly state: PlayerState;
630
+ readonly provider: Provider | null;
631
+ readonly ready: boolean;
632
+ destroy(): void;
633
+ setSrc(src: Src | Src[]): void;
634
+ getSrc(): Src | null;
635
+ play(): Promise<void>;
636
+ pause(): void;
637
+ togglePlay(): void;
638
+ stop(): void;
639
+ seekTo(time: number): void;
640
+ seekBy(offset: number): void;
641
+ setVolume(volume: number): void;
642
+ setMuted(muted: boolean): void;
643
+ toggleMute(): void;
644
+ setPlaybackRate(rate: number): void;
645
+ enterFullscreen(): Promise<void>;
646
+ exitFullscreen(): Promise<void>;
647
+ toggleFullscreen(): Promise<void>;
648
+ enterPiP(): Promise<void>;
649
+ exitPiP(): Promise<void>;
650
+ togglePiP(): Promise<void>;
651
+ setQuality(quality: VideoQuality | 'auto'): void;
652
+ setTextTrack(trackId: string, mode: 'disabled' | 'hidden' | 'showing'): void;
653
+ setAudioTrack(trackId: string): void;
654
+ subscribe(keyOrListener: keyof PlayerState | '*' | ((state: PlayerState, key?: keyof PlayerState) => void), listener?: (state: PlayerState, key?: keyof PlayerState) => void): () => void;
655
+ on<K extends keyof PlayerEventMap>(event: K, handler: PlayerEventMap[K]): void;
656
+ off<K extends keyof PlayerEventMap>(event: K, handler: PlayerEventMap[K]): void;
657
+ once<K extends keyof PlayerEventMap>(event: K, handler: PlayerEventMap[K]): void;
658
+ }
659
+ /**
660
+ * Video component props for stx
661
+ */
662
+ export interface VideoComponentProps {
663
+ /** Media source(s) */
664
+ src: Src | Src[];
665
+ /** Poster image */
666
+ poster?: string;
667
+ /** Video title */
668
+ title?: string;
669
+ /** CSS class */
670
+ class?: string;
671
+ /** CSS style */
672
+ style?: string;
673
+ /** Element ID */
674
+ id?: string;
675
+ /** Width */
676
+ width?: number | string;
677
+ /** Height */
678
+ height?: number | string;
679
+ /** Player options */
680
+ options?: Partial<PlayerOptions>;
681
+ /** Lazy load */
682
+ lazy?: boolean;
683
+ /** Autoplay */
684
+ autoplay?: boolean;
685
+ /** Loop */
686
+ loop?: boolean;
687
+ /** Muted */
688
+ muted?: boolean;
689
+ /** Controls */
690
+ controls?: boolean;
691
+ /** Playsinline */
692
+ playsinline?: boolean;
693
+ /** Preload */
694
+ preload?: PreloadStrategy;
695
+ /** Cross-origin mode */
696
+ crossorigin?: CrossOrigin;
697
+ /** Native media controls restrictions */
698
+ controlsList?: Array<'nodownload' | 'nofullscreen' | 'noremoteplayback'>;
699
+ /** Disable native Picture-in-Picture */
700
+ disablePictureInPicture?: boolean;
701
+ /** Theme */
702
+ theme?: 'default' | 'minimal' | 'modern' | string;
703
+ }
704
+ /**
705
+ * Video directive options for stx
706
+ */
707
+ export interface VideoDirectiveOptions extends VideoComponentProps {
708
+ /** Placeholder strategy */
709
+ placeholder?: 'blur' | 'color' | 'none';
710
+ /** Placeholder color */
711
+ placeholderColor?: string;
712
+ }
713
+ /**
714
+ * Render result for stx
715
+ */
716
+ export interface VideoRenderResult {
717
+ /** HTML output */
718
+ html: string;
719
+ /** CSS to inject */
720
+ css?: string;
721
+ /** JavaScript to inject */
722
+ script?: string;
723
+ }
724
+ //# sourceMappingURL=types.d.ts.map