@gcorevideo/player 2.25.7 → 2.25.9

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 (33) hide show
  1. package/assets/bottom-gear/gear-sub-menu.scss +4 -9
  2. package/assets/media-control/container.scss +0 -13
  3. package/assets/media-control/media-control.scss +14 -12
  4. package/assets/media-control/width270.scss +3 -0
  5. package/assets/media-control/width370.scss +4 -0
  6. package/assets/multi-camera/style.scss +0 -5
  7. package/assets/subtitles/combobox.ejs +27 -6
  8. package/assets/subtitles/string.ejs +1 -1
  9. package/assets/subtitles/style.scss +16 -69
  10. package/dist/core.js +1 -1
  11. package/dist/index.css +1036 -1090
  12. package/dist/index.embed.js +139 -101
  13. package/dist/index.js +80 -46
  14. package/lib/plugins/bottom-gear/BottomGear.d.ts +1 -1
  15. package/lib/plugins/bottom-gear/BottomGear.d.ts.map +1 -1
  16. package/lib/plugins/bottom-gear/BottomGear.js +3 -4
  17. package/lib/plugins/media-control/MediaControl.d.ts +4 -0
  18. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  19. package/lib/plugins/media-control/MediaControl.js +7 -0
  20. package/lib/plugins/subtitles/ClosedCaptions.d.ts +8 -5
  21. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  22. package/lib/plugins/subtitles/ClosedCaptions.js +67 -38
  23. package/lib/testUtils.d.ts.map +1 -1
  24. package/lib/testUtils.js +2 -0
  25. package/package.json +1 -1
  26. package/src/plugins/bottom-gear/BottomGear.ts +3 -4
  27. package/src/plugins/bottom-gear/__tests__/BottomGear.test.ts +1 -1
  28. package/src/plugins/media-control/MediaControl.ts +10 -0
  29. package/src/plugins/subtitles/ClosedCaptions.ts +73 -39
  30. package/src/plugins/subtitles/__tests__/ClosedCaptions.test.ts +220 -35
  31. package/src/plugins/subtitles/__tests__/__snapshots__/ClosedCaptions.test.ts.snap +8 -19
  32. package/src/testUtils.ts +2 -0
  33. package/tsconfig.tsbuildinfo +1 -1
@@ -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,
@@ -43396,7 +43396,7 @@ const FullscreenIOS = {
43396
43396
  },
43397
43397
  };
43398
43398
 
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 .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-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\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\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-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__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: 114px;\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: hidden;\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[data-title] {\n background-color: #c3c2c2;\n padding: 5px;\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 height: 30px;\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: white;\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}");
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}");
43400
43400
 
43401
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";
43402
43402
 
@@ -43429,6 +43429,7 @@ const STANDARD_MEDIA_CONTROL_ELEMENTS = [
43429
43429
  'seekbar',
43430
43430
  'volume',
43431
43431
  ];
43432
+ const MENU_VMARGIN = 12;
43432
43433
  // TODO export
43433
43434
  const DEFAULT_SETTINGS = {
43434
43435
  default: ['seekbar'],
@@ -43752,6 +43753,12 @@ class MediaControl extends UICorePlugin {
43752
43753
  getAvailableHeight() {
43753
43754
  return (this.core.$el.height() - this.$el.find('.media-control-layer').height());
43754
43755
  }
43756
+ /**
43757
+ * @returns Vertical space available to render a popup menu
43758
+ */
43759
+ getAvailablePopupHeight() {
43760
+ return this.getAvailableHeight() - MENU_VMARGIN * 2;
43761
+ }
43755
43762
  /**
43756
43763
  * Set the initial volume, which is preserved when playback is interrupted by an advertisement
43757
43764
  */
@@ -44860,7 +44867,7 @@ const templateHtml$2 = "<div class=\"big-mute-icon-wrapper\" data-big-mute id=\"
44860
44867
 
44861
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}");
44862
44869
 
44863
- const T$a = 'plugins.big_mute_button';
44870
+ const T$9 = 'plugins.big_mute_button';
44864
44871
  // TODO rewrite as a container plugin
44865
44872
  /**
44866
44873
  * `PLUGIN` that displays a big mute button over the video when it's being played muted.
@@ -44923,7 +44930,7 @@ class BigMuteButton extends UICorePlugin {
44923
44930
  if (autoPlay) {
44924
44931
  this.autoPlay = true;
44925
44932
  }
44926
- trace(`${T$a} onPlay`, {
44933
+ trace(`${T$9} onPlay`, {
44927
44934
  autoPlay: this.autoPlay});
44928
44935
  if (this.autoPlay && !wasMuted && volume === 0) {
44929
44936
  this.mount();
@@ -44999,14 +45006,13 @@ const pluginHtml$3 = "<button class=\"media-control-button gplayer-lite-btn gcor
44999
45006
 
45000
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}");
45001
45008
 
45002
- 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}");
45003
45010
 
45004
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";
45005
45012
 
45006
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";
45007
45014
 
45008
45015
  const VERSION$5 = '2.19.12';
45009
- const MENU_VMARGIN = 12;
45010
45016
  const MENU_BACKLINK_HEIGHT = 44;
45011
45017
  /**
45012
45018
  * Events triggered by the plugin
@@ -45169,7 +45175,7 @@ class BottomGear extends UICorePlugin {
45169
45175
  .appendTo(this.$el.find('#gear-options-wrapper'));
45170
45176
  $item.on('click', (e) => {
45171
45177
  e.stopPropagation();
45172
- this.alignSubmenu($subMenu);
45178
+ this.clampPopup($subMenu);
45173
45179
  $subMenu.show();
45174
45180
  this.$el.find('#gear-options').hide();
45175
45181
  });
@@ -45265,9 +45271,8 @@ class BottomGear extends UICorePlugin {
45265
45271
  const mediaControl = this.core.getPlugin('media_control');
45266
45272
  mediaControl.slot('gear', this.$el);
45267
45273
  }
45268
- alignSubmenu($subMenu) {
45269
- const availableHeight = this.core.getPlugin('media_control').getAvailableHeight() -
45270
- MENU_VMARGIN * 2;
45274
+ clampPopup($subMenu) {
45275
+ const availableHeight = this.core.getPlugin('media_control').getAvailablePopupHeight();
45271
45276
  $subMenu.css('max-height', `${availableHeight}px`);
45272
45277
  $subMenu
45273
45278
  .find('.gear-sub-menu')
@@ -48494,7 +48499,7 @@ const templateHtml = "<div class=\"player-error-screen__content\" data-error-scr
48494
48499
 
48495
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}");
48496
48501
 
48497
- const T$9 = 'plugins.error_screen';
48502
+ const T$8 = 'plugins.error_screen';
48498
48503
  /**
48499
48504
  * `PLUGIN` that displays fatal errors nicely in the overlay on top of the player.
48500
48505
  * @public
@@ -48570,7 +48575,7 @@ class ErrorScreen extends UICorePlugin {
48570
48575
  }, 0);
48571
48576
  }
48572
48577
  onActiveContainerChanged() {
48573
- trace(`${T$9} onActiveContainerChanged`, {
48578
+ trace(`${T$8} onActiveContainerChanged`, {
48574
48579
  reloading: this.core.options.reloading,
48575
48580
  });
48576
48581
  this.err = null;
@@ -48620,7 +48625,7 @@ class ErrorScreen extends UICorePlugin {
48620
48625
 
48621
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}");
48622
48627
 
48623
- 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}");
48624
48629
 
48625
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";
48626
48631
 
@@ -48629,7 +48634,7 @@ const buttonHtml$2 = "<button class=\"gplayer-lite-btn gcore-skin-button-color\"
48629
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}");
48630
48635
 
48631
48636
  const VERSION$3 = '0.0.1';
48632
- const T$8 = `plugins.pip`;
48637
+ const T$7 = `plugins.pip`;
48633
48638
  /**
48634
48639
  * `PLUGIN` that enables picture in picture mode.
48635
48640
  * @beta
@@ -48712,7 +48717,7 @@ class PictureInPicture extends UICorePlugin {
48712
48717
  }
48713
48718
  }
48714
48719
  requestPictureInPicture() {
48715
- trace(`${T$8} requestPictureInPicture`, {
48720
+ trace(`${T$7} requestPictureInPicture`, {
48716
48721
  videoElement: !!this.videoElement,
48717
48722
  });
48718
48723
  this.videoElement.requestPictureInPicture();
@@ -48744,7 +48749,7 @@ const DEFAULT_PLAYBACK_RATES = [
48744
48749
  { value: 2.0, label: '2x' },
48745
48750
  ];
48746
48751
  const DEFAULT_PLAYBACK_RATE = 1;
48747
- const T$7 = 'plugins.playback_rate';
48752
+ const T$6 = 'plugins.playback_rate';
48748
48753
  /**
48749
48754
  * `PLUGIN` that allows changing the playback speed of the video.
48750
48755
  * @beta
@@ -48851,7 +48856,7 @@ class PlaybackRate extends UICorePlugin {
48851
48856
  this.mount();
48852
48857
  }
48853
48858
  mount() {
48854
- trace(`${T$7} mount`, {
48859
+ trace(`${T$6} mount`, {
48855
48860
  shouldMount: this.shouldMount(),
48856
48861
  });
48857
48862
  if (!this.shouldMount()) {
@@ -48868,7 +48873,7 @@ class PlaybackRate extends UICorePlugin {
48868
48873
  })));
48869
48874
  }
48870
48875
  onMetaDataLoaded() {
48871
- trace(`${T$7} onMetaDataLoaded`, {
48876
+ trace(`${T$6} onMetaDataLoaded`, {
48872
48877
  playbackType: this.core.activePlayback.getPlaybackType(),
48873
48878
  dvrEnabled: this.core.activePlayback.dvrEnabled,
48874
48879
  });
@@ -48890,13 +48895,13 @@ class PlaybackRate extends UICorePlugin {
48890
48895
  this.core.activePlayback?.setPlaybackRate(this.selectedRate);
48891
48896
  }
48892
48897
  else {
48893
- 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`, {
48894
48899
  selectedRate: this.selectedRate,
48895
48900
  });
48896
48901
  }
48897
48902
  }
48898
48903
  shouldMount() {
48899
- trace(`${T$7} shouldMount`, {
48904
+ trace(`${T$6} shouldMount`, {
48900
48905
  playbackType: this.core.activePlayback?.getPlaybackType(),
48901
48906
  dvrEnabled: this.core.activePlayback?.dvrEnabled,
48902
48907
  });
@@ -48913,7 +48918,7 @@ class PlaybackRate extends UICorePlugin {
48913
48918
  * @internal
48914
48919
  */
48915
48920
  render() {
48916
- trace(`${T$7} render`, {
48921
+ trace(`${T$6} render`, {
48917
48922
  shouldMount: this.shouldMount(),
48918
48923
  });
48919
48924
  this.$el.html(PlaybackRate.listTemplate({
@@ -48959,13 +48964,13 @@ class PlaybackRate extends UICorePlugin {
48959
48964
  }
48960
48965
  }
48961
48966
  syncRate() {
48962
- trace(`${T$7} syncRate`, {
48967
+ trace(`${T$6} syncRate`, {
48963
48968
  selectedRate: this.selectedRate,
48964
48969
  });
48965
48970
  this.core.activePlayback?.setPlaybackRate(this.selectedRate);
48966
48971
  }
48967
48972
  resetPlaybackRate() {
48968
- trace(`${T$7} resetPlaybackRate`, {
48973
+ trace(`${T$6} resetPlaybackRate`, {
48969
48974
  selectedRate: this.selectedRate,
48970
48975
  });
48971
48976
  this.core.activePlayback?.setPlaybackRate(DEFAULT_PLAYBACK_RATE);
@@ -49000,7 +49005,7 @@ class PlaybackRate extends UICorePlugin {
49000
49005
  ?.label || `x${rate}`);
49001
49006
  }
49002
49007
  highlightCurrentRate() {
49003
- trace(`${T$7} highlightCurrentRate`, {
49008
+ trace(`${T$6} highlightCurrentRate`, {
49004
49009
  selectedRate: this.selectedRate,
49005
49010
  });
49006
49011
  this.allRateElements().removeClass('current');
@@ -49011,7 +49016,7 @@ class PlaybackRate extends UICorePlugin {
49011
49016
  .addClass('gcore-skin-active');
49012
49017
  }
49013
49018
  updateGearOptionLabel() {
49014
- trace(`${T$7} updateGearOptionLabel`, {
49019
+ trace(`${T$6} updateGearOptionLabel`, {
49015
49020
  selectedRate: this.selectedRate,
49016
49021
  });
49017
49022
  this.mount();
@@ -49025,7 +49030,7 @@ const posterHTML = "<div class=\"play-wrapper\" id=\"gplayer-poster\">\n <div
49025
49030
  //Copyright 2014 Globo.com Player authors. All rights reserved.
49026
49031
  // Use of this source code is governed by a BSD-style
49027
49032
  // license that can be found in the LICENSE file.
49028
- const T$6 = 'plugins.poster';
49033
+ const T$5 = 'plugins.poster';
49029
49034
  /**
49030
49035
  * `PLUGIN` that displays a poster image in the background and a big play button on top when playback is stopped
49031
49036
  * @beta
@@ -49129,7 +49134,7 @@ class Poster extends UIContainerPlugin {
49129
49134
  super.disable();
49130
49135
  }
49131
49136
  onError(error) {
49132
- trace(`${T$6} onError`, {
49137
+ trace(`${T$5} onError`, {
49133
49138
  enabled: this.enabled,
49134
49139
  });
49135
49140
  if (this.hasFatalError) {
@@ -49262,7 +49267,7 @@ const hdIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\"non
49262
49267
 
49263
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}");
49264
49269
 
49265
- const T$5 = 'plugins.quality_levels';
49270
+ const T$4 = 'plugins.quality_levels';
49266
49271
  const VERSION$2 = 'v2.22.5';
49267
49272
  /**
49268
49273
  * `PLUGIN` that provides a UI to select the desired quality level of the playback.
@@ -49505,7 +49510,7 @@ class QualityLevels extends UICorePlugin {
49505
49510
  this.highlightCurrentLevel();
49506
49511
  }
49507
49512
  highlightCurrentLevel() {
49508
- trace(`${T$5} highlightCurrentLevel`, {
49513
+ trace(`${T$4} highlightCurrentLevel`, {
49509
49514
  selectedLevelId: this.selectedLevelId,
49510
49515
  });
49511
49516
  this.allLevelElements()
@@ -49533,7 +49538,7 @@ insertStyle(".seek-time {\n position: absolute;\n white-space: nowrap;\n heig
49533
49538
  // Use of this source code is governed by a BSD-style
49534
49539
  // license that can be found at https://github.com/clappr/clappr-plugins/blob/master/LICENSE
49535
49540
  const { formatTime } = Utils;
49536
- const T$4 = 'plugins.seek_time';
49541
+ const T$3 = 'plugins.seek_time';
49537
49542
  /**
49538
49543
  * `PLUGIN` that adds a seek time indicator when the mouse pointer is over the seek bar.
49539
49544
  * @beta
@@ -49592,7 +49597,7 @@ class SeekTime extends UICorePlugin {
49592
49597
  showTime(event) {
49593
49598
  this.hoveringOverSeekBar = true;
49594
49599
  this.calculateHoverPosition(event);
49595
- trace(`${T$4} showTime`, {
49600
+ trace(`${T$3} showTime`, {
49596
49601
  hoverPosition: this.hoverPosition,
49597
49602
  });
49598
49603
  this.update();
@@ -49679,7 +49684,7 @@ const pluginHtml$1 = "<div class=\"skip-container\" id=\"mc-skip-container\">\n
49679
49684
 
49680
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}");
49681
49686
 
49682
- const T$3 = 'plugins.skip_time';
49687
+ const T$2 = 'plugins.skip_time';
49683
49688
  /**
49684
49689
  * `PLUGIN` that allows skipping time by tapping on the left or right side of the video.
49685
49690
  * @beta
@@ -49729,7 +49734,7 @@ class SkipTime extends UICorePlugin {
49729
49734
  this.position = 'left';
49730
49735
  }
49731
49736
  handleRewindClicks() {
49732
- trace(`${T$3} handleRewindClicks`, {
49737
+ trace(`${T$2} handleRewindClicks`, {
49733
49738
  position: this.position,
49734
49739
  });
49735
49740
  if (this.core.getPlaybackType() === Playback.LIVE &&
@@ -49740,7 +49745,7 @@ class SkipTime extends UICorePlugin {
49740
49745
  this.handleSkip();
49741
49746
  }
49742
49747
  handleSkip() {
49743
- trace(`${T$3} handleSkip`, {
49748
+ trace(`${T$2} handleSkip`, {
49744
49749
  position: this.position,
49745
49750
  });
49746
49751
  if (Browser.isMobile) {
@@ -49795,7 +49800,7 @@ insertStyle(".spinner-three-bounce[data-spinner] {\n position: absolute;\n wid
49795
49800
  // Use of this source code is governed by a BSD-style
49796
49801
  // license that can be found in the LICENSE file.
49797
49802
  // https://github.com/clappr/clappr-plugins/blob/ffaa9d27005fa5a8a7c243ffc47eb5655b84b371/LICENSE
49798
- const T$2 = 'plugins.spinner';
49803
+ const T$1 = 'plugins.spinner';
49799
49804
  /**
49800
49805
  * Custom events emitted by the plugin
49801
49806
  * @public
@@ -49868,14 +49873,14 @@ class SpinnerThreeBounce extends UIContainerPlugin {
49868
49873
  this._hide();
49869
49874
  }
49870
49875
  onStop() {
49871
- trace(`${T$2} onStop`, {
49876
+ trace(`${T$1} onStop`, {
49872
49877
  hasFatalError: this.hasFatalError,
49873
49878
  });
49874
49879
  this._hide();
49875
49880
  }
49876
49881
  onError(e) {
49877
49882
  this.hasFatalError = e.code === PlaybackErrorCode.MediaSourceUnavailable;
49878
- trace(`${T$2} onError`, {
49883
+ trace(`${T$1} onError`, {
49879
49884
  hasFatalError: this.hasFatalError,
49880
49885
  error: e.code,
49881
49886
  });
@@ -49908,7 +49913,7 @@ class SpinnerThreeBounce extends UIContainerPlugin {
49908
49913
  }
49909
49914
  }
49910
49915
  _hide() {
49911
- trace(`${T$2} _hide`, {
49916
+ trace(`${T$1} _hide`, {
49912
49917
  userShown: this.userShown,
49913
49918
  });
49914
49919
  if (this.userShown) {
@@ -49925,7 +49930,7 @@ class SpinnerThreeBounce extends UIContainerPlugin {
49925
49930
  * @internal
49926
49931
  */
49927
49932
  render() {
49928
- trace(`${T$2} render`, {
49933
+ trace(`${T$1} render`, {
49929
49934
  buffering: this.container.buffering,
49930
49935
  });
49931
49936
  this.$el.html(this.template());
@@ -49943,7 +49948,7 @@ class SpinnerThreeBounce extends UIContainerPlugin {
49943
49948
  }
49944
49949
  }
49945
49950
 
49946
- const T$1 = 'plugins.source_controller';
49951
+ const T = 'plugins.source_controller';
49947
49952
  const INITIAL_RETRY_DELAY = 1000;
49948
49953
  const MAX_RETRY_DELAY = 5000;
49949
49954
  const RETRY_DELAY_BLUR = 500;
@@ -50089,7 +50094,7 @@ class SourceController extends CorePlugin {
50089
50094
  this.core.getPlugin('error_screen')?.disable(); // TODO test
50090
50095
  }
50091
50096
  onActiveContainerChanged() {
50092
- trace(`${T$1} onActiveContainerChanged`, {
50097
+ trace(`${T} onActiveContainerChanged`, {
50093
50098
  retrying: this.active,
50094
50099
  currentSource: this.sourcesList[this.currentSourceIndex],
50095
50100
  });
@@ -50110,7 +50115,7 @@ class SourceController extends CorePlugin {
50110
50115
  }
50111
50116
  bindContainerEventListeners() {
50112
50117
  this.core.activePlayback.on(Events$1.PLAYBACK_ERROR, (error) => {
50113
- trace(`${T$1} on PLAYBACK_ERROR`, {
50118
+ trace(`${T} on PLAYBACK_ERROR`, {
50114
50119
  error: {
50115
50120
  code: error?.code,
50116
50121
  description: error?.description,
@@ -50134,7 +50139,7 @@ class SourceController extends CorePlugin {
50134
50139
  }
50135
50140
  });
50136
50141
  this.core.activePlayback.on(Events$1.PLAYBACK_PLAY, () => {
50137
- trace(`${T$1} on PLAYBACK_PLAY`, {
50142
+ trace(`${T} on PLAYBACK_PLAY`, {
50138
50143
  currentSource: this.sourcesList[this.currentSourceIndex],
50139
50144
  retrying: this.active,
50140
50145
  });
@@ -50153,7 +50158,7 @@ class SourceController extends CorePlugin {
50153
50158
  this.sourcesDelay = {};
50154
50159
  }
50155
50160
  retryPlayback() {
50156
- trace(`${T$1} retryPlayback enter`, {
50161
+ trace(`${T} retryPlayback enter`, {
50157
50162
  currentSourceIndex: this.currentSourceIndex,
50158
50163
  currentSource: this.sourcesList[this.currentSourceIndex],
50159
50164
  });
@@ -50166,7 +50171,7 @@ class SourceController extends CorePlugin {
50166
50171
  this.switching = false;
50167
50172
  this.core.load(nextSource.source, nextSource.mimeType);
50168
50173
  setTimeout(() => {
50169
- trace(`${T$1} retryPlayback playing`, {
50174
+ trace(`${T} retryPlayback playing`, {
50170
50175
  autoPlay: this.autoPlay,
50171
50176
  });
50172
50177
  this.core.activeContainer.play({
@@ -50194,19 +50199,18 @@ class SourceController extends CorePlugin {
50194
50199
  }
50195
50200
  }
50196
50201
 
50197
- 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}");
50198
50203
 
50199
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";
50200
50205
 
50201
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";
50202
50207
 
50203
- 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>";
50204
50209
 
50205
- 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";
50206
50211
 
50207
50212
  const VERSION = '2.19.14';
50208
50213
  const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
50209
- const T = 'plugins.cc';
50210
50214
  /**
50211
50215
  * `PLUGIN` that provides a UI to select the subtitles when available.
50212
50216
  * @beta
@@ -50237,6 +50241,7 @@ const T = 'plugins.cc';
50237
50241
  class ClosedCaptions extends UICorePlugin {
50238
50242
  isPreselectedApplied = false;
50239
50243
  active = false;
50244
+ open = false;
50240
50245
  track = null;
50241
50246
  tracks = [];
50242
50247
  $line = null;
@@ -50258,14 +50263,14 @@ class ClosedCaptions extends UICorePlugin {
50258
50263
  static get version() {
50259
50264
  return VERSION;
50260
50265
  }
50261
- static template = tmpl(comboboxHTML);
50262
- static templateString = tmpl(stringHTML);
50266
+ static templateControl = tmpl(comboboxHTML);
50267
+ static templateLine = tmpl(stringHTML);
50263
50268
  /**
50264
50269
  * @internal
50265
50270
  */
50266
50271
  get attributes() {
50267
50272
  return {
50268
- class: 'media-control-cc',
50273
+ class: 'media-control-cc media-control-dd__wrap',
50269
50274
  };
50270
50275
  }
50271
50276
  /**
@@ -50273,8 +50278,8 @@ class ClosedCaptions extends UICorePlugin {
50273
50278
  */
50274
50279
  get events() {
50275
50280
  return {
50276
- 'click #cc-select li a': 'onItemSelect',
50277
- 'click #cc-button': 'toggleMenu',
50281
+ 'click #gplayer-cc-menu [data-item]': 'onItemSelect',
50282
+ 'click #gplayer-cc-button': 'toggleMenu',
50278
50283
  };
50279
50284
  }
50280
50285
  get preselectedLanguage() {
@@ -50287,13 +50292,12 @@ class ClosedCaptions extends UICorePlugin {
50287
50292
  */
50288
50293
  bindEvents() {
50289
50294
  this.listenTo(this.core, Events$1.CORE_READY, this.onCoreReady);
50290
- this.listenTo(this.core, Events$1.CORE_RESIZE, this.playerResize);
50291
50295
  this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
50292
50296
  }
50293
50297
  onCoreReady() {
50294
50298
  const mediaControl = this.core.getPlugin('media_control');
50295
50299
  assert(mediaControl, 'media_control plugin is required');
50296
- this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render); // TODO mount to media control
50300
+ this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.mount);
50297
50301
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, () => {
50298
50302
  this.hideMenu();
50299
50303
  });
@@ -50304,10 +50308,15 @@ class ClosedCaptions extends UICorePlugin {
50304
50308
  });
50305
50309
  }
50306
50310
  onContainerChanged() {
50307
- this.listenTo(this.core.activeContainer, Events$1.CONTAINER_FULLSCREEN, this.playerResize);
50311
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_FULLSCREEN, this.onContainerResize);
50312
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_RESIZE, this.onContainerResize);
50308
50313
  this.listenTo(this.core.activeContainer, 'container:advertisement:start', this.onStartAd);
50309
50314
  this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
50310
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
+ });
50311
50320
  // fix for iOS
50312
50321
  const video = this.core.activePlayback.el;
50313
50322
  assert(video, 'video element is required');
@@ -50324,6 +50333,7 @@ class ClosedCaptions extends UICorePlugin {
50324
50333
  }
50325
50334
  onSubtitleAvailable() {
50326
50335
  this.applyTracks();
50336
+ this.mount();
50327
50337
  }
50328
50338
  onSubtitleChanged({ id }) {
50329
50339
  if (id === -1) {
@@ -50372,7 +50382,7 @@ class ClosedCaptions extends UICorePlugin {
50372
50382
  this.show();
50373
50383
  this.stopListening(this.core.activeContainer, 'container:advertisement:finish', this.onFinishAd);
50374
50384
  }
50375
- playerResize() {
50385
+ onContainerResize() {
50376
50386
  const shouldShow = this.core.activeContainer &&
50377
50387
  isFullscreen(this.core.activeContainer.el) &&
50378
50388
  this.track &&
@@ -50384,6 +50394,7 @@ class ClosedCaptions extends UICorePlugin {
50384
50394
  }
50385
50395
  try {
50386
50396
  this.resizeFont();
50397
+ this.clampPopup();
50387
50398
  }
50388
50399
  catch (error) {
50389
50400
  }
@@ -50393,7 +50404,10 @@ class ClosedCaptions extends UICorePlugin {
50393
50404
  */
50394
50405
  hide() {
50395
50406
  this.active = false;
50407
+ this.open = false;
50396
50408
  this.renderIcon();
50409
+ this.$el.find('#gplayer-cc-menu').hide();
50410
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
50397
50411
  this.$line.hide();
50398
50412
  if (this.tracks) {
50399
50413
  for (const t of this.tracks) {
@@ -50436,17 +50450,18 @@ class ClosedCaptions extends UICorePlugin {
50436
50450
  if (!this.core.activeContainer) {
50437
50451
  return this;
50438
50452
  }
50439
- if (!this.shouldRender()) {
50440
- return this;
50441
- }
50442
- const mediaControl = this.core.getPlugin('media_control');
50443
- this.$el.html(ClosedCaptions.template({ tracks: this.tracks, i18n: this.core.i18n }));
50444
- this.$el.find('#cc-select').hide();
50445
- this.core.activeContainer.$el.find('#cc-line').remove();
50446
- 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());
50447
50462
  this.resizeFont();
50463
+ this.clampPopup();
50448
50464
  this.core.activeContainer.$el.append(this.$line);
50449
- mediaControl.slot('cc', this.$el);
50450
50465
  this.updateSelection();
50451
50466
  this.renderIcon();
50452
50467
  return this;
@@ -50460,8 +50475,10 @@ class ClosedCaptions extends UICorePlugin {
50460
50475
  this.updateSelection();
50461
50476
  }
50462
50477
  onItemSelect(event) {
50463
- const id = event.target.dataset.ccSelect ?? '-1';
50464
- 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
50465
50482
  this.selectItem(this.findById(Number(id)));
50466
50483
  this.hideMenu();
50467
50484
  return false;
@@ -50478,25 +50495,33 @@ class ClosedCaptions extends UICorePlugin {
50478
50495
  }
50479
50496
  }
50480
50497
  hideMenu() {
50481
- 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');
50482
50501
  }
50483
50502
  toggleMenu() {
50484
- trace(`${T} toggleMenu`, { display: this.$el.find('#cc-select').css('display') });
50485
50503
  this.core
50486
50504
  .getPlugin('media_control')
50487
50505
  .trigger(ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, this.name);
50488
- this.$el.find('#cc-select').toggle();
50489
- // 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);
50490
50514
  }
50491
50515
  itemElement(id) {
50492
- 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();
50493
50518
  }
50494
50519
  allItemElements() {
50495
- return this.$('#cc-select li');
50520
+ return this.$el.find('#gplayer-cc-menu li'); // TODO fix semantically
50496
50521
  }
50497
50522
  selectSubtitles() {
50498
50523
  const trackId = this.track ? this.track.id : -1;
50499
- this.core.activePlayback.closedCaptionsTrackId = trackId;
50524
+ this.core.activePlayback.closedCaptionsTrackId = trackId; // TODO test
50500
50525
  }
50501
50526
  getSubtitleText(track) {
50502
50527
  const currentTime = this.core.activePlayback?.getCurrentTime() ?? 0;
@@ -50506,6 +50531,7 @@ class ClosedCaptions extends UICorePlugin {
50506
50531
  for (const cue of cues) {
50507
50532
  if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
50508
50533
  lines.push(cue.getCueAsHTML().textContent);
50534
+ // TODO break?
50509
50535
  }
50510
50536
  }
50511
50537
  }
@@ -50531,19 +50557,31 @@ class ClosedCaptions extends UICorePlugin {
50531
50557
  this.allItemElements()
50532
50558
  .removeClass('current')
50533
50559
  .find('a')
50534
- .removeClass('gcore-skin-active');
50535
- trace(`${T} highlightCurrentSubtitles`, {
50536
- track: this.track?.id,
50537
- });
50560
+ .removeClass('gcore-skin-active')
50561
+ .attr('aria-checked', 'false');
50538
50562
  const currentLevelElement = this.itemElement(this.track ? this.track.id : -1);
50539
50563
  currentLevelElement
50540
50564
  .addClass('current')
50541
50565
  .find('a')
50542
- .addClass('gcore-skin-active');
50566
+ .addClass('gcore-skin-active')
50567
+ .attr('aria-checked', 'true');
50543
50568
  }
50544
50569
  renderIcon() {
50570
+ // render both icons at once
50545
50571
  const icon = this.active ? subtitlesOnIcon : subtitlesOffIcon;
50546
- 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
+ }
50547
50585
  }
50548
50586
  }
50549
50587