@videojs/html 10.0.0 → 10.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 (457) hide show
  1. package/README.md +2 -2
  2. package/dist/default/define/audio/compat-skin.css +42 -0
  3. package/dist/default/define/audio/compat-skin2.js +1 -1
  4. package/dist/default/define/audio/scaffold-skin.css +1771 -0
  5. package/dist/default/define/audio/scaffold-skin.js +6 -0
  6. package/dist/default/define/audio/scaffold-skin2.js +4 -0
  7. package/dist/default/define/live-audio/compat-skin.css +42 -0
  8. package/dist/default/define/live-audio/compat-skin2.js +1 -1
  9. package/dist/default/define/live-audio/scaffold-skin.css +1591 -0
  10. package/dist/default/define/live-audio/scaffold-skin.js +6 -0
  11. package/dist/default/define/live-audio/scaffold-skin2.js +4 -0
  12. package/dist/default/define/live-video/compat-skin.css +67 -23
  13. package/dist/default/define/live-video/compat-skin2.js +1 -1
  14. package/dist/default/define/live-video/neutral-skin.css +20 -9
  15. package/dist/default/define/live-video/neutral-skin2.js +1 -1
  16. package/dist/default/define/live-video/scaffold-skin.css +1976 -0
  17. package/dist/default/define/live-video/scaffold-skin.js +6 -0
  18. package/dist/default/define/live-video/scaffold-skin2.js +4 -0
  19. package/dist/default/define/live-video/skin.css +18 -7
  20. package/dist/default/define/live-video/skin2.js +1 -1
  21. package/dist/default/define/media/dash-video.js +1 -1
  22. package/dist/default/define/media/hls-video.js +1 -1
  23. package/dist/default/define/media/hlsjs-video.js +1 -1
  24. package/dist/default/define/media/native-hls-video.js +1 -1
  25. package/dist/default/define/media/playerjs-video.js +11 -0
  26. package/dist/default/define/video/compat-skin.css +67 -23
  27. package/dist/default/define/video/compat-skin2.js +1 -1
  28. package/dist/default/define/video/neutral-skin.css +26 -9
  29. package/dist/default/define/video/neutral-skin2.js +1 -1
  30. package/dist/default/define/video/scaffold-skin.css +2216 -0
  31. package/dist/default/define/video/scaffold-skin.js +6 -0
  32. package/dist/default/define/video/scaffold-skin2.js +4 -0
  33. package/dist/default/define/video/skin.css +24 -7
  34. package/dist/default/define/video/skin2.js +1 -1
  35. package/dist/default/extensions/mux-data/extension.js +1 -1
  36. package/dist/default/icons/dist/element/compat/icons.js +1 -1
  37. package/dist/default/icons/dist/element/index.js +1 -0
  38. package/dist/default/icons/dist/element/scaffold/icons.js +30 -0
  39. package/dist/default/icons/dist/element/scaffold/index.js +8 -0
  40. package/dist/default/icons/dist/html/compat/play.js +1 -1
  41. package/dist/default/icons/dist/html/scaffold/airplay-enter.js +4 -0
  42. package/dist/default/icons/dist/html/scaffold/airplay-exit.js +4 -0
  43. package/dist/default/icons/dist/html/scaffold/captions-off.js +4 -0
  44. package/dist/default/icons/dist/html/scaffold/captions-on.js +4 -0
  45. package/dist/default/icons/dist/html/scaffold/cast-enter.js +4 -0
  46. package/dist/default/icons/dist/html/scaffold/cast-exit.js +4 -0
  47. package/dist/default/icons/dist/html/scaffold/check.js +4 -0
  48. package/dist/default/icons/dist/html/scaffold/chevron.js +4 -0
  49. package/dist/default/icons/dist/html/scaffold/fullscreen-enter.js +4 -0
  50. package/dist/default/icons/dist/html/scaffold/fullscreen-exit.js +4 -0
  51. package/dist/default/icons/dist/html/scaffold/gear.js +4 -0
  52. package/dist/default/icons/dist/html/scaffold/pause.js +4 -0
  53. package/dist/default/icons/dist/html/scaffold/pip-enter.js +4 -0
  54. package/dist/default/icons/dist/html/scaffold/pip-exit.js +4 -0
  55. package/dist/default/icons/dist/html/scaffold/play.js +4 -0
  56. package/dist/default/icons/dist/html/scaffold/quality.js +4 -0
  57. package/dist/default/icons/dist/html/scaffold/restart.js +4 -0
  58. package/dist/default/icons/dist/html/scaffold/seek.js +4 -0
  59. package/dist/default/icons/dist/html/scaffold/speech.js +4 -0
  60. package/dist/default/icons/dist/html/scaffold/speed.js +4 -0
  61. package/dist/default/icons/dist/html/scaffold/spinner.js +4 -0
  62. package/dist/default/icons/dist/html/scaffold/switches.js +4 -0
  63. package/dist/default/icons/dist/html/scaffold/volume-high.js +4 -0
  64. package/dist/default/icons/dist/html/scaffold/volume-low.js +4 -0
  65. package/dist/default/icons/dist/html/scaffold/volume-off.js +4 -0
  66. package/dist/default/icons/element/scaffold/index.js +1 -0
  67. package/dist/default/icons/scaffold/index.js +26 -0
  68. package/dist/default/internal/skins/compat-audio/register.js +1 -0
  69. package/dist/default/internal/skins/compat-audio/skin.css +42 -0
  70. package/dist/default/internal/skins/compat-audio/template.js +18 -16
  71. package/dist/default/internal/skins/compat-live-audio/register.js +1 -0
  72. package/dist/default/internal/skins/compat-live-audio/skin.css +42 -0
  73. package/dist/default/internal/skins/compat-live-audio/template.js +11 -9
  74. package/dist/default/internal/skins/compat-live-video/skin.css +67 -23
  75. package/dist/default/internal/skins/compat-live-video/template.js +20 -18
  76. package/dist/default/internal/skins/compat-video/skin.css +67 -23
  77. package/dist/default/internal/skins/compat-video/template.js +34 -32
  78. package/dist/default/internal/skins/default-audio/template.js +12 -12
  79. package/dist/default/internal/skins/default-live-audio/template.js +5 -5
  80. package/dist/default/internal/skins/default-live-video/skin.css +18 -7
  81. package/dist/default/internal/skins/default-live-video/template.js +16 -16
  82. package/dist/default/internal/skins/default-video/skin.css +24 -7
  83. package/dist/default/internal/skins/default-video/template.js +26 -26
  84. package/dist/default/internal/skins/neutral-audio/template.js +12 -12
  85. package/dist/default/internal/skins/neutral-live-audio/template.js +5 -5
  86. package/dist/default/internal/skins/neutral-live-video/skin.css +20 -9
  87. package/dist/default/internal/skins/neutral-live-video/template.js +16 -16
  88. package/dist/default/internal/skins/neutral-video/skin.css +26 -9
  89. package/dist/default/internal/skins/neutral-video/template.js +26 -26
  90. package/dist/default/internal/skins/scaffold-audio/register.js +73 -0
  91. package/dist/default/internal/skins/scaffold-audio/skin.css +1739 -0
  92. package/dist/default/internal/skins/scaffold-audio/template.js +221 -0
  93. package/dist/default/internal/skins/scaffold-live-audio/register.js +53 -0
  94. package/dist/default/internal/skins/scaffold-live-audio/skin.css +1559 -0
  95. package/dist/default/internal/skins/scaffold-live-audio/template.js +118 -0
  96. package/dist/default/internal/skins/scaffold-live-video/register.js +86 -0
  97. package/dist/default/internal/skins/scaffold-live-video/skin.css +1944 -0
  98. package/dist/default/internal/skins/scaffold-live-video/template.js +241 -0
  99. package/dist/default/internal/skins/scaffold-video/register.js +115 -0
  100. package/dist/default/internal/skins/scaffold-video/skin.css +2184 -0
  101. package/dist/default/internal/skins/scaffold-video/template.js +461 -0
  102. package/dist/default/media/playerjs-video/adapter.js +25 -0
  103. package/dist/default/presets/audio/index.js +2 -1
  104. package/dist/default/presets/audio/scaffold-skin.js +19 -0
  105. package/dist/default/presets/background/skin.js +0 -2
  106. package/dist/default/presets/live-audio/index.js +2 -1
  107. package/dist/default/presets/live-audio/scaffold-skin.js +19 -0
  108. package/dist/default/presets/live-video/index.js +2 -1
  109. package/dist/default/presets/live-video/scaffold-skin.js +19 -0
  110. package/dist/default/presets/skin.js +0 -11
  111. package/dist/default/presets/video/index.js +2 -1
  112. package/dist/default/presets/video/scaffold-skin.js +19 -0
  113. package/dist/default/ui/thumbnail/element.js +2 -2
  114. package/dist/default/ui/time-slider/element.js +31 -7
  115. package/dist/default/version.js +1 -1
  116. package/dist/dev/define/audio/compat-skin.css +42 -0
  117. package/dist/dev/define/audio/compat-skin2.js +1 -1
  118. package/dist/dev/define/audio/compat-skin2.js.map +1 -1
  119. package/dist/dev/define/audio/neutral-skin2.js.map +1 -1
  120. package/dist/dev/define/audio/scaffold-skin.css +1771 -0
  121. package/dist/dev/define/audio/scaffold-skin.d.ts +1 -0
  122. package/dist/dev/define/audio/scaffold-skin.js +8 -0
  123. package/dist/dev/define/audio/scaffold-skin.js.map +1 -0
  124. package/dist/dev/define/audio/scaffold-skin2.js +6 -0
  125. package/dist/dev/define/audio/scaffold-skin2.js.map +1 -0
  126. package/dist/dev/define/audio/skin2.js.map +1 -1
  127. package/dist/dev/define/global.js.map +1 -1
  128. package/dist/dev/define/live-audio/compat-skin.css +42 -0
  129. package/dist/dev/define/live-audio/compat-skin2.js +1 -1
  130. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -1
  131. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -1
  132. package/dist/dev/define/live-audio/scaffold-skin.css +1591 -0
  133. package/dist/dev/define/live-audio/scaffold-skin.d.ts +1 -0
  134. package/dist/dev/define/live-audio/scaffold-skin.js +8 -0
  135. package/dist/dev/define/live-audio/scaffold-skin.js.map +1 -0
  136. package/dist/dev/define/live-audio/scaffold-skin2.js +6 -0
  137. package/dist/dev/define/live-audio/scaffold-skin2.js.map +1 -0
  138. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  139. package/dist/dev/define/live-video/compat-skin.css +67 -23
  140. package/dist/dev/define/live-video/compat-skin2.js +1 -1
  141. package/dist/dev/define/live-video/compat-skin2.js.map +1 -1
  142. package/dist/dev/define/live-video/neutral-skin.css +20 -9
  143. package/dist/dev/define/live-video/neutral-skin2.js +1 -1
  144. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -1
  145. package/dist/dev/define/live-video/scaffold-skin.css +1976 -0
  146. package/dist/dev/define/live-video/scaffold-skin.d.ts +1 -0
  147. package/dist/dev/define/live-video/scaffold-skin.js +8 -0
  148. package/dist/dev/define/live-video/scaffold-skin.js.map +1 -0
  149. package/dist/dev/define/live-video/scaffold-skin2.js +6 -0
  150. package/dist/dev/define/live-video/scaffold-skin2.js.map +1 -0
  151. package/dist/dev/define/live-video/skin.css +18 -7
  152. package/dist/dev/define/live-video/skin2.js +1 -1
  153. package/dist/dev/define/live-video/skin2.js.map +1 -1
  154. package/dist/dev/define/media/dash-video.d.ts +1 -1
  155. package/dist/dev/define/media/dash-video.js +1 -1
  156. package/dist/dev/define/media/dash-video.js.map +1 -1
  157. package/dist/dev/define/media/hls-video.d.ts +1 -1
  158. package/dist/dev/define/media/hls-video.js +1 -1
  159. package/dist/dev/define/media/hls-video.js.map +1 -1
  160. package/dist/dev/define/media/hlsjs-video.d.ts +1 -1
  161. package/dist/dev/define/media/hlsjs-video.js +1 -1
  162. package/dist/dev/define/media/hlsjs-video.js.map +1 -1
  163. package/dist/dev/define/media/native-hls-video.d.ts +1 -1
  164. package/dist/dev/define/media/native-hls-video.js +1 -1
  165. package/dist/dev/define/media/native-hls-video.js.map +1 -1
  166. package/dist/dev/define/media/playerjs-video.d.ts +15 -0
  167. package/dist/dev/define/media/playerjs-video.js +13 -0
  168. package/dist/dev/define/media/playerjs-video.js.map +1 -0
  169. package/dist/dev/define/video/compat-skin.css +67 -23
  170. package/dist/dev/define/video/compat-skin2.js +1 -1
  171. package/dist/dev/define/video/compat-skin2.js.map +1 -1
  172. package/dist/dev/define/video/neutral-skin.css +26 -9
  173. package/dist/dev/define/video/neutral-skin2.js +1 -1
  174. package/dist/dev/define/video/neutral-skin2.js.map +1 -1
  175. package/dist/dev/define/video/scaffold-skin.css +2216 -0
  176. package/dist/dev/define/video/scaffold-skin.d.ts +1 -0
  177. package/dist/dev/define/video/scaffold-skin.js +8 -0
  178. package/dist/dev/define/video/scaffold-skin.js.map +1 -0
  179. package/dist/dev/define/video/scaffold-skin2.js +6 -0
  180. package/dist/dev/define/video/scaffold-skin2.js.map +1 -0
  181. package/dist/dev/define/video/skin.css +24 -7
  182. package/dist/dev/define/video/skin2.js +1 -1
  183. package/dist/dev/define/video/skin2.js.map +1 -1
  184. package/dist/dev/extensions/mux-data/extension.d.ts +1 -1
  185. package/dist/dev/extensions/mux-data/extension.js +1 -1
  186. package/dist/dev/extensions/mux-data/extension.js.map +1 -1
  187. package/dist/dev/icons/dist/element/compat/icons.js +1 -1
  188. package/dist/dev/icons/dist/element/compat/icons.js.map +1 -1
  189. package/dist/dev/icons/dist/element/index.js +1 -0
  190. package/dist/dev/icons/dist/element/index.js.map +1 -1
  191. package/dist/dev/icons/dist/element/scaffold/icons.js +32 -0
  192. package/dist/dev/icons/dist/element/scaffold/icons.js.map +1 -0
  193. package/dist/dev/icons/dist/element/scaffold/index.d.ts +1 -0
  194. package/dist/dev/icons/dist/element/scaffold/index.js +10 -0
  195. package/dist/dev/icons/dist/element/scaffold/index.js.map +1 -0
  196. package/dist/dev/icons/dist/html/compat/play.js +1 -1
  197. package/dist/dev/icons/dist/html/compat/play.js.map +1 -1
  198. package/dist/dev/icons/dist/html/scaffold/airplay-enter.js +6 -0
  199. package/dist/dev/icons/dist/html/scaffold/airplay-enter.js.map +1 -0
  200. package/dist/dev/icons/dist/html/scaffold/airplay-exit.js +6 -0
  201. package/dist/dev/icons/dist/html/scaffold/airplay-exit.js.map +1 -0
  202. package/dist/dev/icons/dist/html/scaffold/captions-off.js +6 -0
  203. package/dist/dev/icons/dist/html/scaffold/captions-off.js.map +1 -0
  204. package/dist/dev/icons/dist/html/scaffold/captions-on.js +6 -0
  205. package/dist/dev/icons/dist/html/scaffold/captions-on.js.map +1 -0
  206. package/dist/dev/icons/dist/html/scaffold/cast-enter.js +6 -0
  207. package/dist/dev/icons/dist/html/scaffold/cast-enter.js.map +1 -0
  208. package/dist/dev/icons/dist/html/scaffold/cast-exit.js +6 -0
  209. package/dist/dev/icons/dist/html/scaffold/cast-exit.js.map +1 -0
  210. package/dist/dev/icons/dist/html/scaffold/check.js +6 -0
  211. package/dist/dev/icons/dist/html/scaffold/check.js.map +1 -0
  212. package/dist/dev/icons/dist/html/scaffold/chevron.js +6 -0
  213. package/dist/dev/icons/dist/html/scaffold/chevron.js.map +1 -0
  214. package/dist/dev/icons/dist/html/scaffold/fullscreen-enter.js +6 -0
  215. package/dist/dev/icons/dist/html/scaffold/fullscreen-enter.js.map +1 -0
  216. package/dist/dev/icons/dist/html/scaffold/fullscreen-exit.js +6 -0
  217. package/dist/dev/icons/dist/html/scaffold/fullscreen-exit.js.map +1 -0
  218. package/dist/dev/icons/dist/html/scaffold/gear.js +6 -0
  219. package/dist/dev/icons/dist/html/scaffold/gear.js.map +1 -0
  220. package/dist/dev/icons/dist/html/scaffold/index.d.ts +28 -0
  221. package/dist/dev/icons/dist/html/scaffold/pause.js +6 -0
  222. package/dist/dev/icons/dist/html/scaffold/pause.js.map +1 -0
  223. package/dist/dev/icons/dist/html/scaffold/pip-enter.js +6 -0
  224. package/dist/dev/icons/dist/html/scaffold/pip-enter.js.map +1 -0
  225. package/dist/dev/icons/dist/html/scaffold/pip-exit.js +6 -0
  226. package/dist/dev/icons/dist/html/scaffold/pip-exit.js.map +1 -0
  227. package/dist/dev/icons/dist/html/scaffold/play.js +6 -0
  228. package/dist/dev/icons/dist/html/scaffold/play.js.map +1 -0
  229. package/dist/dev/icons/dist/html/scaffold/quality.js +6 -0
  230. package/dist/dev/icons/dist/html/scaffold/quality.js.map +1 -0
  231. package/dist/dev/icons/dist/html/scaffold/restart.js +6 -0
  232. package/dist/dev/icons/dist/html/scaffold/restart.js.map +1 -0
  233. package/dist/dev/icons/dist/html/scaffold/seek.js +6 -0
  234. package/dist/dev/icons/dist/html/scaffold/seek.js.map +1 -0
  235. package/dist/dev/icons/dist/html/scaffold/speech.js +6 -0
  236. package/dist/dev/icons/dist/html/scaffold/speech.js.map +1 -0
  237. package/dist/dev/icons/dist/html/scaffold/speed.js +6 -0
  238. package/dist/dev/icons/dist/html/scaffold/speed.js.map +1 -0
  239. package/dist/dev/icons/dist/html/scaffold/spinner.js +6 -0
  240. package/dist/dev/icons/dist/html/scaffold/spinner.js.map +1 -0
  241. package/dist/dev/icons/dist/html/scaffold/switches.js +6 -0
  242. package/dist/dev/icons/dist/html/scaffold/switches.js.map +1 -0
  243. package/dist/dev/icons/dist/html/scaffold/volume-high.js +6 -0
  244. package/dist/dev/icons/dist/html/scaffold/volume-high.js.map +1 -0
  245. package/dist/dev/icons/dist/html/scaffold/volume-low.js +6 -0
  246. package/dist/dev/icons/dist/html/scaffold/volume-low.js.map +1 -0
  247. package/dist/dev/icons/dist/html/scaffold/volume-off.js +6 -0
  248. package/dist/dev/icons/dist/html/scaffold/volume-off.js.map +1 -0
  249. package/dist/dev/icons/element/scaffold/index.d.ts +1 -0
  250. package/dist/dev/icons/element/scaffold/index.js +1 -0
  251. package/dist/dev/icons/scaffold/index.d.ts +2 -0
  252. package/dist/dev/icons/scaffold/index.js +26 -0
  253. package/dist/dev/index.d.ts +3 -3
  254. package/dist/dev/internal/skins/compat-audio/register.d.ts +1 -0
  255. package/dist/dev/internal/skins/compat-audio/register.js +1 -0
  256. package/dist/dev/internal/skins/compat-audio/register.js.map +1 -1
  257. package/dist/dev/internal/skins/compat-audio/skin.css +42 -0
  258. package/dist/dev/internal/skins/compat-audio/template.js +18 -16
  259. package/dist/dev/internal/skins/compat-audio/template.js.map +1 -1
  260. package/dist/dev/internal/skins/compat-live-audio/register.d.ts +1 -0
  261. package/dist/dev/internal/skins/compat-live-audio/register.js +1 -0
  262. package/dist/dev/internal/skins/compat-live-audio/register.js.map +1 -1
  263. package/dist/dev/internal/skins/compat-live-audio/skin.css +42 -0
  264. package/dist/dev/internal/skins/compat-live-audio/template.js +11 -9
  265. package/dist/dev/internal/skins/compat-live-audio/template.js.map +1 -1
  266. package/dist/dev/internal/skins/compat-live-video/register.d.ts +1 -1
  267. package/dist/dev/internal/skins/compat-live-video/skin.css +67 -23
  268. package/dist/dev/internal/skins/compat-live-video/template.js +20 -18
  269. package/dist/dev/internal/skins/compat-live-video/template.js.map +1 -1
  270. package/dist/dev/internal/skins/compat-video/register.d.ts +1 -1
  271. package/dist/dev/internal/skins/compat-video/skin.css +67 -23
  272. package/dist/dev/internal/skins/compat-video/template.js +34 -32
  273. package/dist/dev/internal/skins/compat-video/template.js.map +1 -1
  274. package/dist/dev/internal/skins/default-audio/register.d.ts +2 -2
  275. package/dist/dev/internal/skins/default-audio/template.js +12 -12
  276. package/dist/dev/internal/skins/default-audio/template.js.map +1 -1
  277. package/dist/dev/internal/skins/default-live-audio/register.d.ts +1 -1
  278. package/dist/dev/internal/skins/default-live-audio/template.js +5 -5
  279. package/dist/dev/internal/skins/default-live-audio/template.js.map +1 -1
  280. package/dist/dev/internal/skins/default-live-video/register.d.ts +1 -1
  281. package/dist/dev/internal/skins/default-live-video/skin.css +18 -7
  282. package/dist/dev/internal/skins/default-live-video/template.js +16 -16
  283. package/dist/dev/internal/skins/default-live-video/template.js.map +1 -1
  284. package/dist/dev/internal/skins/default-video/register.d.ts +1 -1
  285. package/dist/dev/internal/skins/default-video/skin.css +24 -7
  286. package/dist/dev/internal/skins/default-video/template.js +26 -26
  287. package/dist/dev/internal/skins/default-video/template.js.map +1 -1
  288. package/dist/dev/internal/skins/neutral-audio/register.d.ts +2 -2
  289. package/dist/dev/internal/skins/neutral-audio/template.js +12 -12
  290. package/dist/dev/internal/skins/neutral-audio/template.js.map +1 -1
  291. package/dist/dev/internal/skins/neutral-live-audio/register.d.ts +1 -1
  292. package/dist/dev/internal/skins/neutral-live-audio/template.js +5 -5
  293. package/dist/dev/internal/skins/neutral-live-audio/template.js.map +1 -1
  294. package/dist/dev/internal/skins/neutral-live-video/register.d.ts +1 -1
  295. package/dist/dev/internal/skins/neutral-live-video/skin.css +20 -9
  296. package/dist/dev/internal/skins/neutral-live-video/template.js +16 -16
  297. package/dist/dev/internal/skins/neutral-live-video/template.js.map +1 -1
  298. package/dist/dev/internal/skins/neutral-video/register.d.ts +1 -1
  299. package/dist/dev/internal/skins/neutral-video/skin.css +26 -9
  300. package/dist/dev/internal/skins/neutral-video/template.js +26 -26
  301. package/dist/dev/internal/skins/neutral-video/template.js.map +1 -1
  302. package/dist/dev/internal/skins/scaffold-audio/register.d.ts +44 -0
  303. package/dist/dev/internal/skins/scaffold-audio/register.js +75 -0
  304. package/dist/dev/internal/skins/scaffold-audio/register.js.map +1 -0
  305. package/dist/dev/internal/skins/scaffold-audio/skin.css +1739 -0
  306. package/dist/dev/internal/skins/scaffold-audio/template.js +223 -0
  307. package/dist/dev/internal/skins/scaffold-audio/template.js.map +1 -0
  308. package/dist/dev/internal/skins/scaffold-live-audio/register.d.ts +28 -0
  309. package/dist/dev/internal/skins/scaffold-live-audio/register.js +55 -0
  310. package/dist/dev/internal/skins/scaffold-live-audio/register.js.map +1 -0
  311. package/dist/dev/internal/skins/scaffold-live-audio/skin.css +1559 -0
  312. package/dist/dev/internal/skins/scaffold-live-audio/template.js +120 -0
  313. package/dist/dev/internal/skins/scaffold-live-audio/template.js.map +1 -0
  314. package/dist/dev/internal/skins/scaffold-live-video/register.d.ts +45 -0
  315. package/dist/dev/internal/skins/scaffold-live-video/register.js +88 -0
  316. package/dist/dev/internal/skins/scaffold-live-video/register.js.map +1 -0
  317. package/dist/dev/internal/skins/scaffold-live-video/skin.css +1944 -0
  318. package/dist/dev/internal/skins/scaffold-live-video/template.js +243 -0
  319. package/dist/dev/internal/skins/scaffold-live-video/template.js.map +1 -0
  320. package/dist/dev/internal/skins/scaffold-video/register.d.ts +62 -0
  321. package/dist/dev/internal/skins/scaffold-video/register.js +117 -0
  322. package/dist/dev/internal/skins/scaffold-video/register.js.map +1 -0
  323. package/dist/dev/internal/skins/scaffold-video/skin.css +2184 -0
  324. package/dist/dev/internal/skins/scaffold-video/template.js +463 -0
  325. package/dist/dev/internal/skins/scaffold-video/template.js.map +1 -0
  326. package/dist/dev/media/playerjs-video/adapter.d.ts +11 -0
  327. package/dist/dev/media/playerjs-video/adapter.js +61 -0
  328. package/dist/dev/media/playerjs-video/adapter.js.map +1 -0
  329. package/dist/dev/media/playerjs-video/index.d.ts +2 -0
  330. package/dist/dev/presets/audio/index.d.ts +2 -1
  331. package/dist/dev/presets/audio/index.js +2 -1
  332. package/dist/dev/presets/audio/scaffold-skin.d.ts +15 -0
  333. package/dist/dev/presets/audio/scaffold-skin.js +21 -0
  334. package/dist/dev/presets/audio/scaffold-skin.js.map +1 -0
  335. package/dist/dev/presets/background/skin.js +0 -2
  336. package/dist/dev/presets/background/skin.js.map +1 -1
  337. package/dist/dev/presets/live-audio/index.d.ts +2 -1
  338. package/dist/dev/presets/live-audio/index.js +2 -1
  339. package/dist/dev/presets/live-audio/scaffold-skin.d.ts +15 -0
  340. package/dist/dev/presets/live-audio/scaffold-skin.js +21 -0
  341. package/dist/dev/presets/live-audio/scaffold-skin.js.map +1 -0
  342. package/dist/dev/presets/live-video/index.d.ts +2 -1
  343. package/dist/dev/presets/live-video/index.js +2 -1
  344. package/dist/dev/presets/live-video/scaffold-skin.d.ts +15 -0
  345. package/dist/dev/presets/live-video/scaffold-skin.js +21 -0
  346. package/dist/dev/presets/live-video/scaffold-skin.js.map +1 -0
  347. package/dist/dev/presets/skin.js +0 -11
  348. package/dist/dev/presets/skin.js.map +1 -1
  349. package/dist/dev/presets/video/index.d.ts +2 -1
  350. package/dist/dev/presets/video/index.js +2 -1
  351. package/dist/dev/presets/video/scaffold-skin.d.ts +15 -0
  352. package/dist/dev/presets/video/scaffold-skin.js +21 -0
  353. package/dist/dev/presets/video/scaffold-skin.js.map +1 -0
  354. package/dist/dev/ui/thumbnail/element.js +2 -2
  355. package/dist/dev/ui/thumbnail/element.js.map +1 -1
  356. package/dist/dev/ui/time-slider/element.js +31 -7
  357. package/dist/dev/ui/time-slider/element.js.map +1 -1
  358. package/dist/dev/version.js +1 -1
  359. package/docs/README.md +1 -1
  360. package/docs/guides/architecture.md +3 -3
  361. package/docs/guides/autoplay.md +3 -3
  362. package/docs/guides/build-with-ai.md +1 -1
  363. package/docs/guides/captions.md +5 -5
  364. package/docs/guides/casting.md +5 -5
  365. package/docs/guides/cdn.md +11 -11
  366. package/docs/guides/customize-skins.md +2 -2
  367. package/docs/guides/features.md +1 -1
  368. package/docs/guides/fullscreen.md +1 -1
  369. package/docs/guides/installation-cdn.md +4 -4
  370. package/docs/guides/installation-shadcn.md +6 -6
  371. package/docs/guides/installation-svelte.md +5 -5
  372. package/docs/guides/installation-vue.md +5 -5
  373. package/docs/guides/installation.md +5 -5
  374. package/docs/guides/internationalization.md +5 -5
  375. package/docs/guides/live-streams.md +3 -3
  376. package/docs/guides/llms.txt +5 -4
  377. package/docs/guides/media-sources.md +3 -2
  378. package/docs/guides/migrate-from-media-chrome.md +4 -4
  379. package/docs/guides/migrate-from-mux-player.md +7 -7
  380. package/docs/guides/migrate-from-plyr.md +8 -8
  381. package/docs/guides/migrate-from-video-js-8.md +18 -10
  382. package/docs/guides/migrate-from-vidstack.md +9 -9
  383. package/docs/guides/migrate.md +18 -0
  384. package/docs/guides/mux-data.md +1 -1
  385. package/docs/guides/playback-errors.md +4 -4
  386. package/docs/guides/presets.md +13 -13
  387. package/docs/guides/quality.md +3 -3
  388. package/docs/guides/self-hosting.md +8 -8
  389. package/docs/guides/skins.md +6 -6
  390. package/docs/guides/thumbnails.md +2 -2
  391. package/docs/guides/user-preferences.md +2 -2
  392. package/docs/guides/v10-roadmap.md +2 -2
  393. package/docs/guides/why-videojs.md +3 -3
  394. package/docs/llms.txt +10 -4
  395. package/docs/reference/api/error-codes.md +1 -1
  396. package/docs/reference/api/feature-fullscreen.md +2 -2
  397. package/docs/reference/api/feature-metadata.md +2 -2
  398. package/docs/reference/api/feature-source.md +1 -1
  399. package/docs/reference/api/feature-text-tracks.md +2 -2
  400. package/docs/reference/api/llms.txt +1 -1
  401. package/docs/reference/api/media-capabilities.md +1 -1
  402. package/docs/reference/api/player-store.md +3 -3
  403. package/docs/reference/api/preset-audio.md +2 -2
  404. package/docs/reference/api/preset-background.md +3 -3
  405. package/docs/reference/api/preset-live-audio.md +3 -3
  406. package/docs/reference/api/preset-live-video.md +3 -3
  407. package/docs/reference/api/preset-video.md +2 -2
  408. package/docs/reference/api/resolve-adapter-type.md +2 -2
  409. package/docs/reference/api/vjs8-legacy-init.md +2 -2
  410. package/docs/reference/api/vjs8-legacy-options.md +1 -1
  411. package/docs/reference/components/audio-compat-skin.md +33 -3
  412. package/docs/reference/components/audio-neutral-skin.md +34 -4
  413. package/docs/reference/components/audio-scaffold-skin.md +39 -0
  414. package/docs/reference/components/audio-skin.md +34 -4
  415. package/docs/reference/components/audio.md +1 -1
  416. package/docs/reference/components/background-video-skin.md +36 -4
  417. package/docs/reference/components/background-video.md +1 -1
  418. package/docs/reference/components/cast-button.md +1 -1
  419. package/docs/reference/components/cloudflare-video.md +1 -1
  420. package/docs/reference/components/dash-video.md +1 -1
  421. package/docs/reference/components/google-cast.md +1 -1
  422. package/docs/reference/components/hls-audio.md +3 -2
  423. package/docs/reference/components/hls-background-video.md +1 -1
  424. package/docs/reference/components/hls-video.md +13 -2
  425. package/docs/reference/components/hlsjs-video.md +11 -1
  426. package/docs/reference/components/icons.md +2 -1
  427. package/docs/reference/components/live-audio-compat-skin.md +35 -4
  428. package/docs/reference/components/live-audio-neutral-skin.md +36 -5
  429. package/docs/reference/components/live-audio-scaffold-skin.md +41 -0
  430. package/docs/reference/components/live-audio-skin.md +36 -5
  431. package/docs/reference/components/live-video-compat-skin.md +36 -4
  432. package/docs/reference/components/live-video-neutral-skin.md +37 -5
  433. package/docs/reference/components/live-video-scaffold-skin.md +47 -0
  434. package/docs/reference/components/live-video-skin.md +37 -5
  435. package/docs/reference/components/llms.txt +6 -1
  436. package/docs/reference/components/mux-audio.md +2 -2
  437. package/docs/reference/components/mux-background-video.md +1 -1
  438. package/docs/reference/components/mux-data.md +1 -1
  439. package/docs/reference/components/mux-video.md +2 -2
  440. package/docs/reference/components/native-hls-video.md +1 -1
  441. package/docs/reference/components/player-container.md +1 -1
  442. package/docs/reference/components/player.md +4 -4
  443. package/docs/reference/components/playerjs-video.md +197 -0
  444. package/docs/reference/components/shaka-video.md +1 -1
  445. package/docs/reference/components/spotify-audio.md +1 -1
  446. package/docs/reference/components/thumbnail.md +5 -5
  447. package/docs/reference/components/tiktok-video.md +1 -1
  448. package/docs/reference/components/twitch-video.md +1 -1
  449. package/docs/reference/components/video-compat-skin.md +36 -3
  450. package/docs/reference/components/video-neutral-skin.md +37 -4
  451. package/docs/reference/components/video-scaffold-skin.md +51 -0
  452. package/docs/reference/components/video-skin.md +37 -4
  453. package/docs/reference/components/video.md +1 -1
  454. package/docs/reference/components/vimeo-video.md +1 -1
  455. package/docs/reference/components/wistia-video.md +5 -1
  456. package/docs/reference/components/youtube-video.md +2 -2
  457. package/package.json +44 -41
@@ -0,0 +1,15 @@
1
+ import { SkinElement } from "../skin.js";
2
+ //#region src/presets/audio/scaffold-skin.d.ts
3
+ /** Packaged scaffold audio UI registered as `<audio-scaffold-skin>`. */
4
+ export declare class ScaffoldAudioSkinElement extends SkinElement {
5
+ static readonly tagName = "audio-scaffold-skin";
6
+ static styles: import("@videojs/utils/dom").ShadowStyle;
7
+ static template: HTMLTemplateElement | null;
8
+ }
9
+ declare global {
10
+ interface HTMLElementTagNameMap {
11
+ [ScaffoldAudioSkinElement.tagName]: ScaffoldAudioSkinElement;
12
+ }
13
+ }
14
+ //#endregion
15
+ //# sourceMappingURL=scaffold-skin.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { SkinElement } from "../skin.js";
2
+ import { template } from "../../internal/skins/scaffold-audio/template.js";
3
+ import scaffold_skin_default from "../../define/audio/scaffold-skin2.js";
4
+ import { createShadowStyle } from "@videojs/utils/dom";
5
+ //#region src/presets/audio/scaffold-skin.ts
6
+ /** Packaged scaffold audio UI registered as `<audio-scaffold-skin>`. */
7
+ var ScaffoldAudioSkinElement = class extends SkinElement {
8
+ static {
9
+ this.tagName = "audio-scaffold-skin";
10
+ }
11
+ static {
12
+ this.styles = createShadowStyle(scaffold_skin_default);
13
+ }
14
+ static {
15
+ this.template = template;
16
+ }
17
+ };
18
+ //#endregion
19
+ export { ScaffoldAudioSkinElement };
20
+
21
+ //# sourceMappingURL=scaffold-skin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-skin.js","names":["styles"],"sources":["../../../../src/presets/audio/scaffold-skin.ts"],"sourcesContent":["import { createShadowStyle } from '@videojs/utils/dom';\n\nimport { template } from '../../internal/skins/scaffold-audio/template';\nimport { SkinElement } from '../skin';\n\nimport styles from '../../define/audio/scaffold-skin.css?inline';\n\n/** Packaged scaffold audio UI registered as `<audio-scaffold-skin>`. */\nexport class ScaffoldAudioSkinElement extends SkinElement {\n static readonly tagName = 'audio-scaffold-skin';\n static styles = createShadowStyle(styles);\n static template = template;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ScaffoldAudioSkinElement.tagName]: ScaffoldAudioSkinElement;\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,2BAAb,cAA8C,YAAY;;EAC9B,KAAA,UAAA;;;EACV,KAAA,SAAA,kBAAkBA,qBAAM;;;EACtB,KAAA,WAAA;;AACpB"}
@@ -1,5 +1,4 @@
1
1
  import skin_default from "../../define/background/skin2.js";
2
- import { SKIN_HELP_TEXT, SKIN_HELP_URL } from "@videojs/core";
3
2
  import { ReactiveElement } from "@videojs/element";
4
3
  import { ensureGlobalStyle } from "@videojs/utils/dom";
5
4
  //#region src/presets/background/skin.ts
@@ -11,7 +10,6 @@ function getTemplateHTML() {
11
10
  <slot name="media"></slot>
12
11
  <slot></slot>
13
12
  </media-container>
14
- <a rel="help" href="${SKIN_HELP_URL}" hidden>${SKIN_HELP_TEXT}</a>
15
13
  `;
16
14
  }
17
15
  var BackgroundVideoSkinElement = class BackgroundVideoSkinElement extends ReactiveElement {
@@ -1 +1 @@
1
- {"version":3,"file":"skin.js","names":["styles"],"sources":["../../../../src/presets/background/skin.ts"],"sourcesContent":["import { SKIN_HELP_TEXT, SKIN_HELP_URL } from '@videojs/core';\nimport { ReactiveElement } from '@videojs/element';\nimport { ensureGlobalStyle } from '@videojs/utils/dom';\n\nimport styles from '../../define/background/skin.css?inline';\n\nconst STYLES_ID = '__media-background-styles';\n\nfunction getTemplateHTML() {\n return /* html */ `\n <media-container>\n <!-- @deprecated slot=\"media\" is no longer required, use the default slot instead -->\n <slot name=\"media\"></slot>\n <slot></slot>\n </media-container>\n <a rel=\"help\" href=\"${SKIN_HELP_URL}\" hidden>${SKIN_HELP_TEXT}</a>\n `;\n}\n\nexport class BackgroundVideoSkinElement extends ReactiveElement {\n static readonly tagName = 'background-video-skin';\n static shadowRootOptions: ShadowRootInit = { mode: 'open' };\n static getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n ensureGlobalStyle(STYLES_ID, styles);\n\n if (!this.shadowRoot) {\n this.attachShadow(BackgroundVideoSkinElement.shadowRootOptions);\n this.shadowRoot!.innerHTML = getTemplateHTML();\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [BackgroundVideoSkinElement.tagName]: BackgroundVideoSkinElement;\n }\n}\n"],"mappings":";;;;;AAMA,MAAM,YAAY;AAElB,SAAS,kBAAkB;CACzB,OAAkB;;;;;;0BAMM,cAAc,WAAW,eAAe;;AAElE;AAEA,IAAa,6BAAb,MAAa,mCAAmC,gBAAgB;;EACpC,KAAA,UAAA;;;EACiB,KAAA,oBAAA,EAAE,MAAM,OAAO;;;EACjC,KAAA,kBAAA;;CAEzB,cAAc;EACZ,MAAM;EAEN,kBAAkB,WAAWA,YAAM;EAEnC,IAAI,CAAC,KAAK,YAAY;GACpB,KAAK,aAAa,2BAA2B,iBAAiB;GAC9D,KAAK,WAAY,YAAY,gBAAgB;EAC/C;CACF;AACF"}
1
+ {"version":3,"file":"skin.js","names":["styles"],"sources":["../../../../src/presets/background/skin.ts"],"sourcesContent":["import { ReactiveElement } from '@videojs/element';\nimport { ensureGlobalStyle } from '@videojs/utils/dom';\n\nimport styles from '../../define/background/skin.css?inline';\n\nconst STYLES_ID = '__media-background-styles';\n\nfunction getTemplateHTML() {\n return /* html */ `\n <media-container>\n <!-- @deprecated slot=\"media\" is no longer required, use the default slot instead -->\n <slot name=\"media\"></slot>\n <slot></slot>\n </media-container>\n `;\n}\n\nexport class BackgroundVideoSkinElement extends ReactiveElement {\n static readonly tagName = 'background-video-skin';\n static shadowRootOptions: ShadowRootInit = { mode: 'open' };\n static getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n ensureGlobalStyle(STYLES_ID, styles);\n\n if (!this.shadowRoot) {\n this.attachShadow(BackgroundVideoSkinElement.shadowRootOptions);\n this.shadowRoot!.innerHTML = getTemplateHTML();\n }\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [BackgroundVideoSkinElement.tagName]: BackgroundVideoSkinElement;\n }\n}\n"],"mappings":";;;;AAKA,MAAM,YAAY;AAElB,SAAS,kBAAkB;CACzB,OAAkB;;;;;;;AAOpB;AAEA,IAAa,6BAAb,MAAa,mCAAmC,gBAAgB;;EACpC,KAAA,UAAA;;;EACiB,KAAA,oBAAA,EAAE,MAAM,OAAO;;;EACjC,KAAA,kBAAA;;CAEzB,cAAc;EACZ,MAAM;EAEN,kBAAkB,WAAWA,YAAM;EAEnC,IAAI,CAAC,KAAK,YAAY;GACpB,KAAK,aAAa,2BAA2B,iBAAiB;GAC9D,KAAK,WAAY,YAAY,gBAAgB;EAC/C;CACF;AACF"}
@@ -1,6 +1,7 @@
1
1
  import { CompatLiveAudioSkinElement } from "./compat-skin.js";
2
+ import { ScaffoldLiveAudioSkinElement } from "./scaffold-skin.js";
2
3
  import { LiveAudioPlayerElement, PlayerController } from "./player.js";
3
4
  import { LiveAudioSkinElement } from "./skin.js";
4
5
  import { NeutralLiveAudioSkinElement } from "./neutral-skin.js";
5
6
  import { liveAudioFeatures } from "@videojs/core/dom";
6
- export { CompatLiveAudioSkinElement, LiveAudioPlayerElement, LiveAudioSkinElement, NeutralLiveAudioSkinElement, PlayerController, liveAudioFeatures };
7
+ export { CompatLiveAudioSkinElement, LiveAudioPlayerElement, LiveAudioSkinElement, NeutralLiveAudioSkinElement, PlayerController, ScaffoldLiveAudioSkinElement, liveAudioFeatures };
@@ -1,6 +1,7 @@
1
1
  import { CompatLiveAudioSkinElement } from "./compat-skin.js";
2
2
  import { NeutralLiveAudioSkinElement } from "./neutral-skin.js";
3
3
  import { LiveAudioPlayerElement, PlayerController } from "./player.js";
4
+ import { ScaffoldLiveAudioSkinElement } from "./scaffold-skin.js";
4
5
  import { LiveAudioSkinElement } from "./skin.js";
5
6
  import { liveAudioFeatures } from "@videojs/core/dom";
6
- export { CompatLiveAudioSkinElement, LiveAudioPlayerElement, LiveAudioSkinElement, NeutralLiveAudioSkinElement, PlayerController, liveAudioFeatures };
7
+ export { CompatLiveAudioSkinElement, LiveAudioPlayerElement, LiveAudioSkinElement, NeutralLiveAudioSkinElement, PlayerController, ScaffoldLiveAudioSkinElement, liveAudioFeatures };
@@ -0,0 +1,15 @@
1
+ import { SkinElement } from "../skin.js";
2
+ //#region src/presets/live-audio/scaffold-skin.d.ts
3
+ /** Packaged scaffold live-audio UI registered as `<live-audio-scaffold-skin>`. */
4
+ export declare class ScaffoldLiveAudioSkinElement extends SkinElement {
5
+ static readonly tagName = "live-audio-scaffold-skin";
6
+ static styles: import("@videojs/utils/dom").ShadowStyle;
7
+ static template: HTMLTemplateElement | null;
8
+ }
9
+ declare global {
10
+ interface HTMLElementTagNameMap {
11
+ [ScaffoldLiveAudioSkinElement.tagName]: ScaffoldLiveAudioSkinElement;
12
+ }
13
+ }
14
+ //#endregion
15
+ //# sourceMappingURL=scaffold-skin.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { SkinElement } from "../skin.js";
2
+ import { template } from "../../internal/skins/scaffold-live-audio/template.js";
3
+ import scaffold_skin_default from "../../define/live-audio/scaffold-skin2.js";
4
+ import { createShadowStyle } from "@videojs/utils/dom";
5
+ //#region src/presets/live-audio/scaffold-skin.ts
6
+ /** Packaged scaffold live-audio UI registered as `<live-audio-scaffold-skin>`. */
7
+ var ScaffoldLiveAudioSkinElement = class extends SkinElement {
8
+ static {
9
+ this.tagName = "live-audio-scaffold-skin";
10
+ }
11
+ static {
12
+ this.styles = createShadowStyle(scaffold_skin_default);
13
+ }
14
+ static {
15
+ this.template = template;
16
+ }
17
+ };
18
+ //#endregion
19
+ export { ScaffoldLiveAudioSkinElement };
20
+
21
+ //# sourceMappingURL=scaffold-skin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-skin.js","names":["styles"],"sources":["../../../../src/presets/live-audio/scaffold-skin.ts"],"sourcesContent":["import { createShadowStyle } from '@videojs/utils/dom';\n\nimport { template } from '../../internal/skins/scaffold-live-audio/template';\nimport { SkinElement } from '../skin';\n\nimport styles from '../../define/live-audio/scaffold-skin.css?inline';\n\n/** Packaged scaffold live-audio UI registered as `<live-audio-scaffold-skin>`. */\nexport class ScaffoldLiveAudioSkinElement extends SkinElement {\n static readonly tagName = 'live-audio-scaffold-skin';\n static styles = createShadowStyle(styles);\n static template = template;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ScaffoldLiveAudioSkinElement.tagName]: ScaffoldLiveAudioSkinElement;\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,+BAAb,cAAkD,YAAY;;EAClC,KAAA,UAAA;;;EACV,KAAA,SAAA,kBAAkBA,qBAAM;;;EACtB,KAAA,WAAA;;AACpB"}
@@ -1,6 +1,7 @@
1
1
  import { CompatLiveVideoSkinElement } from "./compat-skin.js";
2
+ import { ScaffoldLiveVideoSkinElement } from "./scaffold-skin.js";
2
3
  import { LiveVideoPlayerElement, PlayerController } from "./player.js";
3
4
  import { LiveVideoSkinElement } from "./skin.js";
4
5
  import { NeutralLiveVideoSkinElement } from "./neutral-skin.js";
5
6
  import { liveVideoFeatures } from "@videojs/core/dom";
6
- export { CompatLiveVideoSkinElement, LiveVideoPlayerElement, LiveVideoSkinElement, NeutralLiveVideoSkinElement, PlayerController, liveVideoFeatures };
7
+ export { CompatLiveVideoSkinElement, LiveVideoPlayerElement, LiveVideoSkinElement, NeutralLiveVideoSkinElement, PlayerController, ScaffoldLiveVideoSkinElement, liveVideoFeatures };
@@ -1,6 +1,7 @@
1
1
  import { CompatLiveVideoSkinElement } from "./compat-skin.js";
2
2
  import { NeutralLiveVideoSkinElement } from "./neutral-skin.js";
3
3
  import { LiveVideoPlayerElement, PlayerController } from "./player.js";
4
+ import { ScaffoldLiveVideoSkinElement } from "./scaffold-skin.js";
4
5
  import { LiveVideoSkinElement } from "./skin.js";
5
6
  import { liveVideoFeatures } from "@videojs/core/dom";
6
- export { CompatLiveVideoSkinElement, LiveVideoPlayerElement, LiveVideoSkinElement, NeutralLiveVideoSkinElement, PlayerController, liveVideoFeatures };
7
+ export { CompatLiveVideoSkinElement, LiveVideoPlayerElement, LiveVideoSkinElement, NeutralLiveVideoSkinElement, PlayerController, ScaffoldLiveVideoSkinElement, liveVideoFeatures };
@@ -0,0 +1,15 @@
1
+ import { SkinElement } from "../skin.js";
2
+ //#region src/presets/live-video/scaffold-skin.d.ts
3
+ /** Packaged scaffold live-video UI registered as `<live-video-scaffold-skin>`. */
4
+ export declare class ScaffoldLiveVideoSkinElement extends SkinElement {
5
+ static readonly tagName = "live-video-scaffold-skin";
6
+ static styles: import("@videojs/utils/dom").ShadowStyle;
7
+ static template: HTMLTemplateElement | null;
8
+ }
9
+ declare global {
10
+ interface HTMLElementTagNameMap {
11
+ [ScaffoldLiveVideoSkinElement.tagName]: ScaffoldLiveVideoSkinElement;
12
+ }
13
+ }
14
+ //#endregion
15
+ //# sourceMappingURL=scaffold-skin.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { SkinElement } from "../skin.js";
2
+ import { template } from "../../internal/skins/scaffold-live-video/template.js";
3
+ import scaffold_skin_default from "../../define/live-video/scaffold-skin2.js";
4
+ import { createShadowStyle } from "@videojs/utils/dom";
5
+ //#region src/presets/live-video/scaffold-skin.ts
6
+ /** Packaged scaffold live-video UI registered as `<live-video-scaffold-skin>`. */
7
+ var ScaffoldLiveVideoSkinElement = class extends SkinElement {
8
+ static {
9
+ this.tagName = "live-video-scaffold-skin";
10
+ }
11
+ static {
12
+ this.styles = createShadowStyle(scaffold_skin_default);
13
+ }
14
+ static {
15
+ this.template = template;
16
+ }
17
+ };
18
+ //#endregion
19
+ export { ScaffoldLiveVideoSkinElement };
20
+
21
+ //# sourceMappingURL=scaffold-skin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-skin.js","names":["styles"],"sources":["../../../../src/presets/live-video/scaffold-skin.ts"],"sourcesContent":["import { createShadowStyle } from '@videojs/utils/dom';\n\nimport { template } from '../../internal/skins/scaffold-live-video/template';\nimport { SkinElement } from '../skin';\n\nimport styles from '../../define/live-video/scaffold-skin.css?inline';\n\n/** Packaged scaffold live-video UI registered as `<live-video-scaffold-skin>`. */\nexport class ScaffoldLiveVideoSkinElement extends SkinElement {\n static readonly tagName = 'live-video-scaffold-skin';\n static styles = createShadowStyle(styles);\n static template = template;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ScaffoldLiveVideoSkinElement.tagName]: ScaffoldLiveVideoSkinElement;\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,+BAAb,cAAkD,YAAY;;EAClC,KAAA,UAAA;;;EACV,KAAA,SAAA,kBAAkBA,qBAAM;;;EACtB,KAAA,WAAA;;AACpB"}
@@ -1,6 +1,5 @@
1
1
  import global_default from "../define/global.js";
2
2
  import shadow_default from "../define/shadow.js";
3
- import { SKIN_HELP_TEXT, SKIN_HELP_URL } from "@videojs/core";
4
3
  import { ReactiveElement } from "@videojs/element";
5
4
  import { applyShadowStyles, createShadowStyle, ensureGlobalStyle, renderTemplate } from "@videojs/utils/dom";
6
5
  //#region src/presets/skin.ts
@@ -21,22 +20,12 @@ var SkinElement = class extends ReactiveElement {
21
20
  const ctor = this.constructor;
22
21
  this.attachShadow(ctor.shadowRootOptions);
23
22
  if (ctor.template) renderTemplate(this.shadowRoot, ctor.template);
24
- this.shadowRoot.append(createHelpLink(this.ownerDocument));
25
23
  const sheets = [shadowSheet];
26
24
  if (ctor.styles) sheets.push(ctor.styles);
27
25
  applyShadowStyles(this.shadowRoot, sheets);
28
26
  }
29
27
  }
30
28
  };
31
- /** Every packaged skin links to the page that explains what the player is. See `SKIN_HELP_URL`. */
32
- function createHelpLink(doc) {
33
- const link = doc.createElement("a");
34
- link.rel = "help";
35
- link.href = SKIN_HELP_URL;
36
- link.hidden = true;
37
- link.textContent = SKIN_HELP_TEXT;
38
- return link;
39
- }
40
29
  //#endregion
41
30
  export { SkinElement };
42
31
 
@@ -1 +1 @@
1
- {"version":3,"file":"skin.js","names":["shadowStyles","globalStyles"],"sources":["../../../src/presets/skin.ts"],"sourcesContent":["import { SKIN_HELP_TEXT, SKIN_HELP_URL } from '@videojs/core';\nimport { ReactiveElement } from '@videojs/element';\nimport {\n applyShadowStyles,\n createShadowStyle,\n ensureGlobalStyle,\n renderTemplate,\n type ShadowStyle,\n} from '@videojs/utils/dom';\n\nimport globalStyles from '../define/global.css?inline';\nimport shadowStyles from '../define/shadow.css?inline';\n\nconst STYLES_ID = '__media-styles';\nconst shadowSheet = createShadowStyle(shadowStyles);\n\n/**\n * Base element for skin definitions. Attaches a shadow root, clones `static template` into it, and applies shared +\n * per-skin styles via `adoptedStyleSheets` (or `<style>` fallback).\n */\nexport class SkinElement extends ReactiveElement {\n static shadowRootOptions: ShadowRootInit = { mode: 'open' };\n static styles?: ShadowStyle;\n static template?: HTMLTemplateElement | null;\n\n constructor() {\n super();\n\n ensureGlobalStyle(STYLES_ID, globalStyles);\n\n if (!this.shadowRoot) {\n const ctor = this.constructor as typeof SkinElement;\n\n this.attachShadow(ctor.shadowRootOptions);\n\n if (ctor.template) {\n renderTemplate(this.shadowRoot!, ctor.template);\n }\n\n this.shadowRoot!.append(createHelpLink(this.ownerDocument));\n\n const sheets: ShadowStyle[] = [shadowSheet];\n\n if (ctor.styles) {\n sheets.push(ctor.styles);\n }\n\n applyShadowStyles(this.shadowRoot!, sheets);\n }\n }\n}\n\n/** Every packaged skin links to the page that explains what the player is. See `SKIN_HELP_URL`. */\nfunction createHelpLink(doc: Document): HTMLAnchorElement {\n const link = doc.createElement('a');\n\n link.rel = 'help';\n link.href = SKIN_HELP_URL;\n link.hidden = true;\n link.textContent = SKIN_HELP_TEXT;\n\n return link;\n}\n"],"mappings":";;;;;;AAaA,MAAM,YAAY;AAClB,MAAM,cAAc,kBAAkBA,cAAY;;;;;AAMlD,IAAa,cAAb,cAAiC,gBAAgB;;EACJ,KAAA,oBAAA,EAAE,MAAM,OAAO;;CAI1D,cAAc;EACZ,MAAM;EAEN,kBAAkB,WAAWC,cAAY;EAEzC,IAAI,CAAC,KAAK,YAAY;GACpB,MAAM,OAAO,KAAK;GAElB,KAAK,aAAa,KAAK,iBAAiB;GAExC,IAAI,KAAK,UACP,eAAe,KAAK,YAAa,KAAK,QAAQ;GAGhD,KAAK,WAAY,OAAO,eAAe,KAAK,aAAa,CAAC;GAE1D,MAAM,SAAwB,CAAC,WAAW;GAE1C,IAAI,KAAK,QACP,OAAO,KAAK,KAAK,MAAM;GAGzB,kBAAkB,KAAK,YAAa,MAAM;EAC5C;CACF;AACF;;AAGA,SAAS,eAAe,KAAkC;CACxD,MAAM,OAAO,IAAI,cAAc,GAAG;CAElC,KAAK,MAAM;CACX,KAAK,OAAO;CACZ,KAAK,SAAS;CACd,KAAK,cAAc;CAEnB,OAAO;AACT"}
1
+ {"version":3,"file":"skin.js","names":["shadowStyles","globalStyles"],"sources":["../../../src/presets/skin.ts"],"sourcesContent":["import { ReactiveElement } from '@videojs/element';\nimport {\n applyShadowStyles,\n createShadowStyle,\n ensureGlobalStyle,\n renderTemplate,\n type ShadowStyle,\n} from '@videojs/utils/dom';\n\nimport globalStyles from '../define/global.css?inline';\nimport shadowStyles from '../define/shadow.css?inline';\n\nconst STYLES_ID = '__media-styles';\nconst shadowSheet = createShadowStyle(shadowStyles);\n\n/**\n * Base element for skin definitions. Attaches a shadow root, clones `static template` into it, and applies shared +\n * per-skin styles via `adoptedStyleSheets` (or `<style>` fallback).\n */\nexport class SkinElement extends ReactiveElement {\n static shadowRootOptions: ShadowRootInit = { mode: 'open' };\n static styles?: ShadowStyle;\n static template?: HTMLTemplateElement | null;\n\n constructor() {\n super();\n\n ensureGlobalStyle(STYLES_ID, globalStyles);\n\n if (!this.shadowRoot) {\n const ctor = this.constructor as typeof SkinElement;\n\n this.attachShadow(ctor.shadowRootOptions);\n\n if (ctor.template) {\n renderTemplate(this.shadowRoot!, ctor.template);\n }\n\n const sheets: ShadowStyle[] = [shadowSheet];\n\n if (ctor.styles) {\n sheets.push(ctor.styles);\n }\n\n applyShadowStyles(this.shadowRoot!, sheets);\n }\n }\n}\n"],"mappings":";;;;;AAYA,MAAM,YAAY;AAClB,MAAM,cAAc,kBAAkBA,cAAY;;;;;AAMlD,IAAa,cAAb,cAAiC,gBAAgB;;EACJ,KAAA,oBAAA,EAAE,MAAM,OAAO;;CAI1D,cAAc;EACZ,MAAM;EAEN,kBAAkB,WAAWC,cAAY;EAEzC,IAAI,CAAC,KAAK,YAAY;GACpB,MAAM,OAAO,KAAK;GAElB,KAAK,aAAa,KAAK,iBAAiB;GAExC,IAAI,KAAK,UACP,eAAe,KAAK,YAAa,KAAK,QAAQ;GAGhD,MAAM,SAAwB,CAAC,WAAW;GAE1C,IAAI,KAAK,QACP,OAAO,KAAK,KAAK,MAAM;GAGzB,kBAAkB,KAAK,YAAa,MAAM;EAC5C;CACF;AACF"}
@@ -1,6 +1,7 @@
1
1
  import { CompatVideoSkinElement } from "./compat-skin.js";
2
+ import { ScaffoldVideoSkinElement } from "./scaffold-skin.js";
2
3
  import { NeutralVideoSkinElement } from "./neutral-skin.js";
3
4
  import { PlayerController, VideoPlayerElement } from "./player.js";
4
5
  import { VideoSkinElement } from "./skin.js";
5
6
  import { videoFeatures } from "@videojs/core/dom";
6
- export { CompatVideoSkinElement, NeutralVideoSkinElement, PlayerController, VideoPlayerElement, VideoSkinElement, videoFeatures };
7
+ export { CompatVideoSkinElement, NeutralVideoSkinElement, PlayerController, ScaffoldVideoSkinElement, VideoPlayerElement, VideoSkinElement, videoFeatures };
@@ -1,6 +1,7 @@
1
1
  import { CompatVideoSkinElement } from "./compat-skin.js";
2
2
  import { NeutralVideoSkinElement } from "./neutral-skin.js";
3
3
  import { PlayerController, VideoPlayerElement } from "./player.js";
4
+ import { ScaffoldVideoSkinElement } from "./scaffold-skin.js";
4
5
  import { VideoSkinElement } from "./skin.js";
5
6
  import { videoFeatures } from "@videojs/core/dom";
6
- export { CompatVideoSkinElement, NeutralVideoSkinElement, PlayerController, VideoPlayerElement, VideoSkinElement, videoFeatures };
7
+ export { CompatVideoSkinElement, NeutralVideoSkinElement, PlayerController, ScaffoldVideoSkinElement, VideoPlayerElement, VideoSkinElement, videoFeatures };
@@ -0,0 +1,15 @@
1
+ import { SkinElement } from "../skin.js";
2
+ //#region src/presets/video/scaffold-skin.d.ts
3
+ /** Packaged scaffold video UI registered as `<video-scaffold-skin>`. */
4
+ export declare class ScaffoldVideoSkinElement extends SkinElement {
5
+ static readonly tagName = "video-scaffold-skin";
6
+ static styles: import("@videojs/utils/dom").ShadowStyle;
7
+ static template: HTMLTemplateElement | null;
8
+ }
9
+ declare global {
10
+ interface HTMLElementTagNameMap {
11
+ [ScaffoldVideoSkinElement.tagName]: ScaffoldVideoSkinElement;
12
+ }
13
+ }
14
+ //#endregion
15
+ //# sourceMappingURL=scaffold-skin.d.ts.map
@@ -0,0 +1,21 @@
1
+ import { SkinElement } from "../skin.js";
2
+ import { template } from "../../internal/skins/scaffold-video/template.js";
3
+ import scaffold_skin_default from "../../define/video/scaffold-skin2.js";
4
+ import { createShadowStyle } from "@videojs/utils/dom";
5
+ //#region src/presets/video/scaffold-skin.ts
6
+ /** Packaged scaffold video UI registered as `<video-scaffold-skin>`. */
7
+ var ScaffoldVideoSkinElement = class extends SkinElement {
8
+ static {
9
+ this.tagName = "video-scaffold-skin";
10
+ }
11
+ static {
12
+ this.styles = createShadowStyle(scaffold_skin_default);
13
+ }
14
+ static {
15
+ this.template = template;
16
+ }
17
+ };
18
+ //#endregion
19
+ export { ScaffoldVideoSkinElement };
20
+
21
+ //# sourceMappingURL=scaffold-skin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"scaffold-skin.js","names":["styles"],"sources":["../../../../src/presets/video/scaffold-skin.ts"],"sourcesContent":["import { createShadowStyle } from '@videojs/utils/dom';\n\nimport { template } from '../../internal/skins/scaffold-video/template';\nimport { SkinElement } from '../skin';\n\nimport styles from '../../define/video/scaffold-skin.css?inline';\n\n/** Packaged scaffold video UI registered as `<video-scaffold-skin>`. */\nexport class ScaffoldVideoSkinElement extends SkinElement {\n static readonly tagName = 'video-scaffold-skin';\n static styles = createShadowStyle(styles);\n static template = template;\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ScaffoldVideoSkinElement.tagName]: ScaffoldVideoSkinElement;\n }\n}\n"],"mappings":";;;;;;AAQA,IAAa,2BAAb,cAA8C,YAAY;;EAC9B,KAAA,UAAA;;;EACV,KAAA,SAAA,kBAAkBA,qBAAM;;;EACtB,KAAA,WAAA;;AACpB"}
@@ -167,9 +167,9 @@ var ThumbnailElement = class extends UIElement {
167
167
  }
168
168
  }
169
169
  /**
170
- * Leaving `crossOrigin` unset means "follow the media element", so thumbnails keep working on a CORS-enabled player
170
+ * Leaving `crossOrigin` unset means "follow the media component", so thumbnails keep working on a CORS-enabled player
171
171
  * without a skin having to thread an attribute through. Only the `<track>` path inherits: `thumbnails` set directly
172
- * may point at a host that has nothing to do with the media element.
172
+ * may point at a host that has nothing to do with the media component.
173
173
  */
174
174
  #inheritedCrossOrigin(textTrack) {
175
175
  return this.#externalThumbnails ? void 0 : textTrack?.thumbnailsTrack?.crossOrigin;
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/thumbnail/element.ts"],"sourcesContent":["import {\n mapCuesToThumbnails,\n ThumbnailCore,\n ThumbnailDataAttrs,\n type ThumbnailImage,\n type ThumbnailResizeResult,\n type ThumbnailImageProps,\n type ThumbnailProps,\n} from '@videojs/core';\nimport type { ThumbnailApi } from '@videojs/core/dom';\nimport { applyElementProps, applyStateDataAttrs, createThumbnail, selectTextTrack } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { MediaTextTrackState } from '@videojs/media';\nimport { findComposedElement, isHTMLImageElement, listen } from '@videojs/utils/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { UIElement } from '../ui-element';\n\nconst SHADOW_CSS = `\\\n:host {\n display: inline-block;\n overflow: hidden;\n}\nimg,\n::slotted(img) {\n display: block;\n}`;\n\n/**\n * Image attributes the element fills in from its own properties. Ones already on an image when it is adopted are the\n * author's and are left alone, so an `<img slot=\"thumbnail\" loading=\"lazy\">` keeps its settings inside a skin.\n */\nconst IMAGE_ATTRIBUTES = ['crossorigin', 'loading', 'fetchpriority'] as const;\n\ntype ImageAttribute = (typeof IMAGE_ATTRIBUTES)[number];\n\n/** The image the element draws when none is supplied, reachable from outside as `::part(image)`. */\nfunction createFallbackImage(): HTMLImageElement {\n const img = document.createElement('img');\n\n img.alt = '';\n img.setAttribute('part', 'image');\n img.setAttribute('aria-hidden', 'true');\n img.setAttribute('decoding', 'async');\n\n return img;\n}\n\n/**\n * `<media-thumbnail>` — resolves and sizes a time-based thumbnail into an image.\n *\n * The element owns `src` and `srcset` on the active image. Left empty, it draws an image of its own in its shadow root.\n * Supply an `<img>` child instead — `<media-thumbnail time=\"12\"><img alt=\"\"></media-thumbnail>` — to compose overlays\n * or loading indicators beside the image the element controls. Any `crossorigin`, `loading`, or `fetchpriority` the\n * child already carries wins over the element's own; the rest are filled in. Inside a skin, an `<img slot=\"thumbnail\">`\n * of yours replaces the one the skin carries.\n */\nexport class ThumbnailElement extends UIElement {\n static readonly tagName = 'media-thumbnail';\n\n static override properties = {\n time: { type: Number },\n crossOrigin: { type: String, attribute: 'crossorigin' },\n loading: { type: String },\n fetchPriority: { type: String, attribute: 'fetchpriority' },\n } satisfies PropertyDeclarationMap<Exclude<keyof (ThumbnailProps & ThumbnailImageProps), 'thumbnails'>>;\n\n time = 0;\n crossOrigin: (ThumbnailProps & ThumbnailImageProps)['crossOrigin'];\n loading: (ThumbnailProps & ThumbnailImageProps)['loading'];\n fetchPriority: (ThumbnailProps & ThumbnailImageProps)['fetchPriority'];\n\n readonly #core = new ThumbnailCore();\n readonly #shadow = this.attachShadow({ mode: 'open' });\n readonly #fallback = createFallbackImage();\n readonly #children = new MutationObserver(() => this.requestUpdate());\n // An image assigned through a forwarding slot lives outside this subtree, so its\n // attributes are watched on the image itself.\n readonly #imageAttributes = new MutationObserver(() => this.requestUpdate());\n readonly #textTracks = new PlayerController(this, playerContext, selectTextTrack);\n\n #slots: AbortController | null = null;\n #img: HTMLImageElement | null = null;\n /** Attributes `#img` already carried when adopted, which the author owns. */\n #authored = new Set<ImageAttribute>();\n #thumbnails: ThumbnailImage[] = [];\n #externalThumbnails: ThumbnailImage[] | undefined;\n #lastTextTrack: MediaTextTrackState | undefined;\n #api: ThumbnailApi | null = null;\n\n constructor() {\n super();\n\n const style = document.createElement('style');\n\n style.textContent = SHADOW_CSS;\n this.#shadow.append(style, document.createElement('slot'), this.#fallback);\n }\n\n /**\n * Set thumbnail images directly, bypassing the automatic `<track>` detection. When set, this takes priority over the\n * text track path.\n */\n get thumbnails(): ThumbnailImage[] | undefined {\n return this.#externalThumbnails;\n }\n\n set thumbnails(value: ThumbnailImage[] | undefined) {\n this.#externalThumbnails = value;\n this.requestUpdate();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.#api = createThumbnail({\n getContainer: () => this,\n getImg: () => this.#img,\n onStateChange: () => this.requestUpdate(),\n });\n this.#children.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['src', 'srcset'],\n });\n\n // Nodes assigned to a forwarding slot are not children of this subtree, so an image slotted\n // in later never shows up as a mutation. The slot announces it with `slotchange` instead.\n this.#slots = new AbortController();\n listen(this, 'slotchange', () => this.requestUpdate(), { signal: this.#slots.signal });\n\n // Disconnecting let go of the image, and reconnecting alone schedules no update,\n // so a moved element adopts its image and reapplies the source here.\n this.requestUpdate();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.#adopt(null);\n this.#children.disconnect();\n this.#slots?.abort();\n this.#slots = null;\n this.#api?.destroy();\n this.#api = null;\n }\n\n override destroyCallback(): void {\n this.#api?.destroy();\n super.destroyCallback();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const textTrack = this.#textTracks.value;\n\n // Resolve thumbnails: external prop takes priority over auto <track> path.\n if (this.#externalThumbnails) {\n this.#thumbnails = this.#externalThumbnails;\n } else if (textTrack !== this.#lastTextTrack) {\n this.#lastTextTrack = textTrack;\n const thumbnailsTrack = textTrack?.thumbnailsTrack;\n\n this.#thumbnails =\n thumbnailsTrack && thumbnailsTrack.cues.length > 0\n ? mapCuesToThumbnails(thumbnailsTrack.cues, thumbnailsTrack.src ?? undefined)\n : [];\n }\n\n const thumbnail = this.#core.findActiveThumbnail(this.#thumbnails, this.time);\n const img = findComposedElement(this, isHTMLImageElement) ?? this.#fallback;\n\n this.#adopt(img);\n this.#applyImageAttributes(img, textTrack);\n\n // Track src changes via the thumbnail API.\n this.#api?.updateSrc(thumbnail?.url);\n this.#applySource(thumbnail?.url);\n this.#api?.connect();\n\n if (!thumbnail) {\n this.#resetStyles();\n\n const state = this.#core.getState(false, false, undefined);\n\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, ThumbnailDataAttrs);\n return;\n }\n\n const api = this.#api;\n const state = this.#core.getState(api?.loading ?? false, api?.error ?? false, thumbnail);\n\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, ThumbnailDataAttrs);\n\n if (api?.naturalWidth && api.naturalHeight) {\n const constraints = api.readConstraints();\n const result = this.#core.resize(thumbnail, api.naturalWidth, api.naturalHeight, constraints);\n\n if (result) {\n this.#applyResize(result);\n }\n }\n }\n\n /**\n * Leaving `crossOrigin` unset means \"follow the media element\", so thumbnails keep working on a CORS-enabled player\n * without a skin having to thread an attribute through. Only the `<track>` path inherits: `thumbnails` set directly\n * may point at a host that has nothing to do with the media element.\n */\n #inheritedCrossOrigin(\n textTrack: MediaTextTrackState | undefined\n ): (ThumbnailProps & ThumbnailImageProps)['crossOrigin'] {\n return this.#externalThumbnails ? undefined : textTrack?.thumbnailsTrack?.crossOrigin;\n }\n\n /** Sync image attributes from element properties, leaving the ones the author put on the image alone. */\n #applyImageAttributes(img: HTMLImageElement, textTrack: MediaTextTrackState | undefined): void {\n const props: Partial<Record<ImageAttribute, string | undefined>> = {\n crossorigin: this.#core.resolveCrossOrigin(this.crossOrigin, this.#inheritedCrossOrigin(textTrack)),\n loading: this.loading,\n fetchpriority: this.fetchPriority,\n };\n\n for (const name of this.#authored) delete props[name];\n\n applyElementProps(img, props);\n }\n\n #applyResize(result: ThumbnailResizeResult): void {\n this.style.width = `${result.containerWidth}px`;\n this.style.height = `${result.containerHeight}px`;\n\n const imgStyle = this.#img?.style;\n if (!imgStyle) return;\n\n imgStyle.width = `${result.imageWidth}px`;\n imgStyle.height = `${result.imageHeight}px`;\n imgStyle.maxWidth = 'none';\n imgStyle.transform =\n result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : '';\n }\n\n #resetStyles(): void {\n this.style.width = '';\n this.style.height = '';\n\n const imgStyle = this.#img?.style;\n if (!imgStyle) return;\n\n imgStyle.width = '';\n imgStyle.height = '';\n imgStyle.maxWidth = '';\n imgStyle.transform = '';\n }\n\n #adopt(next: HTMLImageElement | null): void {\n if (next === this.#img) return;\n\n const previous = this.#img;\n\n if (previous) {\n this.#api?.disconnectImg(previous);\n this.#resetStyles();\n previous.removeAttribute('src');\n previous.removeAttribute('srcset');\n\n for (const name of IMAGE_ATTRIBUTES) {\n if (!this.#authored.has(name)) previous.removeAttribute(name);\n }\n }\n\n // Ownership is settled once, when an image becomes active: after the first\n // sync the attributes we set would themselves look authored.\n this.#img = next;\n this.#authored = new Set(next ? IMAGE_ATTRIBUTES.filter((name) => next.hasAttribute(name)) : []);\n this.#imageAttributes.disconnect();\n\n if (next && next !== this.#fallback) {\n this.#imageAttributes.observe(next, { attributes: true, attributeFilter: ['src', 'srcset'] });\n }\n\n // The fallback only occupies the shadow root while it is the active image,\n // so a supplied image never sits beside a hidden one.\n if (next === this.#fallback) this.#shadow.append(this.#fallback);\n else if (next) this.#fallback.remove();\n\n // Reset the request even when the next image will receive the same URL. A\n // replacement image is a new download with its own lifecycle.\n this.#api?.updateSrc(undefined);\n }\n\n #applySource(src: string | undefined): void {\n const img = this.#img;\n if (!img) return;\n\n // A srcset candidate wins over src, so the root has to clear both parts of\n // the source contract before applying the selected thumbnail URL.\n img.removeAttribute('srcset');\n\n if (!src) img.removeAttribute('src');\n else if (img.getAttribute('src') !== src) img.setAttribute('src', src);\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/thumbnail/element.ts"],"sourcesContent":["import {\n mapCuesToThumbnails,\n ThumbnailCore,\n ThumbnailDataAttrs,\n type ThumbnailImage,\n type ThumbnailResizeResult,\n type ThumbnailImageProps,\n type ThumbnailProps,\n} from '@videojs/core';\nimport type { ThumbnailApi } from '@videojs/core/dom';\nimport { applyElementProps, applyStateDataAttrs, createThumbnail, selectTextTrack } from '@videojs/core/dom';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport type { MediaTextTrackState } from '@videojs/media';\nimport { findComposedElement, isHTMLImageElement, listen } from '@videojs/utils/dom';\n\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { UIElement } from '../ui-element';\n\nconst SHADOW_CSS = `\\\n:host {\n display: inline-block;\n overflow: hidden;\n}\nimg,\n::slotted(img) {\n display: block;\n}`;\n\n/**\n * Image attributes the element fills in from its own properties. Ones already on an image when it is adopted are the\n * author's and are left alone, so an `<img slot=\"thumbnail\" loading=\"lazy\">` keeps its settings inside a skin.\n */\nconst IMAGE_ATTRIBUTES = ['crossorigin', 'loading', 'fetchpriority'] as const;\n\ntype ImageAttribute = (typeof IMAGE_ATTRIBUTES)[number];\n\n/** The image the element draws when none is supplied, reachable from outside as `::part(image)`. */\nfunction createFallbackImage(): HTMLImageElement {\n const img = document.createElement('img');\n\n img.alt = '';\n img.setAttribute('part', 'image');\n img.setAttribute('aria-hidden', 'true');\n img.setAttribute('decoding', 'async');\n\n return img;\n}\n\n/**\n * `<media-thumbnail>` — resolves and sizes a time-based thumbnail into an image.\n *\n * The element owns `src` and `srcset` on the active image. Left empty, it draws an image of its own in its shadow root.\n * Supply an `<img>` child instead — `<media-thumbnail time=\"12\"><img alt=\"\"></media-thumbnail>` — to compose overlays\n * or loading indicators beside the image the element controls. Any `crossorigin`, `loading`, or `fetchpriority` the\n * child already carries wins over the element's own; the rest are filled in. Inside a skin, an `<img slot=\"thumbnail\">`\n * of yours replaces the one the skin carries.\n */\nexport class ThumbnailElement extends UIElement {\n static readonly tagName = 'media-thumbnail';\n\n static override properties = {\n time: { type: Number },\n crossOrigin: { type: String, attribute: 'crossorigin' },\n loading: { type: String },\n fetchPriority: { type: String, attribute: 'fetchpriority' },\n } satisfies PropertyDeclarationMap<Exclude<keyof (ThumbnailProps & ThumbnailImageProps), 'thumbnails'>>;\n\n time = 0;\n crossOrigin: (ThumbnailProps & ThumbnailImageProps)['crossOrigin'];\n loading: (ThumbnailProps & ThumbnailImageProps)['loading'];\n fetchPriority: (ThumbnailProps & ThumbnailImageProps)['fetchPriority'];\n\n readonly #core = new ThumbnailCore();\n readonly #shadow = this.attachShadow({ mode: 'open' });\n readonly #fallback = createFallbackImage();\n readonly #children = new MutationObserver(() => this.requestUpdate());\n // An image assigned through a forwarding slot lives outside this subtree, so its\n // attributes are watched on the image itself.\n readonly #imageAttributes = new MutationObserver(() => this.requestUpdate());\n readonly #textTracks = new PlayerController(this, playerContext, selectTextTrack);\n\n #slots: AbortController | null = null;\n #img: HTMLImageElement | null = null;\n /** Attributes `#img` already carried when adopted, which the author owns. */\n #authored = new Set<ImageAttribute>();\n #thumbnails: ThumbnailImage[] = [];\n #externalThumbnails: ThumbnailImage[] | undefined;\n #lastTextTrack: MediaTextTrackState | undefined;\n #api: ThumbnailApi | null = null;\n\n constructor() {\n super();\n\n const style = document.createElement('style');\n\n style.textContent = SHADOW_CSS;\n this.#shadow.append(style, document.createElement('slot'), this.#fallback);\n }\n\n /**\n * Set thumbnail images directly, bypassing the automatic `<track>` detection. When set, this takes priority over the\n * text track path.\n */\n get thumbnails(): ThumbnailImage[] | undefined {\n return this.#externalThumbnails;\n }\n\n set thumbnails(value: ThumbnailImage[] | undefined) {\n this.#externalThumbnails = value;\n this.requestUpdate();\n }\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.#api = createThumbnail({\n getContainer: () => this,\n getImg: () => this.#img,\n onStateChange: () => this.requestUpdate(),\n });\n this.#children.observe(this, {\n childList: true,\n subtree: true,\n attributes: true,\n attributeFilter: ['src', 'srcset'],\n });\n\n // Nodes assigned to a forwarding slot are not children of this subtree, so an image slotted\n // in later never shows up as a mutation. The slot announces it with `slotchange` instead.\n this.#slots = new AbortController();\n listen(this, 'slotchange', () => this.requestUpdate(), { signal: this.#slots.signal });\n\n // Disconnecting let go of the image, and reconnecting alone schedules no update,\n // so a moved element adopts its image and reapplies the source here.\n this.requestUpdate();\n }\n\n override disconnectedCallback(): void {\n super.disconnectedCallback();\n\n this.#adopt(null);\n this.#children.disconnect();\n this.#slots?.abort();\n this.#slots = null;\n this.#api?.destroy();\n this.#api = null;\n }\n\n override destroyCallback(): void {\n this.#api?.destroy();\n super.destroyCallback();\n }\n\n protected override update(changed: PropertyValues): void {\n super.update(changed);\n\n const textTrack = this.#textTracks.value;\n\n // Resolve thumbnails: external prop takes priority over auto <track> path.\n if (this.#externalThumbnails) {\n this.#thumbnails = this.#externalThumbnails;\n } else if (textTrack !== this.#lastTextTrack) {\n this.#lastTextTrack = textTrack;\n const thumbnailsTrack = textTrack?.thumbnailsTrack;\n\n this.#thumbnails =\n thumbnailsTrack && thumbnailsTrack.cues.length > 0\n ? mapCuesToThumbnails(thumbnailsTrack.cues, thumbnailsTrack.src ?? undefined)\n : [];\n }\n\n const thumbnail = this.#core.findActiveThumbnail(this.#thumbnails, this.time);\n const img = findComposedElement(this, isHTMLImageElement) ?? this.#fallback;\n\n this.#adopt(img);\n this.#applyImageAttributes(img, textTrack);\n\n // Track src changes via the thumbnail API.\n this.#api?.updateSrc(thumbnail?.url);\n this.#applySource(thumbnail?.url);\n this.#api?.connect();\n\n if (!thumbnail) {\n this.#resetStyles();\n\n const state = this.#core.getState(false, false, undefined);\n\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, ThumbnailDataAttrs);\n return;\n }\n\n const api = this.#api;\n const state = this.#core.getState(api?.loading ?? false, api?.error ?? false, thumbnail);\n\n applyElementProps(this, this.#core.getAttrs(state));\n applyStateDataAttrs(this, state, ThumbnailDataAttrs);\n\n if (api?.naturalWidth && api.naturalHeight) {\n const constraints = api.readConstraints();\n const result = this.#core.resize(thumbnail, api.naturalWidth, api.naturalHeight, constraints);\n\n if (result) {\n this.#applyResize(result);\n }\n }\n }\n\n /**\n * Leaving `crossOrigin` unset means \"follow the media component\", so thumbnails keep working on a CORS-enabled player\n * without a skin having to thread an attribute through. Only the `<track>` path inherits: `thumbnails` set directly\n * may point at a host that has nothing to do with the media component.\n */\n #inheritedCrossOrigin(\n textTrack: MediaTextTrackState | undefined\n ): (ThumbnailProps & ThumbnailImageProps)['crossOrigin'] {\n return this.#externalThumbnails ? undefined : textTrack?.thumbnailsTrack?.crossOrigin;\n }\n\n /** Sync image attributes from element properties, leaving the ones the author put on the image alone. */\n #applyImageAttributes(img: HTMLImageElement, textTrack: MediaTextTrackState | undefined): void {\n const props: Partial<Record<ImageAttribute, string | undefined>> = {\n crossorigin: this.#core.resolveCrossOrigin(this.crossOrigin, this.#inheritedCrossOrigin(textTrack)),\n loading: this.loading,\n fetchpriority: this.fetchPriority,\n };\n\n for (const name of this.#authored) delete props[name];\n\n applyElementProps(img, props);\n }\n\n #applyResize(result: ThumbnailResizeResult): void {\n this.style.width = `${result.containerWidth}px`;\n this.style.height = `${result.containerHeight}px`;\n\n const imgStyle = this.#img?.style;\n if (!imgStyle) return;\n\n imgStyle.width = `${result.imageWidth}px`;\n imgStyle.height = `${result.imageHeight}px`;\n imgStyle.maxWidth = 'none';\n imgStyle.transform =\n result.offsetX || result.offsetY ? `translate(-${result.offsetX}px, -${result.offsetY}px)` : '';\n }\n\n #resetStyles(): void {\n this.style.width = '';\n this.style.height = '';\n\n const imgStyle = this.#img?.style;\n if (!imgStyle) return;\n\n imgStyle.width = '';\n imgStyle.height = '';\n imgStyle.maxWidth = '';\n imgStyle.transform = '';\n }\n\n #adopt(next: HTMLImageElement | null): void {\n if (next === this.#img) return;\n\n const previous = this.#img;\n\n if (previous) {\n this.#api?.disconnectImg(previous);\n this.#resetStyles();\n previous.removeAttribute('src');\n previous.removeAttribute('srcset');\n\n for (const name of IMAGE_ATTRIBUTES) {\n if (!this.#authored.has(name)) previous.removeAttribute(name);\n }\n }\n\n // Ownership is settled once, when an image becomes active: after the first\n // sync the attributes we set would themselves look authored.\n this.#img = next;\n this.#authored = new Set(next ? IMAGE_ATTRIBUTES.filter((name) => next.hasAttribute(name)) : []);\n this.#imageAttributes.disconnect();\n\n if (next && next !== this.#fallback) {\n this.#imageAttributes.observe(next, { attributes: true, attributeFilter: ['src', 'srcset'] });\n }\n\n // The fallback only occupies the shadow root while it is the active image,\n // so a supplied image never sits beside a hidden one.\n if (next === this.#fallback) this.#shadow.append(this.#fallback);\n else if (next) this.#fallback.remove();\n\n // Reset the request even when the next image will receive the same URL. A\n // replacement image is a new download with its own lifecycle.\n this.#api?.updateSrc(undefined);\n }\n\n #applySource(src: string | undefined): void {\n const img = this.#img;\n if (!img) return;\n\n // A srcset candidate wins over src, so the root has to clear both parts of\n // the source contract before applying the selected thumbnail URL.\n img.removeAttribute('srcset');\n\n if (!src) img.removeAttribute('src');\n else if (img.getAttribute('src') !== src) img.setAttribute('src', src);\n }\n}\n"],"mappings":"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"}
@@ -4,9 +4,9 @@ import { playerContext } from "../../player/context.js";
4
4
  import { PlayerController } from "../../player/controller.js";
5
5
  import { UIElement } from "../ui-element.js";
6
6
  import { sliderContext } from "../slider/context.js";
7
- import { TimeSliderCore, TimeSliderDataAttrs } from "@videojs/core";
8
- import { applyElementProps, applyStateDataAttrs, createSlider, getTimeSliderCSSVars, logMissingFeature, selectBuffer, selectControls, selectPlayback, selectTime } from "@videojs/core/dom";
9
- import { hasTimeRange } from "@videojs/media";
7
+ import { SliderCSSVars, TimeSliderCore, TimeSliderDataAttrs } from "@videojs/core";
8
+ import { applyElementProps, applyStateDataAttrs, createSlider, createTimeSliderSeek, getTimeSliderCSSVars, logMissingFeature, selectBuffer, selectControls, selectPlayback, selectTime } from "@videojs/core/dom";
9
+ import { hasTimeRange, isMediaPlaying } from "@videojs/media";
10
10
  import { ContextProvider } from "@videojs/element/context";
11
11
  import { translateText } from "@videojs/core/i18n";
12
12
  import { applyStyles } from "@videojs/utils/dom";
@@ -33,7 +33,9 @@ var TimeSliderElement = class extends UIElement {
33
33
  this.#timeState = new PlayerController(this, playerContext, selectTime);
34
34
  this.#bufferState = new PlayerController(this, playerContext, selectBuffer);
35
35
  this.#playbackState = new PlayerController(this, playerContext, selectPlayback);
36
+ this.#seek = createTimeSliderSeek(SliderCSSVars.fill);
36
37
  this.#i18n = new I18nController(this, i18nContext);
38
+ this.#cssVars = {};
37
39
  this.#slider = null;
38
40
  this.#disconnect = null;
39
41
  this.#releaseControlsLock = null;
@@ -71,7 +73,9 @@ var TimeSliderElement = class extends UIElement {
71
73
  #timeState;
72
74
  #bufferState;
73
75
  #playbackState;
76
+ #seek;
74
77
  #i18n;
78
+ #cssVars;
75
79
  #slider;
76
80
  #disconnect;
77
81
  #releaseControlsLock;
@@ -104,7 +108,11 @@ var TimeSliderElement = class extends UIElement {
104
108
  getLargeStepPercent: () => this.#core.getLargeStepPercent(),
105
109
  onValueCommit: (percent) => {
106
110
  const media = this.#timeState.value;
107
- if (media) media.seek(this.#core.rawValueFromPercent(percent));
111
+ if (media) {
112
+ const time = this.#core.rawValueFromPercent(percent);
113
+ this.#seek.seek(percent);
114
+ media.seek(time);
115
+ }
108
116
  },
109
117
  changeThrottle: this.changeThrottle,
110
118
  onPressStart: () => {
@@ -125,11 +133,13 @@ var TimeSliderElement = class extends UIElement {
125
133
  applyElementProps(this, this.#slider.rootProps, { signal });
126
134
  applyStyles(this, this.#slider.rootStyle);
127
135
  this.#slider.input.subscribe(() => this.requestUpdate(), { signal });
136
+ this.#seek.state.subscribe(() => this.requestUpdate(), { signal });
128
137
  if (!this.#timeState.value) logMissingFeature(this.localName, this.#timeState.displayName);
129
138
  }
130
139
  disconnectedCallback() {
131
140
  this.#releaseControlsVisibilityLock();
132
141
  this.#resumeIfDragPaused();
142
+ this.#seek.destroy();
133
143
  super.disconnectedCallback();
134
144
  this.#disconnect?.abort();
135
145
  this.#disconnect = null;
@@ -137,6 +147,7 @@ var TimeSliderElement = class extends UIElement {
137
147
  destroyCallback() {
138
148
  this.#releaseControlsVisibilityLock();
139
149
  this.#resumeIfDragPaused();
150
+ this.#seek.destroy();
140
151
  this.#slider?.destroy();
141
152
  super.destroyCallback();
142
153
  }
@@ -166,7 +177,11 @@ var TimeSliderElement = class extends UIElement {
166
177
  if (!this.#slider) return;
167
178
  const time = this.#timeState.value;
168
179
  const buffer = this.#bufferState.value;
169
- if (!time) return;
180
+ if (!time) {
181
+ this.#seek.destroy();
182
+ this.removeAttribute("data-playing");
183
+ return;
184
+ }
170
185
  this.#core.setInput(this.#slider.input.current);
171
186
  const media = {
172
187
  ...time,
@@ -177,9 +192,18 @@ var TimeSliderElement = class extends UIElement {
177
192
  };
178
193
  this.#core.setMedia(media);
179
194
  const state = this.#core.getState();
180
- const cssVars = getTimeSliderCSSVars(this.#slider.adjustForAlignment(state));
195
+ this.#seek.update(state.seeking, state.fillPercent, this);
196
+ const percent = this.#seek.state.current.percent;
197
+ this.toggleAttribute("data-playing", isMediaPlaying(this.#playbackState.value) && !state.disabled && !state.dragging && !state.seeking && percent === void 0);
198
+ const fill = percent === void 0 || state.dragging || state.disabled ? state : {
199
+ ...state,
200
+ fillPercent: percent
201
+ };
202
+ const cssVars = getTimeSliderCSSVars(this.#slider.adjustForAlignment(fill));
203
+ const styles = Object.fromEntries(Object.entries(cssVars).filter(([name, value]) => this.#cssVars[name] !== value));
204
+ applyStyles(this, styles);
205
+ this.#cssVars = cssVars;
181
206
  const thumbAttrs = this.#core.getAttrs(state);
182
- applyStyles(this, cssVars);
183
207
  applyStateDataAttrs(this, state, TimeSliderDataAttrs);
184
208
  this.#provider.setValue({
185
209
  state,
@@ -1 +1 @@
1
- {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/time-slider/element.ts"],"sourcesContent":["import { TimeSliderCore, TimeSliderDataAttrs, type TimeSliderProps } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createSlider,\n getTimeSliderCSSVars,\n logMissingFeature,\n type SliderApi,\n selectBuffer,\n selectControls,\n selectPlayback,\n selectTime,\n} from '@videojs/core/dom';\nimport { type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextProvider } from '@videojs/element/context';\nimport { hasTimeRange } from '@videojs/media';\nimport { applyStyles } from '@videojs/utils/dom';\nimport { formatTime } from '@videojs/utils/time';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { sliderContext } from '../slider/context';\nimport { UIElement } from '../ui-element';\n\n/**\n * @fires drag-start - Fired when a pointer drag starts.\n * @fires drag-end - Fired when a pointer drag ends.\n */\nexport class TimeSliderElement extends UIElement {\n static readonly tagName = 'media-time-slider';\n\n static override properties = {\n label: { type: String },\n changeThrottle: { type: Number, attribute: 'change-throttle' },\n step: { type: Number },\n largeStep: { type: Number, attribute: 'large-step' },\n orientation: { type: String },\n disabled: { type: Boolean },\n thumbAlignment: { type: String, attribute: 'thumb-alignment' },\n pauseOnDrag: { type: Boolean, attribute: 'pause-on-drag' },\n } satisfies PropertyDeclarationMap<Exclude<keyof TimeSliderProps, 'value' | 'min' | 'max'>>;\n\n label: Text | string = '';\n changeThrottle = TimeSliderCore.defaultProps.changeThrottle;\n step = TimeSliderCore.defaultProps.step;\n largeStep = TimeSliderCore.defaultProps.largeStep;\n orientation = TimeSliderCore.defaultProps.orientation;\n disabled = TimeSliderCore.defaultProps.disabled;\n thumbAlignment = TimeSliderCore.defaultProps.thumbAlignment;\n pauseOnDrag = TimeSliderCore.defaultProps.pauseOnDrag;\n\n readonly #core = new TimeSliderCore();\n readonly #controlsState = new PlayerController(this, playerContext, selectControls);\n readonly #provider = new ContextProvider(this, { context: sliderContext });\n readonly #timeState = new PlayerController(this, playerContext, selectTime);\n readonly #bufferState = new PlayerController(this, playerContext, selectBuffer);\n readonly #playbackState = new PlayerController(this, playerContext, selectPlayback);\n readonly #i18n = new I18nController(this, i18nContext);\n\n #slider: SliderApi | null = null;\n #disconnect: AbortController | null = null;\n #releaseControlsLock: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n const signal = this.#disconnect.signal;\n\n this.#slider = createSlider({\n getElement: () => this,\n getThumbElement: () => this.querySelector<HTMLElement>('media-slider-thumb'),\n getOrientation: () => this.orientation,\n isDisabled: () => {\n const time = this.#timeState.value;\n const buffer = this.#bufferState.value;\n\n // `bufferFeature` is optional: compositions that omit it still get a working slider, with an empty buffer.\n return this.disabled || !time || !hasTimeRange({ ...time, ...(buffer ?? { buffered: [], seekable: [] }) });\n },\n getPercent: () => {\n const media = this.#timeState.value;\n if (!media) return 0;\n\n return this.#core.percentFromValue(media.currentTime);\n },\n getStepPercent: () => this.#core.getStepPercent(),\n getLargeStepPercent: () => this.#core.getLargeStepPercent(),\n onValueCommit: (percent) => {\n const media = this.#timeState.value;\n\n if (media) media.seek(this.#core.rawValueFromPercent(percent));\n },\n changeThrottle: this.changeThrottle,\n onPressStart: () => {\n this.#releaseControlsLock ??= this.#controlsState.value?.requestControlsLock() ?? null;\n },\n onPressEnd: () => this.#releaseControlsVisibilityLock(),\n onDragStart: () => {\n this.#core.startDrag(this.#playbackState.value);\n this.dispatchEvent(new CustomEvent('drag-start', { bubbles: true }));\n },\n onDragEnd: () => {\n this.#core.endDrag(this.#playbackState.value);\n this.dispatchEvent(new CustomEvent('drag-end', { bubbles: true }));\n },\n adjustPercent: (raw, thumbSize, trackSize) => this.#core.adjustPercentForAlignment(raw, thumbSize, trackSize),\n onResize: () => this.requestUpdate(),\n });\n\n applyElementProps(this, this.#slider.rootProps, { signal });\n applyStyles(this, this.#slider.rootStyle);\n this.#slider.input.subscribe(() => this.requestUpdate(), { signal });\n\n if (__DEV__ && !this.#timeState.value) {\n logMissingFeature(this.localName, this.#timeState.displayName!);\n }\n }\n\n override disconnectedCallback(): void {\n this.#releaseControlsVisibilityLock();\n this.#resumeIfDragPaused();\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n override destroyCallback(): void {\n this.#releaseControlsVisibilityLock();\n this.#resumeIfDragPaused();\n this.#slider?.destroy();\n super.destroyCallback();\n }\n\n // createSlider's destroy() does not fire onDragEnd, so a teardown mid-drag\n // would leave playback paused. Called from both disconnect and destroy paths\n // before super so the PlayerController is still attached.\n #resumeIfDragPaused(): void {\n this.#core.endDrag(this.#playbackState.value);\n }\n\n #releaseControlsVisibilityLock(): void {\n this.#releaseControlsLock?.();\n this.#releaseControlsLock = null;\n }\n\n protected override willUpdate(_changed: PropertyValues): void {\n super.willUpdate(_changed);\n this.#core.setProps({\n label: this.label,\n changeThrottle: this.changeThrottle,\n step: this.step,\n largeStep: this.largeStep,\n orientation: this.orientation,\n disabled: this.disabled,\n thumbAlignment: this.thumbAlignment,\n pauseOnDrag: this.pauseOnDrag,\n });\n this.#core.setFormatLocale(this.#i18n.locale);\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n if (!this.#slider) return;\n\n const time = this.#timeState.value;\n const buffer = this.#bufferState.value;\n\n if (!time) return;\n\n this.#core.setInput(this.#slider.input.current);\n const media = { ...time, ...(buffer ?? { buffered: [], seekable: [] }) };\n\n this.#core.setMedia(media);\n const state = this.#core.getState();\n\n const cssVars = getTimeSliderCSSVars(this.#slider.adjustForAlignment(state));\n const thumbAttrs = this.#core.getAttrs(state);\n\n applyStyles(this, cssVars);\n\n // Domain-specific data attributes on root (includes data-seeking).\n applyStateDataAttrs(this, state, TimeSliderDataAttrs);\n\n // Provide context to child elements with base slider data attrs.\n this.#provider.setValue({\n state,\n stateAttrMap: TimeSliderDataAttrs,\n pointerValue: this.#core.rawValueFromPercent(state.pointerPercent),\n thumbAttrs: {\n ...thumbAttrs,\n 'aria-label': translateText(thumbAttrs['aria-label'], this.#i18n.value),\n 'aria-valuetext': translateText(\n thumbAttrs['aria-valuetext'],\n this.#i18n.value,\n this.#core.getValueTextParams(state)\n ),\n },\n thumbProps: this.#slider.thumbProps,\n formatValue: (value) => formatTime(value, state.duration, { locale: this.#i18n.locale }),\n });\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"element.js","names":[],"sources":["../../../../src/ui/time-slider/element.ts"],"sourcesContent":["import { SliderCSSVars, TimeSliderCore, TimeSliderDataAttrs, type TimeSliderProps } from '@videojs/core';\nimport {\n applyElementProps,\n applyStateDataAttrs,\n createSlider,\n createTimeSliderSeek,\n getTimeSliderCSSVars,\n logMissingFeature,\n type SliderApi,\n selectBuffer,\n selectControls,\n selectPlayback,\n selectTime,\n} from '@videojs/core/dom';\nimport { type Text, translateText } from '@videojs/core/i18n';\nimport type { PropertyDeclarationMap, PropertyValues } from '@videojs/element';\nimport { ContextProvider } from '@videojs/element/context';\nimport { hasTimeRange, isMediaPlaying } from '@videojs/media';\nimport { applyStyles } from '@videojs/utils/dom';\nimport { formatTime } from '@videojs/utils/time';\n\nimport { i18nContext } from '../../i18n/context';\nimport { I18nController } from '../../i18n/controller';\nimport { playerContext } from '../../player/context';\nimport { PlayerController } from '../../player/controller';\nimport { sliderContext } from '../slider/context';\nimport { UIElement } from '../ui-element';\n\n/**\n * @fires drag-start - Fired when a pointer drag starts.\n * @fires drag-end - Fired when a pointer drag ends.\n */\nexport class TimeSliderElement extends UIElement {\n static readonly tagName = 'media-time-slider';\n\n static override properties = {\n label: { type: String },\n changeThrottle: { type: Number, attribute: 'change-throttle' },\n step: { type: Number },\n largeStep: { type: Number, attribute: 'large-step' },\n orientation: { type: String },\n disabled: { type: Boolean },\n thumbAlignment: { type: String, attribute: 'thumb-alignment' },\n pauseOnDrag: { type: Boolean, attribute: 'pause-on-drag' },\n } satisfies PropertyDeclarationMap<Exclude<keyof TimeSliderProps, 'value' | 'min' | 'max'>>;\n\n label: Text | string = '';\n changeThrottle = TimeSliderCore.defaultProps.changeThrottle;\n step = TimeSliderCore.defaultProps.step;\n largeStep = TimeSliderCore.defaultProps.largeStep;\n orientation = TimeSliderCore.defaultProps.orientation;\n disabled = TimeSliderCore.defaultProps.disabled;\n thumbAlignment = TimeSliderCore.defaultProps.thumbAlignment;\n pauseOnDrag = TimeSliderCore.defaultProps.pauseOnDrag;\n\n readonly #core = new TimeSliderCore();\n readonly #controlsState = new PlayerController(this, playerContext, selectControls);\n readonly #provider = new ContextProvider(this, { context: sliderContext });\n readonly #timeState = new PlayerController(this, playerContext, selectTime);\n readonly #bufferState = new PlayerController(this, playerContext, selectBuffer);\n readonly #playbackState = new PlayerController(this, playerContext, selectPlayback);\n readonly #seek = createTimeSliderSeek(SliderCSSVars.fill);\n readonly #i18n = new I18nController(this, i18nContext);\n\n #cssVars: Record<string, string> = {};\n #slider: SliderApi | null = null;\n #disconnect: AbortController | null = null;\n #releaseControlsLock: (() => void) | null = null;\n\n override connectedCallback(): void {\n super.connectedCallback();\n\n if (this.destroyed) return;\n\n this.#disconnect = new AbortController();\n const signal = this.#disconnect.signal;\n\n this.#slider = createSlider({\n getElement: () => this,\n getThumbElement: () => this.querySelector<HTMLElement>('media-slider-thumb'),\n getOrientation: () => this.orientation,\n isDisabled: () => {\n const time = this.#timeState.value;\n const buffer = this.#bufferState.value;\n\n // `bufferFeature` is optional: compositions that omit it still get a working slider, with an empty buffer.\n return this.disabled || !time || !hasTimeRange({ ...time, ...(buffer ?? { buffered: [], seekable: [] }) });\n },\n getPercent: () => {\n const media = this.#timeState.value;\n if (!media) return 0;\n\n return this.#core.percentFromValue(media.currentTime);\n },\n getStepPercent: () => this.#core.getStepPercent(),\n getLargeStepPercent: () => this.#core.getLargeStepPercent(),\n onValueCommit: (percent) => {\n const media = this.#timeState.value;\n\n if (media) {\n const time = this.#core.rawValueFromPercent(percent);\n\n this.#seek.seek(percent);\n media.seek(time);\n }\n },\n changeThrottle: this.changeThrottle,\n onPressStart: () => {\n this.#releaseControlsLock ??= this.#controlsState.value?.requestControlsLock() ?? null;\n },\n onPressEnd: () => this.#releaseControlsVisibilityLock(),\n onDragStart: () => {\n this.#core.startDrag(this.#playbackState.value);\n this.dispatchEvent(new CustomEvent('drag-start', { bubbles: true }));\n },\n onDragEnd: () => {\n this.#core.endDrag(this.#playbackState.value);\n this.dispatchEvent(new CustomEvent('drag-end', { bubbles: true }));\n },\n adjustPercent: (raw, thumbSize, trackSize) => this.#core.adjustPercentForAlignment(raw, thumbSize, trackSize),\n onResize: () => this.requestUpdate(),\n });\n\n applyElementProps(this, this.#slider.rootProps, { signal });\n applyStyles(this, this.#slider.rootStyle);\n this.#slider.input.subscribe(() => this.requestUpdate(), { signal });\n this.#seek.state.subscribe(() => this.requestUpdate(), { signal });\n\n if (__DEV__ && !this.#timeState.value) {\n logMissingFeature(this.localName, this.#timeState.displayName!);\n }\n }\n\n override disconnectedCallback(): void {\n this.#releaseControlsVisibilityLock();\n this.#resumeIfDragPaused();\n this.#seek.destroy();\n super.disconnectedCallback();\n this.#disconnect?.abort();\n this.#disconnect = null;\n }\n\n override destroyCallback(): void {\n this.#releaseControlsVisibilityLock();\n this.#resumeIfDragPaused();\n this.#seek.destroy();\n this.#slider?.destroy();\n super.destroyCallback();\n }\n\n // createSlider's destroy() does not fire onDragEnd, so a teardown mid-drag\n // would leave playback paused. Called from both disconnect and destroy paths\n // before super so the PlayerController is still attached.\n #resumeIfDragPaused(): void {\n this.#core.endDrag(this.#playbackState.value);\n }\n\n #releaseControlsVisibilityLock(): void {\n this.#releaseControlsLock?.();\n this.#releaseControlsLock = null;\n }\n\n protected override willUpdate(_changed: PropertyValues): void {\n super.willUpdate(_changed);\n this.#core.setProps({\n label: this.label,\n changeThrottle: this.changeThrottle,\n step: this.step,\n largeStep: this.largeStep,\n orientation: this.orientation,\n disabled: this.disabled,\n thumbAlignment: this.thumbAlignment,\n pauseOnDrag: this.pauseOnDrag,\n });\n this.#core.setFormatLocale(this.#i18n.locale);\n }\n\n protected override update(_changed: PropertyValues): void {\n super.update(_changed);\n\n if (!this.#slider) return;\n\n const time = this.#timeState.value;\n const buffer = this.#bufferState.value;\n\n if (!time) {\n this.#seek.destroy();\n this.removeAttribute('data-playing');\n return;\n }\n\n this.#core.setInput(this.#slider.input.current);\n const media = { ...time, ...(buffer ?? { buffered: [], seekable: [] }) };\n\n this.#core.setMedia(media);\n const state = this.#core.getState();\n\n this.#seek.update(state.seeking, state.fillPercent, this);\n const percent = this.#seek.state.current.percent;\n\n this.toggleAttribute(\n 'data-playing',\n isMediaPlaying(this.#playbackState.value) &&\n !state.disabled &&\n !state.dragging &&\n !state.seeking &&\n percent === undefined\n );\n\n const fill = percent === undefined || state.dragging || state.disabled ? state : { ...state, fillPercent: percent };\n const cssVars = getTimeSliderCSSVars(this.#slider.adjustForAlignment(fill));\n const styles = Object.fromEntries(Object.entries(cssVars).filter(([name, value]) => this.#cssVars[name] !== value));\n\n applyStyles(this, styles);\n this.#cssVars = cssVars;\n\n const thumbAttrs = this.#core.getAttrs(state);\n\n // Domain-specific data attributes on root (includes data-seeking).\n applyStateDataAttrs(this, state, TimeSliderDataAttrs);\n\n // Provide context to child elements with base slider data attrs.\n this.#provider.setValue({\n state,\n stateAttrMap: TimeSliderDataAttrs,\n pointerValue: this.#core.rawValueFromPercent(state.pointerPercent),\n thumbAttrs: {\n ...thumbAttrs,\n 'aria-label': translateText(thumbAttrs['aria-label'], this.#i18n.value),\n 'aria-valuetext': translateText(\n thumbAttrs['aria-valuetext'],\n this.#i18n.value,\n this.#core.getValueTextParams(state)\n ),\n },\n thumbProps: this.#slider.thumbProps,\n formatValue: (value) => formatTime(value, state.duration, { locale: this.#i18n.locale }),\n });\n }\n}\n"],"mappings":"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"}
@@ -1,7 +1,7 @@
1
1
  //#region src/version.ts
2
2
  const readVersion = () => {
3
3
  try {
4
- return "10.0.0";
4
+ return "10.1.0";
5
5
  } catch {}
6
6
  return "UNKNOWN";
7
7
  };
package/docs/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @videojs/html documentation
2
2
 
3
- Bundled markdown documentation for `@videojs/html` v10.0.0.
3
+ Bundled markdown documentation for `@videojs/html` v10.1.0.
4
4
 
5
5
  Start at [`./llms.txt`](./llms.txt) — it's the structured index of every page in this directory.
6
6
 
@@ -70,7 +70,7 @@ Media components are the components that actually display your media. They’re
70
70
 
71
71
  Media components can be format specific (HLS, DASH), service specific (YouTube, Vimeo, Mux), or use case specific (background video).
72
72
 
73
- Media elements are discovered automatically. Plain `<video>` and `<audio>` elements are found via a `querySelector`. Custom media elements like `<hlsjs-video>` register themselves after you import their registration entry point.
73
+ Media components are discovered automatically. Plain `<video>` and `<audio>` elements are found via a `querySelector`. Media components like `<hlsjs-video>` register themselves after you import their registration entry point.
74
74
 
75
75
  ```html
76
76
  <video-player>
@@ -104,7 +104,7 @@ An extension can provide behavior that a UI component controls: `<google-cast>`
104
104
 
105
105
  The default presets are `@videojs/html/video` and `@videojs/html/audio`, covering the baseline set of controls you’d expect from the HTML `<video>` and `<audio>` tags.
106
106
 
107
- Beyond the defaults, presets target more specific use cases. The `/background` preset combines a media element with autoplay, mute, and loop built in, a skin with no controls, and only the features needed to power it.
107
+ Beyond the defaults, presets target more specific use cases. The `/background` preset combines a media component with autoplay, mute, and loop built in, a skin with no controls, and only the features needed to power it.
108
108
 
109
109
  You can use it from the `@videojs/html/background/*` registration entry points.
110
110
 
@@ -117,4 +117,4 @@ You can use it from the `@videojs/html/background/*` registration entry points.
117
117
  - [Installation](./installation.md): Install Video.js packages and build an accessible, customizable video player with composable controls
118
118
  - [Features](./features.md): The state and actions each feature adds to the player
119
119
  - [Skins](./skins.md): Packaged player designs that include both UI components and their styles.
120
- - [Presets](./presets.md): Pre-packaged player configurations that bundle state management, skins, and media elements for specific use cases.
120
+ - [Presets](./presets.md): Pre-packaged player configurations that bundle state management, skins, and media components for specific use cases.