@gcorevideo/player 2.24.13 → 2.25.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (41) hide show
  1. package/assets/clips/clips.ejs +1 -1
  2. package/assets/clips/clips.scss +7 -5
  3. package/assets/dvr-controls/dvr_controls.scss +19 -20
  4. package/assets/media-control/width370.scss +3 -5
  5. package/dist/core.js +1 -1
  6. package/dist/index.css +689 -693
  7. package/dist/index.embed.js +172 -101
  8. package/dist/index.js +150 -78
  9. package/dist/player.d.ts +106 -42
  10. package/docs/api/player.md +18 -20
  11. package/docs/api/player.mediacontrol.defaultsettings.md +32 -0
  12. package/docs/api/player.mediacontrol.extendsettings.md +77 -0
  13. package/docs/api/player.mediacontrol.md +31 -11
  14. package/docs/api/player.mediacontrol.mount.md +8 -8
  15. package/docs/api/player.mediacontrol.slot.md +97 -0
  16. package/docs/api/player.mediacontrolelement.md +6 -3
  17. package/docs/api/player.mediacontrolpluginsettings.md +13 -0
  18. package/docs/api/player.mediacontrolsettings.md +5 -5
  19. package/docs/api/{player.mediacontrol.enablecontrolbutton.md → player.mediacontrolslotmountpoint.md} +4 -8
  20. package/docs/api/{player.mediacontrol.disabledcontrolbutton.md → player.standardmediacontrolelement.md} +4 -8
  21. package/lib/plugins/clips/Clips.d.ts +1 -0
  22. package/lib/plugins/clips/Clips.d.ts.map +1 -1
  23. package/lib/plugins/clips/Clips.js +16 -2
  24. package/lib/plugins/dvr-controls/DvrControls.js +1 -1
  25. package/lib/plugins/media-control/MediaControl.d.ts +87 -34
  26. package/lib/plugins/media-control/MediaControl.d.ts.map +1 -1
  27. package/lib/plugins/media-control/MediaControl.js +121 -76
  28. package/package.json +1 -1
  29. package/src/plugins/clips/Clips.ts +17 -2
  30. package/src/plugins/clips/__tests__/Clips.test.ts +1 -1
  31. package/src/plugins/clips/__tests__/__snapshots__/Clips.test.ts.snap +1 -1
  32. package/src/plugins/dvr-controls/DvrControls.ts +1 -1
  33. package/src/plugins/dvr-controls/__tests__/DvrControls.test.ts +1 -1
  34. package/src/plugins/media-control/MediaControl.ts +170 -141
  35. package/src/plugins/media-control/__tests__/MediaControl.test.ts +24 -17
  36. package/src/plugins/media-control/__tests__/__snapshots__/MediaControl.test.ts.snap +125 -93
  37. package/temp/player.api.json +186 -108
  38. package/tsconfig.tsbuildinfo +1 -1
  39. package/docs/api/player.mediacontrollayerelement.md +0 -16
  40. package/docs/api/player.mediacontrolleftelement.md +0 -16
  41. package/docs/api/player.mediacontrolrightelement.md +0 -16
@@ -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,
@@ -43398,7 +43398,7 @@ const FullscreenIOS = {
43398
43398
  },
43399
43399
  };
43400
43400
 
43401
- insertStyle("[data-player] {\n --bottom-panel: 40px;\n}\n\n.container .media-control-notransition {\n transition: none !important;\n}\n.container .player-poster .play-wrapper {\n opacity: 1;\n}\n.container.crop-video [data-html5-video] {\n object-fit: cover;\n}\n.container .cc-line {\n position: absolute;\n bottom: calc(var(--bottom-panel) + 5px);\n width: 100%;\n}\n.container .cc-line p {\n width: auto;\n background-color: rgba(0, 0, 0, 0.4);\n color: white;\n display: inline-block;\n}\n.container .player-poster .circle-poster {\n top: 50%;\n margin-top: -60px;\n left: 50%;\n margin-left: -60px;\n position: absolute;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n}\n.container .player-poster .circle-poster svg {\n margin-left: 5px;\n width: 80px;\n}\n.container .spinner-three-bounce[data-spinner] > div {\n background-color: #ff5700;\n}\n\n.media-control-skin-1[data-media-control-skin-1].w270 .media-control-quality,\n.media-control-skin-1[data-media-control-skin-1].w270 .media-control-audiotracks {\n display: none;\n}\n.media-control-skin-1[data-media-control-skin-1].w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n transform: rotate(270deg);\n float: none;\n display: block;\n position: absolute;\n /* bottom: 12px; */\n margin: 0;\n top: -40px;\n padding: 0;\n /* right: 20px; */\n margin-left: -32px;\n margin-top: -3px;\n width: 80px;\n /* padding-left: 12px; */\n}\n.media-control-skin-1[data-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[data-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[data-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[data-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[data-media-control-skin-1].w370 .media-control-cc {\n width: 28px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-cc svg {\n height: 17px;\n}\n.media-control-skin-1[data-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[data-media-control-skin-1].w370 .share_plugin[data-share] .share-container .share-container-header {\n border: none;\n}\n.media-control-skin-1[data-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[data-media-control-skin-1].w370 .media-control-quality,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks {\n display: block;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector],\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] {\n margin-top: 3px;\n margin-right: 10px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] ul,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] ul {\n bottom: 30px;\n width: 50px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] ul li,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] ul li {\n height: 23px;\n font-size: 14px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] ul li a,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] ul li a {\n height: 23px;\n padding: 2px 5px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-level-selector-button] .quality-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-level-selector-button] .audio-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-audiotracks-button] .quality-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-audiotracks-button] .audio-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-level-selector-button] .quality-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-level-selector-button] .audio-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] .quality-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] .audio-text {\n font-size: 13px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-level-selector-button] span.quality-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-level-selector-button] span.audio-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-audiotracks-button] span.quality-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-audiotracks-button] span.audio-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-level-selector-button] span.quality-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-level-selector-button] span.audio-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] span.quality-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] span.audio-arrow {\n width: 7px;\n height: 5px;\n margin-left: 4px;\n margin-top: 11px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-multicamera .multicamera {\n margin-top: 0;\n margin-right: 10px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-multicamera .multicamera button {\n height: 32px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-multicamera .multicamera button svg {\n height: 17px;\n margin: 0;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] {\n padding-left: 10px;\n padding-right: 12px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] .media-control-indicator {\n line-height: 32px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] .media-control-indicator[data-position], .media-control-skin-1[data-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[data-media-control-skin-1].w370 .media-control-layer[data-controls] .dvr-controls {\n height: 32px;\n}\n.media-control-skin-1[data-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[data-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[data-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[data-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[data-media-control-skin-1].w370 .media-control-layer[data-controls] button.media-control-button {\n height: 32px;\n}\n.media-control-skin-1[data-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[data-media-control-skin-1].w370 .media-control-layer[data-controls] button.media-control-button svg {\n height: 17px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] .media-clip-container .media-clip-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] .media-control-clips .media-clip-text {\n line-height: 33px;\n font-size: 11px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] .media-clip-container .media-clip-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] .media-control-clips .media-clip-text {\n max-width: 50px;\n}\n.media-control-skin-1[data-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[data-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[data-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[data-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[data-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\n:root {\n --font-size-media-controls: 14px;\n --font-size-media-controls-dropdown: 16px;\n --player-vod-color: #005aff;\n --player-dvr-color: #fff;\n --player-live-color: #ff0101;\n --player-seekbar-current-color: #ff5700;\n --player-seekbar-buffer-color: #fff;\n}\n\n.media-control-skin-1[data-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[data-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[data-media-control-skin-1].dragging * {\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-icon {\n line-height: 0;\n letter-spacing: 0;\n speak: none;\n color: #fff;\n vertical-align: middle;\n text-align: left;\n transition: all 0.1s ease;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-icon:hover {\n color: white;\n}\n.media-control-skin-1[data-media-control-skin-1].media-control-hide .media-control-background[data-background] {\n opacity: 0;\n}\n.media-control-skin-1[data-media-control-skin-1].media-control-hide .media-control-layer[data-controls] {\n bottom: -50px;\n}\n.media-control-skin-1[data-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[data-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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-center-panel {\n height: 100%;\n text-align: center;\n line-height: var(--bottom-panel);\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-right-panel {\n gap: 0.5rem;\n overflow: hidden;\n }\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] 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[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button svg {\n height: 20px;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button svg path {\n fill: white;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button:focus {\n outline: none;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button[data-play] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button[data-pause] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button[data-stop] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] 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[data-media-control-skin-1] .media-control-layer[data-controls] 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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-indicator[data-position], .media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-indicator[data-position] {\n margin: 1px 0 0 7px;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-indicator[data-duration]::before {\n content: \"|\";\n margin-right: 7px;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .bar-container[data-seekbar].seek-disabled {\n cursor: default;\n display: none;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .bar-container[data-seekbar].seek-disabled + .bar-scrubber[data-seekbar] {\n cursor: default;\n display: none;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] {\n bottom: 0;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg path {\n fill: white;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:hover {\n transform: scaleY(1.5);\n}\n\n/* TODO distribute between plugins' styles */\n.media-control-skin-1[data-media-control-skin-1] .media-control-cc button[data-cc-button] {\n display: flex;\n justify-content: center;\n padding: 0;\n align-items: center;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-cc button[data-cc-button]:hover {\n color: white;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-cc ul {\n background-color: rgba(74, 74, 74, 0.6);\n border: none;\n width: auto;\n border-radius: 4px;\n bottom: 52px;\n margin-left: -28px;\n}\n.media-control-skin-1[data-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[data-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[data-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[data-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[data-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[data-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[data-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[data-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[data-media-control-skin-1] .seek-time .seek-time__pos {\n padding-left: 8px;\n padding-right: 8px;\n}");
43401
+ insertStyle("[data-player] {\n --bottom-panel: 40px;\n}\n\n.container .media-control-notransition {\n transition: none !important;\n}\n.container .player-poster .play-wrapper {\n opacity: 1;\n}\n.container.crop-video [data-html5-video] {\n object-fit: cover;\n}\n.container .cc-line {\n position: absolute;\n bottom: calc(var(--bottom-panel) + 5px);\n width: 100%;\n}\n.container .cc-line p {\n width: auto;\n background-color: rgba(0, 0, 0, 0.4);\n color: white;\n display: inline-block;\n}\n.container .player-poster .circle-poster {\n top: 50%;\n margin-top: -60px;\n left: 50%;\n margin-left: -60px;\n position: absolute;\n width: 120px;\n height: 120px;\n border: 2px solid white;\n border-radius: 50%;\n filter: \"progid:DXImageTransform.Microsoft.Alpha(Opacity=60)\";\n filter: alpha(opacity=60);\n opacity: 1;\n box-shadow: 0 0 1px 0 white;\n}\n.container .player-poster .circle-poster svg {\n margin-left: 5px;\n width: 80px;\n}\n.container .spinner-three-bounce[data-spinner] > div {\n background-color: #ff5700;\n}\n\n.media-control-skin-1[data-media-control-skin-1].w270 .media-control-quality,\n.media-control-skin-1[data-media-control-skin-1].w270 .media-control-audiotracks {\n display: none;\n}\n.media-control-skin-1[data-media-control-skin-1].w270 .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] {\n transform: rotate(270deg);\n float: none;\n display: block;\n position: absolute;\n /* bottom: 12px; */\n margin: 0;\n top: -40px;\n padding: 0;\n /* right: 20px; */\n margin-left: -32px;\n margin-top: -3px;\n width: 80px;\n /* padding-left: 12px; */\n}\n.media-control-skin-1[data-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[data-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[data-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[data-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[data-media-control-skin-1].w370 .media-control-cc {\n width: 28px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-cc svg {\n height: 17px;\n}\n.media-control-skin-1[data-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[data-media-control-skin-1].w370 .share_plugin[data-share] .share-container .share-container-header {\n border: none;\n}\n.media-control-skin-1[data-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[data-media-control-skin-1].w370 .media-control-quality,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks {\n display: block;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector],\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] {\n margin-top: 3px;\n margin-right: 10px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] ul,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] ul {\n bottom: 30px;\n width: 50px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] ul li,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] ul li {\n height: 23px;\n font-size: 14px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] ul li a,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] ul li a {\n height: 23px;\n padding: 2px 5px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-level-selector-button] .quality-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-level-selector-button] .audio-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-audiotracks-button] .quality-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-audiotracks-button] .audio-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-level-selector-button] .quality-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-level-selector-button] .audio-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] .quality-text,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] .audio-text {\n font-size: 13px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-level-selector-button] span.quality-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-level-selector-button] span.audio-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-audiotracks-button] span.quality-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .level-selector[data-level-selector] button[data-audiotracks-button] span.audio-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-level-selector-button] span.quality-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-level-selector-button] span.audio-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] span.quality-arrow,\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-audiotracks[data-audiotracks] button[data-audiotracks-button] span.audio-arrow {\n width: 7px;\n height: 5px;\n margin-left: 4px;\n margin-top: 11px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-multicamera .multicamera {\n margin-top: 0;\n margin-right: 10px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-multicamera .multicamera button {\n height: 32px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-multicamera .multicamera button svg {\n height: 17px;\n margin: 0;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] {\n padding-left: 10px;\n padding-right: 12px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] .media-control-indicator {\n line-height: 32px;\n}\n.media-control-skin-1[data-media-control-skin-1].w370 .media-control-layer[data-controls] .media-control-indicator[data-position], .media-control-skin-1[data-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[data-media-control-skin-1].w370 .media-control-layer[data-controls] .dvr-controls {\n height: 32px;\n}\n.media-control-skin-1[data-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[data-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[data-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[data-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[data-media-control-skin-1].w370 .media-control-layer[data-controls] button.media-control-button {\n height: 32px;\n}\n.media-control-skin-1[data-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[data-media-control-skin-1].w370 .media-control-layer[data-controls] button.media-control-button svg {\n height: 17px;\n}\n.media-control-skin-1[data-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[data-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[data-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[data-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[data-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[data-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[data-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\n:root {\n --font-size-media-controls: 14px;\n --font-size-media-controls-dropdown: 16px;\n --player-vod-color: #005aff;\n --player-dvr-color: #fff;\n --player-live-color: #ff0101;\n --player-seekbar-current-color: #ff5700;\n --player-seekbar-buffer-color: #fff;\n}\n\n.media-control-skin-1[data-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[data-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[data-media-control-skin-1].dragging * {\n cursor: grabbing !important;\n cursor: url(\"closed-hand.cur\"), move;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-icon {\n line-height: 0;\n letter-spacing: 0;\n speak: none;\n color: #fff;\n vertical-align: middle;\n text-align: left;\n transition: all 0.1s ease;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-icon:hover {\n color: white;\n}\n.media-control-skin-1[data-media-control-skin-1].media-control-hide .media-control-background[data-background] {\n opacity: 0;\n}\n.media-control-skin-1[data-media-control-skin-1].media-control-hide .media-control-layer[data-controls] {\n bottom: -50px;\n}\n.media-control-skin-1[data-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[data-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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-center-panel {\n height: 100%;\n text-align: center;\n line-height: var(--bottom-panel);\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-right-panel {\n gap: 0.5rem;\n overflow: hidden;\n }\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] 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[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button svg {\n height: 20px;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button svg path {\n fill: white;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button:focus {\n outline: none;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button[data-play] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button[data-pause] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] button.media-control-button[data-stop] {\n float: left;\n height: 100%;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] 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[data-media-control-skin-1] .media-control-layer[data-controls] 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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-indicator[data-position], .media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-indicator[data-position] {\n margin: 1px 0 0 7px;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .media-control-indicator[data-duration]::before {\n content: \"|\";\n margin-right: 7px;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .bar-container[data-seekbar].seek-disabled {\n cursor: default;\n display: none;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .bar-container[data-seekbar].seek-disabled + .bar-scrubber[data-seekbar] {\n cursor: default;\n display: none;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] {\n bottom: 0;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .drawer-container[data-volume] .drawer-icon-container[data-volume] .drawer-icon[data-volume] svg path {\n fill: white;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .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[data-media-control-skin-1] .media-control-layer[data-controls] .drawer-container[data-volume] .bar-container[data-volume] .segmented-bar-element[data-volume]:hover {\n transform: scaleY(1.5);\n}\n\n/* TODO distribute between plugins' styles */\n.media-control-skin-1[data-media-control-skin-1] .media-control-cc button[data-cc-button] {\n display: flex;\n justify-content: center;\n padding: 0;\n align-items: center;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-cc button[data-cc-button]:hover {\n color: white;\n}\n.media-control-skin-1[data-media-control-skin-1] .media-control-cc ul {\n background-color: rgba(74, 74, 74, 0.6);\n border: none;\n width: auto;\n border-radius: 4px;\n bottom: 52px;\n margin-left: -28px;\n}\n.media-control-skin-1[data-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[data-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[data-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[data-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[data-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[data-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[data-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[data-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[data-media-control-skin-1] .seek-time .seek-time__pos {\n padding-left: 8px;\n padding-right: 8px;\n}");
43402
43402
 
43403
43403
  const mediaControlHTML = "<div class=\"media-control-background\" data-background></div>\n\n<div class=\"media-control-layer gcore-skin-bg-color\" data-controls>\n <% var renderBar = function(name) { %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1\" data-<%= name %>></div>\n <div class=\"bar-fill-2 gcore-skin-main-color\" data-<%= name %>></div>\n <div class=\"bar-hover\" data-<%= name %>></div>\n </div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <% }; %>\n <% var renderSegmentedBar = function(name, segments) {\n segments = segments || 10; %>\n <div class=\"bar-container\" data-<%= name %>>\n <div class=\"bar-background\" data-<%= name %>>\n <div class=\"bar-fill-1 gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n <div class=\"bar-scrubber\" data-<%= name %>>\n <div class=\"bar-scrubber-icon gcore-skin-main-color\" data-<%= name %>></div>\n </div>\n </div>\n <% }; %>\n <% var renderDrawer = function(name, renderContent) { %>\n <div class=\"drawer-container\" data-<%= name %>>\n <div class=\"drawer-icon-container\" data-<%= name %>>\n <div class=\"drawer-icon media-control-icon gcore-skin-button-color\" data-<%= name %>></div>\n <span class=\"drawer-text\" data-<%= name %>></span>\n </div>\n <% renderContent(name); %>\n </div>\n <% }; %>\n <% var renderIndicator = function(name) { %>\n <div class=\"media-control-indicator gcore-skin-text-color\" data-<%= name %>></div>\n <% }; %>\n <% var renderQuality = function(name) { %>\n <div class=\"media-control-quality\" data-<%= name %>></div>\n <% }; %>\n <% var renderNerd = function(name) { %>\n <div class=\"media-control-nerd\" data-<%= name %>></div>\n <% }; %>\n <% var renderMultiCamera = function(name) { %>\n <div class=\"media-control-multicamera\" data-<%= name %>></div>\n <% }; %>\n <% var renderVR = function(name) { %>\n <div class=\"media-control-vr\" data-<%= name %>></div>\n <% }; %>\n <% var renderButton = function(name) { %>\n <button type=\"button\" class=\"media-control-button media-control-icon gcore-skin-button-color\" data-<%= name %>\n aria-label=\"<%= name %>\"></button>\n <% }; %>\n\n <% var templates = {\n bar: renderBar,\n segmentedBar: renderSegmentedBar,\n };\n var render = function (settingsList) {\n settingsList.forEach(function (setting) {\n\n if (setting === \"seekbar\") {\n renderBar(setting);\n } else if (setting === \"volume\") {\n renderDrawer(setting, settings.volumeBarTemplate ? templates[settings.volumeBarTemplate] : function (name) {\n return renderSegmentedBar(name);\n });\n } else if (setting === \"duration\" || setting === \"position\" || setting === \"clips\") {\n renderIndicator(setting);\n } else if (setting === \"quality\") {\n renderQuality(setting)\n } else if (setting === \"nerd\") {\n renderNerd(setting)\n } else if (setting === \"multicamera\") {\n renderMultiCamera(setting)\n } else if (setting === \"vr\") {\n renderVR(setting)\n } else if ([\"playpause\", \"playstop\", \"fullscreen\"].includes(setting)) {\n renderButton(setting);\n }\n });\n }; %>\n <% if (settings.left && settings.left.length) { %>\n <div class=\"media-control-left-panel\" data-media-control>\n <% render(settings.left); %>\n </div>\n <% } %>\n <% if (settings.default && settings.default.length) { %>\n <div class=\"media-control-center-panel\" data-media-control>\n <% render(settings.default); %>\n </div>\n <% } %>\n <% if (settings.right && settings.right.length) { %>\n <div class=\"media-control-right-panel\" data-media-control>\n <% render(settings.right); %>\n </div>\n <% } %>\n</div>\n";
43404
43404
 
@@ -43421,31 +43421,33 @@ const fullscreenOnIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
43421
43421
  // Copyright 2014 Globo.com Player authors. All rights reserved.
43422
43422
  // Use of this source code is governed by a BSD-style
43423
43423
  // license that can be found in the {@link https://github.com/clappr/clappr-plugins/blob/master/LICENSE | LICENSE}.
43424
+ const STANDARD_MEDIA_CONTROL_ELEMENTS = [
43425
+ 'duration',
43426
+ 'fullscreen',
43427
+ 'hd-indicator',
43428
+ 'playpause',
43429
+ 'playstop',
43430
+ 'position',
43431
+ 'seekbar',
43432
+ 'volume',
43433
+ ];
43434
+ // TODO export
43424
43435
  const DEFAULT_SETTINGS = {
43436
+ default: ['seekbar'],
43437
+ left: ['playpause', 'playstop', 'position', 'duration', 'volume'],
43425
43438
  right: [
43426
- 'audiotracks',
43427
- 'cc',
43439
+ '*',
43440
+ // 'hd-indicator',
43428
43441
  'fullscreen',
43429
- 'gear',
43430
- 'multicamera',
43431
- 'pip',
43432
- 'vr',
43433
- ]};
43442
+ ],
43443
+ seekEnabled: true,
43444
+ };
43434
43445
  const INITIAL_SETTINGS = {
43435
43446
  left: [],
43436
43447
  right: [],
43437
43448
  default: [],
43438
43449
  seekEnabled: false,
43439
43450
  };
43440
- const T$a = 'plugins.media_control';
43441
- const LEFT_ORDER = [
43442
- 'playpause',
43443
- 'playstop',
43444
- 'volume',
43445
- 'position',
43446
- 'duration',
43447
- 'dvr',
43448
- ];
43449
43451
  /**
43450
43452
  * Extended events for the {@link MediaControl} plugin
43451
43453
  * @beta
@@ -43456,25 +43458,21 @@ var ExtendedEvents;
43456
43458
  ExtendedEvents["MEDIACONTROL_MENU_COLLAPSE"] = "mediacontrol:menu:collapse";
43457
43459
  })(ExtendedEvents || (ExtendedEvents = {}));
43458
43460
  const { Config, Fullscreen, formatTime: formatTime$1, extend, removeArrayItem } = Utils;
43459
- function orderByOrderPattern(arr, order) {
43460
- const arrWithoutDuplicates = [...new Set(arr)];
43461
- const ordered = order.filter((item) => arrWithoutDuplicates.includes(item));
43462
- const rest = arrWithoutDuplicates.filter((item) => !order.includes(item));
43463
- return [...ordered, ...rest];
43464
- }
43465
43461
  /**
43466
- * `PLUGIN` that provides basic playback controls UI and a foundation for developing custom UI.
43462
+ * `PLUGIN` that provides framework for building media control UI.
43467
43463
  * @beta
43468
43464
  * @remarks
43469
43465
  * The methods exposed are to be used by the other plugins that extend the media control UI.
43470
43466
  *
43471
- * Configuration options:
43467
+ * Configuration options (root level)
43468
+ *
43469
+ * - `hideMediaControlDelay`: number - specifies the delay in milliseconds before the media control UI is hidden after the last user interaction
43472
43470
  *
43473
- * - `mediaControl`: {@link MediaControlSettings} - specifies the allowed media control elements in each area
43471
+ * - `mediaControl`: {@link MediaControlSettings} - specifies the media control dashboard layout
43474
43472
  *
43475
43473
  * - `persistConfig`: boolean - `common` option, makes the plugin persist the media control settings
43476
43474
  *
43477
- * - `chromeless`: boolean
43475
+ * - `chromeless`: boolean - `common` option, hides the media control UI
43478
43476
  */
43479
43477
  class MediaControl extends UICorePlugin {
43480
43478
  // private advertisementPlaying = false
@@ -43482,7 +43480,7 @@ class MediaControl extends UICorePlugin {
43482
43480
  currentDurationValue = 0;
43483
43481
  currentPositionValue = 0;
43484
43482
  currentSeekBarPercentage = 0;
43485
- disabledClickableList = [];
43483
+ // private disabledClickableList: DisabledClickable[] = []
43486
43484
  displayedDuration = null;
43487
43485
  displayedPosition = null;
43488
43486
  displayedSeekBarPercentage = null;
@@ -43507,7 +43505,6 @@ class MediaControl extends UICorePlugin {
43507
43505
  verticalVolume = false;
43508
43506
  $duration = null;
43509
43507
  $fullscreenToggle = null;
43510
- $multiCameraSelector = null;
43511
43508
  $playPauseToggle = null;
43512
43509
  $playStopToggle = null;
43513
43510
  $position = null;
@@ -43535,6 +43532,46 @@ class MediaControl extends UICorePlugin {
43535
43532
  get supportedVersion() {
43536
43533
  return { min: CLAPPR_VERSION$1 };
43537
43534
  }
43535
+ /**
43536
+ * @returns Default media control layout settings
43537
+ * @remark
43538
+ * The method can be used to change the default dashboard layout, for example, removing the standard UI elements
43539
+ * @example
43540
+ * ```ts
43541
+ * const settings = MediaControl.defaultSettings()
43542
+ * settings.left = settings.filter(item => item !== 'playpause' && item !== 'playstop')
43543
+ * ...
43544
+ * new Player({
43545
+ * mediaControl: settings,
43546
+ * })
43547
+ * ```
43548
+ */
43549
+ static defaultSettings() {
43550
+ return $.extend(true, {}, DEFAULT_SETTINGS);
43551
+ }
43552
+ /**
43553
+ * Extend the default media control layout settings
43554
+ * @param settings - Additional settings
43555
+ * @returns The extended settings
43556
+ * @remarks
43557
+ * This method allows adding custom elements to the media control dashboard.
43558
+ * The default settings are not modified.
43559
+ * @example
43560
+ * ```ts
43561
+ * new Player({
43562
+ * mediaControl: MediaControl.extendSettings({
43563
+ * left: ['*'], // add all custom elements to the left panel
43564
+ * }),
43565
+ * })
43566
+ * ```
43567
+ */
43568
+ static extendSettings(settings) {
43569
+ return {
43570
+ left: mergeElements(DEFAULT_SETTINGS.left, settings.left ?? []),
43571
+ right: mergeElements(DEFAULT_SETTINGS.right, settings.right ?? []),
43572
+ default: mergeElements(DEFAULT_SETTINGS.default, settings.default ?? []),
43573
+ };
43574
+ }
43538
43575
  get disabled() {
43539
43576
  const playbackIsNOOP = this.core.activeContainer &&
43540
43577
  this.core.activeContainer.getPlaybackType() === Playback.NO_OP;
@@ -43796,9 +43833,7 @@ class MediaControl extends UICorePlugin {
43796
43833
  this.applyButtonStyle(this.$volumeIcon);
43797
43834
  }
43798
43835
  changeTogglePlay() {
43799
- // assert.ok(this.$playPauseToggle, 'play/pause toggle must be present');
43800
43836
  this.$playPauseToggle?.html('');
43801
- // assert.ok(this.$playStopToggle, 'play/stop toggle must be present');
43802
43837
  this.$playStopToggle?.html('');
43803
43838
  if (this.container && this.container.isPlaying()) {
43804
43839
  this.$playPauseToggle?.append(pauseIcon);
@@ -44163,36 +44198,32 @@ class MediaControl extends UICorePlugin {
44163
44198
  }
44164
44199
  }
44165
44200
  updateSettings() {
44166
- const newSettings = $.extend(true, {
44201
+ // TODO use this.options.mediaControl to additionally filter the settings
44202
+ const container = $.extend(true, {
44167
44203
  left: [],
44168
44204
  default: [],
44169
44205
  right: [],
44170
44206
  }, this.core.activeContainer.settings);
44171
- newSettings.left.push('clips'); // TODO settings
44172
- // TODO make order controlled via CSS
44173
- newSettings.left = orderByOrderPattern([...newSettings.left, 'volume', 'clips'], LEFT_ORDER);
44174
- if (this.core.activePlayback.getPlaybackType() === Playback.LIVE &&
44175
- this.core.activePlayback.dvrEnabled) {
44176
- newSettings.left.push('dvr');
44177
- }
44178
- // actual order of the items appear rendered is controlled by CSS
44179
- newSettings.right = DEFAULT_SETTINGS.right; // TODO get from the options
44207
+ container.left.push('volume');
44208
+ const setup = this.options.mediaControl ?? DEFAULT_SETTINGS;
44180
44209
  if ((!this.fullScreenOnVideoTagSupported && !fullscreenEnabled()) ||
44181
44210
  this.options.fullscreenDisable) {
44182
44211
  // remove fullscreen from settings if it is not available
44183
- removeArrayItem(newSettings.default, 'fullscreen');
44184
- removeArrayItem(newSettings.left, 'fullscreen');
44185
- removeArrayItem(newSettings.right, 'fullscreen');
44212
+ removeArrayItem(container.default, 'fullscreen');
44213
+ removeArrayItem(container.left, 'fullscreen');
44214
+ removeArrayItem(container.right, 'fullscreen');
44186
44215
  }
44187
- removeArrayItem(newSettings.default, 'hd-indicator');
44188
- removeArrayItem(newSettings.left, 'hd-indicator');
44189
44216
  // TODO get from container's settings
44190
44217
  if (this.core.activePlayback.name === 'html5_video') {
44191
- newSettings.seekEnabled = this.isSeekEnabledForHtml5Playback();
44218
+ container.seekEnabled = this.isSeekEnabledForHtml5Playback();
44219
+ // TODO remove seekbar if seek is disabled?
44192
44220
  }
44193
- const settingsChanged = !isEqualSettings(this.settings, newSettings);
44221
+ container.left = evalSettings(container.left, setup.left);
44222
+ container.right = evalSettings(container.right, setup.right);
44223
+ container.default = evalSettings(container.default, setup.default);
44224
+ const settingsChanged = !isEqualSettings(this.settings, container);
44194
44225
  if (settingsChanged) {
44195
- this.settings = newSettings;
44226
+ this.settings = container;
44196
44227
  this.hasUpdate = true;
44197
44228
  this.render();
44198
44229
  }
@@ -44218,15 +44249,37 @@ class MediaControl extends UICorePlugin {
44218
44249
  this.$volumeBarBackground = this.$el.find('.bar-background[data-volume]');
44219
44250
  this.$volumeBarFill = this.$el.find('.bar-fill-1[data-volume]');
44220
44251
  this.$volumeBarScrubber = this.$el.find('.bar-scrubber[data-volume]');
44221
- this.$multiCameraSelector = this.$el.find('.media-control-multicamera[data-multicamera]');
44222
44252
  this.resetIndicators();
44223
44253
  this.initializeIcons();
44224
44254
  }
44225
44255
  /**
44226
- * Get a media control element DOM node
44256
+ * Mount a media control to its configured location
44227
44257
  * @param name - The name of the media control element
44228
44258
  * @param element - The DOM node/fragment to mount
44229
- * @deprecated Use {@link MediaControl.mount} instead
44259
+ * @remarks
44260
+ * Media controls layout is configured via {@link MediaControlSettings}.
44261
+ * A plugin implementing custom elements on the media control dashboard,
44262
+ * should use this method to mount the element to the correct location.
44263
+ * The actual location is defined by the occurence of the element token in the `left`, `right` or `default` section
44264
+ * of the {@link MediaControlSettings}.
44265
+ * @example
44266
+ * ```ts
44267
+ * class MyPlugin extends UICorePlugin {
44268
+ * override render() {
44269
+ * // mount the element where it is configured in the layout
44270
+ * this.core.getPlugin('media_control').slot('my-element', this.$el)
44271
+ * }
44272
+ * }
44273
+ * ...
44274
+ * Player.registerPlugin(MyPlugin)
44275
+ * ...
44276
+ * // Configuration of the media control layout
44277
+ * new Player({
44278
+ * mediaControl: {
44279
+ * left: ['my-element'], // the element will be mounted to the left panel
44280
+ * },
44281
+ * })
44282
+ * ```
44230
44283
  */
44231
44284
  slot(name, element) {
44232
44285
  const panel = this.getElementLocation(name);
@@ -44446,7 +44499,6 @@ class MediaControl extends UICorePlugin {
44446
44499
  return this;
44447
44500
  }
44448
44501
  const timeout = this.options.hideMediaControlDelay || 2000;
44449
- trace(`${T$a} render`, { settings: this.settings });
44450
44502
  this.$el.html(MediaControl.template({ settings: this.settings }));
44451
44503
  // const style = Styler.getStyleFor(mediaControlStyle, { baseUrl: this.options.baseUrl });
44452
44504
  // this.$el.append(style[0]);
@@ -44543,22 +44595,6 @@ class MediaControl extends UICorePlugin {
44543
44595
  }
44544
44596
  return 0;
44545
44597
  }
44546
- /**
44547
- * Enable the user interaction disabled earlier
44548
- */
44549
- enableControlButton() {
44550
- this.disabledClickableList.forEach((element) => {
44551
- element.el.css({ 'pointer-events': element.pointerEventValue });
44552
- });
44553
- }
44554
- /**
44555
- * Disable the user interaction for the control buttons
44556
- */
44557
- disabledControlButton() {
44558
- this.disabledClickableList.forEach((element) => {
44559
- element.el.css({ 'pointer-events': 'none' });
44560
- });
44561
- }
44562
44598
  // TODO drop
44563
44599
  isSeekEnabledForHtml5Playback() {
44564
44600
  if (this.core.getPlaybackType() === Playback.LIVE) {
@@ -44567,13 +44603,14 @@ class MediaControl extends UICorePlugin {
44567
44603
  return isFinite(this.core.activePlayback.getDuration());
44568
44604
  }
44569
44605
  getElementLocation(name) {
44570
- if (this.settings.right?.includes(name)) {
44571
- return this.getRightPanel();
44572
- }
44573
- if (this.settings.left?.includes(name)) {
44606
+ if (this.settings.left.includes(name) || this.settings.left.includes('*')) {
44574
44607
  return this.getLeftPanel();
44575
44608
  }
44576
- if (this.settings.default?.includes(name)) {
44609
+ if (this.settings.right.includes(name) ||
44610
+ this.settings.right.includes('*')) {
44611
+ return this.getRightPanel();
44612
+ }
44613
+ if (this.settings.default.includes(name)) {
44577
44614
  return this.getCenterPanel();
44578
44615
  }
44579
44616
  return null;
@@ -44591,7 +44628,8 @@ MediaControl.extend = function (properties) {
44591
44628
  return extend(MediaControl, properties);
44592
44629
  };
44593
44630
  function serializeSettings(s) {
44594
- return s.left.slice()
44631
+ return s.left
44632
+ .slice()
44595
44633
  .sort()
44596
44634
  .concat(s.right.slice().sort())
44597
44635
  .concat(s.default.slice().sort())
@@ -44606,6 +44644,25 @@ function mountTo(parent, element) {
44606
44644
  parent.append(element);
44607
44645
  }
44608
44646
  }
44647
+ function isStandardMediaControl(name) {
44648
+ return STANDARD_MEDIA_CONTROL_ELEMENTS.includes(name);
44649
+ }
44650
+ function evalSettings(container, setup) {
44651
+ return setup.filter((item) => {
44652
+ if (isStandardMediaControl(item)) {
44653
+ return container.includes(item);
44654
+ }
44655
+ return true;
44656
+ });
44657
+ }
44658
+ function mergeElements(a, b) {
44659
+ return b.reduce((acc, item) => {
44660
+ if (!acc.includes(item)) {
44661
+ acc.push(item);
44662
+ }
44663
+ return acc;
44664
+ }, a);
44665
+ }
44609
44666
 
44610
44667
  const VERSION$6 = '2.22.4';
44611
44668
  /**
@@ -47973,7 +48030,7 @@ class ClickToPause extends ContainerPlugin {
47973
48030
  }
47974
48031
  }
47975
48032
 
47976
- insertStyle("@charset \"UTF-8\";\n.media-control-clips {\n display: flex;\n gap: 6px;\n}\n.media-control-clips .media-clip-text {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n text-overflow: ellipsis;\n color: white;\n cursor: default;\n line-height: var(--bottom-panel);\n position: relative;\n}\n.media-control-clips .media-clip-text::before {\n content: \"•\";\n padding-right: 6px;\n}\n.media-control-clips .media-clip-text {\n max-width: 100px;\n}");
48033
+ insertStyle("@charset \"UTF-8\";\n.gplayer-mc-clips {\n display: flex;\n gap: 6px;\n}\n.gplayer-mc-clips .gplayer-mc-clips-text {\n text-overflow: ellipsis;\n white-space: nowrap;\n overflow: hidden;\n display: inline-block;\n text-overflow: ellipsis;\n color: white;\n cursor: default;\n line-height: var(--bottom-panel);\n position: relative;\n max-width: 150px;\n}\n.gplayer-mc-clips .gplayer-mc-clips-text::before {\n content: \"•\";\n padding-right: 6px;\n}\n.gplayer-mc-clips .gplayer-mc-clips-text.compact {\n max-width: 100px;\n}");
47977
48034
 
47978
48035
  function parseClips(text) {
47979
48036
  const clipsArr = text
@@ -48011,10 +48068,11 @@ function buildSvg(clips, duration, barWidth) {
48011
48068
  return svg;
48012
48069
  }
48013
48070
 
48014
- const clipsHTML = "<div class=\"media-clip-text\" id=\"clips-text\"></div>";
48071
+ const clipsHTML = "<div class=\"gplayer-mc-clips-text\" id=\"gplayer-mc-clips-text\"></div>";
48015
48072
 
48016
48073
  const VERSION$4 = '2.22.16';
48017
48074
  const CLAPPR_VERSION = '0.11.4';
48075
+ const COMPACT_WIDTH = 495;
48018
48076
  /**
48019
48077
  * `PLUGIN` that allows marking up the timeline of the video
48020
48078
  * @beta
@@ -48044,7 +48102,7 @@ class Clips extends UICorePlugin {
48044
48102
  */
48045
48103
  get attributes() {
48046
48104
  return {
48047
- class: 'media-control-clips',
48105
+ class: 'media-control-clips gplayer-mc-clips',
48048
48106
  };
48049
48107
  }
48050
48108
  get version() {
@@ -48108,6 +48166,7 @@ class Clips extends UICorePlugin {
48108
48166
  }
48109
48167
  onContainerChanged() {
48110
48168
  // TODO figure out the conditions of changing the container (without destroying the previous one)
48169
+ // probably it is the case with the MultiCamera plugin
48111
48170
  if (this.oldContainer) {
48112
48171
  this.stopListening(this.oldContainer, Events$1.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
48113
48172
  }
@@ -48117,12 +48176,24 @@ class Clips extends UICorePlugin {
48117
48176
  this.svgMask = null;
48118
48177
  }
48119
48178
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_TIMEUPDATE, this.onTimeUpdate);
48179
+ this.toggleCompact();
48120
48180
  }
48121
48181
  playerResize() {
48122
48182
  const duration = this.core.activeContainer.getDuration();
48183
+ // TODO check
48123
48184
  if (duration) {
48124
48185
  this.makeSvg(duration);
48125
48186
  }
48187
+ this.toggleCompact();
48188
+ }
48189
+ toggleCompact() {
48190
+ const elText = this.$el.find('#gplayer-mc-clips-text');
48191
+ if (this.core.activeContainer.el.clientWidth <= COMPACT_WIDTH) {
48192
+ elText.addClass('compact');
48193
+ }
48194
+ else {
48195
+ elText.removeClass('compact');
48196
+ }
48126
48197
  }
48127
48198
  onTimeUpdate(event) {
48128
48199
  if (!this.svgMask) {
@@ -48160,7 +48231,7 @@ class Clips extends UICorePlugin {
48160
48231
  }
48161
48232
  setClipText(text) {
48162
48233
  if (text) {
48163
- this.$el.show().find('#clips-text').text(text);
48234
+ this.$el.show().find('#gplayer-mc-clips-text').text(text);
48164
48235
  }
48165
48236
  else {
48166
48237
  this.$el.hide();
@@ -48286,7 +48357,7 @@ class ContextMenu extends UIContainerPlugin {
48286
48357
 
48287
48358
  const dvrHTML = "<div class=\"live-info\" id=\"gplayer-mc-live\"><%= i18n.t('live') %></div>\n<button type=\"button\"\n class=\"live-button\"\n aria-label=\"<%= i18n.t('back_to_live') %>\"\n id=\"gplayer-mc-back-to-live\"\n>\n <%= i18n.t('back_to_live') %>\n</button>\n";
48288
48359
 
48289
- insertStyle(".dvr-controls {\n --disabled-opacity: 0.3;\n --circle-radius: 5px;\n display: flex;\n align-items: center;\n color: var(--player-dvr-color);\n font-size: 10px;\n font-weight: 500;\n height: var(--bottom-panel);\n line-height: var(--bottom-panel);\n margin-left: 0;\n}\n.dvr-controls .live-info,\n.dvr-controls .live-button {\n font-size: 14px;\n font-weight: 500;\n margin-left: 20px;\n letter-spacing: 0.8px;\n text-transform: uppercase;\n}\n.dvr-controls .live-info::before,\n.dvr-controls .live-button::before {\n margin-right: 8px;\n content: \"\";\n display: inline-block;\n position: relative;\n width: calc(var(--circle-radius) * 2);\n height: calc(var(--circle-radius) * 2);\n border-radius: var(--circle-radius);\n background-color: var(--player-dvr-color);\n}\n.dvr-controls.disabled {\n opacity: var(--disabled-opacity);\n}\n.dvr-controls.disabled:before {\n background-color: var(--player-dvr-color);\n}\n\n.live-info {\n text-transform: uppercase;\n color: #fffffe;\n}\n.live-info::before {\n background-color: var(--player-live-color);\n background-color: #ed4f4a;\n}\n\n.live-button {\n cursor: pointer;\n outline: none;\n border: 0;\n color: var(--player-dvr-color);\n background-color: transparent;\n padding: 0;\n opacity: 0.7;\n transition: all 0.1s ease;\n}\n.live-button:hover {\n opacity: 1;\n text-shadow: rgba(255, 255, 255, 0.75) 0 0 5px;\n}");
48360
+ insertStyle(".dvr-controls {\n --disabled-opacity: 0.3;\n --circle-radius: 5px;\n display: flex;\n align-items: center;\n color: var(--player-dvr-color);\n font-size: 10px;\n font-weight: 500;\n height: var(--bottom-panel);\n line-height: var(--bottom-panel);\n margin-left: 0;\n}\n.dvr-controls .live-info,\n.dvr-controls .live-button {\n font-size: 14px;\n font-weight: 500;\n margin-left: 20px;\n letter-spacing: 0.8px;\n text-transform: uppercase;\n}\n.dvr-controls .live-info::before,\n.dvr-controls .live-button::before {\n margin-right: 8px;\n content: \"\";\n display: inline-block;\n position: relative;\n width: calc(var(--circle-radius) * 2);\n height: calc(var(--circle-radius) * 2);\n border-radius: var(--circle-radius);\n background-color: var(--player-dvr-color);\n}\n.dvr-controls.disabled {\n opacity: var(--disabled-opacity);\n}\n.dvr-controls.disabled:before {\n background-color: var(--player-dvr-color);\n}\n.dvr-controls .live-info {\n text-transform: uppercase;\n color: #fffffe;\n}\n.dvr-controls .live-info::before {\n background-color: #ed4f4a;\n}\n.dvr-controls .live-button {\n cursor: pointer;\n outline: none;\n border: 0;\n color: var(--player-dvr-color);\n background-color: transparent;\n padding: 0;\n opacity: 0.7;\n transition: all 0.1s ease;\n}\n.dvr-controls .live-button:hover {\n opacity: 1;\n text-shadow: rgba(255, 255, 255, 0.75) 0 0 5px;\n}");
48290
48361
 
48291
48362
  /**
48292
48363
  * `PLUGIN` that adds the DVR controls to the media control UI
@@ -48381,7 +48452,7 @@ class DvrControls extends UICorePlugin {
48381
48452
  // TODO -> to MediaControl (auto hide)
48382
48453
  mediaControl.toggleElement('duration', false);
48383
48454
  mediaControl.toggleElement('position', false);
48384
- mediaControl.mount('left', this.$el); // TODO use independent mount point
48455
+ mediaControl.slot('dvr', this.$el); // TODO use independent mount point
48385
48456
  }
48386
48457
  onDvrStateChanged(dvrInUse) {
48387
48458
  this.toggleState(dvrInUse);