@latest-thinking/lt-player 1.0.8 → 1.0.9-b

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@latest-thinking/lt-player",
3
- "version": "1.0.8",
3
+ "version": "1.0.9-b",
4
4
  "description": "LT player.",
5
5
  "main": "dist/js/lt-player-main.js",
6
6
  "module": "dist/js/lt-player-main.js",
@@ -0,0 +1,12 @@
1
+ .container-text-portrait-player {
2
+ display: flex;
3
+ max-width: 400px;
4
+ margin: auto;
5
+ justify-content: center;
6
+ padding: 3rem 0;
7
+ }
8
+
9
+ .container-text-landscape-player {
10
+ display: flex;
11
+ max-width: 1000px;
12
+ }
@@ -28,18 +28,6 @@ body {
28
28
  margin: 0;
29
29
  }
30
30
 
31
- .container-text-portrait-player {
32
- display: flex;
33
- max-width: 800px;
34
- max-height: 800px;
35
- margin-bottom: 3rem;
36
- }
37
-
38
- .container-text-landscape-player {
39
- display: flex;
40
- max-width: 1000px;
41
- }
42
-
43
31
  //---------------------------------------------
44
32
  // 3. General
45
33
  //---------------------------------------------
@@ -45,3 +45,9 @@
45
45
  }
46
46
  }
47
47
  }
48
+
49
+ .lt-player-portrate--mobile {
50
+ .fullscreen-custom-control {
51
+ display: none !important;
52
+ }
53
+ }
@@ -81,3 +81,10 @@
81
81
  width: 100%;
82
82
  height: 100%;
83
83
  }
84
+
85
+ .is-fullscreen {
86
+ .lt-player__additional-info,
87
+ .lt-player__additional-info-mobile {
88
+ display: none;
89
+ }
90
+ }
@@ -50,6 +50,31 @@
50
50
  margin-left: auto;
51
51
  justify-content: end;
52
52
  flex: 1;
53
+
54
+ .plyr__controls_speed-button {
55
+ width: 30px;
56
+ height: 30px;
57
+ background-color: $default-lt-player-blue;
58
+ font-size: $lt-player-font-size-xs;
59
+ font-weight: $lt-player-font-weight-md;
60
+
61
+ &:hover {
62
+ background-color: darken($default-lt-player-blue, 5%);
63
+ }
64
+
65
+ &:focus,
66
+ &:active {
67
+ background-color: $default-lt-player-blue;
68
+ }
69
+
70
+ span {
71
+ font-size: 10px;
72
+ }
73
+
74
+ [class="playback-speed--1.25X"] {
75
+ font-size: 8px;
76
+ }
77
+ }
53
78
  }
54
79
 
55
80
  .skip-backward-seconds,
@@ -313,6 +338,19 @@
313
338
  padding: 16px;
314
339
  }
315
340
  }
341
+
342
+ .plyr__controls_speed-button {
343
+ width: 40px;
344
+ height: 40px;
345
+
346
+ span {
347
+ font-size: 14px;
348
+ }
349
+
350
+ [class="playback-speed--1.25X"] {
351
+ font-size: 9px;
352
+ }
353
+ }
316
354
  }
317
355
  }
318
356
  }
@@ -225,6 +225,8 @@ export class LTPlayerConfig {
225
225
  }
226
226
 
227
227
  getFullscreenMode() {
228
+ return {fullscreen: {enabled: true}};
229
+
228
230
  if (this.getDevice() === 'mobile') {
229
231
  return {fullscreen: {enabled: false}}
230
232
  } else {
@@ -246,7 +246,6 @@ export namespace LTPlayerControlsEvents {
246
246
  instance.plyr.fullscreen.toggle();
247
247
  })
248
248
  }
249
-
250
249
  }
251
250
 
252
251
  fullscreenIcon(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType, type: string){
@@ -612,18 +611,19 @@ export namespace LTPlayerControlsEvents {
612
611
  }
613
612
 
614
613
  fullScreenButtons(instance: LTPlayer.PortraitType | LTPlayer.LandscapeType) {
615
-
616
614
  let playerControlsSelector = instance.plyr.elements.controls;
617
615
 
618
616
  const fullScreenButtonContainer = playerControlsSelector.querySelector('.fullscreen-custom-control');
619
617
  let mobileEvent: HammerManager = instance.eventInstance.mobileEvents.setMobileEvent(fullScreenButtonContainer);
620
618
 
621
619
  if (mobileEvent) {
622
- mobileEvent.on('singletap', function LTPlayerMobileFullScreen() {
620
+ mobileEvent.on('singletap', function LTPlayerMobileFullScreen(event) {
621
+ event.preventDefault();
623
622
  instance.plyr.fullscreen.toggle();
624
623
  })
625
624
  }
626
625
  }
626
+
627
627
  playPauseIcon(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType, type: string) {
628
628
  let common = this.common;
629
629
  let instanceMobile = this;
@@ -750,49 +750,46 @@ export namespace LTPlayerControlsEvents {
750
750
  }
751
751
  }
752
752
 
753
- //remove volume
754
- // volume(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType) {
755
- // let playerControlsContainer = instance.plyr.elements.controls;
756
- // const volume:HTMLElement = playerControlsContainer.querySelector('.bottom-controller__volume_control');
757
- // const volumeButton = volume.querySelector('button');
758
- // const volumeUp = volume.querySelector('.volume-max');
759
- // const volumeMute = volume.querySelector('.volume-mute');
760
- //
761
- // const setVolumeIcon = (volumeState: string) => {
762
- // if (volumeState === 'up') {
763
- // volumeUp.classList.remove('d-none');
764
- // volumeMute.classList.remove('d-none');
765
- // volumeMute.classList.add('d-none');
766
- // } else {
767
- // volumeUp.classList.remove('d-none');
768
- // volumeMute.classList.remove('d-none');
769
- // volumeUp.classList.add('d-none');
770
- // }
771
- // }
772
- //
773
- // const setVolume = (): string => {
774
- // if (instance.plyr.muted) {
775
- // instance.plyr.muted = false;
776
- // return 'up';
777
- // } else {
778
- // instance.plyr.muted = true;
779
- // return 'mute';
780
- // }
781
- // }
782
- //
783
- // setVolumeIcon('up');
784
- //
785
- // let mobileEvent: HammerManager = instance.eventInstance.mobileEvents.setMobileEvent(volumeButton);
786
- //
787
- // mobileEvent.on('singletap', function LTPlayerMobileRewindClick() {
788
- // let volumeState = setVolume();
789
- // setVolumeIcon(volumeState);
790
- // instance.playerControl.mobileEvents.showControls(instance);
791
- // })
792
- //
793
- // }
794
- }
753
+ volume(instance: LTPlayer.LandscapeType | LTPlayer.PortraitType) {
754
+ let playerControlsContainer = instance.plyr.elements.controls;
755
+ const volume:HTMLElement = playerControlsContainer.querySelector('.bottom-controller__volume_control');
756
+ const setVolume = (): string => {
757
+ if (instance.plyr.muted) {
758
+ instance.plyr.muted = false;
759
+ return 'up';
760
+ } else {
761
+ instance.plyr.muted = true;
762
+ return 'mute';
763
+ }
764
+ }
795
765
 
766
+ if (volume) {
767
+ const volumeButton = volume.querySelector('button');
768
+ const volumeUp = volume.querySelector('.volume-max');
769
+ const volumeMute = volume.querySelector('.volume-mute');
796
770
 
771
+ const setVolumeIcon = (volumeState: string) => {
772
+ if (volumeState === 'up') {
773
+ volumeUp.classList.remove('d-none');
774
+ volumeMute.classList.remove('d-none');
775
+ volumeMute.classList.add('d-none');
776
+ } else {
777
+ volumeUp.classList.remove('d-none');
778
+ volumeMute.classList.remove('d-none');
779
+ volumeUp.classList.add('d-none');
780
+ }
781
+ }
797
782
 
783
+ setVolumeIcon('up');
784
+
785
+ let mobileEvent: HammerManager = instance.eventInstance.mobileEvents.setMobileEvent(volumeButton);
786
+
787
+ mobileEvent.on('singletap', function LTPlayerMobileRewindClick() {
788
+ let volumeState = setVolume();
789
+ setVolumeIcon(volumeState);
790
+ instance.playerControl.mobileEvents.showControls(instance);
791
+ })
792
+ }
793
+ }
794
+ }
798
795
  }
@@ -10,6 +10,7 @@ export class LTPlayerDesktopSettingsControllers implements SettingsControlsInter
10
10
  }
11
11
 
12
12
  init() {
13
+ this.setButtonSpeed();
13
14
  this.settingsInstance.common.addSettingsTemplate(this.settingsInstance.playerInstance.playerConfig.getDevice());
14
15
  this.addOpenSettingsEventButton();
15
16
  this.initCaptionsEvent();
@@ -19,11 +20,12 @@ export class LTPlayerDesktopSettingsControllers implements SettingsControlsInter
19
20
 
20
21
  addOpenSettingsEventButton() {
21
22
  const selectors: defaultType = this.settingsInstance.common.getSelectors();
22
-
23
- selectors.button.addEventListener('click', (event: MouseEvent) => {
24
- event.preventDefault();
25
- this.settingsInstance.common.openSettings();
26
- })
23
+ if (selectors.button) {
24
+ selectors.button.addEventListener('click', (event: MouseEvent) => {
25
+ event.preventDefault();
26
+ this.settingsInstance.common.openSettings();
27
+ })
28
+ }
27
29
  }
28
30
 
29
31
  initCaptionsEvent() {
@@ -84,4 +86,45 @@ export class LTPlayerDesktopSettingsControllers implements SettingsControlsInter
84
86
  })
85
87
  }
86
88
 
89
+ setButtonSpeed() {
90
+ let playerControlsContainer = this.settingsInstance.playerInstance.plyr.elements.controls;
91
+ let playerSpeedButton = playerControlsContainer.querySelector('.plyr__controls_speed-button');
92
+ let plyr = this.settingsInstance.playerInstance.plyr;
93
+ let instance = this.settingsInstance.playerInstance;
94
+
95
+ if (playerSpeedButton) {
96
+ let speedSpan = document.createElement('span');
97
+ playerSpeedButton.appendChild(speedSpan);
98
+ speedSpan.innerHTML = `1X`;
99
+ speedSpan.className = '';
100
+ speedSpan.classList.add('playback-speed--1X');
101
+
102
+ playerSpeedButton.addEventListener('click', function(event) {
103
+ let playSpeed = plyr.speed + 0.25;
104
+
105
+ if (playSpeed > 2) {
106
+ speedSpan.innerHTML = `1X`;
107
+ plyr.speed = 1;
108
+ speedSpan.className = '';
109
+ speedSpan.classList.add('playback-speed--1X');
110
+ return;
111
+ }
112
+
113
+ if (playSpeed === 1.75) {
114
+ plyr.speed = playSpeed + 0.25
115
+ speedSpan.innerHTML = `2X`;
116
+ speedSpan.className = '';
117
+ speedSpan.classList.add('playback-speed--2X');
118
+ return;
119
+ }
120
+
121
+ plyr.speed = playSpeed;
122
+ speedSpan.innerHTML = playSpeed + "X";
123
+ speedSpan.className = '';
124
+ speedSpan.classList.add('playback-speed--' + playSpeed + 'X');
125
+
126
+ instance.playerControl.mobileEvents.showControls(instance);
127
+ })
128
+ }
129
+ }
87
130
  }
@@ -10,6 +10,7 @@ export class LTPlayerMobileSettingsControllers implements SettingsControlsInterf
10
10
 
11
11
  init() {
12
12
  this.addOpenSettingsEventButton();
13
+ this.setButtonSpeed();
13
14
  }
14
15
 
15
16
  addOpenSettingsEventButton() {
@@ -155,39 +156,49 @@ export class LTPlayerMobileSettingsControllers implements SettingsControlsInterf
155
156
  instance.setInactiveModal();
156
157
  })
157
158
  }
158
- // setButtonSpeed() {
159
- // let playerControlsContainer = this.settingsInstance.playerInstance.plyr.elements.controls;
160
- // let playerSpeedButton = playerControlsContainer.querySelector('.plyr__controls_speed-button');
161
- // playerSpeedButton.innerHTML = `${this.settingsInstance.playerInstance.plyr.speed}X`;
162
- // let plyr = this.settingsInstance.playerInstance.plyr;
163
- // let instance = this.settingsInstance.playerInstance;
164
- //
165
- // if (playerSpeedButton) {
166
- // let mobileEvent: HammerManager = this.settingsInstance.playerInstance.eventInstance.mobileEvents.setMobileEvent(playerSpeedButton);
167
- // if (mobileEvent) {
168
- // mobileEvent.on('singletap', function LTPlayerMobileSpeedButton() {
169
- //
170
- // let playSpeed = plyr.speed + 0.25;
171
- //
172
- // if (playSpeed > 2) {
173
- // playerSpeedButton.innerHTML = `1x`;
174
- // plyr.speed = 1;
175
- // return;
176
- // }
177
- //
178
- // if (playSpeed === 1.75) {
179
- // plyr.speed = playSpeed + 0.25
180
- // playerSpeedButton.innerHTML = `${playSpeed + 0.25}X`;
181
- // return;
182
- // }
183
- //
184
- // plyr.speed = playSpeed;
185
- // playerSpeedButton.innerHTML = `${playSpeed}X`;
186
- //
187
- // instance.playerControl.mobileEvents.showControls(instance);
188
- // })
189
- // }
190
- // }
191
- // }
159
+ setButtonSpeed() {
160
+ let playerControlsContainer = this.settingsInstance.playerInstance.plyr.elements.controls;
161
+ let playerSpeedButton = playerControlsContainer.querySelector('.plyr__controls_speed-button');
162
+ let plyr = this.settingsInstance.playerInstance.plyr;
163
+ let instance = this.settingsInstance.playerInstance;
164
+
165
+ if (playerSpeedButton) {
166
+ let speedSpan = document.createElement('span');
167
+ playerSpeedButton.appendChild(speedSpan);
168
+ speedSpan.innerHTML = `1X`;
169
+ speedSpan.className = '';
170
+ speedSpan.classList.add('playback-speed--1X');
171
+
172
+ let mobileEvent: HammerManager = this.settingsInstance.playerInstance.eventInstance.mobileEvents.setMobileEvent(playerSpeedButton);
173
+ if (mobileEvent) {
174
+ mobileEvent.on('singletap', function LTPlayerMobileSpeedButton() {
175
+ let playSpeed = plyr.speed + 0.25;
176
+
177
+ if (playSpeed > 2) {
178
+ speedSpan.innerHTML = `1X`;
179
+ plyr.speed = 1;
180
+ speedSpan.className = '';
181
+ speedSpan.classList.add('playback-speed--1X');
182
+ return;
183
+ }
184
+
185
+ if (playSpeed === 1.75) {
186
+ plyr.speed = playSpeed + 0.25
187
+ speedSpan.innerHTML = `2X`;
188
+ speedSpan.className = '';
189
+ speedSpan.classList.add('playback-speed--2X');
190
+ return;
191
+ }
192
+
193
+ plyr.speed = playSpeed;
194
+ speedSpan.innerHTML = playSpeed + "X";
195
+ speedSpan.className = '';
196
+ speedSpan.classList.add('playback-speed--' + playSpeed + 'X');
197
+
198
+ instance.playerControl.mobileEvents.showControls(instance);
199
+ })
200
+ }
201
+ }
202
+ }
192
203
 
193
204
  }
@@ -140,8 +140,12 @@ export class LTPlayerDesktop extends LTPlayerCommon implements EventsInterfaces
140
140
  let instance: LTPlayer.PortraitType | LTPlayer.LandscapeType = this.player;
141
141
  let plyr: Plyr = this.plyr;
142
142
 
143
- plyr.on('enterfullscreen', function LTPlayerDesktopEnterFullScreen() {
143
+ plyr.on('enterfullscreen', function LTPlayerDesktopEnterFullScreen(event) {
144
144
  //remove mini player on fullscreen
145
+ const target = event.target as HTMLElement;
146
+ const parent = target.closest('.lt-player');
147
+
148
+ parent.classList.add('is-fullscreen');
145
149
  instance.miniPlayer.event.removeMiniPLOnFullScreen(instance, 'enterfullscreen');
146
150
 
147
151
  //fullscreen icon
@@ -151,8 +155,12 @@ export class LTPlayerDesktop extends LTPlayerCommon implements EventsInterfaces
151
155
 
152
156
  });
153
157
 
154
- plyr.on('exitfullscreen', function LTPlayerDesktopExitFullScreen() {
158
+ plyr.on('exitfullscreen', function LTPlayerDesktopExitFullScreen(event) {
155
159
  //add mini player on exit fullscreen
160
+ const target = event.target as HTMLElement;
161
+ const parent = target.closest('.lt-player');
162
+
163
+ parent.classList.remove('is-fullscreen');
156
164
  instance.miniPlayer.event.removeMiniPLOnFullScreen(instance, 'exitfullscreen');
157
165
 
158
166
  //fullscreen icon
@@ -54,6 +54,8 @@ export class LTPlayerMobile extends LTPlayerCommon implements EventsInterfaces {
54
54
  instance.playerId = instance.playerConfig.getPlayerId();
55
55
  }
56
56
 
57
+ eventManager.setDefaultSettingsConfig();
58
+
57
59
  if (instance.plyr.isHTML5) {
58
60
 
59
61
  if (instance.hls) {
@@ -70,12 +72,12 @@ export class LTPlayerMobile extends LTPlayerCommon implements EventsInterfaces {
70
72
  }
71
73
  }
72
74
 
73
- eventManager.setDefaultSettingsConfig();
74
-
75
75
  instance.posterManager.mobileEvents.showControls(instance);
76
76
 
77
77
  instance.playerControl.mobileEvents.controlsTimeShow(instance);
78
78
 
79
+ instance.playerControl.mobileEvents.fullScreenButtons(instance);
80
+
79
81
  //set play/pause icon
80
82
  instance.playerControl.mobileEvents.playPauseIcon(instance, 'ready');
81
83
 
@@ -84,7 +86,7 @@ export class LTPlayerMobile extends LTPlayerCommon implements EventsInterfaces {
84
86
  instance.playerControl.mobileEvents.backwardForwardSeconds(instance);
85
87
 
86
88
  //remove volume controller
87
- // instance.playerControl.mobileEvents.volume(instance);
89
+ instance.playerControl.mobileEvents.volume(instance);
88
90
 
89
91
  //set settings controller
90
92
  instance.playerControl.settingsControlsManager.init(instance);
@@ -128,14 +130,24 @@ export class LTPlayerMobile extends LTPlayerCommon implements EventsInterfaces {
128
130
  let instance: LTPlayer.PortraitType | LTPlayer.LandscapeType = this.player;
129
131
  let plyr: Plyr = this.plyr;
130
132
 
131
- plyr.on('enterfullscreen', function LTPlayerDesktopEnterFullScreen() {
133
+ plyr.on('enterfullscreen', function LTPlayerDesktopEnterFullScreen(event) {
134
+ const target = event.target as HTMLElement;
135
+ const parent = target.closest('.lt-player');
136
+
137
+ parent.classList.add('is-fullscreen');
138
+ instance.miniPlayer.event.removeMiniPLOnFullScreen(instance, 'enterfullscreen');
132
139
  //fullscreen icon
133
140
  instance.playerControl.desktopEvents.fullscreenIcon(instance, 'enterfullscreen');
134
141
 
135
142
  instance.videoService.removeObjectFit();
136
143
  });
137
144
 
138
- plyr.on('exitfullscreen', function LTPlayerDesktopExitFullScreen() {
145
+ plyr.on('exitfullscreen', function LTPlayerDesktopExitFullScreen(event) {
146
+ const target = event.target as HTMLElement;
147
+ const parent = target.closest('.lt-player');
148
+
149
+ parent.classList.remove('is-fullscreen');
150
+ instance.miniPlayer.event.removeMiniPLOnFullScreen(instance, 'exitfullscreen');
139
151
  //fullscreen icon
140
152
  instance.playerControl.desktopEvents.fullscreenIcon(instance, 'exitfullscreen');
141
153
  instance.videoService.appendObjectFit();
@@ -208,17 +208,26 @@
208
208
  <div class="top-controllers__body__center">
209
209
  <p class="chapter"></p>
210
210
  </div>
211
- <div class="top-controllers__body__right">
212
- {{#desktop}}
213
- <button type="button" class="plyr__control fullscreen-custom-control">
214
- <img class="filter minimize d-none" src="{{icons.minimize}}" alt="">
215
- <img class="filter maximize" src="{{icons.maximize}}" alt="">
216
- </button>
217
- <button type="button" class="plyr__control mini-player-control">
218
- <img class="filter" src="{{icons.mini-player}}" alt="">
219
- </button>
220
- {{/desktop}}
221
- </div>
211
+ <div class="top-controllers__body__right">
212
+ {{#desktop}}
213
+ <button type="button" class="plyr__control fullscreen-custom-control">
214
+ <img class="filter minimize d-none" src="{{icons.minimize}}" alt="">
215
+ <img class="filter maximize" src="{{icons.maximize}}" alt="">
216
+ </button>
217
+ <button type="button" class="plyr__control mini-player-control">
218
+ <img class="filter" src="{{icons.mini-player}}" alt="">
219
+ </button>
220
+ {{/desktop}}
221
+ {{#mobile}}
222
+ <button type="button" class="plyr__control fullscreen-custom-control">
223
+ <img class="filter minimize d-none" src="{{icons.minimize}}" alt="">
224
+ <img class="filter maximize" src="{{icons.maximize}}" alt="">
225
+ </button>
226
+ <button type="button" class="plyr__control mini-player-control">
227
+ <img class="filter" src="{{icons.mini-player}}" alt="">
228
+ </button>
229
+ {{/mobile}}
230
+ </div>
222
231
  </div>
223
232
  </div>
224
233
  <div class="lt-player-notification portrait">
@@ -275,9 +284,12 @@
275
284
  <div class="bottom-controller">
276
285
  {{#mobile}}
277
286
  <div class="bottom-controller__left-buttons">
278
- <button type="button" class="plyr__control plyr__controls_settings-button settings">
279
- <img class="filter settings" src="{{icons.settings}}" alt="">
280
- </button>
287
+ <div class="bottom-controller__volume_control">
288
+ <button type="button" class="plyr__control volume_control__volume-button button-open">
289
+ <img class="volume-max filter button-open" data-range-value="1" src="{{icons.volume-3}}" alt="">
290
+ <img class="volume-mute d-none filter button-open" data-range-value="0" src="{{icons.mute}}" alt="">
291
+ </button>
292
+ </div>
281
293
  </div>
282
294
  {{/mobile}}
283
295
  {{#desktop}}
@@ -321,6 +333,7 @@
321
333
  </div>
322
334
  {{#mobile}}
323
335
  <div class="bottom-controller__right-buttons">
336
+ <button type="button" class="plyr__control plyr__controls_speed-button"></button>
324
337
  </div>
325
338
  {{/mobile}}
326
339
  {{#mobile}}
@@ -329,9 +342,7 @@
329
342
 
330
343
  {{#desktop}}
331
344
  <div class="bottom-controller__right-buttons">
332
- <button type="button" class="plyr__control plyr__controls_settings-button settings">
333
- <img class="filter settings" src="{{icons.settings}}" alt="">
334
- </button>
345
+ <button type="button" class="plyr__control plyr__controls_speed-button"></button>
335
346
  </div>
336
347
  {{/desktop}}
337
348
  </div>