@videojs/html 10.3.0 → 10.4.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 (272) hide show
  1. package/dist/default/define/audio/compat-skin.css +91 -38
  2. package/dist/default/define/audio/compat-skin2.js +1 -1
  3. package/dist/default/define/audio/neutral-skin.css +52 -31
  4. package/dist/default/define/audio/neutral-skin2.js +1 -1
  5. package/dist/default/define/audio/scaffold-skin.css +105 -40
  6. package/dist/default/define/audio/scaffold-skin2.js +1 -1
  7. package/dist/default/define/audio/skin.css +53 -31
  8. package/dist/default/define/audio/skin2.js +1 -1
  9. package/dist/default/define/live-audio/compat-skin.css +91 -38
  10. package/dist/default/define/live-audio/compat-skin2.js +1 -1
  11. package/dist/default/define/live-audio/neutral-skin.css +50 -29
  12. package/dist/default/define/live-audio/neutral-skin2.js +1 -1
  13. package/dist/default/define/live-audio/scaffold-skin.css +105 -40
  14. package/dist/default/define/live-audio/scaffold-skin2.js +1 -1
  15. package/dist/default/define/live-audio/skin.css +51 -29
  16. package/dist/default/define/live-audio/skin2.js +1 -1
  17. package/dist/default/define/live-video/compat-skin.css +142 -61
  18. package/dist/default/define/live-video/compat-skin2.js +1 -1
  19. package/dist/default/define/live-video/neutral-skin.css +241 -55
  20. package/dist/default/define/live-video/neutral-skin2.js +1 -1
  21. package/dist/default/define/live-video/scaffold-skin.css +159 -63
  22. package/dist/default/define/live-video/scaffold-skin2.js +1 -1
  23. package/dist/default/define/live-video/skin.css +245 -60
  24. package/dist/default/define/live-video/skin2.js +1 -1
  25. package/dist/default/define/ui/time-slider-markers.js +5 -0
  26. package/dist/default/define/video/compat-skin.css +150 -61
  27. package/dist/default/define/video/compat-skin2.js +1 -1
  28. package/dist/default/define/video/neutral-skin.css +322 -66
  29. package/dist/default/define/video/neutral-skin2.js +1 -1
  30. package/dist/default/define/video/scaffold-skin.css +168 -63
  31. package/dist/default/define/video/scaffold-skin2.js +1 -1
  32. package/dist/default/define/video/skin.css +348 -66
  33. package/dist/default/define/video/skin2.js +1 -1
  34. package/dist/default/index.js +3 -1
  35. package/dist/default/internal/skins/compat-audio/skin.css +91 -38
  36. package/dist/default/internal/skins/compat-live-audio/skin.css +91 -38
  37. package/dist/default/internal/skins/compat-live-video/skin.css +142 -61
  38. package/dist/default/internal/skins/compat-live-video/template.js +2 -0
  39. package/dist/default/internal/skins/compat-video/skin.css +150 -61
  40. package/dist/default/internal/skins/compat-video/template.js +2 -0
  41. package/dist/default/internal/skins/default-audio/skin.css +53 -31
  42. package/dist/default/internal/skins/default-live-audio/skin.css +51 -29
  43. package/dist/default/internal/skins/default-live-video/skin.css +245 -60
  44. package/dist/default/internal/skins/default-live-video/template.js +14 -0
  45. package/dist/default/internal/skins/default-video/register.js +3 -0
  46. package/dist/default/internal/skins/default-video/skin.css +348 -66
  47. package/dist/default/internal/skins/default-video/template.js +33 -5
  48. package/dist/default/internal/skins/neutral-audio/skin.css +52 -31
  49. package/dist/default/internal/skins/neutral-live-audio/skin.css +50 -29
  50. package/dist/default/internal/skins/neutral-live-video/skin.css +241 -55
  51. package/dist/default/internal/skins/neutral-live-video/template.js +14 -0
  52. package/dist/default/internal/skins/neutral-video/skin.css +322 -66
  53. package/dist/default/internal/skins/neutral-video/template.js +25 -11
  54. package/dist/default/internal/skins/scaffold-audio/skin.css +105 -40
  55. package/dist/default/internal/skins/scaffold-live-audio/skin.css +105 -40
  56. package/dist/default/internal/skins/scaffold-live-video/skin.css +159 -63
  57. package/dist/default/internal/skins/scaffold-live-video/template.js +2 -0
  58. package/dist/default/internal/skins/scaffold-video/skin.css +168 -63
  59. package/dist/default/internal/skins/scaffold-video/template.js +3 -1
  60. package/dist/default/media/background-video/adapter.js +13 -35
  61. package/dist/default/media/background-video/base.js +95 -0
  62. package/dist/default/media/background-video/template.js +13 -20
  63. package/dist/default/media/hls-background-video/adapter.js +16 -35
  64. package/dist/default/ui/captions-radio-group/element.js +14 -1
  65. package/dist/default/ui/controls/element.js +6 -3
  66. package/dist/default/ui/time-slider/markers.js +160 -0
  67. package/dist/default/version.js +1 -1
  68. package/dist/dev/define/audio/compat-skin.css +91 -38
  69. package/dist/dev/define/audio/compat-skin2.js +1 -1
  70. package/dist/dev/define/audio/compat-skin2.js.map +1 -1
  71. package/dist/dev/define/audio/neutral-skin.css +52 -31
  72. package/dist/dev/define/audio/neutral-skin2.js +1 -1
  73. package/dist/dev/define/audio/neutral-skin2.js.map +1 -1
  74. package/dist/dev/define/audio/scaffold-skin.css +105 -40
  75. package/dist/dev/define/audio/scaffold-skin2.js +1 -1
  76. package/dist/dev/define/audio/scaffold-skin2.js.map +1 -1
  77. package/dist/dev/define/audio/skin.css +53 -31
  78. package/dist/dev/define/audio/skin2.js +1 -1
  79. package/dist/dev/define/audio/skin2.js.map +1 -1
  80. package/dist/dev/define/live-audio/compat-skin.css +91 -38
  81. package/dist/dev/define/live-audio/compat-skin2.js +1 -1
  82. package/dist/dev/define/live-audio/compat-skin2.js.map +1 -1
  83. package/dist/dev/define/live-audio/neutral-skin.css +50 -29
  84. package/dist/dev/define/live-audio/neutral-skin2.js +1 -1
  85. package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -1
  86. package/dist/dev/define/live-audio/scaffold-skin.css +105 -40
  87. package/dist/dev/define/live-audio/scaffold-skin2.js +1 -1
  88. package/dist/dev/define/live-audio/scaffold-skin2.js.map +1 -1
  89. package/dist/dev/define/live-audio/skin.css +51 -29
  90. package/dist/dev/define/live-audio/skin2.js +1 -1
  91. package/dist/dev/define/live-audio/skin2.js.map +1 -1
  92. package/dist/dev/define/live-video/compat-skin.css +142 -61
  93. package/dist/dev/define/live-video/compat-skin2.js +1 -1
  94. package/dist/dev/define/live-video/compat-skin2.js.map +1 -1
  95. package/dist/dev/define/live-video/neutral-skin.css +241 -55
  96. package/dist/dev/define/live-video/neutral-skin2.js +1 -1
  97. package/dist/dev/define/live-video/neutral-skin2.js.map +1 -1
  98. package/dist/dev/define/live-video/scaffold-skin.css +159 -63
  99. package/dist/dev/define/live-video/scaffold-skin2.js +1 -1
  100. package/dist/dev/define/live-video/scaffold-skin2.js.map +1 -1
  101. package/dist/dev/define/live-video/skin.css +245 -60
  102. package/dist/dev/define/live-video/skin2.js +1 -1
  103. package/dist/dev/define/live-video/skin2.js.map +1 -1
  104. package/dist/dev/define/ui/time-slider-markers.d.ts +8 -0
  105. package/dist/dev/define/ui/time-slider-markers.js +7 -0
  106. package/dist/dev/define/ui/time-slider-markers.js.map +1 -0
  107. package/dist/dev/define/video/compat-skin.css +150 -61
  108. package/dist/dev/define/video/compat-skin2.js +1 -1
  109. package/dist/dev/define/video/compat-skin2.js.map +1 -1
  110. package/dist/dev/define/video/neutral-skin.css +322 -66
  111. package/dist/dev/define/video/neutral-skin2.js +1 -1
  112. package/dist/dev/define/video/neutral-skin2.js.map +1 -1
  113. package/dist/dev/define/video/scaffold-skin.css +168 -63
  114. package/dist/dev/define/video/scaffold-skin2.js +1 -1
  115. package/dist/dev/define/video/scaffold-skin2.js.map +1 -1
  116. package/dist/dev/define/video/skin.css +348 -66
  117. package/dist/dev/define/video/skin2.js +1 -1
  118. package/dist/dev/define/video/skin2.js.map +1 -1
  119. package/dist/dev/index.d.ts +5 -4
  120. package/dist/dev/index.js +3 -1
  121. package/dist/dev/internal/skins/compat-audio/skin.css +91 -38
  122. package/dist/dev/internal/skins/compat-live-audio/skin.css +91 -38
  123. package/dist/dev/internal/skins/compat-live-video/skin.css +142 -61
  124. package/dist/dev/internal/skins/compat-live-video/template.js +2 -0
  125. package/dist/dev/internal/skins/compat-live-video/template.js.map +1 -1
  126. package/dist/dev/internal/skins/compat-video/skin.css +150 -61
  127. package/dist/dev/internal/skins/compat-video/template.js +2 -0
  128. package/dist/dev/internal/skins/compat-video/template.js.map +1 -1
  129. package/dist/dev/internal/skins/default-audio/skin.css +53 -31
  130. package/dist/dev/internal/skins/default-live-audio/skin.css +51 -29
  131. package/dist/dev/internal/skins/default-live-video/register.js.map +1 -1
  132. package/dist/dev/internal/skins/default-live-video/skin.css +245 -60
  133. package/dist/dev/internal/skins/default-live-video/template.js +14 -0
  134. package/dist/dev/internal/skins/default-live-video/template.js.map +1 -1
  135. package/dist/dev/internal/skins/default-video/register.d.ts +1 -0
  136. package/dist/dev/internal/skins/default-video/register.js +3 -0
  137. package/dist/dev/internal/skins/default-video/register.js.map +1 -1
  138. package/dist/dev/internal/skins/default-video/skin.css +348 -66
  139. package/dist/dev/internal/skins/default-video/template.js +33 -5
  140. package/dist/dev/internal/skins/default-video/template.js.map +1 -1
  141. package/dist/dev/internal/skins/neutral-audio/skin.css +52 -31
  142. package/dist/dev/internal/skins/neutral-live-audio/skin.css +50 -29
  143. package/dist/dev/internal/skins/neutral-live-video/register.js.map +1 -1
  144. package/dist/dev/internal/skins/neutral-live-video/skin.css +241 -55
  145. package/dist/dev/internal/skins/neutral-live-video/template.js +14 -0
  146. package/dist/dev/internal/skins/neutral-live-video/template.js.map +1 -1
  147. package/dist/dev/internal/skins/neutral-video/register.js.map +1 -1
  148. package/dist/dev/internal/skins/neutral-video/skin.css +322 -66
  149. package/dist/dev/internal/skins/neutral-video/template.js +25 -11
  150. package/dist/dev/internal/skins/neutral-video/template.js.map +1 -1
  151. package/dist/dev/internal/skins/scaffold-audio/skin.css +105 -40
  152. package/dist/dev/internal/skins/scaffold-live-audio/skin.css +105 -40
  153. package/dist/dev/internal/skins/scaffold-live-video/skin.css +159 -63
  154. package/dist/dev/internal/skins/scaffold-live-video/template.js +2 -0
  155. package/dist/dev/internal/skins/scaffold-live-video/template.js.map +1 -1
  156. package/dist/dev/internal/skins/scaffold-video/skin.css +168 -63
  157. package/dist/dev/internal/skins/scaffold-video/template.js +3 -1
  158. package/dist/dev/internal/skins/scaffold-video/template.js.map +1 -1
  159. package/dist/dev/media/background-video/adapter.d.ts +7 -13
  160. package/dist/dev/media/background-video/adapter.js +13 -35
  161. package/dist/dev/media/background-video/adapter.js.map +1 -1
  162. package/dist/dev/media/background-video/base.d.ts +44 -0
  163. package/dist/dev/media/background-video/base.js +97 -0
  164. package/dist/dev/media/background-video/base.js.map +1 -0
  165. package/dist/dev/media/background-video/template.d.ts +3 -0
  166. package/dist/dev/media/background-video/template.js +13 -20
  167. package/dist/dev/media/background-video/template.js.map +1 -1
  168. package/dist/dev/media/hls-background-video/adapter.d.ts +8 -18
  169. package/dist/dev/media/hls-background-video/adapter.js +16 -35
  170. package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
  171. package/dist/dev/ui/captions-button/element.d.ts +2 -0
  172. package/dist/dev/ui/captions-radio-group/element.d.ts +2 -1
  173. package/dist/dev/ui/captions-radio-group/element.js +14 -1
  174. package/dist/dev/ui/captions-radio-group/element.js.map +1 -1
  175. package/dist/dev/ui/controls/element.d.ts +2 -2
  176. package/dist/dev/ui/controls/element.js +6 -3
  177. package/dist/dev/ui/controls/element.js.map +1 -1
  178. package/dist/dev/ui/time-slider/markers.d.ts +48 -0
  179. package/dist/dev/ui/time-slider/markers.js +165 -0
  180. package/dist/dev/ui/time-slider/markers.js.map +1 -0
  181. package/dist/dev/version.js +1 -1
  182. package/docs/README.md +1 -1
  183. package/docs/guides/autoplay.md +1 -1
  184. package/docs/guides/background-video.md +2 -4
  185. package/docs/guides/browser-support.md +22 -16
  186. package/docs/guides/cdn.md +9 -9
  187. package/docs/guides/customize-skins.md +3 -0
  188. package/docs/guides/installation-cdn.md +2 -2
  189. package/docs/guides/installation-shadcn.md +1 -1
  190. package/docs/guides/installation-svelte.md +2 -2
  191. package/docs/guides/installation-vue.md +2 -2
  192. package/docs/guides/installation.md +2 -2
  193. package/docs/guides/internationalization.md +5 -5
  194. package/docs/guides/keyboard-shortcuts.md +10 -0
  195. package/docs/guides/llms.txt +2 -1
  196. package/docs/guides/migrate-from-media-chrome.md +4 -4
  197. package/docs/guides/migrate-from-mux-player.md +6 -6
  198. package/docs/guides/migrate-from-plyr.md +7 -7
  199. package/docs/guides/migrate-from-video-js-8.md +6 -6
  200. package/docs/guides/migrate-from-vidstack.md +4 -4
  201. package/docs/guides/presets.md +4 -4
  202. package/docs/guides/self-hosting.md +5 -5
  203. package/docs/guides/skins.md +8 -7
  204. package/docs/guides/timed-metadata.md +318 -0
  205. package/docs/llms.txt +16 -2
  206. package/docs/reference/api/chapters-track.md +71 -0
  207. package/docs/reference/api/define-text-track.md +113 -0
  208. package/docs/reference/api/feature-text-cues.md +133 -0
  209. package/docs/reference/api/feature-text-tracks.md +11 -5
  210. package/docs/reference/api/get-active-text-cues.md +69 -0
  211. package/docs/reference/api/get-text-cues.md +69 -0
  212. package/docs/reference/api/get-text-tracks.md +41 -0
  213. package/docs/reference/api/hls-metadata-track.md +48 -0
  214. package/docs/reference/api/html-create-player.md +2 -2
  215. package/docs/reference/api/llms.txt +13 -1
  216. package/docs/reference/api/media-capabilities.md +4 -4
  217. package/docs/reference/api/player-store.md +9 -4
  218. package/docs/reference/api/preset-audio.md +3 -1
  219. package/docs/reference/api/preset-background.md +1 -1
  220. package/docs/reference/api/preset-live-audio.md +3 -1
  221. package/docs/reference/api/preset-live-video.md +2 -1
  222. package/docs/reference/api/preset-video.md +2 -1
  223. package/docs/reference/components/audio-compat-skin.md +1 -1
  224. package/docs/reference/components/audio-neutral-skin.md +1 -1
  225. package/docs/reference/components/audio-scaffold-skin.md +1 -1
  226. package/docs/reference/components/audio-skin.md +1 -1
  227. package/docs/reference/components/audio.md +19 -1
  228. package/docs/reference/components/background-video-skin.md +1 -1
  229. package/docs/reference/components/background-video.md +26 -11
  230. package/docs/reference/components/captions-radio-group.md +1 -1
  231. package/docs/reference/components/cloudflare-video.md +1 -1
  232. package/docs/reference/components/controls.md +16 -3
  233. package/docs/reference/components/dailymotion-video.md +2 -2
  234. package/docs/reference/components/dash-video.md +20 -3
  235. package/docs/reference/components/google-analytics.md +1 -1
  236. package/docs/reference/components/google-cast.md +1 -1
  237. package/docs/reference/components/hls-audio.md +56 -2
  238. package/docs/reference/components/hls-background-video.md +22 -5
  239. package/docs/reference/components/hls-video.md +99 -7
  240. package/docs/reference/components/hlsjs-video.md +52 -13
  241. package/docs/reference/components/live-audio-compat-skin.md +1 -1
  242. package/docs/reference/components/live-audio-neutral-skin.md +1 -1
  243. package/docs/reference/components/live-audio-scaffold-skin.md +1 -1
  244. package/docs/reference/components/live-audio-skin.md +1 -1
  245. package/docs/reference/components/live-video-compat-skin.md +5 -1
  246. package/docs/reference/components/live-video-neutral-skin.md +5 -1
  247. package/docs/reference/components/live-video-scaffold-skin.md +5 -1
  248. package/docs/reference/components/live-video-skin.md +5 -1
  249. package/docs/reference/components/llms.txt +2 -1
  250. package/docs/reference/components/mixcloud-audio.md +2 -2
  251. package/docs/reference/components/mux-audio.md +34 -3
  252. package/docs/reference/components/mux-background-video.md +1 -1
  253. package/docs/reference/components/mux-data.md +1 -1
  254. package/docs/reference/components/mux-video.md +17 -3
  255. package/docs/reference/components/native-hls-video.md +32 -3
  256. package/docs/reference/components/playerjs-video.md +2 -2
  257. package/docs/reference/components/shaka-video.md +2 -3
  258. package/docs/reference/components/soundcloud-audio.md +2 -2
  259. package/docs/reference/components/spotify-audio.md +2 -2
  260. package/docs/reference/components/tiktok-video.md +2 -2
  261. package/docs/reference/components/time-slider-markers.md +194 -0
  262. package/docs/reference/components/time-slider.md +14 -0
  263. package/docs/reference/components/twitch-video.md +1 -1
  264. package/docs/reference/components/video-compat-skin.md +5 -1
  265. package/docs/reference/components/video-neutral-skin.md +5 -1
  266. package/docs/reference/components/video-scaffold-skin.md +5 -1
  267. package/docs/reference/components/video-skin.md +5 -1
  268. package/docs/reference/components/video.md +19 -1
  269. package/docs/reference/components/vimeo-video.md +1 -2
  270. package/docs/reference/components/wistia-video.md +1 -1
  271. package/docs/reference/components/youtube-video.md +1 -2
  272. package/package.json +48 -48
@@ -1,10 +1,6 @@
1
- import { MediaAttachMixin } from "../../store/media-attach-mixin.js";
2
- import { getTemplateHTML } from "../background-video/template.js";
3
- import { namedNodeMapToObject } from "@videojs/utils/dom";
1
+ import { BackgroundVideoBase } from "../background-video/base.js";
4
2
  import { HlsBackgroundVideoAdapter } from "@videojs/spf/adapters/hls-background-video";
5
3
  //#region src/media/hls-background-video/adapter.ts
6
- const HTMLElementBase = globalThis.HTMLElement ?? class {};
7
- const HlsBackgroundVideoBase = MediaAttachMixin(HTMLElementBase);
8
4
  /**
9
5
  * A muted, looping, chrome-less video over the SPF background-video engine.
10
6
  *
@@ -16,8 +12,9 @@ const HlsBackgroundVideoBase = MediaAttachMixin(HTMLElementBase);
16
12
  * package, whose `audio`, `debug`, `preload`, and `max-resolution` attributes are all deliberately absent. Capping
17
13
  * which rendition is fetched is a delivery param on the URL — `?max_resolution=720p` on a Mux stream, for one — which
18
14
  * keeps the renditions it excludes out of the manifest rather than merely unpicked; `preload` would have nothing to
19
- * say, since the engine loads from the moment it has a source. And unlike `<background-video>` there are no `nomuted` /
20
- * `noloop` / `noautoplay` opt-outs: those three are what this element is for, so the adapter fixes them on at attach.
15
+ * say, since the engine loads from the moment it has a source. Muted is fixed on: the engine drops audio, so there is
16
+ * nothing to unmute. `noloop` and `noautoplay` opt out as on `<background-video>`, so a page can play the video once,
17
+ * or hold it until it has checked the motion preference.
21
18
  *
22
19
  * Takes no structured `source` — `src` is an HLS URL, as the package it replaces required. Mux playback-ID identity,
23
20
  * poster, and storyboard belong to `<mux-video>`; none of them mean anything without controls to hang them on.
@@ -39,34 +36,23 @@ const HlsBackgroundVideoBase = MediaAttachMixin(HTMLElementBase);
39
36
  * `<mux-background-video>` is this element under the name the package it replaces used. Same class, so the tag is a
40
37
  * naming choice and nothing more.
41
38
  */
42
- var HlsBackgroundVideo = class extends HlsBackgroundVideoBase {
39
+ var HlsBackgroundVideo = class extends BackgroundVideoBase {
43
40
  static {
44
- this.shadowRootOptions = { mode: "open" };
41
+ this.optOuts = ["loop", "autoplay"];
45
42
  }
46
43
  static {
47
- this.getTemplateHTML = getTemplateHTML;
48
- }
49
- static get observedAttributes() {
50
- return ["src"];
44
+ this.passthroughAttributes = [
45
+ "controls",
46
+ "controlslist",
47
+ "crossorigin"
48
+ ];
51
49
  }
52
50
  #media = new HlsBackgroundVideoAdapter();
53
51
  constructor() {
54
52
  super();
55
- if (!this.shadowRoot) {
56
- this.attachShadow(this.constructor.shadowRootOptions);
57
- const attrs = {
58
- ...namedNodeMapToObject(this.attributes),
59
- muted: "",
60
- loop: "",
61
- autoplay: "",
62
- playsinline: "",
63
- disableremoteplayback: "",
64
- disablepictureinpicture: ""
65
- };
66
- this.shadowRoot.innerHTML = getTemplateHTML(attrs);
67
- }
68
- const video = this.video;
69
- if (video) this.#media.attach(video);
53
+ const target = this.target;
54
+ if (target) this.#media.attach(target);
55
+ this.syncPlaybackDefaults();
70
56
  this.#media.addEventListener("error", () => this.dispatchEvent(new Event("error")));
71
57
  }
72
58
  /** Register the Media (not the inner `<video>`) with the provider. */
@@ -87,14 +73,9 @@ var HlsBackgroundVideo = class extends HlsBackgroundVideoBase {
87
73
  if (!this.isConnected) this.#media.destroy();
88
74
  });
89
75
  }
90
- attributeChangedCallback(name, oldValue, newValue) {
91
- if (oldValue === newValue) return;
92
- if (name === "src") this.src = newValue ?? "";
93
- }
94
- /** The inner `<video>` the engine renders into. */
76
+ /** Same element as `target`. */
95
77
  get video() {
96
- const video = this.shadowRoot?.querySelector("video");
97
- return video instanceof HTMLVideoElement ? video : null;
78
+ return this.target;
98
79
  }
99
80
  /**
100
81
  * What made the current source unplayable, or `null`. An SVTA code rather than a `MediaError` one — 99001 where this
@@ -11,7 +11,8 @@ import { translateText } from "@videojs/core/i18n";
11
11
  /**
12
12
  * Menu radio group that generates an Off `<media-menu-radio-item>` plus one per captions and subtitles track, and
13
13
  * shares the selected label and availability with an enclosing menu. An optional `<template>` holding one
14
- * `<media-menu-radio-item>` customizes each generated item.
14
+ * `<media-menu-radio-item>` customizes each generated item; its `data-part` `label` and `badge` descendants receive the
15
+ * track's text.
15
16
  */
16
17
  var CaptionsRadioGroupElement = class extends MenuRadioGroupElement {
17
18
  constructor(..._args) {
@@ -23,6 +24,8 @@ var CaptionsRadioGroupElement = class extends MenuRadioGroupElement {
23
24
  this.#i18n = new I18nController(this, i18nContext);
24
25
  this.#mediaState = new PlayerController(this, playerContext, selectTextTrack);
25
26
  this.#options = new RadioOptionsController(this, {
27
+ renderItem: (item, label, option) => this.#setContent(item, label, option.badge),
28
+ getOptionCacheKey: (option) => option.badge ?? "",
26
29
  setItemAttributes: (item, option) => item.setAttribute("data-track", option.value),
27
30
  onValueChange: (value) => {
28
31
  const media = this.#mediaState.value;
@@ -66,6 +69,16 @@ var CaptionsRadioGroupElement = class extends MenuRadioGroupElement {
66
69
  super.update(changed);
67
70
  if (state) applyStateDataAttrs(this, state, CaptionsRadioGroupDataAttrs);
68
71
  }
72
+ #setContent(item, label, badge) {
73
+ const labelPart = item.querySelector("[data-part~=\"label\"]");
74
+ const badgePart = item.querySelector("[data-part~=\"badge\"]");
75
+ if (labelPart) labelPart.textContent = label;
76
+ if (badgePart) {
77
+ badgePart.textContent = badge ?? "";
78
+ badgePart.hidden = !badge;
79
+ }
80
+ if (!labelPart && !badgePart) item.textContent = [label, badge].filter(Boolean).join(" ");
81
+ }
69
82
  };
70
83
  //#endregion
71
84
  export { CaptionsRadioGroupElement };
@@ -3,13 +3,13 @@ import { PlayerController } from "../../player/controller.js";
3
3
  import { UIElement } from "../ui-element.js";
4
4
  import { controlsContext } from "./context.js";
5
5
  import { ControlsCore, ControlsDataAttrs, POPUP_HOST_SELECTOR } from "@videojs/core";
6
- import { applyStateDataAttrs, selectControls } from "@videojs/core/dom";
6
+ import { applyStateDataAttrs, selectControls, selectPlayback } from "@videojs/core/dom";
7
7
  import { ContextProvider } from "@videojs/element/context";
8
8
  import { isFunction } from "@videojs/utils/predicate";
9
9
  //#region src/ui/controls/element.ts
10
10
  /**
11
- * Tracks controls visibility, reflects it as data attributes, and shares it with its descendant controls parts. Hiding
12
- * the controls closes any popup open inside it.
11
+ * Tracks controls visibility and whether playback has started, reflects them as data attributes, and shares them with
12
+ * its descendant controls parts. Hiding the controls closes any popup open inside it.
13
13
  */
14
14
  var ControlsElement = class extends UIElement {
15
15
  constructor(..._args) {
@@ -17,6 +17,7 @@ var ControlsElement = class extends UIElement {
17
17
  this.visibility = ControlsCore.defaultProps.visibility;
18
18
  this.#core = new ControlsCore();
19
19
  this.#mediaState = new PlayerController(this, playerContext, selectControls);
20
+ this.#playback = new PlayerController(this, playerContext, selectPlayback);
20
21
  this.#provider = new ContextProvider(this, { context: controlsContext });
21
22
  this.#visible = true;
22
23
  }
@@ -28,6 +29,7 @@ var ControlsElement = class extends UIElement {
28
29
  }
29
30
  #core;
30
31
  #mediaState;
32
+ #playback;
31
33
  #provider;
32
34
  #visible;
33
35
  connectedCallback() {
@@ -37,6 +39,7 @@ var ControlsElement = class extends UIElement {
37
39
  super.update(_changed);
38
40
  this.#core.setProps({ visibility: this.visibility });
39
41
  this.#core.setMedia(this.#mediaState.value ?? null);
42
+ this.#core.setPlayback(this.#playback.value ?? null);
40
43
  const state = this.#core.getState();
41
44
  if (!state) return;
42
45
  applyStateDataAttrs(this, state, ControlsDataAttrs);
@@ -0,0 +1,160 @@
1
+ import { playerContext } from "../../player/context.js";
2
+ import { PlayerController } from "../../player/controller.js";
3
+ import { UIElement } from "../ui-element.js";
4
+ import { sliderContext } from "../slider/context.js";
5
+ import { TimeSliderMarkerCSSVars, TimeSliderMarkerDataAttrs, TimeSliderMarkersCore, getActiveTextCues, getTextCues } from "@videojs/core";
6
+ import { applyStateDataAttrs, selectBuffer, selectTextCues, selectTime } from "@videojs/core/dom";
7
+ import { getTimeRangeEnd } from "@videojs/media";
8
+ import { ContextConsumer } from "@videojs/element/context";
9
+ import { cloneTemplateRoot, getTemplateElement, getTemplateRoot } from "@videojs/utils/dom";
10
+ import { isNil } from "@videojs/utils/predicate";
11
+ //#region src/ui/time-slider/markers.ts
12
+ /**
13
+ * Draws a marker on the time slider for each cue on the text tracks a filter matches, such as ad breaks. Pick tracks
14
+ * with the `kind`, `label`, and `language` attributes, or with the `filter` property; with neither, nothing is drawn.
15
+ * The store reads the matching tracks while the element is connected, so tracks it doesn't read by default work too.
16
+ *
17
+ * Each marker clones the light-DOM template, which must contain exactly one HTML root element, or is a `<div>` without
18
+ * one. Markers are decorative: the slider's own value is what assistive technology reads.
19
+ */
20
+ var TimeSliderMarkersElement = class extends UIElement {
21
+ static {
22
+ this.tagName = "media-time-slider-markers";
23
+ }
24
+ static {
25
+ this.properties = {
26
+ kind: { type: String },
27
+ label: { type: String },
28
+ language: { type: String }
29
+ };
30
+ }
31
+ #core = new TimeSliderMarkersCore();
32
+ #slider = new ContextConsumer(this, {
33
+ context: sliderContext,
34
+ subscribe: true
35
+ });
36
+ #textCues = new PlayerController(this, playerContext, selectTextCues);
37
+ #time = new PlayerController(this, playerContext, selectTime);
38
+ #buffer = new PlayerController(this, playerContext, selectBuffer);
39
+ #rendered = /* @__PURE__ */ new Map();
40
+ #filter;
41
+ #attributeFilter;
42
+ #watching = null;
43
+ #templateRoot = null;
44
+ #templateChecked = false;
45
+ /**
46
+ * Picks the tracks whose cues are drawn: a filter object, a function, or a track definition. Takes priority over the
47
+ * `kind`, `label`, and `language` attributes. Set as a JavaScript property; it has no attribute.
48
+ */
49
+ get filter() {
50
+ return this.#filter;
51
+ }
52
+ set filter(value) {
53
+ this.#filter = value;
54
+ this.requestUpdate();
55
+ }
56
+ connectedCallback() {
57
+ super.connectedCallback();
58
+ this.setAttribute("aria-hidden", "true");
59
+ }
60
+ disconnectedCallback() {
61
+ this.#unwatch();
62
+ super.disconnectedCallback();
63
+ }
64
+ destroyCallback() {
65
+ this.#unwatch();
66
+ super.destroyCallback();
67
+ }
68
+ willUpdate(changed) {
69
+ super.willUpdate(changed);
70
+ if (changed.has("kind") || changed.has("label") || changed.has("language")) this.#attributeFilter = this.#getAttributeFilter();
71
+ this.#watch(this.#getFilter());
72
+ }
73
+ update(changed) {
74
+ super.update(changed);
75
+ const slider = this.#slider.value;
76
+ const templateRoot = this.#getTemplateRoot();
77
+ if (!slider) return;
78
+ applyStateDataAttrs(this, slider.state, slider.stateAttrMap);
79
+ const filter = this.#getFilter();
80
+ const textCues = this.#textCues.value;
81
+ const time = this.#time.value;
82
+ const max = getTimeRangeEnd({
83
+ duration: time?.duration ?? 0,
84
+ seekable: this.#buffer.value?.seekable ?? []
85
+ });
86
+ const markers = filter && textCues ? this.#core.getMarkers({
87
+ cues: getTextCues(textCues, filter),
88
+ activeCues: getActiveTextCues(textCues, filter),
89
+ min: 0,
90
+ max,
91
+ orientation: slider.state.orientation
92
+ }) : [];
93
+ const next = /* @__PURE__ */ new Map();
94
+ for (const marker of markers) {
95
+ const root = this.#rendered.get(marker.key) ?? this.#createMarker(templateRoot);
96
+ root.style.setProperty(TimeSliderMarkerCSSVars.start, marker.startPercent);
97
+ root.style.setProperty(TimeSliderMarkerCSSVars.end, marker.endPercent);
98
+ root.style.setProperty(TimeSliderMarkerCSSVars.width, marker.width ?? marker.height ?? "0%");
99
+ applyStateDataAttrs(root, slider.state, slider.stateAttrMap);
100
+ applyStateDataAttrs(root, marker, TimeSliderMarkerDataAttrs);
101
+ next.set(marker.key, root);
102
+ }
103
+ for (const [key, root] of this.#rendered) if (!next.has(key)) root.remove();
104
+ let before = null;
105
+ for (const root of [...next.values()].reverse()) {
106
+ if (root.parentNode !== this || root.nextSibling !== before) this.insertBefore(root, before);
107
+ before = root;
108
+ }
109
+ this.#rendered.clear();
110
+ for (const [key, rendered] of next) this.#rendered.set(key, rendered);
111
+ }
112
+ #getFilter() {
113
+ return this.#filter ?? this.#attributeFilter;
114
+ }
115
+ /** A filter from the attributes that are present, or none when no attribute is. */
116
+ #getAttributeFilter() {
117
+ const { kind, label, language } = this;
118
+ if (isNil(kind) && isNil(label) && isNil(language)) return void 0;
119
+ return {
120
+ kind: kind ?? void 0,
121
+ label: label ?? void 0,
122
+ language: language ?? void 0
123
+ };
124
+ }
125
+ /** Ask the store to read the tracks the filter matches while the element is connected. */
126
+ #watch(filter) {
127
+ const watch = this.isConnected ? this.#textCues.value?.watchTextCues : void 0;
128
+ if (this.#watching?.watch === watch && this.#watching?.filter === filter) return;
129
+ this.#unwatch();
130
+ if (watch && filter) this.#watching = {
131
+ watch,
132
+ filter,
133
+ stop: watch(filter)
134
+ };
135
+ }
136
+ #unwatch() {
137
+ this.#watching?.stop();
138
+ this.#watching = null;
139
+ }
140
+ #createMarker(templateRoot) {
141
+ return templateRoot ? cloneTemplateRoot(templateRoot, this.ownerDocument) : this.ownerDocument.createElement("div");
142
+ }
143
+ /** The template's root, found once; until there is a template, other content is cleared and markers are `<div>`s. */
144
+ #getTemplateRoot() {
145
+ if (this.#templateChecked) return this.#templateRoot;
146
+ const template = getTemplateElement(this);
147
+ const rendered = new Set(this.#rendered.values());
148
+ for (const node of [...this.childNodes]) if (node !== template && !rendered.has(node)) node.remove();
149
+ if (!template) return null;
150
+ this.#templateChecked = true;
151
+ for (const node of rendered) node.remove();
152
+ this.#rendered.clear();
153
+ const root = getTemplateRoot(template);
154
+ if (root?.namespaceURI !== "http://www.w3.org/1999/xhtml") return null;
155
+ this.#templateRoot = root;
156
+ return this.#templateRoot;
157
+ }
158
+ };
159
+ //#endregion
160
+ export { TimeSliderMarkersElement };
@@ -1,7 +1,7 @@
1
1
  //#region src/version.ts
2
2
  const readVersion = () => {
3
3
  try {
4
- return "10.3.0";
4
+ return "10.4.0";
5
5
  } catch {}
6
6
  return "UNKNOWN";
7
7
  };
@@ -973,6 +973,10 @@ media-container video::-webkit-media-text-track-container {
973
973
  inset: 0;
974
974
  }
975
975
 
976
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-backdrop:not([data-started]) {
977
+ visibility: var(--media-controls-before-start, hidden);
978
+ }
979
+
976
980
  :where(:where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-buffering):not([data-visible]) .video-controls-backdrop:not([data-visible]) {
977
981
  display: none;
978
982
  }
@@ -1041,7 +1045,7 @@ media-container video::-webkit-media-text-track-container {
1041
1045
  transition-duration: .15s;
1042
1046
  transition-duration: var(--media-duration-instant);
1043
1047
  transition-timing-function: cubic-bezier(0, 0, .2, 1);
1044
- display: none;
1048
+ display: flex;
1045
1049
  position: absolute;
1046
1050
  top: 50%;
1047
1051
  left: 50%;
@@ -1087,24 +1091,18 @@ media-container video::-webkit-media-text-track-container {
1087
1091
  }
1088
1092
  }
1089
1093
 
1090
- @container media-root (width >= 22.5rem) {
1091
- :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center {
1092
- display: flex;
1093
- }
1094
- }
1095
-
1096
1094
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-button {
1097
1095
  background-color: #0006 !important;
1098
1096
  }
1099
1097
 
1100
1098
  @media (hover: hover) {
1101
1099
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-button:hover {
1102
- background-color: #000000d9 !important;
1100
+ background-color: #0009 !important;
1103
1101
  }
1104
1102
  }
1105
1103
 
1106
1104
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-button:focus-visible, :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-button[aria-expanded="true"] {
1107
- background-color: #000000d9 !important;
1105
+ background-color: #0009 !important;
1108
1106
  }
1109
1107
 
1110
1108
  @media (forced-colors: active) {
@@ -1144,11 +1142,25 @@ media-container video::-webkit-media-text-track-container {
1144
1142
  height: calc(var(--media-spacing) * 14.5) !important;
1145
1143
  }
1146
1144
 
1145
+ @container media-root (width < 22.5rem) {
1146
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-play {
1147
+ width: calc(var(--media-spacing) * 10) !important;
1148
+ height: calc(var(--media-spacing) * 10) !important;
1149
+ }
1150
+ }
1151
+
1147
1152
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-play-icon {
1148
1153
  width: calc(var(--media-spacing) * 7) !important;
1149
1154
  height: calc(var(--media-spacing) * 7) !important;
1150
1155
  }
1151
1156
 
1157
+ @container media-root (width < 22.5rem) {
1158
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-center-play-icon {
1159
+ width: calc(var(--media-spacing) * 5) !important;
1160
+ height: calc(var(--media-spacing) * 5) !important;
1161
+ }
1162
+ }
1163
+
1152
1164
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-content {
1153
1165
  pointer-events: none;
1154
1166
  z-index: 30;
@@ -1195,6 +1207,10 @@ media-container video::-webkit-media-text-track-container {
1195
1207
  position: absolute;
1196
1208
  }
1197
1209
 
1210
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-top:not([data-started]) {
1211
+ visibility: var(--media-controls-before-start, hidden);
1212
+ }
1213
+
1198
1214
  :where(:where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-content):not([data-visible]) .video-controls-top {
1199
1215
  pointer-events: none;
1200
1216
  opacity: 0;
@@ -1249,6 +1265,16 @@ media-container video::-webkit-media-text-track-container {
1249
1265
  }
1250
1266
  }
1251
1267
 
1268
+ @container not style(--media-controls-before-start: visible) {
1269
+ :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-top:not([data-started]) {
1270
+ opacity: 0;
1271
+ }
1272
+ }
1273
+
1274
+ :where(:where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-content):not([data-started]) .video-controls-video-bottom {
1275
+ visibility: var(--media-controls-before-start, hidden);
1276
+ }
1277
+
1252
1278
  @media (forced-colors: active) {
1253
1279
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-video-bottom {
1254
1280
  padding-inline: calc(var(--media-spacing) * 2);
@@ -1259,6 +1285,12 @@ media-container video::-webkit-media-text-track-container {
1259
1285
  }
1260
1286
  }
1261
1287
 
1288
+ @container not style(--media-controls-before-start: visible) {
1289
+ :where(:where(.media-skin[data-theme="compat"][data-preset="audio"]) .video-controls-content):not([data-started]) .video-controls-video-bottom {
1290
+ opacity: 0;
1291
+ }
1292
+ }
1293
+
1262
1294
  :where(.media-skin[data-theme="compat"][data-preset="audio"]) .media-time-current-value {
1263
1295
  display: none;
1264
1296
  }
@@ -1653,29 +1685,29 @@ media-container video::-webkit-media-text-track-container {
1653
1685
 
1654
1686
  @layer base.theme {
1655
1687
  .media-skin {
1656
- --media-background: oklch(0% 0 0);
1657
- --media-foreground: oklch(100% 0 0);
1658
- --media-controls: oklch(0% 0 0 / .35);
1688
+ --media-background: #000;
1689
+ --media-foreground: #fff;
1690
+ --media-controls: #00000059;
1659
1691
  --media-controls-foreground: var(--media-foreground);
1660
- --media-popover: oklch(100% 0 0 / .1);
1692
+ --media-popover: #ffffff1a;
1661
1693
  --media-popover-foreground: var(--media-foreground);
1662
1694
  --media-primary: var(--media-accent-color, var(--media-default-accent-color));
1663
1695
  --media-primary-foreground: var(--media-accent-text-color, var(--media-default-accent-text-color));
1664
- --media-accent: var(--media-accent-color, color-mix(in oklab, var(--media-default-accent-color) 10%, transparent));
1696
+ --media-accent: var(--media-accent-color, #ffffff1a);
1665
1697
  --media-accent-foreground: var(--media-accent-text-color, currentColor);
1666
- --media-muted: oklch(100% 0 0 / .15);
1667
- --media-muted-foreground: color-mix(in oklab, var(--media-foreground) 65%, transparent);
1668
- --media-border: oklch(0% 0 0 / .1);
1669
- --media-ring: oklch(100% 0 0);
1670
- --media-backdrop: oklch(0% 0 0);
1671
- --media-live-color: oklch(65% .22 27);
1672
- --media-shadow-surface: 0 1px 3px 0 oklch(0% 0 0 / .15), 0 1px 2px -1px oklch(0% 0 0 / .15);
1698
+ --media-muted: #ffffff26;
1699
+ --media-muted-foreground: #ffffffa6;
1700
+ --media-border: #0000001a;
1701
+ --media-ring: #fff;
1702
+ --media-backdrop: #000;
1703
+ --media-live-color: #f9423d;
1704
+ --media-shadow-surface: 0 1px 3px 0 #00000026, 0 1px 2px -1px #00000026;
1673
1705
  --media-shadow-surface-inset: inset 0 1px 0 0 #ffffff1a, inset 0 0 0 1px #ffffff0d;
1674
1706
  --media-shadow-thumb: 0 0 0 1px #0000001a, 0 1px 3px 0 #00000059, 0 1px 2px -1px #00000059;
1675
1707
  --media-shadow-tooltip: 0 0 0 1px var(--media-border), var(--media-shadow-surface);
1676
- --media-shadow-separator: 0 1px 0 0 oklch(100% 0 0 / .075);
1708
+ --media-shadow-separator: 0 1px 0 0 #ffffff13;
1677
1709
  --media-shadow-current-color: oklch(from currentColor 0 0 0 / clamp(0, calc((l - .5) * .5), .15));
1678
- --media-shadow-subtle-current-color: color-mix(in oklab, var(--media-shadow-current-color) 40%, transparent);
1710
+ --media-shadow-subtle-current-color: transparent;
1679
1711
  --media-text-shadow-dialog: 0 1px 0 #00000040;
1680
1712
  --media-backdrop-filter-surface: blur(16px) saturate(125%);
1681
1713
  --media-backdrop-filter-indicator: blur(8px);
@@ -1684,8 +1716,8 @@ media-container video::-webkit-media-text-track-container {
1684
1716
  --media-control-radius: 99px;
1685
1717
  --media-control-size: calc(var(--media-spacing) * 9);
1686
1718
  --media-controls-radius: var(--media-control-radius);
1687
- --media-default-accent-color: oklch(100% 0 0);
1688
- --media-default-accent-text-color: oklch(0% 0 0);
1719
+ --media-default-accent-color: #fff;
1720
+ --media-default-accent-text-color: #000;
1689
1721
  --media-duration-instant: 50ms;
1690
1722
  --media-duration-fast: .1s;
1691
1723
  --media-duration: .15s;
@@ -1722,16 +1754,31 @@ media-container video::-webkit-media-text-track-container {
1722
1754
  --media-slider-preview-label-offset: calc(var(--media-spacing) * 10.5);
1723
1755
  --media-video-border-radius: var(--media-border-radius, 28px);
1724
1756
  --media-scale: 1;
1725
- --media-scrollbar-thumb-color: color-mix(in oklab, currentColor 30%, transparent);
1757
+ --media-scrollbar-thumb-color: #80808080;
1726
1758
  --media-spacing: calc(var(--media-scale-unit, 16px) * var(--media-scale) / 4);
1727
1759
  scrollbar-color: var(--media-scrollbar-thumb-color) transparent;
1728
1760
  scrollbar-width: thin;
1729
1761
  }
1730
1762
 
1763
+ @supports (color: color-mix(in oklab, red, red)) {
1764
+ .media-skin {
1765
+ --media-accent: var(--media-accent-color, color-mix(in oklab, var(--media-default-accent-color) 10%, transparent));
1766
+ --media-muted-foreground: color-mix(in oklab, var(--media-foreground) 65%, transparent);
1767
+ --media-shadow-subtle-current-color: color-mix(in oklab, var(--media-shadow-current-color) 40%, transparent);
1768
+ --media-scrollbar-thumb-color: color-mix(in oklab, currentColor 30%, transparent);
1769
+ }
1770
+ }
1771
+
1772
+ @supports (color: oklch(0 0 0)) {
1773
+ .media-skin {
1774
+ --media-live-color: oklch(65% .22 27);
1775
+ }
1776
+ }
1777
+
1731
1778
  @supports (color: contrast-color(red)) {
1732
1779
  .media-skin {
1733
1780
  --media-primary-foreground: var(--media-accent-text-color, contrast-color(var(--media-primary)));
1734
- --media-accent-foreground: var(--media-accent-text-color, contrast-color(var(--media-accent-color, var(--media-internal-accent-text-fallback, oklch(0% 0 0)))));
1781
+ --media-accent-foreground: var(--media-accent-text-color, contrast-color(var(--media-accent-color, var(--media-internal-accent-text-fallback, #000))));
1735
1782
  }
1736
1783
  }
1737
1784
 
@@ -1778,20 +1825,20 @@ media-container video::-webkit-media-text-track-container {
1778
1825
 
1779
1826
  @layer base.preset {
1780
1827
  .media-skin:is([data-preset="audio"], [data-preset="live-audio"]) {
1781
- --media-background: oklch(100% 0 0);
1782
- --media-foreground: oklch(0% 0 0);
1783
- --media-controls: oklch(100% 0 0 / .5);
1828
+ --media-background: #fff;
1829
+ --media-foreground: #000;
1830
+ --media-controls: #ffffff80;
1784
1831
  --media-controls-foreground: var(--media-foreground);
1785
1832
  --media-popover: var(--media-controls);
1786
1833
  --media-popover-foreground: var(--media-foreground);
1787
- --media-muted: oklch(0% 0 0 / .1);
1788
- --media-surface-border: oklch(0% 0 0 / .05);
1834
+ --media-muted: #0000001a;
1835
+ --media-surface-border: #0000000d;
1789
1836
  --media-primary: var(--media-accent-color, var(--media-foreground));
1790
- --media-border: oklch(0% 0 0 / .1);
1837
+ --media-border: #0000001a;
1791
1838
  --media-ring: var(--media-foreground);
1792
- --media-default-accent-color: oklch(0% 0 0);
1793
- --media-default-accent-text-color: oklch(100% 0 0);
1794
- --media-internal-accent-text-fallback: oklch(100% 0 0);
1839
+ --media-default-accent-color: #000;
1840
+ --media-default-accent-text-color: #fff;
1841
+ --media-internal-accent-text-fallback: #fff;
1795
1842
  --media-popover-boundary-offset: calc(var(--media-spacing) * 2);
1796
1843
  --media-popover-side-offset: calc(var(--media-spacing) * 3);
1797
1844
  --media-slider-preview-label-offset: calc(var(--media-spacing) * 10);
@@ -1820,7 +1867,7 @@ media-container video::-webkit-media-text-track-container {
1820
1867
  @media (prefers-reduced-transparency: reduce), (prefers-contrast: more) {
1821
1868
  .media-skin:is([data-preset="audio"], [data-preset="live-audio"]) {
1822
1869
  --media-controls: var(--media-background);
1823
- --media-surface-border: oklch(0% 0 0 / .05);
1870
+ --media-surface-border: #0000000d;
1824
1871
  }
1825
1872
 
1826
1873
  @supports (color: light-dark(red, red)) {
@@ -1988,7 +2035,7 @@ media-container video::-webkit-media-text-track-container {
1988
2035
  @media (prefers-reduced-transparency: reduce), (prefers-contrast: more) {
1989
2036
  .media-skin {
1990
2037
  --media-popover: var(--media-background);
1991
- --media-scrollbar-thumb-color: color-mix(in oklab, currentColor 80%, transparent);
2038
+ --media-scrollbar-thumb-color: currentColor;
1992
2039
  --media-backdrop-filter-surface: none;
1993
2040
  --media-backdrop-filter-indicator: none;
1994
2041
  --media-backdrop-filter-dialog: none;
@@ -1996,6 +2043,12 @@ media-container video::-webkit-media-text-track-container {
1996
2043
  scrollbar-width: auto;
1997
2044
  }
1998
2045
 
2046
+ @supports (color: color-mix(in oklab, red, red)) {
2047
+ .media-skin {
2048
+ --media-scrollbar-thumb-color: color-mix(in oklab, currentColor 80%, transparent);
2049
+ }
2050
+ }
2051
+
1999
2052
  @supports (color: oklch(from currentColor l c h)) {
2000
2053
  .media-skin {
2001
2054
  --media-scrollbar-thumb-color: oklch(from currentColor l c h / .8);