@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,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`, or under it with `subtree`, until detach. */
|
|
37
|
+
protected observe(target: Element, names: readonly string[], fn: () => void, subtree?: boolean): 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,mGAAmG;IACnG,SAAS,CAAC,OAAO,CACf,MAAM,EAAE,OAAO,EACf,KAAK,EAAE,SAAS,MAAM,EAAE,EACxB,EAAE,EAAE,MAAM,IAAI,EACd,OAAO,UAAQ,GACd,IAAI;IAQP,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`, or under it with `subtree`, until detach. */
|
|
78
|
+
observe(target, names, fn, subtree = false) {
|
|
79
|
+
const observer = new MutationObserver(fn);
|
|
80
|
+
observer.observe(target, { attributes: true, attributeFilter: [...names], subtree });
|
|
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,75 @@
|
|
|
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 type { PlayerHost } from '../host.js';
|
|
36
|
+
import { Component } from './component.js';
|
|
37
|
+
export declare class MbxControlBar extends Component {
|
|
38
|
+
static get observedAttributes(): readonly string[];
|
|
39
|
+
private readonly seekRow;
|
|
40
|
+
private readonly buttonsRow;
|
|
41
|
+
private readonly buttons;
|
|
42
|
+
private timer;
|
|
43
|
+
/** Fires on a width change of the buttons row, so the collapse follows the page's layout. */
|
|
44
|
+
private resizer;
|
|
45
|
+
/** Whether the last input was a key, so focus inside holds the bar. */
|
|
46
|
+
private keyboard;
|
|
47
|
+
private cues;
|
|
48
|
+
private screen;
|
|
49
|
+
constructor();
|
|
50
|
+
/**
|
|
51
|
+
* What the buttons need: their widths and the gaps between them, the
|
|
52
|
+
* spacer aside since it takes what is left, and a folded slider at the
|
|
53
|
+
* width it unfolds to. The row's own width says nothing, because the
|
|
54
|
+
* spacer fills it whatever the buttons take.
|
|
55
|
+
*/
|
|
56
|
+
private needed;
|
|
57
|
+
/**
|
|
58
|
+
* Collapses the buttons row to its width. Everything is shown first, so
|
|
59
|
+
* a wider bar gets its controls back, then the highest priorities go one
|
|
60
|
+
* at a time while the buttons need more than the row has, less the
|
|
61
|
+
* slack. Each step lays the row out again; a bar carries a dozen
|
|
62
|
+
* controls, so that is cheap.
|
|
63
|
+
*/
|
|
64
|
+
private collapse;
|
|
65
|
+
/** From the first row's top to the bar's bottom: what the bar covers of the picture. */
|
|
66
|
+
private covered;
|
|
67
|
+
private held;
|
|
68
|
+
private idle;
|
|
69
|
+
private sleep;
|
|
70
|
+
private wake;
|
|
71
|
+
private key;
|
|
72
|
+
protected attach(player: PlayerHost): void;
|
|
73
|
+
protected detach(player: PlayerHost): void;
|
|
74
|
+
}
|
|
75
|
+
//# 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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AAMH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAe7C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAgG3C,qBAAa,aAAc,SAAQ,SAAS;IAC1C,MAAM,KAAK,kBAAkB,IAAI,SAAS,MAAM,EAAE,CAEjD;IAED,iBAAyB,OAAO,CAAiB;IACjD,iBAAyB,UAAU,CAAiB;IACpD,iBAAyB,OAAO,CAAkB;IAClD,QAAgB,KAAK,CAA4C;IACjE,6FAA6F;IAC7F,QAAgB,OAAO,CAAwB;IAC/C,uEAAuE;IACvE,QAAgB,QAAQ,CAAU;IAClC,QAAgB,IAAI,CAAiB;IACrC,QAAgB,MAAM,CAAoB;;IAsB1C;;;;;OAKG;IACH,OAAO,CAAC,MAAM;IAgBd;;;;;;OAMG;IACH,OAAO,CAAC,QAAQ;IAyBhB,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;cAmDhC,MAAM,CAAC,MAAM,EAAE,UAAU,GAAG,IAAI;CAgBpD"}
|