@npo/player 1.26.0 → 1.27.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 (175) hide show
  1. package/README.md +1 -1
  2. package/lib/js/playeractions/handlers/mediasessionactions.js +2 -2
  3. package/lib/js/playeractions/playeractions.d.ts +0 -1
  4. package/lib/js/playeractions/playeractions.js +0 -1
  5. package/lib/js/utilities/utilities.prid.d.ts +6 -0
  6. package/lib/js/utilities/utilities.prid.js +8 -0
  7. package/lib/js/utilities/utilities.prid.test.js +46 -0
  8. package/lib/npoplayer.d.ts +1 -1
  9. package/lib/npoplayer.js +50 -59
  10. package/lib/npoplayer.test.js +2 -2
  11. package/lib/package.json +1 -1
  12. package/lib/services/a11y/setup.test.js +0 -1
  13. package/lib/services/advertHandlers/discardAdBreak.js +2 -0
  14. package/lib/services/advertHandlers/discardAdBreak.test.js +6 -1
  15. package/lib/services/advertHandlers/handlePreRolls.js +2 -4
  16. package/lib/services/advertHandlers/handlePrerolls.test.js +62 -1
  17. package/lib/services/drmHandlers/decideprofile.js +7 -1
  18. package/lib/services/drmHandlers/decideprofile.test.js +4 -0
  19. package/lib/services/drmHandlers/verifydrm.js +5 -6
  20. package/lib/services/drmHandlers/verifydrm.test.js +28 -5
  21. package/lib/services/errors/errorBackground.test.js +48 -0
  22. package/lib/services/errors/errorHandler.d.ts +3 -0
  23. package/lib/services/errors/errorHandler.js +45 -0
  24. package/lib/services/errors/errorText.d.ts +2 -0
  25. package/lib/services/errors/errorText.js +59 -0
  26. package/lib/services/errors/errorText.test.js +66 -0
  27. package/lib/services/keyboardHandlers/resolvekeypress.js +21 -17
  28. package/lib/services/localStorageHandlers/localStorageHandlers.js +5 -2
  29. package/lib/services/localStorageHandlers/localStorageHandlers.test.js +0 -1
  30. package/lib/services/nicamHandlers/nicamhandler.js +0 -4
  31. package/lib/services/nicamHandlers/nicamhandler.test.js +0 -5
  32. package/lib/services/npoPlayerAPI/contants.d.ts +20 -0
  33. package/lib/services/npoPlayerAPI/contants.js +6 -0
  34. package/lib/services/npoPlayerAPI/npoPlayerAPI.d.ts +4 -1
  35. package/lib/services/npoPlayerAPI/npoPlayerAPI.js +29 -5
  36. package/lib/services/npoPlayerAPI/npoPlayerAPI.test.js +11 -0
  37. package/lib/services/services.d.ts +8 -2
  38. package/lib/services/services.js +28 -2
  39. package/lib/services/streamFetchHandler/fetchStream.d.ts +2 -0
  40. package/lib/services/streamFetchHandler/fetchStream.js +48 -0
  41. package/lib/services/streamFetchHandler/fetchstream.test.js +70 -0
  42. package/lib/services/trackingHandlers/eventBinding.d.ts +2 -0
  43. package/lib/{js/tracking/handlers/eventbinding.js → services/trackingHandlers/eventBinding.js} +16 -14
  44. package/lib/services/trackingHandlers/eventBinding.test.js +89 -0
  45. package/lib/services/trackingHandlers/eventLogging.d.ts +2 -0
  46. package/lib/{js/tracking/handlers/eventlogging.js → services/trackingHandlers/eventLogging.js} +18 -7
  47. package/lib/services/trackingHandlers/eventLogging.test.js +63 -0
  48. package/lib/services/trackingHandlers/index.d.ts +3 -0
  49. package/lib/services/trackingHandlers/index.js +3 -0
  50. package/lib/services/trackingHandlers/playerTrackerInit.d.ts +2 -0
  51. package/lib/{js/tracking/handlers/playertrackerinit.js → services/trackingHandlers/playerTrackerInit.js} +6 -3
  52. package/lib/services/trackingHandlers/playerTrackerInit.test.js +75 -0
  53. package/lib/services/trackingHandlers/playerTrackerStart.d.ts +2 -0
  54. package/lib/services/trackingHandlers/playerTrackerStart.js +25 -0
  55. package/lib/services/trackingHandlers/playerTrackerStart.test.js +59 -0
  56. package/lib/services/trackingHandlers/streamTrackerInit.d.ts +3 -0
  57. package/lib/services/trackingHandlers/streamTrackerInit.js +27 -0
  58. package/lib/services/trackingHandlers/streamTrackerInit.test.js +84 -0
  59. package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.d.ts +2 -2
  60. package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.js +4 -6
  61. package/lib/services/verticalVideoHandlers/handleVerticalVideoControls.test.js +4 -17
  62. package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.d.ts +2 -0
  63. package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.js +26 -0
  64. package/lib/services/verticalVideoHandlers/handleVerticalVideoSettings.test.js +82 -0
  65. package/lib/src/js/playeractions/playeractions.d.ts +0 -1
  66. package/lib/src/js/utilities/utilities.prid.d.ts +6 -0
  67. package/lib/src/js/utilities/utilities.prid.test.d.ts +1 -0
  68. package/lib/src/npoplayer.d.ts +1 -1
  69. package/lib/src/services/errors/errorBackground.test.d.ts +1 -0
  70. package/lib/src/services/errors/errorHandler.d.ts +3 -0
  71. package/lib/src/services/errors/errorText.d.ts +2 -0
  72. package/lib/src/services/errors/errorText.test.d.ts +1 -0
  73. package/lib/src/services/npoPlayerAPI/contants.d.ts +20 -0
  74. package/lib/src/services/npoPlayerAPI/npoPlayerAPI.d.ts +4 -1
  75. package/lib/src/services/services.d.ts +8 -2
  76. package/lib/src/services/streamFetchHandler/fetchStream.d.ts +2 -0
  77. package/lib/src/services/streamFetchHandler/fetchstream.test.d.ts +1 -0
  78. package/lib/src/services/trackingHandlers/eventBinding.d.ts +2 -0
  79. package/lib/src/services/trackingHandlers/eventBinding.test.d.ts +1 -0
  80. package/lib/src/services/trackingHandlers/eventLogging.d.ts +2 -0
  81. package/lib/src/services/trackingHandlers/eventLogging.test.d.ts +1 -0
  82. package/lib/src/services/trackingHandlers/index.d.ts +3 -0
  83. package/lib/src/services/trackingHandlers/playerTrackerInit.d.ts +2 -0
  84. package/lib/src/services/trackingHandlers/playerTrackerInit.test.d.ts +1 -0
  85. package/lib/src/services/trackingHandlers/playerTrackerStart.d.ts +2 -0
  86. package/lib/src/services/trackingHandlers/playerTrackerStart.test.d.ts +1 -0
  87. package/lib/src/services/trackingHandlers/streamTrackerInit.d.ts +3 -0
  88. package/lib/src/services/trackingHandlers/streamTrackerInit.test.d.ts +1 -0
  89. package/lib/src/services/verticalVideoHandlers/handleVerticalVideoControls.d.ts +2 -2
  90. package/lib/src/services/verticalVideoHandlers/handleVerticalVideoSettings.d.ts +2 -0
  91. package/lib/src/services/verticalVideoHandlers/handleVerticalVideoSettings.test.d.ts +1 -0
  92. package/lib/src/types/interfaces.d.ts +15 -1
  93. package/lib/src/ui/components/seekbar.d.ts +2 -1
  94. package/lib/src/ui/components/verticalvideo/controlbar.d.ts +3 -3
  95. package/lib/src/ui/components/verticalvideo/settingspanel.d.ts +2 -0
  96. package/lib/tests/mocks/mockNpoplayer.js +1 -1
  97. package/lib/tests/mocks/mockStreamObject.d.ts +2 -0
  98. package/lib/tests/mocks/mockStreamObject.js +21 -0
  99. package/lib/tests/mocks/playerContextMock.d.ts +1 -0
  100. package/lib/tests/mocks/playerContextMock.js +5 -1
  101. package/lib/types/interfaces.d.ts +15 -1
  102. package/lib/ui/components/audio/controlbar.js +2 -1
  103. package/lib/ui/components/controlbar.js +1 -1
  104. package/lib/ui/components/seekbar.d.ts +2 -1
  105. package/lib/ui/components/seekbar.js +2 -2
  106. package/lib/ui/components/settingspanel.js +1 -3
  107. package/lib/ui/components/verticalvideo/controlbar.d.ts +3 -3
  108. package/lib/ui/components/verticalvideo/controlbar.js +14 -11
  109. package/lib/ui/components/verticalvideo/settingspanel.d.ts +2 -0
  110. package/lib/ui/components/verticalvideo/settingspanel.js +21 -0
  111. package/lib/ui/handlers/domhandlers.test.js +6 -26
  112. package/lib/ui/nativemobileuifactory.js +1 -1
  113. package/lib/ui/uicontainer.js +4 -1
  114. package/lib/ui/uicontainer.test.js +4 -1
  115. package/package.json +1 -1
  116. package/src/style/components/_advert.scss +3 -3
  117. package/src/style/components/_buffering.scss +14 -8
  118. package/src/style/components/_error.scss +44 -1
  119. package/src/style/components/_hugeplaybacktogglebutton.scss +1 -0
  120. package/src/style/components/_metadata.scss +13 -12
  121. package/src/style/components/_nicam.scss +11 -6
  122. package/src/style/components/_playnext.scss +1 -1
  123. package/src/style/components/_replay.scss +1 -6
  124. package/src/style/components/_settingspanel.scss +74 -79
  125. package/src/style/components/audio/_errors.scss +1 -1
  126. package/src/style/components/audio/_metadata.scss +14 -8
  127. package/src/style/components/audio/_playbutton.scss +1 -0
  128. package/src/style/components/audio/_topbar.scss +10 -2
  129. package/src/style/components/audio/_volumeslider.scss +3 -3
  130. package/src/style/components/vertical-video/_bottombar.scss +42 -1
  131. package/src/style/components/vertical-video/_hugeplaybacktogglebutton.scss +24 -4
  132. package/src/style/components/vertical-video/_settingspanel.scss +20 -3
  133. package/src/style/components/vertical-video/_topbar.scss +47 -6
  134. package/src/style/npoplayer.css +86 -53
  135. package/src/style/npoplayer.scss +4 -7
  136. package/src/style/variants/_player-base.scss +10 -2
  137. package/src/style/variants/_player-small.scss +15 -1
  138. package/src/style/vars/_fonts.scss +13 -7
  139. package/src/style/vars/_z-index.scss +1 -0
  140. package/lib/js/api/getstreamobject.d.ts +0 -3
  141. package/lib/js/api/getstreamobject.js +0 -38
  142. package/lib/js/api/getstreamobject.test.js +0 -48
  143. package/lib/js/playeractions/customerrors.test.js +0 -51
  144. package/lib/js/playeractions/handlers/customerrors.d.ts +0 -50
  145. package/lib/js/playeractions/handlers/customerrors.js +0 -56
  146. package/lib/js/playeractions/handlers/error.d.ts +0 -3
  147. package/lib/js/playeractions/handlers/error.js +0 -14
  148. package/lib/js/playeractions/handlers/error.test.js +0 -44
  149. package/lib/js/tracking/handlers/eventbinding.d.ts +0 -3
  150. package/lib/js/tracking/handlers/eventlogging.d.ts +0 -2
  151. package/lib/js/tracking/handlers/eventlogging.test.js +0 -46
  152. package/lib/js/tracking/handlers/playertrackerinit.d.ts +0 -4
  153. package/lib/js/tracking/handlers/playertrackerinit.test.js +0 -74
  154. package/lib/js/tracking/handlers/playertrackerstart.d.ts +0 -1
  155. package/lib/js/tracking/handlers/playertrackerstart.js +0 -25
  156. package/lib/js/tracking/playertracker.d.ts +0 -4
  157. package/lib/js/tracking/playertracker.js +0 -4
  158. package/lib/src/js/api/getstreamobject.d.ts +0 -3
  159. package/lib/src/js/playeractions/handlers/customerrors.d.ts +0 -50
  160. package/lib/src/js/playeractions/handlers/error.d.ts +0 -3
  161. package/lib/src/js/tracking/handlers/eventbinding.d.ts +0 -3
  162. package/lib/src/js/tracking/handlers/eventlogging.d.ts +0 -2
  163. package/lib/src/js/tracking/handlers/playertrackerinit.d.ts +0 -4
  164. package/lib/src/js/tracking/handlers/playertrackerstart.d.ts +0 -1
  165. package/lib/src/js/tracking/playertracker.d.ts +0 -4
  166. /package/lib/js/{api/getstreamobject.test.d.ts → utilities/utilities.prid.test.d.ts} +0 -0
  167. /package/lib/{js/playeractions/customerrors.test.d.ts → services/errors/errorBackground.test.d.ts} +0 -0
  168. /package/lib/{js/playeractions/handlers/error.test.d.ts → services/errors/errorText.test.d.ts} +0 -0
  169. /package/lib/{js/tracking/handlers/eventlogging.test.d.ts → services/streamFetchHandler/fetchstream.test.d.ts} +0 -0
  170. /package/lib/{js/tracking/handlers/playertrackerinit.test.d.ts → services/trackingHandlers/eventBinding.test.d.ts} +0 -0
  171. /package/lib/{src/js/api/getstreamobject.test.d.ts → services/trackingHandlers/eventLogging.test.d.ts} +0 -0
  172. /package/lib/{src/js/playeractions/customerrors.test.d.ts → services/trackingHandlers/playerTrackerInit.test.d.ts} +0 -0
  173. /package/lib/{src/js/playeractions/handlers/error.test.d.ts → services/trackingHandlers/playerTrackerStart.test.d.ts} +0 -0
  174. /package/lib/{src/js/tracking/handlers/eventlogging.test.d.ts → services/trackingHandlers/streamTrackerInit.test.d.ts} +0 -0
  175. /package/lib/{src/js/tracking/handlers/playertrackerinit.test.d.ts → services/verticalVideoHandlers/handleVerticalVideoSettings.test.d.ts} +0 -0
@@ -23,7 +23,7 @@ export function createControlBar(playerContext, variant) {
23
23
  controlComponents.push(new FullscreenToggleButton());
24
24
  const controlBar = new ControlBar({
25
25
  components: [
26
- createSeekBar(npoPlayer),
26
+ createSeekBar(npoPlayer, variant),
27
27
  new Container({
28
28
  components: [...controlComponents],
29
29
  cssClasses: ['controlbar-bottom']
@@ -1,6 +1,7 @@
1
1
  import { Container, PlaybackTimeLabel, SeekBar } from 'bitmovin-player-ui';
2
2
  import type NpoPlayer from '../../npoplayer';
3
- export declare function createSeekBar(npoPlayer: NpoPlayer): Container<{
3
+ import { NpoPlayerUIVariants } from '../../npoplayer';
4
+ export declare function createSeekBar(npoPlayer: NpoPlayer, variant: NpoPlayerUIVariants): Container<{
4
5
  components: (SeekBar | PlaybackTimeLabel)[];
5
6
  cssClasses: string[];
6
7
  }>;
@@ -1,9 +1,9 @@
1
1
  import { Container, PlaybackTimeLabel, PlaybackTimeLabelMode, SeekBar, SeekBarLabel } from 'bitmovin-player-ui';
2
2
  import { NpoPlayerUIVariants } from '../../npoplayer';
3
- export function createSeekBar(npoPlayer) {
3
+ export function createSeekBar(npoPlayer, variant) {
4
4
  const seekBar = new SeekBar({ label: new SeekBarLabel() });
5
5
  npoPlayer.uiComponents.seekBar = seekBar;
6
- const isAdUi = npoPlayer.variant === NpoPlayerUIVariants.AD || false;
6
+ const isAdUi = variant === NpoPlayerUIVariants.AD;
7
7
  return new Container({
8
8
  components: [
9
9
  new PlaybackTimeLabel({
@@ -126,12 +126,10 @@ export function createSettingsPanel(npoPlayer) {
126
126
  player?.getContainer().querySelector('.bmpui-npo-player')?.classList.add('bmpui-settings-panel-shown');
127
127
  });
128
128
  const onSourceLoaded = () => {
129
- player?.off(PlayerEvent.SourceLoaded, onSourceLoaded);
130
- player?.off(PlayerEvent.Ready, onSourceLoaded);
131
129
  checkQualities();
132
130
  checkSubtitles();
133
131
  };
132
+ player?.off(PlayerEvent.SourceLoaded, onSourceLoaded);
134
133
  player?.on(PlayerEvent.SourceLoaded, onSourceLoaded);
135
- player?.on(PlayerEvent.Ready, onSourceLoaded);
136
134
  return settingsPanel;
137
135
  }
@@ -1,3 +1,3 @@
1
- import { ControlBar } from 'bitmovin-player-ui';
2
- import { PlayerContext } from 'types/interfaces';
3
- export declare function createVerticalVideoControlBar(playerContext: PlayerContext): ControlBar;
1
+ import { ControlBar, SettingsPanel } from 'bitmovin-player-ui';
2
+ import { PlayerContext } from '../../../types/interfaces';
3
+ export declare function createVerticalVideoControlBar(playerContext: PlayerContext, settingsPanel: SettingsPanel): ControlBar;
@@ -1,23 +1,21 @@
1
- import { ControlBar, Container, SeekBar, SeekBarLabel, PlaybackToggleButton, SettingsToggleButton, FullscreenToggleButton, VolumeControlButton } from 'bitmovin-player-ui';
1
+ import { ControlBar, Container, SeekBar, SeekBarLabel, PlaybackToggleButton, SettingsToggleButton, FullscreenToggleButton, VolumeToggleButton } from 'bitmovin-player-ui';
2
2
  import { createForwardButton, createRewindButton } from '../buttons';
3
3
  import { createSeekBar } from '../seekbar';
4
- import { createSettingsPanel } from '../settingspanel';
5
- export function createVerticalVideoControlBar(playerContext) {
4
+ import { NpoPlayerUIVariants } from '../../../types/interfaces';
5
+ export function createVerticalVideoControlBar(playerContext, settingsPanel) {
6
6
  const { npoPlayer } = playerContext;
7
7
  const rewindButton = createRewindButton(playerContext);
8
8
  const forwardButton = createForwardButton(playerContext);
9
9
  const seekBar = new SeekBar({ label: new SeekBarLabel() });
10
10
  npoPlayer.uiComponents.seekBar = seekBar;
11
- const settingsPanel = createSettingsPanel(npoPlayer);
12
- const settingsContainer = new Container({
13
- components: [new SettingsToggleButton({ settingsPanel }), settingsPanel],
14
- cssClasses: ['vertical-video-controlbar-settings']
11
+ const settingsToggleButton = new SettingsToggleButton({
12
+ settingsPanel: settingsPanel,
13
+ autoHideWhenNoActiveSettings: false,
14
+ hidden: true
15
15
  });
16
16
  const controlBarButtonsContainer = new Container({
17
17
  components: [
18
- new VolumeControlButton({
19
- vertical: true
20
- }),
18
+ new VolumeToggleButton(),
21
19
  rewindButton,
22
20
  new PlaybackToggleButton(),
23
21
  forwardButton,
@@ -26,9 +24,14 @@ export function createVerticalVideoControlBar(playerContext) {
26
24
  cssClasses: ['vertical-video-controlbar-buttons']
27
25
  });
28
26
  const controlBar = new ControlBar({
29
- components: [settingsContainer, createSeekBar(npoPlayer), controlBarButtonsContainer],
27
+ components: [
28
+ settingsToggleButton,
29
+ createSeekBar(npoPlayer, NpoPlayerUIVariants.VERTICAL),
30
+ controlBarButtonsContainer
31
+ ],
30
32
  cssClasses: ['ui-controlbar-bottom']
31
33
  });
32
34
  npoPlayer.uiComponents.controlBar = controlBar;
35
+ npoPlayer.uiComponents.settingsToggleButton = settingsToggleButton;
33
36
  return controlBar;
34
37
  }
@@ -0,0 +1,2 @@
1
+ import { SettingsPanel } from 'bitmovin-player-ui';
2
+ export declare function createVerticalVideoSettingsPanel(): SettingsPanel;
@@ -0,0 +1,21 @@
1
+ import { SubtitleListBox, SettingsPanel, SettingsPanelPage, SettingsToggleButton } from 'bitmovin-player-ui';
2
+ export function createVerticalVideoSettingsPanel() {
3
+ const subtitleListBox = new SubtitleListBox({
4
+ cssClasses: ['listbox-panel']
5
+ });
6
+ const mainSettingsPage = new SettingsPanelPage({
7
+ components: [subtitleListBox],
8
+ cssClasses: ['main-panel']
9
+ });
10
+ const settingsPanel = new SettingsPanel({
11
+ components: [mainSettingsPage],
12
+ hidden: true,
13
+ pageTransitionAnimation: false,
14
+ hideDelay: -1
15
+ });
16
+ mainSettingsPage.addComponent(new SettingsToggleButton({
17
+ settingsPanel: settingsPanel,
18
+ autoHideWhenNoActiveSettings: false
19
+ }));
20
+ return settingsPanel;
21
+ }
@@ -1,50 +1,30 @@
1
1
  import { handleLiveStreamNoDvr } from './domhandlers';
2
2
  import '@testing-library/jest-dom';
3
+ import { mockStreamObject } from '../../../tests/mocks/mockStreamObject';
3
4
  jest.mock('../../js/utilities/utilities.element', () => ({
4
5
  getElementByQuery: jest.fn()
5
6
  }));
6
7
  const { getElementByQuery } = require('../../js/utilities/utilities.element');
7
8
  describe('handleLiveStreamNoDvr', () => {
8
9
  let mockPlayer;
9
- let mockStreamObject;
10
+ const streamObject = { ...mockStreamObject };
10
11
  let mockPlayerElement;
11
12
  beforeEach(() => {
12
13
  mockPlayer = {
13
14
  getContainer: jest.fn()
14
15
  };
15
- mockStreamObject = {
16
- stream: {
17
- isLiveStream: false,
18
- hasDvrWindow: true,
19
- avType: '',
20
- drmType: '',
21
- streamProfile: '',
22
- sourceProfile: '',
23
- streamURL: ''
24
- },
25
- metadata: {
26
- description: '',
27
- title: ''
28
- },
29
- assets: {
30
- scrubbingThumbnail: '',
31
- subtitles: undefined,
32
- preroll: ''
33
- },
34
- user: { type: 'anonymous' }
35
- };
36
16
  mockPlayerElement = document.createElement('div');
37
17
  getElementByQuery.mockReturnValue(mockPlayerElement);
38
18
  });
39
19
  it('should add "livestream-no-dvr" class when isLiveStream is true and hasDvrWindow is false', () => {
40
- mockStreamObject.stream.isLiveStream = true;
41
- mockStreamObject.stream.hasDvrWindow = false;
20
+ streamObject.stream.isLiveStream = true;
21
+ streamObject.stream.hasDvrWindow = false;
42
22
  handleLiveStreamNoDvr(mockPlayer, mockStreamObject);
43
23
  expect(mockPlayerElement).toHaveClass('livestream-no-dvr');
44
24
  });
45
25
  it('should remove "livestream-no-dvr" class when isLiveStream is false or hasDvrWindow is true', () => {
46
- mockStreamObject.stream.isLiveStream = false;
47
- mockStreamObject.stream.hasDvrWindow = true;
26
+ streamObject.stream.isLiveStream = false;
27
+ streamObject.stream.hasDvrWindow = true;
48
28
  handleLiveStreamNoDvr(mockPlayer, mockStreamObject);
49
29
  expect(mockPlayerElement).not.toHaveClass('livestream-no-dvr');
50
30
  });
@@ -1,6 +1,6 @@
1
1
  import { PlayerEvent } from 'bitmovin-player';
2
2
  import { UIManager } from 'bitmovin-player-ui';
3
- import { customSpecificErrorMessageOverlayConfig } from '../js/playeractions/handlers/customerrors';
3
+ import { customSpecificErrorMessageOverlayConfig } from '../services/errors/errorText';
4
4
  import { localizationConfig } from '../js/settings/localization';
5
5
  import { nativeMobileUIContainer, sendCustomMessage } from './nativemobileuicontainer';
6
6
  import { CustomMessages } from '../types/interfaces';
@@ -11,6 +11,7 @@ import { localizationConfig } from '../js/settings/localization';
11
11
  import { NpoPlayerUIVariants } from '../types/interfaces';
12
12
  import { createVerticalVideoControlBar } from './components/verticalvideo/controlbar';
13
13
  import { DEFAULT_UI_DELAY, PREVENT_UI_DELAY } from '../services/npoPlayerAPI/contants';
14
+ import { createVerticalVideoSettingsPanel } from './components/verticalvideo/settingspanel';
14
15
  export function createUIContainer(playerContext, player, variant) {
15
16
  const cssClassArray = ['npo-player'];
16
17
  const hidePlayerStateExceptions = [PlayerUtils.PlayerState.Paused, PlayerUtils.PlayerState.Prepared];
@@ -44,7 +45,9 @@ export function createUIContainer(playerContext, player, variant) {
44
45
  uiDelay = DEFAULT_UI_DELAY;
45
46
  cssClassArray.push('vertical-video');
46
47
  npoPlayer.player?.setAspectRatio('9:16');
47
- components.push(new SubtitleOverlay(), new BufferingOverlay(), createVerticalVideoControlBar(playerContext), createTitleBar(npoPlayer));
48
+ const settingsPanel = createVerticalVideoSettingsPanel();
49
+ npoPlayer.uiComponents.settingsPanel = settingsPanel;
50
+ components.push(new PlaybackToggleOverlay(), new SubtitleOverlay(), new BufferingOverlay(), new PlaybackToggleOverlay(), settingsPanel, createVerticalVideoControlBar(playerContext, settingsPanel), createTitleBar(npoPlayer));
48
51
  break;
49
52
  }
50
53
  }
@@ -4,7 +4,7 @@ import { NpoPlayerUIVariants } from '../types/interfaces';
4
4
  import { DEFAULT_UI_DELAY, PREVENT_UI_DELAY } from '../services/npoPlayerAPI/contants';
5
5
  import { createUIContainer } from './uicontainer';
6
6
  import { mockPlayerAPI } from '../../tests/mocks/mockPlayerAPI';
7
- import { BufferingOverlay, CastStatusOverlay, Container, ControlBar, ErrorMessageOverlay, PlaybackToggleButton, PlaybackToggleOverlay, SubtitleOverlay, TitleBar } from 'bitmovin-player-ui';
7
+ import { BufferingOverlay, CastStatusOverlay, Container, ControlBar, ErrorMessageOverlay, PlaybackToggleButton, PlaybackToggleOverlay, SettingsPanel, SubtitleOverlay, TitleBar } from 'bitmovin-player-ui';
8
8
  describe('createUIContainer', () => {
9
9
  let playerContextMock;
10
10
  let playerMock;
@@ -68,8 +68,11 @@ describe('createUIContainer', () => {
68
68
  const uiContainer = createUIContainer(playerContextMock, playerMock, NpoPlayerUIVariants.VERTICAL);
69
69
  expect(playerMock.setAspectRatio).toHaveBeenCalledWith('9:16');
70
70
  expect(uiContainer.getComponents()).toEqual([
71
+ expect.any(PlaybackToggleOverlay),
71
72
  expect.any(SubtitleOverlay),
72
73
  expect.any(BufferingOverlay),
74
+ expect.any(PlaybackToggleOverlay),
75
+ expect.any(SettingsPanel),
73
76
  expect.any(ControlBar),
74
77
  expect.any(TitleBar),
75
78
  expect.any(ErrorMessageOverlay)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@npo/player",
3
- "version": "1.26.0",
3
+ "version": "1.27.0",
4
4
  "description": "NPO Player",
5
5
  "author": "Publieke Omroep <player@npo.nl>",
6
6
  "contributors": [
@@ -97,8 +97,8 @@
97
97
  height: 100%;
98
98
  }
99
99
 
100
- .bmpui-ui-hugeplaybacktogglebutton {
101
- opacity: 0;
102
- }
100
+ // .bmpui-ui-hugeplaybacktogglebutton {
101
+ // opacity: 0;
102
+ // }
103
103
  }
104
104
  }
@@ -1,13 +1,14 @@
1
1
  .bmpui-ui-buffering-overlay {
2
2
  background-color: var(--npo-player-bufferingcolor);
3
- display: none;
4
3
  pointer-events: none;
4
+ z-index: z-index(buffering-overlay);
5
5
 
6
6
  > * {
7
7
  pointer-events: none;
8
8
  }
9
9
 
10
10
  .bmpui-container-wrapper {
11
+ position: absolute;
11
12
  display: flex;
12
13
  width: 100%;
13
14
  height: 100%;
@@ -29,7 +30,7 @@
29
30
  border-radius: 50%;
30
31
  background-image: conic-gradient(var(--npo-player-primarycolor), transparent);
31
32
  mask: radial-gradient(transparent 20px, var(--npo-player-primarycolor) 20px);
32
- animation: none;
33
+ animation: rotation 2s infinite ease-in;
33
34
  pointer-events: none;
34
35
  }
35
36
 
@@ -43,16 +44,21 @@
43
44
 
44
45
  /* loading state */
45
46
  &:not(.bmpui-player-state-prepared):not(.bmpui-player-state-playing):not(.bmpui-player-state-paused):not(.bmpui-player-state-finished) {
46
- .bmpui-ui-buffering-overlay,
47
- .bmpui-ui-buffering-overlay.bmpui-hidden {
47
+ .bmpui-ui-buffering-overlay {
48
48
  display: block;
49
49
  opacity: 1;
50
50
  visibility: visible;
51
+ }
52
+ }
51
53
 
52
- .bmpui-ui-buffering-overlay-indicator {
53
- display: block;
54
- animation: rotation 2s infinite ease-in;
55
- }
54
+ &.bmpui-player-state-idle {
55
+ .bmpui-ui-buffering-overlay,
56
+ .bmpui-ui-buffering-overlay.bmpui-hidden {
57
+ display: none;
58
+ }
59
+
60
+ .bmpui-ui-buffering-overlay-indicator {
61
+ animation: none;
56
62
  }
57
63
  }
58
64
 
@@ -1,4 +1,12 @@
1
+ & {
2
+ --npo-player-errormessage-background-image: none
3
+ }
4
+
1
5
  .bmpui-ui-errormessage-overlay {
6
+ z-index: z-index(error-message-overlay);
7
+ background-image: var(--npo-player-errormessage-background-image);
8
+ background-size: cover;
9
+
2
10
  .bmpui-ui-tvnoisecanvas {
3
11
  display: none;
4
12
  }
@@ -20,9 +28,44 @@
20
28
  .bmpui-ui-errormessage-label {
21
29
  font-family: var(--font-bold);
22
30
  font-weight: 700;
23
- font-size: 22px;
31
+ font-size: 18px;
24
32
  line-height: 130%;
25
33
  text-shadow: 0px 0px 10px rgba(0, 0, 0, 0.9);
26
34
  padding: 15px 5px;
27
35
  user-select: none;
36
+ .errorcode{
37
+ font-size: 16px;
38
+ font-weight: 300;
39
+ padding-bottom: 12px;
40
+ display: inline-block;
41
+ }
42
+
43
+ .retry-button {
44
+ position: relative;
45
+ border: 1px solid rgba(255, 255, 255, 0.15);
46
+ border-radius: 8px;
47
+ padding: 12px 16px 12px 40px;
48
+ cursor: pointer;
49
+ transition: border-color 0.3s ease-in-out;
50
+ &:hover {
51
+ border-color: rgba(255, 255, 255, 1);
52
+ }
53
+ &::before {
54
+ content: '';
55
+ position: absolute;
56
+ top: 8px;
57
+ left: 12px;
58
+ width: 24px;
59
+ height: 24px;
60
+ background-color: var(--npo-player-textcolor);
61
+ mask-image: var(--npo-player-icon-replay);
62
+ mask-size: contain;
63
+ mask-repeat: no-repeat;
64
+ }
65
+ }
66
+
28
67
  }
68
+
69
+ .npo-player-error{
70
+ cursor: pointer !important;
71
+ }
@@ -36,6 +36,7 @@
36
36
  /* Icon Play */
37
37
  .bmpui-ui-hugeplaybacktogglebutton {
38
38
  padding: 0;
39
+ z-index: z-index(hugeplayback-toggle-button);
39
40
 
40
41
  .bmpui-image {
41
42
  cursor: pointer;
@@ -1,11 +1,18 @@
1
1
  .bmpui-metadata {
2
- padding: 24px 18px;
2
+ padding: 0;
3
3
  color: var(--npo-player-textcolor);
4
+ height: 100%;
5
+ background: none;
4
6
 
5
7
  .bmpui-container-wrapper {
8
+ position: relative;
6
9
  display: grid;
7
- grid-template-columns: auto auto;
8
- grid-template-rows: auto auto;
10
+ width: 100%;
11
+ aspect-ratio: 16 / 9;
12
+ grid-template-columns: auto min-content;
13
+ grid-template-rows: min-content min-content auto;
14
+ column-gap: 8px;
15
+ padding: 24px 18px;
9
16
  }
10
17
 
11
18
  .bmpui-label-metadata-title {
@@ -29,18 +36,12 @@
29
36
  opacity: 0.65;
30
37
  grid-column: 1;
31
38
  grid-row: 2;
32
-
33
- // Max 4 lines
34
- display: -webkit-box;
35
- -webkit-line-clamp: 4;
36
- -webkit-box-orient: vertical;
37
- overflow: hidden;
38
- text-overflow: ellipsis;
39
+ @include max-lines(4)
39
40
  }
40
41
 
41
42
  .bmpui-nicam {
42
43
  grid-column: 2;
43
- grid-row: 1;
44
- justify-content: end;
44
+ grid-row: 1 / span 3;
45
+ height: 10%;
45
46
  }
46
47
  }
@@ -1,14 +1,15 @@
1
1
  .bmpui-nicam {
2
2
  display: flex;
3
3
  width: 100%;
4
- padding-left: 1px; // offset the negative padding on the nicam icon
4
+ justify-content: flex-end;
5
5
 
6
6
  .nicam-icon {
7
7
  display: block;
8
- height: 25px;
9
- width: 25px;
8
+ height: 100%;
9
+ width: auto;
10
+ min-height: 25px;
11
+ aspect-ratio: 1 / 1;
10
12
  margin-left: -1px; //according to the design spec icons must overlap by 1px
11
- margin-top: 3px;
12
13
  background-size: contain;
13
14
  background-position: center;
14
15
  background-repeat: no-repeat;
@@ -88,11 +89,15 @@
88
89
  &.bmpui-show-nicam {
89
90
  .bmpui-metadata,
90
91
  .bmpui-metadata.bmpui-title-bar {
91
- display: block;
92
+ display: block !important;
92
93
  opacity: 1;
93
94
  visibility: visible;
94
95
  background: none;
95
96
 
97
+ &::before {
98
+ display: none;
99
+ }
100
+
96
101
  .bmpui-label-metadata-title,
97
102
  .bmpui-label-metadata-description {
98
103
  opacity: 0;
@@ -105,4 +110,4 @@
105
110
  padding-top: 40px;
106
111
  }
107
112
  }
108
- }
113
+ }
@@ -6,7 +6,7 @@
6
6
  left: 0;
7
7
  right: 0;
8
8
  background-color: rgba(0, 0, 0, 0.07);
9
- z-index: 10;
9
+ z-index: z-index(playnext-overlay);
10
10
  pointer-events: none;
11
11
 
12
12
  &.show {
@@ -14,12 +14,7 @@
14
14
  }
15
15
 
16
16
  &::after {
17
- animation: none;
18
- background-repeat: no-repeat;
19
- background-position: 50% 50%;
20
- background-color: var(--npo-player-iconcolor);
21
- mask-size: 48px;
22
- mask-image: var(--npo-player-icon-replay) !important;
17
+ mask-image: var(--npo-player-icon-replay);
23
18
  }
24
19
  }
25
20
  }