@gcorevideo/player 2.25.6 → 2.25.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (45) hide show
  1. package/assets/audio-tracks/template.ejs +5 -4
  2. package/assets/bottom-gear/gear-sub-menu.scss +4 -9
  3. package/assets/bottom-gear/gear.scss +1 -2
  4. package/assets/media-control/container.scss +0 -13
  5. package/assets/media-control/media-control.scss +110 -8
  6. package/assets/media-control/width270.scss +3 -9
  7. package/assets/media-control/width370.scss +6 -40
  8. package/assets/multi-camera/style.scss +0 -5
  9. package/assets/picture-in-picture/style.scss +1 -2
  10. package/assets/subtitles/combobox.ejs +27 -6
  11. package/assets/subtitles/string.ejs +1 -1
  12. package/assets/subtitles/style.scss +16 -69
  13. package/dist/core.js +1 -1
  14. package/dist/index.css +1019 -1117
  15. package/dist/index.embed.js +180 -123
  16. package/dist/index.js +161 -107
  17. package/lib/plugins/audio-selector/AudioTracks.d.ts +4 -3
  18. package/lib/plugins/audio-selector/AudioTracks.d.ts.map +1 -1
  19. package/lib/plugins/audio-selector/AudioTracks.js +41 -23
  20. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
  21. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  22. package/lib/plugins/bottom-gear/BottomGear.js +3 -4
  23. package/lib/plugins/media-control/MediaControl.d.ts +4 -0
  24. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  25. package/lib/plugins/media-control/MediaControl.js +8 -1
  26. package/lib/plugins/subtitles/ClosedCaptions.d.ts +7 -4
  27. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  28. package/lib/plugins/subtitles/ClosedCaptions.js +64 -34
  29. package/lib/testUtils.d.ts.map +1 -1
  30. package/lib/testUtils.js +2 -0
  31. package/package.json +1 -1
  32. package/src/plugins/audio-selector/AudioTracks.ts +53 -29
  33. package/src/plugins/audio-selector/__tests__/AudioTracks.test.ts +60 -45
  34. package/src/plugins/audio-selector/__tests__/__snapshots__/AudioSelector.test.ts.snap +24 -24
  35. package/src/plugins/audio-selector/__tests__/__snapshots__/AudioTracks.test.ts.snap +21 -18
  36. package/src/plugins/bottom-gear/BottomGear.ts +3 -4
  37. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -1
  38. package/src/plugins/media-control/MediaControl.ts +11 -1
  39. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +6 -6
  40. package/src/plugins/subtitles/ClosedCaptions.ts +66 -35
  41. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +220 -35
  42. package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +8 -19
  43. package/src/testUtils.ts +2 -0
  44. package/tsconfig.tsbuildinfo +1 -1
  45. package/assets/audio-tracks/style.scss +0 -111
@@ -12524,7 +12524,7 @@ var PlaybackEvents;
12524
12524
  // https://github.com/clappr/clappr/blob/8752995ea439321ac7ca3cd35e8c64de7a3c3d17/LICENSE
12525
12525
  const AUTO$1 = -1;
12526
12526
  const { now: now$2 } = Utils;
12527
- const T$e = 'playback.dash';
12527
+ const T$d = 'playback.dash';
12528
12528
  class DashPlayback extends BasePlayback {
12529
12529
  _levels = null;
12530
12530
  _currentLevel = null;
@@ -12873,7 +12873,7 @@ class DashPlayback extends BasePlayback {
12873
12873
  if (!this._dash) {
12874
12874
  return false;
12875
12875
  }
12876
- trace(`${T$e} get.dvrEnabled`, {
12876
+ trace(`${T$d} get.dvrEnabled`, {
12877
12877
  dvrWindowSize: this._dash?.getDVRWindowSize(),
12878
12878
  minDvrSize: this._minDvrSize,
12879
12879
  playbackType: this.getPlaybackType(),
@@ -12895,7 +12895,7 @@ class DashPlayback extends BasePlayback {
12895
12895
  this.trigger(Events$1.PLAYBACK_PROGRESS, progress, {});
12896
12896
  }
12897
12897
  play() {
12898
- trace(`${T$e} play`, { dash: !!this._dash });
12898
+ trace(`${T$d} play`, { dash: !!this._dash });
12899
12899
  !this._dash && this._setup();
12900
12900
  super.play();
12901
12901
  this._startTimeUpdateTimer();
@@ -41688,7 +41688,7 @@ const AUTO = -1;
41688
41688
  const DEFAULT_RECOVER_ATTEMPTS = 16;
41689
41689
  Events$1.register('PLAYBACK_FRAGMENT_CHANGED');
41690
41690
  Events$1.register('PLAYBACK_FRAGMENT_PARSING_METADATA');
41691
- const T$d = 'playback.hls';
41691
+ const T$c = 'playback.hls';
41692
41692
  class HlsPlayback extends BasePlayback {
41693
41693
  _ccIsSetup = false;
41694
41694
  _ccTracksUpdated = false;
@@ -42012,7 +42012,7 @@ class HlsPlayback extends BasePlayback {
42012
42012
  }
42013
42013
  else {
42014
42014
  Log.error('hlsjs: failed to recover', { evt, data });
42015
- trace(`${T$d} _recover failed to recover`, {
42015
+ trace(`${T$c} _recover failed to recover`, {
42016
42016
  type: data.type,
42017
42017
  details: data.details,
42018
42018
  });
@@ -42098,7 +42098,7 @@ class HlsPlayback extends BasePlayback {
42098
42098
  this.trigger(Events$1.PLAYBACK_SETTINGSUPDATE);
42099
42099
  }
42100
42100
  _onHLSJSError(evt, data) {
42101
- trace(`${T$d} _onHLSJSError`, {
42101
+ trace(`${T$c} _onHLSJSError`, {
42102
42102
  fatal: data.fatal,
42103
42103
  type: data.type,
42104
42104
  details: data.details,
@@ -42146,7 +42146,7 @@ class HlsPlayback extends BasePlayback {
42146
42146
  evt,
42147
42147
  data,
42148
42148
  });
42149
- trace(`${T$d} _onHLSJSError trying to recover from network error`, {
42149
+ trace(`${T$c} _onHLSJSError trying to recover from network error`, {
42150
42150
  details: data.details,
42151
42151
  });
42152
42152
  error.level = PlayerError.Levels.WARN;
@@ -42159,7 +42159,7 @@ class HlsPlayback extends BasePlayback {
42159
42159
  evt,
42160
42160
  data,
42161
42161
  });
42162
- trace(`${T$d} _onHLSJSError trying to recover from media error`, {
42162
+ trace(`${T$c} _onHLSJSError trying to recover from media error`, {
42163
42163
  details: data.details,
42164
42164
  });
42165
42165
  error.level = PlayerError.Levels.WARN;
@@ -42189,7 +42189,7 @@ class HlsPlayback extends BasePlayback {
42189
42189
  return;
42190
42190
  }
42191
42191
  Log.warn('hlsjs: non-fatal error occurred', { evt, data });
42192
- trace(`${T$d} _onHLSJSError non-fatal error occurred`, {
42192
+ trace(`${T$c} _onHLSJSError non-fatal error occurred`, {
42193
42193
  type: data.type,
42194
42194
  details: data.details,
42195
42195
  });
@@ -42546,7 +42546,7 @@ function toClapprTrack(t) {
42546
42546
  };
42547
42547
  }
42548
42548
 
42549
- const T$c = 'playback.html5_video';
42549
+ const T$b = 'playback.html5_video';
42550
42550
  const STALL_TIMEOUT = 15000;
42551
42551
  class HTML5Video extends BasePlayback {
42552
42552
  stallTimerId = null;
@@ -42554,7 +42554,7 @@ class HTML5Video extends BasePlayback {
42554
42554
  * @internal
42555
42555
  */
42556
42556
  createError(errorData, options) {
42557
- trace(`${T$c} createError`, {
42557
+ trace(`${T$b} createError`, {
42558
42558
  errorData: { ...errorData },
42559
42559
  });
42560
42560
  const i18n = this.i18n ||
@@ -42580,12 +42580,12 @@ class HTML5Video extends BasePlayback {
42580
42580
  super._onEnded();
42581
42581
  }
42582
42582
  _handleBufferingEvents() {
42583
- trace(`${T$c} _handleBufferingEvents`, {
42583
+ trace(`${T$b} _handleBufferingEvents`, {
42584
42584
  networkState: this.el.networkState,
42585
42585
  });
42586
42586
  if (!this.stallTimerId) {
42587
42587
  this.stallTimerId = setTimeout(() => {
42588
- trace(`${T$c} _handleBufferingEvents stall timeout`, {
42588
+ trace(`${T$b} _handleBufferingEvents stall timeout`, {
42589
42589
  buffering: this.buffering,
42590
42590
  ended: this.ended,
42591
42591
  });
@@ -42671,7 +42671,7 @@ function registerPlaybacks() {
42671
42671
  Loader.registerPlayback(DashPlayback);
42672
42672
  }
42673
42673
 
42674
- const T$b = 'gplayer';
42674
+ const T$a = 'gplayer';
42675
42675
  const DEFAULT_OPTIONS = {
42676
42676
  autoPlay: false,
42677
42677
  debug: 'none',
@@ -42759,7 +42759,7 @@ class Player {
42759
42759
  * ```
42760
42760
  */
42761
42761
  attachTo(playerElement) {
42762
- trace(`${T$b} attachTo`, {
42762
+ trace(`${T$a} attachTo`, {
42763
42763
  player: !!this.player,
42764
42764
  });
42765
42765
  assert.ok(!this.player, 'Player already initialized');
@@ -42769,7 +42769,7 @@ class Player {
42769
42769
  }
42770
42770
  const coreOpts = this.buildCoreOptions(playerElement);
42771
42771
  const { core, container } = Player.getRegisteredPlugins();
42772
- trace(`${T$b} init`, {
42772
+ trace(`${T$a} init`, {
42773
42773
  registeredPlaybacks: Loader.registeredPlaybacks.map((p) => p.prototype.name),
42774
42774
  });
42775
42775
  coreOpts.plugins = {
@@ -42783,7 +42783,7 @@ class Player {
42783
42783
  * Destroys the player, releasing all resources and unmounting its UI from the DOM.
42784
42784
  */
42785
42785
  destroy() {
42786
- trace(`${T$b} destroy`, {
42786
+ trace(`${T$a} destroy`, {
42787
42787
  player: !!this.player,
42788
42788
  });
42789
42789
  if (this.player) {
@@ -42970,7 +42970,7 @@ class Player {
42970
42970
  this.config = $.extend(true, this.config, config);
42971
42971
  }
42972
42972
  initPlayer(coreOptions) {
42973
- trace(`${T$b} initPlayer`, {
42973
+ trace(`${T$a} initPlayer`, {
42974
42974
  autoPlay: coreOptions.autoPlay,
42975
42975
  sources: coreOptions.sources,
42976
42976
  player: !!this.player,
@@ -43010,7 +43010,7 @@ class Player {
43010
43010
  // TODO test
43011
43011
  events = {
43012
43012
  onReady: () => {
43013
- trace(`${T$b} onReady`, {
43013
+ trace(`${T$a} onReady`, {
43014
43014
  ready: this.ready,
43015
43015
  });
43016
43016
  if (this.ready) {
@@ -43100,7 +43100,7 @@ class Player {
43100
43100
  assert.ok(this.player, 'Player is not initialized');
43101
43101
  const core = this.player.core;
43102
43102
  core.on(Events$1.CORE_SCREEN_ORIENTATION_CHANGED, ({ orientation }) => {
43103
- trace(`${T$b} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43103
+ trace(`${T$a} on CORE_SCREEN_ORIENTATION_CHANGED`, {
43104
43104
  rootNode: {
43105
43105
  width: this.rootNode?.clientWidth,
43106
43106
  height: this.rootNode?.clientHeight,
@@ -43134,9 +43134,7 @@ function insertStyle(css) {
43134
43134
 
43135
43135
  insertStyle("@import \"https://fonts.googleapis.com/css?family=Roboto\";\n:root {\n --theme-background-color: rgb(0 0 0 / 70%);\n --theme-text-color: rgb(255 255 255 / 100%);\n --theme-foreground-color: rgb(201 201 201 / 100%);\n --theme-hover-color: rgb(255 255 255 / 100%);\n}\n\n.gcore-skin-bg-color {\n background-color: var(--theme-background-color) !important;\n}\n\n.gcore-skin-text-color {\n color: var(--theme-text-color) !important;\n}\n\n.gcore-skin-text-color svg {\n fill: var(--theme-text-color) !important;\n}\n\n.gcore-skin-text-color svg path {\n fill: var(--theme-text-color) !important;\n}\n\n.gcore-skin-border-textarea-color {\n border-color: var(--theme-text-color) !important;\n}\n\n.gcore-skin-button-color {\n color: var(--theme-foreground-color) !important;\n}\n.gcore-skin-button-color svg {\n fill: var(--theme-foreground-color) !important;\n}\n.gcore-skin-button-color svg path {\n fill: var(--theme-foreground-color) !important;\n}\n.gcore-skin-button-color svg path.icon-hover {\n fill: var(--theme-foreground-color) !important;\n}\n.gcore-skin-button-color[data-fullscreen] svg {\n stroke: var(--theme-foreground-color) !important;\n}\n.gcore-skin-button-color[data-fullscreen] svg path {\n stroke: var(--theme-foreground-color) !important;\n}\n\n.gcore-skin-main-color {\n background-color: var(--theme-foreground-color);\n}\n\n.gcore-skin-border-color {\n border-color: var(--theme-foreground-color) !important;\n}\n\n.gcore-skin-button-color:hover {\n color: var(--theme-hover-color) !important;\n}\n\n.gcore-skin-button-color:hover svg {\n fill: var(--theme-hover-color) !important;\n}\n\n.gcore-skin-button-color:hover svg path {\n fill: var(--theme-hover-color) !important;\n}\n\n.gcore-skin-border-color:hover {\n border-color: var(--theme-hover-color) !important;\n}\n\n.gcore-skin-button-with-bg-color:hover svg path.icon-hover {\n fill: var(--theme-hover-color) !important;\n}\n\n.gcore-skin-active {\n color: var(--theme-hover-color) !important;\n}\n\n.gcore-skin-active svg {\n fill: var(--theme-hover-color) !important;\n}\n\n.gcore-skin-active svg path {\n fill: var(--theme-hover-color) !important;\n}\n\n* {\n -webkit-tap-highlight-color: transparent;\n -webkit-touch-callout: none;\n user-select: none;\n}\n\n.player-poster {\n background-size: contain !important;\n}\n\n.spinner-three-bounce > .gcore-skin-main-color {\n box-shadow: 4px 4px 9px 1px rgba(36, 61, 81, 0.51);\n}\n\n.gplayer-lite-btn {\n cursor: pointer;\n border: none;\n margin: 0;\n padding: 0;\n width: auto;\n overflow: visible;\n background: transparent;\n /* inherit font & color from ancestor */\n color: inherit;\n font: inherit;\n /* Normalize `line-height`. Cannot be changed from `normal` in Firefox 4+. */\n line-height: normal;\n /* Corrects font smoothing for webkit */\n -webkit-font-smoothing: inherit;\n -moz-osx-font-smoothing: inherit;\n /* Corrects inability to style clickable `input` types in iOS */\n appearance: none;\n /* Remove excess padding and border in Firefox 4+ */\n}\n.gplayer-lite-btn::-moz-focus-inner {\n border: 0;\n padding: 0;\n}");
43136
43136
 
43137
- const pluginHtml$4 = "<button data-audiotracks-button class='gcore-skin-button-color' id=\"audiotracks-button\" aria-haspopup=\"menu\" aria-expanded=\"false\">\n <span class='audio-text'><%= title %></span> <span class=\"audio-arrow\"><%= icon %></span>\n</button>\n<ul class='gcore-skin-bg-color menu hidden' id=\"audiotracks-select\" role=\"menu\">\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-audiotracks-select=\"<%= track.id %>\" role=\"menuitemradio\" aria-checked=\"<%= track.id === current %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
43138
-
43139
- insertStyle("*,\n:focus,\n:visited {\n outline: none !important;\n}\n\n.media-control-audiotracks {\n position: relative;\n}\n.media-control-audiotracks button {\n background-color: transparent;\n color: #fff;\n -webkit-font-smoothing: antialiased;\n border: none;\n cursor: pointer;\n display: flex;\n align-items: center;\n padding: 0;\n}\n.media-control-audiotracks button .audio-text {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n max-width: 100px;\n background-color: transparent;\n -webkit-font-smoothing: antialiased;\n border: none;\n cursor: pointer;\n}\n.media-control-audiotracks button:hover {\n color: white;\n}\n.media-control-audiotracks button.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.media-control-audiotracks button span.audio-arrow {\n width: 9px;\n height: 6px;\n margin-left: 5px;\n}\n.media-control-audiotracks .menu {\n max-width: 114px;\n list-style-type: none;\n position: absolute;\n background-color: rgba(74, 74, 74, 0.6);\n border: none;\n min-width: 60px;\n border-radius: 4px;\n bottom: 40px;\n right: -2px;\n}\n.media-control-audiotracks .menu.hidden {\n display: none;\n}\n.media-control-audiotracks li {\n font-size: var(--font-size-media-controls-dropdown);\n text-align: right;\n height: 30px;\n}\n.media-control-audiotracks li[data-title] {\n background-color: #c3c2c2;\n padding: 5px;\n}\n.media-control-audiotracks li a {\n display: block;\n text-decoration: none;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n height: 30px;\n padding: 5px 10px;\n color: #fffffe;\n}\n.media-control-audiotracks li a:hover {\n text-decoration: none;\n background-color: rgba(0, 0, 0, 0.4);\n color: white;\n}\n.media-control-audiotracks li.current a {\n color: #f00;\n}\n.media-control-audiotracks li:first-child a {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.media-control-audiotracks li:last-child a {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}");
43137
+ const pluginHtml$4 = "<button class='gcore-skin-button-color media-control-dd' id=\"gplayer-audiotracks-button\" aria-haspopup=\"menu\" aria-expanded=\"false\">\n <span class=\"media-control-dd__text\" id=\"gplayer-audiotracks-button-text\"><%= title %></span>\n <span class=\"media-control-dd__arrow\"><%= icon %></span>\n</button>\n<ul class=\"gcore-skin-bg-color menu media-control-dd__popup\" id=\"gplayer-audiotracks-menu\" role=\"menu\">\n <% for (const track of tracks) { %>\n <li>\n <a href=\"#\" class=\"gcore-skin-text-color\" data-item=\"<%= track.id %>\" role=\"menuitemradio\" aria-checked=\"<%= track.id === current %>\">\n <%= track.label %>\n </a>\n </li>\n <% }; %>\n</ul>\n";
43140
43138
 
43141
43139
  const audioArrow = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<svg width=\"9px\" height=\"6px\" viewBox=\"0 0 9 6\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\">\n <!-- Generator: Sketch 49 (51002) - http://www.bohemiancoding.com/sketch -->\n <title>quality-arrow</title>\n <desc>Created with Sketch.</desc>\n <defs></defs>\n <g id=\"quality-arrow\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <path\n d=\"M5.07079194,5.78553848 C4.91457318,5.94277844 4.70551573,6.00941824 4.50028717,5.99893557 C4.2950586,6.00941824 4.08676693,5.94277844 3.92978239,5.78553848 L0.221118462,1.2997069 C-0.0737061539,1.00469478 -0.0737061539,0.526236029 0.221118462,0.231972666 C0.515177299,-0.0630394586 1.23500883,0.00734414472 1.64852907,0.00734414472 L7.77475484,0.00734414472 C8.21201421,0.00734414472 8.48539703,-0.0630394586 8.77945587,0.231972666 C9.07351471,0.526236029 9.07351471,1.00469478 8.77945587,1.2997069 L5.07079194,5.78553848 Z\"\n fill=\"#FFFFFE\"></path>\n </g>\n</svg>\n";
43142
43140
 
@@ -43398,7 +43396,7 @@ const FullscreenIOS = {
43398
43396
  },
43399
43397
  };
43400
43398
 
43401
- insertStyle("[data-player] {\n --bottom-panel: 40px;\n}\n\n.container .media-control-notransition {\n transition: none !important;\n}\n.container .player-poster .play-wrapper {\n opacity: 1;\n}\n.container.crop-video [data-html5-video] {\n object-fit: cover;\n}\n.container .cc-line {\n position: absolute;\n bottom: calc(var(--bottom-panel) + 5px);\n width: 100%;\n}\n.container .cc-line p {\n width: auto;\n background-color: rgba(0, 0, 0, 0.4);\n color: white;\n display: inline-block;\n}\n.container .player-poster .circle-poster {\n top: 50%;\n margin-top: -60px;\n left: 50%;\n margin-left: -60px;\n position: absolute;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n}\n.container .player-poster .circle-poster svg {\n margin-left: 5px;\n width: 80px;\n}\n.container .spinner-three-bounce[data-spinner] > div {\n background-color: #ff5700;\n}\n\n.media-control-skin-1.w270 .media-control-quality,\n.media-control-skin-1.w270 .media-control-audiotracks {\n display: none;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n transform: rotate(270deg);\n float: none;\n display: block;\n position: absolute;\n /* bottom: 12px; */\n margin: 0;\n top: -40px;\n padding: 0;\n /* right: 20px; */\n margin-left: -32px;\n margin-top: -3px;\n width: 80px;\n /* padding-left: 12px; */\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-background-mask {\n position: absolute;\n width: 100%;\n height: 100%;\n left: -5px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume].volume-bar-hide {\n display: none;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-background {\n margin-left: 11px;\n top: 7px;\n width: 80px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber {\n margin-left: 11px;\n top: 1px;\n}\n\n.media-control-skin-1.w370 .media-control-cc {\n width: 28px;\n}\n.media-control-skin-1.w370 .media-control-cc svg {\n height: 17px;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container {\n top: calc(50% - 150px);\n left: calc(50% - 125px);\n width: 250px;\n height: calc(100% - 32px);\n max-height: 300px;\n transform: none;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container .share-container-header {\n border: none;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container .share-container-header .share-container-header--title {\n visibility: hidden;\n}\n.media-control-skin-1.w370 .media-control-quality,\n.media-control-skin-1.w370 .media-control-audiotracks {\n display: block;\n}\n.media-control-skin-1.w370 .media-control-audiotracks[data-audiotracks] {\n margin-top: 3px;\n margin-right: 10px;\n}\n.media-control-skin-1.w370 .media-control-audiotracks[data-audiotracks] ul {\n bottom: 30px;\n width: 50px;\n}\n.media-control-skin-1.w370 .media-control-audiotracks[data-audiotracks] ul li {\n height: 23px;\n font-size: 14px;\n}\n.media-control-skin-1.w370 .media-control-audiotracks[data-audiotracks] ul li a {\n height: 23px;\n padding: 2px 5px;\n}\n.media-control-skin-1.w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] .quality-text,\n.media-control-skin-1.w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] .audio-text {\n font-size: 13px;\n}\n.media-control-skin-1.w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] span.quality-arrow,\n.media-control-skin-1.w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] span.audio-arrow {\n width: 7px;\n height: 5px;\n margin-left: 4px;\n margin-top: 11px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera {\n margin-top: 0;\n margin-right: 10px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera button {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera button svg {\n height: 17px;\n margin: 0;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] {\n padding-left: 10px;\n padding-right: 12px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator {\n line-height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator[data-position], .media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator[data-duration] {\n font-size: 11px;\n line-height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-button {\n margin-left: 10px;\n height: 32px;\n font-size: 12px;\n line-height: 32px;\n text-shadow: none;\n letter-spacing: 0.6px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-button::before {\n width: 8px;\n height: 8px;\n margin-right: 4px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-info {\n margin-left: 10px;\n height: 32px;\n font-size: 12px;\n line-height: 32px;\n text-shadow: none;\n letter-spacing: 0.6px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-info::before {\n width: 8px;\n height: 8px;\n margin-right: 4px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] button.media-control-button[data-fullscreen] {\n height: 33px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] button.media-control-button svg {\n height: 17px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-clips .gplayer-mc-clips-text {\n line-height: 33px;\n font-size: 11px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-clips .gplayer-mc-clips-text {\n max-width: 50px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] {\n height: 32px;\n margin-right: 8px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg {\n height: 17px;\n margin-top: 5px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n display: none;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume].volume-bar-hide {\n width: 0;\n height: 12px;\n top: 9px;\n padding: 0;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-button,\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-panel-item {\n height: 32px;\n}\n\n:root {\n --font-size-media-controls: 14px;\n --font-size-media-controls-dropdown: 16px;\n --player-vod-color: #005aff;\n --player-dvr-color: #fff;\n --player-live-color: #ff0101;\n --player-seekbar-current-color: #ff5700;\n --player-seekbar-buffer-color: #fff;\n --gplayer-mc-text-color: #fff;\n --gplayer-mc-popup-border-color: rgba(255, 255, 255, 0.1);\n}\n\n.media-control-skin-1 {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 9999;\n pointer-events: none;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n font-size: var(--font-size-media-controls);\n}\n.media-control-skin-1.dragging {\n pointer-events: auto;\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1.dragging * {\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1 .media-control-icon {\n line-height: 0;\n letter-spacing: 0;\n speak: none;\n color: var(--gplayer-mc-text-color);\n vertical-align: middle;\n text-align: left;\n transition: all 0.1s ease;\n}\n.media-control-skin-1 .media-control-icon:hover {\n color: white;\n}\n.media-control-skin-1.media-control-hide .media-control-background[data-background] {\n opacity: 0;\n}\n.media-control-skin-1.media-control-hide .media-control-layer[data-controls] {\n bottom: -50px;\n}\n.media-control-skin-1.media-control-hide .media-control-layer[data-controls] .bar-scrubber[data-seekbar] {\n opacity: 0;\n}\n.media-control-skin-1 .media-control-layer[data-controls] {\n position: absolute;\n bottom: 0;\n width: 100%;\n padding: 0 12px 0 8px;\n height: var(--bottom-panel);\n vertical-align: middle;\n pointer-events: auto;\n transition: bottom 0.4s ease-out;\n display: flex;\n justify-content: space-between;\n}\n.media-control-skin-1 .media-control-left-panel {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n justify-content: flex-start;\n}\n.media-control-skin-1 .media-control-button,\n.media-control-skin-1 .media-control-indicator,\n.media-control-skin-1 .gplayer-mc-panel-item {\n order: 50;\n}\n.media-control-skin-1 [data-playpause],\n.media-control-skin-1 [data-playstop] {\n order: 1;\n}\n.media-control-skin-1 [data-volume] {\n order: 2;\n}\n.media-control-skin-1 [data-position] {\n order: 3;\n}\n.media-control-skin-1 [data-duration] {\n order: 3;\n}\n.media-control-skin-1 .media-control-center-panel {\n height: 100%;\n text-align: center;\n line-height: var(--bottom-panel);\n}\n.media-control-skin-1 .media-control-right-panel {\n display: flex;\n align-items: center;\n gap: 1rem;\n justify-content: flex-end;\n}\n@media (max-width: 420px) {\n .media-control-skin-1 .media-control-right-panel {\n gap: 0.5rem;\n overflow: hidden;\n }\n}\n.media-control-skin-1 button.media-control-button {\n background-color: transparent;\n border: 0;\n padding: 0;\n cursor: pointer;\n display: inline-block;\n height: 20px;\n width: 24px;\n}\n.media-control-skin-1 button.media-control-button svg {\n height: 20px;\n}\n.media-control-skin-1 button.media-control-button svg path {\n fill: white;\n}\n.media-control-skin-1 button.media-control-button:focus {\n outline: none;\n}\n.media-control-skin-1 button.media-control-button[data-play] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-pause] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-stop] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-fullscreen] {\n order: 100;\n background-color: transparent;\n border: 0;\n height: 40px;\n}\n.media-control-skin-1 button.media-control-button[data-hd-indicator] {\n background-color: transparent;\n border: 0;\n cursor: default;\n display: none !important;\n float: right;\n height: 100%;\n}\n.media-control-skin-1 .media-control-indicator[data-position], .media-control-skin-1 .media-control-indicator[data-duration] {\n display: flex;\n color: white;\n cursor: default;\n line-height: var(--bottom-panel);\n position: relative;\n}\n.media-control-skin-1 .media-control-indicator[data-position] {\n margin: 1px 0 0 7px;\n}\n.media-control-skin-1 .media-control-indicator[data-duration] {\n color: rgb(255, 255, 255);\n opacity: 0.5;\n margin-top: 1px;\n margin-right: 6px;\n}\n.media-control-skin-1 .media-control-indicator[data-duration]::before {\n content: \"|\";\n margin-right: 7px;\n}\n.media-control-skin-1 .bar-container[data-seekbar] {\n position: absolute;\n top: -11px;\n left: 0;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n height: 20px;\n cursor: pointer;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] {\n width: 100%;\n height: 3px;\n position: relative;\n top: 8px;\n background-color: #666;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-1[data-seekbar] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-seekbar-buffer-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-2[data-seekbar] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-seekbar-current-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-container[data-seekbar].seek-disabled {\n cursor: default;\n display: none;\n}\n.media-control-skin-1 .bar-container[data-seekbar].seek-disabled + .bar-scrubber[data-seekbar] {\n cursor: default;\n display: none;\n}\n.media-control-skin-1 .bar-scrubber[data-seekbar] {\n position: absolute;\n transform: translateX(-50%);\n top: -11.5px;\n left: 0;\n width: 20px;\n height: 20px;\n opacity: 1;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-scrubber[data-seekbar] .bar-scrubber-icon[data-seekbar] {\n position: absolute;\n left: 4.5px;\n top: 4.5px;\n width: 11px;\n height: 11px;\n border-radius: 50%;\n background-color: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] {\n display: flex;\n justify-content: flex-start;\n height: var(--bottom-panel);\n cursor: pointer;\n box-sizing: border-box;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] {\n bottom: 0;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] {\n background-color: transparent;\n border: 0;\n box-sizing: content-box;\n height: var(--bottom-panel);\n width: 20px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg {\n height: 20px;\n position: relative;\n top: 3px;\n margin-top: 7px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg path {\n fill: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume].muted svg {\n margin-left: 2px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] {\n position: relative;\n margin-left: 10px;\n top: 8px;\n width: 80px;\n height: 23px;\n padding: 3px 0;\n transition: width 0.2s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] {\n height: 3px;\n border-radius: 100px;\n position: relative;\n top: 7px;\n background-color: #666;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] .bar-fill-1[data-volume] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n border-radius: 100px;\n background-color: white;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] .bar-fill-2[data-volume] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-vod-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber[data-volume] {\n position: absolute;\n transform: translateX(-50%);\n top: 3px;\n margin-left: 3px;\n width: 16px;\n height: 16px;\n opacity: 1;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber[data-volume] .bar-scrubber-icon[data-volume] {\n position: absolute;\n left: 3px;\n top: 5px;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background-color: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume] {\n float: left;\n width: 4px;\n padding-left: 2px;\n height: 12px;\n opacity: 0.5;\n box-shadow: inset 2px 0 0 white;\n transition: transform 0.2s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume].fill {\n box-shadow: inset 2px 0 0 #fff;\n opacity: 1;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:nth-of-type(1) {\n padding-left: 0;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:hover {\n transform: scaleY(1.5);\n}\n\n/* TODO distribute between plugins' styles */\n.media-control-skin-1 .seek-time {\n height: 26px;\n line-height: 26px;\n bottom: 52px;\n border-radius: 3px;\n background-color: rgba(74, 74, 74, 0.7);\n}\n.media-control-skin-1 .seek-time span {\n letter-spacing: 0.8px;\n font-size: 14px;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n}\n.media-control-skin-1 .seek-time .seek-time__pos {\n padding-left: 8px;\n padding-right: 8px;\n}\n\n@keyframes pulse {\n 0% {\n color: #fff;\n }\n 50% {\n color: #ff0101;\n }\n 100% {\n color: #B80000;\n }\n}");
43399
+ insertStyle("[data-player] {\n --bottom-panel: 40px;\n}\n\n.container .media-control-notransition {\n transition: none !important;\n}\n.container .player-poster .play-wrapper {\n opacity: 1;\n}\n.container.crop-video [data-html5-video] {\n object-fit: cover;\n}\n.container .player-poster .circle-poster {\n top: 50%;\n margin-top: -60px;\n left: 50%;\n margin-left: -60px;\n position: absolute;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n}\n.container .player-poster .circle-poster svg {\n margin-left: 5px;\n width: 80px;\n}\n.container .spinner-three-bounce[data-spinner] > div {\n background-color: #ff5700;\n}\n\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n transform: rotate(270deg);\n float: none;\n display: block;\n position: absolute;\n margin: 0;\n top: -40px;\n padding: 0;\n margin-left: -32px;\n margin-top: -3px;\n width: 80px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-background-mask {\n position: absolute;\n width: 100%;\n height: 100%;\n left: -5px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume].volume-bar-hide {\n display: none;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-background {\n margin-left: 11px;\n top: 7px;\n width: 80px;\n}\n.media-control-skin-1.w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber {\n margin-left: 11px;\n top: 1px;\n}\n.media-control-skin-1.w270 .media-control-dd__popup {\n max-width: 114px;\n}\n\n.media-control-skin-1.w370 .media-control-cc {\n width: 28px;\n}\n.media-control-skin-1.w370 .media-control-cc svg {\n height: 17px;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container {\n top: calc(50% - 150px);\n left: calc(50% - 125px);\n width: 250px;\n height: calc(100% - 32px);\n max-height: 300px;\n transform: none;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container .share-container-header {\n border: none;\n}\n.media-control-skin-1.w370 .share_plugin[data-share] .share-container .share-container-header .share-container-header--title {\n visibility: hidden;\n}\n.media-control-skin-1.w370 .media-control-quality {\n display: block;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera {\n margin-top: 0;\n margin-right: 10px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera button {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-multicamera .multicamera button svg {\n height: 17px;\n margin: 0;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] {\n padding-left: 10px;\n padding-right: 12px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator {\n line-height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator[data-position], .media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-indicator[data-duration] {\n font-size: 11px;\n line-height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-button {\n margin-left: 10px;\n height: 32px;\n font-size: 12px;\n line-height: 32px;\n text-shadow: none;\n letter-spacing: 0.6px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-button::before {\n width: 8px;\n height: 8px;\n margin-right: 4px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-info {\n margin-left: 10px;\n height: 32px;\n font-size: 12px;\n line-height: 32px;\n text-shadow: none;\n letter-spacing: 0.6px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .dvr-controls .live-info::before {\n width: 8px;\n height: 8px;\n margin-right: 4px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] button.media-control-button[data-fullscreen] {\n height: 33px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] button.media-control-button svg {\n height: 17px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-clips .gplayer-mc-clips-text {\n line-height: 33px;\n font-size: 11px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .gplayer-mc-clips .gplayer-mc-clips-text {\n max-width: 50px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] {\n height: 32px;\n margin-right: 8px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg {\n height: 17px;\n margin-top: 5px;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n display: none;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume].volume-bar-hide {\n width: 0;\n height: 12px;\n top: 9px;\n padding: 0;\n}\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-button,\n.media-control-skin-1.w370 .media-control-layer[data-controls] .media-control-item {\n height: 32px;\n}\n.media-control-skin-1.w370 .media-control-dd__popup {\n max-width: 150px;\n}\n\n:root {\n --font-size-media-controls: 14px;\n --font-size-media-controls-dropdown: 16px;\n --gplayer-mc-font-size-dropdown: 16px;\n --player-vod-color: #005aff;\n --player-dvr-color: #fff;\n --player-live-color: #ff0101;\n --player-seekbar-current-color: #ff5700;\n --player-seekbar-buffer-color: #fff;\n --gplayer-mc-text-color: #fff;\n --gplayer-mc-text-dim-color: #fffffe;\n --gplayer-mc-popup-border-color: rgb(255 255 255 / 10%);\n --gplayer-mc-popup-bg: rgb(74 74 74 / 60%);\n}\n\n.media-control-skin-1 {\n position: absolute;\n width: 100%;\n height: 100%;\n z-index: 9999;\n pointer-events: none;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n font-size: var(--font-size-media-controls);\n}\n.media-control-skin-1.dragging {\n pointer-events: auto;\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1.dragging * {\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1 .media-control-icon {\n line-height: 0;\n letter-spacing: 0;\n speak: none;\n color: var(--gplayer-mc-text-color);\n vertical-align: middle;\n text-align: left;\n transition: all 0.1s ease;\n}\n.media-control-skin-1 .media-control-icon:hover {\n color: white;\n}\n.media-control-skin-1.media-control-hide .media-control-background[data-background] {\n opacity: 0;\n}\n.media-control-skin-1.media-control-hide .media-control-layer[data-controls] {\n bottom: -50px;\n}\n.media-control-skin-1.media-control-hide .media-control-layer[data-controls] .bar-scrubber[data-seekbar] {\n opacity: 0;\n}\n.media-control-skin-1 .media-control-layer[data-controls] {\n position: absolute;\n bottom: 0;\n width: 100%;\n padding: 0 12px 0 8px;\n height: var(--bottom-panel);\n vertical-align: middle;\n pointer-events: auto;\n transition: bottom 0.4s ease-out;\n display: flex;\n justify-content: space-between;\n}\n.media-control-skin-1 .media-control-left-panel {\n display: flex;\n align-items: center;\n gap: 0.5rem;\n justify-content: flex-start;\n}\n.media-control-skin-1 .media-control-button,\n.media-control-skin-1 .media-control-indicator,\n.media-control-skin-1 .media-control-item {\n order: 50;\n}\n.media-control-skin-1 .media-control-item {\n display: flex;\n align-items: center;\n}\n.media-control-skin-1 [data-playpause],\n.media-control-skin-1 [data-playstop] {\n order: 1;\n}\n.media-control-skin-1 [data-volume] {\n order: 2;\n}\n.media-control-skin-1 [data-position] {\n order: 3;\n}\n.media-control-skin-1 [data-duration] {\n order: 3;\n}\n.media-control-skin-1 .media-control-center-panel {\n height: 100%;\n text-align: center;\n line-height: var(--bottom-panel);\n}\n.media-control-skin-1 .media-control-right-panel {\n display: flex;\n align-items: center;\n gap: 1rem;\n justify-content: flex-end;\n}\n@media (max-width: 420px) {\n .media-control-skin-1 .media-control-right-panel {\n gap: 0.5rem;\n }\n}\n.media-control-skin-1 button.media-control-button {\n background-color: transparent;\n border: 0;\n padding: 0;\n cursor: pointer;\n display: inline-block;\n height: 20px;\n width: 24px;\n}\n.media-control-skin-1 button.media-control-button svg {\n height: 20px;\n}\n.media-control-skin-1 button.media-control-button svg path {\n fill: white;\n}\n.media-control-skin-1 button.media-control-button:focus {\n outline: none;\n}\n.media-control-skin-1 button.media-control-button[data-play] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-pause] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-stop] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1 button.media-control-button[data-fullscreen] {\n order: 100;\n background-color: transparent;\n border: 0;\n height: 40px;\n}\n.media-control-skin-1 button.media-control-button[data-hd-indicator] {\n background-color: transparent;\n border: 0;\n cursor: default;\n display: none !important;\n float: right;\n height: 100%;\n}\n.media-control-skin-1 .media-control-indicator[data-position], .media-control-skin-1 .media-control-indicator[data-duration] {\n display: flex;\n color: white;\n cursor: default;\n line-height: var(--bottom-panel);\n position: relative;\n}\n.media-control-skin-1 .media-control-indicator[data-position] {\n margin: 1px 0 0 7px;\n}\n.media-control-skin-1 .media-control-indicator[data-duration] {\n color: rgb(255, 255, 255);\n opacity: 0.5;\n margin-top: 1px;\n margin-right: 6px;\n}\n.media-control-skin-1 .media-control-indicator[data-duration]::before {\n content: \"|\";\n margin-right: 7px;\n}\n.media-control-skin-1 .bar-container[data-seekbar] {\n position: absolute;\n top: -11px;\n left: 0;\n display: inline-block;\n vertical-align: middle;\n width: 100%;\n height: 20px;\n cursor: pointer;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] {\n width: 100%;\n height: 3px;\n position: relative;\n top: 8px;\n background-color: #666;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-1[data-seekbar] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-seekbar-buffer-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-container[data-seekbar] .bar-background[data-seekbar] .bar-fill-2[data-seekbar] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-seekbar-current-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-container[data-seekbar].seek-disabled {\n cursor: default;\n display: none;\n}\n.media-control-skin-1 .bar-container[data-seekbar].seek-disabled + .bar-scrubber[data-seekbar] {\n cursor: default;\n display: none;\n}\n.media-control-skin-1 .bar-scrubber[data-seekbar] {\n position: absolute;\n transform: translateX(-50%);\n top: -11.5px;\n left: 0;\n width: 20px;\n height: 20px;\n opacity: 1;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .bar-scrubber[data-seekbar] .bar-scrubber-icon[data-seekbar] {\n position: absolute;\n left: 4.5px;\n top: 4.5px;\n width: 11px;\n height: 11px;\n border-radius: 50%;\n background-color: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] {\n display: flex;\n justify-content: flex-start;\n height: var(--bottom-panel);\n cursor: pointer;\n box-sizing: border-box;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] {\n bottom: 0;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] {\n background-color: transparent;\n border: 0;\n box-sizing: content-box;\n height: var(--bottom-panel);\n width: 20px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg {\n height: 20px;\n position: relative;\n top: 3px;\n margin-top: 7px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg path {\n fill: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume].muted svg {\n margin-left: 2px;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] {\n position: relative;\n margin-left: 10px;\n top: 8px;\n width: 80px;\n height: 23px;\n padding: 3px 0;\n transition: width 0.2s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] {\n height: 3px;\n border-radius: 100px;\n position: relative;\n top: 7px;\n background-color: #666;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] .bar-fill-1[data-volume] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n border-radius: 100px;\n background-color: white;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-background[data-volume] .bar-fill-2[data-volume] {\n position: absolute;\n top: 0;\n left: 0;\n width: 0;\n height: 100%;\n background-color: var(--player-vod-color);\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber[data-volume] {\n position: absolute;\n transform: translateX(-50%);\n top: 3px;\n margin-left: 3px;\n width: 16px;\n height: 16px;\n opacity: 1;\n transition: all 0.1s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .bar-scrubber[data-volume] .bar-scrubber-icon[data-volume] {\n position: absolute;\n left: 3px;\n top: 5px;\n width: 7px;\n height: 7px;\n border-radius: 50%;\n background-color: white;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume] {\n float: left;\n width: 4px;\n padding-left: 2px;\n height: 12px;\n opacity: 0.5;\n box-shadow: inset 2px 0 0 white;\n transition: transform 0.2s ease-out;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume].fill {\n box-shadow: inset 2px 0 0 #fff;\n opacity: 1;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:nth-of-type(1) {\n padding-left: 0;\n}\n.media-control-skin-1 .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:hover {\n transform: scaleY(1.5);\n}\n.media-control-skin-1 .seek-time {\n height: 26px;\n line-height: 26px;\n bottom: 52px;\n border-radius: 3px;\n background-color: rgba(74, 74, 74, 0.7);\n}\n.media-control-skin-1 .seek-time span {\n letter-spacing: 0.8px;\n font-size: 14px;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n}\n.media-control-skin-1 .seek-time .seek-time__pos {\n padding-left: 8px;\n padding-right: 8px;\n}\n.media-control-skin-1 .media-control-dd {\n display: flex;\n height: 32px;\n line-height: 32px;\n align-items: baseline;\n gap: 4px;\n vertical-align: baseline;\n padding: 0;\n background-color: transparent;\n color: var(--gplayer-mc-text-color);\n -webkit-font-smoothing: antialiased;\n border: none;\n cursor: pointer;\n}\n.media-control-skin-1 .media-control-dd__text {\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n max-width: 100px;\n}\n.media-control-skin-1 .media-control-dd.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.media-control-skin-1 .media-control-dd svg {\n fill: var(--gplayer-mc-text-color);\n}\n.media-control-skin-1 .media-control-dd__arrow {\n width: 9px;\n height: 6px;\n}\n.media-control-skin-1 .media-control-dd__wrap {\n position: relative;\n}\n.media-control-skin-1 .media-control-dd__popup {\n max-width: 200px;\n list-style-type: none;\n position: absolute;\n box-shadow: 0 0 1px 1px var(--gplayer-mc-popup-border-color);\n border: none;\n min-width: 60px;\n border-radius: 4px;\n bottom: 40px;\n right: -2px;\n overflow-x: hidden;\n overflow-y: auto;\n padding: 5px 0;\n}\n.media-control-skin-1 .media-control-dd__popup li {\n font-size: var(--gplayer-mc-font-size-dropdown);\n text-align: right;\n height: 30px;\n}\n.media-control-skin-1 .media-control-dd__popup li a {\n display: block;\n text-decoration: none;\n text-overflow: ellipsis;\n overflow: hidden;\n white-space: nowrap;\n padding: 5px 10px;\n line-height: 20px;\n color: #fffffe;\n}\n.media-control-skin-1 .media-control-dd__popup li a:hover {\n text-decoration: none;\n background-color: rgba(0, 0, 0, 0.4);\n color: var(--gplayer-mc-text-color);\n}\n.media-control-skin-1 .media-control-dd__popup li.current a {\n color: #f00;\n}\n.media-control-skin-1 .media-control-dd__popup li:first-child a {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.media-control-skin-1 .media-control-dd__popup li:last-child a {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n\n@keyframes pulse {\n 0% {\n color: #fff;\n }\n 50% {\n color: #ff0101;\n }\n 100% {\n color: #B80000;\n }\n}");
43402
43400
 
43403
43401
  const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\" || setting === \"clips\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if ([\"playpause\", \"playstop\", \"fullscreen\"].includes(setting)) {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
43404
43402
 
@@ -43431,6 +43429,7 @@ const STANDARD_MEDIA_CONTROL_ELEMENTS = [
43431
43429
  'seekbar',
43432
43430
  'volume',
43433
43431
  ];
43432
+ const MENU_VMARGIN = 12;
43434
43433
  // TODO export
43435
43434
  const DEFAULT_SETTINGS = {
43436
43435
  default: ['seekbar'],
@@ -43754,6 +43753,12 @@ class MediaControl extends UICorePlugin {
43754
43753
  getAvailableHeight() {
43755
43754
  return (this.core.$el.height() - this.$el.find('.media-control-layer').height());
43756
43755
  }
43756
+ /**
43757
+ * @returns Vertical space available to render a popup menu
43758
+ */
43759
+ getAvailablePopupHeight() {
43760
+ return this.getAvailableHeight() - MENU_VMARGIN * 2;
43761
+ }
43757
43762
  /**
43758
43763
  * Set the initial volume, which is preserved when playback is interrupted by an advertisement
43759
43764
  */
@@ -44285,7 +44290,7 @@ class MediaControl extends UICorePlugin {
44285
44290
  const panel = this.getElementLocation(name);
44286
44291
  if (panel) {
44287
44292
  element.attr(`data-${name}`, '');
44288
- element.addClass('gplayer-mc-panel-item');
44293
+ element.addClass('media-control-item');
44289
44294
  mountTo(panel, element);
44290
44295
  }
44291
44296
  }
@@ -44666,6 +44671,7 @@ function mergeElements(a, b) {
44666
44671
  }
44667
44672
 
44668
44673
  const VERSION$6 = '2.22.4';
44674
+ // const T = 'plugins.audiotracks'
44669
44675
  /**
44670
44676
  * `PLUGIN` that makes possible to switch audio tracks via the media control UI.
44671
44677
  * @beta
@@ -44678,6 +44684,7 @@ const VERSION$6 = '2.22.4';
44678
44684
  */
44679
44685
  class AudioTracks extends UICorePlugin {
44680
44686
  currentTrack = null;
44687
+ open = false;
44681
44688
  tracks = [];
44682
44689
  /**
44683
44690
  * @internal
@@ -44703,7 +44710,7 @@ class AudioTracks extends UICorePlugin {
44703
44710
  */
44704
44711
  get attributes() {
44705
44712
  return {
44706
- class: 'media-control-audiotracks',
44713
+ class: 'media-control-audiotracks media-control-dd__wrap',
44707
44714
  };
44708
44715
  }
44709
44716
  /**
@@ -44711,8 +44718,8 @@ class AudioTracks extends UICorePlugin {
44711
44718
  */
44712
44719
  get events() {
44713
44720
  return {
44714
- 'click [data-audiotracks-select]': 'onTrackSelect',
44715
- 'click #audiotracks-button': 'toggleMenu',
44721
+ 'click #gplayer-audiotracks-menu [data-item]': 'onTrackSelect',
44722
+ 'click #gplayer-audiotracks-button': 'toggleMenu',
44716
44723
  };
44717
44724
  }
44718
44725
  /**
@@ -44726,8 +44733,9 @@ class AudioTracks extends UICorePlugin {
44726
44733
  const mediaControl = this.core.getPlugin('media_control');
44727
44734
  assert(mediaControl, 'media_control plugin is required');
44728
44735
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, () => {
44729
- mediaControl.slot('audiotracks', this.$el);
44736
+ this.mount();
44730
44737
  });
44738
+ // TODO when tracks change, re-render and re-attach
44731
44739
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, this.hideMenu);
44732
44740
  this.listenTo(mediaControl, ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, (from) => {
44733
44741
  if (from !== this.name) {
@@ -44742,6 +44750,7 @@ class AudioTracks extends UICorePlugin {
44742
44750
  tracks.find((track) => track.kind === 'main') ?? null; // TODO test
44743
44751
  this.tracks = tracks;
44744
44752
  this.render();
44753
+ this.mount();
44745
44754
  });
44746
44755
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_AUDIO_CHANGED, (track) => {
44747
44756
  this.currentTrack = track;
@@ -44749,6 +44758,10 @@ class AudioTracks extends UICorePlugin {
44749
44758
  this.buttonElement().removeClass('changing');
44750
44759
  this.updateText();
44751
44760
  });
44761
+ // TODO test
44762
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_CLICK, () => {
44763
+ this.hideMenu();
44764
+ });
44752
44765
  }
44753
44766
  shouldRender() {
44754
44767
  // Render is called from the parent class constructor so tracks aren't available
@@ -44759,21 +44772,19 @@ class AudioTracks extends UICorePlugin {
44759
44772
  * @internal
44760
44773
  */
44761
44774
  render() {
44762
- if (!this.shouldRender()) {
44763
- return this;
44764
- }
44765
44775
  this.$el.html(AudioTracks.template({
44766
- tracks: this.tracks,
44776
+ tracks: this.tracks ?? [],
44767
44777
  title: this.getTitle(),
44768
44778
  icon: audioArrow,
44769
44779
  current: this.currentTrack?.id,
44770
44780
  }));
44781
+ this.$el.find('#gplayer-audiotracks-menu').hide();
44771
44782
  this.updateText();
44772
44783
  this.highlightCurrentTrack();
44773
44784
  return this;
44774
44785
  }
44775
44786
  onTrackSelect(event) {
44776
- const id = event.currentTarget?.dataset?.audiotracksSelect;
44787
+ const id = event.currentTarget?.dataset?.item;
44777
44788
  if (id) {
44778
44789
  this.selectAudioTrack(id);
44779
44790
  }
@@ -44787,24 +44798,34 @@ class AudioTracks extends UICorePlugin {
44787
44798
  this.updateText();
44788
44799
  }
44789
44800
  hideMenu() {
44790
- this.$el.find('#audiotracks-select').addClass('hidden');
44791
- this.$el.find('#audiotracks-button').attr('aria-expanded', 'false');
44801
+ this.open = false;
44802
+ this.$el.find('#gplayer-audiotracks-menu').hide();
44803
+ this.$el.find('#gplayer-audiotracks-button').attr('aria-expanded', 'false');
44792
44804
  }
44793
44805
  toggleMenu() {
44794
- this.core.getPlugin('media_control').trigger(ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, this.name);
44795
- this.$el.find('#audiotracks-select').toggleClass('hidden'); // TODO use plain CSS display: none
44796
- const open = !this.$el.find('#audiotracks-select').hasClass('hidden'); // TODO hold state
44797
- this.$el.find('#audiotracks-button').attr('aria-expanded', open);
44806
+ this.open = !this.open;
44807
+ this.core
44808
+ .getPlugin('media_control')
44809
+ .trigger(ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, this.name);
44810
+ if (this.open) {
44811
+ this.$el.find('#gplayer-audiotracks-menu').show();
44812
+ }
44813
+ else {
44814
+ this.$el.find('#gplayer-audiotracks-menu').hide();
44815
+ }
44816
+ this.$el
44817
+ .find('#gplayer-audiotracks-button')
44818
+ .attr('aria-expanded', this.open);
44798
44819
  }
44799
44820
  buttonElement() {
44800
- return this.$('button');
44821
+ return this.$('#gplayer-audiotracks-button');
44801
44822
  }
44802
44823
  buttonElementText() {
44803
- return this.$('button .audio-text');
44824
+ return this.$el.find('#gplayer-audiotracks-button-text');
44804
44825
  }
44805
44826
  trackElement(id) {
44806
- return this.$('#audiotracks-select a' +
44807
- (id !== undefined ? `[data-audiotracks-select="${id}"]` : '')).parent();
44827
+ return this.$('#gplayer-audiotracks-menu a' +
44828
+ (id !== undefined ? `[data-item="${id}"]` : '')).parent();
44808
44829
  }
44809
44830
  getTitle() {
44810
44831
  if (!this.currentTrack) {
@@ -44835,13 +44856,18 @@ class AudioTracks extends UICorePlugin {
44835
44856
  .attr('aria-checked', 'true');
44836
44857
  }
44837
44858
  }
44859
+ mount() {
44860
+ if (this.shouldRender()) {
44861
+ this.core.getPlugin('media_control')?.slot('audiotracks', this.$el);
44862
+ }
44863
+ }
44838
44864
  }
44839
44865
 
44840
44866
  const templateHtml$2 = "<div class=\"big-mute-icon-wrapper\" data-big-mute id=\"gplayer-big-mute-button\">\n <div class=\"big-mute-icon gcore-skin-border-color\" data-big-mute-icon id=\"gplayer-big-mute-icon\"></div>\n</div>\n";
44841
44867
 
44842
44868
  insertStyle(".big-mute-icon-wrapper[data-big-mute] {\n position: absolute;\n z-index: 9998;\n background-color: transparent;\n display: flex;\n justify-content: center;\n width: 100%;\n height: calc(100% - 50px);\n margin: 0 auto;\n opacity: 0.75;\n transition: opacity 0.1s ease;\n pointer-events: auto;\n}\n.big-mute-icon-wrapper[data-big-mute].hide {\n display: none;\n}\n.big-mute-icon-wrapper[data-big-mute]:hover {\n cursor: pointer;\n}\n\n.big-mute-icon[data-big-mute-icon] {\n display: flex;\n align-items: center;\n justify-content: center;\n align-self: center;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n background: rgba(240, 243, 247, 0.9411764706);\n z-index: 10000;\n}\n.big-mute-icon[data-big-mute-icon] svg {\n margin-left: 5px;\n width: 80px;\n height: 80px;\n}\n.big-mute-icon[data-big-mute-icon] svg path {\n fill: #1f1e1e !important;\n}\n.big-mute-icon[data-big-mute-icon]:hover {\n background: rgba(240, 243, 247, 0.8784313725);\n}\n.big-mute-icon[data-big-mute-icon]:hover svg path {\n fill: #151515 !important;\n}");
44843
44869
 
44844
- const T$a = 'plugins.big_mute_button';
44870
+ const T$9 = 'plugins.big_mute_button';
44845
44871
  // TODO rewrite as a container plugin
44846
44872
  /**
44847
44873
  * `PLUGIN` that displays a big mute button over the video when it's being played muted.
@@ -44904,7 +44930,7 @@ class BigMuteButton extends UICorePlugin {
44904
44930
  if (autoPlay) {
44905
44931
  this.autoPlay = true;
44906
44932
  }
44907
- trace(`${T$a} onPlay`, {
44933
+ trace(`${T$9} onPlay`, {
44908
44934
  autoPlay: this.autoPlay});
44909
44935
  if (this.autoPlay && !wasMuted && volume === 0) {
44910
44936
  this.mount();
@@ -44978,16 +45004,15 @@ class BigMuteButton extends UICorePlugin {
44978
45004
 
44979
45005
  const pluginHtml$3 = "<button class=\"media-control-button gplayer-lite-btn gcore-skin-button-color gear-icon\"\n id=\"gear-button\"\n aria-expanded=\"false\"\n aria-controls=\"gear-options\">\n <%= icon %>\n</button>\n<div class=\"gear-wrapper gcore-skin-bg-color\" id=\"gear-options-wrapper\">\n <ul class=\"gear-options-list\" id=\"gear-options\" role=\"menu\"></ul>\n</div>\n";
44980
45006
 
44981
- insertStyle(".media-control-skin-1 .gplayer-mc-panel-item.media-control-gear {\n order: 99;\n height: 20px;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-gear .gear-wrapper {\n position: absolute;\n right: 16px;\n bottom: 52px;\n width: 250px;\n min-height: 48px;\n z-index: 9999;\n border-radius: 4px;\n box-shadow: 0 0 1px 1px var(--gplayer-mc-popup-border-color);\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-gear .gear-options-list {\n padding: 8px 0;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-gear .gear-option {\n margin: 0;\n text-align: left;\n line-height: 22px;\n padding: 5px 14px;\n width: 250px;\n font-size: 12px;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-gear .gear-option_icon {\n flex: 24px 0 0;\n height: 24px;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-gear .gear-option_icon.hidden {\n visibility: hidden;\n display: inline-block;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-gear .gear-option_label {\n flex: 0 1 100%;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-gear .gear-option_arrow-right-icon {\n flex: 0 0 14px;\n height: 24px;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-gear .gear-option_value {\n flex: 1 0 auto;\n}");
45007
+ insertStyle(".media-control-skin-1 .media-control-item.media-control-gear {\n order: 99;\n}\n.media-control-skin-1 .media-control-item.media-control-gear .gear-wrapper {\n position: absolute;\n right: 16px;\n bottom: 52px;\n width: 250px;\n min-height: 48px;\n z-index: 9999;\n border-radius: 4px;\n box-shadow: 0 0 1px 1px var(--gplayer-mc-popup-border-color);\n}\n.media-control-skin-1 .media-control-item.media-control-gear .gear-options-list {\n padding: 8px 0;\n}\n.media-control-skin-1 .media-control-item.media-control-gear .gear-option {\n margin: 0;\n text-align: left;\n line-height: 22px;\n padding: 5px 14px;\n width: 250px;\n font-size: 12px;\n display: flex;\n align-items: center;\n justify-content: flex-start;\n gap: 8px;\n}\n.media-control-skin-1 .media-control-item.media-control-gear .gear-option_icon {\n flex: 24px 0 0;\n height: 24px;\n}\n.media-control-skin-1 .media-control-item.media-control-gear .gear-option_icon.hidden {\n visibility: hidden;\n display: inline-block;\n}\n.media-control-skin-1 .media-control-item.media-control-gear .gear-option_label {\n flex: 0 1 100%;\n}\n.media-control-skin-1 .media-control-item.media-control-gear .gear-option_arrow-right-icon {\n flex: 0 0 14px;\n height: 24px;\n}\n.media-control-skin-1 .media-control-item.media-control-gear .gear-option_value {\n flex: 1 0 auto;\n}");
44982
45008
 
44983
- insertStyle("*, :focus, :visited {\n outline: none !important;\n}\n\n.gear-wrapper .go-back {\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n width: 100%;\n text-align: left;\n padding: 12px;\n}\n.gear-wrapper .go-back .arrow-left-icon {\n float: left;\n padding-top: 2px;\n padding-right: 2px;\n}\n.gear-wrapper .go-back .arrow-left-icon svg {\n height: 16px;\n}\n.gear-wrapper ul.gear-sub-menu {\n width: 100%;\n list-style-type: none;\n min-width: 60px;\n border-top: 2px solid rgb(36, 36, 36);\n overflow-y: auto;\n}\n.gear-wrapper ul.gear-sub-menu li {\n font-size: 12px;\n text-align: left;\n}\n.gear-wrapper ul.gear-sub-menu li[data-title] {\n background-color: #c3c2c2;\n padding: 5px;\n}\n.gear-wrapper ul.gear-sub-menu li a {\n display: block;\n text-decoration: none;\n height: 32px;\n padding: 5px 10px;\n line-height: 22px;\n color: #fffffe;\n}\n.gear-wrapper ul.gear-sub-menu li a:hover {\n color: white;\n background-color: rgba(0, 0, 0, 0.4);\n}\n.gear-wrapper ul.gear-sub-menu li a:hover a {\n color: white;\n text-decoration: none;\n}\n.gear-wrapper ul.gear-sub-menu li a .check-icon {\n width: 30px;\n height: 20px;\n float: left;\n display: block;\n}\n.gear-wrapper ul.gear-sub-menu li a .check-icon svg {\n display: none;\n}\n.gear-wrapper ul.gear-sub-menu li.current a .check-icon svg {\n display: inline;\n}");
45009
+ insertStyle("*, :focus, :visited {\n outline: none !important;\n}\n\n.gear-wrapper .go-back {\n font-weight: 600;\n font-size: 14px;\n line-height: 20px;\n width: 100%;\n text-align: left;\n padding: 12px;\n}\n.gear-wrapper .go-back .arrow-left-icon {\n float: left;\n padding-top: 2px;\n padding-right: 2px;\n}\n.gear-wrapper .go-back .arrow-left-icon svg {\n height: 16px;\n}\n.gear-wrapper ul.gear-sub-menu {\n width: 100%;\n list-style-type: none;\n min-width: 60px;\n border-top: 2px solid rgb(36, 36, 36);\n overflow-y: auto;\n}\n.gear-wrapper ul.gear-sub-menu li {\n font-size: 12px;\n text-align: left;\n}\n.gear-wrapper ul.gear-sub-menu li a {\n display: block;\n text-decoration: none;\n height: 30px;\n padding: 5px 10px;\n line-height: 22px;\n color: var(--gplayer-mc-text-dim-color);\n}\n.gear-wrapper ul.gear-sub-menu li a:hover {\n color: var(--gplayer-mc-text-color);\n background-color: rgba(0, 0, 0, 0.4);\n}\n.gear-wrapper ul.gear-sub-menu li a:hover a {\n color: var(--gplayer-mc-text-color);\n text-decoration: none;\n}\n.gear-wrapper ul.gear-sub-menu li a .check-icon {\n width: 30px;\n height: 20px;\n float: left;\n display: block;\n}\n.gear-wrapper ul.gear-sub-menu li a .check-icon svg {\n display: none;\n}\n.gear-wrapper ul.gear-sub-menu li.current a .check-icon svg {\n display: inline;\n}");
44984
45010
 
44985
45011
  const gearIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_660_1503)\">\n <path\n d=\"M19.14 12.94C19.18 12.64 19.2 12.33 19.2 12C19.2 11.68 19.18 11.36 19.13 11.06L21.16 9.47999C21.34 9.33999 21.39 9.06999 21.28 8.86999L19.36 5.54999C19.24 5.32999 18.99 5.25999 18.77 5.32999L16.38 6.28999C15.88 5.90999 15.35 5.58999 14.76 5.34999L14.4 2.80999C14.36 2.56999 14.16 2.39999 13.92 2.39999H10.08C9.83999 2.39999 9.64999 2.56999 9.60999 2.80999L9.24999 5.34999C8.65999 5.58999 8.11999 5.91999 7.62999 6.28999L5.23999 5.32999C5.01999 5.24999 4.76999 5.32999 4.64999 5.54999L2.73999 8.86999C2.61999 9.07999 2.65999 9.33999 2.85999 9.47999L4.88999 11.06C4.83999 11.36 4.79999 11.69 4.79999 12C4.79999 12.31 4.81999 12.64 4.86999 12.94L2.83999 14.52C2.65999 14.66 2.60999 14.93 2.71999 15.13L4.63999 18.45C4.75999 18.67 5.00999 18.74 5.22999 18.67L7.61999 17.71C8.11999 18.09 8.64999 18.41 9.23999 18.65L9.59999 21.19C9.64999 21.43 9.83999 21.6 10.08 21.6H13.92C14.16 21.6 14.36 21.43 14.39 21.19L14.75 18.65C15.34 18.41 15.88 18.09 16.37 17.71L18.76 18.67C18.98 18.75 19.23 18.67 19.35 18.45L21.27 15.13C21.39 14.91 21.34 14.66 21.15 14.52L19.14 12.94ZM12 15.6C10.02 15.6 8.39999 13.98 8.39999 12C8.39999 10.02 10.02 8.39999 12 8.39999C13.98 8.39999 15.6 10.02 15.6 12C15.6 13.98 13.98 15.6 12 15.6Z\"\n fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_660_1503\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
44986
45012
 
44987
45013
  const gearHdIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g clip-path=\"url(#clip0_28_1567)\">\n <path\n d=\"M19.14 12.94C19.18 12.64 19.2 12.33 19.2 12C19.2 11.68 19.18 11.36 19.13 11.06L21.16 9.47999C21.34 9.33999 21.39 9.06999 21.28 8.86999L19.36 5.54999C19.24 5.32999 18.99 5.25999 18.77 5.32999L16.38 6.28999C15.88 5.90999 15.35 5.58999 14.76 5.34999L14.4 2.80999C14.36 2.56999 14.16 2.39999 13.92 2.39999H10.08C9.83999 2.39999 9.64999 2.56999 9.60999 2.80999L9.24999 5.34999C8.65999 5.58999 8.11999 5.91999 7.62999 6.28999L5.23999 5.32999C5.01999 5.24999 4.76999 5.32999 4.64999 5.54999L2.73999 8.86999C2.61999 9.07999 2.65999 9.33999 2.85999 9.47999L4.88999 11.06C4.83999 11.36 4.79999 11.69 4.79999 12C4.79999 12.31 4.81999 12.64 4.86999 12.94L2.83999 14.52C2.65999 14.66 2.60999 14.93 2.71999 15.13L4.63999 18.45C4.75999 18.67 5.00999 18.74 5.22999 18.67L7.61999 17.71C8.11999 18.09 8.64999 18.41 9.23999 18.65L9.59999 21.19C9.64999 21.43 9.83999 21.6 10.08 21.6H13.92C14.16 21.6 14.36 21.43 14.39 21.19L14.75 18.65C15.34 18.41 15.88 18.09 16.37 17.71L18.76 18.67C18.98 18.75 19.23 18.67 19.35 18.45L21.27 15.13C21.39 14.91 21.34 14.66 21.15 14.52L19.14 12.94ZM12 15.6C10.02 15.6 8.39999 13.98 8.39999 12C8.39999 10.02 10.02 8.39999 12 8.39999C13.98 8.39999 15.6 10.02 15.6 12C15.6 13.98 13.98 15.6 12 15.6Z\"\n fill=\"#C9C9C9\"/>\n <rect x=\"13\" width=\"11\" height=\"7\" rx=\"1\" fill=\"#F6413B\"/>\n <path\n d=\"M14.6962 6V1.63636H15.3546V3.53267H17.53V1.63636H18.1905V6H17.53V4.0973H15.3546V6H14.6962ZM20.562 6H19.1493V1.63636H20.6067C21.0343 1.63636 21.4015 1.72372 21.7083 1.89844C22.0151 2.07173 22.2502 2.32102 22.4135 2.64631C22.5783 2.97017 22.6607 3.35866 22.6607 3.81179C22.6607 4.26634 22.5776 4.65696 22.4114 4.98366C22.2466 5.31037 22.008 5.56179 21.6955 5.73793C21.383 5.91264 21.0051 6 20.562 6ZM19.8077 5.42472H20.5257C20.8581 5.42472 21.1344 5.36222 21.3546 5.23722C21.5748 5.1108 21.7395 4.92827 21.8489 4.68963C21.9583 4.44957 22.013 4.15696 22.013 3.81179C22.013 3.46946 21.9583 3.17898 21.8489 2.94034C21.7409 2.7017 21.5797 2.5206 21.3652 2.39702C21.1507 2.27344 20.8844 2.21165 20.5662 2.21165H19.8077V5.42472Z\"\n fill=\"#C9C9C9\"/>\n </g>\n <defs>\n <clipPath id=\"clip0_28_1567\">\n <rect width=\"24\" height=\"24\" fill=\"white\"/>\n </clipPath>\n </defs>\n</svg>\n";
44988
45014
 
44989
45015
  const VERSION$5 = '2.19.12';
44990
- const MENU_VMARGIN = 12;
44991
45016
  const MENU_BACKLINK_HEIGHT = 44;
44992
45017
  /**
44993
45018
  * Events triggered by the plugin
@@ -45150,7 +45175,7 @@ class BottomGear extends UICorePlugin {
45150
45175
  .appendTo(this.$el.find('#gear-options-wrapper'));
45151
45176
  $item.on('click', (e) => {
45152
45177
  e.stopPropagation();
45153
- this.alignSubmenu($subMenu);
45178
+ this.clampPopup($subMenu);
45154
45179
  $subMenu.show();
45155
45180
  this.$el.find('#gear-options').hide();
45156
45181
  });
@@ -45246,9 +45271,8 @@ class BottomGear extends UICorePlugin {
45246
45271
  const mediaControl = this.core.getPlugin('media_control');
45247
45272
  mediaControl.slot('gear', this.$el);
45248
45273
  }
45249
- alignSubmenu($subMenu) {
45250
- const availableHeight = this.core.getPlugin('media_control').getAvailableHeight() -
45251
- MENU_VMARGIN * 2;
45274
+ clampPopup($subMenu) {
45275
+ const availableHeight = this.core.getPlugin('media_control').getAvailablePopupHeight();
45252
45276
  $subMenu.css('max-height', `${availableHeight}px`);
45253
45277
  $subMenu
45254
45278
  .find('.gear-sub-menu')
@@ -48475,7 +48499,7 @@ const templateHtml = "<div class=\"player-error-screen__content\" data-error-scr
48475
48499
 
48476
48500
  insertStyle("div.player-error-screen, [data-player] div.player-error-screen {\n color: #CCCACA;\n position: absolute;\n top: 0;\n height: 100%;\n width: 100%;\n background-color: rgba(0, 0, 0, 0.7);\n z-index: 2000;\n display: flex;\n flex-direction: column;\n justify-content: center;\n}\ndiv.player-error-screen__content[data-error-screen], [data-player] div.player-error-screen__content[data-error-screen] {\n font-size: 14px;\n color: #CCCACA;\n margin-top: 45px;\n}\ndiv.player-error-screen__title[data-error-screen], [data-player] div.player-error-screen__title[data-error-screen] {\n font-weight: bold;\n line-height: 30px;\n font-size: 18px;\n}\ndiv.player-error-screen__message[data-error-screen], [data-player] div.player-error-screen__message[data-error-screen] {\n width: 90%;\n margin: 0 auto;\n}\ndiv.player-error-screen__code[data-error-screen], [data-player] div.player-error-screen__code[data-error-screen] {\n font-size: 13px;\n margin-top: 15px;\n}\ndiv.player-error-screen__reload, [data-player] div.player-error-screen__reload {\n cursor: pointer;\n width: 30px;\n margin: 15px auto 0;\n}");
48477
48501
 
48478
- const T$9 = 'plugins.error_screen';
48502
+ const T$8 = 'plugins.error_screen';
48479
48503
  /**
48480
48504
  * `PLUGIN` that displays fatal errors nicely in the overlay on top of the player.
48481
48505
  * @public
@@ -48551,7 +48575,7 @@ class ErrorScreen extends UICorePlugin {
48551
48575
  }, 0);
48552
48576
  }
48553
48577
  onActiveContainerChanged() {
48554
- trace(`${T$9} onActiveContainerChanged`, {
48578
+ trace(`${T$8} onActiveContainerChanged`, {
48555
48579
  reloading: this.core.options.reloading,
48556
48580
  });
48557
48581
  this.err = null;
@@ -48601,16 +48625,16 @@ class ErrorScreen extends UICorePlugin {
48601
48625
 
48602
48626
  insertStyle(".player-logo[data-logo] {\n position: absolute;\n z-index: 2;\n width: 100%;\n height: 100%;\n}\n\n.clappr-logo {\n position: absolute;\n}");
48603
48627
 
48604
- insertStyle("*,\n:focus,\n:visited {\n outline: none !important;\n}\n\n.multicamera[data-multicamera] {\n float: right;\n margin-top: 4px;\n position: relative;\n margin-right: 20px;\n width: 20px;\n}\n.multicamera[data-multicamera] button {\n background-color: transparent;\n color: #fff;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n border: none;\n font-size: 14px;\n padding: 0;\n}\n.multicamera[data-multicamera] button svg {\n height: 20px;\n position: relative;\n margin-top: 6px;\n}\n.multicamera[data-multicamera] button:hover {\n color: #c9c9c9;\n}\n.multicamera[data-multicamera] button.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.multicamera[data-multicamera] button span.quality-arrow {\n width: 9px;\n height: 6px;\n margin-top: 11px;\n margin-left: 5px;\n}\n.multicamera[data-multicamera] > ul {\n padding: 6px 0;\n right: -24px;\n width: 245px;\n list-style-type: none;\n position: absolute;\n bottom: 48px;\n border-radius: 4px;\n display: none;\n background-color: rgba(74, 74, 74, 0.9);\n}\n.multicamera[data-multicamera] > ul::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 85%;\n margin-left: -10px;\n width: 0;\n height: 0;\n border-top: 10px solid rgba(74, 74, 74, 0.9);\n border-right: 10px solid transparent;\n border-left: 10px solid transparent;\n}\n.multicamera[data-multicamera] li {\n font-size: 10px;\n cursor: pointer;\n}\n.multicamera[data-multicamera] li .multicamera-item {\n display: flex;\n padding: 10px 0;\n justify-content: center;\n position: relative;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] {\n pointer-events: none;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-screenshot {\n opacity: 0.5;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-text {\n opacity: 0.5;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false]:hover {\n background-color: rgba(0, 0, 0, 0);\n}\n.multicamera[data-multicamera] li .multicamera-item:hover, .multicamera[data-multicamera] li .multicamera-item.multicamera-active {\n background-color: rgba(0, 0, 0, 0.3);\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot {\n width: 80px;\n height: 60px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot img {\n width: 80px;\n height: 60px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text {\n width: 120px;\n text-align: left;\n margin-left: 15px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-title,\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {\n width: 120px;\n height: 20px;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n font-size: 14px;\n font-weight: normal;\n font-style: normal;\n font-stretch: normal;\n line-height: 1.43;\n letter-spacing: normal;\n text-align: left;\n color: #fff;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {\n opacity: 0.6;\n}\n.multicamera[data-multicamera] li[data-title] {\n background-color: #c3c2c2;\n padding: 5px;\n}\n.multicamera[data-multicamera] li a {\n color: #444;\n padding: 2px 10px;\n display: block;\n text-decoration: none;\n}\n.multicamera[data-multicamera] li a:hover {\n background-color: #555;\n color: white;\n}\n.multicamera[data-multicamera] li a:hover a {\n color: white;\n text-decoration: none;\n}\n.multicamera[data-multicamera] li.current a {\n color: #f00;\n}");
48628
+ insertStyle("*,\n:focus,\n:visited {\n outline: none !important;\n}\n\n.multicamera[data-multicamera] {\n float: right;\n margin-top: 4px;\n position: relative;\n margin-right: 20px;\n width: 20px;\n}\n.multicamera[data-multicamera] button {\n background-color: transparent;\n color: #fff;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n -webkit-font-smoothing: antialiased;\n border: none;\n font-size: 14px;\n padding: 0;\n}\n.multicamera[data-multicamera] button svg {\n height: 20px;\n position: relative;\n margin-top: 6px;\n}\n.multicamera[data-multicamera] button:hover {\n color: #c9c9c9;\n}\n.multicamera[data-multicamera] button.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.multicamera[data-multicamera] button span.quality-arrow {\n width: 9px;\n height: 6px;\n margin-top: 11px;\n margin-left: 5px;\n}\n.multicamera[data-multicamera] > ul {\n padding: 6px 0;\n right: -24px;\n width: 245px;\n list-style-type: none;\n position: absolute;\n bottom: 48px;\n border-radius: 4px;\n display: none;\n background-color: rgba(74, 74, 74, 0.9);\n}\n.multicamera[data-multicamera] > ul::after {\n content: \"\";\n position: absolute;\n top: 100%;\n left: 85%;\n margin-left: -10px;\n width: 0;\n height: 0;\n border-top: 10px solid rgba(74, 74, 74, 0.9);\n border-right: 10px solid transparent;\n border-left: 10px solid transparent;\n}\n.multicamera[data-multicamera] li {\n font-size: 10px;\n cursor: pointer;\n}\n.multicamera[data-multicamera] li .multicamera-item {\n display: flex;\n padding: 10px 0;\n justify-content: center;\n position: relative;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] {\n pointer-events: none;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-screenshot {\n opacity: 0.5;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false] .multicamera-text {\n opacity: 0.5;\n}\n.multicamera[data-multicamera] li .multicamera-item[data-mulitcamera-selector-live=false]:hover {\n background-color: rgba(0, 0, 0, 0);\n}\n.multicamera[data-multicamera] li .multicamera-item:hover, .multicamera[data-multicamera] li .multicamera-item.multicamera-active {\n background-color: rgba(0, 0, 0, 0.3);\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot {\n width: 80px;\n height: 60px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-screenshot img {\n width: 80px;\n height: 60px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text {\n width: 120px;\n text-align: left;\n margin-left: 15px;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-title,\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {\n width: 120px;\n height: 20px;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n font-size: 14px;\n font-weight: normal;\n font-style: normal;\n font-stretch: normal;\n line-height: 1.43;\n letter-spacing: normal;\n text-align: left;\n color: #fff;\n text-overflow: ellipsis;\n overflow: hidden;\n}\n.multicamera[data-multicamera] li .multicamera-item .multicamera-text .multicamera-description {\n opacity: 0.6;\n}\n.multicamera[data-multicamera] li a {\n color: #444;\n padding: 2px 10px;\n display: block;\n text-decoration: none;\n}\n.multicamera[data-multicamera] li a:hover {\n background-color: #555;\n color: white;\n}\n.multicamera[data-multicamera] li a:hover a {\n color: white;\n text-decoration: none;\n}\n.multicamera[data-multicamera] li.current a {\n color: #f00;\n}");
48605
48629
 
48606
48630
  const pipIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M21.05 3.00001C21.302 3.00001 21.5435 3.10003 21.7217 3.27833C21.9 3.45646 22 3.69802 22 3.95003V10.6H20.1V4.90003H4.90001V18.2H10.6V20.1H3.95001C3.69802 20.1 3.45647 20 3.27832 19.8217C3.10002 19.6436 3 19.402 3 19.15V3.95001C3 3.69802 3.10002 3.45647 3.27832 3.27832C3.45644 3.10002 3.69801 3 3.95001 3L21.05 3.00001ZM21.05 12.5C21.302 12.5 21.5435 12.6 21.7217 12.7783C21.9 12.9565 22 13.198 22 13.45V19.15C22 19.402 21.9 19.6436 21.7217 19.8217C21.5436 20 21.302 20.1 21.05 20.1H13.45C13.198 20.1 12.9564 20 12.7783 19.8217C12.6 19.6436 12.5 19.402 12.5 19.15V13.45C12.5 13.198 12.6 12.9565 12.7783 12.7783C12.9564 12.6 13.198 12.5 13.45 12.5H21.05ZM7.47178 6.12823L9.60928 8.26572L11.5501 6.32492V11.5499H6.32509L8.26589 9.60911L6.12839 7.47161L7.47178 6.12823Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
48607
48631
 
48608
48632
  const buttonHtml$2 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\">\n <%= pipIcon %>\n</button>\n";
48609
48633
 
48610
- insertStyle(".media-control-skin-1 .gplayer-mc-panel-item.media-control-pip {\n order: 95;\n display: flex;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-pip button {\n height: 20px;\n}\n.media-control-skin-1 .gplayer-mc-panel-item.media-control-pip button svg {\n height: 20px;\n}");
48634
+ insertStyle(".media-control-skin-1 .media-control-item.media-control-pip {\n order: 95;\n}\n.media-control-skin-1 .media-control-item.media-control-pip button {\n height: 20px;\n}\n.media-control-skin-1 .media-control-item.media-control-pip button svg {\n height: 20px;\n}");
48611
48635
 
48612
48636
  const VERSION$3 = '0.0.1';
48613
- const T$8 = `plugins.pip`;
48637
+ const T$7 = `plugins.pip`;
48614
48638
  /**
48615
48639
  * `PLUGIN` that enables picture in picture mode.
48616
48640
  * @beta
@@ -48693,7 +48717,7 @@ class PictureInPicture extends UICorePlugin {
48693
48717
  }
48694
48718
  }
48695
48719
  requestPictureInPicture() {
48696
- trace(`${T$8} requestPictureInPicture`, {
48720
+ trace(`${T$7} requestPictureInPicture`, {
48697
48721
  videoElement: !!this.videoElement,
48698
48722
  });
48699
48723
  this.videoElement.requestPictureInPicture();
@@ -48725,7 +48749,7 @@ const DEFAULT_PLAYBACK_RATES = [
48725
48749
  { value: 2.0, label: '2x' },
48726
48750
  ];
48727
48751
  const DEFAULT_PLAYBACK_RATE = 1;
48728
- const T$7 = 'plugins.playback_rate';
48752
+ const T$6 = 'plugins.playback_rate';
48729
48753
  /**
48730
48754
  * `PLUGIN` that allows changing the playback speed of the video.
48731
48755
  * @beta
@@ -48832,7 +48856,7 @@ class PlaybackRate extends UICorePlugin {
48832
48856
  this.mount();
48833
48857
  }
48834
48858
  mount() {
48835
- trace(`${T$7} mount`, {
48859
+ trace(`${T$6} mount`, {
48836
48860
  shouldMount: this.shouldMount(),
48837
48861
  });
48838
48862
  if (!this.shouldMount()) {
@@ -48849,7 +48873,7 @@ class PlaybackRate extends UICorePlugin {
48849
48873
  })));
48850
48874
  }
48851
48875
  onMetaDataLoaded() {
48852
- trace(`${T$7} onMetaDataLoaded`, {
48876
+ trace(`${T$6} onMetaDataLoaded`, {
48853
48877
  playbackType: this.core.activePlayback.getPlaybackType(),
48854
48878
  dvrEnabled: this.core.activePlayback.dvrEnabled,
48855
48879
  });
@@ -48871,13 +48895,13 @@ class PlaybackRate extends UICorePlugin {
48871
48895
  this.core.activePlayback?.setPlaybackRate(this.selectedRate);
48872
48896
  }
48873
48897
  else {
48874
- trace(`${T$7} onPlaybackRateChange not steering to the selected rate, it is seemingly a catchup algorithm working`, {
48898
+ trace(`${T$6} onPlaybackRateChange not steering to the selected rate, it is seemingly a catchup algorithm working`, {
48875
48899
  selectedRate: this.selectedRate,
48876
48900
  });
48877
48901
  }
48878
48902
  }
48879
48903
  shouldMount() {
48880
- trace(`${T$7} shouldMount`, {
48904
+ trace(`${T$6} shouldMount`, {
48881
48905
  playbackType: this.core.activePlayback?.getPlaybackType(),
48882
48906
  dvrEnabled: this.core.activePlayback?.dvrEnabled,
48883
48907
  });
@@ -48894,7 +48918,7 @@ class PlaybackRate extends UICorePlugin {
48894
48918
  * @internal
48895
48919
  */
48896
48920
  render() {
48897
- trace(`${T$7} render`, {
48921
+ trace(`${T$6} render`, {
48898
48922
  shouldMount: this.shouldMount(),
48899
48923
  });
48900
48924
  this.$el.html(PlaybackRate.listTemplate({
@@ -48940,13 +48964,13 @@ class PlaybackRate extends UICorePlugin {
48940
48964
  }
48941
48965
  }
48942
48966
  syncRate() {
48943
- trace(`${T$7} syncRate`, {
48967
+ trace(`${T$6} syncRate`, {
48944
48968
  selectedRate: this.selectedRate,
48945
48969
  });
48946
48970
  this.core.activePlayback?.setPlaybackRate(this.selectedRate);
48947
48971
  }
48948
48972
  resetPlaybackRate() {
48949
- trace(`${T$7} resetPlaybackRate`, {
48973
+ trace(`${T$6} resetPlaybackRate`, {
48950
48974
  selectedRate: this.selectedRate,
48951
48975
  });
48952
48976
  this.core.activePlayback?.setPlaybackRate(DEFAULT_PLAYBACK_RATE);
@@ -48981,7 +49005,7 @@ class PlaybackRate extends UICorePlugin {
48981
49005
  ?.label || `x${rate}`);
48982
49006
  }
48983
49007
  highlightCurrentRate() {
48984
- trace(`${T$7} highlightCurrentRate`, {
49008
+ trace(`${T$6} highlightCurrentRate`, {
48985
49009
  selectedRate: this.selectedRate,
48986
49010
  });
48987
49011
  this.allRateElements().removeClass('current');
@@ -48992,7 +49016,7 @@ class PlaybackRate extends UICorePlugin {
48992
49016
  .addClass('gcore-skin-active');
48993
49017
  }
48994
49018
  updateGearOptionLabel() {
48995
- trace(`${T$7} updateGearOptionLabel`, {
49019
+ trace(`${T$6} updateGearOptionLabel`, {
48996
49020
  selectedRate: this.selectedRate,
48997
49021
  });
48998
49022
  this.mount();
@@ -49006,7 +49030,7 @@ const posterHTML = "<div class=\"play-wrapper\" id=\"gplayer-poster\">\n <div
49006
49030
  //Copyright 2014 Globo.com Player authors. All rights reserved.
49007
49031
  // Use of this source code is governed by a BSD-style
49008
49032
  // license that can be found in the LICENSE file.
49009
- const T$6 = 'plugins.poster';
49033
+ const T$5 = 'plugins.poster';
49010
49034
  /**
49011
49035
  * `PLUGIN` that displays a poster image in the background and a big play button on top when playback is stopped
49012
49036
  * @beta
@@ -49110,7 +49134,7 @@ class Poster extends UIContainerPlugin {
49110
49134
  super.disable();
49111
49135
  }
49112
49136
  onError(error) {
49113
- trace(`${T$6} onError`, {
49137
+ trace(`${T$5} onError`, {
49114
49138
  enabled: this.enabled,
49115
49139
  });
49116
49140
  if (this.hasFatalError) {
@@ -49243,7 +49267,7 @@ const hdIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"non
49243
49267
 
49244
49268
  insertStyle(".quality-levels li.disabled {\n opacity: 0.5;\n pointer-events: none;\n}\n.quality-levels li.current {\n background-color: #000;\n}");
49245
49269
 
49246
- const T$5 = 'plugins.quality_levels';
49270
+ const T$4 = 'plugins.quality_levels';
49247
49271
  const VERSION$2 = 'v2.22.5';
49248
49272
  /**
49249
49273
  * `PLUGIN` that provides a UI to select the desired quality level of the playback.
@@ -49486,7 +49510,7 @@ class QualityLevels extends UICorePlugin {
49486
49510
  this.highlightCurrentLevel();
49487
49511
  }
49488
49512
  highlightCurrentLevel() {
49489
- trace(`${T$5} highlightCurrentLevel`, {
49513
+ trace(`${T$4} highlightCurrentLevel`, {
49490
49514
  selectedLevelId: this.selectedLevelId,
49491
49515
  });
49492
49516
  this.allLevelElements()
@@ -49514,7 +49538,7 @@ insertStyle(".seek-time {\n position: absolute;\n white-space: nowrap;\n heig
49514
49538
  // Use of this source code is governed by a BSD-style
49515
49539
  // license that can be found at https://github.com/clappr/clappr-plugins/blob/master/LICENSE
49516
49540
  const { formatTime } = Utils;
49517
- const T$4 = 'plugins.seek_time';
49541
+ const T$3 = 'plugins.seek_time';
49518
49542
  /**
49519
49543
  * `PLUGIN` that adds a seek time indicator when the mouse pointer is over the seek bar.
49520
49544
  * @beta
@@ -49573,7 +49597,7 @@ class SeekTime extends UICorePlugin {
49573
49597
  showTime(event) {
49574
49598
  this.hoveringOverSeekBar = true;
49575
49599
  this.calculateHoverPosition(event);
49576
- trace(`${T$4} showTime`, {
49600
+ trace(`${T$3} showTime`, {
49577
49601
  hoverPosition: this.hoverPosition,
49578
49602
  });
49579
49603
  this.update();
@@ -49660,7 +49684,7 @@ const pluginHtml$1 = "<div class=\"skip-container\" id=\"mc-skip-container\">\n
49660
49684
 
49661
49685
  insertStyle(".container-with-poster-clickable .mc-skip-time {\n height: 0;\n}\n\n.mc-skip-time {\n position: absolute;\n width: 100%;\n height: calc(100% - 50px);\n z-index: 9998;\n background-color: transparent;\n font-family: Roboto, \"Open Sans\", Arial, sans-serif;\n}\n.mc-skip-time .skip-container {\n width: 100%;\n height: 100%;\n display: flex;\n justify-content: space-between;\n}\n.mc-skip-time .skip-container .skip-item {\n flex: 1 0 0px;\n height: 100%;\n}");
49662
49686
 
49663
- const T$3 = 'plugins.skip_time';
49687
+ const T$2 = 'plugins.skip_time';
49664
49688
  /**
49665
49689
  * `PLUGIN` that allows skipping time by tapping on the left or right side of the video.
49666
49690
  * @beta
@@ -49710,7 +49734,7 @@ class SkipTime extends UICorePlugin {
49710
49734
  this.position = 'left';
49711
49735
  }
49712
49736
  handleRewindClicks() {
49713
- trace(`${T$3} handleRewindClicks`, {
49737
+ trace(`${T$2} handleRewindClicks`, {
49714
49738
  position: this.position,
49715
49739
  });
49716
49740
  if (this.core.getPlaybackType() === Playback.LIVE &&
@@ -49721,7 +49745,7 @@ class SkipTime extends UICorePlugin {
49721
49745
  this.handleSkip();
49722
49746
  }
49723
49747
  handleSkip() {
49724
- trace(`${T$3} handleSkip`, {
49748
+ trace(`${T$2} handleSkip`, {
49725
49749
  position: this.position,
49726
49750
  });
49727
49751
  if (Browser.isMobile) {
@@ -49776,7 +49800,7 @@ insertStyle(".spinner-three-bounce[data-spinner] {\n position: absolute;\n wid
49776
49800
  // Use of this source code is governed by a BSD-style
49777
49801
  // license that can be found in the LICENSE file.
49778
49802
  // https://github.com/clappr/clappr-plugins/blob/ffaa9d27005fa5a8a7c243ffc47eb5655b84b371/LICENSE
49779
- const T$2 = 'plugins.spinner';
49803
+ const T$1 = 'plugins.spinner';
49780
49804
  /**
49781
49805
  * Custom events emitted by the plugin
49782
49806
  * @public
@@ -49849,14 +49873,14 @@ class SpinnerThreeBounce extends UIContainerPlugin {
49849
49873
  this._hide();
49850
49874
  }
49851
49875
  onStop() {
49852
- trace(`${T$2} onStop`, {
49876
+ trace(`${T$1} onStop`, {
49853
49877
  hasFatalError: this.hasFatalError,
49854
49878
  });
49855
49879
  this._hide();
49856
49880
  }
49857
49881
  onError(e) {
49858
49882
  this.hasFatalError = e.code === PlaybackErrorCode.MediaSourceUnavailable;
49859
- trace(`${T$2} onError`, {
49883
+ trace(`${T$1} onError`, {
49860
49884
  hasFatalError: this.hasFatalError,
49861
49885
  error: e.code,
49862
49886
  });
@@ -49889,7 +49913,7 @@ class SpinnerThreeBounce extends UIContainerPlugin {
49889
49913
  }
49890
49914
  }
49891
49915
  _hide() {
49892
- trace(`${T$2} _hide`, {
49916
+ trace(`${T$1} _hide`, {
49893
49917
  userShown: this.userShown,
49894
49918
  });
49895
49919
  if (this.userShown) {
@@ -49906,7 +49930,7 @@ class SpinnerThreeBounce extends UIContainerPlugin {
49906
49930
  * @internal
49907
49931
  */
49908
49932
  render() {
49909
- trace(`${T$2} render`, {
49933
+ trace(`${T$1} render`, {
49910
49934
  buffering: this.container.buffering,
49911
49935
  });
49912
49936
  this.$el.html(this.template());
@@ -49924,7 +49948,7 @@ class SpinnerThreeBounce extends UIContainerPlugin {
49924
49948
  }
49925
49949
  }
49926
49950
 
49927
- const T$1 = 'plugins.source_controller';
49951
+ const T = 'plugins.source_controller';
49928
49952
  const INITIAL_RETRY_DELAY = 1000;
49929
49953
  const MAX_RETRY_DELAY = 5000;
49930
49954
  const RETRY_DELAY_BLUR = 500;
@@ -50070,7 +50094,7 @@ class SourceController extends CorePlugin {
50070
50094
  this.core.getPlugin('error_screen')?.disable(); // TODO test
50071
50095
  }
50072
50096
  onActiveContainerChanged() {
50073
- trace(`${T$1} onActiveContainerChanged`, {
50097
+ trace(`${T} onActiveContainerChanged`, {
50074
50098
  retrying: this.active,
50075
50099
  currentSource: this.sourcesList[this.currentSourceIndex],
50076
50100
  });
@@ -50091,7 +50115,7 @@ class SourceController extends CorePlugin {
50091
50115
  }
50092
50116
  bindContainerEventListeners() {
50093
50117
  this.core.activePlayback.on(Events$1.PLAYBACK_ERROR, (error) => {
50094
- trace(`${T$1} on PLAYBACK_ERROR`, {
50118
+ trace(`${T} on PLAYBACK_ERROR`, {
50095
50119
  error: {
50096
50120
  code: error?.code,
50097
50121
  description: error?.description,
@@ -50115,7 +50139,7 @@ class SourceController extends CorePlugin {
50115
50139
  }
50116
50140
  });
50117
50141
  this.core.activePlayback.on(Events$1.PLAYBACK_PLAY, () => {
50118
- trace(`${T$1} on PLAYBACK_PLAY`, {
50142
+ trace(`${T} on PLAYBACK_PLAY`, {
50119
50143
  currentSource: this.sourcesList[this.currentSourceIndex],
50120
50144
  retrying: this.active,
50121
50145
  });
@@ -50134,7 +50158,7 @@ class SourceController extends CorePlugin {
50134
50158
  this.sourcesDelay = {};
50135
50159
  }
50136
50160
  retryPlayback() {
50137
- trace(`${T$1} retryPlayback enter`, {
50161
+ trace(`${T} retryPlayback enter`, {
50138
50162
  currentSourceIndex: this.currentSourceIndex,
50139
50163
  currentSource: this.sourcesList[this.currentSourceIndex],
50140
50164
  });
@@ -50147,7 +50171,7 @@ class SourceController extends CorePlugin {
50147
50171
  this.switching = false;
50148
50172
  this.core.load(nextSource.source, nextSource.mimeType);
50149
50173
  setTimeout(() => {
50150
- trace(`${T$1} retryPlayback playing`, {
50174
+ trace(`${T} retryPlayback playing`, {
50151
50175
  autoPlay: this.autoPlay,
50152
50176
  });
50153
50177
  this.core.activeContainer.play({
@@ -50175,19 +50199,18 @@ class SourceController extends CorePlugin {
50175
50199
  }
50176
50200
  }
50177
50201
 
50178
- insertStyle(".media-control-skin-1 .media-control-cc button.media-control-button {\n display: flex;\n justify-content: center;\n padding: 0;\n align-items: center;\n vertical-align: top;\n}\n.media-control-skin-1 .media-control-cc button.media-control-button:hover {\n color: white;\n}\n.media-control-skin-1 .media-control-cc ul {\n width: auto;\n border-radius: 4px;\n bottom: 52px;\n margin-left: -28px;\n}\n.media-control-skin-1 .media-control-cc ul li {\n font-size: 16px;\n text-align: center;\n white-space: nowrap;\n height: 30px;\n}\n.media-control-skin-1 .media-control-cc ul li a {\n height: 30px;\n padding: 5px 10px;\n color: #fffffe;\n}\n.media-control-skin-1 .media-control-cc ul li a:hover {\n background-color: rgba(0, 0, 0, 0.4);\n}\n.media-control-skin-1 .media-control-cc ul li.current a {\n background-color: rgba(0, 0, 0, 0.4);\n}\n.media-control-skin-1 .media-control-cc ul li:first-child a {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.media-control-skin-1 .media-control-cc ul li:last-child a {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.media-control-skin-1 .media-control-cc {\n position: relative;\n order: 85;\n}\n.media-control-skin-1 .media-control-cc button {\n background-color: transparent;\n color: #fff;\n -webkit-font-smoothing: antialiased;\n border: none;\n cursor: pointer;\n}\n.media-control-skin-1 .media-control-cc button .cc-text svg {\n fill: white;\n}\n.media-control-skin-1 .media-control-cc button:hover {\n color: #c9c9c9;\n}\n.media-control-skin-1 .media-control-cc button.changing {\n animation: pulse 0.5s infinite alternate;\n}\n.media-control-skin-1 .media-control-cc ul {\n width: 80px;\n overflow: hidden;\n list-style-type: none;\n position: absolute;\n bottom: 25px;\n border: none;\n background-color: #e6e6e6;\n padding: 8px 0;\n box-shadow: 0 0 1px 1px var(--gplayer-mc-popup-border-color);\n}\n.media-control-skin-1 .media-control-cc li a {\n color: #444;\n padding: 2px 10px;\n display: block;\n text-decoration: none;\n}\n.media-control-skin-1 .media-control-cc li a:hover {\n background-color: #555;\n color: white;\n}\n.media-control-skin-1 .media-control-cc li a:hover a {\n color: white;\n text-decoration: none;\n}\n.media-control-skin-1 .media-control-cc li.current a {\n color: #f00;\n background-color: #555;\n}");
50202
+ insertStyle(".media-control-skin-1 .media-control-cc button.media-control-button {\n display: flex;\n justify-content: center;\n padding: 0;\n align-items: center;\n vertical-align: top;\n}\n.media-control-skin-1 .media-control-cc button.media-control-button:hover {\n color: white;\n}\n.media-control-skin-1 .media-control-cc ul li {\n text-align: center;\n}\n.media-control-skin-1 .media-control-cc ul li a {\n height: 30px;\n padding: 5px 10px;\n color: #fffffe;\n}\n.media-control-skin-1 .media-control-cc ul li a:hover {\n background-color: rgba(0, 0, 0, 0.4);\n}\n.media-control-skin-1 .media-control-cc ul li.current a {\n background-color: rgba(0, 0, 0, 0.4);\n}\n.media-control-skin-1 .media-control-cc ul li:first-child a {\n border-bottom-left-radius: 4px;\n border-bottom-right-radius: 4px;\n}\n.media-control-skin-1 .media-control-cc ul li:last-child a {\n border-top-left-radius: 4px;\n border-top-right-radius: 4px;\n}\n.media-control-skin-1 .media-control-cc {\n position: relative;\n order: 85;\n}\n\n.container .gplayer-cc-line {\n position: absolute;\n bottom: calc(var(--bottom-panel) + 5px);\n width: 100%;\n}\n.container .gplayer-cc-line p {\n width: auto;\n background-color: rgba(0, 0, 0, 0.4);\n color: white;\n display: inline-block;\n}");
50179
50203
 
50180
50204
  const subtitlesOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16.238 16.1C13.979 16.1 12.578 14.538 12.578 11.997C12.578 9.462 13.973 7.9 16.238 7.9C18.087 7.9 19.5029 9.127 19.6219 10.824H18.032C17.876 9.927 17.168 9.338 16.238 9.338C15.011 9.338 14.249 10.354 14.249 11.997C14.249 13.641 15.011 14.662 16.243 14.662C17.178 14.662 17.881 14.111 18.038 13.251H19.627C19.492 14.938 18.119 16.1 16.238 16.1ZM8.03198 16.1C5.77298 16.1 4.37299 14.538 4.37299 11.997C4.37299 9.462 5.76798 7.9 8.03198 7.9C9.88098 7.9 11.298 9.127 11.416 10.824H9.82697C9.67097 9.927 8.96198 9.338 8.03198 9.338C6.80598 9.338 6.04297 10.354 6.04297 11.997C6.04297 13.641 6.80596 14.662 8.03796 14.662C8.97296 14.662 9.67601 14.111 9.83301 13.251H11.422C11.287 14.938 9.91398 16.1 8.03198 16.1ZM22.5 3H1.5C0.672 3 0 3.671 0 4.5V19.5C0 20.329 0.672 21 1.5 21H22.5C23.329 21 24 20.329 24 19.5V4.5C24 3.671 23.329 3 22.5 3Z\"\n fill=\"#C9C9C9\"/>\n</svg>\n";
50181
50205
 
50182
50206
  const subtitlesOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M16.238 16.1C13.979 16.1 12.578 14.538 12.578 11.997C12.578 9.462 13.973 7.9 16.238 7.9C18.087 7.9 19.5029 9.127 19.6219 10.824H18.032C17.876 9.927 17.168 9.338 16.238 9.338C15.011 9.338 14.249 10.354 14.249 11.997C14.249 13.641 15.011 14.662 16.243 14.662C17.178 14.662 17.881 14.111 18.038 13.251H19.627C19.492 14.938 18.119 16.1 16.238 16.1ZM8.03198 16.1C5.77298 16.1 4.37299 14.538 4.37299 11.997C4.37299 9.462 5.76798 7.9 8.03198 7.9C9.88098 7.9 11.298 9.127 11.416 10.824H9.82697C9.67097 9.927 8.96198 9.338 8.03198 9.338C6.80598 9.338 6.04297 10.354 6.04297 11.997C6.04297 13.641 6.80596 14.662 8.03796 14.662C8.97296 14.662 9.67601 14.111 9.83301 13.251H11.422C11.287 14.938 9.91398 16.1 8.03198 16.1ZM22.5 3H1.5C0.672 3 0 3.671 0 4.5V19.5C0 20.329 0.672 21 1.5 21H22.5C23.329 21 24 20.329 24 19.5V4.5C24 3.671 23.329 3 22.5 3Z\"\n fill=\"#C9C9C9\"/>\n <rect y=\"22\" width=\"24\" height=\"2\" rx=\"1\" fill=\"#F6413B\"/>\n</svg>\n";
50183
50207
 
50184
- const comboboxHTML = "<button data-cc-button class='media-control-button media-control-icon gcore-skin-button-color' id=\"cc-button\">\n <span class='cc-text'></span>\n</button>\n\n<ul class='gcore-skin-bg-color' id=\"cc-select\">\n <% for (const t of tracks) { %>\n <li>\n <a href=\"#\" class='gcore-skin-text-color' data-cc-select=\"<%= t.id %>\">\n <%= t.name %>\n </a>\n </li>\n <% } %>\n <li><a href=\"#\" class='gcore-skin-text-color' data-cc-select=\"-1\"><%= i18n.t('off') %></a></li>\n</ul>\n";
50208
+ const comboboxHTML = "<button\n class='media-control-button media-control-icon gcore-skin-button-color media-control-dd'\n id=\"gplayer-cc-button\"\n aria-haspopup=\"menu\"\n aria-expanded=\"false\"\n aria-controls=\"gplayer-cc-menu\"\n>\n</button>\n\n<ul class='gcore-skin-bg-color media-control-dd__popup' id=\"gplayer-cc-menu\" role=\"menu\">\n <% for (const t of tracks) { %>\n <li>\n <a\n href=\"#\"\n class=\"gcore-skin-text-color\"\n data-item=\"<%= t.id %>\"\n role=\"menuitemradio\"\n aria-checked=\"<%= t.id === current %>\"\n >\n <%= t.name %>\n </a>\n </li>\n <% } %>\n <li class=\"current\">\n <a\n href=\"#\"\n class='gcore-skin-text-color gcore-skin-active'\n data-item=\"-1\"\n role=\"menuitemradio\"\n aria-checked=\"<%= current === -1 %>\"\n >\n <%= i18n.t('off') %>\n </a>\n </li>\n</ul>";
50185
50209
 
50186
- const stringHTML = "<div class=\"cc-line\" id=\"cc-line\">\n <p></p>\n</div>\n";
50210
+ const stringHTML = "<div class=\"gplayer-cc-line\" id=\"gplayer-cc-line\">\n <p></p>\n</div>\n";
50187
50211
 
50188
50212
  const VERSION = '2.19.14';
50189
50213
  const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
50190
- const T = 'plugins.cc';
50191
50214
  /**
50192
50215
  * `PLUGIN` that provides a UI to select the subtitles when available.
50193
50216
  * @beta
@@ -50218,6 +50241,7 @@ const T = 'plugins.cc';
50218
50241
  class ClosedCaptions extends UICorePlugin {
50219
50242
  isPreselectedApplied = false;
50220
50243
  active = false;
50244
+ open = false;
50221
50245
  track = null;
50222
50246
  tracks = [];
50223
50247
  $line = null;
@@ -50239,14 +50263,14 @@ class ClosedCaptions extends UICorePlugin {
50239
50263
  static get version() {
50240
50264
  return VERSION;
50241
50265
  }
50242
- static template = tmpl(comboboxHTML);
50243
- static templateString = tmpl(stringHTML);
50266
+ static templateControl = tmpl(comboboxHTML);
50267
+ static templateLine = tmpl(stringHTML);
50244
50268
  /**
50245
50269
  * @internal
50246
50270
  */
50247
50271
  get attributes() {
50248
50272
  return {
50249
- class: 'media-control-cc',
50273
+ class: 'media-control-cc media-control-dd__wrap',
50250
50274
  };
50251
50275
  }
50252
50276
  /**
@@ -50254,8 +50278,8 @@ class ClosedCaptions extends UICorePlugin {
50254
50278
  */
50255
50279
  get events() {
50256
50280
  return {
50257
- 'click #cc-select li a': 'onItemSelect',
50258
- 'click #cc-button': 'toggleMenu',
50281
+ 'click #gplayer-cc-menu [data-item]': 'onItemSelect',
50282
+ 'click #gplayer-cc-button': 'toggleMenu',
50259
50283
  };
50260
50284
  }
50261
50285
  get preselectedLanguage() {
@@ -50274,7 +50298,7 @@ class ClosedCaptions extends UICorePlugin {
50274
50298
  onCoreReady() {
50275
50299
  const mediaControl = this.core.getPlugin('media_control');
50276
50300
  assert(mediaControl, 'media_control plugin is required');
50277
- this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render); // TODO mount to media control
50301
+ this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.mount);
50278
50302
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, () => {
50279
50303
  this.hideMenu();
50280
50304
  });
@@ -50289,6 +50313,10 @@ class ClosedCaptions extends UICorePlugin {
50289
50313
  this.listenTo(this.core.activeContainer, 'container:advertisement:start', this.onStartAd);
50290
50314
  this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
50291
50315
  this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_CHANGED, this.onSubtitleChanged);
50316
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_CLICK, () => {
50317
+ // TODO test
50318
+ this.hideMenu();
50319
+ });
50292
50320
  // fix for iOS
50293
50321
  const video = this.core.activePlayback.el;
50294
50322
  assert(video, 'video element is required');
@@ -50305,6 +50333,7 @@ class ClosedCaptions extends UICorePlugin {
50305
50333
  }
50306
50334
  onSubtitleAvailable() {
50307
50335
  this.applyTracks();
50336
+ this.mount();
50308
50337
  }
50309
50338
  onSubtitleChanged({ id }) {
50310
50339
  if (id === -1) {
@@ -50365,6 +50394,7 @@ class ClosedCaptions extends UICorePlugin {
50365
50394
  }
50366
50395
  try {
50367
50396
  this.resizeFont();
50397
+ this.clampPopup();
50368
50398
  }
50369
50399
  catch (error) {
50370
50400
  }
@@ -50374,7 +50404,10 @@ class ClosedCaptions extends UICorePlugin {
50374
50404
  */
50375
50405
  hide() {
50376
50406
  this.active = false;
50407
+ this.open = false;
50377
50408
  this.renderIcon();
50409
+ this.$el.find('#gplayer-cc-menu').hide();
50410
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
50378
50411
  this.$line.hide();
50379
50412
  if (this.tracks) {
50380
50413
  for (const t of this.tracks) {
@@ -50417,17 +50450,18 @@ class ClosedCaptions extends UICorePlugin {
50417
50450
  if (!this.core.activeContainer) {
50418
50451
  return this;
50419
50452
  }
50420
- if (!this.shouldRender()) {
50421
- return this;
50422
- }
50423
- const mediaControl = this.core.getPlugin('media_control');
50424
- this.$el.html(ClosedCaptions.template({ tracks: this.tracks, i18n: this.core.i18n }));
50425
- this.$el.find('#cc-select').hide();
50426
- this.core.activeContainer.$el.find('#cc-line').remove();
50427
- this.$line = $(ClosedCaptions.templateString());
50453
+ this.$el.html(ClosedCaptions.templateControl({
50454
+ tracks: this.tracks ?? [],
50455
+ i18n: this.core.i18n,
50456
+ current: this.track?.id ?? -1,
50457
+ }));
50458
+ this.$el.find('#gplayer-cc-menu').hide();
50459
+ this.open = false;
50460
+ this.core.activeContainer.$el.find('#gplayer-cc-line').remove();
50461
+ this.$line = $(ClosedCaptions.templateLine());
50428
50462
  this.resizeFont();
50463
+ this.clampPopup();
50429
50464
  this.core.activeContainer.$el.append(this.$line);
50430
- mediaControl.slot('cc', this.$el);
50431
50465
  this.updateSelection();
50432
50466
  this.renderIcon();
50433
50467
  return this;
@@ -50441,8 +50475,10 @@ class ClosedCaptions extends UICorePlugin {
50441
50475
  this.updateSelection();
50442
50476
  }
50443
50477
  onItemSelect(event) {
50444
- const id = event.target.dataset.ccSelect ?? '-1';
50445
- localStorage.setItem(LOCAL_STORAGE_CC_ID, id);
50478
+ // event.target does not exist for some reason in tests
50479
+ const id = (event.target ?? event.currentTarget).dataset?.item ??
50480
+ '-1';
50481
+ localStorage.setItem(LOCAL_STORAGE_CC_ID, id); // TODO store language instead
50446
50482
  this.selectItem(this.findById(Number(id)));
50447
50483
  this.hideMenu();
50448
50484
  return false;
@@ -50459,25 +50495,33 @@ class ClosedCaptions extends UICorePlugin {
50459
50495
  }
50460
50496
  }
50461
50497
  hideMenu() {
50462
- this.$el.find('#cc-select').hide();
50498
+ this.open = false;
50499
+ this.$el.find('#gplayer-cc-menu').hide();
50500
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
50463
50501
  }
50464
50502
  toggleMenu() {
50465
- trace(`${T} toggleMenu`, { display: this.$el.find('#cc-select').css('display') });
50466
50503
  this.core
50467
50504
  .getPlugin('media_control')
50468
50505
  .trigger(ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, this.name);
50469
- this.$el.find('#cc-select').toggle();
50470
- // TODO hold state, add aria-expanded to the button, add active state to the button
50506
+ this.open = !this.open;
50507
+ if (this.open) {
50508
+ this.$el.find('#gplayer-cc-menu').show();
50509
+ }
50510
+ else {
50511
+ this.$el.find('#gplayer-cc-menu').hide();
50512
+ }
50513
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', this.open);
50471
50514
  }
50472
50515
  itemElement(id) {
50473
- return this.$el.find(`#cc-select li a[data-cc-select="${id}"]`).parent();
50516
+ // TODO fix semantically
50517
+ return this.$el.find(`#gplayer-cc-menu [data-item="${id}"]`).parent();
50474
50518
  }
50475
50519
  allItemElements() {
50476
- return this.$('#cc-select li');
50520
+ return this.$el.find('#gplayer-cc-menu li'); // TODO fix semantically
50477
50521
  }
50478
50522
  selectSubtitles() {
50479
50523
  const trackId = this.track ? this.track.id : -1;
50480
- this.core.activePlayback.closedCaptionsTrackId = trackId;
50524
+ this.core.activePlayback.closedCaptionsTrackId = trackId; // TODO test
50481
50525
  }
50482
50526
  getSubtitleText(track) {
50483
50527
  const currentTime = this.core.activePlayback?.getCurrentTime() ?? 0;
@@ -50487,6 +50531,7 @@ class ClosedCaptions extends UICorePlugin {
50487
50531
  for (const cue of cues) {
50488
50532
  if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
50489
50533
  lines.push(cue.getCueAsHTML().textContent);
50534
+ // TODO break?
50490
50535
  }
50491
50536
  }
50492
50537
  }
@@ -50512,19 +50557,31 @@ class ClosedCaptions extends UICorePlugin {
50512
50557
  this.allItemElements()
50513
50558
  .removeClass('current')
50514
50559
  .find('a')
50515
- .removeClass('gcore-skin-active');
50516
- trace(`${T} highlightCurrentSubtitles`, {
50517
- track: this.track?.id,
50518
- });
50560
+ .removeClass('gcore-skin-active')
50561
+ .attr('aria-checked', 'false');
50519
50562
  const currentLevelElement = this.itemElement(this.track ? this.track.id : -1);
50520
50563
  currentLevelElement
50521
50564
  .addClass('current')
50522
50565
  .find('a')
50523
- .addClass('gcore-skin-active');
50566
+ .addClass('gcore-skin-active')
50567
+ .attr('aria-checked', 'true');
50524
50568
  }
50525
50569
  renderIcon() {
50570
+ // render both icons at once
50526
50571
  const icon = this.active ? subtitlesOnIcon : subtitlesOffIcon;
50527
- this.$el.find('span.cc-text').html(icon);
50572
+ this.$el.find('#gplayer-cc-button').html(icon);
50573
+ }
50574
+ clampPopup() {
50575
+ const availableHeight = this.core
50576
+ .getPlugin('media_control')
50577
+ .getAvailablePopupHeight();
50578
+ this.$el.find('#gplayer-cc-menu').css('max-height', `${availableHeight}px`);
50579
+ }
50580
+ mount() {
50581
+ if (this.shouldRender()) {
50582
+ const mediaControl = this.core.getPlugin('media_control');
50583
+ mediaControl.slot('cc', this.$el);
50584
+ }
50528
50585
  }
50529
50586
  }
50530
50587