@mattebox/player 0.1.0 → 0.3.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 +222 -198
- 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 +75 -0
- package/dist/elements/control-bar.d.ts.map +1 -0
- package/dist/elements/control-bar.js +339 -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/remaining-time.d.ts +6 -0
- package/dist/elements/remaining-time.d.ts.map +1 -0
- package/dist/elements/remaining-time.js +26 -0
- package/dist/elements/remaining-time.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 +23 -0
- package/dist/elements/start-button.d.ts.map +1 -0
- package/dist/elements/start-button.js +120 -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 +52 -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/remaining-time.d.ts +5 -0
- package/dist/entries/remaining-time.d.ts.map +1 -0
- package/dist/entries/remaining-time.js +9 -0
- package/dist/entries/remaining-time.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 +85 -0
- package/dist/es2015/elements/control-bar.js +299 -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/remaining-time.js +26 -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 +124 -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 +52 -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/remaining-time.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 +48 -9
- package/dist/es2015/labels.js +14 -0
- package/dist/es2015/style.js +40 -292
- package/dist/es2015/{panels/error.js → surface.js} +3 -3
- package/dist/es2015/tags.js +28 -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 +84 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +24 -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 +10 -2
- package/dist/style.d.ts.map +1 -1
- package/dist/style.js +40 -292
- 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 +26 -0
- package/dist/tags.d.ts.map +1 -0
- package/dist/tags.js +26 -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,339 @@
|
|
|
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
|
+
* A narrow bar collapses the buttons row by `priority`: each child carries
|
|
26
|
+
* a number, its own attribute or the default for its tag, and the bar
|
|
27
|
+
* marks the highest numbers `collapsed` one at a time until the row fits
|
|
28
|
+
* with a little slack, from the right among equals. Zero, the default for
|
|
29
|
+
* anything unlisted, never collapses: play and fullscreen stay whatever
|
|
30
|
+
* the width. The mark is an attribute and the hiding is one `::slotted`
|
|
31
|
+
* rule here, so a page styles or overrides it by the tag. The volume's
|
|
32
|
+
* slider is a candidate of its own, and counts at its unfolded width, so
|
|
33
|
+
* the row is sized for what the pointer will make of it.
|
|
34
|
+
*/
|
|
35
|
+
import { cueLift, cueStyle } from '../controls/cues.js';
|
|
36
|
+
import { fullscreen } from '../controls/fullscreen.js';
|
|
37
|
+
import { AUDIO_MENU, CHAPTERS_MENU, DRM_BADGE, MUTE_BUTTON, PIP_BUTTON, QUALITY_MENU, SKIP_BUTTON, SPACER, SPEED_MENU, SUBTITLES_MENU, VOLUME, VOLUME_SLIDER, } from '../tags.js';
|
|
38
|
+
import { Component } from './component.js';
|
|
39
|
+
import { number, style } from './shared.js';
|
|
40
|
+
const IDLE_MS = 3000;
|
|
41
|
+
const SEEK_STEP = 5;
|
|
42
|
+
/**
|
|
43
|
+
* What goes first when the row is too narrow, by tag: the slider, which
|
|
44
|
+
* takes the most room for the least; then the diagnostics, the lock and
|
|
45
|
+
* the menus a viewer rarely opens; then the menus for the picture and the
|
|
46
|
+
* sound; then the skips; then the mute and the subtitles. The subtitles
|
|
47
|
+
* menu goes last of the menus because it is the one a viewer may need.
|
|
48
|
+
* The diagnostics is another package's, named here as a string. A
|
|
49
|
+
* `priority` attribute on the control replaces its default.
|
|
50
|
+
*/
|
|
51
|
+
const PRIORITY = {
|
|
52
|
+
[VOLUME_SLIDER]: 5,
|
|
53
|
+
'mbx-diagnostics': 4,
|
|
54
|
+
[DRM_BADGE]: 4,
|
|
55
|
+
[SPEED_MENU]: 4,
|
|
56
|
+
[CHAPTERS_MENU]: 4,
|
|
57
|
+
[AUDIO_MENU]: 3,
|
|
58
|
+
[QUALITY_MENU]: 3,
|
|
59
|
+
[PIP_BUTTON]: 3,
|
|
60
|
+
[SKIP_BUTTON]: 2,
|
|
61
|
+
[SUBTITLES_MENU]: 1,
|
|
62
|
+
[VOLUME]: 1,
|
|
63
|
+
[MUTE_BUTTON]: 1,
|
|
64
|
+
};
|
|
65
|
+
/** The width the volume group unfolds its slider to, from volume.ts: what a folded slider is counted at. */
|
|
66
|
+
const SLIDER_WIDTH = 80;
|
|
67
|
+
/** Room kept between the last button and the edge, so nothing sits flush against it. */
|
|
68
|
+
const SLACK = 8;
|
|
69
|
+
function shown(node) {
|
|
70
|
+
return node.getClientRects().length > 0;
|
|
71
|
+
}
|
|
72
|
+
/** The slider inside a volume group child, when it has one. */
|
|
73
|
+
function slider(child) {
|
|
74
|
+
return child.localName === VOLUME ? child.querySelector(VOLUME_SLIDER) : null;
|
|
75
|
+
}
|
|
76
|
+
/** A child's priority: its attribute, else its tag's default, else zero. */
|
|
77
|
+
function priority(child) {
|
|
78
|
+
const own = child.getAttribute('priority');
|
|
79
|
+
if (own !== null) {
|
|
80
|
+
const value = Number(own);
|
|
81
|
+
return Number.isFinite(value) && value > 0 ? value : 0;
|
|
82
|
+
}
|
|
83
|
+
return PRIORITY[child.localName] ?? 0;
|
|
84
|
+
}
|
|
85
|
+
const STYLE = `
|
|
86
|
+
:host {
|
|
87
|
+
position: absolute;
|
|
88
|
+
inset: auto 0 0 0;
|
|
89
|
+
box-sizing: border-box;
|
|
90
|
+
display: flex;
|
|
91
|
+
flex-direction: column;
|
|
92
|
+
gap: 4px;
|
|
93
|
+
padding: 40px 16px 12px;
|
|
94
|
+
color: var(--mbx-text);
|
|
95
|
+
background: linear-gradient(transparent, rgba(0, 0, 0, 0.6));
|
|
96
|
+
font: 500 16px/1.2 var(--mbx-font);
|
|
97
|
+
transition: opacity 0.2s;
|
|
98
|
+
}
|
|
99
|
+
:host([idle]) { opacity: 0; pointer-events: none; }
|
|
100
|
+
[part~="row"] { display: flex; align-items: center; gap: 8px; }
|
|
101
|
+
[part~="seek-row"] { gap: 16px; }
|
|
102
|
+
::slotted([collapsed]) { display: none; }
|
|
103
|
+
@media (prefers-reduced-motion: reduce) {
|
|
104
|
+
:host { transition: none; }
|
|
105
|
+
}
|
|
106
|
+
`;
|
|
107
|
+
function end(video) {
|
|
108
|
+
if (Number.isFinite(video.duration))
|
|
109
|
+
return video.duration;
|
|
110
|
+
const ranges = video.seekable;
|
|
111
|
+
return ranges.length > 0 ? ranges.end(ranges.length - 1) : video.currentTime;
|
|
112
|
+
}
|
|
113
|
+
function toggle(video) {
|
|
114
|
+
if (video.paused)
|
|
115
|
+
video.play().catch(() => undefined);
|
|
116
|
+
else
|
|
117
|
+
video.pause();
|
|
118
|
+
}
|
|
119
|
+
export class MbxControlBar extends Component {
|
|
120
|
+
static get observedAttributes() {
|
|
121
|
+
return ['idle-ms', 'seek-step'];
|
|
122
|
+
}
|
|
123
|
+
constructor() {
|
|
124
|
+
super();
|
|
125
|
+
this.timer = undefined;
|
|
126
|
+
this.keyboard = false;
|
|
127
|
+
this.cues = null;
|
|
128
|
+
this.screen = null;
|
|
129
|
+
this.resizer = null;
|
|
130
|
+
const root = this.attachShadow({ mode: 'open' });
|
|
131
|
+
this.seekRow = document.createElement('div');
|
|
132
|
+
this.seekRow.setAttribute('part', 'row seek-row');
|
|
133
|
+
const seek = document.createElement('slot');
|
|
134
|
+
seek.name = 'seek';
|
|
135
|
+
this.seekRow.append(seek);
|
|
136
|
+
this.buttonsRow = document.createElement('div');
|
|
137
|
+
this.buttonsRow.setAttribute('part', 'row buttons-row');
|
|
138
|
+
this.buttons = document.createElement('slot');
|
|
139
|
+
this.buttonsRow.append(this.buttons);
|
|
140
|
+
root.append(style(STYLE), this.seekRow, this.buttonsRow);
|
|
141
|
+
}
|
|
142
|
+
/**
|
|
143
|
+
* What the buttons need: their widths and the gaps between them, the
|
|
144
|
+
* spacer aside since it takes what is left, and a folded slider at the
|
|
145
|
+
* width it unfolds to. The row's own width says nothing, because the
|
|
146
|
+
* spacer fills it whatever the buttons take.
|
|
147
|
+
*/
|
|
148
|
+
needed(children) {
|
|
149
|
+
const gap = Number.parseFloat(getComputedStyle(this.buttonsRow).columnGap) || 0;
|
|
150
|
+
let sum = 0;
|
|
151
|
+
let count = 0;
|
|
152
|
+
for (const child of children) {
|
|
153
|
+
if (child.localName === SPACER || !shown(child))
|
|
154
|
+
continue;
|
|
155
|
+
sum += child.getBoundingClientRect().width;
|
|
156
|
+
count += 1;
|
|
157
|
+
const folded = slider(child);
|
|
158
|
+
if (folded !== null && shown(folded)) {
|
|
159
|
+
sum += Math.max(0, SLIDER_WIDTH - folded.getBoundingClientRect().width);
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return sum + gap * Math.max(0, count - 1);
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Collapses the buttons row to its width. Everything is shown first, so
|
|
166
|
+
* a wider bar gets its controls back, then the highest priorities go one
|
|
167
|
+
* at a time while the buttons need more than the row has, less the
|
|
168
|
+
* slack. Each step lays the row out again; a bar carries a dozen
|
|
169
|
+
* controls, so that is cheap.
|
|
170
|
+
*/
|
|
171
|
+
collapse() {
|
|
172
|
+
const children = this.buttons.assignedElements();
|
|
173
|
+
const candidates = [];
|
|
174
|
+
for (const [index, child] of children.entries()) {
|
|
175
|
+
child.removeAttribute('collapsed');
|
|
176
|
+
const inner = slider(child);
|
|
177
|
+
inner?.removeAttribute('collapsed');
|
|
178
|
+
// A nested slider goes before its group, so it sorts as if it sat
|
|
179
|
+
// after it. What is not shown, by its own `hidden` or a page's rule,
|
|
180
|
+
// takes no room, so marking it would hide nothing and say something
|
|
181
|
+
// false.
|
|
182
|
+
if (inner !== null && shown(inner)) {
|
|
183
|
+
candidates.push({ node: inner, index: index + 0.5, priority: priority(inner) });
|
|
184
|
+
}
|
|
185
|
+
if (shown(child))
|
|
186
|
+
candidates.push({ node: child, index, priority: priority(child) });
|
|
187
|
+
}
|
|
188
|
+
candidates.sort((a, b) => b.priority - a.priority || b.index - a.index);
|
|
189
|
+
const room = this.buttonsRow.clientWidth - SLACK;
|
|
190
|
+
for (const { node, priority: level } of candidates) {
|
|
191
|
+
if (level === 0)
|
|
192
|
+
return;
|
|
193
|
+
if (this.needed(children) <= room)
|
|
194
|
+
return;
|
|
195
|
+
node.setAttribute('collapsed', '');
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
/** From the first row's top to the bar's bottom: what the bar covers of the picture. */
|
|
199
|
+
covered() {
|
|
200
|
+
return {
|
|
201
|
+
top: this.seekRow.getBoundingClientRect().top,
|
|
202
|
+
bottom: this.getBoundingClientRect().bottom,
|
|
203
|
+
};
|
|
204
|
+
}
|
|
205
|
+
held(player) {
|
|
206
|
+
if (player.video.paused)
|
|
207
|
+
return true;
|
|
208
|
+
if (this.querySelector('[open]') !== null)
|
|
209
|
+
return true;
|
|
210
|
+
if (!this.keyboard)
|
|
211
|
+
return false;
|
|
212
|
+
const active = this.getRootNode().activeElement;
|
|
213
|
+
return active !== null && this.contains(active);
|
|
214
|
+
}
|
|
215
|
+
idle(player, on) {
|
|
216
|
+
if (this.hasAttribute('idle') === on)
|
|
217
|
+
return;
|
|
218
|
+
this.toggleAttribute('idle', on);
|
|
219
|
+
player.toggleAttribute('idle', on);
|
|
220
|
+
this.cues?.lifted(!on);
|
|
221
|
+
}
|
|
222
|
+
sleep(player) {
|
|
223
|
+
this.timer = undefined;
|
|
224
|
+
// A hold is checked again later: a menu closes and a pause ends without
|
|
225
|
+
// an event the bar hears.
|
|
226
|
+
if (this.held(player)) {
|
|
227
|
+
this.timer = setTimeout(() => this.sleep(player), number(this, 'idle-ms', IDLE_MS));
|
|
228
|
+
return;
|
|
229
|
+
}
|
|
230
|
+
this.idle(player, true);
|
|
231
|
+
}
|
|
232
|
+
wake(player) {
|
|
233
|
+
clearTimeout(this.timer);
|
|
234
|
+
this.idle(player, false);
|
|
235
|
+
this.timer = setTimeout(() => this.sleep(player), number(this, 'idle-ms', IDLE_MS));
|
|
236
|
+
}
|
|
237
|
+
key(player, event) {
|
|
238
|
+
this.keyboard = true;
|
|
239
|
+
this.wake(player);
|
|
240
|
+
if (event.defaultPrevented || event.altKey || event.ctrlKey || event.metaKey)
|
|
241
|
+
return;
|
|
242
|
+
const video = player.video;
|
|
243
|
+
const onButton = event.composedPath()[0] instanceof HTMLButtonElement;
|
|
244
|
+
switch (event.key) {
|
|
245
|
+
case ' ':
|
|
246
|
+
if (onButton)
|
|
247
|
+
return;
|
|
248
|
+
toggle(video);
|
|
249
|
+
break;
|
|
250
|
+
case 'k':
|
|
251
|
+
case 'K':
|
|
252
|
+
toggle(video);
|
|
253
|
+
break;
|
|
254
|
+
case 'm':
|
|
255
|
+
case 'M':
|
|
256
|
+
video.muted = !video.muted;
|
|
257
|
+
break;
|
|
258
|
+
case 'f':
|
|
259
|
+
case 'F':
|
|
260
|
+
this.screen?.toggle();
|
|
261
|
+
break;
|
|
262
|
+
case 'ArrowLeft':
|
|
263
|
+
video.currentTime = Math.max(0, video.currentTime - number(this, 'seek-step', SEEK_STEP));
|
|
264
|
+
break;
|
|
265
|
+
case 'ArrowRight':
|
|
266
|
+
video.currentTime = Math.min(end(video), video.currentTime + number(this, 'seek-step', SEEK_STEP));
|
|
267
|
+
break;
|
|
268
|
+
default:
|
|
269
|
+
return;
|
|
270
|
+
}
|
|
271
|
+
event.preventDefault();
|
|
272
|
+
}
|
|
273
|
+
attach(player) {
|
|
274
|
+
const video = player.video;
|
|
275
|
+
cueStyle();
|
|
276
|
+
this.cues = cueLift(video, player, () => this.covered());
|
|
277
|
+
const screen = fullscreen(player, video);
|
|
278
|
+
this.screen = screen;
|
|
279
|
+
const reflect = () => {
|
|
280
|
+
player.toggleAttribute('fullscreen', screen.active());
|
|
281
|
+
};
|
|
282
|
+
this.keep(screen.watch(reflect));
|
|
283
|
+
reflect();
|
|
284
|
+
const pointer = () => {
|
|
285
|
+
this.keyboard = false;
|
|
286
|
+
this.wake(player);
|
|
287
|
+
};
|
|
288
|
+
const key = (event) => {
|
|
289
|
+
this.key(player, event);
|
|
290
|
+
};
|
|
291
|
+
const click = (event) => {
|
|
292
|
+
// The video and nothing else: a control handles its own click.
|
|
293
|
+
if (event.composedPath()[0] === video)
|
|
294
|
+
toggle(video);
|
|
295
|
+
};
|
|
296
|
+
this.listen(player, ['pointermove', 'pointerdown'], pointer);
|
|
297
|
+
player.addEventListener('keydown', key);
|
|
298
|
+
player.addEventListener('click', click);
|
|
299
|
+
this.keep(() => {
|
|
300
|
+
player.removeEventListener('keydown', key);
|
|
301
|
+
player.removeEventListener('click', click);
|
|
302
|
+
});
|
|
303
|
+
this.listen(video, ['play', 'pause', 'ended'], () => {
|
|
304
|
+
this.wake(player);
|
|
305
|
+
});
|
|
306
|
+
this.wake(player);
|
|
307
|
+
this.cues.lifted(true);
|
|
308
|
+
// The row's width, its children, and what they hide or reprioritise on
|
|
309
|
+
// their own: each can change what fits. `collapsed` is left out of the
|
|
310
|
+
// filter, since the bar writes it.
|
|
311
|
+
const collapse = () => {
|
|
312
|
+
this.collapse();
|
|
313
|
+
};
|
|
314
|
+
this.listen(this.buttons, ['slotchange'], collapse);
|
|
315
|
+
this.observe(this, ['hidden', 'priority', 'slot'], collapse, true);
|
|
316
|
+
if (typeof ResizeObserver !== 'undefined') {
|
|
317
|
+
this.resizer = new ResizeObserver(collapse);
|
|
318
|
+
this.resizer.observe(this.buttonsRow);
|
|
319
|
+
}
|
|
320
|
+
collapse();
|
|
321
|
+
}
|
|
322
|
+
detach(player) {
|
|
323
|
+
clearTimeout(this.timer);
|
|
324
|
+
this.timer = undefined;
|
|
325
|
+
this.resizer?.disconnect();
|
|
326
|
+
this.resizer = null;
|
|
327
|
+
for (const child of this.buttons.assignedElements()) {
|
|
328
|
+
child.removeAttribute('collapsed');
|
|
329
|
+
slider(child)?.removeAttribute('collapsed');
|
|
330
|
+
}
|
|
331
|
+
this.cues?.dispose();
|
|
332
|
+
this.cues = null;
|
|
333
|
+
this.screen = null;
|
|
334
|
+
this.removeAttribute('idle');
|
|
335
|
+
player.removeAttribute('idle');
|
|
336
|
+
player.removeAttribute('fullscreen');
|
|
337
|
+
}
|
|
338
|
+
}
|
|
339
|
+
//# 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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drm-badge.d.ts","sourceRoot":"","sources":["../../src/elements/drm-badge.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAG7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAqC3C,qBAAa,WAAY,SAAQ,SAAS;IACxC,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAED,iBAAyB,OAAO,CAAc;IAC9C,iBAAyB,MAAM,CAAc;IAC7C,iBAAyB,SAAS,CAAc;IAChD,iBAAyB,IAAI,CAAc;IAC3C,QAAgB,MAAM,CAAkB;;IA6BxC,mFAAmF;IAC1E,iBAAiB,IAAI,IAAI;IAOlC,qDAAqD;IACrD,OAAO,CAAC,YAAY;cAeD,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;cAmBhC,MAAM,IAAI,IAAI;cAId,MAAM,IAAI,IAAI;CAelC"}
|
|
@@ -0,0 +1,145 @@
|
|
|
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 { icon } from '../controls/icons.js';
|
|
12
|
+
import { el } from '../dom.js';
|
|
13
|
+
import { fill } from '../labels.js';
|
|
14
|
+
import { namespaces } from '../namespaces.js';
|
|
15
|
+
import { Component } from './component.js';
|
|
16
|
+
import { style } from './shared.js';
|
|
17
|
+
const STYLE = `
|
|
18
|
+
:host { position: relative; display: inline-flex; align-items: center; justify-content: center; width: 40px; height: 40px; color: var(--mbx-muted); border-radius: var(--mbx-radius); cursor: default; }
|
|
19
|
+
:host([hidden]) { display: none; }
|
|
20
|
+
:host(:focus-visible) { outline: 2px solid var(--mbx-accent); outline-offset: -2px; }
|
|
21
|
+
[part~="icon"], ::slotted(*) { width: 1.75em; height: 1.75em; fill: currentColor; }
|
|
22
|
+
[part~="tooltip"] {
|
|
23
|
+
position: absolute;
|
|
24
|
+
right: 0;
|
|
25
|
+
bottom: 100%;
|
|
26
|
+
margin-bottom: 8px;
|
|
27
|
+
padding: 8px 10px;
|
|
28
|
+
background: rgba(16, 17, 20, 0.95);
|
|
29
|
+
border-radius: var(--mbx-radius);
|
|
30
|
+
box-shadow: 0 4px 16px rgba(0, 0, 0, 0.5);
|
|
31
|
+
color: var(--mbx-text);
|
|
32
|
+
font-size: 13px;
|
|
33
|
+
line-height: 1.4;
|
|
34
|
+
text-align: left;
|
|
35
|
+
white-space: nowrap;
|
|
36
|
+
pointer-events: none;
|
|
37
|
+
}
|
|
38
|
+
[part~="tooltip"][hidden] { display: none; }
|
|
39
|
+
[part~="tooltip-title"] { font-weight: 600; }
|
|
40
|
+
[part~="tooltip-text"] { color: var(--mbx-muted); }
|
|
41
|
+
`;
|
|
42
|
+
/** The name a viewer knows a key system by. */
|
|
43
|
+
function keySystemName(id) {
|
|
44
|
+
if (id.startsWith('com.widevine'))
|
|
45
|
+
return 'Widevine';
|
|
46
|
+
if (id.startsWith('com.microsoft.playready'))
|
|
47
|
+
return 'PlayReady';
|
|
48
|
+
if (id.startsWith('com.apple.fps'))
|
|
49
|
+
return 'FairPlay';
|
|
50
|
+
return id;
|
|
51
|
+
}
|
|
52
|
+
export class MbxDrmBadge extends Component {
|
|
53
|
+
static get observedAttributes() {
|
|
54
|
+
return ['label', 'label-key', 'label-keys', 'label-no-key'];
|
|
55
|
+
}
|
|
56
|
+
constructor() {
|
|
57
|
+
super();
|
|
58
|
+
this.engine = null;
|
|
59
|
+
const root = this.attachShadow({ mode: 'open' });
|
|
60
|
+
const slot = document.createElement('slot');
|
|
61
|
+
slot.name = 'icon';
|
|
62
|
+
slot.append(icon('lock-closed'));
|
|
63
|
+
this.tooltip = el('div', 'tooltip');
|
|
64
|
+
this.tooltip.setAttribute('role', 'tooltip');
|
|
65
|
+
this.system = el('div', 'tooltip-title');
|
|
66
|
+
this.system_id = el('div', 'tooltip-text');
|
|
67
|
+
this.keys = el('div', 'tooltip-text');
|
|
68
|
+
this.tooltip.append(this.system, this.system_id, this.keys);
|
|
69
|
+
this.tooltip.hidden = true;
|
|
70
|
+
root.append(style(STYLE), slot, this.tooltip);
|
|
71
|
+
const show = () => {
|
|
72
|
+
this.tooltip.hidden = false;
|
|
73
|
+
};
|
|
74
|
+
const hide = () => {
|
|
75
|
+
this.tooltip.hidden = true;
|
|
76
|
+
};
|
|
77
|
+
this.addEventListener('pointerenter', show);
|
|
78
|
+
this.addEventListener('pointerleave', hide);
|
|
79
|
+
this.addEventListener('focus', show);
|
|
80
|
+
this.addEventListener('blur', hide);
|
|
81
|
+
}
|
|
82
|
+
/** Named and focusable before attaching: a constructor must not add attributes. */
|
|
83
|
+
connectedCallback() {
|
|
84
|
+
if (!this.hasAttribute('role'))
|
|
85
|
+
this.setAttribute('role', 'img');
|
|
86
|
+
if (!this.hasAttribute('tabindex'))
|
|
87
|
+
this.tabIndex = 0;
|
|
88
|
+
if (this.player === null)
|
|
89
|
+
this.hidden = true;
|
|
90
|
+
super.connectedCallback();
|
|
91
|
+
}
|
|
92
|
+
/** "3 keys: usable ×2, expired", or "no key yet". */
|
|
93
|
+
sessionsText(sessions) {
|
|
94
|
+
if (sessions.length === 0)
|
|
95
|
+
return this.getAttribute('label-no-key') ?? 'no key yet';
|
|
96
|
+
const counts = new Map();
|
|
97
|
+
for (const session of sessions) {
|
|
98
|
+
counts.set(session.status, (counts.get(session.status) ?? 0) + 1);
|
|
99
|
+
}
|
|
100
|
+
const parts = [];
|
|
101
|
+
for (const [status, count] of counts)
|
|
102
|
+
parts.push(count > 1 ? `${status} ×${count}` : status);
|
|
103
|
+
const template = sessions.length === 1
|
|
104
|
+
? (this.getAttribute('label-key') ?? '{count} key: {statuses}')
|
|
105
|
+
: (this.getAttribute('label-keys') ?? '{count} keys: {statuses}');
|
|
106
|
+
return fill(template, { count: sessions.length, statuses: parts.join(', ') });
|
|
107
|
+
}
|
|
108
|
+
attach(player) {
|
|
109
|
+
this.follow(player, (engine) => {
|
|
110
|
+
this.engine = engine;
|
|
111
|
+
this.render();
|
|
112
|
+
if (engine === null || namespaces(engine).drm === undefined)
|
|
113
|
+
return undefined;
|
|
114
|
+
const tick = () => {
|
|
115
|
+
this.render();
|
|
116
|
+
};
|
|
117
|
+
const offs = [
|
|
118
|
+
engine.on('drm:keysystem', tick),
|
|
119
|
+
engine.on('drm:keystatus', tick),
|
|
120
|
+
engine.on('drm:encrypted', tick),
|
|
121
|
+
];
|
|
122
|
+
return () => {
|
|
123
|
+
for (const off of offs)
|
|
124
|
+
off();
|
|
125
|
+
};
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
detach() {
|
|
129
|
+
this.tooltip.hidden = true;
|
|
130
|
+
}
|
|
131
|
+
render() {
|
|
132
|
+
const drm = this.engine === null ? undefined : namespaces(this.engine).drm;
|
|
133
|
+
const name = drm?.keySystem ?? null;
|
|
134
|
+
this.hidden = name === null;
|
|
135
|
+
if (drm === undefined || name === null)
|
|
136
|
+
return;
|
|
137
|
+
const keys = this.sessionsText(drm.sessions);
|
|
138
|
+
const system = keySystemName(name);
|
|
139
|
+
this.system.textContent = system;
|
|
140
|
+
this.system_id.textContent = name;
|
|
141
|
+
this.keys.textContent = keys;
|
|
142
|
+
this.setAttribute('aria-label', fill(this.getAttribute('label') ?? 'Protected by {system}, {keys}', { system, keys }));
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
//# sourceMappingURL=drm-badge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"drm-badge.js","sourceRoot":"","sources":["../../src/elements/drm-badge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.d.ts","sourceRoot":"","sources":["../../src/elements/duration.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,qBAAa,WAAY,SAAQ,WAAW;;cAKvB,MAAM,IAAI,IAAI;CAQlC"}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <mbx-duration>: the duration, "4:56", once the metadata is in. A live
|
|
3
|
+
* stream has none, so the element hides while the stream is live.
|
|
4
|
+
*/
|
|
5
|
+
import { live, span } from '../controls/session.js';
|
|
6
|
+
import { format } from '../controls/time.js';
|
|
7
|
+
import { TimeElement } from './time-element.js';
|
|
8
|
+
export class MbxDuration extends TimeElement {
|
|
9
|
+
constructor() {
|
|
10
|
+
super(':host { text-align: right; }');
|
|
11
|
+
}
|
|
12
|
+
render() {
|
|
13
|
+
const player = this.player;
|
|
14
|
+
if (player === null)
|
|
15
|
+
return;
|
|
16
|
+
const engine = player.engine;
|
|
17
|
+
const on = live(engine) !== undefined;
|
|
18
|
+
this.hidden = on;
|
|
19
|
+
if (!on)
|
|
20
|
+
this.text.data = format(span(player.video, engine).end);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
//# sourceMappingURL=duration.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"duration.js","sourceRoot":"","sources":["../../src/elements/duration.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,wBAAwB,CAAC;AACpD,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAEhD,MAAM,OAAO,WAAY,SAAQ,WAAW;IAC1C;QACE,KAAK,CAAC,8BAA8B,CAAC,CAAC;IACxC,CAAC;IAEkB,MAAM;QACvB,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAC3B,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO;QAC5B,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;QAC7B,MAAM,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,KAAK,SAAS,CAAC;QACtC,IAAI,CAAC,MAAM,GAAG,EAAE,CAAC;QACjB,IAAI,CAAC,EAAE;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC;IACnE,CAAC;CACF"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PlayerHost } from '../host.js';
|
|
2
|
+
import { Component } from './component.js';
|
|
3
|
+
export declare class MbxErrorScreen extends Component {
|
|
4
|
+
static get observedAttributes(): readonly string[];
|
|
5
|
+
private readonly title_;
|
|
6
|
+
private readonly category;
|
|
7
|
+
private readonly code;
|
|
8
|
+
private readonly retry;
|
|
9
|
+
constructor();
|
|
10
|
+
/** Hidden and named before attaching: a constructor must not add attributes. */
|
|
11
|
+
connectedCallback(): void;
|
|
12
|
+
private show;
|
|
13
|
+
protected attach(player: PlayerHost): void;
|
|
14
|
+
protected detach(): void;
|
|
15
|
+
protected render(): void;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=error-screen.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error-screen.d.ts","sourceRoot":"","sources":["../../src/elements/error-screen.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAC7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAkC3C,qBAAa,cAAe,SAAQ,SAAS;IAC3C,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAED,iBAAyB,MAAM,CAAc;IAC7C,iBAAyB,QAAQ,CAAc;IAC/C,iBAAyB,IAAI,CAAc;IAC3C,iBAAyB,KAAK,CAAoB;;IAwBlD,gFAAgF;IACvE,iBAAiB,IAAI,IAAI;IAMlC,OAAO,CAAC,IAAI;cAMO,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;cAsBhC,MAAM,IAAI,IAAI;cAId,MAAM,IAAI,IAAI;CAIlC"}
|