@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.
- package/dist/default/define/audio/compat-skin.css +91 -38
- package/dist/default/define/audio/compat-skin2.js +1 -1
- package/dist/default/define/audio/neutral-skin.css +52 -31
- package/dist/default/define/audio/neutral-skin2.js +1 -1
- package/dist/default/define/audio/scaffold-skin.css +105 -40
- package/dist/default/define/audio/scaffold-skin2.js +1 -1
- package/dist/default/define/audio/skin.css +53 -31
- package/dist/default/define/audio/skin2.js +1 -1
- package/dist/default/define/live-audio/compat-skin.css +91 -38
- package/dist/default/define/live-audio/compat-skin2.js +1 -1
- package/dist/default/define/live-audio/neutral-skin.css +50 -29
- package/dist/default/define/live-audio/neutral-skin2.js +1 -1
- package/dist/default/define/live-audio/scaffold-skin.css +105 -40
- package/dist/default/define/live-audio/scaffold-skin2.js +1 -1
- package/dist/default/define/live-audio/skin.css +51 -29
- package/dist/default/define/live-audio/skin2.js +1 -1
- package/dist/default/define/live-video/compat-skin.css +142 -61
- package/dist/default/define/live-video/compat-skin2.js +1 -1
- package/dist/default/define/live-video/neutral-skin.css +241 -55
- package/dist/default/define/live-video/neutral-skin2.js +1 -1
- package/dist/default/define/live-video/scaffold-skin.css +159 -63
- package/dist/default/define/live-video/scaffold-skin2.js +1 -1
- package/dist/default/define/live-video/skin.css +245 -60
- package/dist/default/define/live-video/skin2.js +1 -1
- package/dist/default/define/ui/time-slider-markers.js +5 -0
- package/dist/default/define/video/compat-skin.css +150 -61
- package/dist/default/define/video/compat-skin2.js +1 -1
- package/dist/default/define/video/neutral-skin.css +322 -66
- package/dist/default/define/video/neutral-skin2.js +1 -1
- package/dist/default/define/video/scaffold-skin.css +168 -63
- package/dist/default/define/video/scaffold-skin2.js +1 -1
- package/dist/default/define/video/skin.css +348 -66
- package/dist/default/define/video/skin2.js +1 -1
- package/dist/default/index.js +3 -1
- package/dist/default/internal/skins/compat-audio/skin.css +91 -38
- package/dist/default/internal/skins/compat-live-audio/skin.css +91 -38
- package/dist/default/internal/skins/compat-live-video/skin.css +142 -61
- package/dist/default/internal/skins/compat-live-video/template.js +2 -0
- package/dist/default/internal/skins/compat-video/skin.css +150 -61
- package/dist/default/internal/skins/compat-video/template.js +2 -0
- package/dist/default/internal/skins/default-audio/skin.css +53 -31
- package/dist/default/internal/skins/default-live-audio/skin.css +51 -29
- package/dist/default/internal/skins/default-live-video/skin.css +245 -60
- package/dist/default/internal/skins/default-live-video/template.js +14 -0
- package/dist/default/internal/skins/default-video/register.js +3 -0
- package/dist/default/internal/skins/default-video/skin.css +348 -66
- package/dist/default/internal/skins/default-video/template.js +33 -5
- package/dist/default/internal/skins/neutral-audio/skin.css +52 -31
- package/dist/default/internal/skins/neutral-live-audio/skin.css +50 -29
- package/dist/default/internal/skins/neutral-live-video/skin.css +241 -55
- package/dist/default/internal/skins/neutral-live-video/template.js +14 -0
- package/dist/default/internal/skins/neutral-video/skin.css +322 -66
- package/dist/default/internal/skins/neutral-video/template.js +25 -11
- package/dist/default/internal/skins/scaffold-audio/skin.css +105 -40
- package/dist/default/internal/skins/scaffold-live-audio/skin.css +105 -40
- package/dist/default/internal/skins/scaffold-live-video/skin.css +159 -63
- package/dist/default/internal/skins/scaffold-live-video/template.js +2 -0
- package/dist/default/internal/skins/scaffold-video/skin.css +168 -63
- package/dist/default/internal/skins/scaffold-video/template.js +3 -1
- package/dist/default/media/background-video/adapter.js +13 -35
- package/dist/default/media/background-video/base.js +95 -0
- package/dist/default/media/background-video/template.js +13 -20
- package/dist/default/media/hls-background-video/adapter.js +16 -35
- package/dist/default/ui/captions-radio-group/element.js +14 -1
- package/dist/default/ui/controls/element.js +6 -3
- package/dist/default/ui/time-slider/markers.js +160 -0
- package/dist/default/version.js +1 -1
- package/dist/dev/define/audio/compat-skin.css +91 -38
- package/dist/dev/define/audio/compat-skin2.js +1 -1
- package/dist/dev/define/audio/compat-skin2.js.map +1 -1
- package/dist/dev/define/audio/neutral-skin.css +52 -31
- package/dist/dev/define/audio/neutral-skin2.js +1 -1
- package/dist/dev/define/audio/neutral-skin2.js.map +1 -1
- package/dist/dev/define/audio/scaffold-skin.css +105 -40
- package/dist/dev/define/audio/scaffold-skin2.js +1 -1
- package/dist/dev/define/audio/scaffold-skin2.js.map +1 -1
- package/dist/dev/define/audio/skin.css +53 -31
- package/dist/dev/define/audio/skin2.js +1 -1
- package/dist/dev/define/audio/skin2.js.map +1 -1
- package/dist/dev/define/live-audio/compat-skin.css +91 -38
- package/dist/dev/define/live-audio/compat-skin2.js +1 -1
- package/dist/dev/define/live-audio/compat-skin2.js.map +1 -1
- package/dist/dev/define/live-audio/neutral-skin.css +50 -29
- package/dist/dev/define/live-audio/neutral-skin2.js +1 -1
- package/dist/dev/define/live-audio/neutral-skin2.js.map +1 -1
- package/dist/dev/define/live-audio/scaffold-skin.css +105 -40
- package/dist/dev/define/live-audio/scaffold-skin2.js +1 -1
- package/dist/dev/define/live-audio/scaffold-skin2.js.map +1 -1
- package/dist/dev/define/live-audio/skin.css +51 -29
- package/dist/dev/define/live-audio/skin2.js +1 -1
- package/dist/dev/define/live-audio/skin2.js.map +1 -1
- package/dist/dev/define/live-video/compat-skin.css +142 -61
- package/dist/dev/define/live-video/compat-skin2.js +1 -1
- package/dist/dev/define/live-video/compat-skin2.js.map +1 -1
- package/dist/dev/define/live-video/neutral-skin.css +241 -55
- package/dist/dev/define/live-video/neutral-skin2.js +1 -1
- package/dist/dev/define/live-video/neutral-skin2.js.map +1 -1
- package/dist/dev/define/live-video/scaffold-skin.css +159 -63
- package/dist/dev/define/live-video/scaffold-skin2.js +1 -1
- package/dist/dev/define/live-video/scaffold-skin2.js.map +1 -1
- package/dist/dev/define/live-video/skin.css +245 -60
- package/dist/dev/define/live-video/skin2.js +1 -1
- package/dist/dev/define/live-video/skin2.js.map +1 -1
- package/dist/dev/define/ui/time-slider-markers.d.ts +8 -0
- package/dist/dev/define/ui/time-slider-markers.js +7 -0
- package/dist/dev/define/ui/time-slider-markers.js.map +1 -0
- package/dist/dev/define/video/compat-skin.css +150 -61
- package/dist/dev/define/video/compat-skin2.js +1 -1
- package/dist/dev/define/video/compat-skin2.js.map +1 -1
- package/dist/dev/define/video/neutral-skin.css +322 -66
- package/dist/dev/define/video/neutral-skin2.js +1 -1
- package/dist/dev/define/video/neutral-skin2.js.map +1 -1
- package/dist/dev/define/video/scaffold-skin.css +168 -63
- package/dist/dev/define/video/scaffold-skin2.js +1 -1
- package/dist/dev/define/video/scaffold-skin2.js.map +1 -1
- package/dist/dev/define/video/skin.css +348 -66
- package/dist/dev/define/video/skin2.js +1 -1
- package/dist/dev/define/video/skin2.js.map +1 -1
- package/dist/dev/index.d.ts +5 -4
- package/dist/dev/index.js +3 -1
- package/dist/dev/internal/skins/compat-audio/skin.css +91 -38
- package/dist/dev/internal/skins/compat-live-audio/skin.css +91 -38
- package/dist/dev/internal/skins/compat-live-video/skin.css +142 -61
- package/dist/dev/internal/skins/compat-live-video/template.js +2 -0
- package/dist/dev/internal/skins/compat-live-video/template.js.map +1 -1
- package/dist/dev/internal/skins/compat-video/skin.css +150 -61
- package/dist/dev/internal/skins/compat-video/template.js +2 -0
- package/dist/dev/internal/skins/compat-video/template.js.map +1 -1
- package/dist/dev/internal/skins/default-audio/skin.css +53 -31
- package/dist/dev/internal/skins/default-live-audio/skin.css +51 -29
- package/dist/dev/internal/skins/default-live-video/register.js.map +1 -1
- package/dist/dev/internal/skins/default-live-video/skin.css +245 -60
- package/dist/dev/internal/skins/default-live-video/template.js +14 -0
- package/dist/dev/internal/skins/default-live-video/template.js.map +1 -1
- package/dist/dev/internal/skins/default-video/register.d.ts +1 -0
- package/dist/dev/internal/skins/default-video/register.js +3 -0
- package/dist/dev/internal/skins/default-video/register.js.map +1 -1
- package/dist/dev/internal/skins/default-video/skin.css +348 -66
- package/dist/dev/internal/skins/default-video/template.js +33 -5
- package/dist/dev/internal/skins/default-video/template.js.map +1 -1
- package/dist/dev/internal/skins/neutral-audio/skin.css +52 -31
- package/dist/dev/internal/skins/neutral-live-audio/skin.css +50 -29
- package/dist/dev/internal/skins/neutral-live-video/register.js.map +1 -1
- package/dist/dev/internal/skins/neutral-live-video/skin.css +241 -55
- package/dist/dev/internal/skins/neutral-live-video/template.js +14 -0
- package/dist/dev/internal/skins/neutral-live-video/template.js.map +1 -1
- package/dist/dev/internal/skins/neutral-video/register.js.map +1 -1
- package/dist/dev/internal/skins/neutral-video/skin.css +322 -66
- package/dist/dev/internal/skins/neutral-video/template.js +25 -11
- package/dist/dev/internal/skins/neutral-video/template.js.map +1 -1
- package/dist/dev/internal/skins/scaffold-audio/skin.css +105 -40
- package/dist/dev/internal/skins/scaffold-live-audio/skin.css +105 -40
- package/dist/dev/internal/skins/scaffold-live-video/skin.css +159 -63
- package/dist/dev/internal/skins/scaffold-live-video/template.js +2 -0
- package/dist/dev/internal/skins/scaffold-live-video/template.js.map +1 -1
- package/dist/dev/internal/skins/scaffold-video/skin.css +168 -63
- package/dist/dev/internal/skins/scaffold-video/template.js +3 -1
- package/dist/dev/internal/skins/scaffold-video/template.js.map +1 -1
- package/dist/dev/media/background-video/adapter.d.ts +7 -13
- package/dist/dev/media/background-video/adapter.js +13 -35
- package/dist/dev/media/background-video/adapter.js.map +1 -1
- package/dist/dev/media/background-video/base.d.ts +44 -0
- package/dist/dev/media/background-video/base.js +97 -0
- package/dist/dev/media/background-video/base.js.map +1 -0
- package/dist/dev/media/background-video/template.d.ts +3 -0
- package/dist/dev/media/background-video/template.js +13 -20
- package/dist/dev/media/background-video/template.js.map +1 -1
- package/dist/dev/media/hls-background-video/adapter.d.ts +8 -18
- package/dist/dev/media/hls-background-video/adapter.js +16 -35
- package/dist/dev/media/hls-background-video/adapter.js.map +1 -1
- package/dist/dev/ui/captions-button/element.d.ts +2 -0
- package/dist/dev/ui/captions-radio-group/element.d.ts +2 -1
- package/dist/dev/ui/captions-radio-group/element.js +14 -1
- package/dist/dev/ui/captions-radio-group/element.js.map +1 -1
- package/dist/dev/ui/controls/element.d.ts +2 -2
- package/dist/dev/ui/controls/element.js +6 -3
- package/dist/dev/ui/controls/element.js.map +1 -1
- package/dist/dev/ui/time-slider/markers.d.ts +48 -0
- package/dist/dev/ui/time-slider/markers.js +165 -0
- package/dist/dev/ui/time-slider/markers.js.map +1 -0
- package/dist/dev/version.js +1 -1
- package/docs/README.md +1 -1
- package/docs/guides/autoplay.md +1 -1
- package/docs/guides/background-video.md +2 -4
- package/docs/guides/browser-support.md +22 -16
- package/docs/guides/cdn.md +9 -9
- package/docs/guides/customize-skins.md +3 -0
- package/docs/guides/installation-cdn.md +2 -2
- package/docs/guides/installation-shadcn.md +1 -1
- package/docs/guides/installation-svelte.md +2 -2
- package/docs/guides/installation-vue.md +2 -2
- package/docs/guides/installation.md +2 -2
- package/docs/guides/internationalization.md +5 -5
- package/docs/guides/keyboard-shortcuts.md +10 -0
- package/docs/guides/llms.txt +2 -1
- package/docs/guides/migrate-from-media-chrome.md +4 -4
- package/docs/guides/migrate-from-mux-player.md +6 -6
- package/docs/guides/migrate-from-plyr.md +7 -7
- package/docs/guides/migrate-from-video-js-8.md +6 -6
- package/docs/guides/migrate-from-vidstack.md +4 -4
- package/docs/guides/presets.md +4 -4
- package/docs/guides/self-hosting.md +5 -5
- package/docs/guides/skins.md +8 -7
- package/docs/guides/timed-metadata.md +318 -0
- package/docs/llms.txt +16 -2
- package/docs/reference/api/chapters-track.md +71 -0
- package/docs/reference/api/define-text-track.md +113 -0
- package/docs/reference/api/feature-text-cues.md +133 -0
- package/docs/reference/api/feature-text-tracks.md +11 -5
- package/docs/reference/api/get-active-text-cues.md +69 -0
- package/docs/reference/api/get-text-cues.md +69 -0
- package/docs/reference/api/get-text-tracks.md +41 -0
- package/docs/reference/api/hls-metadata-track.md +48 -0
- package/docs/reference/api/html-create-player.md +2 -2
- package/docs/reference/api/llms.txt +13 -1
- package/docs/reference/api/media-capabilities.md +4 -4
- package/docs/reference/api/player-store.md +9 -4
- package/docs/reference/api/preset-audio.md +3 -1
- package/docs/reference/api/preset-background.md +1 -1
- package/docs/reference/api/preset-live-audio.md +3 -1
- package/docs/reference/api/preset-live-video.md +2 -1
- package/docs/reference/api/preset-video.md +2 -1
- package/docs/reference/components/audio-compat-skin.md +1 -1
- package/docs/reference/components/audio-neutral-skin.md +1 -1
- package/docs/reference/components/audio-scaffold-skin.md +1 -1
- package/docs/reference/components/audio-skin.md +1 -1
- package/docs/reference/components/audio.md +19 -1
- package/docs/reference/components/background-video-skin.md +1 -1
- package/docs/reference/components/background-video.md +26 -11
- package/docs/reference/components/captions-radio-group.md +1 -1
- package/docs/reference/components/cloudflare-video.md +1 -1
- package/docs/reference/components/controls.md +16 -3
- package/docs/reference/components/dailymotion-video.md +2 -2
- package/docs/reference/components/dash-video.md +20 -3
- package/docs/reference/components/google-analytics.md +1 -1
- package/docs/reference/components/google-cast.md +1 -1
- package/docs/reference/components/hls-audio.md +56 -2
- package/docs/reference/components/hls-background-video.md +22 -5
- package/docs/reference/components/hls-video.md +99 -7
- package/docs/reference/components/hlsjs-video.md +52 -13
- package/docs/reference/components/live-audio-compat-skin.md +1 -1
- package/docs/reference/components/live-audio-neutral-skin.md +1 -1
- package/docs/reference/components/live-audio-scaffold-skin.md +1 -1
- package/docs/reference/components/live-audio-skin.md +1 -1
- package/docs/reference/components/live-video-compat-skin.md +5 -1
- package/docs/reference/components/live-video-neutral-skin.md +5 -1
- package/docs/reference/components/live-video-scaffold-skin.md +5 -1
- package/docs/reference/components/live-video-skin.md +5 -1
- package/docs/reference/components/llms.txt +2 -1
- package/docs/reference/components/mixcloud-audio.md +2 -2
- package/docs/reference/components/mux-audio.md +34 -3
- package/docs/reference/components/mux-background-video.md +1 -1
- package/docs/reference/components/mux-data.md +1 -1
- package/docs/reference/components/mux-video.md +17 -3
- package/docs/reference/components/native-hls-video.md +32 -3
- package/docs/reference/components/playerjs-video.md +2 -2
- package/docs/reference/components/shaka-video.md +2 -3
- package/docs/reference/components/soundcloud-audio.md +2 -2
- package/docs/reference/components/spotify-audio.md +2 -2
- package/docs/reference/components/tiktok-video.md +2 -2
- package/docs/reference/components/time-slider-markers.md +194 -0
- package/docs/reference/components/time-slider.md +14 -0
- package/docs/reference/components/twitch-video.md +1 -1
- package/docs/reference/components/video-compat-skin.md +5 -1
- package/docs/reference/components/video-neutral-skin.md +5 -1
- package/docs/reference/components/video-scaffold-skin.md +5 -1
- package/docs/reference/components/video-skin.md +5 -1
- package/docs/reference/components/video.md +19 -1
- package/docs/reference/components/vimeo-video.md +1 -2
- package/docs/reference/components/wistia-video.md +1 -1
- package/docs/reference/components/youtube-video.md +1 -2
- package/package.json +48 -48
|
@@ -1,10 +1,6 @@
|
|
|
1
|
-
import {
|
|
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.
|
|
20
|
-
* `noloop`
|
|
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
|
|
39
|
+
var HlsBackgroundVideo = class extends BackgroundVideoBase {
|
|
43
40
|
static {
|
|
44
|
-
this.
|
|
41
|
+
this.optOuts = ["loop", "autoplay"];
|
|
45
42
|
}
|
|
46
43
|
static {
|
|
47
|
-
this.
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
44
|
+
this.passthroughAttributes = [
|
|
45
|
+
"controls",
|
|
46
|
+
"controlslist",
|
|
47
|
+
"crossorigin"
|
|
48
|
+
];
|
|
51
49
|
}
|
|
52
50
|
#media = new HlsBackgroundVideoAdapter();
|
|
53
51
|
constructor() {
|
|
54
52
|
super();
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
|
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 };
|
package/dist/default/version.js
CHANGED
|
@@ -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:
|
|
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: #
|
|
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: #
|
|
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:
|
|
1657
|
-
--media-foreground:
|
|
1658
|
-
--media-controls:
|
|
1688
|
+
--media-background: #000;
|
|
1689
|
+
--media-foreground: #fff;
|
|
1690
|
+
--media-controls: #00000059;
|
|
1659
1691
|
--media-controls-foreground: var(--media-foreground);
|
|
1660
|
-
--media-popover:
|
|
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,
|
|
1696
|
+
--media-accent: var(--media-accent-color, #ffffff1a);
|
|
1665
1697
|
--media-accent-foreground: var(--media-accent-text-color, currentColor);
|
|
1666
|
-
--media-muted:
|
|
1667
|
-
--media-muted-foreground:
|
|
1668
|
-
--media-border:
|
|
1669
|
-
--media-ring:
|
|
1670
|
-
--media-backdrop:
|
|
1671
|
-
--media-live-color:
|
|
1672
|
-
--media-shadow-surface: 0 1px 3px 0
|
|
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
|
|
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:
|
|
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:
|
|
1688
|
-
--media-default-accent-text-color:
|
|
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:
|
|
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,
|
|
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:
|
|
1782
|
-
--media-foreground:
|
|
1783
|
-
--media-controls:
|
|
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:
|
|
1788
|
-
--media-surface-border:
|
|
1834
|
+
--media-muted: #0000001a;
|
|
1835
|
+
--media-surface-border: #0000000d;
|
|
1789
1836
|
--media-primary: var(--media-accent-color, var(--media-foreground));
|
|
1790
|
-
--media-border:
|
|
1837
|
+
--media-border: #0000001a;
|
|
1791
1838
|
--media-ring: var(--media-foreground);
|
|
1792
|
-
--media-default-accent-color:
|
|
1793
|
-
--media-default-accent-text-color:
|
|
1794
|
-
--media-internal-accent-text-fallback:
|
|
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:
|
|
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:
|
|
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);
|