@videojs/html 0.1.0-preview.9 → 10.0.0-alpha.4

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 (347) hide show
  1. package/README.md +4 -2
  2. package/dist/default/define/audio/player.js +15 -0
  3. package/dist/default/define/audio/player.js.map +1 -0
  4. package/dist/default/define/background/player.js +15 -0
  5. package/dist/default/define/background/player.js.map +1 -0
  6. package/dist/default/define/background/skin.css +27 -0
  7. package/dist/default/define/background/skin.js +34 -0
  8. package/dist/default/define/background/skin.js.map +1 -0
  9. package/dist/default/define/background/video.js +3 -0
  10. package/dist/default/define/feature/video.js +0 -0
  11. package/dist/default/define/media/background-video.js +13 -0
  12. package/dist/default/define/media/background-video.js.map +1 -0
  13. package/dist/default/define/media/hls-video.js +13 -0
  14. package/dist/default/define/media/hls-video.js.map +1 -0
  15. package/dist/default/define/ui/buffering-indicator.js +7 -0
  16. package/dist/default/define/ui/buffering-indicator.js.map +1 -0
  17. package/dist/default/define/ui/controls.js +9 -0
  18. package/dist/default/define/ui/controls.js.map +1 -0
  19. package/dist/default/define/ui/fullscreen-button.js +7 -0
  20. package/dist/default/define/ui/fullscreen-button.js.map +1 -0
  21. package/dist/default/define/ui/mute-button.js +7 -0
  22. package/dist/default/define/ui/mute-button.js.map +1 -0
  23. package/dist/default/define/ui/pip-button.js +7 -0
  24. package/dist/default/define/ui/pip-button.js.map +1 -0
  25. package/dist/default/define/ui/play-button.js +7 -0
  26. package/dist/default/define/ui/play-button.js.map +1 -0
  27. package/dist/default/define/ui/poster.js +7 -0
  28. package/dist/default/define/ui/poster.js.map +1 -0
  29. package/dist/default/define/ui/seek-button.js +7 -0
  30. package/dist/default/define/ui/seek-button.js.map +1 -0
  31. package/dist/default/define/ui/time.js +11 -0
  32. package/dist/default/define/ui/time.js.map +1 -0
  33. package/dist/default/define/video/player.js +15 -0
  34. package/dist/default/define/video/player.js.map +1 -0
  35. package/dist/default/define/video/skin.js +0 -0
  36. package/dist/default/index.js +24 -0
  37. package/dist/default/media/background-video/index.js +83 -0
  38. package/dist/default/media/background-video/index.js.map +1 -0
  39. package/dist/default/media/hls-video/index.js +21 -0
  40. package/dist/default/media/hls-video/index.js.map +1 -0
  41. package/dist/default/player/context.js +14 -0
  42. package/dist/default/player/context.js.map +1 -0
  43. package/dist/default/player/create-player.js +29 -0
  44. package/dist/default/player/create-player.js.map +1 -0
  45. package/dist/default/player/player-controller.js +63 -0
  46. package/dist/default/player/player-controller.js.map +1 -0
  47. package/dist/default/player/player-mixin.js +23 -0
  48. package/dist/default/player/player-mixin.js.map +1 -0
  49. package/dist/default/store/container-mixin.js +74 -0
  50. package/dist/default/store/container-mixin.js.map +1 -0
  51. package/dist/default/store/provider-mixin.js +39 -0
  52. package/dist/default/store/provider-mixin.js.map +1 -0
  53. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js +47 -0
  54. package/dist/default/ui/buffering-indicator/buffering-indicator-element.js.map +1 -0
  55. package/dist/default/ui/controls/controls-element.js +27 -0
  56. package/dist/default/ui/controls/controls-element.js.map +1 -0
  57. package/dist/default/ui/controls/controls-group-element.js +16 -0
  58. package/dist/default/ui/controls/controls-group-element.js.map +1 -0
  59. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js +56 -0
  60. package/dist/default/ui/fullscreen-button/fullscreen-button-element.js.map +1 -0
  61. package/dist/default/ui/media-element.js +8 -0
  62. package/dist/default/ui/media-element.js.map +1 -0
  63. package/dist/default/ui/mute-button/mute-button-element.js +56 -0
  64. package/dist/default/ui/mute-button/mute-button-element.js.map +1 -0
  65. package/dist/default/ui/pip-button/pip-button-element.js +56 -0
  66. package/dist/default/ui/pip-button/pip-button-element.js.map +1 -0
  67. package/dist/default/ui/play-button/play-button-element.js +56 -0
  68. package/dist/default/ui/play-button/play-button-element.js.map +1 -0
  69. package/dist/default/ui/poster/poster-element.js +27 -0
  70. package/dist/default/ui/poster/poster-element.js.map +1 -0
  71. package/dist/default/ui/seek-button/seek-button-element.js +58 -0
  72. package/dist/default/ui/seek-button/seek-button-element.js.map +1 -0
  73. package/dist/default/ui/time/time-element.js +67 -0
  74. package/dist/default/ui/time/time-element.js.map +1 -0
  75. package/dist/default/ui/time/time-group-element.js +12 -0
  76. package/dist/default/ui/time/time-group-element.js.map +1 -0
  77. package/dist/default/ui/time/time-separator-element.js +17 -0
  78. package/dist/default/ui/time/time-separator-element.js.map +1 -0
  79. package/dist/dev/define/audio/player.d.ts +17 -0
  80. package/dist/dev/define/audio/player.d.ts.map +1 -0
  81. package/dist/dev/define/audio/player.js +15 -0
  82. package/dist/dev/define/audio/player.js.map +1 -0
  83. package/dist/dev/define/audio/skin.js +0 -0
  84. package/dist/dev/define/background/player.d.ts +17 -0
  85. package/dist/dev/define/background/player.d.ts.map +1 -0
  86. package/dist/dev/define/background/player.js +15 -0
  87. package/dist/dev/define/background/player.js.map +1 -0
  88. package/dist/dev/define/background/skin.css +27 -0
  89. package/dist/dev/define/background/skin.d.ts +20 -0
  90. package/dist/dev/define/background/skin.d.ts.map +1 -0
  91. package/dist/dev/define/background/skin.js +34 -0
  92. package/dist/dev/define/background/skin.js.map +1 -0
  93. package/dist/dev/define/background/video.d.ts +2 -0
  94. package/dist/dev/define/background/video.js +3 -0
  95. package/dist/dev/define/feature/video.js +0 -0
  96. package/dist/dev/define/media/background-video.d.ts +14 -0
  97. package/dist/dev/define/media/background-video.d.ts.map +1 -0
  98. package/dist/dev/define/media/background-video.js +13 -0
  99. package/dist/dev/define/media/background-video.js.map +1 -0
  100. package/dist/dev/define/media/hls-video.d.ts +14 -0
  101. package/dist/dev/define/media/hls-video.d.ts.map +1 -0
  102. package/dist/dev/define/media/hls-video.js +13 -0
  103. package/dist/dev/define/media/hls-video.js.map +1 -0
  104. package/dist/dev/define/ui/buffering-indicator.d.ts +9 -0
  105. package/dist/dev/define/ui/buffering-indicator.d.ts.map +1 -0
  106. package/dist/dev/define/ui/buffering-indicator.js +7 -0
  107. package/dist/dev/define/ui/buffering-indicator.js.map +1 -0
  108. package/dist/dev/define/ui/controls.d.ts +11 -0
  109. package/dist/dev/define/ui/controls.d.ts.map +1 -0
  110. package/dist/dev/define/ui/controls.js +9 -0
  111. package/dist/dev/define/ui/controls.js.map +1 -0
  112. package/dist/dev/define/ui/fullscreen-button.d.ts +9 -0
  113. package/dist/dev/define/ui/fullscreen-button.d.ts.map +1 -0
  114. package/dist/dev/define/ui/fullscreen-button.js +7 -0
  115. package/dist/dev/define/ui/fullscreen-button.js.map +1 -0
  116. package/dist/dev/define/ui/mute-button.d.ts +9 -0
  117. package/dist/dev/define/ui/mute-button.d.ts.map +1 -0
  118. package/dist/dev/define/ui/mute-button.js +7 -0
  119. package/dist/dev/define/ui/mute-button.js.map +1 -0
  120. package/dist/dev/define/ui/pip-button.d.ts +9 -0
  121. package/dist/dev/define/ui/pip-button.d.ts.map +1 -0
  122. package/dist/dev/define/ui/pip-button.js +7 -0
  123. package/dist/dev/define/ui/pip-button.js.map +1 -0
  124. package/dist/dev/define/ui/play-button.d.ts +9 -0
  125. package/dist/dev/define/ui/play-button.d.ts.map +1 -0
  126. package/dist/dev/define/ui/play-button.js +7 -0
  127. package/dist/dev/define/ui/play-button.js.map +1 -0
  128. package/dist/dev/define/ui/poster.d.ts +9 -0
  129. package/dist/dev/define/ui/poster.d.ts.map +1 -0
  130. package/dist/dev/define/ui/poster.js +7 -0
  131. package/dist/dev/define/ui/poster.js.map +1 -0
  132. package/dist/dev/define/ui/seek-button.d.ts +9 -0
  133. package/dist/dev/define/ui/seek-button.d.ts.map +1 -0
  134. package/dist/dev/define/ui/seek-button.js +7 -0
  135. package/dist/dev/define/ui/seek-button.js.map +1 -0
  136. package/dist/dev/define/ui/time.d.ts +13 -0
  137. package/dist/dev/define/ui/time.d.ts.map +1 -0
  138. package/dist/dev/define/ui/time.js +11 -0
  139. package/dist/dev/define/ui/time.js.map +1 -0
  140. package/dist/dev/define/video/player.d.ts +17 -0
  141. package/dist/dev/define/video/player.d.ts.map +1 -0
  142. package/dist/dev/define/video/player.js +15 -0
  143. package/dist/dev/define/video/player.js.map +1 -0
  144. package/dist/dev/define/video/skin.js +0 -0
  145. package/dist/dev/index.d.ts +23 -0
  146. package/dist/dev/index.js +24 -0
  147. package/dist/dev/media/background-video/index.d.ts +15 -0
  148. package/dist/dev/media/background-video/index.d.ts.map +1 -0
  149. package/dist/dev/media/background-video/index.js +83 -0
  150. package/dist/dev/media/background-video/index.js.map +1 -0
  151. package/dist/dev/media/hls-video/index.d.ts +11 -0
  152. package/dist/dev/media/hls-video/index.d.ts.map +1 -0
  153. package/dist/dev/media/hls-video/index.js +21 -0
  154. package/dist/dev/media/hls-video/index.js.map +1 -0
  155. package/dist/dev/player/context.d.ts +16 -0
  156. package/dist/dev/player/context.d.ts.map +1 -0
  157. package/dist/dev/player/context.js +14 -0
  158. package/dist/dev/player/context.js.map +1 -0
  159. package/dist/dev/player/create-player.d.ts +73 -0
  160. package/dist/dev/player/create-player.d.ts.map +1 -0
  161. package/dist/dev/player/create-player.js +29 -0
  162. package/dist/dev/player/create-player.js.map +1 -0
  163. package/dist/dev/player/player-controller.d.ts +56 -0
  164. package/dist/dev/player/player-controller.d.ts.map +1 -0
  165. package/dist/dev/player/player-controller.js +63 -0
  166. package/dist/dev/player/player-controller.js.map +1 -0
  167. package/dist/dev/player/player-mixin.d.ts +20 -0
  168. package/dist/dev/player/player-mixin.d.ts.map +1 -0
  169. package/dist/dev/player/player-mixin.js +23 -0
  170. package/dist/dev/player/player-mixin.js.map +1 -0
  171. package/dist/dev/store/container-mixin.d.ts +16 -0
  172. package/dist/dev/store/container-mixin.d.ts.map +1 -0
  173. package/dist/dev/store/container-mixin.js +74 -0
  174. package/dist/dev/store/container-mixin.js.map +1 -0
  175. package/dist/dev/store/provider-mixin.d.ts +17 -0
  176. package/dist/dev/store/provider-mixin.d.ts.map +1 -0
  177. package/dist/dev/store/provider-mixin.js +39 -0
  178. package/dist/dev/store/provider-mixin.js.map +1 -0
  179. package/dist/dev/store/types.d.ts +18 -0
  180. package/dist/dev/store/types.d.ts.map +1 -0
  181. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.d.ts +21 -0
  182. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.d.ts.map +1 -0
  183. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js +48 -0
  184. package/dist/dev/ui/buffering-indicator/buffering-indicator-element.js.map +1 -0
  185. package/dist/dev/ui/controls/controls-element.d.ts +13 -0
  186. package/dist/dev/ui/controls/controls-element.d.ts.map +1 -0
  187. package/dist/dev/ui/controls/controls-element.js +28 -0
  188. package/dist/dev/ui/controls/controls-element.js.map +1 -0
  189. package/dist/dev/ui/controls/controls-group-element.d.ts +10 -0
  190. package/dist/dev/ui/controls/controls-group-element.d.ts.map +1 -0
  191. package/dist/dev/ui/controls/controls-group-element.js +16 -0
  192. package/dist/dev/ui/controls/controls-group-element.js.map +1 -0
  193. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts +26 -0
  194. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.d.ts.map +1 -0
  195. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js +57 -0
  196. package/dist/dev/ui/fullscreen-button/fullscreen-button-element.js.map +1 -0
  197. package/dist/dev/ui/media-element.d.ts +9 -0
  198. package/dist/dev/ui/media-element.d.ts.map +1 -0
  199. package/dist/dev/ui/media-element.js +8 -0
  200. package/dist/dev/ui/media-element.js.map +1 -0
  201. package/dist/dev/ui/mute-button/mute-button-element.d.ts +26 -0
  202. package/dist/dev/ui/mute-button/mute-button-element.d.ts.map +1 -0
  203. package/dist/dev/ui/mute-button/mute-button-element.js +57 -0
  204. package/dist/dev/ui/mute-button/mute-button-element.js.map +1 -0
  205. package/dist/dev/ui/pip-button/pip-button-element.d.ts +26 -0
  206. package/dist/dev/ui/pip-button/pip-button-element.d.ts.map +1 -0
  207. package/dist/dev/ui/pip-button/pip-button-element.js +57 -0
  208. package/dist/dev/ui/pip-button/pip-button-element.js.map +1 -0
  209. package/dist/dev/ui/play-button/play-button-element.d.ts +26 -0
  210. package/dist/dev/ui/play-button/play-button-element.d.ts.map +1 -0
  211. package/dist/dev/ui/play-button/play-button-element.js +57 -0
  212. package/dist/dev/ui/play-button/play-button-element.js.map +1 -0
  213. package/dist/dev/ui/poster/poster-element.d.ts +13 -0
  214. package/dist/dev/ui/poster/poster-element.d.ts.map +1 -0
  215. package/dist/dev/ui/poster/poster-element.js +28 -0
  216. package/dist/dev/ui/poster/poster-element.js.map +1 -0
  217. package/dist/dev/ui/seek-button/seek-button-element.d.ts +30 -0
  218. package/dist/dev/ui/seek-button/seek-button-element.d.ts.map +1 -0
  219. package/dist/dev/ui/seek-button/seek-button-element.js +59 -0
  220. package/dist/dev/ui/seek-button/seek-button-element.js.map +1 -0
  221. package/dist/dev/ui/time/time-element.d.ts +32 -0
  222. package/dist/dev/ui/time/time-element.d.ts.map +1 -0
  223. package/dist/dev/ui/time/time-element.js +68 -0
  224. package/dist/dev/ui/time/time-element.js.map +1 -0
  225. package/dist/dev/ui/time/time-group-element.d.ts +9 -0
  226. package/dist/dev/ui/time/time-group-element.d.ts.map +1 -0
  227. package/dist/dev/ui/time/time-group-element.js +12 -0
  228. package/dist/dev/ui/time/time-group-element.js.map +1 -0
  229. package/dist/dev/ui/time/time-separator-element.d.ts +10 -0
  230. package/dist/dev/ui/time/time-separator-element.d.ts.map +1 -0
  231. package/dist/dev/ui/time/time-separator-element.js +17 -0
  232. package/dist/dev/ui/time/time-separator-element.js.map +1 -0
  233. package/package.json +54 -41
  234. package/dist/button-Bu1mGG-F.js +0 -63
  235. package/dist/button-Bu1mGG-F.js.map +0 -1
  236. package/dist/component-factory-C0cl1nrL.js +0 -73
  237. package/dist/component-factory-C0cl1nrL.js.map +0 -1
  238. package/dist/current-time-display-DpoDrQu9.js +0 -46
  239. package/dist/current-time-display-DpoDrQu9.js.map +0 -1
  240. package/dist/custom-element-3bDlB2XO.js +0 -10
  241. package/dist/custom-element-3bDlB2XO.js.map +0 -1
  242. package/dist/define/index.d.ts +0 -12
  243. package/dist/define/index.js +0 -27
  244. package/dist/define/media-container.d.ts +0 -1
  245. package/dist/define/media-container.js +0 -3
  246. package/dist/define/media-current-time-display.d.ts +0 -1
  247. package/dist/define/media-current-time-display.js +0 -4
  248. package/dist/define/media-duration-display.d.ts +0 -1
  249. package/dist/define/media-duration-display.js +0 -4
  250. package/dist/define/media-fullscreen-button.d.ts +0 -1
  251. package/dist/define/media-fullscreen-button.js +0 -5
  252. package/dist/define/media-mute-button.d.ts +0 -1
  253. package/dist/define/media-mute-button.js +0 -5
  254. package/dist/define/media-play-button.d.ts +0 -1
  255. package/dist/define/media-play-button.js +0 -5
  256. package/dist/define/media-popover.d.ts +0 -1
  257. package/dist/define/media-popover.js +0 -3
  258. package/dist/define/media-preview-time-display.d.ts +0 -1
  259. package/dist/define/media-preview-time-display.js +0 -4
  260. package/dist/define/media-time-slider.d.ts +0 -1
  261. package/dist/define/media-time-slider.js +0 -4
  262. package/dist/define/media-tooltip.d.ts +0 -1
  263. package/dist/define/media-tooltip.js +0 -3
  264. package/dist/define/media-volume-slider.d.ts +0 -1
  265. package/dist/define/media-volume-slider.js +0 -4
  266. package/dist/define/video-provider.d.ts +0 -1
  267. package/dist/define/video-provider.js +0 -3
  268. package/dist/duration-display-BFRQmaOz.js +0 -48
  269. package/dist/duration-display-BFRQmaOz.js.map +0 -1
  270. package/dist/fullscreen-button-B0R9K3GV.js +0 -47
  271. package/dist/fullscreen-button-B0R9K3GV.js.map +0 -1
  272. package/dist/icons-CuxuONCk.js +0 -209
  273. package/dist/icons-CuxuONCk.js.map +0 -1
  274. package/dist/icons.d.ts +0 -1
  275. package/dist/icons.js +0 -2
  276. package/dist/index.d.ts +0 -146
  277. package/dist/index.d.ts.map +0 -1
  278. package/dist/index.js +0 -17
  279. package/dist/media-container-BOL0PKuG.js +0 -80
  280. package/dist/media-container-BOL0PKuG.js.map +0 -1
  281. package/dist/media-container-DwKSOa1h.js +0 -8
  282. package/dist/media-container-DwKSOa1h.js.map +0 -1
  283. package/dist/media-current-time-display-DVCqNt7c.js +0 -8
  284. package/dist/media-current-time-display-DVCqNt7c.js.map +0 -1
  285. package/dist/media-duration-display-qvm6YX-q.d.ts +0 -1
  286. package/dist/media-duration-display-tzVLafRm.js +0 -8
  287. package/dist/media-duration-display-tzVLafRm.js.map +0 -1
  288. package/dist/media-fullscreen-button-BgUK3lgu.d.ts +0 -1
  289. package/dist/media-fullscreen-button-DDQ6EdLz.js +0 -8
  290. package/dist/media-fullscreen-button-DDQ6EdLz.js.map +0 -1
  291. package/dist/media-mute-button-NVJF2EEW.d.ts +0 -1
  292. package/dist/media-mute-button-Uy18NpPx.js +0 -8
  293. package/dist/media-mute-button-Uy18NpPx.js.map +0 -1
  294. package/dist/media-play-button-CDBZrhmx.js +0 -8
  295. package/dist/media-play-button-CDBZrhmx.js.map +0 -1
  296. package/dist/media-play-button-oq8yDlxe.d.ts +0 -1
  297. package/dist/media-popover-BtJmPv0E.d.ts +0 -1
  298. package/dist/media-popover-Cw9d_Bh3.js +0 -8
  299. package/dist/media-popover-Cw9d_Bh3.js.map +0 -1
  300. package/dist/media-preview-time-display-4YX5Rics.d.ts +0 -1
  301. package/dist/media-preview-time-display-ufqXiNXg.js +0 -8
  302. package/dist/media-preview-time-display-ufqXiNXg.js.map +0 -1
  303. package/dist/media-skin-CxnuHwhu.js +0 -36
  304. package/dist/media-skin-CxnuHwhu.js.map +0 -1
  305. package/dist/media-skin-Di3vSHvS.d.ts +0 -11
  306. package/dist/media-skin-Di3vSHvS.d.ts.map +0 -1
  307. package/dist/media-time-slider-BOdJr4QE.js +0 -12
  308. package/dist/media-time-slider-BOdJr4QE.js.map +0 -1
  309. package/dist/media-time-slider-DvMnfYXZ.d.ts +0 -1
  310. package/dist/media-tooltip-BqV17mdM.d.ts +0 -1
  311. package/dist/media-tooltip-CMRN_X4D.js +0 -8
  312. package/dist/media-tooltip-CMRN_X4D.js.map +0 -1
  313. package/dist/media-volume-slider-BB6GhrzS.js +0 -11
  314. package/dist/media-volume-slider-BB6GhrzS.js.map +0 -1
  315. package/dist/media-volume-slider-DP47VLVi.d.ts +0 -1
  316. package/dist/mute-button-C7XQB6iK.js +0 -49
  317. package/dist/mute-button-C7XQB6iK.js.map +0 -1
  318. package/dist/play-button-DFbxwrrq.js +0 -47
  319. package/dist/play-button-DFbxwrrq.js.map +0 -1
  320. package/dist/popover-BUCVOjnO.js +0 -167
  321. package/dist/popover-BUCVOjnO.js.map +0 -1
  322. package/dist/preview-time-display-CtA58pCS.js +0 -43
  323. package/dist/preview-time-display-CtA58pCS.js.map +0 -1
  324. package/dist/skins/frosted.d.ts +0 -23
  325. package/dist/skins/frosted.d.ts.map +0 -1
  326. package/dist/skins/frosted.js +0 -145
  327. package/dist/skins/frosted.js.map +0 -1
  328. package/dist/skins/minimal.d.ts +0 -23
  329. package/dist/skins/minimal.d.ts.map +0 -1
  330. package/dist/skins/minimal.js +0 -150
  331. package/dist/skins/minimal.js.map +0 -1
  332. package/dist/store.d.ts +0 -1
  333. package/dist/time-slider-DHpKPCI1.js +0 -165
  334. package/dist/time-slider-DHpKPCI1.js.map +0 -1
  335. package/dist/tooltip-B-glki2f.js +0 -171
  336. package/dist/tooltip-B-glki2f.js.map +0 -1
  337. package/dist/video-provider-BKDqoKFf.js +0 -17
  338. package/dist/video-provider-BKDqoKFf.js.map +0 -1
  339. package/dist/video-provider-BPPI5e47.js +0 -8
  340. package/dist/video-provider-BPPI5e47.js.map +0 -1
  341. package/dist/video-provider-nSCfwA7l.d.ts +0 -1
  342. package/dist/volume-slider-CUyfwehe.js +0 -140
  343. package/dist/volume-slider-CUyfwehe.js.map +0 -1
  344. /package/dist/{store.js → default/define/audio/skin.js} +0 -0
  345. /package/dist/{index-LKrIp3Oo.d.ts → dev/define/audio/skin.d.ts} +0 -0
  346. /package/dist/{media-container-ChS9lZvf.d.ts → dev/define/feature/video.d.ts} +0 -0
  347. /package/dist/{media-current-time-display-Cd0rPAuj.d.ts → dev/define/video/skin.d.ts} +0 -0
package/README.md CHANGED
@@ -2,11 +2,13 @@
2
2
 
3
3
  [![package-badge]][package]
4
4
 
5
- > **⚠️ Technical Preview - SUBJECT TO CHANGE** Not recommended for production use.
5
+ > **⚠️ Alpha - SUBJECT TO CHANGE** Not recommended for production use.
6
6
 
7
7
  ## Overview
8
8
 
9
- `@videojs/html` is a comprehensive library for building media players with vanilla JavaScript and Web Components. It provides a complete set of UI components, state management, and utilities for creating feature-rich, accessible video and audio players.
9
+ `@videojs/html` is a comprehensive library for building media players with vanilla JavaScript and
10
+ Web Components. It provides a complete set of Custom Elements, state management, controllers,
11
+ and utilities for creating feature-rich, accessible video and audio players.
10
12
 
11
13
  ## Community
12
14
 
@@ -0,0 +1,15 @@
1
+ import { createPlayer } from "../../player/create-player.js";
2
+ import { features } from "@videojs/core/dom";
3
+
4
+ //#region src/define/audio/player.ts
5
+ const { PlayerElement } = createPlayer({ features: features.audio });
6
+ var AudioPlayerElement = class extends PlayerElement {
7
+ static {
8
+ this.tagName = "audio-player";
9
+ }
10
+ };
11
+ customElements.define(AudioPlayerElement.tagName, AudioPlayerElement);
12
+
13
+ //#endregion
14
+ export { AudioPlayerElement };
15
+ //# sourceMappingURL=player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player.js","names":[],"sources":["../../../../src/define/audio/player.ts"],"sourcesContent":["import { features } from '@videojs/core/dom';\nimport { createPlayer } from '../../player/create-player';\n\nconst { PlayerElement } = createPlayer({\n features: features.audio,\n});\n\nexport class AudioPlayerElement extends PlayerElement {\n static readonly tagName = 'audio-player';\n}\n\ncustomElements.define(AudioPlayerElement.tagName, AudioPlayerElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [AudioPlayerElement.tagName]: AudioPlayerElement;\n }\n}\n"],"mappings":";;;;AAGA,MAAM,EAAE,kBAAkB,aAAa,EACrC,UAAU,SAAS,OACpB,CAAC;AAEF,IAAa,qBAAb,cAAwC,cAAc;;iBAC1B;;;AAG5B,eAAe,OAAO,mBAAmB,SAAS,mBAAmB"}
@@ -0,0 +1,15 @@
1
+ import { createPlayer } from "../../player/create-player.js";
2
+ import { features } from "@videojs/core/dom";
3
+
4
+ //#region src/define/background/player.ts
5
+ const { PlayerElement } = createPlayer({ features: features.background });
6
+ var BackgroundVideoPlayerElement = class extends PlayerElement {
7
+ static {
8
+ this.tagName = "background-video-player";
9
+ }
10
+ };
11
+ customElements.define(BackgroundVideoPlayerElement.tagName, BackgroundVideoPlayerElement);
12
+
13
+ //#endregion
14
+ export { BackgroundVideoPlayerElement };
15
+ //# sourceMappingURL=player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player.js","names":[],"sources":["../../../../src/define/background/player.ts"],"sourcesContent":["import { features } from '@videojs/core/dom';\nimport { createPlayer } from '../../player/create-player';\n\nconst { PlayerElement } = createPlayer({\n features: features.background,\n});\n\nexport class BackgroundVideoPlayerElement extends PlayerElement {\n static readonly tagName = 'background-video-player';\n}\n\ncustomElements.define(BackgroundVideoPlayerElement.tagName, BackgroundVideoPlayerElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [BackgroundVideoPlayerElement.tagName]: BackgroundVideoPlayerElement;\n }\n}\n"],"mappings":";;;;AAGA,MAAM,EAAE,kBAAkB,aAAa,EACrC,UAAU,SAAS,YACpB,CAAC;AAEF,IAAa,+BAAb,cAAkD,cAAc;;iBACpC;;;AAG5B,eAAe,OAAO,6BAA6B,SAAS,6BAA6B"}
@@ -0,0 +1,27 @@
1
+ background-video-player {
2
+ display: contents;
3
+ }
4
+
5
+ background-video-skin {
6
+ display: block;
7
+ position: relative;
8
+ width: 100%;
9
+ height: 100%;
10
+ --media-object-fit: cover;
11
+ object-fit: var(--media-object-fit);
12
+ }
13
+
14
+ background-video-skin > [slot="media"] {
15
+ position: absolute;
16
+ inset: 0;
17
+ width: 100%;
18
+ height: 100%;
19
+ object-fit: inherit;
20
+ }
21
+
22
+ background-video-skin > img,
23
+ background-video-skin > picture {
24
+ width: 100%;
25
+ height: 100%;
26
+ object-fit: inherit;
27
+ }
@@ -0,0 +1,34 @@
1
+ import { ReactiveElement } from "@videojs/element";
2
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
3
+
4
+ //#region src/define/background/skin.ts
5
+ function getTemplateHTML(_attrs) {
6
+ return `
7
+ <media-container>
8
+ <slot name="media" slot="media"></slot>
9
+ </media-container>
10
+ `;
11
+ }
12
+ var BackgroundVideoSkinElement = class extends ReactiveElement {
13
+ static {
14
+ this.tagName = "background-video-skin";
15
+ }
16
+ static {
17
+ this.shadowRootOptions = { mode: "open" };
18
+ }
19
+ static {
20
+ this.getTemplateHTML = getTemplateHTML;
21
+ }
22
+ constructor() {
23
+ super();
24
+ if (!this.shadowRoot) {
25
+ this.attachShadow(this.constructor.shadowRootOptions);
26
+ this.shadowRoot.innerHTML = getTemplateHTML(namedNodeMapToObject(this.attributes));
27
+ }
28
+ }
29
+ };
30
+ customElements.define(BackgroundVideoSkinElement.tagName, BackgroundVideoSkinElement);
31
+
32
+ //#endregion
33
+ export { BackgroundVideoSkinElement };
34
+ //# sourceMappingURL=skin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skin.js","names":[],"sources":["../../../../src/define/background/skin.ts"],"sourcesContent":["import { ReactiveElement } from '@videojs/element';\nimport { namedNodeMapToObject } from '@videojs/utils/dom';\n\nfunction getTemplateHTML(_attrs: Record<string, string>) {\n return /*html*/ `\n <media-container>\n <slot name=\"media\" slot=\"media\"></slot>\n </media-container>\n `;\n}\n\nexport class BackgroundVideoSkinElement extends ReactiveElement {\n static readonly tagName = 'background-video-skin';\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideoSkinElement).shadowRootOptions);\n this.shadowRoot!.innerHTML = getTemplateHTML(namedNodeMapToObject(this.attributes));\n }\n }\n}\n\ncustomElements.define(BackgroundVideoSkinElement.tagName, BackgroundVideoSkinElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [BackgroundVideoSkinElement.tagName]: BackgroundVideoSkinElement;\n }\n}\n"],"mappings":";;;;AAGA,SAAS,gBAAgB,QAAgC;AACvD,QAAgB;;;;;;AAOlB,IAAa,6BAAb,cAAgD,gBAAgB;;iBACpC;;;2BACC,EAAE,MAAM,QAA0B;;;yBACpC;;CAEzB,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAkD,kBAAkB;AAC5F,QAAK,WAAY,YAAY,gBAAgB,qBAAqB,KAAK,WAAW,CAAC;;;;AAKzF,eAAe,OAAO,2BAA2B,SAAS,2BAA2B"}
@@ -0,0 +1,3 @@
1
+ import { BackgroundVideoElement } from "../media/background-video.js";
2
+
3
+ export { BackgroundVideoElement };
File without changes
@@ -0,0 +1,13 @@
1
+ import { BackgroundVideo } from "../../media/background-video/index.js";
2
+
3
+ //#region src/define/media/background-video.ts
4
+ var BackgroundVideoElement = class extends BackgroundVideo {
5
+ static {
6
+ this.tagName = "background-video";
7
+ }
8
+ };
9
+ customElements.define(BackgroundVideoElement.tagName, BackgroundVideoElement);
10
+
11
+ //#endregion
12
+ export { BackgroundVideoElement };
13
+ //# sourceMappingURL=background-video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"background-video.js","names":[],"sources":["../../../../src/define/media/background-video.ts"],"sourcesContent":["import { BackgroundVideo } from '../../media/background-video';\n\nexport class BackgroundVideoElement extends BackgroundVideo {\n static readonly tagName = 'background-video';\n}\n\ncustomElements.define(BackgroundVideoElement.tagName, BackgroundVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [BackgroundVideoElement.tagName]: BackgroundVideoElement;\n }\n}\n"],"mappings":";;;AAEA,IAAa,yBAAb,cAA4C,gBAAgB;;iBAChC;;;AAG5B,eAAe,OAAO,uBAAuB,SAAS,uBAAuB"}
@@ -0,0 +1,13 @@
1
+ import { HlsVideo } from "../../media/hls-video/index.js";
2
+
3
+ //#region src/define/media/hls-video.ts
4
+ var HlsVideoElement = class extends HlsVideo {
5
+ static {
6
+ this.tagName = "hls-video";
7
+ }
8
+ };
9
+ customElements.define(HlsVideoElement.tagName, HlsVideoElement);
10
+
11
+ //#endregion
12
+ export { HlsVideoElement };
13
+ //# sourceMappingURL=hls-video.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hls-video.js","names":[],"sources":["../../../../src/define/media/hls-video.ts"],"sourcesContent":["import { HlsVideo } from '../../media/hls-video';\n\nexport class HlsVideoElement extends HlsVideo {\n static readonly tagName = 'hls-video';\n}\n\ncustomElements.define(HlsVideoElement.tagName, HlsVideoElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [HlsVideoElement.tagName]: HlsVideoElement;\n }\n}\n"],"mappings":";;;AAEA,IAAa,kBAAb,cAAqC,SAAS;;iBAClB;;;AAG5B,eAAe,OAAO,gBAAgB,SAAS,gBAAgB"}
@@ -0,0 +1,7 @@
1
+ import { BufferingIndicatorElement } from "../../ui/buffering-indicator/buffering-indicator-element.js";
2
+
3
+ //#region src/define/ui/buffering-indicator.ts
4
+ customElements.define(BufferingIndicatorElement.tagName, BufferingIndicatorElement);
5
+
6
+ //#endregion
7
+ //# sourceMappingURL=buffering-indicator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"buffering-indicator.js","names":[],"sources":["../../../../src/define/ui/buffering-indicator.ts"],"sourcesContent":["import { BufferingIndicatorElement } from '../../ui/buffering-indicator/buffering-indicator-element';\n\ncustomElements.define(BufferingIndicatorElement.tagName, BufferingIndicatorElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [BufferingIndicatorElement.tagName]: BufferingIndicatorElement;\n }\n}\n"],"mappings":";;;AAEA,eAAe,OAAO,0BAA0B,SAAS,0BAA0B"}
@@ -0,0 +1,9 @@
1
+ import { ControlsElement } from "../../ui/controls/controls-element.js";
2
+ import { ControlsGroupElement } from "../../ui/controls/controls-group-element.js";
3
+
4
+ //#region src/define/ui/controls.ts
5
+ customElements.define(ControlsElement.tagName, ControlsElement);
6
+ customElements.define(ControlsGroupElement.tagName, ControlsGroupElement);
7
+
8
+ //#endregion
9
+ //# sourceMappingURL=controls.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"controls.js","names":[],"sources":["../../../../src/define/ui/controls.ts"],"sourcesContent":["import { ControlsElement } from '../../ui/controls/controls-element';\nimport { ControlsGroupElement } from '../../ui/controls/controls-group-element';\n\ncustomElements.define(ControlsElement.tagName, ControlsElement);\ncustomElements.define(ControlsGroupElement.tagName, ControlsGroupElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [ControlsElement.tagName]: ControlsElement;\n [ControlsGroupElement.tagName]: ControlsGroupElement;\n }\n}\n"],"mappings":";;;;AAGA,eAAe,OAAO,gBAAgB,SAAS,gBAAgB;AAC/D,eAAe,OAAO,qBAAqB,SAAS,qBAAqB"}
@@ -0,0 +1,7 @@
1
+ import { FullscreenButtonElement } from "../../ui/fullscreen-button/fullscreen-button-element.js";
2
+
3
+ //#region src/define/ui/fullscreen-button.ts
4
+ customElements.define(FullscreenButtonElement.tagName, FullscreenButtonElement);
5
+
6
+ //#endregion
7
+ //# sourceMappingURL=fullscreen-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fullscreen-button.js","names":[],"sources":["../../../../src/define/ui/fullscreen-button.ts"],"sourcesContent":["import { FullscreenButtonElement } from '../../ui/fullscreen-button/fullscreen-button-element';\n\ncustomElements.define(FullscreenButtonElement.tagName, FullscreenButtonElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [FullscreenButtonElement.tagName]: FullscreenButtonElement;\n }\n}\n"],"mappings":";;;AAEA,eAAe,OAAO,wBAAwB,SAAS,wBAAwB"}
@@ -0,0 +1,7 @@
1
+ import { MuteButtonElement } from "../../ui/mute-button/mute-button-element.js";
2
+
3
+ //#region src/define/ui/mute-button.ts
4
+ customElements.define(MuteButtonElement.tagName, MuteButtonElement);
5
+
6
+ //#endregion
7
+ //# sourceMappingURL=mute-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mute-button.js","names":[],"sources":["../../../../src/define/ui/mute-button.ts"],"sourcesContent":["import { MuteButtonElement } from '../../ui/mute-button/mute-button-element';\n\ncustomElements.define(MuteButtonElement.tagName, MuteButtonElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [MuteButtonElement.tagName]: MuteButtonElement;\n }\n}\n"],"mappings":";;;AAEA,eAAe,OAAO,kBAAkB,SAAS,kBAAkB"}
@@ -0,0 +1,7 @@
1
+ import { PiPButtonElement } from "../../ui/pip-button/pip-button-element.js";
2
+
3
+ //#region src/define/ui/pip-button.ts
4
+ customElements.define(PiPButtonElement.tagName, PiPButtonElement);
5
+
6
+ //#endregion
7
+ //# sourceMappingURL=pip-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pip-button.js","names":[],"sources":["../../../../src/define/ui/pip-button.ts"],"sourcesContent":["import { PiPButtonElement } from '../../ui/pip-button/pip-button-element';\n\ncustomElements.define(PiPButtonElement.tagName, PiPButtonElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [PiPButtonElement.tagName]: PiPButtonElement;\n }\n}\n"],"mappings":";;;AAEA,eAAe,OAAO,iBAAiB,SAAS,iBAAiB"}
@@ -0,0 +1,7 @@
1
+ import { PlayButtonElement } from "../../ui/play-button/play-button-element.js";
2
+
3
+ //#region src/define/ui/play-button.ts
4
+ customElements.define(PlayButtonElement.tagName, PlayButtonElement);
5
+
6
+ //#endregion
7
+ //# sourceMappingURL=play-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"play-button.js","names":[],"sources":["../../../../src/define/ui/play-button.ts"],"sourcesContent":["import { PlayButtonElement } from '../../ui/play-button/play-button-element';\n\ncustomElements.define(PlayButtonElement.tagName, PlayButtonElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [PlayButtonElement.tagName]: PlayButtonElement;\n }\n}\n"],"mappings":";;;AAEA,eAAe,OAAO,kBAAkB,SAAS,kBAAkB"}
@@ -0,0 +1,7 @@
1
+ import { PosterElement } from "../../ui/poster/poster-element.js";
2
+
3
+ //#region src/define/ui/poster.ts
4
+ customElements.define(PosterElement.tagName, PosterElement);
5
+
6
+ //#endregion
7
+ //# sourceMappingURL=poster.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"poster.js","names":[],"sources":["../../../../src/define/ui/poster.ts"],"sourcesContent":["import { PosterElement } from '../../ui/poster/poster-element';\n\ncustomElements.define(PosterElement.tagName, PosterElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [PosterElement.tagName]: PosterElement;\n }\n}\n"],"mappings":";;;AAEA,eAAe,OAAO,cAAc,SAAS,cAAc"}
@@ -0,0 +1,7 @@
1
+ import { SeekButtonElement } from "../../ui/seek-button/seek-button-element.js";
2
+
3
+ //#region src/define/ui/seek-button.ts
4
+ customElements.define(SeekButtonElement.tagName, SeekButtonElement);
5
+
6
+ //#endregion
7
+ //# sourceMappingURL=seek-button.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"seek-button.js","names":[],"sources":["../../../../src/define/ui/seek-button.ts"],"sourcesContent":["import { SeekButtonElement } from '../../ui/seek-button/seek-button-element';\n\ncustomElements.define(SeekButtonElement.tagName, SeekButtonElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [SeekButtonElement.tagName]: SeekButtonElement;\n }\n}\n"],"mappings":";;;AAEA,eAAe,OAAO,kBAAkB,SAAS,kBAAkB"}
@@ -0,0 +1,11 @@
1
+ import { TimeElement } from "../../ui/time/time-element.js";
2
+ import { TimeGroupElement } from "../../ui/time/time-group-element.js";
3
+ import { TimeSeparatorElement } from "../../ui/time/time-separator-element.js";
4
+
5
+ //#region src/define/ui/time.ts
6
+ customElements.define(TimeElement.tagName, TimeElement);
7
+ customElements.define(TimeGroupElement.tagName, TimeGroupElement);
8
+ customElements.define(TimeSeparatorElement.tagName, TimeSeparatorElement);
9
+
10
+ //#endregion
11
+ //# sourceMappingURL=time.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"time.js","names":[],"sources":["../../../../src/define/ui/time.ts"],"sourcesContent":["import { TimeElement } from '../../ui/time/time-element';\nimport { TimeGroupElement } from '../../ui/time/time-group-element';\nimport { TimeSeparatorElement } from '../../ui/time/time-separator-element';\n\ncustomElements.define(TimeElement.tagName, TimeElement);\ncustomElements.define(TimeGroupElement.tagName, TimeGroupElement);\ncustomElements.define(TimeSeparatorElement.tagName, TimeSeparatorElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [TimeElement.tagName]: TimeElement;\n [TimeGroupElement.tagName]: TimeGroupElement;\n [TimeSeparatorElement.tagName]: TimeSeparatorElement;\n }\n}\n"],"mappings":";;;;;AAIA,eAAe,OAAO,YAAY,SAAS,YAAY;AACvD,eAAe,OAAO,iBAAiB,SAAS,iBAAiB;AACjE,eAAe,OAAO,qBAAqB,SAAS,qBAAqB"}
@@ -0,0 +1,15 @@
1
+ import { createPlayer } from "../../player/create-player.js";
2
+ import { features } from "@videojs/core/dom";
3
+
4
+ //#region src/define/video/player.ts
5
+ const { PlayerElement } = createPlayer({ features: features.video });
6
+ var VideoPlayerElement = class extends PlayerElement {
7
+ static {
8
+ this.tagName = "video-player";
9
+ }
10
+ };
11
+ customElements.define(VideoPlayerElement.tagName, VideoPlayerElement);
12
+
13
+ //#endregion
14
+ export { VideoPlayerElement };
15
+ //# sourceMappingURL=player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player.js","names":[],"sources":["../../../../src/define/video/player.ts"],"sourcesContent":["import { features } from '@videojs/core/dom';\nimport { createPlayer } from '../../player/create-player';\n\nconst { PlayerElement } = createPlayer({\n features: features.video,\n});\n\nexport class VideoPlayerElement extends PlayerElement {\n static readonly tagName = 'video-player';\n}\n\ncustomElements.define(VideoPlayerElement.tagName, VideoPlayerElement);\n\ndeclare global {\n interface HTMLElementTagNameMap {\n [VideoPlayerElement.tagName]: VideoPlayerElement;\n }\n}\n"],"mappings":";;;;AAGA,MAAM,EAAE,kBAAkB,aAAa,EACrC,UAAU,SAAS,OACpB,CAAC;AAEF,IAAa,qBAAb,cAAwC,cAAc;;iBAC1B;;;AAG5B,eAAe,OAAO,mBAAmB,SAAS,mBAAmB"}
File without changes
@@ -0,0 +1,24 @@
1
+ import { PLAYER_CONTEXT_KEY, playerContext } from "./player/context.js";
2
+ import { createContainerMixin } from "./store/container-mixin.js";
3
+ import { createProviderMixin } from "./store/provider-mixin.js";
4
+ import { MediaElement } from "./ui/media-element.js";
5
+ import { PlayerController } from "./player/player-controller.js";
6
+ import { createPlayerMixin } from "./player/player-mixin.js";
7
+ import { createPlayer } from "./player/create-player.js";
8
+ import { BufferingIndicatorElement } from "./ui/buffering-indicator/buffering-indicator-element.js";
9
+ import { ControlsElement } from "./ui/controls/controls-element.js";
10
+ import { ControlsGroupElement } from "./ui/controls/controls-group-element.js";
11
+ import { FullscreenButtonElement } from "./ui/fullscreen-button/fullscreen-button-element.js";
12
+ import { MuteButtonElement } from "./ui/mute-button/mute-button-element.js";
13
+ import { PiPButtonElement } from "./ui/pip-button/pip-button-element.js";
14
+ import { PlayButtonElement } from "./ui/play-button/play-button-element.js";
15
+ import { PosterElement } from "./ui/poster/poster-element.js";
16
+ import { SeekButtonElement } from "./ui/seek-button/seek-button-element.js";
17
+ import { TimeElement } from "./ui/time/time-element.js";
18
+ import { TimeGroupElement } from "./ui/time/time-group-element.js";
19
+ import { TimeSeparatorElement } from "./ui/time/time-separator-element.js";
20
+ import { createSelector, shallowEqual } from "@videojs/store";
21
+
22
+ export * from "@videojs/core/dom"
23
+
24
+ export { BufferingIndicatorElement, ControlsElement, ControlsGroupElement, FullscreenButtonElement, MediaElement, MuteButtonElement, PLAYER_CONTEXT_KEY, PiPButtonElement, PlayButtonElement, PlayerController, PosterElement, SeekButtonElement, TimeElement, TimeGroupElement, TimeSeparatorElement, createContainerMixin, createPlayer, createPlayerMixin, createProviderMixin, createSelector, playerContext, shallowEqual };
@@ -0,0 +1,83 @@
1
+ import { namedNodeMapToObject } from "@videojs/utils/dom";
2
+
3
+ //#region src/media/background-video/index.ts
4
+ function getTemplateHTML(attrs) {
5
+ return `
6
+ <style>
7
+ :host {
8
+ position: relative;
9
+ }
10
+
11
+ video {
12
+ position: absolute;
13
+ inset: 0;
14
+ width: 100%;
15
+ height: 100%;
16
+ object-fit: var(--media-object-fit, inherit);
17
+ object-position: var(--media-object-position, 50% 50%);
18
+ }
19
+ </style>
20
+ <slot></slot>
21
+ <video ${serializeAttributes(attrs)}></video>
22
+ `;
23
+ }
24
+ var BackgroundVideo = class extends HTMLElement {
25
+ static {
26
+ this.shadowRootOptions = { mode: "open" };
27
+ }
28
+ static {
29
+ this.getTemplateHTML = getTemplateHTML;
30
+ }
31
+ static get observedAttributes() {
32
+ return ["src"];
33
+ }
34
+ constructor() {
35
+ super();
36
+ if (!this.shadowRoot) {
37
+ this.attachShadow(this.constructor.shadowRootOptions);
38
+ const attrs = {
39
+ ...namedNodeMapToObject(this.attributes),
40
+ ...!this.hasAttribute("nomuted") && { muted: "" },
41
+ ...!this.hasAttribute("noloop") && { loop: "" },
42
+ ...!this.hasAttribute("noautoplay") && { autoplay: "" },
43
+ playsinline: "",
44
+ disableremoteplayback: "",
45
+ disablepictureinpicture: ""
46
+ };
47
+ this.shadowRoot.innerHTML = getTemplateHTML(attrs);
48
+ }
49
+ this.target.muted = !this.hasAttribute("nomuted");
50
+ }
51
+ attributeChangedCallback(attrName, oldValue, newValue) {
52
+ if (attrName === "src" && oldValue !== newValue) this.target.src = newValue ?? "";
53
+ }
54
+ get target() {
55
+ return this.querySelector(":scope > [slot=media]") ?? this.querySelector("video") ?? this.shadowRoot?.querySelector("video") ?? null;
56
+ }
57
+ };
58
+ const VideoAttributes = [
59
+ "autoplay",
60
+ "controls",
61
+ "controlslist",
62
+ "crossorigin",
63
+ "disablepictureinpicture",
64
+ "disableremoteplayback",
65
+ "loop",
66
+ "muted",
67
+ "playsinline",
68
+ "preload"
69
+ ];
70
+ function serializeAttributes(attrs) {
71
+ let html = "";
72
+ for (const key in attrs) {
73
+ if (!VideoAttributes.includes(key)) continue;
74
+ const value = attrs[key];
75
+ if (value === "") html += ` ${key}`;
76
+ else html += ` ${key}="${value}"`;
77
+ }
78
+ return html;
79
+ }
80
+
81
+ //#endregion
82
+ export { BackgroundVideo };
83
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/media/background-video/index.ts"],"sourcesContent":["import { namedNodeMapToObject } from '@videojs/utils/dom';\n\nfunction getTemplateHTML(attrs: Record<string, string>) {\n return /*html*/ `\n <style>\n :host {\n position: relative;\n }\n\n video {\n position: absolute;\n inset: 0;\n width: 100%;\n height: 100%;\n object-fit: var(--media-object-fit, inherit);\n object-position: var(--media-object-position, 50% 50%);\n }\n </style>\n <slot></slot>\n <video ${serializeAttributes(attrs)}></video>\n `;\n}\n\n// Don't extend CustomMediaMixin to save some bytes, background videos don't need the full Media API.\nexport class BackgroundVideo extends HTMLElement {\n static shadowRootOptions = { mode: 'open' as ShadowRootMode };\n static getTemplateHTML = getTemplateHTML;\n static get observedAttributes() {\n return ['src'];\n }\n\n constructor() {\n super();\n\n if (!this.shadowRoot) {\n this.attachShadow((this.constructor as typeof BackgroundVideo).shadowRootOptions);\n\n const attrs = {\n ...namedNodeMapToObject(this.attributes),\n ...(!this.hasAttribute('nomuted') && { muted: '' }),\n ...(!this.hasAttribute('noloop') && { loop: '' }),\n ...(!this.hasAttribute('noautoplay') && { autoplay: '' }),\n playsinline: '',\n disableremoteplayback: '',\n disablepictureinpicture: '',\n };\n\n this.shadowRoot!.innerHTML = getTemplateHTML(attrs);\n }\n\n // Neither Chrome or Firefox support setting the muted attribute\n // after using document.createElement.\n // Get around this by setting the muted property manually.\n this.target!.muted = !this.hasAttribute('nomuted');\n }\n\n attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void {\n if (attrName === 'src' && oldValue !== newValue) {\n this.target!.src = newValue ?? '';\n }\n }\n\n get target(): HTMLVideoElement | null {\n return (\n this.querySelector(':scope > [slot=media]') ??\n this.querySelector('video') ??\n this.shadowRoot?.querySelector('video') ??\n null\n );\n }\n}\n\nconst VideoAttributes = [\n 'autoplay',\n 'controls',\n 'controlslist',\n 'crossorigin',\n 'disablepictureinpicture',\n 'disableremoteplayback',\n 'loop',\n 'muted',\n 'playsinline',\n 'preload',\n] as const;\n\nfunction serializeAttributes(attrs: Record<string, string>): string {\n let html = '';\n for (const key in attrs) {\n // Skip forwarding non native video attributes.\n if (!VideoAttributes.includes(key as any)) continue;\n\n const value = attrs[key];\n if (value === '') html += ` ${key}`;\n else html += ` ${key}=\"${value}\"`;\n }\n return html;\n}\n"],"mappings":";;;AAEA,SAAS,gBAAgB,OAA+B;AACtD,QAAgB;;;;;;;;;;;;;;;;aAgBL,oBAAoB,MAAM,CAAC;;;AAKxC,IAAa,kBAAb,cAAqC,YAAY;;2BACpB,EAAE,MAAM,QAA0B;;;yBACpC;;CACzB,WAAW,qBAAqB;AAC9B,SAAO,CAAC,MAAM;;CAGhB,cAAc;AACZ,SAAO;AAEP,MAAI,CAAC,KAAK,YAAY;AACpB,QAAK,aAAc,KAAK,YAAuC,kBAAkB;GAEjF,MAAM,QAAQ;IACZ,GAAG,qBAAqB,KAAK,WAAW;IACxC,GAAI,CAAC,KAAK,aAAa,UAAU,IAAI,EAAE,OAAO,IAAI;IAClD,GAAI,CAAC,KAAK,aAAa,SAAS,IAAI,EAAE,MAAM,IAAI;IAChD,GAAI,CAAC,KAAK,aAAa,aAAa,IAAI,EAAE,UAAU,IAAI;IACxD,aAAa;IACb,uBAAuB;IACvB,yBAAyB;IAC1B;AAED,QAAK,WAAY,YAAY,gBAAgB,MAAM;;AAMrD,OAAK,OAAQ,QAAQ,CAAC,KAAK,aAAa,UAAU;;CAGpD,yBAAyB,UAAkB,UAAyB,UAA+B;AACjG,MAAI,aAAa,SAAS,aAAa,SACrC,MAAK,OAAQ,MAAM,YAAY;;CAInC,IAAI,SAAkC;AACpC,SACE,KAAK,cAAc,wBAAwB,IAC3C,KAAK,cAAc,QAAQ,IAC3B,KAAK,YAAY,cAAc,QAAQ,IACvC;;;AAKN,MAAM,kBAAkB;CACtB;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD;AAED,SAAS,oBAAoB,OAAuC;CAClE,IAAI,OAAO;AACX,MAAK,MAAM,OAAO,OAAO;AAEvB,MAAI,CAAC,gBAAgB,SAAS,IAAW,CAAE;EAE3C,MAAM,QAAQ,MAAM;AACpB,MAAI,UAAU,GAAI,SAAQ,IAAI;MACzB,SAAQ,IAAI,IAAI,IAAI,MAAM;;AAEjC,QAAO"}
@@ -0,0 +1,21 @@
1
+ import { HlsCustomMedia } from "@videojs/core/dom/media/hls";
2
+
3
+ //#region src/media/hls-video/index.ts
4
+ var HlsVideo = class extends HlsCustomMedia {
5
+ static getTemplateHTML(attrs) {
6
+ const { src, ...rest } = attrs;
7
+ return super.getTemplateHTML(rest);
8
+ }
9
+ constructor() {
10
+ super();
11
+ this.attach(this.nativeEl);
12
+ }
13
+ attributeChangedCallback(attrName, oldValue, newValue) {
14
+ if (attrName !== "src") super.attributeChangedCallback(attrName, oldValue, newValue);
15
+ if (attrName === "src" && oldValue !== newValue) this.src = newValue ?? "";
16
+ }
17
+ };
18
+
19
+ //#endregion
20
+ export { HlsVideo };
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../src/media/hls-video/index.ts"],"sourcesContent":["import { HlsCustomMedia } from '@videojs/core/dom/media/hls';\n\nexport class HlsVideo extends HlsCustomMedia {\n static getTemplateHTML(attrs: Record<string, string>): string {\n const { src, ...rest } = attrs;\n // biome-ignore lint/complexity/noThisInStatic: intentional use of super\n return super.getTemplateHTML(rest);\n }\n\n constructor() {\n super();\n // TODO: If we like to support native media elements that\n // are appended after the custom element is created, we need to\n // attach the native element to the Media API after the native element\n // is appended to the DOM. This is currently not supported.\n this.attach(this.nativeEl);\n }\n\n attributeChangedCallback(attrName: string, oldValue: string | null, newValue: string | null): void {\n if (attrName !== 'src') {\n super.attributeChangedCallback(attrName, oldValue, newValue);\n }\n\n if (attrName === 'src' && oldValue !== newValue) {\n this.src = newValue ?? '';\n }\n }\n}\n"],"mappings":";;;AAEA,IAAa,WAAb,cAA8B,eAAe;CAC3C,OAAO,gBAAgB,OAAuC;EAC5D,MAAM,EAAE,KAAK,GAAG,SAAS;AAEzB,SAAO,MAAM,gBAAgB,KAAK;;CAGpC,cAAc;AACZ,SAAO;AAKP,OAAK,OAAO,KAAK,SAAS;;CAG5B,yBAAyB,UAAkB,UAAyB,UAA+B;AACjG,MAAI,aAAa,MACf,OAAM,yBAAyB,UAAU,UAAU,SAAS;AAG9D,MAAI,aAAa,SAAS,aAAa,SACrC,MAAK,MAAM,YAAY"}
@@ -0,0 +1,14 @@
1
+ import { createContext } from "@videojs/element/context";
2
+
3
+ //#region src/player/context.ts
4
+ const PLAYER_CONTEXT_KEY = Symbol("@videojs/player");
5
+ /**
6
+ * The default player context instance for consuming the player store in controllers.
7
+ *
8
+ * @public
9
+ */
10
+ const playerContext = createContext(PLAYER_CONTEXT_KEY);
11
+
12
+ //#endregion
13
+ export { PLAYER_CONTEXT_KEY, playerContext };
14
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","names":[],"sources":["../../../src/player/context.ts"],"sourcesContent":["import type { AnyPlayerStore, PlayerStore } from '@videojs/core/dom';\nimport { type Context, createContext } from '@videojs/element/context';\n\nexport const PLAYER_CONTEXT_KEY = Symbol('@videojs/player');\n\nexport type PlayerContextValue<Store extends PlayerStore = AnyPlayerStore> = Store;\n\nexport type PlayerContext<Store extends PlayerStore = AnyPlayerStore> = Context<\n typeof PLAYER_CONTEXT_KEY,\n PlayerContextValue<Store>\n>;\n\n/**\n * The default player context instance for consuming the player store in controllers.\n *\n * @public\n */\nexport const playerContext = createContext<PlayerContextValue, typeof PLAYER_CONTEXT_KEY>(PLAYER_CONTEXT_KEY);\n"],"mappings":";;;AAGA,MAAa,qBAAqB,OAAO,kBAAkB;;;;;;AAc3D,MAAa,gBAAgB,cAA6D,mBAAmB"}
@@ -0,0 +1,29 @@
1
+ import { playerContext } from "./context.js";
2
+ import { createContainerMixin } from "../store/container-mixin.js";
3
+ import { createProviderMixin } from "../store/provider-mixin.js";
4
+ import { MediaElement } from "../ui/media-element.js";
5
+ import { PlayerController } from "./player-controller.js";
6
+ import { createPlayerMixin } from "./player-mixin.js";
7
+ import { combine, createStore } from "@videojs/store";
8
+
9
+ //#region src/player/create-player.ts
10
+ function createPlayer(config) {
11
+ const slice = combine(...config.features);
12
+ function create() {
13
+ return createStore()(slice);
14
+ }
15
+ const PlayerMixin = createPlayerMixin(playerContext, create);
16
+ return {
17
+ context: playerContext,
18
+ create,
19
+ PlayerController,
20
+ PlayerElement: PlayerMixin(MediaElement),
21
+ PlayerMixin,
22
+ ProviderMixin: createProviderMixin(playerContext, create),
23
+ ContainerMixin: createContainerMixin(playerContext)
24
+ };
25
+ }
26
+
27
+ //#endregion
28
+ export { createPlayer };
29
+ //# sourceMappingURL=create-player.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"create-player.js","names":[],"sources":["../../../src/player/create-player.ts"],"sourcesContent":["import type {\n AnyPlayerFeature,\n AudioFeatures,\n AudioPlayerStore,\n PlayerStore,\n PlayerTarget,\n VideoFeatures,\n VideoPlayerStore,\n} from '@videojs/core/dom';\nimport { combine, createStore } from '@videojs/store';\n\nimport { type ContainerMixin, createContainerMixin } from '../store/container-mixin';\nimport { createProviderMixin, type ProviderMixin } from '../store/provider-mixin';\nimport type { PlayerElementConstructor } from '../store/types';\nimport { MediaElement } from '../ui/media-element';\nimport { type PlayerContext, playerContext } from './context';\nimport { PlayerController } from './player-controller';\nimport { createPlayerMixin, type PlayerMixin } from './player-mixin';\n\nexport interface CreatePlayerConfig<Features extends AnyPlayerFeature[]> {\n features: Features;\n}\n\nexport interface CreatePlayerResult<Store extends PlayerStore> {\n /** Context for consuming player in controllers. */\n context: PlayerContext<Store>;\n\n /** Creates a store instance for imperative access. */\n create: () => Store;\n\n /** Player controller bound to this player's context. */\n PlayerController: PlayerController.Constructor<Store>;\n\n /** Pre-composed player element ready for customElements.define(). */\n PlayerElement: PlayerElementConstructor<Store>;\n\n /** Mixin for a complete player element (provider + container). */\n PlayerMixin: PlayerMixin<Store>;\n\n /** Mixin that provides player context to descendants. */\n ProviderMixin: ProviderMixin<Store>;\n\n /** Mixin that consumes player context and auto-attaches media elements. */\n ContainerMixin: ContainerMixin<Store>;\n}\n\n/**\n * Creates a player factory with typed store, mixins, and controller.\n *\n * @example\n * ```ts\n * import { features } from '@videojs/core/dom';\n * import { createPlayer, MediaElement } from '@videojs/html';\n *\n * const { PlayerElement, PlayerController, context } = createPlayer({\n * features: features.video,\n * });\n *\n * // Simple: register pre-composed PlayerElement\n * customElements.define('video-player', PlayerElement);\n *\n * // Custom: extend with PlayerMixin\n * class MyPlayer extends PlayerMixin(MediaElement) {}\n *\n * // Control element with selector\n * class PlayButton extends MediaElement {\n * #playback = new PlayerController(this, context, selectPlayback);\n * }\n * ```\n *\n * @label Video\n * @param config - Player configuration with features.\n */\nexport function createPlayer(config: CreatePlayerConfig<VideoFeatures>): CreatePlayerResult<VideoPlayerStore>;\n\n/**\n * Creates a player factory for audio media.\n *\n * @label Audio\n * @param config - Player configuration with features.\n */\nexport function createPlayer(config: CreatePlayerConfig<AudioFeatures>): CreatePlayerResult<AudioPlayerStore>;\n\n/**\n * Creates a player factory with custom features.\n *\n * @label Generic\n * @param config - Player configuration with features.\n */\nexport function createPlayer<const Features extends AnyPlayerFeature[]>(\n config: CreatePlayerConfig<Features>\n): CreatePlayerResult<PlayerStore<Features>>;\n\nexport function createPlayer(config: CreatePlayerConfig<AnyPlayerFeature[]>): CreatePlayerResult<PlayerStore> {\n const slice = combine<PlayerTarget, AnyPlayerFeature[]>(...config.features);\n\n function create(): PlayerStore {\n return createStore<PlayerTarget>()(slice);\n }\n\n const PlayerMixin = createPlayerMixin<PlayerStore>(playerContext, create);\n const PlayerElement = PlayerMixin(MediaElement);\n const ProviderMixin = createProviderMixin<PlayerStore>(playerContext, create);\n const ContainerMixin = createContainerMixin<PlayerStore>(playerContext);\n\n return {\n context: playerContext,\n create,\n PlayerController,\n PlayerElement,\n PlayerMixin,\n ProviderMixin,\n ContainerMixin,\n };\n}\n"],"mappings":";;;;;;;;;AA6FA,SAAgB,aAAa,QAAiF;CAC5G,MAAM,QAAQ,QAA0C,GAAG,OAAO,SAAS;CAE3E,SAAS,SAAsB;AAC7B,SAAO,aAA2B,CAAC,MAAM;;CAG3C,MAAM,cAAc,kBAA+B,eAAe,OAAO;AAKzE,QAAO;EACL,SAAS;EACT;EACA;EACA,eARoB,YAAY,aAAa;EAS7C;EACA,eAToB,oBAAiC,eAAe,OAAO;EAU3E,gBATqB,qBAAkC,cAAc;EAUtE"}
@@ -0,0 +1,63 @@
1
+ import { ContextConsumer } from "@videojs/element/context";
2
+ import { StoreController } from "@videojs/store/html";
3
+
4
+ //#region src/player/player-controller.ts
5
+ /**
6
+ * Reactive controller for accessing player store state.
7
+ *
8
+ * Without selector: Returns the store, does NOT subscribe to changes.
9
+ * With selector: Returns selected state, subscribes with shallowEqual comparison.
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * // Store access (no subscription)
14
+ * class Controls extends MediaElement {
15
+ * #player = new PlayerController(this, playerContext);
16
+ *
17
+ * handleClick() {
18
+ * this.#player.value.setVolume(0.5);
19
+ * }
20
+ * }
21
+ *
22
+ * // Selector-based subscription
23
+ * class PlayButton extends MediaElement {
24
+ * #playback = new PlayerController(this, playerContext, selectPlayback);
25
+ * }
26
+ * ```
27
+ */
28
+ var PlayerController = class {
29
+ #host;
30
+ #selector;
31
+ #consumer;
32
+ #store = null;
33
+ constructor(host, context, selector) {
34
+ this.#host = host;
35
+ this.#selector = selector;
36
+ this.#consumer = new ContextConsumer(host, {
37
+ context,
38
+ callback: (ctx) => this.#connect(ctx),
39
+ subscribe: true
40
+ });
41
+ host.addController(this);
42
+ }
43
+ get value() {
44
+ const store = this.#consumer.value;
45
+ if (!store) return void 0;
46
+ if (!this.#selector) return store;
47
+ return this.#store?.value;
48
+ }
49
+ hostConnected() {
50
+ const store = this.#consumer.value;
51
+ if (store) this.#connect(store);
52
+ }
53
+ hostDisconnected() {
54
+ this.#store = null;
55
+ }
56
+ #connect(store) {
57
+ if (!this.#store && this.#selector) this.#store = new StoreController(this.#host, store, this.#selector);
58
+ }
59
+ };
60
+
61
+ //#endregion
62
+ export { PlayerController };
63
+ //# sourceMappingURL=player-controller.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"player-controller.js","names":["#host","#selector","#consumer","#connect","#store"],"sources":["../../../src/player/player-controller.ts"],"sourcesContent":["import type { PlayerStore } from '@videojs/core/dom';\nimport type { ReactiveController, ReactiveControllerHost } from '@videojs/element';\nimport { ContextConsumer } from '@videojs/element/context';\nimport type { InferStoreState, Selector } from '@videojs/store';\nimport { StoreController } from '@videojs/store/html';\n\nimport type { PlayerContext } from './context';\n\nexport type PlayerControllerHost = ReactiveControllerHost & HTMLElement;\n\n/**\n * Reactive controller for accessing player store state.\n *\n * Without selector: Returns the store, does NOT subscribe to changes.\n * With selector: Returns selected state, subscribes with shallowEqual comparison.\n *\n * @example\n * ```ts\n * // Store access (no subscription)\n * class Controls extends MediaElement {\n * #player = new PlayerController(this, playerContext);\n *\n * handleClick() {\n * this.#player.value.setVolume(0.5);\n * }\n * }\n *\n * // Selector-based subscription\n * class PlayButton extends MediaElement {\n * #playback = new PlayerController(this, playerContext, selectPlayback);\n * }\n * ```\n */\nexport class PlayerController<Store extends PlayerStore, Result = Store> implements ReactiveController {\n readonly #host: PlayerControllerHost;\n readonly #selector: Selector<InferStoreState<Store>, Result> | undefined;\n\n #consumer: ContextConsumer<PlayerContext<Store>, PlayerControllerHost>;\n #store: StoreController<Store, Result> | null = null;\n\n /**\n * @label Without Selector\n * @param host - The host element that owns this controller.\n * @param context - Player context to resolve the store from.\n */\n constructor(host: PlayerControllerHost, context: PlayerContext<Store>);\n /**\n * @label With Selector\n * @param host - The host element that owns this controller.\n * @param context - Player context to resolve the store from.\n * @param selector - Derives a value from the player store state.\n */\n constructor(\n host: PlayerControllerHost,\n context: PlayerContext<Store>,\n selector: Selector<InferStoreState<Store>, Result>\n );\n constructor(\n host: PlayerControllerHost,\n context: PlayerContext<Store>,\n selector?: Selector<InferStoreState<Store>, Result>\n ) {\n this.#host = host;\n this.#selector = selector;\n\n this.#consumer = new ContextConsumer(host, {\n context,\n callback: (ctx) => this.#connect(ctx),\n subscribe: true,\n });\n\n host.addController(this);\n }\n\n get value(): Result | undefined {\n const store = this.#consumer.value;\n if (!store) return undefined;\n\n // Without selector: return store directly\n if (!this.#selector) return store as unknown as Result;\n\n // With selector: use StoreController\n return this.#store?.value;\n }\n\n hostConnected(): void {\n const store = this.#consumer.value;\n if (store) this.#connect(store);\n }\n\n hostDisconnected(): void {\n this.#store = null;\n }\n\n #connect(store: Store): void {\n if (!this.#store && this.#selector) {\n this.#store = new StoreController(this.#host, store, this.#selector);\n }\n }\n}\n\nexport namespace PlayerController {\n export type Host = PlayerControllerHost;\n\n export type Constructor<Store extends PlayerStore = PlayerStore, Result = Store> = typeof PlayerController<\n Store,\n Result\n >;\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAiCA,IAAa,mBAAb,MAAuG;CACrG,CAASA;CACT,CAASC;CAET;CACA,SAAgD;CAmBhD,YACE,MACA,SACA,UACA;AACA,QAAKD,OAAQ;AACb,QAAKC,WAAY;AAEjB,QAAKC,WAAY,IAAI,gBAAgB,MAAM;GACzC;GACA,WAAW,QAAQ,MAAKC,QAAS,IAAI;GACrC,WAAW;GACZ,CAAC;AAEF,OAAK,cAAc,KAAK;;CAG1B,IAAI,QAA4B;EAC9B,MAAM,QAAQ,MAAKD,SAAU;AAC7B,MAAI,CAAC,MAAO,QAAO;AAGnB,MAAI,CAAC,MAAKD,SAAW,QAAO;AAG5B,SAAO,MAAKG,OAAQ;;CAGtB,gBAAsB;EACpB,MAAM,QAAQ,MAAKF,SAAU;AAC7B,MAAI,MAAO,OAAKC,QAAS,MAAM;;CAGjC,mBAAyB;AACvB,QAAKC,QAAS;;CAGhB,SAAS,OAAoB;AAC3B,MAAI,CAAC,MAAKA,SAAU,MAAKH,SACvB,OAAKG,QAAS,IAAI,gBAAgB,MAAKJ,MAAO,OAAO,MAAKC,SAAU"}