cloudinary-video-player 1.5.5 → 1.5.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/CHANGELOG.md +140 -21
  2. package/dist/cld-video-player.css +229 -2079
  3. package/dist/cld-video-player.js +200 -483
  4. package/dist/cld-video-player.light.css +231 -2081
  5. package/dist/cld-video-player.light.js +71 -23
  6. package/dist/cld-video-player.light.min.css +1 -1
  7. package/dist/cld-video-player.light.min.js +2 -23
  8. package/dist/cld-video-player.light.min.js.LICENSE.txt +23 -0
  9. package/dist/cld-video-player.min.css +1 -1
  10. package/dist/cld-video-player.min.js +2 -27
  11. package/dist/cld-video-player.min.js.LICENSE.txt +26 -0
  12. package/docs/interaction-area.html +104 -64
  13. package/package.json +23 -23
  14. package/src/assets/styles/components/interaction-areas.scss +165 -0
  15. package/src/assets/styles/components/themedButton.scss +48 -0
  16. package/src/assets/styles/icons.scss +149 -217
  17. package/src/assets/styles/main.scss +8 -30
  18. package/src/components/interaction-area/interaction-area.const.js +30 -0
  19. package/src/components/interaction-area/interaction-area.service.js +225 -0
  20. package/src/components/interaction-area/interaction-area.utils.js +236 -0
  21. package/src/components/logoButton/logo-button.js +3 -6
  22. package/src/components/themeButton/themedButton.const.js +3 -0
  23. package/src/components/themeButton/themedButton.js +25 -0
  24. package/src/config/defaults.js +3 -2
  25. package/src/extended-events.js +3 -0
  26. package/src/plugins/cloudinary/common.js +14 -6
  27. package/src/plugins/cloudinary/models/video-source/video-source.js +16 -12
  28. package/src/plugins/cloudinary/models/video-source/video-source.utils.js +28 -1
  29. package/src/plugins/colors/index.js +6 -1
  30. package/src/plugins/dash/videojs-dash.js +1 -1
  31. package/src/plugins/floating-player/index.js +3 -1
  32. package/src/utils/array.js +21 -0
  33. package/src/utils/dom.js +41 -2
  34. package/src/utils/object.js +26 -0
  35. package/src/utils/time.js +28 -1
  36. package/src/utils/type-inference.js +5 -1
  37. package/src/validators/validators-functions.js +48 -0
  38. package/src/validators/validators-types.js +78 -0
  39. package/src/validators/validators.js +110 -0
  40. package/src/video-player.const.js +23 -16
  41. package/src/video-player.js +47 -127
  42. package/src/video-player.utils.js +9 -70
  43. package/test/isValidConfig.test.js +224 -0
  44. package/test/unit/utils.test.js +27 -0
  45. package/test/unit/videoSource.test.js +155 -0
  46. package/types/video-player.d.ts +1 -1
@@ -0,0 +1,26 @@
1
+ /*!
2
+ * Programatically add the following
3
+ */
4
+
5
+ /*!
6
+ * The buffer module from node.js, for the browser.
7
+ *
8
+ * @author Feross Aboukhadijeh <http://feross.org>
9
+ * @license MIT
10
+ */
11
+
12
+ /*! @name @videojs/http-streaming @version 2.9.1 @license Apache-2.0 */
13
+
14
+ /*! @name aes-decrypter @version 3.1.2 @license Apache-2.0 */
15
+
16
+ /*! @name pkcs7 @version 1.0.4 @license Apache-2.0 */
17
+
18
+ /*! @name videojs-contrib-ads @version 6.9.0 @license Apache-2.0 */
19
+
20
+ /*! @name videojs-contrib-quality-levels @version 2.1.0 @license Apache-2.0 */
21
+
22
+ /*! codem-isoboxer v0.3.6 https://github.com/madebyhiro/codem-isoboxer/blob/master/LICENSE.txt */
23
+
24
+ /*! http://mths.be/fromcodepoint v0.1.0 by @mathias */
25
+
26
+ /*! safe-buffer. MIT License. Feross Aboukhadijeh <https://feross.org/opensource> */
@@ -27,36 +27,49 @@
27
27
 
28
28
  var cld = cloudinary.Cloudinary.new({cloud_name: 'demo'});
29
29
 
30
- var interactionAreas = [
31
- {
32
- left : 10 ,
33
- top: 10,
34
- width: 80,
35
- height: 40,
36
- id: 'topSource'
37
- },
38
- {
39
- left : 10 ,
40
- top: 75,
41
- width: 80,
42
- height : 20,
43
- id: 'bottomSource'
44
- }
45
- ];
30
+ var playerOption = {
31
+ bigPlayButton: false,
32
+ interactionDisplay: {
33
+ theme:{
34
+ template : 'pulsing'
35
+ },
36
+ layout: {
37
+ enable: true,
38
+ showAgain: false
39
+ }
40
+ }
41
+ };
46
42
 
47
- const sources = {
43
+ var sources = {
48
44
  topSource : 'https://res.cloudinary.com/eran2903/video/upload/w_880,x_800,y_200,c_crop/w_270,eo_8,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4',
49
45
  bottomSource: 'https://res.cloudinary.com/eran2903/video/upload/w_540,x_1260,y_3100,c_crop/w_270,eo_8,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4'
50
- }
51
-
52
- var player = cld.videoPlayer('manually');
46
+ };
53
47
 
54
- player.source('video-player/girl_in_a_dress');
48
+ var player = cld.videoPlayer('manually', playerOption);
55
49
 
56
- player.addInteractionAreas(interactionAreas, {
57
- onClick: (event) => {
50
+ player.source('video-player/girl_in_a_dress', {
51
+ interactionAreas:{
52
+ enable: true,
53
+ template: [
54
+ {
55
+ left : 10 ,
56
+ top: 10,
57
+ width: 80,
58
+ height: 40,
59
+ id: 'topSource'
60
+ },
61
+ {
62
+ left : 10 ,
63
+ top: 75,
64
+ width: 80,
65
+ height : 20,
66
+ id: 'bottomSource'
67
+ }
68
+ ],
69
+ onClick: function (event) {
58
70
  event.zoom(sources[event.item.id]);
59
- }
71
+ }
72
+ }
60
73
  });
61
74
 
62
75
  var videoZoomSources = {
@@ -65,14 +78,14 @@
65
78
  bottom:'https://res.cloudinary.com/eran2903/video/upload/w_540,x_1260,y_3100,c_crop/w_270,eo_8,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4'
66
79
  }
67
80
 
68
- var player2 = cld.videoPlayer('custom-template');
81
+ var player2 = cld.videoPlayer('custom-template', playerOption);
69
82
 
70
83
  player2.source('video-player/girl_in_a_dress', {
71
84
  interactionAreas: {
72
85
  enable: true,
73
86
  template: 'portrait',
74
- onClick: (event) => {
75
- const src = videoZoomSources[event.item.id];
87
+ onClick:function (event) {
88
+ var src = videoZoomSources[event.item.id];
76
89
  if(event.item.id === 'middle'){
77
90
  if(window.confirm('Do you like this shirt ?')) {
78
91
  window.open(src, '_blank').focus();
@@ -85,24 +98,24 @@
85
98
  }
86
99
  });
87
100
 
88
- var player3 = cld.videoPlayer('custom-vtt');
101
+ var player3 = cld.videoPlayer('custom-vtt', playerOption);
89
102
 
90
103
  var videoZoomSources3 = {
91
104
  center : 'https://res.cloudinary.com/eran2903/video/upload/w_880,x_800,y_200,c_crop/w_270,eo_8,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4'
92
105
  }
93
106
 
94
- player3.source('https://res.cloudinary.com/eran2903/video/upload/eo_8,w_270,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4', {
107
+ player3.source('video-player/girl_in_a_dress', {
95
108
  interactionAreas: {
96
109
  enable: true,
97
110
  vttUrl: 'https://res.cloudinary.com/prod/raw/upload/v1623250265/video-player/vtts/center.vtt',
98
- onClick: (event) => {
111
+ onClick: function (event) {
99
112
  event.zoom(videoZoomSources3[event.item.id]);
100
113
  }
101
114
  }
102
115
  });
103
116
 
104
117
 
105
- var player4 = cld.videoPlayer('auto-zoom');
118
+ var player4 = cld.videoPlayer('auto-zoom', playerOption);
106
119
 
107
120
  player4.source('video-player/girl_in_a_dress', {
108
121
  transformation:{
@@ -111,7 +124,7 @@
111
124
  interactionAreas: {
112
125
  enable: true,
113
126
  template: 'portrait',
114
- onClick: (event) => {
127
+ onClick: function (event) {
115
128
  event.zoom();
116
129
  }
117
130
  }
@@ -131,6 +144,26 @@
131
144
 
132
145
  <br/>
133
146
 
147
+ <h3>Interaction Areas player config:</h3>
148
+
149
+ <pre>
150
+ <code class="language-javascript">
151
+ var cld = cloudinary.Cloudinary.new({cloud_name: 'demo'});
152
+
153
+ cld.videoPlayer('player', {
154
+ interactionDisplay: {
155
+ theme:{
156
+ template : 'pulsing' // 'pulsing' / 'shadowed' (the default is 'pulsing')
157
+ },
158
+ layout: {
159
+ enable: true / false (the default is true),
160
+ showAgain: true / false (the default is false)
161
+ }
162
+ }
163
+ });
164
+ </code>
165
+ </pre>
166
+
134
167
  <h3>Define Interaction Areas manually</h3>
135
168
 
136
169
  <br/>
@@ -159,37 +192,38 @@
159
192
  <code class="language-javascript">
160
193
  var cld = cloudinary.Cloudinary.new({cloud_name: 'demo'});
161
194
 
162
- var interactionAreas = [
163
- {
164
- left : 10 ,
165
- top: 10,
166
- width: 80,
167
- height: 40,
168
- id: 'topSource'
169
- },
170
- {
171
- left : 10 ,
172
- top: 75,
173
- width: 80,
174
- height : 20,
175
- id: 'bottomSource'
176
- }
177
- ];
178
-
179
- const sources = {
195
+ var sources = {
180
196
  topSource : 'https://res.cloudinary.com/eran2903/video/upload/w_880,x_800,y_200,c_crop/w_270,eo_8,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4',
181
197
  bottomSource: 'https://res.cloudinary.com/eran2903/video/upload/w_540,x_1260,y_3100,c_crop/w_270,eo_8,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4'
182
198
  }
183
199
 
184
- var player = cld.videoPlayer('player');
185
-
186
- player.source('video-player/girl_in_a_dress');
200
+ var player = cld.videoPlayer('player',{
201
+ bigPlayButton: false
202
+ });
187
203
 
188
- player.addInteractionAreas(interactionAreas, {
189
- onClick: (event) => {
190
- var source = sources[event.item.id];
191
- event.zoom(source);
192
- }
204
+ player.source('video-player/girl_in_a_dress',{
205
+ interactionAreas: {
206
+ enable: true,
207
+ template: [
208
+ {
209
+ left : 10 ,
210
+ top: 10,
211
+ width: 80,
212
+ height: 40,
213
+ id: 'topSource'
214
+ },
215
+ {
216
+ left : 10 ,
217
+ top: 75,
218
+ width: 80,
219
+ height : 20,
220
+ id: 'bottomSource'
221
+ }
222
+ ],
223
+ onClick: function (event) {
224
+ event.zoom(sources[event.item.id]);
225
+ }
226
+ }
193
227
  });
194
228
  </code>
195
229
 
@@ -225,7 +259,9 @@
225
259
  <code class="language-javascript">
226
260
  var cld = cloudinary.Cloudinary.new({cloud_name: 'demo'});
227
261
 
228
- var player = cld.videoPlayer('player');
262
+ var player = cld.videoPlayer('player',{
263
+ bigPlayButton: false
264
+ });
229
265
 
230
266
  var sources = {
231
267
  top:'https://res.cloudinary.com/eran2903/video/upload/w_880,x_800,y_200,c_crop/w_270,eo_8,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4',
@@ -237,7 +273,7 @@
237
273
  interactionAreas: {
238
274
  enable: true,
239
275
  template: 'portrait', // or landscape/all/center
240
- onClick: (event) => {
276
+ onClick: function(event) {
241
277
  // 'event.item.id' is an id that been defined in the vtt file
242
278
  var src = sources[event.item.id];
243
279
  if(event.item.id === 'middle'){
@@ -284,7 +320,9 @@
284
320
  <code class="language-javascript">
285
321
  var cld = cloudinary.Cloudinary.new({cloud_name: 'demo'});
286
322
 
287
- var player = cld.videoPlayer('player');
323
+ var player = cld.videoPlayer('player',{
324
+ bigPlayButton: false
325
+ });
288
326
 
289
327
  var sources = {
290
328
  center : 'https://res.cloudinary.com/eran2903/video/upload/w_880,x_800,y_200,c_crop/w_270,eo_8,q_auto:best,f_auto/production_ID_3888264_fuuo7c.mp4'
@@ -294,7 +332,7 @@
294
332
  interactionAreas: {
295
333
  enable: true,
296
334
  vttUrl: 'https://res.cloudinary.com/prod/raw/upload/v1623250265/video-player/vtts/center.vtt',
297
- onClick: (event) => {
335
+ onClick: function(event) {
298
336
  // 'event.item.id' is an id that been defined in the vtt file
299
337
  event.zoom(sources[event.item.id]);
300
338
  }
@@ -331,7 +369,9 @@
331
369
  <code class="language-javascript">
332
370
  var cld = cloudinary.Cloudinary.new({cloud_name: 'demo'});
333
371
 
334
- var player = cld.videoPlayer('player');
372
+ var player = cld.videoPlayer('player', {
373
+ bigPlayButton: false
374
+ });
335
375
 
336
376
  // auto-zoom works only if the source is a cloudinary source object or a public id
337
377
  // does not work for a full raw url
@@ -342,7 +382,7 @@
342
382
  interactionAreas: {
343
383
  enable: true,
344
384
  template: 'portrait',
345
- onClick: (event) => {
385
+ onClick: function (event) {
346
386
  //in case you not passing a source to the zoom function auto zoom will be enabled
347
387
  event.zoom();
348
388
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "cloudinary-video-player",
3
- "version": "1.5.5",
3
+ "version": "1.5.9",
4
4
  "description": "Cloudinary Video Player",
5
5
  "bundlewatch": {
6
6
  "files": [
@@ -10,7 +10,7 @@
10
10
  },
11
11
  {
12
12
  "path": "./dist/cld-video-player.light.min.js",
13
- "maxSize": "110kb"
13
+ "maxSize": "112kb"
14
14
  }
15
15
  ]
16
16
  },
@@ -44,55 +44,55 @@
44
44
  "dashjs": "^3.2.2",
45
45
  "fetch-ponyfill": "^7.1.0",
46
46
  "promise-polyfill": "^8.2.0",
47
- "video.js": "^7.11.8",
47
+ "video.js": "^7.13.3",
48
48
  "videojs-contextmenu": "^2.0.2",
49
- "videojs-contrib-ads": "^6.8.0",
49
+ "videojs-contrib-ads": "^6.9.0",
50
50
  "videojs-contrib-quality-levels": "^2.1.0",
51
51
  "videojs-ima": "^1.9.1",
52
52
  "videojs-per-source-behaviors": "^2.1.0",
53
53
  "webfontloader": "^1.6.28"
54
54
  },
55
55
  "devDependencies": {
56
- "@babel/core": "^7.13.10",
57
- "@babel/plugin-transform-runtime": "^7.13.10",
58
- "@babel/preset-env": "^7.13.10",
59
- "@types/video.js": "^7.3.15",
60
- "babel-eslint": "^7.1.1",
56
+ "@babel/core": "^7.14.6",
57
+ "@babel/plugin-transform-runtime": "^7.14.5",
58
+ "@babel/preset-env": "^7.14.7",
59
+ "@types/video.js": "^7.3.23",
60
+ "babel-eslint": "^7.2.3",
61
61
  "babel-jest": "^24.9.0",
62
62
  "babel-loader": "^8.2.2",
63
63
  "bundlewatch": "^0.3.2",
64
- "cloudinary-core": "^2.11.3",
64
+ "cloudinary-core": "^2.11.4",
65
65
  "copy-webpack-plugin": "4",
66
- "css-loader": "^5.1.3",
66
+ "css-loader": "^5.2.6",
67
67
  "eslint": "^5.16.0",
68
68
  "eslint-loader": "^2.2.1",
69
69
  "eslint-plugin-jest": "^21.27.2",
70
70
  "expose-loader": "^0.7.5",
71
71
  "file-loader": "^6.2.0",
72
- "html-webpack-plugin": "4",
72
+ "html-webpack-plugin": "^4.5.2",
73
73
  "jest": "^26.6.3",
74
74
  "jest-fetch-mock": "^3.0.3",
75
75
  "jest-puppeteer": "^4.4.0",
76
76
  "jest-webpack": "^0.5.1",
77
77
  "json-loader": "^0.5.7",
78
- "mini-css-extract-plugin": "^1.3.9",
79
- "optimize-css-assets-webpack-plugin": "^5.0.4",
80
- "puppeteer": "^5.2.1",
78
+ "mini-css-extract-plugin": "^1.6.2",
79
+ "optimize-css-assets-webpack-plugin": "^5.0.8",
80
+ "puppeteer": "^5.5.0",
81
81
  "puppeteer-request-spy": "^1.4.0",
82
- "sass": "^1.32.11",
83
- "sass-loader": "10",
82
+ "sass": "^1.35.1",
83
+ "sass-loader": "10.2.0",
84
84
  "shx": "^0.3.3",
85
- "snyk": "^1.493.0",
85
+ "snyk": "^1.653.0",
86
86
  "source-map-loader": "1.1.3",
87
- "terser-webpack-plugin": "^5.1.1",
88
- "uglify-js": "^3.13.1",
87
+ "terser-webpack-plugin": "^4.2.3",
88
+ "uglify-js": "^3.13.10",
89
89
  "url-loader": "^4.1.1",
90
- "webpack": "^4.44.1",
91
- "webpack-bundle-analyzer": "^3.8.0",
90
+ "webpack": "^4.46.0",
91
+ "webpack-bundle-analyzer": "^3.9.0",
92
92
  "webpack-cli": "^3.3.12",
93
93
  "webpack-conditional-loader": "^1.0.12",
94
94
  "webpack-dev-server": "^3.11.2",
95
- "webpack-merge": "^5.7.3",
95
+ "webpack-merge": "^5.8.0",
96
96
  "webworkify-webpack2": "^1.1.9"
97
97
  },
98
98
  "snyk": true
@@ -0,0 +1,165 @@
1
+ $interaction-area-marker-size: 20px;
2
+ $interaction-area-marker-border-size: 2px;
3
+ $interaction-area-marker-box-shadow-extra-size: 4px;
4
+ $interaction-area-layout-icon-height: 60px;
5
+
6
+ .cld-video-player{
7
+
8
+ &.vjs-user-active {
9
+ .interaction-areas-container {
10
+ display: block;
11
+ }
12
+ }
13
+
14
+ &.interaction-areas {
15
+
16
+ .vjs-big-play-button {
17
+ display: none !important;
18
+ }
19
+ }
20
+
21
+ .interaction-areas-container {
22
+ position: absolute;
23
+ width: 100%;
24
+ height: 100%;
25
+ top: 50%;
26
+ left: 50%;
27
+ transform: translate(-50%, -50%);
28
+ display: none;
29
+ z-index: 1;
30
+
31
+ &:hover {
32
+ display: block;
33
+ }
34
+
35
+ .go-back-button,
36
+ .vp-ia-item {
37
+ position: absolute;
38
+ cursor: pointer;
39
+ }
40
+
41
+ .go-back-button {
42
+ top: 0;
43
+ left: 0;
44
+ width: 100%;
45
+ height: 100%;
46
+ }
47
+
48
+ .vp-ia-item {
49
+ display: inline-flex;
50
+ align-items: center;
51
+ justify-content: center;
52
+ transition: top, left, width, height;
53
+ transition-timing-function: linear;
54
+
55
+ &.theme-shadowed {
56
+
57
+ .vp-ia-marker-shadow{
58
+ opacity: 0.24;
59
+ }
60
+
61
+ }
62
+
63
+ &.theme-pulsing {
64
+
65
+ .vp-ia-marker-shadow {
66
+ -webkit-animation: pulsing-animation 1.3s ease-out;
67
+ -webkit-animation-iteration-count: infinite;
68
+ border: solid $interaction-area-marker-border-size;
69
+ opacity: 0;
70
+ }
71
+ }
72
+
73
+ &:hover {
74
+ .vp-ia-marker-main:before {
75
+ content: "";
76
+ width: $interaction-area-marker-size;
77
+ height: $interaction-area-marker-size;
78
+ border: solid $interaction-area-marker-border-size rgba(0,0,0,0.25);
79
+ }
80
+ }
81
+
82
+ .vp-ia-area-marker {
83
+ position: relative;
84
+ width: $interaction-area-marker-size;
85
+ height: $interaction-area-marker-size;
86
+
87
+ .vp-ia-marker-main,
88
+ .vp-ia-marker-main:before,
89
+ .vp-ia-marker-shadow {
90
+ position: absolute;
91
+ border-radius: 50%;
92
+ transform: translate(-50%, -50%);
93
+ top: 50%;
94
+ left: 50%;
95
+ }
96
+
97
+ .vp-ia-marker-main {
98
+ background-color: white;
99
+ border:solid $interaction-area-marker-border-size;
100
+ height: 100%;
101
+ width: 100%;
102
+ }
103
+
104
+ .vp-ia-marker-shadow {
105
+ width: 2*$interaction-area-marker-border-size + $interaction-area-marker-size + $interaction-area-marker-box-shadow-extra-size;
106
+ height:2*$interaction-area-marker-border-size + $interaction-area-marker-size + $interaction-area-marker-box-shadow-extra-size;
107
+ }
108
+ }
109
+ }
110
+
111
+ &.vp-ia-layout-message {
112
+ display: flex;
113
+ flex-direction: column;
114
+ align-items: center;
115
+ justify-content: center;
116
+ height: 100%;
117
+ z-index: 2;
118
+ background-color: rgba(0, 0, 0, 0.5);
119
+
120
+ &.clickable {
121
+ cursor: pointer;
122
+
123
+ &:hover .vp-theme-button {
124
+ background-color: rgba(255, 255, 254, 0.28);
125
+ }
126
+
127
+ }
128
+
129
+ .vp-ia-layout-icon {
130
+ margin-bottom: 20px;
131
+ height: $interaction-area-layout-icon-height;
132
+ }
133
+
134
+ .vp-ia-layout-message-title {
135
+ font-size: 24px;
136
+ line-height: 34px;
137
+ text-align: center;
138
+ }
139
+
140
+ .vp-theme-button {
141
+ margin: 8px 0 18px 0;
142
+ }
143
+
144
+ .vp-ia-layout-message-do-not-show {
145
+ display: flex;
146
+ align-items: center;
147
+
148
+ > * {
149
+ cursor: pointer;
150
+ }
151
+
152
+ .vp-ia-layout-message-checkbox-title {
153
+ margin: 0 0 0 5px;
154
+ }
155
+
156
+ }
157
+ }
158
+ }
159
+ }
160
+
161
+ @-webkit-keyframes pulsing-animation {
162
+ 0% { height: $interaction-area-marker-size / 2; width: $interaction-area-marker-size / 2; opacity: 0}
163
+ 50% { height: $interaction-area-marker-size; width: $interaction-area-marker-size; opacity: 1}
164
+ 100% { height: 2 * $interaction-area-marker-size; width: 2 * $interaction-area-marker-size; opacity: 0}
165
+ }
@@ -0,0 +1,48 @@
1
+ $border-radius : 4px;
2
+
3
+ .cld-video-player {
4
+
5
+ .vp-theme-button {
6
+ position: relative;
7
+ height: 40px;
8
+ font-size: 16px;
9
+ border-radius: $border-radius;
10
+ padding: 0 20px;
11
+ overflow: hidden;
12
+
13
+ &.theme-transparent-white {
14
+ background-color: rgba(255, 255, 254, 0.18);
15
+
16
+ &:hover {
17
+ background-color: rgba(255, 255, 254, 0.28);
18
+ }
19
+
20
+ .vp-loading-bar {
21
+ background-color: rgba(255, 255, 254, 0.22);
22
+ }
23
+
24
+ }
25
+
26
+ .vp-loading-bar {
27
+ position: absolute;
28
+ top:0;
29
+ left: 0;
30
+ height: 100%;
31
+ width: 100%;
32
+ transition: width;
33
+ animation-name: loading;
34
+ }
35
+
36
+ &:hover{
37
+ cursor: pointer;
38
+ }
39
+
40
+ }
41
+
42
+ }
43
+
44
+
45
+ @keyframes loading {
46
+ from { width: 0; }
47
+ to { width: 100%; }
48
+ }