@mattebox/player 0.1.0 → 0.2.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/README.md +4 -3
- package/dist/cdn/mattebox-player.min.js +200 -196
- package/dist/compose.d.ts +5 -0
- package/dist/compose.d.ts.map +1 -0
- package/dist/compose.js +31 -0
- package/dist/compose.js.map +1 -0
- package/dist/controls/chapters.d.ts +29 -0
- package/dist/controls/chapters.d.ts.map +1 -0
- package/dist/controls/chapters.js +81 -0
- package/dist/controls/chapters.js.map +1 -0
- package/dist/controls/cues.d.ts +8 -3
- package/dist/controls/cues.d.ts.map +1 -1
- package/dist/controls/cues.js +44 -10
- package/dist/controls/cues.js.map +1 -1
- package/dist/controls/fullscreen.d.ts +9 -9
- package/dist/controls/fullscreen.d.ts.map +1 -1
- package/dist/controls/fullscreen.js +17 -21
- package/dist/controls/fullscreen.js.map +1 -1
- package/dist/controls/icons.d.ts +1 -3
- package/dist/controls/icons.d.ts.map +1 -1
- package/dist/controls/icons.js +3 -6
- package/dist/controls/icons.js.map +1 -1
- package/dist/controls/menu.d.ts +14 -11
- package/dist/controls/menu.d.ts.map +1 -1
- package/dist/controls/menu.js +39 -34
- package/dist/controls/menu.js.map +1 -1
- package/dist/controls/session.d.ts +27 -0
- package/dist/controls/session.d.ts.map +1 -0
- package/dist/controls/session.js +36 -0
- package/dist/controls/session.js.map +1 -0
- package/dist/controls/slider.d.ts +6 -6
- package/dist/controls/slider.d.ts.map +1 -1
- package/dist/controls/slider.js +18 -13
- package/dist/controls/slider.js.map +1 -1
- package/dist/dom.d.ts +4 -10
- package/dist/dom.d.ts.map +1 -1
- package/dist/dom.js +4 -24
- package/dist/dom.js.map +1 -1
- package/dist/element-entry.d.ts +4 -0
- package/dist/element-entry.d.ts.map +1 -0
- package/dist/element-entry.js +9 -0
- package/dist/element-entry.js.map +1 -0
- package/dist/element.d.ts +54 -14
- package/dist/element.d.ts.map +1 -1
- package/dist/element.js +154 -73
- package/dist/element.js.map +1 -1
- package/dist/elements/audio-menu.d.ts +24 -0
- package/dist/elements/audio-menu.d.ts.map +1 -0
- package/dist/elements/audio-menu.js +70 -0
- package/dist/elements/audio-menu.js.map +1 -0
- package/dist/elements/chapters-menu.d.ts +12 -0
- package/dist/elements/chapters-menu.d.ts.map +1 -0
- package/dist/elements/chapters-menu.js +67 -0
- package/dist/elements/chapters-menu.js.map +1 -0
- package/dist/elements/component.d.ts +45 -0
- package/dist/elements/component.d.ts.map +1 -0
- package/dist/elements/component.js +90 -0
- package/dist/elements/component.js.map +1 -0
- package/dist/elements/control-bar.d.ts +46 -0
- package/dist/elements/control-bar.d.ts.map +1 -0
- package/dist/elements/control-bar.js +207 -0
- package/dist/elements/control-bar.js.map +1 -0
- package/dist/elements/current-time.d.ts +5 -0
- package/dist/elements/current-time.d.ts.map +1 -0
- package/dist/elements/current-time.js +27 -0
- package/dist/elements/current-time.js.map +1 -0
- package/dist/elements/drm-badge.d.ts +29 -0
- package/dist/elements/drm-badge.d.ts.map +1 -0
- package/dist/elements/drm-badge.js +145 -0
- package/dist/elements/drm-badge.js.map +1 -0
- package/dist/elements/duration.d.ts +6 -0
- package/dist/elements/duration.d.ts.map +1 -0
- package/dist/elements/duration.js +23 -0
- package/dist/elements/duration.js.map +1 -0
- package/dist/elements/error-screen.d.ts +17 -0
- package/dist/elements/error-screen.d.ts.map +1 -0
- package/dist/elements/error-screen.js +103 -0
- package/dist/elements/error-screen.js.map +1 -0
- package/dist/elements/fullscreen-button.d.ts +19 -0
- package/dist/elements/fullscreen-button.d.ts.map +1 -0
- package/dist/elements/fullscreen-button.js +55 -0
- package/dist/elements/fullscreen-button.js.map +1 -0
- package/dist/elements/live-button.d.ts +12 -0
- package/dist/elements/live-button.d.ts.map +1 -0
- package/dist/elements/live-button.js +96 -0
- package/dist/elements/live-button.js.map +1 -0
- package/dist/elements/menu-element.d.ts +22 -0
- package/dist/elements/menu-element.d.ts.map +1 -0
- package/dist/elements/menu-element.js +31 -0
- package/dist/elements/menu-element.js.map +1 -0
- package/dist/elements/mute-button.d.ts +12 -0
- package/dist/elements/mute-button.d.ts.map +1 -0
- package/dist/elements/mute-button.js +61 -0
- package/dist/elements/mute-button.js.map +1 -0
- package/dist/elements/panels.d.ts +15 -0
- package/dist/elements/panels.d.ts.map +1 -0
- package/dist/elements/panels.js +55 -0
- package/dist/elements/panels.js.map +1 -0
- package/dist/elements/pip-button.d.ts +13 -0
- package/dist/elements/pip-button.d.ts.map +1 -0
- package/dist/elements/pip-button.js +56 -0
- package/dist/elements/pip-button.js.map +1 -0
- package/dist/elements/play-button.d.ts +12 -0
- package/dist/elements/play-button.d.ts.map +1 -0
- package/dist/elements/play-button.js +60 -0
- package/dist/elements/play-button.js.map +1 -0
- package/dist/elements/quality-menu.d.ts +11 -0
- package/dist/elements/quality-menu.d.ts.map +1 -0
- package/dist/elements/quality-menu.js +72 -0
- package/dist/elements/quality-menu.js.map +1 -0
- package/dist/elements/seek-bar.d.ts +83 -0
- package/dist/elements/seek-bar.d.ts.map +1 -0
- package/dist/elements/seek-bar.js +352 -0
- package/dist/elements/seek-bar.js.map +1 -0
- package/dist/elements/shared.d.ts +27 -0
- package/dist/elements/shared.d.ts.map +1 -0
- package/dist/elements/shared.js +155 -0
- package/dist/elements/shared.js.map +1 -0
- package/dist/elements/skip-button.d.ts +14 -0
- package/dist/elements/skip-button.d.ts.map +1 -0
- package/dist/elements/skip-button.js +60 -0
- package/dist/elements/skip-button.js.map +1 -0
- package/dist/elements/spacer.d.ts +4 -0
- package/dist/elements/spacer.d.ts.map +1 -0
- package/dist/elements/spacer.js +9 -0
- package/dist/elements/spacer.js.map +1 -0
- package/dist/elements/speed-menu.d.ts +18 -0
- package/dist/elements/speed-menu.d.ts.map +1 -0
- package/dist/elements/speed-menu.js +56 -0
- package/dist/elements/speed-menu.js.map +1 -0
- package/dist/elements/start-button.d.ts +13 -0
- package/dist/elements/start-button.d.ts.map +1 -0
- package/dist/elements/start-button.js +83 -0
- package/dist/elements/start-button.js.map +1 -0
- package/dist/elements/subtitles-menu.d.ts +17 -0
- package/dist/elements/subtitles-menu.d.ts.map +1 -0
- package/dist/elements/subtitles-menu.js +108 -0
- package/dist/elements/subtitles-menu.js.map +1 -0
- package/dist/elements/time-element.d.ts +14 -0
- package/dist/elements/time-element.d.ts.map +1 -0
- package/dist/elements/time-element.js +29 -0
- package/dist/elements/time-element.js.map +1 -0
- package/dist/elements/volume-slider.d.ts +10 -0
- package/dist/elements/volume-slider.d.ts.map +1 -0
- package/dist/elements/volume-slider.js +46 -0
- package/dist/elements/volume-slider.js.map +1 -0
- package/dist/elements/volume.d.ts +9 -0
- package/dist/elements/volume.d.ts.map +1 -0
- package/dist/elements/volume.js +50 -0
- package/dist/elements/volume.js.map +1 -0
- package/dist/entries/audio-menu.d.ts +5 -0
- package/dist/entries/audio-menu.d.ts.map +1 -0
- package/dist/entries/audio-menu.js +8 -0
- package/dist/entries/audio-menu.js.map +1 -0
- package/dist/entries/chapters-menu.d.ts +5 -0
- package/dist/entries/chapters-menu.d.ts.map +1 -0
- package/dist/entries/chapters-menu.js +9 -0
- package/dist/entries/chapters-menu.js.map +1 -0
- package/dist/entries/control-bar.d.ts +5 -0
- package/dist/entries/control-bar.d.ts.map +1 -0
- package/dist/entries/control-bar.js +8 -0
- package/dist/entries/control-bar.js.map +1 -0
- package/dist/entries/current-time.d.ts +5 -0
- package/dist/entries/current-time.d.ts.map +1 -0
- package/dist/entries/current-time.js +8 -0
- package/dist/entries/current-time.js.map +1 -0
- package/dist/entries/drm-badge.d.ts +5 -0
- package/dist/entries/drm-badge.d.ts.map +1 -0
- package/dist/entries/drm-badge.js +8 -0
- package/dist/entries/drm-badge.js.map +1 -0
- package/dist/entries/duration.d.ts +5 -0
- package/dist/entries/duration.d.ts.map +1 -0
- package/dist/entries/duration.js +8 -0
- package/dist/entries/duration.js.map +1 -0
- package/dist/entries/error-screen.d.ts +5 -0
- package/dist/entries/error-screen.d.ts.map +1 -0
- package/dist/entries/error-screen.js +8 -0
- package/dist/entries/error-screen.js.map +1 -0
- package/dist/entries/fullscreen-button.d.ts +5 -0
- package/dist/entries/fullscreen-button.d.ts.map +1 -0
- package/dist/entries/fullscreen-button.js +8 -0
- package/dist/entries/fullscreen-button.js.map +1 -0
- package/dist/entries/live-button.d.ts +5 -0
- package/dist/entries/live-button.d.ts.map +1 -0
- package/dist/entries/live-button.js +8 -0
- package/dist/entries/live-button.js.map +1 -0
- package/dist/entries/mute-button.d.ts +5 -0
- package/dist/entries/mute-button.d.ts.map +1 -0
- package/dist/entries/mute-button.js +8 -0
- package/dist/entries/mute-button.js.map +1 -0
- package/dist/entries/panels.d.ts +5 -0
- package/dist/entries/panels.d.ts.map +1 -0
- package/dist/entries/panels.js +8 -0
- package/dist/entries/panels.js.map +1 -0
- package/dist/entries/pip-button.d.ts +5 -0
- package/dist/entries/pip-button.d.ts.map +1 -0
- package/dist/entries/pip-button.js +8 -0
- package/dist/entries/pip-button.js.map +1 -0
- package/dist/entries/play-button.d.ts +5 -0
- package/dist/entries/play-button.d.ts.map +1 -0
- package/dist/entries/play-button.js +8 -0
- package/dist/entries/play-button.js.map +1 -0
- package/dist/entries/quality-menu.d.ts +5 -0
- package/dist/entries/quality-menu.d.ts.map +1 -0
- package/dist/entries/quality-menu.js +8 -0
- package/dist/entries/quality-menu.js.map +1 -0
- package/dist/entries/seek-bar.d.ts +5 -0
- package/dist/entries/seek-bar.d.ts.map +1 -0
- package/dist/entries/seek-bar.js +8 -0
- package/dist/entries/seek-bar.js.map +1 -0
- package/dist/entries/skip-button.d.ts +5 -0
- package/dist/entries/skip-button.d.ts.map +1 -0
- package/dist/entries/skip-button.js +8 -0
- package/dist/entries/skip-button.js.map +1 -0
- package/dist/entries/spacer.d.ts +5 -0
- package/dist/entries/spacer.d.ts.map +1 -0
- package/dist/entries/spacer.js +8 -0
- package/dist/entries/spacer.js.map +1 -0
- package/dist/entries/speed-menu.d.ts +5 -0
- package/dist/entries/speed-menu.d.ts.map +1 -0
- package/dist/entries/speed-menu.js +8 -0
- package/dist/entries/speed-menu.js.map +1 -0
- package/dist/entries/start-button.d.ts +5 -0
- package/dist/entries/start-button.d.ts.map +1 -0
- package/dist/entries/start-button.js +8 -0
- package/dist/entries/start-button.js.map +1 -0
- package/dist/entries/subtitles-menu.d.ts +5 -0
- package/dist/entries/subtitles-menu.d.ts.map +1 -0
- package/dist/entries/subtitles-menu.js +8 -0
- package/dist/entries/subtitles-menu.js.map +1 -0
- package/dist/entries/volume-slider.d.ts +5 -0
- package/dist/entries/volume-slider.d.ts.map +1 -0
- package/dist/entries/volume-slider.js +8 -0
- package/dist/entries/volume-slider.js.map +1 -0
- package/dist/entries/volume.d.ts +7 -0
- package/dist/entries/volume.d.ts.map +1 -0
- package/dist/entries/volume.js +10 -0
- package/dist/entries/volume.js.map +1 -0
- package/dist/es2015/compose.js +33 -0
- package/dist/es2015/controls/chapters.js +61 -0
- package/dist/es2015/controls/cues.js +39 -11
- package/dist/es2015/controls/fullscreen.js +25 -23
- package/dist/es2015/controls/icons.js +5 -9
- package/dist/es2015/controls/menu.js +39 -35
- package/dist/es2015/controls/session.js +40 -0
- package/dist/es2015/controls/slider.js +18 -13
- package/dist/es2015/controls/time.js +1 -5
- package/dist/es2015/dom.js +5 -25
- package/dist/es2015/element-entry.js +10 -0
- package/dist/es2015/element.js +118 -65
- package/dist/es2015/elements/audio-menu.js +68 -0
- package/dist/es2015/elements/chapters-menu.js +68 -0
- package/dist/es2015/elements/component.js +84 -0
- package/dist/es2015/elements/control-bar.js +178 -0
- package/dist/es2015/elements/current-time.js +27 -0
- package/dist/es2015/elements/drm-badge.js +138 -0
- package/dist/es2015/elements/duration.js +23 -0
- package/dist/es2015/elements/error-screen.js +97 -0
- package/dist/es2015/elements/fullscreen-button.js +49 -0
- package/dist/es2015/elements/live-button.js +97 -0
- package/dist/es2015/elements/menu-element.js +39 -0
- package/dist/es2015/elements/mute-button.js +60 -0
- package/dist/es2015/elements/panels.js +52 -0
- package/dist/es2015/elements/pip-button.js +56 -0
- package/dist/es2015/elements/play-button.js +68 -0
- package/dist/es2015/elements/quality-menu.js +68 -0
- package/dist/es2015/elements/seek-bar.js +314 -0
- package/dist/es2015/elements/shared.js +155 -0
- package/dist/es2015/elements/skip-button.js +59 -0
- package/dist/es2015/elements/spacer.js +11 -0
- package/dist/es2015/elements/speed-menu.js +60 -0
- package/dist/es2015/elements/start-button.js +87 -0
- package/dist/es2015/elements/subtitles-menu.js +103 -0
- package/dist/es2015/elements/time-element.js +38 -0
- package/dist/es2015/elements/volume-slider.js +47 -0
- package/dist/es2015/elements/volume.js +50 -0
- package/dist/es2015/entries/audio-menu.js +7 -0
- package/dist/es2015/entries/chapters-menu.js +7 -0
- package/dist/es2015/entries/control-bar.js +7 -0
- package/dist/es2015/entries/current-time.js +7 -0
- package/dist/es2015/entries/drm-badge.js +7 -0
- package/dist/es2015/entries/duration.js +7 -0
- package/dist/es2015/entries/error-screen.js +7 -0
- package/dist/es2015/entries/fullscreen-button.js +7 -0
- package/dist/es2015/entries/live-button.js +7 -0
- package/dist/es2015/entries/mute-button.js +7 -0
- package/dist/es2015/entries/panels.js +7 -0
- package/dist/es2015/entries/pip-button.js +7 -0
- package/dist/es2015/entries/play-button.js +7 -0
- package/dist/es2015/entries/quality-menu.js +7 -0
- package/dist/es2015/entries/seek-bar.js +7 -0
- package/dist/es2015/entries/skip-button.js +7 -0
- package/dist/es2015/entries/spacer.js +7 -0
- package/dist/es2015/entries/speed-menu.js +7 -0
- package/dist/es2015/entries/start-button.js +7 -0
- package/dist/es2015/entries/subtitles-menu.js +7 -0
- package/dist/es2015/entries/volume-slider.js +7 -0
- package/dist/es2015/entries/volume.js +9 -0
- package/dist/es2015/host.js +23 -0
- package/dist/es2015/index.js +46 -9
- package/dist/es2015/labels.js +14 -0
- package/dist/es2015/style.js +21 -294
- package/dist/es2015/{panels/error.js → surface.js} +3 -3
- package/dist/es2015/tags.js +27 -0
- package/dist/host.d.ts +26 -0
- package/dist/host.d.ts.map +1 -0
- package/dist/host.js +23 -0
- package/dist/host.js.map +1 -0
- package/dist/index.d.ts +81 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -8
- package/dist/index.js.map +1 -1
- package/dist/labels.d.ts +7 -0
- package/dist/labels.d.ts.map +1 -0
- package/dist/labels.js +12 -0
- package/dist/labels.js.map +1 -0
- package/dist/style.d.ts +4 -2
- package/dist/style.d.ts.map +1 -1
- package/dist/style.js +21 -294
- package/dist/style.js.map +1 -1
- package/dist/surface.d.ts +15 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/{panels/error.js → surface.js} +3 -3
- package/dist/surface.js.map +1 -0
- package/dist/tags.d.ts +25 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.js +25 -0
- package/dist/tags.js.map +1 -0
- package/package.json +22 -2
- package/dist/controls/bar.d.ts +0 -56
- package/dist/controls/bar.d.ts.map +0 -1
- package/dist/controls/bar.js +0 -245
- package/dist/controls/bar.js.map +0 -1
- package/dist/controls/buttons.d.ts +0 -13
- package/dist/controls/buttons.d.ts.map +0 -1
- package/dist/controls/buttons.js +0 -157
- package/dist/controls/buttons.js.map +0 -1
- package/dist/controls/control.d.ts +0 -12
- package/dist/controls/control.d.ts.map +0 -1
- package/dist/controls/control.js +0 -2
- package/dist/controls/control.js.map +0 -1
- package/dist/controls/keys.d.ts +0 -26
- package/dist/controls/keys.d.ts.map +0 -1
- package/dist/controls/keys.js +0 -66
- package/dist/controls/keys.js.map +0 -1
- package/dist/controls/live.d.ts +0 -10
- package/dist/controls/live.d.ts.map +0 -1
- package/dist/controls/live.js +0 -59
- package/dist/controls/live.js.map +0 -1
- package/dist/controls/menus.d.ts +0 -43
- package/dist/controls/menus.d.ts.map +0 -1
- package/dist/controls/menus.js +0 -262
- package/dist/controls/menus.js.map +0 -1
- package/dist/controls/options.d.ts +0 -44
- package/dist/controls/options.d.ts.map +0 -1
- package/dist/controls/options.js +0 -54
- package/dist/controls/options.js.map +0 -1
- package/dist/controls/screens.d.ts +0 -22
- package/dist/controls/screens.d.ts.map +0 -1
- package/dist/controls/screens.js +0 -69
- package/dist/controls/screens.js.map +0 -1
- package/dist/controls/seek.d.ts +0 -52
- package/dist/controls/seek.d.ts.map +0 -1
- package/dist/controls/seek.js +0 -215
- package/dist/controls/seek.js.map +0 -1
- package/dist/controls/speed.d.ts +0 -8
- package/dist/controls/speed.d.ts.map +0 -1
- package/dist/controls/speed.js +0 -34
- package/dist/controls/speed.js.map +0 -1
- package/dist/controls/volume.d.ts +0 -8
- package/dist/controls/volume.d.ts.map +0 -1
- package/dist/controls/volume.js +0 -29
- package/dist/controls/volume.js.map +0 -1
- package/dist/es2015/controls/bar.js +0 -227
- package/dist/es2015/controls/buttons.js +0 -146
- package/dist/es2015/controls/keys.js +0 -60
- package/dist/es2015/controls/live.js +0 -60
- package/dist/es2015/controls/menus.js +0 -258
- package/dist/es2015/controls/options.js +0 -46
- package/dist/es2015/controls/screens.js +0 -74
- package/dist/es2015/controls/seek.js +0 -203
- package/dist/es2015/controls/speed.js +0 -41
- package/dist/es2015/controls/volume.js +0 -30
- package/dist/es2015/panels/drm.js +0 -29
- package/dist/es2015/panels/live.js +0 -48
- package/dist/es2015/panels/quality.js +0 -52
- package/dist/es2015/panels/tracks.js +0 -47
- package/dist/panels/drm.d.ts +0 -8
- package/dist/panels/drm.d.ts.map +0 -1
- package/dist/panels/drm.js +0 -36
- package/dist/panels/drm.js.map +0 -1
- package/dist/panels/error.d.ts +0 -13
- package/dist/panels/error.d.ts.map +0 -1
- package/dist/panels/error.js.map +0 -1
- package/dist/panels/live.d.ts +0 -3
- package/dist/panels/live.d.ts.map +0 -1
- package/dist/panels/live.js +0 -56
- package/dist/panels/live.js.map +0 -1
- package/dist/panels/panel.d.ts +0 -13
- package/dist/panels/panel.d.ts.map +0 -1
- package/dist/panels/panel.js +0 -2
- package/dist/panels/panel.js.map +0 -1
- package/dist/panels/quality.d.ts +0 -3
- package/dist/panels/quality.d.ts.map +0 -1
- package/dist/panels/quality.js +0 -59
- package/dist/panels/quality.js.map +0 -1
- package/dist/panels/tracks.d.ts +0 -3
- package/dist/panels/tracks.d.ts.map +0 -1
- package/dist/panels/tracks.js +0 -49
- package/dist/panels/tracks.js.map +0 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { MenuElement, single } from './menu-element.js';
|
|
2
|
+
import { show } from './shared.js';
|
|
3
|
+
/** The language, then the role, then the id: whichever the manifest gave. */
|
|
4
|
+
export function trackLabel(track) {
|
|
5
|
+
const parts = [track.lang, track.role].filter((part) => part !== undefined);
|
|
6
|
+
return parts.length === 0 ? track.id : parts.join(' · ');
|
|
7
|
+
}
|
|
8
|
+
/** The tracks of one content type as menu items, with the active one's id. */
|
|
9
|
+
export function trackItems(engine, contentType) {
|
|
10
|
+
const tracks = engine.tracks;
|
|
11
|
+
const available = tracks.available.filter((track) => track.contentType === contentType);
|
|
12
|
+
const items = [];
|
|
13
|
+
for (const track of available)
|
|
14
|
+
items.push([track.id, trackLabel(track)]);
|
|
15
|
+
return [items, tracks.active(contentType)?.id ?? null];
|
|
16
|
+
}
|
|
17
|
+
/** Subscribes `tick` to the track events, and answers the unsubscribe. */
|
|
18
|
+
export function onTracks(engine, tick) {
|
|
19
|
+
const offs = [engine.on('tracks:changed', tick), engine.on('tracks:selected', tick)];
|
|
20
|
+
return () => {
|
|
21
|
+
for (const off of offs)
|
|
22
|
+
off();
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
export class MbxAudioMenu extends MenuElement {
|
|
26
|
+
static get observedAttributes() {
|
|
27
|
+
return ['label', 'label-back'];
|
|
28
|
+
}
|
|
29
|
+
constructor() {
|
|
30
|
+
super(...single('music'));
|
|
31
|
+
this.engine = null;
|
|
32
|
+
show(this.slots, 'default');
|
|
33
|
+
}
|
|
34
|
+
name() {
|
|
35
|
+
return 'Audio';
|
|
36
|
+
}
|
|
37
|
+
attach(player) {
|
|
38
|
+
this.follow(player, (engine) => {
|
|
39
|
+
this.engine = engine;
|
|
40
|
+
this.render();
|
|
41
|
+
if (engine === null)
|
|
42
|
+
return undefined;
|
|
43
|
+
return onTracks(engine, () => {
|
|
44
|
+
this.render();
|
|
45
|
+
});
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
render() {
|
|
49
|
+
super.render();
|
|
50
|
+
const engine = this.engine;
|
|
51
|
+
if (engine === null) {
|
|
52
|
+
this.hidden = true;
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
const [items, active] = trackItems(engine, 'audio');
|
|
56
|
+
this.menu.fill([
|
|
57
|
+
{
|
|
58
|
+
name: 'track',
|
|
59
|
+
items,
|
|
60
|
+
value: active ?? '',
|
|
61
|
+
onSelect: (value) => {
|
|
62
|
+
engine.tracks.select(value);
|
|
63
|
+
this.render();
|
|
64
|
+
},
|
|
65
|
+
},
|
|
66
|
+
]);
|
|
67
|
+
this.hidden = items.length < 2;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=audio-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"audio-menu.js","sourceRoot":"","sources":["../../src/elements/audio-menu.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { PlayerHost } from '../host.js';
|
|
2
|
+
import { MenuElement } from './menu-element.js';
|
|
3
|
+
export declare class MbxChaptersMenu extends MenuElement {
|
|
4
|
+
static get observedAttributes(): readonly string[];
|
|
5
|
+
/** What the last fill drew, so a cue change inside the same chapter leaves the popup alone. */
|
|
6
|
+
private drawn;
|
|
7
|
+
constructor();
|
|
8
|
+
protected name(): string;
|
|
9
|
+
protected attach(player: PlayerHost): void;
|
|
10
|
+
protected render(): void;
|
|
11
|
+
}
|
|
12
|
+
//# sourceMappingURL=chapters-menu.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chapters-menu.d.ts","sourceRoot":"","sources":["../../src/elements/chapters-menu.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAU,MAAM,mBAAmB,CAAC;AAGxD,qBAAa,eAAgB,SAAQ,WAAW;IAC9C,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAED,+FAA+F;IAC/F,QAAgB,KAAK,CAAS;;cAQX,IAAI,IAAI,MAAM;cAId,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;cAYhC,MAAM,IAAI,IAAI;CA2BlC"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <mbx-chapters-menu>: the chapters of the video as a list, each with its
|
|
3
|
+
* start time, the one the playhead is in checked; choosing one seeks to its
|
|
4
|
+
* start. The chapters are the video's own chapters text track, from the
|
|
5
|
+
* player's `chapters` attribute or a `<track>` the page put there, so the
|
|
6
|
+
* menu works for every session, native included, and hides while the
|
|
7
|
+
* video has none. The name comes from `label`.
|
|
8
|
+
*/
|
|
9
|
+
import { chapterAt, chapters, followChapters } from '../controls/chapters.js';
|
|
10
|
+
import { format } from '../controls/time.js';
|
|
11
|
+
import { MenuElement, single } from './menu-element.js';
|
|
12
|
+
import { show } from './shared.js';
|
|
13
|
+
export class MbxChaptersMenu extends MenuElement {
|
|
14
|
+
static get observedAttributes() {
|
|
15
|
+
return ['label', 'label-back'];
|
|
16
|
+
}
|
|
17
|
+
constructor() {
|
|
18
|
+
super(...single('chapters'));
|
|
19
|
+
this.drawn = '';
|
|
20
|
+
show(this.slots, 'default');
|
|
21
|
+
}
|
|
22
|
+
name() {
|
|
23
|
+
return 'Chapters';
|
|
24
|
+
}
|
|
25
|
+
attach(player) {
|
|
26
|
+
const tick = () => {
|
|
27
|
+
this.render();
|
|
28
|
+
};
|
|
29
|
+
this.keep(followChapters(player.video, tick));
|
|
30
|
+
// The clock too: WebKit fires no `cuechange` for a hidden track, and the
|
|
31
|
+
// render is a no-op while the chapter is the same.
|
|
32
|
+
this.listen(player.video, ['timeupdate', 'seeked', 'emptied', 'loadedmetadata'], tick);
|
|
33
|
+
this.listen(player, ['sourcechange'], tick);
|
|
34
|
+
this.render();
|
|
35
|
+
}
|
|
36
|
+
render() {
|
|
37
|
+
super.render();
|
|
38
|
+
const video = this.player?.video;
|
|
39
|
+
if (video === undefined)
|
|
40
|
+
return;
|
|
41
|
+
const list = chapters(video);
|
|
42
|
+
this.hidden = list.length === 0;
|
|
43
|
+
const current = String(chapterAt(list, video.currentTime));
|
|
44
|
+
const items = list.map((chapter, i) => [
|
|
45
|
+
String(i),
|
|
46
|
+
chapter.title,
|
|
47
|
+
format(chapter.start),
|
|
48
|
+
]);
|
|
49
|
+
const key = `${current}|${items.map(([, title, start]) => `${start} ${title}`).join('\n')}`;
|
|
50
|
+
if (key === this.drawn)
|
|
51
|
+
return;
|
|
52
|
+
this.drawn = key;
|
|
53
|
+
this.menu.fill([
|
|
54
|
+
{
|
|
55
|
+
name: 'chapter',
|
|
56
|
+
items,
|
|
57
|
+
value: current,
|
|
58
|
+
onSelect: (value) => {
|
|
59
|
+
const chapter = list[Number(value)];
|
|
60
|
+
if (chapter !== undefined)
|
|
61
|
+
video.currentTime = chapter.start;
|
|
62
|
+
},
|
|
63
|
+
},
|
|
64
|
+
]);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=chapters-menu.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"chapters-menu.js","sourceRoot":"","sources":["../../src/elements/chapters-menu.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAC9E,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAE7C,OAAO,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,mBAAmB,CAAC;AACxD,OAAO,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAEnC,MAAM,OAAO,eAAgB,SAAQ,WAAW;IAC9C,MAAM,KAAK,kBAAkB;QAC3B,OAAO,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;IACjC,CAAC;IAKD;QACE,KAAK,CAAC,GAAG,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC;QAC7B,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IAC9B,CAAC;IAEkB,IAAI;QACrB,OAAO,UAAU,CAAC;IACpB,CAAC;IAEkB,MAAM,CAAC,MAAkB;QAC1C,MAAM,IAAI,GAAG,GAAS,EAAE;YACtB,IAAI,CAAC,MAAM,EAAE,CAAC;QAChB,CAAC,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QAC9C,yEAAyE;QACzE,mDAAmD;QACnD,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;QACvF,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,CAAC,cAAc,CAAC,EAAE,IAAI,CAAC,CAAC;QAC5C,IAAI,CAAC,MAAM,EAAE,CAAC;IAChB,CAAC;IAEkB,MAAM;QACvB,KAAK,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC;QACjC,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO;QAChC,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;QAChC,MAAM,OAAO,GAAG,MAAM,CAAC,SAAS,CAAC,IAAI,EAAE,KAAK,CAAC,WAAW,CAAC,CAAC,CAAC;QAC3D,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,EAAqC,EAAE,CAAC;YACxE,MAAM,CAAC,CAAC,CAAC;YACT,OAAO,CAAC,KAAK;YACb,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;SACtB,CAAC,CAAC;QACH,MAAM,GAAG,GAAG,GAAG,OAAO,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,KAAK,IAAI,KAAK,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5F,IAAI,GAAG,KAAK,IAAI,CAAC,KAAK;YAAE,OAAO;QAC/B,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC;QACjB,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC;YACb;gBACE,IAAI,EAAE,SAAS;gBACf,KAAK;gBACL,KAAK,EAAE,OAAO;gBACd,QAAQ,EAAE,CAAC,KAAK,EAAE,EAAE;oBAClB,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oBACpC,IAAI,OAAO,KAAK,SAAS;wBAAE,KAAK,CAAC,WAAW,GAAG,OAAO,CAAC,KAAK,CAAC;gBAC/D,CAAC;aACF;SACF,CAAC,CAAC;IACL,CAAC;CACF"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What every control shares: finding its player, and letting go of it.
|
|
3
|
+
*
|
|
4
|
+
* A control attaches when it is connected inside a player, once the player
|
|
5
|
+
* is defined and upgraded, and detaches when it is removed. Every listener
|
|
6
|
+
* a control adds goes through `listen`, so detaching drops them all. A
|
|
7
|
+
* control connected outside a player is inert. Moving one to another
|
|
8
|
+
* player detaches and attaches again, so a framework that reorders
|
|
9
|
+
* children is safe.
|
|
10
|
+
*
|
|
11
|
+
* No class fields: the ES2015 build would lower them into helpers, and the
|
|
12
|
+
* emit check bans helpers. State is declared, then assigned in the
|
|
13
|
+
* constructor.
|
|
14
|
+
*/
|
|
15
|
+
import type { Mattebox } from 'mattebox';
|
|
16
|
+
import type { PlayerHost } from '../host.js';
|
|
17
|
+
export declare abstract class Component extends HTMLElement {
|
|
18
|
+
protected player: PlayerHost | null;
|
|
19
|
+
private offs;
|
|
20
|
+
/** Bumped on every connect and disconnect, so a late upgrade attaches only to the current connection. */
|
|
21
|
+
private epoch;
|
|
22
|
+
constructor();
|
|
23
|
+
connectedCallback(): void;
|
|
24
|
+
disconnectedCallback(): void;
|
|
25
|
+
attributeChangedCallback(): void;
|
|
26
|
+
/** Adds `fn` for every name on `target`, to be removed on detach. */
|
|
27
|
+
protected listen(target: EventTarget, names: readonly string[], fn: () => void): void;
|
|
28
|
+
/** Keeps `off` to run on detach. */
|
|
29
|
+
protected keep(off: () => void): void;
|
|
30
|
+
/**
|
|
31
|
+
* Runs `fn` over the current engine now and on every session change,
|
|
32
|
+
* running what the last call returned first, so a control's engine
|
|
33
|
+
* subscriptions live exactly as long as the session. Detach runs it too.
|
|
34
|
+
*/
|
|
35
|
+
protected follow(player: PlayerHost, fn: (engine: Mattebox | null) => (() => void) | undefined): void;
|
|
36
|
+
/** Runs `fn` when any of `names` changes on `target`, until detach. */
|
|
37
|
+
protected observe(target: Element, names: readonly string[], fn: () => void): void;
|
|
38
|
+
/** The control is connected inside an upgraded player. Subscribe and render. */
|
|
39
|
+
protected abstract attach(player: PlayerHost): void;
|
|
40
|
+
/** The control left its player. Listeners are already gone; undo anything else. */
|
|
41
|
+
protected detach(_player: PlayerHost): void;
|
|
42
|
+
/** Draws the current state. Called on every observed attribute change while attached. */
|
|
43
|
+
protected render(): void;
|
|
44
|
+
}
|
|
45
|
+
//# sourceMappingURL=component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.d.ts","sourceRoot":"","sources":["../../src/elements/component.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAI7C,8BAAsB,SAAU,SAAQ,WAAW;IACjD,UAAkB,MAAM,EAAE,UAAU,GAAG,IAAI,CAAC;IAC5C,QAAgB,IAAI,CAAoB;IACxC,yGAAyG;IACzG,QAAgB,KAAK,CAAS;;IAS9B,iBAAiB,IAAI,IAAI;IAiBzB,oBAAoB,IAAI,IAAI;IAU5B,wBAAwB,IAAI,IAAI;IAIhC,qEAAqE;IACrE,SAAS,CAAC,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAOrF,oCAAoC;IACpC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,IAAI,GAAG,IAAI;IAIrC;;;;OAIG;IACH,SAAS,CAAC,MAAM,CACd,MAAM,EAAE,UAAU,EAClB,EAAE,EAAE,CAAC,MAAM,EAAE,QAAQ,GAAG,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,GAAG,SAAS,GACxD,IAAI;IAcP,uEAAuE;IACvE,SAAS,CAAC,OAAO,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,IAAI,GAAG,IAAI;IAQlF,gFAAgF;IAChF,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;IAEnD,mFAAmF;IACnF,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,UAAU,GAAG,IAAI;IAE3C,yFAAyF;IACzF,SAAS,CAAC,MAAM,IAAI,IAAI;CACzB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { findPlayer } from '../host.js';
|
|
2
|
+
import { PLAYER } from '../tags.js';
|
|
3
|
+
export class Component extends HTMLElement {
|
|
4
|
+
constructor() {
|
|
5
|
+
super();
|
|
6
|
+
this.player = null;
|
|
7
|
+
this.offs = [];
|
|
8
|
+
this.epoch = 0;
|
|
9
|
+
}
|
|
10
|
+
connectedCallback() {
|
|
11
|
+
const found = findPlayer(this);
|
|
12
|
+
if (found === null)
|
|
13
|
+
return;
|
|
14
|
+
this.epoch += 1;
|
|
15
|
+
const epoch = this.epoch;
|
|
16
|
+
const attach = () => {
|
|
17
|
+
if (epoch !== this.epoch || !this.isConnected)
|
|
18
|
+
return;
|
|
19
|
+
// Defined, and this instance upgraded: `video` is on the prototype.
|
|
20
|
+
customElements.upgrade(found);
|
|
21
|
+
if (!('video' in found))
|
|
22
|
+
return;
|
|
23
|
+
this.player = found;
|
|
24
|
+
this.attach(this.player);
|
|
25
|
+
};
|
|
26
|
+
if ('video' in found)
|
|
27
|
+
attach();
|
|
28
|
+
else
|
|
29
|
+
void customElements.whenDefined(PLAYER).then(attach);
|
|
30
|
+
}
|
|
31
|
+
disconnectedCallback() {
|
|
32
|
+
this.epoch += 1;
|
|
33
|
+
for (const off of this.offs)
|
|
34
|
+
off();
|
|
35
|
+
this.offs = [];
|
|
36
|
+
const player = this.player;
|
|
37
|
+
if (player === null)
|
|
38
|
+
return;
|
|
39
|
+
this.player = null;
|
|
40
|
+
this.detach(player);
|
|
41
|
+
}
|
|
42
|
+
attributeChangedCallback() {
|
|
43
|
+
if (this.player !== null)
|
|
44
|
+
this.render();
|
|
45
|
+
}
|
|
46
|
+
/** Adds `fn` for every name on `target`, to be removed on detach. */
|
|
47
|
+
listen(target, names, fn) {
|
|
48
|
+
for (const name of names)
|
|
49
|
+
target.addEventListener(name, fn);
|
|
50
|
+
this.offs.push(() => {
|
|
51
|
+
for (const name of names)
|
|
52
|
+
target.removeEventListener(name, fn);
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
/** Keeps `off` to run on detach. */
|
|
56
|
+
keep(off) {
|
|
57
|
+
this.offs.push(off);
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Runs `fn` over the current engine now and on every session change,
|
|
61
|
+
* running what the last call returned first, so a control's engine
|
|
62
|
+
* subscriptions live exactly as long as the session. Detach runs it too.
|
|
63
|
+
*/
|
|
64
|
+
follow(player, fn) {
|
|
65
|
+
let off;
|
|
66
|
+
const run = () => {
|
|
67
|
+
off?.();
|
|
68
|
+
off = fn(player.engine);
|
|
69
|
+
};
|
|
70
|
+
this.listen(player, ['sourcechange'], run);
|
|
71
|
+
this.offs.push(() => {
|
|
72
|
+
off?.();
|
|
73
|
+
off = undefined;
|
|
74
|
+
});
|
|
75
|
+
run();
|
|
76
|
+
}
|
|
77
|
+
/** Runs `fn` when any of `names` changes on `target`, until detach. */
|
|
78
|
+
observe(target, names, fn) {
|
|
79
|
+
const observer = new MutationObserver(fn);
|
|
80
|
+
observer.observe(target, { attributes: true, attributeFilter: [...names] });
|
|
81
|
+
this.offs.push(() => {
|
|
82
|
+
observer.disconnect();
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/** The control left its player. Listeners are already gone; undo anything else. */
|
|
86
|
+
detach(_player) { }
|
|
87
|
+
/** Draws the current state. Called on every observed attribute change while attached. */
|
|
88
|
+
render() { }
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"component.js","sourceRoot":"","sources":["../../src/elements/component.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <mbx-control-bar>: an overlay over the bottom of the video that lays its
|
|
3
|
+
* children out in two rows, the seek row over the buttons row. A child
|
|
4
|
+
* with `slot="seek"` sits in the seek row; everything else in the buttons
|
|
5
|
+
* row, in its order, and an <mbx-spacer> pushes what follows to the right.
|
|
6
|
+
*
|
|
7
|
+
* The bar owns what no one control can: the idle fade, the shortcuts, the
|
|
8
|
+
* click on the video, and the subtitles lifted above it. It sets `idle` on
|
|
9
|
+
* itself and on the player while it hides.
|
|
10
|
+
*
|
|
11
|
+
* The fade is one timer. Any activity, a pointer moving or pressing, a
|
|
12
|
+
* key, playback starting, re-arms it for `idle-ms`, and when it fires the
|
|
13
|
+
* bar hides unless something it can know for certain holds it: the video
|
|
14
|
+
* is paused, a descendant carries `open`, or keyboard focus is inside it,
|
|
15
|
+
* where keyboard means the last input was a key and not a pointer.
|
|
16
|
+
* Whether the pointer is over the player is never tracked: that goes
|
|
17
|
+
* stale when the pointer leaves without a move the player sees.
|
|
18
|
+
*
|
|
19
|
+
* The shortcuts listen on the player, so they hear every key pressed
|
|
20
|
+
* inside it, and only there: Space and `k` toggle play, `m` mutes, `f`
|
|
21
|
+
* toggles fullscreen, the arrows seek by `seek-step`. Space is left to a
|
|
22
|
+
* focused button, which is its own. A click on the video toggles play.
|
|
23
|
+
* Fullscreen goes on the player itself, so the bar comes along.
|
|
24
|
+
*/
|
|
25
|
+
import type { PlayerHost } from '../host.js';
|
|
26
|
+
import { Component } from './component.js';
|
|
27
|
+
export declare class MbxControlBar extends Component {
|
|
28
|
+
static get observedAttributes(): readonly string[];
|
|
29
|
+
private readonly seekRow;
|
|
30
|
+
private timer;
|
|
31
|
+
/** Whether the last input was a key, so focus inside holds the bar. */
|
|
32
|
+
private keyboard;
|
|
33
|
+
private cues;
|
|
34
|
+
private screen;
|
|
35
|
+
constructor();
|
|
36
|
+
/** From the first row's top to the bar's bottom: what the bar covers of the picture. */
|
|
37
|
+
private covered;
|
|
38
|
+
private held;
|
|
39
|
+
private idle;
|
|
40
|
+
private sleep;
|
|
41
|
+
private wake;
|
|
42
|
+
private key;
|
|
43
|
+
protected attach(player: PlayerHost): void;
|
|
44
|
+
protected detach(player: PlayerHost): void;
|
|
45
|
+
}
|
|
46
|
+
//# sourceMappingURL=control-bar.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-bar.d.ts","sourceRoot":"","sources":["../../src/elements/control-bar.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAuC3C,qBAAa,aAAc,SAAQ,SAAS;IAC1C,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAED,iBAAyB,OAAO,CAAiB;IACjD,QAAgB,KAAK,CAA4C;IACjE,uEAAuE;IACvE,QAAgB,QAAQ,CAAU;IAClC,QAAgB,IAAI,CAAiB;IACrC,QAAgB,MAAM,CAAoB;;IAoB1C,wFAAwF;IACxF,OAAO,CAAC,OAAO;IAOf,OAAO,CAAC,IAAI;IAQZ,OAAO,CAAC,IAAI;IAOZ,OAAO,CAAC,KAAK;IAWb,OAAO,CAAC,IAAI;IAMZ,OAAO,CAAC,GAAG;cAsCQ,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;cAqChC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;CAUpD"}
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <mbx-control-bar>: an overlay over the bottom of the video that lays its
|
|
3
|
+
* children out in two rows, the seek row over the buttons row. A child
|
|
4
|
+
* with `slot="seek"` sits in the seek row; everything else in the buttons
|
|
5
|
+
* row, in its order, and an <mbx-spacer> pushes what follows to the right.
|
|
6
|
+
*
|
|
7
|
+
* The bar owns what no one control can: the idle fade, the shortcuts, the
|
|
8
|
+
* click on the video, and the subtitles lifted above it. It sets `idle` on
|
|
9
|
+
* itself and on the player while it hides.
|
|
10
|
+
*
|
|
11
|
+
* The fade is one timer. Any activity, a pointer moving or pressing, a
|
|
12
|
+
* key, playback starting, re-arms it for `idle-ms`, and when it fires the
|
|
13
|
+
* bar hides unless something it can know for certain holds it: the video
|
|
14
|
+
* is paused, a descendant carries `open`, or keyboard focus is inside it,
|
|
15
|
+
* where keyboard means the last input was a key and not a pointer.
|
|
16
|
+
* Whether the pointer is over the player is never tracked: that goes
|
|
17
|
+
* stale when the pointer leaves without a move the player sees.
|
|
18
|
+
*
|
|
19
|
+
* The shortcuts listen on the player, so they hear every key pressed
|
|
20
|
+
* inside it, and only there: Space and `k` toggle play, `m` mutes, `f`
|
|
21
|
+
* toggles fullscreen, the arrows seek by `seek-step`. Space is left to a
|
|
22
|
+
* focused button, which is its own. A click on the video toggles play.
|
|
23
|
+
* Fullscreen goes on the player itself, so the bar comes along.
|
|
24
|
+
*/
|
|
25
|
+
import { cueLift, cueStyle } from '../controls/cues.js';
|
|
26
|
+
import { fullscreen } from '../controls/fullscreen.js';
|
|
27
|
+
import { Component } from './component.js';
|
|
28
|
+
import { number, style } from './shared.js';
|
|
29
|
+
const IDLE_MS = 3000;
|
|
30
|
+
const SEEK_STEP = 5;
|
|
31
|
+
const STYLE = `
|
|
32
|
+
:host {
|
|
33
|
+
position: absolute;
|
|
34
|
+
inset: auto 0 0 0;
|
|
35
|
+
box-sizing: border-box;
|
|
36
|
+
display: flex;
|
|
37
|
+
flex-direction: column;
|
|
38
|
+
gap: 4px;
|
|
39
|
+
padding: 40px 16px 12px;
|
|
40
|
+
color: var(--mbx-text);
|
|
41
|
+
background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));
|
|
42
|
+
font: 500 16px/1.2 var(--mbx-font);
|
|
43
|
+
transition: opacity 0.2s;
|
|
44
|
+
}
|
|
45
|
+
:host([idle]) { opacity: 0; pointer-events: none; }
|
|
46
|
+
[part~="row"] { display: flex; align-items: center; gap: 8px; }
|
|
47
|
+
[part~="seek-row"] { gap: 16px; }
|
|
48
|
+
@media (prefers-reduced-motion: reduce) {
|
|
49
|
+
:host { transition: none; }
|
|
50
|
+
}
|
|
51
|
+
`;
|
|
52
|
+
function end(video) {
|
|
53
|
+
if (Number.isFinite(video.duration))
|
|
54
|
+
return video.duration;
|
|
55
|
+
const ranges = video.seekable;
|
|
56
|
+
return ranges.length > 0 ? ranges.end(ranges.length - 1) : video.currentTime;
|
|
57
|
+
}
|
|
58
|
+
function toggle(video) {
|
|
59
|
+
if (video.paused)
|
|
60
|
+
video.play().catch(() => undefined);
|
|
61
|
+
else
|
|
62
|
+
video.pause();
|
|
63
|
+
}
|
|
64
|
+
export class MbxControlBar extends Component {
|
|
65
|
+
static get observedAttributes() {
|
|
66
|
+
return ['idle-ms', 'seek-step'];
|
|
67
|
+
}
|
|
68
|
+
constructor() {
|
|
69
|
+
super();
|
|
70
|
+
this.timer = undefined;
|
|
71
|
+
this.keyboard = false;
|
|
72
|
+
this.cues = null;
|
|
73
|
+
this.screen = null;
|
|
74
|
+
const root = this.attachShadow({ mode: 'open' });
|
|
75
|
+
this.seekRow = document.createElement('div');
|
|
76
|
+
this.seekRow.setAttribute('part', 'row seek-row');
|
|
77
|
+
const seek = document.createElement('slot');
|
|
78
|
+
seek.name = 'seek';
|
|
79
|
+
this.seekRow.append(seek);
|
|
80
|
+
const buttons = document.createElement('div');
|
|
81
|
+
buttons.setAttribute('part', 'row buttons-row');
|
|
82
|
+
buttons.append(document.createElement('slot'));
|
|
83
|
+
root.append(style(STYLE), this.seekRow, buttons);
|
|
84
|
+
}
|
|
85
|
+
/** From the first row's top to the bar's bottom: what the bar covers of the picture. */
|
|
86
|
+
covered() {
|
|
87
|
+
return {
|
|
88
|
+
top: this.seekRow.getBoundingClientRect().top,
|
|
89
|
+
bottom: this.getBoundingClientRect().bottom,
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
held(player) {
|
|
93
|
+
if (player.video.paused)
|
|
94
|
+
return true;
|
|
95
|
+
if (this.querySelector('[open]') !== null)
|
|
96
|
+
return true;
|
|
97
|
+
if (!this.keyboard)
|
|
98
|
+
return false;
|
|
99
|
+
const active = this.getRootNode().activeElement;
|
|
100
|
+
return active !== null && this.contains(active);
|
|
101
|
+
}
|
|
102
|
+
idle(player, on) {
|
|
103
|
+
if (this.hasAttribute('idle') === on)
|
|
104
|
+
return;
|
|
105
|
+
this.toggleAttribute('idle', on);
|
|
106
|
+
player.toggleAttribute('idle', on);
|
|
107
|
+
this.cues?.lifted(!on);
|
|
108
|
+
}
|
|
109
|
+
sleep(player) {
|
|
110
|
+
this.timer = undefined;
|
|
111
|
+
// A hold is checked again later: a menu closes and a pause ends without
|
|
112
|
+
// an event the bar hears.
|
|
113
|
+
if (this.held(player)) {
|
|
114
|
+
this.timer = setTimeout(() => this.sleep(player), number(this, 'idle-ms', IDLE_MS));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
117
|
+
this.idle(player, true);
|
|
118
|
+
}
|
|
119
|
+
wake(player) {
|
|
120
|
+
clearTimeout(this.timer);
|
|
121
|
+
this.idle(player, false);
|
|
122
|
+
this.timer = setTimeout(() => this.sleep(player), number(this, 'idle-ms', IDLE_MS));
|
|
123
|
+
}
|
|
124
|
+
key(player, event) {
|
|
125
|
+
this.keyboard = true;
|
|
126
|
+
this.wake(player);
|
|
127
|
+
if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey)
|
|
128
|
+
return;
|
|
129
|
+
const video = player.video;
|
|
130
|
+
const onButton = event.composedPath()[0] instanceof HTMLButtonElement;
|
|
131
|
+
switch (event.key) {
|
|
132
|
+
case ' ':
|
|
133
|
+
if (onButton)
|
|
134
|
+
return;
|
|
135
|
+
toggle(video);
|
|
136
|
+
break;
|
|
137
|
+
case 'k':
|
|
138
|
+
case 'K':
|
|
139
|
+
toggle(video);
|
|
140
|
+
break;
|
|
141
|
+
case 'm':
|
|
142
|
+
case 'M':
|
|
143
|
+
video.muted = !video.muted;
|
|
144
|
+
break;
|
|
145
|
+
case 'f':
|
|
146
|
+
case 'F':
|
|
147
|
+
this.screen?.toggle();
|
|
148
|
+
break;
|
|
149
|
+
case 'ArrowLeft':
|
|
150
|
+
video.currentTime = Math.max(0, video.currentTime - number(this, 'seek-step', SEEK_STEP));
|
|
151
|
+
break;
|
|
152
|
+
case 'ArrowRight':
|
|
153
|
+
video.currentTime = Math.min(end(video), video.currentTime + number(this, 'seek-step', SEEK_STEP));
|
|
154
|
+
break;
|
|
155
|
+
default:
|
|
156
|
+
return;
|
|
157
|
+
}
|
|
158
|
+
event.preventDefault();
|
|
159
|
+
}
|
|
160
|
+
attach(player) {
|
|
161
|
+
const video = player.video;
|
|
162
|
+
cueStyle();
|
|
163
|
+
this.cues = cueLift(video, player, () => this.covered());
|
|
164
|
+
const screen = fullscreen(player, video);
|
|
165
|
+
this.screen = screen;
|
|
166
|
+
const reflect = () => {
|
|
167
|
+
player.toggleAttribute('fullscreen', screen.active());
|
|
168
|
+
};
|
|
169
|
+
this.keep(screen.watch(reflect));
|
|
170
|
+
reflect();
|
|
171
|
+
const pointer = () => {
|
|
172
|
+
this.keyboard = false;
|
|
173
|
+
this.wake(player);
|
|
174
|
+
};
|
|
175
|
+
const key = (event) => {
|
|
176
|
+
this.key(player, event);
|
|
177
|
+
};
|
|
178
|
+
const click = (event) => {
|
|
179
|
+
// The video and nothing else: a control handles its own click.
|
|
180
|
+
if (event.composedPath()[0] === video)
|
|
181
|
+
toggle(video);
|
|
182
|
+
};
|
|
183
|
+
this.listen(player, ['pointermove', 'pointerdown'], pointer);
|
|
184
|
+
player.addEventListener('keydown', key);
|
|
185
|
+
player.addEventListener('click', click);
|
|
186
|
+
this.keep(() => {
|
|
187
|
+
player.removeEventListener('keydown', key);
|
|
188
|
+
player.removeEventListener('click', click);
|
|
189
|
+
});
|
|
190
|
+
this.listen(video, ['play', 'pause', 'ended'], () => {
|
|
191
|
+
this.wake(player);
|
|
192
|
+
});
|
|
193
|
+
this.wake(player);
|
|
194
|
+
this.cues.lifted(true);
|
|
195
|
+
}
|
|
196
|
+
detach(player) {
|
|
197
|
+
clearTimeout(this.timer);
|
|
198
|
+
this.timer = undefined;
|
|
199
|
+
this.cues?.dispose();
|
|
200
|
+
this.cues = null;
|
|
201
|
+
this.screen = null;
|
|
202
|
+
this.removeAttribute('idle');
|
|
203
|
+
player.removeAttribute('idle');
|
|
204
|
+
player.removeAttribute('fullscreen');
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
//# sourceMappingURL=control-bar.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"control-bar.js","sourceRoot":"","sources":["../../src/elements/control-bar.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-time.d.ts","sourceRoot":"","sources":["../../src/elements/current-time.ts"],"names":[],"mappings":"AAUA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,qBAAa,cAAe,SAAQ,WAAW;cAC1B,MAAM,IAAI,IAAI;CAYlC"}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <mbx-current-time>: the position, "1:23". On a live stream it reads the
|
|
3
|
+
* wall clock when `engine.pdt` can say it, "14:23:05", which is what a
|
|
4
|
+
* viewer of a broadcast wants to know, and the distance behind the edge
|
|
5
|
+
* otherwise, "-0:10". While the player says the stream is live but not
|
|
6
|
+
* seekable, which the seek bar decides, there is no position to show and
|
|
7
|
+
* the element hides.
|
|
8
|
+
*/
|
|
9
|
+
import { live, span, wall } from '../controls/session.js';
|
|
10
|
+
import { format } from '../controls/time.js';
|
|
11
|
+
import { TimeElement } from './time-element.js';
|
|
12
|
+
export class MbxCurrentTime extends TimeElement {
|
|
13
|
+
render() {
|
|
14
|
+
const player = this.player;
|
|
15
|
+
if (player === null)
|
|
16
|
+
return;
|
|
17
|
+
const video = player.video;
|
|
18
|
+
const engine = player.engine;
|
|
19
|
+
const on = live(engine) !== undefined;
|
|
20
|
+
const time = video.currentTime;
|
|
21
|
+
this.text.data = on
|
|
22
|
+
? (wall(engine, time) ?? `-${format(span(video, engine).end - time)}`)
|
|
23
|
+
: format(time);
|
|
24
|
+
this.hidden = on && player.hasAttribute('live') && !player.hasAttribute('seekable');
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
//# sourceMappingURL=current-time.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"current-time.js","sourceRoot":"","sources":["../../src/elements/current-time.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,cAAe,SAAQ,WAAW;IAC1B,MAAM;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC;QAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,WAAW,CAAC;QAC/B,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,EAAE;YACjB,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,GAAG,IAAI,CAAC,EAAE,CAAC;YACtE,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QACjB,IAAI,CAAC,MAAM,GAAG,EAAE,IAAI,MAAM,CAAC,YAAY,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IACtF,CAAC;CACF"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <mbx-drm-badge>: a lock over `engine.drm`, hidden until a key system is
|
|
3
|
+
* known and for a session without the EME stages. Hover or focus shows
|
|
4
|
+
* what it knows: the key system, and the key sessions with their
|
|
5
|
+
* statuses. The glyph is `icon`; the name comes from `label`, where
|
|
6
|
+
* `{system}` is the key system's name and `{keys}` the sessions:
|
|
7
|
+
* "Protected by {system}, {keys}". The sessions read from `label-keys`
|
|
8
|
+
* with `{count}` and `{statuses}`, `label-key` for one, `label-no-key`
|
|
9
|
+
* for none.
|
|
10
|
+
*/
|
|
11
|
+
import type { PlayerHost } from '../host.js';
|
|
12
|
+
import { Component } from './component.js';
|
|
13
|
+
export declare class MbxDrmBadge extends Component {
|
|
14
|
+
static get observedAttributes(): readonly string[];
|
|
15
|
+
private readonly tooltip;
|
|
16
|
+
private readonly system;
|
|
17
|
+
private readonly system_id;
|
|
18
|
+
private readonly keys;
|
|
19
|
+
private engine;
|
|
20
|
+
constructor();
|
|
21
|
+
/** Named and focusable before attaching: a constructor must not add attributes. */
|
|
22
|
+
connectedCallback(): void;
|
|
23
|
+
/** "3 keys: usable ×2, expired", or "no key yet". */
|
|
24
|
+
private sessionsText;
|
|
25
|
+
protected attach(player: PlayerHost): void;
|
|
26
|
+
protected detach(): void;
|
|
27
|
+
protected render(): void;
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=drm-badge.d.ts.map
|