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,380 @@
1
+ import {
2
+ StateStore,
3
+ createGestureDetector,
4
+ createKeyboardHandler,
5
+ detectFullscreenAvailability,
6
+ detectPipAvailability,
7
+ detectVolumeAvailability,
8
+ onFullscreenChange,
9
+ onPiPChange,
10
+ probeVolumeAvailability
11
+ } from "./chunk-36x4yhjn.js";
12
+
13
+ // src/features/playback.ts
14
+ var playback = {
15
+ name: "playback",
16
+ stateKeys: ["paused", "playing", "ended", "seeking", "waiting", "currentTime", "duration", "playbackRate", "loop", "autoplay", "playbackState"],
17
+ setup(ctx) {
18
+ const { store, getMediaElement } = ctx;
19
+ const onPlay = () => store.batch({ paused: false, ended: false });
20
+ const onPause = () => store.set("paused", true);
21
+ const onPlaying = () => store.batch({ playing: true, waiting: false, playbackState: "playing" });
22
+ const onWaiting = () => store.batch({ waiting: true, playbackState: "buffering" });
23
+ const onSeeking = () => store.set("seeking", true);
24
+ const onSeeked = () => store.set("seeking", false);
25
+ const onEnded = () => store.batch({ ended: true, playing: false, playbackState: "ended" });
26
+ const onTimeUpdate = () => {
27
+ const media = getMediaElement();
28
+ if (media)
29
+ store.set("currentTime", media.currentTime);
30
+ };
31
+ const onDurationChange = () => {
32
+ const media = getMediaElement();
33
+ if (media)
34
+ store.set("duration", media.duration);
35
+ };
36
+ const onRateChange = () => {
37
+ const media = getMediaElement();
38
+ if (media)
39
+ store.set("playbackRate", media.playbackRate);
40
+ };
41
+ const bind = () => {
42
+ const media = getMediaElement();
43
+ if (!media)
44
+ return;
45
+ media.addEventListener("play", onPlay);
46
+ media.addEventListener("pause", onPause);
47
+ media.addEventListener("playing", onPlaying);
48
+ media.addEventListener("waiting", onWaiting);
49
+ media.addEventListener("seeking", onSeeking);
50
+ media.addEventListener("seeked", onSeeked);
51
+ media.addEventListener("ended", onEnded);
52
+ media.addEventListener("timeupdate", onTimeUpdate);
53
+ media.addEventListener("durationchange", onDurationChange);
54
+ media.addEventListener("ratechange", onRateChange);
55
+ };
56
+ bind();
57
+ return () => {
58
+ const media = getMediaElement();
59
+ if (!media)
60
+ return;
61
+ media.removeEventListener("play", onPlay);
62
+ media.removeEventListener("pause", onPause);
63
+ media.removeEventListener("playing", onPlaying);
64
+ media.removeEventListener("waiting", onWaiting);
65
+ media.removeEventListener("seeking", onSeeking);
66
+ media.removeEventListener("seeked", onSeeked);
67
+ media.removeEventListener("ended", onEnded);
68
+ media.removeEventListener("timeupdate", onTimeUpdate);
69
+ media.removeEventListener("durationchange", onDurationChange);
70
+ media.removeEventListener("ratechange", onRateChange);
71
+ };
72
+ }
73
+ };
74
+ // src/features/volume.ts
75
+ var volume = {
76
+ name: "volume",
77
+ stateKeys: ["volume", "muted", "volumeAvailability"],
78
+ setup(ctx) {
79
+ const { store, getMediaElement } = ctx;
80
+ const media = getMediaElement();
81
+ store.set("volumeAvailability", detectVolumeAvailability(media));
82
+ const onVolumeChange = () => {
83
+ const m = getMediaElement();
84
+ if (m)
85
+ store.batch({ volume: m.volume, muted: m.muted });
86
+ };
87
+ const onLoadedData = () => {
88
+ const m = getMediaElement();
89
+ if (!m)
90
+ return;
91
+ probeVolumeAvailability(m).then((availability) => {
92
+ store.set("volumeAvailability", availability);
93
+ });
94
+ };
95
+ if (media) {
96
+ media.addEventListener("volumechange", onVolumeChange);
97
+ media.addEventListener("loadeddata", onLoadedData);
98
+ }
99
+ return () => {
100
+ const m = getMediaElement();
101
+ if (!m)
102
+ return;
103
+ m.removeEventListener("volumechange", onVolumeChange);
104
+ m.removeEventListener("loadeddata", onLoadedData);
105
+ };
106
+ }
107
+ };
108
+ // src/features/fullscreen.ts
109
+ var fullscreen = {
110
+ name: "fullscreen",
111
+ stateKeys: ["fullscreen", "fullscreenAvailability", "canFullscreen"],
112
+ setup(ctx) {
113
+ const { store, container, getMediaElement } = ctx;
114
+ const update = () => {
115
+ const video = getMediaElement();
116
+ const availability = detectFullscreenAvailability(container, video);
117
+ store.batch({
118
+ fullscreenAvailability: availability,
119
+ canFullscreen: availability === "available"
120
+ });
121
+ };
122
+ update();
123
+ const cleanup = onFullscreenChange((fs) => {
124
+ store.set("fullscreen", fs);
125
+ });
126
+ const onMeta = () => update();
127
+ const media = getMediaElement();
128
+ media?.addEventListener("loadedmetadata", onMeta);
129
+ return () => {
130
+ cleanup();
131
+ const m = getMediaElement();
132
+ m?.removeEventListener("loadedmetadata", onMeta);
133
+ };
134
+ }
135
+ };
136
+ // src/features/pip.ts
137
+ var pip = {
138
+ name: "pip",
139
+ stateKeys: ["pictureInPicture", "pipAvailability", "canPictureInPicture"],
140
+ setup(ctx) {
141
+ const { store, getMediaElement } = ctx;
142
+ const update = () => {
143
+ const video = getMediaElement();
144
+ const availability = detectPipAvailability(video);
145
+ store.batch({
146
+ pipAvailability: availability,
147
+ canPictureInPicture: availability === "available"
148
+ });
149
+ };
150
+ update();
151
+ let cleanupPiP = null;
152
+ const media = getMediaElement();
153
+ if (media instanceof HTMLVideoElement) {
154
+ cleanupPiP = onPiPChange(media, (isPiP) => {
155
+ store.set("pictureInPicture", isPiP);
156
+ });
157
+ }
158
+ const onMeta = () => update();
159
+ media?.addEventListener("loadedmetadata", onMeta);
160
+ return () => {
161
+ cleanupPiP?.();
162
+ const m = getMediaElement();
163
+ m?.removeEventListener("loadedmetadata", onMeta);
164
+ };
165
+ }
166
+ };
167
+ // src/features/captions.ts
168
+ var captions = {
169
+ name: "captions",
170
+ stateKeys: ["textTracks"],
171
+ setup(ctx) {
172
+ const { store, getMediaElement } = ctx;
173
+ const syncTracks = () => {
174
+ const media2 = getMediaElement();
175
+ if (!media2)
176
+ return;
177
+ const tracks = [];
178
+ const textTracks = media2.textTracks;
179
+ for (let i = 0;i < textTracks.length; i++) {
180
+ const track = textTracks[i];
181
+ tracks.push({
182
+ id: String(i),
183
+ kind: track.kind,
184
+ label: track.label || `Track ${i + 1}`,
185
+ language: track.language || "",
186
+ mode: track.mode,
187
+ cues: []
188
+ });
189
+ }
190
+ store.set("textTracks", tracks);
191
+ };
192
+ const media = getMediaElement();
193
+ if (media) {
194
+ media.textTracks.addEventListener("change", syncTracks);
195
+ media.textTracks.addEventListener("addtrack", syncTracks);
196
+ media.textTracks.addEventListener("removetrack", syncTracks);
197
+ }
198
+ syncTracks();
199
+ return () => {
200
+ const m = getMediaElement();
201
+ if (!m)
202
+ return;
203
+ m.textTracks.removeEventListener("change", syncTracks);
204
+ m.textTracks.removeEventListener("addtrack", syncTracks);
205
+ m.textTracks.removeEventListener("removetrack", syncTracks);
206
+ };
207
+ }
208
+ };
209
+ // src/features/quality.ts
210
+ var quality = {
211
+ name: "quality",
212
+ stateKeys: ["qualities", "autoQuality"],
213
+ setup(_ctx) {
214
+ return;
215
+ }
216
+ };
217
+ // src/features/keyboard.ts
218
+ var keyboard = {
219
+ name: "keyboard",
220
+ setup(ctx) {
221
+ const { container, options } = ctx;
222
+ if (options.keyboard === false)
223
+ return;
224
+ const actions = {
225
+ togglePlay: () => {
226
+ const media = ctx.getMediaElement();
227
+ if (!media)
228
+ return;
229
+ if (media.paused)
230
+ media.play();
231
+ else
232
+ media.pause();
233
+ },
234
+ toggleMute: () => {
235
+ const media = ctx.getMediaElement();
236
+ if (media)
237
+ media.muted = !media.muted;
238
+ },
239
+ toggleFullscreen: () => {},
240
+ togglePiP: () => {},
241
+ toggleCaptions: () => {},
242
+ seekBackward: () => {
243
+ const media = ctx.getMediaElement();
244
+ if (media)
245
+ media.currentTime = Math.max(0, media.currentTime - 5);
246
+ },
247
+ seekForward: () => {
248
+ const media = ctx.getMediaElement();
249
+ if (media)
250
+ media.currentTime = Math.min(media.duration, media.currentTime + 5);
251
+ },
252
+ volumeUp: () => {
253
+ const media = ctx.getMediaElement();
254
+ if (media)
255
+ media.volume = Math.min(1, media.volume + 0.1);
256
+ },
257
+ volumeDown: () => {
258
+ const media = ctx.getMediaElement();
259
+ if (media)
260
+ media.volume = Math.max(0, media.volume - 0.1);
261
+ },
262
+ speedUp: () => {
263
+ const media = ctx.getMediaElement();
264
+ if (media)
265
+ media.playbackRate = Math.min(4, media.playbackRate + 0.25);
266
+ },
267
+ speedDown: () => {
268
+ const media = ctx.getMediaElement();
269
+ if (media)
270
+ media.playbackRate = Math.max(0.25, media.playbackRate - 0.25);
271
+ },
272
+ seekStart: () => {
273
+ const media = ctx.getMediaElement();
274
+ if (media)
275
+ media.currentTime = 0;
276
+ },
277
+ seekEnd: () => {
278
+ const media = ctx.getMediaElement();
279
+ if (media)
280
+ media.currentTime = media.duration;
281
+ },
282
+ seekPercent: (percent) => {
283
+ const media = ctx.getMediaElement();
284
+ if (media)
285
+ media.currentTime = percent / 100 * media.duration;
286
+ }
287
+ };
288
+ const config = typeof options.keyboard === "object" ? options.keyboard : {};
289
+ const handler = createKeyboardHandler(actions, {
290
+ seekStep: config.seekStep,
291
+ volumeStep: config.volumeStep
292
+ });
293
+ const target = config.global ? document : container;
294
+ target.addEventListener("keydown", handler);
295
+ return () => {
296
+ target.removeEventListener("keydown", handler);
297
+ };
298
+ }
299
+ };
300
+ // src/features/gestures.ts
301
+ var gestures = {
302
+ name: "gestures",
303
+ setup(ctx) {
304
+ const { container, options } = ctx;
305
+ if (options.gestures === false)
306
+ return;
307
+ const cleanup = createGestureDetector(container, {
308
+ onDoubleTap: (x) => {
309
+ const rect = container.getBoundingClientRect();
310
+ const third = rect.width / 3;
311
+ const relX = x - rect.left;
312
+ const media = ctx.getMediaElement();
313
+ if (!media)
314
+ return;
315
+ if (relX < third) {
316
+ media.currentTime = Math.max(0, media.currentTime - 10);
317
+ } else if (relX > third * 2) {
318
+ media.currentTime = Math.min(media.duration, media.currentTime + 10);
319
+ }
320
+ },
321
+ onSwipeUp: () => {
322
+ const media = ctx.getMediaElement();
323
+ if (media)
324
+ media.volume = Math.min(1, media.volume + 0.1);
325
+ },
326
+ onSwipeDown: () => {
327
+ const media = ctx.getMediaElement();
328
+ if (media)
329
+ media.volume = Math.max(0, media.volume - 0.1);
330
+ }
331
+ });
332
+ return cleanup;
333
+ }
334
+ };
335
+ // src/features/create-player.ts
336
+ function createComposablePlayer(container, opts) {
337
+ const store = new StateStore(opts.state);
338
+ const cleanups = [];
339
+ let mediaElement = null;
340
+ const getMediaElement = () => {
341
+ if (!mediaElement) {
342
+ mediaElement = container.querySelector("video, audio");
343
+ }
344
+ return mediaElement;
345
+ };
346
+ const ctx = {
347
+ container,
348
+ store,
349
+ options: opts.options || {},
350
+ getMediaElement
351
+ };
352
+ for (const feature of opts.features) {
353
+ const cleanup = feature.setup(ctx);
354
+ if (cleanup)
355
+ cleanups.push(cleanup);
356
+ }
357
+ return {
358
+ el: container,
359
+ get state() {
360
+ return store.getState();
361
+ },
362
+ subscribe: store.subscribe.bind(store),
363
+ getMediaElement,
364
+ destroy() {
365
+ for (const cleanup of cleanups)
366
+ cleanup();
367
+ cleanups.length = 0;
368
+ store.reset();
369
+ mediaElement = null;
370
+ }
371
+ };
372
+ }
373
+ // src/features/index.ts
374
+ var videoFeatures = [playback, volume, fullscreen, pip, captions, quality, keyboard, gestures];
375
+ var audioFeatures = [playback, volume, keyboard];
376
+ var minimalFeatures = [playback];
377
+
378
+ export { playback, volume, fullscreen, pip, captions, quality, keyboard, gestures, createComposablePlayer, videoFeatures, audioFeatures, minimalFeatures };
379
+
380
+ //# debugId=C1780753C62879DF64756E2164756E21
@@ -0,0 +1,19 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/features/playback.ts", "../src/features/volume.ts", "../src/features/fullscreen.ts", "../src/features/pip.ts", "../src/features/captions.ts", "../src/features/quality.ts", "../src/features/keyboard.ts", "../src/features/gestures.ts", "../src/features/create-player.ts", "../src/features/index.ts"],
4
+ "sourcesContent": [
5
+ "/**\n * Playback feature — core playback state management.\n *\n * @module features/playback\n */\n\nimport type { Feature, FeatureContext } from './types'\n\nexport const playback: Feature = {\n name: 'playback',\n stateKeys: ['paused', 'playing', 'ended', 'seeking', 'waiting', 'currentTime', 'duration', 'playbackRate', 'loop', 'autoplay', 'playbackState'],\n\n setup(ctx: FeatureContext) {\n const { store, getMediaElement } = ctx\n\n const onPlay = () => store.batch({ paused: false, ended: false })\n const onPause = () => store.set('paused', true)\n const onPlaying = () => store.batch({ playing: true, waiting: false, playbackState: 'playing' })\n const onWaiting = () => store.batch({ waiting: true, playbackState: 'buffering' })\n const onSeeking = () => store.set('seeking', true)\n const onSeeked = () => store.set('seeking', false)\n const onEnded = () => store.batch({ ended: true, playing: false, playbackState: 'ended' })\n const onTimeUpdate = () => {\n const media = getMediaElement()\n if (media) store.set('currentTime', media.currentTime)\n }\n const onDurationChange = () => {\n const media = getMediaElement()\n if (media) store.set('duration', media.duration)\n }\n const onRateChange = () => {\n const media = getMediaElement()\n if (media) store.set('playbackRate', media.playbackRate)\n }\n\n const bind = () => {\n const media = getMediaElement()\n if (!media) return\n media.addEventListener('play', onPlay)\n media.addEventListener('pause', onPause)\n media.addEventListener('playing', onPlaying)\n media.addEventListener('waiting', onWaiting)\n media.addEventListener('seeking', onSeeking)\n media.addEventListener('seeked', onSeeked)\n media.addEventListener('ended', onEnded)\n media.addEventListener('timeupdate', onTimeUpdate)\n media.addEventListener('durationchange', onDurationChange)\n media.addEventListener('ratechange', onRateChange)\n }\n\n bind()\n\n return () => {\n const media = getMediaElement()\n if (!media) return\n media.removeEventListener('play', onPlay)\n media.removeEventListener('pause', onPause)\n media.removeEventListener('playing', onPlaying)\n media.removeEventListener('waiting', onWaiting)\n media.removeEventListener('seeking', onSeeking)\n media.removeEventListener('seeked', onSeeked)\n media.removeEventListener('ended', onEnded)\n media.removeEventListener('timeupdate', onTimeUpdate)\n media.removeEventListener('durationchange', onDurationChange)\n media.removeEventListener('ratechange', onRateChange)\n }\n },\n}\n",
6
+ "/**\n * Volume feature — volume state + availability detection.\n *\n * @module features/volume\n */\n\nimport type { Feature, FeatureContext } from './types'\nimport { detectVolumeAvailability, probeVolumeAvailability } from '../core/features'\n\nexport const volume: Feature = {\n name: 'volume',\n stateKeys: ['volume', 'muted', 'volumeAvailability'],\n\n setup(ctx: FeatureContext) {\n const { store, getMediaElement } = ctx\n\n // Initial sync detection\n const media = getMediaElement()\n store.set('volumeAvailability', detectVolumeAvailability(media))\n\n const onVolumeChange = () => {\n const m = getMediaElement()\n if (m) store.batch({ volume: m.volume, muted: m.muted })\n }\n\n const onLoadedData = () => {\n const m = getMediaElement()\n if (!m) return\n probeVolumeAvailability(m).then((availability) => {\n store.set('volumeAvailability', availability)\n })\n }\n\n if (media) {\n media.addEventListener('volumechange', onVolumeChange)\n media.addEventListener('loadeddata', onLoadedData)\n }\n\n return () => {\n const m = getMediaElement()\n if (!m) return\n m.removeEventListener('volumechange', onVolumeChange)\n m.removeEventListener('loadeddata', onLoadedData)\n }\n },\n}\n",
7
+ "/**\n * Fullscreen feature — fullscreen state + availability detection.\n *\n * @module features/fullscreen\n */\n\nimport type { Feature, FeatureContext } from './types'\nimport { detectFullscreenAvailability } from '../core/features'\nimport { onFullscreenChange } from '../core/events'\n\nexport const fullscreen: Feature = {\n name: 'fullscreen',\n stateKeys: ['fullscreen', 'fullscreenAvailability', 'canFullscreen'],\n\n setup(ctx: FeatureContext) {\n const { store, container, getMediaElement } = ctx\n\n const update = () => {\n const video = getMediaElement() as HTMLVideoElement | null\n const availability = detectFullscreenAvailability(container, video)\n store.batch({\n fullscreenAvailability: availability,\n canFullscreen: availability === 'available',\n })\n }\n\n update()\n\n const cleanup = onFullscreenChange((fs) => {\n store.set('fullscreen', fs)\n })\n\n // Re-detect after metadata loaded\n const onMeta = () => update()\n const media = getMediaElement()\n media?.addEventListener('loadedmetadata', onMeta)\n\n return () => {\n cleanup()\n const m = getMediaElement()\n m?.removeEventListener('loadedmetadata', onMeta)\n }\n },\n}\n",
8
+ "/**\n * Picture-in-Picture feature — PiP state + availability detection.\n *\n * @module features/pip\n */\n\nimport type { Feature, FeatureContext } from './types'\nimport { detectPipAvailability } from '../core/features'\nimport { onPiPChange } from '../core/events'\n\nexport const pip: Feature = {\n name: 'pip',\n stateKeys: ['pictureInPicture', 'pipAvailability', 'canPictureInPicture'],\n\n setup(ctx: FeatureContext) {\n const { store, getMediaElement } = ctx\n\n const update = () => {\n const video = getMediaElement() as HTMLVideoElement | null\n const availability = detectPipAvailability(video)\n store.batch({\n pipAvailability: availability,\n canPictureInPicture: availability === 'available',\n })\n }\n\n update()\n\n let cleanupPiP: (() => void) | null = null\n const media = getMediaElement()\n if (media instanceof HTMLVideoElement) {\n cleanupPiP = onPiPChange(media, (isPiP) => {\n store.set('pictureInPicture', isPiP)\n })\n }\n\n // Re-detect after metadata loaded\n const onMeta = () => update()\n media?.addEventListener('loadedmetadata', onMeta)\n\n return () => {\n cleanupPiP?.()\n const m = getMediaElement()\n m?.removeEventListener('loadedmetadata', onMeta)\n }\n },\n}\n",
9
+ "/**\n * Captions feature — text track management.\n *\n * @module features/captions\n */\n\nimport type { Feature, FeatureContext } from './types'\nimport type { TextTrack } from '../types'\n\nexport const captions: Feature = {\n name: 'captions',\n stateKeys: ['textTracks'],\n\n setup(ctx: FeatureContext) {\n const { store, getMediaElement } = ctx\n\n const syncTracks = () => {\n const media = getMediaElement()\n if (!media) return\n\n const tracks: TextTrack[] = []\n const textTracks = media.textTracks\n\n for (let i = 0; i < textTracks.length; i++) {\n const track = textTracks[i]\n tracks.push({\n id: String(i),\n kind: track.kind as TextTrack['kind'],\n label: track.label || `Track ${i + 1}`,\n language: track.language || '',\n mode: track.mode as TextTrack['mode'],\n cues: [],\n })\n }\n\n store.set('textTracks', tracks)\n }\n\n const media = getMediaElement()\n if (media) {\n media.textTracks.addEventListener('change', syncTracks)\n media.textTracks.addEventListener('addtrack', syncTracks)\n media.textTracks.addEventListener('removetrack', syncTracks)\n }\n\n syncTracks()\n\n return () => {\n const m = getMediaElement()\n if (!m) return\n m.textTracks.removeEventListener('change', syncTracks)\n m.textTracks.removeEventListener('addtrack', syncTracks)\n m.textTracks.removeEventListener('removetrack', syncTracks)\n }\n },\n}\n",
10
+ "/**\n * Quality feature — quality selection state.\n *\n * @module features/quality\n */\n\nimport type { Feature, FeatureContext } from './types'\n\nexport const quality: Feature = {\n name: 'quality',\n stateKeys: ['qualities', 'autoQuality'],\n\n setup(_ctx: FeatureContext) {\n // Quality management is provider-specific (HLS/DASH).\n // This feature exists as a placeholder for the state keys\n // and to allow tree-shaking when quality UI is not needed.\n return undefined\n },\n}\n",
11
+ "/**\n * Keyboard feature — keyboard shortcut handling.\n *\n * @module features/keyboard\n */\n\nimport type { Feature, FeatureContext } from './types'\nimport { createKeyboardHandler, type KeyboardActions } from '../core/events'\n\nexport const keyboard: Feature = {\n name: 'keyboard',\n\n setup(ctx: FeatureContext) {\n const { container, options } = ctx\n\n if (options.keyboard === false) return\n\n const actions: KeyboardActions = {\n togglePlay: () => {\n const media = ctx.getMediaElement()\n if (!media) return\n if (media.paused) media.play()\n else media.pause()\n },\n toggleMute: () => {\n const media = ctx.getMediaElement()\n if (media) media.muted = !media.muted\n },\n toggleFullscreen: () => {\n // Handled at player level\n },\n togglePiP: () => {\n // Handled at player level\n },\n toggleCaptions: () => {\n // Handled at player level\n },\n seekBackward: () => {\n const media = ctx.getMediaElement()\n if (media) media.currentTime = Math.max(0, media.currentTime - 5)\n },\n seekForward: () => {\n const media = ctx.getMediaElement()\n if (media) media.currentTime = Math.min(media.duration, media.currentTime + 5)\n },\n volumeUp: () => {\n const media = ctx.getMediaElement()\n if (media) media.volume = Math.min(1, media.volume + 0.1)\n },\n volumeDown: () => {\n const media = ctx.getMediaElement()\n if (media) media.volume = Math.max(0, media.volume - 0.1)\n },\n speedUp: () => {\n const media = ctx.getMediaElement()\n if (media) media.playbackRate = Math.min(4, media.playbackRate + 0.25)\n },\n speedDown: () => {\n const media = ctx.getMediaElement()\n if (media) media.playbackRate = Math.max(0.25, media.playbackRate - 0.25)\n },\n seekStart: () => {\n const media = ctx.getMediaElement()\n if (media) media.currentTime = 0\n },\n seekEnd: () => {\n const media = ctx.getMediaElement()\n if (media) media.currentTime = media.duration\n },\n seekPercent: (percent) => {\n const media = ctx.getMediaElement()\n if (media) media.currentTime = (percent / 100) * media.duration\n },\n }\n\n const config = typeof options.keyboard === 'object' ? options.keyboard as Record<string, any> : {}\n const handler = createKeyboardHandler(actions, {\n seekStep: config.seekStep,\n volumeStep: config.volumeStep,\n })\n\n const target = config.global ? document : container\n target.addEventListener('keydown', handler as EventListener)\n\n return () => {\n target.removeEventListener('keydown', handler as EventListener)\n }\n },\n}\n",
12
+ "/**\n * Gestures feature — touch gesture detection.\n *\n * @module features/gestures\n */\n\nimport type { Feature, FeatureContext } from './types'\nimport { createGestureDetector } from '../core/events'\n\nexport const gestures: Feature = {\n name: 'gestures',\n\n setup(ctx: FeatureContext) {\n const { container, options } = ctx\n\n if (options.gestures === false) return\n\n const cleanup = createGestureDetector(container, {\n onDoubleTap: (x) => {\n // Double-tap left third: seek back, right third: seek forward\n const rect = container.getBoundingClientRect()\n const third = rect.width / 3\n const relX = x - rect.left\n const media = ctx.getMediaElement()\n if (!media) return\n if (relX < third) {\n media.currentTime = Math.max(0, media.currentTime - 10)\n } else if (relX > third * 2) {\n media.currentTime = Math.min(media.duration, media.currentTime + 10)\n }\n },\n onSwipeUp: () => {\n const media = ctx.getMediaElement()\n if (media) media.volume = Math.min(1, media.volume + 0.1)\n },\n onSwipeDown: () => {\n const media = ctx.getMediaElement()\n if (media) media.volume = Math.max(0, media.volume - 0.1)\n },\n })\n\n return cleanup\n },\n}\n",
13
+ "/**\n * Composable Player Factory\n *\n * Creates a lightweight player with only the features you need.\n *\n * @module features/create-player\n */\n\nimport type { Feature, FeatureContext } from './types'\nimport type { PlayerState } from '../types'\nimport { StateStore } from '../core/state'\n\nexport interface ComposablePlayer {\n /** The container element */\n el: HTMLElement\n /** Current state */\n readonly state: PlayerState\n /** Subscribe to state changes */\n subscribe: StateStore['subscribe']\n /** Get the media element */\n getMediaElement: () => HTMLMediaElement | null\n /** Destroy the player and all features */\n destroy: () => void\n}\n\nexport interface ComposablePlayerOptions {\n /** Features to enable */\n features: Feature[]\n /** Initial state overrides */\n state?: Partial<PlayerState>\n /** Player options */\n options?: Record<string, unknown>\n}\n\n/**\n * Create a composable player with only the specified features.\n *\n * @example\n * ```ts\n * import { createComposablePlayer } from 'ts-video-player/features'\n * import { playback, volume, fullscreen } from 'ts-video-player/features'\n *\n * const player = createComposablePlayer(container, {\n * features: [playback, volume, fullscreen],\n * })\n * ```\n */\nexport function createComposablePlayer(\n container: HTMLElement,\n opts: ComposablePlayerOptions,\n): ComposablePlayer {\n const store = new StateStore(opts.state)\n const cleanups: Array<() => void> = []\n\n let mediaElement: HTMLMediaElement | null = null\n\n const getMediaElement = (): HTMLMediaElement | null => {\n if (!mediaElement) {\n mediaElement = container.querySelector('video, audio')\n }\n return mediaElement\n }\n\n const ctx: FeatureContext = {\n container,\n store,\n options: opts.options || {},\n getMediaElement,\n }\n\n // Setup all features\n for (const feature of opts.features) {\n const cleanup = feature.setup(ctx)\n if (cleanup) cleanups.push(cleanup)\n }\n\n return {\n el: container,\n get state() {\n return store.getState()\n },\n subscribe: store.subscribe.bind(store),\n getMediaElement,\n destroy() {\n for (const cleanup of cleanups) cleanup()\n cleanups.length = 0\n store.reset()\n mediaElement = null\n },\n }\n}\n",
14
+ "/**\n * ts-video-player Composable Features\n *\n * Tree-shakeable feature composition system.\n *\n * @module features\n */\n\n// Feature implementations\nexport { playback } from './playback'\nexport { volume } from './volume'\nexport { fullscreen } from './fullscreen'\nexport { pip } from './pip'\nexport { captions } from './captions'\nexport { quality } from './quality'\nexport { keyboard } from './keyboard'\nexport { gestures } from './gestures'\n\n// Types\nexport type { Feature, FeatureContext } from './types'\n\n// Factory\nexport { createComposablePlayer } from './create-player'\nexport type { ComposablePlayer, ComposablePlayerOptions } from './create-player'\n\n// Feature bundles\nimport { playback } from './playback'\nimport { volume } from './volume'\nimport { fullscreen } from './fullscreen'\nimport { pip } from './pip'\nimport { captions } from './captions'\nimport { quality } from './quality'\nimport { keyboard } from './keyboard'\nimport { gestures } from './gestures'\nimport type { Feature } from './types'\n\n/** All features for video playback */\nexport const videoFeatures: Feature[] = [playback, volume, fullscreen, pip, captions, quality, keyboard, gestures]\n\n/** Features for audio-only playback */\nexport const audioFeatures: Feature[] = [playback, volume, keyboard]\n\n/** Minimal features (playback only) */\nexport const minimalFeatures: Feature[] = [playback]\n"
15
+ ],
16
+ "mappings": "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",
17
+ "debugId": "C1780753C62879DF64756E2164756E21",
18
+ "names": []
19
+ }
@@ -0,0 +1,9 @@
1
+ interface VideoConfig {
2
+ verbose: boolean;
3
+ [key: string]: unknown;
4
+ }
5
+ export declare const defaultConfig: VideoConfig;
6
+ export declare function getConfig(): Promise<VideoConfig>;
7
+ export declare const config: VideoConfig;
8
+ export {};
9
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA,UAAU,WAAW;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAA;CACvB;AAGD,eAAO,MAAM,aAAa,EAAE,WAE3B,CAAA;AAKD,wBAAsB,SAAS,IAAI,OAAO,CAAC,WAAW,CAAC,CAQtD;AAGD,eAAO,MAAM,MAAM,EAAE,WAA2B,CAAA"}
@@ -0,0 +1,67 @@
1
+ /**
2
+ * ts-video-player Audio Gain
3
+ *
4
+ * Audio gain/boost using Web Audio API.
5
+ *
6
+ * @module core/audio-gain
7
+ */
8
+ export interface AudioGainAdapter {
9
+ /** Current gain value (1.0 = normal, >1.0 = boosted) */
10
+ readonly currentGain: number;
11
+ /** Whether audio gain is supported */
12
+ readonly supported: boolean;
13
+ /** Set the gain value */
14
+ setGain(gain: number): void;
15
+ /** Remove gain (reset to 1.0) */
16
+ removeGain(): void;
17
+ /** Destroy the gain node */
18
+ destroy(): void;
19
+ }
20
+ /**
21
+ * Audio gain controller using Web Audio API
22
+ */
23
+ export declare class AudioGain implements AudioGainAdapter {
24
+ private media;
25
+ private audioContext;
26
+ private sourceNode;
27
+ private gainNode;
28
+ private _currentGain;
29
+ constructor(media: HTMLMediaElement);
30
+ get currentGain(): number;
31
+ get supported(): boolean;
32
+ /**
33
+ * Set the gain value
34
+ *
35
+ * @param gain - Gain value (1.0 = normal, 2.0 = 2x volume)
36
+ */
37
+ setGain(gain: number): void;
38
+ /**
39
+ * Remove gain (reset to 1.0)
40
+ */
41
+ removeGain(): void;
42
+ /**
43
+ * Destroy the audio context and nodes
44
+ */
45
+ destroy(): void;
46
+ private createAudioContext;
47
+ private disconnectNodes;
48
+ }
49
+ /**
50
+ * Create an audio gain controller for a media element
51
+ */
52
+ export declare function createAudioGain(media: HTMLMediaElement): AudioGainAdapter;
53
+ /**
54
+ * Common gain presets
55
+ */
56
+ export declare const GAIN_PRESETS: {
57
+ readonly normal: 1;
58
+ readonly boost_small: 1.5;
59
+ readonly boost_medium: 2;
60
+ readonly boost_large: 3;
61
+ readonly boost_max: 5;
62
+ };
63
+ /**
64
+ * Available gain steps for UI
65
+ */
66
+ export declare const GAIN_STEPS: readonly [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2, 2.5, 3, 4, 5];
67
+ //# sourceMappingURL=audio-gain.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-gain.d.ts","sourceRoot":"","sources":["../../src/core/audio-gain.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAMH,MAAM,WAAW,gBAAgB;IAC/B,wDAAwD;IACxD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;IAC5B,sCAAsC;IACtC,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,yBAAyB;IACzB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAA;IAC3B,iCAAiC;IACjC,UAAU,IAAI,IAAI,CAAA;IAClB,4BAA4B;IAC5B,OAAO,IAAI,IAAI,CAAA;CAChB;AAMD;;GAEG;AACH,qBAAa,SAAU,YAAW,gBAAgB;IAChD,OAAO,CAAC,KAAK,CAAkB;IAC/B,OAAO,CAAC,YAAY,CAA4B;IAChD,OAAO,CAAC,UAAU,CAA2C;IAC7D,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,YAAY,CAAI;gBAEZ,KAAK,EAAE,gBAAgB;IAInC,IAAI,WAAW,IAAI,MAAM,CAExB;IAED,IAAI,SAAS,IAAI,OAAO,CAEvB;IAED;;;;OAIG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAuB3B;;OAEG;IACH,UAAU,IAAI,IAAI;IAWlB;;OAEG;IACH,OAAO,IAAI,IAAI;IAWf,OAAO,CAAC,kBAAkB;IAqB1B,OAAO,CAAC,eAAe;CAWxB;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,gBAAgB,GAAG,gBAAgB,CAEzE;AAMD;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;;CAMf,CAAA;AAEV;;GAEG;AACH,eAAO,MAAM,UAAU,2DAA4D,CAAA"}
@@ -0,0 +1,121 @@
1
+ /**
2
+ * Caption Styling
3
+ *
4
+ * Customizable caption/subtitle appearance.
5
+ *
6
+ * @module core/caption-styles
7
+ */
8
+ export interface CaptionStyleOptions {
9
+ /** Font family */
10
+ fontFamily?: string;
11
+ /** Font size (CSS value) */
12
+ fontSize?: string;
13
+ /** Font weight */
14
+ fontWeight?: string | number;
15
+ /** Font color */
16
+ fontColor?: string;
17
+ /** Text opacity (0-1) */
18
+ fontOpacity?: number;
19
+ /** Background color */
20
+ backgroundColor?: string;
21
+ /** Background opacity (0-1) */
22
+ backgroundOpacity?: number;
23
+ /** Text edge style */
24
+ edgeStyle?: 'none' | 'raised' | 'depressed' | 'uniform' | 'drop-shadow';
25
+ /** Edge color */
26
+ edgeColor?: string;
27
+ /** Window color (container background) */
28
+ windowColor?: string;
29
+ /** Window opacity (0-1) */
30
+ windowOpacity?: number;
31
+ /** Text alignment */
32
+ textAlign?: 'left' | 'center' | 'right';
33
+ /** Vertical position (percentage from bottom) */
34
+ verticalPosition?: number;
35
+ /** Horizontal padding */
36
+ horizontalPadding?: string;
37
+ /** Vertical padding */
38
+ verticalPadding?: string;
39
+ /** Border radius */
40
+ borderRadius?: string;
41
+ /** Line height */
42
+ lineHeight?: string | number;
43
+ /** Letter spacing */
44
+ letterSpacing?: string;
45
+ }
46
+ export interface CaptionStylePreset {
47
+ name: string;
48
+ styles: CaptionStyleOptions;
49
+ }
50
+ export declare const defaultCaptionStyles: Required<CaptionStyleOptions>;
51
+ export declare const captionPresets: Record<string, CaptionStylePreset>;
52
+ export declare class CaptionStyleManager {
53
+ private styles;
54
+ private container;
55
+ private styleElement;
56
+ constructor(initialStyles?: CaptionStyleOptions);
57
+ /**
58
+ * Get current styles
59
+ */
60
+ getStyles(): CaptionStyleOptions;
61
+ /**
62
+ * Update styles
63
+ */
64
+ setStyles(styles: Partial<CaptionStyleOptions>): void;
65
+ /**
66
+ * Apply a preset
67
+ */
68
+ applyPreset(presetName: string): void;
69
+ /**
70
+ * Reset to defaults
71
+ */
72
+ reset(): void;
73
+ /**
74
+ * Attach to caption container
75
+ */
76
+ attach(container: HTMLElement): void;
77
+ /**
78
+ * Generate CSS from styles
79
+ */
80
+ generateCSS(selector?: string): string;
81
+ /**
82
+ * Apply styles to container
83
+ */
84
+ private applyStyles;
85
+ /**
86
+ * Get available presets
87
+ */
88
+ static getPresets(): CaptionStylePreset[];
89
+ /**
90
+ * Detach and cleanup
91
+ */
92
+ destroy(): void;
93
+ }
94
+ export declare function createCaptionStyleManager(styles?: CaptionStyleOptions): CaptionStyleManager;
95
+ export declare class CaptionSettingsMenu {
96
+ private container;
97
+ private manager;
98
+ private onChange;
99
+ constructor(manager: CaptionStyleManager);
100
+ private render;
101
+ private addPresetSelector;
102
+ private addSlider;
103
+ private addColorPicker;
104
+ private addSelect;
105
+ private createRow;
106
+ private getInputStyle;
107
+ /**
108
+ * Set change handler
109
+ */
110
+ onStyleChange(handler: (styles: CaptionStyleOptions) => void): void;
111
+ /**
112
+ * Get element
113
+ */
114
+ getElement(): HTMLElement;
115
+ /**
116
+ * Destroy
117
+ */
118
+ destroy(): void;
119
+ }
120
+ export declare function createCaptionSettingsMenu(manager: CaptionStyleManager): CaptionSettingsMenu;
121
+ //# sourceMappingURL=caption-styles.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"caption-styles.d.ts","sourceRoot":"","sources":["../../src/core/caption-styles.ts"],"names":[],"mappings":"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"}