@gcorevideo/player 2.25.7 → 2.25.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (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 +642 -696
  12. package/dist/index.embed.js +136 -98
  13. package/dist/index.js +77 -42
  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 +7 -4
  21. package/lib/plugins/subtitles/ClosedCaptions.d.ts.map +1 -1
  22. package/lib/plugins/subtitles/ClosedCaptions.js +64 -34
  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 +66 -35
  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
package/dist/index.js CHANGED
@@ -43314,7 +43314,7 @@ class Player {
43314
43314
  }
43315
43315
  }
43316
43316
 
43317
- var version$1 = "2.25.7";
43317
+ var version$1 = "2.25.8";
43318
43318
 
43319
43319
  var packages = {
43320
43320
  "node_modules/@clappr/core": {
@@ -43632,6 +43632,7 @@ const STANDARD_MEDIA_CONTROL_ELEMENTS = [
43632
43632
  'seekbar',
43633
43633
  'volume',
43634
43634
  ];
43635
+ const MENU_VMARGIN = 12;
43635
43636
  // TODO export
43636
43637
  const DEFAULT_SETTINGS = {
43637
43638
  default: ['seekbar'],
@@ -43958,6 +43959,12 @@ class MediaControl extends UICorePlugin {
43958
43959
  getAvailableHeight() {
43959
43960
  return (this.core.$el.height() - this.$el.find('.media-control-layer').height());
43960
43961
  }
43962
+ /**
43963
+ * @returns Vertical space available to render a popup menu
43964
+ */
43965
+ getAvailablePopupHeight() {
43966
+ return this.getAvailableHeight() - MENU_VMARGIN * 2;
43967
+ }
43961
43968
  /**
43962
43969
  * Set the initial volume, which is preserved when playback is interrupted by an advertisement
43963
43970
  */
@@ -45214,7 +45221,6 @@ const gearHdIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\" fill=\
45214
45221
 
45215
45222
  const VERSION$6 = '2.19.12';
45216
45223
  const T$i = 'plugins.bottom_gear';
45217
- const MENU_VMARGIN = 12;
45218
45224
  const MENU_BACKLINK_HEIGHT = 44;
45219
45225
  /**
45220
45226
  * Events triggered by the plugin
@@ -45379,7 +45385,7 @@ class BottomGear extends UICorePlugin {
45379
45385
  .appendTo(this.$el.find('#gear-options-wrapper'));
45380
45386
  $item.on('click', (e) => {
45381
45387
  e.stopPropagation();
45382
- this.alignSubmenu($subMenu);
45388
+ this.clampPopup($subMenu);
45383
45389
  $subMenu.show();
45384
45390
  this.$el.find('#gear-options').hide();
45385
45391
  });
@@ -45476,9 +45482,8 @@ class BottomGear extends UICorePlugin {
45476
45482
  const mediaControl = this.core.getPlugin('media_control');
45477
45483
  mediaControl.slot('gear', this.$el);
45478
45484
  }
45479
- alignSubmenu($subMenu) {
45480
- const availableHeight = this.core.getPlugin('media_control').getAvailableHeight() -
45481
- MENU_VMARGIN * 2;
45485
+ clampPopup($subMenu) {
45486
+ const availableHeight = this.core.getPlugin('media_control').getAvailablePopupHeight();
45482
45487
  $subMenu.css('max-height', `${availableHeight}px`);
45483
45488
  $subMenu
45484
45489
  .find('.gear-sub-menu')
@@ -51627,9 +51632,9 @@ const subtitlesOffIcon = "<svg width=\"24\" height=\"24\" viewBox=\"0 0 24 24\"
51627
51632
 
51628
51633
  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";
51629
51634
 
51630
- 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";
51635
+ 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>";
51631
51636
 
51632
- const stringHTML = "<div class=\"cc-line\" id=\"cc-line\">\n <p></p>\n</div>\n";
51637
+ const stringHTML = "<div class=\"gplayer-cc-line\" id=\"gplayer-cc-line\">\n <p></p>\n</div>\n";
51633
51638
 
51634
51639
  const VERSION = '2.19.14';
51635
51640
  const LOCAL_STORAGE_CC_ID = 'gplayer.plugins.cc.selected';
@@ -51664,6 +51669,7 @@ const T$3 = 'plugins.cc';
51664
51669
  class ClosedCaptions extends UICorePlugin {
51665
51670
  isPreselectedApplied = false;
51666
51671
  active = false;
51672
+ open = false;
51667
51673
  track = null;
51668
51674
  tracks = [];
51669
51675
  $line = null;
@@ -51685,14 +51691,14 @@ class ClosedCaptions extends UICorePlugin {
51685
51691
  static get version() {
51686
51692
  return VERSION;
51687
51693
  }
51688
- static template = tmpl(comboboxHTML);
51689
- static templateString = tmpl(stringHTML);
51694
+ static templateControl = tmpl(comboboxHTML);
51695
+ static templateLine = tmpl(stringHTML);
51690
51696
  /**
51691
51697
  * @internal
51692
51698
  */
51693
51699
  get attributes() {
51694
51700
  return {
51695
- class: 'media-control-cc',
51701
+ class: 'media-control-cc media-control-dd__wrap',
51696
51702
  };
51697
51703
  }
51698
51704
  /**
@@ -51700,8 +51706,8 @@ class ClosedCaptions extends UICorePlugin {
51700
51706
  */
51701
51707
  get events() {
51702
51708
  return {
51703
- 'click #cc-select li a': 'onItemSelect',
51704
- 'click #cc-button': 'toggleMenu',
51709
+ 'click #gplayer-cc-menu [data-item]': 'onItemSelect',
51710
+ 'click #gplayer-cc-button': 'toggleMenu',
51705
51711
  };
51706
51712
  }
51707
51713
  get preselectedLanguage() {
@@ -51718,10 +51724,9 @@ class ClosedCaptions extends UICorePlugin {
51718
51724
  this.listenTo(this.core, Events$1.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
51719
51725
  }
51720
51726
  onCoreReady() {
51721
- trace(`${T$3} onCoreReady`);
51722
51727
  const mediaControl = this.core.getPlugin('media_control');
51723
51728
  assert(mediaControl, 'media_control plugin is required');
51724
- this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.render); // TODO mount to media control
51729
+ this.listenTo(mediaControl, Events$1.MEDIACONTROL_RENDERED, this.mount);
51725
51730
  this.listenTo(mediaControl, Events$1.MEDIACONTROL_HIDE, () => {
51726
51731
  this.hideMenu();
51727
51732
  });
@@ -51732,11 +51737,14 @@ class ClosedCaptions extends UICorePlugin {
51732
51737
  });
51733
51738
  }
51734
51739
  onContainerChanged() {
51735
- trace(`${T$3} onContainerChanged`);
51736
51740
  this.listenTo(this.core.activeContainer, Events$1.CONTAINER_FULLSCREEN, this.playerResize);
51737
51741
  this.listenTo(this.core.activeContainer, 'container:advertisement:start', this.onStartAd);
51738
51742
  this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
51739
51743
  this.listenTo(this.core.activePlayback, Events$1.PLAYBACK_SUBTITLE_CHANGED, this.onSubtitleChanged);
51744
+ this.listenTo(this.core.activeContainer, Events$1.CONTAINER_CLICK, () => {
51745
+ // TODO test
51746
+ this.hideMenu();
51747
+ });
51740
51748
  // fix for iOS
51741
51749
  const video = this.core.activePlayback.el;
51742
51750
  assert(video, 'video element is required');
@@ -51754,6 +51762,7 @@ class ClosedCaptions extends UICorePlugin {
51754
51762
  onSubtitleAvailable() {
51755
51763
  trace(`${T$3} onSubtitleAvailable`);
51756
51764
  this.applyTracks();
51765
+ this.mount();
51757
51766
  }
51758
51767
  onSubtitleChanged({ id }) {
51759
51768
  trace(`${T$3} onSubtitleChanged`, { id });
@@ -51818,6 +51827,7 @@ class ClosedCaptions extends UICorePlugin {
51818
51827
  }
51819
51828
  try {
51820
51829
  this.resizeFont();
51830
+ this.clampPopup();
51821
51831
  }
51822
51832
  catch (error) {
51823
51833
  reportError(error);
@@ -51828,7 +51838,10 @@ class ClosedCaptions extends UICorePlugin {
51828
51838
  */
51829
51839
  hide() {
51830
51840
  this.active = false;
51841
+ this.open = false;
51831
51842
  this.renderIcon();
51843
+ this.$el.find('#gplayer-cc-menu').hide();
51844
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
51832
51845
  this.$line.hide();
51833
51846
  if (this.tracks) {
51834
51847
  for (const t of this.tracks) {
@@ -51871,17 +51884,18 @@ class ClosedCaptions extends UICorePlugin {
51871
51884
  if (!this.core.activeContainer) {
51872
51885
  return this;
51873
51886
  }
51874
- if (!this.shouldRender()) {
51875
- return this;
51876
- }
51877
- const mediaControl = this.core.getPlugin('media_control');
51878
- this.$el.html(ClosedCaptions.template({ tracks: this.tracks, i18n: this.core.i18n }));
51879
- this.$el.find('#cc-select').hide();
51880
- this.core.activeContainer.$el.find('#cc-line').remove();
51881
- this.$line = $(ClosedCaptions.templateString());
51887
+ this.$el.html(ClosedCaptions.templateControl({
51888
+ tracks: this.tracks ?? [],
51889
+ i18n: this.core.i18n,
51890
+ current: this.track?.id ?? -1,
51891
+ }));
51892
+ this.$el.find('#gplayer-cc-menu').hide();
51893
+ this.open = false;
51894
+ this.core.activeContainer.$el.find('#gplayer-cc-line').remove();
51895
+ this.$line = $(ClosedCaptions.templateLine());
51882
51896
  this.resizeFont();
51897
+ this.clampPopup();
51883
51898
  this.core.activeContainer.$el.append(this.$line);
51884
- mediaControl.slot('cc', this.$el);
51885
51899
  this.updateSelection();
51886
51900
  this.renderIcon();
51887
51901
  return this;
@@ -51895,9 +51909,10 @@ class ClosedCaptions extends UICorePlugin {
51895
51909
  this.updateSelection();
51896
51910
  }
51897
51911
  onItemSelect(event) {
51898
- const id = event.target.dataset.ccSelect ?? '-1';
51899
- trace(`${T$3} onItemSelect`, { id });
51900
- localStorage.setItem(LOCAL_STORAGE_CC_ID, id);
51912
+ // event.target does not exist for some reason in tests
51913
+ const id = (event.target ?? event.currentTarget).dataset?.item ??
51914
+ '-1';
51915
+ localStorage.setItem(LOCAL_STORAGE_CC_ID, id); // TODO store language instead
51901
51916
  this.selectItem(this.findById(Number(id)));
51902
51917
  this.hideMenu();
51903
51918
  return false;
@@ -51914,26 +51929,33 @@ class ClosedCaptions extends UICorePlugin {
51914
51929
  }
51915
51930
  }
51916
51931
  hideMenu() {
51917
- trace(`${T$3} hideMenu`);
51918
- this.$el.find('#cc-select').hide();
51932
+ this.open = false;
51933
+ this.$el.find('#gplayer-cc-menu').hide();
51934
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
51919
51935
  }
51920
51936
  toggleMenu() {
51921
- trace(`${T$3} toggleMenu`, { display: this.$el.find('#cc-select').css('display') });
51922
51937
  this.core
51923
51938
  .getPlugin('media_control')
51924
51939
  .trigger(ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, this.name);
51925
- this.$el.find('#cc-select').toggle();
51926
- // TODO hold state, add aria-expanded to the button, add active state to the button
51940
+ this.open = !this.open;
51941
+ if (this.open) {
51942
+ this.$el.find('#gplayer-cc-menu').show();
51943
+ }
51944
+ else {
51945
+ this.$el.find('#gplayer-cc-menu').hide();
51946
+ }
51947
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', this.open);
51927
51948
  }
51928
51949
  itemElement(id) {
51929
- return this.$el.find(`#cc-select li a[data-cc-select="${id}"]`).parent();
51950
+ // TODO fix semantically
51951
+ return this.$el.find(`#gplayer-cc-menu [data-item="${id}"]`).parent();
51930
51952
  }
51931
51953
  allItemElements() {
51932
- return this.$('#cc-select li');
51954
+ return this.$el.find('#gplayer-cc-menu li'); // TODO fix semantically
51933
51955
  }
51934
51956
  selectSubtitles() {
51935
51957
  const trackId = this.track ? this.track.id : -1;
51936
- this.core.activePlayback.closedCaptionsTrackId = trackId;
51958
+ this.core.activePlayback.closedCaptionsTrackId = trackId; // TODO test
51937
51959
  }
51938
51960
  getSubtitleText(track) {
51939
51961
  const currentTime = this.core.activePlayback?.getCurrentTime() ?? 0;
@@ -51943,6 +51965,7 @@ class ClosedCaptions extends UICorePlugin {
51943
51965
  for (const cue of cues) {
51944
51966
  if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
51945
51967
  lines.push(cue.getCueAsHTML().textContent);
51968
+ // TODO break?
51946
51969
  }
51947
51970
  }
51948
51971
  }
@@ -51968,19 +51991,31 @@ class ClosedCaptions extends UICorePlugin {
51968
51991
  this.allItemElements()
51969
51992
  .removeClass('current')
51970
51993
  .find('a')
51971
- .removeClass('gcore-skin-active');
51972
- trace(`${T$3} highlightCurrentSubtitles`, {
51973
- track: this.track?.id,
51974
- });
51994
+ .removeClass('gcore-skin-active')
51995
+ .attr('aria-checked', 'false');
51975
51996
  const currentLevelElement = this.itemElement(this.track ? this.track.id : -1);
51976
51997
  currentLevelElement
51977
51998
  .addClass('current')
51978
51999
  .find('a')
51979
- .addClass('gcore-skin-active');
52000
+ .addClass('gcore-skin-active')
52001
+ .attr('aria-checked', 'true');
51980
52002
  }
51981
52003
  renderIcon() {
52004
+ // render both icons at once
51982
52005
  const icon = this.active ? subtitlesOnIcon : subtitlesOffIcon;
51983
- this.$el.find('span.cc-text').html(icon);
52006
+ this.$el.find('#gplayer-cc-button').html(icon);
52007
+ }
52008
+ clampPopup() {
52009
+ const availableHeight = this.core
52010
+ .getPlugin('media_control')
52011
+ .getAvailablePopupHeight();
52012
+ this.$el.find('#gplayer-cc-menu').css('max-height', `${availableHeight}px`);
52013
+ }
52014
+ mount() {
52015
+ if (this.shouldRender()) {
52016
+ const mediaControl = this.core.getPlugin('media_control');
52017
+ mediaControl.slot('cc', this.$el);
52018
+ }
51984
52019
  }
51985
52020
  }
51986
52021
 
@@ -156,6 +156,6 @@ export declare class BottomGear extends UICorePlugin {
156
156
  private onCoreReady;
157
157
  private onMediaControlRendered;
158
158
  private mount;
159
- private alignSubmenu;
159
+ private clampPopup;
160
160
  }
161
161
  //# sourceMappingURL=BottomGear.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAKb,MAAM,cAAc,CAAA;AAOrB,OAAO,uCAAuC,CAAA;AAC9C,OAAO,gDAAgD,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAU5C;;;GAGG;AACH,oBAAY,UAAU;IACpB;;OAEG;IACH,QAAQ,aAAa;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,EAAE,CAAQ;IAElB,OAAO,CAAC,QAAQ,CAAI;IAEpB,OAAO,CAAC,SAAS,CAAO;IAExB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED;;OAEG;IACM,UAAU;IAInB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW;IA2B1D,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACM,MAAM;IAqBf;;;;OAIG;IACH,OAAO;IAIP,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,YAAY;CASrB"}
1
+ {"version":3,"file":"BottomGear.d.ts","sourceRoot":"","sources":["../../../src/plugins/bottom-gear/BottomGear.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EAKb,MAAM,cAAc,CAAA;AAOrB,OAAO,uCAAuC,CAAA;AAC9C,OAAO,gDAAgD,CAAA;AAGvD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAU5C;;;GAGG;AACH,oBAAY,UAAU;IACpB;;OAEG;IACH,QAAQ,aAAa;CACtB;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAmEG;AACH,qBAAa,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAC,EAAE,CAAQ;IAElB,OAAO,CAAC,QAAQ,CAAI;IAEpB,OAAO,CAAC,SAAS,CAAO;IAExB;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAuB;IAEvD;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;MAIlB;IAED;;OAEG;IACM,UAAU;IAInB;;;;;;;;;;;;;;;;;;;;;OAqBG;IACH,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,WAAW,GAAG,WAAW;IA2B1D,OAAO,CAAC,mBAAmB;IAW3B,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACM,MAAM;IAqBf;;;;OAIG;IACH,OAAO;IAIP,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,UAAU;IAelB,OAAO,CAAC,QAAQ;IAQhB,OAAO,CAAC,WAAW;IA4BnB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,KAAK;IAKb,OAAO,CAAC,UAAU;CAQnB"}
@@ -175,7 +175,7 @@ export class BottomGear extends UICorePlugin {
175
175
  .appendTo(this.$el.find('#gear-options-wrapper'));
176
176
  $item.on('click', (e) => {
177
177
  e.stopPropagation();
178
- this.alignSubmenu($subMenu);
178
+ this.clampPopup($subMenu);
179
179
  $subMenu.show();
180
180
  this.$el.find('#gear-options').hide();
181
181
  });
@@ -272,9 +272,8 @@ export class BottomGear extends UICorePlugin {
272
272
  const mediaControl = this.core.getPlugin('media_control');
273
273
  mediaControl.slot('gear', this.$el);
274
274
  }
275
- alignSubmenu($subMenu) {
276
- const availableHeight = this.core.getPlugin('media_control').getAvailableHeight() -
277
- MENU_VMARGIN * 2;
275
+ clampPopup($subMenu) {
276
+ const availableHeight = this.core.getPlugin('media_control').getAvailablePopupHeight();
278
277
  $subMenu.css('max-height', `${availableHeight}px`);
279
278
  $subMenu
280
279
  .find('.gear-sub-menu')
@@ -233,6 +233,10 @@ export declare class MediaControl extends UICorePlugin {
233
233
  * This takes into account the container height and excludes the height of the controls bar
234
234
  */
235
235
  getAvailableHeight(): number;
236
+ /**
237
+ * @returns Vertical space available to render a popup menu
238
+ */
239
+ getAvailablePopupHeight(): number;
236
240
  /**
237
241
  * Set the initial volume, which is preserved when playback is interrupted by an advertisement
238
242
  */
@@ -1 +1 @@
1
- {"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"MediaControl.d.ts","sourceRoot":"","sources":["../../../src/plugins/media-control/MediaControl.ts"],"names":[],"mappings":"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"}
@@ -30,6 +30,7 @@ const STANDARD_MEDIA_CONTROL_ELEMENTS = [
30
30
  'seekbar',
31
31
  'volume',
32
32
  ];
33
+ const MENU_VMARGIN = 12;
33
34
  // TODO export
34
35
  const DEFAULT_SETTINGS = {
35
36
  default: ['seekbar'],
@@ -356,6 +357,12 @@ export class MediaControl extends UICorePlugin {
356
357
  getAvailableHeight() {
357
358
  return (this.core.$el.height() - this.$el.find('.media-control-layer').height());
358
359
  }
360
+ /**
361
+ * @returns Vertical space available to render a popup menu
362
+ */
363
+ getAvailablePopupHeight() {
364
+ return this.getAvailableHeight() - MENU_VMARGIN * 2;
365
+ }
359
366
  /**
360
367
  * Set the initial volume, which is preserved when playback is interrupted by an advertisement
361
368
  */
@@ -40,6 +40,7 @@ export type ClosedCaptionsPluginSettings = {
40
40
  export declare class ClosedCaptions extends UICorePlugin {
41
41
  private isPreselectedApplied;
42
42
  private active;
43
+ private open;
43
44
  private track;
44
45
  private tracks;
45
46
  private $line;
@@ -57,8 +58,8 @@ export declare class ClosedCaptions extends UICorePlugin {
57
58
  * @internal
58
59
  */
59
60
  static get version(): string;
60
- private static readonly template;
61
- private static readonly templateString;
61
+ private static readonly templateControl;
62
+ private static readonly templateLine;
62
63
  /**
63
64
  * @internal
64
65
  */
@@ -69,8 +70,8 @@ export declare class ClosedCaptions extends UICorePlugin {
69
70
  * @internal
70
71
  */
71
72
  get events(): {
72
- 'click #cc-select li a': string;
73
- 'click #cc-button': string;
73
+ 'click #gplayer-cc-menu [data-item]': string;
74
+ 'click #gplayer-cc-button': string;
74
75
  };
75
76
  private get preselectedLanguage();
76
77
  /**
@@ -114,5 +115,7 @@ export declare class ClosedCaptions extends UICorePlugin {
114
115
  private updateSelection;
115
116
  private highlightCurrentSubtitles;
116
117
  private renderIcon;
118
+ private clampPopup;
119
+ private mount;
117
120
  }
118
121
  //# sourceMappingURL=ClosedCaptions.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ClosedCaptions.d.ts","sourceRoot":"","sources":["../../../src/plugins/subtitles/ClosedCaptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAwB,MAAM,cAAc,CAAA;AAOzE,OAAO,sCAAsC,CAAA;AAgB7C;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,oBAAoB,CAAQ;IAEpC,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,KAAK,CAA6B;IAE1C,OAAO,CAAC,MAAM,CAAsB;IAEpC,OAAO,CAAC,KAAK,CAA2B;IAExC;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAyB;IAEzD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAuB;IAE7D;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED,OAAO,KAAK,mBAAmB,GAM9B;IAED;;OAEG;IACM,UAAU;IAUnB,OAAO,CAAC,WAAW;IAmBnB,OAAO,CAAC,kBAAkB;IAwC1B,OAAO,CAAC,mBAAmB;IAK3B,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,YAAY;IAqBpB;;OAEG;IACH,IAAI;IAWJ;;OAEG;IACH,IAAI;IAiBJ,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IA2Bf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAWpB,OAAO,CAAC,yBAAyB;IAgBjC,OAAO,CAAC,QAAQ;IAKhB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAgBvB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,yBAAyB;IAkBjC,OAAO,CAAC,UAAU;CAKnB"}
1
+ {"version":3,"file":"ClosedCaptions.d.ts","sourceRoot":"","sources":["../../../src/plugins/subtitles/ClosedCaptions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,YAAY,EAAwB,MAAM,cAAc,CAAA;AAOzE,OAAO,sCAAsC,CAAA;AAgB7C;;;GAGG;AACH,MAAM,MAAM,4BAA4B,GAAG;IACzC;;OAEG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAA;CAClB,CAAA;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,qBAAa,cAAe,SAAQ,YAAY;IAC9C,OAAO,CAAC,oBAAoB,CAAQ;IAEpC,OAAO,CAAC,MAAM,CAAQ;IAEtB,OAAO,CAAC,IAAI,CAAQ;IAEpB,OAAO,CAAC,KAAK,CAA6B;IAE1C,OAAO,CAAC,MAAM,CAAsB;IAEpC,OAAO,CAAC,KAAK,CAA2B;IAExC;;OAEG;IACH,IAAI,IAAI,WAEP;IAED;;OAEG;IACH,IAAI,gBAAgB;;MAEnB;IAED;;OAEG;IACH,MAAM,KAAK,OAAO,WAEjB;IAED,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAyB;IAEhE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAuB;IAE3D;;OAEG;IACH,IAAa,UAAU;;MAItB;IAED;;OAEG;IACH,IAAa,MAAM;;;MAKlB;IAED,OAAO,KAAK,mBAAmB,GAM9B;IAED;;OAEG;IACM,UAAU;IAUnB,OAAO,CAAC,WAAW;IAkBnB,OAAO,CAAC,kBAAkB;IA2C1B,OAAO,CAAC,mBAAmB;IAM3B,OAAO,CAAC,iBAAiB;IA+BzB,OAAO,CAAC,WAAW;IAUnB,OAAO,CAAC,SAAS;IAWjB,OAAO,CAAC,UAAU;IASlB,OAAO,CAAC,YAAY;IAsBpB;;OAEG;IACH,IAAI;IAcJ;;OAEG;IACH,IAAI;IAiBJ,OAAO,CAAC,YAAY;IAIpB,OAAO,CAAC,UAAU;IAUlB;;OAEG;IACM,MAAM;IA4Bf,OAAO,CAAC,QAAQ;IAIhB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,YAAY;IAYpB,OAAO,CAAC,yBAAyB;IAgBjC,OAAO,CAAC,QAAQ;IAMhB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,WAAW;IAKnB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,eAAe;IAMvB,OAAO,CAAC,eAAe;IAiBvB,OAAO,CAAC,eAAe;IAIvB,OAAO,CAAC,iBAAiB;IAIzB,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,yBAAyB;IAiBjC,OAAO,CAAC,UAAU;IAMlB,OAAO,CAAC,UAAU;IAOlB,OAAO,CAAC,KAAK;CAMd"}
@@ -42,6 +42,7 @@ const T = 'plugins.cc';
42
42
  export class ClosedCaptions extends UICorePlugin {
43
43
  isPreselectedApplied = false;
44
44
  active = false;
45
+ open = false;
45
46
  track = null;
46
47
  tracks = [];
47
48
  $line = null;
@@ -63,14 +64,14 @@ export class ClosedCaptions extends UICorePlugin {
63
64
  static get version() {
64
65
  return VERSION;
65
66
  }
66
- static template = template(comboboxHTML);
67
- static templateString = template(stringHTML);
67
+ static templateControl = template(comboboxHTML);
68
+ static templateLine = template(stringHTML);
68
69
  /**
69
70
  * @internal
70
71
  */
71
72
  get attributes() {
72
73
  return {
73
- class: 'media-control-cc',
74
+ class: 'media-control-cc media-control-dd__wrap',
74
75
  };
75
76
  }
76
77
  /**
@@ -78,8 +79,8 @@ export class ClosedCaptions extends UICorePlugin {
78
79
  */
79
80
  get events() {
80
81
  return {
81
- 'click #cc-select li a': 'onItemSelect',
82
- 'click #cc-button': 'toggleMenu',
82
+ 'click #gplayer-cc-menu [data-item]': 'onItemSelect',
83
+ 'click #gplayer-cc-button': 'toggleMenu',
83
84
  };
84
85
  }
85
86
  get preselectedLanguage() {
@@ -96,10 +97,9 @@ export class ClosedCaptions extends UICorePlugin {
96
97
  this.listenTo(this.core, Events.CORE_ACTIVE_CONTAINER_CHANGED, this.onContainerChanged);
97
98
  }
98
99
  onCoreReady() {
99
- trace(`${T} onCoreReady`);
100
100
  const mediaControl = this.core.getPlugin('media_control');
101
101
  assert(mediaControl, 'media_control plugin is required');
102
- this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.render); // TODO mount to media control
102
+ this.listenTo(mediaControl, Events.MEDIACONTROL_RENDERED, this.mount);
103
103
  this.listenTo(mediaControl, Events.MEDIACONTROL_HIDE, () => {
104
104
  this.hideMenu();
105
105
  });
@@ -110,11 +110,14 @@ export class ClosedCaptions extends UICorePlugin {
110
110
  });
111
111
  }
112
112
  onContainerChanged() {
113
- trace(`${T} onContainerChanged`);
114
113
  this.listenTo(this.core.activeContainer, Events.CONTAINER_FULLSCREEN, this.playerResize);
115
114
  this.listenTo(this.core.activeContainer, 'container:advertisement:start', this.onStartAd);
116
115
  this.listenTo(this.core.activePlayback, Events.PLAYBACK_SUBTITLE_AVAILABLE, this.onSubtitleAvailable);
117
116
  this.listenTo(this.core.activePlayback, Events.PLAYBACK_SUBTITLE_CHANGED, this.onSubtitleChanged);
117
+ this.listenTo(this.core.activeContainer, Events.CONTAINER_CLICK, () => {
118
+ // TODO test
119
+ this.hideMenu();
120
+ });
118
121
  // fix for iOS
119
122
  const video = this.core.activePlayback.el;
120
123
  assert(video, 'video element is required');
@@ -132,6 +135,7 @@ export class ClosedCaptions extends UICorePlugin {
132
135
  onSubtitleAvailable() {
133
136
  trace(`${T} onSubtitleAvailable`);
134
137
  this.applyTracks();
138
+ this.mount();
135
139
  }
136
140
  onSubtitleChanged({ id }) {
137
141
  trace(`${T} onSubtitleChanged`, { id });
@@ -196,6 +200,7 @@ export class ClosedCaptions extends UICorePlugin {
196
200
  }
197
201
  try {
198
202
  this.resizeFont();
203
+ this.clampPopup();
199
204
  }
200
205
  catch (error) {
201
206
  reportError(error);
@@ -206,7 +211,10 @@ export class ClosedCaptions extends UICorePlugin {
206
211
  */
207
212
  hide() {
208
213
  this.active = false;
214
+ this.open = false;
209
215
  this.renderIcon();
216
+ this.$el.find('#gplayer-cc-menu').hide();
217
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
210
218
  this.$line.hide();
211
219
  if (this.tracks) {
212
220
  for (const t of this.tracks) {
@@ -249,17 +257,18 @@ export class ClosedCaptions extends UICorePlugin {
249
257
  if (!this.core.activeContainer) {
250
258
  return this;
251
259
  }
252
- if (!this.shouldRender()) {
253
- return this;
254
- }
255
- const mediaControl = this.core.getPlugin('media_control');
256
- this.$el.html(ClosedCaptions.template({ tracks: this.tracks, i18n: this.core.i18n }));
257
- this.$el.find('#cc-select').hide();
258
- this.core.activeContainer.$el.find('#cc-line').remove();
259
- this.$line = $(ClosedCaptions.templateString());
260
+ this.$el.html(ClosedCaptions.templateControl({
261
+ tracks: this.tracks ?? [],
262
+ i18n: this.core.i18n,
263
+ current: this.track?.id ?? -1,
264
+ }));
265
+ this.$el.find('#gplayer-cc-menu').hide();
266
+ this.open = false;
267
+ this.core.activeContainer.$el.find('#gplayer-cc-line').remove();
268
+ this.$line = $(ClosedCaptions.templateLine());
260
269
  this.resizeFont();
270
+ this.clampPopup();
261
271
  this.core.activeContainer.$el.append(this.$line);
262
- mediaControl.slot('cc', this.$el);
263
272
  this.updateSelection();
264
273
  this.renderIcon();
265
274
  return this;
@@ -273,9 +282,10 @@ export class ClosedCaptions extends UICorePlugin {
273
282
  this.updateSelection();
274
283
  }
275
284
  onItemSelect(event) {
276
- const id = event.target.dataset.ccSelect ?? '-1';
277
- trace(`${T} onItemSelect`, { id });
278
- localStorage.setItem(LOCAL_STORAGE_CC_ID, id);
285
+ // event.target does not exist for some reason in tests
286
+ const id = (event.target ?? event.currentTarget).dataset?.item ??
287
+ '-1';
288
+ localStorage.setItem(LOCAL_STORAGE_CC_ID, id); // TODO store language instead
279
289
  this.selectItem(this.findById(Number(id)));
280
290
  this.hideMenu();
281
291
  return false;
@@ -292,26 +302,33 @@ export class ClosedCaptions extends UICorePlugin {
292
302
  }
293
303
  }
294
304
  hideMenu() {
295
- trace(`${T} hideMenu`);
296
- this.$el.find('#cc-select').hide();
305
+ this.open = false;
306
+ this.$el.find('#gplayer-cc-menu').hide();
307
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', 'false');
297
308
  }
298
309
  toggleMenu() {
299
- trace(`${T} toggleMenu`, { display: this.$el.find('#cc-select').css('display') });
300
310
  this.core
301
311
  .getPlugin('media_control')
302
312
  .trigger(ExtendedEvents.MEDIACONTROL_MENU_COLLAPSE, this.name);
303
- this.$el.find('#cc-select').toggle();
304
- // TODO hold state, add aria-expanded to the button, add active state to the button
313
+ this.open = !this.open;
314
+ if (this.open) {
315
+ this.$el.find('#gplayer-cc-menu').show();
316
+ }
317
+ else {
318
+ this.$el.find('#gplayer-cc-menu').hide();
319
+ }
320
+ this.$el.find('#gplayer-cc-button').attr('aria-expanded', this.open);
305
321
  }
306
322
  itemElement(id) {
307
- return this.$el.find(`#cc-select li a[data-cc-select="${id}"]`).parent();
323
+ // TODO fix semantically
324
+ return this.$el.find(`#gplayer-cc-menu [data-item="${id}"]`).parent();
308
325
  }
309
326
  allItemElements() {
310
- return this.$('#cc-select li');
327
+ return this.$el.find('#gplayer-cc-menu li'); // TODO fix semantically
311
328
  }
312
329
  selectSubtitles() {
313
330
  const trackId = this.track ? this.track.id : -1;
314
- this.core.activePlayback.closedCaptionsTrackId = trackId;
331
+ this.core.activePlayback.closedCaptionsTrackId = trackId; // TODO test
315
332
  }
316
333
  getSubtitleText(track) {
317
334
  const currentTime = this.core.activePlayback?.getCurrentTime() ?? 0;
@@ -321,6 +338,7 @@ export class ClosedCaptions extends UICorePlugin {
321
338
  for (const cue of cues) {
322
339
  if (currentTime >= cue.startTime && currentTime <= cue.endTime) {
323
340
  lines.push(cue.getCueAsHTML().textContent);
341
+ // TODO break?
324
342
  }
325
343
  }
326
344
  }
@@ -346,18 +364,30 @@ export class ClosedCaptions extends UICorePlugin {
346
364
  this.allItemElements()
347
365
  .removeClass('current')
348
366
  .find('a')
349
- .removeClass('gcore-skin-active');
350
- trace(`${T} highlightCurrentSubtitles`, {
351
- track: this.track?.id,
352
- });
367
+ .removeClass('gcore-skin-active')
368
+ .attr('aria-checked', 'false');
353
369
  const currentLevelElement = this.itemElement(this.track ? this.track.id : -1);
354
370
  currentLevelElement
355
371
  .addClass('current')
356
372
  .find('a')
357
- .addClass('gcore-skin-active');
373
+ .addClass('gcore-skin-active')
374
+ .attr('aria-checked', 'true');
358
375
  }
359
376
  renderIcon() {
377
+ // render both icons at once
360
378
  const icon = this.active ? subtitlesOnIcon : subtitlesOffIcon;
361
- this.$el.find('span.cc-text').html(icon);
379
+ this.$el.find('#gplayer-cc-button').html(icon);
380
+ }
381
+ clampPopup() {
382
+ const availableHeight = this.core
383
+ .getPlugin('media_control')
384
+ .getAvailablePopupHeight();
385
+ this.$el.find('#gplayer-cc-menu').css('max-height', `${availableHeight}px`);
386
+ }
387
+ mount() {
388
+ if (this.shouldRender()) {
389
+ const mediaControl = this.core.getPlugin('media_control');
390
+ mediaControl.slot('cc', this.$el);
391
+ }
362
392
  }
363
393
  }