Elementor Essential Addons - Version 3.6.0

Version Description

  • 14/11/2019 =
  • Added : Sticky Video element
  • Added : BetterDocs Category Grid
  • Added : BetterDocs Category Box
  • Added : BetterDocs Search
  • Fixed : Style breaking issue after update
  • Fixed : Fixed: EA Tooltip | Longer content changes the alignment to center
  • Few minor bugfix and improvements
Download this release

Release Info

Developer re_enter_rupok
Plugin Icon 128x128 Elementor Essential Addons
Version 3.6.0
Comparing to
See all releases

Code changes from version 3.5.2 to 3.6.0

assets/admin/css/admin.css CHANGED
@@ -34,9 +34,9 @@
34
  align-items: center;
35
  }
36
  .eael-header-bar .eael-admin-logo-inline {
37
- width: 40px;
38
- padding: 5px 15px;
39
- margin-right: 25px;
40
  }
41
  .eael-header-bar .eael-admin-logo-inline img {
42
  width: 100%;
@@ -220,31 +220,31 @@ textarea.eael-form-control {
220
  display: none;
221
  }
222
  .eael-checkbox label {
223
- width: 2em;
224
- height: 1em;
225
  position: relative;
226
  cursor: pointer;
227
  display: block;
228
  }
229
- .eael-checkbox label:before {
230
  content: "";
231
  position: absolute;
232
- width: 2em;
233
- height: 1em;
234
- left: 0.1em;
235
  transition: background 0.1s 0.1s ease;
236
  background: #cbcfd0;
237
  border: 1px solid #cbcfd0;
238
  border-radius: 50px;
239
  }
240
- .eael-checkbox label:after {
241
  content: "";
242
  position: absolute;
243
- width: 0.8em;
244
- height: 0.8em;
245
  border-radius: 100%;
246
- left: 0.2em;
247
- top: 0.14em;
248
  transition: all 0.2s ease;
249
  box-shadow: 0 0 0 5px #fcfff4 inset;
250
  background: #cbcfd0;
@@ -260,6 +260,11 @@ textarea.eael-form-control {
260
  background: #ffffff;
261
  animation: switch-on 0.3s ease-out;
262
  }
 
 
 
 
 
263
 
264
  @keyframes switch-on {
265
  50% {
@@ -862,25 +867,25 @@ button.eael-btn.eael-global-control-disable:hover {
862
  }
863
  .eael-elements-info > a.eael-element-info-link {
864
  position: relative;
865
- width: 17px;
866
- height: 16px;
867
- border: 1px solid rgba(0,0,0, .15);
868
- border-radius: 20px;
869
- padding: 4px;
870
  display: flex;
871
  margin: 0 1px;
872
  text-decoration: none;
873
  color: #3a3c40;
874
  opacity: .75;
 
 
875
  }
876
  .eael-elements-info > a.eael-element-info-link:hover{
877
  opacity: 1;
878
  }
879
  .eael-elements-info img, .eael-elements-info svg {
880
- width: 18px;
 
881
  }
882
  .eael-element-info-link span.dashicons {
883
- font-size: 17px;
 
884
  }
885
  .eael-elements-info .eael-info-tooltip {
886
  background-color: #3a3c40;
34
  align-items: center;
35
  }
36
  .eael-header-bar .eael-admin-logo-inline {
37
+ width: 60px;
38
+ padding: 5px 10px;
39
+ margin-right: 5px;
40
  }
41
  .eael-header-bar .eael-admin-logo-inline img {
42
  width: 100%;
220
  display: none;
221
  }
222
  .eael-checkbox label {
223
+ width: 48px;
224
+ height: 24px;
225
  position: relative;
226
  cursor: pointer;
227
  display: block;
228
  }
229
+ .eael-checkbox label::before {
230
  content: "";
231
  position: absolute;
232
+ width: 48px;
233
+ height: 24px;
234
+ left: 2px;
235
  transition: background 0.1s 0.1s ease;
236
  background: #cbcfd0;
237
  border: 1px solid #cbcfd0;
238
  border-radius: 50px;
239
  }
240
+ .eael-checkbox label::after {
241
  content: "";
242
  position: absolute;
243
+ width: 18px;
244
+ height: 17px;
245
  border-radius: 100%;
246
+ left: 5px;
247
+ top: 3px;
248
  transition: all 0.2s ease;
249
  box-shadow: 0 0 0 5px #fcfff4 inset;
250
  background: #cbcfd0;
260
  background: #ffffff;
261
  animation: switch-on 0.3s ease-out;
262
  }
263
+ .eael-checkbox input[type="checkbox"]:checked + label::after {
264
+ left: 29px;
265
+ background: #ffffff;
266
+ animation: switch-on 0.3s ease-out;
267
+ }
268
 
269
  @keyframes switch-on {
270
  50% {
867
  }
868
  .eael-elements-info > a.eael-element-info-link {
869
  position: relative;
870
+ width: 18px;
 
 
 
 
871
  display: flex;
872
  margin: 0 1px;
873
  text-decoration: none;
874
  color: #3a3c40;
875
  opacity: .75;
876
+ align-items: center;
877
+ justify-content: center;
878
  }
879
  .eael-elements-info > a.eael-element-info-link:hover{
880
  opacity: 1;
881
  }
882
  .eael-elements-info img, .eael-elements-info svg {
883
+ width: 16px;
884
+ fill: #3a3c40;
885
  }
886
  .eael-element-info-link span.dashicons {
887
+ font-size: 15px;
888
+ margin-top: 6px;
889
  }
890
  .eael-elements-info .eael-info-tooltip {
891
  background-color: #3a3c40;
assets/admin/js/admin-bar.js CHANGED
@@ -68,4 +68,4 @@
68
  console.log('This page has no widget from EA, Regenerate Assets from Dashboard');
69
  }
70
  });
71
- })(jQuery);
68
  console.log('This page has no widget from EA, Regenerate Assets from Dashboard');
69
  }
70
  });
71
+ })(jQuery);
assets/admin/js/admin.js CHANGED
@@ -191,4 +191,4 @@
191
  }
192
  });
193
  });
194
- })(jQuery);
191
  }
192
  });
193
  });
194
+ })(jQuery);
assets/front-end/css/eael.css CHANGED
@@ -1,3 +1,4 @@
 
1
  /*------------------------------*/
2
  /* 31. Advance Accordion
3
  /*------------------------------*/
@@ -269,6 +270,60 @@
269
  }
270
  }
271
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
272
  /*--------------------------*/
273
  /* 19. Call To Action
274
  /*-------------------------*/
@@ -583,60 +638,6 @@
583
  height: 20px;
584
  }
585
 
586
- /* ----------------------------------------- */
587
- /* 22. Caldera Contact Form Styler
588
- /* ----------------------------------------- */
589
- .eael-caldera-form-align-left,
590
- .eael-caldera-form-btn-align-left {
591
- text-align: left;
592
- }
593
-
594
- .eael-caldera-form-align-right,
595
- .eael-caldera-form-btn-align-right {
596
- text-align: right;
597
- }
598
-
599
- .eael-caldera-form-align-center,
600
- .eael-caldera-form-btn-align-center {
601
- text-align: center;
602
- }
603
-
604
- .eael-caldera-form .control-label {
605
- display: none;
606
- }
607
-
608
- .eael-caldera-form-labels-yes .control-label {
609
- display: block;
610
- }
611
-
612
- .eael-caldera-form-button-center .form-group input[type=button],
613
- .eael-caldera-form-button-center .form-group input[type=submit] {
614
- display: block;
615
- margin: 0 auto;
616
- }
617
-
618
- .eael-caldera-form-button-right .form-group input[type=button],
619
- .eael-caldera-form-button-right .form-group input[type=submit] {
620
- float: right;
621
- }
622
-
623
- .eael-caldera-form .intl-tel-input {
624
- display: inherit;
625
- }
626
-
627
- .eael-custom-radio-checkbox .caldera-grid input[type=checkbox],
628
- .eael-custom-radio-checkbox .caldera-grid input[type=radio] {
629
- border-style: solid;
630
- border-width: 0;
631
- padding: 3px;
632
- -webkit-appearance: none;
633
- }
634
-
635
- .eael-caldera-form-button-full-width .form-group input[type=submit],
636
- .eael-caldera-form-button-full-width .form-group input[type=button] {
637
- width: 100%;
638
- }
639
-
640
  /*--------------------------------*/
641
  /* 11. Contact Form 7 Styles
642
  /*--------------------------------*/
@@ -1100,6 +1101,52 @@
1100
  margin-left: 5px;
1101
  }
1102
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1103
  table.eael-data-table thead .sorting, table.eael-data-table thead .sorting_desc, table.eael-data-table thead .sorting_asc {
1104
  position: relative;
1105
  z-index: 0;
@@ -1379,52 +1426,6 @@ table.eael-data-table .sorting_asc.sorting-none:after {
1379
  text-align: center;
1380
  }
1381
 
1382
- /* -------------------------------- */
1383
- /* 20. Dual Color Heading
1384
- /* -------------------------------- */
1385
- .eael-dual-header {
1386
- display: block;
1387
- margin-bottom: 50px;
1388
- }
1389
-
1390
- .eael-dual-header .title,
1391
- .eael-dual-header .title span {
1392
- font-size: 36px;
1393
- font-weight: 700;
1394
- text-transform: uppercase;
1395
- line-height: 48px;
1396
- margin: 10px 0px;
1397
- }
1398
-
1399
- .eael-dual-header .subtext {
1400
- font-size: 16px;
1401
- display: block;
1402
- }
1403
-
1404
- .eael-dual-header i {
1405
- display: block;
1406
- padding: 0px;
1407
- margin: 20px 0px 10px 0px;
1408
- font-size: 36px;
1409
- }
1410
-
1411
- .eael-dual-header .title span.lead {
1412
- color: #1abc9c;
1413
- }
1414
-
1415
- /*--- Builder Related Css ---*/
1416
- .eael-dual-header-content-align-center {
1417
- text-align: center;
1418
- }
1419
-
1420
- .eael-dual-header-content-align-left {
1421
- text-align: left;
1422
- }
1423
-
1424
- .eael-dual-header-content-align-right {
1425
- text-align: right;
1426
- }
1427
-
1428
  .elementor-panel .pro-feature, .elementor-panel .pro-feature a {
1429
  color: #a4afb7;
1430
  text-transform: uppercase;
@@ -1699,61 +1700,6 @@ table.eael-data-table .sorting_asc.sorting-none:after {
1699
  display: none;
1700
  }
1701
 
1702
- .eael-fancy-text-container p {
1703
- margin: 0;
1704
- }
1705
-
1706
- .eael-fancy-text-strings {
1707
- display: none;
1708
- }
1709
-
1710
- .eael-fancy-text-prefix,
1711
- .eael-fancy-text-suffix {
1712
- display: inline-block;
1713
- }
1714
-
1715
- .morphext > .animated {
1716
- display: inline-block;
1717
- }
1718
-
1719
- .typed-cursor {
1720
- opacity: 1;
1721
- -webkit-animation: blink_cursor 0.7s infinite;
1722
- animation: blink_cursor 0.7s infinite;
1723
- }
1724
-
1725
- @keyframes blink_cursor {
1726
- 0% {
1727
- opacity: 1;
1728
- }
1729
- 50% {
1730
- opacity: 0;
1731
- }
1732
- 100% {
1733
- opacity: 1;
1734
- }
1735
- }
1736
- @-webkit-keyframes blink_cursor {
1737
- 0% {
1738
- opacity: 1;
1739
- }
1740
- 50% {
1741
- opacity: 0;
1742
- }
1743
- 100% {
1744
- opacity: 1;
1745
- }
1746
- }
1747
- .eael-fancy-text-container.style-2 {
1748
- font-size: 24px;
1749
- }
1750
-
1751
- .eael-fancy-text-container.style-2 .eael-fancy-text-strings {
1752
- background: #ff5544;
1753
- color: #fff;
1754
- padding: 10px 25px;
1755
- }
1756
-
1757
  /*----------------------------*/
1758
  /* 35. Feature List
1759
  /*----------------------------*/
@@ -3644,6 +3590,61 @@ a.eael-gallery-load-more, a.eael-gallery-load-more:hover {
3644
  overflow: hidden;
3645
  }
3646
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3647
  .eael-fluent-form-wrapper label.ff-el-form-check-label {
3648
  display: flex;
3649
  align-items: center;
@@ -3823,6 +3824,11 @@ a.eael-gallery-load-more, a.eael-gallery-load-more:hover {
3823
  display: inline-block;
3824
  }
3825
 
 
 
 
 
 
3826
  /*----------------------*/
3827
  /* 14. Gravity Form
3828
  /*----------------------*/
@@ -4169,6 +4175,77 @@ a.eael-gallery-load-more, a.eael-gallery-load-more:hover {
4169
  border-radius: 15px;
4170
  }
4171
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4172
  /* ------------------------ */
4173
  /* 26. Magnific Popup
4174
  /* ------------------------ */
@@ -4627,77 +4704,6 @@ button.mfp-close:hover {
4627
  }
4628
  }
4629
 
4630
- /*----------------------*/
4631
- /* 13. Ninja Form Styles
4632
- /*----------------------*/
4633
- .eael-ninja-container input,
4634
- .eael-ninja-container textarea {
4635
- height: auto;
4636
- padding: 10px;
4637
- }
4638
-
4639
- .eael-contact-form-align-center .eael-ninja-container,
4640
- .eael-contact-form-btn-align-center .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4641
- margin-left: auto !important;
4642
- margin-right: auto !important;
4643
- display: block;
4644
- float: none;
4645
- }
4646
-
4647
- .eael-contact-form-align-left .eael-ninja-container,
4648
- .eael-contact-form-btn-align-left .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4649
- float: left;
4650
- width: auto;
4651
- }
4652
-
4653
- .eael-contact-form-align-right .eael-ninja-container,
4654
- .eael-contact-form-btn-align-right .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4655
- float: right;
4656
- width: auto;
4657
- }
4658
-
4659
- .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="text"],
4660
- .eael-ninja-container .nf-field .nf-field-element input[type="password"],
4661
- .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="email"],
4662
- .eael-ninja-container .nf-field .nf-field-element input[type="url"],
4663
- .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="number"],
4664
- .eael-ninja-container .nf-field .nf-field-element textarea {
4665
- max-width: 100%;
4666
- }
4667
-
4668
- .eael-ninja-form .nf-form-title {
4669
- display: none;
4670
- }
4671
-
4672
- .eael-ninja-form-title-yes .nf-form-title {
4673
- display: block;
4674
- }
4675
-
4676
- .eael-ninja-form .title-description-hide .nf-form-title {
4677
- display: none;
4678
- }
4679
-
4680
- .eael-ninja-form.title-description-hide .nf-form-title {
4681
- display: none;
4682
- }
4683
-
4684
- .eael-ninja-form .nf-field-label {
4685
- display: none;
4686
- }
4687
-
4688
- .eael-ninja-form-labels-yes .nf-field-label {
4689
- display: block;
4690
- }
4691
-
4692
- .eael-ninja-form .submit-container input[type=button] {
4693
- border: 0;
4694
- border-radius: 0;
4695
- }
4696
-
4697
- .eael-ninja-form-button-full-width .submit-container input[type=button] {
4698
- width: 100%;
4699
- }
4700
-
4701
  /*-----------------------------*/
4702
  /* 15. Post Grid Style
4703
  /*-----------------------------*/
@@ -6670,6 +6676,220 @@ div.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow {
6670
  transition: width 50ms ease;
6671
  }
6672
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6673
  /*----------------------------*/
6674
  /* 07. Team Members Styles
6675
  /*----------------------------*/
@@ -7176,7 +7396,6 @@ span.eael-testimonial-quote {
7176
  position: relative;
7177
  display: inline-block;
7178
  min-width: 150px;
7179
- text-align: center;
7180
  padding: 12px 24px;
7181
  font-size: .93rem;
7182
  color: #333;
@@ -7191,7 +7410,6 @@ span.eael-testimonial-quote {
7191
  visibility: hidden;
7192
  background-color: black;
7193
  color: #fff;
7194
- text-align: center;
7195
  border-radius: 4px;
7196
  padding: 10px;
7197
  position: absolute;
@@ -7199,6 +7417,9 @@ span.eael-testimonial-quote {
7199
  font-size: .93rem;
7200
  line-height: 1.3;
7201
  }
 
 
 
7202
 
7203
  .eael-tooltip .eael-tooltip-text::after {
7204
  content: "";
@@ -7396,6 +7617,21 @@ span.eael-testimonial-quote {
7396
  top: 100%;
7397
  }
7398
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7399
 
7400
  .eael-twitter-feed::before, .eael-twitter-feed::after {
7401
  content: "";
@@ -7568,3 +7804,5 @@ span.eael-testimonial-quote {
7568
  .eael-wpforms-form-button-full-width .wpforms-submit-container .wpforms-submit {
7569
  width: 100%;
7570
  }
 
 
1
+
2
  /*------------------------------*/
3
  /* 31. Advance Accordion
4
  /*------------------------------*/
270
  }
271
  }
272
 
273
+ /* ----------------------------------------- */
274
+ /* 22. Caldera Contact Form Styler
275
+ /* ----------------------------------------- */
276
+ .eael-caldera-form-align-left,
277
+ .eael-caldera-form-btn-align-left {
278
+ text-align: left;
279
+ }
280
+
281
+ .eael-caldera-form-align-right,
282
+ .eael-caldera-form-btn-align-right {
283
+ text-align: right;
284
+ }
285
+
286
+ .eael-caldera-form-align-center,
287
+ .eael-caldera-form-btn-align-center {
288
+ text-align: center;
289
+ }
290
+
291
+ .eael-caldera-form .control-label {
292
+ display: none;
293
+ }
294
+
295
+ .eael-caldera-form-labels-yes .control-label {
296
+ display: block;
297
+ }
298
+
299
+ .eael-caldera-form-button-center .form-group input[type=button],
300
+ .eael-caldera-form-button-center .form-group input[type=submit] {
301
+ display: block;
302
+ margin: 0 auto;
303
+ }
304
+
305
+ .eael-caldera-form-button-right .form-group input[type=button],
306
+ .eael-caldera-form-button-right .form-group input[type=submit] {
307
+ float: right;
308
+ }
309
+
310
+ .eael-caldera-form .intl-tel-input {
311
+ display: inherit;
312
+ }
313
+
314
+ .eael-custom-radio-checkbox .caldera-grid input[type=checkbox],
315
+ .eael-custom-radio-checkbox .caldera-grid input[type=radio] {
316
+ border-style: solid;
317
+ border-width: 0;
318
+ padding: 3px;
319
+ -webkit-appearance: none;
320
+ }
321
+
322
+ .eael-caldera-form-button-full-width .form-group input[type=submit],
323
+ .eael-caldera-form-button-full-width .form-group input[type=button] {
324
+ width: 100%;
325
+ }
326
+
327
  /*--------------------------*/
328
  /* 19. Call To Action
329
  /*-------------------------*/
638
  height: 20px;
639
  }
640
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
641
  /*--------------------------------*/
642
  /* 11. Contact Form 7 Styles
643
  /*--------------------------------*/
1101
  margin-left: 5px;
1102
  }
1103
 
1104
+ /* -------------------------------- */
1105
+ /* 20. Dual Color Heading
1106
+ /* -------------------------------- */
1107
+ .eael-dual-header {
1108
+ display: block;
1109
+ margin-bottom: 50px;
1110
+ }
1111
+
1112
+ .eael-dual-header .title,
1113
+ .eael-dual-header .title span {
1114
+ font-size: 36px;
1115
+ font-weight: 700;
1116
+ text-transform: uppercase;
1117
+ line-height: 48px;
1118
+ margin: 10px 0px;
1119
+ }
1120
+
1121
+ .eael-dual-header .subtext {
1122
+ font-size: 16px;
1123
+ display: block;
1124
+ }
1125
+
1126
+ .eael-dual-header i {
1127
+ display: block;
1128
+ padding: 0px;
1129
+ margin: 20px 0px 10px 0px;
1130
+ font-size: 36px;
1131
+ }
1132
+
1133
+ .eael-dual-header .title span.lead {
1134
+ color: #1abc9c;
1135
+ }
1136
+
1137
+ /*--- Builder Related Css ---*/
1138
+ .eael-dual-header-content-align-center {
1139
+ text-align: center;
1140
+ }
1141
+
1142
+ .eael-dual-header-content-align-left {
1143
+ text-align: left;
1144
+ }
1145
+
1146
+ .eael-dual-header-content-align-right {
1147
+ text-align: right;
1148
+ }
1149
+
1150
  table.eael-data-table thead .sorting, table.eael-data-table thead .sorting_desc, table.eael-data-table thead .sorting_asc {
1151
  position: relative;
1152
  z-index: 0;
1426
  text-align: center;
1427
  }
1428
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1429
  .elementor-panel .pro-feature, .elementor-panel .pro-feature a {
1430
  color: #a4afb7;
1431
  text-transform: uppercase;
1700
  display: none;
1701
  }
1702
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1703
  /*----------------------------*/
1704
  /* 35. Feature List
1705
  /*----------------------------*/
3590
  overflow: hidden;
3591
  }
3592
 
3593
+ .eael-fancy-text-container p {
3594
+ margin: 0;
3595
+ }
3596
+
3597
+ .eael-fancy-text-strings {
3598
+ display: none;
3599
+ }
3600
+
3601
+ .eael-fancy-text-prefix,
3602
+ .eael-fancy-text-suffix {
3603
+ display: inline-block;
3604
+ }
3605
+
3606
+ .morphext > .animated {
3607
+ display: inline-block;
3608
+ }
3609
+
3610
+ .typed-cursor {
3611
+ opacity: 1;
3612
+ -webkit-animation: blink_cursor 0.7s infinite;
3613
+ animation: blink_cursor 0.7s infinite;
3614
+ }
3615
+
3616
+ @keyframes blink_cursor {
3617
+ 0% {
3618
+ opacity: 1;
3619
+ }
3620
+ 50% {
3621
+ opacity: 0;
3622
+ }
3623
+ 100% {
3624
+ opacity: 1;
3625
+ }
3626
+ }
3627
+ @-webkit-keyframes blink_cursor {
3628
+ 0% {
3629
+ opacity: 1;
3630
+ }
3631
+ 50% {
3632
+ opacity: 0;
3633
+ }
3634
+ 100% {
3635
+ opacity: 1;
3636
+ }
3637
+ }
3638
+ .eael-fancy-text-container.style-2 {
3639
+ font-size: 24px;
3640
+ }
3641
+
3642
+ .eael-fancy-text-container.style-2 .eael-fancy-text-strings {
3643
+ background: #ff5544;
3644
+ color: #fff;
3645
+ padding: 10px 25px;
3646
+ }
3647
+
3648
  .eael-fluent-form-wrapper label.ff-el-form-check-label {
3649
  display: flex;
3650
  align-items: center;
3824
  display: inline-block;
3825
  }
3826
 
3827
+ .elementor-lightbox .dialog-widget-content {
3828
+ width: 100%;
3829
+ height: 100%;
3830
+ }
3831
+
3832
  /*----------------------*/
3833
  /* 14. Gravity Form
3834
  /*----------------------*/
4175
  border-radius: 15px;
4176
  }
4177
 
4178
+ /*----------------------*/
4179
+ /* 13. Ninja Form Styles
4180
+ /*----------------------*/
4181
+ .eael-ninja-container input,
4182
+ .eael-ninja-container textarea {
4183
+ height: auto;
4184
+ padding: 10px;
4185
+ }
4186
+
4187
+ .eael-contact-form-align-center .eael-ninja-container,
4188
+ .eael-contact-form-btn-align-center .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4189
+ margin-left: auto !important;
4190
+ margin-right: auto !important;
4191
+ display: block;
4192
+ float: none;
4193
+ }
4194
+
4195
+ .eael-contact-form-align-left .eael-ninja-container,
4196
+ .eael-contact-form-btn-align-left .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4197
+ float: left;
4198
+ width: auto;
4199
+ }
4200
+
4201
+ .eael-contact-form-align-right .eael-ninja-container,
4202
+ .eael-contact-form-btn-align-right .eael-ninja-container .nf-field .nf-field-element input[type="button"] {
4203
+ float: right;
4204
+ width: auto;
4205
+ }
4206
+
4207
+ .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="text"],
4208
+ .eael-ninja-container .nf-field .nf-field-element input[type="password"],
4209
+ .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="email"],
4210
+ .eael-ninja-container .nf-field .nf-field-element input[type="url"],
4211
+ .eael-ninja-container ul.wpuf-form li .wpuf-fields input[type="number"],
4212
+ .eael-ninja-container .nf-field .nf-field-element textarea {
4213
+ max-width: 100%;
4214
+ }
4215
+
4216
+ .eael-ninja-form .nf-form-title {
4217
+ display: none;
4218
+ }
4219
+
4220
+ .eael-ninja-form-title-yes .nf-form-title {
4221
+ display: block;
4222
+ }
4223
+
4224
+ .eael-ninja-form .title-description-hide .nf-form-title {
4225
+ display: none;
4226
+ }
4227
+
4228
+ .eael-ninja-form.title-description-hide .nf-form-title {
4229
+ display: none;
4230
+ }
4231
+
4232
+ .eael-ninja-form .nf-field-label {
4233
+ display: none;
4234
+ }
4235
+
4236
+ .eael-ninja-form-labels-yes .nf-field-label {
4237
+ display: block;
4238
+ }
4239
+
4240
+ .eael-ninja-form .submit-container input[type=button] {
4241
+ border: 0;
4242
+ border-radius: 0;
4243
+ }
4244
+
4245
+ .eael-ninja-form-button-full-width .submit-container input[type=button] {
4246
+ width: 100%;
4247
+ }
4248
+
4249
  /* ------------------------ */
4250
  /* 26. Magnific Popup
4251
  /* ------------------------ */
4704
  }
4705
  }
4706
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4707
  /*-----------------------------*/
4708
  /* 15. Post Grid Style
4709
  /*-----------------------------*/
6676
  transition: width 50ms ease;
6677
  }
6678
 
6679
+ /* Overlay Styles */
6680
+ .eaelsv-overlay {
6681
+ position: absolute;
6682
+ display: block;
6683
+ width: 100%;
6684
+ height: 100%;
6685
+ top: 0;
6686
+ left: 0;
6687
+ right: 0;
6688
+ bottom: 0;
6689
+ background-color: rgba(0, 0, 0, 0.5);
6690
+ z-index: 4;
6691
+ cursor: pointer;
6692
+ background-size: cover;
6693
+ background-position: 50%;
6694
+ text-align: center;
6695
+ overflow: hidden;
6696
+ }
6697
+
6698
+ .eaelsv-overlay-icon {
6699
+ position: absolute;
6700
+ top: 50%;
6701
+ left: 50%;
6702
+ font-size: 90px;
6703
+ color: white;
6704
+ transform: translate(-50%, -50%);
6705
+ -ms-transform: translate(-50%, -50%);
6706
+ }
6707
+
6708
+ /* Plyr CSS Started */
6709
+ .plyr__controls button {
6710
+ box-shadow: none !important;
6711
+ }
6712
+
6713
+ .plyr__controls button:hover {
6714
+ box-shadow: none !important;
6715
+ }
6716
+
6717
+ .plyr--video {
6718
+ /*height:100%;*/
6719
+ }
6720
+
6721
+ .plyr__video-embed {
6722
+ /*
6723
+ height:100%!important;
6724
+ padding-bottom:0px!important;
6725
+ */
6726
+ }
6727
+
6728
+ .plyr__controls {
6729
+ display: none !important;
6730
+ }
6731
+
6732
+ /* Plyr CSS Ended */
6733
+ .eael-sticky-video-wrapper {
6734
+ position: relative;
6735
+ width: 100%;
6736
+ min-height: 200px;
6737
+ margin: 0px;
6738
+ padding: 0px;
6739
+ transition: 0.5s;
6740
+ text-align: left;
6741
+ overflow: visible;
6742
+ }
6743
+
6744
+ .eael-sticky-video-player2 {
6745
+ /*height:100%;*/
6746
+ min-height: 20px;
6747
+ overflow: visible;
6748
+ }
6749
+
6750
+ /*
6751
+ .eael-sticky-video-wrapper > .eael-sticky-video-player2 > iframe,
6752
+ .eael-sticky-video-wrapper > .eael-sticky-video-player2 > video,
6753
+ .eael-sticky-video-wrapper iframe,
6754
+ .eael-sticky-video-wrapper video {
6755
+ position: relative;
6756
+ margin:0px; padding:0px;
6757
+ height:100%;
6758
+ border: 0;
6759
+ line-height: 1;
6760
+ }
6761
+
6762
+ .eael-sticky-video-wrapper > .eael-sticky-video-player > video{
6763
+ z-index:99999;
6764
+ }
6765
+
6766
+ .eael-sticky-video-player {
6767
+ position: absolute;
6768
+ top: 0;
6769
+ left: 0;
6770
+ width: 100%;
6771
+ height: 100%;
6772
+ background-size: cover;
6773
+ background-position: 50%;
6774
+ cursor: pointer;
6775
+ text-align: center;
6776
+ overflow: hidden;
6777
+ }
6778
+
6779
+ .eael-sticky-video-player1 {
6780
+ position: absolute;
6781
+ top: 0;
6782
+ left: 0;
6783
+ width: 100%;
6784
+ height: 100%;
6785
+ background-size: cover;
6786
+ background-position: 50%;
6787
+ cursor: pointer;
6788
+ text-align: center;
6789
+ background:#009900;
6790
+ z-index:1000;
6791
+ opacity:0.5;
6792
+ }
6793
+ */
6794
+ .eael-sticky-video-player2.out {
6795
+ position: fixed;
6796
+ z-index: 999;
6797
+ border: 0 !important;
6798
+ border-radius: 0px !important;
6799
+ height: 200px;
6800
+ width: 300px;
6801
+ }
6802
+
6803
+ .eael-sticky-video-wrapper.out .eael-sticky-video-player2,
6804
+ .eael-sticky-video-wrapper.out .eael-sticky-video-player {
6805
+ border-radius: 0px !important;
6806
+ }
6807
+
6808
+ .eael-sticky-video-player2.in {
6809
+ position: relative;
6810
+ margin: 0px;
6811
+ padding: 0px;
6812
+ height: 100%;
6813
+ border: 0;
6814
+ line-height: 1;
6815
+ }
6816
+
6817
+ /*
6818
+ .eael-sticky-video-player img {
6819
+ display: block;
6820
+ width: 100%;
6821
+ }
6822
+ */
6823
+ .owp-play {
6824
+ position: absolute;
6825
+ top: 50%;
6826
+ left: 50%;
6827
+ transform: translateX(-50%) translateY(-50%);
6828
+ }
6829
+
6830
+ .owp-play i {
6831
+ font-size: 100px;
6832
+ color: #fff;
6833
+ opacity: 0.8;
6834
+ text-shadow: 1px 0 6px rgba(0, 0, 0, 0.3);
6835
+ transition: all .5s;
6836
+ }
6837
+
6838
+ .eael-sticky-video-player:hover .owp-play i {
6839
+ opacity: 1;
6840
+ }
6841
+
6842
+ /*
6843
+ .eaelsv-sticky-player {
6844
+ height: 200px;
6845
+ width: 300px;
6846
+ position: fixed;
6847
+ bottom: 50px;
6848
+ right: 50px;
6849
+ border: 0px solid #009900;
6850
+ background-size: cover;
6851
+ z-index: 1000;
6852
+ background: transparent;
6853
+ display:none!important;
6854
+ }
6855
+ .eaelsv-sticky-player.eaelsv-display-player{
6856
+ display:block!important;
6857
+ -webkit-animation: fadeIn 1s;
6858
+ animation: fadeIn 1s;
6859
+ }
6860
+ */
6861
+ /* === Close Icon === */
6862
+ .eaelsv-sticky-player-close {
6863
+ position: absolute;
6864
+ right: -25px;
6865
+ top: -36px;
6866
+ display: none;
6867
+ padding: 7px;
6868
+ font-size: 24px;
6869
+ z-index: 9999;
6870
+ cursor: pointer;
6871
+ box-sizing: content-box;
6872
+ overflow: visible;
6873
+ }
6874
+
6875
+ .eaelsv-sticky-player-close:hover {
6876
+ color: #009900;
6877
+ }
6878
+
6879
+ .eaelsv-sticky-player-close:before, .eaelsv-sticky-player-close:after {
6880
+ position: absolute;
6881
+ left: 15px;
6882
+ background-color: #333;
6883
+ }
6884
+
6885
+ .eaelsv-sticky-player-close:before {
6886
+ transform: rotate(45deg);
6887
+ }
6888
+
6889
+ .eaelsv-sticky-player-close:after {
6890
+ transform: rotate(-45deg);
6891
+ }
6892
+
6893
  /*----------------------------*/
6894
  /* 07. Team Members Styles
6895
  /*----------------------------*/
7396
  position: relative;
7397
  display: inline-block;
7398
  min-width: 150px;
 
7399
  padding: 12px 24px;
7400
  font-size: .93rem;
7401
  color: #333;
7410
  visibility: hidden;
7411
  background-color: black;
7412
  color: #fff;
 
7413
  border-radius: 4px;
7414
  padding: 10px;
7415
  position: absolute;
7417
  font-size: .93rem;
7418
  line-height: 1.3;
7419
  }
7420
+ .eael-tooltip .eael-tooltip-text p {
7421
+ margin: 0;
7422
+ }
7423
 
7424
  .eael-tooltip .eael-tooltip-text::after {
7425
  content: "";
7617
  top: 100%;
7618
  }
7619
  }
7620
+ .eael-tooltip-text-align-left .eael-tooltip-text {
7621
+ text-align: left;
7622
+ }
7623
+
7624
+ .eael-tooltip-text-align-right .eael-tooltip-text {
7625
+ text-align: right;
7626
+ }
7627
+
7628
+ .eael-tooltip-text-align-center .eael-tooltip-text {
7629
+ text-align: center;
7630
+ }
7631
+
7632
+ .eael-tooltip-text-align-justify .eael-tooltip-text {
7633
+ text-align: justify;
7634
+ }
7635
 
7636
  .eael-twitter-feed::before, .eael-twitter-feed::after {
7637
  content: "";
7804
  .eael-wpforms-form-button-full-width .wpforms-submit-container .wpforms-submit {
7805
  width: 100%;
7806
  }
7807
+
7808
+ @keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4a5764;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr__control--overlaid{background:rgba(0,179,255,.8);border:0;border-radius:100%;color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#00b3ff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:2.5px}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:2.5px}.plyr__controls .plyr__controls__item.plyr__time{padding:0 5px}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls .plyr__controls__item.plyr__volume{padding-right:5px}.plyr__controls .plyr__controls__item.plyr__volume:first-child{padding-right:0}.plyr__controls:empty{display:none}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4a5764;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5764;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(74,87,100,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(74,87,100,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#c1c9d1;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#00b3ff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:26px;color:#00b3ff;display:block;height:19px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;height:5px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__progress{left:6.5px;margin-right:13px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-right:-6.5px;width:calc(100% + 13px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;left:0;margin-top:-2.5px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(193,201,209,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,41,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,41,47,.6) 50%,rgba(35,41,47,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,201,209,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(35,41,47,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;left:0;margin:-2.5px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);margin-bottom:10px;opacity:0;padding:3px;pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c9d1;border-radius:2px;overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:2px;color:#fff;font-size:14px;padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}
assets/front-end/css/eael.min.css CHANGED
@@ -1,3 +1,4 @@
 
1
  .eael-adv-accordion{width:auto;height:auto;transition:all .3s ease-in-out}.eael-adv-accordion .eael-accordion-list .eael-accordion-header{padding:15px;border:1px solid rgba(0,0,0,.02);font-size:1rem;font-weight:600;line-height:1;transition:all .3s ease-in-out;display:flex;justify-content:space-between;align-items:center;cursor:pointer}.eael-adv-accordion .eael-accordion-list .eael-accordion-header .fa-toggle{transform:rotate(0);z-index:10;transition:all .3s ease-in-out}.eael-adv-accordion .eael-accordion-list .eael-accordion-header.active .fa-toggle{transform:rotate(90deg);z-index:10;transition:all .3s ease-in-out}.fa-accordion-icon{display:inline-block;margin-right:10px}.eael-adv-accordion .eael-accordion-list .eael-accordion-content{display:none;border:1px solid #eee;padding:15px;box-sizing:border-box;font-size:1rem;line-height:1.7}.eael-adv-accordion .eael-accordion-list .eael-accordion-content p{margin:0}.eael-adv-accordion .eael-accordion-list .eael-accordion-content.active{display:block}@-webkit-keyframes rotate-90{0%{transform:rotateY(0)}100%{transform:rotateY(-180deg)}}@keyframes rotate-90{0%{transform:rotateY(0)}100%{transform:rotateY(-180deg)}}@-webkit-keyframes fadeIn{0%{opacity:1;transition:all .3s ease-in-out}100%{opacity:1;transition:all .3s ease-in-out}}@keyframes fadeIn{0%{opacity:1;transition:all .3s ease-in-out}100%{opacity:1;transition:all .3s ease-in-out}}
2
  .eael-advance-tabs{display:block}.eael-advance-tabs .eael-tabs-nav>ul{position:relative;padding:0;margin:0;list-style-type:none;display:flex;justify-content:flex-start;align-items:center;z-index:1}.eael-advance-tabs .eael-tabs-nav>ul li{position:relative;padding:1em 1.5em;flex:1 1 auto;cursor:pointer;display:flex;justify-content:center;align-items:center;text-align:center;background-color:#f1f1f1}.eael-advance-tabs .eael-tabs-nav>ul li:after{content:"";position:absolute;bottom:-10px;left:0;right:0;margin:0 auto;z-index:1;width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid #444;border-bottom:0;display:none}.eael-advance-tabs .eael-tabs-nav>ul li.active,.eael-advance-tabs .eael-tabs-nav>ul li.active-default,.eael-advance-tabs .eael-tabs-nav>ul li:hover{background-color:#444}.eael-advance-tabs.active-caret-on .eael-tabs-nav>ul li.active-default:after,.eael-advance-tabs.active-caret-on .eael-tabs-nav>ul li.active:after{display:none}.eael-advance-tabs .eael-tabs-nav>ul li.active-default:after,.eael-advance-tabs .eael-tabs-nav>ul li.active:after{display:block}.eael-tabs-content{display:flex;flex:1 1 auto}.eael-advance-tabs .eael-tabs-content>div{display:none;opacity:0}.eael-advance-tabs .eael-tabs-content>div.active,.eael-advance-tabs .eael-tabs-content>div.active-default{display:block;width:100%;padding:1em;opacity:1;-webkit-animation:fadeIn linear .3s;animation:fadeIn linear .3s}.eael-tab-inline-icon li a .fa{margin-right:10px;line-height:1}.eael-tab-top-icon li{display:flex;flex-wrap:wrap;text-align:center}.eael-tab-top-icon li a{display:flex;flex-wrap:wrap;text-align:center}.eael-tab-top-icon li .eael-tab-title,.eael-tab-top-icon li .fa{flex:1 1 100%;line-height:1}.eael-tab-top-icon li a .eael-tab-title{margin-top:10px}.eael-advance-tabs.eael-tabs-vertical{display:flex}.eael-advance-tabs.eael-tabs-vertical .eael-tabs-nav{flex:0 0 auto}.eael-advance-tabs.eael-tabs-vertical .eael-tabs-nav>ul{flex-flow:column wrap}.eael-advance-tabs.eael-tabs-vertical .eael-tabs-nav>ul>li{width:100%;justify-content:start}.eael-advance-tabs.eael-tabs-vertical .eael-tabs-nav>ul li::after{bottom:auto!important;right:-10px;top:calc(50% - 10px);left:auto!important;border-left:10px solid #444;border-right:0;border-top:10px solid transparent;border-bottom:10px solid transparent}@media only screen and (max-width:767px){.eael-advance-tabs .eael-tabs-nav>ul{flex-wrap:wrap}.eael-advance-tabs .eael-tabs-nav>ul li{flex:1 100%}.eael-advance-tabs.eael-tabs-vertical{flex-wrap:wrap}.eael-advance-tabs.eael-tabs-vertical div.eael-tabs-nav{flex:1 100%}.eael-advance-tabs.eael-tabs-vertical ul{flex:1 100%}.eael-advance-tabs.eael-tabs-vertical ul li{flex:1 100%}div.eael-advance-tabs.eael-tabs-vertical div.eael-tabs-nav>ul li::after{border-left-color:transparent!important;bottom:-20px!important;left:0!important;right:0!important;top:auto!important;border-left:10px solid transparent;border-right:10px solid transparent;border-top-color:#444!important}}
3
  .eael-caldera-form-align-left,.eael-caldera-form-btn-align-left{text-align:left}.eael-caldera-form-align-right,.eael-caldera-form-btn-align-right{text-align:right}.eael-caldera-form-align-center,.eael-caldera-form-btn-align-center{text-align:center}.eael-caldera-form .control-label{display:none}.eael-caldera-form-labels-yes .control-label{display:block}.eael-caldera-form-button-center .form-group input[type=button],.eael-caldera-form-button-center .form-group input[type=submit]{display:block;margin:0 auto}.eael-caldera-form-button-right .form-group input[type=button],.eael-caldera-form-button-right .form-group input[type=submit]{float:right}.eael-caldera-form .intl-tel-input{display:inherit}.eael-custom-radio-checkbox .caldera-grid input[type=checkbox],.eael-custom-radio-checkbox .caldera-grid input[type=radio]{border-style:solid;border-width:0;padding:3px;-webkit-appearance:none}.eael-caldera-form-button-full-width .form-group input[type=button],.eael-caldera-form-button-full-width .form-group input[type=submit]{width:100%}
@@ -8,15 +9,15 @@
8
  .eael-countdown-items{list-style:none;margin:0;padding:0;display:table;table-layout:fixed;width:100%}.eael-countdown-items>li{list-style:none;margin:0;padding:0;display:table-cell;position:relative}.eael-countdown-item>div{text-align:center;padding:20px}.eael-countdown-label-block .eael-countdown-digits,.eael-countdown-label-block .eael-countdown-label{display:block;text-align:center}.eael-countdown-digits{font-size:54px;line-height:1}.eael-countdown-label{font-size:18px;line-height:1;color:#fff}.eael-countdown-show-separator .eael-countdown-digits::after{content:":";position:absolute;left:98%;z-index:9999}.eael-countdown-item:last-child .eael-countdown-digits::after{display:none}.eael-countdown-items.style-1 .eael-countdown-item>div{background:#262625}
9
  .eael-creative-button-align-center{text-align:center}.eael-creative-button-wrapper{display:flex}.eael-creative-button{flex:0 0 auto;min-width:150px;text-align:center;vertical-align:middle;position:relative;z-index:1;border-radius:2px;padding:20px 30px;font-size:16px;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;-moz-osx-font-smoothing:grayscale}.eael-creative-button:focus{outline:0}.eael-creative-button--winona{overflow:hidden;padding:0!important;transition:border-color .3s,background-color .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--winona::after{content:attr(data-text);position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;transform:translate3d(0,25%,0);display:flex;align-items:center;justify-content:center}.eael-creative-button--winona::after,.eael-creative-button--winona>.creative-button-inner{padding:1em 2em;transition:transform .3s,opacity .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--winona:hover::after{opacity:1;transform:translate3d(0,0,0)}.eael-creative-button--winona:hover>.creative-button-inner{opacity:0;transform:translate3d(0,0,0)}.eael-creative-button--ujarak{transition:border-color .4s,color .4s}.eael-creative-button--ujarak::before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;opacity:0;transform:scale3d(.7,1,1);transition:transform .4s,opacity .4s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--ujarak,.eael-creative-button--ujarak::before{transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--ujarak:hover::before{opacity:1;transform:translate3d(0,0,0)}.eael-creative-button--wayra{overflow:hidden;transition:border-color .3s,color .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--wayra::before{content:'';position:absolute;top:0;left:0;width:150%;height:100%;z-index:-1;transform:rotate3d(0,0,1,-45deg) translate3d(0,-3em,0);transform-origin:0 100%;transition:transform .3s,opacity .3s,background-color .3s}.eael-creative-button--wayra:hover::before{opacity:1;transform:rotate3d(0,0,1,0deg);transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya{float:left;min-width:150px;max-width:250px;display:block;margin:1em;padding:1em 2em;border:none;background:0 0;color:inherit;vertical-align:middle;position:relative;z-index:1;-webkit-backface-visibility:hidden;-moz-osx-font-smoothing:grayscale;overflow:hidden;color:#7986cb;min-width:180px}.eael-creative-button--tamaya.button--inverted{color:#37474f;border-color:#37474f}.eael-creative-button--tamaya::after,.eael-creative-button--tamaya::before{content:attr(data-text);position:absolute;width:100%;height:50%;left:0;background:#7986cb;color:#fff;overflow:hidden;transition:transform .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya.button--inverted::after,.eael-creative-button--tamaya.button--inverted::before{background:#fff;color:#37474f}.eael-creative-button--tamaya::before{top:0;padding-top:1em}.eael-creative-button--tamaya::after{bottom:0;line-height:0}.eael-creative-button--tamaya span{display:block;transform:scale3d(.2,.2,1);opacity:0;transition:transform .3s,opacity .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya:hover::before{transform:translate3d(0,-100%,0)}.eael-creative-button--tamaya:hover::after{transform:translate3d(0,100%,0)}.eael-creative-button--tamaya:hover span{opacity:1;transform:scale3d(1,1,1)}.eael-creative-button--rayen{overflow:hidden;padding:0!important}.eael-creative-button--rayen::before{content:attr(data-text);position:absolute;top:0;left:0;width:100%;height:100%;transform:translate3d(-100%,0,0);display:flex;align-items:center;justify-content:center}.eael-creative-button--rayen::before,.eael-creative-button--rayen>.creative-button-inner{padding:1em 2em;transition:transform .3s;transition-timing-function:cubic-bezier(.75,0,.125,1)}.eael-creative-button--rayen:hover::before{transform:translate3d(0,0,0)}.eael-creative-button--rayen:hover>.creative-button-inner{transform:translate3d(0,100%,0)}.creative-button-inner{display:flex;flex-direction:row;align-items:center;justify-content:center}.eael-creative-button-icon-left{margin-right:5px}.eael-creative-button-icon-right{margin-left:5px}
10
  table.eael-data-table thead .sorting,table.eael-data-table thead .sorting_asc,table.eael-data-table thead .sorting_desc{position:relative;z-index:0;outline:0;cursor:pointer}table.eael-data-table thead .sorting:after,table.eael-data-table thead .sorting_asc:after,table.eael-data-table thead .sorting_desc:after{position:absolute;top:50%;right:10px;font-family:FontAwesome;color:#fff;z-index:1;transform:translateY(-50%)}.eael-data-table-wrap .eael-data-tables_wrapper{display:flex;flex-flow:row wrap;justify-content:flex-start;width:100%}.eael-data-table-wrap .eael-data-tables_filter{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_filter label{font-weight:700}.eael-data-table-wrap .eael-data-tables_filter label input[type=search]{height:40px;border:1px solid rgba(0,0,0,.09);outline:0;padding:10px;margin-left:10px}.eael-data-table-wrap .eael-data-tables_length{flex-grow:1;flex-basis:50%}.eael-data-table-wrap .eael-data-tables_length select{width:auto;max-width:120px;height:40px;border:1px solid rgba(0,0,0,.09);outline:0;margin-left:10px;margin-right:10px}.eael-data-table-wrap .eael-data-tables_length label{font-weight:700}.eael-data-table-wrap .eael-data-tables_info{flex-grow:1;flex-basis:50%;font-weight:700}.eael-data-table-wrap .eael-data-tables_paginate{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button{padding:10px 15px;background:#f2f2f2;margin-right:2px;cursor:pointer;transition:all .3s}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled{cursor:no-drop;background:#f2f2f2;opacity:.5;color:#888}.data-header-icon{margin-right:10px;position:relative;top:2px}.eael-data-table{width:100%;height:auto;margin:0;border-collapse:collapse;border:none}.eael-data-table tr{border-style:none}.eael-data-table thead tr{text-align:left}.eael-data-table thead tr th{padding:20px 15px;background:#4a4893;font-size:16px;font-weight:600;font-family:Montserrat,sans-serif;line-height:1;color:#fff;border-color:#000;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table thead tr th:hover{border-color:#000}.eael-data-table tbody tr.even{transition:background .4s ease-in-out}.eael-data-table tbody tr.even:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.even:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr.odd{background:rgba(242,242,242,.5);transition:background .2s ease-in-out}.eael-data-table tbody tr.odd:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.odd:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr td{padding:20px 15px;font-size:14px;font-family:Montserrat,sans-serif;line-height:1;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table-th-img{display:inline-block;margin:0 15px 0 0;line-height:1}.th-mobile-screen{display:none}@media (max-width:767px){.eael-data-table-wrap{overflow-x:scroll!important;padding-bottom:5px}.th-mobile-screen{display:inline-block;padding:0 .6em;margin-right:10px;text-align:center;flex-grow:0;flex-shrink:0;flex-basis:100px}.th-mobile-screen .eael-data-table-th-img{margin:0 auto 15px auto;display:block}.th-mobile-screen .data-header-icon{margin:0 auto 15px auto;display:block}.td-content-wrapper{display:flex;width:100%}.td-content{width:100%;justify-content:center}.td-content>p{width:100%;justify-content:center}.custom-responsive-option-enable .eael-data-table thead{display:none}.custom-responsive-option-enable .eael-data-table tbody tr td{float:none;clear:left;width:100%;text-align:left;display:flex;align-items:center}.eael-data-table .td-content{align-items:center;display:flex}}table.eael-data-table thead .sorting:after{content:"\f0dc"}table.eael-data-table thead .headerSortDown:after{content:"\f0dd"}table.eael-data-table thead .headerSortUp:after{content:"\f0de"}table.eael-data-table thead .sorting_disabled.sorting:after{display:none}table.eael-data-table .sorting.sorting-none:after{display:none}table.eael-data-table .sorting_desc.sorting-none:after{display:none}table.eael-data-table .sorting_asc.sorting-none:after{display:none}.eael-table-align-left table.eael-data-table{float:left}.eael-table-align-center table.eael-data-table{margin:0 auto}.eael-table-align-right table.eael-data-table{float:right}.eael-hide-elements .eael-data-tables_info{display:none}.eael-dt-th-align-left .eael-data-table thead tr th{text-align:left}.eael-dt-td-align-left .eael-data-table tbody tr td{text-align:left}.eael-dt-th-align-right .eael-data-table thead tr th{text-align:right;padding-right:30px}.eael-dt-td-align-right .eael-data-table tbody tr td{text-align:right;padding-right:30px}.eael-dt-th-align-center .eael-data-table thead tr th{text-align:center}.eael-dt-td-align-center .eael-data-table tbody tr td{text-align:center}
11
- .eael-facebook-feed{width:100%;margin:auto}.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{float:none;width:100%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{float:left;width:50%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{float:left;width:33.3333%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{float:left;width:25%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{float:left;width:20%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{float:left;width:16.6666%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed .eael-facebook-feed-item{display:inline-block;line-height:0}.eael-facebook-feed .eael-facebook-feed-item,.eael-facebook-feed .eael-facebook-feed-item-inner{position:relative}.eael-facebook-feed-overlay .eael-facebook-feed-item .eael-facebook-feed-item-overlay{display:flex;justify-content:center;text-align:center;position:absolute;top:0;bottom:0;left:0;right:0;font-size:12px;line-height:1;transform:scale(.8);opacity:0;transition:all .2s}.eael-facebook-feed-overlay .eael-facebook-feed-item .eael-facebook-feed-item-overlay .eael-facebook-feed-item-overlay-inner{position:relative;align-self:center}.eael-facebook-feed-overlay .eael-facebook-feed-item:hover .eael-facebook-feed-item-overlay{transform:scale(1);opacity:1}.eael-facebook-feed-overlay .eael-facebook-feed-meta{margin-bottom:0}.eael-facebook-feed-overlay .eael-facebook-feed-meta span{display:inline-block;margin:0 15px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner{margin:10px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header{padding:8px 12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user{float:left}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user .eael-facebook-feed-avatar{float:left;display:inline-block;width:32px;height:32px;border-radius:50%;margin-right:10px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user .eael-facebook-feed-username{float:left;display:inline-block;font-size:14px;font-weight:400;line-height:32px;margin:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-post-time{float:right;font-size:11px;font-weight:400;line-height:32px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-content{position:relative;display:block;padding:12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-content .eael-facebook-feed-message{font-size:14px;font-weight:400;line-height:1.3;margin:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap{padding:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-img{display:block;position:relative;margin-bottom:12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-overlay i{font-size:48px;color:#fff}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview{padding:0 12px 15px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-host{font-size:12px;font-weight:400;line-height:1;text-transform:uppercase;margin-bottom:5px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-title{font-size:15px;font-weight:700;line-height:1.4;margin-top:0;margin-bottom:6px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-description{font-size:14px;font-weight:400;line-height:1.2;margin-bottom:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer{font-size:13px;font-weight:400;line-height:30px;padding:8px 12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer span{display:inline-block}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer span.eael-facebook-feed-post-likes{margin-right:15px}.elementor-widget-eael-facebook-feed .eael-load-more-button-wrap{justify-content:center;margin-top:15px}.elementor-widget-eael-facebook-feed .eael-load-more-button-wrap.no-pagination{display:none}
12
- .elementor-panel .pro-feature,.elementor-panel .pro-feature a{color:#a4afb7;text-transform:uppercase;letter-spacing:1px;line-height:1.8;font-style:normal}.elementor-panel .pro-feature a{text-decoration:underline;color:#f54!important}.elementor-control-data_table_content_colspan_pro_alert .elementor-control-title,.elementor-control-data_table_content_rowspan_pro_alert .elementor-control-title,.elementor-control-data_table_content_template_pro_alert .elementor-control-title,.elementor-control-data_table_header_colspan_pro_alert .elementor-control-title,.elementor-control-data_table_header_img_pro_alert .elementor-control-title,.elementor-panel .elementor-control-eael_section_pro .elementor-panel-heading-title.elementor-panel-heading-title,.elementor-panel .elementor-control-eael_section_pro .elementor-panel-heading-toggle{color:#f54}.elementor-panel .elementor-control-eael_control_get_pro .elementor-control-field{display:none!important}.elementor-control-eael_fancy_text_style_pro_alert .elementor-control-title,.elementor-control-eael_img_accordion_type_pro_alert .elementor-control-title,.elementor-control-eael_pricing_table_style_pro_alert .elementor-control-title,.elementor-control-eael_section_countdown_style_pro_alert .elementor-control-title,.elementor-control-eael_section_data_table_enabled_pro_alert .elementor-control-title,.elementor-control-eael_team_members_preset_pro_alert .elementor-control-title,.elementor-control-eael_ticker_type_pro_alert .elementor-control-title{color:#f54}
13
  .eael-dual-header{display:block;margin-bottom:50px}.eael-dual-header .title,.eael-dual-header .title span{font-size:36px;font-weight:700;text-transform:uppercase;line-height:48px;margin:10px 0}.eael-dual-header .subtext{font-size:16px;display:block}.eael-dual-header i{display:block;padding:0;margin:20px 0 10px 0;font-size:36px}.eael-dual-header .title span.lead{color:#1abc9c}.eael-dual-header-content-align-center{text-align:center}.eael-dual-header-content-align-left{text-align:left}.eael-dual-header-content-align-right{text-align:right}
 
 
14
  .eael-fancy-text-container p{margin:0}.eael-fancy-text-strings{display:none}.eael-fancy-text-prefix,.eael-fancy-text-suffix{display:inline-block}.morphext>.animated{display:inline-block}.typed-cursor{opacity:1;-webkit-animation:blink_cursor .7s infinite;animation:blink_cursor .7s infinite}@keyframes blink_cursor{0%{opacity:1}50%{opacity:0}100%{opacity:1}}@-webkit-keyframes blink_cursor{0%{opacity:1}50%{opacity:0}100%{opacity:1}}.eael-fancy-text-container.style-2{font-size:24px}.eael-fancy-text-container.style-2 .eael-fancy-text-strings{background:#f54;color:#fff;padding:10px 25px}
15
  .elementor-widget-eael-feature-list.-icon-position-left .connector-type-modern.rhombus .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top .connector-type-modern.rhombus .eael-feature-list-item:before{top:3px!important}.elementor-widget-eael-feature-list.-icon-position-left .connector-type-modern.rhombus .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top .connector-type-modern.rhombus .eael-feature-list-item:after{top:45px!important}.elementor-widget-eael-feature-list.-icon-position-right .connector,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .connector{right:0;left:calc(100% - 70px)}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:auto;right:0}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px;top:30px}.elementor-widget-eael-feature-list .eael-feature-list-items{list-style-type:none;margin:0;padding:0}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item{position:relative}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .connector{display:block;position:absolute;width:0;margin:0 auto;z-index:1;height:100%;top:.5em;font-size:60px;left:0;right:calc(100% - 60px);border-left:2px solid #2ecc71;border-right:none!important}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item:last-child .connector{display:none}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box{z-index:2;transition:all .5s}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner{background-color:#37368e;transition:all .5s;display:inline-flex}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon{padding:.5em;transition:all .5s;font-size:30px;line-height:1;color:#37368e;text-align:center;display:inline-flex;display:flex;align-items:center;justify-content:center}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i{width:1em;height:1em;position:relative;display:block}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i:before{position:absolute;left:50%;transform:translateX(-50%)}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-img{font-size:8px;line-height:1;max-width:inherit}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box{margin:0 0 0 20px}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-title{margin-top:-2px;line-height:1.5em}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-content{padding:0;margin:0;font-size:14px;line-height:1.5em}.elementor-widget-eael-feature-list .eael-feature-list-items.stacked .eael-feature-list-icon-box .eael-feature-list-icon{color:#fff}.elementor-widget-eael-feature-list .eael-feature-list-items.framed .eael-feature-list-icon-box .eael-feature-list-icon{background-color:#fff}.elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner{border-radius:50%}.elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner .eael-feature-list-icon{border-radius:50%}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon-inner{transform:rotate(45deg);margin:15px}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon i{transform:rotate(-45deg)}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon img{transform:rotate(-45deg)}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-content-box .eael-feature-list-title{margin-top:15px}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px;position:relative}@media (max-width:767px){.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px;display:block}}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{content:"";position:absolute;display:block}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;top:0;z-index:1;border-left:1px solid #000;border-right:none!important;height:100%}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px;top:30px;width:23px;display:block;z-index:2;border-bottom:1px dashed #000;border-top:none!important}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item .connector{display:none}@media (min-width:768px){.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item{padding:0 50px 0 0}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:before{left:auto;right:0}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:after{left:auto;right:5px;top:30px}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item .connector{display:none}}@media (min-width:1025px){.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}}@media (max-width:1024px){.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px;top:30px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{right:0;left:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{display:block;text-align:left}.elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{right:0;left:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px}}
16
  .eael-filter-gallery-control{width:100%}.eael-filter-gallery-control ul,.eael-filter-gallery-control ul li{text-align:center}.eael-filter-gallery-control ul{margin:0 0 20px 0;padding:0;text-align:center}.eael-filter-gallery-control{display:flex;flex-flow:1 1 auto;align-items:center;justify-content:center;flex-flow:row wrap;padding:0;margin:0}.eael-filter-gallery-control ul li{list-style:none;font-size:24px;display:inline-block;text-align:center}.eael-filter-gallery-control ul li a.control{font-family:Montserrat,sans-serif;font-size:16px;font-weight:600;padding:10px 25px;margin:10px 6px}.eael-filter-gallery-container{text-align:justify;font-size:.1px}.eael-filter-gallery-container:after{content:'';display:inline-block;width:100%}.eael-filter-gallery-container:not(.eael-cards) .item:before{content:'';display:inline-block;padding-top:56.25%}.eael-filter-gallery-container .item .caption{position:absolute;display:flex;flex-flow:1 1 100%;align-items:center;justify-content:center;z-index:1;top:0;left:0;right:0;bottom:0;transition:transform .4s}.eael-filter-gallery-container.eael-cards .item .caption{display:none}.eael-filter-gallery-container.eael-cards .item .item-img .caption{position:absolute;display:flex;flex-flow:1 1 100%;align-items:center;justify-content:center;z-index:10;top:0;left:0;right:0;bottom:0;transition:transform .4s}.gallery-item-caption-over{width:100%;height:auto}a.eael-gallery-load-more,a.eael-gallery-load-more:hover{text-decoration:none}.eael-filter-gallery-container .item .caption.eael-zoom-in,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-zoom-in{transform:scale(0)}.eael-filter-gallery-container .item:hover .caption.eael-zoom-in,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-zoom-in{transform:scale(1)}.eael-filter-gallery-container .item .caption.eael-slide-left,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-left{transform:translateX(-100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-left,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-left{transform:translateX(0)}.eael-filter-gallery-container .item .caption.eael-slide-right,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-right{transform:translateX(100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-right,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-right{transform:translateX(0)}.eael-filter-gallery-container .item .caption.eael-slide-top,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-top{transform:translateY(-100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-top,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-top{transform:translateY(0)}.eael-filter-gallery-container .item .caption.eael-slide-bottom,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-bottom{transform:translateY(100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-bottom,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-bottom{transform:translateY(0)}.eael-filter-gallery-container .item .caption a{display:inline-block;width:50px;height:50px;text-align:center;line-height:50px;border-radius:50%;margin:0 5px;font-size:20px;cursor:pointer;transition:.3s}.eael-container .item .caption a:nth-child(2),.eael-filter-gallery-container .item .caption a:nth-child(1){transition:.6s;opacity:0}.eael-filter-gallery-container .item .caption a:nth-child(1){transform:translateY(-100%)}.eael-filter-gallery-container .item .caption a:nth-child(2){transform:translateY(100%)}.eael-filter-gallery-container .item .caption:hover a:nth-child(1),.eael-filter-gallery-container .item .caption:hover a:nth-child(2){transform:translateY(0);opacity:1}.eael-filter-gallery-container .item .caption .eael-popup-link{outline:0}.eael-filter-gallery-container.eael-cards .item:before{padding-top:0}.eael-filter-gallery-container.eael-cards .item-img{position:relative;background-repeat:no-repeat;background-position:center;background-size:cover;height:220px;z-index:0;overflow:hidden}.eael-filter-gallery-container.eael-cards .item-content{padding:15px}.eael-filter-gallery-container.eael-cards .item-content .title,.eael-filter-gallery-container.eael-cards .item-content .title a{font-size:20px;line-height:1;margin-bottom:0;transition:.3s}.eael-filter-gallery-container.eael-cards .item-content p{font-size:14px;line-height:26px}.eael-fg-card-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:center}.eael-fg-card-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:right}.eael-fg-hoverer-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:center}.eael-fg-hoverer-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:right}.eael-fg-content-align-left .eael-cards .item .item-content{text-align:left}.eael-fg-content-align-center .eael-cards .item .item-content{text-align:center}.eael-fg-content-align-right .eael-cards .item .item-content{text-align:right}.mfp-wrap~div.dialog-widget{display:none!important}.eael-filterable-gallery-item-wrap{float:left;width:33.33%}.eael-filter-gallery-container.eael-col-1 .eael-filterable-gallery-item-wrap{width:100%}.eael-filter-gallery-control>ul li{font-size:13px;line-height:1.8;text-transform:uppercase;letter-spacing:1px;padding:6px 15px;cursor:pointer;margin:0 5px;font-weight:400}.eael-filter-gallery-container.eael-col-2 .eael-filterable-gallery-item-wrap{width:50%}.eael-filter-gallery-container.eael-col-4 .eael-filterable-gallery-item-wrap{width:25%}.eael-filter-gallery-container.eael-col-5 .eael-filterable-gallery-item-wrap{width:20%}.eael-gallery-grid-item{margin-left:calc(20px/2);margin-right:calc(20px/2);margin-bottom:20px;position:relative}.gallery-item-caption-wrap,.media-content-wrap{font-size:14px;text-align:left}.gallery-item-thumbnail-wrap.caption-style-card img{max-height:100%;width:100%}.gallery-item-caption-wrap.caption-style-hoverer{position:absolute;left:0;top:0;height:100%;width:100%;padding:15px;z-index:10}.eael-filterable-gallery-item-wrap .eael-gallery-grid-item .gallery-item-thumbnail-wrap>img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.fg-item-content,.fg-item-title{color:#fff;font-family:inherit}.gallery-item-caption-wrap.caption-style-card .fg-item-title{font-size:18px;margin:15px 0 15px;line-height:1}.gallery-item-caption-wrap.caption-style-card{background:#f7f7f7}.gallery-item-caption-wrap.caption-style-card .fg-item-title{margin:10px 0 15px;color:#000}.gallery-item-caption-wrap.caption-style-card .fg-item-content{color:#212529;line-height:1.5;font-weight:400}.gallery-item-buttons>a{display:inline-block;font-size:16px;color:#000;margin-right:15px}.gallery-item-buttons>a:visited{color:#000}.gallery-item-caption-wrap.caption-style-card{padding:10px;box-sizing:border-box;font-family:inherit}.gallery-item-caption-wrap .gallery-item-hoverer-bg{position:absolute;left:0;top:0;height:100%;width:100%;content:'';background:#000;z-index:-1;opacity:.7}.gallery-item-caption-wrap.caption-style-hoverer{visibility:hidden;opacity:0;transition:.6s all ease;display:flex;align-items:center}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer{opacity:1;visibility:visible}.gallery-item-caption-wrap.caption-style-hoverer h5{font-size:20px;margin-bottom:5px;line-height:1}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up h5{transform:translateY(20px);transition:.6s all ease}.gallery-item-caption-wrap.caption-style-hoverer p{margin-bottom:5px}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up p{transform:translateY(40px);transition:.6s all ease}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up .gallery-item-buttons{transform:translateY(40px);transition:.6s all ease}.gallery-item-caption-wrap .gallery-item-buttons>a span{display:flex;align-items:center;justify-content:center;border-radius:50%;outline:0;text-decoration:none;display:inline-block;text-align:center}.gallery-item-caption-wrap.caption-style-hoverer.eael-zoom-in{transform:scale(.8);transition:.6s all ease}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up .gallery-item-buttons,.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up h5,.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up p{transform:translate(0)}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-zoom-in{transform:scale(1);visibility:visible;opacity:1}.gallery-item-caption-wrap.caption-style-hoverer.eael-none{transition:none}.gallery-item-thumbnail-wrap{position:relative}.video-popup,.video-popup-bg{position:absolute;left:0;top:0;height:100%;width:100%}.video-popup>img{width:62px;position:relative;z-index:1;transition:.3s}.video-popup{display:flex;align-items:center;justify-content:center}.video-popup:hover>img{transform:scale(1.1)}.video-popup-bg{visibility:hidden;opacity:0;transition:350ms}.eael-gallery-grid-item:hover .video-popup-bg{visibility:visible;opacity:1}.gallery-item-thumbnail-wrap>.gallery-item-caption-wrap{position:absolute;left:0;top:0;height:100%;width:100%;display:flex;align-items:center;justify-content:center}.gallery-item-caption-wrap.card-hover-bg{visibility:hidden;opacity:0;transition:.8s}.gallery-item-thumbnail-wrap:hover .gallery-item-caption-wrap.card-hover-bg{visibility:visible;opacity:1}.gallery-item-caption-wrap .gallery-item-buttons>a>i{display:flex;align-items:center;justify-content:center;height:100%}@media only screen and (min-width:1025px){.elementor-element.elementor-grid-1{position:relative}.elementor-element.elementor-grid-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-2{position:relative}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-3{position:relative}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-4{position:relative}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-5{position:relative}.elementor-element.elementor-grid-5 .pp-logo-grid{margin-right:-5px}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-6{position:relative}.elementor-element.elementor-grid-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}@media only screen and (max-width:1024px) and (min-width:766px){.elementor-element.elementor-grid-tablet-1{position:relative}.elementor-element.elementor-grid-tablet-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-tablet-2{position:relative}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-tablet-3{position:relative}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-tablet-4{position:relative}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-tablet-5{position:relative}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-tablet-6{position:relative}.elementor-element.elementor-grid-tablet-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}@media only screen and (max-width:767px){.elementor-element.elementor-grid-mobile-1{position:relative}.elementor-element.elementor-grid-mobile-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-mobile-2{position:relative}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-mobile-3{position:relative}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-mobile-4{position:relative}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-mobile-5{position:relative}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-mobile-6{position:relative}.elementor-element.elementor-grid-mobile-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}.fg-layout-3-filter-controls{margin:0;padding:0;list-style:none}.fg-layout-3-item-content{text-align:center}.fg-layout-3-item-content .fg-item-title{font-size:18px;line-height:1;font-weight:500;margin:0;transition:.3s}.fg-layout-3-item-content .fg-item-content p{font-size:13px;font-weight:400}.fg-filter-wrap{position:relative;flex-basis:30%}.fg-layout-3-filter-controls{position:absolute;left:0;background:#fff;z-index:999;width:150px;visibility:hidden;opacity:0;transition:.3s;width:100%;border-radius:5px;padding-top:7px}.fg-layout-3-filter-controls.open-filters{visibility:visible;opacity:1}.fg-layout-3-filter-controls li.control{padding:5px 5px 5px 10px;cursor:pointer;transition:.3s;font-size:14px;color:#7f8995;font-weight:400}.fg-layout-3-filter-controls li.control:hover{color:#2d425a}.fg-layout-3-filter-controls li.control:first-child{border-top:0 solid}.fg-layout-3-filter-controls li.control:last-child{border-bottom:0 solid}.fg-layout-3-filters-wrap{max-width:600px;margin:15px auto 50px}.fg-filter-wrap button{width:100%;border:0 solid;border-radius:0;padding:17px 13px;font-size:14px;color:#2d425a;background:#f7f8ff;height:55px;border-right:1px solid #abb5ff;border-radius:10px 0 0 10px;outline:0;text-align:center;position:relative}.fg-filter-wrap button>i{font-size:18px;position:absolute;top:50%;transform:translateY(-50%);margin-left:10px}.fg-layout-3-search-box{flex-basis:70%;height:100%}.fg-layout-3-search-box input[type=text]{width:100%;height:100%;margin:0;padding:15px;border:0 solid;outline:0;background:0 0}.fg-layout-3-search-box input[type=text]::-webkit-input-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]::-moz-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]:-ms-input-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]:-moz-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-filters-wrap{height:55px;border-radius:5px;display:flex;flex-wrap:wrap;align-items:center}.fg-layout-3-filters-wrap .fg-layout-3-search-box{background:#f7f8ff;border-radius:0 10px 10px 0}.fg-layout-3-item-thumb{position:relative;overflow:hidden}.fg-layout-3-item-thumb .gallery-item-buttons{text-align:center;position:absolute;left:0;top:0;height:100%;width:100%;display:flex;align-items:center;justify-content:center;z-index:4}.fg-layout-3-item-content{padding:27px 27px 30px;text-align:center}.eael-fg-card-content-align-left .fg-layout-3-item-content{text-align:left}.eael-fg-card-content-align-center .fg-layout-3-item-content{text-align:center}.eael-fg-card-content-align-right .fg-layout-3-item-content{text-align:right}.eael-filterable-gallery-item-wrap .fg-layout-3-item.eael-gallery-grid-item{box-shadow:0 0 30px 0 rgba(3,29,60,.05);border-radius:5px}.fg-caption-head{position:absolute;left:0;top:0;width:100%;display:flex;justify-content:space-between;padding:35px 35px;z-index:3;color:#fff;font-size:18px;font-weight:700}.fg-item-category>span{font-size:12px;color:#fff;background:#fa9196;padding:10px 12px;display:inline-block}.fg-layout-3-item-content{position:relative}.fg-item-category{position:absolute;left:0;top:0;text-align:center;width:100%;height:30px;margin-top:-15px;z-index:11}.fg-item-category span{border-radius:5px;line-height:1;visibility:hidden;opacity:0;transition:.3s}.fg-layout-3-item.eael-gallery-grid-item:hover .fg-item-category span{visibility:visible;opacity:1}
17
  .eael-elements-flip-box-container{position:relative;height:300px;width:100%}.eael-elements-flip-box-container .flipbox-button{display:inline-block;transition:all .4s}.eael-elements-flip-box-container a{display:block}.eael-elements-flip-box-vertical-align{width:100%}.eael-elements-flip-box-padding{padding:0 30px 5px 30px}.eael-elements-flip-box-icon-image{display:inline-block;margin:0 auto 0 auto;line-height:1}.eael-elements-flip-box-icon-image.eael_eleements_flip_front_icon_style_background{background:#ccc}.eael_eleements_flip_front_icon_style_bordered{border:2px solid #fff}.eael_flip_box_icon_border_round{border-radius:100px}.eael_eleements_flip_front_icon_style_background,.eael_eleements_flip_front_icon_style_bordered{padding:15px}.eael-elements-flip-box-icon-image i{font-size:40px}.eael-elements-slider-display-table{width:100%}.eael-elements-flip-box-front-container{text-align:center;position:absolute;top:0;left:0;z-index:2;width:100%;height:100%;background:#0e9dd2;color:#fff;border-color:#000;-webkit-display:flex;display:flex;align-items:center}.eael-elements-flip-box-content,.eael-elements-flip-box-heading{color:#fff}.eael-elements-flip-box-heading.flipbox-linked-title{color:#fff;font-size:1.5em;font-weight:700}.eael-elements-flip-box-rear-container{text-align:center;position:absolute;top:0;left:0;width:100%;height:100%;background:#444;color:#fff;display:flex;align-items:center;border-color:#000}.eael-elements-button-floating-container{position:fixed;z-index:100}.eael-elements-button-floating-container .eael-elements-button{margin-top:0;font-size:14px;position:relative;padding:14px 20px}.eael-elements-button{cursor:pointer;display:inline-block;background:#077bbe;color:#fff;line-height:1;padding:16px 25px;margin-top:15px}.eael-elements-button:hover{background:#077bbe;color:#fff}.eael-elements-flip-box-container{perspective:1000px}.eael-elements-flip-box-front-container,.eael-elements-flip-box-rear-container{transition-duration:.5s;transition-property:all;transition-timing-function:ease}.eael-elements-flip-box-flip-card{width:100%;height:100%;transform-style:preserve-3d;transition:all .5s ease}.eael-elements-flip-box-front-container,.eael-elements-flip-box-rear-container{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:rotateX(0);transform:rotateY(0)}.eael-animate-flip.eael-animate-up .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateX(180deg)}.eael-animate-flip.eael-animate-down .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateX(-180deg)}.eael-animate-flip.eael-animate-left .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateY(-180deg)}.eael-animate-flip.eael-animate-right .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateY(180deg)}.eael-animate-push.eael-elements-flip-box-container,.eael-animate-slide.eael-elements-flip-box-container{overflow:hidden}.eael-animate-push .eael-elements-flip-box-rear-container,.eael-animate-slide .eael-elements-flip-box-rear-container{z-index:3}.eael-animate-push.eael-animate-up .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-up .eael-elements-flip-box-rear-container{top:100%}.eael-animate-push.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{top:0}.eael-animate-push.eael-animate-down .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-down .eael-elements-flip-box-rear-container{top:auto;bottom:100%}.eael-animate-push.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{top:auto;bottom:0}.eael-animate-push.eael-animate-left .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-left .eael-elements-flip-box-rear-container{left:100%}.eael-animate-push.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{left:0}.eael-animate-push.eael-animate-right .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-right .eael-elements-flip-box-rear-container{left:auto;right:100%}.eael-animate-push.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{left:auto;right:0}.eael-animate-push.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{top:-100%}.eael-animate-push.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{top:100%}.eael-animate-push.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{left:-100%}.eael-animate-push.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{left:100%}.eael-animate-zoom-in .eael-elements-flip-box-rear-container{opacity:0;transform:scale(.75);z-index:3}.eael-animate-zoom-in.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{opacity:1;transform:scale(1)}.eael-animate-zoom-out.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{opacity:0;transform:scale(.75)}.eael-animate-fade.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{opacity:0}.eael-flipbox-content-align-right .eael-elements-flip-box-padding{text-align:right}.eael-flipbox-content-align-left .eael-elements-flip-box-padding{text-align:left}.eael-flipbox-content-align-center .eael-elements-flip-box-padding{text-align:center}.eael-flipbox-img-circle .eael-elements-flip-box-icon-image img,.eael-flipbox-img-circle .flipbox-back-image-icon img{border-radius:50%;overflow:hidden}
18
  .eael-fluent-form-wrapper label.ff-el-form-check-label{display:flex;align-items:center}.eael-fluent-form-wrapper label.ff-el-form-check-label input{margin-right:5px}.eael-fluentform-form-button-full-width .ff-btn-submit{width:100%;display:block}.eael-contact-form.eael-fluent-form-wrapper.error-message-hide .ff-el-is-error .text-danger{display:none}.eael-fluentform-form-button-center .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-center .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-center .ff-el-group.ff-text-right .ff-btn-submit{margin:0 auto;display:flex;align-items:center;justify-content:center}.eael-fluentform-form-button-right .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-right .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-right .ff-el-group.ff-text-right .ff-btn-submit{float:right}.eael-fluentform-form-button-left .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-left .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-left .ff-el-group.ff-text-right .ff-btn-submit{float:left}.eael-contact-form.eael-fluent-form-wrapper.fluent-form-labels-hide label{display:none!important}.eael-fluentform-section-break-content-left .ff-el-group.ff-el-section-break{text-align:left}.eael-fluentform-section-break-content-center .ff-el-group.ff-el-section-break{text-align:center}.eael-fluentform-section-break-content-right .ff-el-group.ff-el-section-break{text-align:right}
19
- .clearfix::after,.clearfix::before{content:" ";display:table;clear:both}.eael-logo-carousel.nav-top-left,.eael-logo-carousel.nav-top-right,.eael-post-carousel.nav-top-left,.eael-post-carousel.nav-top-right,.eael-product-carousel.nav-top-left,.eael-product-carousel.nav-top-right,.eael-team-slider.nav-top-left,.eael-team-slider.nav-top-right,.eael-testimonial-slider.nav-top-left,.eael-testimonial-slider.nav-top-right{padding-top:40px}.eael-contact-form input[type=date],.eael-contact-form input[type=email],.eael-contact-form input[type=number],.eael-contact-form input[type=tel],.eael-contact-form input[type=text],.eael-contact-form input[type=url],.eael-contact-form textarea{background:#fff;box-shadow:none;-webkit-box-shadow:none;float:none;height:auto;margin:0;outline:0;width:100%}.eael-contact-form input[type=submit]{border:0;float:none;height:auto;margin:0;padding:10px 20px;width:auto;transition:all .25s linear 0s}.eael-contact-form.placeholder-hide input::-webkit-input-placeholder,.eael-contact-form.placeholder-hide textarea::-webkit-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input::-moz-placeholder,.eael-contact-form.placeholder-hide textarea::-moz-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-ms-input-placeholder,.eael-contact-form.placeholder-hide textarea:-ms-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-moz-placeholder,.eael-contact-form.placeholder-hide textarea:-moz-placeholder{opacity:0;visibility:hidden}.eael-custom-radio-checkbox input[type=checkbox],.eael-custom-radio-checkbox input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border-style:solid;border-width:0;outline:0;min-width:1px;width:15px;height:15px;background:#ddd;padding:3px}.eael-custom-radio-checkbox input[type=checkbox]:before,.eael-custom-radio-checkbox input[type=radio]:before{content:"";width:100%;height:100%;padding:0;margin:0;display:block}.eael-custom-radio-checkbox input[type=checkbox]:checked:before,.eael-custom-radio-checkbox input[type=radio]:checked:before{background:#999;transition:all .25s linear 0s}.eael-custom-radio-checkbox input[type=radio]{border-radius:50%}.eael-custom-radio-checkbox input[type=radio]:before{border-radius:50%}.eael-post-elements-readmore-btn{font-size:12px;font-weight:500;transition:all .3s ease-in-out;display:inline-block}
20
  .eael-gravity-form-align-default,.eael-gravity-form-align-left,.eael-gravity-form-btn-align-left{text-align:left}.eael-gravity-form-align-right,.eael-gravity-form-btn-align-right{text-align:right}.eael-gravity-form-align-center,.eael-gravity-form-btn-align-center{text-align:center}.eael-gravity-form .gform_wrapper .gform_footer{margin:0;padding:0}.gform_wrapper form li,.gform_wrapper li{list-style:none}.eael-gravity-form .gform_wrapper ul.gform_fields li.gfield{padding:0}.eael-gravity-form .gform_wrapper textarea{padding:0}.eael-gravity-form .gform_wrapper .gform_footer input.button,.eael-gravity-form .gform_wrapper .gform_footer input[type=submit],.eael-gravity-form .gform_wrapper .gform_page_footer input.button,.eael-gravity-form .gform_wrapper .gform_page_footer input[type=submit]{margin:0}.eael-gravity-form.title-description-hide .gform_heading{display:none}.eael-gravity-form.labels-hide .gform_wrapper .field_sublabel_below .ginput_complex.ginput_container label,.eael-gravity-form.labels-hide .gform_wrapper .top_label .gfield_label{display:none}.eael-gravity-form-button-full-width .gform_wrapper .gform_footer input[type=submit]{width:100%}
21
  .eael-img-accordion{display:flex;height:50vh}.eael-img-accordion a{position:relative;flex:1;text-align:center;text-decoration:none;color:#fff;background-size:cover;background-position:center;background-repeat:no-repeat;transition:flex .4s}.eael-grow-accordion{flex:3}.eael-img-accordion .overlay{display:flex;align-items:center;justify-content:center;padding:0 10px;position:absolute;top:0;right:0;bottom:0;left:0;transition:background-color .4s}.eael-img-accordion .overlay .overlay-inner{z-index:1}.eael-img-accordion a:after{content:"";position:absolute;width:100%;height:100%;z-index:0;top:0;left:0;bottom:0;right:0;transition:all .3s ease-in-out}.eael-img-accordion .overlay-inner *{visibility:hidden;opacity:0;transform-style:preserve-3d}.eael-img-accordion .overlay h2{color:#fff;transform:translate3d(0,-60px,0)}.eael-img-accordion .overlay p{color:#fff;transform:translate3d(0,60px,0)}.eael-img-accordion .overlay-inner-show *{opacity:1;visibility:visible;transform:none!important;transition:all .3s .3s}@media screen and (max-width:800px){.eael-img-accordion{flex-direction:column}.eael-img-accordion a:hover{flex:1}.eael-img-accordion a:hover .overlay{background-color:transparent}}
22
  .eael-infobox .infobox-icon{height:auto}.eael-infobox .infobox-icon .infobox-icon-wrap{display:flex;width:100%;height:auto;transition:.3s;align-items:center;justify-content:center}.eael-infobox .infobox-icon .infobox-icon-wrap i{transition:.3s}.eael-infobox-content-align-left .eael-infobox .infobox-button,.eael-infobox-content-align-left .eael-infobox .infobox-content,.eael-infobox-content-align-left .eael-infobox .infobox-icon{text-align:left}.eael-infobox-content-align-right .eael-infobox .infobox-button,.eael-infobox-content-align-right .eael-infobox .infobox-content,.eael-infobox-content-align-right .eael-infobox .infobox-icon{text-align:right}.eael-infobox-content-align-center .eael-infobox .infobox-button,.eael-infobox-content-align-center .eael-infobox .infobox-content,.eael-infobox-content-align-center .eael-infobox .infobox-icon{text-align:center}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap{width:90px;height:90px;text-align:center}.eael-infobox-icon-hover-bg-shape-square:hover .infobox-icon .infobox-icon-wrap{border-radius:0}.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-hover-bg-shape-radius:hover .infobox-icon .infobox-icon-wrap{border-radius:15px}.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap{display:flex;align-items:center;justify-content:center}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-hover-bg-shape-circle:hover .infobox-icon .infobox-icon-wrap{border-radius:50%}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap i,.eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap i{margin-top:50%;transform:translateY(-50%)}.eael-infobox .infobox-button a.eael-infobox-button{display:inline-block;padding:5px 10px;transition:all .3s ease-in-out 0s}.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:flex-start}.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:center}.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:flex-end}.eael-infobox.icon-on-left{position:relative;z-index:0;display:flex}.eael-infobox.icon-on-left .infobox-icon-wrap,.eael-infobox.icon-on-right .infobox-icon-wrap{justify-content:center;display:flex!important;align-items:center}.eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap{background:0 0;border:0;text-align:left;height:auto;display:block}.eael-infobox .infobox-content p{margin:0 0 15px}.eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap i{margin-top:0;transform:translateY(0)}.eael-infobox.icon-on-left .infobox-content{padding-left:15px;flex:1 1 auto}.eael-infobox.icon-on-left .infobox-content .title{line-height:1;margin:0 0 10px 0}.eael-infobox.icon-on-right{position:relative;z-index:0;display:flex;flex-direction:row-reverse}.eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap{background:0 0;border:0;text-align:right;width:auto;height:auto;display:block}.eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap i{margin-top:0;transform:translateY(0)}.eael-infobox.icon-on-right .infobox-content{padding-right:15px;text-align:right;flex:1 1 auto;box-sizing:border-box}.eael-infobox.icon-on-right .infobox-content .title{line-height:1;margin:0 0 10px 0}.eael-infobox .infobox-icon img{transition:all .3s ease-in-out 0s}.eael-infobox-hover-img-shape-square:hover .eael-infobox .infobox-icon img{border-radius:0}.eael-infobox-hover-img-shape-circle:hover .eael-infobox .infobox-icon img,.eael-infobox-shape-circle .eael-infobox .infobox-icon img{border-radius:50%}.eael-infobox-hover-img-shape-radius:hover .eael-infobox .infobox-icon img,.eael-infobox-shape-radius .eael-infobox .infobox-icon img{border-radius:15px}
@@ -28,10 +29,12 @@ body div.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden
28
  .eael-post-grid .woocommerce ul.products,.eael-product-grid .woocommerce ul.products{display:grid;grid-gap:25px;margin:0!important;padding:0!important}.eael-post-grid .woocommerce ul.products:after,.eael-post-grid .woocommerce ul.products:before,.eael-product-grid .woocommerce ul.products:after,.eael-product-grid .woocommerce ul.products:before{display:none}.eael-post-grid .woocommerce ul.products .product,.eael-product-grid .woocommerce ul.products .product{width:100%;margin:0;padding:0}.eael-post-grid .woocommerce ul.products.eael-product-columns-1,.eael-product-grid .woocommerce ul.products.eael-product-columns-1{grid-template-columns:100%}.eael-post-grid .woocommerce ul.products.eael-product-columns-2,.eael-product-grid .woocommerce ul.products.eael-product-columns-2{grid-template-columns:repeat(2,1fr)}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-2,.eael-product-grid .woocommerce ul.products.eael-product-columns-2{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(3,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(4,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(5,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(6,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(1,1fr)}}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product img,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product img{width:100%;height:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button{display:block;font-size:14px;font-weight:400;line-height:38px;text-align:center;text-transform:uppercase;color:#fff;background-color:#333;padding:0;margin:15px;border-radius:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus{outline:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart{display:block;margin:0 0 15px 0;padding:0;font-size:14px;line-height:1;text-transform:capitalize;color:#333;background-color:transparent}.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product{border:1px solid transparent}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart{visibility:hidden;transition:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart{visibility:visible}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0 0 15px 0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product img,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product img{width:100%;height:auto;margin:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay{position:relative;overflow:hidden;line-height:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap{position:absolute;top:50%;left:0;right:0;text-align:center;transform:translateY(-50%)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link{display:inline-block;font-size:14px;line-height:38px;text-align:center;color:#fff;background-color:#333;width:38px;height:38px;border-style:none;border-radius:50%;vertical-align:middle;padding:0;margin:0 5px;transform:translateY(20px);opacity:0;transition:transform .2s,opacity .3s}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus{outline:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after{content:"\f217";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after{content:"\f110";display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;height:auto;width:auto;position:relative;top:0;left:0;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after{content:"\f06e";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a{opacity:1;transform:translateY(0)}
29
  @-webkit-keyframes animateStripe{0%{transform:translate(0,0)}100%{transform:translate(35px,0)}}@keyframes animateStripe{0%{transform:translate(0,0)}100%{transform:translate(35px,0)}}@-webkit-keyframes animateStripeRTL{0%{transform:translate(0,0)}100%{transform:translate(-35px,0)}}@keyframes animateStripeRTL{0%{transform:translate(0,0)}100%{transform:translate(-35px,0)}}.eael-progressbar{position:relative}.eael-progressbar-title{font-size:20px;font-weight:400}.eael-progressbar-line{position:relative;display:block;width:100%;height:12px;background-color:#eee}.eael-progressbar-line .eael-progressbar-count-wrap{position:absolute;right:0;bottom:calc(100% + 5px);font-size:16px;font-weight:400;line-height:1}.eael-progressbar-line-fill{display:inline-block;position:absolute;top:50%;left:0;width:0;height:12px;background-color:#000;transform:translateY(-50%);transition:width 1.5s linear;overflow:hidden}.eael-progressbar-circle{position:relative;width:200px;height:200px}.eael-progressbar-circle .eael-progressbar-title{font-size:16px;font-weight:400}.eael-progressbar-circle .eael-progressbar-count-wrap{font-size:28px;font-weight:700}.eael-progressbar-circle-shadow{width:220px;height:220px;padding:10px;border-radius:50%}.eael-progressbar-circle-pie{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-clip-path:inset(0 0 0 50%);clip-path:inset(0 0 0 50%)}.eael-progressbar-circle-inner{height:100%;width:100%;border-width:12px;border-style:solid;border-color:#eee;border-radius:50%}.eael-progressbar-circle-half{position:absolute;left:0;top:0;height:100%;width:100%;border-width:12px;border-style:solid;border-color:#000;border-radius:50%;-webkit-clip-path:inset(0 50% 0 0);clip-path:inset(0 50% 0 0)}.eael-progressbar-circle-half-left{transform:rotate(0)}.eael-progressbar-circle-half-right{transform:rotate(180deg);visibility:hidden}.eael-progressbar-circle-inner-content{position:absolute;top:50%;width:100%;transform:translateY(-50%);text-align:center}.eael-progressbar-half-circle{position:relative;width:200px;height:100px;overflow:hidden}.eael-progressbar-half-circle .eael-progressbar-circle-pie{-webkit-clip-path:inset(0 0 50% 0);clip-path:inset(0 0 50% 0)}.eael-progressbar-half-circle .eael-progressbar-circle-half{-webkit-clip-path:inset(50% 0 0 0);clip-path:inset(50% 0 0 0);transform:rotate(0);transition:transform 1.5s linear}.eael-progressbar-half-circle .eael-progressbar-circle-inner-content{top:initial;bottom:0;transform:translateY(0)}.eael-progressbar-half-circle .eael-progressbar-title{font-size:16px;font-weight:400}.eael-progressbar-half-circle .eael-progressbar-count-wrap{font-size:28px;font-weight:700}.eael-progressbar-half-circle-after{position:relative;font-size:12px;font-weight:400;clear:both}.eael-progressbar-postfix-label{float:right}.eael-progressbar-line-stripe .eael-progressbar-line-fill:after{content:'';position:absolute;top:0;left:-35px;width:calc(100% + 70px);height:100%;background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:35px 35px}.eael-progressbar-line-animate .eael-progressbar-line-fill:after{-webkit-animation:animateStripe 2s linear infinite;animation:animateStripe 2s linear infinite}.eael-progressbar-line-animate-rtl .eael-progressbar-line-fill:after{-webkit-animation:animateStripeRTL 2s linear infinite;animation:animateStripeRTL 2s linear infinite}.eael-progressbar-circle-wrap>div{margin:0 auto}.eael-progressbar-box-container.left>div,.eael-progressbar-circle-container.left>div,.eael-progressbar-line-container.left{margin:0 auto 0 0}.eael-progressbar-box-container.center>div,.eael-progressbar-circle-container.center>div,.eael-progressbar-line-container.center{margin:0 auto}.eael-progressbar-box-container.right>div,.eael-progressbar-circle-container.right>div,.eael-progressbar-line-container.right{margin:0 0 0 auto}
30
  .eael-reading-progress-wrap.eael-reading-progress-wrap-local .eael-reading-progress-global{display:none}.eael-reading-progress-wrap.eael-reading-progress-wrap-global .eael-reading-progress-local{display:none}.eael-reading-progress-wrap.eael-reading-progress-wrap-disabled .eael-reading-progress-global,.eael-reading-progress-wrap.eael-reading-progress-wrap-disabled .eael-reading-progress-local{display:none}.eael-reading-progress-wrap .eael-reading-progress{width:100%;position:fixed;top:0;left:0;height:5px;z-index:999999}.eael-reading-progress-wrap .eael-reading-progress.eael-reading-progress-bottom{top:unset;bottom:0}.eael-reading-progress-wrap .eael-reading-progress .eael-reading-progress-fill{height:5px;background-color:#1fd18e;width:0%;transition:width 50ms ease}
 
31
  .eael-team-item{overflow:hidden;position:relative}.team-avatar-rounded figure img{border-radius:50%;height:auto}.eael-team-image>figure{margin:0;padding:0}.eael-team-image>figure img{display:block;margin:0 auto}.eael-team-item .eael-team-content{padding:10px}.eael-team-item .eael-team-member-name{font-size:20px;font-weight:700;letter-spacing:.05em;margin:5px 0;text-transform:uppercase}.eael-team-item .eael-team-member-position{font-size:14px;font-weight:400;letter-spacing:.05em;margin:5px 0 10px;text-transform:uppercase}.eael-team-item .eael-team-content,.eael-team-item .eael-team-content .eael-team-text{font-size:14px;line-height:1.5}.eael-team-content>ul{margin:0;padding:0}.eael-team-content li{display:inline-block;list-style:outside none none;margin-right:10px;text-align:center}.eael-team-content li a{font-size:2.5rem}.eael-team-align-left .eael-team-item .eael-team-content li,.eael-team-align-left .eael-team-item .eael-team-content p,.eael-team-align-left .eael-team-item .eael-team-content ul,.eael-team-align-left .eael-team-item .eael-team-member-name,.eael-team-align-left .eael-team-item .eael-team-member-position,.eael-team-align-left .eael-team-item .eael-team-text{text-align:left}.eael-team-align-right .eael-team-item .eael-team-content li,.eael-team-align-right .eael-team-item .eael-team-content p,.eael-team-align-right .eael-team-item .eael-team-content ul,.eael-team-align-right .eael-team-item .eael-team-member-name,.eael-team-align-right .eael-team-item .eael-team-member-position,.eael-team-align-right .eael-team-item .eael-team-text{text-align:right}.eael-team-align-centered .eael-team-item .eael-team-content li,.eael-team-align-centered .eael-team-item .eael-team-content p,.eael-team-align-centered .eael-team-item .eael-team-content ul,.eael-team-align-centered .eael-team-item .eael-team-member-name,.eael-team-align-centered .eael-team-item .eael-team-member-position,.eael-team-align-centered .eael-team-item .eael-team-text{text-align:center}.eael-team-item.eael-team-members-overlay .eael-team-content{bottom:10px;left:10px;margin-bottom:0;padding-top:15%;opacity:0;overflow:hidden;text-overflow:ellipsis;position:absolute;right:10px;top:10px;transition:all 615ms cubic-bezier(.19,1,.22,1) 0s}.eael-team-item.eael-team-members-overlay:hover .eael-team-content{opacity:1}.eael-team-member-social-link>a{display:inline-block;transition:all .3s cubic-bezier(.19,1,.22,1) 0s}.eael-team-member-social-link>a:focus{outline:0}
32
  .eael-testimonial-slider{position:relative}.testimonial-star-rating{padding:0;margin:0}.testimonial-star-rating li{list-style:none;display:inline-block}.testimonial-star-rating li i{color:#d8d8d8}.rating-five .testimonial-star-rating li i{color:#f2b01e}.rating-one .testimonial-star-rating li:first-child i{color:#f2b01e}.rating-two .testimonial-star-rating li:nth-child(1) i,.rating-two .testimonial-star-rating li:nth-child(2) i{color:#f2b01e}.rating-three .testimonial-star-rating li:nth-child(1) i,.rating-three .testimonial-star-rating li:nth-child(2) i,.rating-three .testimonial-star-rating li:nth-child(3) i{color:#f2b01e}.rating-four .testimonial-star-rating li:nth-child(1) i,.rating-four .testimonial-star-rating li:nth-child(2) i,.rating-four .testimonial-star-rating li:nth-child(3) i,.rating-four .testimonial-star-rating li:nth-child(4) i{color:#f2b01e}.eael-testimonial-image img{max-width:100%}.eael-testimonial-image{padding:10px 0 0 0}.eael-testimonial-image>figure{display:block;margin:0}.testimonial-avatar-rounded figure img{border-radius:50%;height:auto}.eael-testimonial-content{margin:0;padding:10px}.eael-testimonial-item>figure{margin:0 auto;padding:0 20px}.eael-testimonial-item .center-text{text-align:center}.eael-testimonial-item .right-text{text-align:right}.eael-testimonial-item .left-text{text-align:left}.eael-testimonial-item .justify-text{text-align:justify}.eael-testimonial-content .eael-testimonial-text{font-size:100%;font-style:italic;line-height:1.5;margin-top:0;margin-bottom:10px;word-wrap:break-word}.eael-testimonial-content .eael-testimonial-user{display:inline-block;font-family:inherit;font-size:105%;font-style:italic;font-weight:400;line-height:1.5;margin-top:0;margin-bottom:0;margin-right:5px}.eael-testimonial-content .eael-testimonial-user-company{display:inline-block;font-family:inherit;font-size:90%;font-style:italic;font-weight:lighter;line-height:1.75;margin-bottom:0;margin-top:1px}.eael-testimonial-image{position:relative}.eael-testimonial-item .eael-testimonial-quote::after{color:inherit!important;content:"\f10e";font-family:"Font Awesome 5 Free";font-size:200%;font-weight:900}.eael-testimonial-slider.default-style .eael-testimonial-align-centered .eael-testimonial-image figure img{margin:0 auto}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.classic-style .eael-testimonial-align-right .eael-testimonial-image figure img,.eael-testimonial-slider.default-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.default-style .eael-testimonial-align-right .eael-testimonial-image figure img,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-image figure img{margin:0}.eael-testimonial-slider.classic-style .eael-testimonial-align-right .eael-testimonial-image figure,.eael-testimonial-slider.default-style .eael-testimonial-align-right .eael-testimonial-image figure,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-image figure{text-align:right}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .eael-testimonial-image figure,.eael-testimonial-slider.default-style .eael-testimonial-align-left .eael-testimonial-image figure,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-image figure{text-align:left}.eael-testimonial-slider.classic-style .eael-testimonial-align-right .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-right .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .middle-style-content{text-align:right}.eael-testimonial-slider.classic-style .eael-testimonial-align-center .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-center .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-center .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-center .middle-style-content{text-align:center}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-left .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .middle-style-content{text-align:left}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-text>p,.eael-testimonial-slider.icon-img-right-content .eael-testimonial-text>p{margin:0}.icon-img-left-content .eael-testimonial-image{float:left;width:30%}.icon-img-left-content .eael-testimonial-content{float:left;width:70%;text-align:left}.icon-img-left-content.eael-testimonial-item{overflow:hidden;position:relative}.icon-img-left-content .eael-testimonial-quote{position:absolute;right:0}.icon-img-left-content .eael-testimonial-text{margin-top:0}.eael-testimonial-align-centered .eael-testimonial-user,.eael-testimonial-align-centered .eael-testimonial-user-company{float:none;text-align:center}.eael-testimonial-align-centered .eael-testimonial-image>figure img{display:block;margin-left:auto!important;margin-right:auto!important}.icon-img-right-content .eael-testimonial-image{float:right;width:30%}.icon-img-right-content .eael-testimonial-content{float:right;width:70%;text-align:right}.icon-img-right-content.eael-testimonial-item{overflow:hidden;position:relative}.icon-img-right-content .eael-testimonial-quote{position:absolute}.icon-img-right-content .eael-testimonial-text{margin-top:0}.eael-testimonial-item{position:relative}.classic-style.testimonial-alignment-center .eael-testimonial-image,.default-style.testimonial-alignment-center .eael-testimonial-image{text-align:center}.classic-style.testimonial-alignment-right .eael-testimonial-image,.default-style.testimonial-alignment-right .eael-testimonial-image{text-align:right}.classic-style.testimonial-alignment-center .eael-testimonial-image>figure,.default-style.testimonial-alignment-center .eael-testimonial-image>figure{text-align:center}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-centered .eael-testimonial-content{text-align:center}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-left .eael-testimonial-content{text-align:left}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-right .eael-testimonial-content{text-align:right}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-centered .eael-testimonial-content{text-align:center}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-left .eael-testimonial-content{text-align:left}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-right .eael-testimonial-content{text-align:right}span.eael-testimonial-quote{position:absolute;right:10px;top:10px}.eael-testimonial-item.left .eael-testimonial-image{text-align:left}.eael-testimonial-item.center .eael-testimonial-image{text-align:center}.eael-testimonial-item.right .eael-testimonial-image{text-align:right}.eael-testimonial-inline-bio .eael-testimonial-image{float:left}.eael-testimonial-inline-bio .bio-text{padding-top:10px}.eael-testimonial-content.eael-testimonial-inline-bio{overflow:hidden;margin-bottom:0;padding-bottom:0}.eael-testimonial-inline-bio .bio-text,.eael-testimonial-inline-bio .testimonial-star-rating{float:left;width:65%}.eael-testimonial-content.eael-testimonial-inline-bio{text-align:left!important}.testimonial-inline-style .eael-testimonial-image{float:left;max-width:100%;padding:0;margin-right:15px}.testimonial-inline-style{overflow:hidden;text-align:left}.content-top-icon-title-inline .eael-testimonial-align-left .eael-testimonial-text,.content-top-icon-title-inline .eael-testimonial-text{text-align:left}.content-top-icon-title-inline .eael-testimonial-align-centered .eael-testimonial-text{text-align:center}.content-top-icon-title-inline .eael-testimonial-align-right .eael-testimonial-text{text-align:right}.content-bottom-icon-title-inline .eael-testimonial-align-left .eael-testimonial-text,.content-bottom-icon-title-inline .eael-testimonial-text{text-align:left}.content-bottom-icon-title-inline .eael-testimonial-align-centered .eael-testimonial-text{text-align:center}.content-bottom-icon-title-inline .eael-testimonial-align-right .eael-testimonial-text{text-align:right}
33
- .eael-tooltip{position:relative;display:inline-block;min-width:150px;text-align:center;padding:12px 24px;font-size:.93rem;color:#333;line-height:1;cursor:pointer;transition:all .3s ease-in-out}.eael-tooltip .eael-tooltip-text{display:block;width:100%;visibility:hidden;background-color:#000;color:#fff;text-align:center;border-radius:4px;padding:10px;position:absolute;z-index:1;font-size:.93rem;line-height:1.3}.eael-tooltip .eael-tooltip-text::after{content:"";position:absolute;border-width:5px;border-style:solid}.eael-tooltip:hover .eael-tooltip-text{visibility:visible}.eael-tooltip .eael-tooltip-text.eael-tooltip-left{top:50%;right:100%;transform:translateY(-50%);margin-right:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-left{-webkit-animation:tooltipLeftIn .3s ease-in-out;animation:tooltipLeftIn .3s ease-in-out}.eael-tooltip .eael-tooltip-text.eael-tooltip-left::after{top:calc(50% - 5px);left:100%;border-color:transparent transparent transparent #000}.eael-tooltip .eael-tooltip-text.eael-tooltip-right{top:50%;left:100%;transform:translateY(-50%);transition:all .3s ease-in-out;margin-left:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-right{-webkit-animation:tooltipRightIn .3s linear;animation:tooltipRightIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-right::after{top:calc(50% - 5px);right:100%;border-color:transparent #000 transparent transparent}.eael-tooltip .eael-tooltip-text.eael-tooltip-top{bottom:calc(100%);left:0;right:0;margin:0 auto 10px auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-top::after{margin-top:0;top:100%;left:calc(50% - 5px);border-color:#000 transparent transparent transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-top{-webkit-animation:tooltipTopIn .3s linear;animation:tooltipTopIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom{top:100%;left:0;right:0;margin:10px auto 0 auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom::after{margin-top:0;bottom:100%;left:calc(50% - 5px);border-color:transparent transparent #000 transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-bottom{-webkit-animation:tooltipBottomIn .3s linear;animation:tooltipBottomIn .3s linear}.eael-tooltip-align-left{display:flex;width:100%;justify-content:flex-start}.eael-tooltip-align-right{display:flex;width:100%;justify-content:flex-end}.eael-tooltip-align-center{display:flex;width:100%;justify-content:center}.eael-tooltip-align-justify .eael-tooltip{display:flex;justify-content:center;align-items:center}@-webkit-keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@-webkit-keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@-webkit-keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@-webkit-keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}@keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}
34
  .eael-twitter-feed::after,.eael-twitter-feed::before{content:"";clear:both}.eael-twitter-feed-masonry .eael-twitter-feed-item{float:left}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-2 .eael-twitter-feed-item{width:100%!important}}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-3 .eael-twitter-feed-item{width:100%!important}}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-4 .eael-twitter-feed-item{width:100%!important}}.eael-twitter-feed-item .eael-twitter-feed-item-inner{background:#fff;border:1px solid rgba(0,0,0,.1)}.eael-twitter-feed-item a{color:#08c;text-decoration:none}.eael-twitter-feed-item a:hover{outline:0;color:#005580}.eael-twitter-feed-item a:focus{outline:0}.eael-twitter-feed-item .eael-twitter-feed-item-header{padding:20px 15px 0;margin-bottom:10px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar{float:left;width:38px;margin-right:10px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar.avatar-circle img{border-radius:50%}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta{float:left}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta .eael-twitter-feed-item-icon{color:#1da1f2;margin-right:5px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta .eael-twitter-feed-item-author{color:#444;line-height:1.5em;font-weight:700}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-date{float:right;margin-right:10px;font-size:90%;color:#999}.eael-twitter-feed-item .eael-twitter-feed-item-content{padding:0 15px 15px}.eael-twitter-feed-item .eael-twitter-feed-item-content p{color:#666;margin:0 0 5px;min-height:20px;text-overflow:ellipsis;-webkit-line-clamp:5;-webkit-box-orient:vertical}.eael-twitter-feed.swiper-container .swiper-button-next,.eael-twitter-feed.swiper-container .swiper-button-prev{background-image:none;outline:0}
35
  .eael-weform-container input,.eael-weform-container textarea{height:auto;padding:10px}.eael-contact-form-align-center .eael-weform-container,.eael-contact-form-btn-align-center .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-align-left .eael-weform-container,.eael-contact-form-btn-align-left .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:left;width:auto}.eael-contact-form-align-right .eael-weform-container,.eael-contact-form-btn-align-right .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:right;width:auto}.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=email],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=number],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=password],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=text],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=url],.eael-weform-container ul.wpuf-form li .wpuf-fields textarea{max-width:100%}
36
  .eael-wpforms .wpforms-container .wpforms-form .wpforms-page-button,.eael-wpforms .wpforms-container .wpforms-form button[type=submit],.eael-wpforms .wpforms-container .wpforms-form input[type=submit]{border:0}.eael-wpforms .wpforms-container .wpforms-form .wpforms-page-button:hover,.eael-wpforms .wpforms-container .wpforms-form button[type=submit]:hover,.eael-wpforms .wpforms-container .wpforms-form input[type=submit]:hover{border:0}.eael-wpforms .wpforms-container .wpforms-form input[type=checkbox],.eael-wpforms .wpforms-container .wpforms-form input[type=radio]{padding:3px}.eael-wpforms .wpforms-container .wpforms-form .wpforms-field-label{display:none}.eael-wpforms .wpforms-container .wpforms-form .wpforms-field-name .wpforms-field-row{max-width:100%}.eael-wpforms .wpforms-container .wpforms-field input:not([type=radio]):not([type=checkbox]):not([type=submit]):not([type=button]):not([type=image]):not([type=file]),.eael-wpforms .wpforms-container .wpforms-field select,.eael-wpforms .wpforms-container .wpforms-field textarea{max-width:100%!important}.eael-wpforms-labels-yes .wpforms-container .wpforms-form .wpforms-field-label{display:block}.eael-wpforms-form-button-full-width .wpforms-submit-container .wpforms-submit{width:100%}
 
37
  .tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{box-sizing:border-box;max-height:100%;max-width:100%;overflow:auto}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0,0);-moz-transform:scale(0,0);-o-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-o-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,1);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-moz-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-ms-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-o-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);transition-timing-function:cubic-bezier(.23,.635,.495,2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-fall.tooltipster-initial{top:0!important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0!important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-slide.tooltipster-initial{left:-40px!important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0!important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading .4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating .6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling .6s}.tooltipster-sidetip .tooltipster-box{background:#565656;border:2px solid #000;border-radius:4px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{color:#fff;line-height:18px;padding:6px 14px}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#565656;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#565656;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#565656;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#565656;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#000}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#000}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#000}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#000}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px}
1
+
2
  .eael-adv-accordion{width:auto;height:auto;transition:all .3s ease-in-out}.eael-adv-accordion .eael-accordion-list .eael-accordion-header{padding:15px;border:1px solid rgba(0,0,0,.02);font-size:1rem;font-weight:600;line-height:1;transition:all .3s ease-in-out;display:flex;justify-content:space-between;align-items:center;cursor:pointer}.eael-adv-accordion .eael-accordion-list .eael-accordion-header .fa-toggle{transform:rotate(0);z-index:10;transition:all .3s ease-in-out}.eael-adv-accordion .eael-accordion-list .eael-accordion-header.active .fa-toggle{transform:rotate(90deg);z-index:10;transition:all .3s ease-in-out}.fa-accordion-icon{display:inline-block;margin-right:10px}.eael-adv-accordion .eael-accordion-list .eael-accordion-content{display:none;border:1px solid #eee;padding:15px;box-sizing:border-box;font-size:1rem;line-height:1.7}.eael-adv-accordion .eael-accordion-list .eael-accordion-content p{margin:0}.eael-adv-accordion .eael-accordion-list .eael-accordion-content.active{display:block}@-webkit-keyframes rotate-90{0%{transform:rotateY(0)}100%{transform:rotateY(-180deg)}}@keyframes rotate-90{0%{transform:rotateY(0)}100%{transform:rotateY(-180deg)}}@-webkit-keyframes fadeIn{0%{opacity:1;transition:all .3s ease-in-out}100%{opacity:1;transition:all .3s ease-in-out}}@keyframes fadeIn{0%{opacity:1;transition:all .3s ease-in-out}100%{opacity:1;transition:all .3s ease-in-out}}
3
  .eael-advance-tabs{display:block}.eael-advance-tabs .eael-tabs-nav>ul{position:relative;padding:0;margin:0;list-style-type:none;display:flex;justify-content:flex-start;align-items:center;z-index:1}.eael-advance-tabs .eael-tabs-nav>ul li{position:relative;padding:1em 1.5em;flex:1 1 auto;cursor:pointer;display:flex;justify-content:center;align-items:center;text-align:center;background-color:#f1f1f1}.eael-advance-tabs .eael-tabs-nav>ul li:after{content:"";position:absolute;bottom:-10px;left:0;right:0;margin:0 auto;z-index:1;width:0;height:0;border-left:10px solid transparent;border-right:10px solid transparent;border-top:10px solid #444;border-bottom:0;display:none}.eael-advance-tabs .eael-tabs-nav>ul li.active,.eael-advance-tabs .eael-tabs-nav>ul li.active-default,.eael-advance-tabs .eael-tabs-nav>ul li:hover{background-color:#444}.eael-advance-tabs.active-caret-on .eael-tabs-nav>ul li.active-default:after,.eael-advance-tabs.active-caret-on .eael-tabs-nav>ul li.active:after{display:none}.eael-advance-tabs .eael-tabs-nav>ul li.active-default:after,.eael-advance-tabs .eael-tabs-nav>ul li.active:after{display:block}.eael-tabs-content{display:flex;flex:1 1 auto}.eael-advance-tabs .eael-tabs-content>div{display:none;opacity:0}.eael-advance-tabs .eael-tabs-content>div.active,.eael-advance-tabs .eael-tabs-content>div.active-default{display:block;width:100%;padding:1em;opacity:1;-webkit-animation:fadeIn linear .3s;animation:fadeIn linear .3s}.eael-tab-inline-icon li a .fa{margin-right:10px;line-height:1}.eael-tab-top-icon li{display:flex;flex-wrap:wrap;text-align:center}.eael-tab-top-icon li a{display:flex;flex-wrap:wrap;text-align:center}.eael-tab-top-icon li .eael-tab-title,.eael-tab-top-icon li .fa{flex:1 1 100%;line-height:1}.eael-tab-top-icon li a .eael-tab-title{margin-top:10px}.eael-advance-tabs.eael-tabs-vertical{display:flex}.eael-advance-tabs.eael-tabs-vertical .eael-tabs-nav{flex:0 0 auto}.eael-advance-tabs.eael-tabs-vertical .eael-tabs-nav>ul{flex-flow:column wrap}.eael-advance-tabs.eael-tabs-vertical .eael-tabs-nav>ul>li{width:100%;justify-content:start}.eael-advance-tabs.eael-tabs-vertical .eael-tabs-nav>ul li::after{bottom:auto!important;right:-10px;top:calc(50% - 10px);left:auto!important;border-left:10px solid #444;border-right:0;border-top:10px solid transparent;border-bottom:10px solid transparent}@media only screen and (max-width:767px){.eael-advance-tabs .eael-tabs-nav>ul{flex-wrap:wrap}.eael-advance-tabs .eael-tabs-nav>ul li{flex:1 100%}.eael-advance-tabs.eael-tabs-vertical{flex-wrap:wrap}.eael-advance-tabs.eael-tabs-vertical div.eael-tabs-nav{flex:1 100%}.eael-advance-tabs.eael-tabs-vertical ul{flex:1 100%}.eael-advance-tabs.eael-tabs-vertical ul li{flex:1 100%}div.eael-advance-tabs.eael-tabs-vertical div.eael-tabs-nav>ul li::after{border-left-color:transparent!important;bottom:-20px!important;left:0!important;right:0!important;top:auto!important;border-left:10px solid transparent;border-right:10px solid transparent;border-top-color:#444!important}}
4
  .eael-caldera-form-align-left,.eael-caldera-form-btn-align-left{text-align:left}.eael-caldera-form-align-right,.eael-caldera-form-btn-align-right{text-align:right}.eael-caldera-form-align-center,.eael-caldera-form-btn-align-center{text-align:center}.eael-caldera-form .control-label{display:none}.eael-caldera-form-labels-yes .control-label{display:block}.eael-caldera-form-button-center .form-group input[type=button],.eael-caldera-form-button-center .form-group input[type=submit]{display:block;margin:0 auto}.eael-caldera-form-button-right .form-group input[type=button],.eael-caldera-form-button-right .form-group input[type=submit]{float:right}.eael-caldera-form .intl-tel-input{display:inherit}.eael-custom-radio-checkbox .caldera-grid input[type=checkbox],.eael-custom-radio-checkbox .caldera-grid input[type=radio]{border-style:solid;border-width:0;padding:3px;-webkit-appearance:none}.eael-caldera-form-button-full-width .form-group input[type=button],.eael-caldera-form-button-full-width .form-group input[type=submit]{width:100%}
9
  .eael-countdown-items{list-style:none;margin:0;padding:0;display:table;table-layout:fixed;width:100%}.eael-countdown-items>li{list-style:none;margin:0;padding:0;display:table-cell;position:relative}.eael-countdown-item>div{text-align:center;padding:20px}.eael-countdown-label-block .eael-countdown-digits,.eael-countdown-label-block .eael-countdown-label{display:block;text-align:center}.eael-countdown-digits{font-size:54px;line-height:1}.eael-countdown-label{font-size:18px;line-height:1;color:#fff}.eael-countdown-show-separator .eael-countdown-digits::after{content:":";position:absolute;left:98%;z-index:9999}.eael-countdown-item:last-child .eael-countdown-digits::after{display:none}.eael-countdown-items.style-1 .eael-countdown-item>div{background:#262625}
10
  .eael-creative-button-align-center{text-align:center}.eael-creative-button-wrapper{display:flex}.eael-creative-button{flex:0 0 auto;min-width:150px;text-align:center;vertical-align:middle;position:relative;z-index:1;border-radius:2px;padding:20px 30px;font-size:16px;line-height:1;-webkit-backface-visibility:hidden;backface-visibility:hidden;-moz-osx-font-smoothing:grayscale}.eael-creative-button:focus{outline:0}.eael-creative-button--winona{overflow:hidden;padding:0!important;transition:border-color .3s,background-color .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--winona::after{content:attr(data-text);position:absolute;width:100%;height:100%;top:0;left:0;opacity:0;transform:translate3d(0,25%,0);display:flex;align-items:center;justify-content:center}.eael-creative-button--winona::after,.eael-creative-button--winona>.creative-button-inner{padding:1em 2em;transition:transform .3s,opacity .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--winona:hover::after{opacity:1;transform:translate3d(0,0,0)}.eael-creative-button--winona:hover>.creative-button-inner{opacity:0;transform:translate3d(0,0,0)}.eael-creative-button--ujarak{transition:border-color .4s,color .4s}.eael-creative-button--ujarak::before{content:'';position:absolute;top:0;left:0;width:100%;height:100%;z-index:-1;opacity:0;transform:scale3d(.7,1,1);transition:transform .4s,opacity .4s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--ujarak,.eael-creative-button--ujarak::before{transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--ujarak:hover::before{opacity:1;transform:translate3d(0,0,0)}.eael-creative-button--wayra{overflow:hidden;transition:border-color .3s,color .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--wayra::before{content:'';position:absolute;top:0;left:0;width:150%;height:100%;z-index:-1;transform:rotate3d(0,0,1,-45deg) translate3d(0,-3em,0);transform-origin:0 100%;transition:transform .3s,opacity .3s,background-color .3s}.eael-creative-button--wayra:hover::before{opacity:1;transform:rotate3d(0,0,1,0deg);transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya{float:left;min-width:150px;max-width:250px;display:block;margin:1em;padding:1em 2em;border:none;background:0 0;color:inherit;vertical-align:middle;position:relative;z-index:1;-webkit-backface-visibility:hidden;-moz-osx-font-smoothing:grayscale;overflow:hidden;color:#7986cb;min-width:180px}.eael-creative-button--tamaya.button--inverted{color:#37474f;border-color:#37474f}.eael-creative-button--tamaya::after,.eael-creative-button--tamaya::before{content:attr(data-text);position:absolute;width:100%;height:50%;left:0;background:#7986cb;color:#fff;overflow:hidden;transition:transform .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya.button--inverted::after,.eael-creative-button--tamaya.button--inverted::before{background:#fff;color:#37474f}.eael-creative-button--tamaya::before{top:0;padding-top:1em}.eael-creative-button--tamaya::after{bottom:0;line-height:0}.eael-creative-button--tamaya span{display:block;transform:scale3d(.2,.2,1);opacity:0;transition:transform .3s,opacity .3s;transition-timing-function:cubic-bezier(.2,1,.3,1)}.eael-creative-button--tamaya:hover::before{transform:translate3d(0,-100%,0)}.eael-creative-button--tamaya:hover::after{transform:translate3d(0,100%,0)}.eael-creative-button--tamaya:hover span{opacity:1;transform:scale3d(1,1,1)}.eael-creative-button--rayen{overflow:hidden;padding:0!important}.eael-creative-button--rayen::before{content:attr(data-text);position:absolute;top:0;left:0;width:100%;height:100%;transform:translate3d(-100%,0,0);display:flex;align-items:center;justify-content:center}.eael-creative-button--rayen::before,.eael-creative-button--rayen>.creative-button-inner{padding:1em 2em;transition:transform .3s;transition-timing-function:cubic-bezier(.75,0,.125,1)}.eael-creative-button--rayen:hover::before{transform:translate3d(0,0,0)}.eael-creative-button--rayen:hover>.creative-button-inner{transform:translate3d(0,100%,0)}.creative-button-inner{display:flex;flex-direction:row;align-items:center;justify-content:center}.eael-creative-button-icon-left{margin-right:5px}.eael-creative-button-icon-right{margin-left:5px}
11
  table.eael-data-table thead .sorting,table.eael-data-table thead .sorting_asc,table.eael-data-table thead .sorting_desc{position:relative;z-index:0;outline:0;cursor:pointer}table.eael-data-table thead .sorting:after,table.eael-data-table thead .sorting_asc:after,table.eael-data-table thead .sorting_desc:after{position:absolute;top:50%;right:10px;font-family:FontAwesome;color:#fff;z-index:1;transform:translateY(-50%)}.eael-data-table-wrap .eael-data-tables_wrapper{display:flex;flex-flow:row wrap;justify-content:flex-start;width:100%}.eael-data-table-wrap .eael-data-tables_filter{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_filter label{font-weight:700}.eael-data-table-wrap .eael-data-tables_filter label input[type=search]{height:40px;border:1px solid rgba(0,0,0,.09);outline:0;padding:10px;margin-left:10px}.eael-data-table-wrap .eael-data-tables_length{flex-grow:1;flex-basis:50%}.eael-data-table-wrap .eael-data-tables_length select{width:auto;max-width:120px;height:40px;border:1px solid rgba(0,0,0,.09);outline:0;margin-left:10px;margin-right:10px}.eael-data-table-wrap .eael-data-tables_length label{font-weight:700}.eael-data-table-wrap .eael-data-tables_info{flex-grow:1;flex-basis:50%;font-weight:700}.eael-data-table-wrap .eael-data-tables_paginate{flex-grow:1;flex-basis:50%;text-align:right}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button{padding:10px 15px;background:#f2f2f2;margin-right:2px;cursor:pointer;transition:all .3s}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button:hover{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.current{color:#fff;background:#4a4893}.eael-data-table-wrap .eael-data-tables_paginate .paginate_button.disabled{cursor:no-drop;background:#f2f2f2;opacity:.5;color:#888}.data-header-icon{margin-right:10px;position:relative;top:2px}.eael-data-table{width:100%;height:auto;margin:0;border-collapse:collapse;border:none}.eael-data-table tr{border-style:none}.eael-data-table thead tr{text-align:left}.eael-data-table thead tr th{padding:20px 15px;background:#4a4893;font-size:16px;font-weight:600;font-family:Montserrat,sans-serif;line-height:1;color:#fff;border-color:#000;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table thead tr th:hover{border-color:#000}.eael-data-table tbody tr.even{transition:background .4s ease-in-out}.eael-data-table tbody tr.even:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.even:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr.odd{background:rgba(242,242,242,.5);transition:background .2s ease-in-out}.eael-data-table tbody tr.odd:hover{background:rgba(242,242,242,.7)}.eael-data-table tbody tr.odd:last-child{border-bottom:1px solid rgba(0,0,0,.09)}.eael-data-table tbody tr td{padding:20px 15px;font-size:14px;font-family:Montserrat,sans-serif;line-height:1;border-width:2px;border-style:none;background-clip:padding-box}.eael-data-table-th-img{display:inline-block;margin:0 15px 0 0;line-height:1}.th-mobile-screen{display:none}@media (max-width:767px){.eael-data-table-wrap{overflow-x:scroll!important;padding-bottom:5px}.th-mobile-screen{display:inline-block;padding:0 .6em;margin-right:10px;text-align:center;flex-grow:0;flex-shrink:0;flex-basis:100px}.th-mobile-screen .eael-data-table-th-img{margin:0 auto 15px auto;display:block}.th-mobile-screen .data-header-icon{margin:0 auto 15px auto;display:block}.td-content-wrapper{display:flex;width:100%}.td-content{width:100%;justify-content:center}.td-content>p{width:100%;justify-content:center}.custom-responsive-option-enable .eael-data-table thead{display:none}.custom-responsive-option-enable .eael-data-table tbody tr td{float:none;clear:left;width:100%;text-align:left;display:flex;align-items:center}.eael-data-table .td-content{align-items:center;display:flex}}table.eael-data-table thead .sorting:after{content:"\f0dc"}table.eael-data-table thead .headerSortDown:after{content:"\f0dd"}table.eael-data-table thead .headerSortUp:after{content:"\f0de"}table.eael-data-table thead .sorting_disabled.sorting:after{display:none}table.eael-data-table .sorting.sorting-none:after{display:none}table.eael-data-table .sorting_desc.sorting-none:after{display:none}table.eael-data-table .sorting_asc.sorting-none:after{display:none}.eael-table-align-left table.eael-data-table{float:left}.eael-table-align-center table.eael-data-table{margin:0 auto}.eael-table-align-right table.eael-data-table{float:right}.eael-hide-elements .eael-data-tables_info{display:none}.eael-dt-th-align-left .eael-data-table thead tr th{text-align:left}.eael-dt-td-align-left .eael-data-table tbody tr td{text-align:left}.eael-dt-th-align-right .eael-data-table thead tr th{text-align:right;padding-right:30px}.eael-dt-td-align-right .eael-data-table tbody tr td{text-align:right;padding-right:30px}.eael-dt-th-align-center .eael-data-table thead tr th{text-align:center}.eael-dt-td-align-center .eael-data-table tbody tr td{text-align:center}
 
 
12
  .eael-dual-header{display:block;margin-bottom:50px}.eael-dual-header .title,.eael-dual-header .title span{font-size:36px;font-weight:700;text-transform:uppercase;line-height:48px;margin:10px 0}.eael-dual-header .subtext{font-size:16px;display:block}.eael-dual-header i{display:block;padding:0;margin:20px 0 10px 0;font-size:36px}.eael-dual-header .title span.lead{color:#1abc9c}.eael-dual-header-content-align-center{text-align:center}.eael-dual-header-content-align-left{text-align:left}.eael-dual-header-content-align-right{text-align:right}
13
+ .elementor-panel .pro-feature,.elementor-panel .pro-feature a{color:#a4afb7;text-transform:uppercase;letter-spacing:1px;line-height:1.8;font-style:normal}.elementor-panel .pro-feature a{text-decoration:underline;color:#f54!important}.elementor-control-data_table_content_colspan_pro_alert .elementor-control-title,.elementor-control-data_table_content_rowspan_pro_alert .elementor-control-title,.elementor-control-data_table_content_template_pro_alert .elementor-control-title,.elementor-control-data_table_header_colspan_pro_alert .elementor-control-title,.elementor-control-data_table_header_img_pro_alert .elementor-control-title,.elementor-panel .elementor-control-eael_section_pro .elementor-panel-heading-title.elementor-panel-heading-title,.elementor-panel .elementor-control-eael_section_pro .elementor-panel-heading-toggle{color:#f54}.elementor-panel .elementor-control-eael_control_get_pro .elementor-control-field{display:none!important}.elementor-control-eael_fancy_text_style_pro_alert .elementor-control-title,.elementor-control-eael_img_accordion_type_pro_alert .elementor-control-title,.elementor-control-eael_pricing_table_style_pro_alert .elementor-control-title,.elementor-control-eael_section_countdown_style_pro_alert .elementor-control-title,.elementor-control-eael_section_data_table_enabled_pro_alert .elementor-control-title,.elementor-control-eael_team_members_preset_pro_alert .elementor-control-title,.elementor-control-eael_ticker_type_pro_alert .elementor-control-title{color:#f54}
14
+ .eael-facebook-feed{width:100%;margin:auto}.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{float:none;width:100%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-1 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{float:left;width:50%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-2 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{float:left;width:33.3333%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-3 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{float:left;width:25%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-4 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{float:left;width:20%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-5 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{float:left;width:16.6666%}@media only screen and (max-width:979px){.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{width:50%}}@media only screen and (max-width:480px){.eael-facebook-feed.eael-col-6 .eael-facebook-feed-item{width:100%}}.eael-facebook-feed .eael-facebook-feed-item{display:inline-block;line-height:0}.eael-facebook-feed .eael-facebook-feed-item,.eael-facebook-feed .eael-facebook-feed-item-inner{position:relative}.eael-facebook-feed-overlay .eael-facebook-feed-item .eael-facebook-feed-item-overlay{display:flex;justify-content:center;text-align:center;position:absolute;top:0;bottom:0;left:0;right:0;font-size:12px;line-height:1;transform:scale(.8);opacity:0;transition:all .2s}.eael-facebook-feed-overlay .eael-facebook-feed-item .eael-facebook-feed-item-overlay .eael-facebook-feed-item-overlay-inner{position:relative;align-self:center}.eael-facebook-feed-overlay .eael-facebook-feed-item:hover .eael-facebook-feed-item-overlay{transform:scale(1);opacity:1}.eael-facebook-feed-overlay .eael-facebook-feed-meta{margin-bottom:0}.eael-facebook-feed-overlay .eael-facebook-feed-meta span{display:inline-block;margin:0 15px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner{margin:10px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header{padding:8px 12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user{float:left}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user .eael-facebook-feed-avatar{float:left;display:inline-block;width:32px;height:32px;border-radius:50%;margin-right:10px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-item-user .eael-facebook-feed-username{float:left;display:inline-block;font-size:14px;font-weight:400;line-height:32px;margin:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-header .eael-facebook-feed-post-time{float:right;font-size:11px;font-weight:400;line-height:32px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-content{position:relative;display:block;padding:12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-content .eael-facebook-feed-message{font-size:14px;font-weight:400;line-height:1.3;margin:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap{padding:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-img{display:block;position:relative;margin-bottom:12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-overlay{position:absolute;top:0;right:0;bottom:0;left:0;background-color:rgba(0,0,0,.4);display:flex;align-items:center;justify-content:center}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-preview-overlay i{font-size:48px;color:#fff}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview{padding:0 12px 15px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-host{font-size:12px;font-weight:400;line-height:1;text-transform:uppercase;margin-bottom:5px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-title{font-size:15px;font-weight:700;line-height:1.4;margin-top:0;margin-bottom:6px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-preview-wrap .eael-facebook-feed-url-preview .eael-facebook-feed-url-description{font-size:14px;font-weight:400;line-height:1.2;margin-bottom:0}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer{font-size:13px;font-weight:400;line-height:30px;padding:8px 12px}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer span{display:inline-block}.eael-facebook-feed-card .eael-facebook-feed-item .eael-facebook-feed-item-inner .eael-facebook-feed-item-footer span.eael-facebook-feed-post-likes{margin-right:15px}.elementor-widget-eael-facebook-feed .eael-load-more-button-wrap{justify-content:center;margin-top:15px}.elementor-widget-eael-facebook-feed .eael-load-more-button-wrap.no-pagination{display:none}
15
  .eael-fancy-text-container p{margin:0}.eael-fancy-text-strings{display:none}.eael-fancy-text-prefix,.eael-fancy-text-suffix{display:inline-block}.morphext>.animated{display:inline-block}.typed-cursor{opacity:1;-webkit-animation:blink_cursor .7s infinite;animation:blink_cursor .7s infinite}@keyframes blink_cursor{0%{opacity:1}50%{opacity:0}100%{opacity:1}}@-webkit-keyframes blink_cursor{0%{opacity:1}50%{opacity:0}100%{opacity:1}}.eael-fancy-text-container.style-2{font-size:24px}.eael-fancy-text-container.style-2 .eael-fancy-text-strings{background:#f54;color:#fff;padding:10px 25px}
16
  .elementor-widget-eael-feature-list.-icon-position-left .connector-type-modern.rhombus .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top .connector-type-modern.rhombus .eael-feature-list-item:before{top:3px!important}.elementor-widget-eael-feature-list.-icon-position-left .connector-type-modern.rhombus .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top .connector-type-modern.rhombus .eael-feature-list-item:after{top:45px!important}.elementor-widget-eael-feature-list.-icon-position-right .connector,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .connector{right:0;left:calc(100% - 70px)}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:auto;right:0}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px;top:30px}.elementor-widget-eael-feature-list .eael-feature-list-items{list-style-type:none;margin:0;padding:0}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item{position:relative}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .connector{display:block;position:absolute;width:0;margin:0 auto;z-index:1;height:100%;top:.5em;font-size:60px;left:0;right:calc(100% - 60px);border-left:2px solid #2ecc71;border-right:none!important}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item:last-child .connector{display:none}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box{z-index:2;transition:all .5s}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner{background-color:#37368e;transition:all .5s;display:inline-flex}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon{padding:.5em;transition:all .5s;font-size:30px;line-height:1;color:#37368e;text-align:center;display:inline-flex;display:flex;align-items:center;justify-content:center}@media (prefers-reduced-motion:reduce){.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon{transition:none}}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i{width:1em;height:1em;position:relative;display:block}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i:before{position:absolute;left:50%;transform:translateX(-50%)}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-img{font-size:8px;line-height:1;max-width:inherit}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box{margin:0 0 0 20px}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-title{margin-top:-2px;line-height:1.5em}.elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-content{padding:0;margin:0;font-size:14px;line-height:1.5em}.elementor-widget-eael-feature-list .eael-feature-list-items.stacked .eael-feature-list-icon-box .eael-feature-list-icon{color:#fff}.elementor-widget-eael-feature-list .eael-feature-list-items.framed .eael-feature-list-icon-box .eael-feature-list-icon{background-color:#fff}.elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner{border-radius:50%}.elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner .eael-feature-list-icon{border-radius:50%}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon-inner{transform:rotate(45deg);margin:15px}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon i{transform:rotate(-45deg)}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon img{transform:rotate(-45deg)}.elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-content-box .eael-feature-list-title{margin-top:15px}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px;position:relative}@media (max-width:767px){.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px;display:block}}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{content:"";position:absolute;display:block}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;top:0;z-index:1;border-left:1px solid #000;border-right:none!important;height:100%}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px;top:30px;width:23px;display:block;z-index:2;border-bottom:1px dashed #000;border-top:none!important}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item .connector{display:none}@media (min-width:768px){.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item{padding:0 50px 0 0}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:before{left:auto;right:0}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:after{left:auto;right:5px;top:30px}.elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item .connector{display:none}}@media (min-width:1025px){.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}}@media (max-width:1024px){.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px;top:30px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}}@media (min-width:768px) and (max-width:1024px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}@media (min-width:768px) and (max-width:1024px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{right:0;left:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item{display:block;text-align:left}.elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item,.elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item{display:flex}.elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item{text-align:left;flex-direction:row}.elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item{text-align:right;flex-direction:row-reverse}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-content-box{margin-right:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-content-box{margin-left:0!important;margin-right:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 50px}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 0 0 30px}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{left:0;right:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:5px}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-content-box,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-content-box{margin-left:0!important;margin-top:0!important;margin-bottom:0!important}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 50px 0 0}}@media (max-width:767px) and (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item{padding:0 30px 0 0}}@media (max-width:767px){.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before{right:0;left:auto}.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after,.elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after{left:auto;right:5px}}
17
  .eael-filter-gallery-control{width:100%}.eael-filter-gallery-control ul,.eael-filter-gallery-control ul li{text-align:center}.eael-filter-gallery-control ul{margin:0 0 20px 0;padding:0;text-align:center}.eael-filter-gallery-control{display:flex;flex-flow:1 1 auto;align-items:center;justify-content:center;flex-flow:row wrap;padding:0;margin:0}.eael-filter-gallery-control ul li{list-style:none;font-size:24px;display:inline-block;text-align:center}.eael-filter-gallery-control ul li a.control{font-family:Montserrat,sans-serif;font-size:16px;font-weight:600;padding:10px 25px;margin:10px 6px}.eael-filter-gallery-container{text-align:justify;font-size:.1px}.eael-filter-gallery-container:after{content:'';display:inline-block;width:100%}.eael-filter-gallery-container:not(.eael-cards) .item:before{content:'';display:inline-block;padding-top:56.25%}.eael-filter-gallery-container .item .caption{position:absolute;display:flex;flex-flow:1 1 100%;align-items:center;justify-content:center;z-index:1;top:0;left:0;right:0;bottom:0;transition:transform .4s}.eael-filter-gallery-container.eael-cards .item .caption{display:none}.eael-filter-gallery-container.eael-cards .item .item-img .caption{position:absolute;display:flex;flex-flow:1 1 100%;align-items:center;justify-content:center;z-index:10;top:0;left:0;right:0;bottom:0;transition:transform .4s}.gallery-item-caption-over{width:100%;height:auto}a.eael-gallery-load-more,a.eael-gallery-load-more:hover{text-decoration:none}.eael-filter-gallery-container .item .caption.eael-zoom-in,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-zoom-in{transform:scale(0)}.eael-filter-gallery-container .item:hover .caption.eael-zoom-in,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-zoom-in{transform:scale(1)}.eael-filter-gallery-container .item .caption.eael-slide-left,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-left{transform:translateX(-100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-left,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-left{transform:translateX(0)}.eael-filter-gallery-container .item .caption.eael-slide-right,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-right{transform:translateX(100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-right,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-right{transform:translateX(0)}.eael-filter-gallery-container .item .caption.eael-slide-top,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-top{transform:translateY(-100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-top,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-top{transform:translateY(0)}.eael-filter-gallery-container .item .caption.eael-slide-bottom,.eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-bottom{transform:translateY(100%)}.eael-filter-gallery-container .item:hover .caption.eael-slide-bottom,.eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-bottom{transform:translateY(0)}.eael-filter-gallery-container .item .caption a{display:inline-block;width:50px;height:50px;text-align:center;line-height:50px;border-radius:50%;margin:0 5px;font-size:20px;cursor:pointer;transition:.3s}.eael-container .item .caption a:nth-child(2),.eael-filter-gallery-container .item .caption a:nth-child(1){transition:.6s;opacity:0}.eael-filter-gallery-container .item .caption a:nth-child(1){transform:translateY(-100%)}.eael-filter-gallery-container .item .caption a:nth-child(2){transform:translateY(100%)}.eael-filter-gallery-container .item .caption:hover a:nth-child(1),.eael-filter-gallery-container .item .caption:hover a:nth-child(2){transform:translateY(0);opacity:1}.eael-filter-gallery-container .item .caption .eael-popup-link{outline:0}.eael-filter-gallery-container.eael-cards .item:before{padding-top:0}.eael-filter-gallery-container.eael-cards .item-img{position:relative;background-repeat:no-repeat;background-position:center;background-size:cover;height:220px;z-index:0;overflow:hidden}.eael-filter-gallery-container.eael-cards .item-content{padding:15px}.eael-filter-gallery-container.eael-cards .item-content .title,.eael-filter-gallery-container.eael-cards .item-content .title a{font-size:20px;line-height:1;margin-bottom:0;transition:.3s}.eael-filter-gallery-container.eael-cards .item-content p{font-size:14px;line-height:26px}.eael-fg-card-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:center}.eael-fg-card-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:right}.eael-fg-hoverer-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:center}.eael-fg-hoverer-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over{text-align:right}.eael-fg-content-align-left .eael-cards .item .item-content{text-align:left}.eael-fg-content-align-center .eael-cards .item .item-content{text-align:center}.eael-fg-content-align-right .eael-cards .item .item-content{text-align:right}.mfp-wrap~div.dialog-widget{display:none!important}.eael-filterable-gallery-item-wrap{float:left;width:33.33%}.eael-filter-gallery-container.eael-col-1 .eael-filterable-gallery-item-wrap{width:100%}.eael-filter-gallery-control>ul li{font-size:13px;line-height:1.8;text-transform:uppercase;letter-spacing:1px;padding:6px 15px;cursor:pointer;margin:0 5px;font-weight:400}.eael-filter-gallery-container.eael-col-2 .eael-filterable-gallery-item-wrap{width:50%}.eael-filter-gallery-container.eael-col-4 .eael-filterable-gallery-item-wrap{width:25%}.eael-filter-gallery-container.eael-col-5 .eael-filterable-gallery-item-wrap{width:20%}.eael-gallery-grid-item{margin-left:calc(20px/2);margin-right:calc(20px/2);margin-bottom:20px;position:relative}.gallery-item-caption-wrap,.media-content-wrap{font-size:14px;text-align:left}.gallery-item-thumbnail-wrap.caption-style-card img{max-height:100%;width:100%}.gallery-item-caption-wrap.caption-style-hoverer{position:absolute;left:0;top:0;height:100%;width:100%;padding:15px;z-index:10}.eael-filterable-gallery-item-wrap .eael-gallery-grid-item .gallery-item-thumbnail-wrap>img{height:100%;width:100%;-o-object-fit:cover;object-fit:cover}.fg-item-content,.fg-item-title{color:#fff;font-family:inherit}.gallery-item-caption-wrap.caption-style-card .fg-item-title{font-size:18px;margin:15px 0 15px;line-height:1}.gallery-item-caption-wrap.caption-style-card{background:#f7f7f7}.gallery-item-caption-wrap.caption-style-card .fg-item-title{margin:10px 0 15px;color:#000}.gallery-item-caption-wrap.caption-style-card .fg-item-content{color:#212529;line-height:1.5;font-weight:400}.gallery-item-buttons>a{display:inline-block;font-size:16px;color:#000;margin-right:15px}.gallery-item-buttons>a:visited{color:#000}.gallery-item-caption-wrap.caption-style-card{padding:10px;box-sizing:border-box;font-family:inherit}.gallery-item-caption-wrap .gallery-item-hoverer-bg{position:absolute;left:0;top:0;height:100%;width:100%;content:'';background:#000;z-index:-1;opacity:.7}.gallery-item-caption-wrap.caption-style-hoverer{visibility:hidden;opacity:0;transition:.6s all ease;display:flex;align-items:center}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer{opacity:1;visibility:visible}.gallery-item-caption-wrap.caption-style-hoverer h5{font-size:20px;margin-bottom:5px;line-height:1}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up h5{transform:translateY(20px);transition:.6s all ease}.gallery-item-caption-wrap.caption-style-hoverer p{margin-bottom:5px}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up p{transform:translateY(40px);transition:.6s all ease}.gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up .gallery-item-buttons{transform:translateY(40px);transition:.6s all ease}.gallery-item-caption-wrap .gallery-item-buttons>a span{display:flex;align-items:center;justify-content:center;border-radius:50%;outline:0;text-decoration:none;display:inline-block;text-align:center}.gallery-item-caption-wrap.caption-style-hoverer.eael-zoom-in{transform:scale(.8);transition:.6s all ease}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up .gallery-item-buttons,.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up h5,.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-slide-up p{transform:translate(0)}.eael-gallery-grid-item:hover .gallery-item-caption-wrap.caption-style-hoverer.eael-zoom-in{transform:scale(1);visibility:visible;opacity:1}.gallery-item-caption-wrap.caption-style-hoverer.eael-none{transition:none}.gallery-item-thumbnail-wrap{position:relative}.video-popup,.video-popup-bg{position:absolute;left:0;top:0;height:100%;width:100%}.video-popup>img{width:62px;position:relative;z-index:1;transition:.3s}.video-popup{display:flex;align-items:center;justify-content:center}.video-popup:hover>img{transform:scale(1.1)}.video-popup-bg{visibility:hidden;opacity:0;transition:350ms}.eael-gallery-grid-item:hover .video-popup-bg{visibility:visible;opacity:1}.gallery-item-thumbnail-wrap>.gallery-item-caption-wrap{position:absolute;left:0;top:0;height:100%;width:100%;display:flex;align-items:center;justify-content:center}.gallery-item-caption-wrap.card-hover-bg{visibility:hidden;opacity:0;transition:.8s}.gallery-item-thumbnail-wrap:hover .gallery-item-caption-wrap.card-hover-bg{visibility:visible;opacity:1}.gallery-item-caption-wrap .gallery-item-buttons>a>i{display:flex;align-items:center;justify-content:center;height:100%}@media only screen and (min-width:1025px){.elementor-element.elementor-grid-1{position:relative}.elementor-element.elementor-grid-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-2{position:relative}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-3{position:relative}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-4{position:relative}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-5{position:relative}.elementor-element.elementor-grid-5 .pp-logo-grid{margin-right:-5px}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-6{position:relative}.elementor-element.elementor-grid-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}@media only screen and (max-width:1024px) and (min-width:766px){.elementor-element.elementor-grid-tablet-1{position:relative}.elementor-element.elementor-grid-tablet-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-tablet-2{position:relative}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-tablet-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-tablet-3{position:relative}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-tablet-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-tablet-4{position:relative}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-tablet-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-tablet-5{position:relative}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-tablet-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-tablet-6{position:relative}.elementor-element.elementor-grid-tablet-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-tablet-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}@media only screen and (max-width:767px){.elementor-element.elementor-grid-mobile-1{position:relative}.elementor-element.elementor-grid-mobile-1 .eael-filterable-gallery-item-wrap{width:100%;float:left}.elementor-element.elementor-grid-mobile-2{position:relative}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap{width:50%;float:left}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n){margin-right:0!important}.elementor-element.elementor-grid-mobile-2 .eael-filterable-gallery-item-wrap:nth-of-type(2n+1){clear:left}.elementor-element.elementor-grid-mobile-3{position:relative}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap{width:33.3333%;float:left}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n){margin-right:0!important}.elementor-element.elementor-grid-mobile-3 .eael-filterable-gallery-item-wrap:nth-of-type(3n+1){clear:left}.elementor-element.elementor-grid-mobile-4{position:relative}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap{width:25%;float:left}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n){margin-right:0!important}.elementor-element.elementor-grid-mobile-4 .eael-filterable-gallery-item-wrap:nth-of-type(4n+1){clear:left}.elementor-element.elementor-grid-mobile-5{position:relative}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap{width:20%;float:left}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n){margin-right:0!important}.elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1){clear:left}.elementor-element.elementor-grid-mobile-6{position:relative}.elementor-element.elementor-grid-mobile-6 .pp-logo-grid{margin-right:-6px}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap{width:16.6667%;float:left}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n){margin-right:0!important}.elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1){clear:left}}.fg-layout-3-filter-controls{margin:0;padding:0;list-style:none}.fg-layout-3-item-content{text-align:center}.fg-layout-3-item-content .fg-item-title{font-size:18px;line-height:1;font-weight:500;margin:0;transition:.3s}.fg-layout-3-item-content .fg-item-content p{font-size:13px;font-weight:400}.fg-filter-wrap{position:relative;flex-basis:30%}.fg-layout-3-filter-controls{position:absolute;left:0;background:#fff;z-index:999;width:150px;visibility:hidden;opacity:0;transition:.3s;width:100%;border-radius:5px;padding-top:7px}.fg-layout-3-filter-controls.open-filters{visibility:visible;opacity:1}.fg-layout-3-filter-controls li.control{padding:5px 5px 5px 10px;cursor:pointer;transition:.3s;font-size:14px;color:#7f8995;font-weight:400}.fg-layout-3-filter-controls li.control:hover{color:#2d425a}.fg-layout-3-filter-controls li.control:first-child{border-top:0 solid}.fg-layout-3-filter-controls li.control:last-child{border-bottom:0 solid}.fg-layout-3-filters-wrap{max-width:600px;margin:15px auto 50px}.fg-filter-wrap button{width:100%;border:0 solid;border-radius:0;padding:17px 13px;font-size:14px;color:#2d425a;background:#f7f8ff;height:55px;border-right:1px solid #abb5ff;border-radius:10px 0 0 10px;outline:0;text-align:center;position:relative}.fg-filter-wrap button>i{font-size:18px;position:absolute;top:50%;transform:translateY(-50%);margin-left:10px}.fg-layout-3-search-box{flex-basis:70%;height:100%}.fg-layout-3-search-box input[type=text]{width:100%;height:100%;margin:0;padding:15px;border:0 solid;outline:0;background:0 0}.fg-layout-3-search-box input[type=text]::-webkit-input-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]::-moz-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]:-ms-input-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-search-box input[type=text]:-moz-placeholder{color:#7f8995;font-size:13px}.fg-layout-3-filters-wrap{height:55px;border-radius:5px;display:flex;flex-wrap:wrap;align-items:center}.fg-layout-3-filters-wrap .fg-layout-3-search-box{background:#f7f8ff;border-radius:0 10px 10px 0}.fg-layout-3-item-thumb{position:relative;overflow:hidden}.fg-layout-3-item-thumb .gallery-item-buttons{text-align:center;position:absolute;left:0;top:0;height:100%;width:100%;display:flex;align-items:center;justify-content:center;z-index:4}.fg-layout-3-item-content{padding:27px 27px 30px;text-align:center}.eael-fg-card-content-align-left .fg-layout-3-item-content{text-align:left}.eael-fg-card-content-align-center .fg-layout-3-item-content{text-align:center}.eael-fg-card-content-align-right .fg-layout-3-item-content{text-align:right}.eael-filterable-gallery-item-wrap .fg-layout-3-item.eael-gallery-grid-item{box-shadow:0 0 30px 0 rgba(3,29,60,.05);border-radius:5px}.fg-caption-head{position:absolute;left:0;top:0;width:100%;display:flex;justify-content:space-between;padding:35px 35px;z-index:3;color:#fff;font-size:18px;font-weight:700}.fg-item-category>span{font-size:12px;color:#fff;background:#fa9196;padding:10px 12px;display:inline-block}.fg-layout-3-item-content{position:relative}.fg-item-category{position:absolute;left:0;top:0;text-align:center;width:100%;height:30px;margin-top:-15px;z-index:11}.fg-item-category span{border-radius:5px;line-height:1;visibility:hidden;opacity:0;transition:.3s}.fg-layout-3-item.eael-gallery-grid-item:hover .fg-item-category span{visibility:visible;opacity:1}
18
  .eael-elements-flip-box-container{position:relative;height:300px;width:100%}.eael-elements-flip-box-container .flipbox-button{display:inline-block;transition:all .4s}.eael-elements-flip-box-container a{display:block}.eael-elements-flip-box-vertical-align{width:100%}.eael-elements-flip-box-padding{padding:0 30px 5px 30px}.eael-elements-flip-box-icon-image{display:inline-block;margin:0 auto 0 auto;line-height:1}.eael-elements-flip-box-icon-image.eael_eleements_flip_front_icon_style_background{background:#ccc}.eael_eleements_flip_front_icon_style_bordered{border:2px solid #fff}.eael_flip_box_icon_border_round{border-radius:100px}.eael_eleements_flip_front_icon_style_background,.eael_eleements_flip_front_icon_style_bordered{padding:15px}.eael-elements-flip-box-icon-image i{font-size:40px}.eael-elements-slider-display-table{width:100%}.eael-elements-flip-box-front-container{text-align:center;position:absolute;top:0;left:0;z-index:2;width:100%;height:100%;background:#0e9dd2;color:#fff;border-color:#000;-webkit-display:flex;display:flex;align-items:center}.eael-elements-flip-box-content,.eael-elements-flip-box-heading{color:#fff}.eael-elements-flip-box-heading.flipbox-linked-title{color:#fff;font-size:1.5em;font-weight:700}.eael-elements-flip-box-rear-container{text-align:center;position:absolute;top:0;left:0;width:100%;height:100%;background:#444;color:#fff;display:flex;align-items:center;border-color:#000}.eael-elements-button-floating-container{position:fixed;z-index:100}.eael-elements-button-floating-container .eael-elements-button{margin-top:0;font-size:14px;position:relative;padding:14px 20px}.eael-elements-button{cursor:pointer;display:inline-block;background:#077bbe;color:#fff;line-height:1;padding:16px 25px;margin-top:15px}.eael-elements-button:hover{background:#077bbe;color:#fff}.eael-elements-flip-box-container{perspective:1000px}.eael-elements-flip-box-front-container,.eael-elements-flip-box-rear-container{transition-duration:.5s;transition-property:all;transition-timing-function:ease}.eael-elements-flip-box-flip-card{width:100%;height:100%;transform-style:preserve-3d;transition:all .5s ease}.eael-elements-flip-box-front-container,.eael-elements-flip-box-rear-container{-webkit-backface-visibility:hidden;backface-visibility:hidden;transform:rotateX(0);transform:rotateY(0)}.eael-animate-flip.eael-animate-up .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateX(180deg)}.eael-animate-flip.eael-animate-down .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateX(-180deg)}.eael-animate-flip.eael-animate-left .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateY(-180deg)}.eael-animate-flip.eael-animate-right .eael-elements-flip-box-rear-container,.eael-animate-flip.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-flip-card{transform:rotateY(180deg)}.eael-animate-push.eael-elements-flip-box-container,.eael-animate-slide.eael-elements-flip-box-container{overflow:hidden}.eael-animate-push .eael-elements-flip-box-rear-container,.eael-animate-slide .eael-elements-flip-box-rear-container{z-index:3}.eael-animate-push.eael-animate-up .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-up .eael-elements-flip-box-rear-container{top:100%}.eael-animate-push.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{top:0}.eael-animate-push.eael-animate-down .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-down .eael-elements-flip-box-rear-container{top:auto;bottom:100%}.eael-animate-push.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{top:auto;bottom:0}.eael-animate-push.eael-animate-left .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-left .eael-elements-flip-box-rear-container{left:100%}.eael-animate-push.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{left:0}.eael-animate-push.eael-animate-right .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-right .eael-elements-flip-box-rear-container{left:auto;right:100%}.eael-animate-push.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container,.eael-animate-slide.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{left:auto;right:0}.eael-animate-push.eael-animate-up.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{top:-100%}.eael-animate-push.eael-animate-down.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{top:100%}.eael-animate-push.eael-animate-left.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{left:-100%}.eael-animate-push.eael-animate-right.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{left:100%}.eael-animate-zoom-in .eael-elements-flip-box-rear-container{opacity:0;transform:scale(.75);z-index:3}.eael-animate-zoom-in.eael-elements-flip-box-container:hover .eael-elements-flip-box-rear-container{opacity:1;transform:scale(1)}.eael-animate-zoom-out.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{opacity:0;transform:scale(.75)}.eael-animate-fade.eael-elements-flip-box-container:hover .eael-elements-flip-box-front-container{opacity:0}.eael-flipbox-content-align-right .eael-elements-flip-box-padding{text-align:right}.eael-flipbox-content-align-left .eael-elements-flip-box-padding{text-align:left}.eael-flipbox-content-align-center .eael-elements-flip-box-padding{text-align:center}.eael-flipbox-img-circle .eael-elements-flip-box-icon-image img,.eael-flipbox-img-circle .flipbox-back-image-icon img{border-radius:50%;overflow:hidden}
19
  .eael-fluent-form-wrapper label.ff-el-form-check-label{display:flex;align-items:center}.eael-fluent-form-wrapper label.ff-el-form-check-label input{margin-right:5px}.eael-fluentform-form-button-full-width .ff-btn-submit{width:100%;display:block}.eael-contact-form.eael-fluent-form-wrapper.error-message-hide .ff-el-is-error .text-danger{display:none}.eael-fluentform-form-button-center .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-center .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-center .ff-el-group.ff-text-right .ff-btn-submit{margin:0 auto;display:flex;align-items:center;justify-content:center}.eael-fluentform-form-button-right .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-right .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-right .ff-el-group.ff-text-right .ff-btn-submit{float:right}.eael-fluentform-form-button-left .ff-el-group .ff-btn-submit,.eael-fluentform-form-button-left .ff-el-group.ff-text-left .ff-btn-submit,.eael-fluentform-form-button-left .ff-el-group.ff-text-right .ff-btn-submit{float:left}.eael-contact-form.eael-fluent-form-wrapper.fluent-form-labels-hide label{display:none!important}.eael-fluentform-section-break-content-left .ff-el-group.ff-el-section-break{text-align:left}.eael-fluentform-section-break-content-center .ff-el-group.ff-el-section-break{text-align:center}.eael-fluentform-section-break-content-right .ff-el-group.ff-el-section-break{text-align:right}
20
+ .clearfix::after,.clearfix::before{content:" ";display:table;clear:both}.eael-logo-carousel.nav-top-left,.eael-logo-carousel.nav-top-right,.eael-post-carousel.nav-top-left,.eael-post-carousel.nav-top-right,.eael-product-carousel.nav-top-left,.eael-product-carousel.nav-top-right,.eael-team-slider.nav-top-left,.eael-team-slider.nav-top-right,.eael-testimonial-slider.nav-top-left,.eael-testimonial-slider.nav-top-right{padding-top:40px}.eael-contact-form input[type=date],.eael-contact-form input[type=email],.eael-contact-form input[type=number],.eael-contact-form input[type=tel],.eael-contact-form input[type=text],.eael-contact-form input[type=url],.eael-contact-form textarea{background:#fff;box-shadow:none;-webkit-box-shadow:none;float:none;height:auto;margin:0;outline:0;width:100%}.eael-contact-form input[type=submit]{border:0;float:none;height:auto;margin:0;padding:10px 20px;width:auto;transition:all .25s linear 0s}.eael-contact-form.placeholder-hide input::-webkit-input-placeholder,.eael-contact-form.placeholder-hide textarea::-webkit-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input::-moz-placeholder,.eael-contact-form.placeholder-hide textarea::-moz-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-ms-input-placeholder,.eael-contact-form.placeholder-hide textarea:-ms-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-moz-placeholder,.eael-contact-form.placeholder-hide textarea:-moz-placeholder{opacity:0;visibility:hidden}.eael-custom-radio-checkbox input[type=checkbox],.eael-custom-radio-checkbox input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border-style:solid;border-width:0;outline:0;min-width:1px;width:15px;height:15px;background:#ddd;padding:3px}.eael-custom-radio-checkbox input[type=checkbox]:before,.eael-custom-radio-checkbox input[type=radio]:before{content:"";width:100%;height:100%;padding:0;margin:0;display:block}.eael-custom-radio-checkbox input[type=checkbox]:checked:before,.eael-custom-radio-checkbox input[type=radio]:checked:before{background:#999;transition:all .25s linear 0s}.eael-custom-radio-checkbox input[type=radio]{border-radius:50%}.eael-custom-radio-checkbox input[type=radio]:before{border-radius:50%}.eael-post-elements-readmore-btn{font-size:12px;font-weight:500;transition:all .3s ease-in-out;display:inline-block}.elementor-lightbox .dialog-widget-content{width:100%;height:100%}
21
  .eael-gravity-form-align-default,.eael-gravity-form-align-left,.eael-gravity-form-btn-align-left{text-align:left}.eael-gravity-form-align-right,.eael-gravity-form-btn-align-right{text-align:right}.eael-gravity-form-align-center,.eael-gravity-form-btn-align-center{text-align:center}.eael-gravity-form .gform_wrapper .gform_footer{margin:0;padding:0}.gform_wrapper form li,.gform_wrapper li{list-style:none}.eael-gravity-form .gform_wrapper ul.gform_fields li.gfield{padding:0}.eael-gravity-form .gform_wrapper textarea{padding:0}.eael-gravity-form .gform_wrapper .gform_footer input.button,.eael-gravity-form .gform_wrapper .gform_footer input[type=submit],.eael-gravity-form .gform_wrapper .gform_page_footer input.button,.eael-gravity-form .gform_wrapper .gform_page_footer input[type=submit]{margin:0}.eael-gravity-form.title-description-hide .gform_heading{display:none}.eael-gravity-form.labels-hide .gform_wrapper .field_sublabel_below .ginput_complex.ginput_container label,.eael-gravity-form.labels-hide .gform_wrapper .top_label .gfield_label{display:none}.eael-gravity-form-button-full-width .gform_wrapper .gform_footer input[type=submit]{width:100%}
22
  .eael-img-accordion{display:flex;height:50vh}.eael-img-accordion a{position:relative;flex:1;text-align:center;text-decoration:none;color:#fff;background-size:cover;background-position:center;background-repeat:no-repeat;transition:flex .4s}.eael-grow-accordion{flex:3}.eael-img-accordion .overlay{display:flex;align-items:center;justify-content:center;padding:0 10px;position:absolute;top:0;right:0;bottom:0;left:0;transition:background-color .4s}.eael-img-accordion .overlay .overlay-inner{z-index:1}.eael-img-accordion a:after{content:"";position:absolute;width:100%;height:100%;z-index:0;top:0;left:0;bottom:0;right:0;transition:all .3s ease-in-out}.eael-img-accordion .overlay-inner *{visibility:hidden;opacity:0;transform-style:preserve-3d}.eael-img-accordion .overlay h2{color:#fff;transform:translate3d(0,-60px,0)}.eael-img-accordion .overlay p{color:#fff;transform:translate3d(0,60px,0)}.eael-img-accordion .overlay-inner-show *{opacity:1;visibility:visible;transform:none!important;transition:all .3s .3s}@media screen and (max-width:800px){.eael-img-accordion{flex-direction:column}.eael-img-accordion a:hover{flex:1}.eael-img-accordion a:hover .overlay{background-color:transparent}}
23
  .eael-infobox .infobox-icon{height:auto}.eael-infobox .infobox-icon .infobox-icon-wrap{display:flex;width:100%;height:auto;transition:.3s;align-items:center;justify-content:center}.eael-infobox .infobox-icon .infobox-icon-wrap i{transition:.3s}.eael-infobox-content-align-left .eael-infobox .infobox-button,.eael-infobox-content-align-left .eael-infobox .infobox-content,.eael-infobox-content-align-left .eael-infobox .infobox-icon{text-align:left}.eael-infobox-content-align-right .eael-infobox .infobox-button,.eael-infobox-content-align-right .eael-infobox .infobox-content,.eael-infobox-content-align-right .eael-infobox .infobox-icon{text-align:right}.eael-infobox-content-align-center .eael-infobox .infobox-button,.eael-infobox-content-align-center .eael-infobox .infobox-content,.eael-infobox-content-align-center .eael-infobox .infobox-icon{text-align:center}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap{width:90px;height:90px;text-align:center}.eael-infobox-icon-hover-bg-shape-square:hover .infobox-icon .infobox-icon-wrap{border-radius:0}.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-hover-bg-shape-radius:hover .infobox-icon .infobox-icon-wrap{border-radius:15px}.eael-infobox-icon-bg-shape-radius .infobox-icon .infobox-icon-wrap{display:flex;align-items:center;justify-content:center}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap,.eael-infobox-icon-hover-bg-shape-circle:hover .infobox-icon .infobox-icon-wrap{border-radius:50%}.eael-infobox-icon-bg-shape-circle .infobox-icon .infobox-icon-wrap i,.eael-infobox-icon-bg-shape-square .infobox-icon .infobox-icon-wrap i{margin-top:50%;transform:translateY(-50%)}.eael-infobox .infobox-button a.eael-infobox-button{display:inline-block;padding:5px 10px;transition:all .3s ease-in-out 0s}.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-left.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:flex-start}.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-center.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:center}.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-circle .infobox-icon,.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-radius .infobox-icon,.eael-infobox-content-align-right.eael-infobox-icon-bg-shape-square .infobox-icon{display:flex;justify-content:flex-end}.eael-infobox.icon-on-left{position:relative;z-index:0;display:flex}.eael-infobox.icon-on-left .infobox-icon-wrap,.eael-infobox.icon-on-right .infobox-icon-wrap{justify-content:center;display:flex!important;align-items:center}.eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap{background:0 0;border:0;text-align:left;height:auto;display:block}.eael-infobox .infobox-content p{margin:0 0 15px}.eael-infobox.icon-on-left .infobox-icon .infobox-icon-wrap i{margin-top:0;transform:translateY(0)}.eael-infobox.icon-on-left .infobox-content{padding-left:15px;flex:1 1 auto}.eael-infobox.icon-on-left .infobox-content .title{line-height:1;margin:0 0 10px 0}.eael-infobox.icon-on-right{position:relative;z-index:0;display:flex;flex-direction:row-reverse}.eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap{background:0 0;border:0;text-align:right;width:auto;height:auto;display:block}.eael-infobox.icon-on-right .infobox-icon .infobox-icon-wrap i{margin-top:0;transform:translateY(0)}.eael-infobox.icon-on-right .infobox-content{padding-right:15px;text-align:right;flex:1 1 auto;box-sizing:border-box}.eael-infobox.icon-on-right .infobox-content .title{line-height:1;margin:0 0 10px 0}.eael-infobox .infobox-icon img{transition:all .3s ease-in-out 0s}.eael-infobox-hover-img-shape-square:hover .eael-infobox .infobox-icon img{border-radius:0}.eael-infobox-hover-img-shape-circle:hover .eael-infobox .infobox-icon img,.eael-infobox-shape-circle .eael-infobox .infobox-icon img{border-radius:50%}.eael-infobox-hover-img-shape-radius:hover .eael-infobox .infobox-icon img,.eael-infobox-shape-radius .eael-infobox .infobox-icon img{border-radius:15px}
29
  .eael-post-grid .woocommerce ul.products,.eael-product-grid .woocommerce ul.products{display:grid;grid-gap:25px;margin:0!important;padding:0!important}.eael-post-grid .woocommerce ul.products:after,.eael-post-grid .woocommerce ul.products:before,.eael-product-grid .woocommerce ul.products:after,.eael-product-grid .woocommerce ul.products:before{display:none}.eael-post-grid .woocommerce ul.products .product,.eael-product-grid .woocommerce ul.products .product{width:100%;margin:0;padding:0}.eael-post-grid .woocommerce ul.products.eael-product-columns-1,.eael-product-grid .woocommerce ul.products.eael-product-columns-1{grid-template-columns:100%}.eael-post-grid .woocommerce ul.products.eael-product-columns-2,.eael-product-grid .woocommerce ul.products.eael-product-columns-2{grid-template-columns:repeat(2,1fr)}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-2,.eael-product-grid .woocommerce ul.products.eael-product-columns-2{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(3,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-3,.eael-product-grid .woocommerce ul.products.eael-product-columns-3{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(4,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-4,.eael-product-grid .woocommerce ul.products.eael-product-columns-4{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(5,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-5,.eael-product-grid .woocommerce ul.products.eael-product-columns-5{grid-template-columns:repeat(1,1fr)}}.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(6,1fr)}@media screen and (max-width:767px){.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(2,1fr)}}@media screen and (max-width:480px){.eael-post-grid .woocommerce ul.products.eael-product-columns-6,.eael-product-grid .woocommerce ul.products.eael-product-columns-6{grid-template-columns:repeat(1,1fr)}}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product img,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product img,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product img{width:100%;height:auto;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button{display:block;font-size:14px;font-weight:400;line-height:38px;text-align:center;text-transform:uppercase;color:#fff;background-color:#333;padding:0;margin:15px;border-radius:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button:focus,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product .button.add_to_cart_button:focus{outline:0}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-post-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product a.added_to_cart{display:block;margin:0 0 15px 0;padding:0;font-size:14px;line-height:1;text-transform:capitalize;color:#333;background-color:transparent}.eael-post-grid.eael-product-simple .woocommerce ul.products li.product,.eael-product-grid.eael-product-simple .woocommerce ul.products li.product{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product{border:1px solid transparent}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product a.added_to_cart{visibility:hidden;transition:none}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover{border:1px solid #eee}.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-post-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover .button.add_to_cart_button,.eael-product-grid.eael-product-reveal .woocommerce ul.products li.product:hover a.added_to_cart{visibility:visible}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product{position:relative;float:left;overflow:hidden;text-align:center;padding:0 0 15px 0;border-radius:0;background-color:#fff;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a{text-decoration:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product a:hover,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product a:hover{outline:0;box-shadow:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product img,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product img{width:100%;height:auto;margin:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay{position:relative;overflow:hidden;line-height:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .button-wrap{position:absolute;top:50%;left:0;right:0;text-align:center;transform:translateY(-50%)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link{display:inline-block;font-size:14px;line-height:38px;text-align:center;color:#fff;background-color:#333;width:38px;height:38px;border-style:none;border-radius:50%;vertical-align:middle;padding:0;margin:0 5px;transform:translateY(20px);opacity:0;transition:transform .2s,opacity .3s}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:focus,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .product-link:focus{outline:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button:after{content:"\f217";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:before{display:none}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .add_to_cart_button.loading:after{content:"\f110";display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;height:auto;width:auto;position:relative;top:0;left:0;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart{font-size:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .overlay .added_to_cart:after{content:"\f06e";font:normal normal normal 14px/1 FontAwesome;font-size:14px;line-height:38px;color:#fff;text-rendering:auto;-webkit-font-smoothing:antialiased;vertical-align:middle;margin:0;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .woocommerce-loop-product__title{font-size:16px;font-weight:700;line-height:1;color:#333;margin:25px 0 12px;padding:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .onsale,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .onsale{display:block;line-height:170px;font-size:13px;text-align:center;letter-spacing:0;text-shadow:0 1px 1px rgba(0,0,0,.6);text-transform:uppercase;color:#fff;background-color:#ff2a13;border-radius:0;border:none;box-shadow:none;position:absolute;height:100px;width:200px;z-index:1;left:-100px;top:-50px;right:auto;margin:0;padding:0;transform:rotate(-45deg)}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price{font-size:14px;margin-bottom:0}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price del,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price del{opacity:.5;display:inline-block}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .price ins,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .price ins{font-weight:400;background-color:transparent;color:#ff2a13}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product .star-rating{display:block;float:none;font-size:14px;margin:10px auto}.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-post-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay .add_to_cart_button,.eael-product-grid.eael-product-overlay .woocommerce ul.products li.product:hover .overlay a{opacity:1;transform:translateY(0)}
30
  @-webkit-keyframes animateStripe{0%{transform:translate(0,0)}100%{transform:translate(35px,0)}}@keyframes animateStripe{0%{transform:translate(0,0)}100%{transform:translate(35px,0)}}@-webkit-keyframes animateStripeRTL{0%{transform:translate(0,0)}100%{transform:translate(-35px,0)}}@keyframes animateStripeRTL{0%{transform:translate(0,0)}100%{transform:translate(-35px,0)}}.eael-progressbar{position:relative}.eael-progressbar-title{font-size:20px;font-weight:400}.eael-progressbar-line{position:relative;display:block;width:100%;height:12px;background-color:#eee}.eael-progressbar-line .eael-progressbar-count-wrap{position:absolute;right:0;bottom:calc(100% + 5px);font-size:16px;font-weight:400;line-height:1}.eael-progressbar-line-fill{display:inline-block;position:absolute;top:50%;left:0;width:0;height:12px;background-color:#000;transform:translateY(-50%);transition:width 1.5s linear;overflow:hidden}.eael-progressbar-circle{position:relative;width:200px;height:200px}.eael-progressbar-circle .eael-progressbar-title{font-size:16px;font-weight:400}.eael-progressbar-circle .eael-progressbar-count-wrap{font-size:28px;font-weight:700}.eael-progressbar-circle-shadow{width:220px;height:220px;padding:10px;border-radius:50%}.eael-progressbar-circle-pie{position:absolute;top:0;left:0;width:100%;height:100%;-webkit-clip-path:inset(0 0 0 50%);clip-path:inset(0 0 0 50%)}.eael-progressbar-circle-inner{height:100%;width:100%;border-width:12px;border-style:solid;border-color:#eee;border-radius:50%}.eael-progressbar-circle-half{position:absolute;left:0;top:0;height:100%;width:100%;border-width:12px;border-style:solid;border-color:#000;border-radius:50%;-webkit-clip-path:inset(0 50% 0 0);clip-path:inset(0 50% 0 0)}.eael-progressbar-circle-half-left{transform:rotate(0)}.eael-progressbar-circle-half-right{transform:rotate(180deg);visibility:hidden}.eael-progressbar-circle-inner-content{position:absolute;top:50%;width:100%;transform:translateY(-50%);text-align:center}.eael-progressbar-half-circle{position:relative;width:200px;height:100px;overflow:hidden}.eael-progressbar-half-circle .eael-progressbar-circle-pie{-webkit-clip-path:inset(0 0 50% 0);clip-path:inset(0 0 50% 0)}.eael-progressbar-half-circle .eael-progressbar-circle-half{-webkit-clip-path:inset(50% 0 0 0);clip-path:inset(50% 0 0 0);transform:rotate(0);transition:transform 1.5s linear}.eael-progressbar-half-circle .eael-progressbar-circle-inner-content{top:initial;bottom:0;transform:translateY(0)}.eael-progressbar-half-circle .eael-progressbar-title{font-size:16px;font-weight:400}.eael-progressbar-half-circle .eael-progressbar-count-wrap{font-size:28px;font-weight:700}.eael-progressbar-half-circle-after{position:relative;font-size:12px;font-weight:400;clear:both}.eael-progressbar-postfix-label{float:right}.eael-progressbar-line-stripe .eael-progressbar-line-fill:after{content:'';position:absolute;top:0;left:-35px;width:calc(100% + 70px);height:100%;background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-size:35px 35px}.eael-progressbar-line-animate .eael-progressbar-line-fill:after{-webkit-animation:animateStripe 2s linear infinite;animation:animateStripe 2s linear infinite}.eael-progressbar-line-animate-rtl .eael-progressbar-line-fill:after{-webkit-animation:animateStripeRTL 2s linear infinite;animation:animateStripeRTL 2s linear infinite}.eael-progressbar-circle-wrap>div{margin:0 auto}.eael-progressbar-box-container.left>div,.eael-progressbar-circle-container.left>div,.eael-progressbar-line-container.left{margin:0 auto 0 0}.eael-progressbar-box-container.center>div,.eael-progressbar-circle-container.center>div,.eael-progressbar-line-container.center{margin:0 auto}.eael-progressbar-box-container.right>div,.eael-progressbar-circle-container.right>div,.eael-progressbar-line-container.right{margin:0 0 0 auto}
31
  .eael-reading-progress-wrap.eael-reading-progress-wrap-local .eael-reading-progress-global{display:none}.eael-reading-progress-wrap.eael-reading-progress-wrap-global .eael-reading-progress-local{display:none}.eael-reading-progress-wrap.eael-reading-progress-wrap-disabled .eael-reading-progress-global,.eael-reading-progress-wrap.eael-reading-progress-wrap-disabled .eael-reading-progress-local{display:none}.eael-reading-progress-wrap .eael-reading-progress{width:100%;position:fixed;top:0;left:0;height:5px;z-index:999999}.eael-reading-progress-wrap .eael-reading-progress.eael-reading-progress-bottom{top:unset;bottom:0}.eael-reading-progress-wrap .eael-reading-progress .eael-reading-progress-fill{height:5px;background-color:#1fd18e;width:0%;transition:width 50ms ease}
32
+ .eaelsv-overlay{position:absolute;display:block;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);z-index:4;cursor:pointer;background-size:cover;background-position:50%;text-align:center;overflow:hidden}.eaelsv-overlay-icon{position:absolute;top:50%;left:50%;font-size:90px;color:#fff;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.plyr__controls button{box-shadow:none!important}.plyr__controls button:hover{box-shadow:none!important}.plyr__controls{display:none!important}.eael-sticky-video-wrapper{position:relative;width:100%;min-height:200px;margin:0;padding:0;transition:.5s;text-align:left;overflow:visible}.eael-sticky-video-player2{min-height:20px;overflow:visible}.eael-sticky-video-player2.out{position:fixed;z-index:999;border:0!important;border-radius:0!important;height:200px;width:300px}.eael-sticky-video-wrapper.out .eael-sticky-video-player,.eael-sticky-video-wrapper.out .eael-sticky-video-player2{border-radius:0!important}.eael-sticky-video-player2.in{position:relative;margin:0;padding:0;height:100%;border:0;line-height:1}.owp-play{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%)}.owp-play i{font-size:100px;color:#fff;opacity:.8;text-shadow:1px 0 6px rgba(0,0,0,.3);transition:all .5s}.eael-sticky-video-player:hover .owp-play i{opacity:1}.eaelsv-sticky-player-close{position:absolute;right:-25px;top:-36px;display:none;padding:7px;font-size:24px;z-index:9999;cursor:pointer;box-sizing:content-box;overflow:visible}.eaelsv-sticky-player-close:hover{color:#090}.eaelsv-sticky-player-close:after,.eaelsv-sticky-player-close:before{position:absolute;left:15px;background-color:#333}.eaelsv-sticky-player-close:before{transform:rotate(45deg)}.eaelsv-sticky-player-close:after{transform:rotate(-45deg)}
33
  .eael-team-item{overflow:hidden;position:relative}.team-avatar-rounded figure img{border-radius:50%;height:auto}.eael-team-image>figure{margin:0;padding:0}.eael-team-image>figure img{display:block;margin:0 auto}.eael-team-item .eael-team-content{padding:10px}.eael-team-item .eael-team-member-name{font-size:20px;font-weight:700;letter-spacing:.05em;margin:5px 0;text-transform:uppercase}.eael-team-item .eael-team-member-position{font-size:14px;font-weight:400;letter-spacing:.05em;margin:5px 0 10px;text-transform:uppercase}.eael-team-item .eael-team-content,.eael-team-item .eael-team-content .eael-team-text{font-size:14px;line-height:1.5}.eael-team-content>ul{margin:0;padding:0}.eael-team-content li{display:inline-block;list-style:outside none none;margin-right:10px;text-align:center}.eael-team-content li a{font-size:2.5rem}.eael-team-align-left .eael-team-item .eael-team-content li,.eael-team-align-left .eael-team-item .eael-team-content p,.eael-team-align-left .eael-team-item .eael-team-content ul,.eael-team-align-left .eael-team-item .eael-team-member-name,.eael-team-align-left .eael-team-item .eael-team-member-position,.eael-team-align-left .eael-team-item .eael-team-text{text-align:left}.eael-team-align-right .eael-team-item .eael-team-content li,.eael-team-align-right .eael-team-item .eael-team-content p,.eael-team-align-right .eael-team-item .eael-team-content ul,.eael-team-align-right .eael-team-item .eael-team-member-name,.eael-team-align-right .eael-team-item .eael-team-member-position,.eael-team-align-right .eael-team-item .eael-team-text{text-align:right}.eael-team-align-centered .eael-team-item .eael-team-content li,.eael-team-align-centered .eael-team-item .eael-team-content p,.eael-team-align-centered .eael-team-item .eael-team-content ul,.eael-team-align-centered .eael-team-item .eael-team-member-name,.eael-team-align-centered .eael-team-item .eael-team-member-position,.eael-team-align-centered .eael-team-item .eael-team-text{text-align:center}.eael-team-item.eael-team-members-overlay .eael-team-content{bottom:10px;left:10px;margin-bottom:0;padding-top:15%;opacity:0;overflow:hidden;text-overflow:ellipsis;position:absolute;right:10px;top:10px;transition:all 615ms cubic-bezier(.19,1,.22,1) 0s}.eael-team-item.eael-team-members-overlay:hover .eael-team-content{opacity:1}.eael-team-member-social-link>a{display:inline-block;transition:all .3s cubic-bezier(.19,1,.22,1) 0s}.eael-team-member-social-link>a:focus{outline:0}
34
  .eael-testimonial-slider{position:relative}.testimonial-star-rating{padding:0;margin:0}.testimonial-star-rating li{list-style:none;display:inline-block}.testimonial-star-rating li i{color:#d8d8d8}.rating-five .testimonial-star-rating li i{color:#f2b01e}.rating-one .testimonial-star-rating li:first-child i{color:#f2b01e}.rating-two .testimonial-star-rating li:nth-child(1) i,.rating-two .testimonial-star-rating li:nth-child(2) i{color:#f2b01e}.rating-three .testimonial-star-rating li:nth-child(1) i,.rating-three .testimonial-star-rating li:nth-child(2) i,.rating-three .testimonial-star-rating li:nth-child(3) i{color:#f2b01e}.rating-four .testimonial-star-rating li:nth-child(1) i,.rating-four .testimonial-star-rating li:nth-child(2) i,.rating-four .testimonial-star-rating li:nth-child(3) i,.rating-four .testimonial-star-rating li:nth-child(4) i{color:#f2b01e}.eael-testimonial-image img{max-width:100%}.eael-testimonial-image{padding:10px 0 0 0}.eael-testimonial-image>figure{display:block;margin:0}.testimonial-avatar-rounded figure img{border-radius:50%;height:auto}.eael-testimonial-content{margin:0;padding:10px}.eael-testimonial-item>figure{margin:0 auto;padding:0 20px}.eael-testimonial-item .center-text{text-align:center}.eael-testimonial-item .right-text{text-align:right}.eael-testimonial-item .left-text{text-align:left}.eael-testimonial-item .justify-text{text-align:justify}.eael-testimonial-content .eael-testimonial-text{font-size:100%;font-style:italic;line-height:1.5;margin-top:0;margin-bottom:10px;word-wrap:break-word}.eael-testimonial-content .eael-testimonial-user{display:inline-block;font-family:inherit;font-size:105%;font-style:italic;font-weight:400;line-height:1.5;margin-top:0;margin-bottom:0;margin-right:5px}.eael-testimonial-content .eael-testimonial-user-company{display:inline-block;font-family:inherit;font-size:90%;font-style:italic;font-weight:lighter;line-height:1.75;margin-bottom:0;margin-top:1px}.eael-testimonial-image{position:relative}.eael-testimonial-item .eael-testimonial-quote::after{color:inherit!important;content:"\f10e";font-family:"Font Awesome 5 Free";font-size:200%;font-weight:900}.eael-testimonial-slider.default-style .eael-testimonial-align-centered .eael-testimonial-image figure img{margin:0 auto}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.classic-style .eael-testimonial-align-right .eael-testimonial-image figure img,.eael-testimonial-slider.default-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.default-style .eael-testimonial-align-right .eael-testimonial-image figure img,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-image figure img,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-image figure img{margin:0}.eael-testimonial-slider.classic-style .eael-testimonial-align-right .eael-testimonial-image figure,.eael-testimonial-slider.default-style .eael-testimonial-align-right .eael-testimonial-image figure,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-image figure{text-align:right}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .eael-testimonial-image figure,.eael-testimonial-slider.default-style .eael-testimonial-align-left .eael-testimonial-image figure,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-image figure{text-align:left}.eael-testimonial-slider.classic-style .eael-testimonial-align-right .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-right .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-right .middle-style-content{text-align:right}.eael-testimonial-slider.classic-style .eael-testimonial-align-center .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-center .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-center .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-center .middle-style-content{text-align:center}.eael-testimonial-slider.classic-style .eael-testimonial-align-left .testimonial-classic-style-content,.eael-testimonial-slider.default-style .eael-testimonial-align-left .default-style-testimonial-content,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .eael-testimonial-text,.eael-testimonial-slider.middle-style .eael-testimonial-align-left .middle-style-content{text-align:left}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-text>p,.eael-testimonial-slider.icon-img-right-content .eael-testimonial-text>p{margin:0}.icon-img-left-content .eael-testimonial-image{float:left;width:30%}.icon-img-left-content .eael-testimonial-content{float:left;width:70%;text-align:left}.icon-img-left-content.eael-testimonial-item{overflow:hidden;position:relative}.icon-img-left-content .eael-testimonial-quote{position:absolute;right:0}.icon-img-left-content .eael-testimonial-text{margin-top:0}.eael-testimonial-align-centered .eael-testimonial-user,.eael-testimonial-align-centered .eael-testimonial-user-company{float:none;text-align:center}.eael-testimonial-align-centered .eael-testimonial-image>figure img{display:block;margin-left:auto!important;margin-right:auto!important}.icon-img-right-content .eael-testimonial-image{float:right;width:30%}.icon-img-right-content .eael-testimonial-content{float:right;width:70%;text-align:right}.icon-img-right-content.eael-testimonial-item{overflow:hidden;position:relative}.icon-img-right-content .eael-testimonial-quote{position:absolute}.icon-img-right-content .eael-testimonial-text{margin-top:0}.eael-testimonial-item{position:relative}.classic-style.testimonial-alignment-center .eael-testimonial-image,.default-style.testimonial-alignment-center .eael-testimonial-image{text-align:center}.classic-style.testimonial-alignment-right .eael-testimonial-image,.default-style.testimonial-alignment-right .eael-testimonial-image{text-align:right}.classic-style.testimonial-alignment-center .eael-testimonial-image>figure,.default-style.testimonial-alignment-center .eael-testimonial-image>figure{text-align:center}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-centered .eael-testimonial-content{text-align:center}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-left .eael-testimonial-content{text-align:left}.eael-testimonial-slider.icon-img-left-content .eael-testimonial-align-right .eael-testimonial-content{text-align:right}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-centered .eael-testimonial-content{text-align:center}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-left .eael-testimonial-content{text-align:left}.eael-testimonial-slider.icon-img-right-content .eael-testimonial-align-right .eael-testimonial-content{text-align:right}span.eael-testimonial-quote{position:absolute;right:10px;top:10px}.eael-testimonial-item.left .eael-testimonial-image{text-align:left}.eael-testimonial-item.center .eael-testimonial-image{text-align:center}.eael-testimonial-item.right .eael-testimonial-image{text-align:right}.eael-testimonial-inline-bio .eael-testimonial-image{float:left}.eael-testimonial-inline-bio .bio-text{padding-top:10px}.eael-testimonial-content.eael-testimonial-inline-bio{overflow:hidden;margin-bottom:0;padding-bottom:0}.eael-testimonial-inline-bio .bio-text,.eael-testimonial-inline-bio .testimonial-star-rating{float:left;width:65%}.eael-testimonial-content.eael-testimonial-inline-bio{text-align:left!important}.testimonial-inline-style .eael-testimonial-image{float:left;max-width:100%;padding:0;margin-right:15px}.testimonial-inline-style{overflow:hidden;text-align:left}.content-top-icon-title-inline .eael-testimonial-align-left .eael-testimonial-text,.content-top-icon-title-inline .eael-testimonial-text{text-align:left}.content-top-icon-title-inline .eael-testimonial-align-centered .eael-testimonial-text{text-align:center}.content-top-icon-title-inline .eael-testimonial-align-right .eael-testimonial-text{text-align:right}.content-bottom-icon-title-inline .eael-testimonial-align-left .eael-testimonial-text,.content-bottom-icon-title-inline .eael-testimonial-text{text-align:left}.content-bottom-icon-title-inline .eael-testimonial-align-centered .eael-testimonial-text{text-align:center}.content-bottom-icon-title-inline .eael-testimonial-align-right .eael-testimonial-text{text-align:right}
35
+ .eael-tooltip{position:relative;display:inline-block;min-width:150px;padding:12px 24px;font-size:.93rem;color:#333;line-height:1;cursor:pointer;transition:all .3s ease-in-out}.eael-tooltip .eael-tooltip-text{display:block;width:100%;visibility:hidden;background-color:#000;color:#fff;border-radius:4px;padding:10px;position:absolute;z-index:1;font-size:.93rem;line-height:1.3}.eael-tooltip .eael-tooltip-text p{margin:0}.eael-tooltip .eael-tooltip-text::after{content:"";position:absolute;border-width:5px;border-style:solid}.eael-tooltip:hover .eael-tooltip-text{visibility:visible}.eael-tooltip .eael-tooltip-text.eael-tooltip-left{top:50%;right:100%;transform:translateY(-50%);margin-right:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-left{-webkit-animation:tooltipLeftIn .3s ease-in-out;animation:tooltipLeftIn .3s ease-in-out}.eael-tooltip .eael-tooltip-text.eael-tooltip-left::after{top:calc(50% - 5px);left:100%;border-color:transparent transparent transparent #000}.eael-tooltip .eael-tooltip-text.eael-tooltip-right{top:50%;left:100%;transform:translateY(-50%);transition:all .3s ease-in-out;margin-left:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-right{-webkit-animation:tooltipRightIn .3s linear;animation:tooltipRightIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-right::after{top:calc(50% - 5px);right:100%;border-color:transparent #000 transparent transparent}.eael-tooltip .eael-tooltip-text.eael-tooltip-top{bottom:calc(100%);left:0;right:0;margin:0 auto 10px auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-top::after{margin-top:0;top:100%;left:calc(50% - 5px);border-color:#000 transparent transparent transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-top{-webkit-animation:tooltipTopIn .3s linear;animation:tooltipTopIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom{top:100%;left:0;right:0;margin:10px auto 0 auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom::after{margin-top:0;bottom:100%;left:calc(50% - 5px);border-color:transparent transparent #000 transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-bottom{-webkit-animation:tooltipBottomIn .3s linear;animation:tooltipBottomIn .3s linear}.eael-tooltip-align-left{display:flex;width:100%;justify-content:flex-start}.eael-tooltip-align-right{display:flex;width:100%;justify-content:flex-end}.eael-tooltip-align-center{display:flex;width:100%;justify-content:center}.eael-tooltip-align-justify .eael-tooltip{display:flex;justify-content:center;align-items:center}@-webkit-keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@-webkit-keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@-webkit-keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@-webkit-keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}@keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}.eael-tooltip-text-align-left .eael-tooltip-text{text-align:left}.eael-tooltip-text-align-right .eael-tooltip-text{text-align:right}.eael-tooltip-text-align-center .eael-tooltip-text{text-align:center}.eael-tooltip-text-align-justify .eael-tooltip-text{text-align:justify}
36
  .eael-twitter-feed::after,.eael-twitter-feed::before{content:"";clear:both}.eael-twitter-feed-masonry .eael-twitter-feed-item{float:left}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-2 .eael-twitter-feed-item{width:100%!important}}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-3 .eael-twitter-feed-item{width:100%!important}}@media only screen and (max-width:480px){.eael-twitter-feed-masonry.eael-twitter-feed-col-4 .eael-twitter-feed-item{width:100%!important}}.eael-twitter-feed-item .eael-twitter-feed-item-inner{background:#fff;border:1px solid rgba(0,0,0,.1)}.eael-twitter-feed-item a{color:#08c;text-decoration:none}.eael-twitter-feed-item a:hover{outline:0;color:#005580}.eael-twitter-feed-item a:focus{outline:0}.eael-twitter-feed-item .eael-twitter-feed-item-header{padding:20px 15px 0;margin-bottom:10px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar{float:left;width:38px;margin-right:10px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-avatar.avatar-circle img{border-radius:50%}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta{float:left}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta .eael-twitter-feed-item-icon{color:#1da1f2;margin-right:5px}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-meta .eael-twitter-feed-item-author{color:#444;line-height:1.5em;font-weight:700}.eael-twitter-feed-item .eael-twitter-feed-item-header .eael-twitter-feed-item-date{float:right;margin-right:10px;font-size:90%;color:#999}.eael-twitter-feed-item .eael-twitter-feed-item-content{padding:0 15px 15px}.eael-twitter-feed-item .eael-twitter-feed-item-content p{color:#666;margin:0 0 5px;min-height:20px;text-overflow:ellipsis;-webkit-line-clamp:5;-webkit-box-orient:vertical}.eael-twitter-feed.swiper-container .swiper-button-next,.eael-twitter-feed.swiper-container .swiper-button-prev{background-image:none;outline:0}
37
  .eael-weform-container input,.eael-weform-container textarea{height:auto;padding:10px}.eael-contact-form-align-center .eael-weform-container,.eael-contact-form-btn-align-center .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-align-left .eael-weform-container,.eael-contact-form-btn-align-left .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:left;width:auto}.eael-contact-form-align-right .eael-weform-container,.eael-contact-form-btn-align-right .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:right;width:auto}.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=email],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=number],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=password],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=text],.eael-weform-container ul.wpuf-form li .wpuf-fields input[type=url],.eael-weform-container ul.wpuf-form li .wpuf-fields textarea{max-width:100%}
38
  .eael-wpforms .wpforms-container .wpforms-form .wpforms-page-button,.eael-wpforms .wpforms-container .wpforms-form button[type=submit],.eael-wpforms .wpforms-container .wpforms-form input[type=submit]{border:0}.eael-wpforms .wpforms-container .wpforms-form .wpforms-page-button:hover,.eael-wpforms .wpforms-container .wpforms-form button[type=submit]:hover,.eael-wpforms .wpforms-container .wpforms-form input[type=submit]:hover{border:0}.eael-wpforms .wpforms-container .wpforms-form input[type=checkbox],.eael-wpforms .wpforms-container .wpforms-form input[type=radio]{padding:3px}.eael-wpforms .wpforms-container .wpforms-form .wpforms-field-label{display:none}.eael-wpforms .wpforms-container .wpforms-form .wpforms-field-name .wpforms-field-row{max-width:100%}.eael-wpforms .wpforms-container .wpforms-field input:not([type=radio]):not([type=checkbox]):not([type=submit]):not([type=button]):not([type=image]):not([type=file]),.eael-wpforms .wpforms-container .wpforms-field select,.eael-wpforms .wpforms-container .wpforms-field textarea{max-width:100%!important}.eael-wpforms-labels-yes .wpforms-container .wpforms-form .wpforms-field-label{display:block}.eael-wpforms-form-button-full-width .wpforms-submit-container .wpforms-submit{width:100%}
39
+ @keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4a5764;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr__control--overlaid{background:rgba(0,179,255,.8);border:0;border-radius:100%;color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#00b3ff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:2.5px}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:2.5px}.plyr__controls .plyr__controls__item.plyr__time{padding:0 5px}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls .plyr__controls__item.plyr__volume{padding-right:5px}.plyr__controls .plyr__controls__item.plyr__volume:first-child{padding-right:0}.plyr__controls:empty{display:none}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4a5764;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5764;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(74,87,100,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(74,87,100,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#c1c9d1;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#00b3ff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:26px;color:#00b3ff;display:block;height:19px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;height:5px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__progress{left:6.5px;margin-right:13px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-right:-6.5px;width:calc(100% + 13px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;left:0;margin-top:-2.5px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(193,201,209,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,41,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,41,47,.6) 50%,rgba(35,41,47,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,201,209,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(35,41,47,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;left:0;margin:-2.5px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);margin-bottom:10px;opacity:0;padding:3px;pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c9d1;border-radius:2px;overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:2px;color:#fff;font-size:14px;padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}
40
  .tooltipster-fall,.tooltipster-grow.tooltipster-show{-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-base{display:flex;pointer-events:none;position:absolute}.tooltipster-box{flex:1 1 auto}.tooltipster-content{box-sizing:border-box;max-height:100%;max-width:100%;overflow:auto}.tooltipster-ruler{bottom:0;left:0;overflow:hidden;position:fixed;right:0;top:0;visibility:hidden}.tooltipster-fade{opacity:0;-webkit-transition-property:opacity;-moz-transition-property:opacity;-o-transition-property:opacity;-ms-transition-property:opacity;transition-property:opacity}.tooltipster-fade.tooltipster-show{opacity:1}.tooltipster-grow{-webkit-transform:scale(0,0);-moz-transform:scale(0,0);-o-transform:scale(0,0);-ms-transform:scale(0,0);transform:scale(0,0);-webkit-transition-property:-webkit-transform;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform;-webkit-backface-visibility:hidden}.tooltipster-grow.tooltipster-show{-webkit-transform:scale(1,1);-moz-transform:scale(1,1);-o-transform:scale(1,1);-ms-transform:scale(1,1);transform:scale(1,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-swing{opacity:0;-webkit-transform:rotateZ(4deg);-moz-transform:rotateZ(4deg);-o-transform:rotateZ(4deg);-ms-transform:rotateZ(4deg);transform:rotateZ(4deg);-webkit-transition-property:-webkit-transform,opacity;-moz-transition-property:-moz-transform;-o-transition-property:-o-transform;-ms-transition-property:-ms-transform;transition-property:transform}.tooltipster-swing.tooltipster-show{opacity:1;-webkit-transform:rotateZ(0);-moz-transform:rotateZ(0);-o-transform:rotateZ(0);-ms-transform:rotateZ(0);transform:rotateZ(0);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,1);-webkit-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-moz-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-ms-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);-o-transition-timing-function:cubic-bezier(.23,.635,.495,2.4);transition-timing-function:cubic-bezier(.23,.635,.495,2.4)}.tooltipster-fall{-webkit-transition-property:top;-moz-transition-property:top;-o-transition-property:top;-ms-transition-property:top;transition-property:top;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-fall.tooltipster-initial{top:0!important}.tooltipster-fall.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;top:0!important;opacity:0}.tooltipster-slide{-webkit-transition-property:left;-moz-transition-property:left;-o-transition-property:left;-ms-transition-property:left;transition-property:left;-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1);-webkit-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-moz-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-ms-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);-o-transition-timing-function:cubic-bezier(.175,.885,.32,1.15);transition-timing-function:cubic-bezier(.175,.885,.32,1.15)}.tooltipster-slide.tooltipster-initial{left:-40px!important}.tooltipster-slide.tooltipster-dying{-webkit-transition-property:all;-moz-transition-property:all;-o-transition-property:all;-ms-transition-property:all;transition-property:all;left:0!important;opacity:0}@keyframes tooltipster-fading{0%{opacity:0}100%{opacity:1}}.tooltipster-update-fade{animation:tooltipster-fading .4s}@keyframes tooltipster-rotating{25%{transform:rotate(-2deg)}75%{transform:rotate(2deg)}100%{transform:rotate(0)}}.tooltipster-update-rotate{animation:tooltipster-rotating .6s}@keyframes tooltipster-scaling{50%{transform:scale(1.1)}100%{transform:scale(1)}}.tooltipster-update-scale{animation:tooltipster-scaling .6s}.tooltipster-sidetip .tooltipster-box{background:#565656;border:2px solid #000;border-radius:4px}.tooltipster-sidetip.tooltipster-bottom .tooltipster-box{margin-top:8px}.tooltipster-sidetip.tooltipster-left .tooltipster-box{margin-right:8px}.tooltipster-sidetip.tooltipster-right .tooltipster-box{margin-left:8px}.tooltipster-sidetip.tooltipster-top .tooltipster-box{margin-bottom:8px}.tooltipster-sidetip .tooltipster-content{color:#fff;line-height:18px;padding:6px 14px}.tooltipster-sidetip .tooltipster-arrow{overflow:hidden;position:absolute}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow{height:10px;margin-left:-10px;top:0;width:20px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow{height:20px;margin-top:-10px;right:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow{height:20px;margin-top:-10px;left:0;top:0;width:10px}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow{bottom:0;height:10px;margin-left:-10px;width:20px}.tooltipster-sidetip .tooltipster-arrow-background,.tooltipster-sidetip .tooltipster-arrow-border{height:0;position:absolute;width:0}.tooltipster-sidetip .tooltipster-arrow-background{border:10px solid transparent}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-background{border-bottom-color:#565656;left:0;top:3px}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-background{border-left-color:#565656;left:-3px;top:0}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-background{border-right-color:#565656;left:3px;top:0}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-background{border-top-color:#565656;left:0;top:-3px}.tooltipster-sidetip .tooltipster-arrow-border{border:10px solid transparent;left:0;top:0}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-border{border-bottom-color:#000}.tooltipster-sidetip.tooltipster-left .tooltipster-arrow-border{border-left-color:#000}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-border{border-right-color:#000}.tooltipster-sidetip.tooltipster-top .tooltipster-arrow-border{border-top-color:#000}.tooltipster-sidetip .tooltipster-arrow-uncropped{position:relative}.tooltipster-sidetip.tooltipster-bottom .tooltipster-arrow-uncropped{top:-10px}.tooltipster-sidetip.tooltipster-right .tooltipster-arrow-uncropped{left:-10px}
assets/front-end/css/general/index.css CHANGED
@@ -122,3 +122,8 @@
122
  transition: all 300ms ease-in-out;
123
  display: inline-block;
124
  }
 
 
 
 
 
122
  transition: all 300ms ease-in-out;
123
  display: inline-block;
124
  }
125
+
126
+ .elementor-lightbox .dialog-widget-content {
127
+ width: 100%;
128
+ height: 100%;
129
+ }
assets/front-end/css/general/index.min.css CHANGED
@@ -1 +1 @@
1
- .clearfix::after,.clearfix::before{content:" ";display:table;clear:both}.eael-logo-carousel.nav-top-left,.eael-logo-carousel.nav-top-right,.eael-post-carousel.nav-top-left,.eael-post-carousel.nav-top-right,.eael-product-carousel.nav-top-left,.eael-product-carousel.nav-top-right,.eael-team-slider.nav-top-left,.eael-team-slider.nav-top-right,.eael-testimonial-slider.nav-top-left,.eael-testimonial-slider.nav-top-right{padding-top:40px}.eael-contact-form input[type=date],.eael-contact-form input[type=email],.eael-contact-form input[type=number],.eael-contact-form input[type=tel],.eael-contact-form input[type=text],.eael-contact-form input[type=url],.eael-contact-form textarea{background:#fff;box-shadow:none;-webkit-box-shadow:none;float:none;height:auto;margin:0;outline:0;width:100%}.eael-contact-form input[type=submit]{border:0;float:none;height:auto;margin:0;padding:10px 20px;width:auto;transition:all .25s linear 0s}.eael-contact-form.placeholder-hide input::-webkit-input-placeholder,.eael-contact-form.placeholder-hide textarea::-webkit-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input::-moz-placeholder,.eael-contact-form.placeholder-hide textarea::-moz-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-ms-input-placeholder,.eael-contact-form.placeholder-hide textarea:-ms-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-moz-placeholder,.eael-contact-form.placeholder-hide textarea:-moz-placeholder{opacity:0;visibility:hidden}.eael-custom-radio-checkbox input[type=checkbox],.eael-custom-radio-checkbox input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border-style:solid;border-width:0;outline:0;min-width:1px;width:15px;height:15px;background:#ddd;padding:3px}.eael-custom-radio-checkbox input[type=checkbox]:before,.eael-custom-radio-checkbox input[type=radio]:before{content:"";width:100%;height:100%;padding:0;margin:0;display:block}.eael-custom-radio-checkbox input[type=checkbox]:checked:before,.eael-custom-radio-checkbox input[type=radio]:checked:before{background:#999;transition:all .25s linear 0s}.eael-custom-radio-checkbox input[type=radio]{border-radius:50%}.eael-custom-radio-checkbox input[type=radio]:before{border-radius:50%}.eael-post-elements-readmore-btn{font-size:12px;font-weight:500;transition:all .3s ease-in-out;display:inline-block}
1
+ .clearfix::after,.clearfix::before{content:" ";display:table;clear:both}.eael-logo-carousel.nav-top-left,.eael-logo-carousel.nav-top-right,.eael-post-carousel.nav-top-left,.eael-post-carousel.nav-top-right,.eael-product-carousel.nav-top-left,.eael-product-carousel.nav-top-right,.eael-team-slider.nav-top-left,.eael-team-slider.nav-top-right,.eael-testimonial-slider.nav-top-left,.eael-testimonial-slider.nav-top-right{padding-top:40px}.eael-contact-form input[type=date],.eael-contact-form input[type=email],.eael-contact-form input[type=number],.eael-contact-form input[type=tel],.eael-contact-form input[type=text],.eael-contact-form input[type=url],.eael-contact-form textarea{background:#fff;box-shadow:none;-webkit-box-shadow:none;float:none;height:auto;margin:0;outline:0;width:100%}.eael-contact-form input[type=submit]{border:0;float:none;height:auto;margin:0;padding:10px 20px;width:auto;transition:all .25s linear 0s}.eael-contact-form.placeholder-hide input::-webkit-input-placeholder,.eael-contact-form.placeholder-hide textarea::-webkit-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input::-moz-placeholder,.eael-contact-form.placeholder-hide textarea::-moz-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-ms-input-placeholder,.eael-contact-form.placeholder-hide textarea:-ms-input-placeholder{opacity:0;visibility:hidden}.eael-contact-form.placeholder-hide input:-moz-placeholder,.eael-contact-form.placeholder-hide textarea:-moz-placeholder{opacity:0;visibility:hidden}.eael-custom-radio-checkbox input[type=checkbox],.eael-custom-radio-checkbox input[type=radio]{-webkit-appearance:none;-moz-appearance:none;border-style:solid;border-width:0;outline:0;min-width:1px;width:15px;height:15px;background:#ddd;padding:3px}.eael-custom-radio-checkbox input[type=checkbox]:before,.eael-custom-radio-checkbox input[type=radio]:before{content:"";width:100%;height:100%;padding:0;margin:0;display:block}.eael-custom-radio-checkbox input[type=checkbox]:checked:before,.eael-custom-radio-checkbox input[type=radio]:checked:before{background:#999;transition:all .25s linear 0s}.eael-custom-radio-checkbox input[type=radio]{border-radius:50%}.eael-custom-radio-checkbox input[type=radio]:before{border-radius:50%}.eael-post-elements-readmore-btn{font-size:12px;font-weight:500;transition:all .3s ease-in-out;display:inline-block}.elementor-lightbox .dialog-widget-content{width:100%;height:100%}
assets/front-end/css/sticky-video/index.css ADDED
@@ -0,0 +1,213 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* Overlay Styles */
2
+ .eaelsv-overlay {
3
+ position: absolute;
4
+ display: block;
5
+ width: 100%;
6
+ height: 100%;
7
+ top: 0;
8
+ left: 0;
9
+ right: 0;
10
+ bottom: 0;
11
+ background-color: rgba(0, 0, 0, 0.5);
12
+ z-index: 4;
13
+ cursor: pointer;
14
+ background-size: cover;
15
+ background-position: 50%;
16
+ text-align: center;
17
+ overflow: hidden;
18
+ }
19
+
20
+ .eaelsv-overlay-icon {
21
+ position: absolute;
22
+ top: 50%;
23
+ left: 50%;
24
+ font-size: 90px;
25
+ color: white;
26
+ transform: translate(-50%, -50%);
27
+ -ms-transform: translate(-50%, -50%);
28
+ }
29
+
30
+ /* Plyr CSS Started */
31
+ .plyr__controls button {
32
+ box-shadow: none !important;
33
+ }
34
+
35
+ .plyr__controls button:hover {
36
+ box-shadow: none !important;
37
+ }
38
+
39
+ .plyr--video {
40
+ /*height:100%;*/
41
+ }
42
+
43
+ .plyr__video-embed {
44
+ /*
45
+ height:100%!important;
46
+ padding-bottom:0px!important;
47
+ */
48
+ }
49
+
50
+ .plyr__controls {
51
+ display: none !important;
52
+ }
53
+
54
+ /* Plyr CSS Ended */
55
+ .eael-sticky-video-wrapper {
56
+ position: relative;
57
+ width: 100%;
58
+ min-height: 200px;
59
+ margin: 0px;
60
+ padding: 0px;
61
+ transition: 0.5s;
62
+ text-align: left;
63
+ overflow: visible;
64
+ }
65
+
66
+ .eael-sticky-video-player2 {
67
+ /*height:100%;*/
68
+ min-height: 20px;
69
+ overflow: visible;
70
+ }
71
+
72
+ /*
73
+ .eael-sticky-video-wrapper > .eael-sticky-video-player2 > iframe,
74
+ .eael-sticky-video-wrapper > .eael-sticky-video-player2 > video,
75
+ .eael-sticky-video-wrapper iframe,
76
+ .eael-sticky-video-wrapper video {
77
+ position: relative;
78
+ margin:0px; padding:0px;
79
+ height:100%;
80
+ border: 0;
81
+ line-height: 1;
82
+ }
83
+
84
+ .eael-sticky-video-wrapper > .eael-sticky-video-player > video{
85
+ z-index:99999;
86
+ }
87
+
88
+ .eael-sticky-video-player {
89
+ position: absolute;
90
+ top: 0;
91
+ left: 0;
92
+ width: 100%;
93
+ height: 100%;
94
+ background-size: cover;
95
+ background-position: 50%;
96
+ cursor: pointer;
97
+ text-align: center;
98
+ overflow: hidden;
99
+ }
100
+
101
+ .eael-sticky-video-player1 {
102
+ position: absolute;
103
+ top: 0;
104
+ left: 0;
105
+ width: 100%;
106
+ height: 100%;
107
+ background-size: cover;
108
+ background-position: 50%;
109
+ cursor: pointer;
110
+ text-align: center;
111
+ background:#009900;
112
+ z-index:1000;
113
+ opacity:0.5;
114
+ }
115
+ */
116
+ .eael-sticky-video-player2.out {
117
+ position: fixed;
118
+ z-index: 999;
119
+ border: 0 !important;
120
+ border-radius: 0px !important;
121
+ height: 200px;
122
+ width: 300px;
123
+ }
124
+
125
+ .eael-sticky-video-wrapper.out .eael-sticky-video-player2,
126
+ .eael-sticky-video-wrapper.out .eael-sticky-video-player {
127
+ border-radius: 0px !important;
128
+ }
129
+
130
+ .eael-sticky-video-player2.in {
131
+ position: relative;
132
+ margin: 0px;
133
+ padding: 0px;
134
+ height: 100%;
135
+ border: 0;
136
+ line-height: 1;
137
+ }
138
+
139
+ /*
140
+ .eael-sticky-video-player img {
141
+ display: block;
142
+ width: 100%;
143
+ }
144
+ */
145
+ .owp-play {
146
+ position: absolute;
147
+ top: 50%;
148
+ left: 50%;
149
+ transform: translateX(-50%) translateY(-50%);
150
+ }
151
+
152
+ .owp-play i {
153
+ font-size: 100px;
154
+ color: #fff;
155
+ opacity: 0.8;
156
+ text-shadow: 1px 0 6px rgba(0, 0, 0, 0.3);
157
+ transition: all .5s;
158
+ }
159
+
160
+ .eael-sticky-video-player:hover .owp-play i {
161
+ opacity: 1;
162
+ }
163
+
164
+ /*
165
+ .eaelsv-sticky-player {
166
+ height: 200px;
167
+ width: 300px;
168
+ position: fixed;
169
+ bottom: 50px;
170
+ right: 50px;
171
+ border: 0px solid #009900;
172
+ background-size: cover;
173
+ z-index: 1000;
174
+ background: transparent;
175
+ display:none!important;
176
+ }
177
+ .eaelsv-sticky-player.eaelsv-display-player{
178
+ display:block!important;
179
+ -webkit-animation: fadeIn 1s;
180
+ animation: fadeIn 1s;
181
+ }
182
+ */
183
+ /* === Close Icon === */
184
+ .eaelsv-sticky-player-close {
185
+ position: absolute;
186
+ right: -25px;
187
+ top: -36px;
188
+ display: none;
189
+ padding: 7px;
190
+ font-size: 24px;
191
+ z-index: 9999;
192
+ cursor: pointer;
193
+ box-sizing: content-box;
194
+ overflow: visible;
195
+ }
196
+
197
+ .eaelsv-sticky-player-close:hover {
198
+ color: #009900;
199
+ }
200
+
201
+ .eaelsv-sticky-player-close:before, .eaelsv-sticky-player-close:after {
202
+ position: absolute;
203
+ left: 15px;
204
+ background-color: #333;
205
+ }
206
+
207
+ .eaelsv-sticky-player-close:before {
208
+ transform: rotate(45deg);
209
+ }
210
+
211
+ .eaelsv-sticky-player-close:after {
212
+ transform: rotate(-45deg);
213
+ }
assets/front-end/css/sticky-video/index.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .eaelsv-overlay{position:absolute;display:block;width:100%;height:100%;top:0;left:0;right:0;bottom:0;background-color:rgba(0,0,0,.5);z-index:4;cursor:pointer;background-size:cover;background-position:50%;text-align:center;overflow:hidden}.eaelsv-overlay-icon{position:absolute;top:50%;left:50%;font-size:90px;color:#fff;transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%)}.plyr__controls button{box-shadow:none!important}.plyr__controls button:hover{box-shadow:none!important}.plyr__controls{display:none!important}.eael-sticky-video-wrapper{position:relative;width:100%;min-height:200px;margin:0;padding:0;transition:.5s;text-align:left;overflow:visible}.eael-sticky-video-player2{min-height:20px;overflow:visible}.eael-sticky-video-player2.out{position:fixed;z-index:999;border:0!important;border-radius:0!important;height:200px;width:300px}.eael-sticky-video-wrapper.out .eael-sticky-video-player,.eael-sticky-video-wrapper.out .eael-sticky-video-player2{border-radius:0!important}.eael-sticky-video-player2.in{position:relative;margin:0;padding:0;height:100%;border:0;line-height:1}.owp-play{position:absolute;top:50%;left:50%;transform:translateX(-50%) translateY(-50%)}.owp-play i{font-size:100px;color:#fff;opacity:.8;text-shadow:1px 0 6px rgba(0,0,0,.3);transition:all .5s}.eael-sticky-video-player:hover .owp-play i{opacity:1}.eaelsv-sticky-player-close{position:absolute;right:-25px;top:-36px;display:none;padding:7px;font-size:24px;z-index:9999;cursor:pointer;box-sizing:content-box;overflow:visible}.eaelsv-sticky-player-close:hover{color:#090}.eaelsv-sticky-player-close:after,.eaelsv-sticky-player-close:before{position:absolute;left:15px;background-color:#333}.eaelsv-sticky-player-close:before{transform:rotate(45deg)}.eaelsv-sticky-player-close:after{transform:rotate(-45deg)}
assets/front-end/css/tooltip/index.css CHANGED
@@ -5,7 +5,6 @@
5
  position: relative;
6
  display: inline-block;
7
  min-width: 150px;
8
- text-align: center;
9
  padding: 12px 24px;
10
  font-size: .93rem;
11
  color: #333;
@@ -20,7 +19,6 @@
20
  visibility: hidden;
21
  background-color: black;
22
  color: #fff;
23
- text-align: center;
24
  border-radius: 4px;
25
  padding: 10px;
26
  position: absolute;
@@ -28,6 +26,9 @@
28
  font-size: .93rem;
29
  line-height: 1.3;
30
  }
 
 
 
31
 
32
  .eael-tooltip .eael-tooltip-text::after {
33
  content: "";
@@ -225,3 +226,18 @@
225
  top: 100%;
226
  }
227
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
  position: relative;
6
  display: inline-block;
7
  min-width: 150px;
 
8
  padding: 12px 24px;
9
  font-size: .93rem;
10
  color: #333;
19
  visibility: hidden;
20
  background-color: black;
21
  color: #fff;
 
22
  border-radius: 4px;
23
  padding: 10px;
24
  position: absolute;
26
  font-size: .93rem;
27
  line-height: 1.3;
28
  }
29
+ .eael-tooltip .eael-tooltip-text p {
30
+ margin: 0;
31
+ }
32
 
33
  .eael-tooltip .eael-tooltip-text::after {
34
  content: "";
226
  top: 100%;
227
  }
228
  }
229
+ .eael-tooltip-text-align-left .eael-tooltip-text {
230
+ text-align: left;
231
+ }
232
+
233
+ .eael-tooltip-text-align-right .eael-tooltip-text {
234
+ text-align: right;
235
+ }
236
+
237
+ .eael-tooltip-text-align-center .eael-tooltip-text {
238
+ text-align: center;
239
+ }
240
+
241
+ .eael-tooltip-text-align-justify .eael-tooltip-text {
242
+ text-align: justify;
243
+ }
assets/front-end/css/tooltip/index.min.css CHANGED
@@ -1 +1 @@
1
- .eael-tooltip{position:relative;display:inline-block;min-width:150px;text-align:center;padding:12px 24px;font-size:.93rem;color:#333;line-height:1;cursor:pointer;transition:all .3s ease-in-out}.eael-tooltip .eael-tooltip-text{display:block;width:100%;visibility:hidden;background-color:#000;color:#fff;text-align:center;border-radius:4px;padding:10px;position:absolute;z-index:1;font-size:.93rem;line-height:1.3}.eael-tooltip .eael-tooltip-text::after{content:"";position:absolute;border-width:5px;border-style:solid}.eael-tooltip:hover .eael-tooltip-text{visibility:visible}.eael-tooltip .eael-tooltip-text.eael-tooltip-left{top:50%;right:100%;transform:translateY(-50%);margin-right:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-left{-webkit-animation:tooltipLeftIn .3s ease-in-out;animation:tooltipLeftIn .3s ease-in-out}.eael-tooltip .eael-tooltip-text.eael-tooltip-left::after{top:calc(50% - 5px);left:100%;border-color:transparent transparent transparent #000}.eael-tooltip .eael-tooltip-text.eael-tooltip-right{top:50%;left:100%;transform:translateY(-50%);transition:all .3s ease-in-out;margin-left:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-right{-webkit-animation:tooltipRightIn .3s linear;animation:tooltipRightIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-right::after{top:calc(50% - 5px);right:100%;border-color:transparent #000 transparent transparent}.eael-tooltip .eael-tooltip-text.eael-tooltip-top{bottom:calc(100%);left:0;right:0;margin:0 auto 10px auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-top::after{margin-top:0;top:100%;left:calc(50% - 5px);border-color:#000 transparent transparent transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-top{-webkit-animation:tooltipTopIn .3s linear;animation:tooltipTopIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom{top:100%;left:0;right:0;margin:10px auto 0 auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom::after{margin-top:0;bottom:100%;left:calc(50% - 5px);border-color:transparent transparent #000 transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-bottom{-webkit-animation:tooltipBottomIn .3s linear;animation:tooltipBottomIn .3s linear}.eael-tooltip-align-left{display:flex;width:100%;justify-content:flex-start}.eael-tooltip-align-right{display:flex;width:100%;justify-content:flex-end}.eael-tooltip-align-center{display:flex;width:100%;justify-content:center}.eael-tooltip-align-justify .eael-tooltip{display:flex;justify-content:center;align-items:center}@-webkit-keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@-webkit-keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@-webkit-keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@-webkit-keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}@keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}
1
+ .eael-tooltip{position:relative;display:inline-block;min-width:150px;padding:12px 24px;font-size:.93rem;color:#333;line-height:1;cursor:pointer;transition:all .3s ease-in-out}.eael-tooltip .eael-tooltip-text{display:block;width:100%;visibility:hidden;background-color:#000;color:#fff;border-radius:4px;padding:10px;position:absolute;z-index:1;font-size:.93rem;line-height:1.3}.eael-tooltip .eael-tooltip-text p{margin:0}.eael-tooltip .eael-tooltip-text::after{content:"";position:absolute;border-width:5px;border-style:solid}.eael-tooltip:hover .eael-tooltip-text{visibility:visible}.eael-tooltip .eael-tooltip-text.eael-tooltip-left{top:50%;right:100%;transform:translateY(-50%);margin-right:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-left{-webkit-animation:tooltipLeftIn .3s ease-in-out;animation:tooltipLeftIn .3s ease-in-out}.eael-tooltip .eael-tooltip-text.eael-tooltip-left::after{top:calc(50% - 5px);left:100%;border-color:transparent transparent transparent #000}.eael-tooltip .eael-tooltip-text.eael-tooltip-right{top:50%;left:100%;transform:translateY(-50%);transition:all .3s ease-in-out;margin-left:10px}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-right{-webkit-animation:tooltipRightIn .3s linear;animation:tooltipRightIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-right::after{top:calc(50% - 5px);right:100%;border-color:transparent #000 transparent transparent}.eael-tooltip .eael-tooltip-text.eael-tooltip-top{bottom:calc(100%);left:0;right:0;margin:0 auto 10px auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-top::after{margin-top:0;top:100%;left:calc(50% - 5px);border-color:#000 transparent transparent transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-top{-webkit-animation:tooltipTopIn .3s linear;animation:tooltipTopIn .3s linear}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom{top:100%;left:0;right:0;margin:10px auto 0 auto}.eael-tooltip .eael-tooltip-text.eael-tooltip-bottom::after{margin-top:0;bottom:100%;left:calc(50% - 5px);border-color:transparent transparent #000 transparent}.eael-tooltip:hover .eael-tooltip-text.eael-tooltip-bottom{-webkit-animation:tooltipBottomIn .3s linear;animation:tooltipBottomIn .3s linear}.eael-tooltip-align-left{display:flex;width:100%;justify-content:flex-start}.eael-tooltip-align-right{display:flex;width:100%;justify-content:flex-end}.eael-tooltip-align-center{display:flex;width:100%;justify-content:center}.eael-tooltip-align-justify .eael-tooltip{display:flex;justify-content:center;align-items:center}@-webkit-keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@keyframes tooltipRightIn{0%{opacity:0;left:105%}100%{opacity:1;left:100%}}@-webkit-keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@keyframes tooltipLeftIn{0%{opacity:0;right:105%}100%{opacity:1;right:100%}}@-webkit-keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@keyframes tooltipTopIn{0%{opacity:0;bottom:110%}100%{opacity:1;bottom:100%}}@-webkit-keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}@keyframes tooltipBottomIn{0%{opacity:0;top:110%}100%{opacity:1;top:100%}}.eael-tooltip-text-align-left .eael-tooltip-text{text-align:left}.eael-tooltip-text-align-right .eael-tooltip-text{text-align:right}.eael-tooltip-text-align-center .eael-tooltip-text{text-align:center}.eael-tooltip-text-align-justify .eael-tooltip-text{text-align:justify}
assets/front-end/css/vendor/sticky-video/sticky-video-plyr.css ADDED
@@ -0,0 +1 @@
 
1
+ @keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4a5764;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr__control--overlaid{background:rgba(0,179,255,.8);border:0;border-radius:100%;color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#00b3ff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:2.5px}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:2.5px}.plyr__controls .plyr__controls__item.plyr__time{padding:0 5px}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls .plyr__controls__item.plyr__volume{padding-right:5px}.plyr__controls .plyr__controls__item.plyr__volume:first-child{padding-right:0}.plyr__controls:empty{display:none}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4a5764;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5764;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(74,87,100,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(74,87,100,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#c1c9d1;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#00b3ff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:26px;color:#00b3ff;display:block;height:19px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;height:5px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__progress{left:6.5px;margin-right:13px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-right:-6.5px;width:calc(100% + 13px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;left:0;margin-top:-2.5px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(193,201,209,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,41,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,41,47,.6) 50%,rgba(35,41,47,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,201,209,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(35,41,47,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;left:0;margin:-2.5px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);margin-bottom:10px;opacity:0;padding:3px;pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c9d1;border-radius:2px;overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:2px;color:#fff;font-size:14px;padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}
assets/front-end/css/vendor/sticky-video/sticky-video-plyr.min.css ADDED
@@ -0,0 +1 @@
 
1
+ @keyframes plyr-progress{to{background-position:25px 0}}@keyframes plyr-popup{0%{opacity:.5;transform:translateY(10px)}to{opacity:1;transform:translateY(0)}}@keyframes plyr-fade-in{from{opacity:0}to{opacity:1}}.plyr{-moz-osx-font-smoothing:auto;-webkit-font-smoothing:subpixel-antialiased;direction:ltr;font-family:Avenir,"Avenir Next","Helvetica Neue","Segoe UI",Helvetica,Arial,sans-serif;font-variant-numeric:tabular-nums;font-weight:500;line-height:1.7;max-width:100%;min-width:200px;position:relative;text-shadow:none;transition:box-shadow .3s ease}.plyr audio,.plyr video{border-radius:inherit;height:auto;vertical-align:middle;width:100%}.plyr button{font:inherit;line-height:inherit;width:auto}.plyr:focus{outline:0}.plyr--full-ui{box-sizing:border-box}.plyr--full-ui *,.plyr--full-ui ::after,.plyr--full-ui ::before{box-sizing:inherit}.plyr--full-ui a,.plyr--full-ui button,.plyr--full-ui input,.plyr--full-ui label{touch-action:manipulation}.plyr__badge{background:#4a5764;border-radius:2px;color:#fff;font-size:9px;line-height:1;padding:3px 4px}.plyr--full-ui ::-webkit-media-text-track-container{display:none}.plyr__captions{animation:plyr-fade-in .3s ease;bottom:0;color:#fff;display:none;font-size:14px;left:0;padding:10px;position:absolute;text-align:center;transition:transform .4s ease-in-out;width:100%}.plyr__captions .plyr__caption{background:rgba(0,0,0,.8);border-radius:2px;-webkit-box-decoration-break:clone;box-decoration-break:clone;line-height:185%;padding:.2em .5em;white-space:pre-wrap}.plyr__captions .plyr__caption div{display:inline}.plyr__captions span:empty{display:none}@media (min-width:480px){.plyr__captions{font-size:16px;padding:20px}}@media (min-width:768px){.plyr__captions{font-size:18px}}.plyr--captions-active .plyr__captions{display:block}.plyr:not(.plyr--hide-controls) .plyr__controls:not(:empty)~.plyr__captions{transform:translateY(-40px)}.plyr__control{background:0 0;border:0;border-radius:3px;color:inherit;cursor:pointer;flex-shrink:0;overflow:visible;padding:7px;position:relative;transition:all .3s ease}.plyr__control svg{display:block;fill:currentColor;height:18px;pointer-events:none;width:18px}.plyr__control:focus{outline:0}.plyr__control.plyr__tab-focus{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}a.plyr__control{text-decoration:none}a.plyr__control::after,a.plyr__control::before{display:none}.plyr__control.plyr__control--pressed .icon--not-pressed,.plyr__control.plyr__control--pressed .label--not-pressed,.plyr__control:not(.plyr__control--pressed) .icon--pressed,.plyr__control:not(.plyr__control--pressed) .label--pressed{display:none}.plyr--audio .plyr__control.plyr__tab-focus,.plyr--audio .plyr__control:hover,.plyr--audio .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr--video .plyr__control.plyr__tab-focus,.plyr--video .plyr__control:hover,.plyr--video .plyr__control[aria-expanded=true]{background:#00b3ff;color:#fff}.plyr__control--overlaid{background:rgba(0,179,255,.8);border:0;border-radius:100%;color:#fff;display:none;left:50%;padding:15px;position:absolute;top:50%;transform:translate(-50%,-50%);z-index:2}.plyr__control--overlaid svg{left:2px;position:relative}.plyr__control--overlaid:focus,.plyr__control--overlaid:hover{background:#00b3ff}.plyr--playing .plyr__control--overlaid{opacity:0;visibility:hidden}.plyr--full-ui.plyr--video .plyr__control--overlaid{display:block}.plyr--full-ui ::-webkit-media-controls{display:none}.plyr__controls{align-items:center;display:flex;justify-content:flex-end;text-align:center}.plyr__controls .plyr__progress__container{flex:1;min-width:0}.plyr__controls .plyr__controls__item{margin-left:2.5px}.plyr__controls .plyr__controls__item:first-child{margin-left:0;margin-right:auto}.plyr__controls .plyr__controls__item.plyr__progress__container{padding-left:2.5px}.plyr__controls .plyr__controls__item.plyr__time{padding:0 5px}.plyr__controls .plyr__controls__item.plyr__progress__container:first-child,.plyr__controls .plyr__controls__item.plyr__time+.plyr__time,.plyr__controls .plyr__controls__item.plyr__time:first-child{padding-left:0}.plyr__controls .plyr__controls__item.plyr__volume{padding-right:5px}.plyr__controls .plyr__controls__item.plyr__volume:first-child{padding-right:0}.plyr__controls:empty{display:none}.plyr--audio .plyr__controls{background:#fff;border-radius:inherit;color:#4a5764;padding:10px}.plyr--video .plyr__controls{background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.7));border-bottom-left-radius:inherit;border-bottom-right-radius:inherit;bottom:0;color:#fff;left:0;padding:20px 5px 5px;position:absolute;right:0;transition:opacity .4s ease-in-out,transform .4s ease-in-out;z-index:3}@media (min-width:480px){.plyr--video .plyr__controls{padding:35px 10px 10px}}.plyr--video.plyr--hide-controls .plyr__controls{opacity:0;pointer-events:none;transform:translateY(100%)}.plyr [data-plyr=airplay],.plyr [data-plyr=captions],.plyr [data-plyr=fullscreen],.plyr [data-plyr=pip]{display:none}.plyr--airplay-supported [data-plyr=airplay],.plyr--captions-enabled [data-plyr=captions],.plyr--fullscreen-enabled [data-plyr=fullscreen],.plyr--pip-supported [data-plyr=pip]{display:inline-block}.plyr__menu{display:flex;position:relative}.plyr__menu .plyr__control svg{transition:transform .3s ease}.plyr__menu .plyr__control[aria-expanded=true] svg{transform:rotate(90deg)}.plyr__menu .plyr__control[aria-expanded=true] .plyr__tooltip{display:none}.plyr__menu__container{animation:plyr-popup .2s ease;background:rgba(255,255,255,.9);border-radius:4px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:16px;margin-bottom:10px;position:absolute;right:-3px;text-align:left;white-space:nowrap;z-index:3}.plyr__menu__container>div{overflow:hidden;transition:height .35s cubic-bezier(.4,0,.2,1),width .35s cubic-bezier(.4,0,.2,1)}.plyr__menu__container::after{border:4px solid transparent;border-top-color:rgba(255,255,255,.9);content:'';height:0;position:absolute;right:15px;top:100%;width:0}.plyr__menu__container [role=menu]{padding:7px}.plyr__menu__container [role=menuitem],.plyr__menu__container [role=menuitemradio]{margin-top:2px}.plyr__menu__container [role=menuitem]:first-child,.plyr__menu__container [role=menuitemradio]:first-child{margin-top:0}.plyr__menu__container .plyr__control{align-items:center;color:#4a5764;display:flex;font-size:14px;padding:4px 11px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr__menu__container .plyr__control>span{align-items:inherit;display:flex;width:100%}.plyr__menu__container .plyr__control::after{border:4px solid transparent;content:'';position:absolute;top:50%;transform:translateY(-50%)}.plyr__menu__container .plyr__control--forward{padding-right:28px}.plyr__menu__container .plyr__control--forward::after{border-left-color:rgba(74,87,100,.8);right:5px}.plyr__menu__container .plyr__control--forward.plyr__tab-focus::after,.plyr__menu__container .plyr__control--forward:hover::after{border-left-color:currentColor}.plyr__menu__container .plyr__control--back{font-weight:500;margin:7px;margin-bottom:3px;padding-left:28px;position:relative;width:calc(100% - 14px)}.plyr__menu__container .plyr__control--back::after{border-right-color:rgba(74,87,100,.8);left:7px}.plyr__menu__container .plyr__control--back::before{background:#c1c9d1;box-shadow:0 1px 0 #fff;content:'';height:1px;left:0;margin-top:4px;overflow:hidden;position:absolute;right:0;top:100%}.plyr__menu__container .plyr__control--back.plyr__tab-focus::after,.plyr__menu__container .plyr__control--back:hover::after{border-right-color:currentColor}.plyr__menu__container .plyr__control[role=menuitemradio]{padding-left:7px}.plyr__menu__container .plyr__control[role=menuitemradio]::after,.plyr__menu__container .plyr__control[role=menuitemradio]::before{border-radius:100%}.plyr__menu__container .plyr__control[role=menuitemradio]::before{background:rgba(0,0,0,.1);content:'';display:block;flex-shrink:0;height:16px;margin-right:10px;transition:all .3s ease;width:16px}.plyr__menu__container .plyr__control[role=menuitemradio]::after{background:#fff;border:0;height:6px;left:12px;opacity:0;top:50%;transform:translateY(-50%) scale(0);transition:transform .3s ease,opacity .3s ease;width:6px}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::before{background:#00b3ff}.plyr__menu__container .plyr__control[role=menuitemradio][aria-checked=true]::after{opacity:1;transform:translateY(-50%) scale(1)}.plyr__menu__container .plyr__control[role=menuitemradio].plyr__tab-focus::before,.plyr__menu__container .plyr__control[role=menuitemradio]:hover::before{background:rgba(0,0,0,.1)}.plyr__menu__container .plyr__menu__value{align-items:center;display:flex;margin-left:auto;margin-right:-5px;overflow:hidden;padding-left:25px;pointer-events:none}.plyr--full-ui input[type=range]{-webkit-appearance:none;background:0 0;border:0;border-radius:26px;color:#00b3ff;display:block;height:19px;margin:0;padding:0;transition:box-shadow .3s ease;width:100%}.plyr--full-ui input[type=range]::-webkit-slider-runnable-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-webkit-user-select:none;user-select:none;background-image:linear-gradient(to right,currentColor var(--value,0),transparent var(--value,0))}.plyr--full-ui input[type=range]::-webkit-slider-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;-webkit-appearance:none;margin-top:-4px}.plyr--full-ui input[type=range]::-moz-range-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-moz-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-moz-range-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px}.plyr--full-ui input[type=range]::-moz-range-progress{background:currentColor;border-radius:2.5px;height:5px}.plyr--full-ui input[type=range]::-ms-track{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;color:transparent}.plyr--full-ui input[type=range]::-ms-fill-upper{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none}.plyr--full-ui input[type=range]::-ms-fill-lower{background:0 0;border:0;border-radius:2.5px;height:5px;transition:box-shadow .3s ease;-ms-user-select:none;user-select:none;background:currentColor}.plyr--full-ui input[type=range]::-ms-thumb{background:#fff;border:0;border-radius:100%;box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2);height:13px;position:relative;transition:all .2s ease;width:13px;margin-top:0}.plyr--full-ui input[type=range]::-ms-tooltip{display:none}.plyr--full-ui input[type=range]:focus{outline:0}.plyr--full-ui input[type=range]::-moz-focus-outer{border:0}.plyr--full-ui input[type=range].plyr__tab-focus::-webkit-slider-runnable-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-moz-range-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui input[type=range].plyr__tab-focus::-ms-track{box-shadow:0 0 0 5px rgba(0,179,255,.5);outline:0}.plyr--full-ui.plyr--video input[type=range]::-webkit-slider-runnable-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-moz-range-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]::-ms-track{background-color:rgba(255,255,255,.25)}.plyr--full-ui.plyr--video input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--video input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(255,255,255,.5)}.plyr--full-ui.plyr--audio input[type=range]::-webkit-slider-runnable-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-moz-range-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]::-ms-track{background-color:rgba(193,201,209,.66)}.plyr--full-ui.plyr--audio input[type=range]:active::-webkit-slider-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-moz-range-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr--full-ui.plyr--audio input[type=range]:active::-ms-thumb{box-shadow:0 1px 1px rgba(0,0,0,.15),0 0 0 1px rgba(35,41,47,.2),0 0 0 3px rgba(0,0,0,.1)}.plyr__poster{background-color:#000;background-position:50% 50%;background-repeat:no-repeat;background-size:contain;height:100%;left:0;opacity:0;position:absolute;top:0;transition:opacity .2s ease;width:100%;z-index:1}.plyr--stopped.plyr__poster-enabled .plyr__poster{opacity:1}.plyr__time{font-size:14px}.plyr__time+.plyr__time::before{content:'\2044';margin-right:10px}@media (max-width:767px){.plyr__time+.plyr__time{display:none}}.plyr--video .plyr__time{text-shadow:0 1px 1px rgba(0,0,0,.15)}.plyr__tooltip{background:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);color:#4a5764;font-size:14px;font-weight:500;left:50%;line-height:1.3;margin-bottom:10px;opacity:0;padding:5px 7.5px;pointer-events:none;position:absolute;transform:translate(-50%,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;white-space:nowrap;z-index:2}.plyr__tooltip::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr .plyr__control.plyr__tab-focus .plyr__tooltip,.plyr .plyr__control:hover .plyr__tooltip,.plyr__tooltip--visible{opacity:1;transform:translate(-50%,0) scale(1)}.plyr .plyr__control:hover .plyr__tooltip{z-index:3}.plyr__controls>.plyr__control:first-child .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip{left:0;transform:translate(0,10px) scale(.8);transform-origin:0 100%}.plyr__controls>.plyr__control:first-child .plyr__tooltip::before,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip::before{left:16px}.plyr__controls>.plyr__control:last-child .plyr__tooltip{left:auto;right:0;transform:translate(0,10px) scale(.8);transform-origin:100% 100%}.plyr__controls>.plyr__control:last-child .plyr__tooltip::before{left:auto;right:16px;transform:translateX(50%)}.plyr__controls>.plyr__control:first-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control .plyr__tooltip--visible,.plyr__controls>.plyr__control:first-child+.plyr__control.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child+.plyr__control:hover .plyr__tooltip,.plyr__controls>.plyr__control:first-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:first-child:hover .plyr__tooltip,.plyr__controls>.plyr__control:last-child .plyr__tooltip--visible,.plyr__controls>.plyr__control:last-child.plyr__tab-focus .plyr__tooltip,.plyr__controls>.plyr__control:last-child:hover .plyr__tooltip{transform:translate(0,0) scale(1)}.plyr--video{background:#000;overflow:hidden}.plyr--video.plyr--menu-open{overflow:visible}.plyr__video-wrapper{background:#000;border-radius:inherit;overflow:hidden;position:relative;z-index:0}.plyr__video-embed,.plyr__video-wrapper--fixed-ratio{height:0;padding-bottom:56.25%}.plyr__video-embed iframe,.plyr__video-wrapper--fixed-ratio video{border:0;height:100%;left:0;position:absolute;top:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%}.plyr--full-ui .plyr__video-embed>.plyr__video-embed__container{padding-bottom:240%;position:relative;transform:translateY(-38.28125%)}.plyr__progress{left:6.5px;margin-right:13px;position:relative}.plyr__progress input[type=range],.plyr__progress__buffer{margin-left:-6.5px;margin-right:-6.5px;width:calc(100% + 13px)}.plyr__progress input[type=range]{position:relative;z-index:2}.plyr__progress .plyr__tooltip{font-size:14px;left:0}.plyr__progress__buffer{-webkit-appearance:none;background:0 0;border:0;border-radius:100px;height:5px;left:0;margin-top:-2.5px;padding:0;position:absolute;top:50%}.plyr__progress__buffer::-webkit-progress-bar{background:0 0}.plyr__progress__buffer::-webkit-progress-value{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-moz-progress-bar{background:currentColor;border-radius:100px;min-width:5px;transition:width .2s ease}.plyr__progress__buffer::-ms-fill{border-radius:100px;transition:width .2s ease}.plyr--video .plyr__progress__buffer{box-shadow:0 1px 1px rgba(0,0,0,.15);color:rgba(255,255,255,.25)}.plyr--audio .plyr__progress__buffer{color:rgba(193,201,209,.66)}.plyr--loading .plyr__progress__buffer{animation:plyr-progress 1s linear infinite;background-image:linear-gradient(-45deg,rgba(35,41,47,.6) 25%,transparent 25%,transparent 50%,rgba(35,41,47,.6) 50%,rgba(35,41,47,.6) 75%,transparent 75%,transparent);background-repeat:repeat-x;background-size:25px 25px;color:transparent}.plyr--video.plyr--loading .plyr__progress__buffer{background-color:rgba(255,255,255,.25)}.plyr--audio.plyr--loading .plyr__progress__buffer{background-color:rgba(193,201,209,.66)}.plyr__volume{align-items:center;display:flex;flex:1;position:relative}.plyr__volume input[type=range]{margin-left:5px;position:relative;z-index:2}@media (min-width:480px){.plyr__volume{max-width:90px}}@media (min-width:768px){.plyr__volume{max-width:110px}}.plyr--is-ios .plyr__volume{display:none!important}.plyr--is-ios.plyr--vimeo [data-plyr=mute]{display:none!important}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:fullscreen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}.plyr:fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}.plyr:-ms-fullscreen .plyr__captions{font-size:21px}.plyr:fullscreen .plyr__captions{font-size:21px}}.plyr:-webkit-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-webkit-full-screen video{height:100%}.plyr:-webkit-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-webkit-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-webkit-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-webkit-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-webkit-full-screen .plyr__captions{font-size:21px}}.plyr:-moz-full-screen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-moz-full-screen video{height:100%}.plyr:-moz-full-screen .plyr__video-wrapper{height:100%;position:static}.plyr:-moz-full-screen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-moz-full-screen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-moz-full-screen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-moz-full-screen .plyr__captions{font-size:21px}}.plyr:-ms-fullscreen{background:#000;border-radius:0!important;height:100%;margin:0;width:100%}.plyr:-ms-fullscreen video{height:100%}.plyr:-ms-fullscreen .plyr__video-wrapper{height:100%;position:static}.plyr:-ms-fullscreen.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen{display:block}.plyr:-ms-fullscreen .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr:-ms-fullscreen.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr:-ms-fullscreen .plyr__captions{font-size:21px}}.plyr--fullscreen-fallback{background:#000;border-radius:0!important;height:100%;margin:0;width:100%;bottom:0;left:0;position:fixed;right:0;top:0;z-index:10000000}.plyr--fullscreen-fallback video{height:100%}.plyr--fullscreen-fallback .plyr__video-wrapper{height:100%;position:static}.plyr--fullscreen-fallback.plyr--vimeo .plyr__video-wrapper{height:0;position:relative;top:50%;transform:translateY(-50%)}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen{display:block}.plyr--fullscreen-fallback .plyr__control .icon--exit-fullscreen+svg{display:none}.plyr--fullscreen-fallback.plyr--hide-controls{cursor:none}@media (min-width:1024px){.plyr--fullscreen-fallback .plyr__captions{font-size:21px}}.plyr__ads{border-radius:inherit;bottom:0;cursor:pointer;left:0;overflow:hidden;position:absolute;right:0;top:0;z-index:-1}.plyr__ads>div,.plyr__ads>div iframe{height:100%;position:absolute;width:100%}.plyr__ads::after{background:rgba(35,41,47,.8);border-radius:2px;bottom:10px;color:#fff;content:attr(data-badge-text);font-size:11px;padding:2px 6px;pointer-events:none;position:absolute;right:10px;z-index:3}.plyr__ads::after:empty{display:none}.plyr__cues{background:currentColor;display:block;height:5px;left:0;margin:-2.5px 0 0;opacity:.8;position:absolute;top:50%;width:3px;z-index:3}.plyr__preview-thumb{background-color:rgba(255,255,255,.9);border-radius:3px;bottom:100%;box-shadow:0 1px 2px rgba(0,0,0,.15);margin-bottom:10px;opacity:0;padding:3px;pointer-events:none;position:absolute;transform:translate(0,10px) scale(.8);transform-origin:50% 100%;transition:transform .2s .1s ease,opacity .2s .1s ease;z-index:2}.plyr__preview-thumb--is-shown{opacity:1;transform:translate(0,0) scale(1)}.plyr__preview-thumb::before{border-left:4px solid transparent;border-right:4px solid transparent;border-top:4px solid rgba(255,255,255,.9);bottom:-4px;content:'';height:0;left:50%;position:absolute;transform:translateX(-50%);width:0;z-index:2}.plyr__preview-thumb__image-container{background:#c1c9d1;border-radius:2px;overflow:hidden;position:relative;z-index:0}.plyr__preview-thumb__image-container img{height:100%;left:0;max-height:none;max-width:none;position:absolute;top:0;width:100%}.plyr__preview-thumb__time-container{bottom:6px;left:0;position:absolute;right:0;white-space:nowrap;z-index:3}.plyr__preview-thumb__time-container span{background-color:rgba(0,0,0,.55);border-radius:2px;color:#fff;font-size:14px;padding:3px 6px}.plyr__preview-scrubbing{bottom:0;filter:blur(1px);height:100%;left:0;margin:auto;opacity:0;overflow:hidden;position:absolute;right:0;top:0;transition:opacity .3s ease;width:100%;z-index:1}.plyr__preview-scrubbing--is-shown{opacity:1}.plyr__preview-scrubbing img{height:100%;left:0;max-height:none;max-width:none;object-fit:contain;position:absolute;top:0;width:100%}.plyr--no-transition{transition:none!important}.plyr__sr-only{clip:rect(1px,1px,1px,1px);overflow:hidden;border:0!important;height:1px!important;padding:0!important;position:absolute!important;width:1px!important}.plyr [hidden]{display:none!important}
assets/front-end/js/adv-tabs/index.js CHANGED
@@ -34,6 +34,7 @@ var AdvanceTabHandler = function($scope, $) {
34
  $($currentTabId + " .eael-tabs-nav ul li").click(function() {
35
  var currentTabIndex = $(this).index();
36
  var tabsContainer = $(this).closest(".eael-advance-tabs");
 
37
  var tabsNav = $(tabsContainer)
38
  .children(".eael-tabs-nav")
39
  .children("ul")
@@ -61,6 +62,27 @@ var AdvanceTabHandler = function($scope, $) {
61
  .addClass("active")
62
  .removeClass("inactive");
63
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
64
  $(tabsContent).each(function(index) {
65
  $(this).removeClass("active-default");
66
  });
34
  $($currentTabId + " .eael-tabs-nav ul li").click(function() {
35
  var currentTabIndex = $(this).index();
36
  var tabsContainer = $(this).closest(".eael-advance-tabs");
37
+
38
  var tabsNav = $(tabsContainer)
39
  .children(".eael-tabs-nav")
40
  .children("ul")
62
  .addClass("active")
63
  .removeClass("inactive");
64
 
65
+ var $filterGallery = tabsContent.eq(currentTabIndex).find('.eael-filter-gallery-container'),
66
+ $postGridGallery = tabsContent.eq(currentTabIndex).find('.eael-post-grid.eael-post-appender'),
67
+ $twitterfeedGallery = tabsContent.eq(currentTabIndex).find('.eael-twitter-feed-masonry'),
68
+ $instaGallery = tabsContent.eq(currentTabIndex).find('.eael-instafeed');
69
+
70
+ if($postGridGallery.length) {
71
+ $postGridGallery.isotope();
72
+ }
73
+
74
+ if($twitterfeedGallery.length) {
75
+ $twitterfeedGallery.isotope("layout");
76
+ }
77
+
78
+ if($filterGallery.length) {
79
+ $filterGallery.isotope("layout");
80
+ }
81
+
82
+ if($instaGallery.length) {
83
+ $instaGallery.isotope("layout");
84
+ }
85
+
86
  $(tabsContent).each(function(index) {
87
  $(this).removeClass("active-default");
88
  });
assets/front-end/js/adv-tabs/index.min.js CHANGED
@@ -1 +1 @@
1
- var AdvanceTabHandler=function(a,s){var e="#"+a.find(".eael-advance-tabs").attr("id").toString();s(e+" .eael-tabs-nav ul li").each(function(a){s(this).hasClass("active-default")?(s(e+" .eael-tabs-nav > ul li").removeClass("active").addClass("inactive"),s(this).removeClass("inactive")):0==a&&s(this).removeClass("inactive").addClass("active")}),s(e+" .eael-tabs-content div").each(function(a){s(this).hasClass("active-default")?s(e+" .eael-tabs-content > div").removeClass("active"):0==a&&s(this).removeClass("inactive").addClass("active")}),s(e+" .eael-tabs-nav ul li").click(function(){var a=s(this).index(),e=s(this).closest(".eael-advance-tabs"),t=s(e).children(".eael-tabs-nav").children("ul").children("li"),i=s(e).children(".eael-tabs-content").children("div");s(this).parent("li").addClass("active"),s(t).removeClass("active active-default").addClass("inactive"),s(this).addClass("active").removeClass("inactive"),s(i).removeClass("active").addClass("inactive"),s(i).eq(a).addClass("active").removeClass("inactive"),s(i).each(function(a){s(this).removeClass("active-default")})})};jQuery(window).on("elementor/frontend/init",function(){elementorFrontend.hooks.addAction("frontend/element_ready/eael-adv-tabs.default",AdvanceTabHandler)});
1
+ var AdvanceTabHandler=function(e,c){var a="#"+e.find(".eael-advance-tabs").attr("id").toString();c(a+" .eael-tabs-nav ul li").each(function(e){c(this).hasClass("active-default")?(c(a+" .eael-tabs-nav > ul li").removeClass("active").addClass("inactive"),c(this).removeClass("inactive")):0==e&&c(this).removeClass("inactive").addClass("active")}),c(a+" .eael-tabs-content div").each(function(e){c(this).hasClass("active-default")?c(a+" .eael-tabs-content > div").removeClass("active"):0==e&&c(this).removeClass("inactive").addClass("active")}),c(a+" .eael-tabs-nav ul li").click(function(){var e=c(this).index(),a=c(this).closest(".eael-advance-tabs"),t=c(a).children(".eael-tabs-nav").children("ul").children("li"),i=c(a).children(".eael-tabs-content").children("div");c(this).parent("li").addClass("active"),c(t).removeClass("active active-default").addClass("inactive"),c(this).addClass("active").removeClass("inactive"),c(i).removeClass("active").addClass("inactive"),c(i).eq(e).addClass("active").removeClass("inactive");var s=i.eq(e).find(".eael-filter-gallery-container"),l=i.eq(e).find(".eael-post-grid.eael-post-appender"),n=i.eq(e).find(".eael-twitter-feed-masonry"),d=i.eq(e).find(".eael-instafeed");l.length&&l.isotope(),n.length&&n.isotope("layout"),s.length&&s.isotope("layout"),d.length&&d.isotope("layout"),c(i).each(function(e){c(this).removeClass("active-default")})})};jQuery(window).on("elementor/frontend/init",function(){elementorFrontend.hooks.addAction("frontend/element_ready/eael-adv-tabs.default",AdvanceTabHandler)});
assets/front-end/js/eael.js CHANGED
@@ -1,7512 +1,16644 @@
1
- !function(t,s,e){"use strict";var i=function(t,s){var i=this;this.el=t,this.options={},Object.keys(r).forEach(function(t){i.options[t]=r[t]}),Object.keys(s).forEach(function(t){i.options[t]=s[t]}),this.isInput="input"===this.el.tagName.toLowerCase(),this.attr=this.options.attr,this.showCursor=!this.isInput&&this.options.showCursor,this.elContent=this.attr?this.el.getAttribute(this.attr):this.el.textContent,this.contentType=this.options.contentType,this.typeSpeed=this.options.typeSpeed,this.startDelay=this.options.startDelay,this.backSpeed=this.options.backSpeed,this.backDelay=this.options.backDelay,e&&this.options.stringsElement instanceof e?this.stringsElement=this.options.stringsElement[0]:this.stringsElement=this.options.stringsElement,this.strings=this.options.strings,this.strPos=0,this.arrayPos=0,this.stopNum=0,this.loop=this.options.loop,this.loopCount=this.options.loopCount,this.curLoop=0,this.stop=!1,this.cursorChar=this.options.cursorChar,this.shuffle=this.options.shuffle,this.sequence=[],this.build()};i.prototype={constructor:i,init:function(){var t=this;t.timeout=setTimeout(function(){for(var s=0;s<t.strings.length;++s)t.sequence[s]=s;t.shuffle&&(t.sequence=t.shuffleArray(t.sequence)),t.typewrite(t.strings[t.sequence[t.arrayPos]],t.strPos)},t.startDelay)},build:function(){var t=this;if(this.showCursor===!0&&(this.cursor=s.createElement("span"),this.cursor.className="typed-cursor",this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)),this.stringsElement){this.strings=[],this.stringsElement.style.display="none";var e=Array.prototype.slice.apply(this.stringsElement.children);e.forEach(function(s){t.strings.push(s.innerHTML)})}this.init()},typewrite:function(t,s){if(this.stop!==!0){var e=Math.round(70*Math.random())+this.typeSpeed,i=this;i.timeout=setTimeout(function(){var e=0,r=t.substr(s);if("^"===r.charAt(0)){var o=1;/^\^\d+/.test(r)&&(r=/\d+/.exec(r)[0],o+=r.length,e=parseInt(r)),t=t.substring(0,s)+t.substring(s+o)}if("html"===i.contentType){var n=t.substr(s).charAt(0);if("<"===n||"&"===n){var a="",h="";for(h="<"===n?">":";";t.substr(s+1).charAt(0)!==h&&(a+=t.substr(s).charAt(0),s++,!(s+1>t.length)););s++,a+=h}}i.timeout=setTimeout(function(){if(s===t.length){if(i.options.onStringTyped(i.arrayPos),i.arrayPos===i.strings.length-1&&(i.options.callback(),i.curLoop++,i.loop===!1||i.curLoop===i.loopCount))return;i.timeout=setTimeout(function(){i.backspace(t,s)},i.backDelay)}else{0===s&&i.options.preStringTyped(i.arrayPos);var e=t.substr(0,s+1);i.attr?i.el.setAttribute(i.attr,e):i.isInput?i.el.value=e:"html"===i.contentType?i.el.innerHTML=e:i.el.textContent=e,s++,i.typewrite(t,s)}},e)},e)}},backspace:function(t,s){if(this.stop!==!0){var e=Math.round(70*Math.random())+this.backSpeed,i=this;i.timeout=setTimeout(function(){if("html"===i.contentType&&">"===t.substr(s).charAt(0)){for(var e="";"<"!==t.substr(s-1).charAt(0)&&(e-=t.substr(s).charAt(0),s--,!(s<0)););s--,e+="<"}var r=t.substr(0,s);i.attr?i.el.setAttribute(i.attr,r):i.isInput?i.el.value=r:"html"===i.contentType?i.el.innerHTML=r:i.el.textContent=r,s>i.stopNum?(s--,i.backspace(t,s)):s<=i.stopNum&&(i.arrayPos++,i.arrayPos===i.strings.length?(i.arrayPos=0,i.shuffle&&(i.sequence=i.shuffleArray(i.sequence)),i.init()):i.typewrite(i.strings[i.sequence[i.arrayPos]],s))},e)}},shuffleArray:function(t){var s,e,i=t.length;if(i)for(;--i;)e=Math.floor(Math.random()*(i+1)),s=t[e],t[e]=t[i],t[i]=s;return t},reset:function(){var t=this;clearInterval(t.timeout);this.el.getAttribute("id");this.el.textContent="","undefined"!=typeof this.cursor&&"undefined"!=typeof this.cursor.parentNode&&this.cursor.parentNode.removeChild(this.cursor),this.strPos=0,this.arrayPos=0,this.curLoop=0,this.options.resetCallback()}},i["new"]=function(t,e){var r=Array.prototype.slice.apply(s.querySelectorAll(t));r.forEach(function(t){var s=t._typed,r="object"==typeof e&&e;s&&s.reset(),t._typed=s=new i(t,r),"string"==typeof e&&s[e]()})},e&&(e.fn.typed=function(t){return this.each(function(){var s=e(this),r=s.data("typed"),o="object"==typeof t&&t;r&&r.reset(),s.data("typed",r=new i(this,o)),"string"==typeof t&&r[t]()})}),t.Typed=i;var r={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],stringsElement:null,typeSpeed:0,startDelay:0,backSpeed:0,shuffle:!1,backDelay:500,loop:!1,loopCount:!1,showCursor:!0,cursorChar:"|",attr:null,contentType:"html",callback:function(){},preStringTyped:function(){},onStringTyped:function(){},resetCallback:function(){}}}(window,document,window.jQuery);
2
- !function(a){"use strict";function b(b,c){this.element=a(b),this.settings=a.extend({},d,c),this._defaults=d,this._init()}var c="Morphext",d={animation:"bounceIn",separator:",",speed:2e3,complete:a.noop};b.prototype={_init:function(){var b=this;this.phrases=[],this.element.addClass("morphext"),a.each(this.element.text().split(this.settings.separator),function(c,d){b.phrases.push(a.trim(d))}),this.index=-1,this.animate(),this.start()},animate:function(){this.index=++this.index%this.phrases.length,this.element[0].innerHTML='<span class="animated '+this.settings.animation+'">'+this.phrases[this.index]+"</span>",a.isFunction(this.settings.complete)&&this.settings.complete.call(this)},start:function(){var a=this;this._interval=setInterval(function(){a.animate()},this.settings.speed)},stop:function(){this._interval=clearInterval(this._interval)}},a.fn[c]=function(d){return this.each(function(){a.data(this,"plugin_"+c)||a.data(this,"plugin_"+c,new b(this,d))})}}(jQuery);
3
-
4
  /*!
5
- * Morphext - Text Rotating Plugin for jQuery
6
- * https://github.com/MrSaints/Morphext
7
- *
8
- * Built on jQuery Boilerplate
9
- * http://jqueryboilerplate.com/
10
  *
11
- * Copyright 2014 Ian Lai and other contributors
12
  * Released under the MIT license
13
- * http://ian.mit-license.org/
14
  */
15
 
16
- /*eslint-env browser */
17
- /*global jQuery:false */
18
- /*eslint-disable no-underscore-dangle */
 
 
 
 
 
 
19
 
20
- (function ($) {
21
  "use strict";
22
 
23
- var pluginName = "Morphext",
24
- defaults = {
25
- animation: "bounceIn",
26
- separator: ",",
27
- speed: 2000,
28
- complete: $.noop
29
  };
30
 
31
- function Plugin (element, options) {
32
- this.element = $(element);
33
 
34
- this.settings = $.extend({}, defaults, options);
35
- this._defaults = defaults;
36
- this._init();
37
- }
38
 
39
- Plugin.prototype = {
40
- _init: function () {
41
- var $that = this;
42
- this.phrases = [];
43
 
44
- this.element.addClass("morphext");
 
 
 
 
45
 
46
- $.each(this.element.text().split(this.settings.separator), function (key, value) {
47
- $that.phrases.push($.trim(value));
48
- });
49
 
50
- this.index = -1;
51
- this.animate();
52
- this.start();
 
 
 
 
 
53
  },
54
- animate: function () {
55
- this.index = ++this.index % this.phrases.length;
56
- this.element[0].innerHTML = "<span class=\"animated " + this.settings.animation + "\">" + this.phrases[this.index] + "</span>";
57
 
58
- if ($.isFunction(this.settings.complete)) {
59
- this.settings.complete.call(this);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
61
  },
 
62
  start: function () {
63
- var $that = this;
64
- this._interval = setInterval(function () {
65
- $that.animate();
66
- }, this.settings.speed);
 
 
 
67
  },
 
68
  stop: function () {
69
- this._interval = clearInterval(this._interval);
70
- }
71
- };
 
 
72
 
73
- $.fn[pluginName] = function (options) {
74
- return this.each(function() {
75
- if (!$.data(this, "plugin_" + pluginName)) {
76
- $.data(this, "plugin_" + pluginName, new Plugin(this, options));
77
  }
78
- });
79
- };
80
- })(jQuery);
81
 
82
- /*!
83
- *
84
- * typed.js - A JavaScript Typing Animation Library
85
- * Author: Matt Boldt <me@mattboldt.com>
86
- * Version: v2.0.9
87
- * Url: https://github.com/mattboldt/typed.js
88
- * License(s): MIT
89
- *
90
- */
91
- (function webpackUniversalModuleDefinition(root, factory) {
92
- if(typeof exports === 'object' && typeof module === 'object')
93
- module.exports = factory();
94
- else if(typeof define === 'function' && define.amd)
95
- define([], factory);
96
- else if(typeof exports === 'object')
97
- exports["Typed"] = factory();
98
- else
99
- root["Typed"] = factory();
100
- })(this, function() {
101
- return /******/ (function(modules) { // webpackBootstrap
102
- /******/ // The module cache
103
- /******/ var installedModules = {};
104
- /******/
105
- /******/ // The require function
106
- /******/ function __webpack_require__(moduleId) {
107
- /******/
108
- /******/ // Check if module is in cache
109
- /******/ if(installedModules[moduleId])
110
- /******/ return installedModules[moduleId].exports;
111
- /******/
112
- /******/ // Create a new module (and put it into the cache)
113
- /******/ var module = installedModules[moduleId] = {
114
- /******/ exports: {},
115
- /******/ id: moduleId,
116
- /******/ loaded: false
117
- /******/ };
118
- /******/
119
- /******/ // Execute the module function
120
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
121
- /******/
122
- /******/ // Flag the module as loaded
123
- /******/ module.loaded = true;
124
- /******/
125
- /******/ // Return the exports of the module
126
- /******/ return module.exports;
127
- /******/ }
128
- /******/
129
- /******/
130
- /******/ // expose the modules object (__webpack_modules__)
131
- /******/ __webpack_require__.m = modules;
132
- /******/
133
- /******/ // expose the module cache
134
- /******/ __webpack_require__.c = installedModules;
135
- /******/
136
- /******/ // __webpack_public_path__
137
- /******/ __webpack_require__.p = "";
138
- /******/
139
- /******/ // Load entry module and return exports
140
- /******/ return __webpack_require__(0);
141
- /******/ })
142
- /************************************************************************/
143
- /******/ ([
144
- /* 0 */
145
- /***/ (function(module, exports, __webpack_require__) {
146
 
147
- 'use strict';
148
-
149
- Object.defineProperty(exports, '__esModule', {
150
- value: true
151
- });
152
-
153
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
154
-
155
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
156
-
157
- var _initializerJs = __webpack_require__(1);
158
-
159
- var _htmlParserJs = __webpack_require__(3);
160
-
161
- /**
162
- * Welcome to Typed.js!
163
- * @param {string} elementId HTML element ID _OR_ HTML element
164
- * @param {object} options options object
165
- * @returns {object} a new Typed object
166
- */
167
-
168
- var Typed = (function () {
169
- function Typed(elementId, options) {
170
- _classCallCheck(this, Typed);
171
-
172
- // Initialize it up
173
- _initializerJs.initializer.load(this, options, elementId);
174
- // All systems go!
175
- this.begin();
176
- }
177
-
178
- /**
179
- * Toggle start() and stop() of the Typed instance
180
- * @public
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
181
  */
182
 
183
- _createClass(Typed, [{
184
- key: 'toggle',
185
- value: function toggle() {
186
- this.pause.status ? this.start() : this.stop();
187
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
188
 
189
- /**
190
- * Stop typing / backspacing and enable cursor blinking
191
- * @public
192
- */
193
- }, {
194
- key: 'stop',
195
- value: function stop() {
196
- if (this.typingComplete) return;
197
- if (this.pause.status) return;
198
- this.toggleBlinking(true);
199
- this.pause.status = true;
200
- this.options.onStop(this.arrayPos, this);
201
- }
 
 
 
 
 
 
 
 
202
 
203
  /**
204
- * Start typing / backspacing after being stopped
205
- * @public
 
 
 
206
  */
207
- }, {
208
- key: 'start',
209
- value: function start() {
210
- if (this.typingComplete) return;
211
- if (!this.pause.status) return;
212
- this.pause.status = false;
213
- if (this.pause.typewrite) {
214
- this.typewrite(this.pause.curString, this.pause.curStrPos);
215
  } else {
216
- this.backspace(this.pause.curString, this.pause.curStrPos);
217
  }
218
- this.options.onStart(this.arrayPos, this);
219
- }
220
 
221
- /**
222
- * Destroy this instance of Typed
223
- * @public
224
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
225
  }, {
226
- key: 'destroy',
227
- value: function destroy() {
228
- this.reset(false);
229
- this.options.onDestroy(this);
 
 
 
 
 
 
 
 
 
230
  }
231
-
232
- /**
233
- * Reset Typed and optionally restarts
234
- * @param {boolean} restart
235
- * @public
236
- */
237
  }, {
238
- key: 'reset',
239
- value: function reset() {
240
- var restart = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
 
 
 
 
 
 
 
 
 
241
 
242
- clearInterval(this.timeout);
243
- this.replaceText('');
244
- if (this.cursor && this.cursor.parentNode) {
245
- this.cursor.parentNode.removeChild(this.cursor);
246
- this.cursor = null;
 
 
247
  }
248
- this.strPos = 0;
249
- this.arrayPos = 0;
250
- this.curLoop = 0;
251
- if (restart) {
252
- this.insertCursor();
253
- this.options.onReset(this);
254
- this.begin();
255
  }
 
 
256
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
257
 
258
- /**
259
- * Begins the typing animation
260
- * @private
261
- */
262
- }, {
263
- key: 'begin',
264
- value: function begin() {
265
- var _this = this;
266
 
267
- this.typingComplete = false;
268
- this.shuffleStringsIfNeeded(this);
269
- this.insertCursor();
270
- if (this.bindInputFocusEvents) this.bindFocusEvents();
271
- this.timeout = setTimeout(function () {
272
- // Check if there is some text in the element, if yes start by backspacing the default message
273
- if (!_this.currentElContent || _this.currentElContent.length === 0) {
274
- _this.typewrite(_this.strings[_this.sequence[_this.arrayPos]], _this.strPos);
275
- } else {
276
- // Start typing
277
- _this.backspace(_this.currentElContent, _this.currentElContent.length);
278
- }
279
- }, this.startDelay);
280
- }
281
 
282
- /**
283
- * Called for each character typed
284
- * @param {string} curString the current string in the strings array
285
- * @param {number} curStrPos the current position in the curString
286
- * @private
287
- */
288
- }, {
289
- key: 'typewrite',
290
- value: function typewrite(curString, curStrPos) {
291
- var _this2 = this;
292
 
293
- if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) {
294
- this.el.classList.remove(this.fadeOutClass);
295
- if (this.cursor) this.cursor.classList.remove(this.fadeOutClass);
296
- }
297
 
298
- var humanize = this.humanizer(this.typeSpeed);
299
- var numChars = 1;
 
 
300
 
301
- if (this.pause.status === true) {
302
- this.setPauseStatus(curString, curStrPos, true);
303
- return;
304
- }
305
 
306
- // contain typing function in a timeout humanize'd delay
307
- this.timeout = setTimeout(function () {
308
- // skip over any HTML chars
309
- curStrPos = _htmlParserJs.htmlParser.typeHtmlChars(curString, curStrPos, _this2);
310
 
311
- var pauseTime = 0;
312
- var substr = curString.substr(curStrPos);
313
- // check for an escape character before a pause value
314
- // format: \^\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^
315
- // single ^ are removed from string
316
- if (substr.charAt(0) === '^') {
317
- if (/^\^\d+/.test(substr)) {
318
- var skip = 1; // skip at least 1
319
- substr = /\d+/.exec(substr)[0];
320
- skip += substr.length;
321
- pauseTime = parseInt(substr);
322
- _this2.temporaryPause = true;
323
- _this2.options.onTypingPaused(_this2.arrayPos, _this2);
324
- // strip out the escape character and pause value so they're not printed
325
- curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip);
326
- _this2.toggleBlinking(true);
327
- }
328
- }
329
 
330
- // check for skip characters formatted as
331
- // "this is a `string to print NOW` ..."
332
- if (substr.charAt(0) === '`') {
333
- while (curString.substr(curStrPos + numChars).charAt(0) !== '`') {
334
- numChars++;
335
- if (curStrPos + numChars > curString.length) break;
336
- }
337
- // strip out the escape characters and append all the string in between
338
- var stringBeforeSkip = curString.substring(0, curStrPos);
339
- var stringSkipped = curString.substring(stringBeforeSkip.length + 1, curStrPos + numChars);
340
- var stringAfterSkip = curString.substring(curStrPos + numChars + 1);
341
- curString = stringBeforeSkip + stringSkipped + stringAfterSkip;
342
- numChars--;
343
- }
344
 
345
- // timeout for any pause after a character
346
- _this2.timeout = setTimeout(function () {
347
- // Accounts for blinking while paused
348
- _this2.toggleBlinking(false);
 
 
349
 
350
- // We're done with this sentence!
351
- if (curStrPos >= curString.length) {
352
- _this2.doneTyping(curString, curStrPos);
353
- } else {
354
- _this2.keepTyping(curString, curStrPos, numChars);
355
- }
356
- // end of character pause
357
- if (_this2.temporaryPause) {
358
- _this2.temporaryPause = false;
359
- _this2.options.onTypingResumed(_this2.arrayPos, _this2);
360
- }
361
- }, pauseTime);
362
 
363
- // humanized value for typing
364
- }, humanize);
365
- }
 
 
366
 
367
- /**
368
- * Continue to the next string & begin typing
369
- * @param {string} curString the current string in the strings array
370
- * @param {number} curStrPos the current position in the curString
371
- * @private
372
- */
373
- }, {
374
- key: 'keepTyping',
375
- value: function keepTyping(curString, curStrPos, numChars) {
376
- // call before functions if applicable
377
- if (curStrPos === 0) {
378
- this.toggleBlinking(false);
379
- this.options.preStringTyped(this.arrayPos, this);
380
- }
381
- // start typing each new char into existing string
382
- // curString: arg, this.el.html: original text inside element
383
- curStrPos += numChars;
384
- var nextString = curString.substr(0, curStrPos);
385
- this.replaceText(nextString);
386
- // loop the function
387
- this.typewrite(curString, curStrPos);
388
- }
389
 
390
- /**
391
- * We're done typing all strings
392
- * @param {string} curString the current string in the strings array
393
- * @param {number} curStrPos the current position in the curString
394
- * @private
395
- */
396
- }, {
397
- key: 'doneTyping',
398
- value: function doneTyping(curString, curStrPos) {
399
- var _this3 = this;
400
 
401
- // fires callback function
402
- this.options.onStringTyped(this.arrayPos, this);
403
- this.toggleBlinking(true);
404
- // is this the final string
405
- if (this.arrayPos === this.strings.length - 1) {
406
- // callback that occurs on the last typed string
407
- this.complete();
408
- // quit if we wont loop back
409
- if (this.loop === false || this.curLoop === this.loopCount) {
410
- return;
411
- }
412
- }
413
- this.timeout = setTimeout(function () {
414
- _this3.backspace(curString, curStrPos);
415
- }, this.backDelay);
416
- }
417
 
418
- /**
419
- * Backspaces 1 character at a time
420
- * @param {string} curString the current string in the strings array
421
- * @param {number} curStrPos the current position in the curString
422
- * @private
423
- */
424
- }, {
425
- key: 'backspace',
426
- value: function backspace(curString, curStrPos) {
427
- var _this4 = this;
 
 
 
 
 
 
 
 
 
428
 
429
- if (this.pause.status === true) {
430
- this.setPauseStatus(curString, curStrPos, true);
431
- return;
432
- }
433
- if (this.fadeOut) return this.initFadeOut();
 
434
 
435
- this.toggleBlinking(false);
436
- var humanize = this.humanizer(this.backSpeed);
 
 
 
 
437
 
438
- this.timeout = setTimeout(function () {
439
- curStrPos = _htmlParserJs.htmlParser.backSpaceHtmlChars(curString, curStrPos, _this4);
440
- // replace text with base text + typed characters
441
- var curStringAtPosition = curString.substr(0, curStrPos);
442
- _this4.replaceText(curStringAtPosition);
443
 
444
- // if smartBack is enabled
445
- if (_this4.smartBackspace) {
446
- // the remaining part of the current string is equal of the same part of the new string
447
- var nextString = _this4.strings[_this4.arrayPos + 1];
448
- if (nextString && curStringAtPosition === nextString.substr(0, curStrPos)) {
449
- _this4.stopNum = curStrPos;
450
- } else {
451
- _this4.stopNum = 0;
452
- }
453
- }
454
 
455
- // if the number (id of character in current string) is
456
- // less than the stop number, keep going
457
- if (curStrPos > _this4.stopNum) {
458
- // subtract characters one by one
459
- curStrPos--;
460
- // loop the function
461
- _this4.backspace(curString, curStrPos);
462
- } else if (curStrPos <= _this4.stopNum) {
463
- // if the stop number has been reached, increase
464
- // array position to next string
465
- _this4.arrayPos++;
466
- // When looping, begin at the beginning after backspace complete
467
- if (_this4.arrayPos === _this4.strings.length) {
468
- _this4.arrayPos = 0;
469
- _this4.options.onLastStringBackspaced();
470
- _this4.shuffleStringsIfNeeded();
471
- _this4.begin();
472
- } else {
473
- _this4.typewrite(_this4.strings[_this4.sequence[_this4.arrayPos]], curStrPos);
474
- }
475
- }
476
- // humanized value for typing
477
- }, humanize);
478
- }
479
 
480
- /**
481
- * Full animation is complete
482
- * @private
483
- */
484
- }, {
485
- key: 'complete',
486
- value: function complete() {
487
- this.options.onComplete(this);
488
- if (this.loop) {
489
- this.curLoop++;
490
- } else {
491
- this.typingComplete = true;
492
- }
493
- }
494
 
495
- /**
496
- * Has the typing been stopped
497
- * @param {string} curString the current string in the strings array
498
- * @param {number} curStrPos the current position in the curString
499
- * @param {boolean} isTyping
500
- * @private
501
- */
502
- }, {
503
- key: 'setPauseStatus',
504
- value: function setPauseStatus(curString, curStrPos, isTyping) {
505
- this.pause.typewrite = isTyping;
506
- this.pause.curString = curString;
507
- this.pause.curStrPos = curStrPos;
508
- }
509
 
510
- /**
511
- * Toggle the blinking cursor
512
- * @param {boolean} isBlinking
513
- * @private
514
- */
515
- }, {
516
- key: 'toggleBlinking',
517
- value: function toggleBlinking(isBlinking) {
518
- if (!this.cursor) return;
519
- // if in paused state, don't toggle blinking a 2nd time
520
- if (this.pause.status) return;
521
- if (this.cursorBlinking === isBlinking) return;
522
- this.cursorBlinking = isBlinking;
523
- if (isBlinking) {
524
- this.cursor.classList.add('typed-cursor--blink');
525
- } else {
526
- this.cursor.classList.remove('typed-cursor--blink');
527
- }
528
- }
529
 
530
- /**
531
- * Speed in MS to type
532
- * @param {number} speed
533
- * @private
534
- */
535
- }, {
536
- key: 'humanizer',
537
- value: function humanizer(speed) {
538
- return Math.round(Math.random() * speed / 2) + speed;
539
- }
540
 
541
- /**
542
- * Shuffle the sequence of the strings array
543
- * @private
544
- */
545
- }, {
546
- key: 'shuffleStringsIfNeeded',
547
- value: function shuffleStringsIfNeeded() {
548
- if (!this.shuffle) return;
549
- this.sequence = this.sequence.sort(function () {
550
- return Math.random() - 0.5;
551
- });
552
- }
553
 
554
- /**
555
- * Adds a CSS class to fade out current string
556
- * @private
557
- */
558
- }, {
559
- key: 'initFadeOut',
560
- value: function initFadeOut() {
561
- var _this5 = this;
562
 
563
- this.el.className += ' ' + this.fadeOutClass;
564
- if (this.cursor) this.cursor.className += ' ' + this.fadeOutClass;
565
- return setTimeout(function () {
566
- _this5.arrayPos++;
567
- _this5.replaceText('');
568
 
569
- // Resets current string if end of loop reached
570
- if (_this5.strings.length > _this5.arrayPos) {
571
- _this5.typewrite(_this5.strings[_this5.sequence[_this5.arrayPos]], 0);
572
- } else {
573
- _this5.typewrite(_this5.strings[0], 0);
574
- _this5.arrayPos = 0;
575
- }
576
- }, this.fadeOutDelay);
577
- }
578
 
579
- /**
580
- * Replaces current text in the HTML element
581
- * depending on element type
582
- * @param {string} str
583
- * @private
584
- */
585
- }, {
586
- key: 'replaceText',
587
- value: function replaceText(str) {
588
- if (this.attr) {
589
- this.el.setAttribute(this.attr, str);
590
- } else {
591
- if (this.isInput) {
592
- this.el.value = str;
593
- } else if (this.contentType === 'html') {
594
- this.el.innerHTML = str;
595
- } else {
596
- this.el.textContent = str;
597
- }
598
- }
599
- }
600
 
601
  /**
602
- * If using input elements, bind focus in order to
603
- * start and stop the animation
 
 
 
604
  * @private
605
  */
606
- }, {
607
- key: 'bindFocusEvents',
608
- value: function bindFocusEvents() {
609
- var _this6 = this;
610
 
611
- if (!this.isInput) return;
612
- this.el.addEventListener('focus', function (e) {
613
- _this6.stop();
614
- });
615
- this.el.addEventListener('blur', function (e) {
616
- if (_this6.el.value && _this6.el.value.length !== 0) {
617
- return;
 
 
618
  }
619
- _this6.start();
620
- });
 
 
 
 
 
 
 
621
  }
622
 
623
  /**
624
- * On init, insert the cursor element
 
 
 
 
625
  * @private
626
  */
627
  }, {
628
- key: 'insertCursor',
629
- value: function insertCursor() {
630
- if (!this.showCursor) return;
631
- if (this.cursor) return;
632
- this.cursor = document.createElement('span');
633
- this.cursor.className = 'typed-cursor';
634
- this.cursor.innerHTML = this.cursorChar;
635
- this.el.parentNode && this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling);
 
 
 
 
 
 
 
 
 
 
 
 
636
  }
637
  }]);
638
 
639
- return Typed;
640
  })();
641
 
642
- exports['default'] = Typed;
643
- module.exports = exports['default'];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
644
 
645
- /***/ }),
646
- /* 1 */
647
- /***/ (function(module, exports, __webpack_require__) {
648
 
649
- 'use strict';
650
-
651
- Object.defineProperty(exports, '__esModule', {
652
- value: true
653
- });
654
-
655
- var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
656
-
657
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
658
-
659
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
660
-
661
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
662
-
663
- var _defaultsJs = __webpack_require__(2);
664
-
665
- var _defaultsJs2 = _interopRequireDefault(_defaultsJs);
666
-
667
- /**
668
- * Initialize the Typed object
669
- */
670
-
671
- var Initializer = (function () {
672
- function Initializer() {
673
- _classCallCheck(this, Initializer);
674
- }
675
-
676
- _createClass(Initializer, [{
677
- key: 'load',
678
-
679
- /**
680
- * Load up defaults & options on the Typed instance
681
- * @param {Typed} self instance of Typed
682
- * @param {object} options options object
683
- * @param {string} elementId HTML element ID _OR_ instance of HTML element
684
- * @private
685
- */
686
-
687
- value: function load(self, options, elementId) {
688
- // chosen element to manipulate text
689
- if (typeof elementId === 'string') {
690
- self.el = document.querySelector(elementId);
691
- } else {
692
- self.el = elementId;
693
- }
694
-
695
- self.options = _extends({}, _defaultsJs2['default'], options);
696
-
697
- // attribute to type into
698
- self.isInput = self.el.tagName.toLowerCase() === 'input';
699
- self.attr = self.options.attr;
700
- self.bindInputFocusEvents = self.options.bindInputFocusEvents;
701
-
702
- // show cursor
703
- self.showCursor = self.isInput ? false : self.options.showCursor;
704
-
705
- // custom cursor
706
- self.cursorChar = self.options.cursorChar;
707
-
708
- // Is the cursor blinking
709
- self.cursorBlinking = true;
710
-
711
- // text content of element
712
- self.elContent = self.attr ? self.el.getAttribute(self.attr) : self.el.textContent;
713
-
714
- // html or plain text
715
- self.contentType = self.options.contentType;
716
-
717
- // typing speed
718
- self.typeSpeed = self.options.typeSpeed;
719
-
720
- // add a delay before typing starts
721
- self.startDelay = self.options.startDelay;
722
-
723
- // backspacing speed
724
- self.backSpeed = self.options.backSpeed;
725
-
726
- // only backspace what doesn't match the previous string
727
- self.smartBackspace = self.options.smartBackspace;
728
-
729
- // amount of time to wait before backspacing
730
- self.backDelay = self.options.backDelay;
731
-
732
- // Fade out instead of backspace
733
- self.fadeOut = self.options.fadeOut;
734
- self.fadeOutClass = self.options.fadeOutClass;
735
- self.fadeOutDelay = self.options.fadeOutDelay;
736
-
737
- // variable to check whether typing is currently paused
738
- self.isPaused = false;
739
-
740
- // input strings of text
741
- self.strings = self.options.strings.map(function (s) {
742
- return s.trim();
743
- });
744
-
745
- // div containing strings
746
- if (typeof self.options.stringsElement === 'string') {
747
- self.stringsElement = document.querySelector(self.options.stringsElement);
748
- } else {
749
- self.stringsElement = self.options.stringsElement;
750
- }
751
-
752
- if (self.stringsElement) {
753
- self.strings = [];
754
- self.stringsElement.style.display = 'none';
755
- var strings = Array.prototype.slice.apply(self.stringsElement.children);
756
- var stringsLength = strings.length;
757
-
758
- if (stringsLength) {
759
- for (var i = 0; i < stringsLength; i += 1) {
760
- var stringEl = strings[i];
761
- self.strings.push(stringEl.innerHTML.trim());
762
- }
763
- }
764
- }
765
-
766
- // character number position of current string
767
- self.strPos = 0;
768
-
769
- // current array position
770
- self.arrayPos = 0;
771
-
772
- // index of string to stop backspacing on
773
- self.stopNum = 0;
774
-
775
- // Looping logic
776
- self.loop = self.options.loop;
777
- self.loopCount = self.options.loopCount;
778
- self.curLoop = 0;
779
-
780
- // shuffle the strings
781
- self.shuffle = self.options.shuffle;
782
- // the order of strings
783
- self.sequence = [];
784
-
785
- self.pause = {
786
- status: false,
787
- typewrite: true,
788
- curString: '',
789
- curStrPos: 0
790
- };
791
-
792
- // When the typing is complete (when not looped)
793
- self.typingComplete = false;
794
-
795
- // Set the order in which the strings are typed
796
- for (var i in self.strings) {
797
- self.sequence[i] = i;
798
- }
799
-
800
- // If there is some text in the element
801
- self.currentElContent = this.getCurrentElContent(self);
802
-
803
- self.autoInsertCss = self.options.autoInsertCss;
804
-
805
- this.appendAnimationCss(self);
806
- }
807
- }, {
808
- key: 'getCurrentElContent',
809
- value: function getCurrentElContent(self) {
810
- var elContent = '';
811
- if (self.attr) {
812
- elContent = self.el.getAttribute(self.attr);
813
- } else if (self.isInput) {
814
- elContent = self.el.value;
815
- } else if (self.contentType === 'html') {
816
- elContent = self.el.innerHTML;
817
- } else {
818
- elContent = self.el.textContent;
819
- }
820
- return elContent;
821
- }
822
- }, {
823
- key: 'appendAnimationCss',
824
- value: function appendAnimationCss(self) {
825
- var cssDataName = 'data-typed-js-css';
826
- if (!self.autoInsertCss) {
827
- return;
828
- }
829
- if (!self.showCursor && !self.fadeOut) {
830
- return;
831
- }
832
- if (document.querySelector('[' + cssDataName + ']')) {
833
- return;
834
- }
835
-
836
- var css = document.createElement('style');
837
- css.type = 'text/css';
838
- css.setAttribute(cssDataName, true);
839
-
840
- var innerCss = '';
841
- if (self.showCursor) {
842
- innerCss += '\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n ';
843
- }
844
- if (self.fadeOut) {
845
- innerCss += '\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n ';
846
- }
847
- if (css.length === 0) {
848
- return;
849
- }
850
- css.innerHTML = innerCss;
851
- document.body.appendChild(css);
852
- }
853
- }]);
854
-
855
- return Initializer;
856
- })();
857
-
858
- exports['default'] = Initializer;
859
- var initializer = new Initializer();
860
- exports.initializer = initializer;
861
 
862
- /***/ }),
863
- /* 2 */
864
- /***/ (function(module, exports) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
865
 
866
- /**
867
- * Defaults & options
868
- * @returns {object} Typed defaults & options
869
- * @public
870
- */
871
-
872
- 'use strict';
873
-
874
- Object.defineProperty(exports, '__esModule', {
875
- value: true
876
- });
877
- var defaults = {
878
- /**
879
- * @property {array} strings strings to be typed
880
- * @property {string} stringsElement ID of element containing string children
881
- */
882
- strings: ['These are the default values...', 'You know what you should do?', 'Use your own!', 'Have a great day!'],
883
- stringsElement: null,
884
-
885
- /**
886
- * @property {number} typeSpeed type speed in milliseconds
887
- */
888
- typeSpeed: 0,
889
-
890
- /**
891
- * @property {number} startDelay time before typing starts in milliseconds
892
- */
893
- startDelay: 0,
894
-
895
- /**
896
- * @property {number} backSpeed backspacing speed in milliseconds
897
- */
898
- backSpeed: 0,
899
-
900
- /**
901
- * @property {boolean} smartBackspace only backspace what doesn't match the previous string
902
- */
903
- smartBackspace: true,
904
-
905
- /**
906
- * @property {boolean} shuffle shuffle the strings
907
- */
908
- shuffle: false,
909
-
910
- /**
911
- * @property {number} backDelay time before backspacing in milliseconds
912
- */
913
- backDelay: 700,
914
-
915
- /**
916
- * @property {boolean} fadeOut Fade out instead of backspace
917
- * @property {string} fadeOutClass css class for fade animation
918
- * @property {boolean} fadeOutDelay Fade out delay in milliseconds
919
- */
920
- fadeOut: false,
921
- fadeOutClass: 'typed-fade-out',
922
- fadeOutDelay: 500,
923
-
924
- /**
925
- * @property {boolean} loop loop strings
926
- * @property {number} loopCount amount of loops
927
- */
928
- loop: false,
929
- loopCount: Infinity,
930
-
931
- /**
932
- * @property {boolean} showCursor show cursor
933
- * @property {string} cursorChar character for cursor
934
- * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML <head>
935
- */
936
- showCursor: true,
937
- cursorChar: '|',
938
- autoInsertCss: true,
939
-
940
- /**
941
- * @property {string} attr attribute for typing
942
- * Ex: input placeholder, value, or just HTML text
943
- */
944
- attr: null,
945
-
946
- /**
947
- * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input
948
- */
949
- bindInputFocusEvents: false,
950
-
951
- /**
952
- * @property {string} contentType 'html' or 'null' for plaintext
953
- */
954
- contentType: 'html',
955
-
956
- /**
957
- * All typing is complete
958
- * @param {Typed} self
959
- */
960
- onComplete: function onComplete(self) {},
961
-
962
- /**
963
- * Before each string is typed
964
- * @param {number} arrayPos
965
- * @param {Typed} self
966
- */
967
- preStringTyped: function preStringTyped(arrayPos, self) {},
968
-
969
- /**
970
- * After each string is typed
971
- * @param {number} arrayPos
972
- * @param {Typed} self
973
- */
974
- onStringTyped: function onStringTyped(arrayPos, self) {},
975
-
976
- /**
977
- * During looping, after last string is typed
978
- * @param {Typed} self
979
- */
980
- onLastStringBackspaced: function onLastStringBackspaced(self) {},
981
-
982
- /**
983
- * Typing has been stopped
984
- * @param {number} arrayPos
985
- * @param {Typed} self
986
- */
987
- onTypingPaused: function onTypingPaused(arrayPos, self) {},
988
-
989
- /**
990
- * Typing has been started after being stopped
991
- * @param {number} arrayPos
992
- * @param {Typed} self
993
- */
994
- onTypingResumed: function onTypingResumed(arrayPos, self) {},
995
-
996
- /**
997
- * After reset
998
- * @param {Typed} self
999
- */
1000
- onReset: function onReset(self) {},
1001
-
1002
- /**
1003
- * After stop
1004
- * @param {number} arrayPos
1005
- * @param {Typed} self
1006
- */
1007
- onStop: function onStop(arrayPos, self) {},
1008
-
1009
- /**
1010
- * After start
1011
- * @param {number} arrayPos
1012
- * @param {Typed} self
1013
- */
1014
- onStart: function onStart(arrayPos, self) {},
1015
-
1016
- /**
1017
- * After destroy
1018
- * @param {Typed} self
1019
- */
1020
- onDestroy: function onDestroy(self) {}
1021
- };
1022
-
1023
- exports['default'] = defaults;
1024
- module.exports = exports['default'];
1025
 
1026
- /***/ }),
1027
- /* 3 */
1028
- /***/ (function(module, exports) {
 
 
 
 
1029
 
1030
-
1031
- /**
1032
- * TODO: These methods can probably be combined somehow
1033
- * Parse HTML tags & HTML Characters
1034
- */
1035
-
1036
- 'use strict';
1037
-
1038
- Object.defineProperty(exports, '__esModule', {
1039
- value: true
1040
- });
1041
-
1042
- var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
1043
-
1044
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
1045
-
1046
- var HTMLParser = (function () {
1047
- function HTMLParser() {
1048
- _classCallCheck(this, HTMLParser);
1049
- }
1050
-
1051
- _createClass(HTMLParser, [{
1052
- key: 'typeHtmlChars',
1053
-
1054
- /**
1055
- * Type HTML tags & HTML Characters
1056
- * @param {string} curString Current string
1057
- * @param {number} curStrPos Position in current string
1058
- * @param {Typed} self instance of Typed
1059
- * @returns {number} a new string position
1060
- * @private
1061
- */
1062
-
1063
- value: function typeHtmlChars(curString, curStrPos, self) {
1064
- if (self.contentType !== 'html') return curStrPos;
1065
- var curChar = curString.substr(curStrPos).charAt(0);
1066
- if (curChar === '<' || curChar === '&') {
1067
- var endTag = '';
1068
- if (curChar === '<') {
1069
- endTag = '>';
1070
- } else {
1071
- endTag = ';';
1072
- }
1073
- while (curString.substr(curStrPos + 1).charAt(0) !== endTag) {
1074
- curStrPos++;
1075
- if (curStrPos + 1 > curString.length) {
1076
- break;
1077
- }
1078
- }
1079
- curStrPos++;
1080
- }
1081
- return curStrPos;
1082
- }
1083
-
1084
- /**
1085
- * Backspace HTML tags and HTML Characters
1086
- * @param {string} curString Current string
1087
- * @param {number} curStrPos Position in current string
1088
- * @param {Typed} self instance of Typed
1089
- * @returns {number} a new string position
1090
- * @private
1091
- */
1092
- }, {
1093
- key: 'backSpaceHtmlChars',
1094
- value: function backSpaceHtmlChars(curString, curStrPos, self) {
1095
- if (self.contentType !== 'html') return curStrPos;
1096
- var curChar = curString.substr(curStrPos).charAt(0);
1097
- if (curChar === '>' || curChar === ';') {
1098
- var endTag = '';
1099
- if (curChar === '>') {
1100
- endTag = '<';
1101
- } else {
1102
- endTag = '&';
1103
- }
1104
- while (curString.substr(curStrPos - 1).charAt(0) !== endTag) {
1105
- curStrPos--;
1106
- if (curStrPos < 0) {
1107
- break;
1108
- }
1109
- }
1110
- curStrPos--;
1111
- }
1112
- return curStrPos;
1113
- }
1114
- }]);
1115
-
1116
- return HTMLParser;
1117
- })();
1118
-
1119
- exports['default'] = HTMLParser;
1120
- var htmlParser = new HTMLParser();
1121
- exports.htmlParser = htmlParser;
1122
 
1123
- /***/ })
1124
- /******/ ])
1125
- });
1126
- ;
1127
- /*!
1128
- * Countdown v0.1.0
1129
- * https://github.com/fengyuanchen/countdown
1130
- *
1131
- * Copyright 2014 Fengyuan Chen
1132
- * Released under the MIT license
1133
- */
1134
 
1135
- (function (factory) {
1136
- if (typeof define === "function" && define.amd) {
1137
- // AMD. Register as anonymous module.
1138
- define(["jquery"], factory);
1139
- } else {
1140
- // Browser globals.
1141
- factory(jQuery);
1142
  }
1143
- })(function ($) {
1144
 
1145
- "use strict";
 
1146
 
1147
- var Countdown = function (element, options) {
1148
- this.$element = $(element);
1149
- this.defaults = $.extend({}, Countdown.defaults, this.$element.data(), $.isPlainObject(options) ? options : {});
1150
- this.init();
1151
- };
1152
 
1153
- Countdown.prototype = {
1154
- constructor: Countdown,
1155
 
1156
- init: function () {
1157
- var content = this.$element.html(),
1158
- date = new Date(this.defaults.date || content);
 
 
1159
 
1160
- if (date.getTime()) {
1161
- this.content = content;
1162
- this.date = date;
1163
- this.find();
1164
 
1165
- if (this.defaults.autoStart) {
1166
- this.start();
1167
- }
1168
- }
1169
- },
1170
 
1171
- find: function () {
1172
- var $element = this.$element;
 
 
1173
 
1174
- this.$days = $element.find("[data-days]");
1175
- this.$hours = $element.find("[data-hours]");
1176
- this.$minutes = $element.find("[data-minutes]");
1177
- this.$seconds = $element.find("[data-seconds]");
1178
 
1179
- if ((this.$days.length + this.$hours.length + this.$minutes.length + this.$seconds.length) > 0) {
1180
- this.found = true;
1181
- }
1182
- },
 
1183
 
1184
- reset: function () {
1185
- if (this.found) {
1186
- this.output("days");
1187
- this.output("hours");
1188
- this.output("minutes");
1189
- this.output("seconds");
1190
- } else {
1191
- this.output();
1192
- }
1193
- },
1194
 
1195
- ready: function () {
1196
- var date = this.date,
1197
- decisecond = 100,
1198
- second = 1000,
1199
- minute = 60000,
1200
- hour = 3600000,
1201
- day = 86400000,
1202
- remainder = {},
1203
- diff;
 
 
 
1204
 
1205
- if (!date) {
1206
- return false;
1207
- }
 
 
 
 
1208
 
1209
- diff = date.getTime() - (new Date()).getTime();
1210
 
1211
- if (diff <= 0) {
1212
- this.end();
1213
- return false;
1214
- }
1215
 
1216
- remainder.days = diff;
1217
- remainder.hours = remainder.days % day;
1218
- remainder.minutes = remainder.hours % hour;
1219
- remainder.seconds = remainder.minutes % minute;
1220
- remainder.milliseconds = remainder.seconds % second;
1221
 
1222
- this.days = Math.floor(remainder.days / day);
1223
- this.hours = Math.floor(remainder.hours / hour);
1224
- this.minutes = Math.floor(remainder.minutes / minute);
1225
- this.seconds = Math.floor(remainder.seconds / second);
1226
- this.deciseconds = Math.floor(remainder.milliseconds / decisecond);
1227
 
1228
- return true;
1229
- },
 
 
 
 
 
 
1230
 
1231
- start: function () {
1232
- if (!this.active && this.ready()) {
1233
- this.active = true;
1234
- this.reset();
1235
- this.autoUpdate = this.defaults.fast ?
1236
- setInterval($.proxy(this.fastUpdate, this), 100) :
1237
- setInterval($.proxy(this.update, this), 1000);
1238
- }
1239
- },
1240
 
1241
- stop: function () {
1242
- if (this.active) {
1243
- this.active = false;
1244
- clearInterval(this.autoUpdate);
1245
- }
1246
- },
1247
 
1248
- end: function () {
1249
- if (!this.date) {
1250
- return;
1251
- }
1252
 
1253
- this.stop();
 
 
 
 
 
1254
 
1255
- this.days = 0;
1256
- this.hours = 0;
1257
- this.minutes = 0;
1258
- this.seconds = 0;
1259
- this.deciseconds = 0;
1260
- this.reset();
1261
- this.defaults.end();
1262
- },
1263
 
1264
- destroy: function () {
1265
- if (!this.date) {
1266
- return;
1267
- }
1268
 
1269
- this.stop();
 
 
1270
 
1271
- this.$days = null;
1272
- this.$hours = null;
1273
- this.$minutes = null;
1274
- this.$seconds = null;
1275
 
1276
- this.$element.empty().html(this.content);
1277
- this.$element.removeData("countdown");
1278
- },
1279
 
1280
- fastUpdate: function () {
1281
- if (--this.deciseconds >= 0) {
1282
- this.output("deciseconds");
1283
- } else {
1284
- this.deciseconds = 9;
1285
- this.update();
1286
- }
1287
- },
1288
 
1289
- update: function () {
1290
- if (--this.seconds >= 0) {
1291
- this.output("seconds");
1292
- } else {
1293
- this.seconds = 59;
1294
 
1295
- if (--this.minutes >= 0) {
1296
- this.output("minutes");
1297
- } else {
1298
- this.minutes = 59;
1299
 
1300
- if (--this.hours >= 0) {
1301
- this.output("hours");
1302
- } else {
1303
- this.hours = 23;
1304
 
1305
- if (--this.days >= 0) {
1306
- this.output("days");
1307
- } else {
1308
- this.end();
1309
- }
1310
- }
1311
- }
1312
- }
1313
- },
1314
 
1315
- output: function (type) {
1316
- if (!this.found) {
1317
- this.$element.empty().html(this.template());
1318
- return;
1319
- }
1320
 
1321
- switch (type) {
1322
- case "deciseconds":
1323
- this.$seconds.text(this.getSecondsText());
1324
- break;
1325
 
1326
- case "seconds":
1327
- this.$seconds.text(this.seconds);
1328
- break;
1329
 
1330
- case "minutes":
1331
- this.$minutes.text(this.minutes);
1332
- break;
1333
 
1334
- case "hours":
1335
- this.$hours.text(this.hours);
1336
- break;
1337
 
1338
- case "days":
1339
- this.$days.text(this.days);
1340
- break;
1341
 
1342
- // No default
1343
- }
1344
- },
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1345
 
1346
- template: function () {
1347
- return this.defaults.text
1348
- .replace("%s", this.days)
1349
- .replace("%s", this.hours)
1350
- .replace("%s", this.minutes)
1351
- .replace("%s", this.getSecondsText());
1352
- },
1353
 
1354
- getSecondsText: function () {
1355
- return this.active && this.defaults.fast ? (this.seconds + "." + this.deciseconds) : this.seconds;
1356
- }
1357
  };
1358
 
1359
- // Default settings
1360
- Countdown.defaults = {
1361
- autoStart: true,
1362
- date: null,
1363
- fast: false,
1364
- end: $.noop,
1365
- text: "%s days, %s hours, %s minutes, %s seconds"
1366
- };
1367
 
1368
- // Set default settings
1369
- Countdown.setDefaults = function (options) {
1370
- $.extend(Countdown.defaults, options);
1371
- };
1372
 
1373
- // Register as jQuery plugin
1374
- $.fn.countdown = function (options) {
1375
- return this.each(function () {
1376
- var $this = $(this),
1377
- data = $this.data("countdown");
1378
 
1379
- if (!data) {
1380
- $this.data("countdown", (data = new Countdown(this, options)));
1381
- }
1382
 
1383
- if (typeof options === "string" && $.isFunction(data[options])) {
1384
- data[options]();
1385
- }
1386
- });
1387
- };
1388
 
1389
- $.fn.countdown.constructor = Countdown;
1390
- $.fn.countdown.setDefaults = Countdown.setDefaults;
 
1391
 
1392
- $(function () {
1393
- $("[countdown]").countdown();
1394
- });
1395
 
1396
- });
 
 
 
 
 
1397
 
1398
- /*!
1399
- * imagesLoaded PACKAGED v4.1.4
1400
- * JavaScript is all like "You images are done yet or what?"
1401
- * MIT License
1402
- */
1403
 
1404
- /**
1405
- * EvEmitter v1.1.0
1406
- * Lil' event emitter
1407
- * MIT License
1408
- */
1409
 
1410
- /* jshint unused: true, undef: true, strict: true */
1411
 
1412
- ( function( global, factory ) {
1413
- // universal module definition
1414
- /* jshint strict: false */ /* globals define, module, window */
1415
- if ( typeof define == 'function' && define.amd ) {
1416
- // AMD - RequireJS
1417
- define( 'ev-emitter/ev-emitter',factory );
1418
- } else if ( typeof module == 'object' && module.exports ) {
1419
- // CommonJS - Browserify, Webpack
1420
- module.exports = factory();
1421
- } else {
1422
- // Browser globals
1423
- global.EvEmitter = factory();
 
 
 
 
 
 
 
 
1424
  }
1425
 
1426
- }( typeof window != 'undefined' ? window : this, function() {
 
 
 
1427
 
 
 
 
1428
 
 
1429
 
1430
- function EvEmitter() {}
 
1431
 
1432
- var proto = EvEmitter.prototype;
 
 
1433
 
1434
- proto.on = function( eventName, listener ) {
1435
- if ( !eventName || !listener ) {
1436
- return;
1437
- }
1438
- // set events hash
1439
- var events = this._events = this._events || {};
1440
- // set listeners array
1441
- var listeners = events[ eventName ] = events[ eventName ] || [];
1442
- // only add once
1443
- if ( listeners.indexOf( listener ) == -1 ) {
1444
- listeners.push( listener );
1445
- }
 
 
1446
 
1447
- return this;
1448
- };
1449
 
1450
- proto.once = function( eventName, listener ) {
1451
- if ( !eventName || !listener ) {
1452
- return;
1453
- }
1454
- // add event
1455
- this.on( eventName, listener );
1456
- // set once flag
1457
- // set onceEvents hash
1458
- var onceEvents = this._onceEvents = this._onceEvents || {};
1459
- // set onceListeners object
1460
- var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
1461
- // set flag
1462
- onceListeners[ listener ] = true;
1463
 
1464
- return this;
1465
- };
1466
 
1467
- proto.off = function( eventName, listener ) {
1468
- var listeners = this._events && this._events[ eventName ];
1469
- if ( !listeners || !listeners.length ) {
1470
- return;
1471
- }
1472
- var index = listeners.indexOf( listener );
1473
- if ( index != -1 ) {
1474
- listeners.splice( index, 1 );
1475
- }
1476
 
1477
- return this;
1478
- };
 
 
 
1479
 
1480
- proto.emitEvent = function( eventName, args ) {
1481
- var listeners = this._events && this._events[ eventName ];
1482
- if ( !listeners || !listeners.length ) {
1483
- return;
1484
- }
1485
- // copy over to avoid interference if .off() in listener
1486
- listeners = listeners.slice(0);
1487
- args = args || [];
1488
- // once stuff
1489
- var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
1490
 
1491
- for ( var i=0; i < listeners.length; i++ ) {
1492
- var listener = listeners[i]
1493
- var isOnce = onceListeners && onceListeners[ listener ];
1494
- if ( isOnce ) {
1495
- // remove listener
1496
- // remove before trigger to prevent recursion
1497
- this.off( eventName, listener );
1498
- // unset once flag
1499
- delete onceListeners[ listener ];
1500
- }
1501
- // trigger listener
1502
- listener.apply( this, args );
1503
- }
1504
 
1505
- return this;
1506
- };
1507
 
1508
- proto.allOff = function() {
1509
- delete this._events;
1510
- delete this._onceEvents;
1511
- };
 
1512
 
1513
- return EvEmitter;
1514
 
1515
- }));
 
 
 
1516
 
1517
- /*!
1518
- * imagesLoaded v4.1.4
1519
- * JavaScript is all like "You images are done yet or what?"
1520
- * MIT License
1521
- */
1522
 
1523
- ( function( window, factory ) { 'use strict';
1524
- // universal module definition
1525
 
1526
- /*global define: false, module: false, require: false */
1527
 
1528
- if ( typeof define == 'function' && define.amd ) {
1529
- // AMD
1530
- define( [
1531
- 'ev-emitter/ev-emitter'
1532
- ], function( EvEmitter ) {
1533
- return factory( window, EvEmitter );
1534
- });
1535
- } else if ( typeof module == 'object' && module.exports ) {
1536
- // CommonJS
1537
- module.exports = factory(
1538
- window,
1539
- require('ev-emitter')
1540
- );
1541
- } else {
1542
- // browser global
1543
- window.imagesLoaded = factory(
1544
- window,
1545
- window.EvEmitter
1546
- );
1547
- }
1548
 
1549
- })( typeof window !== 'undefined' ? window : this,
1550
 
1551
- // -------------------------- factory -------------------------- //
 
 
1552
 
1553
- function factory( window, EvEmitter ) {
 
 
1554
 
 
1555
 
 
 
 
1556
 
1557
- var $ = window.jQuery;
1558
- var console = window.console;
1559
 
1560
- // -------------------------- helpers -------------------------- //
 
 
 
1561
 
1562
- // extend objects
1563
- function extend( a, b ) {
1564
- for ( var prop in b ) {
1565
- a[ prop ] = b[ prop ];
1566
- }
1567
- return a;
1568
- }
1569
 
1570
- var arraySlice = Array.prototype.slice;
 
 
 
1571
 
1572
- // turn element or nodeList into an array
1573
- function makeArray( obj ) {
1574
- if ( Array.isArray( obj ) ) {
1575
- // use object if already an array
1576
- return obj;
1577
  }
1578
 
1579
- var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
1580
- if ( isArrayLike ) {
1581
- // convert nodeList to array
1582
- return arraySlice.call( obj );
1583
- }
1584
 
1585
- // array of single index
1586
- return [ obj ];
1587
- }
1588
 
1589
- // -------------------------- imagesLoaded -------------------------- //
 
 
 
1590
 
1591
- /**
1592
- * @param {Array, Element, NodeList, String} elem
1593
- * @param {Object or Function} options - if function, use as callback
1594
- * @param {Function} onAlways - callback function
1595
- */
1596
- function ImagesLoaded( elem, options, onAlways ) {
1597
- // coerce ImagesLoaded() without new, to be new ImagesLoaded()
1598
- if ( !( this instanceof ImagesLoaded ) ) {
1599
- return new ImagesLoaded( elem, options, onAlways );
1600
- }
1601
- // use elem as selector string
1602
- var queryElem = elem;
1603
- if ( typeof elem == 'string' ) {
1604
- queryElem = document.querySelectorAll( elem );
1605
- }
1606
- // bail if bad element
1607
- if ( !queryElem ) {
1608
- console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
1609
- return;
1610
- }
1611
 
1612
- this.elements = makeArray( queryElem );
1613
- this.options = extend( {}, this.options );
1614
- // shift arguments if no options set
1615
- if ( typeof options == 'function' ) {
1616
- onAlways = options;
1617
- } else {
1618
- extend( this.options, options );
1619
- }
 
1620
 
1621
- if ( onAlways ) {
1622
- this.on( 'always', onAlways );
1623
- }
1624
 
1625
- this.getImages();
 
 
 
 
 
1626
 
1627
- if ( $ ) {
1628
- // add jQuery Deferred object
1629
- this.jqDeferred = new $.Deferred();
1630
- }
 
 
1631
 
1632
- // HACK check async to allow time to bind listeners
1633
- setTimeout( this.check.bind( this ) );
1634
- }
1635
 
1636
- ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
1637
 
1638
- ImagesLoaded.prototype.options = {};
1639
 
1640
- ImagesLoaded.prototype.getImages = function() {
1641
- this.images = [];
1642
 
1643
- // filter & find items if we have an item selector
1644
- this.elements.forEach( this.addElementImages, this );
1645
- };
1646
 
1647
- /**
1648
- * @param {Node} element
1649
- */
1650
- ImagesLoaded.prototype.addElementImages = function( elem ) {
1651
- // filter siblings
1652
- if ( elem.nodeName == 'IMG' ) {
1653
- this.addImage( elem );
1654
- }
1655
- // get background image on element
1656
- if ( this.options.background === true ) {
1657
- this.addElementBackgroundImages( elem );
1658
- }
1659
 
1660
- // find children
1661
- // no non-element nodes, #143
1662
- var nodeType = elem.nodeType;
1663
- if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
1664
- return;
1665
- }
1666
- var childImgs = elem.querySelectorAll('img');
1667
- // concat childElems to filterFound array
1668
- for ( var i=0; i < childImgs.length; i++ ) {
1669
- var img = childImgs[i];
1670
- this.addImage( img );
1671
- }
1672
 
1673
- // get child background images
1674
- if ( typeof this.options.background == 'string' ) {
1675
- var children = elem.querySelectorAll( this.options.background );
1676
- for ( i=0; i < children.length; i++ ) {
1677
- var child = children[i];
1678
- this.addElementBackgroundImages( child );
1679
- }
1680
- }
1681
- };
1682
 
1683
- var elementNodeTypes = {
1684
- 1: true,
1685
- 9: true,
1686
- 11: true
1687
- };
 
 
1688
 
1689
- ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
1690
- var style = getComputedStyle( elem );
1691
- if ( !style ) {
1692
- // Firefox returns null if in a hidden iframe https://bugzil.la/548397
1693
- return;
1694
  }
1695
- // get url inside url("...")
1696
- var reURL = /url\((['"])?(.*?)\1\)/gi;
1697
- var matches = reURL.exec( style.backgroundImage );
1698
- while ( matches !== null ) {
1699
- var url = matches && matches[2];
1700
- if ( url ) {
1701
- this.addBackground( url, elem );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1702
  }
1703
- matches = reURL.exec( style.backgroundImage );
1704
- }
1705
- };
1706
 
1707
- /**
1708
- * @param {Image} img
1709
- */
1710
- ImagesLoaded.prototype.addImage = function( img ) {
1711
- var loadingImage = new LoadingImage( img );
1712
- this.images.push( loadingImage );
1713
- };
1714
 
1715
- ImagesLoaded.prototype.addBackground = function( url, elem ) {
1716
- var background = new Background( url, elem );
1717
- this.images.push( background );
1718
- };
1719
 
1720
- ImagesLoaded.prototype.check = function() {
1721
- var _this = this;
1722
- this.progressedCount = 0;
1723
- this.hasAnyBroken = false;
1724
- // complete if no images
1725
- if ( !this.images.length ) {
1726
- this.complete();
1727
- return;
1728
- }
1729
 
1730
- function onProgress( image, elem, message ) {
1731
- // HACK - Chrome triggers event before object properties have changed. #83
1732
- setTimeout( function() {
1733
- _this.progress( image, elem, message );
1734
- });
1735
- }
1736
 
1737
- this.images.forEach( function( loadingImage ) {
1738
- loadingImage.once( 'progress', onProgress );
1739
- loadingImage.check();
1740
- });
1741
- };
1742
 
1743
- ImagesLoaded.prototype.progress = function( image, elem, message ) {
1744
- this.progressedCount++;
1745
- this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
1746
- // progress event
1747
- this.emitEvent( 'progress', [ this, image, elem ] );
1748
- if ( this.jqDeferred && this.jqDeferred.notify ) {
1749
- this.jqDeferred.notify( this, image );
1750
- }
1751
- // check if completed
1752
- if ( this.progressedCount == this.images.length ) {
1753
- this.complete();
1754
- }
1755
 
1756
- if ( this.options.debug && console ) {
1757
- console.log( 'progress: ' + message, image, elem );
1758
- }
1759
- };
 
 
 
 
 
 
1760
 
1761
- ImagesLoaded.prototype.complete = function() {
1762
- var eventName = this.hasAnyBroken ? 'fail' : 'done';
1763
- this.isComplete = true;
1764
- this.emitEvent( eventName, [ this ] );
1765
- this.emitEvent( 'always', [ this ] );
1766
- if ( this.jqDeferred ) {
1767
- var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
1768
- this.jqDeferred[ jqMethod ]( this );
1769
- }
1770
- };
1771
 
1772
- // -------------------------- -------------------------- //
 
 
1773
 
1774
- function LoadingImage( img ) {
1775
- this.img = img;
1776
- }
1777
 
1778
- LoadingImage.prototype = Object.create( EvEmitter.prototype );
1779
 
1780
- LoadingImage.prototype.check = function() {
1781
- // If complete is true and browser supports natural sizes,
1782
- // try to check for image status manually.
1783
- var isComplete = this.getIsImageComplete();
1784
- if ( isComplete ) {
1785
- // report based on naturalWidth
1786
- this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
1787
- return;
1788
- }
1789
 
1790
- // If none of the checks above matched, simulate loading on detached element.
1791
- this.proxyImage = new Image();
1792
- this.proxyImage.addEventListener( 'load', this );
1793
- this.proxyImage.addEventListener( 'error', this );
1794
- // bind to image as well for Firefox. #191
1795
- this.img.addEventListener( 'load', this );
1796
- this.img.addEventListener( 'error', this );
1797
- this.proxyImage.src = this.img.src;
1798
- };
1799
 
1800
- LoadingImage.prototype.getIsImageComplete = function() {
1801
- // check for non-zero, non-undefined naturalWidth
1802
- // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
1803
- return this.img.complete && this.img.naturalWidth;
1804
- };
1805
 
1806
- LoadingImage.prototype.confirm = function( isLoaded, message ) {
1807
- this.isLoaded = isLoaded;
1808
- this.emitEvent( 'progress', [ this, this.img, message ] );
1809
- };
 
 
 
 
 
1810
 
1811
- // ----- events ----- //
 
1812
 
1813
- // trigger specified handler for event type
1814
- LoadingImage.prototype.handleEvent = function( event ) {
1815
- var method = 'on' + event.type;
1816
- if ( this[ method ] ) {
1817
- this[ method ]( event );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1818
  }
1819
- };
1820
 
1821
- LoadingImage.prototype.onload = function() {
1822
- this.confirm( true, 'onload' );
1823
- this.unbindEvents();
1824
- };
1825
 
1826
- LoadingImage.prototype.onerror = function() {
1827
- this.confirm( false, 'onerror' );
1828
- this.unbindEvents();
1829
- };
1830
 
1831
- LoadingImage.prototype.unbindEvents = function() {
1832
- this.proxyImage.removeEventListener( 'load', this );
1833
- this.proxyImage.removeEventListener( 'error', this );
1834
- this.img.removeEventListener( 'load', this );
1835
- this.img.removeEventListener( 'error', this );
1836
- };
1837
 
1838
- // -------------------------- Background -------------------------- //
 
 
1839
 
1840
- function Background( url, element ) {
1841
- this.url = url;
1842
- this.element = element;
1843
- this.img = new Image();
1844
- }
1845
 
1846
- // inherit LoadingImage prototype
1847
- Background.prototype = Object.create( LoadingImage.prototype );
 
1848
 
1849
- Background.prototype.check = function() {
1850
- this.img.addEventListener( 'load', this );
1851
- this.img.addEventListener( 'error', this );
1852
- this.img.src = this.url;
1853
- // check if image is already complete
1854
- var isComplete = this.getIsImageComplete();
1855
- if ( isComplete ) {
1856
- this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
1857
- this.unbindEvents();
1858
- }
1859
- };
1860
 
1861
- Background.prototype.unbindEvents = function() {
1862
- this.img.removeEventListener( 'load', this );
1863
- this.img.removeEventListener( 'error', this );
1864
- };
1865
 
1866
- Background.prototype.confirm = function( isLoaded, message ) {
1867
- this.isLoaded = isLoaded;
1868
- this.emitEvent( 'progress', [ this, this.element, message ] );
1869
- };
1870
 
1871
- // -------------------------- jQuery -------------------------- //
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1872
 
1873
- ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
1874
- jQuery = jQuery || window.jQuery;
1875
- if ( !jQuery ) {
1876
- return;
1877
  }
1878
- // set local variable
1879
- $ = jQuery;
1880
- // $().imagesLoaded()
1881
- $.fn.imagesLoaded = function( options, callback ) {
1882
- var instance = new ImagesLoaded( this, options, callback );
1883
- return instance.jqDeferred.promise( $(this) );
1884
  };
1885
- };
1886
- // try making plugin
1887
- ImagesLoaded.makeJQueryPlugin();
 
 
 
1888
 
1889
- // -------------------------- -------------------------- //
 
 
 
1890
 
1891
- return ImagesLoaded;
 
 
 
1892
 
1893
- });
1894
 
 
 
 
1895
 
1896
- /**
1897
- * author Christopher Blum
1898
- * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/
1899
- * - forked from http://github.com/zuk/jquery.inview/
1900
- */
1901
- (function (factory) {
1902
- if (typeof define == 'function' && define.amd) {
1903
- // AMD
1904
- define(['jquery'], factory);
1905
- } else if (typeof exports === 'object') {
1906
- // Node, CommonJS
1907
- module.exports = factory(require('jquery'));
1908
- } else {
1909
- // Browser globals
1910
- factory(jQuery);
1911
- }
1912
- }(function ($) {
1913
 
1914
- var inviewObjects = [], viewportSize, viewportOffset,
1915
- d = document, w = window, documentElement = d.documentElement, timer;
 
1916
 
1917
- $.event.special.inview = {
1918
- add: function (data) {
1919
- inviewObjects.push({ data: data, $element: $(this), element: this });
1920
- // Use setInterval in order to also make sure this captures elements within
1921
- // "overflow:scroll" elements or elements that appeared in the dom tree due to
1922
- // dom manipulation and reflow
1923
- // old: $(window).scroll(checkInView);
1924
- //
1925
- // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays
1926
- // intervals while the user scrolls. Therefore the inview event might fire a bit late there
1927
- //
1928
- // Don't waste cycles with an interval until we get at least one element that
1929
- // has bound to the inview event.
1930
- if (!timer && inviewObjects.length) {
1931
- timer = setInterval(checkInView, 250);
1932
- }
1933
- },
1934
 
1935
- remove: function (data) {
1936
- for (var i = 0; i < inviewObjects.length; i++) {
1937
- var inviewObject = inviewObjects[i];
1938
- if (inviewObject.element === this && inviewObject.data.guid === data.guid) {
1939
- inviewObjects.splice(i, 1);
1940
- break;
1941
- }
1942
- }
1943
 
1944
- // Clear interval when we no longer have any elements listening
1945
- if (!inviewObjects.length) {
1946
- clearInterval(timer);
1947
- timer = null;
1948
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1949
  }
1950
- };
1951
 
1952
- function getViewportSize() {
1953
- var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth };
 
 
1954
 
1955
- // if this is correct then return it. iPad has compat Mode, so will
1956
- // go into check clientHeight/clientWidth (which has the wrong value).
1957
- if (!size.height) {
1958
- mode = d.compatMode;
1959
- if (mode || !$.support.boxModel) { // IE, Gecko
1960
- domObject = mode === 'CSS1Compat' ?
1961
- documentElement : // Standards
1962
- d.body; // Quirks
1963
- size = {
1964
- height: domObject.clientHeight,
1965
- width: domObject.clientWidth
1966
- };
1967
- }
1968
- }
1969
 
1970
- return size;
1971
- }
 
 
 
1972
 
1973
- function getViewportOffset() {
1974
- return {
1975
- top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop,
1976
- left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft
1977
- };
1978
- }
1979
 
1980
- function checkInView() {
1981
- if (!inviewObjects.length) {
1982
- return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1983
  }
 
1984
 
1985
- var i = 0, $elements = $.map(inviewObjects, function (inviewObject) {
1986
- var selector = inviewObject.data.selector,
1987
- $element = inviewObject.$element;
1988
- return selector ? $element.find(selector) : $element;
1989
- });
1990
 
1991
- viewportSize = viewportSize || getViewportSize();
1992
- viewportOffset = viewportOffset || getViewportOffset();
1993
 
1994
- for (; i < inviewObjects.length; i++) {
1995
- // Ignore elements that are not in the DOM tree
1996
- if (!$.contains(documentElement, $elements[i][0])) {
1997
- continue;
1998
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1999
 
2000
- var $element = $($elements[i]),
2001
- elementSize = { height: $element[0].offsetHeight, width: $element[0].offsetWidth },
2002
- elementOffset = $element.offset(),
2003
- inView = $element.data('inview');
2004
 
2005
- // Don't ask me why because I haven't figured out yet:
2006
- // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
2007
- // Even though it sounds weird:
2008
- // It seems that the execution of this function is interferred by the onresize/onscroll event
2009
- // where viewportOffset and viewportSize are unset
2010
- if (!viewportOffset || !viewportSize) {
2011
- return;
2012
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
2013
 
2014
- if (elementOffset.top + elementSize.height > viewportOffset.top &&
2015
- elementOffset.top < viewportOffset.top + viewportSize.height &&
2016
- elementOffset.left + elementSize.width > viewportOffset.left &&
2017
- elementOffset.left < viewportOffset.left + viewportSize.width) {
2018
- if (!inView) {
2019
- $element.data('inview', true).trigger('inview', [true]);
2020
- }
2021
- } else if (inView) {
2022
- $element.data('inview', false).trigger('inview', [false]);
2023
- }
2024
  }
2025
- }
2026
 
2027
- $(w).on("scroll resize scrollstop", function () {
2028
- viewportSize = viewportOffset = null;
2029
- });
 
2030
 
2031
- // IE < 9 scrolls to focused elements without firing the "scroll" event
2032
- if (!documentElement.addEventListener && documentElement.attachEvent) {
2033
- documentElement.attachEvent("onfocusin", function () {
2034
- viewportOffset = null;
2035
- });
2036
- }
2037
- }));
2038
- /*!
2039
- * Isotope PACKAGED v3.0.6
2040
- *
2041
- * Licensed GPLv3 for open source use
2042
- * or Isotope Commercial License for commercial use
2043
- *
2044
- * https://isotope.metafizzy.co
2045
- * Copyright 2010-2018 Metafizzy
2046
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2047
 
2048
- /**
2049
- * Bridget makes jQuery widgets
2050
- * v2.0.1
2051
- * MIT license
2052
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2053
 
2054
- /* jshint browser: true, strict: true, undef: true, unused: true */
 
 
 
 
 
2055
 
2056
- ( function( window, factory ) {
2057
- // universal module definition
2058
- /*jshint strict: false */ /* globals define, module, require */
2059
- if ( typeof define == 'function' && define.amd ) {
2060
- // AMD
2061
- define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {
2062
- return factory( window, jQuery );
2063
- });
2064
- } else if ( typeof module == 'object' && module.exports ) {
2065
- // CommonJS
2066
- module.exports = factory(
2067
- window,
2068
- require('jquery')
2069
- );
2070
- } else {
2071
- // browser global
2072
- window.jQueryBridget = factory(
2073
- window,
2074
- window.jQuery
2075
- );
2076
- }
2077
 
2078
- }( window, function factory( window, jQuery ) {
2079
- 'use strict';
2080
 
2081
- // ----- utils ----- //
 
 
2082
 
2083
- var arraySlice = Array.prototype.slice;
2084
 
2085
- // helper function for logging errors
2086
- // $.error breaks jQuery chaining
2087
- var console = window.console;
2088
- var logError = typeof console == 'undefined' ? function() {} :
2089
- function( message ) {
2090
- console.error( message );
2091
- };
2092
 
2093
- // ----- jQueryBridget ----- //
 
 
2094
 
2095
- function jQueryBridget( namespace, PluginClass, $ ) {
2096
- $ = $ || jQuery || window.jQuery;
2097
- if ( !$ ) {
2098
- return;
2099
- }
2100
 
2101
- // add option method -> $().plugin('option', {...})
2102
- if ( !PluginClass.prototype.option ) {
2103
- // option setter
2104
- PluginClass.prototype.option = function( opts ) {
2105
- // bail out if not an object
2106
- if ( !$.isPlainObject( opts ) ){
2107
- return;
2108
- }
2109
- this.options = $.extend( true, this.options, opts );
2110
- };
2111
- }
2112
 
2113
- // make jQuery plugin
2114
- $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {
2115
- if ( typeof arg0 == 'string' ) {
2116
- // method call $().plugin( 'methodName', { options } )
2117
- // shift arguments by 1
2118
- var args = arraySlice.call( arguments, 1 );
2119
- return methodCall( this, arg0, args );
2120
- }
2121
- // just $().plugin({ options })
2122
- plainCall( this, arg0 );
2123
- return this;
2124
- };
2125
 
2126
- // $().plugin('methodName')
2127
- function methodCall( $elems, methodName, args ) {
2128
- var returnValue;
2129
- var pluginMethodStr = '$().' + namespace + '("' + methodName + '")';
2130
 
2131
- $elems.each( function( i, elem ) {
2132
- // get instance
2133
- var instance = $.data( elem, namespace );
2134
- if ( !instance ) {
2135
- logError( namespace + ' not initialized. Cannot call methods, i.e. ' +
2136
- pluginMethodStr );
2137
- return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2138
  }
2139
 
2140
- var method = instance[ methodName ];
2141
- if ( !method || methodName.charAt(0) == '_' ) {
2142
- logError( pluginMethodStr + ' is not a valid method' );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2143
  return;
2144
- }
2145
 
2146
- // apply method, get return value
2147
- var value = method.apply( instance, args );
2148
- // set return value if value is returned, use only first value
2149
- returnValue = returnValue === undefined ? value : returnValue;
2150
- });
2151
 
2152
- return returnValue !== undefined ? returnValue : $elems;
2153
- }
 
 
 
 
 
2154
 
2155
- function plainCall( $elems, options ) {
2156
- $elems.each( function( i, elem ) {
2157
- var instance = $.data( elem, namespace );
2158
- if ( instance ) {
2159
- // set options & init
2160
- instance.option( options );
2161
- instance._init();
2162
- } else {
2163
- // initialize new instance
2164
- instance = new PluginClass( elem, options );
2165
- $.data( elem, namespace, instance );
2166
- }
2167
- });
2168
- }
2169
 
2170
- updateJQuery( $ );
 
 
2171
 
2172
- }
2173
 
2174
- // ----- updateJQuery ----- //
 
 
 
 
 
 
2175
 
2176
- // set $.bridget for v1 backwards compatibility
2177
- function updateJQuery( $ ) {
2178
- if ( !$ || ( $ && $.bridget ) ) {
2179
- return;
2180
- }
2181
- $.bridget = jQueryBridget;
2182
- }
2183
 
2184
- updateJQuery( jQuery || window.jQuery );
2185
 
2186
- // ----- ----- //
2187
 
2188
- return jQueryBridget;
 
 
 
 
2189
 
2190
- }));
 
 
2191
 
2192
- /**
2193
- * EvEmitter v1.1.0
2194
- * Lil' event emitter
2195
- * MIT License
2196
- */
2197
 
2198
- /* jshint unused: true, undef: true, strict: true */
 
 
2199
 
2200
- ( function( global, factory ) {
2201
- // universal module definition
2202
- /* jshint strict: false */ /* globals define, module, window */
2203
- if ( typeof define == 'function' && define.amd ) {
2204
- // AMD - RequireJS
2205
- define( 'ev-emitter/ev-emitter',factory );
2206
- } else if ( typeof module == 'object' && module.exports ) {
2207
- // CommonJS - Browserify, Webpack
2208
- module.exports = factory();
2209
- } else {
2210
- // Browser globals
2211
- global.EvEmitter = factory();
2212
- }
2213
 
2214
- }( typeof window != 'undefined' ? window : this, function() {
2215
 
 
 
 
 
 
2216
 
 
 
 
 
 
 
 
2217
 
2218
- function EvEmitter() {}
 
 
2219
 
2220
- var proto = EvEmitter.prototype;
 
2221
 
2222
- proto.on = function( eventName, listener ) {
2223
- if ( !eventName || !listener ) {
2224
- return;
2225
- }
2226
- // set events hash
2227
- var events = this._events = this._events || {};
2228
- // set listeners array
2229
- var listeners = events[ eventName ] = events[ eventName ] || [];
2230
- // only add once
2231
- if ( listeners.indexOf( listener ) == -1 ) {
2232
- listeners.push( listener );
2233
- }
2234
 
2235
- return this;
2236
- };
 
 
 
 
 
 
 
2237
 
2238
- proto.once = function( eventName, listener ) {
2239
- if ( !eventName || !listener ) {
2240
- return;
2241
- }
2242
- // add event
2243
- this.on( eventName, listener );
2244
- // set once flag
2245
- // set onceEvents hash
2246
- var onceEvents = this._onceEvents = this._onceEvents || {};
2247
- // set onceListeners object
2248
- var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
2249
- // set flag
2250
- onceListeners[ listener ] = true;
 
 
 
 
 
2251
 
2252
- return this;
2253
- };
2254
 
2255
- proto.off = function( eventName, listener ) {
2256
- var listeners = this._events && this._events[ eventName ];
2257
- if ( !listeners || !listeners.length ) {
2258
- return;
2259
- }
2260
- var index = listeners.indexOf( listener );
2261
- if ( index != -1 ) {
2262
- listeners.splice( index, 1 );
2263
- }
2264
 
2265
- return this;
2266
- };
2267
 
2268
- proto.emitEvent = function( eventName, args ) {
2269
- var listeners = this._events && this._events[ eventName ];
2270
- if ( !listeners || !listeners.length ) {
2271
- return;
2272
- }
2273
- // copy over to avoid interference if .off() in listener
2274
- listeners = listeners.slice(0);
2275
- args = args || [];
2276
- // once stuff
2277
- var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
2278
 
2279
- for ( var i=0; i < listeners.length; i++ ) {
2280
- var listener = listeners[i]
2281
- var isOnce = onceListeners && onceListeners[ listener ];
2282
- if ( isOnce ) {
2283
- // remove listener
2284
- // remove before trigger to prevent recursion
2285
- this.off( eventName, listener );
2286
- // unset once flag
2287
- delete onceListeners[ listener ];
2288
- }
2289
- // trigger listener
2290
- listener.apply( this, args );
2291
- }
2292
 
2293
- return this;
2294
- };
2295
 
2296
- proto.allOff = function() {
2297
- delete this._events;
2298
- delete this._onceEvents;
2299
- };
2300
 
2301
- return EvEmitter;
2302
 
2303
- }));
 
 
 
2304
 
2305
- /*!
2306
- * getSize v2.0.3
2307
- * measure size of elements
2308
- * MIT license
2309
- */
2310
 
2311
- /* jshint browser: true, strict: true, undef: true, unused: true */
2312
- /* globals console: false */
2313
 
2314
- ( function( window, factory ) {
2315
- /* jshint strict: false */ /* globals define, module */
2316
- if ( typeof define == 'function' && define.amd ) {
2317
- // AMD
2318
- define( 'get-size/get-size',factory );
2319
- } else if ( typeof module == 'object' && module.exports ) {
2320
- // CommonJS
2321
- module.exports = factory();
2322
- } else {
2323
- // browser global
2324
- window.getSize = factory();
2325
- }
2326
 
2327
- })( window, function factory() {
2328
- 'use strict';
2329
 
2330
- // -------------------------- helpers -------------------------- //
 
 
 
 
2331
 
2332
- // get a number from a string, not a percentage
2333
- function getStyleSize( value ) {
2334
- var num = parseFloat( value );
2335
- // not a percent like '100%', and a number
2336
- var isValid = value.indexOf('%') == -1 && !isNaN( num );
2337
- return isValid && num;
2338
- }
2339
 
2340
- function noop() {}
2341
 
2342
- var logError = typeof console == 'undefined' ? noop :
2343
- function( message ) {
2344
- console.error( message );
2345
- };
2346
 
2347
- // -------------------------- measurements -------------------------- //
 
 
 
 
 
 
 
2348
 
2349
- var measurements = [
2350
- 'paddingLeft',
2351
- 'paddingRight',
2352
- 'paddingTop',
2353
- 'paddingBottom',
2354
- 'marginLeft',
2355
- 'marginRight',
2356
- 'marginTop',
2357
- 'marginBottom',
2358
- 'borderLeftWidth',
2359
- 'borderRightWidth',
2360
- 'borderTopWidth',
2361
- 'borderBottomWidth'
2362
- ];
2363
 
2364
- var measurementsLength = measurements.length;
 
 
2365
 
2366
- function getZeroSize() {
2367
- var size = {
2368
- width: 0,
2369
- height: 0,
2370
- innerWidth: 0,
2371
- innerHeight: 0,
2372
- outerWidth: 0,
2373
- outerHeight: 0
2374
- };
2375
- for ( var i=0; i < measurementsLength; i++ ) {
2376
- var measurement = measurements[i];
2377
- size[ measurement ] = 0;
2378
- }
2379
- return size;
2380
- }
2381
 
2382
- // -------------------------- getStyle -------------------------- //
 
 
 
 
 
 
 
 
 
 
2383
 
2384
- /**
2385
- * getStyle, get style of element, check for Firefox bug
2386
- * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
2387
- */
2388
- function getStyle( elem ) {
2389
- var style = getComputedStyle( elem );
2390
- if ( !style ) {
2391
- logError( 'Style returned ' + style +
2392
- '. Are you running this code in a hidden iframe on Firefox? ' +
2393
- 'See https://bit.ly/getsizebug1' );
2394
- }
2395
- return style;
2396
- }
2397
 
2398
- // -------------------------- setup -------------------------- //
 
 
 
 
2399
 
2400
- var isSetup = false;
2401
 
2402
- var isBoxSizeOuter;
 
 
2403
 
2404
- /**
2405
- * setup
2406
- * check isBoxSizerOuter
2407
- * do on first getSize() rather than on page load for Firefox bug
2408
- */
2409
- function setup() {
2410
- // setup once
2411
- if ( isSetup ) {
2412
- return;
2413
- }
2414
- isSetup = true;
2415
 
2416
- // -------------------------- box sizing -------------------------- //
2417
 
2418
- /**
2419
- * Chrome & Safari measure the outer-width on style.width on border-box elems
2420
- * IE11 & Firefox<29 measures the inner-width
2421
- */
2422
- var div = document.createElement('div');
2423
- div.style.width = '200px';
2424
- div.style.padding = '1px 2px 3px 4px';
2425
- div.style.borderStyle = 'solid';
2426
- div.style.borderWidth = '1px 2px 3px 4px';
2427
- div.style.boxSizing = 'border-box';
2428
 
2429
- var body = document.body || document.documentElement;
2430
- body.appendChild( div );
2431
- var style = getStyle( div );
2432
- // round value for browser zoom. desandro/masonry#928
2433
- isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;
2434
- getSize.isBoxSizeOuter = isBoxSizeOuter;
2435
 
2436
- body.removeChild( div );
2437
- }
 
2438
 
2439
- // -------------------------- getSize -------------------------- //
2440
 
2441
- function getSize( elem ) {
2442
- setup();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2443
 
2444
- // use querySeletor if elem is string
2445
- if ( typeof elem == 'string' ) {
2446
- elem = document.querySelector( elem );
2447
- }
2448
 
2449
- // do not proceed on non-objects
2450
- if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
2451
- return;
2452
- }
2453
 
2454
- var style = getStyle( elem );
 
 
 
2455
 
2456
- // if hidden, everything is 0
2457
- if ( style.display == 'none' ) {
2458
- return getZeroSize();
2459
- }
2460
 
2461
- var size = {};
2462
- size.width = elem.offsetWidth;
2463
- size.height = elem.offsetHeight;
 
 
2464
 
2465
- var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';
2466
 
2467
- // get all measurements
2468
- for ( var i=0; i < measurementsLength; i++ ) {
2469
- var measurement = measurements[i];
2470
- var value = style[ measurement ];
2471
- var num = parseFloat( value );
2472
- // any 'auto', 'medium' value will be 0
2473
- size[ measurement ] = !isNaN( num ) ? num : 0;
2474
- }
2475
 
2476
- var paddingWidth = size.paddingLeft + size.paddingRight;
2477
- var paddingHeight = size.paddingTop + size.paddingBottom;
2478
- var marginWidth = size.marginLeft + size.marginRight;
2479
- var marginHeight = size.marginTop + size.marginBottom;
2480
- var borderWidth = size.borderLeftWidth + size.borderRightWidth;
2481
- var borderHeight = size.borderTopWidth + size.borderBottomWidth;
2482
 
2483
- var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
 
 
2484
 
2485
- // overwrite width and height if we can get it from style
2486
- var styleWidth = getStyleSize( style.width );
2487
- if ( styleWidth !== false ) {
2488
- size.width = styleWidth +
2489
- // add padding and border unless it's already including it
2490
- ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
2491
- }
2492
 
2493
- var styleHeight = getStyleSize( style.height );
2494
- if ( styleHeight !== false ) {
2495
- size.height = styleHeight +
2496
- // add padding and border unless it's already including it
2497
- ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
2498
- }
2499
 
2500
- size.innerWidth = size.width - ( paddingWidth + borderWidth );
2501
- size.innerHeight = size.height - ( paddingHeight + borderHeight );
2502
 
2503
- size.outerWidth = size.width + marginWidth;
2504
- size.outerHeight = size.height + marginHeight;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2505
 
2506
- return size;
2507
- }
2508
 
2509
- return getSize;
2510
 
2511
- });
 
2512
 
2513
- /**
2514
- * matchesSelector v2.0.2
2515
- * matchesSelector( element, '.selector' )
2516
- * MIT license
2517
- */
 
 
2518
 
2519
- /*jshint browser: true, strict: true, undef: true, unused: true */
 
 
 
2520
 
2521
- ( function( window, factory ) {
2522
- /*global define: false, module: false */
2523
- 'use strict';
2524
- // universal module definition
2525
- if ( typeof define == 'function' && define.amd ) {
2526
- // AMD
2527
- define( 'desandro-matches-selector/matches-selector',factory );
2528
- } else if ( typeof module == 'object' && module.exports ) {
2529
- // CommonJS
2530
- module.exports = factory();
2531
- } else {
2532
- // browser global
2533
- window.matchesSelector = factory();
2534
- }
2535
 
2536
- }( window, function factory() {
2537
- 'use strict';
 
 
 
2538
 
2539
- var matchesMethod = ( function() {
2540
- var ElemProto = window.Element.prototype;
2541
- // check for the standard method name first
2542
- if ( ElemProto.matches ) {
2543
- return 'matches';
2544
- }
2545
- // check un-prefixed
2546
- if ( ElemProto.matchesSelector ) {
2547
- return 'matchesSelector';
2548
- }
2549
- // check vendor prefixes
2550
- var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];
2551
 
2552
- for ( var i=0; i < prefixes.length; i++ ) {
2553
- var prefix = prefixes[i];
2554
- var method = prefix + 'MatchesSelector';
2555
- if ( ElemProto[ method ] ) {
2556
- return method;
2557
- }
2558
- }
2559
- })();
2560
 
2561
- return function matchesSelector( elem, selector ) {
2562
- return elem[ matchesMethod ]( selector );
2563
- };
2564
 
2565
- }));
2566
 
2567
- /**
2568
- * Fizzy UI utils v2.0.7
2569
- * MIT license
2570
- */
2571
 
2572
- /*jshint browser: true, undef: true, unused: true, strict: true */
2573
 
2574
- ( function( window, factory ) {
2575
- // universal module definition
2576
- /*jshint strict: false */ /*globals define, module, require */
2577
 
2578
- if ( typeof define == 'function' && define.amd ) {
2579
- // AMD
2580
- define( 'fizzy-ui-utils/utils',[
2581
- 'desandro-matches-selector/matches-selector'
2582
- ], function( matchesSelector ) {
2583
- return factory( window, matchesSelector );
2584
- });
2585
- } else if ( typeof module == 'object' && module.exports ) {
2586
- // CommonJS
2587
- module.exports = factory(
2588
- window,
2589
- require('desandro-matches-selector')
2590
- );
2591
- } else {
2592
- // browser global
2593
- window.fizzyUIUtils = factory(
2594
- window,
2595
- window.matchesSelector
2596
- );
2597
- }
2598
 
2599
- }( window, function factory( window, matchesSelector ) {
 
2600
 
2601
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2602
 
2603
- var utils = {};
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2604
 
2605
- // ----- extend ----- //
2606
 
2607
- // extends objects
2608
- utils.extend = function( a, b ) {
2609
- for ( var prop in b ) {
2610
- a[ prop ] = b[ prop ];
2611
- }
2612
- return a;
2613
- };
2614
 
2615
- // ----- modulo ----- //
2616
 
2617
- utils.modulo = function( num, div ) {
2618
- return ( ( num % div ) + div ) % div;
2619
- };
2620
 
2621
- // ----- makeArray ----- //
2622
 
2623
- var arraySlice = Array.prototype.slice;
 
 
2624
 
2625
- // turn element or nodeList into an array
2626
- utils.makeArray = function( obj ) {
2627
- if ( Array.isArray( obj ) ) {
2628
- // use object if already an array
2629
- return obj;
2630
- }
2631
- // return empty array if undefined or null. #6
2632
- if ( obj === null || obj === undefined ) {
2633
- return [];
2634
- }
2635
 
2636
- var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
2637
- if ( isArrayLike ) {
2638
- // convert nodeList to array
2639
- return arraySlice.call( obj );
2640
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2641
 
2642
- // array of single index
2643
- return [ obj ];
2644
- };
 
2645
 
2646
- // ----- removeFrom ----- //
 
2647
 
2648
- utils.removeFrom = function( ary, obj ) {
2649
- var index = ary.indexOf( obj );
2650
- if ( index != -1 ) {
2651
- ary.splice( index, 1 );
2652
- }
2653
- };
 
 
 
 
 
 
 
 
 
 
 
2654
 
2655
- // ----- getParent ----- //
 
 
2656
 
2657
- utils.getParent = function( elem, selector ) {
2658
- while ( elem.parentNode && elem != document.body ) {
2659
- elem = elem.parentNode;
2660
- if ( matchesSelector( elem, selector ) ) {
2661
- return elem;
2662
- }
2663
- }
2664
- };
2665
 
2666
- // ----- getQueryElement ----- //
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2667
 
2668
- // use element as selector string
2669
- utils.getQueryElement = function( elem ) {
2670
- if ( typeof elem == 'string' ) {
2671
- return document.querySelector( elem );
2672
- }
2673
- return elem;
2674
- };
2675
 
2676
- // ----- handleEvent ----- //
2677
 
2678
- // enable .ontype to trigger from .addEventListener( elem, 'type' )
2679
- utils.handleEvent = function( event ) {
2680
- var method = 'on' + event.type;
2681
- if ( this[ method ] ) {
2682
- this[ method ]( event );
2683
- }
2684
- };
2685
 
2686
- // ----- filterFindElements ----- //
 
 
 
 
 
 
2687
 
2688
- utils.filterFindElements = function( elems, selector ) {
2689
- // make array of elems
2690
- elems = utils.makeArray( elems );
2691
- var ffElems = [];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2692
 
2693
- elems.forEach( function( elem ) {
2694
- // check that elem is an actual element
2695
- if ( !( elem instanceof HTMLElement ) ) {
2696
- return;
2697
- }
2698
- // add elem if no selector
2699
- if ( !selector ) {
2700
- ffElems.push( elem );
2701
- return;
2702
- }
2703
- // filter & find items if we have a selector
2704
- // filter
2705
- if ( matchesSelector( elem, selector ) ) {
2706
- ffElems.push( elem );
2707
- }
2708
- // find children
2709
- var childElems = elem.querySelectorAll( selector );
2710
- // concat childElems to filterFound array
2711
- for ( var i=0; i < childElems.length; i++ ) {
2712
- ffElems.push( childElems[i] );
2713
- }
2714
- });
2715
 
2716
- return ffElems;
2717
- };
2718
 
2719
- // ----- debounceMethod ----- //
2720
 
2721
- utils.debounceMethod = function( _class, methodName, threshold ) {
2722
- threshold = threshold || 100;
2723
- // original method
2724
- var method = _class.prototype[ methodName ];
2725
- var timeoutName = methodName + 'Timeout';
2726
 
2727
- _class.prototype[ methodName ] = function() {
2728
- var timeout = this[ timeoutName ];
2729
- clearTimeout( timeout );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2730
 
2731
- var args = arguments;
2732
- var _this = this;
2733
- this[ timeoutName ] = setTimeout( function() {
2734
- method.apply( _this, args );
2735
- delete _this[ timeoutName ];
2736
- }, threshold );
2737
- };
2738
- };
2739
 
2740
- // ----- docReady ----- //
 
 
2741
 
2742
- utils.docReady = function( callback ) {
2743
- var readyState = document.readyState;
2744
- if ( readyState == 'complete' || readyState == 'interactive' ) {
2745
- // do async to allow for other scripts to run. metafizzy/flickity#441
2746
- setTimeout( callback );
2747
- } else {
2748
- document.addEventListener( 'DOMContentLoaded', callback );
2749
- }
2750
- };
2751
 
2752
- // ----- htmlInit ----- //
 
 
 
2753
 
2754
- // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
2755
- utils.toDashed = function( str ) {
2756
- return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
2757
- return $1 + '-' + $2;
2758
- }).toLowerCase();
2759
- };
2760
 
2761
- var console = window.console;
2762
- /**
2763
- * allow user to initialize classes via [data-namespace] or .js-namespace class
2764
- * htmlInit( Widget, 'widgetName' )
2765
- * options are parsed from data-namespace-options
2766
- */
2767
- utils.htmlInit = function( WidgetClass, namespace ) {
2768
- utils.docReady( function() {
2769
- var dashedNamespace = utils.toDashed( namespace );
2770
- var dataAttr = 'data-' + dashedNamespace;
2771
- var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
2772
- var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
2773
- var elems = utils.makeArray( dataAttrElems )
2774
- .concat( utils.makeArray( jsDashElems ) );
2775
- var dataOptionsAttr = dataAttr + '-options';
2776
- var jQuery = window.jQuery;
2777
 
2778
- elems.forEach( function( elem ) {
2779
- var attr = elem.getAttribute( dataAttr ) ||
2780
- elem.getAttribute( dataOptionsAttr );
2781
- var options;
2782
- try {
2783
- options = attr && JSON.parse( attr );
2784
- } catch ( error ) {
2785
- // log error, do not initialize
2786
- if ( console ) {
2787
- console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
2788
- ': ' + error );
2789
- }
2790
- return;
2791
- }
2792
- // initialize
2793
- var instance = new WidgetClass( elem, options );
2794
- // make available via $().data('namespace')
2795
- if ( jQuery ) {
2796
- jQuery.data( elem, namespace, instance );
2797
- }
2798
- });
2799
 
2800
- });
2801
- };
2802
 
2803
- // ----- ----- //
 
2804
 
2805
- return utils;
 
2806
 
2807
- }));
2808
 
2809
- /**
2810
- * Outlayer Item
2811
- */
2812
 
2813
- ( function( window, factory ) {
2814
- // universal module definition
2815
- /* jshint strict: false */ /* globals define, module, require */
2816
- if ( typeof define == 'function' && define.amd ) {
2817
- // AMD - RequireJS
2818
- define( 'outlayer/item',[
2819
- 'ev-emitter/ev-emitter',
2820
- 'get-size/get-size'
2821
- ],
2822
- factory
2823
- );
2824
- } else if ( typeof module == 'object' && module.exports ) {
2825
- // CommonJS - Browserify, Webpack
2826
- module.exports = factory(
2827
- require('ev-emitter'),
2828
- require('get-size')
2829
- );
2830
- } else {
2831
- // browser global
2832
- window.Outlayer = {};
2833
- window.Outlayer.Item = factory(
2834
- window.EvEmitter,
2835
- window.getSize
2836
- );
2837
- }
2838
 
2839
- }( window, function factory( EvEmitter, getSize ) {
2840
- 'use strict';
2841
 
2842
- // ----- helpers ----- //
2843
 
2844
- function isEmptyObj( obj ) {
2845
- for ( var prop in obj ) {
2846
- return false;
2847
- }
2848
- prop = null;
2849
- return true;
2850
- }
2851
 
2852
- // -------------------------- CSS3 support -------------------------- //
 
 
 
 
2853
 
 
 
 
2854
 
2855
- var docElemStyle = document.documentElement.style;
2856
 
2857
- var transitionProperty = typeof docElemStyle.transition == 'string' ?
2858
- 'transition' : 'WebkitTransition';
2859
- var transformProperty = typeof docElemStyle.transform == 'string' ?
2860
- 'transform' : 'WebkitTransform';
 
2861
 
2862
- var transitionEndEvent = {
2863
- WebkitTransition: 'webkitTransitionEnd',
2864
- transition: 'transitionend'
2865
- }[ transitionProperty ];
 
 
 
 
 
2866
 
2867
- // cache all vendor properties that could have vendor prefix
2868
- var vendorProperties = {
2869
- transform: transformProperty,
2870
- transition: transitionProperty,
2871
- transitionDuration: transitionProperty + 'Duration',
2872
- transitionProperty: transitionProperty + 'Property',
2873
- transitionDelay: transitionProperty + 'Delay'
2874
- };
2875
 
2876
- // -------------------------- Item -------------------------- //
2877
 
2878
- function Item( element, layout ) {
2879
- if ( !element ) {
2880
- return;
2881
- }
2882
 
2883
- this.element = element;
2884
- // parent layout class, i.e. Masonry, Isotope, or Packery
2885
- this.layout = layout;
2886
- this.position = {
2887
- x: 0,
2888
- y: 0
2889
- };
2890
 
2891
- this._create();
2892
- }
 
 
 
2893
 
2894
- // inherit EvEmitter
2895
- var proto = Item.prototype = Object.create( EvEmitter.prototype );
2896
- proto.constructor = Item;
2897
 
2898
- proto._create = function() {
2899
- // transition objects
2900
- this._transn = {
2901
- ingProperties: {},
2902
- clean: {},
2903
- onEnd: {}
2904
- };
2905
 
2906
- this.css({
2907
- position: 'absolute'
2908
- });
2909
- };
2910
 
2911
- // trigger specified handler for event type
2912
- proto.handleEvent = function( event ) {
2913
- var method = 'on' + event.type;
2914
- if ( this[ method ] ) {
2915
- this[ method ]( event );
2916
- }
2917
- };
2918
 
2919
- proto.getSize = function() {
2920
- this.size = getSize( this.element );
2921
- };
2922
 
2923
- /**
2924
- * apply CSS styles to element
2925
- * @param {Object} style
2926
- */
2927
- proto.css = function( style ) {
2928
- var elemStyle = this.element.style;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2929
 
2930
- for ( var prop in style ) {
2931
- // use vendor property if available
2932
- var supportedProp = vendorProperties[ prop ] || prop;
2933
- elemStyle[ supportedProp ] = style[ prop ];
2934
- }
2935
- };
2936
 
2937
- // measure position, and sets it
2938
- proto.getPosition = function() {
2939
- var style = getComputedStyle( this.element );
2940
- var isOriginLeft = this.layout._getOption('originLeft');
2941
- var isOriginTop = this.layout._getOption('originTop');
2942
- var xValue = style[ isOriginLeft ? 'left' : 'right' ];
2943
- var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
2944
- var x = parseFloat( xValue );
2945
- var y = parseFloat( yValue );
2946
- // convert percent to pixels
2947
- var layoutSize = this.layout.size;
2948
- if ( xValue.indexOf('%') != -1 ) {
2949
- x = ( x / 100 ) * layoutSize.width;
2950
- }
2951
- if ( yValue.indexOf('%') != -1 ) {
2952
- y = ( y / 100 ) * layoutSize.height;
2953
- }
2954
- // clean up 'auto' or other non-integer values
2955
- x = isNaN( x ) ? 0 : x;
2956
- y = isNaN( y ) ? 0 : y;
2957
- // remove padding from measurement
2958
- x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
2959
- y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
2960
 
2961
- this.position.x = x;
2962
- this.position.y = y;
2963
- };
2964
 
2965
- // set settled position, apply padding
2966
- proto.layoutPosition = function() {
2967
- var layoutSize = this.layout.size;
2968
- var style = {};
2969
- var isOriginLeft = this.layout._getOption('originLeft');
2970
- var isOriginTop = this.layout._getOption('originTop');
2971
 
2972
- // x
2973
- var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
2974
- var xProperty = isOriginLeft ? 'left' : 'right';
2975
- var xResetProperty = isOriginLeft ? 'right' : 'left';
 
 
 
2976
 
2977
- var x = this.position.x + layoutSize[ xPadding ];
2978
- // set in percentage or pixels
2979
- style[ xProperty ] = this.getXValue( x );
2980
- // reset other property
2981
- style[ xResetProperty ] = '';
 
2982
 
2983
- // y
2984
- var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
2985
- var yProperty = isOriginTop ? 'top' : 'bottom';
2986
- var yResetProperty = isOriginTop ? 'bottom' : 'top';
2987
 
2988
- var y = this.position.y + layoutSize[ yPadding ];
2989
- // set in percentage or pixels
2990
- style[ yProperty ] = this.getYValue( y );
2991
- // reset other property
2992
- style[ yResetProperty ] = '';
2993
 
2994
- this.css( style );
2995
- this.emitEvent( 'layout', [ this ] );
2996
- };
2997
 
2998
- proto.getXValue = function( x ) {
2999
- var isHorizontal = this.layout._getOption('horizontal');
3000
- return this.layout.options.percentPosition && !isHorizontal ?
3001
- ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
3002
- };
3003
 
3004
- proto.getYValue = function( y ) {
3005
- var isHorizontal = this.layout._getOption('horizontal');
3006
- return this.layout.options.percentPosition && isHorizontal ?
3007
- ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
3008
- };
3009
 
3010
- proto._transitionTo = function( x, y ) {
3011
- this.getPosition();
3012
- // get current x & y from top/left
3013
- var curX = this.position.x;
3014
- var curY = this.position.y;
 
3015
 
3016
- var didNotMove = x == this.position.x && y == this.position.y;
3017
 
3018
- // save end position
3019
- this.setPosition( x, y );
 
 
 
 
3020
 
3021
- // if did not move and not transitioning, just go to layout
3022
- if ( didNotMove && !this.isTransitioning ) {
3023
- this.layoutPosition();
3024
- return;
3025
- }
3026
 
3027
- var transX = x - curX;
3028
- var transY = y - curY;
3029
- var transitionStyle = {};
3030
- transitionStyle.transform = this.getTranslate( transX, transY );
3031
 
3032
- this.transition({
3033
- to: transitionStyle,
3034
- onTransitionEnd: {
3035
- transform: this.layoutPosition
 
 
 
 
 
 
 
3036
  },
3037
- isCleaning: true
3038
- });
3039
- };
3040
 
3041
- proto.getTranslate = function( x, y ) {
3042
- // flip cooridinates if origin on right or bottom
3043
- var isOriginLeft = this.layout._getOption('originLeft');
3044
- var isOriginTop = this.layout._getOption('originTop');
3045
- x = isOriginLeft ? x : -x;
3046
- y = isOriginTop ? y : -y;
3047
- return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
3048
- };
3049
 
3050
- // non transition + transform support
3051
- proto.goTo = function( x, y ) {
3052
- this.setPosition( x, y );
3053
- this.layoutPosition();
3054
- };
3055
 
3056
- proto.moveTo = proto._transitionTo;
3057
 
3058
- proto.setPosition = function( x, y ) {
3059
- this.position.x = parseFloat( x );
3060
- this.position.y = parseFloat( y );
3061
- };
3062
 
3063
- // ----- transition ----- //
 
3064
 
3065
- /**
3066
- * @param {Object} style - CSS
3067
- * @param {Function} onTransitionEnd
3068
- */
 
 
3069
 
3070
- // non transition, just trigger callback
3071
- proto._nonTransition = function( args ) {
3072
- this.css( args.to );
3073
- if ( args.isCleaning ) {
3074
- this._removeStyles( args.to );
3075
- }
3076
- for ( var prop in args.onTransitionEnd ) {
3077
- args.onTransitionEnd[ prop ].call( this );
3078
- }
3079
- };
3080
 
3081
- /**
3082
- * proper transition
3083
- * @param {Object} args - arguments
3084
- * @param {Object} to - style to transition to
3085
- * @param {Object} from - style to start transition from
3086
- * @param {Boolean} isCleaning - removes transition styles after transition
3087
- * @param {Function} onTransitionEnd - callback
3088
- */
3089
- proto.transition = function( args ) {
3090
- // redirect to nonTransition if no transition duration
3091
- if ( !parseFloat( this.layout.options.transitionDuration ) ) {
3092
- this._nonTransition( args );
3093
- return;
3094
- }
3095
 
3096
- var _transition = this._transn;
3097
- // keep track of onTransitionEnd callback by css property
3098
- for ( var prop in args.onTransitionEnd ) {
3099
- _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
3100
- }
3101
- // keep track of properties that are transitioning
3102
- for ( prop in args.to ) {
3103
- _transition.ingProperties[ prop ] = true;
3104
- // keep track of properties to clean up when transition is done
3105
- if ( args.isCleaning ) {
3106
- _transition.clean[ prop ] = true;
3107
- }
3108
- }
3109
 
3110
- // set from styles
3111
- if ( args.from ) {
3112
- this.css( args.from );
3113
- // force redraw. http://blog.alexmaccaw.com/css-transitions
3114
- var h = this.element.offsetHeight;
3115
- // hack for JSHint to hush about unused var
3116
- h = null;
3117
- }
3118
- // enable transition
3119
- this.enableTransition( args.to );
3120
- // set styles that are transitioning
3121
- this.css( args.to );
3122
 
3123
- this.isTransitioning = true;
 
 
3124
 
3125
- };
3126
 
3127
- // dash before all cap letters, including first for
3128
- // WebkitTransform => -webkit-transform
3129
- function toDashedAll( str ) {
3130
- return str.replace( /([A-Z])/g, function( $1 ) {
3131
- return '-' + $1.toLowerCase();
3132
- });
3133
- }
3134
 
3135
- var transitionProps = 'opacity,' + toDashedAll( transformProperty );
 
 
 
3136
 
3137
- proto.enableTransition = function(/* style */) {
3138
- // HACK changing transitionProperty during a transition
3139
- // will cause transition to jump
3140
- if ( this.isTransitioning ) {
3141
- return;
3142
- }
3143
 
3144
- // make `transition: foo, bar, baz` from style object
3145
- // HACK un-comment this when enableTransition can work
3146
- // while a transition is happening
3147
- // var transitionValues = [];
3148
- // for ( var prop in style ) {
3149
- // // dash-ify camelCased properties like WebkitTransition
3150
- // prop = vendorProperties[ prop ] || prop;
3151
- // transitionValues.push( toDashedAll( prop ) );
3152
- // }
3153
- // munge number to millisecond, to match stagger
3154
- var duration = this.layout.options.transitionDuration;
3155
- duration = typeof duration == 'number' ? duration + 'ms' : duration;
3156
- // enable transition styles
3157
- this.css({
3158
- transitionProperty: transitionProps,
3159
- transitionDuration: duration,
3160
- transitionDelay: this.staggerDelay || 0
3161
- });
3162
- // listen for transition end event
3163
- this.element.addEventListener( transitionEndEvent, this, false );
3164
- };
3165
 
3166
- // ----- events ----- //
3167
 
3168
- proto.onwebkitTransitionEnd = function( event ) {
3169
- this.ontransitionend( event );
3170
- };
3171
 
3172
- proto.onotransitionend = function( event ) {
3173
- this.ontransitionend( event );
3174
- };
3175
 
3176
- // properties that I munge to make my life easier
3177
- var dashedVendorProperties = {
3178
- '-webkit-transform': 'transform'
3179
- };
3180
 
3181
- proto.ontransitionend = function( event ) {
3182
- // disregard bubbled events from children
3183
- if ( event.target !== this.element ) {
3184
- return;
3185
- }
3186
- var _transition = this._transn;
3187
- // get property name of transitioned property, convert to prefix-free
3188
- var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;
3189
 
3190
- // remove property that has completed transitioning
3191
- delete _transition.ingProperties[ propertyName ];
3192
- // check if any properties are still transitioning
3193
- if ( isEmptyObj( _transition.ingProperties ) ) {
3194
- // all properties have completed transitioning
3195
- this.disableTransition();
3196
- }
3197
- // clean style
3198
- if ( propertyName in _transition.clean ) {
3199
- // clean up style
3200
- this.element.style[ event.propertyName ] = '';
3201
- delete _transition.clean[ propertyName ];
3202
- }
3203
- // trigger onTransitionEnd callback
3204
- if ( propertyName in _transition.onEnd ) {
3205
- var onTransitionEnd = _transition.onEnd[ propertyName ];
3206
- onTransitionEnd.call( this );
3207
- delete _transition.onEnd[ propertyName ];
3208
- }
3209
 
3210
- this.emitEvent( 'transitionEnd', [ this ] );
3211
- };
 
 
 
 
 
3212
 
3213
- proto.disableTransition = function() {
3214
- this.removeTransitionStyles();
3215
- this.element.removeEventListener( transitionEndEvent, this, false );
3216
- this.isTransitioning = false;
3217
- };
 
 
 
 
 
 
 
 
 
3218
 
3219
- /**
3220
- * removes style property from element
3221
- * @param {Object} style
3222
- **/
3223
- proto._removeStyles = function( style ) {
3224
- // clean up transition styles
3225
- var cleanStyle = {};
3226
- for ( var prop in style ) {
3227
- cleanStyle[ prop ] = '';
3228
- }
3229
- this.css( cleanStyle );
3230
- };
3231
 
3232
- var cleanTransitionStyle = {
3233
- transitionProperty: '',
3234
- transitionDuration: '',
3235
- transitionDelay: ''
3236
- };
 
 
 
3237
 
3238
- proto.removeTransitionStyles = function() {
3239
- // remove transition
3240
- this.css( cleanTransitionStyle );
3241
- };
3242
 
3243
- // ----- stagger ----- //
 
 
3244
 
3245
- proto.stagger = function( delay ) {
3246
- delay = isNaN( delay ) ? 0 : delay;
3247
- this.staggerDelay = delay + 'ms';
3248
- };
3249
 
3250
- // ----- show/hide/remove ----- //
 
 
 
 
 
 
 
 
 
 
 
 
3251
 
3252
- // remove element from DOM
3253
- proto.removeElem = function() {
3254
- this.element.parentNode.removeChild( this.element );
3255
- // remove display: none
3256
- this.css({ display: '' });
3257
- this.emitEvent( 'remove', [ this ] );
3258
- };
3259
 
3260
- proto.remove = function() {
3261
- // just remove element if no transition support or no transition
3262
- if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {
3263
- this.removeElem();
3264
- return;
3265
- }
3266
 
3267
- // start transition
3268
- this.once( 'transitionEnd', function() {
3269
- this.removeElem();
3270
- });
3271
- this.hide();
3272
- };
3273
 
3274
- proto.reveal = function() {
3275
- delete this.isHidden;
3276
- // remove display: none
3277
- this.css({ display: '' });
 
 
3278
 
3279
- var options = this.layout.options;
 
3280
 
3281
- var onTransitionEnd = {};
3282
- var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
3283
- onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;
 
 
3284
 
3285
- this.transition({
3286
- from: options.hiddenStyle,
3287
- to: options.visibleStyle,
3288
- isCleaning: true,
3289
- onTransitionEnd: onTransitionEnd
3290
- });
3291
- };
3292
 
3293
- proto.onRevealTransitionEnd = function() {
3294
- // check if still visible
3295
- // during transition, item may have been hidden
3296
- if ( !this.isHidden ) {
3297
- this.emitEvent('reveal');
3298
  }
3299
- };
3300
 
3301
- /**
3302
- * get style property use for hide/reveal transition end
3303
- * @param {String} styleProperty - hiddenStyle/visibleStyle
3304
- * @returns {String}
3305
- */
3306
- proto.getHideRevealTransitionEndProperty = function( styleProperty ) {
3307
- var optionStyle = this.layout.options[ styleProperty ];
3308
- // use opacity
3309
- if ( optionStyle.opacity ) {
3310
- return 'opacity';
3311
- }
3312
- // get first property
3313
- for ( var prop in optionStyle ) {
3314
- return prop;
3315
- }
3316
- };
3317
 
3318
- proto.hide = function() {
3319
- // set flag
3320
- this.isHidden = true;
3321
- // remove display: none
3322
- this.css({ display: '' });
3323
 
3324
- var options = this.layout.options;
 
 
 
 
3325
 
3326
- var onTransitionEnd = {};
3327
- var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
3328
- onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;
3329
 
3330
- this.transition({
3331
- from: options.visibleStyle,
3332
- to: options.hiddenStyle,
3333
- // keep hidden stuff hidden
3334
- isCleaning: true,
3335
- onTransitionEnd: onTransitionEnd
3336
- });
3337
- };
3338
 
3339
- proto.onHideTransitionEnd = function() {
3340
- // check if still hidden
3341
- // during transition, item may have been un-hidden
3342
- if ( this.isHidden ) {
3343
- this.css({ display: 'none' });
3344
- this.emitEvent('hide');
3345
- }
3346
- };
3347
 
3348
- proto.destroy = function() {
3349
- this.css({
3350
- position: '',
3351
- left: '',
3352
- right: '',
3353
- top: '',
3354
- bottom: '',
3355
- transition: '',
3356
- transform: ''
3357
- });
3358
- };
3359
 
3360
- return Item;
 
 
 
 
3361
 
3362
- }));
 
 
 
 
 
 
 
 
 
 
 
 
 
3363
 
3364
- /*!
3365
- * Outlayer v2.1.1
3366
- * the brains and guts of a layout library
3367
- * MIT license
3368
- */
3369
 
3370
- ( function( window, factory ) {
3371
- 'use strict';
3372
- // universal module definition
3373
- /* jshint strict: false */ /* globals define, module, require */
3374
- if ( typeof define == 'function' && define.amd ) {
3375
- // AMD - RequireJS
3376
- define( 'outlayer/outlayer',[
3377
- 'ev-emitter/ev-emitter',
3378
- 'get-size/get-size',
3379
- 'fizzy-ui-utils/utils',
3380
- './item'
3381
- ],
3382
- function( EvEmitter, getSize, utils, Item ) {
3383
- return factory( window, EvEmitter, getSize, utils, Item);
3384
- }
3385
- );
3386
- } else if ( typeof module == 'object' && module.exports ) {
3387
- // CommonJS - Browserify, Webpack
3388
- module.exports = factory(
3389
- window,
3390
- require('ev-emitter'),
3391
- require('get-size'),
3392
- require('fizzy-ui-utils'),
3393
- require('./item')
3394
- );
3395
- } else {
3396
- // browser global
3397
- window.Outlayer = factory(
3398
- window,
3399
- window.EvEmitter,
3400
- window.getSize,
3401
- window.fizzyUIUtils,
3402
- window.Outlayer.Item
3403
- );
3404
- }
3405
 
3406
- }( window, function factory( window, EvEmitter, getSize, utils, Item ) {
3407
- 'use strict';
3408
 
3409
- // ----- vars ----- //
 
3410
 
3411
- var console = window.console;
3412
- var jQuery = window.jQuery;
3413
- var noop = function() {};
3414
 
3415
- // -------------------------- Outlayer -------------------------- //
 
 
3416
 
3417
- // globally unique identifiers
3418
- var GUID = 0;
3419
- // internal store of all Outlayer intances
3420
- var instances = {};
 
 
3421
 
 
 
 
 
3422
 
3423
- /**
3424
- * @param {Element, String} element
3425
- * @param {Object} options
3426
- * @constructor
3427
- */
3428
- function Outlayer( element, options ) {
3429
- var queryElement = utils.getQueryElement( element );
3430
- if ( !queryElement ) {
3431
- if ( console ) {
3432
- console.error( 'Bad element for ' + this.constructor.namespace +
3433
- ': ' + ( queryElement || element ) );
3434
- }
3435
- return;
3436
- }
3437
- this.element = queryElement;
3438
- // add jQuery
3439
- if ( jQuery ) {
3440
- this.$element = jQuery( this.element );
3441
- }
3442
 
3443
- // options
3444
- this.options = utils.extend( {}, this.constructor.defaults );
3445
- this.option( options );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3446
 
3447
- // add id for Outlayer.getFromElement
3448
- var id = ++GUID;
3449
- this.element.outlayerGUID = id; // expando
3450
- instances[ id ] = this; // associate via id
3451
 
3452
- // kick it off
3453
- this._create();
 
 
3454
 
3455
- var isInitLayout = this._getOption('initLayout');
3456
- if ( isInitLayout ) {
3457
- this.layout();
3458
- }
3459
- }
3460
 
3461
- // settings are for internal use only
3462
- Outlayer.namespace = 'outlayer';
3463
- Outlayer.Item = Item;
3464
 
3465
- // default options
3466
- Outlayer.defaults = {
3467
- containerStyle: {
3468
- position: 'relative'
3469
- },
3470
- initLayout: true,
3471
- originLeft: true,
3472
- originTop: true,
3473
- resize: true,
3474
- resizeContainer: true,
3475
- // item options
3476
- transitionDuration: '0.4s',
3477
- hiddenStyle: {
3478
- opacity: 0,
3479
- transform: 'scale(0.001)'
3480
- },
3481
- visibleStyle: {
3482
- opacity: 1,
3483
- transform: 'scale(1)'
3484
- }
3485
- };
3486
 
3487
- var proto = Outlayer.prototype;
3488
- // inherit EvEmitter
3489
- utils.extend( proto, EvEmitter.prototype );
 
3490
 
3491
- /**
3492
- * set options
3493
- * @param {Object} opts
3494
- */
3495
- proto.option = function( opts ) {
3496
- utils.extend( this.options, opts );
3497
- };
3498
 
3499
- /**
3500
- * get backwards compatible option value, check old name
3501
- */
3502
- proto._getOption = function( option ) {
3503
- var oldOption = this.constructor.compatOptions[ option ];
3504
- return oldOption && this.options[ oldOption ] !== undefined ?
3505
- this.options[ oldOption ] : this.options[ option ];
3506
- };
3507
 
3508
- Outlayer.compatOptions = {
3509
- // currentName: oldName
3510
- initLayout: 'isInitLayout',
3511
- horizontal: 'isHorizontal',
3512
- layoutInstant: 'isLayoutInstant',
3513
- originLeft: 'isOriginLeft',
3514
- originTop: 'isOriginTop',
3515
- resize: 'isResizeBound',
3516
- resizeContainer: 'isResizingContainer'
3517
- };
3518
 
3519
- proto._create = function() {
3520
- // get items from children
3521
- this.reloadItems();
3522
- // elements that affect layout, but are not laid out
3523
- this.stamps = [];
3524
- this.stamp( this.options.stamp );
3525
- // set container style
3526
- utils.extend( this.element.style, this.options.containerStyle );
3527
 
3528
- // bind resize method
3529
- var canBindResize = this._getOption('resize');
3530
- if ( canBindResize ) {
3531
- this.bindResize();
3532
- }
3533
- };
3534
 
3535
- // goes through all children again and gets bricks in proper order
3536
- proto.reloadItems = function() {
3537
- // collection of item elements
3538
- this.items = this._itemize( this.element.children );
3539
- };
3540
 
 
3541
 
3542
- /**
3543
- * turn elements into Outlayer.Items to be used in layout
3544
- * @param {Array or NodeList or HTMLElement} elems
3545
- * @returns {Array} items - collection of new Outlayer Items
3546
- */
3547
- proto._itemize = function( elems ) {
3548
 
3549
- var itemElems = this._filterFindItemElements( elems );
3550
- var Item = this.constructor.Item;
3551
 
3552
- // create new Outlayer Items for collection
3553
- var items = [];
3554
- for ( var i=0; i < itemElems.length; i++ ) {
3555
- var elem = itemElems[i];
3556
- var item = new Item( elem, this );
3557
- items.push( item );
3558
- }
3559
 
3560
- return items;
3561
- };
3562
 
3563
- /**
3564
- * get item elements to be used in layout
3565
- * @param {Array or NodeList or HTMLElement} elems
3566
- * @returns {Array} items - item elements
3567
- */
3568
- proto._filterFindItemElements = function( elems ) {
3569
- return utils.filterFindElements( elems, this.options.itemSelector );
3570
- };
3571
 
3572
- /**
3573
- * getter method for getting item elements
3574
- * @returns {Array} elems - collection of item elements
3575
- */
3576
- proto.getItemElements = function() {
3577
- return this.items.map( function( item ) {
3578
- return item.element;
3579
- });
3580
- };
3581
 
3582
- // ----- init & layout ----- //
 
 
 
 
 
 
 
 
 
 
 
 
3583
 
3584
- /**
3585
- * lays out all items
3586
- */
3587
- proto.layout = function() {
3588
- this._resetLayout();
3589
- this._manageStamps();
3590
 
3591
- // don't animate first layout
3592
- var layoutInstant = this._getOption('layoutInstant');
3593
- var isInstant = layoutInstant !== undefined ?
3594
- layoutInstant : !this._isLayoutInited;
3595
- this.layoutItems( this.items, isInstant );
3596
 
3597
- // flag for initalized
3598
- this._isLayoutInited = true;
3599
- };
3600
 
3601
- // _init is alias for layout
3602
- proto._init = proto.layout;
3603
 
3604
- /**
3605
- * logic before any new layout
3606
- */
3607
- proto._resetLayout = function() {
3608
- this.getSize();
3609
- };
3610
 
 
3611
 
3612
- proto.getSize = function() {
3613
- this.size = getSize( this.element );
3614
- };
3615
 
3616
- /**
3617
- * get measurement from option, for columnWidth, rowHeight, gutter
3618
- * if option is String -> get element from selector string, & get size of element
3619
- * if option is Element -> get size of element
3620
- * else use option as a number
3621
- *
3622
- * @param {String} measurement
3623
- * @param {String} size - width or height
3624
- * @private
3625
- */
3626
- proto._getMeasurement = function( measurement, size ) {
3627
- var option = this.options[ measurement ];
3628
- var elem;
3629
- if ( !option ) {
3630
- // default to 0
3631
- this[ measurement ] = 0;
3632
- } else {
3633
- // use option as an element
3634
- if ( typeof option == 'string' ) {
3635
- elem = this.element.querySelector( option );
3636
- } else if ( option instanceof HTMLElement ) {
3637
- elem = option;
3638
- }
3639
- // use size of element, if element
3640
- this[ measurement ] = elem ? getSize( elem )[ size ] : option;
3641
- }
3642
- };
3643
 
3644
- /**
3645
- * layout a collection of item elements
3646
- * @api public
3647
- */
3648
- proto.layoutItems = function( items, isInstant ) {
3649
- items = this._getItemsForLayout( items );
3650
 
3651
- this._layoutItems( items, isInstant );
 
 
3652
 
3653
- this._postLayout();
3654
- };
3655
 
3656
- /**
3657
- * get the items to be laid out
3658
- * you may want to skip over some items
3659
- * @param {Array} items
3660
- * @returns {Array} items
3661
- */
3662
- proto._getItemsForLayout = function( items ) {
3663
- return items.filter( function( item ) {
3664
- return !item.isIgnored;
3665
- });
3666
- };
3667
 
3668
- /**
3669
- * layout items
3670
- * @param {Array} items
3671
- * @param {Boolean} isInstant
3672
- */
3673
- proto._layoutItems = function( items, isInstant ) {
3674
- this._emitCompleteOnItems( 'layout', items );
3675
 
3676
- if ( !items || !items.length ) {
3677
- // no items, emit event with empty array
3678
- return;
3679
- }
3680
 
3681
- var queue = [];
 
 
 
 
 
 
 
 
3682
 
3683
- items.forEach( function( item ) {
3684
- // get x/y object from method
3685
- var position = this._getItemLayoutPosition( item );
3686
- // enqueue
3687
- position.item = item;
3688
- position.isInstant = isInstant || item.isLayoutInstant;
3689
- queue.push( position );
3690
- }, this );
3691
 
3692
- this._processLayoutQueue( queue );
3693
- };
3694
 
3695
- /**
3696
- * get item layout position
3697
- * @param {Outlayer.Item} item
3698
- * @returns {Object} x and y position
3699
- */
3700
- proto._getItemLayoutPosition = function( /* item */ ) {
3701
- return {
3702
- x: 0,
3703
- y: 0
3704
- };
3705
- };
3706
 
3707
- /**
3708
- * iterate over array and position each item
3709
- * Reason being - separating this logic prevents 'layout invalidation'
3710
- * thx @paul_irish
3711
- * @param {Array} queue
3712
- */
3713
- proto._processLayoutQueue = function( queue ) {
3714
- this.updateStagger();
3715
- queue.forEach( function( obj, i ) {
3716
- this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );
3717
- }, this );
3718
- };
 
 
 
 
 
 
 
 
 
 
 
 
3719
 
3720
- // set stagger from option in milliseconds number
3721
- proto.updateStagger = function() {
3722
- var stagger = this.options.stagger;
3723
- if ( stagger === null || stagger === undefined ) {
3724
- this.stagger = 0;
3725
- return;
3726
- }
3727
- this.stagger = getMilliseconds( stagger );
3728
- return this.stagger;
3729
- };
3730
 
3731
- /**
3732
- * Sets position of item in DOM
3733
- * @param {Outlayer.Item} item
3734
- * @param {Number} x - horizontal position
3735
- * @param {Number} y - vertical position
3736
- * @param {Boolean} isInstant - disables transitions
3737
- */
3738
- proto._positionItem = function( item, x, y, isInstant, i ) {
3739
- if ( isInstant ) {
3740
- // if not transition, just set CSS
3741
- item.goTo( x, y );
3742
- } else {
3743
- item.stagger( i * this.stagger );
3744
- item.moveTo( x, y );
3745
- }
3746
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3747
 
3748
- /**
3749
- * Any logic you want to do after each layout,
3750
- * i.e. size the container
3751
- */
3752
- proto._postLayout = function() {
3753
- this.resizeContainer();
3754
- };
3755
 
3756
- proto.resizeContainer = function() {
3757
- var isResizingContainer = this._getOption('resizeContainer');
3758
- if ( !isResizingContainer ) {
3759
- return;
3760
- }
3761
- var size = this._getContainerSize();
3762
- if ( size ) {
3763
- this._setContainerMeasure( size.width, true );
3764
- this._setContainerMeasure( size.height, false );
3765
- }
3766
- };
3767
 
3768
- /**
3769
- * Sets width or height of container if returned
3770
- * @returns {Object} size
3771
- * @param {Number} width
3772
- * @param {Number} height
3773
- */
3774
- proto._getContainerSize = noop;
3775
 
3776
- /**
3777
- * @param {Number} measure - size of width or height
3778
- * @param {Boolean} isWidth
3779
- */
3780
- proto._setContainerMeasure = function( measure, isWidth ) {
3781
- if ( measure === undefined ) {
3782
- return;
3783
- }
3784
 
3785
- var elemSize = this.size;
3786
- // add padding and border width if border box
3787
- if ( elemSize.isBorderBox ) {
3788
- measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
3789
- elemSize.borderLeftWidth + elemSize.borderRightWidth :
3790
- elemSize.paddingBottom + elemSize.paddingTop +
3791
- elemSize.borderTopWidth + elemSize.borderBottomWidth;
3792
- }
3793
 
3794
- measure = Math.max( measure, 0 );
3795
- this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';
3796
- };
3797
 
3798
- /**
3799
- * emit eventComplete on a collection of items events
3800
- * @param {String} eventName
3801
- * @param {Array} items - Outlayer.Items
3802
- */
3803
- proto._emitCompleteOnItems = function( eventName, items ) {
3804
- var _this = this;
3805
- function onComplete() {
3806
- _this.dispatchEvent( eventName + 'Complete', null, [ items ] );
3807
- }
3808
 
3809
- var count = items.length;
3810
- if ( !items || !count ) {
3811
- onComplete();
3812
- return;
3813
- }
3814
 
3815
- var doneCount = 0;
3816
- function tick() {
3817
- doneCount++;
3818
- if ( doneCount == count ) {
3819
- onComplete();
 
 
 
 
 
 
 
 
 
3820
  }
3821
- }
3822
 
3823
- // bind callback
3824
- items.forEach( function( item ) {
3825
- item.once( eventName, tick );
3826
- });
3827
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3828
 
3829
- /**
3830
- * emits events via EvEmitter and jQuery events
3831
- * @param {String} type - name of event
3832
- * @param {Event} event - original event
3833
- * @param {Array} args - extra arguments
3834
- */
3835
- proto.dispatchEvent = function( type, event, args ) {
3836
- // add original event to arguments
3837
- var emitArgs = event ? [ event ].concat( args ) : args;
3838
- this.emitEvent( type, emitArgs );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3839
 
3840
- if ( jQuery ) {
3841
- // set this.$element
3842
- this.$element = this.$element || jQuery( this.element );
3843
- if ( event ) {
3844
- // create jQuery event
3845
- var $event = jQuery.Event( event );
3846
- $event.type = type;
3847
- this.$element.trigger( $event, args );
3848
- } else {
3849
- // just trigger with type if no event available
3850
- this.$element.trigger( type, args );
3851
  }
3852
- }
3853
- };
3854
 
3855
- // -------------------------- ignore & stamps -------------------------- //
 
 
 
 
 
 
3856
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3857
 
3858
- /**
3859
- * keep item in collection, but do not lay it out
3860
- * ignored items do not get skipped in layout
3861
- * @param {Element} elem
3862
- */
3863
- proto.ignore = function( elem ) {
3864
- var item = this.getItem( elem );
3865
- if ( item ) {
3866
- item.isIgnored = true;
3867
- }
3868
- };
3869
 
3870
- /**
3871
- * return item to layout collection
3872
- * @param {Element} elem
3873
- */
3874
- proto.unignore = function( elem ) {
3875
- var item = this.getItem( elem );
3876
- if ( item ) {
3877
- delete item.isIgnored;
3878
- }
3879
- };
3880
 
3881
- /**
3882
- * adds elements to stamps
3883
- * @param {NodeList, Array, Element, or String} elems
3884
- */
3885
- proto.stamp = function( elems ) {
3886
- elems = this._find( elems );
3887
- if ( !elems ) {
3888
- return;
3889
  }
3890
 
3891
- this.stamps = this.stamps.concat( elems );
3892
- // ignore
3893
- elems.forEach( this.ignore, this );
3894
- };
3895
 
3896
- /**
3897
- * removes elements to stamps
3898
- * @param {NodeList, Array, or Element} elems
3899
- */
3900
- proto.unstamp = function( elems ) {
3901
- elems = this._find( elems );
3902
- if ( !elems ){
3903
- return;
3904
- }
3905
 
3906
- elems.forEach( function( elem ) {
3907
- // filter out removed stamp elements
3908
- utils.removeFrom( this.stamps, elem );
3909
- this.unignore( elem );
3910
- }, this );
3911
- };
3912
 
3913
- /**
3914
- * finds child elements
3915
- * @param {NodeList, Array, Element, or String} elems
3916
- * @returns {Array} elems
3917
- */
3918
- proto._find = function( elems ) {
3919
- if ( !elems ) {
3920
- return;
3921
- }
3922
- // if string, use argument as selector string
3923
- if ( typeof elems == 'string' ) {
3924
- elems = this.element.querySelectorAll( elems );
3925
- }
3926
- elems = utils.makeArray( elems );
3927
- return elems;
3928
- };
3929
 
3930
- proto._manageStamps = function() {
3931
- if ( !this.stamps || !this.stamps.length ) {
3932
- return;
3933
- }
3934
 
3935
- this._getBoundingRect();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3936
 
3937
- this.stamps.forEach( this._manageStamp, this );
3938
- };
3939
 
3940
- // update boundingLeft / Top
3941
- proto._getBoundingRect = function() {
3942
- // get bounding rect for container element
3943
- var boundingRect = this.element.getBoundingClientRect();
3944
- var size = this.size;
3945
- this._boundingRect = {
3946
- left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
3947
- top: boundingRect.top + size.paddingTop + size.borderTopWidth,
3948
- right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),
3949
- bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )
3950
- };
3951
- };
3952
 
3953
- /**
3954
- * @param {Element} stamp
3955
- **/
3956
- proto._manageStamp = noop;
3957
 
3958
- /**
3959
- * get x/y position of element relative to container element
3960
- * @param {Element} elem
3961
- * @returns {Object} offset - has left, top, right, bottom
3962
- */
3963
- proto._getElementOffset = function( elem ) {
3964
- var boundingRect = elem.getBoundingClientRect();
3965
- var thisRect = this._boundingRect;
3966
- var size = getSize( elem );
3967
- var offset = {
3968
- left: boundingRect.left - thisRect.left - size.marginLeft,
3969
- top: boundingRect.top - thisRect.top - size.marginTop,
3970
- right: thisRect.right - boundingRect.right - size.marginRight,
3971
- bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
3972
- };
3973
- return offset;
3974
- };
 
 
 
 
 
 
 
 
 
 
3975
 
3976
- // -------------------------- resize -------------------------- //
3977
 
3978
- // enable event handlers for listeners
3979
- // i.e. resize -> onresize
3980
- proto.handleEvent = utils.handleEvent;
3981
 
3982
- /**
3983
- * Bind layout to window resizing
3984
- */
3985
- proto.bindResize = function() {
3986
- window.addEventListener( 'resize', this );
3987
- this.isResizeBound = true;
3988
- };
3989
 
3990
- /**
3991
- * Unbind layout to window resizing
3992
- */
3993
- proto.unbindResize = function() {
3994
- window.removeEventListener( 'resize', this );
3995
- this.isResizeBound = false;
3996
- };
3997
 
3998
- proto.onresize = function() {
3999
- this.resize();
4000
- };
4001
 
4002
- utils.debounceMethod( Outlayer, 'onresize', 100 );
4003
 
4004
- proto.resize = function() {
4005
- // don't trigger if size did not change
4006
- // or if resize was unbound. See #9
4007
- if ( !this.isResizeBound || !this.needsResizeLayout() ) {
4008
- return;
 
 
 
 
 
 
 
 
 
 
4009
  }
4010
 
4011
- this.layout();
4012
- };
 
 
 
4013
 
4014
- /**
4015
- * check if layout is needed post layout
4016
- * @returns Boolean
4017
- */
4018
- proto.needsResizeLayout = function() {
4019
- var size = getSize( this.element );
4020
- // check that this.size and size are there
4021
- // IE8 triggers resize on body size change, so they might not be
4022
- var hasSizes = this.size && size;
4023
- return hasSizes && size.innerWidth !== this.size.innerWidth;
4024
- };
4025
 
4026
- // -------------------------- methods -------------------------- //
 
4027
 
4028
- /**
4029
- * add items to Outlayer instance
4030
- * @param {Array or NodeList or Element} elems
4031
- * @returns {Array} items - Outlayer.Items
4032
- **/
4033
- proto.addItems = function( elems ) {
4034
- var items = this._itemize( elems );
4035
- // add items to collection
4036
- if ( items.length ) {
4037
- this.items = this.items.concat( items );
4038
- }
4039
- return items;
4040
- };
4041
 
4042
- /**
4043
- * Layout newly-appended item elements
4044
- * @param {Array or NodeList or Element} elems
4045
- */
4046
- proto.appended = function( elems ) {
4047
- var items = this.addItems( elems );
4048
- if ( !items.length ) {
4049
- return;
4050
- }
4051
- // layout and reveal just the new items
4052
- this.layoutItems( items, true );
4053
- this.reveal( items );
4054
- };
4055
 
4056
- /**
4057
- * Layout prepended elements
4058
- * @param {Array or NodeList or Element} elems
4059
- */
4060
- proto.prepended = function( elems ) {
4061
- var items = this._itemize( elems );
4062
- if ( !items.length ) {
4063
- return;
4064
- }
4065
- // add items to beginning of collection
4066
- var previousItems = this.items.slice(0);
4067
- this.items = items.concat( previousItems );
4068
- // start new layout
4069
- this._resetLayout();
4070
- this._manageStamps();
4071
- // layout new stuff without transition
4072
- this.layoutItems( items, true );
4073
- this.reveal( items );
4074
- // layout previous items
4075
- this.layoutItems( previousItems );
4076
- };
4077
 
4078
- /**
4079
- * reveal a collection of items
4080
- * @param {Array of Outlayer.Items} items
4081
- */
4082
- proto.reveal = function( items ) {
4083
- this._emitCompleteOnItems( 'reveal', items );
4084
- if ( !items || !items.length ) {
4085
- return;
4086
- }
4087
- var stagger = this.updateStagger();
4088
- items.forEach( function( item, i ) {
4089
- item.stagger( i * stagger );
4090
- item.reveal();
4091
- });
4092
- };
4093
 
4094
- /**
4095
- * hide a collection of items
4096
- * @param {Array of Outlayer.Items} items
4097
- */
4098
- proto.hide = function( items ) {
4099
- this._emitCompleteOnItems( 'hide', items );
4100
- if ( !items || !items.length ) {
4101
- return;
4102
- }
4103
- var stagger = this.updateStagger();
4104
- items.forEach( function( item, i ) {
4105
- item.stagger( i * stagger );
4106
- item.hide();
4107
- });
4108
- };
4109
 
4110
- /**
4111
- * reveal item elements
4112
- * @param {Array}, {Element}, {NodeList} items
4113
- */
4114
- proto.revealItemElements = function( elems ) {
4115
- var items = this.getItems( elems );
4116
- this.reveal( items );
4117
- };
4118
 
4119
- /**
4120
- * hide item elements
4121
- * @param {Array}, {Element}, {NodeList} items
4122
- */
4123
- proto.hideItemElements = function( elems ) {
4124
- var items = this.getItems( elems );
4125
- this.hide( items );
4126
- };
4127
 
4128
- /**
4129
- * get Outlayer.Item, given an Element
4130
- * @param {Element} elem
4131
- * @param {Function} callback
4132
- * @returns {Outlayer.Item} item
4133
- */
4134
- proto.getItem = function( elem ) {
4135
- // loop through items to get the one that matches
4136
- for ( var i=0; i < this.items.length; i++ ) {
4137
- var item = this.items[i];
4138
- if ( item.element == elem ) {
4139
- // return item
4140
- return item;
4141
- }
4142
- }
4143
- };
4144
 
4145
- /**
4146
- * get collection of Outlayer.Items, given Elements
4147
- * @param {Array} elems
4148
- * @returns {Array} items - Outlayer.Items
4149
- */
4150
- proto.getItems = function( elems ) {
4151
- elems = utils.makeArray( elems );
4152
- var items = [];
4153
- elems.forEach( function( elem ) {
4154
- var item = this.getItem( elem );
4155
- if ( item ) {
4156
- items.push( item );
4157
- }
4158
- }, this );
4159
 
4160
- return items;
4161
- };
 
 
 
 
 
4162
 
4163
- /**
4164
- * remove element(s) from instance and DOM
4165
- * @param {Array or NodeList or Element} elems
4166
- */
4167
- proto.remove = function( elems ) {
4168
- var removeItems = this.getItems( elems );
4169
 
4170
- this._emitCompleteOnItems( 'remove', removeItems );
4171
 
4172
- // bail if no items to remove
4173
- if ( !removeItems || !removeItems.length ) {
4174
- return;
4175
- }
4176
 
4177
- removeItems.forEach( function( item ) {
4178
- item.remove();
4179
- // remove item from collection
4180
- utils.removeFrom( this.items, item );
4181
- }, this );
4182
- };
4183
 
4184
- // ----- destroy ----- //
4185
 
4186
- // remove and disable Outlayer instance
4187
- proto.destroy = function() {
4188
- // clean up dynamic styles
4189
- var style = this.element.style;
4190
- style.height = '';
4191
- style.position = '';
4192
- style.width = '';
4193
- // destroy items
4194
- this.items.forEach( function( item ) {
4195
- item.destroy();
4196
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4197
 
4198
- this.unbindResize();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4199
 
4200
- var id = this.element.outlayerGUID;
4201
- delete instances[ id ]; // remove reference to instance by id
4202
- delete this.element.outlayerGUID;
4203
- // remove data for jQuery
4204
- if ( jQuery ) {
4205
- jQuery.removeData( this.element, this.constructor.namespace );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4206
  }
4207
 
4208
- };
 
 
 
 
 
 
 
 
4209
 
4210
- // -------------------------- data -------------------------- //
 
 
 
 
 
 
 
 
4211
 
4212
- /**
4213
- * get Outlayer instance from element
4214
- * @param {Element} elem
4215
- * @returns {Outlayer}
4216
- */
4217
- Outlayer.data = function( elem ) {
4218
- elem = utils.getQueryElement( elem );
4219
- var id = elem && elem.outlayerGUID;
4220
- return id && instances[ id ];
4221
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4222
 
 
4223
 
4224
- // -------------------------- create Outlayer class -------------------------- //
4225
 
4226
- /**
4227
- * create a layout class
4228
- * @param {String} namespace
4229
- */
4230
- Outlayer.create = function( namespace, options ) {
4231
- // sub-class Outlayer
4232
- var Layout = subclass( Outlayer );
4233
- // apply new options and compatOptions
4234
- Layout.defaults = utils.extend( {}, Outlayer.defaults );
4235
- utils.extend( Layout.defaults, options );
4236
- Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );
4237
 
4238
- Layout.namespace = namespace;
4239
 
4240
- Layout.data = Outlayer.data;
4241
 
4242
- // sub-class Item
4243
- Layout.Item = subclass( Item );
4244
 
4245
- // -------------------------- declarative -------------------------- //
4246
 
4247
- utils.htmlInit( Layout, namespace );
4248
 
4249
- // -------------------------- jQuery bridge -------------------------- //
4250
 
4251
- // make into jQuery plugin
4252
- if ( jQuery && jQuery.bridget ) {
4253
- jQuery.bridget( namespace, Layout );
4254
- }
4255
 
4256
- return Layout;
4257
- };
4258
 
4259
- function subclass( Parent ) {
4260
- function SubClass() {
4261
- Parent.apply( this, arguments );
4262
- }
4263
 
4264
- SubClass.prototype = Object.create( Parent.prototype );
4265
- SubClass.prototype.constructor = SubClass;
4266
 
4267
- return SubClass;
4268
- }
 
 
4269
 
4270
- // ----- helpers ----- //
4271
 
4272
- // how many milliseconds are in each unit
4273
- var msUnits = {
4274
- ms: 1,
4275
- s: 1000
4276
- };
 
 
 
4277
 
4278
- // munge time-like parameter into millisecond number
4279
- // '0.4s' -> 40
4280
- function getMilliseconds( time ) {
4281
- if ( typeof time == 'number' ) {
4282
- return time;
4283
- }
4284
- var matches = time.match( /(^\d*\.?\d*)(\w*)/ );
4285
- var num = matches && matches[1];
4286
- var unit = matches && matches[2];
4287
- if ( !num.length ) {
4288
- return 0;
4289
- }
4290
- num = parseFloat( num );
4291
- var mult = msUnits[ unit ] || 1;
4292
- return num * mult;
4293
- }
4294
 
4295
- // ----- fin ----- //
4296
 
4297
- // back in global
4298
- Outlayer.Item = Item;
 
 
4299
 
4300
- return Outlayer;
 
4301
 
4302
- }));
 
 
4303
 
4304
- /**
4305
- * Isotope Item
4306
- **/
4307
 
4308
- ( function( window, factory ) {
4309
- // universal module definition
4310
- /* jshint strict: false */ /*globals define, module, require */
4311
- if ( typeof define == 'function' && define.amd ) {
4312
- // AMD
4313
- define( 'isotope-layout/js/item',[
4314
- 'outlayer/outlayer'
4315
- ],
4316
- factory );
4317
- } else if ( typeof module == 'object' && module.exports ) {
4318
- // CommonJS
4319
- module.exports = factory(
4320
- require('outlayer')
4321
- );
4322
- } else {
4323
- // browser global
4324
- window.Isotope = window.Isotope || {};
4325
- window.Isotope.Item = factory(
4326
- window.Outlayer
4327
- );
4328
- }
4329
 
4330
- }( window, function factory( Outlayer ) {
4331
- 'use strict';
4332
 
4333
- // -------------------------- Item -------------------------- //
 
 
 
4334
 
4335
- // sub-class Outlayer Item
4336
- function Item() {
4337
- Outlayer.Item.apply( this, arguments );
4338
- }
4339
 
4340
- var proto = Item.prototype = Object.create( Outlayer.Item.prototype );
4341
 
4342
- var _create = proto._create;
4343
- proto._create = function() {
4344
- // assign id, used for original-order sorting
4345
- this.id = this.layout.itemGUID++;
4346
- _create.call( this );
4347
- this.sortData = {};
4348
- };
 
4349
 
4350
- proto.updateSortData = function() {
4351
- if ( this.isIgnored ) {
4352
- return;
4353
- }
4354
- // default sorters
4355
- this.sortData.id = this.id;
4356
- // for backward compatibility
4357
- this.sortData['original-order'] = this.id;
4358
- this.sortData.random = Math.random();
4359
- // go thru getSortData obj and apply the sorters
4360
- var getSortData = this.layout.options.getSortData;
4361
- var sorters = this.layout._sorters;
4362
- for ( var key in getSortData ) {
4363
- var sorter = sorters[ key ];
4364
- this.sortData[ key ] = sorter( this.element, this );
4365
- }
4366
- };
4367
 
4368
- var _destroy = proto.destroy;
4369
- proto.destroy = function() {
4370
- // call super
4371
- _destroy.apply( this, arguments );
4372
- // reset display, #741
4373
- this.css({
4374
- display: ''
4375
- });
4376
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4377
 
4378
- return Item;
 
 
4379
 
4380
- }));
4381
 
4382
- /**
4383
- * Isotope LayoutMode
4384
- */
 
 
4385
 
4386
- ( function( window, factory ) {
4387
- // universal module definition
4388
- /* jshint strict: false */ /*globals define, module, require */
4389
- if ( typeof define == 'function' && define.amd ) {
4390
- // AMD
4391
- define( 'isotope-layout/js/layout-mode',[
4392
- 'get-size/get-size',
4393
- 'outlayer/outlayer'
4394
- ],
4395
- factory );
4396
- } else if ( typeof module == 'object' && module.exports ) {
4397
- // CommonJS
4398
- module.exports = factory(
4399
- require('get-size'),
4400
- require('outlayer')
4401
- );
4402
- } else {
4403
- // browser global
4404
- window.Isotope = window.Isotope || {};
4405
- window.Isotope.LayoutMode = factory(
4406
- window.getSize,
4407
- window.Outlayer
4408
- );
4409
- }
4410
 
4411
- }( window, function factory( getSize, Outlayer ) {
4412
- 'use strict';
4413
 
4414
- // layout mode class
4415
- function LayoutMode( isotope ) {
4416
- this.isotope = isotope;
4417
- // link properties
4418
- if ( isotope ) {
4419
- this.options = isotope.options[ this.namespace ];
4420
- this.element = isotope.element;
4421
- this.items = isotope.filteredItems;
4422
- this.size = isotope.size;
 
 
 
 
 
 
 
 
4423
  }
4424
- }
4425
 
4426
- var proto = LayoutMode.prototype;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4427
 
4428
- /**
4429
- * some methods should just defer to default Outlayer method
4430
- * and reference the Isotope instance as `this`
4431
- **/
4432
- var facadeMethods = [
4433
- '_resetLayout',
4434
- '_getItemLayoutPosition',
4435
- '_manageStamp',
4436
- '_getContainerSize',
4437
- '_getElementOffset',
4438
- 'needsResizeLayout',
4439
- '_getOption'
4440
- ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4441
 
4442
- facadeMethods.forEach( function( methodName ) {
4443
- proto[ methodName ] = function() {
4444
- return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );
4445
- };
4446
- });
4447
 
4448
- // ----- ----- //
4449
 
4450
- // for horizontal layout modes, check vertical size
4451
- proto.needsVerticalResizeLayout = function() {
4452
- // don't trigger if size did not change
4453
- var size = getSize( this.isotope.element );
4454
- // check that this.size and size are there
4455
- // IE8 triggers resize on body size change, so they might not be
4456
- var hasSizes = this.isotope.size && size;
4457
- return hasSizes && size.innerHeight != this.isotope.size.innerHeight;
4458
- };
4459
 
4460
- // ----- measurements ----- //
4461
 
4462
- proto._getMeasurement = function() {
4463
- this.isotope._getMeasurement.apply( this, arguments );
4464
- };
 
 
4465
 
4466
- proto.getColumnWidth = function() {
4467
- this.getSegmentSize( 'column', 'Width' );
4468
- };
4469
 
4470
- proto.getRowHeight = function() {
4471
- this.getSegmentSize( 'row', 'Height' );
4472
- };
4473
 
4474
- /**
4475
- * get columnWidth or rowHeight
4476
- * segment: 'column' or 'row'
4477
- * size 'Width' or 'Height'
4478
- **/
4479
- proto.getSegmentSize = function( segment, size ) {
4480
- var segmentName = segment + size;
4481
- var outerSize = 'outer' + size;
4482
- // columnWidth / outerWidth // rowHeight / outerHeight
4483
- this._getMeasurement( segmentName, outerSize );
4484
- // got rowHeight or columnWidth, we can chill
4485
- if ( this[ segmentName ] ) {
4486
- return;
4487
- }
4488
- // fall back to item of first element
4489
- var firstItemSize = this.getFirstItemSize();
4490
- this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||
4491
- // or size of container
4492
- this.isotope.size[ 'inner' + size ];
4493
- };
 
 
 
 
 
 
 
 
4494
 
4495
- proto.getFirstItemSize = function() {
4496
- var firstItem = this.isotope.filteredItems[0];
4497
- return firstItem && firstItem.element && getSize( firstItem.element );
4498
- };
4499
 
4500
- // ----- methods that should reference isotope ----- //
4501
 
4502
- proto.layout = function() {
4503
- this.isotope.layout.apply( this.isotope, arguments );
4504
- };
4505
 
4506
- proto.getSize = function() {
4507
- this.isotope.getSize();
4508
- this.size = this.isotope.size;
4509
- };
4510
 
4511
- // -------------------------- create -------------------------- //
 
 
 
 
 
 
4512
 
4513
- LayoutMode.modes = {};
 
 
4514
 
4515
- LayoutMode.create = function( namespace, options ) {
4516
 
4517
- function Mode() {
4518
- LayoutMode.apply( this, arguments );
4519
- }
4520
 
4521
- Mode.prototype = Object.create( proto );
4522
- Mode.prototype.constructor = Mode;
 
 
4523
 
4524
- // default options
4525
- if ( options ) {
4526
- Mode.options = options;
4527
- }
4528
 
4529
- Mode.prototype.namespace = namespace;
4530
- // register in Isotope
4531
- LayoutMode.modes[ namespace ] = Mode;
4532
 
4533
- return Mode;
4534
- };
4535
 
4536
- return LayoutMode;
 
4537
 
4538
- }));
4539
 
4540
- /*!
4541
- * Masonry v4.2.1
4542
- * Cascading grid layout library
4543
- * https://masonry.desandro.com
4544
- * MIT License
4545
- * by David DeSandro
4546
- */
4547
 
4548
- ( function( window, factory ) {
4549
- // universal module definition
4550
- /* jshint strict: false */ /*globals define, module, require */
4551
- if ( typeof define == 'function' && define.amd ) {
4552
- // AMD
4553
- define( 'masonry-layout/masonry',[
4554
- 'outlayer/outlayer',
4555
- 'get-size/get-size'
4556
- ],
4557
- factory );
4558
- } else if ( typeof module == 'object' && module.exports ) {
4559
- // CommonJS
4560
- module.exports = factory(
4561
- require('outlayer'),
4562
- require('get-size')
4563
- );
4564
- } else {
4565
- // browser global
4566
- window.Masonry = factory(
4567
- window.Outlayer,
4568
- window.getSize
4569
- );
4570
- }
4571
 
4572
- }( window, function factory( Outlayer, getSize ) {
 
 
 
4573
 
 
4574
 
 
 
4575
 
4576
- // -------------------------- masonryDefinition -------------------------- //
 
 
 
4577
 
4578
- // create an Outlayer layout class
4579
- var Masonry = Outlayer.create('masonry');
4580
- // isFitWidth -> fitWidth
4581
- Masonry.compatOptions.fitWidth = 'isFitWidth';
4582
 
4583
- var proto = Masonry.prototype;
4584
 
4585
- proto._resetLayout = function() {
4586
- this.getSize();
4587
- this._getMeasurement( 'columnWidth', 'outerWidth' );
4588
- this._getMeasurement( 'gutter', 'outerWidth' );
4589
- this.measureColumns();
4590
 
4591
- // reset column Y
4592
- this.colYs = [];
4593
- for ( var i=0; i < this.cols; i++ ) {
4594
- this.colYs.push( 0 );
4595
- }
4596
 
4597
- this.maxY = 0;
4598
- this.horizontalColIndex = 0;
4599
- };
 
4600
 
4601
- proto.measureColumns = function() {
4602
- this.getContainerWidth();
4603
- // if columnWidth is 0, default to outerWidth of first item
4604
- if ( !this.columnWidth ) {
4605
- var firstItem = this.items[0];
4606
- var firstItemElem = firstItem && firstItem.element;
4607
- // columnWidth fall back to item of first element
4608
- this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||
4609
- // if first elem has no width, default to size of container
4610
- this.containerWidth;
4611
- }
4612
 
4613
- var columnWidth = this.columnWidth += this.gutter;
 
 
4614
 
4615
- // calculate columns
4616
- var containerWidth = this.containerWidth + this.gutter;
4617
- var cols = containerWidth / columnWidth;
4618
- // fix rounding errors, typically with gutters
4619
- var excess = columnWidth - containerWidth % columnWidth;
4620
- // if overshoot is less than a pixel, round up, otherwise floor it
4621
- var mathMethod = excess && excess < 1 ? 'round' : 'floor';
4622
- cols = Math[ mathMethod ]( cols );
4623
- this.cols = Math.max( cols, 1 );
4624
- };
4625
 
4626
- proto.getContainerWidth = function() {
4627
- // container is parent if fit width
4628
- var isFitWidth = this._getOption('fitWidth');
4629
- var container = isFitWidth ? this.element.parentNode : this.element;
4630
- // check that this.size and size are there
4631
- // IE8 triggers resize on body size change, so they might not be
4632
- var size = getSize( container );
4633
- this.containerWidth = size && size.innerWidth;
4634
- };
4635
 
4636
- proto._getItemLayoutPosition = function( item ) {
4637
- item.getSize();
4638
- // how many columns does this brick span
4639
- var remainder = item.size.outerWidth % this.columnWidth;
4640
- var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
4641
- // round if off by 1 pixel, otherwise use ceil
4642
- var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );
4643
- colSpan = Math.min( colSpan, this.cols );
4644
- // use horizontal or top column position
4645
- var colPosMethod = this.options.horizontalOrder ?
4646
- '_getHorizontalColPosition' : '_getTopColPosition';
4647
- var colPosition = this[ colPosMethod ]( colSpan, item );
4648
- // position the brick
4649
- var position = {
4650
- x: this.columnWidth * colPosition.col,
4651
- y: colPosition.y
4652
- };
4653
- // apply setHeight to necessary columns
4654
- var setHeight = colPosition.y + item.size.outerHeight;
4655
- var setMax = colSpan + colPosition.col;
4656
- for ( var i = colPosition.col; i < setMax; i++ ) {
4657
- this.colYs[i] = setHeight;
4658
- }
4659
 
4660
- return position;
4661
- };
 
4662
 
4663
- proto._getTopColPosition = function( colSpan ) {
4664
- var colGroup = this._getTopColGroup( colSpan );
4665
- // get the minimum Y value from the columns
4666
- var minimumY = Math.min.apply( Math, colGroup );
4667
 
4668
- return {
4669
- col: colGroup.indexOf( minimumY ),
4670
- y: minimumY,
4671
- };
4672
- };
4673
 
4674
- /**
4675
- * @param {Number} colSpan - number of columns the element spans
4676
- * @returns {Array} colGroup
4677
- */
4678
- proto._getTopColGroup = function( colSpan ) {
4679
- if ( colSpan < 2 ) {
4680
- // if brick spans only one column, use all the column Ys
4681
- return this.colYs;
4682
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4683
 
4684
- var colGroup = [];
4685
- // how many different places could this brick fit horizontally
4686
- var groupCount = this.cols + 1 - colSpan;
4687
- // for each group potential horizontal position
4688
- for ( var i = 0; i < groupCount; i++ ) {
4689
- colGroup[i] = this._getColGroupY( i, colSpan );
4690
- }
4691
- return colGroup;
4692
- };
4693
 
4694
- proto._getColGroupY = function( col, colSpan ) {
4695
- if ( colSpan < 2 ) {
4696
- return this.colYs[ col ];
4697
- }
4698
- // make an array of colY values for that one group
4699
- var groupColYs = this.colYs.slice( col, col + colSpan );
4700
- // and get the max value of the array
4701
- return Math.max.apply( Math, groupColYs );
4702
- };
4703
 
4704
- // get column position based on horizontal index. #873
4705
- proto._getHorizontalColPosition = function( colSpan, item ) {
4706
- var col = this.horizontalColIndex % this.cols;
4707
- var isOver = colSpan > 1 && col + colSpan > this.cols;
4708
- // shift to next row if item can't fit on current row
4709
- col = isOver ? 0 : col;
4710
- // don't let zero-size items take up space
4711
- var hasSize = item.size.outerWidth && item.size.outerHeight;
4712
- this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;
4713
 
4714
- return {
4715
- col: col,
4716
- y: this._getColGroupY( col, colSpan ),
4717
- };
4718
- };
4719
 
4720
- proto._manageStamp = function( stamp ) {
4721
- var stampSize = getSize( stamp );
4722
- var offset = this._getElementOffset( stamp );
4723
- // get the columns that this stamp affects
4724
- var isOriginLeft = this._getOption('originLeft');
4725
- var firstX = isOriginLeft ? offset.left : offset.right;
4726
- var lastX = firstX + stampSize.outerWidth;
4727
- var firstCol = Math.floor( firstX / this.columnWidth );
4728
- firstCol = Math.max( 0, firstCol );
4729
- var lastCol = Math.floor( lastX / this.columnWidth );
4730
- // lastCol should not go over if multiple of columnWidth #425
4731
- lastCol -= lastX % this.columnWidth ? 0 : 1;
4732
- lastCol = Math.min( this.cols - 1, lastCol );
4733
- // set colYs to bottom of the stamp
4734
 
4735
- var isOriginTop = this._getOption('originTop');
4736
- var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +
4737
- stampSize.outerHeight;
4738
- for ( var i = firstCol; i <= lastCol; i++ ) {
4739
- this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );
4740
- }
4741
- };
4742
 
4743
- proto._getContainerSize = function() {
4744
- this.maxY = Math.max.apply( Math, this.colYs );
4745
- var size = {
4746
- height: this.maxY
4747
- };
 
4748
 
4749
- if ( this._getOption('fitWidth') ) {
4750
- size.width = this._getContainerFitWidth();
4751
- }
4752
 
4753
- return size;
4754
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4755
 
4756
- proto._getContainerFitWidth = function() {
4757
- var unusedCols = 0;
4758
- // count unused columns
4759
- var i = this.cols;
4760
- while ( --i ) {
4761
- if ( this.colYs[i] !== 0 ) {
4762
- break;
4763
- }
4764
- unusedCols++;
4765
- }
4766
- // fit container to columns that have been used
4767
- return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;
4768
- };
4769
 
4770
- proto.needsResizeLayout = function() {
4771
- var previousWidth = this.containerWidth;
4772
- this.getContainerWidth();
4773
- return previousWidth != this.containerWidth;
4774
- };
4775
 
4776
- return Masonry;
 
 
 
4777
 
4778
- }));
 
 
 
 
 
 
 
4779
 
4780
- /*!
4781
- * Masonry layout mode
4782
- * sub-classes Masonry
4783
- * https://masonry.desandro.com
4784
- */
4785
 
4786
- ( function( window, factory ) {
4787
- // universal module definition
4788
- /* jshint strict: false */ /*globals define, module, require */
4789
- if ( typeof define == 'function' && define.amd ) {
4790
- // AMD
4791
- define( 'isotope-layout/js/layout-modes/masonry',[
4792
- '../layout-mode',
4793
- 'masonry-layout/masonry'
4794
- ],
4795
- factory );
4796
- } else if ( typeof module == 'object' && module.exports ) {
4797
- // CommonJS
4798
- module.exports = factory(
4799
- require('../layout-mode'),
4800
- require('masonry-layout')
4801
- );
4802
- } else {
4803
- // browser global
4804
- factory(
4805
- window.Isotope.LayoutMode,
4806
- window.Masonry
4807
- );
4808
- }
4809
 
4810
- }( window, function factory( LayoutMode, Masonry ) {
4811
- 'use strict';
4812
 
4813
- // -------------------------- masonryDefinition -------------------------- //
 
 
 
 
4814
 
4815
- // create an Outlayer layout class
4816
- var MasonryMode = LayoutMode.create('masonry');
4817
 
4818
- var proto = MasonryMode.prototype;
4819
 
4820
- var keepModeMethods = {
4821
- _getElementOffset: true,
4822
- layout: true,
4823
- _getMeasurement: true
4824
- };
4825
 
4826
- // inherit Masonry prototype
4827
- for ( var method in Masonry.prototype ) {
4828
- // do not inherit mode methods
4829
- if ( !keepModeMethods[ method ] ) {
4830
- proto[ method ] = Masonry.prototype[ method ];
4831
- }
4832
- }
4833
 
4834
- var measureColumns = proto.measureColumns;
4835
- proto.measureColumns = function() {
4836
- // set items, used if measuring first item
4837
- this.items = this.isotope.filteredItems;
4838
- measureColumns.call( this );
4839
- };
4840
 
4841
- // point to mode options for fitWidth
4842
- var _getOption = proto._getOption;
4843
- proto._getOption = function( option ) {
4844
- if ( option == 'fitWidth' ) {
4845
- return this.options.isFitWidth !== undefined ?
4846
- this.options.isFitWidth : this.options.fitWidth;
4847
- }
4848
- return _getOption.apply( this.isotope, arguments );
4849
- };
4850
 
4851
- return MasonryMode;
 
 
4852
 
4853
- }));
 
 
4854
 
4855
- /**
4856
- * fitRows layout mode
4857
- */
4858
 
4859
- ( function( window, factory ) {
4860
- // universal module definition
4861
- /* jshint strict: false */ /*globals define, module, require */
4862
- if ( typeof define == 'function' && define.amd ) {
4863
- // AMD
4864
- define( 'isotope-layout/js/layout-modes/fit-rows',[
4865
- '../layout-mode'
4866
- ],
4867
- factory );
4868
- } else if ( typeof exports == 'object' ) {
4869
- // CommonJS
4870
- module.exports = factory(
4871
- require('../layout-mode')
4872
- );
4873
- } else {
4874
- // browser global
4875
- factory(
4876
- window.Isotope.LayoutMode
4877
- );
4878
- }
4879
 
4880
- }( window, function factory( LayoutMode ) {
4881
- 'use strict';
 
4882
 
4883
- var FitRows = LayoutMode.create('fitRows');
 
 
 
4884
 
4885
- var proto = FitRows.prototype;
 
4886
 
4887
- proto._resetLayout = function() {
4888
- this.x = 0;
4889
- this.y = 0;
4890
- this.maxY = 0;
4891
- this._getMeasurement( 'gutter', 'outerWidth' );
4892
- };
4893
 
4894
- proto._getItemLayoutPosition = function( item ) {
4895
- item.getSize();
4896
 
4897
- var itemWidth = item.size.outerWidth + this.gutter;
4898
- // if this element cannot fit in the current row
4899
- var containerWidth = this.isotope.size.innerWidth + this.gutter;
4900
- if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {
4901
- this.x = 0;
4902
- this.y = this.maxY;
4903
- }
4904
 
4905
- var position = {
4906
- x: this.x,
4907
- y: this.y
4908
- };
4909
 
4910
- this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );
4911
- this.x += itemWidth;
4912
 
4913
- return position;
4914
- };
4915
 
4916
- proto._getContainerSize = function() {
4917
- return { height: this.maxY };
4918
- };
4919
 
4920
- return FitRows;
 
 
4921
 
4922
- }));
 
 
 
 
4923
 
4924
- /**
4925
- * vertical layout mode
4926
- */
 
 
4927
 
4928
- ( function( window, factory ) {
4929
- // universal module definition
4930
- /* jshint strict: false */ /*globals define, module, require */
4931
- if ( typeof define == 'function' && define.amd ) {
4932
- // AMD
4933
- define( 'isotope-layout/js/layout-modes/vertical',[
4934
- '../layout-mode'
4935
- ],
4936
- factory );
4937
- } else if ( typeof module == 'object' && module.exports ) {
4938
- // CommonJS
4939
- module.exports = factory(
4940
- require('../layout-mode')
4941
- );
4942
- } else {
4943
- // browser global
4944
- factory(
4945
- window.Isotope.LayoutMode
4946
- );
4947
- }
4948
 
4949
- }( window, function factory( LayoutMode ) {
4950
- 'use strict';
 
4951
 
4952
- var Vertical = LayoutMode.create( 'vertical', {
4953
- horizontalAlignment: 0
4954
- });
4955
 
4956
- var proto = Vertical.prototype;
4957
 
4958
- proto._resetLayout = function() {
4959
- this.y = 0;
4960
- };
4961
 
4962
- proto._getItemLayoutPosition = function( item ) {
4963
- item.getSize();
4964
- var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *
4965
- this.options.horizontalAlignment;
4966
- var y = this.y;
4967
- this.y += item.size.outerHeight;
4968
- return { x: x, y: y };
4969
- };
4970
 
4971
- proto._getContainerSize = function() {
4972
- return { height: this.y };
4973
- };
 
 
 
 
 
 
 
4974
 
4975
- return Vertical;
 
 
 
 
 
 
 
4976
 
4977
- }));
4978
 
4979
- /*!
4980
- * Isotope v3.0.6
4981
- *
4982
- * Licensed GPLv3 for open source use
4983
- * or Isotope Commercial License for commercial use
4984
- *
4985
- * https://isotope.metafizzy.co
4986
- * Copyright 2010-2018 Metafizzy
4987
- */
4988
 
4989
- ( function( window, factory ) {
4990
- // universal module definition
4991
- /* jshint strict: false */ /*globals define, module, require */
4992
- if ( typeof define == 'function' && define.amd ) {
4993
- // AMD
4994
- define( [
4995
- 'outlayer/outlayer',
4996
- 'get-size/get-size',
4997
- 'desandro-matches-selector/matches-selector',
4998
- 'fizzy-ui-utils/utils',
4999
- 'isotope-layout/js/item',
5000
- 'isotope-layout/js/layout-mode',
5001
- // include default layout modes
5002
- 'isotope-layout/js/layout-modes/masonry',
5003
- 'isotope-layout/js/layout-modes/fit-rows',
5004
- 'isotope-layout/js/layout-modes/vertical'
5005
- ],
5006
- function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {
5007
- return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );
5008
- });
5009
- } else if ( typeof module == 'object' && module.exports ) {
5010
- // CommonJS
5011
- module.exports = factory(
5012
- window,
5013
- require('outlayer'),
5014
- require('get-size'),
5015
- require('desandro-matches-selector'),
5016
- require('fizzy-ui-utils'),
5017
- require('isotope-layout/js/item'),
5018
- require('isotope-layout/js/layout-mode'),
5019
- // include default layout modes
5020
- require('isotope-layout/js/layout-modes/masonry'),
5021
- require('isotope-layout/js/layout-modes/fit-rows'),
5022
- require('isotope-layout/js/layout-modes/vertical')
5023
- );
5024
- } else {
5025
- // browser global
5026
- window.Isotope = factory(
5027
- window,
5028
- window.Outlayer,
5029
- window.getSize,
5030
- window.matchesSelector,
5031
- window.fizzyUIUtils,
5032
- window.Isotope.Item,
5033
- window.Isotope.LayoutMode
5034
- );
5035
- }
5036
 
5037
- }( window, function factory( window, Outlayer, getSize, matchesSelector, utils,
5038
- Item, LayoutMode ) {
 
5039
 
 
 
 
5040
 
 
 
 
 
5041
 
5042
- // -------------------------- vars -------------------------- //
 
5043
 
5044
- var jQuery = window.jQuery;
 
 
 
5045
 
5046
- // -------------------------- helpers -------------------------- //
 
5047
 
5048
- var trim = String.prototype.trim ?
5049
- function( str ) {
5050
- return str.trim();
5051
- } :
5052
- function( str ) {
5053
- return str.replace( /^\s+|\s+$/g, '' );
5054
- };
5055
 
5056
- // -------------------------- isotopeDefinition -------------------------- //
 
5057
 
5058
- // create an Outlayer layout class
5059
- var Isotope = Outlayer.create( 'isotope', {
5060
- layoutMode: 'masonry',
5061
- isJQueryFiltering: true,
5062
- sortAscending: true
5063
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5064
 
5065
- Isotope.Item = Item;
5066
- Isotope.LayoutMode = LayoutMode;
5067
 
5068
- var proto = Isotope.prototype;
 
 
 
 
 
 
 
5069
 
5070
- proto._create = function() {
5071
- this.itemGUID = 0;
5072
- // functions that sort items
5073
- this._sorters = {};
5074
- this._getSorters();
5075
- // call super
5076
- Outlayer.prototype._create.call( this );
5077
 
5078
- // create layout modes
5079
- this.modes = {};
5080
- // start filteredItems with all items
5081
- this.filteredItems = this.items;
5082
- // keep of track of sortBys
5083
- this.sortHistory = [ 'original-order' ];
5084
- // create from registered layout modes
5085
- for ( var name in LayoutMode.modes ) {
5086
- this._initLayoutMode( name );
5087
- }
5088
- };
5089
 
5090
- proto.reloadItems = function() {
5091
- // reset item ID counter
5092
- this.itemGUID = 0;
5093
- // call super
5094
- Outlayer.prototype.reloadItems.call( this );
5095
- };
5096
 
5097
- proto._itemize = function() {
5098
- var items = Outlayer.prototype._itemize.apply( this, arguments );
5099
- // assign ID for original-order
5100
- for ( var i=0; i < items.length; i++ ) {
5101
- var item = items[i];
5102
- item.id = this.itemGUID++;
5103
- }
5104
- this._updateItemsSortData( items );
5105
- return items;
5106
- };
5107
 
 
 
 
5108
 
5109
- // -------------------------- layout -------------------------- //
 
 
5110
 
5111
- proto._initLayoutMode = function( name ) {
5112
- var Mode = LayoutMode.modes[ name ];
5113
- // set mode options
5114
- // HACK extend initial options, back-fill in default options
5115
- var initialOpts = this.options[ name ] || {};
5116
- this.options[ name ] = Mode.options ?
5117
- utils.extend( Mode.options, initialOpts ) : initialOpts;
5118
- // init layout mode instance
5119
- this.modes[ name ] = new Mode( this );
5120
- };
5121
 
 
5122
 
5123
- proto.layout = function() {
5124
- // if first time doing layout, do all magic
5125
- if ( !this._isLayoutInited && this._getOption('initLayout') ) {
5126
- this.arrange();
5127
- return;
5128
- }
5129
- this._layout();
5130
- };
5131
 
5132
- // private method to be used in layout() & magic()
5133
- proto._layout = function() {
5134
- // don't animate first layout
5135
- var isInstant = this._getIsInstant();
5136
- // layout flow
5137
- this._resetLayout();
5138
- this._manageStamps();
5139
- this.layoutItems( this.filteredItems, isInstant );
5140
 
5141
- // flag for initalized
5142
- this._isLayoutInited = true;
5143
- };
5144
 
5145
- // filter + sort + layout
5146
- proto.arrange = function( opts ) {
5147
- // set any options pass
5148
- this.option( opts );
5149
- this._getIsInstant();
5150
- // filter, sort, and layout
5151
 
5152
- // filter
5153
- var filtered = this._filter( this.items );
5154
- this.filteredItems = filtered.matches;
 
5155
 
5156
- this._bindArrangeComplete();
 
 
 
 
 
5157
 
5158
- if ( this._isInstant ) {
5159
- this._noTransition( this._hideReveal, [ filtered ] );
5160
- } else {
5161
- this._hideReveal( filtered );
5162
- }
5163
 
5164
- this._sort();
5165
- this._layout();
5166
- };
5167
- // alias to _init for main plugin method
5168
- proto._init = proto.arrange;
5169
 
5170
- proto._hideReveal = function( filtered ) {
5171
- this.reveal( filtered.needReveal );
5172
- this.hide( filtered.needHide );
5173
- };
5174
 
5175
- // HACK
5176
- // Don't animate/transition first layout
5177
- // Or don't animate/transition other layouts
5178
- proto._getIsInstant = function() {
5179
- var isLayoutInstant = this._getOption('layoutInstant');
5180
- var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :
5181
- !this._isLayoutInited;
5182
- this._isInstant = isInstant;
5183
- return isInstant;
5184
- };
5185
 
5186
- // listen for layoutComplete, hideComplete and revealComplete
5187
- // to trigger arrangeComplete
5188
- proto._bindArrangeComplete = function() {
5189
- // listen for 3 events to trigger arrangeComplete
5190
- var isLayoutComplete, isHideComplete, isRevealComplete;
5191
- var _this = this;
5192
- function arrangeParallelCallback() {
5193
- if ( isLayoutComplete && isHideComplete && isRevealComplete ) {
5194
- _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );
5195
  }
5196
- }
5197
- this.once( 'layoutComplete', function() {
5198
- isLayoutComplete = true;
5199
- arrangeParallelCallback();
5200
- });
5201
- this.once( 'hideComplete', function() {
5202
- isHideComplete = true;
5203
- arrangeParallelCallback();
5204
- });
5205
- this.once( 'revealComplete', function() {
5206
- isRevealComplete = true;
5207
- arrangeParallelCallback();
5208
- });
5209
- };
5210
 
5211
- // -------------------------- filter -------------------------- //
 
5212
 
5213
- proto._filter = function( items ) {
5214
- var filter = this.options.filter;
5215
- filter = filter || '*';
5216
- var matches = [];
5217
- var hiddenMatched = [];
5218
- var visibleUnmatched = [];
5219
 
5220
- var test = this._getFilterTest( filter );
 
 
5221
 
5222
- // test each item
5223
- for ( var i=0; i < items.length; i++ ) {
5224
- var item = items[i];
5225
- if ( item.isIgnored ) {
5226
- continue;
5227
  }
5228
- // add item to either matched or unmatched group
5229
- var isMatched = test( item );
5230
- // item.isFilterMatched = isMatched;
5231
- // add to matches if its a match
5232
- if ( isMatched ) {
5233
- matches.push( item );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5234
  }
5235
- // add to additional group if item needs to be hidden or revealed
5236
- if ( isMatched && item.isHidden ) {
5237
- hiddenMatched.push( item );
5238
- } else if ( !isMatched && !item.isHidden ) {
5239
- visibleUnmatched.push( item );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5240
  }
5241
- }
 
 
 
 
5242
 
5243
- // return collections of items to be manipulated
5244
- return {
5245
- matches: matches,
5246
- needReveal: hiddenMatched,
5247
- needHide: visibleUnmatched
5248
- };
5249
- };
5250
 
5251
- // get a jQuery, function, or a matchesSelector test given the filter
5252
- proto._getFilterTest = function( filter ) {
5253
- if ( jQuery && this.options.isJQueryFiltering ) {
5254
- // use jQuery
5255
- return function( item ) {
5256
- return jQuery( item.element ).is( filter );
5257
- };
5258
- }
5259
- if ( typeof filter == 'function' ) {
5260
- // use filter as function
5261
- return function( item ) {
5262
- return filter( item.element );
5263
- };
5264
- }
5265
- // default, use filter as selector string
5266
- return function( item ) {
5267
- return matchesSelector( item.element, filter );
5268
- };
5269
- };
5270
 
5271
- // -------------------------- sorting -------------------------- //
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5272
 
5273
- /**
5274
- * @params {Array} elems
5275
- * @public
5276
- */
5277
- proto.updateSortData = function( elems ) {
5278
- // get items
5279
- var items;
5280
- if ( elems ) {
5281
- elems = utils.makeArray( elems );
5282
- items = this.getItems( elems );
5283
- } else {
5284
- // update all items if no elems provided
5285
- items = this.items;
5286
- }
5287
 
5288
- this._getSorters();
5289
- this._updateItemsSortData( items );
5290
- };
5291
 
5292
- proto._getSorters = function() {
5293
- var getSortData = this.options.getSortData;
5294
- for ( var key in getSortData ) {
5295
- var sorter = getSortData[ key ];
5296
- this._sorters[ key ] = mungeSorter( sorter );
5297
- }
5298
- };
5299
 
5300
- /**
5301
- * @params {Array} items - of Isotope.Items
5302
- * @private
5303
- */
5304
- proto._updateItemsSortData = function( items ) {
5305
- // do not update if no items
5306
- var len = items && items.length;
5307
 
5308
- for ( var i=0; len && i < len; i++ ) {
5309
- var item = items[i];
5310
- item.updateSortData();
5311
- }
5312
- };
5313
 
5314
- // ----- munge sorter ----- //
 
5315
 
5316
- // encapsulate this, as we just need mungeSorter
5317
- // other functions in here are just for munging
5318
- var mungeSorter = ( function() {
5319
- // add a magic layer to sorters for convienent shorthands
5320
- // `.foo-bar` will use the text of .foo-bar querySelector
5321
- // `[foo-bar]` will use attribute
5322
- // you can also add parser
5323
- // `.foo-bar parseInt` will parse that as a number
5324
- function mungeSorter( sorter ) {
5325
- // if not a string, return function or whatever it is
5326
- if ( typeof sorter != 'string' ) {
5327
- return sorter;
5328
  }
5329
- // parse the sorter string
5330
- var args = trim( sorter ).split(' ');
5331
- var query = args[0];
5332
- // check if query looks like [an-attribute]
5333
- var attrMatch = query.match( /^\[(.+)\]$/ );
5334
- var attr = attrMatch && attrMatch[1];
5335
- var getValue = getValueGetter( attr, query );
5336
- // use second argument as a parser
5337
- var parser = Isotope.sortDataParsers[ args[1] ];
5338
- // parse the value, if there was a parser
5339
- sorter = parser ? function( elem ) {
5340
- return elem && parser( getValue( elem ) );
5341
- } :
5342
- // otherwise just return value
5343
- function( elem ) {
5344
- return elem && getValue( elem );
5345
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5346
 
5347
- return sorter;
5348
- }
 
 
5349
 
5350
- // get an attribute getter, or get text of the querySelector
5351
- function getValueGetter( attr, query ) {
5352
- // if query looks like [foo-bar], get attribute
5353
- if ( attr ) {
5354
- return function getAttribute( elem ) {
5355
- return elem.getAttribute( attr );
5356
- };
 
 
 
 
 
 
5357
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5358
 
5359
- // otherwise, assume its a querySelector, and get its text
5360
- return function getChildText( elem ) {
5361
- var child = elem.querySelector( query );
5362
- return child && child.textContent;
5363
  };
5364
- }
 
 
5365
 
5366
- return mungeSorter;
5367
- })();
5368
 
5369
- // parsers used in getSortData shortcut strings
5370
- Isotope.sortDataParsers = {
5371
- 'parseInt': function( val ) {
5372
- return parseInt( val, 10 );
5373
- },
5374
- 'parseFloat': function( val ) {
5375
- return parseFloat( val );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5376
  }
5377
- };
5378
 
5379
- // ----- sort method ----- //
 
 
5380
 
5381
- // sort filteredItem order
5382
- proto._sort = function() {
5383
- if ( !this.options.sortBy ) {
5384
- return;
 
 
 
 
5385
  }
5386
- // keep track of sortBy History
5387
- var sortBys = utils.makeArray( this.options.sortBy );
5388
- if ( !this._getIsSameSortBy( sortBys ) ) {
5389
- // concat all sortBy and sortHistory, add to front, oldest goes in last
5390
- this.sortHistory = sortBys.concat( this.sortHistory );
5391
  }
5392
- // sort magic
5393
- var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );
5394
- this.filteredItems.sort( itemSorter );
5395
- };
5396
 
5397
- // check if sortBys is same as start of sortHistory
5398
- proto._getIsSameSortBy = function( sortBys ) {
5399
- for ( var i=0; i < sortBys.length; i++ ) {
5400
- if ( sortBys[i] != this.sortHistory[i] ) {
5401
- return false;
 
 
 
 
 
 
 
 
 
 
 
 
5402
  }
5403
- }
5404
- return true;
5405
- };
 
5406
 
5407
- // returns a function used for sorting
5408
- function getItemSorter( sortBys, sortAsc ) {
5409
- return function sorter( itemA, itemB ) {
5410
- // cycle through all sortKeys
5411
- for ( var i = 0; i < sortBys.length; i++ ) {
5412
- var sortBy = sortBys[i];
5413
- var a = itemA.sortData[ sortBy ];
5414
- var b = itemB.sortData[ sortBy ];
5415
- if ( a > b || a < b ) {
5416
- // if sortAsc is an object, use the value given the sortBy key
5417
- var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;
5418
- var direction = isAscending ? 1 : -1;
5419
- return ( a > b ? 1 : -1 ) * direction;
5420
- }
 
5421
  }
5422
- return 0;
5423
- };
5424
- }
5425
 
5426
- // -------------------------- methods -------------------------- //
5427
 
5428
- // get layout mode
5429
- proto._mode = function() {
5430
- var layoutMode = this.options.layoutMode;
5431
- var mode = this.modes[ layoutMode ];
5432
- if ( !mode ) {
5433
- // TODO console.error
5434
- throw new Error( 'No layout mode: ' + layoutMode );
5435
- }
5436
- // HACK sync mode's options
5437
- // any options set after init for layout mode need to be synced
5438
- mode.options = this.options[ layoutMode ];
5439
- return mode;
5440
- };
5441
 
5442
- proto._resetLayout = function() {
5443
- // trigger original reset layout
5444
- Outlayer.prototype._resetLayout.call( this );
5445
- this._mode()._resetLayout();
5446
- };
5447
 
5448
- proto._getItemLayoutPosition = function( item ) {
5449
- return this._mode()._getItemLayoutPosition( item );
5450
- };
 
 
 
5451
 
5452
- proto._manageStamp = function( stamp ) {
5453
- this._mode()._manageStamp( stamp );
5454
- };
 
5455
 
5456
- proto._getContainerSize = function() {
5457
- return this._mode()._getContainerSize();
5458
- };
5459
 
5460
- proto.needsResizeLayout = function() {
5461
- return this._mode().needsResizeLayout();
5462
- };
5463
 
5464
- // -------------------------- adding & removing -------------------------- //
5465
 
5466
- // HEADS UP overwrites default Outlayer appended
5467
- proto.appended = function( elems ) {
5468
- var items = this.addItems( elems );
5469
- if ( !items.length ) {
5470
- return;
5471
- }
5472
- // filter, layout, reveal new items
5473
- var filteredItems = this._filterRevealAdded( items );
5474
- // add to filteredItems
5475
- this.filteredItems = this.filteredItems.concat( filteredItems );
5476
- };
5477
 
5478
- // HEADS UP overwrites default Outlayer prepended
5479
- proto.prepended = function( elems ) {
5480
- var items = this._itemize( elems );
5481
- if ( !items.length ) {
5482
- return;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5483
  }
5484
- // start new layout
5485
- this._resetLayout();
5486
- this._manageStamps();
5487
- // filter, layout, reveal new items
5488
- var filteredItems = this._filterRevealAdded( items );
5489
- // layout previous items
5490
- this.layoutItems( this.filteredItems );
5491
- // add to items and filteredItems
5492
- this.filteredItems = filteredItems.concat( this.filteredItems );
5493
- this.items = items.concat( this.items );
5494
  };
5495
 
5496
- proto._filterRevealAdded = function( items ) {
5497
- var filtered = this._filter( items );
5498
- this.hide( filtered.needHide );
5499
- // reveal all new items
5500
- this.reveal( filtered.matches );
5501
- // layout new items, no transition
5502
- this.layoutItems( filtered.matches, true );
5503
- return filtered.matches;
5504
- };
5505
 
5506
- /**
5507
- * Filter, sort, and layout newly-appended item elements
5508
- * @param {Array or NodeList or Element} elems
5509
- */
5510
- proto.insert = function( elems ) {
5511
- var items = this.addItems( elems );
5512
- if ( !items.length ) {
5513
- return;
5514
- }
5515
- // append item elements
5516
- var i, item;
5517
- var len = items.length;
5518
- for ( i=0; i < len; i++ ) {
5519
- item = items[i];
5520
- this.element.appendChild( item.element );
5521
- }
5522
- // filter new stuff
5523
- var filteredInsertItems = this._filter( items ).matches;
5524
- // set flag
5525
- for ( i=0; i < len; i++ ) {
5526
- items[i].isLayoutInstant = true;
5527
- }
5528
- this.arrange();
5529
- // reset flag
5530
- for ( i=0; i < len; i++ ) {
5531
- delete items[i].isLayoutInstant;
5532
  }
5533
- this.reveal( filteredInsertItems );
5534
- };
5535
 
5536
- var _remove = proto.remove;
5537
- proto.remove = function( elems ) {
5538
- elems = utils.makeArray( elems );
5539
- var removeItems = this.getItems( elems );
5540
- // do regular thing
5541
- _remove.call( this, elems );
5542
- // bail if no items to remove
5543
- var len = removeItems && removeItems.length;
5544
- // remove elems from filteredItems
5545
- for ( var i=0; len && i < len; i++ ) {
5546
- var item = removeItems[i];
5547
- // remove item from collection
5548
- utils.removeFrom( this.filteredItems, item );
5549
  }
5550
- };
5551
 
5552
- proto.shuffle = function() {
5553
- // update random sortData
5554
- for ( var i=0; i < this.items.length; i++ ) {
5555
- var item = this.items[i];
5556
- item.sortData.random = Math.random();
5557
  }
5558
- this.options.sortBy = 'random';
5559
- this._sort();
5560
- this._layout();
5561
- };
5562
 
5563
- /**
5564
- * trigger fn without transition
5565
- * kind of hacky to have this in the first place
5566
- * @param {Function} fn
5567
- * @param {Array} args
5568
- * @returns ret
5569
- * @private
5570
- */
5571
- proto._noTransition = function( fn, args ) {
5572
- // save transitionDuration before disabling
5573
- var transitionDuration = this.options.transitionDuration;
5574
- // disable transition
5575
- this.options.transitionDuration = 0;
5576
- // do it
5577
- var returnValue = fn.apply( this, args );
5578
- // re-enable transition for reveal
5579
- this.options.transitionDuration = transitionDuration;
5580
- return returnValue;
5581
- };
5582
 
5583
- // ----- helper methods ----- //
 
 
5584
 
5585
- /**
5586
- * getter method for getting filtered item elements
5587
- * @returns {Array} elems - collection of item elements
5588
- */
5589
- proto.getFilteredItemElements = function() {
5590
- return this.filteredItems.map( function( item ) {
5591
- return item.element;
5592
- });
5593
- };
5594
 
5595
- // ----- ----- //
 
5596
 
5597
- return Isotope;
 
 
5598
 
5599
- }));
 
5600
 
 
 
 
 
 
5601
 
5602
- /*! Magnific Popup - v1.1.0 - 2016-02-20
5603
- * http://dimsemenov.com/plugins/magnific-popup/
5604
- * Copyright (c) 2016 Dmitry Semenov; */
5605
- ; (function (factory) {
5606
- if (typeof define === 'function' && define.amd) {
5607
- // AMD. Register as an anonymous module.
5608
- define(['jquery'], factory);
5609
- } else if (typeof exports === 'object') {
5610
- // Node/CommonJS
5611
- factory(require('jquery'));
5612
- } else {
5613
- // Browser globals
5614
- factory(window.jQuery || window.Zepto);
5615
- }
5616
- }(function ($) {
5617
 
5618
- /*>>core*/
5619
- /**
5620
- *
5621
- * Magnific Popup Core JS file
5622
- *
5623
- */
5624
 
5625
 
5626
- /**
5627
- * Private static constants
5628
- */
5629
- var CLOSE_EVENT = 'Close',
5630
- BEFORE_CLOSE_EVENT = 'BeforeClose',
5631
- AFTER_CLOSE_EVENT = 'AfterClose',
5632
- BEFORE_APPEND_EVENT = 'BeforeAppend',
5633
- MARKUP_PARSE_EVENT = 'MarkupParse',
5634
- OPEN_EVENT = 'Open',
5635
- CHANGE_EVENT = 'Change',
5636
- NS = 'mfp',
5637
- EVENT_NS = '.' + NS,
5638
- READY_CLASS = 'mfp-ready',
5639
- REMOVING_CLASS = 'mfp-removing',
5640
- PREVENT_CLOSE_CLASS = 'mfp-prevent-close';
5641
 
 
 
 
 
 
 
5642
 
5643
- /**
5644
- * Private vars
5645
- */
5646
- /*jshint -W079 */
5647
- var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this'
5648
- MagnificPopup = function () { },
5649
- _isJQ = !!(window.jQuery),
5650
- _prevStatus,
5651
- _window = $(window),
5652
- _document,
5653
- _prevContentType,
5654
- _wrapClasses,
5655
- _currPopupType;
5656
 
 
 
5657
 
5658
- /**
5659
- * Private functions
5660
- */
5661
- var _mfpOn = function (name, f) {
5662
- mfp.ev.on(NS + name + EVENT_NS, f);
5663
  },
5664
- _getEl = function (className, appendTo, html, raw) {
5665
- var el = document.createElement('div');
5666
- el.className = 'mfp-' + className;
5667
- if (html) {
5668
- el.innerHTML = html;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5669
  }
5670
- if (!raw) {
5671
- el = $(el);
5672
- if (appendTo) {
5673
- el.appendTo(appendTo);
5674
- }
5675
- } else if (appendTo) {
5676
- appendTo.appendChild(el);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5677
  }
5678
- return el;
5679
- },
5680
- _mfpTrigger = function (e, data) {
5681
- mfp.ev.triggerHandler(NS + e, data);
5682
 
5683
- if (mfp.st.callbacks) {
5684
- // converts "mfpEventName" to "eventName" callback and triggers it if it's present
5685
- e = e.charAt(0).toLowerCase() + e.slice(1);
5686
- if (mfp.st.callbacks[e]) {
5687
- mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5688
  }
5689
- }
5690
- },
5691
- _getCloseBtn = function (type) {
5692
- if (type !== _currPopupType || !mfp.currTemplate.closeBtn) {
5693
- mfp.currTemplate.closeBtn = $(mfp.st.closeMarkup.replace('%title%', mfp.st.tClose));
5694
- _currPopupType = type;
5695
- }
5696
- return mfp.currTemplate.closeBtn;
5697
- },
5698
- // Initialize Magnific Popup only when called at least once
5699
- _checkInstance = function () {
5700
- if (!$.magnificPopup.instance) {
5701
- /*jshint -W020 */
5702
- mfp = new MagnificPopup();
5703
- mfp.init();
5704
- $.magnificPopup.instance = mfp;
5705
- }
5706
- },
5707
- // CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr
5708
- supportsTransitions = function () {
5709
- var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist
5710
- v = ['ms', 'O', 'Moz', 'Webkit']; // 'v' for vendor
5711
 
5712
- if (s['transition'] !== undefined) {
5713
- return true;
5714
- }
5715
 
5716
- while (v.length) {
5717
- if (v.pop() + 'Transition' in s) {
5718
- return true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5719
  }
 
 
 
 
 
 
5720
  }
5721
 
5722
- return false;
5723
- };
 
 
 
 
 
 
5724
 
 
 
 
 
 
 
 
 
 
5725
 
5726
 
5727
- /**
5728
- * Public functions
5729
- */
5730
- MagnificPopup.prototype = {
5731
 
5732
- constructor: MagnificPopup,
 
5733
 
5734
- /**
5735
- * Initializes Magnific Popup plugin.
5736
- * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed
5737
- */
5738
- init: function () {
5739
- var appVersion = navigator.appVersion;
5740
- mfp.isLowIE = mfp.isIE8 = document.all && !document.addEventListener;
5741
- mfp.isAndroid = (/android/gi).test(appVersion);
5742
- mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion);
5743
- mfp.supportsTransition = supportsTransitions();
5744
 
5745
- // We disable fixed positioned lightbox on devices that don't handle it nicely.
5746
- // If you know a better way of detecting this - let me know.
5747
- mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent));
5748
- _document = $(document);
5749
 
5750
- mfp.popupsCache = {};
5751
- },
 
 
 
5752
 
5753
- /**
5754
- * Opens popup
5755
- * @param data [description]
5756
- */
5757
- open: function (data) {
5758
 
5759
- var i;
 
 
 
 
5760
 
5761
- if (data.isObj === false) {
5762
- // convert jQuery collection to array to avoid conflicts later
5763
- mfp.items = data.items.toArray();
 
 
 
 
 
 
5764
 
5765
- mfp.index = 0;
5766
- var items = data.items,
5767
- item;
5768
- for (i = 0; i < items.length; i++) {
5769
- item = items[i];
5770
- if (item.parsed) {
5771
- item = item.el[0];
5772
- }
5773
- if (item === data.el[0]) {
5774
- mfp.index = i;
5775
- break;
5776
- }
5777
- }
5778
- } else {
5779
- mfp.items = $.isArray(data.items) ? data.items : [data.items];
5780
- mfp.index = data.index || 0;
5781
- }
5782
 
5783
- // if popup is already opened - we just update the content
5784
- if (mfp.isOpen) {
5785
- mfp.updateItemHTML();
5786
- return;
5787
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5788
 
5789
- mfp.types = [];
5790
- _wrapClasses = '';
5791
- if (data.mainEl && data.mainEl.length) {
5792
- mfp.ev = data.mainEl.eq(0);
5793
- } else {
5794
- mfp.ev = _document;
5795
- }
5796
 
5797
- if (data.key) {
5798
- if (!mfp.popupsCache[data.key]) {
5799
- mfp.popupsCache[data.key] = {};
5800
- }
5801
- mfp.currTemplate = mfp.popupsCache[data.key];
5802
- } else {
5803
- mfp.currTemplate = {};
5804
- }
5805
 
 
 
 
 
5806
 
 
 
5807
 
5808
- mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data);
5809
- mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos;
 
 
 
5810
 
5811
- if (mfp.st.modal) {
5812
- mfp.st.closeOnContentClick = false;
5813
- mfp.st.closeOnBgClick = false;
5814
- mfp.st.showCloseBtn = false;
5815
- mfp.st.enableEscapeKey = false;
5816
- }
5817
 
5818
 
5819
- // Building markup
5820
- // main containers are created only once
5821
- if (!mfp.bgOverlay) {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5822
 
5823
- // Dark overlay
5824
- mfp.bgOverlay = _getEl('bg').on('click' + EVENT_NS, function () {
5825
- mfp.close();
5826
- });
5827
 
5828
- mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click' + EVENT_NS, function (e) {
5829
- if (mfp._checkIfClose(e.target)) {
5830
- mfp.close();
5831
- }
5832
- });
5833
 
5834
- mfp.container = _getEl('container', mfp.wrap);
5835
- }
5836
 
5837
- mfp.contentContainer = _getEl('content');
5838
- if (mfp.st.preloader) {
5839
- mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading);
5840
- }
5841
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5842
 
5843
- // Initializing modules
5844
- var modules = $.magnificPopup.modules;
5845
- for (i = 0; i < modules.length; i++) {
5846
- var n = modules[i];
5847
- n = n.charAt(0).toUpperCase() + n.slice(1);
5848
- mfp['init' + n].call(mfp);
5849
- }
5850
- _mfpTrigger('BeforeOpen');
5851
 
 
 
5852
 
5853
- if (mfp.st.showCloseBtn) {
5854
- // Close button
5855
- if (!mfp.st.closeBtnInside) {
5856
- mfp.wrap.append(_getCloseBtn());
5857
- } else {
5858
- _mfpOn(MARKUP_PARSE_EVENT, function (e, template, values, item) {
5859
- values.close_replaceWith = _getCloseBtn(item.type);
5860
- });
5861
- _wrapClasses += ' mfp-close-btn-in';
5862
- }
5863
- }
5864
 
5865
- if (mfp.st.alignTop) {
5866
- _wrapClasses += ' mfp-align-top';
5867
- }
 
5868
 
 
 
 
 
5869
 
5870
 
5871
- if (mfp.fixedContentPos) {
5872
- mfp.wrap.css({
5873
- overflow: mfp.st.overflowY,
5874
- overflowX: 'hidden',
5875
- overflowY: mfp.st.overflowY
5876
- });
5877
- } else {
5878
- mfp.wrap.css({
5879
- top: _window.scrollTop(),
5880
- position: 'absolute'
5881
- });
5882
- }
5883
- if (mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos)) {
5884
- mfp.bgOverlay.css({
5885
- height: _document.height(),
5886
- position: 'absolute'
5887
- });
5888
- }
5889
 
 
 
 
5890
 
 
5891
 
5892
- if (mfp.st.enableEscapeKey) {
5893
- // Close on ESC key
5894
- _document.on('keyup' + EVENT_NS, function (e) {
5895
- if (e.keyCode === 27) {
5896
- mfp.close();
5897
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5898
  });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5899
  }
5900
 
5901
- _window.on('resize' + EVENT_NS, function () {
5902
- mfp.updateSize();
5903
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5904
 
 
 
 
5905
 
5906
- if (!mfp.st.closeOnContentClick) {
5907
- _wrapClasses += ' mfp-auto-cursor';
 
 
 
5908
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
5909
 
5910
- if (_wrapClasses)
5911
- mfp.wrap.addClass(_wrapClasses);
 
 
5912
 
 
5913
 
5914
- // this triggers recalculation of layout, so we get it once to not to trigger twice
5915
- var windowHeight = mfp.wH = _window.height();
 
5916
 
5917
 
5918
- var windowStyles = {};
 
 
5919
 
5920
- if (mfp.fixedContentPos) {
5921
- if (mfp._hasScrollBar(windowHeight)) {
5922
- var s = mfp._getScrollbarSize();
5923
- if (s) {
5924
- windowStyles.marginRight = s;
5925
- }
5926
- }
5927
- }
5928
 
5929
- if (mfp.fixedContentPos) {
5930
- if (!mfp.isIE7) {
5931
- windowStyles.overflow = 'hidden';
5932
- } else {
5933
- // ie7 double-scroll bug
5934
- $('body, html').css('overflow', 'hidden');
5935
- }
5936
- }
5937
 
 
 
 
 
 
5938
 
5939
 
5940
- var classesToadd = mfp.st.mainClass;
5941
- if (mfp.isIE7) {
5942
- classesToadd += ' mfp-ie7';
5943
- }
5944
- if (classesToadd) {
5945
- mfp._addClassToMFP(classesToadd);
5946
  }
5947
 
5948
- // add content
5949
- mfp.updateItemHTML();
 
 
 
 
 
 
 
 
 
5950
 
5951
- _mfpTrigger('BuildControls');
 
 
 
 
5952
 
5953
- // remove scrollbar, add margin e.t.c
5954
- $('html').css(windowStyles);
5955
 
5956
- // add everything to DOM
5957
- mfp.bgOverlay.add(mfp.wrap).prependTo(mfp.st.prependTo || $(document.body));
 
 
 
5958
 
5959
- // Save last focused element
5960
- mfp._lastFocusedEl = document.activeElement;
 
 
 
5961
 
5962
- // Wait for next cycle to allow CSS transition
5963
- setTimeout(function () {
5964
 
5965
- if (mfp.content) {
5966
- mfp._addClassToMFP(READY_CLASS);
5967
- mfp._setFocus();
5968
- } else {
5969
- // if content is not defined (not loaded e.t.c) we add class only for BG
5970
- mfp.bgOverlay.addClass(READY_CLASS);
5971
- }
 
5972
 
5973
- // Trap the focus in popup
5974
- _document.on('focusin' + EVENT_NS, mfp._onFocusIn);
 
 
 
 
 
5975
 
5976
- }, 16);
5977
 
5978
- mfp.isOpen = true;
5979
- mfp.updateSize(windowHeight);
5980
- _mfpTrigger(OPEN_EVENT);
5981
 
5982
- return data;
5983
- },
 
 
 
5984
 
5985
- /**
5986
- * Closes the popup
5987
- */
5988
- close: function () {
5989
- if (!mfp.isOpen) return;
5990
- _mfpTrigger(BEFORE_CLOSE_EVENT);
5991
 
5992
- mfp.isOpen = false;
5993
- // for CSS3 animation
5994
- if (mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition) {
5995
- mfp._addClassToMFP(REMOVING_CLASS);
5996
- setTimeout(function () {
5997
- mfp._close();
5998
- }, mfp.st.removalDelay);
5999
- } else {
6000
- mfp._close();
6001
- }
6002
- },
6003
 
6004
- /**
6005
- * Helper for close() function
6006
- */
6007
- _close: function () {
6008
- _mfpTrigger(CLOSE_EVENT);
6009
 
6010
- var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' ';
 
6011
 
6012
- mfp.bgOverlay.detach();
6013
- mfp.wrap.detach();
6014
- mfp.container.empty();
6015
 
6016
- if (mfp.st.mainClass) {
6017
- classesToRemove += mfp.st.mainClass + ' ';
6018
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
6019
 
6020
- mfp._removeClassFromMFP(classesToRemove);
6021
 
6022
- if (mfp.fixedContentPos) {
6023
- var windowStyles = { marginRight: '' };
6024
- if (mfp.isIE7) {
6025
- $('body, html').css('overflow', '');
6026
- } else {
6027
- windowStyles.overflow = '';
6028
- }
6029
- $('html').css(windowStyles);
6030
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6031
 
6032
- _document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS);
6033
- mfp.ev.off(EVENT_NS);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6034
 
6035
- // clean up DOM elements that aren't removed
6036
- mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style');
6037
- mfp.bgOverlay.attr('class', 'mfp-bg');
6038
- mfp.container.attr('class', 'mfp-container');
6039
 
6040
- // remove close button from target element
6041
- if (mfp.st.showCloseBtn &&
6042
- (!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) {
6043
- if (mfp.currTemplate.closeBtn)
6044
- mfp.currTemplate.closeBtn.detach();
6045
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6046
 
6047
 
6048
- if (mfp.st.autoFocusLast && mfp._lastFocusedEl) {
6049
- $(mfp._lastFocusedEl).focus(); // put tab focus back
6050
- }
6051
- mfp.currItem = null;
6052
- mfp.content = null;
6053
- mfp.currTemplate = null;
6054
- mfp.prevHeight = 0;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6055
 
6056
- _mfpTrigger(AFTER_CLOSE_EVENT);
6057
- },
 
 
6058
 
6059
- updateSize: function (winHeight) {
 
 
 
6060
 
6061
- if (mfp.isIOS) {
6062
- // fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2
6063
- var zoomLevel = document.documentElement.clientWidth / window.innerWidth;
6064
- var height = window.innerHeight * zoomLevel;
6065
- mfp.wrap.css('height', height);
6066
- mfp.wH = height;
6067
- } else {
6068
- mfp.wH = winHeight || _window.height();
6069
- }
6070
- // Fixes #84: popup incorrectly positioned with position:relative on body
6071
- if (!mfp.fixedContentPos) {
6072
- mfp.wrap.css('height', mfp.wH);
6073
- }
6074
 
6075
- _mfpTrigger('Resize');
 
 
 
6076
 
6077
- },
6078
 
6079
- /**
6080
- * Set content of popup based on current index
6081
- */
6082
- updateItemHTML: function () {
6083
- var item = mfp.items[mfp.index];
6084
 
6085
- // Detach and perform modifications
6086
- mfp.contentContainer.detach();
6087
 
6088
- if (mfp.content)
6089
- mfp.content.detach();
6090
 
6091
- if (!item.parsed) {
6092
- item = mfp.parseEl(mfp.index);
6093
- }
6094
 
6095
- var type = item.type;
 
 
 
6096
 
6097
- _mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]);
6098
- // BeforeChange event works like so:
6099
- // _mfpOn('BeforeChange', function(e, prevType, newType) { });
6100
 
6101
- mfp.currItem = item;
 
 
6102
 
6103
- if (!mfp.currTemplate[type]) {
6104
- var markup = mfp.st[type] ? mfp.st[type].markup : false;
6105
 
6106
- // allows to modify markup
6107
- _mfpTrigger('FirstMarkupParse', markup);
6108
 
6109
- if (markup) {
6110
- mfp.currTemplate[type] = $(markup);
6111
- } else {
6112
- // if there is no markup found we just define that template is parsed
6113
- mfp.currTemplate[type] = true;
6114
- }
6115
- }
 
6116
 
6117
- if (_prevContentType && _prevContentType !== item.type) {
6118
- mfp.container.removeClass('mfp-' + _prevContentType + '-holder');
6119
- }
6120
 
6121
- var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);
6122
- mfp.appendContent(newContent, type);
 
 
6123
 
6124
- item.preloaded = true;
 
 
 
6125
 
6126
- _mfpTrigger(CHANGE_EVENT, item);
6127
- _prevContentType = item.type;
 
 
 
 
 
 
 
6128
 
6129
- // Append container back after its content changed
6130
- mfp.container.prepend(mfp.contentContainer);
 
6131
 
6132
- _mfpTrigger('AfterChange');
6133
- },
6134
 
 
6135
 
6136
- /**
6137
- * Set HTML content of popup
6138
- */
6139
- appendContent: function (newContent, type) {
6140
- mfp.content = newContent;
6141
 
6142
- if (newContent) {
6143
- if (mfp.st.showCloseBtn && mfp.st.closeBtnInside &&
6144
- mfp.currTemplate[type] === true) {
6145
- // if there is no markup, we just append close button element inside
6146
- if (!mfp.content.find('.mfp-close').length) {
6147
- mfp.content.append(_getCloseBtn());
6148
- }
6149
- } else {
6150
- mfp.content = newContent;
6151
- }
6152
- } else {
6153
- mfp.content = '';
6154
- }
6155
 
6156
- _mfpTrigger(BEFORE_APPEND_EVENT);
6157
- mfp.container.addClass('mfp-' + type + '-holder');
6158
 
6159
- mfp.contentContainer.append(mfp.content);
6160
- },
 
 
 
 
 
 
 
 
6161
 
 
 
 
6162
 
6163
- /**
6164
- * Creates Magnific Popup data object based on given data
6165
- * @param {int} index Index of item to parse
6166
- */
6167
- parseEl: function (index) {
6168
- var item = mfp.items[index],
6169
- type;
6170
 
6171
- if (item.tagName) {
6172
- item = { el: $(item) };
6173
- } else {
6174
- type = item.type;
6175
- item = { data: item, src: item.src };
6176
- }
6177
 
6178
- if (item.el) {
6179
- var types = mfp.types;
 
 
 
 
 
 
6180
 
6181
- // check for 'mfp-TYPE' class
6182
- for (var i = 0; i < types.length; i++) {
6183
- if (item.el.hasClass('mfp-' + types[i])) {
6184
- type = types[i];
6185
- break;
6186
- }
6187
- }
6188
 
6189
- item.src = item.el.attr('data-mfp-src');
6190
- if (!item.src) {
6191
- item.src = item.el.attr('href');
6192
- }
6193
- }
6194
 
6195
- item.type = type || mfp.st.type || 'inline';
6196
- item.index = index;
6197
- item.parsed = true;
6198
- mfp.items[index] = item;
6199
- _mfpTrigger('ElementParse', item);
6200
 
6201
- return mfp.items[index];
6202
- },
6203
 
6204
 
6205
- /**
6206
- * Initializes single popup or a group of popups
6207
- */
6208
- addGroup: function (el, options) {
6209
- var eHandler = function (e) {
6210
- e.mfpEl = this;
6211
- mfp._openClick(e, el, options);
6212
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6213
 
6214
- if (!options) {
6215
- options = {};
 
 
 
 
 
 
 
 
 
6216
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6217
 
6218
- var eName = 'click.magnificPopup';
6219
- options.mainEl = el;
 
 
 
 
6220
 
6221
- if (options.items) {
6222
- options.isObj = true;
6223
- el.off(eName).on(eName, eHandler);
6224
- } else {
6225
- options.isObj = false;
6226
- if (options.delegate) {
6227
- el.off(eName).on(eName, options.delegate, eHandler);
6228
- } else {
6229
- options.items = el;
6230
- el.off(eName).on(eName, eHandler);
6231
- }
6232
- }
6233
- },
6234
- _openClick: function (e, el, options) {
6235
- var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick;
6236
 
6237
 
6238
- if (!midClick && (e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey)) {
6239
- return;
6240
- }
 
 
 
 
 
 
6241
 
6242
- var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn;
 
 
 
 
 
6243
 
6244
- if (disableOn) {
6245
- if ($.isFunction(disableOn)) {
6246
- if (!disableOn.call(mfp)) {
6247
- return true;
6248
- }
6249
- } else { // else it's number
6250
- if (_window.width() < disableOn) {
6251
- return true;
6252
- }
6253
- }
6254
- }
6255
 
6256
- if (e.type) {
6257
- e.preventDefault();
 
 
 
6258
 
6259
- // This will prevent popup from closing if element is inside and popup is already opened
6260
- if (mfp.isOpen) {
6261
- e.stopPropagation();
6262
- }
6263
- }
6264
 
6265
- options.el = $(e.mfpEl);
6266
- if (options.delegate) {
6267
- options.items = el.find(options.delegate);
6268
- }
6269
- mfp.open(options);
6270
- },
6271
 
 
 
 
6272
 
6273
- /**
6274
- * Updates text on preloader
6275
- */
6276
- updateStatus: function (status, text) {
6277
 
6278
- if (mfp.preloader) {
6279
- if (_prevStatus !== status) {
6280
- mfp.container.removeClass('mfp-s-' + _prevStatus);
6281
- }
 
6282
 
6283
- if (!text && status === 'loading') {
6284
- text = mfp.st.tLoading;
6285
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6286
 
6287
- var data = {
6288
- status: status,
6289
- text: text
6290
- };
6291
- // allows to modify status
6292
- _mfpTrigger('UpdateStatus', data);
6293
 
6294
- status = data.status;
6295
- text = data.text;
 
 
 
6296
 
6297
- mfp.preloader.html(text);
 
 
6298
 
6299
- mfp.preloader.find('a').on('click', function (e) {
6300
- e.stopImmediatePropagation();
6301
- });
 
 
 
6302
 
6303
- mfp.container.addClass('mfp-s-' + status);
6304
- _prevStatus = status;
6305
- }
6306
- },
6307
 
 
 
 
 
6308
 
6309
- /*
6310
- "Private" helpers that aren't private at all
6311
- */
6312
- // Check to close popup or not
6313
- // "target" is an element that was clicked
6314
- _checkIfClose: function (target) {
 
 
 
 
 
 
 
 
 
 
 
 
6315
 
6316
- if ($(target).hasClass(PREVENT_CLOSE_CLASS)) {
6317
- return;
6318
- }
6319
 
6320
- var closeOnContent = mfp.st.closeOnContentClick;
6321
- var closeOnBg = mfp.st.closeOnBgClick;
 
 
6322
 
6323
- if (closeOnContent && closeOnBg) {
6324
- return true;
6325
- } else {
6326
 
6327
- // We close the popup if click is on close button or on preloader. Or if there is no content.
6328
- if (!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0])) {
6329
- return true;
6330
- }
6331
 
6332
- // if click is outside the content
6333
- if ((target !== mfp.content[0] && !$.contains(mfp.content[0], target))) {
6334
- if (closeOnBg) {
6335
- // last check, if the clicked element is in DOM, (in case it's removed onclick)
6336
- if ($.contains(document, target)) {
6337
- return true;
6338
- }
6339
- }
6340
- } else if (closeOnContent) {
6341
- return true;
6342
  }
 
6343
 
 
 
 
6344
  }
6345
- return false;
6346
- },
6347
- _addClassToMFP: function (cName) {
6348
- mfp.bgOverlay.addClass(cName);
6349
- mfp.wrap.addClass(cName);
6350
- },
6351
- _removeClassFromMFP: function (cName) {
6352
- this.bgOverlay.removeClass(cName);
6353
- mfp.wrap.removeClass(cName);
6354
- },
6355
- _hasScrollBar: function (winHeight) {
6356
- return ((mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()));
6357
- },
6358
- _setFocus: function () {
6359
- (mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus();
6360
- },
6361
- _onFocusIn: function (e) {
6362
- if (e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target)) {
6363
- mfp._setFocus();
6364
- return false;
6365
- }
6366
- },
6367
- _parseMarkup: function (template, values, item) {
6368
- var arr;
6369
- if (item.data) {
6370
- values = $.extend(item.data, values);
6371
- }
6372
- _mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item]);
6373
 
6374
- $.each(values, function (key, value) {
6375
- if (value === undefined || value === false) {
6376
- return true;
6377
- }
6378
- arr = key.split('_');
6379
- if (arr.length > 1) {
6380
- var el = template.find(EVENT_NS + '-' + arr[0]);
6381
 
6382
- if (el.length > 0) {
6383
- var attr = arr[1];
6384
- if (attr === 'replaceWith') {
6385
- if (el[0] !== value[0]) {
6386
- el.replaceWith(value);
6387
- }
6388
- } else if (attr === 'img') {
6389
- if (el.is('img')) {
6390
- el.attr('src', value);
6391
- } else {
6392
- el.replaceWith($('<img>').attr('src', value).attr('class', el.attr('class')));
6393
- }
6394
- } else {
6395
- el.attr(arr[1], value);
6396
- }
6397
- }
6398
 
6399
- } else {
6400
- template.find(EVENT_NS + '-' + key).html(value);
6401
- }
6402
- });
6403
- },
6404
 
6405
- _getScrollbarSize: function () {
6406
- // thx David
6407
- if (mfp.scrollbarSize === undefined) {
6408
- var scrollDiv = document.createElement("div");
6409
- scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';
6410
- document.body.appendChild(scrollDiv);
6411
- mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;
6412
- document.body.removeChild(scrollDiv);
6413
- }
6414
- return mfp.scrollbarSize;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6415
  }
6416
 
6417
- }; /* MagnificPopup core prototype end */
 
 
 
 
 
 
 
6418
 
 
 
6419
 
 
6420
 
 
 
 
6421
 
6422
- /**
6423
- * Public static functions
6424
- */
6425
- $.magnificPopup = {
6426
- instance: null,
6427
- proto: MagnificPopup.prototype,
6428
- modules: [],
6429
 
6430
- open: function (options, index) {
6431
- _checkInstance();
6432
 
6433
- if (!options) {
6434
- options = {};
6435
- } else {
6436
- options = $.extend(true, {}, options);
6437
- }
6438
 
6439
- options.isObj = true;
6440
- options.index = index || 0;
6441
- return this.instance.open(options);
6442
- },
6443
 
6444
- close: function () {
6445
- return $.magnificPopup.instance && $.magnificPopup.instance.close();
6446
- },
 
 
 
6447
 
6448
- registerModule: function (name, module) {
6449
- if (module.options) {
6450
- $.magnificPopup.defaults[name] = module.options;
6451
- }
6452
- $.extend(this.proto, module.proto);
6453
- this.modules.push(name);
6454
- },
6455
 
6456
- defaults: {
6457
 
6458
- // Info about options is in docs:
6459
- // http://dimsemenov.com/plugins/magnific-popup/documentation.html#options
6460
 
6461
- disableOn: 0,
6462
 
6463
- key: null,
6464
 
6465
- midClick: false,
 
 
 
 
 
 
 
 
 
 
 
 
6466
 
6467
- mainClass: '',
 
 
 
 
 
 
 
 
 
 
 
 
6468
 
6469
- preloader: true,
 
 
 
 
 
 
 
 
6470
 
6471
- focus: '', // CSS selector of input to focus after popup is opened
 
 
 
 
 
 
 
6472
 
6473
- closeOnContentClick: false,
 
 
 
 
 
 
 
 
 
6474
 
6475
- closeOnBgClick: true,
 
6476
 
6477
- closeBtnInside: true,
 
 
 
6478
 
6479
- showCloseBtn: true,
 
 
 
 
 
 
 
 
 
 
 
 
 
6480
 
6481
- enableEscapeKey: true,
 
 
 
6482
 
6483
- modal: false,
6484
 
6485
- alignTop: false,
6486
 
6487
- removalDelay: 0,
 
 
6488
 
6489
- prependTo: null,
 
6490
 
6491
- fixedContentPos: 'auto',
 
 
6492
 
6493
- fixedBgPos: 'auto',
6494
 
6495
- overflowY: 'auto',
 
6496
 
6497
- closeMarkup: '<button title="%title%" type="button" class="mfp-close">&#215;</button>',
 
 
 
 
6498
 
6499
- tClose: 'Close (Esc)',
 
 
 
 
 
 
 
 
 
 
 
6500
 
6501
- tLoading: 'Loading...',
6502
 
6503
- autoFocusLast: true
6504
 
6505
- }
6506
- };
 
6507
 
6508
 
 
 
 
 
6509
 
6510
- $.fn.magnificPopup = function (options) {
6511
- _checkInstance();
 
6512
 
6513
- var jqEl = $(this);
 
 
6514
 
6515
- // We call some API method of first param is a string
6516
- if (typeof options === "string") {
 
6517
 
6518
- if (options === 'open') {
6519
- var items,
6520
- itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup,
6521
- index = parseInt(arguments[1], 10) || 0;
6522
 
6523
- if (itemOpts.items) {
6524
- items = itemOpts.items[index];
6525
- } else {
6526
- items = jqEl;
6527
- if (itemOpts.delegate) {
6528
- items = items.find(itemOpts.delegate);
6529
- }
6530
- items = items.eq(index);
6531
- }
6532
- mfp._openClick({ mfpEl: items }, jqEl, itemOpts);
6533
- } else {
6534
- if (mfp.isOpen)
6535
- mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));
6536
- }
6537
 
6538
- } else {
6539
- // clone options obj
6540
- options = $.extend(true, {}, options);
6541
 
6542
- /*
6543
- * As Zepto doesn't support .data() method for objects
6544
- * and it works only in normal browsers
6545
- * we assign "options" object directly to the DOM element. FTW!
6546
- */
6547
- if (_isJQ) {
6548
- jqEl.data('magnificPopup', options);
6549
- } else {
6550
- jqEl[0].magnificPopup = options;
6551
- }
6552
 
6553
- mfp.addGroup(jqEl, options);
 
 
6554
 
6555
- }
6556
- return jqEl;
6557
- };
6558
 
6559
- /*>>core*/
6560
 
6561
- /*>>inline*/
6562
 
6563
- var INLINE_NS = 'inline',
6564
- _hiddenClass,
6565
- _inlinePlaceholder,
6566
- _lastInlineElement,
6567
- _putInlineElementsBack = function () {
6568
- if (_lastInlineElement) {
6569
- _inlinePlaceholder.after(_lastInlineElement.addClass(_hiddenClass)).detach();
6570
- _lastInlineElement = null;
6571
- }
6572
- };
6573
 
6574
- $.magnificPopup.registerModule(INLINE_NS, {
6575
- options: {
6576
- hiddenClass: 'hide', // will be appended with `mfp-` prefix
6577
- markup: '',
6578
- tNotFound: 'Content not found'
6579
- },
6580
- proto: {
6581
 
6582
- initInline: function () {
6583
- mfp.types.push(INLINE_NS);
 
 
6584
 
6585
- _mfpOn(CLOSE_EVENT + '.' + INLINE_NS, function () {
6586
- _putInlineElementsBack();
6587
- });
6588
- },
6589
 
6590
- getInline: function (item, template) {
 
 
6591
 
6592
- _putInlineElementsBack();
6593
 
6594
- if (item.src) {
6595
- var inlineSt = mfp.st.inline,
6596
- el = $(item.src);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6597
 
6598
- if (el.length) {
6599
 
6600
- // If target element has parent - we replace it with placeholder and put it back after popup is closed
6601
- var parent = el[0].parentNode;
6602
- if (parent && parent.tagName) {
6603
- if (!_inlinePlaceholder) {
6604
- _hiddenClass = inlineSt.hiddenClass;
6605
- _inlinePlaceholder = _getEl(_hiddenClass);
6606
- _hiddenClass = 'mfp-' + _hiddenClass;
6607
- }
6608
- // replace target inline element with placeholder
6609
- _lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);
6610
- }
6611
 
6612
- mfp.updateStatus('ready');
6613
- } else {
6614
- mfp.updateStatus('error', inlineSt.tNotFound);
6615
- el = $('<div>');
6616
- }
6617
 
6618
- item.inlineElement = el;
6619
- return el;
6620
- }
6621
 
6622
- mfp.updateStatus('ready');
6623
- mfp._parseMarkup(template, {}, item);
6624
- return template;
6625
- }
6626
- }
6627
- });
6628
 
6629
- /*>>inline*/
 
 
6630
 
6631
- /*>>ajax*/
6632
- var AJAX_NS = 'ajax',
6633
- _ajaxCur,
6634
- _removeAjaxCursor = function () {
6635
- if (_ajaxCur) {
6636
- $(document.body).removeClass(_ajaxCur);
6637
- }
6638
- },
6639
- _destroyAjaxRequest = function () {
6640
- _removeAjaxCursor();
6641
- if (mfp.req) {
6642
- mfp.req.abort();
6643
- }
6644
- };
6645
 
6646
- $.magnificPopup.registerModule(AJAX_NS, {
 
 
 
6647
 
6648
- options: {
6649
- settings: null,
6650
- cursor: 'mfp-ajax-cur',
6651
- tError: '<a href="%url%">The content</a> could not be loaded.'
6652
- },
6653
 
6654
- proto: {
6655
- initAjax: function () {
6656
- mfp.types.push(AJAX_NS);
6657
- _ajaxCur = mfp.st.ajax.cursor;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6658
 
6659
- _mfpOn(CLOSE_EVENT + '.' + AJAX_NS, _destroyAjaxRequest);
6660
- _mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest);
6661
- },
6662
- getAjax: function (item) {
 
6663
 
6664
- if (_ajaxCur) {
6665
- $(document.body).addClass(_ajaxCur);
6666
- }
6667
 
6668
- mfp.updateStatus('loading');
 
 
 
 
6669
 
6670
- var opts = $.extend({
6671
- url: item.src,
6672
- success: function (data, textStatus, jqXHR) {
6673
- var temp = {
6674
- data: data,
6675
- xhr: jqXHR
6676
- };
6677
 
6678
- _mfpTrigger('ParseAjax', temp);
 
6679
 
6680
- mfp.appendContent($(temp.data), AJAX_NS);
 
 
 
6681
 
6682
- item.finished = true;
6683
 
6684
- _removeAjaxCursor();
 
 
 
6685
 
6686
- mfp._setFocus();
6687
 
6688
- setTimeout(function () {
6689
- mfp.wrap.addClass(READY_CLASS);
6690
- }, 16);
 
 
6691
 
6692
- mfp.updateStatus('ready');
6693
 
6694
- _mfpTrigger('AjaxContentAdded');
6695
- },
6696
- error: function () {
6697
- _removeAjaxCursor();
6698
- item.finished = item.loadError = true;
6699
- mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));
6700
- }
6701
- }, mfp.st.ajax.settings);
6702
 
6703
- mfp.req = $.ajax(opts);
6704
 
6705
- return '';
6706
- }
6707
- }
6708
- });
6709
 
6710
- /*>>ajax*/
6711
 
6712
- /*>>image*/
6713
- var _imgInterval,
6714
- _getTitle = function (item) {
6715
- if (item.data && item.data.title !== undefined)
6716
- return item.data.title;
6717
 
6718
- var src = mfp.st.image.titleSrc;
 
 
 
6719
 
6720
- if (src) {
6721
- if ($.isFunction(src)) {
6722
- return src.call(mfp, item);
6723
- } else if (item.el) {
6724
- return item.el.attr(src) || '';
6725
- }
6726
- }
6727
- return '';
6728
- };
6729
 
6730
- $.magnificPopup.registerModule('image', {
 
6731
 
6732
- options: {
6733
- markup: '<div class="mfp-figure">' +
6734
- '<div class="mfp-close"></div>' +
6735
- '<figure>' +
6736
- '<div class="mfp-img"></div>' +
6737
- '<figcaption>' +
6738
- '<div class="mfp-bottom-bar">' +
6739
- '<div class="mfp-title"></div>' +
6740
- '<div class="mfp-counter"></div>' +
6741
- '</div>' +
6742
- '</figcaption>' +
6743
- '</figure>' +
6744
- '</div>',
6745
- cursor: 'mfp-zoom-out-cur',
6746
- titleSrc: 'title',
6747
- verticalFit: true,
6748
- tError: '<a href="%url%">The image</a> could not be loaded.'
6749
- },
6750
 
6751
- proto: {
6752
- initImage: function () {
6753
- var imgSt = mfp.st.image,
6754
- ns = '.image';
6755
 
6756
- mfp.types.push('image');
 
 
6757
 
6758
- _mfpOn(OPEN_EVENT + ns, function () {
6759
- if (mfp.currItem.type === 'image' && imgSt.cursor) {
6760
- $(document.body).addClass(imgSt.cursor);
6761
- }
6762
- });
6763
 
6764
- _mfpOn(CLOSE_EVENT + ns, function () {
6765
- if (imgSt.cursor) {
6766
- $(document.body).removeClass(imgSt.cursor);
6767
- }
6768
- _window.off('resize' + EVENT_NS);
6769
- });
6770
 
6771
- _mfpOn('Resize' + ns, mfp.resizeImage);
6772
- if (mfp.isLowIE) {
6773
- _mfpOn('AfterChange', mfp.resizeImage);
6774
- }
6775
- },
6776
- resizeImage: function () {
6777
- var item = mfp.currItem;
6778
- if (!item || !item.img) return;
 
 
6779
 
6780
- if (mfp.st.image.verticalFit) {
6781
- var decr = 0;
6782
- // fix box-sizing in ie7/8
6783
- if (mfp.isLowIE) {
6784
- decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'), 10);
6785
- }
6786
- item.img.css('max-height', mfp.wH - decr);
6787
- }
6788
- },
6789
- _onImageHasSize: function (item) {
6790
- if (item.img) {
6791
 
6792
- item.hasSize = true;
6793
 
6794
- if (_imgInterval) {
6795
- clearInterval(_imgInterval);
6796
- }
 
6797
 
6798
- item.isCheckingImgSize = false;
6799
 
6800
- _mfpTrigger('ImageHasSize', item);
 
6801
 
6802
- if (item.imgHidden) {
6803
- if (mfp.content)
6804
- mfp.content.removeClass('mfp-loading');
 
6805
 
6806
- item.imgHidden = false;
6807
- }
 
6808
 
6809
- }
6810
- },
 
6811
 
6812
- /**
6813
- * Function that loops until the image has size to display elements that rely on it asap
6814
- */
6815
- findImageSize: function (item) {
6816
 
6817
- var counter = 0,
6818
- img = item.img[0],
6819
- mfpSetInterval = function (delay) {
6820
 
6821
- if (_imgInterval) {
6822
- clearInterval(_imgInterval);
6823
- }
6824
- // decelerating interval that checks for size of an image
6825
- _imgInterval = setInterval(function () {
6826
- if (img.naturalWidth > 0) {
6827
- mfp._onImageHasSize(item);
6828
- return;
6829
- }
6830
 
6831
- if (counter > 200) {
6832
- clearInterval(_imgInterval);
6833
- }
6834
 
6835
- counter++;
6836
- if (counter === 3) {
6837
- mfpSetInterval(10);
6838
- } else if (counter === 40) {
6839
- mfpSetInterval(50);
6840
- } else if (counter === 100) {
6841
- mfpSetInterval(500);
6842
- }
6843
- }, delay);
6844
- };
6845
 
6846
- mfpSetInterval(1);
6847
- },
6848
 
6849
- getImage: function (item, template) {
6850
 
6851
- var guard = 0,
 
 
 
6852
 
6853
- // image load complete handler
6854
- onLoadComplete = function () {
6855
- if (item) {
6856
- if (item.img[0].complete) {
6857
- item.img.off('.mfploader');
6858
 
6859
- if (item === mfp.currItem) {
6860
- mfp._onImageHasSize(item);
6861
 
6862
- mfp.updateStatus('ready');
6863
- }
6864
 
6865
- item.hasSize = true;
6866
- item.loaded = true;
6867
 
6868
- _mfpTrigger('ImageLoadComplete');
 
 
 
 
 
6869
 
6870
- }
6871
- else {
6872
- // if image complete check fails 200 times (20 sec), we assume that there was an error.
6873
- guard++;
6874
- if (guard < 200) {
6875
- setTimeout(onLoadComplete, 100);
6876
- } else {
6877
- onLoadError();
6878
- }
6879
- }
6880
- }
6881
- },
6882
 
6883
- // image error handler
6884
- onLoadError = function () {
6885
- if (item) {
6886
- item.img.off('.mfploader');
6887
- if (item === mfp.currItem) {
6888
- mfp._onImageHasSize(item);
6889
- mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src));
6890
- }
 
 
6891
 
6892
- item.hasSize = true;
6893
- item.loaded = true;
6894
- item.loadError = true;
6895
- }
6896
- },
6897
- imgSt = mfp.st.image;
6898
 
 
 
 
6899
 
6900
- var el = template.find('.mfp-img');
6901
- if (el.length) {
6902
- var img = document.createElement('img');
6903
- img.className = 'mfp-img';
6904
- if (item.el && item.el.find('img').length) {
6905
- img.alt = item.el.find('img').attr('alt');
6906
- }
6907
- item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);
6908
- img.src = item.src;
6909
 
6910
- // without clone() "error" event is not firing when IMG is replaced by new IMG
6911
- // TODO: find a way to avoid such cloning
6912
- if (el.is('img')) {
6913
- item.img = item.img.clone();
6914
- }
6915
 
6916
- img = item.img[0];
6917
- if (img.naturalWidth > 0) {
6918
- item.hasSize = true;
6919
- } else if (!img.width) {
6920
- item.hasSize = false;
6921
- }
6922
- }
6923
 
6924
- mfp._parseMarkup(template, {
6925
- title: _getTitle(item),
6926
- img_replaceWith: item.img
6927
- }, item);
6928
 
6929
- mfp.resizeImage();
 
 
6930
 
6931
- if (item.hasSize) {
6932
- if (_imgInterval) clearInterval(_imgInterval);
6933
 
6934
- if (item.loadError) {
6935
- template.addClass('mfp-loading');
6936
- mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src));
6937
- } else {
6938
- template.removeClass('mfp-loading');
6939
- mfp.updateStatus('ready');
6940
- }
6941
- return template;
6942
- }
6943
 
6944
- mfp.updateStatus('loading');
6945
- item.loading = true;
6946
 
6947
- if (!item.hasSize) {
6948
- item.imgHidden = true;
6949
- template.addClass('mfp-loading');
6950
- mfp.findImageSize(item);
6951
- }
6952
 
6953
- return template;
6954
- }
6955
- }
6956
- });
 
 
6957
 
6958
- /*>>image*/
 
 
6959
 
6960
- /*>>zoom*/
6961
- var hasMozTransform,
6962
- getHasMozTransform = function () {
6963
- if (hasMozTransform === undefined) {
6964
- hasMozTransform = document.createElement('p').style.MozTransform !== undefined;
6965
- }
6966
- return hasMozTransform;
6967
- };
6968
 
6969
- $.magnificPopup.registerModule('zoom', {
 
6970
 
6971
- options: {
6972
- enabled: false,
6973
- easing: 'ease-in-out',
6974
- duration: 300,
6975
- opener: function (element) {
6976
- return element.is('img') ? element : element.find('img');
6977
- }
6978
- },
6979
 
6980
- proto: {
 
 
6981
 
6982
- initZoom: function () {
6983
- var zoomSt = mfp.st.zoom,
6984
- ns = '.zoom',
6985
- image;
6986
 
6987
- if (!zoomSt.enabled || !mfp.supportsTransition) {
6988
- return;
6989
- }
 
 
 
 
6990
 
6991
- var duration = zoomSt.duration,
6992
- getElToAnimate = function (image) {
6993
- var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),
6994
- transition = 'all ' + (zoomSt.duration / 1000) + 's ' + zoomSt.easing,
6995
- cssObj = {
6996
- position: 'fixed',
6997
- zIndex: 9999,
6998
- left: 0,
6999
- top: 0,
7000
- '-webkit-backface-visibility': 'hidden'
7001
- },
7002
- t = 'transition';
7003
 
7004
- cssObj['-webkit-' + t] = cssObj['-moz-' + t] = cssObj['-o-' + t] = cssObj[t] = transition;
 
 
 
 
 
 
 
 
 
 
 
7005
 
7006
- newImg.css(cssObj);
7007
- return newImg;
7008
- },
7009
- showMainContent = function () {
7010
- mfp.content.css('visibility', 'visible');
7011
- },
7012
- openTimeout,
7013
- animatedImg;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7014
 
7015
- _mfpOn('BuildControls' + ns, function () {
7016
- if (mfp._allowZoom()) {
 
 
 
 
 
7017
 
7018
- clearTimeout(openTimeout);
7019
- mfp.content.css('visibility', 'hidden');
7020
 
7021
- // Basically, all code below does is clones existing image, puts in on top of the current one and animated it
7022
 
7023
- image = mfp._getItemToZoom();
 
 
7024
 
7025
- if (!image) {
7026
- showMainContent();
7027
- return;
7028
- }
7029
 
7030
- animatedImg = getElToAnimate(image);
 
 
 
7031
 
7032
- animatedImg.css(mfp._getOffset());
 
7033
 
7034
- mfp.wrap.append(animatedImg);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7035
 
7036
- openTimeout = setTimeout(function () {
7037
- animatedImg.css(mfp._getOffset(true));
7038
- openTimeout = setTimeout(function () {
7039
 
7040
- showMainContent();
7041
 
7042
- setTimeout(function () {
7043
- animatedImg.remove();
7044
- image = animatedImg = null;
7045
- _mfpTrigger('ZoomAnimationEnded');
7046
- }, 16); // avoid blink when switching images
 
 
7047
 
7048
- }, duration); // this timeout equals animation duration
 
 
 
 
7049
 
7050
- }, 16); // by adding this timeout we avoid short glitch at the beginning of animation
7051
 
 
 
 
 
 
 
7052
 
7053
- // Lots of timeouts...
7054
- }
7055
- });
7056
- _mfpOn(BEFORE_CLOSE_EVENT + ns, function () {
7057
- if (mfp._allowZoom()) {
7058
 
7059
- clearTimeout(openTimeout);
7060
 
7061
- mfp.st.removalDelay = duration;
 
 
7062
 
7063
- if (!image) {
7064
- image = mfp._getItemToZoom();
7065
- if (!image) {
7066
- return;
7067
- }
7068
- animatedImg = getElToAnimate(image);
7069
- }
7070
 
7071
- animatedImg.css(mfp._getOffset(true));
7072
- mfp.wrap.append(animatedImg);
7073
- mfp.content.css('visibility', 'hidden');
7074
 
7075
- setTimeout(function () {
7076
- animatedImg.css(mfp._getOffset());
7077
- }, 16);
7078
- }
 
 
7079
 
7080
- });
7081
 
7082
- _mfpOn(CLOSE_EVENT + ns, function () {
7083
- if (mfp._allowZoom()) {
7084
- showMainContent();
7085
- if (animatedImg) {
7086
- animatedImg.remove();
7087
- }
7088
- image = null;
7089
- }
7090
- });
7091
- },
7092
 
7093
- _allowZoom: function () {
7094
- return mfp.currItem.type === 'image';
7095
- },
7096
 
7097
- _getItemToZoom: function () {
7098
- if (mfp.currItem.hasSize) {
7099
- return mfp.currItem.img;
7100
- } else {
7101
- return false;
7102
- }
7103
- },
7104
 
7105
- // Get element postion relative to viewport
7106
- _getOffset: function (isLarge) {
7107
- var el;
7108
- if (isLarge) {
7109
- el = mfp.currItem.img;
7110
- } else {
7111
- el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);
7112
- }
7113
 
7114
- var offset = el.offset();
7115
- var paddingTop = parseInt(el.css('padding-top'), 10);
7116
- var paddingBottom = parseInt(el.css('padding-bottom'), 10);
7117
- offset.top -= ($(window).scrollTop() - paddingTop);
7118
 
7119
 
7120
- /*
7121
-
7122
- Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.
7123
-
7124
- */
7125
- var obj = {
7126
- width: el.width(),
7127
- // fix Zepto height+padding issue
7128
- height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop
7129
- };
7130
 
7131
- // I hate to do this, but there is no another option
7132
- if (getHasMozTransform()) {
7133
- obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';
7134
- } else {
7135
- obj.left = offset.left;
7136
- obj.top = offset.top;
7137
- }
7138
- return obj;
7139
- }
7140
 
 
7141
  }
7142
- });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7143
 
7144
 
 
7145
 
7146
- /*>>zoom*/
7147
 
7148
- /*>>iframe*/
 
 
 
 
 
 
 
 
 
 
 
7149
 
7150
- var IFRAME_NS = 'iframe',
7151
- _emptyPage = '//about:blank',
 
 
7152
 
7153
- _fixIframeBugs = function (isShowing) {
7154
- if (mfp.currTemplate[IFRAME_NS]) {
7155
- var el = mfp.currTemplate[IFRAME_NS].find('iframe');
7156
- if (el.length) {
7157
- // reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug
7158
- if (!isShowing) {
7159
- el[0].src = _emptyPage;
7160
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7161
 
7162
- // IE8 black screen bug fix
7163
- if (mfp.isIE8) {
7164
- el.css('display', isShowing ? 'block' : 'none');
7165
- }
7166
- }
7167
- }
7168
- };
7169
 
7170
- $.magnificPopup.registerModule(IFRAME_NS, {
 
 
7171
 
7172
- options: {
7173
- markup: '<div class="mfp-iframe-scaler">' +
7174
- '<div class="mfp-close"></div>' +
7175
- '<iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe>' +
7176
- '</div>',
7177
 
7178
- srcAction: 'iframe_src',
 
 
7179
 
7180
- // we don't care and support only one default type of URL by default
7181
- patterns: {
7182
- youtube: {
7183
- index: 'youtube.com',
7184
- id: 'v=',
7185
- src: '//www.youtube.com/embed/%id%?autoplay=1'
7186
- },
7187
- vimeo: {
7188
- index: 'vimeo.com/',
7189
- id: '/',
7190
- src: '//player.vimeo.com/video/%id%?autoplay=1'
7191
- },
7192
- gmaps: {
7193
- index: '//maps.google.',
7194
- src: '%id%&output=embed'
7195
- }
7196
- }
7197
- },
7198
 
7199
- proto: {
7200
- initIframe: function () {
7201
- mfp.types.push(IFRAME_NS);
7202
 
7203
- _mfpOn('BeforeChange', function (e, prevType, newType) {
7204
- if (prevType !== newType) {
7205
- if (prevType === IFRAME_NS) {
7206
- _fixIframeBugs(); // iframe if removed
7207
- } el
 
 
 
1
  /*!
2
+ * Countdown v0.1.0
3
+ * https://github.com/fengyuanchen/countdown
 
 
 
4
  *
5
+ * Copyright 2014 Fengyuan Chen
6
  * Released under the MIT license
 
7
  */
8
 
9
+ (function (factory) {
10
+ if (typeof define === "function" && define.amd) {
11
+ // AMD. Register as anonymous module.
12
+ define(["jquery"], factory);
13
+ } else {
14
+ // Browser globals.
15
+ factory(jQuery);
16
+ }
17
+ })(function ($) {
18
 
 
19
  "use strict";
20
 
21
+ var Countdown = function (element, options) {
22
+ this.$element = $(element);
23
+ this.defaults = $.extend({}, Countdown.defaults, this.$element.data(), $.isPlainObject(options) ? options : {});
24
+ this.init();
 
 
25
  };
26
 
27
+ Countdown.prototype = {
28
+ constructor: Countdown,
29
 
30
+ init: function () {
31
+ var content = this.$element.html(),
32
+ date = new Date(this.defaults.date || content);
 
33
 
34
+ if (date.getTime()) {
35
+ this.content = content;
36
+ this.date = date;
37
+ this.find();
38
 
39
+ if (this.defaults.autoStart) {
40
+ this.start();
41
+ }
42
+ }
43
+ },
44
 
45
+ find: function () {
46
+ var $element = this.$element;
 
47
 
48
+ this.$days = $element.find("[data-days]");
49
+ this.$hours = $element.find("[data-hours]");
50
+ this.$minutes = $element.find("[data-minutes]");
51
+ this.$seconds = $element.find("[data-seconds]");
52
+
53
+ if ((this.$days.length + this.$hours.length + this.$minutes.length + this.$seconds.length) > 0) {
54
+ this.found = true;
55
+ }
56
  },
 
 
 
57
 
58
+ reset: function () {
59
+ if (this.found) {
60
+ this.output("days");
61
+ this.output("hours");
62
+ this.output("minutes");
63
+ this.output("seconds");
64
+ } else {
65
+ this.output();
66
+ }
67
+ },
68
+
69
+ ready: function () {
70
+ var date = this.date,
71
+ decisecond = 100,
72
+ second = 1000,
73
+ minute = 60000,
74
+ hour = 3600000,
75
+ day = 86400000,
76
+ remainder = {},
77
+ diff;
78
+
79
+ if (!date) {
80
+ return false;
81
+ }
82
+
83
+ diff = date.getTime() - (new Date()).getTime();
84
+
85
+ if (diff <= 0) {
86
+ this.end();
87
+ return false;
88
  }
89
+
90
+ remainder.days = diff;
91
+ remainder.hours = remainder.days % day;
92
+ remainder.minutes = remainder.hours % hour;
93
+ remainder.seconds = remainder.minutes % minute;
94
+ remainder.milliseconds = remainder.seconds % second;
95
+
96
+ this.days = Math.floor(remainder.days / day);
97
+ this.hours = Math.floor(remainder.hours / hour);
98
+ this.minutes = Math.floor(remainder.minutes / minute);
99
+ this.seconds = Math.floor(remainder.seconds / second);
100
+ this.deciseconds = Math.floor(remainder.milliseconds / decisecond);
101
+
102
+ return true;
103
  },
104
+
105
  start: function () {
106
+ if (!this.active && this.ready()) {
107
+ this.active = true;
108
+ this.reset();
109
+ this.autoUpdate = this.defaults.fast ?
110
+ setInterval($.proxy(this.fastUpdate, this), 100) :
111
+ setInterval($.proxy(this.update, this), 1000);
112
+ }
113
  },
114
+
115
  stop: function () {
116
+ if (this.active) {
117
+ this.active = false;
118
+ clearInterval(this.autoUpdate);
119
+ }
120
+ },
121
 
122
+ end: function () {
123
+ if (!this.date) {
124
+ return;
 
125
  }
 
 
 
126
 
127
+ this.stop();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
 
129
+ this.days = 0;
130
+ this.hours = 0;
131
+ this.minutes = 0;
132
+ this.seconds = 0;
133
+ this.deciseconds = 0;
134
+ this.reset();
135
+ this.defaults.end();
136
+ },
137
+
138
+ destroy: function () {
139
+ if (!this.date) {
140
+ return;
141
+ }
142
+
143
+ this.stop();
144
+
145
+ this.$days = null;
146
+ this.$hours = null;
147
+ this.$minutes = null;
148
+ this.$seconds = null;
149
+
150
+ this.$element.empty().html(this.content);
151
+ this.$element.removeData("countdown");
152
+ },
153
+
154
+ fastUpdate: function () {
155
+ if (--this.deciseconds >= 0) {
156
+ this.output("deciseconds");
157
+ } else {
158
+ this.deciseconds = 9;
159
+ this.update();
160
+ }
161
+ },
162
+
163
+ update: function () {
164
+ if (--this.seconds >= 0) {
165
+ this.output("seconds");
166
+ } else {
167
+ this.seconds = 59;
168
+
169
+ if (--this.minutes >= 0) {
170
+ this.output("minutes");
171
+ } else {
172
+ this.minutes = 59;
173
+
174
+ if (--this.hours >= 0) {
175
+ this.output("hours");
176
+ } else {
177
+ this.hours = 23;
178
+
179
+ if (--this.days >= 0) {
180
+ this.output("days");
181
+ } else {
182
+ this.end();
183
+ }
184
+ }
185
+ }
186
+ }
187
+ },
188
+
189
+ output: function (type) {
190
+ if (!this.found) {
191
+ this.$element.empty().html(this.template());
192
+ return;
193
+ }
194
+
195
+ switch (type) {
196
+ case "deciseconds":
197
+ this.$seconds.text(this.getSecondsText());
198
+ break;
199
+
200
+ case "seconds":
201
+ this.$seconds.text(this.seconds);
202
+ break;
203
+
204
+ case "minutes":
205
+ this.$minutes.text(this.minutes);
206
+ break;
207
+
208
+ case "hours":
209
+ this.$hours.text(this.hours);
210
+ break;
211
+
212
+ case "days":
213
+ this.$days.text(this.days);
214
+ break;
215
+
216
+ // No default
217
+ }
218
+ },
219
+
220
+ template: function () {
221
+ return this.defaults.text
222
+ .replace("%s", this.days)
223
+ .replace("%s", this.hours)
224
+ .replace("%s", this.minutes)
225
+ .replace("%s", this.getSecondsText());
226
+ },
227
+
228
+ getSecondsText: function () {
229
+ return this.active && this.defaults.fast ? (this.seconds + "." + this.deciseconds) : this.seconds;
230
+ }
231
+ };
232
+
233
+ // Default settings
234
+ Countdown.defaults = {
235
+ autoStart: true,
236
+ date: null,
237
+ fast: false,
238
+ end: $.noop,
239
+ text: "%s days, %s hours, %s minutes, %s seconds"
240
+ };
241
+
242
+ // Set default settings
243
+ Countdown.setDefaults = function (options) {
244
+ $.extend(Countdown.defaults, options);
245
+ };
246
+
247
+ // Register as jQuery plugin
248
+ $.fn.countdown = function (options) {
249
+ return this.each(function () {
250
+ var $this = $(this),
251
+ data = $this.data("countdown");
252
+
253
+ if (!data) {
254
+ $this.data("countdown", (data = new Countdown(this, options)));
255
+ }
256
+
257
+ if (typeof options === "string" && $.isFunction(data[options])) {
258
+ data[options]();
259
+ }
260
+ });
261
+ };
262
+
263
+ $.fn.countdown.constructor = Countdown;
264
+ $.fn.countdown.setDefaults = Countdown.setDefaults;
265
+
266
+ $(function () {
267
+ $("[countdown]").countdown();
268
+ });
269
+
270
+ });
271
+
272
+ /*!
273
+ * imagesLoaded PACKAGED v4.1.4
274
+ * JavaScript is all like "You images are done yet or what?"
275
+ * MIT License
276
+ */
277
+
278
+ /**
279
+ * EvEmitter v1.1.0
280
+ * Lil' event emitter
281
+ * MIT License
282
+ */
283
+
284
+ /* jshint unused: true, undef: true, strict: true */
285
+
286
+ ( function( global, factory ) {
287
+ // universal module definition
288
+ /* jshint strict: false */ /* globals define, module, window */
289
+ if ( typeof define == 'function' && define.amd ) {
290
+ // AMD - RequireJS
291
+ define( 'ev-emitter/ev-emitter',factory );
292
+ } else if ( typeof module == 'object' && module.exports ) {
293
+ // CommonJS - Browserify, Webpack
294
+ module.exports = factory();
295
+ } else {
296
+ // Browser globals
297
+ global.EvEmitter = factory();
298
+ }
299
+
300
+ }( typeof window != 'undefined' ? window : this, function() {
301
+
302
+
303
+
304
+ function EvEmitter() {}
305
+
306
+ var proto = EvEmitter.prototype;
307
+
308
+ proto.on = function( eventName, listener ) {
309
+ if ( !eventName || !listener ) {
310
+ return;
311
+ }
312
+ // set events hash
313
+ var events = this._events = this._events || {};
314
+ // set listeners array
315
+ var listeners = events[ eventName ] = events[ eventName ] || [];
316
+ // only add once
317
+ if ( listeners.indexOf( listener ) == -1 ) {
318
+ listeners.push( listener );
319
+ }
320
+
321
+ return this;
322
+ };
323
+
324
+ proto.once = function( eventName, listener ) {
325
+ if ( !eventName || !listener ) {
326
+ return;
327
+ }
328
+ // add event
329
+ this.on( eventName, listener );
330
+ // set once flag
331
+ // set onceEvents hash
332
+ var onceEvents = this._onceEvents = this._onceEvents || {};
333
+ // set onceListeners object
334
+ var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
335
+ // set flag
336
+ onceListeners[ listener ] = true;
337
+
338
+ return this;
339
+ };
340
+
341
+ proto.off = function( eventName, listener ) {
342
+ var listeners = this._events && this._events[ eventName ];
343
+ if ( !listeners || !listeners.length ) {
344
+ return;
345
+ }
346
+ var index = listeners.indexOf( listener );
347
+ if ( index != -1 ) {
348
+ listeners.splice( index, 1 );
349
+ }
350
+
351
+ return this;
352
+ };
353
+
354
+ proto.emitEvent = function( eventName, args ) {
355
+ var listeners = this._events && this._events[ eventName ];
356
+ if ( !listeners || !listeners.length ) {
357
+ return;
358
+ }
359
+ // copy over to avoid interference if .off() in listener
360
+ listeners = listeners.slice(0);
361
+ args = args || [];
362
+ // once stuff
363
+ var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
364
+
365
+ for ( var i=0; i < listeners.length; i++ ) {
366
+ var listener = listeners[i]
367
+ var isOnce = onceListeners && onceListeners[ listener ];
368
+ if ( isOnce ) {
369
+ // remove listener
370
+ // remove before trigger to prevent recursion
371
+ this.off( eventName, listener );
372
+ // unset once flag
373
+ delete onceListeners[ listener ];
374
+ }
375
+ // trigger listener
376
+ listener.apply( this, args );
377
+ }
378
+
379
+ return this;
380
+ };
381
+
382
+ proto.allOff = function() {
383
+ delete this._events;
384
+ delete this._onceEvents;
385
+ };
386
+
387
+ return EvEmitter;
388
+
389
+ }));
390
+
391
+ /*!
392
+ * imagesLoaded v4.1.4
393
+ * JavaScript is all like "You images are done yet or what?"
394
+ * MIT License
395
+ */
396
+
397
+ ( function( window, factory ) { 'use strict';
398
+ // universal module definition
399
+
400
+ /*global define: false, module: false, require: false */
401
+
402
+ if ( typeof define == 'function' && define.amd ) {
403
+ // AMD
404
+ define( [
405
+ 'ev-emitter/ev-emitter'
406
+ ], function( EvEmitter ) {
407
+ return factory( window, EvEmitter );
408
+ });
409
+ } else if ( typeof module == 'object' && module.exports ) {
410
+ // CommonJS
411
+ module.exports = factory(
412
+ window,
413
+ require('ev-emitter')
414
+ );
415
+ } else {
416
+ // browser global
417
+ window.imagesLoaded = factory(
418
+ window,
419
+ window.EvEmitter
420
+ );
421
+ }
422
+
423
+ })( typeof window !== 'undefined' ? window : this,
424
+
425
+ // -------------------------- factory -------------------------- //
426
+
427
+ function factory( window, EvEmitter ) {
428
+
429
+
430
+
431
+ var $ = window.jQuery;
432
+ var console = window.console;
433
+
434
+ // -------------------------- helpers -------------------------- //
435
+
436
+ // extend objects
437
+ function extend( a, b ) {
438
+ for ( var prop in b ) {
439
+ a[ prop ] = b[ prop ];
440
+ }
441
+ return a;
442
+ }
443
+
444
+ var arraySlice = Array.prototype.slice;
445
+
446
+ // turn element or nodeList into an array
447
+ function makeArray( obj ) {
448
+ if ( Array.isArray( obj ) ) {
449
+ // use object if already an array
450
+ return obj;
451
+ }
452
+
453
+ var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
454
+ if ( isArrayLike ) {
455
+ // convert nodeList to array
456
+ return arraySlice.call( obj );
457
+ }
458
+
459
+ // array of single index
460
+ return [ obj ];
461
+ }
462
+
463
+ // -------------------------- imagesLoaded -------------------------- //
464
+
465
+ /**
466
+ * @param {Array, Element, NodeList, String} elem
467
+ * @param {Object or Function} options - if function, use as callback
468
+ * @param {Function} onAlways - callback function
469
+ */
470
+ function ImagesLoaded( elem, options, onAlways ) {
471
+ // coerce ImagesLoaded() without new, to be new ImagesLoaded()
472
+ if ( !( this instanceof ImagesLoaded ) ) {
473
+ return new ImagesLoaded( elem, options, onAlways );
474
+ }
475
+ // use elem as selector string
476
+ var queryElem = elem;
477
+ if ( typeof elem == 'string' ) {
478
+ queryElem = document.querySelectorAll( elem );
479
+ }
480
+ // bail if bad element
481
+ if ( !queryElem ) {
482
+ console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
483
+ return;
484
+ }
485
+
486
+ this.elements = makeArray( queryElem );
487
+ this.options = extend( {}, this.options );
488
+ // shift arguments if no options set
489
+ if ( typeof options == 'function' ) {
490
+ onAlways = options;
491
+ } else {
492
+ extend( this.options, options );
493
+ }
494
+
495
+ if ( onAlways ) {
496
+ this.on( 'always', onAlways );
497
+ }
498
+
499
+ this.getImages();
500
+
501
+ if ( $ ) {
502
+ // add jQuery Deferred object
503
+ this.jqDeferred = new $.Deferred();
504
+ }
505
+
506
+ // HACK check async to allow time to bind listeners
507
+ setTimeout( this.check.bind( this ) );
508
+ }
509
+
510
+ ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
511
+
512
+ ImagesLoaded.prototype.options = {};
513
+
514
+ ImagesLoaded.prototype.getImages = function() {
515
+ this.images = [];
516
+
517
+ // filter & find items if we have an item selector
518
+ this.elements.forEach( this.addElementImages, this );
519
+ };
520
+
521
+ /**
522
+ * @param {Node} element
523
+ */
524
+ ImagesLoaded.prototype.addElementImages = function( elem ) {
525
+ // filter siblings
526
+ if ( elem.nodeName == 'IMG' ) {
527
+ this.addImage( elem );
528
+ }
529
+ // get background image on element
530
+ if ( this.options.background === true ) {
531
+ this.addElementBackgroundImages( elem );
532
+ }
533
+
534
+ // find children
535
+ // no non-element nodes, #143
536
+ var nodeType = elem.nodeType;
537
+ if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
538
+ return;
539
+ }
540
+ var childImgs = elem.querySelectorAll('img');
541
+ // concat childElems to filterFound array
542
+ for ( var i=0; i < childImgs.length; i++ ) {
543
+ var img = childImgs[i];
544
+ this.addImage( img );
545
+ }
546
+
547
+ // get child background images
548
+ if ( typeof this.options.background == 'string' ) {
549
+ var children = elem.querySelectorAll( this.options.background );
550
+ for ( i=0; i < children.length; i++ ) {
551
+ var child = children[i];
552
+ this.addElementBackgroundImages( child );
553
+ }
554
+ }
555
+ };
556
+
557
+ var elementNodeTypes = {
558
+ 1: true,
559
+ 9: true,
560
+ 11: true
561
+ };
562
+
563
+ ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
564
+ var style = getComputedStyle( elem );
565
+ if ( !style ) {
566
+ // Firefox returns null if in a hidden iframe https://bugzil.la/548397
567
+ return;
568
+ }
569
+ // get url inside url("...")
570
+ var reURL = /url\((['"])?(.*?)\1\)/gi;
571
+ var matches = reURL.exec( style.backgroundImage );
572
+ while ( matches !== null ) {
573
+ var url = matches && matches[2];
574
+ if ( url ) {
575
+ this.addBackground( url, elem );
576
+ }
577
+ matches = reURL.exec( style.backgroundImage );
578
+ }
579
+ };
580
+
581
+ /**
582
+ * @param {Image} img
583
+ */
584
+ ImagesLoaded.prototype.addImage = function( img ) {
585
+ var loadingImage = new LoadingImage( img );
586
+ this.images.push( loadingImage );
587
+ };
588
+
589
+ ImagesLoaded.prototype.addBackground = function( url, elem ) {
590
+ var background = new Background( url, elem );
591
+ this.images.push( background );
592
+ };
593
+
594
+ ImagesLoaded.prototype.check = function() {
595
+ var _this = this;
596
+ this.progressedCount = 0;
597
+ this.hasAnyBroken = false;
598
+ // complete if no images
599
+ if ( !this.images.length ) {
600
+ this.complete();
601
+ return;
602
+ }
603
+
604
+ function onProgress( image, elem, message ) {
605
+ // HACK - Chrome triggers event before object properties have changed. #83
606
+ setTimeout( function() {
607
+ _this.progress( image, elem, message );
608
+ });
609
+ }
610
+
611
+ this.images.forEach( function( loadingImage ) {
612
+ loadingImage.once( 'progress', onProgress );
613
+ loadingImage.check();
614
+ });
615
+ };
616
+
617
+ ImagesLoaded.prototype.progress = function( image, elem, message ) {
618
+ this.progressedCount++;
619
+ this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
620
+ // progress event
621
+ this.emitEvent( 'progress', [ this, image, elem ] );
622
+ if ( this.jqDeferred && this.jqDeferred.notify ) {
623
+ this.jqDeferred.notify( this, image );
624
+ }
625
+ // check if completed
626
+ if ( this.progressedCount == this.images.length ) {
627
+ this.complete();
628
+ }
629
+
630
+ if ( this.options.debug && console ) {
631
+ console.log( 'progress: ' + message, image, elem );
632
+ }
633
+ };
634
+
635
+ ImagesLoaded.prototype.complete = function() {
636
+ var eventName = this.hasAnyBroken ? 'fail' : 'done';
637
+ this.isComplete = true;
638
+ this.emitEvent( eventName, [ this ] );
639
+ this.emitEvent( 'always', [ this ] );
640
+ if ( this.jqDeferred ) {
641
+ var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
642
+ this.jqDeferred[ jqMethod ]( this );
643
+ }
644
+ };
645
+
646
+ // -------------------------- -------------------------- //
647
+
648
+ function LoadingImage( img ) {
649
+ this.img = img;
650
+ }
651
+
652
+ LoadingImage.prototype = Object.create( EvEmitter.prototype );
653
+
654
+ LoadingImage.prototype.check = function() {
655
+ // If complete is true and browser supports natural sizes,
656
+ // try to check for image status manually.
657
+ var isComplete = this.getIsImageComplete();
658
+ if ( isComplete ) {
659
+ // report based on naturalWidth
660
+ this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
661
+ return;
662
+ }
663
+
664
+ // If none of the checks above matched, simulate loading on detached element.
665
+ this.proxyImage = new Image();
666
+ this.proxyImage.addEventListener( 'load', this );
667
+ this.proxyImage.addEventListener( 'error', this );
668
+ // bind to image as well for Firefox. #191
669
+ this.img.addEventListener( 'load', this );
670
+ this.img.addEventListener( 'error', this );
671
+ this.proxyImage.src = this.img.src;
672
+ };
673
+
674
+ LoadingImage.prototype.getIsImageComplete = function() {
675
+ // check for non-zero, non-undefined naturalWidth
676
+ // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
677
+ return this.img.complete && this.img.naturalWidth;
678
+ };
679
+
680
+ LoadingImage.prototype.confirm = function( isLoaded, message ) {
681
+ this.isLoaded = isLoaded;
682
+ this.emitEvent( 'progress', [ this, this.img, message ] );
683
+ };
684
+
685
+ // ----- events ----- //
686
+
687
+ // trigger specified handler for event type
688
+ LoadingImage.prototype.handleEvent = function( event ) {
689
+ var method = 'on' + event.type;
690
+ if ( this[ method ] ) {
691
+ this[ method ]( event );
692
+ }
693
+ };
694
+
695
+ LoadingImage.prototype.onload = function() {
696
+ this.confirm( true, 'onload' );
697
+ this.unbindEvents();
698
+ };
699
+
700
+ LoadingImage.prototype.onerror = function() {
701
+ this.confirm( false, 'onerror' );
702
+ this.unbindEvents();
703
+ };
704
+
705
+ LoadingImage.prototype.unbindEvents = function() {
706
+ this.proxyImage.removeEventListener( 'load', this );
707
+ this.proxyImage.removeEventListener( 'error', this );
708
+ this.img.removeEventListener( 'load', this );
709
+ this.img.removeEventListener( 'error', this );
710
+ };
711
+
712
+ // -------------------------- Background -------------------------- //
713
+
714
+ function Background( url, element ) {
715
+ this.url = url;
716
+ this.element = element;
717
+ this.img = new Image();
718
+ }
719
+
720
+ // inherit LoadingImage prototype
721
+ Background.prototype = Object.create( LoadingImage.prototype );
722
+
723
+ Background.prototype.check = function() {
724
+ this.img.addEventListener( 'load', this );
725
+ this.img.addEventListener( 'error', this );
726
+ this.img.src = this.url;
727
+ // check if image is already complete
728
+ var isComplete = this.getIsImageComplete();
729
+ if ( isComplete ) {
730
+ this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
731
+ this.unbindEvents();
732
+ }
733
+ };
734
+
735
+ Background.prototype.unbindEvents = function() {
736
+ this.img.removeEventListener( 'load', this );
737
+ this.img.removeEventListener( 'error', this );
738
+ };
739
+
740
+ Background.prototype.confirm = function( isLoaded, message ) {
741
+ this.isLoaded = isLoaded;
742
+ this.emitEvent( 'progress', [ this, this.element, message ] );
743
+ };
744
+
745
+ // -------------------------- jQuery -------------------------- //
746
+
747
+ ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
748
+ jQuery = jQuery || window.jQuery;
749
+ if ( !jQuery ) {
750
+ return;
751
+ }
752
+ // set local variable
753
+ $ = jQuery;
754
+ // $().imagesLoaded()
755
+ $.fn.imagesLoaded = function( options, callback ) {
756
+ var instance = new ImagesLoaded( this, options, callback );
757
+ return instance.jqDeferred.promise( $(this) );
758
+ };
759
+ };
760
+ // try making plugin
761
+ ImagesLoaded.makeJQueryPlugin();
762
+
763
+ // -------------------------- -------------------------- //
764
+
765
+ return ImagesLoaded;
766
+
767
+ });
768
+
769
+
770
+ !function(t,s,e){"use strict";var i=function(t,s){var i=this;this.el=t,this.options={},Object.keys(r).forEach(function(t){i.options[t]=r[t]}),Object.keys(s).forEach(function(t){i.options[t]=s[t]}),this.isInput="input"===this.el.tagName.toLowerCase(),this.attr=this.options.attr,this.showCursor=!this.isInput&&this.options.showCursor,this.elContent=this.attr?this.el.getAttribute(this.attr):this.el.textContent,this.contentType=this.options.contentType,this.typeSpeed=this.options.typeSpeed,this.startDelay=this.options.startDelay,this.backSpeed=this.options.backSpeed,this.backDelay=this.options.backDelay,e&&this.options.stringsElement instanceof e?this.stringsElement=this.options.stringsElement[0]:this.stringsElement=this.options.stringsElement,this.strings=this.options.strings,this.strPos=0,this.arrayPos=0,this.stopNum=0,this.loop=this.options.loop,this.loopCount=this.options.loopCount,this.curLoop=0,this.stop=!1,this.cursorChar=this.options.cursorChar,this.shuffle=this.options.shuffle,this.sequence=[],this.build()};i.prototype={constructor:i,init:function(){var t=this;t.timeout=setTimeout(function(){for(var s=0;s<t.strings.length;++s)t.sequence[s]=s;t.shuffle&&(t.sequence=t.shuffleArray(t.sequence)),t.typewrite(t.strings[t.sequence[t.arrayPos]],t.strPos)},t.startDelay)},build:function(){var t=this;if(this.showCursor===!0&&(this.cursor=s.createElement("span"),this.cursor.className="typed-cursor",this.cursor.innerHTML=this.cursorChar,this.el.parentNode&&this.el.parentNode.insertBefore(this.cursor,this.el.nextSibling)),this.stringsElement){this.strings=[],this.stringsElement.style.display="none";var e=Array.prototype.slice.apply(this.stringsElement.children);e.forEach(function(s){t.strings.push(s.innerHTML)})}this.init()},typewrite:function(t,s){if(this.stop!==!0){var e=Math.round(70*Math.random())+this.typeSpeed,i=this;i.timeout=setTimeout(function(){var e=0,r=t.substr(s);if("^"===r.charAt(0)){var o=1;/^\^\d+/.test(r)&&(r=/\d+/.exec(r)[0],o+=r.length,e=parseInt(r)),t=t.substring(0,s)+t.substring(s+o)}if("html"===i.contentType){var n=t.substr(s).charAt(0);if("<"===n||"&"===n){var a="",h="";for(h="<"===n?">":";";t.substr(s+1).charAt(0)!==h&&(a+=t.substr(s).charAt(0),s++,!(s+1>t.length)););s++,a+=h}}i.timeout=setTimeout(function(){if(s===t.length){if(i.options.onStringTyped(i.arrayPos),i.arrayPos===i.strings.length-1&&(i.options.callback(),i.curLoop++,i.loop===!1||i.curLoop===i.loopCount))return;i.timeout=setTimeout(function(){i.backspace(t,s)},i.backDelay)}else{0===s&&i.options.preStringTyped(i.arrayPos);var e=t.substr(0,s+1);i.attr?i.el.setAttribute(i.attr,e):i.isInput?i.el.value=e:"html"===i.contentType?i.el.innerHTML=e:i.el.textContent=e,s++,i.typewrite(t,s)}},e)},e)}},backspace:function(t,s){if(this.stop!==!0){var e=Math.round(70*Math.random())+this.backSpeed,i=this;i.timeout=setTimeout(function(){if("html"===i.contentType&&">"===t.substr(s).charAt(0)){for(var e="";"<"!==t.substr(s-1).charAt(0)&&(e-=t.substr(s).charAt(0),s--,!(s<0)););s--,e+="<"}var r=t.substr(0,s);i.attr?i.el.setAttribute(i.attr,r):i.isInput?i.el.value=r:"html"===i.contentType?i.el.innerHTML=r:i.el.textContent=r,s>i.stopNum?(s--,i.backspace(t,s)):s<=i.stopNum&&(i.arrayPos++,i.arrayPos===i.strings.length?(i.arrayPos=0,i.shuffle&&(i.sequence=i.shuffleArray(i.sequence)),i.init()):i.typewrite(i.strings[i.sequence[i.arrayPos]],s))},e)}},shuffleArray:function(t){var s,e,i=t.length;if(i)for(;--i;)e=Math.floor(Math.random()*(i+1)),s=t[e],t[e]=t[i],t[i]=s;return t},reset:function(){var t=this;clearInterval(t.timeout);this.el.getAttribute("id");this.el.textContent="","undefined"!=typeof this.cursor&&"undefined"!=typeof this.cursor.parentNode&&this.cursor.parentNode.removeChild(this.cursor),this.strPos=0,this.arrayPos=0,this.curLoop=0,this.options.resetCallback()}},i["new"]=function(t,e){var r=Array.prototype.slice.apply(s.querySelectorAll(t));r.forEach(function(t){var s=t._typed,r="object"==typeof e&&e;s&&s.reset(),t._typed=s=new i(t,r),"string"==typeof e&&s[e]()})},e&&(e.fn.typed=function(t){return this.each(function(){var s=e(this),r=s.data("typed"),o="object"==typeof t&&t;r&&r.reset(),s.data("typed",r=new i(this,o)),"string"==typeof t&&r[t]()})}),t.Typed=i;var r={strings:["These are the default values...","You know what you should do?","Use your own!","Have a great day!"],stringsElement:null,typeSpeed:0,startDelay:0,backSpeed:0,shuffle:!1,backDelay:500,loop:!1,loopCount:!1,showCursor:!0,cursorChar:"|",attr:null,contentType:"html",callback:function(){},preStringTyped:function(){},onStringTyped:function(){},resetCallback:function(){}}}(window,document,window.jQuery);
771
+ !function(a){"use strict";function b(b,c){this.element=a(b),this.settings=a.extend({},d,c),this._defaults=d,this._init()}var c="Morphext",d={animation:"bounceIn",separator:",",speed:2e3,complete:a.noop};b.prototype={_init:function(){var b=this;this.phrases=[],this.element.addClass("morphext"),a.each(this.element.text().split(this.settings.separator),function(c,d){b.phrases.push(a.trim(d))}),this.index=-1,this.animate(),this.start()},animate:function(){this.index=++this.index%this.phrases.length,this.element[0].innerHTML='<span class="animated '+this.settings.animation+'">'+this.phrases[this.index]+"</span>",a.isFunction(this.settings.complete)&&this.settings.complete.call(this)},start:function(){var a=this;this._interval=setInterval(function(){a.animate()},this.settings.speed)},stop:function(){this._interval=clearInterval(this._interval)}},a.fn[c]=function(d){return this.each(function(){a.data(this,"plugin_"+c)||a.data(this,"plugin_"+c,new b(this,d))})}}(jQuery);
772
+
773
+ /*!
774
+ * Morphext - Text Rotating Plugin for jQuery
775
+ * https://github.com/MrSaints/Morphext
776
+ *
777
+ * Built on jQuery Boilerplate
778
+ * http://jqueryboilerplate.com/
779
+ *
780
+ * Copyright 2014 Ian Lai and other contributors
781
+ * Released under the MIT license
782
+ * http://ian.mit-license.org/
783
+ */
784
+
785
+ /*eslint-env browser */
786
+ /*global jQuery:false */
787
+ /*eslint-disable no-underscore-dangle */
788
+
789
+ (function ($) {
790
+ "use strict";
791
+
792
+ var pluginName = "Morphext",
793
+ defaults = {
794
+ animation: "bounceIn",
795
+ separator: ",",
796
+ speed: 2000,
797
+ complete: $.noop
798
+ };
799
+
800
+ function Plugin (element, options) {
801
+ this.element = $(element);
802
+
803
+ this.settings = $.extend({}, defaults, options);
804
+ this._defaults = defaults;
805
+ this._init();
806
+ }
807
+
808
+ Plugin.prototype = {
809
+ _init: function () {
810
+ var $that = this;
811
+ this.phrases = [];
812
+
813
+ this.element.addClass("morphext");
814
+
815
+ $.each(this.element.text().split(this.settings.separator), function (key, value) {
816
+ $that.phrases.push($.trim(value));
817
+ });
818
+
819
+ this.index = -1;
820
+ this.animate();
821
+ this.start();
822
+ },
823
+ animate: function () {
824
+ this.index = ++this.index % this.phrases.length;
825
+ this.element[0].innerHTML = "<span class=\"animated " + this.settings.animation + "\">" + this.phrases[this.index] + "</span>";
826
+
827
+ if ($.isFunction(this.settings.complete)) {
828
+ this.settings.complete.call(this);
829
+ }
830
+ },
831
+ start: function () {
832
+ var $that = this;
833
+ this._interval = setInterval(function () {
834
+ $that.animate();
835
+ }, this.settings.speed);
836
+ },
837
+ stop: function () {
838
+ this._interval = clearInterval(this._interval);
839
+ }
840
+ };
841
+
842
+ $.fn[pluginName] = function (options) {
843
+ return this.each(function() {
844
+ if (!$.data(this, "plugin_" + pluginName)) {
845
+ $.data(this, "plugin_" + pluginName, new Plugin(this, options));
846
+ }
847
+ });
848
+ };
849
+ })(jQuery);
850
+
851
+ /*!
852
+ *
853
+ * typed.js - A JavaScript Typing Animation Library
854
+ * Author: Matt Boldt <me@mattboldt.com>
855
+ * Version: v2.0.9
856
+ * Url: https://github.com/mattboldt/typed.js
857
+ * License(s): MIT
858
+ *
859
+ */
860
+ (function webpackUniversalModuleDefinition(root, factory) {
861
+ if(typeof exports === 'object' && typeof module === 'object')
862
+ module.exports = factory();
863
+ else if(typeof define === 'function' && define.amd)
864
+ define([], factory);
865
+ else if(typeof exports === 'object')
866
+ exports["Typed"] = factory();
867
+ else
868
+ root["Typed"] = factory();
869
+ })(this, function() {
870
+ return /******/ (function(modules) { // webpackBootstrap
871
+ /******/ // The module cache
872
+ /******/ var installedModules = {};
873
+ /******/
874
+ /******/ // The require function
875
+ /******/ function __webpack_require__(moduleId) {
876
+ /******/
877
+ /******/ // Check if module is in cache
878
+ /******/ if(installedModules[moduleId])
879
+ /******/ return installedModules[moduleId].exports;
880
+ /******/
881
+ /******/ // Create a new module (and put it into the cache)
882
+ /******/ var module = installedModules[moduleId] = {
883
+ /******/ exports: {},
884
+ /******/ id: moduleId,
885
+ /******/ loaded: false
886
+ /******/ };
887
+ /******/
888
+ /******/ // Execute the module function
889
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
890
+ /******/
891
+ /******/ // Flag the module as loaded
892
+ /******/ module.loaded = true;
893
+ /******/
894
+ /******/ // Return the exports of the module
895
+ /******/ return module.exports;
896
+ /******/ }
897
+ /******/
898
+ /******/
899
+ /******/ // expose the modules object (__webpack_modules__)
900
+ /******/ __webpack_require__.m = modules;
901
+ /******/
902
+ /******/ // expose the module cache
903
+ /******/ __webpack_require__.c = installedModules;
904
+ /******/
905
+ /******/ // __webpack_public_path__
906
+ /******/ __webpack_require__.p = "";
907
+ /******/
908
+ /******/ // Load entry module and return exports
909
+ /******/ return __webpack_require__(0);
910
+ /******/ })
911
+ /************************************************************************/
912
+ /******/ ([
913
+ /* 0 */
914
+ /***/ (function(module, exports, __webpack_require__) {
915
+
916
+ 'use strict';
917
+
918
+ Object.defineProperty(exports, '__esModule', {
919
+ value: true
920
+ });
921
+
922
+ var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
923
+
924
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
925
+
926
+ var _initializerJs = __webpack_require__(1);
927
+
928
+ var _htmlParserJs = __webpack_require__(3);
929
+
930
+ /**
931
+ * Welcome to Typed.js!
932
+ * @param {string} elementId HTML element ID _OR_ HTML element
933
+ * @param {object} options options object
934
+ * @returns {object} a new Typed object
935
+ */
936
+
937
+ var Typed = (function () {
938
+ function Typed(elementId, options) {
939
+ _classCallCheck(this, Typed);
940
+
941
+ // Initialize it up
942
+ _initializerJs.initializer.load(this, options, elementId);
943
+ // All systems go!
944
+ this.begin();
945
+ }
946
+
947
+ /**
948
+ * Toggle start() and stop() of the Typed instance
949
+ * @public
950
  */
951
 
952
+ _createClass(Typed, [{
953
+ key: 'toggle',
954
+ value: function toggle() {
955
+ this.pause.status ? this.start() : this.stop();
956
+ }
957
+
958
+ /**
959
+ * Stop typing / backspacing and enable cursor blinking
960
+ * @public
961
+ */
962
+ }, {
963
+ key: 'stop',
964
+ value: function stop() {
965
+ if (this.typingComplete) return;
966
+ if (this.pause.status) return;
967
+ this.toggleBlinking(true);
968
+ this.pause.status = true;
969
+ this.options.onStop(this.arrayPos, this);
970
+ }
971
+
972
+ /**
973
+ * Start typing / backspacing after being stopped
974
+ * @public
975
+ */
976
+ }, {
977
+ key: 'start',
978
+ value: function start() {
979
+ if (this.typingComplete) return;
980
+ if (!this.pause.status) return;
981
+ this.pause.status = false;
982
+ if (this.pause.typewrite) {
983
+ this.typewrite(this.pause.curString, this.pause.curStrPos);
984
+ } else {
985
+ this.backspace(this.pause.curString, this.pause.curStrPos);
986
+ }
987
+ this.options.onStart(this.arrayPos, this);
988
+ }
989
+
990
+ /**
991
+ * Destroy this instance of Typed
992
+ * @public
993
+ */
994
+ }, {
995
+ key: 'destroy',
996
+ value: function destroy() {
997
+ this.reset(false);
998
+ this.options.onDestroy(this);
999
+ }
1000
+
1001
+ /**
1002
+ * Reset Typed and optionally restarts
1003
+ * @param {boolean} restart
1004
+ * @public
1005
+ */
1006
+ }, {
1007
+ key: 'reset',
1008
+ value: function reset() {
1009
+ var restart = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
1010
+
1011
+ clearInterval(this.timeout);
1012
+ this.replaceText('');
1013
+ if (this.cursor && this.cursor.parentNode) {
1014
+ this.cursor.parentNode.removeChild(this.cursor);
1015
+ this.cursor = null;
1016
+ }
1017
+ this.strPos = 0;
1018
+ this.arrayPos = 0;
1019
+ this.curLoop = 0;
1020
+ if (restart) {
1021
+ this.insertCursor();
1022
+ this.options.onReset(this);
1023
+ this.begin();
1024
+ }
1025
+ }
1026
+
1027
+ /**
1028
+ * Begins the typing animation
1029
+ * @private
1030
+ */
1031
+ }, {
1032
+ key: 'begin',
1033
+ value: function begin() {
1034
+ var _this = this;
1035
+
1036
+ this.typingComplete = false;
1037
+ this.shuffleStringsIfNeeded(this);
1038
+ this.insertCursor();
1039
+ if (this.bindInputFocusEvents) this.bindFocusEvents();
1040
+ this.timeout = setTimeout(function () {
1041
+ // Check if there is some text in the element, if yes start by backspacing the default message
1042
+ if (!_this.currentElContent || _this.currentElContent.length === 0) {
1043
+ _this.typewrite(_this.strings[_this.sequence[_this.arrayPos]], _this.strPos);
1044
+ } else {
1045
+ // Start typing
1046
+ _this.backspace(_this.currentElContent, _this.currentElContent.length);
1047
+ }
1048
+ }, this.startDelay);
1049
+ }
1050
+
1051
+ /**
1052
+ * Called for each character typed
1053
+ * @param {string} curString the current string in the strings array
1054
+ * @param {number} curStrPos the current position in the curString
1055
+ * @private
1056
+ */
1057
+ }, {
1058
+ key: 'typewrite',
1059
+ value: function typewrite(curString, curStrPos) {
1060
+ var _this2 = this;
1061
+
1062
+ if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) {
1063
+ this.el.classList.remove(this.fadeOutClass);
1064
+ if (this.cursor) this.cursor.classList.remove(this.fadeOutClass);
1065
+ }
1066
+
1067
+ var humanize = this.humanizer(this.typeSpeed);
1068
+ var numChars = 1;
1069
+
1070
+ if (this.pause.status === true) {
1071
+ this.setPauseStatus(curString, curStrPos, true);
1072
+ return;
1073
+ }
1074
+
1075
+ // contain typing function in a timeout humanize'd delay
1076
+ this.timeout = setTimeout(function () {
1077
+ // skip over any HTML chars
1078
+ curStrPos = _htmlParserJs.htmlParser.typeHtmlChars(curString, curStrPos, _this2);
1079
+
1080
+ var pauseTime = 0;
1081
+ var substr = curString.substr(curStrPos);
1082
+ // check for an escape character before a pause value
1083
+ // format: \^\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^
1084
+ // single ^ are removed from string
1085
+ if (substr.charAt(0) === '^') {
1086
+ if (/^\^\d+/.test(substr)) {
1087
+ var skip = 1; // skip at least 1
1088
+ substr = /\d+/.exec(substr)[0];
1089
+ skip += substr.length;
1090
+ pauseTime = parseInt(substr);
1091
+ _this2.temporaryPause = true;
1092
+ _this2.options.onTypingPaused(_this2.arrayPos, _this2);
1093
+ // strip out the escape character and pause value so they're not printed
1094
+ curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip);
1095
+ _this2.toggleBlinking(true);
1096
+ }
1097
+ }
1098
+
1099
+ // check for skip characters formatted as
1100
+ // "this is a `string to print NOW` ..."
1101
+ if (substr.charAt(0) === '`') {
1102
+ while (curString.substr(curStrPos + numChars).charAt(0) !== '`') {
1103
+ numChars++;
1104
+ if (curStrPos + numChars > curString.length) break;
1105
+ }
1106
+ // strip out the escape characters and append all the string in between
1107
+ var stringBeforeSkip = curString.substring(0, curStrPos);
1108
+ var stringSkipped = curString.substring(stringBeforeSkip.length + 1, curStrPos + numChars);
1109
+ var stringAfterSkip = curString.substring(curStrPos + numChars + 1);
1110
+ curString = stringBeforeSkip + stringSkipped + stringAfterSkip;
1111
+ numChars--;
1112
+ }
1113
+
1114
+ // timeout for any pause after a character
1115
+ _this2.timeout = setTimeout(function () {
1116
+ // Accounts for blinking while paused
1117
+ _this2.toggleBlinking(false);
1118
+
1119
+ // We're done with this sentence!
1120
+ if (curStrPos >= curString.length) {
1121
+ _this2.doneTyping(curString, curStrPos);
1122
+ } else {
1123
+ _this2.keepTyping(curString, curStrPos, numChars);
1124
+ }
1125
+ // end of character pause
1126
+ if (_this2.temporaryPause) {
1127
+ _this2.temporaryPause = false;
1128
+ _this2.options.onTypingResumed(_this2.arrayPos, _this2);
1129
+ }
1130
+ }, pauseTime);
1131
+
1132
+ // humanized value for typing
1133
+ }, humanize);
1134
+ }
1135
+
1136
+ /**
1137
+ * Continue to the next string & begin typing
1138
+ * @param {string} curString the current string in the strings array
1139
+ * @param {number} curStrPos the current position in the curString
1140
+ * @private
1141
+ */
1142
+ }, {
1143
+ key: 'keepTyping',
1144
+ value: function keepTyping(curString, curStrPos, numChars) {
1145
+ // call before functions if applicable
1146
+ if (curStrPos === 0) {
1147
+ this.toggleBlinking(false);
1148
+ this.options.preStringTyped(this.arrayPos, this);
1149
+ }
1150
+ // start typing each new char into existing string
1151
+ // curString: arg, this.el.html: original text inside element
1152
+ curStrPos += numChars;
1153
+ var nextString = curString.substr(0, curStrPos);
1154
+ this.replaceText(nextString);
1155
+ // loop the function
1156
+ this.typewrite(curString, curStrPos);
1157
+ }
1158
+
1159
+ /**
1160
+ * We're done typing all strings
1161
+ * @param {string} curString the current string in the strings array
1162
+ * @param {number} curStrPos the current position in the curString
1163
+ * @private
1164
+ */
1165
+ }, {
1166
+ key: 'doneTyping',
1167
+ value: function doneTyping(curString, curStrPos) {
1168
+ var _this3 = this;
1169
+
1170
+ // fires callback function
1171
+ this.options.onStringTyped(this.arrayPos, this);
1172
+ this.toggleBlinking(true);
1173
+ // is this the final string
1174
+ if (this.arrayPos === this.strings.length - 1) {
1175
+ // callback that occurs on the last typed string
1176
+ this.complete();
1177
+ // quit if we wont loop back
1178
+ if (this.loop === false || this.curLoop === this.loopCount) {
1179
+ return;
1180
+ }
1181
+ }
1182
+ this.timeout = setTimeout(function () {
1183
+ _this3.backspace(curString, curStrPos);
1184
+ }, this.backDelay);
1185
+ }
1186
+
1187
+ /**
1188
+ * Backspaces 1 character at a time
1189
+ * @param {string} curString the current string in the strings array
1190
+ * @param {number} curStrPos the current position in the curString
1191
+ * @private
1192
+ */
1193
+ }, {
1194
+ key: 'backspace',
1195
+ value: function backspace(curString, curStrPos) {
1196
+ var _this4 = this;
1197
+
1198
+ if (this.pause.status === true) {
1199
+ this.setPauseStatus(curString, curStrPos, true);
1200
+ return;
1201
+ }
1202
+ if (this.fadeOut) return this.initFadeOut();
1203
+
1204
+ this.toggleBlinking(false);
1205
+ var humanize = this.humanizer(this.backSpeed);
1206
+
1207
+ this.timeout = setTimeout(function () {
1208
+ curStrPos = _htmlParserJs.htmlParser.backSpaceHtmlChars(curString, curStrPos, _this4);
1209
+ // replace text with base text + typed characters
1210
+ var curStringAtPosition = curString.substr(0, curStrPos);
1211
+ _this4.replaceText(curStringAtPosition);
1212
+
1213
+ // if smartBack is enabled
1214
+ if (_this4.smartBackspace) {
1215
+ // the remaining part of the current string is equal of the same part of the new string
1216
+ var nextString = _this4.strings[_this4.arrayPos + 1];
1217
+ if (nextString && curStringAtPosition === nextString.substr(0, curStrPos)) {
1218
+ _this4.stopNum = curStrPos;
1219
+ } else {
1220
+ _this4.stopNum = 0;
1221
+ }
1222
+ }
1223
+
1224
+ // if the number (id of character in current string) is
1225
+ // less than the stop number, keep going
1226
+ if (curStrPos > _this4.stopNum) {
1227
+ // subtract characters one by one
1228
+ curStrPos--;
1229
+ // loop the function
1230
+ _this4.backspace(curString, curStrPos);
1231
+ } else if (curStrPos <= _this4.stopNum) {
1232
+ // if the stop number has been reached, increase
1233
+ // array position to next string
1234
+ _this4.arrayPos++;
1235
+ // When looping, begin at the beginning after backspace complete
1236
+ if (_this4.arrayPos === _this4.strings.length) {
1237
+ _this4.arrayPos = 0;
1238
+ _this4.options.onLastStringBackspaced();
1239
+ _this4.shuffleStringsIfNeeded();
1240
+ _this4.begin();
1241
+ } else {
1242
+ _this4.typewrite(_this4.strings[_this4.sequence[_this4.arrayPos]], curStrPos);
1243
+ }
1244
+ }
1245
+ // humanized value for typing
1246
+ }, humanize);
1247
+ }
1248
+
1249
+ /**
1250
+ * Full animation is complete
1251
+ * @private
1252
+ */
1253
+ }, {
1254
+ key: 'complete',
1255
+ value: function complete() {
1256
+ this.options.onComplete(this);
1257
+ if (this.loop) {
1258
+ this.curLoop++;
1259
+ } else {
1260
+ this.typingComplete = true;
1261
+ }
1262
+ }
1263
+
1264
+ /**
1265
+ * Has the typing been stopped
1266
+ * @param {string} curString the current string in the strings array
1267
+ * @param {number} curStrPos the current position in the curString
1268
+ * @param {boolean} isTyping
1269
+ * @private
1270
+ */
1271
+ }, {
1272
+ key: 'setPauseStatus',
1273
+ value: function setPauseStatus(curString, curStrPos, isTyping) {
1274
+ this.pause.typewrite = isTyping;
1275
+ this.pause.curString = curString;
1276
+ this.pause.curStrPos = curStrPos;
1277
+ }
1278
+
1279
+ /**
1280
+ * Toggle the blinking cursor
1281
+ * @param {boolean} isBlinking
1282
+ * @private
1283
+ */
1284
+ }, {
1285
+ key: 'toggleBlinking',
1286
+ value: function toggleBlinking(isBlinking) {
1287
+ if (!this.cursor) return;
1288
+ // if in paused state, don't toggle blinking a 2nd time
1289
+ if (this.pause.status) return;
1290
+ if (this.cursorBlinking === isBlinking) return;
1291
+ this.cursorBlinking = isBlinking;
1292
+ if (isBlinking) {
1293
+ this.cursor.classList.add('typed-cursor--blink');
1294
+ } else {
1295
+ this.cursor.classList.remove('typed-cursor--blink');
1296
+ }
1297
+ }
1298
+
1299
+ /**
1300
+ * Speed in MS to type
1301
+ * @param {number} speed
1302
+ * @private
1303
+ */
1304
+ }, {
1305
+ key: 'humanizer',
1306
+ value: function humanizer(speed) {
1307
+ return Math.round(Math.random() * speed / 2) + speed;
1308
+ }
1309
+
1310
+ /**
1311
+ * Shuffle the sequence of the strings array
1312
+ * @private
1313
+ */
1314
+ }, {
1315
+ key: 'shuffleStringsIfNeeded',
1316
+ value: function shuffleStringsIfNeeded() {
1317
+ if (!this.shuffle) return;
1318
+ this.sequence = this.sequence.sort(function () {
1319
+ return Math.random() - 0.5;
1320
+ });
1321
+ }
1322
+
1323
+ /**
1324
+ * Adds a CSS class to fade out current string
1325
+ * @private
1326
+ */
1327
+ }, {
1328
+ key: 'initFadeOut',
1329
+ value: function initFadeOut() {
1330
+ var _this5 = this;
1331
+
1332
+ this.el.className += ' ' + this.fadeOutClass;
1333
+ if (this.cursor) this.cursor.className += ' ' + this.fadeOutClass;
1334
+ return setTimeout(function () {
1335
+ _this5.arrayPos++;
1336
+ _this5.replaceText('');
1337
+
1338
+ // Resets current string if end of loop reached
1339
+ if (_this5.strings.length > _this5.arrayPos) {
1340
+ _this5.typewrite(_this5.strings[_this5.sequence[_this5.arrayPos]], 0);
1341
+ } else {
1342
+ _this5.typewrite(_this5.strings[0], 0);
1343
+ _this5.arrayPos = 0;
1344
+ }
1345
+ }, this.fadeOutDelay);
1346
+ }
1347
+
1348
+ /**
1349
+ * Replaces current text in the HTML element
1350
+ * depending on element type
1351
+ * @param {string} str
1352
+ * @private
1353
+ */
1354
+ }, {
1355
+ key: 'replaceText',
1356
+ value: function replaceText(str) {
1357
+ if (this.attr) {
1358
+ this.el.setAttribute(this.attr, str);
1359
+ } else {
1360
+ if (this.isInput) {
1361
+ this.el.value = str;
1362
+ } else if (this.contentType === 'html') {
1363
+ this.el.innerHTML = str;
1364
+ } else {
1365
+ this.el.textContent = str;
1366
+ }
1367
+ }
1368
+ }
1369
+
1370
+ /**
1371
+ * If using input elements, bind focus in order to
1372
+ * start and stop the animation
1373
+ * @private
1374
+ */
1375
+ }, {
1376
+ key: 'bindFocusEvents',
1377
+ value: function bindFocusEvents() {
1378
+ var _this6 = this;
1379
+
1380
+ if (!this.isInput) return;
1381
+ this.el.addEventListener('focus', function (e) {
1382
+ _this6.stop();
1383
+ });
1384
+ this.el.addEventListener('blur', function (e) {
1385
+ if (_this6.el.value && _this6.el.value.length !== 0) {
1386
+ return;
1387
+ }
1388
+ _this6.start();
1389
+ });
1390
+ }
1391
+
1392
+ /**
1393
+ * On init, insert the cursor element
1394
+ * @private
1395
+ */
1396
+ }, {
1397
+ key: 'insertCursor',
1398
+ value: function insertCursor() {
1399
+ if (!this.showCursor) return;
1400
+ if (this.cursor) return;
1401
+ this.cursor = document.createElement('span');
1402
+ this.cursor.className = 'typed-cursor';
1403
+ this.cursor.innerHTML = this.cursorChar;
1404
+ this.el.parentNode && this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling);
1405
+ }
1406
+ }]);
1407
+
1408
+ return Typed;
1409
+ })();
1410
+
1411
+ exports['default'] = Typed;
1412
+ module.exports = exports['default'];
1413
+
1414
+ /***/ }),
1415
+ /* 1 */
1416
+ /***/ (function(module, exports, __webpack_require__) {
1417
+
1418
+ 'use strict';
1419
+
1420
+ Object.defineProperty(exports, '__esModule', {
1421
+ value: true
1422
+ });
1423
+
1424
+ var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
1425
 
1426
+ var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
1427
+
1428
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
1429
+
1430
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
1431
+
1432
+ var _defaultsJs = __webpack_require__(2);
1433
+
1434
+ var _defaultsJs2 = _interopRequireDefault(_defaultsJs);
1435
+
1436
+ /**
1437
+ * Initialize the Typed object
1438
+ */
1439
+
1440
+ var Initializer = (function () {
1441
+ function Initializer() {
1442
+ _classCallCheck(this, Initializer);
1443
+ }
1444
+
1445
+ _createClass(Initializer, [{
1446
+ key: 'load',
1447
 
1448
  /**
1449
+ * Load up defaults & options on the Typed instance
1450
+ * @param {Typed} self instance of Typed
1451
+ * @param {object} options options object
1452
+ * @param {string} elementId HTML element ID _OR_ instance of HTML element
1453
+ * @private
1454
  */
1455
+
1456
+ value: function load(self, options, elementId) {
1457
+ // chosen element to manipulate text
1458
+ if (typeof elementId === 'string') {
1459
+ self.el = document.querySelector(elementId);
 
 
 
1460
  } else {
1461
+ self.el = elementId;
1462
  }
 
 
1463
 
1464
+ self.options = _extends({}, _defaultsJs2['default'], options);
1465
+
1466
+ // attribute to type into
1467
+ self.isInput = self.el.tagName.toLowerCase() === 'input';
1468
+ self.attr = self.options.attr;
1469
+ self.bindInputFocusEvents = self.options.bindInputFocusEvents;
1470
+
1471
+ // show cursor
1472
+ self.showCursor = self.isInput ? false : self.options.showCursor;
1473
+
1474
+ // custom cursor
1475
+ self.cursorChar = self.options.cursorChar;
1476
+
1477
+ // Is the cursor blinking
1478
+ self.cursorBlinking = true;
1479
+
1480
+ // text content of element
1481
+ self.elContent = self.attr ? self.el.getAttribute(self.attr) : self.el.textContent;
1482
+
1483
+ // html or plain text
1484
+ self.contentType = self.options.contentType;
1485
+
1486
+ // typing speed
1487
+ self.typeSpeed = self.options.typeSpeed;
1488
+
1489
+ // add a delay before typing starts
1490
+ self.startDelay = self.options.startDelay;
1491
+
1492
+ // backspacing speed
1493
+ self.backSpeed = self.options.backSpeed;
1494
+
1495
+ // only backspace what doesn't match the previous string
1496
+ self.smartBackspace = self.options.smartBackspace;
1497
+
1498
+ // amount of time to wait before backspacing
1499
+ self.backDelay = self.options.backDelay;
1500
+
1501
+ // Fade out instead of backspace
1502
+ self.fadeOut = self.options.fadeOut;
1503
+ self.fadeOutClass = self.options.fadeOutClass;
1504
+ self.fadeOutDelay = self.options.fadeOutDelay;
1505
+
1506
+ // variable to check whether typing is currently paused
1507
+ self.isPaused = false;
1508
+
1509
+ // input strings of text
1510
+ self.strings = self.options.strings.map(function (s) {
1511
+ return s.trim();
1512
+ });
1513
+
1514
+ // div containing strings
1515
+ if (typeof self.options.stringsElement === 'string') {
1516
+ self.stringsElement = document.querySelector(self.options.stringsElement);
1517
+ } else {
1518
+ self.stringsElement = self.options.stringsElement;
1519
+ }
1520
+
1521
+ if (self.stringsElement) {
1522
+ self.strings = [];
1523
+ self.stringsElement.style.display = 'none';
1524
+ var strings = Array.prototype.slice.apply(self.stringsElement.children);
1525
+ var stringsLength = strings.length;
1526
+
1527
+ if (stringsLength) {
1528
+ for (var i = 0; i < stringsLength; i += 1) {
1529
+ var stringEl = strings[i];
1530
+ self.strings.push(stringEl.innerHTML.trim());
1531
+ }
1532
+ }
1533
+ }
1534
+
1535
+ // character number position of current string
1536
+ self.strPos = 0;
1537
+
1538
+ // current array position
1539
+ self.arrayPos = 0;
1540
+
1541
+ // index of string to stop backspacing on
1542
+ self.stopNum = 0;
1543
+
1544
+ // Looping logic
1545
+ self.loop = self.options.loop;
1546
+ self.loopCount = self.options.loopCount;
1547
+ self.curLoop = 0;
1548
+
1549
+ // shuffle the strings
1550
+ self.shuffle = self.options.shuffle;
1551
+ // the order of strings
1552
+ self.sequence = [];
1553
+
1554
+ self.pause = {
1555
+ status: false,
1556
+ typewrite: true,
1557
+ curString: '',
1558
+ curStrPos: 0
1559
+ };
1560
+
1561
+ // When the typing is complete (when not looped)
1562
+ self.typingComplete = false;
1563
+
1564
+ // Set the order in which the strings are typed
1565
+ for (var i in self.strings) {
1566
+ self.sequence[i] = i;
1567
+ }
1568
+
1569
+ // If there is some text in the element
1570
+ self.currentElContent = this.getCurrentElContent(self);
1571
+
1572
+ self.autoInsertCss = self.options.autoInsertCss;
1573
+
1574
+ this.appendAnimationCss(self);
1575
+ }
1576
  }, {
1577
+ key: 'getCurrentElContent',
1578
+ value: function getCurrentElContent(self) {
1579
+ var elContent = '';
1580
+ if (self.attr) {
1581
+ elContent = self.el.getAttribute(self.attr);
1582
+ } else if (self.isInput) {
1583
+ elContent = self.el.value;
1584
+ } else if (self.contentType === 'html') {
1585
+ elContent = self.el.innerHTML;
1586
+ } else {
1587
+ elContent = self.el.textContent;
1588
+ }
1589
+ return elContent;
1590
  }
 
 
 
 
 
 
1591
  }, {
1592
+ key: 'appendAnimationCss',
1593
+ value: function appendAnimationCss(self) {
1594
+ var cssDataName = 'data-typed-js-css';
1595
+ if (!self.autoInsertCss) {
1596
+ return;
1597
+ }
1598
+ if (!self.showCursor && !self.fadeOut) {
1599
+ return;
1600
+ }
1601
+ if (document.querySelector('[' + cssDataName + ']')) {
1602
+ return;
1603
+ }
1604
 
1605
+ var css = document.createElement('style');
1606
+ css.type = 'text/css';
1607
+ css.setAttribute(cssDataName, true);
1608
+
1609
+ var innerCss = '';
1610
+ if (self.showCursor) {
1611
+ innerCss += '\n .typed-cursor{\n opacity: 1;\n }\n .typed-cursor.typed-cursor--blink{\n animation: typedjsBlink 0.7s infinite;\n -webkit-animation: typedjsBlink 0.7s infinite;\n animation: typedjsBlink 0.7s infinite;\n }\n @keyframes typedjsBlink{\n 50% { opacity: 0.0; }\n }\n @-webkit-keyframes typedjsBlink{\n 0% { opacity: 1; }\n 50% { opacity: 0.0; }\n 100% { opacity: 1; }\n }\n ';
1612
  }
1613
+ if (self.fadeOut) {
1614
+ innerCss += '\n .typed-fade-out{\n opacity: 0;\n transition: opacity .25s;\n }\n .typed-cursor.typed-cursor--blink.typed-fade-out{\n -webkit-animation: 0;\n animation: 0;\n }\n ';
1615
+ }
1616
+ if (css.length === 0) {
1617
+ return;
 
 
1618
  }
1619
+ css.innerHTML = innerCss;
1620
+ document.body.appendChild(css);
1621
  }
1622
+ }]);
1623
+
1624
+ return Initializer;
1625
+ })();
1626
+
1627
+ exports['default'] = Initializer;
1628
+ var initializer = new Initializer();
1629
+ exports.initializer = initializer;
1630
+
1631
+ /***/ }),
1632
+ /* 2 */
1633
+ /***/ (function(module, exports) {
1634
+
1635
+ /**
1636
+ * Defaults & options
1637
+ * @returns {object} Typed defaults & options
1638
+ * @public
1639
+ */
1640
 
1641
+ 'use strict';
 
 
 
 
 
 
 
1642
 
1643
+ Object.defineProperty(exports, '__esModule', {
1644
+ value: true
1645
+ });
1646
+ var defaults = {
1647
+ /**
1648
+ * @property {array} strings strings to be typed
1649
+ * @property {string} stringsElement ID of element containing string children
1650
+ */
1651
+ strings: ['These are the default values...', 'You know what you should do?', 'Use your own!', 'Have a great day!'],
1652
+ stringsElement: null,
 
 
 
 
1653
 
1654
+ /**
1655
+ * @property {number} typeSpeed type speed in milliseconds
1656
+ */
1657
+ typeSpeed: 0,
 
 
 
 
 
 
1658
 
1659
+ /**
1660
+ * @property {number} startDelay time before typing starts in milliseconds
1661
+ */
1662
+ startDelay: 0,
1663
 
1664
+ /**
1665
+ * @property {number} backSpeed backspacing speed in milliseconds
1666
+ */
1667
+ backSpeed: 0,
1668
 
1669
+ /**
1670
+ * @property {boolean} smartBackspace only backspace what doesn't match the previous string
1671
+ */
1672
+ smartBackspace: true,
1673
 
1674
+ /**
1675
+ * @property {boolean} shuffle shuffle the strings
1676
+ */
1677
+ shuffle: false,
1678
 
1679
+ /**
1680
+ * @property {number} backDelay time before backspacing in milliseconds
1681
+ */
1682
+ backDelay: 700,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1683
 
1684
+ /**
1685
+ * @property {boolean} fadeOut Fade out instead of backspace
1686
+ * @property {string} fadeOutClass css class for fade animation
1687
+ * @property {boolean} fadeOutDelay Fade out delay in milliseconds
1688
+ */
1689
+ fadeOut: false,
1690
+ fadeOutClass: 'typed-fade-out',
1691
+ fadeOutDelay: 500,
 
 
 
 
 
 
1692
 
1693
+ /**
1694
+ * @property {boolean} loop loop strings
1695
+ * @property {number} loopCount amount of loops
1696
+ */
1697
+ loop: false,
1698
+ loopCount: Infinity,
1699
 
1700
+ /**
1701
+ * @property {boolean} showCursor show cursor
1702
+ * @property {string} cursorChar character for cursor
1703
+ * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML <head>
1704
+ */
1705
+ showCursor: true,
1706
+ cursorChar: '|',
1707
+ autoInsertCss: true,
 
 
 
 
1708
 
1709
+ /**
1710
+ * @property {string} attr attribute for typing
1711
+ * Ex: input placeholder, value, or just HTML text
1712
+ */
1713
+ attr: null,
1714
 
1715
+ /**
1716
+ * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input
1717
+ */
1718
+ bindInputFocusEvents: false,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1719
 
1720
+ /**
1721
+ * @property {string} contentType 'html' or 'null' for plaintext
1722
+ */
1723
+ contentType: 'html',
 
 
 
 
 
 
1724
 
1725
+ /**
1726
+ * All typing is complete
1727
+ * @param {Typed} self
1728
+ */
1729
+ onComplete: function onComplete(self) {},
 
 
 
 
 
 
 
 
 
 
 
1730
 
1731
+ /**
1732
+ * Before each string is typed
1733
+ * @param {number} arrayPos
1734
+ * @param {Typed} self
1735
+ */
1736
+ preStringTyped: function preStringTyped(arrayPos, self) {},
1737
+
1738
+ /**
1739
+ * After each string is typed
1740
+ * @param {number} arrayPos
1741
+ * @param {Typed} self
1742
+ */
1743
+ onStringTyped: function onStringTyped(arrayPos, self) {},
1744
+
1745
+ /**
1746
+ * During looping, after last string is typed
1747
+ * @param {Typed} self
1748
+ */
1749
+ onLastStringBackspaced: function onLastStringBackspaced(self) {},
1750
 
1751
+ /**
1752
+ * Typing has been stopped
1753
+ * @param {number} arrayPos
1754
+ * @param {Typed} self
1755
+ */
1756
+ onTypingPaused: function onTypingPaused(arrayPos, self) {},
1757
 
1758
+ /**
1759
+ * Typing has been started after being stopped
1760
+ * @param {number} arrayPos
1761
+ * @param {Typed} self
1762
+ */
1763
+ onTypingResumed: function onTypingResumed(arrayPos, self) {},
1764
 
1765
+ /**
1766
+ * After reset
1767
+ * @param {Typed} self
1768
+ */
1769
+ onReset: function onReset(self) {},
1770
 
1771
+ /**
1772
+ * After stop
1773
+ * @param {number} arrayPos
1774
+ * @param {Typed} self
1775
+ */
1776
+ onStop: function onStop(arrayPos, self) {},
 
 
 
 
1777
 
1778
+ /**
1779
+ * After start
1780
+ * @param {number} arrayPos
1781
+ * @param {Typed} self
1782
+ */
1783
+ onStart: function onStart(arrayPos, self) {},
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1784
 
1785
+ /**
1786
+ * After destroy
1787
+ * @param {Typed} self
1788
+ */
1789
+ onDestroy: function onDestroy(self) {}
1790
+ };
 
 
 
 
 
 
 
 
1791
 
1792
+ exports['default'] = defaults;
1793
+ module.exports = exports['default'];
1794
+
1795
+ /***/ }),
1796
+ /* 3 */
1797
+ /***/ (function(module, exports) {
1798
+
 
 
 
 
 
 
 
1799
 
1800
+ /**
1801
+ * TODO: These methods can probably be combined somehow
1802
+ * Parse HTML tags & HTML Characters
1803
+ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1804
 
1805
+ 'use strict';
 
 
 
 
 
 
 
 
 
1806
 
1807
+ Object.defineProperty(exports, '__esModule', {
1808
+ value: true
1809
+ });
 
 
 
 
 
 
 
 
 
1810
 
1811
+ var _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ('value' in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();
 
 
 
 
 
 
 
1812
 
1813
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
 
 
 
 
1814
 
1815
+ var HTMLParser = (function () {
1816
+ function HTMLParser() {
1817
+ _classCallCheck(this, HTMLParser);
1818
+ }
 
 
 
 
 
1819
 
1820
+ _createClass(HTMLParser, [{
1821
+ key: 'typeHtmlChars',
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1822
 
1823
  /**
1824
+ * Type HTML tags & HTML Characters
1825
+ * @param {string} curString Current string
1826
+ * @param {number} curStrPos Position in current string
1827
+ * @param {Typed} self instance of Typed
1828
+ * @returns {number} a new string position
1829
  * @private
1830
  */
 
 
 
 
1831
 
1832
+ value: function typeHtmlChars(curString, curStrPos, self) {
1833
+ if (self.contentType !== 'html') return curStrPos;
1834
+ var curChar = curString.substr(curStrPos).charAt(0);
1835
+ if (curChar === '<' || curChar === '&') {
1836
+ var endTag = '';
1837
+ if (curChar === '<') {
1838
+ endTag = '>';
1839
+ } else {
1840
+ endTag = ';';
1841
  }
1842
+ while (curString.substr(curStrPos + 1).charAt(0) !== endTag) {
1843
+ curStrPos++;
1844
+ if (curStrPos + 1 > curString.length) {
1845
+ break;
1846
+ }
1847
+ }
1848
+ curStrPos++;
1849
+ }
1850
+ return curStrPos;
1851
  }
1852
 
1853
  /**
1854
+ * Backspace HTML tags and HTML Characters
1855
+ * @param {string} curString Current string
1856
+ * @param {number} curStrPos Position in current string
1857
+ * @param {Typed} self instance of Typed
1858
+ * @returns {number} a new string position
1859
  * @private
1860
  */
1861
  }, {
1862
+ key: 'backSpaceHtmlChars',
1863
+ value: function backSpaceHtmlChars(curString, curStrPos, self) {
1864
+ if (self.contentType !== 'html') return curStrPos;
1865
+ var curChar = curString.substr(curStrPos).charAt(0);
1866
+ if (curChar === '>' || curChar === ';') {
1867
+ var endTag = '';
1868
+ if (curChar === '>') {
1869
+ endTag = '<';
1870
+ } else {
1871
+ endTag = '&';
1872
+ }
1873
+ while (curString.substr(curStrPos - 1).charAt(0) !== endTag) {
1874
+ curStrPos--;
1875
+ if (curStrPos < 0) {
1876
+ break;
1877
+ }
1878
+ }
1879
+ curStrPos--;
1880
+ }
1881
+ return curStrPos;
1882
  }
1883
  }]);
1884
 
1885
+ return HTMLParser;
1886
  })();
1887
 
1888
+ exports['default'] = HTMLParser;
1889
+ var htmlParser = new HTMLParser();
1890
+ exports.htmlParser = htmlParser;
1891
+
1892
+ /***/ })
1893
+ /******/ ])
1894
+ });
1895
+ ;
1896
+ /**
1897
+ * author Christopher Blum
1898
+ * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/
1899
+ * - forked from http://github.com/zuk/jquery.inview/
1900
+ */
1901
+ (function (factory) {
1902
+ if (typeof define == 'function' && define.amd) {
1903
+ // AMD
1904
+ define(['jquery'], factory);
1905
+ } else if (typeof exports === 'object') {
1906
+ // Node, CommonJS
1907
+ module.exports = factory(require('jquery'));
1908
+ } else {
1909
+ // Browser globals
1910
+ factory(jQuery);
1911
+ }
1912
+ }(function ($) {
1913
+
1914
+ var inviewObjects = [], viewportSize, viewportOffset,
1915
+ d = document, w = window, documentElement = d.documentElement, timer;
1916
+
1917
+ $.event.special.inview = {
1918
+ add: function (data) {
1919
+ inviewObjects.push({ data: data, $element: $(this), element: this });
1920
+ // Use setInterval in order to also make sure this captures elements within
1921
+ // "overflow:scroll" elements or elements that appeared in the dom tree due to
1922
+ // dom manipulation and reflow
1923
+ // old: $(window).scroll(checkInView);
1924
+ //
1925
+ // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays
1926
+ // intervals while the user scrolls. Therefore the inview event might fire a bit late there
1927
+ //
1928
+ // Don't waste cycles with an interval until we get at least one element that
1929
+ // has bound to the inview event.
1930
+ if (!timer && inviewObjects.length) {
1931
+ timer = setInterval(checkInView, 250);
1932
+ }
1933
+ },
1934
+
1935
+ remove: function (data) {
1936
+ for (var i = 0; i < inviewObjects.length; i++) {
1937
+ var inviewObject = inviewObjects[i];
1938
+ if (inviewObject.element === this && inviewObject.data.guid === data.guid) {
1939
+ inviewObjects.splice(i, 1);
1940
+ break;
1941
+ }
1942
+ }
1943
+
1944
+ // Clear interval when we no longer have any elements listening
1945
+ if (!inviewObjects.length) {
1946
+ clearInterval(timer);
1947
+ timer = null;
1948
+ }
1949
+ }
1950
+ };
1951
+
1952
+ function getViewportSize() {
1953
+ var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth };
1954
+
1955
+ // if this is correct then return it. iPad has compat Mode, so will
1956
+ // go into check clientHeight/clientWidth (which has the wrong value).
1957
+ if (!size.height) {
1958
+ mode = d.compatMode;
1959
+ if (mode || !$.support.boxModel) { // IE, Gecko
1960
+ domObject = mode === 'CSS1Compat' ?
1961
+ documentElement : // Standards
1962
+ d.body; // Quirks
1963
+ size = {
1964
+ height: domObject.clientHeight,
1965
+ width: domObject.clientWidth
1966
+ };
1967
+ }
1968
+ }
1969
+
1970
+ return size;
1971
+ }
1972
+
1973
+ function getViewportOffset() {
1974
+ return {
1975
+ top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop,
1976
+ left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft
1977
+ };
1978
+ }
1979
+
1980
+ function checkInView() {
1981
+ if (!inviewObjects.length) {
1982
+ return;
1983
+ }
1984
+
1985
+ var i = 0, $elements = $.map(inviewObjects, function (inviewObject) {
1986
+ var selector = inviewObject.data.selector,
1987
+ $element = inviewObject.$element;
1988
+ return selector ? $element.find(selector) : $element;
1989
+ });
1990
+
1991
+ viewportSize = viewportSize || getViewportSize();
1992
+ viewportOffset = viewportOffset || getViewportOffset();
1993
+
1994
+ for (; i < inviewObjects.length; i++) {
1995
+ // Ignore elements that are not in the DOM tree
1996
+ if (!$.contains(documentElement, $elements[i][0])) {
1997
+ continue;
1998
+ }
1999
+
2000
+ var $element = $($elements[i]),
2001
+ elementSize = { height: $element[0].offsetHeight, width: $element[0].offsetWidth },
2002
+ elementOffset = $element.offset(),
2003
+ inView = $element.data('inview');
2004
+
2005
+ // Don't ask me why because I haven't figured out yet:
2006
+ // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
2007
+ // Even though it sounds weird:
2008
+ // It seems that the execution of this function is interferred by the onresize/onscroll event
2009
+ // where viewportOffset and viewportSize are unset
2010
+ if (!viewportOffset || !viewportSize) {
2011
+ return;
2012
+ }
2013
+
2014
+ if (elementOffset.top + elementSize.height > viewportOffset.top &&
2015
+ elementOffset.top < viewportOffset.top + viewportSize.height &&
2016
+ elementOffset.left + elementSize.width > viewportOffset.left &&
2017
+ elementOffset.left < viewportOffset.left + viewportSize.width) {
2018
+ if (!inView) {
2019
+ $element.data('inview', true).trigger('inview', [true]);
2020
+ }
2021
+ } else if (inView) {
2022
+ $element.data('inview', false).trigger('inview', [false]);
2023
+ }
2024
+ }
2025
+ }
2026
+
2027
+ $(w).on("scroll resize scrollstop", function () {
2028
+ viewportSize = viewportOffset = null;
2029
+ });
2030
+
2031
+ // IE < 9 scrolls to focused elements without firing the "scroll" event
2032
+ if (!documentElement.addEventListener && documentElement.attachEvent) {
2033
+ documentElement.attachEvent("onfocusin", function () {
2034
+ viewportOffset = null;
2035
+ });
2036
+ }
2037
+ }));
2038
+ /*!
2039
+ * Isotope PACKAGED v3.0.6
2040
+ *
2041
+ * Licensed GPLv3 for open source use
2042
+ * or Isotope Commercial License for commercial use
2043
+ *
2044
+ * https://isotope.metafizzy.co
2045
+ * Copyright 2010-2018 Metafizzy
2046
+ */
2047
+
2048
+ /**
2049
+ * Bridget makes jQuery widgets
2050
+ * v2.0.1
2051
+ * MIT license
2052
+ */
2053
+
2054
+ /* jshint browser: true, strict: true, undef: true, unused: true */
2055
+
2056
+ ( function( window, factory ) {
2057
+ // universal module definition
2058
+ /*jshint strict: false */ /* globals define, module, require */
2059
+ if ( typeof define == 'function' && define.amd ) {
2060
+ // AMD
2061
+ define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {
2062
+ return factory( window, jQuery );
2063
+ });
2064
+ } else if ( typeof module == 'object' && module.exports ) {
2065
+ // CommonJS
2066
+ module.exports = factory(
2067
+ window,
2068
+ require('jquery')
2069
+ );
2070
+ } else {
2071
+ // browser global
2072
+ window.jQueryBridget = factory(
2073
+ window,
2074
+ window.jQuery
2075
+ );
2076
+ }
2077
+
2078
+ }( window, function factory( window, jQuery ) {
2079
+ 'use strict';
2080
+
2081
+ // ----- utils ----- //
2082
+
2083
+ var arraySlice = Array.prototype.slice;
2084
+
2085
+ // helper function for logging errors
2086
+ // $.error breaks jQuery chaining
2087
+ var console = window.console;
2088
+ var logError = typeof console == 'undefined' ? function() {} :
2089
+ function( message ) {
2090
+ console.error( message );
2091
+ };
2092
+
2093
+ // ----- jQueryBridget ----- //
2094
+
2095
+ function jQueryBridget( namespace, PluginClass, $ ) {
2096
+ $ = $ || jQuery || window.jQuery;
2097
+ if ( !$ ) {
2098
+ return;
2099
+ }
2100
+
2101
+ // add option method -> $().plugin('option', {...})
2102
+ if ( !PluginClass.prototype.option ) {
2103
+ // option setter
2104
+ PluginClass.prototype.option = function( opts ) {
2105
+ // bail out if not an object
2106
+ if ( !$.isPlainObject( opts ) ){
2107
+ return;
2108
+ }
2109
+ this.options = $.extend( true, this.options, opts );
2110
+ };
2111
+ }
2112
+
2113
+ // make jQuery plugin
2114
+ $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {
2115
+ if ( typeof arg0 == 'string' ) {
2116
+ // method call $().plugin( 'methodName', { options } )
2117
+ // shift arguments by 1
2118
+ var args = arraySlice.call( arguments, 1 );
2119
+ return methodCall( this, arg0, args );
2120
+ }
2121
+ // just $().plugin({ options })
2122
+ plainCall( this, arg0 );
2123
+ return this;
2124
+ };
2125
+
2126
+ // $().plugin('methodName')
2127
+ function methodCall( $elems, methodName, args ) {
2128
+ var returnValue;
2129
+ var pluginMethodStr = '$().' + namespace + '("' + methodName + '")';
2130
+
2131
+ $elems.each( function( i, elem ) {
2132
+ // get instance
2133
+ var instance = $.data( elem, namespace );
2134
+ if ( !instance ) {
2135
+ logError( namespace + ' not initialized. Cannot call methods, i.e. ' +
2136
+ pluginMethodStr );
2137
+ return;
2138
+ }
2139
+
2140
+ var method = instance[ methodName ];
2141
+ if ( !method || methodName.charAt(0) == '_' ) {
2142
+ logError( pluginMethodStr + ' is not a valid method' );
2143
+ return;
2144
+ }
2145
+
2146
+ // apply method, get return value
2147
+ var value = method.apply( instance, args );
2148
+ // set return value if value is returned, use only first value
2149
+ returnValue = returnValue === undefined ? value : returnValue;
2150
+ });
2151
+
2152
+ return returnValue !== undefined ? returnValue : $elems;
2153
+ }
2154
+
2155
+ function plainCall( $elems, options ) {
2156
+ $elems.each( function( i, elem ) {
2157
+ var instance = $.data( elem, namespace );
2158
+ if ( instance ) {
2159
+ // set options & init
2160
+ instance.option( options );
2161
+ instance._init();
2162
+ } else {
2163
+ // initialize new instance
2164
+ instance = new PluginClass( elem, options );
2165
+ $.data( elem, namespace, instance );
2166
+ }
2167
+ });
2168
+ }
2169
+
2170
+ updateJQuery( $ );
2171
+
2172
+ }
2173
+
2174
+ // ----- updateJQuery ----- //
2175
+
2176
+ // set $.bridget for v1 backwards compatibility
2177
+ function updateJQuery( $ ) {
2178
+ if ( !$ || ( $ && $.bridget ) ) {
2179
+ return;
2180
+ }
2181
+ $.bridget = jQueryBridget;
2182
+ }
2183
+
2184
+ updateJQuery( jQuery || window.jQuery );
2185
+
2186
+ // ----- ----- //
2187
+
2188
+ return jQueryBridget;
2189
+
2190
+ }));
2191
+
2192
+ /**
2193
+ * EvEmitter v1.1.0
2194
+ * Lil' event emitter
2195
+ * MIT License
2196
+ */
2197
+
2198
+ /* jshint unused: true, undef: true, strict: true */
2199
+
2200
+ ( function( global, factory ) {
2201
+ // universal module definition
2202
+ /* jshint strict: false */ /* globals define, module, window */
2203
+ if ( typeof define == 'function' && define.amd ) {
2204
+ // AMD - RequireJS
2205
+ define( 'ev-emitter/ev-emitter',factory );
2206
+ } else if ( typeof module == 'object' && module.exports ) {
2207
+ // CommonJS - Browserify, Webpack
2208
+ module.exports = factory();
2209
+ } else {
2210
+ // Browser globals
2211
+ global.EvEmitter = factory();
2212
+ }
2213
+
2214
+ }( typeof window != 'undefined' ? window : this, function() {
2215
+
2216
+
2217
+
2218
+ function EvEmitter() {}
2219
+
2220
+ var proto = EvEmitter.prototype;
2221
+
2222
+ proto.on = function( eventName, listener ) {
2223
+ if ( !eventName || !listener ) {
2224
+ return;
2225
+ }
2226
+ // set events hash
2227
+ var events = this._events = this._events || {};
2228
+ // set listeners array
2229
+ var listeners = events[ eventName ] = events[ eventName ] || [];
2230
+ // only add once
2231
+ if ( listeners.indexOf( listener ) == -1 ) {
2232
+ listeners.push( listener );
2233
+ }
2234
+
2235
+ return this;
2236
+ };
2237
+
2238
+ proto.once = function( eventName, listener ) {
2239
+ if ( !eventName || !listener ) {
2240
+ return;
2241
+ }
2242
+ // add event
2243
+ this.on( eventName, listener );
2244
+ // set once flag
2245
+ // set onceEvents hash
2246
+ var onceEvents = this._onceEvents = this._onceEvents || {};
2247
+ // set onceListeners object
2248
+ var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
2249
+ // set flag
2250
+ onceListeners[ listener ] = true;
2251
+
2252
+ return this;
2253
+ };
2254
+
2255
+ proto.off = function( eventName, listener ) {
2256
+ var listeners = this._events && this._events[ eventName ];
2257
+ if ( !listeners || !listeners.length ) {
2258
+ return;
2259
+ }
2260
+ var index = listeners.indexOf( listener );
2261
+ if ( index != -1 ) {
2262
+ listeners.splice( index, 1 );
2263
+ }
2264
+
2265
+ return this;
2266
+ };
2267
+
2268
+ proto.emitEvent = function( eventName, args ) {
2269
+ var listeners = this._events && this._events[ eventName ];
2270
+ if ( !listeners || !listeners.length ) {
2271
+ return;
2272
+ }
2273
+ // copy over to avoid interference if .off() in listener
2274
+ listeners = listeners.slice(0);
2275
+ args = args || [];
2276
+ // once stuff
2277
+ var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
2278
+
2279
+ for ( var i=0; i < listeners.length; i++ ) {
2280
+ var listener = listeners[i]
2281
+ var isOnce = onceListeners && onceListeners[ listener ];
2282
+ if ( isOnce ) {
2283
+ // remove listener
2284
+ // remove before trigger to prevent recursion
2285
+ this.off( eventName, listener );
2286
+ // unset once flag
2287
+ delete onceListeners[ listener ];
2288
+ }
2289
+ // trigger listener
2290
+ listener.apply( this, args );
2291
+ }
2292
+
2293
+ return this;
2294
+ };
2295
+
2296
+ proto.allOff = function() {
2297
+ delete this._events;
2298
+ delete this._onceEvents;
2299
+ };
2300
+
2301
+ return EvEmitter;
2302
+
2303
+ }));
2304
+
2305
+ /*!
2306
+ * getSize v2.0.3
2307
+ * measure size of elements
2308
+ * MIT license
2309
+ */
2310
+
2311
+ /* jshint browser: true, strict: true, undef: true, unused: true */
2312
+ /* globals console: false */
2313
+
2314
+ ( function( window, factory ) {
2315
+ /* jshint strict: false */ /* globals define, module */
2316
+ if ( typeof define == 'function' && define.amd ) {
2317
+ // AMD
2318
+ define( 'get-size/get-size',factory );
2319
+ } else if ( typeof module == 'object' && module.exports ) {
2320
+ // CommonJS
2321
+ module.exports = factory();
2322
+ } else {
2323
+ // browser global
2324
+ window.getSize = factory();
2325
+ }
2326
+
2327
+ })( window, function factory() {
2328
+ 'use strict';
2329
+
2330
+ // -------------------------- helpers -------------------------- //
2331
+
2332
+ // get a number from a string, not a percentage
2333
+ function getStyleSize( value ) {
2334
+ var num = parseFloat( value );
2335
+ // not a percent like '100%', and a number
2336
+ var isValid = value.indexOf('%') == -1 && !isNaN( num );
2337
+ return isValid && num;
2338
+ }
2339
+
2340
+ function noop() {}
2341
+
2342
+ var logError = typeof console == 'undefined' ? noop :
2343
+ function( message ) {
2344
+ console.error( message );
2345
+ };
2346
+
2347
+ // -------------------------- measurements -------------------------- //
2348
+
2349
+ var measurements = [
2350
+ 'paddingLeft',
2351
+ 'paddingRight',
2352
+ 'paddingTop',
2353
+ 'paddingBottom',
2354
+ 'marginLeft',
2355
+ 'marginRight',
2356
+ 'marginTop',
2357
+ 'marginBottom',
2358
+ 'borderLeftWidth',
2359
+ 'borderRightWidth',
2360
+ 'borderTopWidth',
2361
+ 'borderBottomWidth'
2362
+ ];
2363
+
2364
+ var measurementsLength = measurements.length;
2365
+
2366
+ function getZeroSize() {
2367
+ var size = {
2368
+ width: 0,
2369
+ height: 0,
2370
+ innerWidth: 0,
2371
+ innerHeight: 0,
2372
+ outerWidth: 0,
2373
+ outerHeight: 0
2374
+ };
2375
+ for ( var i=0; i < measurementsLength; i++ ) {
2376
+ var measurement = measurements[i];
2377
+ size[ measurement ] = 0;
2378
+ }
2379
+ return size;
2380
+ }
2381
+
2382
+ // -------------------------- getStyle -------------------------- //
2383
+
2384
+ /**
2385
+ * getStyle, get style of element, check for Firefox bug
2386
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
2387
+ */
2388
+ function getStyle( elem ) {
2389
+ var style = getComputedStyle( elem );
2390
+ if ( !style ) {
2391
+ logError( 'Style returned ' + style +
2392
+ '. Are you running this code in a hidden iframe on Firefox? ' +
2393
+ 'See https://bit.ly/getsizebug1' );
2394
+ }
2395
+ return style;
2396
+ }
2397
+
2398
+ // -------------------------- setup -------------------------- //
2399
+
2400
+ var isSetup = false;
2401
+
2402
+ var isBoxSizeOuter;
2403
+
2404
+ /**
2405
+ * setup
2406
+ * check isBoxSizerOuter
2407
+ * do on first getSize() rather than on page load for Firefox bug
2408
+ */
2409
+ function setup() {
2410
+ // setup once
2411
+ if ( isSetup ) {
2412
+ return;
2413
+ }
2414
+ isSetup = true;
2415
+
2416
+ // -------------------------- box sizing -------------------------- //
2417
+
2418
+ /**
2419
+ * Chrome & Safari measure the outer-width on style.width on border-box elems
2420
+ * IE11 & Firefox<29 measures the inner-width
2421
+ */
2422
+ var div = document.createElement('div');
2423
+ div.style.width = '200px';
2424
+ div.style.padding = '1px 2px 3px 4px';
2425
+ div.style.borderStyle = 'solid';
2426
+ div.style.borderWidth = '1px 2px 3px 4px';
2427
+ div.style.boxSizing = 'border-box';
2428
+
2429
+ var body = document.body || document.documentElement;
2430
+ body.appendChild( div );
2431
+ var style = getStyle( div );
2432
+ // round value for browser zoom. desandro/masonry#928
2433
+ isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;
2434
+ getSize.isBoxSizeOuter = isBoxSizeOuter;
2435
+
2436
+ body.removeChild( div );
2437
+ }
2438
+
2439
+ // -------------------------- getSize -------------------------- //
2440
+
2441
+ function getSize( elem ) {
2442
+ setup();
2443
+
2444
+ // use querySeletor if elem is string
2445
+ if ( typeof elem == 'string' ) {
2446
+ elem = document.querySelector( elem );
2447
+ }
2448
+
2449
+ // do not proceed on non-objects
2450
+ if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
2451
+ return;
2452
+ }
2453
+
2454
+ var style = getStyle( elem );
2455
+
2456
+ // if hidden, everything is 0
2457
+ if ( style.display == 'none' ) {
2458
+ return getZeroSize();
2459
+ }
2460
+
2461
+ var size = {};
2462
+ size.width = elem.offsetWidth;
2463
+ size.height = elem.offsetHeight;
2464
+
2465
+ var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';
2466
+
2467
+ // get all measurements
2468
+ for ( var i=0; i < measurementsLength; i++ ) {
2469
+ var measurement = measurements[i];
2470
+ var value = style[ measurement ];
2471
+ var num = parseFloat( value );
2472
+ // any 'auto', 'medium' value will be 0
2473
+ size[ measurement ] = !isNaN( num ) ? num : 0;
2474
+ }
2475
+
2476
+ var paddingWidth = size.paddingLeft + size.paddingRight;
2477
+ var paddingHeight = size.paddingTop + size.paddingBottom;
2478
+ var marginWidth = size.marginLeft + size.marginRight;
2479
+ var marginHeight = size.marginTop + size.marginBottom;
2480
+ var borderWidth = size.borderLeftWidth + size.borderRightWidth;
2481
+ var borderHeight = size.borderTopWidth + size.borderBottomWidth;
2482
+
2483
+ var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
2484
+
2485
+ // overwrite width and height if we can get it from style
2486
+ var styleWidth = getStyleSize( style.width );
2487
+ if ( styleWidth !== false ) {
2488
+ size.width = styleWidth +
2489
+ // add padding and border unless it's already including it
2490
+ ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
2491
+ }
2492
+
2493
+ var styleHeight = getStyleSize( style.height );
2494
+ if ( styleHeight !== false ) {
2495
+ size.height = styleHeight +
2496
+ // add padding and border unless it's already including it
2497
+ ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
2498
+ }
2499
+
2500
+ size.innerWidth = size.width - ( paddingWidth + borderWidth );
2501
+ size.innerHeight = size.height - ( paddingHeight + borderHeight );
2502
+
2503
+ size.outerWidth = size.width + marginWidth;
2504
+ size.outerHeight = size.height + marginHeight;
2505
+
2506
+ return size;
2507
+ }
2508
+
2509
+ return getSize;
2510
+
2511
+ });
2512
+
2513
+ /**
2514
+ * matchesSelector v2.0.2
2515
+ * matchesSelector( element, '.selector' )
2516
+ * MIT license
2517
+ */
2518
+
2519
+ /*jshint browser: true, strict: true, undef: true, unused: true */
2520
+
2521
+ ( function( window, factory ) {
2522
+ /*global define: false, module: false */
2523
+ 'use strict';
2524
+ // universal module definition
2525
+ if ( typeof define == 'function' && define.amd ) {
2526
+ // AMD
2527
+ define( 'desandro-matches-selector/matches-selector',factory );
2528
+ } else if ( typeof module == 'object' && module.exports ) {
2529
+ // CommonJS
2530
+ module.exports = factory();
2531
+ } else {
2532
+ // browser global
2533
+ window.matchesSelector = factory();
2534
+ }
2535
+
2536
+ }( window, function factory() {
2537
+ 'use strict';
2538
+
2539
+ var matchesMethod = ( function() {
2540
+ var ElemProto = window.Element.prototype;
2541
+ // check for the standard method name first
2542
+ if ( ElemProto.matches ) {
2543
+ return 'matches';
2544
+ }
2545
+ // check un-prefixed
2546
+ if ( ElemProto.matchesSelector ) {
2547
+ return 'matchesSelector';
2548
+ }
2549
+ // check vendor prefixes
2550
+ var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];
2551
+
2552
+ for ( var i=0; i < prefixes.length; i++ ) {
2553
+ var prefix = prefixes[i];
2554
+ var method = prefix + 'MatchesSelector';
2555
+ if ( ElemProto[ method ] ) {
2556
+ return method;
2557
+ }
2558
+ }
2559
+ })();
2560
+
2561
+ return function matchesSelector( elem, selector ) {
2562
+ return elem[ matchesMethod ]( selector );
2563
+ };
2564
+
2565
+ }));
2566
+
2567
+ /**
2568
+ * Fizzy UI utils v2.0.7
2569
+ * MIT license
2570
+ */
2571
+
2572
+ /*jshint browser: true, undef: true, unused: true, strict: true */
2573
+
2574
+ ( function( window, factory ) {
2575
+ // universal module definition
2576
+ /*jshint strict: false */ /*globals define, module, require */
2577
+
2578
+ if ( typeof define == 'function' && define.amd ) {
2579
+ // AMD
2580
+ define( 'fizzy-ui-utils/utils',[
2581
+ 'desandro-matches-selector/matches-selector'
2582
+ ], function( matchesSelector ) {
2583
+ return factory( window, matchesSelector );
2584
+ });
2585
+ } else if ( typeof module == 'object' && module.exports ) {
2586
+ // CommonJS
2587
+ module.exports = factory(
2588
+ window,
2589
+ require('desandro-matches-selector')
2590
+ );
2591
+ } else {
2592
+ // browser global
2593
+ window.fizzyUIUtils = factory(
2594
+ window,
2595
+ window.matchesSelector
2596
+ );
2597
+ }
2598
+
2599
+ }( window, function factory( window, matchesSelector ) {
2600
+
2601
+
2602
+
2603
+ var utils = {};
2604
+
2605
+ // ----- extend ----- //
2606
+
2607
+ // extends objects
2608
+ utils.extend = function( a, b ) {
2609
+ for ( var prop in b ) {
2610
+ a[ prop ] = b[ prop ];
2611
+ }
2612
+ return a;
2613
+ };
2614
+
2615
+ // ----- modulo ----- //
2616
+
2617
+ utils.modulo = function( num, div ) {
2618
+ return ( ( num % div ) + div ) % div;
2619
+ };
2620
+
2621
+ // ----- makeArray ----- //
2622
+
2623
+ var arraySlice = Array.prototype.slice;
2624
+
2625
+ // turn element or nodeList into an array
2626
+ utils.makeArray = function( obj ) {
2627
+ if ( Array.isArray( obj ) ) {
2628
+ // use object if already an array
2629
+ return obj;
2630
+ }
2631
+ // return empty array if undefined or null. #6
2632
+ if ( obj === null || obj === undefined ) {
2633
+ return [];
2634
+ }
2635
+
2636
+ var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
2637
+ if ( isArrayLike ) {
2638
+ // convert nodeList to array
2639
+ return arraySlice.call( obj );
2640
+ }
2641
+
2642
+ // array of single index
2643
+ return [ obj ];
2644
+ };
2645
+
2646
+ // ----- removeFrom ----- //
2647
+
2648
+ utils.removeFrom = function( ary, obj ) {
2649
+ var index = ary.indexOf( obj );
2650
+ if ( index != -1 ) {
2651
+ ary.splice( index, 1 );
2652
+ }
2653
+ };
2654
+
2655
+ // ----- getParent ----- //
2656
+
2657
+ utils.getParent = function( elem, selector ) {
2658
+ while ( elem.parentNode && elem != document.body ) {
2659
+ elem = elem.parentNode;
2660
+ if ( matchesSelector( elem, selector ) ) {
2661
+ return elem;
2662
+ }
2663
+ }
2664
+ };
2665
+
2666
+ // ----- getQueryElement ----- //
2667
+
2668
+ // use element as selector string
2669
+ utils.getQueryElement = function( elem ) {
2670
+ if ( typeof elem == 'string' ) {
2671
+ return document.querySelector( elem );
2672
+ }
2673
+ return elem;
2674
+ };
2675
+
2676
+ // ----- handleEvent ----- //
2677
+
2678
+ // enable .ontype to trigger from .addEventListener( elem, 'type' )
2679
+ utils.handleEvent = function( event ) {
2680
+ var method = 'on' + event.type;
2681
+ if ( this[ method ] ) {
2682
+ this[ method ]( event );
2683
+ }
2684
+ };
2685
+
2686
+ // ----- filterFindElements ----- //
2687
+
2688
+ utils.filterFindElements = function( elems, selector ) {
2689
+ // make array of elems
2690
+ elems = utils.makeArray( elems );
2691
+ var ffElems = [];
2692
+
2693
+ elems.forEach( function( elem ) {
2694
+ // check that elem is an actual element
2695
+ if ( !( elem instanceof HTMLElement ) ) {
2696
+ return;
2697
+ }
2698
+ // add elem if no selector
2699
+ if ( !selector ) {
2700
+ ffElems.push( elem );
2701
+ return;
2702
+ }
2703
+ // filter & find items if we have a selector
2704
+ // filter
2705
+ if ( matchesSelector( elem, selector ) ) {
2706
+ ffElems.push( elem );
2707
+ }
2708
+ // find children
2709
+ var childElems = elem.querySelectorAll( selector );
2710
+ // concat childElems to filterFound array
2711
+ for ( var i=0; i < childElems.length; i++ ) {
2712
+ ffElems.push( childElems[i] );
2713
+ }
2714
+ });
2715
+
2716
+ return ffElems;
2717
+ };
2718
+
2719
+ // ----- debounceMethod ----- //
2720
+
2721
+ utils.debounceMethod = function( _class, methodName, threshold ) {
2722
+ threshold = threshold || 100;
2723
+ // original method
2724
+ var method = _class.prototype[ methodName ];
2725
+ var timeoutName = methodName + 'Timeout';
2726
+
2727
+ _class.prototype[ methodName ] = function() {
2728
+ var timeout = this[ timeoutName ];
2729
+ clearTimeout( timeout );
2730
+
2731
+ var args = arguments;
2732
+ var _this = this;
2733
+ this[ timeoutName ] = setTimeout( function() {
2734
+ method.apply( _this, args );
2735
+ delete _this[ timeoutName ];
2736
+ }, threshold );
2737
+ };
2738
+ };
2739
+
2740
+ // ----- docReady ----- //
2741
+
2742
+ utils.docReady = function( callback ) {
2743
+ var readyState = document.readyState;
2744
+ if ( readyState == 'complete' || readyState == 'interactive' ) {
2745
+ // do async to allow for other scripts to run. metafizzy/flickity#441
2746
+ setTimeout( callback );
2747
+ } else {
2748
+ document.addEventListener( 'DOMContentLoaded', callback );
2749
+ }
2750
+ };
2751
+
2752
+ // ----- htmlInit ----- //
2753
+
2754
+ // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
2755
+ utils.toDashed = function( str ) {
2756
+ return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
2757
+ return $1 + '-' + $2;
2758
+ }).toLowerCase();
2759
+ };
2760
+
2761
+ var console = window.console;
2762
+ /**
2763
+ * allow user to initialize classes via [data-namespace] or .js-namespace class
2764
+ * htmlInit( Widget, 'widgetName' )
2765
+ * options are parsed from data-namespace-options
2766
+ */
2767
+ utils.htmlInit = function( WidgetClass, namespace ) {
2768
+ utils.docReady( function() {
2769
+ var dashedNamespace = utils.toDashed( namespace );
2770
+ var dataAttr = 'data-' + dashedNamespace;
2771
+ var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
2772
+ var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
2773
+ var elems = utils.makeArray( dataAttrElems )
2774
+ .concat( utils.makeArray( jsDashElems ) );
2775
+ var dataOptionsAttr = dataAttr + '-options';
2776
+ var jQuery = window.jQuery;
2777
+
2778
+ elems.forEach( function( elem ) {
2779
+ var attr = elem.getAttribute( dataAttr ) ||
2780
+ elem.getAttribute( dataOptionsAttr );
2781
+ var options;
2782
+ try {
2783
+ options = attr && JSON.parse( attr );
2784
+ } catch ( error ) {
2785
+ // log error, do not initialize
2786
+ if ( console ) {
2787
+ console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
2788
+ ': ' + error );
2789
+ }
2790
+ return;
2791
+ }
2792
+ // initialize
2793
+ var instance = new WidgetClass( elem, options );
2794
+ // make available via $().data('namespace')
2795
+ if ( jQuery ) {
2796
+ jQuery.data( elem, namespace, instance );
2797
+ }
2798
+ });
2799
+
2800
+ });
2801
+ };
2802
+
2803
+ // ----- ----- //
2804
+
2805
+ return utils;
2806
+
2807
+ }));
2808
+
2809
+ /**
2810
+ * Outlayer Item
2811
+ */
2812
+
2813
+ ( function( window, factory ) {
2814
+ // universal module definition
2815
+ /* jshint strict: false */ /* globals define, module, require */
2816
+ if ( typeof define == 'function' && define.amd ) {
2817
+ // AMD - RequireJS
2818
+ define( 'outlayer/item',[
2819
+ 'ev-emitter/ev-emitter',
2820
+ 'get-size/get-size'
2821
+ ],
2822
+ factory
2823
+ );
2824
+ } else if ( typeof module == 'object' && module.exports ) {
2825
+ // CommonJS - Browserify, Webpack
2826
+ module.exports = factory(
2827
+ require('ev-emitter'),
2828
+ require('get-size')
2829
+ );
2830
+ } else {
2831
+ // browser global
2832
+ window.Outlayer = {};
2833
+ window.Outlayer.Item = factory(
2834
+ window.EvEmitter,
2835
+ window.getSize
2836
+ );
2837
+ }
2838
+
2839
+ }( window, function factory( EvEmitter, getSize ) {
2840
+ 'use strict';
2841
+
2842
+ // ----- helpers ----- //
2843
+
2844
+ function isEmptyObj( obj ) {
2845
+ for ( var prop in obj ) {
2846
+ return false;
2847
+ }
2848
+ prop = null;
2849
+ return true;
2850
+ }
2851
+
2852
+ // -------------------------- CSS3 support -------------------------- //
2853
+
2854
+
2855
+ var docElemStyle = document.documentElement.style;
2856
+
2857
+ var transitionProperty = typeof docElemStyle.transition == 'string' ?
2858
+ 'transition' : 'WebkitTransition';
2859
+ var transformProperty = typeof docElemStyle.transform == 'string' ?
2860
+ 'transform' : 'WebkitTransform';
2861
+
2862
+ var transitionEndEvent = {
2863
+ WebkitTransition: 'webkitTransitionEnd',
2864
+ transition: 'transitionend'
2865
+ }[ transitionProperty ];
2866
+
2867
+ // cache all vendor properties that could have vendor prefix
2868
+ var vendorProperties = {
2869
+ transform: transformProperty,
2870
+ transition: transitionProperty,
2871
+ transitionDuration: transitionProperty + 'Duration',
2872
+ transitionProperty: transitionProperty + 'Property',
2873
+ transitionDelay: transitionProperty + 'Delay'
2874
+ };
2875
+
2876
+ // -------------------------- Item -------------------------- //
2877
+
2878
+ function Item( element, layout ) {
2879
+ if ( !element ) {
2880
+ return;
2881
+ }
2882
+
2883
+ this.element = element;
2884
+ // parent layout class, i.e. Masonry, Isotope, or Packery
2885
+ this.layout = layout;
2886
+ this.position = {
2887
+ x: 0,
2888
+ y: 0
2889
+ };
2890
+
2891
+ this._create();
2892
+ }
2893
+
2894
+ // inherit EvEmitter
2895
+ var proto = Item.prototype = Object.create( EvEmitter.prototype );
2896
+ proto.constructor = Item;
2897
+
2898
+ proto._create = function() {
2899
+ // transition objects
2900
+ this._transn = {
2901
+ ingProperties: {},
2902
+ clean: {},
2903
+ onEnd: {}
2904
+ };
2905
+
2906
+ this.css({
2907
+ position: 'absolute'
2908
+ });
2909
+ };
2910
+
2911
+ // trigger specified handler for event type
2912
+ proto.handleEvent = function( event ) {
2913
+ var method = 'on' + event.type;
2914
+ if ( this[ method ] ) {
2915
+ this[ method ]( event );
2916
+ }
2917
+ };
2918
+
2919
+ proto.getSize = function() {
2920
+ this.size = getSize( this.element );
2921
+ };
2922
+
2923
+ /**
2924
+ * apply CSS styles to element
2925
+ * @param {Object} style
2926
+ */
2927
+ proto.css = function( style ) {
2928
+ var elemStyle = this.element.style;
2929
+
2930
+ for ( var prop in style ) {
2931
+ // use vendor property if available
2932
+ var supportedProp = vendorProperties[ prop ] || prop;
2933
+ elemStyle[ supportedProp ] = style[ prop ];
2934
+ }
2935
+ };
2936
+
2937
+ // measure position, and sets it
2938
+ proto.getPosition = function() {
2939
+ var style = getComputedStyle( this.element );
2940
+ var isOriginLeft = this.layout._getOption('originLeft');
2941
+ var isOriginTop = this.layout._getOption('originTop');
2942
+ var xValue = style[ isOriginLeft ? 'left' : 'right' ];
2943
+ var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
2944
+ var x = parseFloat( xValue );
2945
+ var y = parseFloat( yValue );
2946
+ // convert percent to pixels
2947
+ var layoutSize = this.layout.size;
2948
+ if ( xValue.indexOf('%') != -1 ) {
2949
+ x = ( x / 100 ) * layoutSize.width;
2950
+ }
2951
+ if ( yValue.indexOf('%') != -1 ) {
2952
+ y = ( y / 100 ) * layoutSize.height;
2953
+ }
2954
+ // clean up 'auto' or other non-integer values
2955
+ x = isNaN( x ) ? 0 : x;
2956
+ y = isNaN( y ) ? 0 : y;
2957
+ // remove padding from measurement
2958
+ x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
2959
+ y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
2960
+
2961
+ this.position.x = x;
2962
+ this.position.y = y;
2963
+ };
2964
+
2965
+ // set settled position, apply padding
2966
+ proto.layoutPosition = function() {
2967
+ var layoutSize = this.layout.size;
2968
+ var style = {};
2969
+ var isOriginLeft = this.layout._getOption('originLeft');
2970
+ var isOriginTop = this.layout._getOption('originTop');
2971
+
2972
+ // x
2973
+ var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
2974
+ var xProperty = isOriginLeft ? 'left' : 'right';
2975
+ var xResetProperty = isOriginLeft ? 'right' : 'left';
2976
+
2977
+ var x = this.position.x + layoutSize[ xPadding ];
2978
+ // set in percentage or pixels
2979
+ style[ xProperty ] = this.getXValue( x );
2980
+ // reset other property
2981
+ style[ xResetProperty ] = '';
2982
+
2983
+ // y
2984
+ var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
2985
+ var yProperty = isOriginTop ? 'top' : 'bottom';
2986
+ var yResetProperty = isOriginTop ? 'bottom' : 'top';
2987
+
2988
+ var y = this.position.y + layoutSize[ yPadding ];
2989
+ // set in percentage or pixels
2990
+ style[ yProperty ] = this.getYValue( y );
2991
+ // reset other property
2992
+ style[ yResetProperty ] = '';
2993
+
2994
+ this.css( style );
2995
+ this.emitEvent( 'layout', [ this ] );
2996
+ };
2997
+
2998
+ proto.getXValue = function( x ) {
2999
+ var isHorizontal = this.layout._getOption('horizontal');
3000
+ return this.layout.options.percentPosition && !isHorizontal ?
3001
+ ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
3002
+ };
3003
+
3004
+ proto.getYValue = function( y ) {
3005
+ var isHorizontal = this.layout._getOption('horizontal');
3006
+ return this.layout.options.percentPosition && isHorizontal ?
3007
+ ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
3008
+ };
3009
+
3010
+ proto._transitionTo = function( x, y ) {
3011
+ this.getPosition();
3012
+ // get current x & y from top/left
3013
+ var curX = this.position.x;
3014
+ var curY = this.position.y;
3015
+
3016
+ var didNotMove = x == this.position.x && y == this.position.y;
3017
+
3018
+ // save end position
3019
+ this.setPosition( x, y );
3020
+
3021
+ // if did not move and not transitioning, just go to layout
3022
+ if ( didNotMove && !this.isTransitioning ) {
3023
+ this.layoutPosition();
3024
+ return;
3025
+ }
3026
+
3027
+ var transX = x - curX;
3028
+ var transY = y - curY;
3029
+ var transitionStyle = {};
3030
+ transitionStyle.transform = this.getTranslate( transX, transY );
3031
+
3032
+ this.transition({
3033
+ to: transitionStyle,
3034
+ onTransitionEnd: {
3035
+ transform: this.layoutPosition
3036
+ },
3037
+ isCleaning: true
3038
+ });
3039
+ };
3040
+
3041
+ proto.getTranslate = function( x, y ) {
3042
+ // flip cooridinates if origin on right or bottom
3043
+ var isOriginLeft = this.layout._getOption('originLeft');
3044
+ var isOriginTop = this.layout._getOption('originTop');
3045
+ x = isOriginLeft ? x : -x;
3046
+ y = isOriginTop ? y : -y;
3047
+ return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
3048
+ };
3049
+
3050
+ // non transition + transform support
3051
+ proto.goTo = function( x, y ) {
3052
+ this.setPosition( x, y );
3053
+ this.layoutPosition();
3054
+ };
3055
+
3056
+ proto.moveTo = proto._transitionTo;
3057
+
3058
+ proto.setPosition = function( x, y ) {
3059
+ this.position.x = parseFloat( x );
3060
+ this.position.y = parseFloat( y );
3061
+ };
3062
+
3063
+ // ----- transition ----- //
3064
+
3065
+ /**
3066
+ * @param {Object} style - CSS
3067
+ * @param {Function} onTransitionEnd
3068
+ */
3069
+
3070
+ // non transition, just trigger callback
3071
+ proto._nonTransition = function( args ) {
3072
+ this.css( args.to );
3073
+ if ( args.isCleaning ) {
3074
+ this._removeStyles( args.to );
3075
+ }
3076
+ for ( var prop in args.onTransitionEnd ) {
3077
+ args.onTransitionEnd[ prop ].call( this );
3078
+ }
3079
+ };
3080
+
3081
+ /**
3082
+ * proper transition
3083
+ * @param {Object} args - arguments
3084
+ * @param {Object} to - style to transition to
3085
+ * @param {Object} from - style to start transition from
3086
+ * @param {Boolean} isCleaning - removes transition styles after transition
3087
+ * @param {Function} onTransitionEnd - callback
3088
+ */
3089
+ proto.transition = function( args ) {
3090
+ // redirect to nonTransition if no transition duration
3091
+ if ( !parseFloat( this.layout.options.transitionDuration ) ) {
3092
+ this._nonTransition( args );
3093
+ return;
3094
+ }
3095
+
3096
+ var _transition = this._transn;
3097
+ // keep track of onTransitionEnd callback by css property
3098
+ for ( var prop in args.onTransitionEnd ) {
3099
+ _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
3100
+ }
3101
+ // keep track of properties that are transitioning
3102
+ for ( prop in args.to ) {
3103
+ _transition.ingProperties[ prop ] = true;
3104
+ // keep track of properties to clean up when transition is done
3105
+ if ( args.isCleaning ) {
3106
+ _transition.clean[ prop ] = true;
3107
+ }
3108
+ }
3109
+
3110
+ // set from styles
3111
+ if ( args.from ) {
3112
+ this.css( args.from );
3113
+ // force redraw. http://blog.alexmaccaw.com/css-transitions
3114
+ var h = this.element.offsetHeight;
3115
+ // hack for JSHint to hush about unused var
3116
+ h = null;
3117
+ }
3118
+ // enable transition
3119
+ this.enableTransition( args.to );
3120
+ // set styles that are transitioning
3121
+ this.css( args.to );
3122
+
3123
+ this.isTransitioning = true;
3124
+
3125
+ };
3126
+
3127
+ // dash before all cap letters, including first for
3128
+ // WebkitTransform => -webkit-transform
3129
+ function toDashedAll( str ) {
3130
+ return str.replace( /([A-Z])/g, function( $1 ) {
3131
+ return '-' + $1.toLowerCase();
3132
+ });
3133
+ }
3134
+
3135
+ var transitionProps = 'opacity,' + toDashedAll( transformProperty );
3136
+
3137
+ proto.enableTransition = function(/* style */) {
3138
+ // HACK changing transitionProperty during a transition
3139
+ // will cause transition to jump
3140
+ if ( this.isTransitioning ) {
3141
+ return;
3142
+ }
3143
+
3144
+ // make `transition: foo, bar, baz` from style object
3145
+ // HACK un-comment this when enableTransition can work
3146
+ // while a transition is happening
3147
+ // var transitionValues = [];
3148
+ // for ( var prop in style ) {
3149
+ // // dash-ify camelCased properties like WebkitTransition
3150
+ // prop = vendorProperties[ prop ] || prop;
3151
+ // transitionValues.push( toDashedAll( prop ) );
3152
+ // }
3153
+ // munge number to millisecond, to match stagger
3154
+ var duration = this.layout.options.transitionDuration;
3155
+ duration = typeof duration == 'number' ? duration + 'ms' : duration;
3156
+ // enable transition styles
3157
+ this.css({
3158
+ transitionProperty: transitionProps,
3159
+ transitionDuration: duration,
3160
+ transitionDelay: this.staggerDelay || 0
3161
+ });
3162
+ // listen for transition end event
3163
+ this.element.addEventListener( transitionEndEvent, this, false );
3164
+ };
3165
+
3166
+ // ----- events ----- //
3167
+
3168
+ proto.onwebkitTransitionEnd = function( event ) {
3169
+ this.ontransitionend( event );
3170
+ };
3171
+
3172
+ proto.onotransitionend = function( event ) {
3173
+ this.ontransitionend( event );
3174
+ };
3175
+
3176
+ // properties that I munge to make my life easier
3177
+ var dashedVendorProperties = {
3178
+ '-webkit-transform': 'transform'
3179
+ };
3180
+
3181
+ proto.ontransitionend = function( event ) {
3182
+ // disregard bubbled events from children
3183
+ if ( event.target !== this.element ) {
3184
+ return;
3185
+ }
3186
+ var _transition = this._transn;
3187
+ // get property name of transitioned property, convert to prefix-free
3188
+ var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;
3189
+
3190
+ // remove property that has completed transitioning
3191
+ delete _transition.ingProperties[ propertyName ];
3192
+ // check if any properties are still transitioning
3193
+ if ( isEmptyObj( _transition.ingProperties ) ) {
3194
+ // all properties have completed transitioning
3195
+ this.disableTransition();
3196
+ }
3197
+ // clean style
3198
+ if ( propertyName in _transition.clean ) {
3199
+ // clean up style
3200
+ this.element.style[ event.propertyName ] = '';
3201
+ delete _transition.clean[ propertyName ];
3202
+ }
3203
+ // trigger onTransitionEnd callback
3204
+ if ( propertyName in _transition.onEnd ) {
3205
+ var onTransitionEnd = _transition.onEnd[ propertyName ];
3206
+ onTransitionEnd.call( this );
3207
+ delete _transition.onEnd[ propertyName ];
3208
+ }
3209
+
3210
+ this.emitEvent( 'transitionEnd', [ this ] );
3211
+ };
3212
+
3213
+ proto.disableTransition = function() {
3214
+ this.removeTransitionStyles();
3215
+ this.element.removeEventListener( transitionEndEvent, this, false );
3216
+ this.isTransitioning = false;
3217
+ };
3218
+
3219
+ /**
3220
+ * removes style property from element
3221
+ * @param {Object} style
3222
+ **/
3223
+ proto._removeStyles = function( style ) {
3224
+ // clean up transition styles
3225
+ var cleanStyle = {};
3226
+ for ( var prop in style ) {
3227
+ cleanStyle[ prop ] = '';
3228
+ }
3229
+ this.css( cleanStyle );
3230
+ };
3231
+
3232
+ var cleanTransitionStyle = {
3233
+ transitionProperty: '',
3234
+ transitionDuration: '',
3235
+ transitionDelay: ''
3236
+ };
3237
+
3238
+ proto.removeTransitionStyles = function() {
3239
+ // remove transition
3240
+ this.css( cleanTransitionStyle );
3241
+ };
3242
+
3243
+ // ----- stagger ----- //
3244
+
3245
+ proto.stagger = function( delay ) {
3246
+ delay = isNaN( delay ) ? 0 : delay;
3247
+ this.staggerDelay = delay + 'ms';
3248
+ };
3249
+
3250
+ // ----- show/hide/remove ----- //
3251
+
3252
+ // remove element from DOM
3253
+ proto.removeElem = function() {
3254
+ this.element.parentNode.removeChild( this.element );
3255
+ // remove display: none
3256
+ this.css({ display: '' });
3257
+ this.emitEvent( 'remove', [ this ] );
3258
+ };
3259
+
3260
+ proto.remove = function() {
3261
+ // just remove element if no transition support or no transition
3262
+ if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {
3263
+ this.removeElem();
3264
+ return;
3265
+ }
3266
+
3267
+ // start transition
3268
+ this.once( 'transitionEnd', function() {
3269
+ this.removeElem();
3270
+ });
3271
+ this.hide();
3272
+ };
3273
+
3274
+ proto.reveal = function() {
3275
+ delete this.isHidden;
3276
+ // remove display: none
3277
+ this.css({ display: '' });
3278
+
3279
+ var options = this.layout.options;
3280
+
3281
+ var onTransitionEnd = {};
3282
+ var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
3283
+ onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;
3284
+
3285
+ this.transition({
3286
+ from: options.hiddenStyle,
3287
+ to: options.visibleStyle,
3288
+ isCleaning: true,
3289
+ onTransitionEnd: onTransitionEnd
3290
+ });
3291
+ };
3292
+
3293
+ proto.onRevealTransitionEnd = function() {
3294
+ // check if still visible
3295
+ // during transition, item may have been hidden
3296
+ if ( !this.isHidden ) {
3297
+ this.emitEvent('reveal');
3298
+ }
3299
+ };
3300
+
3301
+ /**
3302
+ * get style property use for hide/reveal transition end
3303
+ * @param {String} styleProperty - hiddenStyle/visibleStyle
3304
+ * @returns {String}
3305
+ */
3306
+ proto.getHideRevealTransitionEndProperty = function( styleProperty ) {
3307
+ var optionStyle = this.layout.options[ styleProperty ];
3308
+ // use opacity
3309
+ if ( optionStyle.opacity ) {
3310
+ return 'opacity';
3311
+ }
3312
+ // get first property
3313
+ for ( var prop in optionStyle ) {
3314
+ return prop;
3315
+ }
3316
+ };
3317
+
3318
+ proto.hide = function() {
3319
+ // set flag
3320
+ this.isHidden = true;
3321
+ // remove display: none
3322
+ this.css({ display: '' });
3323
+
3324
+ var options = this.layout.options;
3325
+
3326
+ var onTransitionEnd = {};
3327
+ var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
3328
+ onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;
3329
+
3330
+ this.transition({
3331
+ from: options.visibleStyle,
3332
+ to: options.hiddenStyle,
3333
+ // keep hidden stuff hidden
3334
+ isCleaning: true,
3335
+ onTransitionEnd: onTransitionEnd
3336
+ });
3337
+ };
3338
+
3339
+ proto.onHideTransitionEnd = function() {
3340
+ // check if still hidden
3341
+ // during transition, item may have been un-hidden
3342
+ if ( this.isHidden ) {
3343
+ this.css({ display: 'none' });
3344
+ this.emitEvent('hide');
3345
+ }
3346
+ };
3347
+
3348
+ proto.destroy = function() {
3349
+ this.css({
3350
+ position: '',
3351
+ left: '',
3352
+ right: '',
3353
+ top: '',
3354
+ bottom: '',
3355
+ transition: '',
3356
+ transform: ''
3357
+ });
3358
+ };
3359
+
3360
+ return Item;
3361
+
3362
+ }));
3363
+
3364
+ /*!
3365
+ * Outlayer v2.1.1
3366
+ * the brains and guts of a layout library
3367
+ * MIT license
3368
+ */
3369
+
3370
+ ( function( window, factory ) {
3371
+ 'use strict';
3372
+ // universal module definition
3373
+ /* jshint strict: false */ /* globals define, module, require */
3374
+ if ( typeof define == 'function' && define.amd ) {
3375
+ // AMD - RequireJS
3376
+ define( 'outlayer/outlayer',[
3377
+ 'ev-emitter/ev-emitter',
3378
+ 'get-size/get-size',
3379
+ 'fizzy-ui-utils/utils',
3380
+ './item'
3381
+ ],
3382
+ function( EvEmitter, getSize, utils, Item ) {
3383
+ return factory( window, EvEmitter, getSize, utils, Item);
3384
+ }
3385
+ );
3386
+ } else if ( typeof module == 'object' && module.exports ) {
3387
+ // CommonJS - Browserify, Webpack
3388
+ module.exports = factory(
3389
+ window,
3390
+ require('ev-emitter'),
3391
+ require('get-size'),
3392
+ require('fizzy-ui-utils'),
3393
+ require('./item')
3394
+ );
3395
+ } else {
3396
+ // browser global
3397
+ window.Outlayer = factory(
3398
+ window,
3399
+ window.EvEmitter,
3400
+ window.getSize,
3401
+ window.fizzyUIUtils,
3402
+ window.Outlayer.Item
3403
+ );
3404
+ }
3405
+
3406
+ }( window, function factory( window, EvEmitter, getSize, utils, Item ) {
3407
+ 'use strict';
3408
+
3409
+ // ----- vars ----- //
3410
+
3411
+ var console = window.console;
3412
+ var jQuery = window.jQuery;
3413
+ var noop = function() {};
3414
+
3415
+ // -------------------------- Outlayer -------------------------- //
3416
+
3417
+ // globally unique identifiers
3418
+ var GUID = 0;
3419
+ // internal store of all Outlayer intances
3420
+ var instances = {};
3421
+
3422
+
3423
+ /**
3424
+ * @param {Element, String} element
3425
+ * @param {Object} options
3426
+ * @constructor
3427
+ */
3428
+ function Outlayer( element, options ) {
3429
+ var queryElement = utils.getQueryElement( element );
3430
+ if ( !queryElement ) {
3431
+ if ( console ) {
3432
+ console.error( 'Bad element for ' + this.constructor.namespace +
3433
+ ': ' + ( queryElement || element ) );
3434
+ }
3435
+ return;
3436
+ }
3437
+ this.element = queryElement;
3438
+ // add jQuery
3439
+ if ( jQuery ) {
3440
+ this.$element = jQuery( this.element );
3441
+ }
3442
+
3443
+ // options
3444
+ this.options = utils.extend( {}, this.constructor.defaults );
3445
+ this.option( options );
3446
+
3447
+ // add id for Outlayer.getFromElement
3448
+ var id = ++GUID;
3449
+ this.element.outlayerGUID = id; // expando
3450
+ instances[ id ] = this; // associate via id
3451
+
3452
+ // kick it off
3453
+ this._create();
3454
+
3455
+ var isInitLayout = this._getOption('initLayout');
3456
+ if ( isInitLayout ) {
3457
+ this.layout();
3458
+ }
3459
+ }
3460
+
3461
+ // settings are for internal use only
3462
+ Outlayer.namespace = 'outlayer';
3463
+ Outlayer.Item = Item;
3464
+
3465
+ // default options
3466
+ Outlayer.defaults = {
3467
+ containerStyle: {
3468
+ position: 'relative'
3469
+ },
3470
+ initLayout: true,
3471
+ originLeft: true,
3472
+ originTop: true,
3473
+ resize: true,
3474
+ resizeContainer: true,
3475
+ // item options
3476
+ transitionDuration: '0.4s',
3477
+ hiddenStyle: {
3478
+ opacity: 0,
3479
+ transform: 'scale(0.001)'
3480
+ },
3481
+ visibleStyle: {
3482
+ opacity: 1,
3483
+ transform: 'scale(1)'
3484
+ }
3485
+ };
3486
+
3487
+ var proto = Outlayer.prototype;
3488
+ // inherit EvEmitter
3489
+ utils.extend( proto, EvEmitter.prototype );
3490
+
3491
+ /**
3492
+ * set options
3493
+ * @param {Object} opts
3494
+ */
3495
+ proto.option = function( opts ) {
3496
+ utils.extend( this.options, opts );
3497
+ };
3498
+
3499
+ /**
3500
+ * get backwards compatible option value, check old name
3501
+ */
3502
+ proto._getOption = function( option ) {
3503
+ var oldOption = this.constructor.compatOptions[ option ];
3504
+ return oldOption && this.options[ oldOption ] !== undefined ?
3505
+ this.options[ oldOption ] : this.options[ option ];
3506
+ };
3507
+
3508
+ Outlayer.compatOptions = {
3509
+ // currentName: oldName
3510
+ initLayout: 'isInitLayout',
3511
+ horizontal: 'isHorizontal',
3512
+ layoutInstant: 'isLayoutInstant',
3513
+ originLeft: 'isOriginLeft',
3514
+ originTop: 'isOriginTop',
3515
+ resize: 'isResizeBound',
3516
+ resizeContainer: 'isResizingContainer'
3517
+ };
3518
+
3519
+ proto._create = function() {
3520
+ // get items from children
3521
+ this.reloadItems();
3522
+ // elements that affect layout, but are not laid out
3523
+ this.stamps = [];
3524
+ this.stamp( this.options.stamp );
3525
+ // set container style
3526
+ utils.extend( this.element.style, this.options.containerStyle );
3527
+
3528
+ // bind resize method
3529
+ var canBindResize = this._getOption('resize');
3530
+ if ( canBindResize ) {
3531
+ this.bindResize();
3532
+ }
3533
+ };
3534
+
3535
+ // goes through all children again and gets bricks in proper order
3536
+ proto.reloadItems = function() {
3537
+ // collection of item elements
3538
+ this.items = this._itemize( this.element.children );
3539
+ };
3540
+
3541
+
3542
+ /**
3543
+ * turn elements into Outlayer.Items to be used in layout
3544
+ * @param {Array or NodeList or HTMLElement} elems
3545
+ * @returns {Array} items - collection of new Outlayer Items
3546
+ */
3547
+ proto._itemize = function( elems ) {
3548
+
3549
+ var itemElems = this._filterFindItemElements( elems );
3550
+ var Item = this.constructor.Item;
3551
+
3552
+ // create new Outlayer Items for collection
3553
+ var items = [];
3554
+ for ( var i=0; i < itemElems.length; i++ ) {
3555
+ var elem = itemElems[i];
3556
+ var item = new Item( elem, this );
3557
+ items.push( item );
3558
+ }
3559
+
3560
+ return items;
3561
+ };
3562
+
3563
+ /**
3564
+ * get item elements to be used in layout
3565
+ * @param {Array or NodeList or HTMLElement} elems
3566
+ * @returns {Array} items - item elements
3567
+ */
3568
+ proto._filterFindItemElements = function( elems ) {
3569
+ return utils.filterFindElements( elems, this.options.itemSelector );
3570
+ };
3571
+
3572
+ /**
3573
+ * getter method for getting item elements
3574
+ * @returns {Array} elems - collection of item elements
3575
+ */
3576
+ proto.getItemElements = function() {
3577
+ return this.items.map( function( item ) {
3578
+ return item.element;
3579
+ });
3580
+ };
3581
+
3582
+ // ----- init & layout ----- //
3583
+
3584
+ /**
3585
+ * lays out all items
3586
+ */
3587
+ proto.layout = function() {
3588
+ this._resetLayout();
3589
+ this._manageStamps();
3590
+
3591
+ // don't animate first layout
3592
+ var layoutInstant = this._getOption('layoutInstant');
3593
+ var isInstant = layoutInstant !== undefined ?
3594
+ layoutInstant : !this._isLayoutInited;
3595
+ this.layoutItems( this.items, isInstant );
3596
+
3597
+ // flag for initalized
3598
+ this._isLayoutInited = true;
3599
+ };
3600
+
3601
+ // _init is alias for layout
3602
+ proto._init = proto.layout;
3603
+
3604
+ /**
3605
+ * logic before any new layout
3606
+ */
3607
+ proto._resetLayout = function() {
3608
+ this.getSize();
3609
+ };
3610
+
3611
+
3612
+ proto.getSize = function() {
3613
+ this.size = getSize( this.element );
3614
+ };
3615
+
3616
+ /**
3617
+ * get measurement from option, for columnWidth, rowHeight, gutter
3618
+ * if option is String -> get element from selector string, & get size of element
3619
+ * if option is Element -> get size of element
3620
+ * else use option as a number
3621
+ *
3622
+ * @param {String} measurement
3623
+ * @param {String} size - width or height
3624
+ * @private
3625
+ */
3626
+ proto._getMeasurement = function( measurement, size ) {
3627
+ var option = this.options[ measurement ];
3628
+ var elem;
3629
+ if ( !option ) {
3630
+ // default to 0
3631
+ this[ measurement ] = 0;
3632
+ } else {
3633
+ // use option as an element
3634
+ if ( typeof option == 'string' ) {
3635
+ elem = this.element.querySelector( option );
3636
+ } else if ( option instanceof HTMLElement ) {
3637
+ elem = option;
3638
+ }
3639
+ // use size of element, if element
3640
+ this[ measurement ] = elem ? getSize( elem )[ size ] : option;
3641
+ }
3642
+ };
3643
+
3644
+ /**
3645
+ * layout a collection of item elements
3646
+ * @api public
3647
+ */
3648
+ proto.layoutItems = function( items, isInstant ) {
3649
+ items = this._getItemsForLayout( items );
3650
+
3651
+ this._layoutItems( items, isInstant );
3652
+
3653
+ this._postLayout();
3654
+ };
3655
+
3656
+ /**
3657
+ * get the items to be laid out
3658
+ * you may want to skip over some items
3659
+ * @param {Array} items
3660
+ * @returns {Array} items
3661
+ */
3662
+ proto._getItemsForLayout = function( items ) {
3663
+ return items.filter( function( item ) {
3664
+ return !item.isIgnored;
3665
+ });
3666
+ };
3667
+
3668
+ /**
3669
+ * layout items
3670
+ * @param {Array} items
3671
+ * @param {Boolean} isInstant
3672
+ */
3673
+ proto._layoutItems = function( items, isInstant ) {
3674
+ this._emitCompleteOnItems( 'layout', items );
3675
+
3676
+ if ( !items || !items.length ) {
3677
+ // no items, emit event with empty array
3678
+ return;
3679
+ }
3680
+
3681
+ var queue = [];
3682
+
3683
+ items.forEach( function( item ) {
3684
+ // get x/y object from method
3685
+ var position = this._getItemLayoutPosition( item );
3686
+ // enqueue
3687
+ position.item = item;
3688
+ position.isInstant = isInstant || item.isLayoutInstant;
3689
+ queue.push( position );
3690
+ }, this );
3691
+
3692
+ this._processLayoutQueue( queue );
3693
+ };
3694
+
3695
+ /**
3696
+ * get item layout position
3697
+ * @param {Outlayer.Item} item
3698
+ * @returns {Object} x and y position
3699
+ */
3700
+ proto._getItemLayoutPosition = function( /* item */ ) {
3701
+ return {
3702
+ x: 0,
3703
+ y: 0
3704
+ };
3705
+ };
3706
+
3707
+ /**
3708
+ * iterate over array and position each item
3709
+ * Reason being - separating this logic prevents 'layout invalidation'
3710
+ * thx @paul_irish
3711
+ * @param {Array} queue
3712
+ */
3713
+ proto._processLayoutQueue = function( queue ) {
3714
+ this.updateStagger();
3715
+ queue.forEach( function( obj, i ) {
3716
+ this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );
3717
+ }, this );
3718
+ };
3719
+
3720
+ // set stagger from option in milliseconds number
3721
+ proto.updateStagger = function() {
3722
+ var stagger = this.options.stagger;
3723
+ if ( stagger === null || stagger === undefined ) {
3724
+ this.stagger = 0;
3725
+ return;
3726
+ }
3727
+ this.stagger = getMilliseconds( stagger );
3728
+ return this.stagger;
3729
+ };
3730
+
3731
+ /**
3732
+ * Sets position of item in DOM
3733
+ * @param {Outlayer.Item} item
3734
+ * @param {Number} x - horizontal position
3735
+ * @param {Number} y - vertical position
3736
+ * @param {Boolean} isInstant - disables transitions
3737
+ */
3738
+ proto._positionItem = function( item, x, y, isInstant, i ) {
3739
+ if ( isInstant ) {
3740
+ // if not transition, just set CSS
3741
+ item.goTo( x, y );
3742
+ } else {
3743
+ item.stagger( i * this.stagger );
3744
+ item.moveTo( x, y );
3745
+ }
3746
+ };
3747
+
3748
+ /**
3749
+ * Any logic you want to do after each layout,
3750
+ * i.e. size the container
3751
+ */
3752
+ proto._postLayout = function() {
3753
+ this.resizeContainer();
3754
+ };
3755
+
3756
+ proto.resizeContainer = function() {
3757
+ var isResizingContainer = this._getOption('resizeContainer');
3758
+ if ( !isResizingContainer ) {
3759
+ return;
3760
+ }
3761
+ var size = this._getContainerSize();
3762
+ if ( size ) {
3763
+ this._setContainerMeasure( size.width, true );
3764
+ this._setContainerMeasure( size.height, false );
3765
+ }
3766
+ };
3767
+
3768
+ /**
3769
+ * Sets width or height of container if returned
3770
+ * @returns {Object} size
3771
+ * @param {Number} width
3772
+ * @param {Number} height
3773
+ */
3774
+ proto._getContainerSize = noop;
3775
+
3776
+ /**
3777
+ * @param {Number} measure - size of width or height
3778
+ * @param {Boolean} isWidth
3779
+ */
3780
+ proto._setContainerMeasure = function( measure, isWidth ) {
3781
+ if ( measure === undefined ) {
3782
+ return;
3783
+ }
3784
+
3785
+ var elemSize = this.size;
3786
+ // add padding and border width if border box
3787
+ if ( elemSize.isBorderBox ) {
3788
+ measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
3789
+ elemSize.borderLeftWidth + elemSize.borderRightWidth :
3790
+ elemSize.paddingBottom + elemSize.paddingTop +
3791
+ elemSize.borderTopWidth + elemSize.borderBottomWidth;
3792
+ }
3793
+
3794
+ measure = Math.max( measure, 0 );
3795
+ this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';
3796
+ };
3797
+
3798
+ /**
3799
+ * emit eventComplete on a collection of items events
3800
+ * @param {String} eventName
3801
+ * @param {Array} items - Outlayer.Items
3802
+ */
3803
+ proto._emitCompleteOnItems = function( eventName, items ) {
3804
+ var _this = this;
3805
+ function onComplete() {
3806
+ _this.dispatchEvent( eventName + 'Complete', null, [ items ] );
3807
+ }
3808
+
3809
+ var count = items.length;
3810
+ if ( !items || !count ) {
3811
+ onComplete();
3812
+ return;
3813
+ }
3814
+
3815
+ var doneCount = 0;
3816
+ function tick() {
3817
+ doneCount++;
3818
+ if ( doneCount == count ) {
3819
+ onComplete();
3820
+ }
3821
+ }
3822
+
3823
+ // bind callback
3824
+ items.forEach( function( item ) {
3825
+ item.once( eventName, tick );
3826
+ });
3827
+ };
3828
+
3829
+ /**
3830
+ * emits events via EvEmitter and jQuery events
3831
+ * @param {String} type - name of event
3832
+ * @param {Event} event - original event
3833
+ * @param {Array} args - extra arguments
3834
+ */
3835
+ proto.dispatchEvent = function( type, event, args ) {
3836
+ // add original event to arguments
3837
+ var emitArgs = event ? [ event ].concat( args ) : args;
3838
+ this.emitEvent( type, emitArgs );
3839
+
3840
+ if ( jQuery ) {
3841
+ // set this.$element
3842
+ this.$element = this.$element || jQuery( this.element );
3843
+ if ( event ) {
3844
+ // create jQuery event
3845
+ var $event = jQuery.Event( event );
3846
+ $event.type = type;
3847
+ this.$element.trigger( $event, args );
3848
+ } else {
3849
+ // just trigger with type if no event available
3850
+ this.$element.trigger( type, args );
3851
+ }
3852
+ }
3853
+ };
3854
+
3855
+ // -------------------------- ignore & stamps -------------------------- //
3856
+
3857
+
3858
+ /**
3859
+ * keep item in collection, but do not lay it out
3860
+ * ignored items do not get skipped in layout
3861
+ * @param {Element} elem
3862
+ */
3863
+ proto.ignore = function( elem ) {
3864
+ var item = this.getItem( elem );
3865
+ if ( item ) {
3866
+ item.isIgnored = true;
3867
+ }
3868
+ };
3869
+
3870
+ /**
3871
+ * return item to layout collection
3872
+ * @param {Element} elem
3873
+ */
3874
+ proto.unignore = function( elem ) {
3875
+ var item = this.getItem( elem );
3876
+ if ( item ) {
3877
+ delete item.isIgnored;
3878
+ }
3879
+ };
3880
+
3881
+ /**
3882
+ * adds elements to stamps
3883
+ * @param {NodeList, Array, Element, or String} elems
3884
+ */
3885
+ proto.stamp = function( elems ) {
3886
+ elems = this._find( elems );
3887
+ if ( !elems ) {
3888
+ return;
3889
+ }
3890
+
3891
+ this.stamps = this.stamps.concat( elems );
3892
+ // ignore
3893
+ elems.forEach( this.ignore, this );
3894
+ };
3895
+
3896
+ /**
3897
+ * removes elements to stamps
3898
+ * @param {NodeList, Array, or Element} elems
3899
+ */
3900
+ proto.unstamp = function( elems ) {
3901
+ elems = this._find( elems );
3902
+ if ( !elems ){
3903
+ return;
3904
+ }
3905
+
3906
+ elems.forEach( function( elem ) {
3907
+ // filter out removed stamp elements
3908
+ utils.removeFrom( this.stamps, elem );
3909
+ this.unignore( elem );
3910
+ }, this );
3911
+ };
3912
+
3913
+ /**
3914
+ * finds child elements
3915
+ * @param {NodeList, Array, Element, or String} elems
3916
+ * @returns {Array} elems
3917
+ */
3918
+ proto._find = function( elems ) {
3919
+ if ( !elems ) {
3920
+ return;
3921
+ }
3922
+ // if string, use argument as selector string
3923
+ if ( typeof elems == 'string' ) {
3924
+ elems = this.element.querySelectorAll( elems );
3925
+ }
3926
+ elems = utils.makeArray( elems );
3927
+ return elems;
3928
+ };
3929
+
3930
+ proto._manageStamps = function() {
3931
+ if ( !this.stamps || !this.stamps.length ) {
3932
+ return;
3933
+ }
3934
+
3935
+ this._getBoundingRect();
3936
+
3937
+ this.stamps.forEach( this._manageStamp, this );
3938
+ };
3939
+
3940
+ // update boundingLeft / Top
3941
+ proto._getBoundingRect = function() {
3942
+ // get bounding rect for container element
3943
+ var boundingRect = this.element.getBoundingClientRect();
3944
+ var size = this.size;
3945
+ this._boundingRect = {
3946
+ left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
3947
+ top: boundingRect.top + size.paddingTop + size.borderTopWidth,
3948
+ right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),
3949
+ bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )
3950
+ };
3951
+ };
3952
+
3953
+ /**
3954
+ * @param {Element} stamp
3955
+ **/
3956
+ proto._manageStamp = noop;
3957
+
3958
+ /**
3959
+ * get x/y position of element relative to container element
3960
+ * @param {Element} elem
3961
+ * @returns {Object} offset - has left, top, right, bottom
3962
+ */
3963
+ proto._getElementOffset = function( elem ) {
3964
+ var boundingRect = elem.getBoundingClientRect();
3965
+ var thisRect = this._boundingRect;
3966
+ var size = getSize( elem );
3967
+ var offset = {
3968
+ left: boundingRect.left - thisRect.left - size.marginLeft,
3969
+ top: boundingRect.top - thisRect.top - size.marginTop,
3970
+ right: thisRect.right - boundingRect.right - size.marginRight,
3971
+ bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
3972
+ };
3973
+ return offset;
3974
+ };
3975
+
3976
+ // -------------------------- resize -------------------------- //
3977
+
3978
+ // enable event handlers for listeners
3979
+ // i.e. resize -> onresize
3980
+ proto.handleEvent = utils.handleEvent;
3981
+
3982
+ /**
3983
+ * Bind layout to window resizing
3984
+ */
3985
+ proto.bindResize = function() {
3986
+ window.addEventListener( 'resize', this );
3987
+ this.isResizeBound = true;
3988
+ };
3989
+
3990
+ /**
3991
+ * Unbind layout to window resizing
3992
+ */
3993
+ proto.unbindResize = function() {
3994
+ window.removeEventListener( 'resize', this );
3995
+ this.isResizeBound = false;
3996
+ };
3997
+
3998
+ proto.onresize = function() {
3999
+ this.resize();
4000
+ };
4001
+
4002
+ utils.debounceMethod( Outlayer, 'onresize', 100 );
4003
+
4004
+ proto.resize = function() {
4005
+ // don't trigger if size did not change
4006
+ // or if resize was unbound. See #9
4007
+ if ( !this.isResizeBound || !this.needsResizeLayout() ) {
4008
+ return;
4009
+ }
4010
+
4011
+ this.layout();
4012
+ };
4013
+
4014
+ /**
4015
+ * check if layout is needed post layout
4016
+ * @returns Boolean
4017
+ */
4018
+ proto.needsResizeLayout = function() {
4019
+ var size = getSize( this.element );
4020
+ // check that this.size and size are there
4021
+ // IE8 triggers resize on body size change, so they might not be
4022
+ var hasSizes = this.size && size;
4023
+ return hasSizes && size.innerWidth !== this.size.innerWidth;
4024
+ };
4025
+
4026
+ // -------------------------- methods -------------------------- //
4027
+
4028
+ /**
4029
+ * add items to Outlayer instance
4030
+ * @param {Array or NodeList or Element} elems
4031
+ * @returns {Array} items - Outlayer.Items
4032
+ **/
4033
+ proto.addItems = function( elems ) {
4034
+ var items = this._itemize( elems );
4035
+ // add items to collection
4036
+ if ( items.length ) {
4037
+ this.items = this.items.concat( items );
4038
+ }
4039
+ return items;
4040
+ };
4041
+
4042
+ /**
4043
+ * Layout newly-appended item elements
4044
+ * @param {Array or NodeList or Element} elems
4045
+ */
4046
+ proto.appended = function( elems ) {
4047
+ var items = this.addItems( elems );
4048
+ if ( !items.length ) {
4049
+ return;
4050
+ }
4051
+ // layout and reveal just the new items
4052
+ this.layoutItems( items, true );
4053
+ this.reveal( items );
4054
+ };
4055
+
4056
+ /**
4057
+ * Layout prepended elements
4058
+ * @param {Array or NodeList or Element} elems
4059
+ */
4060
+ proto.prepended = function( elems ) {
4061
+ var items = this._itemize( elems );
4062
+ if ( !items.length ) {
4063
+ return;
4064
+ }
4065
+ // add items to beginning of collection
4066
+ var previousItems = this.items.slice(0);
4067
+ this.items = items.concat( previousItems );
4068
+ // start new layout
4069
+ this._resetLayout();
4070
+ this._manageStamps();
4071
+ // layout new stuff without transition
4072
+ this.layoutItems( items, true );
4073
+ this.reveal( items );
4074
+ // layout previous items
4075
+ this.layoutItems( previousItems );
4076
+ };
4077
+
4078
+ /**
4079
+ * reveal a collection of items
4080
+ * @param {Array of Outlayer.Items} items
4081
+ */
4082
+ proto.reveal = function( items ) {
4083
+ this._emitCompleteOnItems( 'reveal', items );
4084
+ if ( !items || !items.length ) {
4085
+ return;
4086
+ }
4087
+ var stagger = this.updateStagger();
4088
+ items.forEach( function( item, i ) {
4089
+ item.stagger( i * stagger );
4090
+ item.reveal();
4091
+ });
4092
+ };
4093
+
4094
+ /**
4095
+ * hide a collection of items
4096
+ * @param {Array of Outlayer.Items} items
4097
+ */
4098
+ proto.hide = function( items ) {
4099
+ this._emitCompleteOnItems( 'hide', items );
4100
+ if ( !items || !items.length ) {
4101
+ return;
4102
+ }
4103
+ var stagger = this.updateStagger();
4104
+ items.forEach( function( item, i ) {
4105
+ item.stagger( i * stagger );
4106
+ item.hide();
4107
+ });
4108
+ };
4109
+
4110
+ /**
4111
+ * reveal item elements
4112
+ * @param {Array}, {Element}, {NodeList} items
4113
+ */
4114
+ proto.revealItemElements = function( elems ) {
4115
+ var items = this.getItems( elems );
4116
+ this.reveal( items );
4117
+ };
4118
+
4119
+ /**
4120
+ * hide item elements
4121
+ * @param {Array}, {Element}, {NodeList} items
4122
+ */
4123
+ proto.hideItemElements = function( elems ) {
4124
+ var items = this.getItems( elems );
4125
+ this.hide( items );
4126
+ };
4127
+
4128
+ /**
4129
+ * get Outlayer.Item, given an Element
4130
+ * @param {Element} elem
4131
+ * @param {Function} callback
4132
+ * @returns {Outlayer.Item} item
4133
+ */
4134
+ proto.getItem = function( elem ) {
4135
+ // loop through items to get the one that matches
4136
+ for ( var i=0; i < this.items.length; i++ ) {
4137
+ var item = this.items[i];
4138
+ if ( item.element == elem ) {
4139
+ // return item
4140
+ return item;
4141
+ }
4142
+ }
4143
+ };
4144
+
4145
+ /**
4146
+ * get collection of Outlayer.Items, given Elements
4147
+ * @param {Array} elems
4148
+ * @returns {Array} items - Outlayer.Items
4149
+ */
4150
+ proto.getItems = function( elems ) {
4151
+ elems = utils.makeArray( elems );
4152
+ var items = [];
4153
+ elems.forEach( function( elem ) {
4154
+ var item = this.getItem( elem );
4155
+ if ( item ) {
4156
+ items.push( item );
4157
+ }
4158
+ }, this );
4159
+
4160
+ return items;
4161
+ };
4162
+
4163
+ /**
4164
+ * remove element(s) from instance and DOM
4165
+ * @param {Array or NodeList or Element} elems
4166
+ */
4167
+ proto.remove = function( elems ) {
4168
+ var removeItems = this.getItems( elems );
4169
+
4170
+ this._emitCompleteOnItems( 'remove', removeItems );
4171
+
4172
+ // bail if no items to remove
4173
+ if ( !removeItems || !removeItems.length ) {
4174
+ return;
4175
+ }
4176
+
4177
+ removeItems.forEach( function( item ) {
4178
+ item.remove();
4179
+ // remove item from collection
4180
+ utils.removeFrom( this.items, item );
4181
+ }, this );
4182
+ };
4183
+
4184
+ // ----- destroy ----- //
4185
+
4186
+ // remove and disable Outlayer instance
4187
+ proto.destroy = function() {
4188
+ // clean up dynamic styles
4189
+ var style = this.element.style;
4190
+ style.height = '';
4191
+ style.position = '';
4192
+ style.width = '';
4193
+ // destroy items
4194
+ this.items.forEach( function( item ) {
4195
+ item.destroy();
4196
+ });
4197
+
4198
+ this.unbindResize();
4199
+
4200
+ var id = this.element.outlayerGUID;
4201
+ delete instances[ id ]; // remove reference to instance by id
4202
+ delete this.element.outlayerGUID;
4203
+ // remove data for jQuery
4204
+ if ( jQuery ) {
4205
+ jQuery.removeData( this.element, this.constructor.namespace );
4206
+ }
4207
+
4208
+ };
4209
+
4210
+ // -------------------------- data -------------------------- //
4211
+
4212
+ /**
4213
+ * get Outlayer instance from element
4214
+ * @param {Element} elem
4215
+ * @returns {Outlayer}
4216
+ */
4217
+ Outlayer.data = function( elem ) {
4218
+ elem = utils.getQueryElement( elem );
4219
+ var id = elem && elem.outlayerGUID;
4220
+ return id && instances[ id ];
4221
+ };
4222
+
4223
+
4224
+ // -------------------------- create Outlayer class -------------------------- //
4225
+
4226
+ /**
4227
+ * create a layout class
4228
+ * @param {String} namespace
4229
+ */
4230
+ Outlayer.create = function( namespace, options ) {
4231
+ // sub-class Outlayer
4232
+ var Layout = subclass( Outlayer );
4233
+ // apply new options and compatOptions
4234
+ Layout.defaults = utils.extend( {}, Outlayer.defaults );
4235
+ utils.extend( Layout.defaults, options );
4236
+ Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions );
4237
+
4238
+ Layout.namespace = namespace;
4239
+
4240
+ Layout.data = Outlayer.data;
4241
+
4242
+ // sub-class Item
4243
+ Layout.Item = subclass( Item );
4244
+
4245
+ // -------------------------- declarative -------------------------- //
4246
+
4247
+ utils.htmlInit( Layout, namespace );
4248
+
4249
+ // -------------------------- jQuery bridge -------------------------- //
4250
+
4251
+ // make into jQuery plugin
4252
+ if ( jQuery && jQuery.bridget ) {
4253
+ jQuery.bridget( namespace, Layout );
4254
+ }
4255
+
4256
+ return Layout;
4257
+ };
4258
+
4259
+ function subclass( Parent ) {
4260
+ function SubClass() {
4261
+ Parent.apply( this, arguments );
4262
+ }
4263
+
4264
+ SubClass.prototype = Object.create( Parent.prototype );
4265
+ SubClass.prototype.constructor = SubClass;
4266
+
4267
+ return SubClass;
4268
+ }
4269
+
4270
+ // ----- helpers ----- //
4271
+
4272
+ // how many milliseconds are in each unit
4273
+ var msUnits = {
4274
+ ms: 1,
4275
+ s: 1000
4276
+ };
4277
+
4278
+ // munge time-like parameter into millisecond number
4279
+ // '0.4s' -> 40
4280
+ function getMilliseconds( time ) {
4281
+ if ( typeof time == 'number' ) {
4282
+ return time;
4283
+ }
4284
+ var matches = time.match( /(^\d*\.?\d*)(\w*)/ );
4285
+ var num = matches && matches[1];
4286
+ var unit = matches && matches[2];
4287
+ if ( !num.length ) {
4288
+ return 0;
4289
+ }
4290
+ num = parseFloat( num );
4291
+ var mult = msUnits[ unit ] || 1;
4292
+ return num * mult;
4293
+ }
4294
+
4295
+ // ----- fin ----- //
4296
+
4297
+ // back in global
4298
+ Outlayer.Item = Item;
4299
+
4300
+ return Outlayer;
4301
+
4302
+ }));
4303
+
4304
+ /**
4305
+ * Isotope Item
4306
+ **/
4307
+
4308
+ ( function( window, factory ) {
4309
+ // universal module definition
4310
+ /* jshint strict: false */ /*globals define, module, require */
4311
+ if ( typeof define == 'function' && define.amd ) {
4312
+ // AMD
4313
+ define( 'isotope-layout/js/item',[
4314
+ 'outlayer/outlayer'
4315
+ ],
4316
+ factory );
4317
+ } else if ( typeof module == 'object' && module.exports ) {
4318
+ // CommonJS
4319
+ module.exports = factory(
4320
+ require('outlayer')
4321
+ );
4322
+ } else {
4323
+ // browser global
4324
+ window.Isotope = window.Isotope || {};
4325
+ window.Isotope.Item = factory(
4326
+ window.Outlayer
4327
+ );
4328
+ }
4329
+
4330
+ }( window, function factory( Outlayer ) {
4331
+ 'use strict';
4332
+
4333
+ // -------------------------- Item -------------------------- //
4334
+
4335
+ // sub-class Outlayer Item
4336
+ function Item() {
4337
+ Outlayer.Item.apply( this, arguments );
4338
+ }
4339
+
4340
+ var proto = Item.prototype = Object.create( Outlayer.Item.prototype );
4341
+
4342
+ var _create = proto._create;
4343
+ proto._create = function() {
4344
+ // assign id, used for original-order sorting
4345
+ this.id = this.layout.itemGUID++;
4346
+ _create.call( this );
4347
+ this.sortData = {};
4348
+ };
4349
+
4350
+ proto.updateSortData = function() {
4351
+ if ( this.isIgnored ) {
4352
+ return;
4353
+ }
4354
+ // default sorters
4355
+ this.sortData.id = this.id;
4356
+ // for backward compatibility
4357
+ this.sortData['original-order'] = this.id;
4358
+ this.sortData.random = Math.random();
4359
+ // go thru getSortData obj and apply the sorters
4360
+ var getSortData = this.layout.options.getSortData;
4361
+ var sorters = this.layout._sorters;
4362
+ for ( var key in getSortData ) {
4363
+ var sorter = sorters[ key ];
4364
+ this.sortData[ key ] = sorter( this.element, this );
4365
+ }
4366
+ };
4367
+
4368
+ var _destroy = proto.destroy;
4369
+ proto.destroy = function() {
4370
+ // call super
4371
+ _destroy.apply( this, arguments );
4372
+ // reset display, #741
4373
+ this.css({
4374
+ display: ''
4375
+ });
4376
+ };
4377
+
4378
+ return Item;
4379
+
4380
+ }));
4381
+
4382
+ /**
4383
+ * Isotope LayoutMode
4384
+ */
4385
+
4386
+ ( function( window, factory ) {
4387
+ // universal module definition
4388
+ /* jshint strict: false */ /*globals define, module, require */
4389
+ if ( typeof define == 'function' && define.amd ) {
4390
+ // AMD
4391
+ define( 'isotope-layout/js/layout-mode',[
4392
+ 'get-size/get-size',
4393
+ 'outlayer/outlayer'
4394
+ ],
4395
+ factory );
4396
+ } else if ( typeof module == 'object' && module.exports ) {
4397
+ // CommonJS
4398
+ module.exports = factory(
4399
+ require('get-size'),
4400
+ require('outlayer')
4401
+ );
4402
+ } else {
4403
+ // browser global
4404
+ window.Isotope = window.Isotope || {};
4405
+ window.Isotope.LayoutMode = factory(
4406
+ window.getSize,
4407
+ window.Outlayer
4408
+ );
4409
+ }
4410
+
4411
+ }( window, function factory( getSize, Outlayer ) {
4412
+ 'use strict';
4413
+
4414
+ // layout mode class
4415
+ function LayoutMode( isotope ) {
4416
+ this.isotope = isotope;
4417
+ // link properties
4418
+ if ( isotope ) {
4419
+ this.options = isotope.options[ this.namespace ];
4420
+ this.element = isotope.element;
4421
+ this.items = isotope.filteredItems;
4422
+ this.size = isotope.size;
4423
+ }
4424
+ }
4425
+
4426
+ var proto = LayoutMode.prototype;
4427
+
4428
+ /**
4429
+ * some methods should just defer to default Outlayer method
4430
+ * and reference the Isotope instance as `this`
4431
+ **/
4432
+ var facadeMethods = [
4433
+ '_resetLayout',
4434
+ '_getItemLayoutPosition',
4435
+ '_manageStamp',
4436
+ '_getContainerSize',
4437
+ '_getElementOffset',
4438
+ 'needsResizeLayout',
4439
+ '_getOption'
4440
+ ];
4441
+
4442
+ facadeMethods.forEach( function( methodName ) {
4443
+ proto[ methodName ] = function() {
4444
+ return Outlayer.prototype[ methodName ].apply( this.isotope, arguments );
4445
+ };
4446
+ });
4447
+
4448
+ // ----- ----- //
4449
+
4450
+ // for horizontal layout modes, check vertical size
4451
+ proto.needsVerticalResizeLayout = function() {
4452
+ // don't trigger if size did not change
4453
+ var size = getSize( this.isotope.element );
4454
+ // check that this.size and size are there
4455
+ // IE8 triggers resize on body size change, so they might not be
4456
+ var hasSizes = this.isotope.size && size;
4457
+ return hasSizes && size.innerHeight != this.isotope.size.innerHeight;
4458
+ };
4459
+
4460
+ // ----- measurements ----- //
4461
+
4462
+ proto._getMeasurement = function() {
4463
+ this.isotope._getMeasurement.apply( this, arguments );
4464
+ };
4465
+
4466
+ proto.getColumnWidth = function() {
4467
+ this.getSegmentSize( 'column', 'Width' );
4468
+ };
4469
+
4470
+ proto.getRowHeight = function() {
4471
+ this.getSegmentSize( 'row', 'Height' );
4472
+ };
4473
+
4474
+ /**
4475
+ * get columnWidth or rowHeight
4476
+ * segment: 'column' or 'row'
4477
+ * size 'Width' or 'Height'
4478
+ **/
4479
+ proto.getSegmentSize = function( segment, size ) {
4480
+ var segmentName = segment + size;
4481
+ var outerSize = 'outer' + size;
4482
+ // columnWidth / outerWidth // rowHeight / outerHeight
4483
+ this._getMeasurement( segmentName, outerSize );
4484
+ // got rowHeight or columnWidth, we can chill
4485
+ if ( this[ segmentName ] ) {
4486
+ return;
4487
+ }
4488
+ // fall back to item of first element
4489
+ var firstItemSize = this.getFirstItemSize();
4490
+ this[ segmentName ] = firstItemSize && firstItemSize[ outerSize ] ||
4491
+ // or size of container
4492
+ this.isotope.size[ 'inner' + size ];
4493
+ };
4494
+
4495
+ proto.getFirstItemSize = function() {
4496
+ var firstItem = this.isotope.filteredItems[0];
4497
+ return firstItem && firstItem.element && getSize( firstItem.element );
4498
+ };
4499
+
4500
+ // ----- methods that should reference isotope ----- //
4501
+
4502
+ proto.layout = function() {
4503
+ this.isotope.layout.apply( this.isotope, arguments );
4504
+ };
4505
+
4506
+ proto.getSize = function() {
4507
+ this.isotope.getSize();
4508
+ this.size = this.isotope.size;
4509
+ };
4510
+
4511
+ // -------------------------- create -------------------------- //
4512
+
4513
+ LayoutMode.modes = {};
4514
+
4515
+ LayoutMode.create = function( namespace, options ) {
4516
+
4517
+ function Mode() {
4518
+ LayoutMode.apply( this, arguments );
4519
+ }
4520
+
4521
+ Mode.prototype = Object.create( proto );
4522
+ Mode.prototype.constructor = Mode;
4523
+
4524
+ // default options
4525
+ if ( options ) {
4526
+ Mode.options = options;
4527
+ }
4528
+
4529
+ Mode.prototype.namespace = namespace;
4530
+ // register in Isotope
4531
+ LayoutMode.modes[ namespace ] = Mode;
4532
+
4533
+ return Mode;
4534
+ };
4535
+
4536
+ return LayoutMode;
4537
+
4538
+ }));
4539
+
4540
+ /*!
4541
+ * Masonry v4.2.1
4542
+ * Cascading grid layout library
4543
+ * https://masonry.desandro.com
4544
+ * MIT License
4545
+ * by David DeSandro
4546
+ */
4547
+
4548
+ ( function( window, factory ) {
4549
+ // universal module definition
4550
+ /* jshint strict: false */ /*globals define, module, require */
4551
+ if ( typeof define == 'function' && define.amd ) {
4552
+ // AMD
4553
+ define( 'masonry-layout/masonry',[
4554
+ 'outlayer/outlayer',
4555
+ 'get-size/get-size'
4556
+ ],
4557
+ factory );
4558
+ } else if ( typeof module == 'object' && module.exports ) {
4559
+ // CommonJS
4560
+ module.exports = factory(
4561
+ require('outlayer'),
4562
+ require('get-size')
4563
+ );
4564
+ } else {
4565
+ // browser global
4566
+ window.Masonry = factory(
4567
+ window.Outlayer,
4568
+ window.getSize
4569
+ );
4570
+ }
4571
+
4572
+ }( window, function factory( Outlayer, getSize ) {
4573
+
4574
+
4575
+
4576
+ // -------------------------- masonryDefinition -------------------------- //
4577
+
4578
+ // create an Outlayer layout class
4579
+ var Masonry = Outlayer.create('masonry');
4580
+ // isFitWidth -> fitWidth
4581
+ Masonry.compatOptions.fitWidth = 'isFitWidth';
4582
+
4583
+ var proto = Masonry.prototype;
4584
+
4585
+ proto._resetLayout = function() {
4586
+ this.getSize();
4587
+ this._getMeasurement( 'columnWidth', 'outerWidth' );
4588
+ this._getMeasurement( 'gutter', 'outerWidth' );
4589
+ this.measureColumns();
4590
+
4591
+ // reset column Y
4592
+ this.colYs = [];
4593
+ for ( var i=0; i < this.cols; i++ ) {
4594
+ this.colYs.push( 0 );
4595
+ }
4596
+
4597
+ this.maxY = 0;
4598
+ this.horizontalColIndex = 0;
4599
+ };
4600
+
4601
+ proto.measureColumns = function() {
4602
+ this.getContainerWidth();
4603
+ // if columnWidth is 0, default to outerWidth of first item
4604
+ if ( !this.columnWidth ) {
4605
+ var firstItem = this.items[0];
4606
+ var firstItemElem = firstItem && firstItem.element;
4607
+ // columnWidth fall back to item of first element
4608
+ this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||
4609
+ // if first elem has no width, default to size of container
4610
+ this.containerWidth;
4611
+ }
4612
+
4613
+ var columnWidth = this.columnWidth += this.gutter;
4614
+
4615
+ // calculate columns
4616
+ var containerWidth = this.containerWidth + this.gutter;
4617
+ var cols = containerWidth / columnWidth;
4618
+ // fix rounding errors, typically with gutters
4619
+ var excess = columnWidth - containerWidth % columnWidth;
4620
+ // if overshoot is less than a pixel, round up, otherwise floor it
4621
+ var mathMethod = excess && excess < 1 ? 'round' : 'floor';
4622
+ cols = Math[ mathMethod ]( cols );
4623
+ this.cols = Math.max( cols, 1 );
4624
+ };
4625
+
4626
+ proto.getContainerWidth = function() {
4627
+ // container is parent if fit width
4628
+ var isFitWidth = this._getOption('fitWidth');
4629
+ var container = isFitWidth ? this.element.parentNode : this.element;
4630
+ // check that this.size and size are there
4631
+ // IE8 triggers resize on body size change, so they might not be
4632
+ var size = getSize( container );
4633
+ this.containerWidth = size && size.innerWidth;
4634
+ };
4635
+
4636
+ proto._getItemLayoutPosition = function( item ) {
4637
+ item.getSize();
4638
+ // how many columns does this brick span
4639
+ var remainder = item.size.outerWidth % this.columnWidth;
4640
+ var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
4641
+ // round if off by 1 pixel, otherwise use ceil
4642
+ var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );
4643
+ colSpan = Math.min( colSpan, this.cols );
4644
+ // use horizontal or top column position
4645
+ var colPosMethod = this.options.horizontalOrder ?
4646
+ '_getHorizontalColPosition' : '_getTopColPosition';
4647
+ var colPosition = this[ colPosMethod ]( colSpan, item );
4648
+ // position the brick
4649
+ var position = {
4650
+ x: this.columnWidth * colPosition.col,
4651
+ y: colPosition.y
4652
+ };
4653
+ // apply setHeight to necessary columns
4654
+ var setHeight = colPosition.y + item.size.outerHeight;
4655
+ var setMax = colSpan + colPosition.col;
4656
+ for ( var i = colPosition.col; i < setMax; i++ ) {
4657
+ this.colYs[i] = setHeight;
4658
+ }
4659
+
4660
+ return position;
4661
+ };
4662
+
4663
+ proto._getTopColPosition = function( colSpan ) {
4664
+ var colGroup = this._getTopColGroup( colSpan );
4665
+ // get the minimum Y value from the columns
4666
+ var minimumY = Math.min.apply( Math, colGroup );
4667
+
4668
+ return {
4669
+ col: colGroup.indexOf( minimumY ),
4670
+ y: minimumY,
4671
+ };
4672
+ };
4673
+
4674
+ /**
4675
+ * @param {Number} colSpan - number of columns the element spans
4676
+ * @returns {Array} colGroup
4677
+ */
4678
+ proto._getTopColGroup = function( colSpan ) {
4679
+ if ( colSpan < 2 ) {
4680
+ // if brick spans only one column, use all the column Ys
4681
+ return this.colYs;
4682
+ }
4683
+
4684
+ var colGroup = [];
4685
+ // how many different places could this brick fit horizontally
4686
+ var groupCount = this.cols + 1 - colSpan;
4687
+ // for each group potential horizontal position
4688
+ for ( var i = 0; i < groupCount; i++ ) {
4689
+ colGroup[i] = this._getColGroupY( i, colSpan );
4690
+ }
4691
+ return colGroup;
4692
+ };
4693
+
4694
+ proto._getColGroupY = function( col, colSpan ) {
4695
+ if ( colSpan < 2 ) {
4696
+ return this.colYs[ col ];
4697
+ }
4698
+ // make an array of colY values for that one group
4699
+ var groupColYs = this.colYs.slice( col, col + colSpan );
4700
+ // and get the max value of the array
4701
+ return Math.max.apply( Math, groupColYs );
4702
+ };
4703
+
4704
+ // get column position based on horizontal index. #873
4705
+ proto._getHorizontalColPosition = function( colSpan, item ) {
4706
+ var col = this.horizontalColIndex % this.cols;
4707
+ var isOver = colSpan > 1 && col + colSpan > this.cols;
4708
+ // shift to next row if item can't fit on current row
4709
+ col = isOver ? 0 : col;
4710
+ // don't let zero-size items take up space
4711
+ var hasSize = item.size.outerWidth && item.size.outerHeight;
4712
+ this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;
4713
+
4714
+ return {
4715
+ col: col,
4716
+ y: this._getColGroupY( col, colSpan ),
4717
+ };
4718
+ };
4719
+
4720
+ proto._manageStamp = function( stamp ) {
4721
+ var stampSize = getSize( stamp );
4722
+ var offset = this._getElementOffset( stamp );
4723
+ // get the columns that this stamp affects
4724
+ var isOriginLeft = this._getOption('originLeft');
4725
+ var firstX = isOriginLeft ? offset.left : offset.right;
4726
+ var lastX = firstX + stampSize.outerWidth;
4727
+ var firstCol = Math.floor( firstX / this.columnWidth );
4728
+ firstCol = Math.max( 0, firstCol );
4729
+ var lastCol = Math.floor( lastX / this.columnWidth );
4730
+ // lastCol should not go over if multiple of columnWidth #425
4731
+ lastCol -= lastX % this.columnWidth ? 0 : 1;
4732
+ lastCol = Math.min( this.cols - 1, lastCol );
4733
+ // set colYs to bottom of the stamp
4734
+
4735
+ var isOriginTop = this._getOption('originTop');
4736
+ var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +
4737
+ stampSize.outerHeight;
4738
+ for ( var i = firstCol; i <= lastCol; i++ ) {
4739
+ this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );
4740
+ }
4741
+ };
4742
+
4743
+ proto._getContainerSize = function() {
4744
+ this.maxY = Math.max.apply( Math, this.colYs );
4745
+ var size = {
4746
+ height: this.maxY
4747
+ };
4748
+
4749
+ if ( this._getOption('fitWidth') ) {
4750
+ size.width = this._getContainerFitWidth();
4751
+ }
4752
+
4753
+ return size;
4754
+ };
4755
+
4756
+ proto._getContainerFitWidth = function() {
4757
+ var unusedCols = 0;
4758
+ // count unused columns
4759
+ var i = this.cols;
4760
+ while ( --i ) {
4761
+ if ( this.colYs[i] !== 0 ) {
4762
+ break;
4763
+ }
4764
+ unusedCols++;
4765
+ }
4766
+ // fit container to columns that have been used
4767
+ return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;
4768
+ };
4769
+
4770
+ proto.needsResizeLayout = function() {
4771
+ var previousWidth = this.containerWidth;
4772
+ this.getContainerWidth();
4773
+ return previousWidth != this.containerWidth;
4774
+ };
4775
+
4776
+ return Masonry;
4777
+
4778
+ }));
4779
+
4780
+ /*!
4781
+ * Masonry layout mode
4782
+ * sub-classes Masonry
4783
+ * https://masonry.desandro.com
4784
+ */
4785
+
4786
+ ( function( window, factory ) {
4787
+ // universal module definition
4788
+ /* jshint strict: false */ /*globals define, module, require */
4789
+ if ( typeof define == 'function' && define.amd ) {
4790
+ // AMD
4791
+ define( 'isotope-layout/js/layout-modes/masonry',[
4792
+ '../layout-mode',
4793
+ 'masonry-layout/masonry'
4794
+ ],
4795
+ factory );
4796
+ } else if ( typeof module == 'object' && module.exports ) {
4797
+ // CommonJS
4798
+ module.exports = factory(
4799
+ require('../layout-mode'),
4800
+ require('masonry-layout')
4801
+ );
4802
+ } else {
4803
+ // browser global
4804
+ factory(
4805
+ window.Isotope.LayoutMode,
4806
+ window.Masonry
4807
+ );
4808
+ }
4809
+
4810
+ }( window, function factory( LayoutMode, Masonry ) {
4811
+ 'use strict';
4812
+
4813
+ // -------------------------- masonryDefinition -------------------------- //
4814
+
4815
+ // create an Outlayer layout class
4816
+ var MasonryMode = LayoutMode.create('masonry');
4817
+
4818
+ var proto = MasonryMode.prototype;
4819
+
4820
+ var keepModeMethods = {
4821
+ _getElementOffset: true,
4822
+ layout: true,
4823
+ _getMeasurement: true
4824
+ };
4825
+
4826
+ // inherit Masonry prototype
4827
+ for ( var method in Masonry.prototype ) {
4828
+ // do not inherit mode methods
4829
+ if ( !keepModeMethods[ method ] ) {
4830
+ proto[ method ] = Masonry.prototype[ method ];
4831
+ }
4832
+ }
4833
+
4834
+ var measureColumns = proto.measureColumns;
4835
+ proto.measureColumns = function() {
4836
+ // set items, used if measuring first item
4837
+ this.items = this.isotope.filteredItems;
4838
+ measureColumns.call( this );
4839
+ };
4840
+
4841
+ // point to mode options for fitWidth
4842
+ var _getOption = proto._getOption;
4843
+ proto._getOption = function( option ) {
4844
+ if ( option == 'fitWidth' ) {
4845
+ return this.options.isFitWidth !== undefined ?
4846
+ this.options.isFitWidth : this.options.fitWidth;
4847
+ }
4848
+ return _getOption.apply( this.isotope, arguments );
4849
+ };
4850
+
4851
+ return MasonryMode;
4852
+
4853
+ }));
4854
+
4855
+ /**
4856
+ * fitRows layout mode
4857
+ */
4858
+
4859
+ ( function( window, factory ) {
4860
+ // universal module definition
4861
+ /* jshint strict: false */ /*globals define, module, require */
4862
+ if ( typeof define == 'function' && define.amd ) {
4863
+ // AMD
4864
+ define( 'isotope-layout/js/layout-modes/fit-rows',[
4865
+ '../layout-mode'
4866
+ ],
4867
+ factory );
4868
+ } else if ( typeof exports == 'object' ) {
4869
+ // CommonJS
4870
+ module.exports = factory(
4871
+ require('../layout-mode')
4872
+ );
4873
+ } else {
4874
+ // browser global
4875
+ factory(
4876
+ window.Isotope.LayoutMode
4877
+ );
4878
+ }
4879
+
4880
+ }( window, function factory( LayoutMode ) {
4881
+ 'use strict';
4882
+
4883
+ var FitRows = LayoutMode.create('fitRows');
4884
+
4885
+ var proto = FitRows.prototype;
4886
+
4887
+ proto._resetLayout = function() {
4888
+ this.x = 0;
4889
+ this.y = 0;
4890
+ this.maxY = 0;
4891
+ this._getMeasurement( 'gutter', 'outerWidth' );
4892
+ };
4893
+
4894
+ proto._getItemLayoutPosition = function( item ) {
4895
+ item.getSize();
4896
+
4897
+ var itemWidth = item.size.outerWidth + this.gutter;
4898
+ // if this element cannot fit in the current row
4899
+ var containerWidth = this.isotope.size.innerWidth + this.gutter;
4900
+ if ( this.x !== 0 && itemWidth + this.x > containerWidth ) {
4901
+ this.x = 0;
4902
+ this.y = this.maxY;
4903
+ }
4904
+
4905
+ var position = {
4906
+ x: this.x,
4907
+ y: this.y
4908
+ };
4909
+
4910
+ this.maxY = Math.max( this.maxY, this.y + item.size.outerHeight );
4911
+ this.x += itemWidth;
4912
+
4913
+ return position;
4914
+ };
4915
+
4916
+ proto._getContainerSize = function() {
4917
+ return { height: this.maxY };
4918
+ };
4919
+
4920
+ return FitRows;
4921
+
4922
+ }));
4923
+
4924
+ /**
4925
+ * vertical layout mode
4926
+ */
4927
+
4928
+ ( function( window, factory ) {
4929
+ // universal module definition
4930
+ /* jshint strict: false */ /*globals define, module, require */
4931
+ if ( typeof define == 'function' && define.amd ) {
4932
+ // AMD
4933
+ define( 'isotope-layout/js/layout-modes/vertical',[
4934
+ '../layout-mode'
4935
+ ],
4936
+ factory );
4937
+ } else if ( typeof module == 'object' && module.exports ) {
4938
+ // CommonJS
4939
+ module.exports = factory(
4940
+ require('../layout-mode')
4941
+ );
4942
+ } else {
4943
+ // browser global
4944
+ factory(
4945
+ window.Isotope.LayoutMode
4946
+ );
4947
+ }
4948
+
4949
+ }( window, function factory( LayoutMode ) {
4950
+ 'use strict';
4951
+
4952
+ var Vertical = LayoutMode.create( 'vertical', {
4953
+ horizontalAlignment: 0
4954
+ });
4955
+
4956
+ var proto = Vertical.prototype;
4957
+
4958
+ proto._resetLayout = function() {
4959
+ this.y = 0;
4960
+ };
4961
+
4962
+ proto._getItemLayoutPosition = function( item ) {
4963
+ item.getSize();
4964
+ var x = ( this.isotope.size.innerWidth - item.size.outerWidth ) *
4965
+ this.options.horizontalAlignment;
4966
+ var y = this.y;
4967
+ this.y += item.size.outerHeight;
4968
+ return { x: x, y: y };
4969
+ };
4970
+
4971
+ proto._getContainerSize = function() {
4972
+ return { height: this.y };
4973
+ };
4974
+
4975
+ return Vertical;
4976
+
4977
+ }));
4978
+
4979
+ /*!
4980
+ * Isotope v3.0.6
4981
+ *
4982
+ * Licensed GPLv3 for open source use
4983
+ * or Isotope Commercial License for commercial use
4984
+ *
4985
+ * https://isotope.metafizzy.co
4986
+ * Copyright 2010-2018 Metafizzy
4987
+ */
4988
+
4989
+ ( function( window, factory ) {
4990
+ // universal module definition
4991
+ /* jshint strict: false */ /*globals define, module, require */
4992
+ if ( typeof define == 'function' && define.amd ) {
4993
+ // AMD
4994
+ define( [
4995
+ 'outlayer/outlayer',
4996
+ 'get-size/get-size',
4997
+ 'desandro-matches-selector/matches-selector',
4998
+ 'fizzy-ui-utils/utils',
4999
+ 'isotope-layout/js/item',
5000
+ 'isotope-layout/js/layout-mode',
5001
+ // include default layout modes
5002
+ 'isotope-layout/js/layout-modes/masonry',
5003
+ 'isotope-layout/js/layout-modes/fit-rows',
5004
+ 'isotope-layout/js/layout-modes/vertical'
5005
+ ],
5006
+ function( Outlayer, getSize, matchesSelector, utils, Item, LayoutMode ) {
5007
+ return factory( window, Outlayer, getSize, matchesSelector, utils, Item, LayoutMode );
5008
+ });
5009
+ } else if ( typeof module == 'object' && module.exports ) {
5010
+ // CommonJS
5011
+ module.exports = factory(
5012
+ window,
5013
+ require('outlayer'),
5014
+ require('get-size'),
5015
+ require('desandro-matches-selector'),
5016
+ require('fizzy-ui-utils'),
5017
+ require('isotope-layout/js/item'),
5018
+ require('isotope-layout/js/layout-mode'),
5019
+ // include default layout modes
5020
+ require('isotope-layout/js/layout-modes/masonry'),
5021
+ require('isotope-layout/js/layout-modes/fit-rows'),
5022
+ require('isotope-layout/js/layout-modes/vertical')
5023
+ );
5024
+ } else {
5025
+ // browser global
5026
+ window.Isotope = factory(
5027
+ window,
5028
+ window.Outlayer,
5029
+ window.getSize,
5030
+ window.matchesSelector,
5031
+ window.fizzyUIUtils,
5032
+ window.Isotope.Item,
5033
+ window.Isotope.LayoutMode
5034
+ );
5035
+ }
5036
+
5037
+ }( window, function factory( window, Outlayer, getSize, matchesSelector, utils,
5038
+ Item, LayoutMode ) {
5039
+
5040
+
5041
+
5042
+ // -------------------------- vars -------------------------- //
5043
+
5044
+ var jQuery = window.jQuery;
5045
+
5046
+ // -------------------------- helpers -------------------------- //
5047
+
5048
+ var trim = String.prototype.trim ?
5049
+ function( str ) {
5050
+ return str.trim();
5051
+ } :
5052
+ function( str ) {
5053
+ return str.replace( /^\s+|\s+$/g, '' );
5054
+ };
5055
+
5056
+ // -------------------------- isotopeDefinition -------------------------- //
5057
+
5058
+ // create an Outlayer layout class
5059
+ var Isotope = Outlayer.create( 'isotope', {
5060
+ layoutMode: 'masonry',
5061
+ isJQueryFiltering: true,
5062
+ sortAscending: true
5063
+ });
5064
+
5065
+ Isotope.Item = Item;
5066
+ Isotope.LayoutMode = LayoutMode;
5067
+
5068
+ var proto = Isotope.prototype;
5069
+
5070
+ proto._create = function() {
5071
+ this.itemGUID = 0;
5072
+ // functions that sort items
5073
+ this._sorters = {};
5074
+ this._getSorters();
5075
+ // call super
5076
+ Outlayer.prototype._create.call( this );
5077
+
5078
+ // create layout modes
5079
+ this.modes = {};
5080
+ // start filteredItems with all items
5081
+ this.filteredItems = this.items;
5082
+ // keep of track of sortBys
5083
+ this.sortHistory = [ 'original-order' ];
5084
+ // create from registered layout modes
5085
+ for ( var name in LayoutMode.modes ) {
5086
+ this._initLayoutMode( name );
5087
+ }
5088
+ };
5089
+
5090
+ proto.reloadItems = function() {
5091
+ // reset item ID counter
5092
+ this.itemGUID = 0;
5093
+ // call super
5094
+ Outlayer.prototype.reloadItems.call( this );
5095
+ };
5096
+
5097
+ proto._itemize = function() {
5098
+ var items = Outlayer.prototype._itemize.apply( this, arguments );
5099
+ // assign ID for original-order
5100
+ for ( var i=0; i < items.length; i++ ) {
5101
+ var item = items[i];
5102
+ item.id = this.itemGUID++;
5103
+ }
5104
+ this._updateItemsSortData( items );
5105
+ return items;
5106
+ };
5107
+
5108
+
5109
+ // -------------------------- layout -------------------------- //
5110
+
5111
+ proto._initLayoutMode = function( name ) {
5112
+ var Mode = LayoutMode.modes[ name ];
5113
+ // set mode options
5114
+ // HACK extend initial options, back-fill in default options
5115
+ var initialOpts = this.options[ name ] || {};
5116
+ this.options[ name ] = Mode.options ?
5117
+ utils.extend( Mode.options, initialOpts ) : initialOpts;
5118
+ // init layout mode instance
5119
+ this.modes[ name ] = new Mode( this );
5120
+ };
5121
+
5122
+
5123
+ proto.layout = function() {
5124
+ // if first time doing layout, do all magic
5125
+ if ( !this._isLayoutInited && this._getOption('initLayout') ) {
5126
+ this.arrange();
5127
+ return;
5128
+ }
5129
+ this._layout();
5130
+ };
5131
+
5132
+ // private method to be used in layout() & magic()
5133
+ proto._layout = function() {
5134
+ // don't animate first layout
5135
+ var isInstant = this._getIsInstant();
5136
+ // layout flow
5137
+ this._resetLayout();
5138
+ this._manageStamps();
5139
+ this.layoutItems( this.filteredItems, isInstant );
5140
+
5141
+ // flag for initalized
5142
+ this._isLayoutInited = true;
5143
+ };
5144
+
5145
+ // filter + sort + layout
5146
+ proto.arrange = function( opts ) {
5147
+ // set any options pass
5148
+ this.option( opts );
5149
+ this._getIsInstant();
5150
+ // filter, sort, and layout
5151
+
5152
+ // filter
5153
+ var filtered = this._filter( this.items );
5154
+ this.filteredItems = filtered.matches;
5155
+
5156
+ this._bindArrangeComplete();
5157
+
5158
+ if ( this._isInstant ) {
5159
+ this._noTransition( this._hideReveal, [ filtered ] );
5160
+ } else {
5161
+ this._hideReveal( filtered );
5162
+ }
5163
+
5164
+ this._sort();
5165
+ this._layout();
5166
+ };
5167
+ // alias to _init for main plugin method
5168
+ proto._init = proto.arrange;
5169
+
5170
+ proto._hideReveal = function( filtered ) {
5171
+ this.reveal( filtered.needReveal );
5172
+ this.hide( filtered.needHide );
5173
+ };
5174
+
5175
+ // HACK
5176
+ // Don't animate/transition first layout
5177
+ // Or don't animate/transition other layouts
5178
+ proto._getIsInstant = function() {
5179
+ var isLayoutInstant = this._getOption('layoutInstant');
5180
+ var isInstant = isLayoutInstant !== undefined ? isLayoutInstant :
5181
+ !this._isLayoutInited;
5182
+ this._isInstant = isInstant;
5183
+ return isInstant;
5184
+ };
5185
+
5186
+ // listen for layoutComplete, hideComplete and revealComplete
5187
+ // to trigger arrangeComplete
5188
+ proto._bindArrangeComplete = function() {
5189
+ // listen for 3 events to trigger arrangeComplete
5190
+ var isLayoutComplete, isHideComplete, isRevealComplete;
5191
+ var _this = this;
5192
+ function arrangeParallelCallback() {
5193
+ if ( isLayoutComplete && isHideComplete && isRevealComplete ) {
5194
+ _this.dispatchEvent( 'arrangeComplete', null, [ _this.filteredItems ] );
5195
+ }
5196
+ }
5197
+ this.once( 'layoutComplete', function() {
5198
+ isLayoutComplete = true;
5199
+ arrangeParallelCallback();
5200
+ });
5201
+ this.once( 'hideComplete', function() {
5202
+ isHideComplete = true;
5203
+ arrangeParallelCallback();
5204
+ });
5205
+ this.once( 'revealComplete', function() {
5206
+ isRevealComplete = true;
5207
+ arrangeParallelCallback();
5208
+ });
5209
+ };
5210
+
5211
+ // -------------------------- filter -------------------------- //
5212
+
5213
+ proto._filter = function( items ) {
5214
+ var filter = this.options.filter;
5215
+ filter = filter || '*';
5216
+ var matches = [];
5217
+ var hiddenMatched = [];
5218
+ var visibleUnmatched = [];
5219
+
5220
+ var test = this._getFilterTest( filter );
5221
+
5222
+ // test each item
5223
+ for ( var i=0; i < items.length; i++ ) {
5224
+ var item = items[i];
5225
+ if ( item.isIgnored ) {
5226
+ continue;
5227
+ }
5228
+ // add item to either matched or unmatched group
5229
+ var isMatched = test( item );
5230
+ // item.isFilterMatched = isMatched;
5231
+ // add to matches if its a match
5232
+ if ( isMatched ) {
5233
+ matches.push( item );
5234
+ }
5235
+ // add to additional group if item needs to be hidden or revealed
5236
+ if ( isMatched && item.isHidden ) {
5237
+ hiddenMatched.push( item );
5238
+ } else if ( !isMatched && !item.isHidden ) {
5239
+ visibleUnmatched.push( item );
5240
+ }
5241
+ }
5242
+
5243
+ // return collections of items to be manipulated
5244
+ return {
5245
+ matches: matches,
5246
+ needReveal: hiddenMatched,
5247
+ needHide: visibleUnmatched
5248
+ };
5249
+ };
5250
+
5251
+ // get a jQuery, function, or a matchesSelector test given the filter
5252
+ proto._getFilterTest = function( filter ) {
5253
+ if ( jQuery && this.options.isJQueryFiltering ) {
5254
+ // use jQuery
5255
+ return function( item ) {
5256
+ return jQuery( item.element ).is( filter );
5257
+ };
5258
+ }
5259
+ if ( typeof filter == 'function' ) {
5260
+ // use filter as function
5261
+ return function( item ) {
5262
+ return filter( item.element );
5263
+ };
5264
+ }
5265
+ // default, use filter as selector string
5266
+ return function( item ) {
5267
+ return matchesSelector( item.element, filter );
5268
+ };
5269
+ };
5270
+
5271
+ // -------------------------- sorting -------------------------- //
5272
+
5273
+ /**
5274
+ * @params {Array} elems
5275
+ * @public
5276
+ */
5277
+ proto.updateSortData = function( elems ) {
5278
+ // get items
5279
+ var items;
5280
+ if ( elems ) {
5281
+ elems = utils.makeArray( elems );
5282
+ items = this.getItems( elems );
5283
+ } else {
5284
+ // update all items if no elems provided
5285
+ items = this.items;
5286
+ }
5287
+
5288
+ this._getSorters();
5289
+ this._updateItemsSortData( items );
5290
+ };
5291
+
5292
+ proto._getSorters = function() {
5293
+ var getSortData = this.options.getSortData;
5294
+ for ( var key in getSortData ) {
5295
+ var sorter = getSortData[ key ];
5296
+ this._sorters[ key ] = mungeSorter( sorter );
5297
+ }
5298
+ };
5299
+
5300
+ /**
5301
+ * @params {Array} items - of Isotope.Items
5302
+ * @private
5303
+ */
5304
+ proto._updateItemsSortData = function( items ) {
5305
+ // do not update if no items
5306
+ var len = items && items.length;
5307
+
5308
+ for ( var i=0; len && i < len; i++ ) {
5309
+ var item = items[i];
5310
+ item.updateSortData();
5311
+ }
5312
+ };
5313
+
5314
+ // ----- munge sorter ----- //
5315
+
5316
+ // encapsulate this, as we just need mungeSorter
5317
+ // other functions in here are just for munging
5318
+ var mungeSorter = ( function() {
5319
+ // add a magic layer to sorters for convienent shorthands
5320
+ // `.foo-bar` will use the text of .foo-bar querySelector
5321
+ // `[foo-bar]` will use attribute
5322
+ // you can also add parser
5323
+ // `.foo-bar parseInt` will parse that as a number
5324
+ function mungeSorter( sorter ) {
5325
+ // if not a string, return function or whatever it is
5326
+ if ( typeof sorter != 'string' ) {
5327
+ return sorter;
5328
+ }
5329
+ // parse the sorter string
5330
+ var args = trim( sorter ).split(' ');
5331
+ var query = args[0];
5332
+ // check if query looks like [an-attribute]
5333
+ var attrMatch = query.match( /^\[(.+)\]$/ );
5334
+ var attr = attrMatch && attrMatch[1];
5335
+ var getValue = getValueGetter( attr, query );
5336
+ // use second argument as a parser
5337
+ var parser = Isotope.sortDataParsers[ args[1] ];
5338
+ // parse the value, if there was a parser
5339
+ sorter = parser ? function( elem ) {
5340
+ return elem && parser( getValue( elem ) );
5341
+ } :
5342
+ // otherwise just return value
5343
+ function( elem ) {
5344
+ return elem && getValue( elem );
5345
+ };
5346
+
5347
+ return sorter;
5348
+ }
5349
+
5350
+ // get an attribute getter, or get text of the querySelector
5351
+ function getValueGetter( attr, query ) {
5352
+ // if query looks like [foo-bar], get attribute
5353
+ if ( attr ) {
5354
+ return function getAttribute( elem ) {
5355
+ return elem.getAttribute( attr );
5356
+ };
5357
+ }
5358
+
5359
+ // otherwise, assume its a querySelector, and get its text
5360
+ return function getChildText( elem ) {
5361
+ var child = elem.querySelector( query );
5362
+ return child && child.textContent;
5363
+ };
5364
+ }
5365
+
5366
+ return mungeSorter;
5367
+ })();
5368
+
5369
+ // parsers used in getSortData shortcut strings
5370
+ Isotope.sortDataParsers = {
5371
+ 'parseInt': function( val ) {
5372
+ return parseInt( val, 10 );
5373
+ },
5374
+ 'parseFloat': function( val ) {
5375
+ return parseFloat( val );
5376
+ }
5377
+ };
5378
+
5379
+ // ----- sort method ----- //
5380
+
5381
+ // sort filteredItem order
5382
+ proto._sort = function() {
5383
+ if ( !this.options.sortBy ) {
5384
+ return;
5385
+ }
5386
+ // keep track of sortBy History
5387
+ var sortBys = utils.makeArray( this.options.sortBy );
5388
+ if ( !this._getIsSameSortBy( sortBys ) ) {
5389
+ // concat all sortBy and sortHistory, add to front, oldest goes in last
5390
+ this.sortHistory = sortBys.concat( this.sortHistory );
5391
+ }
5392
+ // sort magic
5393
+ var itemSorter = getItemSorter( this.sortHistory, this.options.sortAscending );
5394
+ this.filteredItems.sort( itemSorter );
5395
+ };
5396
+
5397
+ // check if sortBys is same as start of sortHistory
5398
+ proto._getIsSameSortBy = function( sortBys ) {
5399
+ for ( var i=0; i < sortBys.length; i++ ) {
5400
+ if ( sortBys[i] != this.sortHistory[i] ) {
5401
+ return false;
5402
+ }
5403
+ }
5404
+ return true;
5405
+ };
5406
+
5407
+ // returns a function used for sorting
5408
+ function getItemSorter( sortBys, sortAsc ) {
5409
+ return function sorter( itemA, itemB ) {
5410
+ // cycle through all sortKeys
5411
+ for ( var i = 0; i < sortBys.length; i++ ) {
5412
+ var sortBy = sortBys[i];
5413
+ var a = itemA.sortData[ sortBy ];
5414
+ var b = itemB.sortData[ sortBy ];
5415
+ if ( a > b || a < b ) {
5416
+ // if sortAsc is an object, use the value given the sortBy key
5417
+ var isAscending = sortAsc[ sortBy ] !== undefined ? sortAsc[ sortBy ] : sortAsc;
5418
+ var direction = isAscending ? 1 : -1;
5419
+ return ( a > b ? 1 : -1 ) * direction;
5420
+ }
5421
+ }
5422
+ return 0;
5423
+ };
5424
+ }
5425
+
5426
+ // -------------------------- methods -------------------------- //
5427
+
5428
+ // get layout mode
5429
+ proto._mode = function() {
5430
+ var layoutMode = this.options.layoutMode;
5431
+ var mode = this.modes[ layoutMode ];
5432
+ if ( !mode ) {
5433
+ // TODO console.error
5434
+ throw new Error( 'No layout mode: ' + layoutMode );
5435
+ }
5436
+ // HACK sync mode's options
5437
+ // any options set after init for layout mode need to be synced
5438
+ mode.options = this.options[ layoutMode ];
5439
+ return mode;
5440
+ };
5441
+
5442
+ proto._resetLayout = function() {
5443
+ // trigger original reset layout
5444
+ Outlayer.prototype._resetLayout.call( this );
5445
+ this._mode()._resetLayout();
5446
+ };
5447
+
5448
+ proto._getItemLayoutPosition = function( item ) {
5449
+ return this._mode()._getItemLayoutPosition( item );
5450
+ };
5451
+
5452
+ proto._manageStamp = function( stamp ) {
5453
+ this._mode()._manageStamp( stamp );
5454
+ };
5455
+
5456
+ proto._getContainerSize = function() {
5457
+ return this._mode()._getContainerSize();
5458
+ };
5459
+
5460
+ proto.needsResizeLayout = function() {
5461
+ return this._mode().needsResizeLayout();
5462
+ };
5463
+
5464
+ // -------------------------- adding & removing -------------------------- //
5465
+
5466
+ // HEADS UP overwrites default Outlayer appended
5467
+ proto.appended = function( elems ) {
5468
+ var items = this.addItems( elems );
5469
+ if ( !items.length ) {
5470
+ return;
5471
+ }
5472
+ // filter, layout, reveal new items
5473
+ var filteredItems = this._filterRevealAdded( items );
5474
+ // add to filteredItems
5475
+ this.filteredItems = this.filteredItems.concat( filteredItems );
5476
+ };
5477
+
5478
+ // HEADS UP overwrites default Outlayer prepended
5479
+ proto.prepended = function( elems ) {
5480
+ var items = this._itemize( elems );
5481
+ if ( !items.length ) {
5482
+ return;
5483
+ }
5484
+ // start new layout
5485
+ this._resetLayout();
5486
+ this._manageStamps();
5487
+ // filter, layout, reveal new items
5488
+ var filteredItems = this._filterRevealAdded( items );
5489
+ // layout previous items
5490
+ this.layoutItems( this.filteredItems );
5491
+ // add to items and filteredItems
5492
+ this.filteredItems = filteredItems.concat( this.filteredItems );
5493
+ this.items = items.concat( this.items );
5494
+ };
5495
+
5496
+ proto._filterRevealAdded = function( items ) {
5497
+ var filtered = this._filter( items );
5498
+ this.hide( filtered.needHide );
5499
+ // reveal all new items
5500
+ this.reveal( filtered.matches );
5501
+ // layout new items, no transition
5502
+ this.layoutItems( filtered.matches, true );
5503
+ return filtered.matches;
5504
+ };
5505
+
5506
+ /**
5507
+ * Filter, sort, and layout newly-appended item elements
5508
+ * @param {Array or NodeList or Element} elems
5509
+ */
5510
+ proto.insert = function( elems ) {
5511
+ var items = this.addItems( elems );
5512
+ if ( !items.length ) {
5513
+ return;
5514
+ }
5515
+ // append item elements
5516
+ var i, item;
5517
+ var len = items.length;
5518
+ for ( i=0; i < len; i++ ) {
5519
+ item = items[i];
5520
+ this.element.appendChild( item.element );
5521
+ }
5522
+ // filter new stuff
5523
+ var filteredInsertItems = this._filter( items ).matches;
5524
+ // set flag
5525
+ for ( i=0; i < len; i++ ) {
5526
+ items[i].isLayoutInstant = true;
5527
+ }
5528
+ this.arrange();
5529
+ // reset flag
5530
+ for ( i=0; i < len; i++ ) {
5531
+ delete items[i].isLayoutInstant;
5532
+ }
5533
+ this.reveal( filteredInsertItems );
5534
+ };
5535
+
5536
+ var _remove = proto.remove;
5537
+ proto.remove = function( elems ) {
5538
+ elems = utils.makeArray( elems );
5539
+ var removeItems = this.getItems( elems );
5540
+ // do regular thing
5541
+ _remove.call( this, elems );
5542
+ // bail if no items to remove
5543
+ var len = removeItems && removeItems.length;
5544
+ // remove elems from filteredItems
5545
+ for ( var i=0; len && i < len; i++ ) {
5546
+ var item = removeItems[i];
5547
+ // remove item from collection
5548
+ utils.removeFrom( this.filteredItems, item );
5549
+ }
5550
+ };
5551
+
5552
+ proto.shuffle = function() {
5553
+ // update random sortData
5554
+ for ( var i=0; i < this.items.length; i++ ) {
5555
+ var item = this.items[i];
5556
+ item.sortData.random = Math.random();
5557
+ }
5558
+ this.options.sortBy = 'random';
5559
+ this._sort();
5560
+ this._layout();
5561
+ };
5562
+
5563
+ /**
5564
+ * trigger fn without transition
5565
+ * kind of hacky to have this in the first place
5566
+ * @param {Function} fn
5567
+ * @param {Array} args
5568
+ * @returns ret
5569
+ * @private
5570
+ */
5571
+ proto._noTransition = function( fn, args ) {
5572
+ // save transitionDuration before disabling
5573
+ var transitionDuration = this.options.transitionDuration;
5574
+ // disable transition
5575
+ this.options.transitionDuration = 0;
5576
+ // do it
5577
+ var returnValue = fn.apply( this, args );
5578
+ // re-enable transition for reveal
5579
+ this.options.transitionDuration = transitionDuration;
5580
+ return returnValue;
5581
+ };
5582
+
5583
+ // ----- helper methods ----- //
5584
+
5585
+ /**
5586
+ * getter method for getting filtered item elements
5587
+ * @returns {Array} elems - collection of item elements
5588
+ */
5589
+ proto.getFilteredItemElements = function() {
5590
+ return this.filteredItems.map( function( item ) {
5591
+ return item.element;
5592
+ });
5593
+ };
5594
+
5595
+ // ----- ----- //
5596
+
5597
+ return Isotope;
5598
+
5599
+ }));
5600
+
5601
+
5602
+ /*! Magnific Popup - v1.1.0 - 2016-02-20
5603
+ * http://dimsemenov.com/plugins/magnific-popup/
5604
+ * Copyright (c) 2016 Dmitry Semenov; */
5605
+ ; (function (factory) {
5606
+ if (typeof define === 'function' && define.amd) {
5607
+ // AMD. Register as an anonymous module.
5608
+ define(['jquery'], factory);
5609
+ } else if (typeof exports === 'object') {
5610
+ // Node/CommonJS
5611
+ factory(require('jquery'));
5612
+ } else {
5613
+ // Browser globals
5614
+ factory(window.jQuery || window.Zepto);
5615
+ }
5616
+ }(function ($) {
5617
+
5618
+ /*>>core*/
5619
+ /**
5620
+ *
5621
+ * Magnific Popup Core JS file
5622
+ *
5623
+ */
5624
+
5625
+
5626
+ /**
5627
+ * Private static constants
5628
+ */
5629
+ var CLOSE_EVENT = 'Close',
5630
+ BEFORE_CLOSE_EVENT = 'BeforeClose',
5631
+ AFTER_CLOSE_EVENT = 'AfterClose',
5632
+ BEFORE_APPEND_EVENT = 'BeforeAppend',
5633
+ MARKUP_PARSE_EVENT = 'MarkupParse',
5634
+ OPEN_EVENT = 'Open',
5635
+ CHANGE_EVENT = 'Change',
5636
+ NS = 'mfp',
5637
+ EVENT_NS = '.' + NS,
5638
+ READY_CLASS = 'mfp-ready',
5639
+ REMOVING_CLASS = 'mfp-removing',
5640
+ PREVENT_CLOSE_CLASS = 'mfp-prevent-close';
5641
+
5642
+
5643
+ /**
5644
+ * Private vars
5645
+ */
5646
+ /*jshint -W079 */
5647
+ var mfp, // As we have only one instance of MagnificPopup object, we define it locally to not to use 'this'
5648
+ MagnificPopup = function () { },
5649
+ _isJQ = !!(window.jQuery),
5650
+ _prevStatus,
5651
+ _window = $(window),
5652
+ _document,
5653
+ _prevContentType,
5654
+ _wrapClasses,
5655
+ _currPopupType;
5656
+
5657
+
5658
+ /**
5659
+ * Private functions
5660
+ */
5661
+ var _mfpOn = function (name, f) {
5662
+ mfp.ev.on(NS + name + EVENT_NS, f);
5663
+ },
5664
+ _getEl = function (className, appendTo, html, raw) {
5665
+ var el = document.createElement('div');
5666
+ el.className = 'mfp-' + className;
5667
+ if (html) {
5668
+ el.innerHTML = html;
5669
+ }
5670
+ if (!raw) {
5671
+ el = $(el);
5672
+ if (appendTo) {
5673
+ el.appendTo(appendTo);
5674
+ }
5675
+ } else if (appendTo) {
5676
+ appendTo.appendChild(el);
5677
+ }
5678
+ return el;
5679
+ },
5680
+ _mfpTrigger = function (e, data) {
5681
+ mfp.ev.triggerHandler(NS + e, data);
5682
+
5683
+ if (mfp.st.callbacks) {
5684
+ // converts "mfpEventName" to "eventName" callback and triggers it if it's present
5685
+ e = e.charAt(0).toLowerCase() + e.slice(1);
5686
+ if (mfp.st.callbacks[e]) {
5687
+ mfp.st.callbacks[e].apply(mfp, $.isArray(data) ? data : [data]);
5688
+ }
5689
+ }
5690
+ },
5691
+ _getCloseBtn = function (type) {
5692
+ if (type !== _currPopupType || !mfp.currTemplate.closeBtn) {
5693
+ mfp.currTemplate.closeBtn = $(mfp.st.closeMarkup.replace('%title%', mfp.st.tClose));
5694
+ _currPopupType = type;
5695
+ }
5696
+ return mfp.currTemplate.closeBtn;
5697
+ },
5698
+ // Initialize Magnific Popup only when called at least once
5699
+ _checkInstance = function () {
5700
+ if (!$.magnificPopup.instance) {
5701
+ /*jshint -W020 */
5702
+ mfp = new MagnificPopup();
5703
+ mfp.init();
5704
+ $.magnificPopup.instance = mfp;
5705
+ }
5706
+ },
5707
+ // CSS transition detection, http://stackoverflow.com/questions/7264899/detect-css-transitions-using-javascript-and-without-modernizr
5708
+ supportsTransitions = function () {
5709
+ var s = document.createElement('p').style, // 's' for style. better to create an element if body yet to exist
5710
+ v = ['ms', 'O', 'Moz', 'Webkit']; // 'v' for vendor
5711
+
5712
+ if (s['transition'] !== undefined) {
5713
+ return true;
5714
+ }
5715
+
5716
+ while (v.length) {
5717
+ if (v.pop() + 'Transition' in s) {
5718
+ return true;
5719
+ }
5720
+ }
5721
+
5722
+ return false;
5723
+ };
5724
+
5725
+
5726
+
5727
+ /**
5728
+ * Public functions
5729
+ */
5730
+ MagnificPopup.prototype = {
5731
+
5732
+ constructor: MagnificPopup,
5733
+
5734
+ /**
5735
+ * Initializes Magnific Popup plugin.
5736
+ * This function is triggered only once when $.fn.magnificPopup or $.magnificPopup is executed
5737
+ */
5738
+ init: function () {
5739
+ var appVersion = navigator.appVersion;
5740
+ mfp.isLowIE = mfp.isIE8 = document.all && !document.addEventListener;
5741
+ mfp.isAndroid = (/android/gi).test(appVersion);
5742
+ mfp.isIOS = (/iphone|ipad|ipod/gi).test(appVersion);
5743
+ mfp.supportsTransition = supportsTransitions();
5744
+
5745
+ // We disable fixed positioned lightbox on devices that don't handle it nicely.
5746
+ // If you know a better way of detecting this - let me know.
5747
+ mfp.probablyMobile = (mfp.isAndroid || mfp.isIOS || /(Opera Mini)|Kindle|webOS|BlackBerry|(Opera Mobi)|(Windows Phone)|IEMobile/i.test(navigator.userAgent));
5748
+ _document = $(document);
5749
+
5750
+ mfp.popupsCache = {};
5751
+ },
5752
+
5753
+ /**
5754
+ * Opens popup
5755
+ * @param data [description]
5756
+ */
5757
+ open: function (data) {
5758
+
5759
+ var i;
5760
+
5761
+ if (data.isObj === false) {
5762
+ // convert jQuery collection to array to avoid conflicts later
5763
+ mfp.items = data.items.toArray();
5764
+
5765
+ mfp.index = 0;
5766
+ var items = data.items,
5767
+ item;
5768
+ for (i = 0; i < items.length; i++) {
5769
+ item = items[i];
5770
+ if (item.parsed) {
5771
+ item = item.el[0];
5772
+ }
5773
+ if (item === data.el[0]) {
5774
+ mfp.index = i;
5775
+ break;
5776
+ }
5777
+ }
5778
+ } else {
5779
+ mfp.items = $.isArray(data.items) ? data.items : [data.items];
5780
+ mfp.index = data.index || 0;
5781
+ }
5782
+
5783
+ // if popup is already opened - we just update the content
5784
+ if (mfp.isOpen) {
5785
+ mfp.updateItemHTML();
5786
+ return;
5787
+ }
5788
+
5789
+ mfp.types = [];
5790
+ _wrapClasses = '';
5791
+ if (data.mainEl && data.mainEl.length) {
5792
+ mfp.ev = data.mainEl.eq(0);
5793
+ } else {
5794
+ mfp.ev = _document;
5795
+ }
5796
+
5797
+ if (data.key) {
5798
+ if (!mfp.popupsCache[data.key]) {
5799
+ mfp.popupsCache[data.key] = {};
5800
+ }
5801
+ mfp.currTemplate = mfp.popupsCache[data.key];
5802
+ } else {
5803
+ mfp.currTemplate = {};
5804
+ }
5805
+
5806
+
5807
+
5808
+ mfp.st = $.extend(true, {}, $.magnificPopup.defaults, data);
5809
+ mfp.fixedContentPos = mfp.st.fixedContentPos === 'auto' ? !mfp.probablyMobile : mfp.st.fixedContentPos;
5810
+
5811
+ if (mfp.st.modal) {
5812
+ mfp.st.closeOnContentClick = false;
5813
+ mfp.st.closeOnBgClick = false;
5814
+ mfp.st.showCloseBtn = false;
5815
+ mfp.st.enableEscapeKey = false;
5816
+ }
5817
+
5818
+
5819
+ // Building markup
5820
+ // main containers are created only once
5821
+ if (!mfp.bgOverlay) {
5822
+
5823
+ // Dark overlay
5824
+ mfp.bgOverlay = _getEl('bg').on('click' + EVENT_NS, function () {
5825
+ mfp.close();
5826
+ });
5827
+
5828
+ mfp.wrap = _getEl('wrap').attr('tabindex', -1).on('click' + EVENT_NS, function (e) {
5829
+ if (mfp._checkIfClose(e.target)) {
5830
+ mfp.close();
5831
+ }
5832
+ });
5833
+
5834
+ mfp.container = _getEl('container', mfp.wrap);
5835
+ }
5836
+
5837
+ mfp.contentContainer = _getEl('content');
5838
+ if (mfp.st.preloader) {
5839
+ mfp.preloader = _getEl('preloader', mfp.container, mfp.st.tLoading);
5840
+ }
5841
+
5842
+
5843
+ // Initializing modules
5844
+ var modules = $.magnificPopup.modules;
5845
+ for (i = 0; i < modules.length; i++) {
5846
+ var n = modules[i];
5847
+ n = n.charAt(0).toUpperCase() + n.slice(1);
5848
+ mfp['init' + n].call(mfp);
5849
+ }
5850
+ _mfpTrigger('BeforeOpen');
5851
+
5852
+
5853
+ if (mfp.st.showCloseBtn) {
5854
+ // Close button
5855
+ if (!mfp.st.closeBtnInside) {
5856
+ mfp.wrap.append(_getCloseBtn());
5857
+ } else {
5858
+ _mfpOn(MARKUP_PARSE_EVENT, function (e, template, values, item) {
5859
+ values.close_replaceWith = _getCloseBtn(item.type);
5860
+ });
5861
+ _wrapClasses += ' mfp-close-btn-in';
5862
+ }
5863
+ }
5864
+
5865
+ if (mfp.st.alignTop) {
5866
+ _wrapClasses += ' mfp-align-top';
5867
+ }
5868
+
5869
+
5870
+
5871
+ if (mfp.fixedContentPos) {
5872
+ mfp.wrap.css({
5873
+ overflow: mfp.st.overflowY,
5874
+ overflowX: 'hidden',
5875
+ overflowY: mfp.st.overflowY
5876
+ });
5877
+ } else {
5878
+ mfp.wrap.css({
5879
+ top: _window.scrollTop(),
5880
+ position: 'absolute'
5881
+ });
5882
+ }
5883
+ if (mfp.st.fixedBgPos === false || (mfp.st.fixedBgPos === 'auto' && !mfp.fixedContentPos)) {
5884
+ mfp.bgOverlay.css({
5885
+ height: _document.height(),
5886
+ position: 'absolute'
5887
+ });
5888
+ }
5889
+
5890
+
5891
+
5892
+ if (mfp.st.enableEscapeKey) {
5893
+ // Close on ESC key
5894
+ _document.on('keyup' + EVENT_NS, function (e) {
5895
+ if (e.keyCode === 27) {
5896
+ mfp.close();
5897
+ }
5898
+ });
5899
+ }
5900
+
5901
+ _window.on('resize' + EVENT_NS, function () {
5902
+ mfp.updateSize();
5903
+ });
5904
+
5905
+
5906
+ if (!mfp.st.closeOnContentClick) {
5907
+ _wrapClasses += ' mfp-auto-cursor';
5908
+ }
5909
+
5910
+ if (_wrapClasses)
5911
+ mfp.wrap.addClass(_wrapClasses);
5912
+
5913
+
5914
+ // this triggers recalculation of layout, so we get it once to not to trigger twice
5915
+ var windowHeight = mfp.wH = _window.height();
5916
+
5917
+
5918
+ var windowStyles = {};
5919
+
5920
+ if (mfp.fixedContentPos) {
5921
+ if (mfp._hasScrollBar(windowHeight)) {
5922
+ var s = mfp._getScrollbarSize();
5923
+ if (s) {
5924
+ windowStyles.marginRight = s;
5925
+ }
5926
+ }
5927
+ }
5928
+
5929
+ if (mfp.fixedContentPos) {
5930
+ if (!mfp.isIE7) {
5931
+ windowStyles.overflow = 'hidden';
5932
+ } else {
5933
+ // ie7 double-scroll bug
5934
+ $('body, html').css('overflow', 'hidden');
5935
+ }
5936
+ }
5937
+
5938
+
5939
+
5940
+ var classesToadd = mfp.st.mainClass;
5941
+ if (mfp.isIE7) {
5942
+ classesToadd += ' mfp-ie7';
5943
+ }
5944
+ if (classesToadd) {
5945
+ mfp._addClassToMFP(classesToadd);
5946
+ }
5947
+
5948
+ // add content
5949
+ mfp.updateItemHTML();
5950
+
5951
+ _mfpTrigger('BuildControls');
5952
+
5953
+ // remove scrollbar, add margin e.t.c
5954
+ $('html').css(windowStyles);
5955
+
5956
+ // add everything to DOM
5957
+ mfp.bgOverlay.add(mfp.wrap).prependTo(mfp.st.prependTo || $(document.body));
5958
+
5959
+ // Save last focused element
5960
+ mfp._lastFocusedEl = document.activeElement;
5961
+
5962
+ // Wait for next cycle to allow CSS transition
5963
+ setTimeout(function () {
5964
+
5965
+ if (mfp.content) {
5966
+ mfp._addClassToMFP(READY_CLASS);
5967
+ mfp._setFocus();
5968
+ } else {
5969
+ // if content is not defined (not loaded e.t.c) we add class only for BG
5970
+ mfp.bgOverlay.addClass(READY_CLASS);
5971
+ }
5972
+
5973
+ // Trap the focus in popup
5974
+ _document.on('focusin' + EVENT_NS, mfp._onFocusIn);
5975
+
5976
+ }, 16);
5977
+
5978
+ mfp.isOpen = true;
5979
+ mfp.updateSize(windowHeight);
5980
+ _mfpTrigger(OPEN_EVENT);
5981
+
5982
+ return data;
5983
+ },
5984
+
5985
+ /**
5986
+ * Closes the popup
5987
+ */
5988
+ close: function () {
5989
+ if (!mfp.isOpen) return;
5990
+ _mfpTrigger(BEFORE_CLOSE_EVENT);
5991
+
5992
+ mfp.isOpen = false;
5993
+ // for CSS3 animation
5994
+ if (mfp.st.removalDelay && !mfp.isLowIE && mfp.supportsTransition) {
5995
+ mfp._addClassToMFP(REMOVING_CLASS);
5996
+ setTimeout(function () {
5997
+ mfp._close();
5998
+ }, mfp.st.removalDelay);
5999
+ } else {
6000
+ mfp._close();
6001
+ }
6002
+ },
6003
+
6004
+ /**
6005
+ * Helper for close() function
6006
+ */
6007
+ _close: function () {
6008
+ _mfpTrigger(CLOSE_EVENT);
6009
+
6010
+ var classesToRemove = REMOVING_CLASS + ' ' + READY_CLASS + ' ';
6011
+
6012
+ mfp.bgOverlay.detach();
6013
+ mfp.wrap.detach();
6014
+ mfp.container.empty();
6015
+
6016
+ if (mfp.st.mainClass) {
6017
+ classesToRemove += mfp.st.mainClass + ' ';
6018
+ }
6019
+
6020
+ mfp._removeClassFromMFP(classesToRemove);
6021
+
6022
+ if (mfp.fixedContentPos) {
6023
+ var windowStyles = { marginRight: '' };
6024
+ if (mfp.isIE7) {
6025
+ $('body, html').css('overflow', '');
6026
+ } else {
6027
+ windowStyles.overflow = '';
6028
+ }
6029
+ $('html').css(windowStyles);
6030
+ }
6031
+
6032
+ _document.off('keyup' + EVENT_NS + ' focusin' + EVENT_NS);
6033
+ mfp.ev.off(EVENT_NS);
6034
+
6035
+ // clean up DOM elements that aren't removed
6036
+ mfp.wrap.attr('class', 'mfp-wrap').removeAttr('style');
6037
+ mfp.bgOverlay.attr('class', 'mfp-bg');
6038
+ mfp.container.attr('class', 'mfp-container');
6039
+
6040
+ // remove close button from target element
6041
+ if (mfp.st.showCloseBtn &&
6042
+ (!mfp.st.closeBtnInside || mfp.currTemplate[mfp.currItem.type] === true)) {
6043
+ if (mfp.currTemplate.closeBtn)
6044
+ mfp.currTemplate.closeBtn.detach();
6045
+ }
6046
+
6047
+
6048
+ if (mfp.st.autoFocusLast && mfp._lastFocusedEl) {
6049
+ $(mfp._lastFocusedEl).focus(); // put tab focus back
6050
+ }
6051
+ mfp.currItem = null;
6052
+ mfp.content = null;
6053
+ mfp.currTemplate = null;
6054
+ mfp.prevHeight = 0;
6055
+
6056
+ _mfpTrigger(AFTER_CLOSE_EVENT);
6057
+ },
6058
+
6059
+ updateSize: function (winHeight) {
6060
+
6061
+ if (mfp.isIOS) {
6062
+ // fixes iOS nav bars https://github.com/dimsemenov/Magnific-Popup/issues/2
6063
+ var zoomLevel = document.documentElement.clientWidth / window.innerWidth;
6064
+ var height = window.innerHeight * zoomLevel;
6065
+ mfp.wrap.css('height', height);
6066
+ mfp.wH = height;
6067
+ } else {
6068
+ mfp.wH = winHeight || _window.height();
6069
+ }
6070
+ // Fixes #84: popup incorrectly positioned with position:relative on body
6071
+ if (!mfp.fixedContentPos) {
6072
+ mfp.wrap.css('height', mfp.wH);
6073
+ }
6074
+
6075
+ _mfpTrigger('Resize');
6076
+
6077
+ },
6078
+
6079
+ /**
6080
+ * Set content of popup based on current index
6081
+ */
6082
+ updateItemHTML: function () {
6083
+ var item = mfp.items[mfp.index];
6084
+
6085
+ // Detach and perform modifications
6086
+ mfp.contentContainer.detach();
6087
+
6088
+ if (mfp.content)
6089
+ mfp.content.detach();
6090
+
6091
+ if (!item.parsed) {
6092
+ item = mfp.parseEl(mfp.index);
6093
+ }
6094
+
6095
+ var type = item.type;
6096
+
6097
+ _mfpTrigger('BeforeChange', [mfp.currItem ? mfp.currItem.type : '', type]);
6098
+ // BeforeChange event works like so:
6099
+ // _mfpOn('BeforeChange', function(e, prevType, newType) { });
6100
+
6101
+ mfp.currItem = item;
6102
+
6103
+ if (!mfp.currTemplate[type]) {
6104
+ var markup = mfp.st[type] ? mfp.st[type].markup : false;
6105
+
6106
+ // allows to modify markup
6107
+ _mfpTrigger('FirstMarkupParse', markup);
6108
+
6109
+ if (markup) {
6110
+ mfp.currTemplate[type] = $(markup);
6111
+ } else {
6112
+ // if there is no markup found we just define that template is parsed
6113
+ mfp.currTemplate[type] = true;
6114
+ }
6115
+ }
6116
+
6117
+ if (_prevContentType && _prevContentType !== item.type) {
6118
+ mfp.container.removeClass('mfp-' + _prevContentType + '-holder');
6119
+ }
6120
+
6121
+ var newContent = mfp['get' + type.charAt(0).toUpperCase() + type.slice(1)](item, mfp.currTemplate[type]);
6122
+ mfp.appendContent(newContent, type);
6123
+
6124
+ item.preloaded = true;
6125
+
6126
+ _mfpTrigger(CHANGE_EVENT, item);
6127
+ _prevContentType = item.type;
6128
+
6129
+ // Append container back after its content changed
6130
+ mfp.container.prepend(mfp.contentContainer);
6131
+
6132
+ _mfpTrigger('AfterChange');
6133
+ },
6134
+
6135
+
6136
+ /**
6137
+ * Set HTML content of popup
6138
+ */
6139
+ appendContent: function (newContent, type) {
6140
+ mfp.content = newContent;
6141
+
6142
+ if (newContent) {
6143
+ if (mfp.st.showCloseBtn && mfp.st.closeBtnInside &&
6144
+ mfp.currTemplate[type] === true) {
6145
+ // if there is no markup, we just append close button element inside
6146
+ if (!mfp.content.find('.mfp-close').length) {
6147
+ mfp.content.append(_getCloseBtn());
6148
+ }
6149
+ } else {
6150
+ mfp.content = newContent;
6151
+ }
6152
+ } else {
6153
+ mfp.content = '';
6154
+ }
6155
+
6156
+ _mfpTrigger(BEFORE_APPEND_EVENT);
6157
+ mfp.container.addClass('mfp-' + type + '-holder');
6158
+
6159
+ mfp.contentContainer.append(mfp.content);
6160
+ },
6161
+
6162
+
6163
+ /**
6164
+ * Creates Magnific Popup data object based on given data
6165
+ * @param {int} index Index of item to parse
6166
+ */
6167
+ parseEl: function (index) {
6168
+ var item = mfp.items[index],
6169
+ type;
6170
+
6171
+ if (item.tagName) {
6172
+ item = { el: $(item) };
6173
+ } else {
6174
+ type = item.type;
6175
+ item = { data: item, src: item.src };
6176
+ }
6177
+
6178
+ if (item.el) {
6179
+ var types = mfp.types;
6180
+
6181
+ // check for 'mfp-TYPE' class
6182
+ for (var i = 0; i < types.length; i++) {
6183
+ if (item.el.hasClass('mfp-' + types[i])) {
6184
+ type = types[i];
6185
+ break;
6186
+ }
6187
+ }
6188
+
6189
+ item.src = item.el.attr('data-mfp-src');
6190
+ if (!item.src) {
6191
+ item.src = item.el.attr('href');
6192
+ }
6193
+ }
6194
+
6195
+ item.type = type || mfp.st.type || 'inline';
6196
+ item.index = index;
6197
+ item.parsed = true;
6198
+ mfp.items[index] = item;
6199
+ _mfpTrigger('ElementParse', item);
6200
+
6201
+ return mfp.items[index];
6202
+ },
6203
+
6204
+
6205
+ /**
6206
+ * Initializes single popup or a group of popups
6207
+ */
6208
+ addGroup: function (el, options) {
6209
+ var eHandler = function (e) {
6210
+ e.mfpEl = this;
6211
+ mfp._openClick(e, el, options);
6212
+ };
6213
+
6214
+ if (!options) {
6215
+ options = {};
6216
+ }
6217
+
6218
+ var eName = 'click.magnificPopup';
6219
+ options.mainEl = el;
6220
+
6221
+ if (options.items) {
6222
+ options.isObj = true;
6223
+ el.off(eName).on(eName, eHandler);
6224
+ } else {
6225
+ options.isObj = false;
6226
+ if (options.delegate) {
6227
+ el.off(eName).on(eName, options.delegate, eHandler);
6228
+ } else {
6229
+ options.items = el;
6230
+ el.off(eName).on(eName, eHandler);
6231
+ }
6232
+ }
6233
+ },
6234
+ _openClick: function (e, el, options) {
6235
+ var midClick = options.midClick !== undefined ? options.midClick : $.magnificPopup.defaults.midClick;
6236
+
6237
+
6238
+ if (!midClick && (e.which === 2 || e.ctrlKey || e.metaKey || e.altKey || e.shiftKey)) {
6239
+ return;
6240
+ }
6241
+
6242
+ var disableOn = options.disableOn !== undefined ? options.disableOn : $.magnificPopup.defaults.disableOn;
6243
+
6244
+ if (disableOn) {
6245
+ if ($.isFunction(disableOn)) {
6246
+ if (!disableOn.call(mfp)) {
6247
+ return true;
6248
+ }
6249
+ } else { // else it's number
6250
+ if (_window.width() < disableOn) {
6251
+ return true;
6252
+ }
6253
+ }
6254
+ }
6255
+
6256
+ if (e.type) {
6257
+ e.preventDefault();
6258
+
6259
+ // This will prevent popup from closing if element is inside and popup is already opened
6260
+ if (mfp.isOpen) {
6261
+ e.stopPropagation();
6262
+ }
6263
+ }
6264
+
6265
+ options.el = $(e.mfpEl);
6266
+ if (options.delegate) {
6267
+ options.items = el.find(options.delegate);
6268
+ }
6269
+ mfp.open(options);
6270
+ },
6271
+
6272
+
6273
+ /**
6274
+ * Updates text on preloader
6275
+ */
6276
+ updateStatus: function (status, text) {
6277
+
6278
+ if (mfp.preloader) {
6279
+ if (_prevStatus !== status) {
6280
+ mfp.container.removeClass('mfp-s-' + _prevStatus);
6281
+ }
6282
+
6283
+ if (!text && status === 'loading') {
6284
+ text = mfp.st.tLoading;
6285
+ }
6286
+
6287
+ var data = {
6288
+ status: status,
6289
+ text: text
6290
+ };
6291
+ // allows to modify status
6292
+ _mfpTrigger('UpdateStatus', data);
6293
+
6294
+ status = data.status;
6295
+ text = data.text;
6296
+
6297
+ mfp.preloader.html(text);
6298
+
6299
+ mfp.preloader.find('a').on('click', function (e) {
6300
+ e.stopImmediatePropagation();
6301
+ });
6302
+
6303
+ mfp.container.addClass('mfp-s-' + status);
6304
+ _prevStatus = status;
6305
+ }
6306
+ },
6307
+
6308
+
6309
+ /*
6310
+ "Private" helpers that aren't private at all
6311
+ */
6312
+ // Check to close popup or not
6313
+ // "target" is an element that was clicked
6314
+ _checkIfClose: function (target) {
6315
+
6316
+ if ($(target).hasClass(PREVENT_CLOSE_CLASS)) {
6317
+ return;
6318
+ }
6319
+
6320
+ var closeOnContent = mfp.st.closeOnContentClick;
6321
+ var closeOnBg = mfp.st.closeOnBgClick;
6322
+
6323
+ if (closeOnContent && closeOnBg) {
6324
+ return true;
6325
+ } else {
6326
+
6327
+ // We close the popup if click is on close button or on preloader. Or if there is no content.
6328
+ if (!mfp.content || $(target).hasClass('mfp-close') || (mfp.preloader && target === mfp.preloader[0])) {
6329
+ return true;
6330
+ }
6331
+
6332
+ // if click is outside the content
6333
+ if ((target !== mfp.content[0] && !$.contains(mfp.content[0], target))) {
6334
+ if (closeOnBg) {
6335
+ // last check, if the clicked element is in DOM, (in case it's removed onclick)
6336
+ if ($.contains(document, target)) {
6337
+ return true;
6338
+ }
6339
+ }
6340
+ } else if (closeOnContent) {
6341
+ return true;
6342
+ }
6343
+
6344
+ }
6345
+ return false;
6346
+ },
6347
+ _addClassToMFP: function (cName) {
6348
+ mfp.bgOverlay.addClass(cName);
6349
+ mfp.wrap.addClass(cName);
6350
+ },
6351
+ _removeClassFromMFP: function (cName) {
6352
+ this.bgOverlay.removeClass(cName);
6353
+ mfp.wrap.removeClass(cName);
6354
+ },
6355
+ _hasScrollBar: function (winHeight) {
6356
+ return ((mfp.isIE7 ? _document.height() : document.body.scrollHeight) > (winHeight || _window.height()));
6357
+ },
6358
+ _setFocus: function () {
6359
+ (mfp.st.focus ? mfp.content.find(mfp.st.focus).eq(0) : mfp.wrap).focus();
6360
+ },
6361
+ _onFocusIn: function (e) {
6362
+ if (e.target !== mfp.wrap[0] && !$.contains(mfp.wrap[0], e.target)) {
6363
+ mfp._setFocus();
6364
+ return false;
6365
+ }
6366
+ },
6367
+ _parseMarkup: function (template, values, item) {
6368
+ var arr;
6369
+ if (item.data) {
6370
+ values = $.extend(item.data, values);
6371
+ }
6372
+ _mfpTrigger(MARKUP_PARSE_EVENT, [template, values, item]);
6373
+
6374
+ $.each(values, function (key, value) {
6375
+ if (value === undefined || value === false) {
6376
+ return true;
6377
+ }
6378
+ arr = key.split('_');
6379
+ if (arr.length > 1) {
6380
+ var el = template.find(EVENT_NS + '-' + arr[0]);
6381
+
6382
+ if (el.length > 0) {
6383
+ var attr = arr[1];
6384
+ if (attr === 'replaceWith') {
6385
+ if (el[0] !== value[0]) {
6386
+ el.replaceWith(value);
6387
+ }
6388
+ } else if (attr === 'img') {
6389
+ if (el.is('img')) {
6390
+ el.attr('src', value);
6391
+ } else {
6392
+ el.replaceWith($('<img>').attr('src', value).attr('class', el.attr('class')));
6393
+ }
6394
+ } else {
6395
+ el.attr(arr[1], value);
6396
+ }
6397
+ }
6398
+
6399
+ } else {
6400
+ template.find(EVENT_NS + '-' + key).html(value);
6401
+ }
6402
+ });
6403
+ },
6404
+
6405
+ _getScrollbarSize: function () {
6406
+ // thx David
6407
+ if (mfp.scrollbarSize === undefined) {
6408
+ var scrollDiv = document.createElement("div");
6409
+ scrollDiv.style.cssText = 'width: 99px; height: 99px; overflow: scroll; position: absolute; top: -9999px;';
6410
+ document.body.appendChild(scrollDiv);
6411
+ mfp.scrollbarSize = scrollDiv.offsetWidth - scrollDiv.clientWidth;
6412
+ document.body.removeChild(scrollDiv);
6413
+ }
6414
+ return mfp.scrollbarSize;
6415
+ }
6416
+
6417
+ }; /* MagnificPopup core prototype end */
6418
+
6419
+
6420
+
6421
+
6422
+ /**
6423
+ * Public static functions
6424
+ */
6425
+ $.magnificPopup = {
6426
+ instance: null,
6427
+ proto: MagnificPopup.prototype,
6428
+ modules: [],
6429
+
6430
+ open: function (options, index) {
6431
+ _checkInstance();
6432
+
6433
+ if (!options) {
6434
+ options = {};
6435
+ } else {
6436
+ options = $.extend(true, {}, options);
6437
+ }
6438
+
6439
+ options.isObj = true;
6440
+ options.index = index || 0;
6441
+ return this.instance.open(options);
6442
+ },
6443
+
6444
+ close: function () {
6445
+ return $.magnificPopup.instance && $.magnificPopup.instance.close();
6446
+ },
6447
+
6448
+ registerModule: function (name, module) {
6449
+ if (module.options) {
6450
+ $.magnificPopup.defaults[name] = module.options;
6451
+ }
6452
+ $.extend(this.proto, module.proto);
6453
+ this.modules.push(name);
6454
+ },
6455
+
6456
+ defaults: {
6457
+
6458
+ // Info about options is in docs:
6459
+ // http://dimsemenov.com/plugins/magnific-popup/documentation.html#options
6460
+
6461
+ disableOn: 0,
6462
+
6463
+ key: null,
6464
+
6465
+ midClick: false,
6466
+
6467
+ mainClass: '',
6468
+
6469
+ preloader: true,
6470
+
6471
+ focus: '', // CSS selector of input to focus after popup is opened
6472
+
6473
+ closeOnContentClick: false,
6474
+
6475
+ closeOnBgClick: true,
6476
+
6477
+ closeBtnInside: true,
6478
+
6479
+ showCloseBtn: true,
6480
+
6481
+ enableEscapeKey: true,
6482
+
6483
+ modal: false,
6484
+
6485
+ alignTop: false,
6486
+
6487
+ removalDelay: 0,
6488
+
6489
+ prependTo: null,
6490
+
6491
+ fixedContentPos: 'auto',
6492
+
6493
+ fixedBgPos: 'auto',
6494
+
6495
+ overflowY: 'auto',
6496
+
6497
+ closeMarkup: '<button title="%title%" type="button" class="mfp-close">&#215;</button>',
6498
+
6499
+ tClose: 'Close (Esc)',
6500
+
6501
+ tLoading: 'Loading...',
6502
+
6503
+ autoFocusLast: true
6504
+
6505
+ }
6506
+ };
6507
+
6508
+
6509
+
6510
+ $.fn.magnificPopup = function (options) {
6511
+ _checkInstance();
6512
+
6513
+ var jqEl = $(this);
6514
+
6515
+ // We call some API method of first param is a string
6516
+ if (typeof options === "string") {
6517
+
6518
+ if (options === 'open') {
6519
+ var items,
6520
+ itemOpts = _isJQ ? jqEl.data('magnificPopup') : jqEl[0].magnificPopup,
6521
+ index = parseInt(arguments[1], 10) || 0;
6522
+
6523
+ if (itemOpts.items) {
6524
+ items = itemOpts.items[index];
6525
+ } else {
6526
+ items = jqEl;
6527
+ if (itemOpts.delegate) {
6528
+ items = items.find(itemOpts.delegate);
6529
+ }
6530
+ items = items.eq(index);
6531
+ }
6532
+ mfp._openClick({ mfpEl: items }, jqEl, itemOpts);
6533
+ } else {
6534
+ if (mfp.isOpen)
6535
+ mfp[options].apply(mfp, Array.prototype.slice.call(arguments, 1));
6536
+ }
6537
+
6538
+ } else {
6539
+ // clone options obj
6540
+ options = $.extend(true, {}, options);
6541
+
6542
+ /*
6543
+ * As Zepto doesn't support .data() method for objects
6544
+ * and it works only in normal browsers
6545
+ * we assign "options" object directly to the DOM element. FTW!
6546
+ */
6547
+ if (_isJQ) {
6548
+ jqEl.data('magnificPopup', options);
6549
+ } else {
6550
+ jqEl[0].magnificPopup = options;
6551
+ }
6552
+
6553
+ mfp.addGroup(jqEl, options);
6554
+
6555
+ }
6556
+ return jqEl;
6557
+ };
6558
+
6559
+ /*>>core*/
6560
+
6561
+ /*>>inline*/
6562
+
6563
+ var INLINE_NS = 'inline',
6564
+ _hiddenClass,
6565
+ _inlinePlaceholder,
6566
+ _lastInlineElement,
6567
+ _putInlineElementsBack = function () {
6568
+ if (_lastInlineElement) {
6569
+ _inlinePlaceholder.after(_lastInlineElement.addClass(_hiddenClass)).detach();
6570
+ _lastInlineElement = null;
6571
+ }
6572
+ };
6573
+
6574
+ $.magnificPopup.registerModule(INLINE_NS, {
6575
+ options: {
6576
+ hiddenClass: 'hide', // will be appended with `mfp-` prefix
6577
+ markup: '',
6578
+ tNotFound: 'Content not found'
6579
+ },
6580
+ proto: {
6581
+
6582
+ initInline: function () {
6583
+ mfp.types.push(INLINE_NS);
6584
+
6585
+ _mfpOn(CLOSE_EVENT + '.' + INLINE_NS, function () {
6586
+ _putInlineElementsBack();
6587
+ });
6588
+ },
6589
+
6590
+ getInline: function (item, template) {
6591
+
6592
+ _putInlineElementsBack();
6593
+
6594
+ if (item.src) {
6595
+ var inlineSt = mfp.st.inline,
6596
+ el = $(item.src);
6597
+
6598
+ if (el.length) {
6599
+
6600
+ // If target element has parent - we replace it with placeholder and put it back after popup is closed
6601
+ var parent = el[0].parentNode;
6602
+ if (parent && parent.tagName) {
6603
+ if (!_inlinePlaceholder) {
6604
+ _hiddenClass = inlineSt.hiddenClass;
6605
+ _inlinePlaceholder = _getEl(_hiddenClass);
6606
+ _hiddenClass = 'mfp-' + _hiddenClass;
6607
+ }
6608
+ // replace target inline element with placeholder
6609
+ _lastInlineElement = el.after(_inlinePlaceholder).detach().removeClass(_hiddenClass);
6610
+ }
6611
+
6612
+ mfp.updateStatus('ready');
6613
+ } else {
6614
+ mfp.updateStatus('error', inlineSt.tNotFound);
6615
+ el = $('<div>');
6616
+ }
6617
+
6618
+ item.inlineElement = el;
6619
+ return el;
6620
+ }
6621
+
6622
+ mfp.updateStatus('ready');
6623
+ mfp._parseMarkup(template, {}, item);
6624
+ return template;
6625
+ }
6626
+ }
6627
+ });
6628
+
6629
+ /*>>inline*/
6630
+
6631
+ /*>>ajax*/
6632
+ var AJAX_NS = 'ajax',
6633
+ _ajaxCur,
6634
+ _removeAjaxCursor = function () {
6635
+ if (_ajaxCur) {
6636
+ $(document.body).removeClass(_ajaxCur);
6637
+ }
6638
+ },
6639
+ _destroyAjaxRequest = function () {
6640
+ _removeAjaxCursor();
6641
+ if (mfp.req) {
6642
+ mfp.req.abort();
6643
+ }
6644
+ };
6645
+
6646
+ $.magnificPopup.registerModule(AJAX_NS, {
6647
+
6648
+ options: {
6649
+ settings: null,
6650
+ cursor: 'mfp-ajax-cur',
6651
+ tError: '<a href="%url%">The content</a> could not be loaded.'
6652
+ },
6653
+
6654
+ proto: {
6655
+ initAjax: function () {
6656
+ mfp.types.push(AJAX_NS);
6657
+ _ajaxCur = mfp.st.ajax.cursor;
6658
+
6659
+ _mfpOn(CLOSE_EVENT + '.' + AJAX_NS, _destroyAjaxRequest);
6660
+ _mfpOn('BeforeChange.' + AJAX_NS, _destroyAjaxRequest);
6661
+ },
6662
+ getAjax: function (item) {
6663
+
6664
+ if (_ajaxCur) {
6665
+ $(document.body).addClass(_ajaxCur);
6666
+ }
6667
+
6668
+ mfp.updateStatus('loading');
6669
+
6670
+ var opts = $.extend({
6671
+ url: item.src,
6672
+ success: function (data, textStatus, jqXHR) {
6673
+ var temp = {
6674
+ data: data,
6675
+ xhr: jqXHR
6676
+ };
6677
+
6678
+ _mfpTrigger('ParseAjax', temp);
6679
+
6680
+ mfp.appendContent($(temp.data), AJAX_NS);
6681
+
6682
+ item.finished = true;
6683
+
6684
+ _removeAjaxCursor();
6685
+
6686
+ mfp._setFocus();
6687
+
6688
+ setTimeout(function () {
6689
+ mfp.wrap.addClass(READY_CLASS);
6690
+ }, 16);
6691
+
6692
+ mfp.updateStatus('ready');
6693
+
6694
+ _mfpTrigger('AjaxContentAdded');
6695
+ },
6696
+ error: function () {
6697
+ _removeAjaxCursor();
6698
+ item.finished = item.loadError = true;
6699
+ mfp.updateStatus('error', mfp.st.ajax.tError.replace('%url%', item.src));
6700
+ }
6701
+ }, mfp.st.ajax.settings);
6702
+
6703
+ mfp.req = $.ajax(opts);
6704
+
6705
+ return '';
6706
+ }
6707
+ }
6708
+ });
6709
+
6710
+ /*>>ajax*/
6711
+
6712
+ /*>>image*/
6713
+ var _imgInterval,
6714
+ _getTitle = function (item) {
6715
+ if (item.data && item.data.title !== undefined)
6716
+ return item.data.title;
6717
+
6718
+ var src = mfp.st.image.titleSrc;
6719
+
6720
+ if (src) {
6721
+ if ($.isFunction(src)) {
6722
+ return src.call(mfp, item);
6723
+ } else if (item.el) {
6724
+ return item.el.attr(src) || '';
6725
+ }
6726
+ }
6727
+ return '';
6728
+ };
6729
+
6730
+ $.magnificPopup.registerModule('image', {
6731
+
6732
+ options: {
6733
+ markup: '<div class="mfp-figure">' +
6734
+ '<div class="mfp-close"></div>' +
6735
+ '<figure>' +
6736
+ '<div class="mfp-img"></div>' +
6737
+ '<figcaption>' +
6738
+ '<div class="mfp-bottom-bar">' +
6739
+ '<div class="mfp-title"></div>' +
6740
+ '<div class="mfp-counter"></div>' +
6741
+ '</div>' +
6742
+ '</figcaption>' +
6743
+ '</figure>' +
6744
+ '</div>',
6745
+ cursor: 'mfp-zoom-out-cur',
6746
+ titleSrc: 'title',
6747
+ verticalFit: true,
6748
+ tError: '<a href="%url%">The image</a> could not be loaded.'
6749
+ },
6750
+
6751
+ proto: {
6752
+ initImage: function () {
6753
+ var imgSt = mfp.st.image,
6754
+ ns = '.image';
6755
+
6756
+ mfp.types.push('image');
6757
+
6758
+ _mfpOn(OPEN_EVENT + ns, function () {
6759
+ if (mfp.currItem.type === 'image' && imgSt.cursor) {
6760
+ $(document.body).addClass(imgSt.cursor);
6761
+ }
6762
+ });
6763
+
6764
+ _mfpOn(CLOSE_EVENT + ns, function () {
6765
+ if (imgSt.cursor) {
6766
+ $(document.body).removeClass(imgSt.cursor);
6767
+ }
6768
+ _window.off('resize' + EVENT_NS);
6769
+ });
6770
+
6771
+ _mfpOn('Resize' + ns, mfp.resizeImage);
6772
+ if (mfp.isLowIE) {
6773
+ _mfpOn('AfterChange', mfp.resizeImage);
6774
+ }
6775
+ },
6776
+ resizeImage: function () {
6777
+ var item = mfp.currItem;
6778
+ if (!item || !item.img) return;
6779
+
6780
+ if (mfp.st.image.verticalFit) {
6781
+ var decr = 0;
6782
+ // fix box-sizing in ie7/8
6783
+ if (mfp.isLowIE) {
6784
+ decr = parseInt(item.img.css('padding-top'), 10) + parseInt(item.img.css('padding-bottom'), 10);
6785
+ }
6786
+ item.img.css('max-height', mfp.wH - decr);
6787
+ }
6788
+ },
6789
+ _onImageHasSize: function (item) {
6790
+ if (item.img) {
6791
+
6792
+ item.hasSize = true;
6793
+
6794
+ if (_imgInterval) {
6795
+ clearInterval(_imgInterval);
6796
+ }
6797
+
6798
+ item.isCheckingImgSize = false;
6799
+
6800
+ _mfpTrigger('ImageHasSize', item);
6801
+
6802
+ if (item.imgHidden) {
6803
+ if (mfp.content)
6804
+ mfp.content.removeClass('mfp-loading');
6805
+
6806
+ item.imgHidden = false;
6807
+ }
6808
+
6809
+ }
6810
+ },
6811
+
6812
+ /**
6813
+ * Function that loops until the image has size to display elements that rely on it asap
6814
+ */
6815
+ findImageSize: function (item) {
6816
+
6817
+ var counter = 0,
6818
+ img = item.img[0],
6819
+ mfpSetInterval = function (delay) {
6820
+
6821
+ if (_imgInterval) {
6822
+ clearInterval(_imgInterval);
6823
+ }
6824
+ // decelerating interval that checks for size of an image
6825
+ _imgInterval = setInterval(function () {
6826
+ if (img.naturalWidth > 0) {
6827
+ mfp._onImageHasSize(item);
6828
+ return;
6829
+ }
6830
+
6831
+ if (counter > 200) {
6832
+ clearInterval(_imgInterval);
6833
+ }
6834
+
6835
+ counter++;
6836
+ if (counter === 3) {
6837
+ mfpSetInterval(10);
6838
+ } else if (counter === 40) {
6839
+ mfpSetInterval(50);
6840
+ } else if (counter === 100) {
6841
+ mfpSetInterval(500);
6842
+ }
6843
+ }, delay);
6844
+ };
6845
+
6846
+ mfpSetInterval(1);
6847
+ },
6848
+
6849
+ getImage: function (item, template) {
6850
+
6851
+ var guard = 0,
6852
+
6853
+ // image load complete handler
6854
+ onLoadComplete = function () {
6855
+ if (item) {
6856
+ if (item.img[0].complete) {
6857
+ item.img.off('.mfploader');
6858
+
6859
+ if (item === mfp.currItem) {
6860
+ mfp._onImageHasSize(item);
6861
+
6862
+ mfp.updateStatus('ready');
6863
+ }
6864
+
6865
+ item.hasSize = true;
6866
+ item.loaded = true;
6867
+
6868
+ _mfpTrigger('ImageLoadComplete');
6869
+
6870
+ }
6871
+ else {
6872
+ // if image complete check fails 200 times (20 sec), we assume that there was an error.
6873
+ guard++;
6874
+ if (guard < 200) {
6875
+ setTimeout(onLoadComplete, 100);
6876
+ } else {
6877
+ onLoadError();
6878
+ }
6879
+ }
6880
+ }
6881
+ },
6882
+
6883
+ // image error handler
6884
+ onLoadError = function () {
6885
+ if (item) {
6886
+ item.img.off('.mfploader');
6887
+ if (item === mfp.currItem) {
6888
+ mfp._onImageHasSize(item);
6889
+ mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src));
6890
+ }
6891
+
6892
+ item.hasSize = true;
6893
+ item.loaded = true;
6894
+ item.loadError = true;
6895
+ }
6896
+ },
6897
+ imgSt = mfp.st.image;
6898
+
6899
+
6900
+ var el = template.find('.mfp-img');
6901
+ if (el.length) {
6902
+ var img = document.createElement('img');
6903
+ img.className = 'mfp-img';
6904
+ if (item.el && item.el.find('img').length) {
6905
+ img.alt = item.el.find('img').attr('alt');
6906
+ }
6907
+ item.img = $(img).on('load.mfploader', onLoadComplete).on('error.mfploader', onLoadError);
6908
+ img.src = item.src;
6909
+
6910
+ // without clone() "error" event is not firing when IMG is replaced by new IMG
6911
+ // TODO: find a way to avoid such cloning
6912
+ if (el.is('img')) {
6913
+ item.img = item.img.clone();
6914
+ }
6915
+
6916
+ img = item.img[0];
6917
+ if (img.naturalWidth > 0) {
6918
+ item.hasSize = true;
6919
+ } else if (!img.width) {
6920
+ item.hasSize = false;
6921
+ }
6922
+ }
6923
+
6924
+ mfp._parseMarkup(template, {
6925
+ title: _getTitle(item),
6926
+ img_replaceWith: item.img
6927
+ }, item);
6928
+
6929
+ mfp.resizeImage();
6930
+
6931
+ if (item.hasSize) {
6932
+ if (_imgInterval) clearInterval(_imgInterval);
6933
+
6934
+ if (item.loadError) {
6935
+ template.addClass('mfp-loading');
6936
+ mfp.updateStatus('error', imgSt.tError.replace('%url%', item.src));
6937
+ } else {
6938
+ template.removeClass('mfp-loading');
6939
+ mfp.updateStatus('ready');
6940
+ }
6941
+ return template;
6942
+ }
6943
+
6944
+ mfp.updateStatus('loading');
6945
+ item.loading = true;
6946
+
6947
+ if (!item.hasSize) {
6948
+ item.imgHidden = true;
6949
+ template.addClass('mfp-loading');
6950
+ mfp.findImageSize(item);
6951
+ }
6952
+
6953
+ return template;
6954
+ }
6955
+ }
6956
+ });
6957
+
6958
+ /*>>image*/
6959
+
6960
+ /*>>zoom*/
6961
+ var hasMozTransform,
6962
+ getHasMozTransform = function () {
6963
+ if (hasMozTransform === undefined) {
6964
+ hasMozTransform = document.createElement('p').style.MozTransform !== undefined;
6965
+ }
6966
+ return hasMozTransform;
6967
+ };
6968
+
6969
+ $.magnificPopup.registerModule('zoom', {
6970
+
6971
+ options: {
6972
+ enabled: false,
6973
+ easing: 'ease-in-out',
6974
+ duration: 300,
6975
+ opener: function (element) {
6976
+ return element.is('img') ? element : element.find('img');
6977
+ }
6978
+ },
6979
+
6980
+ proto: {
6981
+
6982
+ initZoom: function () {
6983
+ var zoomSt = mfp.st.zoom,
6984
+ ns = '.zoom',
6985
+ image;
6986
+
6987
+ if (!zoomSt.enabled || !mfp.supportsTransition) {
6988
+ return;
6989
+ }
6990
+
6991
+ var duration = zoomSt.duration,
6992
+ getElToAnimate = function (image) {
6993
+ var newImg = image.clone().removeAttr('style').removeAttr('class').addClass('mfp-animated-image'),
6994
+ transition = 'all ' + (zoomSt.duration / 1000) + 's ' + zoomSt.easing,
6995
+ cssObj = {
6996
+ position: 'fixed',
6997
+ zIndex: 9999,
6998
+ left: 0,
6999
+ top: 0,
7000
+ '-webkit-backface-visibility': 'hidden'
7001
+ },
7002
+ t = 'transition';
7003
+
7004
+ cssObj['-webkit-' + t] = cssObj['-moz-' + t] = cssObj['-o-' + t] = cssObj[t] = transition;
7005
+
7006
+ newImg.css(cssObj);
7007
+ return newImg;
7008
+ },
7009
+ showMainContent = function () {
7010
+ mfp.content.css('visibility', 'visible');
7011
+ },
7012
+ openTimeout,
7013
+ animatedImg;
7014
+
7015
+ _mfpOn('BuildControls' + ns, function () {
7016
+ if (mfp._allowZoom()) {
7017
+
7018
+ clearTimeout(openTimeout);
7019
+ mfp.content.css('visibility', 'hidden');
7020
+
7021
+ // Basically, all code below does is clones existing image, puts in on top of the current one and animated it
7022
+
7023
+ image = mfp._getItemToZoom();
7024
+
7025
+ if (!image) {
7026
+ showMainContent();
7027
+ return;
7028
+ }
7029
+
7030
+ animatedImg = getElToAnimate(image);
7031
+
7032
+ animatedImg.css(mfp._getOffset());
7033
+
7034
+ mfp.wrap.append(animatedImg);
7035
+
7036
+ openTimeout = setTimeout(function () {
7037
+ animatedImg.css(mfp._getOffset(true));
7038
+ openTimeout = setTimeout(function () {
7039
+
7040
+ showMainContent();
7041
+
7042
+ setTimeout(function () {
7043
+ animatedImg.remove();
7044
+ image = animatedImg = null;
7045
+ _mfpTrigger('ZoomAnimationEnded');
7046
+ }, 16); // avoid blink when switching images
7047
+
7048
+ }, duration); // this timeout equals animation duration
7049
+
7050
+ }, 16); // by adding this timeout we avoid short glitch at the beginning of animation
7051
+
7052
+
7053
+ // Lots of timeouts...
7054
+ }
7055
+ });
7056
+ _mfpOn(BEFORE_CLOSE_EVENT + ns, function () {
7057
+ if (mfp._allowZoom()) {
7058
+
7059
+ clearTimeout(openTimeout);
7060
+
7061
+ mfp.st.removalDelay = duration;
7062
+
7063
+ if (!image) {
7064
+ image = mfp._getItemToZoom();
7065
+ if (!image) {
7066
+ return;
7067
+ }
7068
+ animatedImg = getElToAnimate(image);
7069
+ }
7070
+
7071
+ animatedImg.css(mfp._getOffset(true));
7072
+ mfp.wrap.append(animatedImg);
7073
+ mfp.content.css('visibility', 'hidden');
7074
+
7075
+ setTimeout(function () {
7076
+ animatedImg.css(mfp._getOffset());
7077
+ }, 16);
7078
+ }
7079
+
7080
+ });
7081
+
7082
+ _mfpOn(CLOSE_EVENT + ns, function () {
7083
+ if (mfp._allowZoom()) {
7084
+ showMainContent();
7085
+ if (animatedImg) {
7086
+ animatedImg.remove();
7087
+ }
7088
+ image = null;
7089
+ }
7090
+ });
7091
+ },
7092
+
7093
+ _allowZoom: function () {
7094
+ return mfp.currItem.type === 'image';
7095
+ },
7096
+
7097
+ _getItemToZoom: function () {
7098
+ if (mfp.currItem.hasSize) {
7099
+ return mfp.currItem.img;
7100
+ } else {
7101
+ return false;
7102
+ }
7103
+ },
7104
+
7105
+ // Get element postion relative to viewport
7106
+ _getOffset: function (isLarge) {
7107
+ var el;
7108
+ if (isLarge) {
7109
+ el = mfp.currItem.img;
7110
+ } else {
7111
+ el = mfp.st.zoom.opener(mfp.currItem.el || mfp.currItem);
7112
+ }
7113
+
7114
+ var offset = el.offset();
7115
+ var paddingTop = parseInt(el.css('padding-top'), 10);
7116
+ var paddingBottom = parseInt(el.css('padding-bottom'), 10);
7117
+ offset.top -= ($(window).scrollTop() - paddingTop);
7118
+
7119
+
7120
+ /*
7121
+
7122
+ Animating left + top + width/height looks glitchy in Firefox, but perfect in Chrome. And vice-versa.
7123
+
7124
+ */
7125
+ var obj = {
7126
+ width: el.width(),
7127
+ // fix Zepto height+padding issue
7128
+ height: (_isJQ ? el.innerHeight() : el[0].offsetHeight) - paddingBottom - paddingTop
7129
+ };
7130
+
7131
+ // I hate to do this, but there is no another option
7132
+ if (getHasMozTransform()) {
7133
+ obj['-moz-transform'] = obj['transform'] = 'translate(' + offset.left + 'px,' + offset.top + 'px)';
7134
+ } else {
7135
+ obj.left = offset.left;
7136
+ obj.top = offset.top;
7137
+ }
7138
+ return obj;
7139
+ }
7140
+
7141
+ }
7142
+ });
7143
+
7144
+
7145
+
7146
+ /*>>zoom*/
7147
+
7148
+ /*>>iframe*/
7149
+
7150
+ var IFRAME_NS = 'iframe',
7151
+ _emptyPage = '//about:blank',
7152
+
7153
+ _fixIframeBugs = function (isShowing) {
7154
+ if (mfp.currTemplate[IFRAME_NS]) {
7155
+ var el = mfp.currTemplate[IFRAME_NS].find('iframe');
7156
+ if (el.length) {
7157
+ // reset src after the popup is closed to avoid "video keeps playing after popup is closed" bug
7158
+ if (!isShowing) {
7159
+ el[0].src = _emptyPage;
7160
+ }
7161
+
7162
+ // IE8 black screen bug fix
7163
+ if (mfp.isIE8) {
7164
+ el.css('display', isShowing ? 'block' : 'none');
7165
+ }
7166
+ }
7167
+ }
7168
+ };
7169
+
7170
+ $.magnificPopup.registerModule(IFRAME_NS, {
7171
+
7172
+ options: {
7173
+ markup: '<div class="mfp-iframe-scaler">' +
7174
+ '<div class="mfp-close"></div>' +
7175
+ '<iframe class="mfp-iframe" src="//about:blank" frameborder="0" allowfullscreen></iframe>' +
7176
+ '</div>',
7177
+
7178
+ srcAction: 'iframe_src',
7179
+
7180
+ // we don't care and support only one default type of URL by default
7181
+ patterns: {
7182
+ youtube: {
7183
+ index: 'youtube.com',
7184
+ id: 'v=',
7185
+ src: '//www.youtube.com/embed/%id%?autoplay=1'
7186
+ },
7187
+ vimeo: {
7188
+ index: 'vimeo.com/',
7189
+ id: '/',
7190
+ src: '//player.vimeo.com/video/%id%?autoplay=1'
7191
+ },
7192
+ gmaps: {
7193
+ index: '//maps.google.',
7194
+ src: '%id%&output=embed'
7195
+ }
7196
+ }
7197
+ },
7198
+
7199
+ proto: {
7200
+ initIframe: function () {
7201
+ mfp.types.push(IFRAME_NS);
7202
+
7203
+ _mfpOn('BeforeChange', function (e, prevType, newType) {
7204
+ if (prevType !== newType) {
7205
+ if (prevType === IFRAME_NS) {
7206
+ _fixIframeBugs(); // iframe if removed
7207
+ } else if (newType === IFRAME_NS) {
7208
+ _fixIframeBugs(true); // iframe is showing
7209
+ }
7210
+ }// else {
7211
+ // iframe source is switched, don't do anything
7212
+ //}
7213
+ });
7214
+
7215
+ _mfpOn(CLOSE_EVENT + '.' + IFRAME_NS, function () {
7216
+ _fixIframeBugs();
7217
+ });
7218
+ },
7219
+
7220
+ getIframe: function (item, template) {
7221
+ var embedSrc = item.src;
7222
+ var iframeSt = mfp.st.iframe;
7223
+
7224
+ $.each(iframeSt.patterns, function () {
7225
+ if (embedSrc.indexOf(this.index) > -1) {
7226
+ if (this.id) {
7227
+ if (typeof this.id === 'string') {
7228
+ embedSrc = embedSrc.substr(embedSrc.lastIndexOf(this.id) + this.id.length, embedSrc.length);
7229
+ } else {
7230
+ embedSrc = this.id.call(this, embedSrc);
7231
+ }
7232
+ }
7233
+ embedSrc = this.src.replace('%id%', embedSrc);
7234
+ return false; // break;
7235
+ }
7236
+ });
7237
+
7238
+ var dataObj = {};
7239
+ if (iframeSt.srcAction) {
7240
+ dataObj[iframeSt.srcAction] = embedSrc;
7241
+ }
7242
+ mfp._parseMarkup(template, dataObj, item);
7243
+
7244
+ mfp.updateStatus('ready');
7245
+
7246
+ return template;
7247
+ }
7248
+ }
7249
+ });
7250
+
7251
+
7252
+
7253
+ /*>>iframe*/
7254
+
7255
+ /*>>gallery*/
7256
+ /**
7257
+ * Get looped index depending on number of slides
7258
+ */
7259
+ var _getLoopedId = function (index) {
7260
+ var numSlides = mfp.items.length;
7261
+ if (index > numSlides - 1) {
7262
+ return index - numSlides;
7263
+ } else if (index < 0) {
7264
+ return numSlides + index;
7265
+ }
7266
+ return index;
7267
+ },
7268
+ _replaceCurrTotal = function (text, curr, total) {
7269
+ return text.replace(/%curr%/gi, curr + 1).replace(/%total%/gi, total);
7270
+ };
7271
+
7272
+ $.magnificPopup.registerModule('gallery', {
7273
+
7274
+ options: {
7275
+ enabled: false,
7276
+ arrowMarkup: '<button title="%title%" type="button" class="mfp-arrow mfp-arrow-%dir%"></button>',
7277
+ preload: [0, 2],
7278
+ navigateByImgClick: true,
7279
+ arrows: true,
7280
+
7281
+ tPrev: 'Previous (Left arrow key)',
7282
+ tNext: 'Next (Right arrow key)',
7283
+ tCounter: '%curr% of %total%'
7284
+ },
7285
+
7286
+ proto: {
7287
+ initGallery: function () {
7288
+
7289
+ var gSt = mfp.st.gallery,
7290
+ ns = '.mfp-gallery';
7291
+
7292
+ mfp.direction = true; // true - next, false - prev
7293
+
7294
+ if (!gSt || !gSt.enabled) return false;
7295
+
7296
+ _wrapClasses += ' mfp-gallery';
7297
+
7298
+ _mfpOn(OPEN_EVENT + ns, function () {
7299
+
7300
+ if (gSt.navigateByImgClick) {
7301
+ mfp.wrap.on('click' + ns, '.mfp-img', function () {
7302
+ if (mfp.items.length > 1) {
7303
+ mfp.next();
7304
+ return false;
7305
+ }
7306
+ });
7307
+ }
7308
+
7309
+ _document.on('keydown' + ns, function (e) {
7310
+ if (e.keyCode === 37) {
7311
+ mfp.prev();
7312
+ } else if (e.keyCode === 39) {
7313
+ mfp.next();
7314
+ }
7315
+ });
7316
+ });
7317
+
7318
+ _mfpOn('UpdateStatus' + ns, function (e, data) {
7319
+ if (data.text) {
7320
+ data.text = _replaceCurrTotal(data.text, mfp.currItem.index, mfp.items.length);
7321
+ }
7322
+ });
7323
+
7324
+ _mfpOn(MARKUP_PARSE_EVENT + ns, function (e, element, values, item) {
7325
+ var l = mfp.items.length;
7326
+ values.counter = l > 1 ? _replaceCurrTotal(gSt.tCounter, item.index, l) : '';
7327
+ });
7328
+
7329
+ _mfpOn('BuildControls' + ns, function () {
7330
+ if (mfp.items.length > 1 && gSt.arrows && !mfp.arrowLeft) {
7331
+ var markup = gSt.arrowMarkup,
7332
+ arrowLeft = mfp.arrowLeft = $(markup.replace(/%title%/gi, gSt.tPrev).replace(/%dir%/gi, 'left')).addClass(PREVENT_CLOSE_CLASS),
7333
+ arrowRight = mfp.arrowRight = $(markup.replace(/%title%/gi, gSt.tNext).replace(/%dir%/gi, 'right')).addClass(PREVENT_CLOSE_CLASS);
7334
+
7335
+ arrowLeft.click(function () {
7336
+ mfp.prev();
7337
+ });
7338
+ arrowRight.click(function () {
7339
+ mfp.next();
7340
+ });
7341
+
7342
+ mfp.container.append(arrowLeft.add(arrowRight));
7343
+ }
7344
+ });
7345
+
7346
+ _mfpOn(CHANGE_EVENT + ns, function () {
7347
+ if (mfp._preloadTimeout) clearTimeout(mfp._preloadTimeout);
7348
+
7349
+ mfp._preloadTimeout = setTimeout(function () {
7350
+ mfp.preloadNearbyImages();
7351
+ mfp._preloadTimeout = null;
7352
+ }, 16);
7353
+ });
7354
+
7355
+
7356
+ _mfpOn(CLOSE_EVENT + ns, function () {
7357
+ _document.off(ns);
7358
+ mfp.wrap.off('click' + ns);
7359
+ mfp.arrowRight = mfp.arrowLeft = null;
7360
+ });
7361
+
7362
+ },
7363
+ next: function () {
7364
+ mfp.direction = true;
7365
+ mfp.index = _getLoopedId(mfp.index + 1);
7366
+ mfp.updateItemHTML();
7367
+ },
7368
+ prev: function () {
7369
+ mfp.direction = false;
7370
+ mfp.index = _getLoopedId(mfp.index - 1);
7371
+ mfp.updateItemHTML();
7372
+ },
7373
+ goTo: function (newIndex) {
7374
+ mfp.direction = (newIndex >= mfp.index);
7375
+ mfp.index = newIndex;
7376
+ mfp.updateItemHTML();
7377
+ },
7378
+ preloadNearbyImages: function () {
7379
+ var p = mfp.st.gallery.preload,
7380
+ preloadBefore = Math.min(p[0], mfp.items.length),
7381
+ preloadAfter = Math.min(p[1], mfp.items.length),
7382
+ i;
7383
+
7384
+ for (i = 1; i <= (mfp.direction ? preloadAfter : preloadBefore); i++) {
7385
+ mfp._preloadItem(mfp.index + i);
7386
+ }
7387
+ for (i = 1; i <= (mfp.direction ? preloadBefore : preloadAfter); i++) {
7388
+ mfp._preloadItem(mfp.index - i);
7389
+ }
7390
+ },
7391
+ _preloadItem: function (index) {
7392
+ index = _getLoopedId(index);
7393
+
7394
+ if (mfp.items[index].preloaded) {
7395
+ return;
7396
+ }
7397
+
7398
+ var item = mfp.items[index];
7399
+ if (!item.parsed) {
7400
+ item = mfp.parseEl(index);
7401
+ }
7402
+
7403
+ _mfpTrigger('LazyLoad', item);
7404
+
7405
+ if (item.type === 'image') {
7406
+ item.img = $('<img class="mfp-img" />').on('load.mfploader', function () {
7407
+ item.hasSize = true;
7408
+ }).on('error.mfploader', function () {
7409
+ item.hasSize = true;
7410
+ item.loadError = true;
7411
+ _mfpTrigger('LazyLoadError', item);
7412
+ }).attr('src', item.src);
7413
+ }
7414
+
7415
+
7416
+ item.preloaded = true;
7417
+ }
7418
+ }
7419
+ });
7420
+
7421
+ /*>>gallery*/
7422
+
7423
+ /*>>retina*/
7424
+
7425
+ var RETINA_NS = 'retina';
7426
+
7427
+ $.magnificPopup.registerModule(RETINA_NS, {
7428
+ options: {
7429
+ replaceSrc: function (item) {
7430
+ return item.src.replace(/\.\w+$/, function (m) { return '@2x' + m; });
7431
+ },
7432
+ ratio: 1 // Function or number. Set to 1 to disable.
7433
+ },
7434
+ proto: {
7435
+ initRetina: function () {
7436
+ if (window.devicePixelRatio > 1) {
7437
+
7438
+ var st = mfp.st.retina,
7439
+ ratio = st.ratio;
7440
+
7441
+ ratio = !isNaN(ratio) ? ratio : ratio();
7442
+
7443
+ if (ratio > 1) {
7444
+ _mfpOn('ImageHasSize' + '.' + RETINA_NS, function (e, item) {
7445
+ item.img.css({
7446
+ 'max-width': item.img[0].naturalWidth / ratio,
7447
+ 'width': '100%'
7448
+ });
7449
+ });
7450
+ _mfpOn('ElementParse' + '.' + RETINA_NS, function (e, item) {
7451
+ item.src = st.replaceSrc(item, ratio);
7452
+ });
7453
+ }
7454
+ }
7455
+
7456
+ }
7457
+ }
7458
+ });
7459
+
7460
+ /*>>retina*/
7461
+ _checkInstance();
7462
+ }));
7463
+ (function($) {
7464
+ $.fn.eaelProgressBar = function() {
7465
+ var $this = $(this)
7466
+ var $layout = $this.data('layout')
7467
+ var $num = $this.data('count')
7468
+ var $duration = $this.data('duration')
7469
+
7470
+ $this.one('inview', function() {
7471
+ if ($layout == 'line') {
7472
+ $('.eael-progressbar-line-fill', $this).css({
7473
+ 'width': $num + '%',
7474
+ })
7475
+ } else if ($layout == 'half_circle') {
7476
+ $('.eael-progressbar-circle-half', $this).css({
7477
+ 'transform': 'rotate(' + ($num * 1.8) + 'deg)',
7478
+ })
7479
+ }
7480
+
7481
+ $('.eael-progressbar-count', $this).prop({
7482
+ 'counter': 0
7483
+ }).animate({
7484
+ counter: $num
7485
+ }, {
7486
+ duration: $duration,
7487
+ easing: 'linear',
7488
+ step: function(counter) {
7489
+ if ($layout == 'circle') {
7490
+ var rotate = (counter * 3.6)
7491
+ $('.eael-progressbar-circle-half-left', $this).css({
7492
+ 'transform': "rotate(" + rotate + "deg)",
7493
+ })
7494
+ if (rotate > 180) {
7495
+ $('.eael-progressbar-circle-pie', $this).css({
7496
+ 'clip-path': 'inset(0)'
7497
+ })
7498
+ $('.eael-progressbar-circle-half-right', $this).css({
7499
+ 'visibility': 'visible'
7500
+ })
7501
+ }
7502
+ }
7503
+
7504
+ $(this).text(Math.ceil(counter))
7505
+ }
7506
+ })
7507
+ })
7508
+ }
7509
+ }(jQuery));
7510
+ typeof navigator === "object" && (function (global, factory) {
7511
+ typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() :
7512
+ typeof define === 'function' && define.amd ? define('Plyr', factory) :
7513
+ (global = global || self, global.Plyr = factory());
7514
+ }(this, function () { 'use strict';
7515
+
7516
+ function _classCallCheck(instance, Constructor) {
7517
+ if (!(instance instanceof Constructor)) {
7518
+ throw new TypeError("Cannot call a class as a function");
7519
+ }
7520
+ }
7521
+
7522
+ function _defineProperties(target, props) {
7523
+ for (var i = 0; i < props.length; i++) {
7524
+ var descriptor = props[i];
7525
+ descriptor.enumerable = descriptor.enumerable || false;
7526
+ descriptor.configurable = true;
7527
+ if ("value" in descriptor) descriptor.writable = true;
7528
+ Object.defineProperty(target, descriptor.key, descriptor);
7529
+ }
7530
+ }
7531
+
7532
+ function _createClass(Constructor, protoProps, staticProps) {
7533
+ if (protoProps) _defineProperties(Constructor.prototype, protoProps);
7534
+ if (staticProps) _defineProperties(Constructor, staticProps);
7535
+ return Constructor;
7536
+ }
7537
+
7538
+ function _defineProperty(obj, key, value) {
7539
+ if (key in obj) {
7540
+ Object.defineProperty(obj, key, {
7541
+ value: value,
7542
+ enumerable: true,
7543
+ configurable: true,
7544
+ writable: true
7545
+ });
7546
+ } else {
7547
+ obj[key] = value;
7548
+ }
7549
+
7550
+ return obj;
7551
+ }
7552
+
7553
+ function _slicedToArray(arr, i) {
7554
+ return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _nonIterableRest();
7555
+ }
7556
+
7557
+ function _toConsumableArray(arr) {
7558
+ return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _nonIterableSpread();
7559
+ }
7560
+
7561
+ function _arrayWithoutHoles(arr) {
7562
+ if (Array.isArray(arr)) {
7563
+ for (var i = 0, arr2 = new Array(arr.length); i < arr.length; i++) arr2[i] = arr[i];
7564
+
7565
+ return arr2;
7566
+ }
7567
+ }
7568
+
7569
+ function _arrayWithHoles(arr) {
7570
+ if (Array.isArray(arr)) return arr;
7571
+ }
7572
+
7573
+ function _iterableToArray(iter) {
7574
+ if (Symbol.iterator in Object(iter) || Object.prototype.toString.call(iter) === "[object Arguments]") return Array.from(iter);
7575
+ }
7576
+
7577
+ function _iterableToArrayLimit(arr, i) {
7578
+ var _arr = [];
7579
+ var _n = true;
7580
+ var _d = false;
7581
+ var _e = undefined;
7582
+
7583
+ try {
7584
+ for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) {
7585
+ _arr.push(_s.value);
7586
+
7587
+ if (i && _arr.length === i) break;
7588
+ }
7589
+ } catch (err) {
7590
+ _d = true;
7591
+ _e = err;
7592
+ } finally {
7593
+ try {
7594
+ if (!_n && _i["return"] != null) _i["return"]();
7595
+ } finally {
7596
+ if (_d) throw _e;
7597
+ }
7598
+ }
7599
+
7600
+ return _arr;
7601
+ }
7602
+
7603
+ function _nonIterableSpread() {
7604
+ throw new TypeError("Invalid attempt to spread non-iterable instance");
7605
+ }
7606
+
7607
+ function _nonIterableRest() {
7608
+ throw new TypeError("Invalid attempt to destructure non-iterable instance");
7609
+ }
7610
+
7611
+ var defaults = {
7612
+ addCSS: true,
7613
+ // Add CSS to the element to improve usability (required here or in your CSS!)
7614
+ thumbWidth: 15,
7615
+ // The width of the thumb handle
7616
+ watch: true // Watch for new elements that match a string target
7617
+
7618
+ };
7619
+
7620
+ // Element matches a selector
7621
+ function matches(element, selector) {
7622
+
7623
+ function match() {
7624
+ return Array.from(document.querySelectorAll(selector)).includes(this);
7625
+ }
7626
+
7627
+ var matches = match;
7628
+ return matches.call(element, selector);
7629
+ }
7630
+
7631
+ // Trigger event
7632
+ function trigger(element, type) {
7633
+ if (!element || !type) {
7634
+ return;
7635
+ } // Create and dispatch the event
7636
+
7637
+
7638
+ var event = new Event(type); // Dispatch the event
7639
+
7640
+ element.dispatchEvent(event);
7641
+ }
7642
+
7643
+ // ==========================================================================
7644
+ // Type checking utils
7645
+ // ==========================================================================
7646
+ var getConstructor = function getConstructor(input) {
7647
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
7648
+ };
7649
+
7650
+ var instanceOf = function instanceOf(input, constructor) {
7651
+ return Boolean(input && constructor && input instanceof constructor);
7652
+ };
7653
+
7654
+ var isNullOrUndefined = function isNullOrUndefined(input) {
7655
+ return input === null || typeof input === 'undefined';
7656
+ };
7657
+
7658
+ var isObject = function isObject(input) {
7659
+ return getConstructor(input) === Object;
7660
+ };
7661
+
7662
+ var isNumber = function isNumber(input) {
7663
+ return getConstructor(input) === Number && !Number.isNaN(input);
7664
+ };
7665
+
7666
+ var isString = function isString(input) {
7667
+ return getConstructor(input) === String;
7668
+ };
7669
+
7670
+ var isBoolean = function isBoolean(input) {
7671
+ return getConstructor(input) === Boolean;
7672
+ };
7673
+
7674
+ var isFunction = function isFunction(input) {
7675
+ return getConstructor(input) === Function;
7676
+ };
7677
+
7678
+ var isArray = function isArray(input) {
7679
+ return Array.isArray(input);
7680
+ };
7681
+
7682
+ var isNodeList = function isNodeList(input) {
7683
+ return instanceOf(input, NodeList);
7684
+ };
7685
+
7686
+ var isElement = function isElement(input) {
7687
+ return instanceOf(input, Element);
7688
+ };
7689
+
7690
+ var isEvent = function isEvent(input) {
7691
+ return instanceOf(input, Event);
7692
+ };
7693
+
7694
+ var isEmpty = function isEmpty(input) {
7695
+ return isNullOrUndefined(input) || (isString(input) || isArray(input) || isNodeList(input)) && !input.length || isObject(input) && !Object.keys(input).length;
7696
+ };
7697
+
7698
+ var is = {
7699
+ nullOrUndefined: isNullOrUndefined,
7700
+ object: isObject,
7701
+ number: isNumber,
7702
+ string: isString,
7703
+ boolean: isBoolean,
7704
+ function: isFunction,
7705
+ array: isArray,
7706
+ nodeList: isNodeList,
7707
+ element: isElement,
7708
+ event: isEvent,
7709
+ empty: isEmpty
7710
+ };
7711
+
7712
+ // Get the number of decimal places
7713
+ function getDecimalPlaces(value) {
7714
+ var match = "".concat(value).match(/(?:\.(\d+))?(?:[eE]([+-]?\d+))?$/);
7715
+
7716
+ if (!match) {
7717
+ return 0;
7718
+ }
7719
+
7720
+ return Math.max(0, // Number of digits right of decimal point.
7721
+ (match[1] ? match[1].length : 0) - ( // Adjust for scientific notation.
7722
+ match[2] ? +match[2] : 0));
7723
+ } // Round to the nearest step
7724
+
7725
+ function round(number, step) {
7726
+ if (step < 1) {
7727
+ var places = getDecimalPlaces(step);
7728
+ return parseFloat(number.toFixed(places));
7729
+ }
7730
+
7731
+ return Math.round(number / step) * step;
7732
+ }
7733
+
7734
+ var RangeTouch =
7735
+ /*#__PURE__*/
7736
+ function () {
7737
+ /**
7738
+ * Setup a new instance
7739
+ * @param {String|Element} target
7740
+ * @param {Object} options
7741
+ */
7742
+ function RangeTouch(target, options) {
7743
+ _classCallCheck(this, RangeTouch);
7744
+
7745
+ if (is.element(target)) {
7746
+ // An Element is passed, use it directly
7747
+ this.element = target;
7748
+ } else if (is.string(target)) {
7749
+ // A CSS Selector is passed, fetch it from the DOM
7750
+ this.element = document.querySelector(target);
7751
+ }
7752
+
7753
+ if (!is.element(this.element) || !is.empty(this.element.rangeTouch)) {
7754
+ return;
7755
+ }
7756
+
7757
+ this.config = Object.assign({}, defaults, options);
7758
+ this.init();
7759
+ }
7760
+
7761
+ _createClass(RangeTouch, [{
7762
+ key: "init",
7763
+ value: function init() {
7764
+ // Bail if not a touch enabled device
7765
+ if (!RangeTouch.enabled) {
7766
+ return;
7767
+ } // Add useful CSS
7768
+
7769
+
7770
+ if (this.config.addCSS) {
7771
+ // TODO: Restore original values on destroy
7772
+ this.element.style.userSelect = 'none';
7773
+ this.element.style.webKitUserSelect = 'none';
7774
+ this.element.style.touchAction = 'manipulation';
7775
+ }
7776
+
7777
+ this.listeners(true);
7778
+ this.element.rangeTouch = this;
7779
+ }
7780
+ }, {
7781
+ key: "destroy",
7782
+ value: function destroy() {
7783
+ // Bail if not a touch enabled device
7784
+ if (!RangeTouch.enabled) {
7785
+ return;
7786
+ }
7787
+
7788
+ this.listeners(false);
7789
+ this.element.rangeTouch = null;
7790
+ }
7791
+ }, {
7792
+ key: "listeners",
7793
+ value: function listeners(toggle) {
7794
+ var _this = this;
7795
+
7796
+ var method = toggle ? 'addEventListener' : 'removeEventListener'; // Listen for events
7797
+
7798
+ ['touchstart', 'touchmove', 'touchend'].forEach(function (type) {
7799
+ _this.element[method](type, function (event) {
7800
+ return _this.set(event);
7801
+ }, false);
7802
+ });
7803
+ }
7804
+ /**
7805
+ * Get the value based on touch position
7806
+ * @param {Event} event
7807
+ */
7808
+
7809
+ }, {
7810
+ key: "get",
7811
+ value: function get(event) {
7812
+ if (!RangeTouch.enabled || !is.event(event)) {
7813
+ return null;
7814
+ }
7815
+
7816
+ var input = event.target;
7817
+ var touch = event.changedTouches[0];
7818
+ var min = parseFloat(input.getAttribute('min')) || 0;
7819
+ var max = parseFloat(input.getAttribute('max')) || 100;
7820
+ var step = parseFloat(input.getAttribute('step')) || 1;
7821
+ var delta = max - min; // Calculate percentage
7822
+
7823
+ var percent;
7824
+ var clientRect = input.getBoundingClientRect();
7825
+ var thumbWidth = 100 / clientRect.width * (this.config.thumbWidth / 2) / 100; // Determine left percentage
7826
+
7827
+ percent = 100 / clientRect.width * (touch.clientX - clientRect.left); // Don't allow outside bounds
7828
+
7829
+ if (percent < 0) {
7830
+ percent = 0;
7831
+ } else if (percent > 100) {
7832
+ percent = 100;
7833
+ } // Factor in the thumb offset
7834
+
7835
+
7836
+ if (percent < 50) {
7837
+ percent -= (100 - percent * 2) * thumbWidth;
7838
+ } else if (percent > 50) {
7839
+ percent += (percent - 50) * 2 * thumbWidth;
7840
+ } // Find the closest step to the mouse position
7841
+
7842
+
7843
+ return min + round(delta * (percent / 100), step);
7844
+ }
7845
+ /**
7846
+ * Update range value based on position
7847
+ * @param {Event} event
7848
+ */
7849
+
7850
+ }, {
7851
+ key: "set",
7852
+ value: function set(event) {
7853
+ if (!RangeTouch.enabled || !is.event(event) || event.target.disabled) {
7854
+ return;
7855
+ } // Prevent text highlight on iOS
7856
+
7857
+
7858
+ event.preventDefault(); // Set value
7859
+
7860
+ event.target.value = this.get(event); // Trigger event
7861
+
7862
+ trigger(event.target, event.type === 'touchend' ? 'change' : 'input');
7863
+ }
7864
+ }], [{
7865
+ key: "setup",
7866
+
7867
+ /**
7868
+ * Setup multiple instances
7869
+ * @param {String|Element|NodeList|Array} target
7870
+ * @param {Object} options
7871
+ */
7872
+ value: function setup(target) {
7873
+ var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
7874
+ var targets = null;
7875
+
7876
+ if (is.empty(target) || is.string(target)) {
7877
+ targets = Array.from(document.querySelectorAll(is.string(target) ? target : 'input[type="range"]'));
7878
+ } else if (is.element(target)) {
7879
+ targets = [target];
7880
+ } else if (is.nodeList(target)) {
7881
+ targets = Array.from(target);
7882
+ } else if (is.array(target)) {
7883
+ targets = target.filter(is.element);
7884
+ }
7885
+
7886
+ if (is.empty(targets)) {
7887
+ return null;
7888
+ }
7889
+
7890
+ var config = Object.assign({}, defaults, options);
7891
+
7892
+ if (is.string(target) && config.watch) {
7893
+ // Create an observer instance
7894
+ var observer = new MutationObserver(function (mutations) {
7895
+ Array.from(mutations).forEach(function (mutation) {
7896
+ Array.from(mutation.addedNodes).forEach(function (node) {
7897
+ if (!is.element(node) || !matches(node, target)) {
7898
+ return;
7899
+ } // eslint-disable-next-line no-unused-vars
7900
+
7901
+
7902
+ var range = new RangeTouch(node, config);
7903
+ });
7904
+ });
7905
+ }); // Pass in the target node, as well as the observer options
7906
+
7907
+ observer.observe(document.body, {
7908
+ childList: true,
7909
+ subtree: true
7910
+ });
7911
+ }
7912
+
7913
+ return targets.map(function (t) {
7914
+ return new RangeTouch(t, options);
7915
+ });
7916
+ }
7917
+ }, {
7918
+ key: "enabled",
7919
+ get: function get() {
7920
+ return 'ontouchstart' in document.documentElement;
7921
+ }
7922
+ }]);
7923
+
7924
+ return RangeTouch;
7925
+ }();
7926
+
7927
+ // ==========================================================================
7928
+ // Type checking utils
7929
+ // ==========================================================================
7930
+ var getConstructor$1 = function getConstructor(input) {
7931
+ return input !== null && typeof input !== 'undefined' ? input.constructor : null;
7932
+ };
7933
+
7934
+ var instanceOf$1 = function instanceOf(input, constructor) {
7935
+ return Boolean(input && constructor && input instanceof constructor);
7936
+ };
7937
+
7938
+ var isNullOrUndefined$1 = function isNullOrUndefined(input) {
7939
+ return input === null || typeof input === 'undefined';
7940
+ };
7941
+
7942
+ var isObject$1 = function isObject(input) {
7943
+ return getConstructor$1(input) === Object;
7944
+ };
7945
+
7946
+ var isNumber$1 = function isNumber(input) {
7947
+ return getConstructor$1(input) === Number && !Number.isNaN(input);
7948
+ };
7949
+
7950
+ var isString$1 = function isString(input) {
7951
+ return getConstructor$1(input) === String;
7952
+ };
7953
+
7954
+ var isBoolean$1 = function isBoolean(input) {
7955
+ return getConstructor$1(input) === Boolean;
7956
+ };
7957
+
7958
+ var isFunction$1 = function isFunction(input) {
7959
+ return getConstructor$1(input) === Function;
7960
+ };
7961
+
7962
+ var isArray$1 = function isArray(input) {
7963
+ return Array.isArray(input);
7964
+ };
7965
+
7966
+ var isWeakMap = function isWeakMap(input) {
7967
+ return instanceOf$1(input, WeakMap);
7968
+ };
7969
+
7970
+ var isNodeList$1 = function isNodeList(input) {
7971
+ return instanceOf$1(input, NodeList);
7972
+ };
7973
+
7974
+ var isElement$1 = function isElement(input) {
7975
+ return instanceOf$1(input, Element);
7976
+ };
7977
+
7978
+ var isTextNode = function isTextNode(input) {
7979
+ return getConstructor$1(input) === Text;
7980
+ };
7981
+
7982
+ var isEvent$1 = function isEvent(input) {
7983
+ return instanceOf$1(input, Event);
7984
+ };
7985
+
7986
+ var isKeyboardEvent = function isKeyboardEvent(input) {
7987
+ return instanceOf$1(input, KeyboardEvent);
7988
+ };
7989
+
7990
+ var isCue = function isCue(input) {
7991
+ return instanceOf$1(input, window.TextTrackCue) || instanceOf$1(input, window.VTTCue);
7992
+ };
7993
+
7994
+ var isTrack = function isTrack(input) {
7995
+ return instanceOf$1(input, TextTrack) || !isNullOrUndefined$1(input) && isString$1(input.kind);
7996
+ };
7997
+
7998
+ var isPromise = function isPromise(input) {
7999
+ return instanceOf$1(input, Promise);
8000
+ };
8001
+
8002
+ var isEmpty$1 = function isEmpty(input) {
8003
+ return isNullOrUndefined$1(input) || (isString$1(input) || isArray$1(input) || isNodeList$1(input)) && !input.length || isObject$1(input) && !Object.keys(input).length;
8004
+ };
8005
+
8006
+ var isUrl = function isUrl(input) {
8007
+ // Accept a URL object
8008
+ if (instanceOf$1(input, window.URL)) {
8009
+ return true;
8010
+ } // Must be string from here
8011
+
8012
+
8013
+ if (!isString$1(input)) {
8014
+ return false;
8015
+ } // Add the protocol if required
8016
+
8017
+
8018
+ var string = input;
8019
+
8020
+ if (!input.startsWith('http://') || !input.startsWith('https://')) {
8021
+ string = "http://".concat(input);
8022
+ }
8023
+
8024
+ try {
8025
+ return !isEmpty$1(new URL(string).hostname);
8026
+ } catch (e) {
8027
+ return false;
8028
+ }
8029
+ };
8030
+
8031
+ var is$1 = {
8032
+ nullOrUndefined: isNullOrUndefined$1,
8033
+ object: isObject$1,
8034
+ number: isNumber$1,
8035
+ string: isString$1,
8036
+ boolean: isBoolean$1,
8037
+ function: isFunction$1,
8038
+ array: isArray$1,
8039
+ weakMap: isWeakMap,
8040
+ nodeList: isNodeList$1,
8041
+ element: isElement$1,
8042
+ textNode: isTextNode,
8043
+ event: isEvent$1,
8044
+ keyboardEvent: isKeyboardEvent,
8045
+ cue: isCue,
8046
+ track: isTrack,
8047
+ promise: isPromise,
8048
+ url: isUrl,
8049
+ empty: isEmpty$1
8050
+ };
8051
+
8052
+ // ==========================================================================
8053
+ var transitionEndEvent = function () {
8054
+ var element = document.createElement('span');
8055
+ var events = {
8056
+ WebkitTransition: 'webkitTransitionEnd',
8057
+ MozTransition: 'transitionend',
8058
+ OTransition: 'oTransitionEnd otransitionend',
8059
+ transition: 'transitionend'
8060
+ };
8061
+ var type = Object.keys(events).find(function (event) {
8062
+ return element.style[event] !== undefined;
8063
+ });
8064
+ return is$1.string(type) ? events[type] : false;
8065
+ }(); // Force repaint of element
8066
+
8067
+ function repaint(element, delay) {
8068
+ setTimeout(function () {
8069
+ try {
8070
+ // eslint-disable-next-line no-param-reassign
8071
+ element.hidden = true; // eslint-disable-next-line no-unused-expressions
8072
+
8073
+ element.offsetHeight; // eslint-disable-next-line no-param-reassign
8074
+
8075
+ element.hidden = false;
8076
+ } catch (e) {// Do nothing
8077
+ }
8078
+ }, delay);
8079
+ }
8080
+
8081
+ // ==========================================================================
8082
+ // Browser sniffing
8083
+ // Unfortunately, due to mixed support, UA sniffing is required
8084
+ // ==========================================================================
8085
+ var browser = {
8086
+ isIE:
8087
+ /* @cc_on!@ */
8088
+ !!document.documentMode,
8089
+ isEdge: window.navigator.userAgent.includes('Edge'),
8090
+ isWebkit: 'WebkitAppearance' in document.documentElement.style && !/Edge/.test(navigator.userAgent),
8091
+ isIPhone: /(iPhone|iPod)/gi.test(navigator.platform),
8092
+ isIos: /(iPad|iPhone|iPod)/gi.test(navigator.platform)
8093
+ };
8094
+
8095
+ // ==========================================================================
8096
+ // https://github.com/WICG/EventListenerOptions/blob/gh-pages/explainer.md
8097
+ // https://www.youtube.com/watch?v=NPM6172J22g
8098
+
8099
+ var supportsPassiveListeners = function () {
8100
+ // Test via a getter in the options object to see if the passive property is accessed
8101
+ var supported = false;
8102
+
8103
+ try {
8104
+ var options = Object.defineProperty({}, 'passive', {
8105
+ get: function get() {
8106
+ supported = true;
8107
+ return null;
8108
+ }
8109
+ });
8110
+ window.addEventListener('test', null, options);
8111
+ window.removeEventListener('test', null, options);
8112
+ } catch (e) {// Do nothing
8113
+ }
8114
+
8115
+ return supported;
8116
+ }(); // Toggle event listener
8117
+
8118
+
8119
+ function toggleListener(element, event, callback) {
8120
+ var _this = this;
8121
+
8122
+ var toggle = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : false;
8123
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
8124
+ var capture = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : false;
8125
+
8126
+ // Bail if no element, event, or callback
8127
+ if (!element || !('addEventListener' in element) || is$1.empty(event) || !is$1.function(callback)) {
8128
+ return;
8129
+ } // Allow multiple events
8130
+
8131
+
8132
+ var events = event.split(' '); // Build options
8133
+ // Default to just the capture boolean for browsers with no passive listener support
8134
+
8135
+ var options = capture; // If passive events listeners are supported
8136
+
8137
+ if (supportsPassiveListeners) {
8138
+ options = {
8139
+ // Whether the listener can be passive (i.e. default never prevented)
8140
+ passive: passive,
8141
+ // Whether the listener is a capturing listener or not
8142
+ capture: capture
8143
+ };
8144
+ } // If a single node is passed, bind the event listener
8145
+
8146
+
8147
+ events.forEach(function (type) {
8148
+ if (_this && _this.eventListeners && toggle) {
8149
+ // Cache event listener
8150
+ _this.eventListeners.push({
8151
+ element: element,
8152
+ type: type,
8153
+ callback: callback,
8154
+ options: options
8155
+ });
8156
+ }
8157
+
8158
+ element[toggle ? 'addEventListener' : 'removeEventListener'](type, callback, options);
8159
+ });
8160
+ } // Bind event handler
8161
+
8162
+ function on(element) {
8163
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8164
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
8165
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
8166
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
8167
+ toggleListener.call(this, element, events, callback, true, passive, capture);
8168
+ } // Unbind event handler
8169
+
8170
+ function off(element) {
8171
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8172
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
8173
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
8174
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
8175
+ toggleListener.call(this, element, events, callback, false, passive, capture);
8176
+ } // Bind once-only event handler
8177
+
8178
+ function once(element) {
8179
+ var _this2 = this;
8180
+
8181
+ var events = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8182
+ var callback = arguments.length > 2 ? arguments[2] : undefined;
8183
+ var passive = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : true;
8184
+ var capture = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : false;
8185
+
8186
+ var onceCallback = function onceCallback() {
8187
+ off(element, events, onceCallback, passive, capture);
8188
+
8189
+ for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
8190
+ args[_key] = arguments[_key];
8191
+ }
8192
 
8193
+ callback.apply(_this2, args);
8194
+ };
 
8195
 
8196
+ toggleListener.call(this, element, events, onceCallback, true, passive, capture);
8197
+ } // Trigger event
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8198
 
8199
+ function triggerEvent(element) {
8200
+ var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8201
+ var bubbles = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
8202
+ var detail = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : {};
8203
+
8204
+ // Bail if no element
8205
+ if (!is$1.element(element) || is$1.empty(type)) {
8206
+ return;
8207
+ } // Create and dispatch the event
8208
+
8209
+
8210
+ var event = new CustomEvent(type, {
8211
+ bubbles: bubbles,
8212
+ detail: Object.assign({}, detail, {
8213
+ plyr: this
8214
+ })
8215
+ }); // Dispatch the event
8216
+
8217
+ element.dispatchEvent(event);
8218
+ } // Unbind all cached event listeners
8219
+
8220
+ function unbindListeners() {
8221
+ if (this && this.eventListeners) {
8222
+ this.eventListeners.forEach(function (item) {
8223
+ var element = item.element,
8224
+ type = item.type,
8225
+ callback = item.callback,
8226
+ options = item.options;
8227
+ element.removeEventListener(type, callback, options);
8228
+ });
8229
+ this.eventListeners = [];
8230
+ }
8231
+ } // Run method when / if player is ready
8232
+
8233
+ function ready() {
8234
+ var _this3 = this;
8235
+
8236
+ return new Promise(function (resolve) {
8237
+ return _this3.ready ? setTimeout(resolve, 0) : on.call(_this3, _this3.elements.container, 'ready', resolve);
8238
+ }).then(function () {});
8239
+ }
8240
+
8241
+ function cloneDeep(object) {
8242
+ return JSON.parse(JSON.stringify(object));
8243
+ } // Get a nested value in an object
8244
+
8245
+ function getDeep(object, path) {
8246
+ return path.split('.').reduce(function (obj, key) {
8247
+ return obj && obj[key];
8248
+ }, object);
8249
+ } // Deep extend destination object with N more objects
8250
+
8251
+ function extend() {
8252
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
8253
+
8254
+ for (var _len = arguments.length, sources = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
8255
+ sources[_key - 1] = arguments[_key];
8256
+ }
8257
+
8258
+ if (!sources.length) {
8259
+ return target;
8260
+ }
8261
+
8262
+ var source = sources.shift();
8263
+
8264
+ if (!is$1.object(source)) {
8265
+ return target;
8266
+ }
8267
+
8268
+ Object.keys(source).forEach(function (key) {
8269
+ if (is$1.object(source[key])) {
8270
+ if (!Object.keys(target).includes(key)) {
8271
+ Object.assign(target, _defineProperty({}, key, {}));
8272
+ }
8273
+
8274
+ extend(target[key], source[key]);
8275
+ } else {
8276
+ Object.assign(target, _defineProperty({}, key, source[key]));
8277
+ }
8278
+ });
8279
+ return extend.apply(void 0, [target].concat(sources));
8280
+ }
8281
+
8282
+ function wrap(elements, wrapper) {
8283
+ // Convert `elements` to an array, if necessary.
8284
+ var targets = elements.length ? elements : [elements]; // Loops backwards to prevent having to clone the wrapper on the
8285
+ // first element (see `child` below).
8286
+
8287
+ Array.from(targets).reverse().forEach(function (element, index) {
8288
+ var child = index > 0 ? wrapper.cloneNode(true) : wrapper; // Cache the current parent and sibling.
8289
+
8290
+ var parent = element.parentNode;
8291
+ var sibling = element.nextSibling; // Wrap the element (is automatically removed from its current
8292
+ // parent).
8293
+
8294
+ child.appendChild(element); // If the element had a sibling, insert the wrapper before
8295
+ // the sibling to maintain the HTML structure; otherwise, just
8296
+ // append it to the parent.
8297
+
8298
+ if (sibling) {
8299
+ parent.insertBefore(child, sibling);
8300
+ } else {
8301
+ parent.appendChild(child);
8302
+ }
8303
+ });
8304
+ } // Set attributes
8305
+
8306
+ function setAttributes(element, attributes) {
8307
+ if (!is$1.element(element) || is$1.empty(attributes)) {
8308
+ return;
8309
+ } // Assume null and undefined attributes should be left out,
8310
+ // Setting them would otherwise convert them to "null" and "undefined"
8311
+
8312
+
8313
+ Object.entries(attributes).filter(function (_ref) {
8314
+ var _ref2 = _slicedToArray(_ref, 2),
8315
+ value = _ref2[1];
8316
+
8317
+ return !is$1.nullOrUndefined(value);
8318
+ }).forEach(function (_ref3) {
8319
+ var _ref4 = _slicedToArray(_ref3, 2),
8320
+ key = _ref4[0],
8321
+ value = _ref4[1];
8322
 
8323
+ return element.setAttribute(key, value);
8324
+ });
8325
+ } // Create a DocumentFragment
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8326
 
8327
+ function createElement(type, attributes, text) {
8328
+ // Create a new <element>
8329
+ var element = document.createElement(type); // Set all passed attributes
8330
+
8331
+ if (is$1.object(attributes)) {
8332
+ setAttributes(element, attributes);
8333
+ } // Add text node
8334
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8335
 
8336
+ if (is$1.string(text)) {
8337
+ element.innerText = text;
8338
+ } // Return built element
 
 
 
 
 
 
 
 
8339
 
8340
+
8341
+ return element;
8342
+ } // Inaert an element after another
8343
+
8344
+ function insertAfter(element, target) {
8345
+ if (!is$1.element(element) || !is$1.element(target)) {
8346
+ return;
8347
  }
 
8348
 
8349
+ target.parentNode.insertBefore(element, target.nextSibling);
8350
+ } // Insert a DocumentFragment
8351
 
8352
+ function insertElement(type, parent, attributes, text) {
8353
+ if (!is$1.element(parent)) {
8354
+ return;
8355
+ }
 
8356
 
8357
+ parent.appendChild(createElement(type, attributes, text));
8358
+ } // Remove element(s)
8359
 
8360
+ function removeElement(element) {
8361
+ if (is$1.nodeList(element) || is$1.array(element)) {
8362
+ Array.from(element).forEach(removeElement);
8363
+ return;
8364
+ }
8365
 
8366
+ if (!is$1.element(element) || !is$1.element(element.parentNode)) {
8367
+ return;
8368
+ }
 
8369
 
8370
+ element.parentNode.removeChild(element);
8371
+ } // Remove all child elements
 
 
 
8372
 
8373
+ function emptyElement(element) {
8374
+ if (!is$1.element(element)) {
8375
+ return;
8376
+ }
8377
 
8378
+ var length = element.childNodes.length;
 
 
 
8379
 
8380
+ while (length > 0) {
8381
+ element.removeChild(element.lastChild);
8382
+ length -= 1;
8383
+ }
8384
+ } // Replace element
8385
 
8386
+ function replaceElement(newChild, oldChild) {
8387
+ if (!is$1.element(oldChild) || !is$1.element(oldChild.parentNode) || !is$1.element(newChild)) {
8388
+ return null;
8389
+ }
 
 
 
 
 
 
8390
 
8391
+ oldChild.parentNode.replaceChild(newChild, oldChild);
8392
+ return newChild;
8393
+ } // Get an attribute object from a string selector
8394
+
8395
+ function getAttributesFromSelector(sel, existingAttributes) {
8396
+ // For example:
8397
+ // '.test' to { class: 'test' }
8398
+ // '#test' to { id: 'test' }
8399
+ // '[data-test="test"]' to { 'data-test': 'test' }
8400
+ if (!is$1.string(sel) || is$1.empty(sel)) {
8401
+ return {};
8402
+ }
8403
 
8404
+ var attributes = {};
8405
+ var existing = extend({}, existingAttributes);
8406
+ sel.split(',').forEach(function (s) {
8407
+ // Remove whitespace
8408
+ var selector = s.trim();
8409
+ var className = selector.replace('.', '');
8410
+ var stripped = selector.replace(/[[\]]/g, ''); // Get the parts and value
8411
 
8412
+ var parts = stripped.split('=');
8413
 
8414
+ var _parts = _slicedToArray(parts, 1),
8415
+ key = _parts[0];
 
 
8416
 
8417
+ var value = parts.length > 1 ? parts[1].replace(/["']/g, '') : ''; // Get the first character
 
 
 
 
8418
 
8419
+ var start = selector.charAt(0);
 
 
 
 
8420
 
8421
+ switch (start) {
8422
+ case '.':
8423
+ // Add to existing classname
8424
+ if (is$1.string(existing.class)) {
8425
+ attributes.class = "".concat(existing.class, " ").concat(className);
8426
+ } else {
8427
+ attributes.class = className;
8428
+ }
8429
 
8430
+ break;
 
 
 
 
 
 
 
 
8431
 
8432
+ case '#':
8433
+ // ID selector
8434
+ attributes.id = selector.replace('#', '');
8435
+ break;
 
 
8436
 
8437
+ case '[':
8438
+ // Attribute selector
8439
+ attributes[key] = value;
8440
+ break;
8441
 
8442
+ default:
8443
+ break;
8444
+ }
8445
+ });
8446
+ return extend(existing, attributes);
8447
+ } // Toggle hidden
8448
 
8449
+ function toggleHidden(element, hidden) {
8450
+ if (!is$1.element(element)) {
8451
+ return;
8452
+ }
 
 
 
 
8453
 
8454
+ var hide = hidden;
 
 
 
8455
 
8456
+ if (!is$1.boolean(hide)) {
8457
+ hide = !element.hidden;
8458
+ } // eslint-disable-next-line no-param-reassign
8459
 
 
 
 
 
8460
 
8461
+ element.hidden = hide;
8462
+ } // Mirror Element.classList.toggle, with IE compatibility for "force" argument
 
8463
 
8464
+ function toggleClass(element, className, force) {
8465
+ if (is$1.nodeList(element)) {
8466
+ return Array.from(element).map(function (e) {
8467
+ return toggleClass(e, className, force);
8468
+ });
8469
+ }
 
 
8470
 
8471
+ if (is$1.element(element)) {
8472
+ var method = 'toggle';
 
 
 
8473
 
8474
+ if (typeof force !== 'undefined') {
8475
+ method = force ? 'add' : 'remove';
8476
+ }
 
8477
 
8478
+ element.classList[method](className);
8479
+ return element.classList.contains(className);
8480
+ }
 
8481
 
8482
+ return false;
8483
+ } // Has class name
 
 
 
 
 
 
 
8484
 
8485
+ function hasClass(element, className) {
8486
+ return is$1.element(element) && element.classList.contains(className);
8487
+ } // Element matches selector
 
 
8488
 
8489
+ function matches$1(element, selector) {
 
 
 
8490
 
8491
+ function match() {
8492
+ return Array.from(document.querySelectorAll(selector)).includes(this);
8493
+ }
8494
 
8495
+ var method = match;
8496
+ return method.call(element, selector);
8497
+ } // Find all elements
8498
 
8499
+ function getElements(selector) {
8500
+ return this.elements.container.querySelectorAll(selector);
8501
+ } // Find a single element
8502
 
8503
+ function getElement(selector) {
8504
+ return this.elements.container.querySelector(selector);
8505
+ } // Trap focus inside container
8506
 
8507
+ function trapFocus() {
8508
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
8509
+ var toggle = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
8510
+
8511
+ if (!is$1.element(element)) {
8512
+ return;
8513
+ }
8514
+
8515
+ var focusable = getElements.call(this, 'button:not(:disabled), input:not(:disabled), [tabindex]');
8516
+ var first = focusable[0];
8517
+ var last = focusable[focusable.length - 1];
8518
+
8519
+ var trap = function trap(event) {
8520
+ // Bail if not tab key or not fullscreen
8521
+ if (event.key !== 'Tab' || event.keyCode !== 9) {
8522
+ return;
8523
+ } // Get the current focused element
8524
+
8525
+
8526
+ var focused = document.activeElement;
8527
+
8528
+ if (focused === last && !event.shiftKey) {
8529
+ // Move focus to first element that can be tabbed if Shift isn't used
8530
+ first.focus();
8531
+ event.preventDefault();
8532
+ } else if (focused === first && event.shiftKey) {
8533
+ // Move focus to last element that can be tabbed if Shift is used
8534
+ last.focus();
8535
+ event.preventDefault();
8536
+ }
8537
+ };
8538
+
8539
+ toggleListener.call(this, this.elements.container, 'keydown', trap, toggle, false);
8540
+ } // Set focus and tab focus class
8541
+
8542
+ function setFocus() {
8543
+ var element = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
8544
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
8545
+
8546
+ if (!is$1.element(element)) {
8547
+ return;
8548
+ } // Set regular focus
8549
+
8550
+
8551
+ element.focus({
8552
+ preventScroll: true
8553
+ }); // If we want to mimic keyboard focus via tab
8554
+
8555
+ if (tabFocus) {
8556
+ toggleClass(element, this.config.classNames.tabFocus);
8557
+ }
8558
+ }
8559
+
8560
+ var defaultCodecs = {
8561
+ 'audio/ogg': 'vorbis',
8562
+ 'audio/wav': '1',
8563
+ 'video/webm': 'vp8, vorbis',
8564
+ 'video/mp4': 'avc1.42E01E, mp4a.40.2',
8565
+ 'video/ogg': 'theora'
8566
+ }; // Check for feature support
8567
+
8568
+ var support = {
8569
+ // Basic support
8570
+ audio: 'canPlayType' in document.createElement('audio'),
8571
+ video: 'canPlayType' in document.createElement('video'),
8572
+ // Check for support
8573
+ // Basic functionality vs full UI
8574
+ check: function check(type, provider, playsinline) {
8575
+ var canPlayInline = browser.isIPhone && playsinline && support.playsinline;
8576
+ var api = support[type] || provider !== 'html5';
8577
+ var ui = api && support.rangeInput && (type !== 'video' || !browser.isIPhone || canPlayInline);
8578
+ return {
8579
+ api: api,
8580
+ ui: ui
8581
+ };
8582
+ },
8583
+ // Picture-in-picture support
8584
+ // Safari & Chrome only currently
8585
+ pip: function () {
8586
+ if (browser.isIPhone) {
8587
+ return false;
8588
+ } // Safari
8589
+ // https://developer.apple.com/documentation/webkitjs/adding_picture_in_picture_to_your_safari_media_controls
8590
+
8591
+
8592
+ if (is$1.function(createElement('video').webkitSetPresentationMode)) {
8593
+ return true;
8594
+ } // Chrome
8595
+ // https://developers.google.com/web/updates/2018/10/watch-video-using-picture-in-picture
8596
+
8597
+
8598
+ if (document.pictureInPictureEnabled && !createElement('video').disablePictureInPicture) {
8599
+ return true;
8600
+ }
8601
+
8602
+ return false;
8603
+ }(),
8604
+ // Airplay support
8605
+ // Safari only currently
8606
+ airplay: is$1.function(window.WebKitPlaybackTargetAvailabilityEvent),
8607
+ // Inline playback support
8608
+ // https://webkit.org/blog/6784/new-video-policies-for-ios/
8609
+ playsinline: 'playsInline' in document.createElement('video'),
8610
+ // Check for mime type support against a player instance
8611
+ // Credits: http://diveintohtml5.info/everything.html
8612
+ // Related: http://www.leanbackplayer.com/test/h5mt.html
8613
+ mime: function mime(input) {
8614
+ if (is$1.empty(input)) {
8615
+ return false;
8616
+ }
8617
+
8618
+ var _input$split = input.split('/'),
8619
+ _input$split2 = _slicedToArray(_input$split, 1),
8620
+ mediaType = _input$split2[0];
8621
+
8622
+ var type = input; // Verify we're using HTML5 and there's no media type mismatch
8623
+
8624
+ if (!this.isHTML5 || mediaType !== this.type) {
8625
+ return false;
8626
+ } // Add codec if required
8627
+
8628
+
8629
+ if (Object.keys(defaultCodecs).includes(type)) {
8630
+ type += "; codecs=\"".concat(defaultCodecs[input], "\"");
8631
+ }
8632
+
8633
+ try {
8634
+ return Boolean(type && this.media.canPlayType(type).replace(/no/, ''));
8635
+ } catch (e) {
8636
+ return false;
8637
+ }
8638
+ },
8639
+ // Check for textTracks support
8640
+ textTracks: 'textTracks' in document.createElement('video'),
8641
+ // <input type="range"> Sliders
8642
+ rangeInput: function () {
8643
+ var range = document.createElement('input');
8644
+ range.type = 'range';
8645
+ return range.type === 'range';
8646
+ }(),
8647
+ // Touch
8648
+ // NOTE: Remember a device can be mouse + touch enabled so we check on first touch event
8649
+ touch: 'ontouchstart' in document.documentElement,
8650
+ // Detect transitions support
8651
+ transitions: transitionEndEvent !== false,
8652
+ // Reduced motion iOS & MacOS setting
8653
+ // https://webkit.org/blog/7551/responsive-design-for-motion/
8654
+ reducedMotion: 'matchMedia' in window && window.matchMedia('(prefers-reduced-motion)').matches
8655
+ };
8656
+
8657
+ function validateRatio(input) {
8658
+ if (!is$1.array(input) && (!is$1.string(input) || !input.includes(':'))) {
8659
+ return false;
8660
+ }
8661
+
8662
+ var ratio = is$1.array(input) ? input : input.split(':');
8663
+ return ratio.map(Number).every(is$1.number);
8664
+ }
8665
+ function reduceAspectRatio(ratio) {
8666
+ if (!is$1.array(ratio) || !ratio.every(is$1.number)) {
8667
+ return null;
8668
+ }
8669
 
8670
+ var _ratio = _slicedToArray(ratio, 2),
8671
+ width = _ratio[0],
8672
+ height = _ratio[1];
 
 
 
 
8673
 
8674
+ var getDivider = function getDivider(w, h) {
8675
+ return h === 0 ? w : getDivider(h, w % h);
 
8676
  };
8677
 
8678
+ var divider = getDivider(width, height);
8679
+ return [width / divider, height / divider];
8680
+ }
8681
+ function getAspectRatio(input) {
8682
+ var parse = function parse(ratio) {
8683
+ return validateRatio(ratio) ? ratio.split(':').map(Number) : null;
8684
+ }; // Try provided ratio
 
8685
 
 
 
 
 
8686
 
8687
+ var ratio = parse(input); // Get from config
 
 
 
 
8688
 
8689
+ if (ratio === null) {
8690
+ ratio = parse(this.config.ratio);
8691
+ } // Get from embed
8692
 
 
 
 
 
 
8693
 
8694
+ if (ratio === null && !is$1.empty(this.embed) && is$1.array(this.embed.ratio)) {
8695
+ ratio = this.embed.ratio;
8696
+ } // Get from HTML5 video
8697
 
 
 
 
8698
 
8699
+ if (ratio === null && this.isHTML5) {
8700
+ var _this$media = this.media,
8701
+ videoWidth = _this$media.videoWidth,
8702
+ videoHeight = _this$media.videoHeight;
8703
+ ratio = reduceAspectRatio([videoWidth, videoHeight]);
8704
+ }
8705
 
8706
+ return ratio;
8707
+ } // Set aspect ratio for responsive container
 
 
 
8708
 
8709
+ function setAspectRatio(input) {
8710
+ if (!this.isVideo) {
8711
+ return {};
8712
+ }
 
8713
 
8714
+ var ratio = getAspectRatio.call(this, input);
8715
 
8716
+ var _ref = is$1.array(ratio) ? ratio : [0, 0],
8717
+ _ref2 = _slicedToArray(_ref, 2),
8718
+ w = _ref2[0],
8719
+ h = _ref2[1];
8720
+
8721
+ var padding = 100 / w * h;
8722
+ this.elements.wrapper.style.paddingBottom = "".concat(padding, "%"); // For Vimeo we have an extra <div> to hide the standard controls and UI
8723
+
8724
+ if (this.isVimeo && this.supported.ui) {
8725
+ var height = 240;
8726
+ var offset = (height - padding) / (height / 50);
8727
+ this.media.style.transform = "translateY(-".concat(offset, "%)");
8728
+ } else if (this.isHTML5) {
8729
+ this.elements.wrapper.classList.toggle(this.config.classNames.videoFixedRatio, ratio !== null);
8730
+ }
8731
+
8732
+ return {
8733
+ padding: padding,
8734
+ ratio: ratio
8735
+ };
8736
  }
8737
 
8738
+ // ==========================================================================
8739
+ var html5 = {
8740
+ getSources: function getSources() {
8741
+ var _this = this;
8742
 
8743
+ if (!this.isHTML5) {
8744
+ return [];
8745
+ }
8746
 
8747
+ var sources = Array.from(this.media.querySelectorAll('source')); // Filter out unsupported sources (if type is specified)
8748
 
8749
+ return sources.filter(function (source) {
8750
+ var type = source.getAttribute('type');
8751
 
8752
+ if (is$1.empty(type)) {
8753
+ return true;
8754
+ }
8755
 
8756
+ return support.mime.call(_this, type);
8757
+ });
8758
+ },
8759
+ // Get quality levels
8760
+ getQualityOptions: function getQualityOptions() {
8761
+ // Get sizes from <source> elements
8762
+ return html5.getSources.call(this).map(function (source) {
8763
+ return Number(source.getAttribute('size'));
8764
+ }).filter(Boolean);
8765
+ },
8766
+ extend: function extend() {
8767
+ if (!this.isHTML5) {
8768
+ return;
8769
+ }
8770
 
8771
+ var player = this; // Set aspect ratio if fixed
 
8772
 
8773
+ if (!is$1.empty(this.config.ratio)) {
8774
+ setAspectRatio.call(player);
8775
+ } // Quality
 
 
 
 
 
 
 
 
 
 
8776
 
 
 
8777
 
8778
+ Object.defineProperty(player.media, 'quality', {
8779
+ get: function get() {
8780
+ // Get sources
8781
+ var sources = html5.getSources.call(player);
8782
+ var source = sources.find(function (s) {
8783
+ return s.getAttribute('src') === player.source;
8784
+ }); // Return size, if match is found
 
 
8785
 
8786
+ return source && Number(source.getAttribute('size'));
8787
+ },
8788
+ set: function set(input) {
8789
+ // Get sources
8790
+ var sources = html5.getSources.call(player); // Get first match for requested size
8791
 
8792
+ var source = sources.find(function (s) {
8793
+ return Number(s.getAttribute('size')) === input;
8794
+ }); // No matching source found
 
 
 
 
 
 
 
8795
 
8796
+ if (!source) {
8797
+ return;
8798
+ } // Get current state
 
 
 
 
 
 
 
 
 
 
8799
 
 
 
8800
 
8801
+ var _player$media = player.media,
8802
+ currentTime = _player$media.currentTime,
8803
+ paused = _player$media.paused,
8804
+ preload = _player$media.preload,
8805
+ readyState = _player$media.readyState; // Set new source
8806
 
8807
+ player.media.src = source.getAttribute('src'); // Prevent loading if preload="none" and the current source isn't loaded (#1044)
8808
 
8809
+ if (preload !== 'none' || readyState) {
8810
+ // Restore time
8811
+ player.once('loadedmetadata', function () {
8812
+ player.currentTime = currentTime; // Resume playing
8813
 
8814
+ if (!paused) {
8815
+ player.play();
8816
+ }
8817
+ }); // Load new source
 
8818
 
8819
+ player.media.load();
8820
+ } // Trigger change event
8821
 
 
8822
 
8823
+ triggerEvent.call(player, player.media, 'qualitychange', false, {
8824
+ quality: input
8825
+ });
8826
+ }
8827
+ });
8828
+ },
8829
+ // Cancel current network requests
8830
+ // See https://github.com/sampotts/plyr/issues/174
8831
+ cancelRequests: function cancelRequests() {
8832
+ if (!this.isHTML5) {
8833
+ return;
8834
+ } // Remove child sources
 
 
 
 
 
 
 
 
8835
 
 
8836
 
8837
+ removeElement(html5.getSources.call(this)); // Set blank video src attribute
8838
+ // This is to prevent a MEDIA_ERR_SRC_NOT_SUPPORTED error
8839
+ // Info: http://stackoverflow.com/questions/32231579/how-to-properly-dispose-of-an-html5-video-and-close-socket-or-connection
8840
 
8841
+ this.media.setAttribute('src', this.config.blankVideo); // Load the new empty source
8842
+ // This will cancel existing requests
8843
+ // See https://github.com/sampotts/plyr/issues/174
8844
 
8845
+ this.media.load(); // Debugging
8846
 
8847
+ this.debug.log('Cancelled network requests');
8848
+ }
8849
+ };
8850
 
8851
+ // ==========================================================================
 
8852
 
8853
+ function dedupe(array) {
8854
+ if (!is$1.array(array)) {
8855
+ return array;
8856
+ }
8857
 
8858
+ return array.filter(function (item, index) {
8859
+ return array.indexOf(item) === index;
8860
+ });
8861
+ } // Get the closest value in an array
 
 
 
8862
 
8863
+ function closest(array, value) {
8864
+ if (!is$1.array(array) || !array.length) {
8865
+ return null;
8866
+ }
8867
 
8868
+ return array.reduce(function (prev, curr) {
8869
+ return Math.abs(curr - value) < Math.abs(prev - value) ? curr : prev;
8870
+ });
 
 
8871
  }
8872
 
8873
+ // ==========================================================================
 
 
 
 
8874
 
8875
+ function generateId(prefix) {
8876
+ return "".concat(prefix, "-").concat(Math.floor(Math.random() * 10000));
8877
+ } // Format string
8878
 
8879
+ function format(input) {
8880
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
8881
+ args[_key - 1] = arguments[_key];
8882
+ }
8883
 
8884
+ if (is$1.empty(input)) {
8885
+ return input;
8886
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8887
 
8888
+ return input.toString().replace(/{(\d+)}/g, function (match, i) {
8889
+ return args[i].toString();
8890
+ });
8891
+ } // Get percentage
8892
+
8893
+ function getPercentage(current, max) {
8894
+ if (current === 0 || max === 0 || Number.isNaN(current) || Number.isNaN(max)) {
8895
+ return 0;
8896
+ }
8897
 
8898
+ return (current / max * 100).toFixed(2);
8899
+ } // Replace all occurances of a string in a string
 
8900
 
8901
+ function replaceAll() {
8902
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8903
+ var find = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '';
8904
+ var replace = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : '';
8905
+ return input.replace(new RegExp(find.toString().replace(/([.*+?^=!:${}()|[\]/\\])/g, '\\$1'), 'g'), replace.toString());
8906
+ } // Convert to title case
8907
 
8908
+ function toTitleCase() {
8909
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8910
+ return input.toString().replace(/\w\S*/g, function (text) {
8911
+ return text.charAt(0).toUpperCase() + text.substr(1).toLowerCase();
8912
+ });
8913
+ } // Convert string to pascalCase
8914
 
8915
+ function toPascalCase() {
8916
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8917
+ var string = input.toString(); // Convert kebab case
8918
 
8919
+ string = replaceAll(string, '-', ' '); // Convert snake case
8920
 
8921
+ string = replaceAll(string, '_', ' '); // Convert to title case
8922
 
8923
+ string = toTitleCase(string); // Convert to pascal case
 
8924
 
8925
+ return replaceAll(string, ' ', '');
8926
+ } // Convert string to pascalCase
 
8927
 
8928
+ function toCamelCase() {
8929
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8930
+ var string = input.toString(); // Convert to pascal case
 
 
 
 
 
 
 
 
 
8931
 
8932
+ string = toPascalCase(string); // Convert first character to lowercase
 
 
 
 
 
 
 
 
 
 
 
8933
 
8934
+ return string.charAt(0).toLowerCase() + string.slice(1);
8935
+ } // Remove HTML from a string
 
 
 
 
 
 
 
8936
 
8937
+ function stripHTML(source) {
8938
+ var fragment = document.createDocumentFragment();
8939
+ var element = document.createElement('div');
8940
+ fragment.appendChild(element);
8941
+ element.innerHTML = source;
8942
+ return fragment.firstChild.innerText;
8943
+ } // Like outerHTML, but also works for DocumentFragment
8944
 
8945
+ function getHTML(element) {
8946
+ var wrapper = document.createElement('div');
8947
+ wrapper.appendChild(element);
8948
+ return wrapper.innerHTML;
 
8949
  }
8950
+
8951
+ var resources = {
8952
+ pip: 'PIP',
8953
+ airplay: 'AirPlay',
8954
+ html5: 'HTML5',
8955
+ vimeo: 'Vimeo',
8956
+ youtube: 'YouTube'
8957
+ };
8958
+ var i18n = {
8959
+ get: function get() {
8960
+ var key = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
8961
+ var config = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
8962
+
8963
+ if (is$1.empty(key) || is$1.empty(config)) {
8964
+ return '';
8965
+ }
8966
+
8967
+ var string = getDeep(config.i18n, key);
8968
+
8969
+ if (is$1.empty(string)) {
8970
+ if (Object.keys(resources).includes(key)) {
8971
+ return resources[key];
8972
+ }
8973
+
8974
+ return '';
8975
+ }
8976
+
8977
+ var replace = {
8978
+ '{seektime}': config.seekTime,
8979
+ '{title}': config.title
8980
+ };
8981
+ Object.entries(replace).forEach(function (_ref) {
8982
+ var _ref2 = _slicedToArray(_ref, 2),
8983
+ k = _ref2[0],
8984
+ v = _ref2[1];
8985
+
8986
+ string = replaceAll(string, k, v);
8987
+ });
8988
+ return string;
8989
  }
8990
+ };
 
 
8991
 
8992
+ var Storage =
8993
+ /*#__PURE__*/
8994
+ function () {
8995
+ function Storage(player) {
8996
+ _classCallCheck(this, Storage);
 
 
8997
 
8998
+ this.enabled = player.config.storage.enabled;
8999
+ this.key = player.config.storage.key;
9000
+ } // Check for actual support (see if we can use it)
 
9001
 
 
 
 
 
 
 
 
 
 
9002
 
9003
+ _createClass(Storage, [{
9004
+ key: "get",
9005
+ value: function get(key) {
9006
+ if (!Storage.supported || !this.enabled) {
9007
+ return null;
9008
+ }
9009
 
9010
+ var store = window.localStorage.getItem(this.key);
 
 
 
 
9011
 
9012
+ if (is$1.empty(store)) {
9013
+ return null;
9014
+ }
 
 
 
 
 
 
 
 
 
9015
 
9016
+ var json = JSON.parse(store);
9017
+ return is$1.string(key) && key.length ? json[key] : json;
9018
+ }
9019
+ }, {
9020
+ key: "set",
9021
+ value: function set(object) {
9022
+ // Bail if we don't have localStorage support or it's disabled
9023
+ if (!Storage.supported || !this.enabled) {
9024
+ return;
9025
+ } // Can only store objectst
9026
 
 
 
 
 
 
 
 
 
 
 
9027
 
9028
+ if (!is$1.object(object)) {
9029
+ return;
9030
+ } // Get current storage
9031
 
 
 
 
9032
 
9033
+ var storage = this.get(); // Default to empty object
9034
 
9035
+ if (is$1.empty(storage)) {
9036
+ storage = {};
9037
+ } // Update the working copy of the values
 
 
 
 
 
 
9038
 
 
 
 
 
 
 
 
 
 
9039
 
9040
+ extend(storage, object); // Update storage
 
 
 
 
9041
 
9042
+ window.localStorage.setItem(this.key, JSON.stringify(storage));
9043
+ }
9044
+ }], [{
9045
+ key: "supported",
9046
+ get: function get() {
9047
+ try {
9048
+ if (!('localStorage' in window)) {
9049
+ return false;
9050
+ }
9051
 
9052
+ var test = '___test'; // Try to use it (it might be disabled, e.g. user is in private mode)
9053
+ // see: https://github.com/sampotts/plyr/issues/131
9054
 
9055
+ window.localStorage.setItem(test, test);
9056
+ window.localStorage.removeItem(test);
9057
+ return true;
9058
+ } catch (e) {
9059
+ return false;
9060
+ }
9061
+ }
9062
+ }]);
9063
+
9064
+ return Storage;
9065
+ }();
9066
+
9067
+ // ==========================================================================
9068
+ // Fetch wrapper
9069
+ // Using XHR to avoid issues with older browsers
9070
+ // ==========================================================================
9071
+ function fetch(url) {
9072
+ var responseType = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'text';
9073
+ return new Promise(function (resolve, reject) {
9074
+ try {
9075
+ var request = new XMLHttpRequest(); // Check for CORS support
9076
+
9077
+ if (!('withCredentials' in request)) {
9078
+ return;
9079
+ }
9080
+
9081
+ request.addEventListener('load', function () {
9082
+ if (responseType === 'text') {
9083
+ try {
9084
+ resolve(JSON.parse(request.responseText));
9085
+ } catch (e) {
9086
+ resolve(request.responseText);
9087
+ }
9088
+ } else {
9089
+ resolve(request.response);
9090
+ }
9091
+ });
9092
+ request.addEventListener('error', function () {
9093
+ throw new Error(request.status);
9094
+ });
9095
+ request.open('GET', url, true); // Set the required response type
9096
+
9097
+ request.responseType = responseType;
9098
+ request.send();
9099
+ } catch (e) {
9100
+ reject(e);
9101
+ }
9102
+ });
9103
  }
 
9104
 
9105
+ // ==========================================================================
 
 
 
9106
 
9107
+ function loadSprite(url, id) {
9108
+ if (!is$1.string(url)) {
9109
+ return;
9110
+ }
9111
 
9112
+ var prefix = 'cache';
9113
+ var hasId = is$1.string(id);
9114
+ var isCached = false;
 
 
 
9115
 
9116
+ var exists = function exists() {
9117
+ return document.getElementById(id) !== null;
9118
+ };
9119
 
9120
+ var update = function update(container, data) {
9121
+ // eslint-disable-next-line no-param-reassign
9122
+ container.innerHTML = data; // Check again incase of race condition
 
 
9123
 
9124
+ if (hasId && exists()) {
9125
+ return;
9126
+ } // Inject the SVG to the body
9127
 
 
 
 
 
 
 
 
 
 
 
 
9128
 
9129
+ document.body.insertAdjacentElement('afterbegin', container);
9130
+ }; // Only load once if ID set
 
 
9131
 
 
 
 
 
9132
 
9133
+ if (!hasId || !exists()) {
9134
+ var useStorage = Storage.supported; // Create container
9135
+
9136
+ var container = document.createElement('div');
9137
+ container.setAttribute('hidden', '');
9138
+
9139
+ if (hasId) {
9140
+ container.setAttribute('id', id);
9141
+ } // Check in cache
9142
+
9143
+
9144
+ if (useStorage) {
9145
+ var cached = window.localStorage.getItem("".concat(prefix, "-").concat(id));
9146
+ isCached = cached !== null;
9147
+
9148
+ if (isCached) {
9149
+ var data = JSON.parse(cached);
9150
+ update(container, data.content);
9151
+ }
9152
+ } // Get the sprite
9153
+
9154
+
9155
+ fetch(url).then(function (result) {
9156
+ if (is$1.empty(result)) {
9157
+ return;
9158
+ }
9159
+
9160
+ if (useStorage) {
9161
+ window.localStorage.setItem("".concat(prefix, "-").concat(id), JSON.stringify({
9162
+ content: result
9163
+ }));
9164
+ }
9165
 
9166
+ update(container, result);
9167
+ }).catch(function () {});
9168
+ }
 
9169
  }
9170
+
9171
+ // ==========================================================================
9172
+
9173
+ var getHours = function getHours(value) {
9174
+ return Math.trunc(value / 60 / 60 % 60, 10);
 
9175
  };
9176
+ var getMinutes = function getMinutes(value) {
9177
+ return Math.trunc(value / 60 % 60, 10);
9178
+ };
9179
+ var getSeconds = function getSeconds(value) {
9180
+ return Math.trunc(value % 60, 10);
9181
+ }; // Format time to UI friendly string
9182
 
9183
+ function formatTime() {
9184
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
9185
+ var displayHours = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
9186
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
9187
 
9188
+ // Bail if the value isn't a number
9189
+ if (!is$1.number(time)) {
9190
+ return formatTime(null, displayHours, inverted);
9191
+ } // Format time component to add leading zero
9192
 
 
9193
 
9194
+ var format = function format(value) {
9195
+ return "0".concat(value).slice(-2);
9196
+ }; // Breakdown to hours, mins, secs
9197
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9198
 
9199
+ var hours = getHours(time);
9200
+ var mins = getMinutes(time);
9201
+ var secs = getSeconds(time); // Do we need to display hours?
9202
 
9203
+ if (displayHours || hours > 0) {
9204
+ hours = "".concat(hours, ":");
9205
+ } else {
9206
+ hours = '';
9207
+ } // Render
 
 
 
 
 
 
 
 
 
 
 
 
9208
 
 
 
 
 
 
 
 
 
9209
 
9210
+ return "".concat(inverted && time > 0 ? '-' : '').concat(hours).concat(format(mins), ":").concat(format(secs));
9211
+ }
9212
+
9213
+ var controls = {
9214
+ // Get icon URL
9215
+ getIconUrl: function getIconUrl() {
9216
+ var url = new URL(this.config.iconUrl, window.location);
9217
+ var cors = url.host !== window.location.host || browser.isIE && !window.svg4everybody;
9218
+ return {
9219
+ url: this.config.iconUrl,
9220
+ cors: cors
9221
+ };
9222
+ },
9223
+ // Find the UI controls
9224
+ findElements: function findElements() {
9225
+ try {
9226
+ this.elements.controls = getElement.call(this, this.config.selectors.controls.wrapper); // Buttons
9227
+
9228
+ this.elements.buttons = {
9229
+ play: getElements.call(this, this.config.selectors.buttons.play),
9230
+ pause: getElement.call(this, this.config.selectors.buttons.pause),
9231
+ restart: getElement.call(this, this.config.selectors.buttons.restart),
9232
+ rewind: getElement.call(this, this.config.selectors.buttons.rewind),
9233
+ fastForward: getElement.call(this, this.config.selectors.buttons.fastForward),
9234
+ mute: getElement.call(this, this.config.selectors.buttons.mute),
9235
+ pip: getElement.call(this, this.config.selectors.buttons.pip),
9236
+ airplay: getElement.call(this, this.config.selectors.buttons.airplay),
9237
+ settings: getElement.call(this, this.config.selectors.buttons.settings),
9238
+ captions: getElement.call(this, this.config.selectors.buttons.captions),
9239
+ fullscreen: getElement.call(this, this.config.selectors.buttons.fullscreen)
9240
+ }; // Progress
9241
+
9242
+ this.elements.progress = getElement.call(this, this.config.selectors.progress); // Inputs
9243
+
9244
+ this.elements.inputs = {
9245
+ seek: getElement.call(this, this.config.selectors.inputs.seek),
9246
+ volume: getElement.call(this, this.config.selectors.inputs.volume)
9247
+ }; // Display
9248
+
9249
+ this.elements.display = {
9250
+ buffer: getElement.call(this, this.config.selectors.display.buffer),
9251
+ currentTime: getElement.call(this, this.config.selectors.display.currentTime),
9252
+ duration: getElement.call(this, this.config.selectors.display.duration)
9253
+ }; // Seek tooltip
9254
+
9255
+ if (is$1.element(this.elements.progress)) {
9256
+ this.elements.display.seekTooltip = this.elements.progress.querySelector(".".concat(this.config.classNames.tooltip));
9257
  }
 
9258
 
9259
+ return true;
9260
+ } catch (error) {
9261
+ // Log it
9262
+ this.debug.warn('It looks like there is a problem with your custom controls HTML', error); // Restore native video controls
9263
 
9264
+ this.toggleNativeControls(true);
9265
+ return false;
9266
+ }
9267
+ },
9268
+ // Create <svg> icon
9269
+ createIcon: function createIcon(type, attributes) {
9270
+ var namespace = 'http://www.w3.org/2000/svg';
9271
+ var iconUrl = controls.getIconUrl.call(this);
9272
+ var iconPath = "".concat(!iconUrl.cors ? iconUrl.url : '', "#").concat(this.config.iconPrefix); // Create <svg>
 
 
 
 
 
9273
 
9274
+ var icon = document.createElementNS(namespace, 'svg');
9275
+ setAttributes(icon, extend(attributes, {
9276
+ role: 'presentation',
9277
+ focusable: 'false'
9278
+ })); // Create the <use> to reference sprite
9279
 
9280
+ var use = document.createElementNS(namespace, 'use');
9281
+ var path = "".concat(iconPath, "-").concat(type); // Set `href` attributes
9282
+ // https://github.com/sampotts/plyr/issues/460
9283
+ // https://developer.mozilla.org/en-US/docs/Web/SVG/Attribute/xlink:href
 
 
9284
 
9285
+ if ('href' in use) {
9286
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'href', path);
9287
+ } // Always set the older attribute even though it's "deprecated" (it'll be around for ages)
9288
+
9289
+
9290
+ use.setAttributeNS('http://www.w3.org/1999/xlink', 'xlink:href', path); // Add <use> to <svg>
9291
+
9292
+ icon.appendChild(use);
9293
+ return icon;
9294
+ },
9295
+ // Create hidden text label
9296
+ createLabel: function createLabel(key) {
9297
+ var attr = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {};
9298
+ var text = i18n.get(key, this.config);
9299
+ var attributes = Object.assign({}, attr, {
9300
+ class: [attr.class, this.config.classNames.hidden].filter(Boolean).join(' ')
9301
+ });
9302
+ return createElement('span', attributes, text);
9303
+ },
9304
+ // Create a badge
9305
+ createBadge: function createBadge(text) {
9306
+ if (is$1.empty(text)) {
9307
+ return null;
9308
+ }
9309
+
9310
+ var badge = createElement('span', {
9311
+ class: this.config.classNames.menu.value
9312
+ });
9313
+ badge.appendChild(createElement('span', {
9314
+ class: this.config.classNames.menu.badge
9315
+ }, text));
9316
+ return badge;
9317
+ },
9318
+ // Create a <button>
9319
+ createButton: function createButton(buttonType, attr) {
9320
+ var _this = this;
9321
+
9322
+ var attributes = extend({}, attr);
9323
+ var type = toCamelCase(buttonType);
9324
+ var props = {
9325
+ element: 'button',
9326
+ toggle: false,
9327
+ label: null,
9328
+ icon: null,
9329
+ labelPressed: null,
9330
+ iconPressed: null
9331
+ };
9332
+ ['element', 'icon', 'label'].forEach(function (key) {
9333
+ if (Object.keys(attributes).includes(key)) {
9334
+ props[key] = attributes[key];
9335
+ delete attributes[key];
9336
  }
9337
+ }); // Default to 'button' type to prevent form submission
9338
 
9339
+ if (props.element === 'button' && !Object.keys(attributes).includes('type')) {
9340
+ attributes.type = 'button';
9341
+ } // Set class name
 
 
9342
 
 
 
9343
 
9344
+ if (Object.keys(attributes).includes('class')) {
9345
+ if (!attributes.class.split(' ').some(function (c) {
9346
+ return c === _this.config.classNames.control;
9347
+ })) {
9348
+ extend(attributes, {
9349
+ class: "".concat(attributes.class, " ").concat(this.config.classNames.control)
9350
+ });
9351
+ }
9352
+ } else {
9353
+ attributes.class = this.config.classNames.control;
9354
+ } // Large play button
9355
+
9356
+
9357
+ switch (buttonType) {
9358
+ case 'play':
9359
+ props.toggle = true;
9360
+ props.label = 'play';
9361
+ props.labelPressed = 'pause';
9362
+ props.icon = 'play';
9363
+ props.iconPressed = 'pause';
9364
+ break;
9365
+
9366
+ case 'mute':
9367
+ props.toggle = true;
9368
+ props.label = 'mute';
9369
+ props.labelPressed = 'unmute';
9370
+ props.icon = 'volume';
9371
+ props.iconPressed = 'muted';
9372
+ break;
9373
+
9374
+ case 'captions':
9375
+ props.toggle = true;
9376
+ props.label = 'enableCaptions';
9377
+ props.labelPressed = 'disableCaptions';
9378
+ props.icon = 'captions-off';
9379
+ props.iconPressed = 'captions-on';
9380
+ break;
9381
+
9382
+ case 'fullscreen':
9383
+ props.toggle = true;
9384
+ props.label = 'enterFullscreen';
9385
+ props.labelPressed = 'exitFullscreen';
9386
+ props.icon = 'enter-fullscreen';
9387
+ props.iconPressed = 'exit-fullscreen';
9388
+ break;
9389
+
9390
+ case 'play-large':
9391
+ attributes.class += " ".concat(this.config.classNames.control, "--overlaid");
9392
+ type = 'play';
9393
+ props.label = 'play';
9394
+ props.icon = 'play';
9395
+ break;
9396
+
9397
+ default:
9398
+ if (is$1.empty(props.label)) {
9399
+ props.label = type;
9400
+ }
9401
+
9402
+ if (is$1.empty(props.icon)) {
9403
+ props.icon = buttonType;
9404
+ }
9405
 
9406
+ }
 
 
 
9407
 
9408
+ var button = createElement(props.element); // Setup toggle icon and labels
9409
+
9410
+ if (props.toggle) {
9411
+ // Icon
9412
+ button.appendChild(controls.createIcon.call(this, props.iconPressed, {
9413
+ class: 'icon--pressed'
9414
+ }));
9415
+ button.appendChild(controls.createIcon.call(this, props.icon, {
9416
+ class: 'icon--not-pressed'
9417
+ })); // Label/Tooltip
9418
+
9419
+ button.appendChild(controls.createLabel.call(this, props.labelPressed, {
9420
+ class: 'label--pressed'
9421
+ }));
9422
+ button.appendChild(controls.createLabel.call(this, props.label, {
9423
+ class: 'label--not-pressed'
9424
+ }));
9425
+ } else {
9426
+ button.appendChild(controls.createIcon.call(this, props.icon));
9427
+ button.appendChild(controls.createLabel.call(this, props.label));
9428
+ } // Merge and set attributes
9429
 
9430
+
9431
+ extend(attributes, getAttributesFromSelector(this.config.selectors.buttons[type], attributes));
9432
+ setAttributes(button, attributes); // We have multiple play buttons
9433
+
9434
+ if (type === 'play') {
9435
+ if (!is$1.array(this.elements.buttons[type])) {
9436
+ this.elements.buttons[type] = [];
 
 
 
9437
  }
 
9438
 
9439
+ this.elements.buttons[type].push(button);
9440
+ } else {
9441
+ this.elements.buttons[type] = button;
9442
+ }
9443
 
9444
+ return button;
9445
+ },
9446
+ // Create an <input type='range'>
9447
+ createRange: function createRange(type, attributes) {
9448
+ // Seek input
9449
+ var input = createElement('input', extend(getAttributesFromSelector(this.config.selectors.inputs[type]), {
9450
+ type: 'range',
9451
+ min: 0,
9452
+ max: 100,
9453
+ step: 0.01,
9454
+ value: 0,
9455
+ autocomplete: 'off',
9456
+ // A11y fixes for https://github.com/sampotts/plyr/issues/905
9457
+ role: 'slider',
9458
+ 'aria-label': i18n.get(type, this.config),
9459
+ 'aria-valuemin': 0,
9460
+ 'aria-valuemax': 100,
9461
+ 'aria-valuenow': 0
9462
+ }, attributes));
9463
+ this.elements.inputs[type] = input; // Set the fill for webkit now
9464
+
9465
+ controls.updateRangeFill.call(this, input); // Improve support on touch devices
9466
+
9467
+ RangeTouch.setup(input);
9468
+ return input;
9469
+ },
9470
+ // Create a <progress>
9471
+ createProgress: function createProgress(type, attributes) {
9472
+ var progress = createElement('progress', extend(getAttributesFromSelector(this.config.selectors.display[type]), {
9473
+ min: 0,
9474
+ max: 100,
9475
+ value: 0,
9476
+ role: 'progressbar',
9477
+ 'aria-hidden': true
9478
+ }, attributes)); // Create the label inside
9479
+
9480
+ if (type !== 'volume') {
9481
+ progress.appendChild(createElement('span', null, '0'));
9482
+ var suffixKey = {
9483
+ played: 'played',
9484
+ buffer: 'buffered'
9485
+ }[type];
9486
+ var suffix = suffixKey ? i18n.get(suffixKey, this.config) : '';
9487
+ progress.innerText = "% ".concat(suffix.toLowerCase());
9488
+ }
9489
 
9490
+ this.elements.display[type] = progress;
9491
+ return progress;
9492
+ },
9493
+ // Create time display
9494
+ createTime: function createTime(type, attrs) {
9495
+ var attributes = getAttributesFromSelector(this.config.selectors.display[type], attrs);
9496
+ var container = createElement('div', extend(attributes, {
9497
+ class: "".concat(attributes.class ? attributes.class : '', " ").concat(this.config.classNames.display.time, " ").trim(),
9498
+ 'aria-label': i18n.get(type, this.config)
9499
+ }), '00:00'); // Reference for updates
9500
+
9501
+ this.elements.display[type] = container;
9502
+ return container;
9503
+ },
9504
+ // Bind keyboard shortcuts for a menu item
9505
+ // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
9506
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
9507
+ bindMenuItemShortcuts: function bindMenuItemShortcuts(menuItem, type) {
9508
+ var _this2 = this;
9509
 
9510
+ // Navigate through menus via arrow keys and space
9511
+ on(menuItem, 'keydown keyup', function (event) {
9512
+ // We only care about space and ⬆️ ⬇️️ ➡️
9513
+ if (![32, 38, 39, 40].includes(event.which)) {
9514
+ return;
9515
+ } // Prevent play / seek
9516
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9517
 
9518
+ event.preventDefault();
9519
+ event.stopPropagation(); // We're just here to prevent the keydown bubbling
9520
 
9521
+ if (event.type === 'keydown') {
9522
+ return;
9523
+ }
9524
 
9525
+ var isRadioButton = matches$1(menuItem, '[role="menuitemradio"]'); // Show the respective menu
9526
 
9527
+ if (!isRadioButton && [32, 39].includes(event.which)) {
9528
+ controls.showMenuPanel.call(_this2, type, true);
9529
+ } else {
9530
+ var target;
 
 
 
9531
 
9532
+ if (event.which !== 32) {
9533
+ if (event.which === 40 || isRadioButton && event.which === 39) {
9534
+ target = menuItem.nextElementSibling;
9535
 
9536
+ if (!is$1.element(target)) {
9537
+ target = menuItem.parentNode.firstElementChild;
9538
+ }
9539
+ } else {
9540
+ target = menuItem.previousElementSibling;
9541
 
9542
+ if (!is$1.element(target)) {
9543
+ target = menuItem.parentNode.lastElementChild;
9544
+ }
9545
+ }
 
 
 
 
 
 
 
9546
 
9547
+ setFocus.call(_this2, target, true);
9548
+ }
9549
+ }
9550
+ }, false); // Enter will fire a `click` event but we still need to manage focus
9551
+ // So we bind to keyup which fires after and set focus here
 
 
 
 
 
 
 
9552
 
9553
+ on(menuItem, 'keyup', function (event) {
9554
+ if (event.which !== 13) {
9555
+ return;
9556
+ }
9557
 
9558
+ controls.focusFirstMenuItem.call(_this2, null, true);
9559
+ });
9560
+ },
9561
+ // Create a settings menu item
9562
+ createMenuItem: function createMenuItem(_ref) {
9563
+ var _this3 = this;
9564
+
9565
+ var value = _ref.value,
9566
+ list = _ref.list,
9567
+ type = _ref.type,
9568
+ title = _ref.title,
9569
+ _ref$badge = _ref.badge,
9570
+ badge = _ref$badge === void 0 ? null : _ref$badge,
9571
+ _ref$checked = _ref.checked,
9572
+ checked = _ref$checked === void 0 ? false : _ref$checked;
9573
+ var attributes = getAttributesFromSelector(this.config.selectors.inputs[type]);
9574
+ var menuItem = createElement('button', extend(attributes, {
9575
+ type: 'button',
9576
+ role: 'menuitemradio',
9577
+ class: "".concat(this.config.classNames.control, " ").concat(attributes.class ? attributes.class : '').trim(),
9578
+ 'aria-checked': checked,
9579
+ value: value
9580
+ }));
9581
+ var flex = createElement('span'); // We have to set as HTML incase of special characters
9582
+
9583
+ flex.innerHTML = title;
9584
+
9585
+ if (is$1.element(badge)) {
9586
+ flex.appendChild(badge);
9587
  }
9588
 
9589
+ menuItem.appendChild(flex); // Replicate radio button behaviour
9590
+
9591
+ Object.defineProperty(menuItem, 'checked', {
9592
+ enumerable: true,
9593
+ get: function get() {
9594
+ return menuItem.getAttribute('aria-checked') === 'true';
9595
+ },
9596
+ set: function set(check) {
9597
+ // Ensure exclusivity
9598
+ if (check) {
9599
+ Array.from(menuItem.parentNode.children).filter(function (node) {
9600
+ return matches$1(node, '[role="menuitemradio"]');
9601
+ }).forEach(function (node) {
9602
+ return node.setAttribute('aria-checked', 'false');
9603
+ });
9604
+ }
9605
+
9606
+ menuItem.setAttribute('aria-checked', check ? 'true' : 'false');
9607
+ }
9608
+ });
9609
+ this.listeners.bind(menuItem, 'click keyup', function (event) {
9610
+ if (is$1.keyboardEvent(event) && event.which !== 32) {
9611
+ return;
9612
+ }
9613
+
9614
+ event.preventDefault();
9615
+ event.stopPropagation();
9616
+ menuItem.checked = true;
9617
+
9618
+ switch (type) {
9619
+ case 'language':
9620
+ _this3.currentTrack = Number(value);
9621
+ break;
9622
+
9623
+ case 'quality':
9624
+ _this3.quality = value;
9625
+ break;
9626
+
9627
+ case 'speed':
9628
+ _this3.speed = parseFloat(value);
9629
+ break;
9630
+
9631
+ default:
9632
+ break;
9633
+ }
9634
+
9635
+ controls.showMenuPanel.call(_this3, 'home', is$1.keyboardEvent(event));
9636
+ }, type, false);
9637
+ controls.bindMenuItemShortcuts.call(this, menuItem, type);
9638
+ list.appendChild(menuItem);
9639
+ },
9640
+ // Format a time for display
9641
+ formatTime: function formatTime$1() {
9642
+ var time = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
9643
+ var inverted = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
9644
+
9645
+ // Bail if the value isn't a number
9646
+ if (!is$1.number(time)) {
9647
+ return time;
9648
+ } // Always display hours if duration is over an hour
9649
+
9650
+
9651
+ var forceHours = getHours(this.duration) > 0;
9652
+ return formatTime(time, forceHours, inverted);
9653
+ },
9654
+ // Update the displayed time
9655
+ updateTimeDisplay: function updateTimeDisplay() {
9656
+ var target = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : null;
9657
+ var time = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
9658
+ var inverted = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
9659
+
9660
+ // Bail if there's no element to display or the value isn't a number
9661
+ if (!is$1.element(target) || !is$1.number(time)) {
9662
  return;
9663
+ } // eslint-disable-next-line no-param-reassign
9664
 
 
 
 
 
 
9665
 
9666
+ target.innerText = controls.formatTime(time, inverted);
9667
+ },
9668
+ // Update volume UI and storage
9669
+ updateVolume: function updateVolume() {
9670
+ if (!this.supported.ui) {
9671
+ return;
9672
+ } // Update range
9673
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9674
 
9675
+ if (is$1.element(this.elements.inputs.volume)) {
9676
+ controls.setRange.call(this, this.elements.inputs.volume, this.muted ? 0 : this.volume);
9677
+ } // Update mute state
9678
 
 
9679
 
9680
+ if (is$1.element(this.elements.buttons.mute)) {
9681
+ this.elements.buttons.mute.pressed = this.muted || this.volume === 0;
9682
+ }
9683
+ },
9684
+ // Update seek value and lower fill
9685
+ setRange: function setRange(target) {
9686
+ var value = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
9687
 
9688
+ if (!is$1.element(target)) {
9689
+ return;
9690
+ } // eslint-disable-next-line
 
 
 
 
9691
 
 
9692
 
9693
+ target.value = value; // Webkit range fill
9694
 
9695
+ controls.updateRangeFill.call(this, target);
9696
+ },
9697
+ // Update <progress> elements
9698
+ updateProgress: function updateProgress(event) {
9699
+ var _this4 = this;
9700
 
9701
+ if (!this.supported.ui || !is$1.event(event)) {
9702
+ return;
9703
+ }
9704
 
9705
+ var value = 0;
 
 
 
 
9706
 
9707
+ var setProgress = function setProgress(target, input) {
9708
+ var val = is$1.number(input) ? input : 0;
9709
+ var progress = is$1.element(target) ? target : _this4.elements.display.buffer; // Update value and label
9710
 
9711
+ if (is$1.element(progress)) {
9712
+ progress.value = val; // Update text label inside
 
 
 
 
 
 
 
 
 
 
 
9713
 
9714
+ var label = progress.getElementsByTagName('span')[0];
9715
 
9716
+ if (is$1.element(label)) {
9717
+ label.childNodes[0].nodeValue = val;
9718
+ }
9719
+ }
9720
+ };
9721
 
9722
+ if (event) {
9723
+ switch (event.type) {
9724
+ // Video playing
9725
+ case 'timeupdate':
9726
+ case 'seeking':
9727
+ case 'seeked':
9728
+ value = getPercentage(this.currentTime, this.duration); // Set seek range value only if it's a 'natural' time event
9729
 
9730
+ if (event.type === 'timeupdate') {
9731
+ controls.setRange.call(this, this.elements.inputs.seek, value);
9732
+ }
9733
 
9734
+ break;
9735
+ // Check buffer status
9736
 
9737
+ case 'playing':
9738
+ case 'progress':
9739
+ setProgress(this.elements.display.buffer, this.buffered * 100);
9740
+ break;
 
 
 
 
 
 
 
 
9741
 
9742
+ default:
9743
+ break;
9744
+ }
9745
+ }
9746
+ },
9747
+ // Webkit polyfill for lower fill range
9748
+ updateRangeFill: function updateRangeFill(target) {
9749
+ // Get range from event if event passed
9750
+ var range = is$1.event(target) ? target.target : target; // Needs to be a valid <input type='range'>
9751
 
9752
+ if (!is$1.element(range) || range.getAttribute('type') !== 'range') {
9753
+ return;
9754
+ } // Set aria values for https://github.com/sampotts/plyr/issues/905
9755
+
9756
+
9757
+ if (matches$1(range, this.config.selectors.inputs.seek)) {
9758
+ range.setAttribute('aria-valuenow', this.currentTime);
9759
+ var currentTime = controls.formatTime(this.currentTime);
9760
+ var duration = controls.formatTime(this.duration);
9761
+ var format = i18n.get('seekLabel', this.config);
9762
+ range.setAttribute('aria-valuetext', format.replace('{currentTime}', currentTime).replace('{duration}', duration));
9763
+ } else if (matches$1(range, this.config.selectors.inputs.volume)) {
9764
+ var percent = range.value * 100;
9765
+ range.setAttribute('aria-valuenow', percent);
9766
+ range.setAttribute('aria-valuetext', "".concat(percent.toFixed(1), "%"));
9767
+ } else {
9768
+ range.setAttribute('aria-valuenow', range.value);
9769
+ } // WebKit only
9770
 
 
 
9771
 
9772
+ if (!browser.isWebkit) {
9773
+ return;
9774
+ } // Set CSS custom property
 
 
 
 
 
 
9775
 
 
 
9776
 
9777
+ range.style.setProperty('--value', "".concat(range.value / range.max * 100, "%"));
9778
+ },
9779
+ // Update hover tooltip for seeking
9780
+ updateSeekTooltip: function updateSeekTooltip(event) {
9781
+ var _this5 = this;
 
 
 
 
 
9782
 
9783
+ // Bail if setting not true
9784
+ if (!this.config.tooltips.seek || !is$1.element(this.elements.inputs.seek) || !is$1.element(this.elements.display.seekTooltip) || this.duration === 0) {
9785
+ return;
9786
+ }
 
 
 
 
 
 
 
 
 
9787
 
9788
+ var visible = "".concat(this.config.classNames.tooltip, "--visible");
 
9789
 
9790
+ var toggle = function toggle(show) {
9791
+ return toggleClass(_this5.elements.display.seekTooltip, visible, show);
9792
+ }; // Hide on touch
 
9793
 
 
9794
 
9795
+ if (this.touch) {
9796
+ toggle(false);
9797
+ return;
9798
+ } // Determine percentage, if already visible
9799
 
 
 
 
 
 
9800
 
9801
+ var percent = 0;
9802
+ var clientRect = this.elements.progress.getBoundingClientRect();
9803
 
9804
+ if (is$1.event(event)) {
9805
+ percent = 100 / clientRect.width * (event.pageX - clientRect.left);
9806
+ } else if (hasClass(this.elements.display.seekTooltip, visible)) {
9807
+ percent = parseFloat(this.elements.display.seekTooltip.style.left, 10);
9808
+ } else {
9809
+ return;
9810
+ } // Set bounds
 
 
 
 
 
9811
 
 
 
9812
 
9813
+ if (percent < 0) {
9814
+ percent = 0;
9815
+ } else if (percent > 100) {
9816
+ percent = 100;
9817
+ } // Display the time a click would seek to
9818
 
 
 
 
 
 
 
 
9819
 
9820
+ controls.updateTimeDisplay.call(this, this.elements.display.seekTooltip, this.duration / 100 * percent); // Set position
9821
 
9822
+ this.elements.display.seekTooltip.style.left = "".concat(percent, "%"); // Show/hide the tooltip
9823
+ // If the event is a moues in/out and percentage is inside bounds
 
 
9824
 
9825
+ if (is$1.event(event) && ['mouseenter', 'mouseleave'].includes(event.type)) {
9826
+ toggle(event.type === 'mouseenter');
9827
+ }
9828
+ },
9829
+ // Handle time change event
9830
+ timeUpdate: function timeUpdate(event) {
9831
+ // Only invert if only one time element is displayed and used for both duration and currentTime
9832
+ var invert = !is$1.element(this.elements.display.duration) && this.config.invertTime; // Duration
9833
 
9834
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, invert ? this.duration - this.currentTime : this.currentTime, invert); // Ignore updates while seeking
 
 
 
 
 
 
 
 
 
 
 
 
 
9835
 
9836
+ if (event && event.type === 'timeupdate' && this.media.seeking) {
9837
+ return;
9838
+ } // Playing progress
9839
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9840
 
9841
+ controls.updateProgress.call(this, event);
9842
+ },
9843
+ // Show the duration on metadataloaded or durationchange events
9844
+ durationUpdate: function durationUpdate() {
9845
+ // Bail if no UI or durationchange event triggered after playing/seek when invertTime is false
9846
+ if (!this.supported.ui || !this.config.invertTime && this.currentTime) {
9847
+ return;
9848
+ } // If duration is the 2**32 (shaka), Infinity (HLS), DASH-IF (Number.MAX_SAFE_INTEGER || Number.MAX_VALUE) indicating live we hide the currentTime and progressbar.
9849
+ // https://github.com/video-dev/hls.js/blob/5820d29d3c4c8a46e8b75f1e3afa3e68c1a9a2db/src/controller/buffer-controller.js#L415
9850
+ // https://github.com/google/shaka-player/blob/4d889054631f4e1cf0fbd80ddd2b71887c02e232/lib/media/streaming_engine.js#L1062
9851
+ // https://github.com/Dash-Industry-Forum/dash.js/blob/69859f51b969645b234666800d4cb596d89c602d/src/dash/models/DashManifestModel.js#L338
9852
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9853
 
9854
+ if (this.duration >= Math.pow(2, 32)) {
9855
+ toggleHidden(this.elements.display.currentTime, true);
9856
+ toggleHidden(this.elements.progress, true);
9857
+ return;
9858
+ } // Update ARIA values
9859
 
 
9860
 
9861
+ if (is$1.element(this.elements.inputs.seek)) {
9862
+ this.elements.inputs.seek.setAttribute('aria-valuemax', this.duration);
9863
+ } // If there's a spot to display duration
9864
 
 
 
 
 
 
 
 
 
 
 
 
9865
 
9866
+ var hasDuration = is$1.element(this.elements.display.duration); // If there's only one time display, display duration there
9867
 
9868
+ if (!hasDuration && this.config.displayDuration && this.paused) {
9869
+ controls.updateTimeDisplay.call(this, this.elements.display.currentTime, this.duration);
9870
+ } // If there's a duration element, update content
 
 
 
 
 
 
 
9871
 
 
 
 
 
 
 
9872
 
9873
+ if (hasDuration) {
9874
+ controls.updateTimeDisplay.call(this, this.elements.display.duration, this.duration);
9875
+ } // Update the tooltip (if visible)
9876
 
 
9877
 
9878
+ controls.updateSeekTooltip.call(this);
9879
+ },
9880
+ // Hide/show a tab
9881
+ toggleMenuButton: function toggleMenuButton(setting, toggle) {
9882
+ toggleHidden(this.elements.settings.buttons[setting], !toggle);
9883
+ },
9884
+ // Update the selected setting
9885
+ updateSetting: function updateSetting(setting, container, input) {
9886
+ var pane = this.elements.settings.panels[setting];
9887
+ var value = null;
9888
+ var list = container;
9889
+
9890
+ if (setting === 'captions') {
9891
+ value = this.currentTrack;
9892
+ } else {
9893
+ value = !is$1.empty(input) ? input : this[setting]; // Get default
9894
 
9895
+ if (is$1.empty(value)) {
9896
+ value = this.config[setting].default;
9897
+ } // Unsupported value
 
9898
 
 
 
 
 
9899
 
9900
+ if (!is$1.empty(this.options[setting]) && !this.options[setting].includes(value)) {
9901
+ this.debug.warn("Unsupported value of '".concat(value, "' for ").concat(setting));
9902
+ return;
9903
+ } // Disabled value
9904
 
 
 
 
 
9905
 
9906
+ if (!this.config[setting].options.includes(value)) {
9907
+ this.debug.warn("Disabled value of '".concat(value, "' for ").concat(setting));
9908
+ return;
9909
+ }
9910
+ } // Get the list if we need to
9911
 
 
9912
 
9913
+ if (!is$1.element(list)) {
9914
+ list = pane && pane.querySelector('[role="menu"]');
9915
+ } // If there's no list it means it's not been rendered...
 
 
 
 
 
9916
 
 
 
 
 
 
 
9917
 
9918
+ if (!is$1.element(list)) {
9919
+ return;
9920
+ } // Update the label
9921
 
 
 
 
 
 
 
 
9922
 
9923
+ var label = this.elements.settings.buttons[setting].querySelector(".".concat(this.config.classNames.menu.value));
9924
+ label.innerHTML = controls.getLabel.call(this, setting, value); // Find the radio option and check it
 
 
 
 
9925
 
9926
+ var target = list && list.querySelector("[value=\"".concat(value, "\"]"));
 
9927
 
9928
+ if (is$1.element(target)) {
9929
+ target.checked = true;
9930
+ }
9931
+ },
9932
+ // Translate a value into a nice label
9933
+ getLabel: function getLabel(setting, value) {
9934
+ switch (setting) {
9935
+ case 'speed':
9936
+ return value === 1 ? i18n.get('normal', this.config) : "".concat(value, "&times;");
9937
+
9938
+ case 'quality':
9939
+ if (is$1.number(value)) {
9940
+ var label = i18n.get("qualityLabel.".concat(value), this.config);
9941
+
9942
+ if (!label.length) {
9943
+ return "".concat(value, "p");
9944
+ }
9945
 
9946
+ return label;
9947
+ }
9948
 
9949
+ return toTitleCase(value);
9950
 
9951
+ case 'captions':
9952
+ return captions.getLabel.call(this);
9953
 
9954
+ default:
9955
+ return null;
9956
+ }
9957
+ },
9958
+ // Set the quality menu
9959
+ setQualityMenu: function setQualityMenu(options) {
9960
+ var _this6 = this;
9961
 
9962
+ // Menu required
9963
+ if (!is$1.element(this.elements.settings.panels.quality)) {
9964
+ return;
9965
+ }
9966
 
9967
+ var type = 'quality';
9968
+ var list = this.elements.settings.panels.quality.querySelector('[role="menu"]'); // Set options if passed and filter based on uniqueness and config
 
 
 
 
 
 
 
 
 
 
 
 
9969
 
9970
+ if (is$1.array(options)) {
9971
+ this.options.quality = dedupe(options).filter(function (quality) {
9972
+ return _this6.config.quality.options.includes(quality);
9973
+ });
9974
+ } // Toggle the pane and tab
9975
 
 
 
 
 
 
 
 
 
 
 
 
 
9976
 
9977
+ var toggle = !is$1.empty(this.options.quality) && this.options.quality.length > 1;
9978
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
 
 
 
 
 
 
9979
 
9980
+ emptyElement(list); // Check if we need to toggle the parent
 
 
9981
 
9982
+ controls.checkMenu.call(this); // If we're hiding, nothing more to do
9983
 
9984
+ if (!toggle) {
9985
+ return;
9986
+ } // Get the badge HTML for HD, 4K etc
 
9987
 
 
9988
 
9989
+ var getBadge = function getBadge(quality) {
9990
+ var label = i18n.get("qualityBadge.".concat(quality), _this6.config);
 
9991
 
9992
+ if (!label.length) {
9993
+ return null;
9994
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9995
 
9996
+ return controls.createBadge.call(_this6, label);
9997
+ }; // Sort options by the config and then render options
9998
 
9999
 
10000
+ this.options.quality.sort(function (a, b) {
10001
+ var sorting = _this6.config.quality.options;
10002
+ return sorting.indexOf(a) > sorting.indexOf(b) ? 1 : -1;
10003
+ }).forEach(function (quality) {
10004
+ controls.createMenuItem.call(_this6, {
10005
+ value: quality,
10006
+ list: list,
10007
+ type: type,
10008
+ title: controls.getLabel.call(_this6, 'quality', quality),
10009
+ badge: getBadge(quality)
10010
+ });
10011
+ });
10012
+ controls.updateSetting.call(this, type, list);
10013
+ },
10014
+ // Set the looping options
10015
 
10016
+ /* setLoopMenu() {
10017
+ // Menu required
10018
+ if (!is.element(this.elements.settings.panels.loop)) {
10019
+ return;
10020
+ }
10021
+ const options = ['start', 'end', 'all', 'reset'];
10022
+ const list = this.elements.settings.panels.loop.querySelector('[role="menu"]');
10023
+ // Show the pane and tab
10024
+ toggleHidden(this.elements.settings.buttons.loop, false);
10025
+ toggleHidden(this.elements.settings.panels.loop, false);
10026
+ // Toggle the pane and tab
10027
+ const toggle = !is.empty(this.loop.options);
10028
+ controls.toggleMenuButton.call(this, 'loop', toggle);
10029
+ // Empty the menu
10030
+ emptyElement(list);
10031
+ options.forEach(option => {
10032
+ const item = createElement('li');
10033
+ const button = createElement(
10034
+ 'button',
10035
+ extend(getAttributesFromSelector(this.config.selectors.buttons.loop), {
10036
+ type: 'button',
10037
+ class: this.config.classNames.control,
10038
+ 'data-plyr-loop-action': option,
10039
+ }),
10040
+ i18n.get(option, this.config)
10041
+ );
10042
+ if (['start', 'end'].includes(option)) {
10043
+ const badge = controls.createBadge.call(this, '00:00');
10044
+ button.appendChild(badge);
10045
+ }
10046
+ item.appendChild(button);
10047
+ list.appendChild(item);
10048
+ });
10049
+ }, */
10050
+ // Get current selected caption language
10051
+ // TODO: rework this to user the getter in the API?
10052
+ // Set a list of available captions languages
10053
+ setCaptionsMenu: function setCaptionsMenu() {
10054
+ var _this7 = this;
10055
+
10056
+ // Menu required
10057
+ if (!is$1.element(this.elements.settings.panels.captions)) {
10058
+ return;
10059
+ } // TODO: Captions or language? Currently it's mixed
10060
 
 
10061
 
10062
+ var type = 'captions';
10063
+ var list = this.elements.settings.panels.captions.querySelector('[role="menu"]');
10064
+ var tracks = captions.getTracks.call(this);
10065
+ var toggle = Boolean(tracks.length); // Toggle the pane and tab
 
 
 
10066
 
10067
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
10068
 
10069
+ emptyElement(list); // Check if we need to toggle the parent
 
 
10070
 
10071
+ controls.checkMenu.call(this); // If there's no captions, bail
10072
 
10073
+ if (!toggle) {
10074
+ return;
10075
+ } // Generate options data
10076
 
 
 
 
 
 
 
 
 
 
 
10077
 
10078
+ var options = tracks.map(function (track, value) {
10079
+ return {
10080
+ value: value,
10081
+ checked: _this7.captions.toggled && _this7.currentTrack === value,
10082
+ title: captions.getLabel.call(_this7, track),
10083
+ badge: track.language && controls.createBadge.call(_this7, track.language.toUpperCase()),
10084
+ list: list,
10085
+ type: 'language'
10086
+ };
10087
+ }); // Add the "Disabled" option to turn off captions
10088
+
10089
+ options.unshift({
10090
+ value: -1,
10091
+ checked: !this.captions.toggled,
10092
+ title: i18n.get('disabled', this.config),
10093
+ list: list,
10094
+ type: 'language'
10095
+ }); // Generate options
10096
+
10097
+ options.forEach(controls.createMenuItem.bind(this));
10098
+ controls.updateSetting.call(this, type, list);
10099
+ },
10100
+ // Set a list of available captions languages
10101
+ setSpeedMenu: function setSpeedMenu(options) {
10102
+ var _this8 = this;
10103
 
10104
+ // Menu required
10105
+ if (!is$1.element(this.elements.settings.panels.speed)) {
10106
+ return;
10107
+ }
10108
 
10109
+ var type = 'speed';
10110
+ var list = this.elements.settings.panels.speed.querySelector('[role="menu"]'); // Set the speed options
10111
 
10112
+ if (is$1.array(options)) {
10113
+ this.options.speed = options;
10114
+ } else if (this.isHTML5 || this.isVimeo) {
10115
+ this.options.speed = [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2];
10116
+ } // Set options if passed and filter based on config
10117
+
10118
+
10119
+ this.options.speed = this.options.speed.filter(function (speed) {
10120
+ return _this8.config.speed.options.includes(speed);
10121
+ }); // Toggle the pane and tab
10122
+
10123
+ var toggle = !is$1.empty(this.options.speed) && this.options.speed.length > 1;
10124
+ controls.toggleMenuButton.call(this, type, toggle); // Empty the menu
10125
+
10126
+ emptyElement(list); // Check if we need to toggle the parent
10127
+
10128
+ controls.checkMenu.call(this); // If we're hiding, nothing more to do
10129
 
10130
+ if (!toggle) {
10131
+ return;
10132
+ } // Create items
10133
 
 
 
 
 
 
 
 
 
10134
 
10135
+ this.options.speed.forEach(function (speed) {
10136
+ controls.createMenuItem.call(_this8, {
10137
+ value: speed,
10138
+ list: list,
10139
+ type: type,
10140
+ title: controls.getLabel.call(_this8, 'speed', speed)
10141
+ });
10142
+ });
10143
+ controls.updateSetting.call(this, type, list);
10144
+ },
10145
+ // Check if we need to hide/show the settings menu
10146
+ checkMenu: function checkMenu() {
10147
+ var buttons = this.elements.settings.buttons;
10148
+ var visible = !is$1.empty(buttons) && Object.values(buttons).some(function (button) {
10149
+ return !button.hidden;
10150
+ });
10151
+ toggleHidden(this.elements.settings.menu, !visible);
10152
+ },
10153
+ // Focus the first menu item in a given (or visible) menu
10154
+ focusFirstMenuItem: function focusFirstMenuItem(pane) {
10155
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
10156
 
10157
+ if (this.elements.settings.popup.hidden) {
10158
+ return;
10159
+ }
 
 
 
 
10160
 
10161
+ var target = pane;
10162
 
10163
+ if (!is$1.element(target)) {
10164
+ target = Object.values(this.elements.settings.panels).find(function (p) {
10165
+ return !p.hidden;
10166
+ });
10167
+ }
 
 
10168
 
10169
+ var firstItem = target.querySelector('[role^="menuitem"]');
10170
+ setFocus.call(this, firstItem, tabFocus);
10171
+ },
10172
+ // Show/hide menu
10173
+ toggleMenu: function toggleMenu(input) {
10174
+ var popup = this.elements.settings.popup;
10175
+ var button = this.elements.buttons.settings; // Menu and button are required
10176
 
10177
+ if (!is$1.element(popup) || !is$1.element(button)) {
10178
+ return;
10179
+ } // True toggle by default
10180
+
10181
+
10182
+ var hidden = popup.hidden;
10183
+ var show = hidden;
10184
+
10185
+ if (is$1.boolean(input)) {
10186
+ show = input;
10187
+ } else if (is$1.keyboardEvent(input) && input.which === 27) {
10188
+ show = false;
10189
+ } else if (is$1.event(input)) {
10190
+ // If Plyr is in a shadowDOM, the event target is set to the component, instead of the
10191
+ // Element in the shadowDOM. The path, if available, is complete.
10192
+ var target = is$1.function(input.composedPath) ? input.composedPath()[0] : input.target;
10193
+ var isMenuItem = popup.contains(target); // If the click was inside the menu or if the click
10194
+ // wasn't the button or menu item and we're trying to
10195
+ // show the menu (a doc click shouldn't show the menu)
10196
+
10197
+ if (isMenuItem || !isMenuItem && input.target !== button && show) {
10198
+ return;
10199
+ }
10200
+ } // Set button attributes
10201
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10202
 
10203
+ button.setAttribute('aria-expanded', show); // Show the actual popup
 
10204
 
10205
+ toggleHidden(popup, !show); // Add class hook
10206
 
10207
+ toggleClass(this.elements.container, this.config.classNames.menu.open, show); // Focus the first item if key interaction
 
 
 
 
10208
 
10209
+ if (show && is$1.keyboardEvent(input)) {
10210
+ controls.focusFirstMenuItem.call(this, null, true);
10211
+ } else if (!show && !hidden) {
10212
+ // If closing, re-focus the button
10213
+ setFocus.call(this, button, is$1.keyboardEvent(input));
10214
+ }
10215
+ },
10216
+ // Get the natural size of a menu panel
10217
+ getMenuSize: function getMenuSize(tab) {
10218
+ var clone = tab.cloneNode(true);
10219
+ clone.style.position = 'absolute';
10220
+ clone.style.opacity = 0;
10221
+ clone.removeAttribute('hidden'); // Append to parent so we get the "real" size
10222
+
10223
+ tab.parentNode.appendChild(clone); // Get the sizes before we remove
10224
+
10225
+ var width = clone.scrollWidth;
10226
+ var height = clone.scrollHeight; // Remove from the DOM
10227
+
10228
+ removeElement(clone);
10229
+ return {
10230
+ width: width,
10231
+ height: height
10232
+ };
10233
+ },
10234
+ // Show a panel in the menu
10235
+ showMenuPanel: function showMenuPanel() {
10236
+ var _this9 = this;
10237
 
10238
+ var type = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : '';
10239
+ var tabFocus = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
10240
+ var target = this.elements.container.querySelector("#plyr-settings-".concat(this.id, "-").concat(type)); // Nothing to show, bail
 
 
 
 
 
10241
 
10242
+ if (!is$1.element(target)) {
10243
+ return;
10244
+ } // Hide all other panels
10245
 
 
 
 
 
 
 
 
 
 
10246
 
10247
+ var container = target.parentNode;
10248
+ var current = Array.from(container.children).find(function (node) {
10249
+ return !node.hidden;
10250
+ }); // If we can do fancy animations, we'll animate the height/width
10251
 
10252
+ if (support.transitions && !support.reducedMotion) {
10253
+ // Set the current width as a base
10254
+ container.style.width = "".concat(current.scrollWidth, "px");
10255
+ container.style.height = "".concat(current.scrollHeight, "px"); // Get potential sizes
 
 
10256
 
10257
+ var size = controls.getMenuSize.call(this, target); // Restore auto height/width
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10258
 
10259
+ var restore = function restore(event) {
10260
+ // We're only bothered about height and width on the container
10261
+ if (event.target !== container || !['width', 'height'].includes(event.propertyName)) {
10262
+ return;
10263
+ } // Revert back to auto
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10264
 
 
 
10265
 
10266
+ container.style.width = '';
10267
+ container.style.height = ''; // Only listen once
10268
 
10269
+ off.call(_this9, container, transitionEndEvent, restore);
10270
+ }; // Listen for the transition finishing and restore auto height/width
10271
 
 
10272
 
10273
+ on.call(this, container, transitionEndEvent, restore); // Set dimensions to target
 
 
10274
 
10275
+ container.style.width = "".concat(size.width, "px");
10276
+ container.style.height = "".concat(size.height, "px");
10277
+ } // Set attributes on current tab
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10278
 
 
 
10279
 
10280
+ toggleHidden(current, true); // Set attributes on target
10281
 
10282
+ toggleHidden(target, false); // Focus the first item
 
 
 
 
 
 
10283
 
10284
+ controls.focusFirstMenuItem.call(this, target, tabFocus);
10285
+ },
10286
+ // Set the download URL
10287
+ setDownloadUrl: function setDownloadUrl() {
10288
+ var button = this.elements.buttons.download; // Bail if no button
10289
 
10290
+ if (!is$1.element(button)) {
10291
+ return;
10292
+ } // Set attribute
10293
 
 
10294
 
10295
+ button.setAttribute('href', this.download);
10296
+ },
10297
+ // Build the default HTML
10298
+ create: function create(data) {
10299
+ var _this10 = this;
10300
 
10301
+ var bindMenuItemShortcuts = controls.bindMenuItemShortcuts,
10302
+ createButton = controls.createButton,
10303
+ createProgress = controls.createProgress,
10304
+ createRange = controls.createRange,
10305
+ createTime = controls.createTime,
10306
+ setQualityMenu = controls.setQualityMenu,
10307
+ setSpeedMenu = controls.setSpeedMenu,
10308
+ showMenuPanel = controls.showMenuPanel;
10309
+ this.elements.controls = null; // Larger overlaid play button
10310
 
10311
+ if (this.config.controls.includes('play-large')) {
10312
+ this.elements.container.appendChild(createButton.call(this, 'play-large'));
10313
+ } // Create the container
 
 
 
 
 
10314
 
 
10315
 
10316
+ var container = createElement('div', getAttributesFromSelector(this.config.selectors.controls.wrapper));
10317
+ this.elements.controls = container; // Default item attributes
 
 
10318
 
10319
+ var defaultAttributes = {
10320
+ class: 'plyr__controls__item'
10321
+ }; // Loop through controls in order
 
 
 
 
10322
 
10323
+ dedupe(this.config.controls).forEach(function (control) {
10324
+ // Restart button
10325
+ if (control === 'restart') {
10326
+ container.appendChild(createButton.call(_this10, 'restart', defaultAttributes));
10327
+ } // Rewind button
10328
 
 
 
 
10329
 
10330
+ if (control === 'rewind') {
10331
+ container.appendChild(createButton.call(_this10, 'rewind', defaultAttributes));
10332
+ } // Play/Pause button
 
 
 
 
10333
 
 
 
 
 
10334
 
10335
+ if (control === 'play') {
10336
+ container.appendChild(createButton.call(_this10, 'play', defaultAttributes));
10337
+ } // Fast forward button
 
 
 
 
10338
 
 
 
 
10339
 
10340
+ if (control === 'fast-forward') {
10341
+ container.appendChild(createButton.call(_this10, 'fast-forward', defaultAttributes));
10342
+ } // Progress
10343
+
10344
+
10345
+ if (control === 'progress') {
10346
+ var progressContainer = createElement('div', {
10347
+ class: "".concat(defaultAttributes.class, " plyr__progress__container")
10348
+ });
10349
+ var progress = createElement('div', getAttributesFromSelector(_this10.config.selectors.progress)); // Seek range slider
10350
+
10351
+ progress.appendChild(createRange.call(_this10, 'seek', {
10352
+ id: "plyr-seek-".concat(data.id)
10353
+ })); // Buffer progress
10354
+
10355
+ progress.appendChild(createProgress.call(_this10, 'buffer')); // TODO: Add loop display indicator
10356
+ // Seek tooltip
10357
+
10358
+ if (_this10.config.tooltips.seek) {
10359
+ var tooltip = createElement('span', {
10360
+ class: _this10.config.classNames.tooltip
10361
+ }, '00:00');
10362
+ progress.appendChild(tooltip);
10363
+ _this10.elements.display.seekTooltip = tooltip;
10364
+ }
10365
+
10366
+ _this10.elements.progress = progress;
10367
+ progressContainer.appendChild(_this10.elements.progress);
10368
+ container.appendChild(progressContainer);
10369
+ } // Media current time display
10370
+
10371
+
10372
+ if (control === 'current-time') {
10373
+ container.appendChild(createTime.call(_this10, 'currentTime', defaultAttributes));
10374
+ } // Media duration display
10375
+
10376
+
10377
+ if (control === 'duration') {
10378
+ container.appendChild(createTime.call(_this10, 'duration', defaultAttributes));
10379
+ } // Volume controls
10380
+
10381
+
10382
+ if (control === 'mute' || control === 'volume') {
10383
+ var volume = _this10.elements.volume; // Create the volume container if needed
10384
+
10385
+ if (!is$1.element(volume) || !container.contains(volume)) {
10386
+ volume = createElement('div', extend({}, defaultAttributes, {
10387
+ class: "".concat(defaultAttributes.class, " plyr__volume").trim()
10388
+ }));
10389
+ _this10.elements.volume = volume;
10390
+ container.appendChild(volume);
10391
+ } // Toggle mute button
10392
+
10393
+
10394
+ if (control === 'mute') {
10395
+ volume.appendChild(createButton.call(_this10, 'mute'));
10396
+ } // Volume range control
10397
+
10398
+
10399
+ if (control === 'volume') {
10400
+ // Set the attributes
10401
+ var attributes = {
10402
+ max: 1,
10403
+ step: 0.05,
10404
+ value: _this10.config.volume
10405
+ }; // Create the volume range slider
10406
+
10407
+ volume.appendChild(createRange.call(_this10, 'volume', extend(attributes, {
10408
+ id: "plyr-volume-".concat(data.id)
10409
+ })));
10410
+ }
10411
+ } // Toggle captions button
10412
+
10413
+
10414
+ if (control === 'captions') {
10415
+ container.appendChild(createButton.call(_this10, 'captions', defaultAttributes));
10416
+ } // Settings button / menu
10417
+
10418
+
10419
+ if (control === 'settings' && !is$1.empty(_this10.config.settings)) {
10420
+ var wrapper = createElement('div', extend({}, defaultAttributes, {
10421
+ class: "".concat(defaultAttributes.class, " plyr__menu").trim(),
10422
+ hidden: ''
10423
+ }));
10424
+ wrapper.appendChild(createButton.call(_this10, 'settings', {
10425
+ 'aria-haspopup': true,
10426
+ 'aria-controls': "plyr-settings-".concat(data.id),
10427
+ 'aria-expanded': false
10428
+ }));
10429
+ var popup = createElement('div', {
10430
+ class: 'plyr__menu__container',
10431
+ id: "plyr-settings-".concat(data.id),
10432
+ hidden: ''
10433
+ });
10434
+ var inner = createElement('div');
10435
+ var home = createElement('div', {
10436
+ id: "plyr-settings-".concat(data.id, "-home")
10437
+ }); // Create the menu
10438
+
10439
+ var menu = createElement('div', {
10440
+ role: 'menu'
10441
+ });
10442
+ home.appendChild(menu);
10443
+ inner.appendChild(home);
10444
+ _this10.elements.settings.panels.home = home; // Build the menu items
10445
+
10446
+ _this10.config.settings.forEach(function (type) {
10447
+ // TODO: bundle this with the createMenuItem helper and bindings
10448
+ var menuItem = createElement('button', extend(getAttributesFromSelector(_this10.config.selectors.buttons.settings), {
10449
+ type: 'button',
10450
+ class: "".concat(_this10.config.classNames.control, " ").concat(_this10.config.classNames.control, "--forward"),
10451
+ role: 'menuitem',
10452
+ 'aria-haspopup': true,
10453
+ hidden: ''
10454
+ })); // Bind menu shortcuts for keyboard users
10455
+
10456
+ bindMenuItemShortcuts.call(_this10, menuItem, type); // Show menu on click
10457
+
10458
+ on(menuItem, 'click', function () {
10459
+ showMenuPanel.call(_this10, type, false);
10460
+ });
10461
+ var flex = createElement('span', null, i18n.get(type, _this10.config));
10462
+ var value = createElement('span', {
10463
+ class: _this10.config.classNames.menu.value
10464
+ }); // Speed contains HTML entities
10465
+
10466
+ value.innerHTML = data[type];
10467
+ flex.appendChild(value);
10468
+ menuItem.appendChild(flex);
10469
+ menu.appendChild(menuItem); // Build the panes
10470
+
10471
+ var pane = createElement('div', {
10472
+ id: "plyr-settings-".concat(data.id, "-").concat(type),
10473
+ hidden: ''
10474
+ }); // Back button
10475
+
10476
+ var backButton = createElement('button', {
10477
+ type: 'button',
10478
+ class: "".concat(_this10.config.classNames.control, " ").concat(_this10.config.classNames.control, "--back")
10479
+ }); // Visible label
10480
+
10481
+ backButton.appendChild(createElement('span', {
10482
+ 'aria-hidden': true
10483
+ }, i18n.get(type, _this10.config))); // Screen reader label
10484
+
10485
+ backButton.appendChild(createElement('span', {
10486
+ class: _this10.config.classNames.hidden
10487
+ }, i18n.get('menuBack', _this10.config))); // Go back via keyboard
10488
+
10489
+ on(pane, 'keydown', function (event) {
10490
+ // We only care about <-
10491
+ if (event.which !== 37) {
10492
+ return;
10493
+ } // Prevent seek
10494
+
10495
 
10496
+ event.preventDefault();
10497
+ event.stopPropagation(); // Show the respective menu
 
 
 
 
10498
 
10499
+ showMenuPanel.call(_this10, 'home', true);
10500
+ }, false); // Go back via button click
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10501
 
10502
+ on(backButton, 'click', function () {
10503
+ showMenuPanel.call(_this10, 'home', false);
10504
+ }); // Add to pane
10505
 
10506
+ pane.appendChild(backButton); // Menu
 
 
 
 
 
10507
 
10508
+ pane.appendChild(createElement('div', {
10509
+ role: 'menu'
10510
+ }));
10511
+ inner.appendChild(pane);
10512
+ _this10.elements.settings.buttons[type] = menuItem;
10513
+ _this10.elements.settings.panels[type] = pane;
10514
+ });
10515
 
10516
+ popup.appendChild(inner);
10517
+ wrapper.appendChild(popup);
10518
+ container.appendChild(wrapper);
10519
+ _this10.elements.settings.popup = popup;
10520
+ _this10.elements.settings.menu = wrapper;
10521
+ } // Picture in picture button
10522
 
 
 
 
 
10523
 
10524
+ if (control === 'pip' && support.pip) {
10525
+ container.appendChild(createButton.call(_this10, 'pip', defaultAttributes));
10526
+ } // Airplay button
 
 
10527
 
 
 
 
10528
 
10529
+ if (control === 'airplay' && support.airplay) {
10530
+ container.appendChild(createButton.call(_this10, 'airplay', defaultAttributes));
10531
+ } // Download button
 
 
10532
 
 
 
 
 
 
10533
 
10534
+ if (control === 'download') {
10535
+ var _attributes = extend({}, defaultAttributes, {
10536
+ element: 'a',
10537
+ href: _this10.download,
10538
+ target: '_blank'
10539
+ });
10540
 
10541
+ var download = _this10.config.urls.download;
10542
 
10543
+ if (!is$1.url(download) && _this10.isEmbed) {
10544
+ extend(_attributes, {
10545
+ icon: "logo-".concat(_this10.provider),
10546
+ label: _this10.provider
10547
+ });
10548
+ }
10549
 
10550
+ container.appendChild(createButton.call(_this10, 'download', _attributes));
10551
+ } // Toggle fullscreen button
 
 
 
10552
 
 
 
 
 
10553
 
10554
+ if (control === 'fullscreen') {
10555
+ container.appendChild(createButton.call(_this10, 'fullscreen', defaultAttributes));
10556
+ }
10557
+ }); // Set available quality levels
10558
+
10559
+ if (this.isHTML5) {
10560
+ setQualityMenu.call(this, html5.getQualityOptions.call(this));
10561
+ }
10562
+
10563
+ setSpeedMenu.call(this);
10564
+ return container;
10565
  },
10566
+ // Insert controls
10567
+ inject: function inject() {
10568
+ var _this11 = this;
10569
 
10570
+ // Sprite
10571
+ if (this.config.loadSprite) {
10572
+ var icon = controls.getIconUrl.call(this); // Only load external sprite using AJAX
 
 
 
 
 
10573
 
10574
+ if (icon.cors) {
10575
+ loadSprite(icon.url, 'sprite-plyr');
10576
+ }
10577
+ } // Create a unique ID
 
10578
 
 
10579
 
10580
+ this.id = Math.floor(Math.random() * 10000); // Null by default
 
 
 
10581
 
10582
+ var container = null;
10583
+ this.elements.controls = null; // Set template properties
10584
 
10585
+ var props = {
10586
+ id: this.id,
10587
+ seektime: this.config.seekTime,
10588
+ title: this.config.title
10589
+ };
10590
+ var update = true; // If function, run it and use output
10591
 
10592
+ if (is$1.function(this.config.controls)) {
10593
+ this.config.controls = this.config.controls.call(this, props);
10594
+ } // Convert falsy controls to empty array (primarily for empty strings)
 
 
 
 
 
 
 
10595
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10596
 
10597
+ if (!this.config.controls) {
10598
+ this.config.controls = [];
10599
+ }
 
 
 
 
 
 
 
 
 
 
10600
 
10601
+ if (is$1.element(this.config.controls) || is$1.string(this.config.controls)) {
10602
+ // HTMLElement or Non-empty string passed as the option
10603
+ container = this.config.controls;
10604
+ } else {
10605
+ // Create controls
10606
+ container = controls.create.call(this, {
10607
+ id: this.id,
10608
+ seektime: this.config.seekTime,
10609
+ speed: this.speed,
10610
+ quality: this.quality,
10611
+ captions: captions.getLabel.call(this) // TODO: Looping
10612
+ // loop: 'None',
10613
 
10614
+ });
10615
+ update = false;
10616
+ } // Replace props with their value
10617
 
 
10618
 
10619
+ var replace = function replace(input) {
10620
+ var result = input;
10621
+ Object.entries(props).forEach(function (_ref2) {
10622
+ var _ref3 = _slicedToArray(_ref2, 2),
10623
+ key = _ref3[0],
10624
+ value = _ref3[1];
 
10625
 
10626
+ result = replaceAll(result, "{".concat(key, "}"), value);
10627
+ });
10628
+ return result;
10629
+ }; // Update markup
10630
 
 
 
 
 
 
 
10631
 
10632
+ if (update) {
10633
+ if (is$1.string(this.config.controls)) {
10634
+ container = replace(container);
10635
+ } else if (is$1.element(container)) {
10636
+ container.innerHTML = replace(container.innerHTML);
10637
+ }
10638
+ } // Controls container
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10639
 
 
10640
 
10641
+ var target; // Inject to custom location
 
 
10642
 
10643
+ if (is$1.string(this.config.selectors.controls.container)) {
10644
+ target = document.querySelector(this.config.selectors.controls.container);
10645
+ } // Inject into the container by default
10646
 
 
 
 
 
10647
 
10648
+ if (!is$1.element(target)) {
10649
+ target = this.elements.container;
10650
+ } // Inject controls HTML (needs to be before captions, hence "afterbegin")
 
 
 
 
 
10651
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10652
 
10653
+ var insertMethod = is$1.element(container) ? 'insertAdjacentElement' : 'insertAdjacentHTML';
10654
+ target[insertMethod]('afterbegin', container); // Find the elements if need be
10655
+
10656
+ if (!is$1.element(this.elements.controls)) {
10657
+ controls.findElements.call(this);
10658
+ } // Add pressed property to buttons
10659
+
10660
 
10661
+ if (!is$1.empty(this.elements.buttons)) {
10662
+ var addProperty = function addProperty(button) {
10663
+ var className = _this11.config.classNames.controlPressed;
10664
+ Object.defineProperty(button, 'pressed', {
10665
+ enumerable: true,
10666
+ get: function get() {
10667
+ return hasClass(button, className);
10668
+ },
10669
+ set: function set() {
10670
+ var pressed = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
10671
+ toggleClass(button, className, pressed);
10672
+ }
10673
+ });
10674
+ }; // Toggle classname when pressed property is set
10675
 
 
 
 
 
 
 
 
 
 
 
 
 
10676
 
10677
+ Object.values(this.elements.buttons).filter(Boolean).forEach(function (button) {
10678
+ if (is$1.array(button) || is$1.nodeList(button)) {
10679
+ Array.from(button).filter(Boolean).forEach(addProperty);
10680
+ } else {
10681
+ addProperty(button);
10682
+ }
10683
+ });
10684
+ } // Edge sometimes doesn't finish the paint so force a repaint
10685
 
 
 
 
 
10686
 
10687
+ if (browser.isEdge) {
10688
+ repaint(target);
10689
+ } // Setup tooltips
10690
 
 
 
 
 
10691
 
10692
+ if (this.config.tooltips.controls) {
10693
+ var _this$config = this.config,
10694
+ classNames = _this$config.classNames,
10695
+ selectors = _this$config.selectors;
10696
+ var selector = "".concat(selectors.controls.wrapper, " ").concat(selectors.labels, " .").concat(classNames.hidden);
10697
+ var labels = getElements.call(this, selector);
10698
+ Array.from(labels).forEach(function (label) {
10699
+ toggleClass(label, _this11.config.classNames.hidden, false);
10700
+ toggleClass(label, _this11.config.classNames.tooltip, true);
10701
+ });
10702
+ }
10703
+ }
10704
+ };
10705
 
10706
+ /**
10707
+ * Parse a string to a URL object
10708
+ * @param {String} input - the URL to be parsed
10709
+ * @param {Boolean} safe - failsafe parsing
10710
+ */
 
 
10711
 
10712
+ function parseUrl(input) {
10713
+ var safe = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
10714
+ var url = input;
 
 
 
10715
 
10716
+ if (safe) {
10717
+ var parser = document.createElement('a');
10718
+ parser.href = url;
10719
+ url = parser.href;
10720
+ }
 
10721
 
10722
+ try {
10723
+ return new URL(url);
10724
+ } catch (e) {
10725
+ return null;
10726
+ }
10727
+ } // Convert object to URLSearchParams
10728
 
10729
+ function buildUrlParams(input) {
10730
+ var params = new URLSearchParams();
10731
 
10732
+ if (is$1.object(input)) {
10733
+ Object.entries(input).forEach(function (_ref) {
10734
+ var _ref2 = _slicedToArray(_ref, 2),
10735
+ key = _ref2[0],
10736
+ value = _ref2[1];
10737
 
10738
+ params.set(key, value);
10739
+ });
10740
+ }
 
 
 
 
10741
 
10742
+ return params;
 
 
 
 
10743
  }
 
10744
 
10745
+ var captions = {
10746
+ // Setup captions
10747
+ setup: function setup() {
10748
+ // Requires UI support
10749
+ if (!this.supported.ui) {
10750
+ return;
10751
+ } // Only Vimeo and HTML5 video supported at this point
 
 
 
 
 
 
 
 
 
10752
 
 
 
 
 
 
10753
 
10754
+ if (!this.isVideo || this.isYouTube || this.isHTML5 && !support.textTracks) {
10755
+ // Clear menu and hide
10756
+ if (is$1.array(this.config.controls) && this.config.controls.includes('settings') && this.config.settings.includes('captions')) {
10757
+ controls.setCaptionsMenu.call(this);
10758
+ }
10759
 
10760
+ return;
10761
+ } // Inject the container
 
10762
 
 
 
 
 
 
 
 
 
10763
 
10764
+ if (!is$1.element(this.elements.captions)) {
10765
+ this.elements.captions = createElement('div', getAttributesFromSelector(this.config.selectors.captions));
10766
+ insertAfter(this.elements.captions, this.elements.wrapper);
10767
+ } // Fix IE captions if CORS is used
10768
+ // Fetch captions and inject as blobs instead (data URIs not supported!)
 
 
 
10769
 
 
 
 
 
 
 
 
 
 
 
 
10770
 
10771
+ if (browser.isIE && window.URL) {
10772
+ var elements = this.media.querySelectorAll('track');
10773
+ Array.from(elements).forEach(function (track) {
10774
+ var src = track.getAttribute('src');
10775
+ var url = parseUrl(src);
10776
 
10777
+ if (url !== null && url.hostname !== window.location.href.hostname && ['http:', 'https:'].includes(url.protocol)) {
10778
+ fetch(src, 'blob').then(function (blob) {
10779
+ track.setAttribute('src', window.URL.createObjectURL(blob));
10780
+ }).catch(function () {
10781
+ removeElement(track);
10782
+ });
10783
+ }
10784
+ });
10785
+ } // Get and set initial data
10786
+ // The "preferred" options are not realized unless / until the wanted language has a match
10787
+ // * languages: Array of user's browser languages.
10788
+ // * language: The language preferred by user settings or config
10789
+ // * active: The state preferred by user settings or config
10790
+ // * toggled: The real captions state
10791
 
 
 
 
 
 
10792
 
10793
+ var browserLanguages = navigator.languages || [navigator.language || navigator.userLanguage || 'en'];
10794
+ var languages = dedupe(browserLanguages.map(function (language) {
10795
+ return language.split('-')[0];
10796
+ }));
10797
+ var language = (this.storage.get('language') || this.config.captions.language || 'auto').toLowerCase(); // Use first browser language when language is 'auto'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10798
 
10799
+ if (language === 'auto') {
10800
+ var _languages = _slicedToArray(languages, 1);
10801
 
10802
+ language = _languages[0];
10803
+ }
10804
 
10805
+ var active = this.storage.get('captions');
 
 
10806
 
10807
+ if (!is$1.boolean(active)) {
10808
+ active = this.config.captions.active;
10809
+ }
10810
 
10811
+ Object.assign(this.captions, {
10812
+ toggled: false,
10813
+ active: active,
10814
+ language: language,
10815
+ languages: languages
10816
+ }); // Watch changes to textTracks and update captions menu
10817
 
10818
+ if (this.isHTML5) {
10819
+ var trackEvents = this.config.captions.update ? 'addtrack removetrack' : 'removetrack';
10820
+ on.call(this, this.media.textTracks, trackEvents, captions.update.bind(this));
10821
+ } // Update available languages in list next tick (the event must not be triggered before the listeners)
10822
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10823
 
10824
+ setTimeout(captions.update.bind(this), 0);
10825
+ },
10826
+ // Update available language options in settings based on tracks
10827
+ update: function update() {
10828
+ var _this = this;
10829
+
10830
+ var tracks = captions.getTracks.call(this, true); // Get the wanted language
10831
+
10832
+ var _this$captions = this.captions,
10833
+ active = _this$captions.active,
10834
+ language = _this$captions.language,
10835
+ meta = _this$captions.meta,
10836
+ currentTrackNode = _this$captions.currentTrackNode;
10837
+ var languageExists = Boolean(tracks.find(function (track) {
10838
+ return track.language === language;
10839
+ })); // Handle tracks (add event listener and "pseudo"-default)
10840
+
10841
+ if (this.isHTML5 && this.isVideo) {
10842
+ tracks.filter(function (track) {
10843
+ return !meta.get(track);
10844
+ }).forEach(function (track) {
10845
+ _this.debug.log('Track added', track); // Attempt to store if the original dom element was "default"
10846
+
10847
+
10848
+ meta.set(track, {
10849
+ default: track.mode === 'showing'
10850
+ }); // Turn off native caption rendering to avoid double captions
10851
+ // eslint-disable-next-line no-param-reassign
10852
+
10853
+ track.mode = 'hidden'; // Add event listener for cue changes
10854
+
10855
+ on.call(_this, track, 'cuechange', function () {
10856
+ return captions.updateCues.call(_this);
10857
+ });
10858
+ });
10859
+ } // Update language first time it matches, or if the previous matching track was removed
10860
 
 
 
 
 
10861
 
10862
+ if (languageExists && this.language !== language || !tracks.includes(currentTrackNode)) {
10863
+ captions.setLanguage.call(this, language);
10864
+ captions.toggle.call(this, active && languageExists);
10865
+ } // Enable or disable captions based on track length
10866
 
 
 
 
 
 
10867
 
10868
+ toggleClass(this.elements.container, this.config.classNames.captions.enabled, !is$1.empty(tracks)); // Update available languages in list
 
 
10869
 
10870
+ if ((this.config.controls || []).includes('settings') && this.config.settings.includes('captions')) {
10871
+ controls.setCaptionsMenu.call(this);
10872
+ }
10873
+ },
10874
+ // Toggle captions display
10875
+ // Used internally for the toggleCaptions method, with the passive option forced to false
10876
+ toggle: function toggle(input) {
10877
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
 
 
 
 
 
 
 
 
 
 
 
 
 
10878
 
10879
+ // If there's no full support
10880
+ if (!this.supported.ui) {
10881
+ return;
10882
+ }
10883
 
10884
+ var toggled = this.captions.toggled; // Current state
 
 
 
 
 
 
10885
 
10886
+ var activeClass = this.config.classNames.captions.active; // Get the next state
10887
+ // If the method is called without parameter, toggle based on current value
 
 
 
 
 
 
10888
 
10889
+ var active = is$1.nullOrUndefined(input) ? !toggled : input; // Update state and trigger event
 
 
 
 
 
 
 
 
 
10890
 
10891
+ if (active !== toggled) {
10892
+ // When passive, don't override user preferences
10893
+ if (!passive) {
10894
+ this.captions.active = active;
10895
+ this.storage.set({
10896
+ captions: active
10897
+ });
10898
+ } // Force language if the call isn't passive and there is no matching language to toggle to
10899
 
 
 
 
 
 
 
10900
 
10901
+ if (!this.language && active && !passive) {
10902
+ var tracks = captions.getTracks.call(this);
10903
+ var track = captions.findTrack.call(this, [this.captions.language].concat(_toConsumableArray(this.captions.languages)), true); // Override user preferences to avoid switching languages if a matching track is added
 
 
10904
 
10905
+ this.captions.language = track.language; // Set caption, but don't store in localStorage as user preference
10906
 
10907
+ captions.set.call(this, tracks.indexOf(track));
10908
+ return;
10909
+ } // Toggle button if it's enabled
 
 
 
10910
 
 
 
10911
 
10912
+ if (this.elements.buttons.captions) {
10913
+ this.elements.buttons.captions.pressed = active;
10914
+ } // Add class hook
 
 
 
 
10915
 
 
 
10916
 
10917
+ toggleClass(this.elements.container, activeClass, active);
10918
+ this.captions.toggled = active; // Update settings menu
 
 
 
 
 
 
10919
 
10920
+ controls.updateSetting.call(this, 'captions'); // Trigger event (not used internally)
 
 
 
 
 
 
 
 
10921
 
10922
+ triggerEvent.call(this, this.media, active ? 'captionsenabled' : 'captionsdisabled');
10923
+ }
10924
+ },
10925
+ // Set captions by track index
10926
+ // Used internally for the currentTrack setter with the passive option forced to false
10927
+ set: function set(index) {
10928
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
10929
+ var tracks = captions.getTracks.call(this); // Disable captions if setting to -1
10930
+
10931
+ if (index === -1) {
10932
+ captions.toggle.call(this, false, passive);
10933
+ return;
10934
+ }
10935
 
10936
+ if (!is$1.number(index)) {
10937
+ this.debug.warn('Invalid caption argument', index);
10938
+ return;
10939
+ }
 
 
10940
 
10941
+ if (!(index in tracks)) {
10942
+ this.debug.warn('Track not found', index);
10943
+ return;
10944
+ }
 
10945
 
10946
+ if (this.captions.currentTrack !== index) {
10947
+ this.captions.currentTrack = index;
10948
+ var track = tracks[index];
10949
 
10950
+ var _ref = track || {},
10951
+ language = _ref.language; // Store reference to node for invalidation on remove
10952
 
 
 
 
 
 
 
10953
 
10954
+ this.captions.currentTrackNode = track; // Update settings menu
10955
 
10956
+ controls.updateSetting.call(this, 'captions'); // When passive, don't override user preferences
 
 
10957
 
10958
+ if (!passive) {
10959
+ this.captions.language = language;
10960
+ this.storage.set({
10961
+ language: language
10962
+ });
10963
+ } // Handle Vimeo captions
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
10964
 
 
 
 
 
 
 
10965
 
10966
+ if (this.isVimeo) {
10967
+ this.embed.enableTextTrack(language);
10968
+ } // Trigger event
10969
 
 
 
10970
 
10971
+ triggerEvent.call(this, this.media, 'languagechange');
10972
+ } // Show captions
 
 
 
 
 
 
 
 
 
10973
 
 
 
 
 
 
 
 
10974
 
10975
+ captions.toggle.call(this, true, passive);
 
 
 
10976
 
10977
+ if (this.isHTML5 && this.isVideo) {
10978
+ // If we change the active track while a cue is already displayed we need to update it
10979
+ captions.updateCues.call(this);
10980
+ }
10981
+ },
10982
+ // Set captions by language
10983
+ // Used internally for the language setter with the passive option forced to false
10984
+ setLanguage: function setLanguage(input) {
10985
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
10986
 
10987
+ if (!is$1.string(input)) {
10988
+ this.debug.warn('Invalid language argument', input);
10989
+ return;
10990
+ } // Normalize
 
 
 
 
10991
 
 
 
10992
 
10993
+ var language = input.toLowerCase();
10994
+ this.captions.language = language; // Set currentTrack
 
 
 
 
 
 
 
 
 
10995
 
10996
+ var tracks = captions.getTracks.call(this);
10997
+ var track = captions.findTrack.call(this, [language]);
10998
+ captions.set.call(this, tracks.indexOf(track), passive);
10999
+ },
11000
+ // Get current valid caption tracks
11001
+ // If update is false it will also ignore tracks without metadata
11002
+ // This is used to "freeze" the language options when captions.update is false
11003
+ getTracks: function getTracks() {
11004
+ var _this2 = this;
11005
+
11006
+ var update = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
11007
+ // Handle media or textTracks missing or null
11008
+ var tracks = Array.from((this.media || {}).textTracks || []); // For HTML5, use cache instead of current tracks when it exists (if captions.update is false)
11009
+ // Filter out removed tracks and tracks that aren't captions/subtitles (for example metadata)
11010
+
11011
+ return tracks.filter(function (track) {
11012
+ return !_this2.isHTML5 || update || _this2.captions.meta.has(track);
11013
+ }).filter(function (track) {
11014
+ return ['captions', 'subtitles'].includes(track.kind);
11015
+ });
11016
+ },
11017
+ // Match tracks based on languages and get the first
11018
+ findTrack: function findTrack(languages) {
11019
+ var _this3 = this;
11020
 
11021
+ var force = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
11022
+ var tracks = captions.getTracks.call(this);
 
 
 
 
 
 
 
 
11023
 
11024
+ var sortIsDefault = function sortIsDefault(track) {
11025
+ return Number((_this3.captions.meta.get(track) || {}).default);
11026
+ };
11027
+
11028
+ var sorted = Array.from(tracks).sort(function (a, b) {
11029
+ return sortIsDefault(b) - sortIsDefault(a);
11030
+ });
11031
+ var track;
11032
+ languages.every(function (language) {
11033
+ track = sorted.find(function (t) {
11034
+ return t.language === language;
11035
+ });
11036
+ return !track; // Break iteration if there is a match
11037
+ }); // If no match is found but is required, get first
11038
+
11039
+ return track || (force ? sorted[0] : undefined);
11040
+ },
11041
+ // Get the current track
11042
+ getCurrentTrack: function getCurrentTrack() {
11043
+ return captions.getTracks.call(this)[this.currentTrack];
11044
+ },
11045
+ // Get UI label for track
11046
+ getLabel: function getLabel(track) {
11047
+ var currentTrack = track;
11048
+
11049
+ if (!is$1.track(currentTrack) && support.textTracks && this.captions.toggled) {
11050
+ currentTrack = captions.getCurrentTrack.call(this);
11051
+ }
11052
+
11053
+ if (is$1.track(currentTrack)) {
11054
+ if (!is$1.empty(currentTrack.label)) {
11055
+ return currentTrack.label;
11056
+ }
11057
+
11058
+ if (!is$1.empty(currentTrack.language)) {
11059
+ return track.language.toUpperCase();
11060
+ }
11061
 
11062
+ return i18n.get('enabled', this.config);
11063
+ }
 
 
 
 
 
11064
 
11065
+ return i18n.get('disabled', this.config);
11066
+ },
11067
+ // Update captions using current track's active cues
11068
+ // Also optional array argument in case there isn't any track (ex: vimeo)
11069
+ updateCues: function updateCues(input) {
11070
+ // Requires UI
11071
+ if (!this.supported.ui) {
11072
+ return;
11073
+ }
 
 
11074
 
11075
+ if (!is$1.element(this.elements.captions)) {
11076
+ this.debug.warn('No captions element to render to');
11077
+ return;
11078
+ } // Only accept array or empty input
 
 
 
11079
 
 
 
 
 
 
 
 
 
11080
 
11081
+ if (!is$1.nullOrUndefined(input) && !Array.isArray(input)) {
11082
+ this.debug.warn('updateCues: Invalid input', input);
11083
+ return;
11084
+ }
 
 
 
 
11085
 
11086
+ var cues = input; // Get cues from track
 
 
11087
 
11088
+ if (!cues) {
11089
+ var track = captions.getCurrentTrack.call(this);
11090
+ cues = Array.from((track || {}).activeCues || []).map(function (cue) {
11091
+ return cue.getCueAsHTML();
11092
+ }).map(getHTML);
11093
+ } // Set new caption text
 
 
 
 
11094
 
 
 
 
 
 
11095
 
11096
+ var content = cues.map(function (cueText) {
11097
+ return cueText.trim();
11098
+ }).join('\n');
11099
+ var changed = content !== this.elements.captions.innerHTML;
11100
+
11101
+ if (changed) {
11102
+ // Empty the container and create a new child element
11103
+ emptyElement(this.elements.captions);
11104
+ var caption = createElement('span', getAttributesFromSelector(this.config.selectors.caption));
11105
+ caption.innerHTML = content;
11106
+ this.elements.captions.appendChild(caption); // Trigger event
11107
+
11108
+ triggerEvent.call(this, this.media, 'cuechange');
11109
+ }
11110
  }
11111
+ };
11112
 
11113
+ // ==========================================================================
11114
+ // Plyr default config
11115
+ // ==========================================================================
11116
+ var defaults$1 = {
11117
+ // Disable
11118
+ enabled: true,
11119
+ // Custom media title
11120
+ title: '',
11121
+ // Logging to console
11122
+ debug: false,
11123
+ // Auto play (if supported)
11124
+ autoplay: false,
11125
+ // Only allow one media playing at once (vimeo only)
11126
+ autopause: true,
11127
+ // Allow inline playback on iOS (this effects YouTube/Vimeo - HTML5 requires the attribute present)
11128
+ // TODO: Remove iosNative fullscreen option in favour of this (logic needs work)
11129
+ playsinline: true,
11130
+ // Default time to skip when rewind/fast forward
11131
+ seekTime: 10,
11132
+ // Default volume
11133
+ volume: 1,
11134
+ muted: false,
11135
+ // Pass a custom duration
11136
+ duration: null,
11137
+ // Display the media duration on load in the current time position
11138
+ // If you have opted to display both duration and currentTime, this is ignored
11139
+ displayDuration: true,
11140
+ // Invert the current time to be a countdown
11141
+ invertTime: true,
11142
+ // Clicking the currentTime inverts it's value to show time left rather than elapsed
11143
+ toggleInvert: true,
11144
+ // Force an aspect ratio
11145
+ // The format must be `'w:h'` (e.g. `'16:9'`)
11146
+ ratio: null,
11147
+ // Click video container to play/pause
11148
+ clickToPlay: true,
11149
+ // Auto hide the controls
11150
+ hideControls: true,
11151
+ // Reset to start when playback ended
11152
+ resetOnEnd: false,
11153
+ // Disable the standard context menu
11154
+ disableContextMenu: true,
11155
+ // Sprite (for icons)
11156
+ loadSprite: true,
11157
+ iconPrefix: 'plyr',
11158
+ iconUrl: 'https://cdn.plyr.io/3.5.6/plyr.svg',
11159
+ // Blank video (used to prevent errors on source change)
11160
+ blankVideo: 'https://cdn.plyr.io/static/blank.mp4',
11161
+ // Quality default
11162
+ quality: {
11163
+ default: 576,
11164
+ options: [4320, 2880, 2160, 1440, 1080, 720, 576, 480, 360, 240]
11165
+ },
11166
+ // Set loops
11167
+ loop: {
11168
+ active: false // start: null,
11169
+ // end: null,
11170
 
11171
+ },
11172
+ // Speed default and options to display
11173
+ speed: {
11174
+ selected: 1,
11175
+ options: [0.5, 0.75, 1, 1.25, 1.5, 1.75, 2]
11176
+ },
11177
+ // Keyboard shortcut settings
11178
+ keyboard: {
11179
+ focused: true,
11180
+ global: false
11181
+ },
11182
+ // Display tooltips
11183
+ tooltips: {
11184
+ controls: false,
11185
+ seek: true
11186
+ },
11187
+ // Captions settings
11188
+ captions: {
11189
+ active: false,
11190
+ language: 'auto',
11191
+ // Listen to new tracks added after Plyr is initialized.
11192
+ // This is needed for streaming captions, but may result in unselectable options
11193
+ update: false
11194
+ },
11195
+ // Fullscreen settings
11196
+ fullscreen: {
11197
+ enabled: true,
11198
+ // Allow fullscreen?
11199
+ fallback: true,
11200
+ // Fallback using full viewport/window
11201
+ iosNative: false // Use the native fullscreen in iOS (disables custom controls)
11202
+
11203
+ },
11204
+ // Local storage
11205
+ storage: {
11206
+ enabled: true,
11207
+ key: 'plyr'
11208
+ },
11209
+ // Default controls
11210
+ controls: ['play-large', // 'restart',
11211
+ // 'rewind',
11212
+ 'play', // 'fast-forward',
11213
+ 'progress', 'current-time', // 'duration',
11214
+ 'mute', 'volume', 'captions', 'settings', 'pip', 'airplay', // 'download',
11215
+ 'fullscreen'],
11216
+ settings: ['captions', 'quality', 'speed'],
11217
+ // Localisation
11218
+ i18n: {
11219
+ restart: 'Restart',
11220
+ rewind: 'Rewind {seektime}s',
11221
+ play: 'Play',
11222
+ pause: 'Pause',
11223
+ fastForward: 'Forward {seektime}s',
11224
+ seek: 'Seek',
11225
+ seekLabel: '{currentTime} of {duration}',
11226
+ played: 'Played',
11227
+ buffered: 'Buffered',
11228
+ currentTime: 'Current time',
11229
+ duration: 'Duration',
11230
+ volume: 'Volume',
11231
+ mute: 'Mute',
11232
+ unmute: 'Unmute',
11233
+ enableCaptions: 'Enable captions',
11234
+ disableCaptions: 'Disable captions',
11235
+ download: 'Download',
11236
+ enterFullscreen: 'Enter fullscreen',
11237
+ exitFullscreen: 'Exit fullscreen',
11238
+ frameTitle: 'Player for {title}',
11239
+ captions: 'Captions',
11240
+ settings: 'Settings',
11241
+ menuBack: 'Go back to previous menu',
11242
+ speed: 'Speed',
11243
+ normal: 'Normal',
11244
+ quality: 'Quality',
11245
+ loop: 'Loop',
11246
+ start: 'Start',
11247
+ end: 'End',
11248
+ all: 'All',
11249
+ reset: 'Reset',
11250
+ disabled: 'Disabled',
11251
+ enabled: 'Enabled',
11252
+ advertisement: 'Ad',
11253
+ qualityBadge: {
11254
+ 2160: '4K',
11255
+ 1440: 'HD',
11256
+ 1080: 'HD',
11257
+ 720: 'HD',
11258
+ 576: 'SD',
11259
+ 480: 'SD'
11260
+ }
11261
+ },
11262
+ // URLs
11263
+ urls: {
11264
+ download: null,
11265
+ vimeo: {
11266
+ sdk: 'https://player.vimeo.com/api/player.js',
11267
+ iframe: 'https://player.vimeo.com/video/{0}?{1}',
11268
+ api: 'https://vimeo.com/api/v2/video/{0}.json'
11269
+ },
11270
+ youtube: {
11271
+ sdk: 'https://www.youtube.com/iframe_api',
11272
+ api: 'https://noembed.com/embed?url=https://www.youtube.com/watch?v={0}'
11273
+ },
11274
+ googleIMA: {
11275
+ sdk: 'https://imasdk.googleapis.com/js/sdkloader/ima3.js'
11276
+ }
11277
+ },
11278
+ // Custom control listeners
11279
+ listeners: {
11280
+ seek: null,
11281
+ play: null,
11282
+ pause: null,
11283
+ restart: null,
11284
+ rewind: null,
11285
+ fastForward: null,
11286
+ mute: null,
11287
+ volume: null,
11288
+ captions: null,
11289
+ download: null,
11290
+ fullscreen: null,
11291
+ pip: null,
11292
+ airplay: null,
11293
+ speed: null,
11294
+ quality: null,
11295
+ loop: null,
11296
+ language: null
11297
+ },
11298
+ // Events to watch and bubble
11299
+ events: [// Events to watch on HTML5 media elements and bubble
11300
+ // https://developer.mozilla.org/en/docs/Web/Guide/Events/Media_events
11301
+ 'ended', 'progress', 'stalled', 'playing', 'waiting', 'canplay', 'canplaythrough', 'loadstart', 'loadeddata', 'loadedmetadata', 'timeupdate', 'volumechange', 'play', 'pause', 'error', 'seeking', 'seeked', 'emptied', 'ratechange', 'cuechange', // Custom events
11302
+ 'download', 'enterfullscreen', 'exitfullscreen', 'captionsenabled', 'captionsdisabled', 'languagechange', 'controlshidden', 'controlsshown', 'ready', // YouTube
11303
+ 'statechange', // Quality
11304
+ 'qualitychange', // Ads
11305
+ 'adsloaded', 'adscontentpause', 'adscontentresume', 'adstarted', 'adsmidpoint', 'adscomplete', 'adsallcomplete', 'adsimpression', 'adsclick'],
11306
+ // Selectors
11307
+ // Change these to match your template if using custom HTML
11308
+ selectors: {
11309
+ editable: 'input, textarea, select, [contenteditable]',
11310
+ container: '.plyr',
11311
+ controls: {
11312
+ container: null,
11313
+ wrapper: '.plyr__controls'
11314
+ },
11315
+ labels: '[data-plyr]',
11316
+ buttons: {
11317
+ play: '[data-plyr="play"]',
11318
+ pause: '[data-plyr="pause"]',
11319
+ restart: '[data-plyr="restart"]',
11320
+ rewind: '[data-plyr="rewind"]',
11321
+ fastForward: '[data-plyr="fast-forward"]',
11322
+ mute: '[data-plyr="mute"]',
11323
+ captions: '[data-plyr="captions"]',
11324
+ download: '[data-plyr="download"]',
11325
+ fullscreen: '[data-plyr="fullscreen"]',
11326
+ pip: '[data-plyr="pip"]',
11327
+ airplay: '[data-plyr="airplay"]',
11328
+ settings: '[data-plyr="settings"]',
11329
+ loop: '[data-plyr="loop"]'
11330
+ },
11331
+ inputs: {
11332
+ seek: '[data-plyr="seek"]',
11333
+ volume: '[data-plyr="volume"]',
11334
+ speed: '[data-plyr="speed"]',
11335
+ language: '[data-plyr="language"]',
11336
+ quality: '[data-plyr="quality"]'
11337
+ },
11338
+ display: {
11339
+ currentTime: '.plyr__time--current',
11340
+ duration: '.plyr__time--duration',
11341
+ buffer: '.plyr__progress__buffer',
11342
+ loop: '.plyr__progress__loop',
11343
+ // Used later
11344
+ volume: '.plyr__volume--display'
11345
+ },
11346
+ progress: '.plyr__progress',
11347
+ captions: '.plyr__captions',
11348
+ caption: '.plyr__caption'
11349
+ },
11350
+ // Class hooks added to the player in different states
11351
+ classNames: {
11352
+ type: 'plyr--{0}',
11353
+ provider: 'plyr--{0}',
11354
+ video: 'plyr__video-wrapper',
11355
+ embed: 'plyr__video-embed',
11356
+ videoFixedRatio: 'plyr__video-wrapper--fixed-ratio',
11357
+ embedContainer: 'plyr__video-embed__container',
11358
+ poster: 'plyr__poster',
11359
+ posterEnabled: 'plyr__poster-enabled',
11360
+ ads: 'plyr__ads',
11361
+ control: 'plyr__control',
11362
+ controlPressed: 'plyr__control--pressed',
11363
+ playing: 'plyr--playing',
11364
+ paused: 'plyr--paused',
11365
+ stopped: 'plyr--stopped',
11366
+ loading: 'plyr--loading',
11367
+ hover: 'plyr--hover',
11368
+ tooltip: 'plyr__tooltip',
11369
+ cues: 'plyr__cues',
11370
+ hidden: 'plyr__sr-only',
11371
+ hideControls: 'plyr--hide-controls',
11372
+ isIos: 'plyr--is-ios',
11373
+ isTouch: 'plyr--is-touch',
11374
+ uiSupported: 'plyr--full-ui',
11375
+ noTransition: 'plyr--no-transition',
11376
+ display: {
11377
+ time: 'plyr__time'
11378
+ },
11379
+ menu: {
11380
+ value: 'plyr__menu__value',
11381
+ badge: 'plyr__badge',
11382
+ open: 'plyr--menu-open'
11383
+ },
11384
+ captions: {
11385
+ enabled: 'plyr--captions-enabled',
11386
+ active: 'plyr--captions-active'
11387
+ },
11388
+ fullscreen: {
11389
+ enabled: 'plyr--fullscreen-enabled',
11390
+ fallback: 'plyr--fullscreen-fallback'
11391
+ },
11392
+ pip: {
11393
+ supported: 'plyr--pip-supported',
11394
+ active: 'plyr--pip-active'
11395
+ },
11396
+ airplay: {
11397
+ supported: 'plyr--airplay-supported',
11398
+ active: 'plyr--airplay-active'
11399
+ },
11400
+ tabFocus: 'plyr__tab-focus',
11401
+ previewThumbnails: {
11402
+ // Tooltip thumbs
11403
+ thumbContainer: 'plyr__preview-thumb',
11404
+ thumbContainerShown: 'plyr__preview-thumb--is-shown',
11405
+ imageContainer: 'plyr__preview-thumb__image-container',
11406
+ timeContainer: 'plyr__preview-thumb__time-container',
11407
+ // Scrubbing
11408
+ scrubbingContainer: 'plyr__preview-scrubbing',
11409
+ scrubbingContainerShown: 'plyr__preview-scrubbing--is-shown'
11410
+ }
11411
+ },
11412
+ // Embed attributes
11413
+ attributes: {
11414
+ embed: {
11415
+ provider: 'data-plyr-provider',
11416
+ id: 'data-plyr-embed-id'
11417
+ }
11418
+ },
11419
+ // Advertisements plugin
11420
+ // Register for an account here: http://vi.ai/publisher-video-monetization/?aid=plyrio
11421
+ ads: {
11422
+ enabled: false,
11423
+ publisherId: '',
11424
+ tagUrl: ''
11425
+ },
11426
+ // Preview Thumbnails plugin
11427
+ previewThumbnails: {
11428
+ enabled: false,
11429
+ src: ''
11430
+ },
11431
+ // Vimeo plugin
11432
+ vimeo: {
11433
+ byline: false,
11434
+ portrait: false,
11435
+ title: false,
11436
+ speed: true,
11437
+ transparent: false
11438
+ },
11439
+ // YouTube plugin
11440
+ youtube: {
11441
+ noCookie: false,
11442
+ // Whether to use an alternative version of YouTube without cookies
11443
+ rel: 0,
11444
+ // No related vids
11445
+ showinfo: 0,
11446
+ // Hide info
11447
+ iv_load_policy: 3,
11448
+ // Hide annotations
11449
+ modestbranding: 1 // Hide logos as much as possible (they still show one in the corner when paused)
11450
 
 
 
 
 
 
 
 
 
 
 
 
11451
  }
11452
+ };
 
11453
 
11454
+ // ==========================================================================
11455
+ // Plyr states
11456
+ // ==========================================================================
11457
+ var pip = {
11458
+ active: 'picture-in-picture',
11459
+ inactive: 'inline'
11460
+ };
11461
 
11462
+ // ==========================================================================
11463
+ // Plyr supported types and providers
11464
+ // ==========================================================================
11465
+ var providers = {
11466
+ html5: 'html5',
11467
+ youtube: 'youtube',
11468
+ vimeo: 'vimeo'
11469
+ };
11470
+ var types = {
11471
+ audio: 'audio',
11472
+ video: 'video'
11473
+ };
11474
+ /**
11475
+ * Get provider by URL
11476
+ * @param {String} url
11477
+ */
11478
 
11479
+ function getProviderByUrl(url) {
11480
+ // YouTube
11481
+ if (/^(https?:\/\/)?(www\.)?(youtube\.com|youtube-nocookie\.com|youtu\.?be)\/.+$/.test(url)) {
11482
+ return providers.youtube;
11483
+ } // Vimeo
 
 
 
 
 
 
11484
 
 
 
 
 
 
 
 
 
 
 
11485
 
11486
+ if (/^https?:\/\/player.vimeo.com\/video\/\d{0,9}(?=\b|\/)/.test(url)) {
11487
+ return providers.vimeo;
11488
+ }
11489
+
11490
+ return null;
 
 
 
11491
  }
11492
 
11493
+ // ==========================================================================
11494
+ // Console wrapper
11495
+ // ==========================================================================
11496
+ var noop = function noop() {};
11497
 
11498
+ var Console =
11499
+ /*#__PURE__*/
11500
+ function () {
11501
+ function Console() {
11502
+ var enabled = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
 
 
 
 
11503
 
11504
+ _classCallCheck(this, Console);
 
 
 
 
 
11505
 
11506
+ this.enabled = window.console && enabled;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11507
 
11508
+ if (this.enabled) {
11509
+ this.log('Debugging enabled');
11510
+ }
11511
+ }
11512
 
11513
+ _createClass(Console, [{
11514
+ key: "log",
11515
+ get: function get() {
11516
+ // eslint-disable-next-line no-console
11517
+ return this.enabled ? Function.prototype.bind.call(console.log, console) : noop;
11518
+ }
11519
+ }, {
11520
+ key: "warn",
11521
+ get: function get() {
11522
+ // eslint-disable-next-line no-console
11523
+ return this.enabled ? Function.prototype.bind.call(console.warn, console) : noop;
11524
+ }
11525
+ }, {
11526
+ key: "error",
11527
+ get: function get() {
11528
+ // eslint-disable-next-line no-console
11529
+ return this.enabled ? Function.prototype.bind.call(console.error, console) : noop;
11530
+ }
11531
+ }]);
11532
 
11533
+ return Console;
11534
+ }();
11535
 
11536
+ function onChange() {
11537
+ if (!this.enabled) {
11538
+ return;
11539
+ } // Update toggle button
 
 
 
 
 
 
 
 
11540
 
 
 
 
 
11541
 
11542
+ var button = this.player.elements.buttons.fullscreen;
11543
+
11544
+ if (is$1.element(button)) {
11545
+ button.pressed = this.active;
11546
+ } // Trigger an event
11547
+
11548
+
11549
+ triggerEvent.call(this.player, this.target, this.active ? 'enterfullscreen' : 'exitfullscreen', true); // Trap focus in container
11550
+
11551
+ if (!browser.isIos) {
11552
+ trapFocus.call(this.player, this.target, this.active);
11553
+ }
11554
+ }
11555
+
11556
+ function toggleFallback() {
11557
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
11558
+
11559
+ // Store or restore scroll position
11560
+ if (toggle) {
11561
+ this.scrollPosition = {
11562
+ x: window.scrollX || 0,
11563
+ y: window.scrollY || 0
11564
+ };
11565
+ } else {
11566
+ window.scrollTo(this.scrollPosition.x, this.scrollPosition.y);
11567
+ } // Toggle scroll
11568
+
11569
 
11570
+ document.body.style.overflow = toggle ? 'hidden' : ''; // Toggle class hook
11571
 
11572
+ toggleClass(this.target, this.player.config.classNames.fullscreen.fallback, toggle); // Force full viewport on iPhone X+
 
 
11573
 
11574
+ if (browser.isIos) {
11575
+ var viewport = document.head.querySelector('meta[name="viewport"]');
11576
+ var property = 'viewport-fit=cover'; // Inject the viewport meta if required
 
 
 
 
11577
 
11578
+ if (!viewport) {
11579
+ viewport = document.createElement('meta');
11580
+ viewport.setAttribute('name', 'viewport');
11581
+ } // Check if the property already exists
 
 
 
11582
 
 
 
 
11583
 
11584
+ var hasProperty = is$1.string(viewport.content) && viewport.content.includes(property);
11585
 
11586
+ if (toggle) {
11587
+ this.cleanupViewport = !hasProperty;
11588
+
11589
+ if (!hasProperty) {
11590
+ viewport.content += ",".concat(property);
11591
+ }
11592
+ } else if (this.cleanupViewport) {
11593
+ viewport.content = viewport.content.split(',').filter(function (part) {
11594
+ return part.trim() !== property;
11595
+ }).join(',');
11596
+ }
11597
+ } // Toggle button and fire events
11598
+
11599
+
11600
+ onChange.call(this);
11601
  }
11602
 
11603
+ var Fullscreen =
11604
+ /*#__PURE__*/
11605
+ function () {
11606
+ function Fullscreen(player) {
11607
+ var _this = this;
11608
 
11609
+ _classCallCheck(this, Fullscreen);
 
 
 
 
 
 
 
 
 
 
11610
 
11611
+ // Keep reference to parent
11612
+ this.player = player; // Get prefix
11613
 
11614
+ this.prefix = Fullscreen.prefix;
11615
+ this.property = Fullscreen.property; // Scroll position
 
 
 
 
 
 
 
 
 
 
 
11616
 
11617
+ this.scrollPosition = {
11618
+ x: 0,
11619
+ y: 0
11620
+ }; // Force the use of 'full window/browser' rather than fullscreen
 
 
 
 
 
 
 
 
 
11621
 
11622
+ this.forceFallback = player.config.fullscreen.fallback === 'force'; // Register event listeners
11623
+ // Handle event (incase user presses escape etc)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11624
 
11625
+ on.call(this.player, document, this.prefix === 'ms' ? 'MSFullscreenChange' : "".concat(this.prefix, "fullscreenchange"), function () {
11626
+ // TODO: Filter for target??
11627
+ onChange.call(_this);
11628
+ }); // Fullscreen toggle on double click
 
 
 
 
 
 
 
 
 
 
 
11629
 
11630
+ on.call(this.player, this.player.elements.container, 'dblclick', function (event) {
11631
+ // Ignore double click in controls
11632
+ if (is$1.element(_this.player.elements.controls) && _this.player.elements.controls.contains(event.target)) {
11633
+ return;
11634
+ }
 
 
 
 
 
 
 
 
 
 
11635
 
11636
+ _this.toggle();
11637
+ }); // Update the UI
 
 
 
 
 
 
11638
 
11639
+ this.update();
11640
+ } // Determine if native supported
 
 
 
 
 
 
11641
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11642
 
11643
+ _createClass(Fullscreen, [{
11644
+ key: "update",
11645
+ // Update UI
11646
+ value: function update() {
11647
+ if (this.enabled) {
11648
+ var mode;
 
 
 
 
 
 
 
 
11649
 
11650
+ if (this.forceFallback) {
11651
+ mode = 'Fallback (forced)';
11652
+ } else if (Fullscreen.native) {
11653
+ mode = 'Native';
11654
+ } else {
11655
+ mode = 'Fallback';
11656
+ }
11657
 
11658
+ this.player.debug.log("".concat(mode, " fullscreen enabled"));
11659
+ } else {
11660
+ this.player.debug.log('Fullscreen not supported and fallback disabled');
11661
+ } // Add styling hook to show button
 
 
11662
 
 
11663
 
11664
+ toggleClass(this.player.elements.container, this.player.config.classNames.fullscreen.enabled, this.enabled);
11665
+ } // Make an element fullscreen
 
 
11666
 
11667
+ }, {
11668
+ key: "enter",
11669
+ value: function enter() {
11670
+ if (!this.enabled) {
11671
+ return;
11672
+ } // iOS native fullscreen doesn't need the request step
11673
 
 
11674
 
11675
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
11676
+ this.target.webkitEnterFullscreen();
11677
+ } else if (!Fullscreen.native || this.forceFallback) {
11678
+ toggleFallback.call(this, true);
11679
+ } else if (!this.prefix) {
11680
+ this.target.requestFullscreen();
11681
+ } else if (!is$1.empty(this.prefix)) {
11682
+ this.target["".concat(this.prefix, "Request").concat(this.property)]();
11683
+ }
11684
+ } // Bail from fullscreen
11685
+
11686
+ }, {
11687
+ key: "exit",
11688
+ value: function exit() {
11689
+ if (!this.enabled) {
11690
+ return;
11691
+ } // iOS native fullscreen
11692
+
11693
+
11694
+ if (browser.isIos && this.player.config.fullscreen.iosNative) {
11695
+ this.target.webkitExitFullscreen();
11696
+ this.player.play();
11697
+ } else if (!Fullscreen.native || this.forceFallback) {
11698
+ toggleFallback.call(this, false);
11699
+ } else if (!this.prefix) {
11700
+ (document.cancelFullScreen || document.exitFullscreen).call(document);
11701
+ } else if (!is$1.empty(this.prefix)) {
11702
+ var action = this.prefix === 'moz' ? 'Cancel' : 'Exit';
11703
+ document["".concat(this.prefix).concat(action).concat(this.property)]();
11704
+ }
11705
+ } // Toggle state
11706
 
11707
+ }, {
11708
+ key: "toggle",
11709
+ value: function toggle() {
11710
+ if (!this.active) {
11711
+ this.enter();
11712
+ } else {
11713
+ this.exit();
11714
+ }
11715
+ }
11716
+ }, {
11717
+ key: "usingNative",
11718
+ // If we're actually using native
11719
+ get: function get() {
11720
+ return Fullscreen.native && !this.forceFallback;
11721
+ } // Get the prefix for handlers
11722
+
11723
+ }, {
11724
+ key: "enabled",
11725
+ // Determine if fullscreen is enabled
11726
+ get: function get() {
11727
+ return (Fullscreen.native || this.player.config.fullscreen.fallback) && this.player.config.fullscreen.enabled && this.player.supported.ui && this.player.isVideo;
11728
+ } // Get active state
11729
+
11730
+ }, {
11731
+ key: "active",
11732
+ get: function get() {
11733
+ if (!this.enabled) {
11734
+ return false;
11735
+ } // Fallback using classname
11736
+
11737
+
11738
+ if (!Fullscreen.native || this.forceFallback) {
11739
+ return hasClass(this.target, this.player.config.classNames.fullscreen.fallback);
11740
+ }
11741
 
11742
+ var element = !this.prefix ? document.fullscreenElement : document["".concat(this.prefix).concat(this.property, "Element")];
11743
+ return element === this.target;
11744
+ } // Get target element
11745
+
11746
+ }, {
11747
+ key: "target",
11748
+ get: function get() {
11749
+ return browser.isIos && this.player.config.fullscreen.iosNative ? this.player.media : this.player.elements.container;
11750
+ }
11751
+ }], [{
11752
+ key: "native",
11753
+ get: function get() {
11754
+ return !!(document.fullscreenEnabled || document.webkitFullscreenEnabled || document.mozFullScreenEnabled || document.msFullscreenEnabled);
11755
+ }
11756
+ }, {
11757
+ key: "prefix",
11758
+ get: function get() {
11759
+ // No prefix
11760
+ if (is$1.function(document.exitFullscreen)) {
11761
+ return '';
11762
+ } // Check for fullscreen support by vendor prefix
11763
+
11764
+
11765
+ var value = '';
11766
+ var prefixes = ['webkit', 'moz', 'ms'];
11767
+ prefixes.some(function (pre) {
11768
+ if (is$1.function(document["".concat(pre, "ExitFullscreen")]) || is$1.function(document["".concat(pre, "CancelFullScreen")])) {
11769
+ value = pre;
11770
+ return true;
11771
+ }
11772
+
11773
+ return false;
11774
+ });
11775
+ return value;
11776
+ }
11777
+ }, {
11778
+ key: "property",
11779
+ get: function get() {
11780
+ return this.prefix === 'moz' ? 'FullScreen' : 'Fullscreen';
11781
+ }
11782
+ }]);
11783
+
11784
+ return Fullscreen;
11785
+ }();
11786
+
11787
+ // ==========================================================================
11788
+ // Load image avoiding xhr/fetch CORS issues
11789
+ // Server status can't be obtained this way unfortunately, so this uses "naturalWidth" to determine if the image has loaded
11790
+ // By default it checks if it is at least 1px, but you can add a second argument to change this
11791
+ // ==========================================================================
11792
+ function loadImage(src) {
11793
+ var minWidth = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 1;
11794
+ return new Promise(function (resolve, reject) {
11795
+ var image = new Image();
11796
+
11797
+ var handler = function handler() {
11798
+ delete image.onload;
11799
+ delete image.onerror;
11800
+ (image.naturalWidth >= minWidth ? resolve : reject)(image);
11801
+ };
11802
+
11803
+ Object.assign(image, {
11804
+ onload: handler,
11805
+ onerror: handler,
11806
+ src: src
11807
+ });
11808
+ });
11809
  }
11810
 
11811
+ // ==========================================================================
11812
+ var ui = {
11813
+ addStyleHook: function addStyleHook() {
11814
+ toggleClass(this.elements.container, this.config.selectors.container.replace('.', ''), true);
11815
+ toggleClass(this.elements.container, this.config.classNames.uiSupported, this.supported.ui);
11816
+ },
11817
+ // Toggle native HTML5 media controls
11818
+ toggleNativeControls: function toggleNativeControls() {
11819
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
11820
 
11821
+ if (toggle && this.isHTML5) {
11822
+ this.media.setAttribute('controls', '');
11823
+ } else {
11824
+ this.media.removeAttribute('controls');
11825
+ }
11826
+ },
11827
+ // Setup the UI
11828
+ build: function build() {
11829
+ var _this = this;
11830
 
11831
+ // Re-attach media element listeners
11832
+ // TODO: Use event bubbling?
11833
+ this.listeners.media(); // Don't setup interface if no support
11834
+
11835
+ if (!this.supported.ui) {
11836
+ this.debug.warn("Basic support only for ".concat(this.provider, " ").concat(this.type)); // Restore native controls
11837
+
11838
+ ui.toggleNativeControls.call(this, true); // Bail
11839
+
11840
+ return;
11841
+ } // Inject custom controls if not present
11842
+
11843
+
11844
+ if (!is$1.element(this.elements.controls)) {
11845
+ // Inject custom controls
11846
+ controls.inject.call(this); // Re-attach control listeners
11847
+
11848
+ this.listeners.controls();
11849
+ } // Remove native controls
11850
+
11851
+
11852
+ ui.toggleNativeControls.call(this); // Setup captions for HTML5
11853
+
11854
+ if (this.isHTML5) {
11855
+ captions.setup.call(this);
11856
+ } // Reset volume
11857
+
11858
+
11859
+ this.volume = null; // Reset mute state
11860
+
11861
+ this.muted = null; // Reset loop state
11862
 
11863
+ this.loop = null; // Reset quality setting
11864
 
11865
+ this.quality = null; // Reset speed
11866
 
11867
+ this.speed = null; // Reset volume display
 
 
 
 
 
 
 
 
 
 
11868
 
11869
+ controls.updateVolume.call(this); // Reset time display
11870
 
11871
+ controls.timeUpdate.call(this); // Update the UI
11872
 
11873
+ ui.checkPlaying.call(this); // Check for picture-in-picture support
 
11874
 
11875
+ toggleClass(this.elements.container, this.config.classNames.pip.supported, support.pip && this.isHTML5 && this.isVideo); // Check for airplay support
11876
 
11877
+ toggleClass(this.elements.container, this.config.classNames.airplay.supported, support.airplay && this.isHTML5); // Add iOS class
11878
 
11879
+ toggleClass(this.elements.container, this.config.classNames.isIos, browser.isIos); // Add touch class
11880
 
11881
+ toggleClass(this.elements.container, this.config.classNames.isTouch, this.touch); // Ready for API calls
 
 
 
11882
 
11883
+ this.ready = true; // Ready event at end of execution stack
 
11884
 
11885
+ setTimeout(function () {
11886
+ triggerEvent.call(_this, _this.media, 'ready');
11887
+ }, 0); // Set the title
 
11888
 
11889
+ ui.setTitle.call(this); // Assure the poster image is set, if the property was added before the element was created
 
11890
 
11891
+ if (this.poster) {
11892
+ ui.setPoster.call(this, this.poster, false).catch(function () {});
11893
+ } // Manually set the duration if user has overridden it.
11894
+ // The event listeners for it doesn't get called if preload is disabled (#701)
11895
 
 
11896
 
11897
+ if (this.config.duration) {
11898
+ controls.durationUpdate.call(this);
11899
+ }
11900
+ },
11901
+ // Setup aria attribute for play and iframe title
11902
+ setTitle: function setTitle() {
11903
+ // Find the current text
11904
+ var label = i18n.get('play', this.config); // If there's a media title set, use that for the label
11905
 
11906
+ if (is$1.string(this.config.title) && !is$1.empty(this.config.title)) {
11907
+ label += ", ".concat(this.config.title);
11908
+ } // If there's a play button, set label
 
 
 
 
 
 
 
 
 
 
 
 
 
11909
 
 
11910
 
11911
+ Array.from(this.elements.buttons.play || []).forEach(function (button) {
11912
+ button.setAttribute('aria-label', label);
11913
+ }); // Set iframe title
11914
+ // https://github.com/sampotts/plyr/issues/124
11915
 
11916
+ if (this.isEmbed) {
11917
+ var iframe = getElement.call(this, 'iframe');
11918
 
11919
+ if (!is$1.element(iframe)) {
11920
+ return;
11921
+ } // Default to media type
11922
 
 
 
 
11923
 
11924
+ var title = !is$1.empty(this.config.title) ? this.config.title : 'video';
11925
+ var format = i18n.get('frameTitle', this.config);
11926
+ iframe.setAttribute('title', format.replace('{title}', title));
11927
+ }
11928
+ },
11929
+ // Toggle poster
11930
+ togglePoster: function togglePoster(enable) {
11931
+ toggleClass(this.elements.container, this.config.classNames.posterEnabled, enable);
11932
+ },
11933
+ // Set the poster image (async)
11934
+ // Used internally for the poster setter, with the passive option forced to false
11935
+ setPoster: function setPoster(poster) {
11936
+ var _this2 = this;
 
 
 
 
 
 
 
 
11937
 
11938
+ var passive = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
 
11939
 
11940
+ // Don't override if call is passive
11941
+ if (passive && this.poster) {
11942
+ return Promise.reject(new Error('Poster already set'));
11943
+ } // Set property synchronously to respect the call order
11944
 
 
 
 
 
11945
 
11946
+ this.media.setAttribute('poster', poster); // Wait until ui is ready
11947
 
11948
+ return ready.call(this) // Load image
11949
+ .then(function () {
11950
+ return loadImage(poster);
11951
+ }).catch(function (err) {
11952
+ // Hide poster on error unless it's been set by another call
11953
+ if (poster === _this2.poster) {
11954
+ ui.togglePoster.call(_this2, false);
11955
+ } // Rethrow
11956
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11957
 
11958
+ throw err;
11959
+ }).then(function () {
11960
+ // Prevent race conditions
11961
+ if (poster !== _this2.poster) {
11962
+ throw new Error('setPoster cancelled by later call to setPoster');
11963
+ }
11964
+ }).then(function () {
11965
+ Object.assign(_this2.elements.poster.style, {
11966
+ backgroundImage: "url('".concat(poster, "')"),
11967
+ // Reset backgroundSize as well (since it can be set to "cover" for padded thumbnails for youtube)
11968
+ backgroundSize: ''
11969
+ });
11970
+ ui.togglePoster.call(_this2, true);
11971
+ return poster;
11972
+ });
11973
+ },
11974
+ // Check playing state
11975
+ checkPlaying: function checkPlaying(event) {
11976
+ var _this3 = this;
11977
+
11978
+ // Class hooks
11979
+ toggleClass(this.elements.container, this.config.classNames.playing, this.playing);
11980
+ toggleClass(this.elements.container, this.config.classNames.paused, this.paused);
11981
+ toggleClass(this.elements.container, this.config.classNames.stopped, this.stopped); // Set state
11982
+
11983
+ Array.from(this.elements.buttons.play || []).forEach(function (target) {
11984
+ Object.assign(target, {
11985
+ pressed: _this3.playing
11986
+ });
11987
+ }); // Only update controls on non timeupdate events
11988
 
11989
+ if (is$1.event(event) && event.type === 'timeupdate') {
11990
+ return;
11991
+ } // Toggle controls
11992
 
 
11993
 
11994
+ ui.toggleControls.call(this);
11995
+ },
11996
+ // Check if media is loading
11997
+ checkLoading: function checkLoading(event) {
11998
+ var _this4 = this;
11999
 
12000
+ this.loading = ['stalled', 'waiting'].includes(event.type); // Clear timer
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12001
 
12002
+ clearTimeout(this.timers.loading); // Timer to prevent flicker when seeking
 
12003
 
12004
+ this.timers.loading = setTimeout(function () {
12005
+ // Update progress bar loading class state
12006
+ toggleClass(_this4.elements.container, _this4.config.classNames.loading, _this4.loading); // Update controls visibility
12007
+
12008
+ ui.toggleControls.call(_this4);
12009
+ }, this.loading ? 250 : 0);
12010
+ },
12011
+ // Toggle controls based on state and `force` argument
12012
+ toggleControls: function toggleControls(force) {
12013
+ var controlsElement = this.elements.controls;
12014
+
12015
+ if (controlsElement && this.config.hideControls) {
12016
+ // Don't hide controls if a touch-device user recently seeked. (Must be limited to touch devices, or it occasionally prevents desktop controls from hiding.)
12017
+ var recentTouchSeek = this.touch && this.lastSeekTime + 2000 > Date.now(); // Show controls if force, loading, paused, button interaction, or recent seek, otherwise hide
12018
+
12019
+ this.toggleControls(Boolean(force || this.loading || this.paused || controlsElement.pressed || controlsElement.hover || recentTouchSeek));
12020
+ }
12021
  }
12022
+ };
12023
 
12024
+ var Listeners =
12025
+ /*#__PURE__*/
12026
+ function () {
12027
+ function Listeners(player) {
12028
+ _classCallCheck(this, Listeners);
12029
+
12030
+ this.player = player;
12031
+ this.lastKey = null;
12032
+ this.focusTimer = null;
12033
+ this.lastKeyDown = null;
12034
+ this.handleKey = this.handleKey.bind(this);
12035
+ this.toggleMenu = this.toggleMenu.bind(this);
12036
+ this.setTabFocus = this.setTabFocus.bind(this);
12037
+ this.firstTouch = this.firstTouch.bind(this);
12038
+ } // Handle key presses
12039
+
12040
+
12041
+ _createClass(Listeners, [{
12042
+ key: "handleKey",
12043
+ value: function handleKey(event) {
12044
+ var player = this.player;
12045
+ var elements = player.elements;
12046
+ var code = event.keyCode ? event.keyCode : event.which;
12047
+ var pressed = event.type === 'keydown';
12048
+ var repeat = pressed && code === this.lastKey; // Bail if a modifier key is set
12049
+
12050
+ if (event.altKey || event.ctrlKey || event.metaKey || event.shiftKey) {
12051
+ return;
12052
+ } // If the event is bubbled from the media element
12053
+ // Firefox doesn't get the keycode for whatever reason
12054
+
12055
+
12056
+ if (!is$1.number(code)) {
12057
+ return;
12058
+ } // Seek by the number keys
12059
+
12060
+
12061
+ var seekByKey = function seekByKey() {
12062
+ // Divide the max duration into 10th's and times by the number value
12063
+ player.currentTime = player.duration / 10 * (code - 48);
12064
+ }; // Handle the key on keydown
12065
+ // Reset on keyup
12066
+
12067
+
12068
+ if (pressed) {
12069
+ // Check focused element
12070
+ // and if the focused element is not editable (e.g. text input)
12071
+ // and any that accept key input http://webaim.org/techniques/keyboard/
12072
+ var focused = document.activeElement;
12073
+
12074
+ if (is$1.element(focused)) {
12075
+ var editable = player.config.selectors.editable;
12076
+ var seek = elements.inputs.seek;
12077
+
12078
+ if (focused !== seek && matches$1(focused, editable)) {
12079
+ return;
12080
+ }
12081
 
12082
+ if (event.which === 32 && matches$1(focused, 'button, [role^="menuitem"]')) {
12083
+ return;
12084
+ }
12085
+ } // Which keycodes should we prevent default
12086
+
12087
+
12088
+ var preventDefault = [32, 37, 38, 39, 40, 48, 49, 50, 51, 52, 53, 54, 56, 57, 67, 70, 73, 75, 76, 77, 79]; // If the code is found prevent default (e.g. prevent scrolling for arrows)
12089
+
12090
+ if (preventDefault.includes(code)) {
12091
+ event.preventDefault();
12092
+ event.stopPropagation();
12093
+ }
12094
+
12095
+ switch (code) {
12096
+ case 48:
12097
+ case 49:
12098
+ case 50:
12099
+ case 51:
12100
+ case 52:
12101
+ case 53:
12102
+ case 54:
12103
+ case 55:
12104
+ case 56:
12105
+ case 57:
12106
+ // 0-9
12107
+ if (!repeat) {
12108
+ seekByKey();
12109
+ }
12110
+
12111
+ break;
12112
+
12113
+ case 32:
12114
+ case 75:
12115
+ // Space and K key
12116
+ if (!repeat) {
12117
+ player.togglePlay();
12118
+ }
12119
+
12120
+ break;
12121
+
12122
+ case 38:
12123
+ // Arrow up
12124
+ player.increaseVolume(0.1);
12125
+ break;
12126
+
12127
+ case 40:
12128
+ // Arrow down
12129
+ player.decreaseVolume(0.1);
12130
+ break;
12131
+
12132
+ case 77:
12133
+ // M key
12134
+ if (!repeat) {
12135
+ player.muted = !player.muted;
12136
+ }
12137
+
12138
+ break;
12139
+
12140
+ case 39:
12141
+ // Arrow forward
12142
+ player.forward();
12143
+ break;
12144
+
12145
+ case 37:
12146
+ // Arrow back
12147
+ player.rewind();
12148
+ break;
12149
+
12150
+ case 70:
12151
+ // F key
12152
+ player.fullscreen.toggle();
12153
+ break;
12154
+
12155
+ case 67:
12156
+ // C key
12157
+ if (!repeat) {
12158
+ player.toggleCaptions();
12159
+ }
12160
+
12161
+ break;
12162
+
12163
+ case 76:
12164
+ // L key
12165
+ player.loop = !player.loop;
12166
+ break;
12167
+
12168
+ /* case 73:
12169
+ this.setLoop('start');
12170
+ break;
12171
+ case 76:
12172
+ this.setLoop();
12173
+ break;
12174
+ case 79:
12175
+ this.setLoop('end');
12176
+ break; */
12177
+
12178
+ default:
12179
+ break;
12180
+ } // Escape is handle natively when in full screen
12181
+ // So we only need to worry about non native
12182
+
12183
+
12184
+ if (code === 27 && !player.fullscreen.usingNative && player.fullscreen.active) {
12185
+ player.fullscreen.toggle();
12186
+ } // Store last code for next cycle
12187
+
12188
+
12189
+ this.lastKey = code;
12190
+ } else {
12191
+ this.lastKey = null;
12192
+ }
12193
+ } // Toggle menu
12194
+
12195
+ }, {
12196
+ key: "toggleMenu",
12197
+ value: function toggleMenu(event) {
12198
+ controls.toggleMenu.call(this.player, event);
12199
+ } // Device is touch enabled
12200
+
12201
+ }, {
12202
+ key: "firstTouch",
12203
+ value: function firstTouch() {
12204
+ var player = this.player;
12205
+ var elements = player.elements;
12206
+ player.touch = true; // Add touch class
12207
+
12208
+ toggleClass(elements.container, player.config.classNames.isTouch, true);
12209
+ }
12210
+ }, {
12211
+ key: "setTabFocus",
12212
+ value: function setTabFocus(event) {
12213
+ var player = this.player;
12214
+ var elements = player.elements;
12215
+ clearTimeout(this.focusTimer); // Ignore any key other than tab
12216
 
12217
+ if (event.type === 'keydown' && event.which !== 9) {
12218
+ return;
12219
+ } // Store reference to event timeStamp
 
 
12220
 
 
12221
 
12222
+ if (event.type === 'keydown') {
12223
+ this.lastKeyDown = event.timeStamp;
12224
+ } // Remove current classes
 
 
 
 
 
 
12225
 
 
12226
 
12227
+ var removeCurrent = function removeCurrent() {
12228
+ var className = player.config.classNames.tabFocus;
12229
+ var current = getElements.call(player, ".".concat(className));
12230
+ toggleClass(current, className, false);
12231
+ }; // Determine if a key was pressed to trigger this event
12232
 
 
 
 
12233
 
12234
+ var wasKeyDown = event.timeStamp - this.lastKeyDown <= 20; // Ignore focus events if a key was pressed prior
 
 
12235
 
12236
+ if (event.type === 'focus' && !wasKeyDown) {
12237
+ return;
12238
+ } // Remove all current
12239
+
12240
+
12241
+ removeCurrent(); // Delay the adding of classname until the focus has changed
12242
+ // This event fires before the focusin event
12243
+
12244
+ this.focusTimer = setTimeout(function () {
12245
+ var focused = document.activeElement; // Ignore if current focus element isn't inside the player
12246
+
12247
+ if (!elements.container.contains(focused)) {
12248
+ return;
12249
+ }
12250
+
12251
+ toggleClass(document.activeElement, player.config.classNames.tabFocus, true);
12252
+ }, 10);
12253
+ } // Global window & document listeners
12254
+
12255
+ }, {
12256
+ key: "global",
12257
+ value: function global() {
12258
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : true;
12259
+ var player = this.player; // Keyboard shortcuts
12260
+
12261
+ if (player.config.keyboard.global) {
12262
+ toggleListener.call(player, window, 'keydown keyup', this.handleKey, toggle, false);
12263
+ } // Click anywhere closes menu
12264
 
 
 
 
 
12265
 
12266
+ toggleListener.call(player, document.body, 'click', this.toggleMenu, toggle); // Detect touch by events
12267
 
12268
+ once.call(player, document.body, 'touchstart', this.firstTouch); // Tab focus detection
 
 
12269
 
12270
+ toggleListener.call(player, document.body, 'keydown focus blur', this.setTabFocus, toggle, false, true);
12271
+ } // Container listeners
 
 
12272
 
12273
+ }, {
12274
+ key: "container",
12275
+ value: function container() {
12276
+ var player = this.player;
12277
+ var config = player.config,
12278
+ elements = player.elements,
12279
+ timers = player.timers; // Keyboard shortcuts
12280
 
12281
+ if (!config.keyboard.global && config.keyboard.focused) {
12282
+ on.call(player, elements.container, 'keydown keyup', this.handleKey, false);
12283
+ } // Toggle controls on mouse events and entering fullscreen
12284
 
 
12285
 
12286
+ on.call(player, elements.container, 'mousemove mouseleave touchstart touchmove enterfullscreen exitfullscreen', function (event) {
12287
+ var controlsElement = elements.controls; // Remove button states for fullscreen
 
12288
 
12289
+ if (controlsElement && event.type === 'enterfullscreen') {
12290
+ controlsElement.pressed = false;
12291
+ controlsElement.hover = false;
12292
+ } // Show, then hide after a timeout unless another control event occurs
12293
 
 
 
 
 
12294
 
12295
+ var show = ['touchstart', 'touchmove', 'mousemove'].includes(event.type);
12296
+ var delay = 0;
 
12297
 
12298
+ if (show) {
12299
+ ui.toggleControls.call(player, true); // Use longer timeout for touch devices
12300
 
12301
+ delay = player.touch ? 3000 : 2000;
12302
+ } // Clear timer
12303
 
 
12304
 
12305
+ clearTimeout(timers.controls); // Set new timer to prevent flicker when seeking
 
 
 
 
 
 
12306
 
12307
+ timers.controls = setTimeout(function () {
12308
+ return ui.toggleControls.call(player, false);
12309
+ }, delay);
12310
+ }); // Set a gutter for Vimeo
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12311
 
12312
+ var setGutter = function setGutter(ratio, padding, toggle) {
12313
+ if (!player.isVimeo) {
12314
+ return;
12315
+ }
12316
 
12317
+ var target = player.elements.wrapper.firstChild;
12318
 
12319
+ var _ratio = _slicedToArray(ratio, 2),
12320
+ y = _ratio[1];
12321
 
12322
+ var _getAspectRatio$call = getAspectRatio.call(player),
12323
+ _getAspectRatio$call2 = _slicedToArray(_getAspectRatio$call, 2),
12324
+ videoX = _getAspectRatio$call2[0],
12325
+ videoY = _getAspectRatio$call2[1];
12326
 
12327
+ target.style.maxWidth = toggle ? "".concat(y / videoY * videoX, "px") : null;
12328
+ target.style.margin = toggle ? '0 auto' : null;
12329
+ }; // Resize on fullscreen change
 
12330
 
 
12331
 
12332
+ var setPlayerSize = function setPlayerSize(measure) {
12333
+ // If we don't need to measure the viewport
12334
+ if (!measure) {
12335
+ return setAspectRatio.call(player);
12336
+ }
12337
 
12338
+ var rect = elements.container.getBoundingClientRect();
12339
+ var width = rect.width,
12340
+ height = rect.height;
12341
+ return setAspectRatio.call(player, "".concat(width, ":").concat(height));
12342
+ };
12343
 
12344
+ var resized = function resized() {
12345
+ clearTimeout(timers.resized);
12346
+ timers.resized = setTimeout(setPlayerSize, 50);
12347
+ };
12348
 
12349
+ on.call(player, elements.container, 'enterfullscreen exitfullscreen', function (event) {
12350
+ var _player$fullscreen = player.fullscreen,
12351
+ target = _player$fullscreen.target,
12352
+ usingNative = _player$fullscreen.usingNative; // Ignore events not from target
 
 
 
 
 
 
 
12353
 
12354
+ if (target !== elements.container) {
12355
+ return;
12356
+ } // If it's not an embed and no ratio specified
12357
 
 
 
 
 
 
 
 
 
 
 
12358
 
12359
+ if (!player.isEmbed && is$1.empty(player.config.ratio)) {
12360
+ return;
12361
+ }
 
 
 
 
 
 
12362
 
12363
+ var isEnter = event.type === 'enterfullscreen'; // Set the player size when entering fullscreen to viewport size
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12364
 
12365
+ var _setPlayerSize = setPlayerSize(isEnter),
12366
+ padding = _setPlayerSize.padding,
12367
+ ratio = _setPlayerSize.ratio; // Set Vimeo gutter
12368
 
 
 
 
 
12369
 
12370
+ setGutter(ratio, padding, isEnter); // If not using native fullscreen, we need to check for resizes of viewport
 
 
 
 
12371
 
12372
+ if (!usingNative) {
12373
+ if (isEnter) {
12374
+ on.call(player, window, 'resize', resized);
12375
+ } else {
12376
+ off.call(player, window, 'resize', resized);
12377
+ }
12378
+ }
12379
+ });
12380
+ } // Listen for media events
12381
+
12382
+ }, {
12383
+ key: "media",
12384
+ value: function media() {
12385
+ var _this = this;
12386
+
12387
+ var player = this.player;
12388
+ var elements = player.elements; // Time change on media
12389
+
12390
+ on.call(player, player.media, 'timeupdate seeking seeked', function (event) {
12391
+ return controls.timeUpdate.call(player, event);
12392
+ }); // Display duration
12393
+
12394
+ on.call(player, player.media, 'durationchange loadeddata loadedmetadata', function (event) {
12395
+ return controls.durationUpdate.call(player, event);
12396
+ }); // Check for audio tracks on load
12397
+ // We can't use `loadedmetadata` as it doesn't seem to have audio tracks at that point
12398
+
12399
+ on.call(player, player.media, 'canplay loadeddata', function () {
12400
+ toggleHidden(elements.volume, !player.hasAudio);
12401
+ toggleHidden(elements.buttons.mute, !player.hasAudio);
12402
+ }); // Handle the media finishing
12403
+
12404
+ on.call(player, player.media, 'ended', function () {
12405
+ // Show poster on end
12406
+ if (player.isHTML5 && player.isVideo && player.config.resetOnEnd) {
12407
+ // Restart
12408
+ player.restart();
12409
+ }
12410
+ }); // Check for buffer progress
12411
+
12412
+ on.call(player, player.media, 'progress playing seeking seeked', function (event) {
12413
+ return controls.updateProgress.call(player, event);
12414
+ }); // Handle volume changes
12415
+
12416
+ on.call(player, player.media, 'volumechange', function (event) {
12417
+ return controls.updateVolume.call(player, event);
12418
+ }); // Handle play/pause
12419
+
12420
+ on.call(player, player.media, 'playing play pause ended emptied timeupdate', function (event) {
12421
+ return ui.checkPlaying.call(player, event);
12422
+ }); // Loading state
12423
+
12424
+ on.call(player, player.media, 'waiting canplay seeked playing', function (event) {
12425
+ return ui.checkLoading.call(player, event);
12426
+ }); // Click video
12427
+
12428
+ if (player.supported.ui && player.config.clickToPlay && !player.isAudio) {
12429
+ // Re-fetch the wrapper
12430
+ var wrapper = getElement.call(player, ".".concat(player.config.classNames.video)); // Bail if there's no wrapper (this should never happen)
12431
+
12432
+ if (!is$1.element(wrapper)) {
12433
+ return;
12434
+ } // On click play, pause or restart
12435
 
 
 
 
 
 
 
 
 
 
12436
 
12437
+ on.call(player, elements.container, 'click', function (event) {
12438
+ var targets = [elements.container, wrapper]; // Ignore if click if not container or in video wrapper
 
 
 
 
 
 
 
12439
 
12440
+ if (!targets.includes(event.target) && !wrapper.contains(event.target)) {
12441
+ return;
12442
+ } // Touch devices will just show controls (if hidden)
 
 
 
 
 
 
12443
 
 
 
 
 
 
12444
 
12445
+ if (player.touch && player.config.hideControls) {
12446
+ return;
12447
+ }
 
 
 
 
 
 
 
 
 
 
 
12448
 
12449
+ if (player.ended) {
12450
+ _this.proxy(event, player.restart, 'restart');
 
 
 
 
 
12451
 
12452
+ _this.proxy(event, player.play, 'play');
12453
+ } else {
12454
+ _this.proxy(event, player.togglePlay, 'play');
12455
+ }
12456
+ });
12457
+ } // Disable right click
12458
 
 
 
 
12459
 
12460
+ if (player.supported.ui && player.config.disableContextMenu) {
12461
+ on.call(player, elements.wrapper, 'contextmenu', function (event) {
12462
+ event.preventDefault();
12463
+ }, false);
12464
+ } // Volume change
12465
+
12466
+
12467
+ on.call(player, player.media, 'volumechange', function () {
12468
+ // Save to storage
12469
+ player.storage.set({
12470
+ volume: player.volume,
12471
+ muted: player.muted
12472
+ });
12473
+ }); // Speed change
12474
+
12475
+ on.call(player, player.media, 'ratechange', function () {
12476
+ // Update UI
12477
+ controls.updateSetting.call(player, 'speed'); // Save to storage
12478
+
12479
+
12480
+ player.storage.set({
12481
+ speed: player.speed
12482
+ });
12483
+ }); // Quality change
12484
+
12485
+ on.call(player, player.media, 'qualitychange', function (event) {
12486
+ // Update UI
12487
+ controls.updateSetting.call(player, 'quality', null, event.detail.quality);
12488
+ }); // Update download link when ready and if quality changes
12489
+
12490
+ on.call(player, player.media, 'ready qualitychange', function () {
12491
+ controls.setDownloadUrl.call(player);
12492
+ }); // Proxy events to container
12493
+ // Bubble up key events for Edge
12494
+
12495
+ var proxyEvents = player.config.events.concat(['keyup', 'keydown']).join(' ');
12496
+ on.call(player, player.media, proxyEvents, function (event) {
12497
+ var _event$detail = event.detail,
12498
+ detail = _event$detail === void 0 ? {} : _event$detail; // Get error details from media
12499
+
12500
+ if (event.type === 'error') {
12501
+ detail = player.media.error;
12502
+ }
12503
+
12504
+ triggerEvent.call(player, elements.container, event.type, true, detail);
12505
+ });
12506
+ } // Run default and custom handlers
12507
+
12508
+ }, {
12509
+ key: "proxy",
12510
+ value: function proxy(event, defaultHandler, customHandlerKey) {
12511
+ var player = this.player;
12512
+ var customHandler = player.config.listeners[customHandlerKey];
12513
+ var hasCustomHandler = is$1.function(customHandler);
12514
+ var returned = true; // Execute custom handler
12515
+
12516
+ if (hasCustomHandler) {
12517
+ returned = customHandler.call(player, event);
12518
+ } // Only call default handler if not prevented in custom handler
12519
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12520
 
12521
+ if (returned && is$1.function(defaultHandler)) {
12522
+ defaultHandler.call(player, event);
12523
+ }
12524
+ } // Trigger custom and default handlers
 
12525
 
12526
+ }, {
12527
+ key: "bind",
12528
+ value: function bind(element, type, defaultHandler, customHandlerKey) {
12529
+ var _this2 = this;
12530
 
12531
+ var passive = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : true;
12532
+ var player = this.player;
12533
+ var customHandler = player.config.listeners[customHandlerKey];
12534
+ var hasCustomHandler = is$1.function(customHandler);
12535
+ on.call(player, element, type, function (event) {
12536
+ return _this2.proxy(event, defaultHandler, customHandlerKey);
12537
+ }, passive && !hasCustomHandler);
12538
+ } // Listen for control events
12539
 
12540
+ }, {
12541
+ key: "controls",
12542
+ value: function controls$1() {
12543
+ var _this3 = this;
 
12544
 
12545
+ var player = this.player;
12546
+ var elements = player.elements; // IE doesn't support input event, so we fallback to change
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12547
 
12548
+ var inputEvent = browser.isIE ? 'change' : 'input'; // Play/pause toggle
 
12549
 
12550
+ if (elements.buttons.play) {
12551
+ Array.from(elements.buttons.play).forEach(function (button) {
12552
+ _this3.bind(button, 'click', player.togglePlay, 'play');
12553
+ });
12554
+ } // Pause
12555
 
 
 
12556
 
12557
+ this.bind(elements.buttons.restart, 'click', player.restart, 'restart'); // Rewind
12558
 
12559
+ this.bind(elements.buttons.rewind, 'click', player.rewind, 'rewind'); // Rewind
 
 
 
 
12560
 
12561
+ this.bind(elements.buttons.fastForward, 'click', player.forward, 'fastForward'); // Mute toggle
 
 
 
 
 
 
12562
 
12563
+ this.bind(elements.buttons.mute, 'click', function () {
12564
+ player.muted = !player.muted;
12565
+ }, 'mute'); // Captions toggle
 
 
 
12566
 
12567
+ this.bind(elements.buttons.captions, 'click', function () {
12568
+ return player.toggleCaptions();
12569
+ }); // Download
 
 
 
 
 
 
12570
 
12571
+ this.bind(elements.buttons.download, 'click', function () {
12572
+ triggerEvent.call(player, player.media, 'download');
12573
+ }, 'download'); // Fullscreen toggle
12574
 
12575
+ this.bind(elements.buttons.fullscreen, 'click', function () {
12576
+ player.fullscreen.toggle();
12577
+ }, 'fullscreen'); // Picture-in-Picture
12578
 
12579
+ this.bind(elements.buttons.pip, 'click', function () {
12580
+ player.pip = 'toggle';
12581
+ }, 'pip'); // Airplay
12582
 
12583
+ this.bind(elements.buttons.airplay, 'click', player.airplay, 'airplay'); // Settings menu - click toggle
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12584
 
12585
+ this.bind(elements.buttons.settings, 'click', function (event) {
12586
+ // Prevent the document click listener closing the menu
12587
+ event.stopPropagation();
12588
 
12589
+ controls.toggleMenu.call(player, event);
12590
+ }); // Settings menu - keyboard toggle
12591
+ // We have to bind to keyup otherwise Firefox triggers a click when a keydown event handler shifts focus
12592
+ // https://bugzilla.mozilla.org/show_bug.cgi?id=1220143
12593
 
12594
+ this.bind(elements.buttons.settings, 'keyup', function (event) {
12595
+ var code = event.which; // We only care about space and return
12596
 
12597
+ if (![13, 32].includes(code)) {
12598
+ return;
12599
+ } // Because return triggers a click anyway, all we need to do is set focus
 
 
 
12600
 
 
 
12601
 
12602
+ if (code === 13) {
12603
+ controls.focusFirstMenuItem.call(player, null, true);
 
 
 
 
 
12604
 
12605
+ return;
12606
+ } // Prevent scroll
 
 
12607
 
 
 
12608
 
12609
+ event.preventDefault(); // Prevent playing video (Firefox)
 
12610
 
12611
+ event.stopPropagation(); // Toggle menu
 
 
12612
 
12613
+ controls.toggleMenu.call(player, event);
12614
+ }, null, false // Can't be passive as we're preventing default
12615
+ ); // Escape closes menu
12616
 
12617
+ this.bind(elements.settings.menu, 'keydown', function (event) {
12618
+ if (event.which === 27) {
12619
+ controls.toggleMenu.call(player, event);
12620
+ }
12621
+ }); // Set range input alternative "value", which matches the tooltip time (#954)
12622
 
12623
+ this.bind(elements.inputs.seek, 'mousedown mousemove', function (event) {
12624
+ var rect = elements.progress.getBoundingClientRect();
12625
+ var percent = 100 / rect.width * (event.pageX - rect.left);
12626
+ event.currentTarget.setAttribute('seek-value', percent);
12627
+ }); // Pause while seeking
12628
 
12629
+ this.bind(elements.inputs.seek, 'mousedown mouseup keydown keyup touchstart touchend', function (event) {
12630
+ var seek = event.currentTarget;
12631
+ var code = event.keyCode ? event.keyCode : event.which;
12632
+ var attribute = 'play-on-seeked';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12633
 
12634
+ if (is$1.keyboardEvent(event) && code !== 39 && code !== 37) {
12635
+ return;
12636
+ } // Record seek time so we can prevent hiding controls for a few seconds after seek
12637
 
 
 
 
12638
 
12639
+ player.lastSeekTime = Date.now(); // Was playing before?
12640
 
12641
+ var play = seek.hasAttribute(attribute); // Done seeking
 
 
12642
 
12643
+ var done = ['mouseup', 'touchend', 'keyup'].includes(event.type); // If we're done seeking and it was playing, resume playback
 
 
 
 
 
 
 
12644
 
12645
+ if (play && done) {
12646
+ seek.removeAttribute(attribute);
12647
+ player.play();
12648
+ } else if (!done && player.playing) {
12649
+ seek.setAttribute(attribute, '');
12650
+ player.pause();
12651
+ }
12652
+ }); // Fix range inputs on iOS
12653
+ // Super weird iOS bug where after you interact with an <input type="range">,
12654
+ // it takes over further interactions on the page. This is a hack
12655
 
12656
+ if (browser.isIos) {
12657
+ var inputs = getElements.call(player, 'input[type="range"]');
12658
+ Array.from(inputs).forEach(function (input) {
12659
+ return _this3.bind(input, inputEvent, function (event) {
12660
+ return repaint(event.target);
12661
+ });
12662
+ });
12663
+ } // Seek
12664
 
 
12665
 
12666
+ this.bind(elements.inputs.seek, inputEvent, function (event) {
12667
+ var seek = event.currentTarget; // If it exists, use seek-value instead of "value" for consistency with tooltip time (#954)
 
 
 
 
 
 
 
12668
 
12669
+ var seekTo = seek.getAttribute('seek-value');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12670
 
12671
+ if (is$1.empty(seekTo)) {
12672
+ seekTo = seek.value;
12673
+ }
12674
 
12675
+ seek.removeAttribute('seek-value');
12676
+ player.currentTime = seekTo / seek.max * player.duration;
12677
+ }, 'seek'); // Seek tooltip
12678
 
12679
+ this.bind(elements.progress, 'mouseenter mouseleave mousemove', function (event) {
12680
+ return controls.updateSeekTooltip.call(player, event);
12681
+ }); // Preview thumbnails plugin
12682
+ // TODO: Really need to work on some sort of plug-in wide event bus or pub-sub for this
12683
 
12684
+ this.bind(elements.progress, 'mousemove touchmove', function (event) {
12685
+ var previewThumbnails = player.previewThumbnails;
12686
 
12687
+ if (previewThumbnails && previewThumbnails.loaded) {
12688
+ previewThumbnails.startMove(event);
12689
+ }
12690
+ }); // Hide thumbnail preview - on mouse click, mouse leave, and video play/seek. All four are required, e.g., for buffering
12691
 
12692
+ this.bind(elements.progress, 'mouseleave click', function () {
12693
+ var previewThumbnails = player.previewThumbnails;
12694
 
12695
+ if (previewThumbnails && previewThumbnails.loaded) {
12696
+ previewThumbnails.endMove(false, true);
12697
+ }
12698
+ }); // Show scrubbing preview
 
 
 
12699
 
12700
+ this.bind(elements.progress, 'mousedown touchstart', function (event) {
12701
+ var previewThumbnails = player.previewThumbnails;
12702
 
12703
+ if (previewThumbnails && previewThumbnails.loaded) {
12704
+ previewThumbnails.startScrubbing(event);
12705
+ }
12706
+ });
12707
+ this.bind(elements.progress, 'mouseup touchend', function (event) {
12708
+ var previewThumbnails = player.previewThumbnails;
12709
+
12710
+ if (previewThumbnails && previewThumbnails.loaded) {
12711
+ previewThumbnails.endScrubbing(event);
12712
+ }
12713
+ }); // Polyfill for lower fill in <input type="range"> for webkit
12714
+
12715
+ if (browser.isWebkit) {
12716
+ Array.from(getElements.call(player, 'input[type="range"]')).forEach(function (element) {
12717
+ _this3.bind(element, 'input', function (event) {
12718
+ return controls.updateRangeFill.call(player, event.target);
12719
+ });
12720
+ });
12721
+ } // Current time invert
12722
+ // Only if one time element is used for both currentTime and duration
12723
 
 
 
12724
 
12725
+ if (player.config.toggleInvert && !is$1.element(elements.display.duration)) {
12726
+ this.bind(elements.display.currentTime, 'click', function () {
12727
+ // Do nothing if we're at the start
12728
+ if (player.currentTime === 0) {
12729
+ return;
12730
+ }
12731
+
12732
+ player.config.invertTime = !player.config.invertTime;
12733
 
12734
+ controls.timeUpdate.call(player);
12735
+ });
12736
+ } // Volume
 
 
 
 
12737
 
 
 
 
 
 
 
 
 
 
 
 
12738
 
12739
+ this.bind(elements.inputs.volume, inputEvent, function (event) {
12740
+ player.volume = event.target.value;
12741
+ }, 'volume'); // Update controls.hover state (used for ui.toggleControls to avoid hiding when interacting)
 
 
 
12742
 
12743
+ this.bind(elements.controls, 'mouseenter mouseleave', function (event) {
12744
+ elements.controls.hover = !player.touch && event.type === 'mouseenter';
12745
+ }); // Update controls.pressed state (used for ui.toggleControls to avoid hiding when interacting)
 
 
 
 
 
 
 
12746
 
12747
+ this.bind(elements.controls, 'mousedown mouseup touchstart touchend touchcancel', function (event) {
12748
+ elements.controls.pressed = ['mousedown', 'touchstart'].includes(event.type);
12749
+ }); // Show controls when they receive focus (e.g., when using keyboard tab key)
12750
 
12751
+ this.bind(elements.controls, 'focusin', function () {
12752
+ var config = player.config,
12753
+ timers = player.timers; // Skip transition to prevent focus from scrolling the parent element
12754
 
12755
+ toggleClass(elements.controls, config.classNames.noTransition, true); // Toggle
 
 
 
 
 
 
 
 
 
12756
 
12757
+ ui.toggleControls.call(player, true); // Restore transition
12758
 
12759
+ setTimeout(function () {
12760
+ toggleClass(elements.controls, config.classNames.noTransition, false);
12761
+ }, 0); // Delay a little more for mouse users
 
 
 
 
 
12762
 
12763
+ var delay = _this3.touch ? 3000 : 4000; // Clear timer
 
 
 
 
 
 
 
12764
 
12765
+ clearTimeout(timers.controls); // Hide again after delay
 
 
12766
 
12767
+ timers.controls = setTimeout(function () {
12768
+ return ui.toggleControls.call(player, false);
12769
+ }, delay);
12770
+ }); // Mouse wheel for volume
 
 
12771
 
12772
+ this.bind(elements.inputs.volume, 'wheel', function (event) {
12773
+ // Detect "natural" scroll - suppored on OS X Safari only
12774
+ // Other browsers on OS X will be inverted until support improves
12775
+ var inverted = event.webkitDirectionInvertedFromDevice; // Get delta from event. Invert if `inverted` is true
12776
 
12777
+ var _map = [event.deltaX, -event.deltaY].map(function (value) {
12778
+ return inverted ? -value : value;
12779
+ }),
12780
+ _map2 = _slicedToArray(_map, 2),
12781
+ x = _map2[0],
12782
+ y = _map2[1]; // Using the biggest delta, normalize to 1 or -1 (or 0 if no delta)
12783
 
 
 
 
 
 
12784
 
12785
+ var direction = Math.sign(Math.abs(x) > Math.abs(y) ? x : y); // Change the volume by 2%
 
 
 
 
12786
 
12787
+ player.increaseVolume(direction / 50); // Don't break page scrolling at max and min
 
 
 
12788
 
12789
+ var volume = player.media.volume;
 
 
 
 
 
 
 
 
 
12790
 
12791
+ if (direction === 1 && volume < 1 || direction === -1 && volume > 0) {
12792
+ event.preventDefault();
12793
+ }
12794
+ }, 'volume', false);
 
 
 
 
 
12795
  }
12796
+ }]);
 
 
 
 
 
 
 
 
 
 
 
 
 
12797
 
12798
+ return Listeners;
12799
+ }();
12800
 
12801
+ var commonjsGlobal = typeof globalThis !== 'undefined' ? globalThis : typeof window !== 'undefined' ? window : typeof global !== 'undefined' ? global : typeof self !== 'undefined' ? self : {};
 
 
 
 
 
12802
 
12803
+ function createCommonjsModule(fn, module) {
12804
+ return module = { exports: {} }, fn(module, module.exports), module.exports;
12805
+ }
12806
 
12807
+ var loadjs_umd = createCommonjsModule(function (module, exports) {
12808
+ (function (root, factory) {
12809
+ {
12810
+ module.exports = factory();
 
12811
  }
12812
+ })(commonjsGlobal, function () {
12813
+ /**
12814
+ * Global dependencies.
12815
+ * @global {Object} document - DOM
12816
+ */
12817
+ var devnull = function devnull() {},
12818
+ bundleIdCache = {},
12819
+ bundleResultCache = {},
12820
+ bundleCallbackQueue = {};
12821
+ /**
12822
+ * Subscribe to bundle load event.
12823
+ * @param {string[]} bundleIds - Bundle ids
12824
+ * @param {Function} callbackFn - The callback function
12825
+ */
12826
+
12827
+
12828
+ function subscribe(bundleIds, callbackFn) {
12829
+ // listify
12830
+ bundleIds = bundleIds.push ? bundleIds : [bundleIds];
12831
+ var depsNotFound = [],
12832
+ i = bundleIds.length,
12833
+ numWaiting = i,
12834
+ fn,
12835
+ bundleId,
12836
+ r,
12837
+ q; // define callback function
12838
+
12839
+ fn = function fn(bundleId, pathsNotFound) {
12840
+ if (pathsNotFound.length) depsNotFound.push(bundleId);
12841
+ numWaiting--;
12842
+ if (!numWaiting) callbackFn(depsNotFound);
12843
+ }; // register callback
12844
+
12845
+
12846
+ while (i--) {
12847
+ bundleId = bundleIds[i]; // execute callback if in result cache
12848
+
12849
+ r = bundleResultCache[bundleId];
12850
+
12851
+ if (r) {
12852
+ fn(bundleId, r);
12853
+ continue;
12854
+ } // add to callback queue
12855
+
12856
+
12857
+ q = bundleCallbackQueue[bundleId] = bundleCallbackQueue[bundleId] || [];
12858
+ q.push(fn);
12859
+ }
12860
  }
12861
+ /**
12862
+ * Publish bundle load event.
12863
+ * @param {string} bundleId - Bundle id
12864
+ * @param {string[]} pathsNotFound - List of files not found
12865
+ */
12866
+
12867
+
12868
+ function publish(bundleId, pathsNotFound) {
12869
+ // exit if id isn't defined
12870
+ if (!bundleId) return;
12871
+ var q = bundleCallbackQueue[bundleId]; // cache result
12872
+
12873
+ bundleResultCache[bundleId] = pathsNotFound; // exit if queue is empty
12874
+
12875
+ if (!q) return; // empty callback queue
12876
+
12877
+ while (q.length) {
12878
+ q[0](bundleId, pathsNotFound);
12879
+ q.splice(0, 1);
12880
+ }
12881
  }
12882
+ /**
12883
+ * Execute callbacks.
12884
+ * @param {Object or Function} args - The callback args
12885
+ * @param {string[]} depsNotFound - List of dependencies not found
12886
+ */
12887
 
 
 
 
 
 
 
 
12888
 
12889
+ function executeCallbacks(args, depsNotFound) {
12890
+ // accept function as argument
12891
+ if (args.call) args = {
12892
+ success: args
12893
+ }; // success and error callbacks
 
 
 
 
 
 
 
 
 
 
 
 
 
 
12894
 
12895
+ if (depsNotFound.length) (args.error || devnull)(depsNotFound);else (args.success || devnull)(args);
12896
+ }
12897
+ /**
12898
+ * Load individual file.
12899
+ * @param {string} path - The file path
12900
+ * @param {Function} callbackFn - The callback function
12901
+ */
12902
+
12903
+
12904
+ function loadFile(path, callbackFn, args, numTries) {
12905
+ var doc = document,
12906
+ async = args.async,
12907
+ maxTries = (args.numRetries || 0) + 1,
12908
+ beforeCallbackFn = args.before || devnull,
12909
+ pathStripped = path.replace(/^(css|img)!/, ''),
12910
+ isLegacyIECss,
12911
+ e;
12912
+ numTries = numTries || 0;
12913
+
12914
+ if (/(^css!|\.css$)/.test(path)) {
12915
+ // css
12916
+ e = doc.createElement('link');
12917
+ e.rel = 'stylesheet';
12918
+ e.href = pathStripped; // tag IE9+
12919
+
12920
+ isLegacyIECss = 'hideFocus' in e; // use preload in IE Edge (to detect load errors)
12921
+
12922
+ if (isLegacyIECss && e.relList) {
12923
+ isLegacyIECss = 0;
12924
+ e.rel = 'preload';
12925
+ e.as = 'style';
12926
+ }
12927
+ } else if (/(^img!|\.(png|gif|jpg|svg)$)/.test(path)) {
12928
+ // image
12929
+ e = doc.createElement('img');
12930
+ e.src = pathStripped;
12931
+ } else {
12932
+ // javascript
12933
+ e = doc.createElement('script');
12934
+ e.src = path;
12935
+ e.async = async === undefined ? true : async;
12936
+ }
12937
 
12938
+ e.onload = e.onerror = e.onbeforeload = function (ev) {
12939
+ var result = ev.type[0]; // treat empty stylesheets as failures to get around lack of onerror
12940
+ // support in IE9-11
12941
+
12942
+ if (isLegacyIECss) {
12943
+ try {
12944
+ if (!e.sheet.cssText.length) result = 'e';
12945
+ } catch (x) {
12946
+ // sheets objects created from load errors don't allow access to
12947
+ // `cssText` (unless error is Code:18 SecurityError)
12948
+ if (x.code != 18) result = 'e';
12949
+ }
12950
+ } // handle retries in case of load failure
 
12951
 
 
 
 
12952
 
12953
+ if (result == 'e') {
12954
+ // increment counter
12955
+ numTries += 1; // exit function and try again
 
 
 
 
12956
 
12957
+ if (numTries < maxTries) {
12958
+ return loadFile(path, callbackFn, args, numTries);
12959
+ }
12960
+ } else if (e.rel == 'preload' && e.as == 'style') {
12961
+ // activate preloaded stylesheets
12962
+ return e.rel = 'stylesheet'; // jshint ignore:line
12963
+ } // execute callback
12964
 
 
 
 
 
 
12965
 
12966
+ callbackFn(path, result, ev.defaultPrevented);
12967
+ }; // add to document (unless callback returns `false`)
12968
 
12969
+
12970
+ if (beforeCallbackFn(path, e) !== false) doc.head.appendChild(e);
 
 
 
 
 
 
 
 
 
 
12971
  }
12972
+ /**
12973
+ * Load multiple files.
12974
+ * @param {string[]} paths - The file paths
12975
+ * @param {Function} callbackFn - The callback function
12976
+ */
12977
+
12978
+
12979
+ function loadFiles(paths, callbackFn, args) {
12980
+ // listify paths
12981
+ paths = paths.push ? paths : [paths];
12982
+ var numWaiting = paths.length,
12983
+ x = numWaiting,
12984
+ pathsNotFound = [],
12985
+ fn,
12986
+ i; // define callback function
12987
+
12988
+ fn = function fn(path, result, defaultPrevented) {
12989
+ // handle error
12990
+ if (result == 'e') pathsNotFound.push(path); // handle beforeload event. If defaultPrevented then that means the load
12991
+ // will be blocked (ex. Ghostery/ABP on Safari)
12992
+
12993
+ if (result == 'b') {
12994
+ if (defaultPrevented) pathsNotFound.push(path);else return;
12995
+ }
12996
+
12997
+ numWaiting--;
12998
+ if (!numWaiting) callbackFn(pathsNotFound);
12999
+ }; // load scripts
13000
+
13001
+
13002
+ for (i = 0; i < x; i++) {
13003
+ loadFile(paths[i], fn, args);
13004
+ }
13005
+ }
13006
+ /**
13007
+ * Initiate script load and register bundle.
13008
+ * @param {(string|string[])} paths - The file paths
13009
+ * @param {(string|Function|Object)} [arg1] - The (1) bundleId or (2) success
13010
+ * callback or (3) object literal with success/error arguments, numRetries,
13011
+ * etc.
13012
+ * @param {(Function|Object)} [arg2] - The (1) success callback or (2) object
13013
+ * literal with success/error arguments, numRetries, etc.
13014
+ */
13015
+
13016
+
13017
+ function loadjs(paths, arg1, arg2) {
13018
+ var bundleId, args; // bundleId (if string)
13019
+
13020
+ if (arg1 && arg1.trim) bundleId = arg1; // args (default is {})
13021
+
13022
+ args = (bundleId ? arg2 : arg1) || {}; // throw error if bundle is already defined
13023
+
13024
+ if (bundleId) {
13025
+ if (bundleId in bundleIdCache) {
13026
+ throw "LoadJS";
13027
+ } else {
13028
+ bundleIdCache[bundleId] = true;
13029
+ }
13030
+ }
13031
 
13032
+ function loadFn(resolve, reject) {
13033
+ loadFiles(paths, function (pathsNotFound) {
13034
+ // execute callbacks
13035
+ executeCallbacks(args, pathsNotFound); // resolve Promise
13036
 
13037
+ if (resolve) {
13038
+ executeCallbacks({
13039
+ success: resolve,
13040
+ error: reject
13041
+ }, pathsNotFound);
13042
+ } // publish bundle load event
13043
+
13044
+
13045
+ publish(bundleId, pathsNotFound);
13046
+ }, args);
13047
+ }
13048
+
13049
+ if (args.returnPromise) return new Promise(loadFn);else loadFn();
13050
  }
13051
+ /**
13052
+ * Execute callbacks when dependencies have been satisfied.
13053
+ * @param {(string|string[])} deps - List of bundle ids
13054
+ * @param {Object} args - success/error arguments
13055
+ */
13056
+
13057
+
13058
+ loadjs.ready = function ready(deps, args) {
13059
+ // subscribe to bundle load event
13060
+ subscribe(deps, function (depsNotFound) {
13061
+ // execute callbacks
13062
+ executeCallbacks(args, depsNotFound);
13063
+ });
13064
+ return loadjs;
13065
+ };
13066
+ /**
13067
+ * Manually satisfy bundle dependencies.
13068
+ * @param {string} bundleId - The bundle id
13069
+ */
13070
 
13071
+
13072
+ loadjs.done = function done(bundleId) {
13073
+ publish(bundleId, []);
 
13074
  };
13075
+ /**
13076
+ * Reset loadjs dependencies statuses
13077
+ */
13078
 
 
 
13079
 
13080
+ loadjs.reset = function reset() {
13081
+ bundleIdCache = {};
13082
+ bundleResultCache = {};
13083
+ bundleCallbackQueue = {};
13084
+ };
13085
+ /**
13086
+ * Determine if bundle has already been defined
13087
+ * @param String} bundleId - The bundle id
13088
+ */
13089
+
13090
+
13091
+ loadjs.isDefined = function isDefined(bundleId) {
13092
+ return bundleId in bundleIdCache;
13093
+ }; // export
13094
+
13095
+
13096
+ return loadjs;
13097
+ });
13098
+ });
13099
+
13100
+ // ==========================================================================
13101
+ function loadScript(url) {
13102
+ return new Promise(function (resolve, reject) {
13103
+ loadjs_umd(url, {
13104
+ success: resolve,
13105
+ error: reject
13106
+ });
13107
+ });
13108
+ }
13109
+
13110
+ function parseId(url) {
13111
+ if (is$1.empty(url)) {
13112
+ return null;
13113
  }
 
13114
 
13115
+ if (is$1.number(Number(url))) {
13116
+ return url;
13117
+ }
13118
 
13119
+ var regex = /^.*(vimeo.com\/|video\/)(\d+).*/;
13120
+ return url.match(regex) ? RegExp.$2 : url;
13121
+ } // Set playback state and trigger change (only on actual change)
13122
+
13123
+
13124
+ function assurePlaybackState(play) {
13125
+ if (play && !this.embed.hasPlayed) {
13126
+ this.embed.hasPlayed = true;
13127
  }
13128
+
13129
+ if (this.media.paused === play) {
13130
+ this.media.paused = !play;
13131
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
 
13132
  }
13133
+ }
 
 
 
13134
 
13135
+ var vimeo = {
13136
+ setup: function setup() {
13137
+ var _this = this;
13138
+
13139
+ // Add embed class for responsive
13140
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Set intial ratio
13141
+
13142
+ setAspectRatio.call(this); // Load the SDK if not already
13143
+
13144
+ if (!is$1.object(window.Vimeo)) {
13145
+ loadScript(this.config.urls.vimeo.sdk).then(function () {
13146
+ vimeo.ready.call(_this);
13147
+ }).catch(function (error) {
13148
+ _this.debug.warn('Vimeo SDK (player.js) failed to load', error);
13149
+ });
13150
+ } else {
13151
+ vimeo.ready.call(this);
13152
  }
13153
+ },
13154
+ // API Ready
13155
+ ready: function ready() {
13156
+ var _this2 = this;
13157
 
13158
+ var player = this;
13159
+ var config = player.config.vimeo; // Get Vimeo params for the iframe
13160
+
13161
+ var params = buildUrlParams(extend({}, {
13162
+ loop: player.config.loop.active,
13163
+ autoplay: player.autoplay,
13164
+ muted: player.muted,
13165
+ gesture: 'media',
13166
+ playsinline: !this.config.fullscreen.iosNative
13167
+ }, config)); // Get the source URL or ID
13168
+
13169
+ var source = player.media.getAttribute('src'); // Get from <div> if needed
13170
+
13171
+ if (is$1.empty(source)) {
13172
+ source = player.media.getAttribute(player.config.attributes.embed.id);
13173
  }
 
 
 
13174
 
13175
+ var id = parseId(source); // Build an iframe
13176
 
13177
+ var iframe = createElement('iframe');
13178
+ var src = format(player.config.urls.vimeo.iframe, id, params);
13179
+ iframe.setAttribute('src', src);
13180
+ iframe.setAttribute('allowfullscreen', '');
13181
+ iframe.setAttribute('allowtransparency', '');
13182
+ iframe.setAttribute('allow', 'autoplay'); // Get poster, if already set
 
 
 
 
 
 
 
13183
 
13184
+ var poster = player.poster; // Inject the package
 
 
 
 
13185
 
13186
+ var wrapper = createElement('div', {
13187
+ poster: poster,
13188
+ class: player.config.classNames.embedContainer
13189
+ });
13190
+ wrapper.appendChild(iframe);
13191
+ player.media = replaceElement(wrapper, player.media); // Get poster image
13192
 
13193
+ fetch(format(player.config.urls.vimeo.api, id), 'json').then(function (response) {
13194
+ if (is$1.empty(response)) {
13195
+ return;
13196
+ } // Get the URL for thumbnail
13197
 
 
 
 
13198
 
13199
+ var url = new URL(response[0].thumbnail_large); // Get original image
 
 
13200
 
13201
+ url.pathname = "".concat(url.pathname.split('_')[0], ".jpg"); // Set and show poster
13202
 
13203
+ ui.setPoster.call(player, url.href).catch(function () {});
13204
+ }); // Setup instance
13205
+ // https://github.com/vimeo/player.js
 
 
 
 
 
 
 
 
13206
 
13207
+ player.embed = new window.Vimeo.Player(iframe, {
13208
+ autopause: player.config.autopause,
13209
+ muted: player.muted
13210
+ });
13211
+ player.media.paused = true;
13212
+ player.media.currentTime = 0; // Disable native text track rendering
13213
+
13214
+ if (player.supported.ui) {
13215
+ player.embed.disableTextTrack();
13216
+ } // Create a faux HTML5 API using the Vimeo API
13217
+
13218
+
13219
+ player.media.play = function () {
13220
+ assurePlaybackState.call(player, true);
13221
+ return player.embed.play();
13222
+ };
13223
+
13224
+ player.media.pause = function () {
13225
+ assurePlaybackState.call(player, false);
13226
+ return player.embed.pause();
13227
+ };
13228
+
13229
+ player.media.stop = function () {
13230
+ player.pause();
13231
+ player.currentTime = 0;
13232
+ }; // Seeking
13233
+
13234
+
13235
+ var currentTime = player.media.currentTime;
13236
+ Object.defineProperty(player.media, 'currentTime', {
13237
+ get: function get() {
13238
+ return currentTime;
13239
+ },
13240
+ set: function set(time) {
13241
+ // Vimeo will automatically play on seek if the video hasn't been played before
13242
+ // Get current paused state and volume etc
13243
+ var embed = player.embed,
13244
+ media = player.media,
13245
+ paused = player.paused,
13246
+ volume = player.volume;
13247
+ var restorePause = paused && !embed.hasPlayed; // Set seeking state and trigger event
13248
+
13249
+ media.seeking = true;
13250
+ triggerEvent.call(player, media, 'seeking'); // If paused, mute until seek is complete
13251
+
13252
+ Promise.resolve(restorePause && embed.setVolume(0)) // Seek
13253
+ .then(function () {
13254
+ return embed.setCurrentTime(time);
13255
+ }) // Restore paused
13256
+ .then(function () {
13257
+ return restorePause && embed.pause();
13258
+ }) // Restore volume
13259
+ .then(function () {
13260
+ return restorePause && embed.setVolume(volume);
13261
+ }).catch(function () {// Do nothing
13262
+ });
13263
+ }
13264
+ }); // Playback speed
13265
+
13266
+ var speed = player.config.speed.selected;
13267
+ Object.defineProperty(player.media, 'playbackRate', {
13268
+ get: function get() {
13269
+ return speed;
13270
+ },
13271
+ set: function set(input) {
13272
+ player.embed.setPlaybackRate(input).then(function () {
13273
+ speed = input;
13274
+ triggerEvent.call(player, player.media, 'ratechange');
13275
+ }).catch(function (error) {
13276
+ // Hide menu item (and menu if empty)
13277
+ if (error.name === 'Error') {
13278
+ controls.setSpeedMenu.call(player, []);
13279
+ }
13280
+ });
13281
+ }
13282
+ }); // Volume
13283
+
13284
+ var volume = player.config.volume;
13285
+ Object.defineProperty(player.media, 'volume', {
13286
+ get: function get() {
13287
+ return volume;
13288
+ },
13289
+ set: function set(input) {
13290
+ player.embed.setVolume(input).then(function () {
13291
+ volume = input;
13292
+ triggerEvent.call(player, player.media, 'volumechange');
13293
+ });
13294
+ }
13295
+ }); // Muted
13296
+
13297
+ var muted = player.config.muted;
13298
+ Object.defineProperty(player.media, 'muted', {
13299
+ get: function get() {
13300
+ return muted;
13301
+ },
13302
+ set: function set(input) {
13303
+ var toggle = is$1.boolean(input) ? input : false;
13304
+ player.embed.setVolume(toggle ? 0 : player.config.volume).then(function () {
13305
+ muted = toggle;
13306
+ triggerEvent.call(player, player.media, 'volumechange');
13307
+ });
13308
+ }
13309
+ }); // Loop
13310
+
13311
+ var loop = player.config.loop;
13312
+ Object.defineProperty(player.media, 'loop', {
13313
+ get: function get() {
13314
+ return loop;
13315
+ },
13316
+ set: function set(input) {
13317
+ var toggle = is$1.boolean(input) ? input : player.config.loop.active;
13318
+ player.embed.setLoop(toggle).then(function () {
13319
+ loop = toggle;
13320
+ });
13321
+ }
13322
+ }); // Source
13323
+
13324
+ var currentSrc;
13325
+ player.embed.getVideoUrl().then(function (value) {
13326
+ currentSrc = value;
13327
+ controls.setDownloadUrl.call(player);
13328
+ }).catch(function (error) {
13329
+ _this2.debug.warn(error);
13330
+ });
13331
+ Object.defineProperty(player.media, 'currentSrc', {
13332
+ get: function get() {
13333
+ return currentSrc;
13334
+ }
13335
+ }); // Ended
13336
+
13337
+ Object.defineProperty(player.media, 'ended', {
13338
+ get: function get() {
13339
+ return player.currentTime === player.duration;
13340
+ }
13341
+ }); // Set aspect ratio based on video size
13342
+
13343
+ Promise.all([player.embed.getVideoWidth(), player.embed.getVideoHeight()]).then(function (dimensions) {
13344
+ var _dimensions = _slicedToArray(dimensions, 2),
13345
+ width = _dimensions[0],
13346
+ height = _dimensions[1];
13347
+
13348
+ player.embed.ratio = [width, height];
13349
+ setAspectRatio.call(_this2);
13350
+ }); // Set autopause
13351
+
13352
+ player.embed.setAutopause(player.config.autopause).then(function (state) {
13353
+ player.config.autopause = state;
13354
+ }); // Get title
13355
+
13356
+ player.embed.getVideoTitle().then(function (title) {
13357
+ player.config.title = title;
13358
+ ui.setTitle.call(_this2);
13359
+ }); // Get current time
13360
+
13361
+ player.embed.getCurrentTime().then(function (value) {
13362
+ currentTime = value;
13363
+ triggerEvent.call(player, player.media, 'timeupdate');
13364
+ }); // Get duration
13365
+
13366
+ player.embed.getDuration().then(function (value) {
13367
+ player.media.duration = value;
13368
+ triggerEvent.call(player, player.media, 'durationchange');
13369
+ }); // Get captions
13370
+
13371
+ player.embed.getTextTracks().then(function (tracks) {
13372
+ player.media.textTracks = tracks;
13373
+ captions.setup.call(player);
13374
+ });
13375
+ player.embed.on('cuechange', function (_ref) {
13376
+ var _ref$cues = _ref.cues,
13377
+ cues = _ref$cues === void 0 ? [] : _ref$cues;
13378
+ var strippedCues = cues.map(function (cue) {
13379
+ return stripHTML(cue.text);
13380
+ });
13381
+ captions.updateCues.call(player, strippedCues);
13382
+ });
13383
+ player.embed.on('loaded', function () {
13384
+ // Assure state and events are updated on autoplay
13385
+ player.embed.getPaused().then(function (paused) {
13386
+ assurePlaybackState.call(player, !paused);
13387
+
13388
+ if (!paused) {
13389
+ triggerEvent.call(player, player.media, 'playing');
13390
+ }
13391
+ });
13392
+
13393
+ if (is$1.element(player.embed.element) && player.supported.ui) {
13394
+ var frame = player.embed.element; // Fix keyboard focus issues
13395
+ // https://github.com/sampotts/plyr/issues/317
13396
+
13397
+ frame.setAttribute('tabindex', -1);
13398
+ }
13399
+ });
13400
+ player.embed.on('play', function () {
13401
+ assurePlaybackState.call(player, true);
13402
+ triggerEvent.call(player, player.media, 'playing');
13403
+ });
13404
+ player.embed.on('pause', function () {
13405
+ assurePlaybackState.call(player, false);
13406
+ });
13407
+ player.embed.on('timeupdate', function (data) {
13408
+ player.media.seeking = false;
13409
+ currentTime = data.seconds;
13410
+ triggerEvent.call(player, player.media, 'timeupdate');
13411
+ });
13412
+ player.embed.on('progress', function (data) {
13413
+ player.media.buffered = data.percent;
13414
+ triggerEvent.call(player, player.media, 'progress'); // Check all loaded
13415
+
13416
+ if (parseInt(data.percent, 10) === 1) {
13417
+ triggerEvent.call(player, player.media, 'canplaythrough');
13418
+ } // Get duration as if we do it before load, it gives an incorrect value
13419
+ // https://github.com/sampotts/plyr/issues/891
13420
+
13421
+
13422
+ player.embed.getDuration().then(function (value) {
13423
+ if (value !== player.media.duration) {
13424
+ player.media.duration = value;
13425
+ triggerEvent.call(player, player.media, 'durationchange');
13426
+ }
13427
+ });
13428
+ });
13429
+ player.embed.on('seeked', function () {
13430
+ player.media.seeking = false;
13431
+ triggerEvent.call(player, player.media, 'seeked');
13432
+ });
13433
+ player.embed.on('ended', function () {
13434
+ player.media.paused = true;
13435
+ triggerEvent.call(player, player.media, 'ended');
13436
+ });
13437
+ player.embed.on('error', function (detail) {
13438
+ player.media.error = detail;
13439
+ triggerEvent.call(player, player.media, 'error');
13440
+ }); // Rebuild UI
13441
+
13442
+ setTimeout(function () {
13443
+ return ui.build.call(player);
13444
+ }, 0);
13445
  }
 
 
 
 
 
 
 
 
 
 
13446
  };
13447
 
13448
+ // ==========================================================================
 
 
 
 
 
 
 
 
13449
 
13450
+ function parseId$1(url) {
13451
+ if (is$1.empty(url)) {
13452
+ return null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13453
  }
 
 
13454
 
13455
+ var regex = /^.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|&v=)([^#&?]*).*/;
13456
+ return url.match(regex) ? RegExp.$2 : url;
13457
+ } // Set playback state and trigger change (only on actual change)
13458
+
13459
+
13460
+ function assurePlaybackState$1(play) {
13461
+ if (play && !this.embed.hasPlayed) {
13462
+ this.embed.hasPlayed = true;
 
 
 
 
 
13463
  }
 
13464
 
13465
+ if (this.media.paused === play) {
13466
+ this.media.paused = !play;
13467
+ triggerEvent.call(this, this.media, play ? 'play' : 'pause');
 
 
13468
  }
13469
+ }
 
 
 
13470
 
13471
+ function getHost(config) {
13472
+ if (config.noCookie) {
13473
+ return 'https://www.youtube-nocookie.com';
13474
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13475
 
13476
+ if (window.location.protocol === 'http:') {
13477
+ return 'http://www.youtube.com';
13478
+ } // Use YouTube's default
13479
 
 
 
 
 
 
 
 
 
 
13480
 
13481
+ return undefined;
13482
+ }
13483
 
13484
+ var youtube = {
13485
+ setup: function setup() {
13486
+ var _this = this;
13487
 
13488
+ // Add embed class for responsive
13489
+ toggleClass(this.elements.wrapper, this.config.classNames.embed, true); // Setup API
13490
 
13491
+ if (is$1.object(window.YT) && is$1.function(window.YT.Player)) {
13492
+ youtube.ready.call(this);
13493
+ } else {
13494
+ // Reference current global callback
13495
+ var callback = window.onYouTubeIframeAPIReady; // Set callback to process queue
13496
 
13497
+ window.onYouTubeIframeAPIReady = function () {
13498
+ // Call global callback if set
13499
+ if (is$1.function(callback)) {
13500
+ callback();
13501
+ }
 
 
 
 
 
 
 
 
 
 
13502
 
13503
+ youtube.ready.call(_this);
13504
+ }; // Load the SDK
 
 
 
 
13505
 
13506
 
13507
+ loadScript(this.config.urls.youtube.sdk).catch(function (error) {
13508
+ _this.debug.warn('YouTube API failed to load', error);
13509
+ });
13510
+ }
13511
+ },
13512
+ // Get the media title
13513
+ getTitle: function getTitle(videoId) {
13514
+ var _this2 = this;
 
 
 
 
 
 
 
13515
 
13516
+ var url = format(this.config.urls.youtube.api, videoId);
13517
+ fetch(url).then(function (data) {
13518
+ if (is$1.object(data)) {
13519
+ var title = data.title,
13520
+ height = data.height,
13521
+ width = data.width; // Set title
13522
 
13523
+ _this2.config.title = title;
13524
+ ui.setTitle.call(_this2); // Set aspect ratio
 
 
 
 
 
 
 
 
 
 
 
13525
 
13526
+ _this2.embed.ratio = [width, height];
13527
+ }
13528
 
13529
+ setAspectRatio.call(_this2);
13530
+ }).catch(function () {
13531
+ // Set aspect ratio
13532
+ setAspectRatio.call(_this2);
13533
+ });
13534
  },
13535
+ // API ready
13536
+ ready: function ready() {
13537
+ var player = this; // Ignore already setup (race condition)
13538
+
13539
+ var currentId = player.media && player.media.getAttribute('id');
13540
+
13541
+ if (!is$1.empty(currentId) && currentId.startsWith('youtube-')) {
13542
+ return;
13543
+ } // Get the source URL or ID
13544
+
13545
+
13546
+ var source = player.media.getAttribute('src'); // Get from <div> if needed
13547
+
13548
+ if (is$1.empty(source)) {
13549
+ source = player.media.getAttribute(this.config.attributes.embed.id);
13550
+ } // Replace the <iframe> with a <div> due to YouTube API issues
13551
+
13552
+
13553
+ var videoId = parseId$1(source);
13554
+ var id = generateId(player.provider); // Get poster, if already set
13555
+
13556
+ var poster = player.poster; // Replace media element
13557
+
13558
+ var container = createElement('div', {
13559
+ id: id,
13560
+ poster: poster
13561
+ });
13562
+ player.media = replaceElement(container, player.media); // Id to poster wrapper
13563
+
13564
+ var posterSrc = function posterSrc(s) {
13565
+ return "https://i.ytimg.com/vi/".concat(videoId, "/").concat(s, "default.jpg");
13566
+ }; // Check thumbnail images in order of quality, but reject fallback thumbnails (120px wide)
13567
+
13568
+
13569
+ loadImage(posterSrc('maxres'), 121) // Higest quality and unpadded
13570
+ .catch(function () {
13571
+ return loadImage(posterSrc('sd'), 121);
13572
+ }) // 480p padded 4:3
13573
+ .catch(function () {
13574
+ return loadImage(posterSrc('hq'));
13575
+ }) // 360p padded 4:3. Always exists
13576
+ .then(function (image) {
13577
+ return ui.setPoster.call(player, image.src);
13578
+ }).then(function (src) {
13579
+ // If the image is padded, use background-size "cover" instead (like youtube does too with their posters)
13580
+ if (!src.includes('maxres')) {
13581
+ player.elements.poster.style.backgroundSize = 'cover';
13582
+ }
13583
+ }).catch(function () {});
13584
+ var config = player.config.youtube; // Setup instance
13585
+ // https://developers.google.com/youtube/iframe_api_reference
13586
+
13587
+ player.embed = new window.YT.Player(id, {
13588
+ videoId: videoId,
13589
+ host: getHost(config),
13590
+ playerVars: extend({}, {
13591
+ autoplay: player.config.autoplay ? 1 : 0,
13592
+ // Autoplay
13593
+ hl: player.config.hl,
13594
+ // iframe interface language
13595
+ controls: player.supported.ui ? 0 : 1,
13596
+ // Only show controls if not fully supported
13597
+ disablekb: 1,
13598
+ // Disable keyboard as we handle it
13599
+ playsinline: !player.config.fullscreen.iosNative ? 1 : 0,
13600
+ // Allow iOS inline playback
13601
+ // Captions are flaky on YouTube
13602
+ cc_load_policy: player.captions.active ? 1 : 0,
13603
+ cc_lang_pref: player.config.captions.language,
13604
+ // Tracking for stats
13605
+ widget_referrer: window ? window.location.href : null
13606
+ }, config),
13607
+ events: {
13608
+ onError: function onError(event) {
13609
+ // YouTube may fire onError twice, so only handle it once
13610
+ if (!player.media.error) {
13611
+ var code = event.data; // Messages copied from https://developers.google.com/youtube/iframe_api_reference#onError
13612
+
13613
+ var message = {
13614
+ 2: 'The request contains an invalid parameter value. For example, this error occurs if you specify a video ID that does not have 11 characters, or if the video ID contains invalid characters, such as exclamation points or asterisks.',
13615
+ 5: 'The requested content cannot be played in an HTML5 player or another error related to the HTML5 player has occurred.',
13616
+ 100: 'The video requested was not found. This error occurs when a video has been removed (for any reason) or has been marked as private.',
13617
+ 101: 'The owner of the requested video does not allow it to be played in embedded players.',
13618
+ 150: 'The owner of the requested video does not allow it to be played in embedded players.'
13619
+ }[code] || 'An unknown error occured';
13620
+ player.media.error = {
13621
+ code: code,
13622
+ message: message
13623
+ };
13624
+ triggerEvent.call(player, player.media, 'error');
13625
  }
13626
+ },
13627
+ onPlaybackRateChange: function onPlaybackRateChange(event) {
13628
+ // Get the instance
13629
+ var instance = event.target; // Get current speed
13630
+
13631
+ player.media.playbackRate = instance.getPlaybackRate();
13632
+ triggerEvent.call(player, player.media, 'ratechange');
13633
+ },
13634
+ onReady: function onReady(event) {
13635
+ // Bail if onReady has already been called. See issue #1108
13636
+ if (is$1.function(player.media.play)) {
13637
+ return;
13638
+ } // Get the instance
13639
+
13640
+
13641
+ var instance = event.target; // Get the title
13642
+
13643
+ youtube.getTitle.call(player, videoId); // Create a faux HTML5 API using the YouTube API
13644
+
13645
+ player.media.play = function () {
13646
+ assurePlaybackState$1.call(player, true);
13647
+ instance.playVideo();
13648
+ };
13649
+
13650
+ player.media.pause = function () {
13651
+ assurePlaybackState$1.call(player, false);
13652
+ instance.pauseVideo();
13653
+ };
13654
+
13655
+ player.media.stop = function () {
13656
+ instance.stopVideo();
13657
+ };
13658
+
13659
+ player.media.duration = instance.getDuration();
13660
+ player.media.paused = true; // Seeking
13661
+
13662
+ player.media.currentTime = 0;
13663
+ Object.defineProperty(player.media, 'currentTime', {
13664
+ get: function get() {
13665
+ return Number(instance.getCurrentTime());
13666
+ },
13667
+ set: function set(time) {
13668
+ // If paused and never played, mute audio preventively (YouTube starts playing on seek if the video hasn't been played yet).
13669
+ if (player.paused && !player.embed.hasPlayed) {
13670
+ player.embed.mute();
13671
+ } // Set seeking state and trigger event
13672
+
13673
+
13674
+ player.media.seeking = true;
13675
+ triggerEvent.call(player, player.media, 'seeking'); // Seek after events sent
13676
+
13677
+ instance.seekTo(time);
13678
+ }
13679
+ }); // Playback speed
13680
+
13681
+ Object.defineProperty(player.media, 'playbackRate', {
13682
+ get: function get() {
13683
+ return instance.getPlaybackRate();
13684
+ },
13685
+ set: function set(input) {
13686
+ instance.setPlaybackRate(input);
13687
+ }
13688
+ }); // Volume
13689
+
13690
+ var volume = player.config.volume;
13691
+ Object.defineProperty(player.media, 'volume', {
13692
+ get: function get() {
13693
+ return volume;
13694
+ },
13695
+ set: function set(input) {
13696
+ volume = input;
13697
+ instance.setVolume(volume * 100);
13698
+ triggerEvent.call(player, player.media, 'volumechange');
13699
+ }
13700
+ }); // Muted
13701
+
13702
+ var muted = player.config.muted;
13703
+ Object.defineProperty(player.media, 'muted', {
13704
+ get: function get() {
13705
+ return muted;
13706
+ },
13707
+ set: function set(input) {
13708
+ var toggle = is$1.boolean(input) ? input : muted;
13709
+ muted = toggle;
13710
+ instance[toggle ? 'mute' : 'unMute']();
13711
+ triggerEvent.call(player, player.media, 'volumechange');
13712
+ }
13713
+ }); // Source
13714
+
13715
+ Object.defineProperty(player.media, 'currentSrc', {
13716
+ get: function get() {
13717
+ return instance.getVideoUrl();
13718
+ }
13719
+ }); // Ended
13720
+
13721
+ Object.defineProperty(player.media, 'ended', {
13722
+ get: function get() {
13723
+ return player.currentTime === player.duration;
13724
+ }
13725
+ }); // Get available speeds
13726
+
13727
+ player.options.speed = instance.getAvailablePlaybackRates(); // Set the tabindex to avoid focus entering iframe
13728
+
13729
+ if (player.supported.ui) {
13730
+ player.media.setAttribute('tabindex', -1);
13731
  }
 
 
 
 
13732
 
13733
+ triggerEvent.call(player, player.media, 'timeupdate');
13734
+ triggerEvent.call(player, player.media, 'durationchange'); // Reset timer
13735
+
13736
+ clearInterval(player.timers.buffering); // Setup buffering
13737
+
13738
+ player.timers.buffering = setInterval(function () {
13739
+ // Get loaded % from YouTube
13740
+ player.media.buffered = instance.getVideoLoadedFraction(); // Trigger progress only when we actually buffer something
13741
+
13742
+ if (player.media.lastBuffered === null || player.media.lastBuffered < player.media.buffered) {
13743
+ triggerEvent.call(player, player.media, 'progress');
13744
+ } // Set last buffer point
13745
+
13746
+
13747
+ player.media.lastBuffered = player.media.buffered; // Bail if we're at 100%
13748
+
13749
+ if (player.media.buffered === 1) {
13750
+ clearInterval(player.timers.buffering); // Trigger event
13751
+
13752
+ triggerEvent.call(player, player.media, 'canplaythrough');
13753
+ }
13754
+ }, 200); // Rebuild UI
13755
+
13756
+ setTimeout(function () {
13757
+ return ui.build.call(player);
13758
+ }, 50);
13759
+ },
13760
+ onStateChange: function onStateChange(event) {
13761
+ // Get the instance
13762
+ var instance = event.target; // Reset timer
13763
+
13764
+ clearInterval(player.timers.playing);
13765
+ var seeked = player.media.seeking && [1, 2].includes(event.data);
13766
+
13767
+ if (seeked) {
13768
+ // Unset seeking and fire seeked event
13769
+ player.media.seeking = false;
13770
+ triggerEvent.call(player, player.media, 'seeked');
13771
+ } // Handle events
13772
+ // -1 Unstarted
13773
+ // 0 Ended
13774
+ // 1 Playing
13775
+ // 2 Paused
13776
+ // 3 Buffering
13777
+ // 5 Video cued
13778
+
13779
+
13780
+ switch (event.data) {
13781
+ case -1:
13782
+ // Update scrubber
13783
+ triggerEvent.call(player, player.media, 'timeupdate'); // Get loaded % from YouTube
13784
+
13785
+ player.media.buffered = instance.getVideoLoadedFraction();
13786
+ triggerEvent.call(player, player.media, 'progress');
13787
+ break;
13788
+
13789
+ case 0:
13790
+ assurePlaybackState$1.call(player, false); // YouTube doesn't support loop for a single video, so mimick it.
13791
+
13792
+ if (player.media.loop) {
13793
+ // YouTube needs a call to `stopVideo` before playing again
13794
+ instance.stopVideo();
13795
+ instance.playVideo();
13796
+ } else {
13797
+ triggerEvent.call(player, player.media, 'ended');
13798
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13799
 
13800
+ break;
 
 
13801
 
13802
+ case 1:
13803
+ // Restore paused state (YouTube starts playing on seek if the video hasn't been played yet)
13804
+ if (!player.config.autoplay && player.media.paused && !player.embed.hasPlayed) {
13805
+ player.media.pause();
13806
+ } else {
13807
+ assurePlaybackState$1.call(player, true);
13808
+ triggerEvent.call(player, player.media, 'playing'); // Poll to get playback progress
13809
+
13810
+ player.timers.playing = setInterval(function () {
13811
+ triggerEvent.call(player, player.media, 'timeupdate');
13812
+ }, 50); // Check duration again due to YouTube bug
13813
+ // https://github.com/sampotts/plyr/issues/374
13814
+ // https://code.google.com/p/gdata-issues/issues/detail?id=8690
13815
+
13816
+ if (player.media.duration !== instance.getDuration()) {
13817
+ player.media.duration = instance.getDuration();
13818
+ triggerEvent.call(player, player.media, 'durationchange');
13819
+ }
13820
+ }
13821
+
13822
+ break;
13823
+
13824
+ case 2:
13825
+ // Restore audio (YouTube starts playing on seek if the video hasn't been played yet)
13826
+ if (!player.muted) {
13827
+ player.embed.unMute();
13828
  }
13829
+
13830
+ assurePlaybackState$1.call(player, false);
13831
+ break;
13832
+
13833
+ default:
13834
+ break;
13835
  }
13836
 
13837
+ triggerEvent.call(player, player.elements.container, 'statechange', false, {
13838
+ code: event.data
13839
+ });
13840
+ }
13841
+ }
13842
+ });
13843
+ }
13844
+ };
13845
 
13846
+ // ==========================================================================
13847
+ var media = {
13848
+ // Setup media
13849
+ setup: function setup() {
13850
+ // If there's no media, bail
13851
+ if (!this.media) {
13852
+ this.debug.warn('No media element found!');
13853
+ return;
13854
+ } // Add type class
13855
 
13856
 
13857
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', this.type), true); // Add provider class
 
 
 
13858
 
13859
+ toggleClass(this.elements.container, this.config.classNames.provider.replace('{0}', this.provider), true); // Add video class for embeds
13860
+ // This will require changes if audio embeds are added
13861
 
13862
+ if (this.isEmbed) {
13863
+ toggleClass(this.elements.container, this.config.classNames.type.replace('{0}', 'video'), true);
13864
+ } // Inject the player wrapper
 
 
 
 
 
 
 
13865
 
 
 
 
 
13866
 
13867
+ if (this.isVideo) {
13868
+ // Create the wrapper div
13869
+ this.elements.wrapper = createElement('div', {
13870
+ class: this.config.classNames.video
13871
+ }); // Wrap the video in a container
13872
 
13873
+ wrap(this.media, this.elements.wrapper); // Faux poster container
 
 
 
 
13874
 
13875
+ this.elements.poster = createElement('div', {
13876
+ class: this.config.classNames.poster
13877
+ });
13878
+ this.elements.wrapper.appendChild(this.elements.poster);
13879
+ }
13880
 
13881
+ if (this.isHTML5) {
13882
+ html5.extend.call(this);
13883
+ } else if (this.isYouTube) {
13884
+ youtube.setup.call(this);
13885
+ } else if (this.isVimeo) {
13886
+ vimeo.setup.call(this);
13887
+ }
13888
+ }
13889
+ };
13890
 
13891
+ var destroy = function destroy(instance) {
13892
+ // Destroy our adsManager
13893
+ if (instance.manager) {
13894
+ instance.manager.destroy();
13895
+ } // Destroy our adsManager
13896
+
13897
+
13898
+ if (instance.elements.displayContainer) {
13899
+ instance.elements.displayContainer.destroy();
13900
+ }
13901
+
13902
+ instance.elements.container.remove();
13903
+ };
 
 
 
 
13904
 
13905
+ var Ads =
13906
+ /*#__PURE__*/
13907
+ function () {
13908
+ /**
13909
+ * Ads constructor.
13910
+ * @param {Object} player
13911
+ * @return {Ads}
13912
+ */
13913
+ function Ads(player) {
13914
+ var _this = this;
13915
+
13916
+ _classCallCheck(this, Ads);
13917
+
13918
+ this.player = player;
13919
+ this.config = player.config.ads;
13920
+ this.playing = false;
13921
+ this.initialized = false;
13922
+ this.elements = {
13923
+ container: null,
13924
+ displayContainer: null
13925
+ };
13926
+ this.manager = null;
13927
+ this.loader = null;
13928
+ this.cuePoints = null;
13929
+ this.events = {};
13930
+ this.safetyTimer = null;
13931
+ this.countdownTimer = null; // Setup a promise to resolve when the IMA manager is ready
13932
 
13933
+ this.managerPromise = new Promise(function (resolve, reject) {
13934
+ // The ad is loaded and ready
13935
+ _this.on('loaded', resolve); // Ads failed
 
 
 
 
13936
 
 
 
 
 
 
 
 
 
13937
 
13938
+ _this.on('error', reject);
13939
+ });
13940
+ this.load();
13941
+ }
13942
 
13943
+ _createClass(Ads, [{
13944
+ key: "load",
13945
 
13946
+ /**
13947
+ * Load the IMA SDK
13948
+ */
13949
+ value: function load() {
13950
+ var _this2 = this;
13951
 
13952
+ if (!this.enabled) {
13953
+ return;
13954
+ } // Check if the Google IMA3 SDK is loaded or load it ourselves
 
 
 
13955
 
13956
 
13957
+ if (!is$1.object(window.google) || !is$1.object(window.google.ima)) {
13958
+ loadScript(this.player.config.urls.googleIMA.sdk).then(function () {
13959
+ _this2.ready();
13960
+ }).catch(function () {
13961
+ // Script failed to load or is blocked
13962
+ _this2.trigger('error', new Error('Google IMA SDK failed to load'));
13963
+ });
13964
+ } else {
13965
+ this.ready();
13966
+ }
13967
+ }
13968
+ /**
13969
+ * Get the ads instance ready
13970
+ */
13971
+
13972
+ }, {
13973
+ key: "ready",
13974
+ value: function ready() {
13975
+ var _this3 = this;
13976
+
13977
+ // Double check we're enabled
13978
+ if (!this.enabled) {
13979
+ destroy(this);
13980
+ } // Start ticking our safety timer. If the whole advertisement
13981
+ // thing doesn't resolve within our set time; we bail
13982
+
13983
+
13984
+ this.startSafetyTimer(12000, 'ready()'); // Clear the safety timer
13985
+
13986
+ this.managerPromise.then(function () {
13987
+ _this3.clearSafetyTimer('onAdsManagerLoaded()');
13988
+ }); // Set listeners on the Plyr instance
13989
+
13990
+ this.listeners(); // Setup the IMA SDK
13991
+
13992
+ this.setupIMA();
13993
+ } // Build the tag URL
13994
+
13995
+ }, {
13996
+ key: "setupIMA",
13997
+
13998
+ /**
13999
+ * In order for the SDK to display ads for our video, we need to tell it where to put them,
14000
+ * so here we define our ad container. This div is set up to render on top of the video player.
14001
+ * Using the code below, we tell the SDK to render ads within that div. We also provide a
14002
+ * handle to the content video player - the SDK will poll the current time of our player to
14003
+ * properly place mid-rolls. After we create the ad display container, we initialize it. On
14004
+ * mobile devices, this initialization is done as the result of a user action.
14005
+ */
14006
+ value: function setupIMA() {
14007
+ // Create the container for our advertisements
14008
+ this.elements.container = createElement('div', {
14009
+ class: this.player.config.classNames.ads
14010
+ });
14011
+ this.player.elements.container.appendChild(this.elements.container); // So we can run VPAID2
14012
 
14013
+ google.ima.settings.setVpaidMode(google.ima.ImaSdkSettings.VpaidMode.ENABLED); // Set language
 
 
 
14014
 
14015
+ google.ima.settings.setLocale(this.player.config.ads.language); // Set playback for iOS10+
 
 
 
 
14016
 
14017
+ google.ima.settings.setDisableCustomPlaybackForIOS10Plus(this.player.config.playsinline); // We assume the adContainer is the video container of the plyr element that will house the ads
 
14018
 
14019
+ this.elements.displayContainer = new google.ima.AdDisplayContainer(this.elements.container, this.player.media); // Request video ads to be pre-loaded
 
 
 
14020
 
14021
+ this.requestAds();
14022
+ }
14023
+ /**
14024
+ * Request advertisements
14025
+ */
14026
+
14027
+ }, {
14028
+ key: "requestAds",
14029
+ value: function requestAds() {
14030
+ var _this4 = this;
14031
+
14032
+ var container = this.player.elements.container;
14033
+
14034
+ try {
14035
+ // Create ads loader
14036
+ this.loader = new google.ima.AdsLoader(this.elements.displayContainer); // Listen and respond to ads loaded and error events
14037
+
14038
+ this.loader.addEventListener(google.ima.AdsManagerLoadedEvent.Type.ADS_MANAGER_LOADED, function (event) {
14039
+ return _this4.onAdsManagerLoaded(event);
14040
+ }, false);
14041
+ this.loader.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
14042
+ return _this4.onAdError(error);
14043
+ }, false); // Request video ads
14044
+
14045
+ var request = new google.ima.AdsRequest();
14046
+ request.adTagUrl = this.tagUrl; // Specify the linear and nonlinear slot sizes. This helps the SDK
14047
+ // to select the correct creative if multiple are returned
14048
+
14049
+ request.linearAdSlotWidth = container.offsetWidth;
14050
+ request.linearAdSlotHeight = container.offsetHeight;
14051
+ request.nonLinearAdSlotWidth = container.offsetWidth;
14052
+ request.nonLinearAdSlotHeight = container.offsetHeight; // We only overlay ads as we only support video.
14053
+
14054
+ request.forceNonLinearFullSlot = false; // Mute based on current state
14055
+
14056
+ request.setAdWillPlayMuted(!this.player.muted);
14057
+ this.loader.requestAds(request);
14058
+ } catch (e) {
14059
+ this.onAdError(e);
14060
+ }
14061
+ }
14062
+ /**
14063
+ * Update the ad countdown
14064
+ * @param {Boolean} start
14065
+ */
14066
+
14067
+ }, {
14068
+ key: "pollCountdown",
14069
+ value: function pollCountdown() {
14070
+ var _this5 = this;
14071
+
14072
+ var start = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
14073
+
14074
+ if (!start) {
14075
+ clearInterval(this.countdownTimer);
14076
+ this.elements.container.removeAttribute('data-badge-text');
14077
+ return;
14078
+ }
14079
 
14080
+ var update = function update() {
14081
+ var time = formatTime(Math.max(_this5.manager.getRemainingTime(), 0));
14082
+ var label = "".concat(i18n.get('advertisement', _this5.player.config), " - ").concat(time);
 
 
 
 
 
14083
 
14084
+ _this5.elements.container.setAttribute('data-badge-text', label);
14085
+ };
14086
 
14087
+ this.countdownTimer = setInterval(update, 100);
14088
+ }
14089
+ /**
14090
+ * This method is called whenever the ads are ready inside the AdDisplayContainer
14091
+ * @param {Event} adsManagerLoadedEvent
14092
+ */
 
 
 
 
 
14093
 
14094
+ }, {
14095
+ key: "onAdsManagerLoaded",
14096
+ value: function onAdsManagerLoaded(event) {
14097
+ var _this6 = this;
14098
 
14099
+ // Load could occur after a source change (race condition)
14100
+ if (!this.enabled) {
14101
+ return;
14102
+ } // Get the ads manager
14103
 
14104
 
14105
+ var settings = new google.ima.AdsRenderingSettings(); // Tell the SDK to save and restore content video state on our behalf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
14106
 
14107
+ settings.restoreCustomPlaybackStateOnAdBreakComplete = true;
14108
+ settings.enablePreloading = true; // The SDK is polling currentTime on the contentPlayback. And needs a duration
14109
+ // so it can determine when to start the mid- and post-roll
14110
 
14111
+ this.manager = event.getAdsManager(this.player, settings); // Get the cue points for any mid-rolls by filtering out the pre- and post-roll
14112
 
14113
+ this.cuePoints = this.manager.getCuePoints(); // Add listeners to the required events
14114
+ // Advertisement error events
14115
+
14116
+ this.manager.addEventListener(google.ima.AdErrorEvent.Type.AD_ERROR, function (error) {
14117
+ return _this6.onAdError(error);
14118
+ }); // Advertisement regular events
14119
+
14120
+ Object.keys(google.ima.AdEvent.Type).forEach(function (type) {
14121
+ _this6.manager.addEventListener(google.ima.AdEvent.Type[type], function (e) {
14122
+ return _this6.onAdEvent(e);
14123
+ });
14124
+ }); // Resolve our adsManager
14125
+
14126
+ this.trigger('loaded');
14127
+ }
14128
+ }, {
14129
+ key: "addCuePoints",
14130
+ value: function addCuePoints() {
14131
+ var _this7 = this;
14132
+
14133
+ // Add advertisement cue's within the time line if available
14134
+ if (!is$1.empty(this.cuePoints)) {
14135
+ this.cuePoints.forEach(function (cuePoint) {
14136
+ if (cuePoint !== 0 && cuePoint !== -1 && cuePoint < _this7.player.duration) {
14137
+ var seekElement = _this7.player.elements.progress;
14138
+
14139
+ if (is$1.element(seekElement)) {
14140
+ var cuePercentage = 100 / _this7.player.duration * cuePoint;
14141
+ var cue = createElement('span', {
14142
+ class: _this7.player.config.classNames.cues
14143
  });
14144
+ cue.style.left = "".concat(cuePercentage.toString(), "%");
14145
+ seekElement.appendChild(cue);
14146
+ }
14147
+ }
14148
+ });
14149
+ }
14150
+ }
14151
+ /**
14152
+ * This is where all the event handling takes place. Retrieve the ad from the event. Some
14153
+ * events (e.g. ALL_ADS_COMPLETED) don't have the ad object associated
14154
+ * https://developers.google.com/interactive-media-ads/docs/sdks/html5/v3/apis#ima.AdEvent.Type
14155
+ * @param {Event} event
14156
+ */
14157
+
14158
+ }, {
14159
+ key: "onAdEvent",
14160
+ value: function onAdEvent(event) {
14161
+ var _this8 = this;
14162
+
14163
+ var container = this.player.elements.container; // Retrieve the ad from the event. Some events (e.g. ALL_ADS_COMPLETED)
14164
+ // don't have ad object associated
14165
+
14166
+ var ad = event.getAd();
14167
+ var adData = event.getAdData(); // Proxy event
14168
+
14169
+ var dispatchEvent = function dispatchEvent(type) {
14170
+ triggerEvent.call(_this8.player, _this8.player.media, "ads".concat(type.replace(/_/g, '').toLowerCase()));
14171
+ }; // Bubble the event
14172
+
14173
+
14174
+ dispatchEvent(event.type);
14175
+
14176
+ switch (event.type) {
14177
+ case google.ima.AdEvent.Type.LOADED:
14178
+ // This is the first event sent for an ad - it is possible to determine whether the
14179
+ // ad is a video ad or an overlay
14180
+ this.trigger('loaded'); // Start countdown
14181
+
14182
+ this.pollCountdown(true);
14183
+
14184
+ if (!ad.isLinear()) {
14185
+ // Position AdDisplayContainer correctly for overlay
14186
+ ad.width = container.offsetWidth;
14187
+ ad.height = container.offsetHeight;
14188
+ } // console.info('Ad type: ' + event.getAd().getAdPodInfo().getPodIndex());
14189
+ // console.info('Ad time: ' + event.getAd().getAdPodInfo().getTimeOffset());
14190
+
14191
+
14192
+ break;
14193
+
14194
+ case google.ima.AdEvent.Type.STARTED:
14195
+ // Set volume to match player
14196
+ this.manager.setVolume(this.player.volume);
14197
+ break;
14198
+
14199
+ case google.ima.AdEvent.Type.ALL_ADS_COMPLETED:
14200
+ // All ads for the current videos are done. We can now request new advertisements
14201
+ // in case the video is re-played
14202
+ // TODO: Example for what happens when a next video in a playlist would be loaded.
14203
+ // So here we load a new video when all ads are done.
14204
+ // Then we load new ads within a new adsManager. When the video
14205
+ // Is started - after - the ads are loaded, then we get ads.
14206
+ // You can also easily test cancelling and reloading by running
14207
+ // player.ads.cancel() and player.ads.play from the console I guess.
14208
+ // this.player.source = {
14209
+ // type: 'video',
14210
+ // title: 'View From A Blue Moon',
14211
+ // sources: [{
14212
+ // src:
14213
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.mp4', type:
14214
+ // 'video/mp4', }], poster:
14215
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.jpg', tracks:
14216
+ // [ { kind: 'captions', label: 'English', srclang: 'en', src:
14217
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.en.vtt',
14218
+ // default: true, }, { kind: 'captions', label: 'French', srclang: 'fr', src:
14219
+ // 'https://cdn.plyr.io/static/demo/View_From_A_Blue_Moon_Trailer-HD.fr.vtt', }, ],
14220
+ // };
14221
+ // TODO: So there is still this thing where a video should only be allowed to start
14222
+ // playing when the IMA SDK is ready or has failed
14223
+ this.loadAds();
14224
+ break;
14225
+
14226
+ case google.ima.AdEvent.Type.CONTENT_PAUSE_REQUESTED:
14227
+ // This event indicates the ad has started - the video player can adjust the UI,
14228
+ // for example display a pause button and remaining time. Fired when content should
14229
+ // be paused. This usually happens right before an ad is about to cover the content
14230
+ this.pauseContent();
14231
+ break;
14232
+
14233
+ case google.ima.AdEvent.Type.CONTENT_RESUME_REQUESTED:
14234
+ // This event indicates the ad has finished - the video player can perform
14235
+ // appropriate UI actions, such as removing the timer for remaining time detection.
14236
+ // Fired when content should be resumed. This usually happens when an ad finishes
14237
+ // or collapses
14238
+ this.pollCountdown();
14239
+ this.resumeContent();
14240
+ break;
14241
+
14242
+ case google.ima.AdEvent.Type.LOG:
14243
+ if (adData.adError) {
14244
+ this.player.debug.warn("Non-fatal ad error: ".concat(adData.adError.getMessage()));
14245
  }
14246
 
14247
+ break;
14248
+
14249
+ default:
14250
+ break;
14251
+ }
14252
+ }
14253
+ /**
14254
+ * Any ad error handling comes through here
14255
+ * @param {Event} event
14256
+ */
14257
+
14258
+ }, {
14259
+ key: "onAdError",
14260
+ value: function onAdError(event) {
14261
+ this.cancel();
14262
+ this.player.debug.warn('Ads error', event);
14263
+ }
14264
+ /**
14265
+ * Setup hooks for Plyr and window events. This ensures
14266
+ * the mid- and post-roll launch at the correct time. And
14267
+ * resize the advertisement when the player resizes
14268
+ */
14269
+
14270
+ }, {
14271
+ key: "listeners",
14272
+ value: function listeners() {
14273
+ var _this9 = this;
14274
+
14275
+ var container = this.player.elements.container;
14276
+ var time;
14277
+ this.player.on('canplay', function () {
14278
+ _this9.addCuePoints();
14279
+ });
14280
+ this.player.on('ended', function () {
14281
+ _this9.loader.contentComplete();
14282
+ });
14283
+ this.player.on('timeupdate', function () {
14284
+ time = _this9.player.currentTime;
14285
+ });
14286
+ this.player.on('seeked', function () {
14287
+ var seekedTime = _this9.player.currentTime;
14288
 
14289
+ if (is$1.empty(_this9.cuePoints)) {
14290
+ return;
14291
+ }
14292
 
14293
+ _this9.cuePoints.forEach(function (cuePoint, index) {
14294
+ if (time < cuePoint && cuePoint < seekedTime) {
14295
+ _this9.manager.discardAdBreak();
14296
+
14297
+ _this9.cuePoints.splice(index, 1);
14298
  }
14299
+ });
14300
+ }); // Listen to the resizing of the window. And resize ad accordingly
14301
+ // TODO: eventually implement ResizeObserver
14302
+
14303
+ window.addEventListener('resize', function () {
14304
+ if (_this9.manager) {
14305
+ _this9.manager.resize(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL);
14306
+ }
14307
+ });
14308
+ }
14309
+ /**
14310
+ * Initialize the adsManager and start playing advertisements
14311
+ */
14312
 
14313
+ }, {
14314
+ key: "play",
14315
+ value: function play() {
14316
+ var _this10 = this;
14317
 
14318
+ var container = this.player.elements.container;
14319
 
14320
+ if (!this.managerPromise) {
14321
+ this.resumeContent();
14322
+ } // Play the requested advertisement whenever the adsManager is ready
14323
 
14324
 
14325
+ this.managerPromise.then(function () {
14326
+ // Set volume to match player
14327
+ _this10.manager.setVolume(_this10.player.volume); // Initialize the container. Must be done via a user action on mobile devices
14328
 
 
 
 
 
 
 
 
 
14329
 
14330
+ _this10.elements.displayContainer.initialize();
 
 
 
 
 
 
 
14331
 
14332
+ try {
14333
+ if (!_this10.initialized) {
14334
+ // Initialize the ads manager. Ad rules playlist will start at this time
14335
+ _this10.manager.init(container.offsetWidth, container.offsetHeight, google.ima.ViewMode.NORMAL); // Call play to start showing the ad. Single video and overlay ads will
14336
+ // start at this time; the call will be ignored for ad rules
14337
 
14338
 
14339
+ _this10.manager.start();
 
 
 
 
 
14340
  }
14341
 
14342
+ _this10.initialized = true;
14343
+ } catch (adError) {
14344
+ // An error may be thrown if there was a problem with the
14345
+ // VAST response
14346
+ _this10.onAdError(adError);
14347
+ }
14348
+ }).catch(function () {});
14349
+ }
14350
+ /**
14351
+ * Resume our video
14352
+ */
14353
 
14354
+ }, {
14355
+ key: "resumeContent",
14356
+ value: function resumeContent() {
14357
+ // Hide the advertisement container
14358
+ this.elements.container.style.zIndex = ''; // Ad is stopped
14359
 
14360
+ this.playing = false; // Play video
 
14361
 
14362
+ this.player.media.play();
14363
+ }
14364
+ /**
14365
+ * Pause our video
14366
+ */
14367
 
14368
+ }, {
14369
+ key: "pauseContent",
14370
+ value: function pauseContent() {
14371
+ // Show the advertisement container
14372
+ this.elements.container.style.zIndex = 3; // Ad is playing
14373
 
14374
+ this.playing = true; // Pause our video.
 
14375
 
14376
+ this.player.media.pause();
14377
+ }
14378
+ /**
14379
+ * Destroy the adsManager so we can grab new ads after this. If we don't then we're not
14380
+ * allowed to call new ads based on google policies, as they interpret this as an accidental
14381
+ * video requests. https://developers.google.com/interactive-
14382
+ * media-ads/docs/sdks/android/faq#8
14383
+ */
14384
 
14385
+ }, {
14386
+ key: "cancel",
14387
+ value: function cancel() {
14388
+ // Pause our video
14389
+ if (this.initialized) {
14390
+ this.resumeContent();
14391
+ } // Tell our instance that we're done for now
14392
 
 
14393
 
14394
+ this.trigger('error'); // Re-create our adsManager
 
 
14395
 
14396
+ this.loadAds();
14397
+ }
14398
+ /**
14399
+ * Re-create our adsManager
14400
+ */
14401
 
14402
+ }, {
14403
+ key: "loadAds",
14404
+ value: function loadAds() {
14405
+ var _this11 = this;
 
 
14406
 
14407
+ // Tell our adsManager to go bye bye
14408
+ this.managerPromise.then(function () {
14409
+ // Destroy our adsManager
14410
+ if (_this11.manager) {
14411
+ _this11.manager.destroy();
14412
+ } // Re-set our adsManager promises
 
 
 
 
 
14413
 
 
 
 
 
 
14414
 
14415
+ _this11.managerPromise = new Promise(function (resolve) {
14416
+ _this11.on('loaded', resolve);
14417
 
14418
+ _this11.player.debug.log(_this11.manager);
14419
+ }); // Now request some new advertisements
 
14420
 
14421
+ _this11.requestAds();
14422
+ }).catch(function () {});
14423
+ }
14424
+ /**
14425
+ * Handles callbacks after an ad event was invoked
14426
+ * @param {String} event - Event type
14427
+ */
14428
+
14429
+ }, {
14430
+ key: "trigger",
14431
+ value: function trigger(event) {
14432
+ var _this12 = this;
14433
+
14434
+ for (var _len = arguments.length, args = new Array(_len > 1 ? _len - 1 : 0), _key = 1; _key < _len; _key++) {
14435
+ args[_key - 1] = arguments[_key];
14436
+ }
14437
 
14438
+ var handlers = this.events[event];
14439
 
14440
+ if (is$1.array(handlers)) {
14441
+ handlers.forEach(function (handler) {
14442
+ if (is$1.function(handler)) {
14443
+ handler.apply(_this12, args);
 
 
 
 
14444
  }
14445
+ });
14446
+ }
14447
+ }
14448
+ /**
14449
+ * Add event listeners
14450
+ * @param {String} event - Event type
14451
+ * @param {Function} callback - Callback for when event occurs
14452
+ * @return {Ads}
14453
+ */
14454
+
14455
+ }, {
14456
+ key: "on",
14457
+ value: function on(event, callback) {
14458
+ if (!is$1.array(this.events[event])) {
14459
+ this.events[event] = [];
14460
+ }
14461
 
14462
+ this.events[event].push(callback);
14463
+ return this;
14464
+ }
14465
+ /**
14466
+ * Setup a safety timer for when the ad network doesn't respond for whatever reason.
14467
+ * The advertisement has 12 seconds to get its things together. We stop this timer when the
14468
+ * advertisement is playing, or when a user action is required to start, then we clear the
14469
+ * timer on ad ready
14470
+ * @param {Number} time
14471
+ * @param {String} from
14472
+ */
14473
+
14474
+ }, {
14475
+ key: "startSafetyTimer",
14476
+ value: function startSafetyTimer(time, from) {
14477
+ var _this13 = this;
14478
+
14479
+ this.player.debug.log("Safety timer invoked from: ".concat(from));
14480
+ this.safetyTimer = setTimeout(function () {
14481
+ _this13.cancel();
14482
+
14483
+ _this13.clearSafetyTimer('startSafetyTimer()');
14484
+ }, time);
14485
+ }
14486
+ /**
14487
+ * Clear our safety timer(s)
14488
+ * @param {String} from
14489
+ */
14490
+
14491
+ }, {
14492
+ key: "clearSafetyTimer",
14493
+ value: function clearSafetyTimer(from) {
14494
+ if (!is$1.nullOrUndefined(this.safetyTimer)) {
14495
+ this.player.debug.log("Safety timer cleared from: ".concat(from));
14496
+ clearTimeout(this.safetyTimer);
14497
+ this.safetyTimer = null;
14498
+ }
14499
+ }
14500
+ }, {
14501
+ key: "enabled",
14502
+ get: function get() {
14503
+ var config = this.config;
14504
+ return this.player.isHTML5 && this.player.isVideo && config.enabled && (!is$1.empty(config.publisherId) || is$1.url(config.tagUrl));
14505
+ }
14506
+ }, {
14507
+ key: "tagUrl",
14508
+ get: function get() {
14509
+ var config = this.config;
14510
 
14511
+ if (is$1.url(config.tagUrl)) {
14512
+ return config.tagUrl;
14513
+ }
 
14514
 
14515
+ var params = {
14516
+ AV_PUBLISHERID: '58c25bb0073ef448b1087ad6',
14517
+ AV_CHANNELID: '5a0458dc28a06145e4519d21',
14518
+ AV_URL: window.location.hostname,
14519
+ cb: Date.now(),
14520
+ AV_WIDTH: 640,
14521
+ AV_HEIGHT: 480,
14522
+ AV_CDIM2: this.publisherId
14523
+ };
14524
+ var base = 'https://go.aniview.com/api/adserver6/vast/';
14525
+ return "".concat(base, "?").concat(buildUrlParams(params));
14526
+ }
14527
+ }]);
14528
+
14529
+ return Ads;
14530
+ }();
14531
+
14532
+ var parseVtt = function parseVtt(vttDataString) {
14533
+ var processedList = [];
14534
+ var frames = vttDataString.split(/\r\n\r\n|\n\n|\r\r/);
14535
+ frames.forEach(function (frame) {
14536
+ var result = {};
14537
+ var lines = frame.split(/\r\n|\n|\r/);
14538
+ lines.forEach(function (line) {
14539
+ if (!is$1.number(result.startTime)) {
14540
+ // The line with start and end times on it is the first line of interest
14541
+ var matchTimes = line.match(/([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})( ?--> ?)([0-9]{2})?:?([0-9]{2}):([0-9]{2}).([0-9]{2,3})/); // Note that this currently ignores caption formatting directives that are optionally on the end of this line - fine for non-captions VTT
14542
+
14543
+ if (matchTimes) {
14544
+ result.startTime = Number(matchTimes[1] || 0) * 60 * 60 + Number(matchTimes[2]) * 60 + Number(matchTimes[3]) + Number("0.".concat(matchTimes[4]));
14545
+ result.endTime = Number(matchTimes[6] || 0) * 60 * 60 + Number(matchTimes[7]) * 60 + Number(matchTimes[8]) + Number("0.".concat(matchTimes[9]));
14546
+ }
14547
+ } else if (!is$1.empty(line.trim()) && is$1.empty(result.text)) {
14548
+ // If we already have the startTime, then we're definitely up to the text line(s)
14549
+ var lineSplit = line.trim().split('#xywh=');
14550
+
14551
+ var _lineSplit = _slicedToArray(lineSplit, 1);
14552
+
14553
+ result.text = _lineSplit[0];
14554
+
14555
+ // If there's content in lineSplit[1], then we have sprites. If not, then it's just one frame per image
14556
+ if (lineSplit[1]) {
14557
+ var _lineSplit$1$split = lineSplit[1].split(',');
14558
+
14559
+ var _lineSplit$1$split2 = _slicedToArray(_lineSplit$1$split, 4);
14560
+
14561
+ result.x = _lineSplit$1$split2[0];
14562
+ result.y = _lineSplit$1$split2[1];
14563
+ result.w = _lineSplit$1$split2[2];
14564
+ result.h = _lineSplit$1$split2[3];
14565
+ }
14566
+ }
14567
+ });
14568
+
14569
+ if (result.text) {
14570
+ processedList.push(result);
14571
+ }
14572
+ });
14573
+ return processedList;
14574
+ };
14575
+ /**
14576
+ * Preview thumbnails for seek hover and scrubbing
14577
+ * Seeking: Hover over the seek bar (desktop only): shows a small preview container above the seek bar
14578
+ * Scrubbing: Click and drag the seek bar (desktop and mobile): shows the preview image over the entire video, as if the video is scrubbing at very high speed
14579
+ *
14580
+ * Notes:
14581
+ * - Thumbs are set via JS settings on Plyr init, not HTML5 'track' property. Using the track property would be a bit gross, because it doesn't support custom 'kinds'. kind=metadata might be used for something else, and we want to allow multiple thumbnails tracks. Tracks must have a unique combination of 'kind' and 'label'. We would have to do something like kind=metadata,label=thumbnails1 / kind=metadata,label=thumbnails2. Square peg, round hole
14582
+ * - VTT info: the image URL is relative to the VTT, not the current document. But if the url starts with a slash, it will naturally be relative to the current domain. https://support.jwplayer.com/articles/how-to-add-preview-thumbnails
14583
+ * - This implementation uses multiple separate img elements. Other implementations use background-image on one element. This would be nice and simple, but Firefox and Safari have flickering issues with replacing backgrounds of larger images. It seems that YouTube perhaps only avoids this because they don't have the option for high-res previews (even the fullscreen ones, when mousedown/seeking). Images appear over the top of each other, and previous ones are discarded once the new ones have been rendered
14584
+ */
14585
 
14586
 
14587
+ var PreviewThumbnails =
14588
+ /*#__PURE__*/
14589
+ function () {
14590
+ /**
14591
+ * PreviewThumbnails constructor.
14592
+ * @param {Plyr} player
14593
+ * @return {PreviewThumbnails}
14594
+ */
14595
+ function PreviewThumbnails(player) {
14596
+ _classCallCheck(this, PreviewThumbnails);
14597
+
14598
+ this.player = player;
14599
+ this.thumbnails = [];
14600
+ this.loaded = false;
14601
+ this.lastMouseMoveTime = Date.now();
14602
+ this.mouseDown = false;
14603
+ this.loadedImages = [];
14604
+ this.elements = {
14605
+ thumb: {},
14606
+ scrubbing: {}
14607
+ };
14608
+ this.load();
14609
+ }
14610
 
14611
+ _createClass(PreviewThumbnails, [{
14612
+ key: "load",
14613
+ value: function load() {
14614
+ var _this = this;
14615
 
14616
+ // Togglethe regular seek tooltip
14617
+ if (this.player.elements.display.seekTooltip) {
14618
+ this.player.elements.display.seekTooltip.hidden = this.enabled;
14619
+ }
14620
 
14621
+ if (!this.enabled) {
14622
+ return;
14623
+ }
 
 
 
 
 
 
 
 
 
 
14624
 
14625
+ this.getThumbnails().then(function () {
14626
+ if (!_this.enabled) {
14627
+ return;
14628
+ } // Render DOM elements
14629
 
 
14630
 
14631
+ _this.render(); // Check to see if thumb container size was specified manually in CSS
 
 
 
 
14632
 
 
 
14633
 
14634
+ _this.determineContainerAutoSizing();
 
14635
 
14636
+ _this.loaded = true;
14637
+ });
14638
+ } // Download VTT files and parse them
14639
 
14640
+ }, {
14641
+ key: "getThumbnails",
14642
+ value: function getThumbnails() {
14643
+ var _this2 = this;
14644
 
14645
+ return new Promise(function (resolve) {
14646
+ var src = _this2.player.config.previewThumbnails.src;
 
14647
 
14648
+ if (is$1.empty(src)) {
14649
+ throw new Error('Missing previewThumbnails.src config attribute');
14650
+ } // If string, convert into single-element list
14651
 
 
 
14652
 
14653
+ var urls = is$1.string(src) ? [src] : src; // Loop through each src URL. Download and process the VTT file, storing the resulting data in this.thumbnails
 
14654
 
14655
+ var promises = urls.map(function (u) {
14656
+ return _this2.getThumbnail(u);
14657
+ });
14658
+ Promise.all(promises).then(function () {
14659
+ // Sort smallest to biggest (e.g., [120p, 480p, 1080p])
14660
+ _this2.thumbnails.sort(function (x, y) {
14661
+ return x.height - y.height;
14662
+ });
14663
 
14664
+ _this2.player.debug.log('Preview thumbnails', _this2.thumbnails);
 
 
14665
 
14666
+ resolve();
14667
+ });
14668
+ });
14669
+ } // Process individual VTT file
14670
 
14671
+ }, {
14672
+ key: "getThumbnail",
14673
+ value: function getThumbnail(url) {
14674
+ var _this3 = this;
14675
 
14676
+ return new Promise(function (resolve) {
14677
+ fetch(url).then(function (response) {
14678
+ var thumbnail = {
14679
+ frames: parseVtt(response),
14680
+ height: null,
14681
+ urlPrefix: ''
14682
+ }; // If the URLs don't start with '/', then we need to set their relative path to be the location of the VTT file
14683
+ // If the URLs do start with '/', then they obviously don't need a prefix, so it will remain blank
14684
+ // If the thumbnail URLs start with with none of '/', 'http://' or 'https://', then we need to set their relative path to be the location of the VTT file
14685
 
14686
+ if (!thumbnail.frames[0].text.startsWith('/') && !thumbnail.frames[0].text.startsWith('http://') && !thumbnail.frames[0].text.startsWith('https://')) {
14687
+ thumbnail.urlPrefix = url.substring(0, url.lastIndexOf('/') + 1);
14688
+ } // Download the first frame, so that we can determine/set the height of this thumbnailsDef
14689
 
 
 
14690
 
14691
+ var tempImage = new Image();
14692
 
14693
+ tempImage.onload = function () {
14694
+ thumbnail.height = tempImage.naturalHeight;
14695
+ thumbnail.width = tempImage.naturalWidth;
 
 
14696
 
14697
+ _this3.thumbnails.push(thumbnail);
 
 
 
 
 
 
 
 
 
 
 
 
14698
 
14699
+ resolve();
14700
+ };
14701
 
14702
+ tempImage.src = thumbnail.urlPrefix + thumbnail.frames[0].text;
14703
+ });
14704
+ });
14705
+ }
14706
+ }, {
14707
+ key: "startMove",
14708
+ value: function startMove(event) {
14709
+ if (!this.loaded) {
14710
+ return;
14711
+ }
14712
 
14713
+ if (!is$1.event(event) || !['touchmove', 'mousemove'].includes(event.type)) {
14714
+ return;
14715
+ } // Wait until media has a duration
14716
 
 
 
 
 
 
 
 
14717
 
14718
+ if (!this.player.media.duration) {
14719
+ return;
14720
+ }
 
 
 
14721
 
14722
+ if (event.type === 'touchmove') {
14723
+ // Calculate seek hover position as approx video seconds
14724
+ this.seekTime = this.player.media.duration * (this.player.elements.inputs.seek.value / 100);
14725
+ } else {
14726
+ // Calculate seek hover position as approx video seconds
14727
+ var clientRect = this.player.elements.progress.getBoundingClientRect();
14728
+ var percentage = 100 / clientRect.width * (event.pageX - clientRect.left);
14729
+ this.seekTime = this.player.media.duration * (percentage / 100);
14730
 
14731
+ if (this.seekTime < 0) {
14732
+ // The mousemove fires for 10+px out to the left
14733
+ this.seekTime = 0;
14734
+ }
 
 
 
14735
 
14736
+ if (this.seekTime > this.player.media.duration - 1) {
14737
+ // Took 1 second off the duration for safety, because different players can disagree on the real duration of a video
14738
+ this.seekTime = this.player.media.duration - 1;
14739
+ }
 
14740
 
14741
+ this.mousePosX = event.pageX; // Set time text inside image container
 
 
 
 
14742
 
14743
+ this.elements.thumb.time.innerText = formatTime(this.seekTime);
14744
+ } // Download and show image
14745
 
14746
 
14747
+ this.showImageAtCurrentTime();
14748
+ }
14749
+ }, {
14750
+ key: "endMove",
14751
+ value: function endMove() {
14752
+ this.toggleThumbContainer(false, true);
14753
+ }
14754
+ }, {
14755
+ key: "startScrubbing",
14756
+ value: function startScrubbing(event) {
14757
+ // Only act on left mouse button (0), or touch device (event.button is false)
14758
+ if (event.button === false || event.button === 0) {
14759
+ this.mouseDown = true; // Wait until media has a duration
14760
+
14761
+ if (this.player.media.duration) {
14762
+ this.toggleScrubbingContainer(true);
14763
+ this.toggleThumbContainer(false, true); // Download and show image
14764
+
14765
+ this.showImageAtCurrentTime();
14766
+ }
14767
+ }
14768
+ }
14769
+ }, {
14770
+ key: "endScrubbing",
14771
+ value: function endScrubbing() {
14772
+ var _this4 = this;
14773
 
14774
+ this.mouseDown = false; // Hide scrubbing preview. But wait until the video has successfully seeked before hiding the scrubbing preview
14775
+
14776
+ if (Math.ceil(this.lastTime) === Math.ceil(this.player.media.currentTime)) {
14777
+ // The video was already seeked/loaded at the chosen time - hide immediately
14778
+ this.toggleScrubbingContainer(false);
14779
+ } else {
14780
+ // The video hasn't seeked yet. Wait for that
14781
+ once.call(this.player, this.player.media, 'timeupdate', function () {
14782
+ // Re-check mousedown - we might have already started scrubbing again
14783
+ if (!_this4.mouseDown) {
14784
+ _this4.toggleScrubbingContainer(false);
14785
  }
14786
+ });
14787
+ }
14788
+ }
14789
+ /**
14790
+ * Setup hooks for Plyr and window events
14791
+ */
14792
+
14793
+ }, {
14794
+ key: "listeners",
14795
+ value: function listeners() {
14796
+ var _this5 = this;
14797
+
14798
+ // Hide thumbnail preview - on mouse click, mouse leave (in listeners.js for now), and video play/seek. All four are required, e.g., for buffering
14799
+ this.player.on('play', function () {
14800
+ _this5.toggleThumbContainer(false, true);
14801
+ });
14802
+ this.player.on('seeked', function () {
14803
+ _this5.toggleThumbContainer(false);
14804
+ });
14805
+ this.player.on('timeupdate', function () {
14806
+ _this5.lastTime = _this5.player.media.currentTime;
14807
+ });
14808
+ }
14809
+ /**
14810
+ * Create HTML elements for image containers
14811
+ */
14812
+
14813
+ }, {
14814
+ key: "render",
14815
+ value: function render() {
14816
+ // Create HTML element: plyr__preview-thumbnail-container
14817
+ this.elements.thumb.container = createElement('div', {
14818
+ class: this.player.config.classNames.previewThumbnails.thumbContainer
14819
+ }); // Wrapper for the image for styling
14820
+
14821
+ this.elements.thumb.imageContainer = createElement('div', {
14822
+ class: this.player.config.classNames.previewThumbnails.imageContainer
14823
+ });
14824
+ this.elements.thumb.container.appendChild(this.elements.thumb.imageContainer); // Create HTML element, parent+span: time text (e.g., 01:32:00)
14825
 
14826
+ var timeContainer = createElement('div', {
14827
+ class: this.player.config.classNames.previewThumbnails.timeContainer
14828
+ });
14829
+ this.elements.thumb.time = createElement('span', {}, '00:00');
14830
+ timeContainer.appendChild(this.elements.thumb.time);
14831
+ this.elements.thumb.container.appendChild(timeContainer); // Inject the whole thumb
14832
 
14833
+ if (is$1.element(this.player.elements.progress)) {
14834
+ this.player.elements.progress.appendChild(this.elements.thumb.container);
14835
+ } // Create HTML element: plyr__preview-scrubbing-container
 
 
 
 
 
 
 
 
 
 
 
 
14836
 
14837
 
14838
+ this.elements.scrubbing.container = createElement('div', {
14839
+ class: this.player.config.classNames.previewThumbnails.scrubbingContainer
14840
+ });
14841
+ this.player.elements.wrapper.appendChild(this.elements.scrubbing.container);
14842
+ }
14843
+ }, {
14844
+ key: "showImageAtCurrentTime",
14845
+ value: function showImageAtCurrentTime() {
14846
+ var _this6 = this;
14847
 
14848
+ if (this.mouseDown) {
14849
+ this.setScrubbingContainerSize();
14850
+ } else {
14851
+ this.setThumbContainerSizeAndPos();
14852
+ } // Find the desired thumbnail index
14853
+ // TODO: Handle a video longer than the thumbs where thumbNum is null
14854
 
 
 
 
 
 
 
 
 
 
 
 
14855
 
14856
+ var thumbNum = this.thumbnails[0].frames.findIndex(function (frame) {
14857
+ return _this6.seekTime >= frame.startTime && _this6.seekTime <= frame.endTime;
14858
+ });
14859
+ var hasThumb = thumbNum >= 0;
14860
+ var qualityIndex = 0; // Show the thumb container if we're not scrubbing
14861
 
14862
+ if (!this.mouseDown) {
14863
+ this.toggleThumbContainer(hasThumb);
14864
+ } // No matching thumb found
 
 
14865
 
 
 
 
 
 
 
14866
 
14867
+ if (!hasThumb) {
14868
+ return;
14869
+ } // Check to see if we've already downloaded higher quality versions of this image
14870
 
 
 
 
 
14871
 
14872
+ this.thumbnails.forEach(function (thumbnail, index) {
14873
+ if (_this6.loadedImages.includes(thumbnail.frames[thumbNum].text)) {
14874
+ qualityIndex = index;
14875
+ }
14876
+ }); // Only proceed if either thumbnum or thumbfilename has changed
14877
 
14878
+ if (thumbNum !== this.showingThumb) {
14879
+ this.showingThumb = thumbNum;
14880
+ this.loadImage(qualityIndex);
14881
+ }
14882
+ } // Show the image that's currently specified in this.showingThumb
14883
+
14884
+ }, {
14885
+ key: "loadImage",
14886
+ value: function loadImage() {
14887
+ var _this7 = this;
14888
+
14889
+ var qualityIndex = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
14890
+ var thumbNum = this.showingThumb;
14891
+ var thumbnail = this.thumbnails[qualityIndex];
14892
+ var urlPrefix = thumbnail.urlPrefix;
14893
+ var frame = thumbnail.frames[thumbNum];
14894
+ var thumbFilename = thumbnail.frames[thumbNum].text;
14895
+ var thumbUrl = urlPrefix + thumbFilename;
14896
+
14897
+ if (!this.currentImageElement || this.currentImageElement.dataset.filename !== thumbFilename) {
14898
+ // If we're already loading a previous image, remove its onload handler - we don't want it to load after this one
14899
+ // Only do this if not using sprites. Without sprites we really want to show as many images as possible, as a best-effort
14900
+ if (this.loadingImage && this.usingSprites) {
14901
+ this.loadingImage.onload = null;
14902
+ } // We're building and adding a new image. In other implementations of similar functionality (YouTube), background image
14903
+ // is instead used. But this causes issues with larger images in Firefox and Safari - switching between background
14904
+ // images causes a flicker. Putting a new image over the top does not
14905
+
14906
+
14907
+ var previewImage = new Image();
14908
+ previewImage.src = thumbUrl;
14909
+ previewImage.dataset.index = thumbNum;
14910
+ previewImage.dataset.filename = thumbFilename;
14911
+ this.showingThumbFilename = thumbFilename;
14912
+ this.player.debug.log("Loading image: ".concat(thumbUrl)); // For some reason, passing the named function directly causes it to execute immediately. So I've wrapped it in an anonymous function...
14913
+
14914
+ previewImage.onload = function () {
14915
+ return _this7.showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename, true);
14916
+ };
14917
+
14918
+ this.loadingImage = previewImage;
14919
+ this.removeOldImages(previewImage);
14920
+ } else {
14921
+ // Update the existing image
14922
+ this.showImage(this.currentImageElement, frame, qualityIndex, thumbNum, thumbFilename, false);
14923
+ this.currentImageElement.dataset.index = thumbNum;
14924
+ this.removeOldImages(this.currentImageElement);
14925
+ }
14926
+ }
14927
+ }, {
14928
+ key: "showImage",
14929
+ value: function showImage(previewImage, frame, qualityIndex, thumbNum, thumbFilename) {
14930
+ var newImage = arguments.length > 5 && arguments[5] !== undefined ? arguments[5] : true;
14931
+ this.player.debug.log("Showing thumb: ".concat(thumbFilename, ". num: ").concat(thumbNum, ". qual: ").concat(qualityIndex, ". newimg: ").concat(newImage));
14932
+ this.setImageSizeAndOffset(previewImage, frame);
14933
+
14934
+ if (newImage) {
14935
+ this.currentImageContainer.appendChild(previewImage);
14936
+ this.currentImageElement = previewImage;
14937
+
14938
+ if (!this.loadedImages.includes(thumbFilename)) {
14939
+ this.loadedImages.push(thumbFilename);
14940
+ }
14941
+ } // Preload images before and after the current one
14942
+ // Show higher quality of the same frame
14943
+ // Each step here has a short time delay, and only continues if still hovering/seeking the same spot. This is to protect slow connections from overloading
14944
+
14945
+
14946
+ this.preloadNearby(thumbNum, true).then(this.preloadNearby(thumbNum, false)).then(this.getHigherQuality(qualityIndex, previewImage, frame, thumbFilename));
14947
+ } // Remove all preview images that aren't the designated current image
14948
+
14949
+ }, {
14950
+ key: "removeOldImages",
14951
+ value: function removeOldImages(currentImage) {
14952
+ var _this8 = this;
14953
+
14954
+ // Get a list of all images, convert it from a DOM list to an array
14955
+ Array.from(this.currentImageContainer.children).forEach(function (image) {
14956
+ if (image.tagName.toLowerCase() !== 'img') {
14957
+ return;
14958
+ }
14959
 
14960
+ var removeDelay = _this8.usingSprites ? 500 : 1000;
 
 
 
 
 
14961
 
14962
+ if (image.dataset.index !== currentImage.dataset.index && !image.dataset.deleting) {
14963
+ // Wait 200ms, as the new image can take some time to show on certain browsers (even though it was downloaded before showing). This will prevent flicker, and show some generosity towards slower clients
14964
+ // First set attribute 'deleting' to prevent multi-handling of this on repeat firing of this function
14965
+ // eslint-disable-next-line no-param-reassign
14966
+ image.dataset.deleting = true; // This has to be set before the timeout - to prevent issues switching between hover and scrub
14967
 
14968
+ var currentImageContainer = _this8.currentImageContainer;
14969
+ setTimeout(function () {
14970
+ currentImageContainer.removeChild(image);
14971
 
14972
+ _this8.player.debug.log("Removing thumb: ".concat(image.dataset.filename));
14973
+ }, removeDelay);
14974
+ }
14975
+ });
14976
+ } // Preload images before and after the current one. Only if the user is still hovering/seeking the same frame
14977
+ // This will only preload the lowest quality
14978
 
14979
+ }, {
14980
+ key: "preloadNearby",
14981
+ value: function preloadNearby(thumbNum) {
14982
+ var _this9 = this;
14983
 
14984
+ var forward = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : true;
14985
+ return new Promise(function (resolve) {
14986
+ setTimeout(function () {
14987
+ var oldThumbFilename = _this9.thumbnails[0].frames[thumbNum].text;
14988
 
14989
+ if (_this9.showingThumbFilename === oldThumbFilename) {
14990
+ // Find the nearest thumbs with different filenames. Sometimes it'll be the next index, but in the case of sprites, it might be 100+ away
14991
+ var thumbnailsClone;
14992
+
14993
+ if (forward) {
14994
+ thumbnailsClone = _this9.thumbnails[0].frames.slice(thumbNum);
14995
+ } else {
14996
+ thumbnailsClone = _this9.thumbnails[0].frames.slice(0, thumbNum).reverse();
14997
+ }
14998
+
14999
+ var foundOne = false;
15000
+ thumbnailsClone.forEach(function (frame) {
15001
+ var newThumbFilename = frame.text;
15002
+
15003
+ if (newThumbFilename !== oldThumbFilename) {
15004
+ // Found one with a different filename. Make sure it hasn't already been loaded on this page visit
15005
+ if (!_this9.loadedImages.includes(newThumbFilename)) {
15006
+ foundOne = true;
15007
 
15008
+ _this9.player.debug.log("Preloading thumb filename: ".concat(newThumbFilename));
 
 
15009
 
15010
+ var urlPrefix = _this9.thumbnails[0].urlPrefix;
15011
+ var thumbURL = urlPrefix + newThumbFilename;
15012
+ var previewImage = new Image();
15013
+ previewImage.src = thumbURL;
15014
 
15015
+ previewImage.onload = function () {
15016
+ _this9.player.debug.log("Preloaded thumb filename: ".concat(newThumbFilename));
 
15017
 
15018
+ if (!_this9.loadedImages.includes(newThumbFilename)) _this9.loadedImages.push(newThumbFilename); // We don't resolve until the thumb is loaded
 
 
 
15019
 
15020
+ resolve();
15021
+ };
15022
+ }
 
 
 
 
 
 
 
15023
  }
15024
+ }); // If there are none to preload then we want to resolve immediately
15025
 
15026
+ if (!foundOne) {
15027
+ resolve();
15028
+ }
15029
  }
15030
+ }, 300);
15031
+ });
15032
+ } // If user has been hovering current image for half a second, look for a higher quality one
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15033
 
15034
+ }, {
15035
+ key: "getHigherQuality",
15036
+ value: function getHigherQuality(currentQualityIndex, previewImage, frame, thumbFilename) {
15037
+ var _this10 = this;
 
 
 
15038
 
15039
+ if (currentQualityIndex < this.thumbnails.length - 1) {
15040
+ // Only use the higher quality version if it's going to look any better - if the current thumb is of a lower pixel density than the thumbnail container
15041
+ var previewImageHeight = previewImage.naturalHeight;
 
 
 
 
 
 
 
 
 
 
 
 
 
15042
 
15043
+ if (this.usingSprites) {
15044
+ previewImageHeight = frame.h;
15045
+ }
 
 
15046
 
15047
+ if (previewImageHeight < this.thumbContainerHeight) {
15048
+ // Recurse back to the loadImage function - show a higher quality one, but only if the viewer is on this frame for a while
15049
+ setTimeout(function () {
15050
+ // Make sure the mouse hasn't already moved on and started hovering at another image
15051
+ if (_this10.showingThumbFilename === thumbFilename) {
15052
+ _this10.player.debug.log("Showing higher quality thumb for: ".concat(thumbFilename));
15053
+
15054
+ _this10.loadImage(currentQualityIndex + 1);
15055
+ }
15056
+ }, 300);
15057
+ }
15058
+ }
15059
+ }
15060
+ }, {
15061
+ key: "toggleThumbContainer",
15062
+ value: function toggleThumbContainer() {
15063
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
15064
+ var clearShowing = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
15065
+ var className = this.player.config.classNames.previewThumbnails.thumbContainerShown;
15066
+ this.elements.thumb.container.classList.toggle(className, toggle);
15067
+
15068
+ if (!toggle && clearShowing) {
15069
+ this.showingThumb = null;
15070
+ this.showingThumbFilename = null;
15071
+ }
15072
+ }
15073
+ }, {
15074
+ key: "toggleScrubbingContainer",
15075
+ value: function toggleScrubbingContainer() {
15076
+ var toggle = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false;
15077
+ var className = this.player.config.classNames.previewThumbnails.scrubbingContainerShown;
15078
+ this.elements.scrubbing.container.classList.toggle(className, toggle);
15079
+
15080
+ if (!toggle) {
15081
+ this.showingThumb = null;
15082
+ this.showingThumbFilename = null;
15083
+ }
15084
+ }
15085
+ }, {
15086
+ key: "determineContainerAutoSizing",
15087
+ value: function determineContainerAutoSizing() {
15088
+ if (this.elements.thumb.imageContainer.clientHeight > 20) {
15089
+ // This will prevent auto sizing in this.setThumbContainerSizeAndPos()
15090
+ this.sizeSpecifiedInCSS = true;
15091
+ }
15092
+ } // Set the size to be about a quarter of the size of video. Unless option dynamicSize === false, in which case it needs to be set in CSS
15093
+
15094
+ }, {
15095
+ key: "setThumbContainerSizeAndPos",
15096
+ value: function setThumbContainerSizeAndPos() {
15097
+ if (!this.sizeSpecifiedInCSS) {
15098
+ var thumbWidth = Math.floor(this.thumbContainerHeight * this.thumbAspectRatio);
15099
+ this.elements.thumb.imageContainer.style.height = "".concat(this.thumbContainerHeight, "px");
15100
+ this.elements.thumb.imageContainer.style.width = "".concat(thumbWidth, "px");
15101
  }
15102
 
15103
+ this.setThumbContainerPos();
15104
+ }
15105
+ }, {
15106
+ key: "setThumbContainerPos",
15107
+ value: function setThumbContainerPos() {
15108
+ var seekbarRect = this.player.elements.progress.getBoundingClientRect();
15109
+ var plyrRect = this.player.elements.container.getBoundingClientRect();
15110
+ var container = this.elements.thumb.container; // Find the lowest and highest desired left-position, so we don't slide out the side of the video container
15111
 
15112
+ var minVal = plyrRect.left - seekbarRect.left + 10;
15113
+ var maxVal = plyrRect.right - seekbarRect.left - container.clientWidth - 10; // Set preview container position to: mousepos, minus seekbar.left, minus half of previewContainer.clientWidth
15114
 
15115
+ var previewPos = this.mousePosX - seekbarRect.left - container.clientWidth / 2;
15116
 
15117
+ if (previewPos < minVal) {
15118
+ previewPos = minVal;
15119
+ }
15120
 
15121
+ if (previewPos > maxVal) {
15122
+ previewPos = maxVal;
15123
+ }
 
 
 
 
15124
 
15125
+ container.style.left = "".concat(previewPos, "px");
15126
+ } // Can't use 100% width, in case the video is a different aspect ratio to the video container
15127
 
15128
+ }, {
15129
+ key: "setScrubbingContainerSize",
15130
+ value: function setScrubbingContainerSize() {
15131
+ this.elements.scrubbing.container.style.width = "".concat(this.player.media.clientWidth, "px"); // Can't use media.clientHeight - html5 video goes big and does black bars above and below
 
15132
 
15133
+ this.elements.scrubbing.container.style.height = "".concat(this.player.media.clientWidth / this.thumbAspectRatio, "px");
15134
+ } // Sprites need to be offset to the correct location
 
 
15135
 
15136
+ }, {
15137
+ key: "setImageSizeAndOffset",
15138
+ value: function setImageSizeAndOffset(previewImage, frame) {
15139
+ if (!this.usingSprites) {
15140
+ return;
15141
+ } // Find difference between height and preview container height
15142
 
 
 
 
 
 
 
 
15143
 
15144
+ var multiplier = this.thumbContainerHeight / frame.h; // eslint-disable-next-line no-param-reassign
15145
 
15146
+ previewImage.style.height = "".concat(Math.floor(previewImage.naturalHeight * multiplier), "px"); // eslint-disable-next-line no-param-reassign
 
15147
 
15148
+ previewImage.style.width = "".concat(Math.floor(previewImage.naturalWidth * multiplier), "px"); // eslint-disable-next-line no-param-reassign
15149
 
15150
+ previewImage.style.left = "-".concat(frame.x * multiplier, "px"); // eslint-disable-next-line no-param-reassign
15151
 
15152
+ previewImage.style.top = "-".concat(frame.y * multiplier, "px");
15153
+ }
15154
+ }, {
15155
+ key: "enabled",
15156
+ get: function get() {
15157
+ return this.player.isHTML5 && this.player.isVideo && this.player.config.previewThumbnails.enabled;
15158
+ }
15159
+ }, {
15160
+ key: "currentImageContainer",
15161
+ get: function get() {
15162
+ if (this.mouseDown) {
15163
+ return this.elements.scrubbing.container;
15164
+ }
15165
 
15166
+ return this.elements.thumb.imageContainer;
15167
+ }
15168
+ }, {
15169
+ key: "usingSprites",
15170
+ get: function get() {
15171
+ return Object.keys(this.thumbnails[0].frames[0]).includes('w');
15172
+ }
15173
+ }, {
15174
+ key: "thumbAspectRatio",
15175
+ get: function get() {
15176
+ if (this.usingSprites) {
15177
+ return this.thumbnails[0].frames[0].w / this.thumbnails[0].frames[0].h;
15178
+ }
15179
 
15180
+ return this.thumbnails[0].width / this.thumbnails[0].height;
15181
+ }
15182
+ }, {
15183
+ key: "thumbContainerHeight",
15184
+ get: function get() {
15185
+ if (this.mouseDown) {
15186
+ // Can't use media.clientHeight - HTML5 video goes big and does black bars above and below
15187
+ return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio);
15188
+ }
15189
 
15190
+ return Math.floor(this.player.media.clientWidth / this.thumbAspectRatio / 4);
15191
+ }
15192
+ }, {
15193
+ key: "currentImageElement",
15194
+ get: function get() {
15195
+ if (this.mouseDown) {
15196
+ return this.currentScrubbingImageElement;
15197
+ }
15198
 
15199
+ return this.currentThumbnailImageElement;
15200
+ },
15201
+ set: function set(element) {
15202
+ if (this.mouseDown) {
15203
+ this.currentScrubbingImageElement = element;
15204
+ } else {
15205
+ this.currentThumbnailImageElement = element;
15206
+ }
15207
+ }
15208
+ }]);
15209
 
15210
+ return PreviewThumbnails;
15211
+ }();
15212
 
15213
+ var source = {
15214
+ // Add elements to HTML5 media (source, tracks, etc)
15215
+ insertElements: function insertElements(type, attributes) {
15216
+ var _this = this;
15217
 
15218
+ if (is$1.string(attributes)) {
15219
+ insertElement(type, this.media, {
15220
+ src: attributes
15221
+ });
15222
+ } else if (is$1.array(attributes)) {
15223
+ attributes.forEach(function (attribute) {
15224
+ insertElement(type, _this.media, attribute);
15225
+ });
15226
+ }
15227
+ },
15228
+ // Update source
15229
+ // Sources are not checked for support so be careful
15230
+ change: function change(input) {
15231
+ var _this2 = this;
15232
 
15233
+ if (!getDeep(input, 'sources.length')) {
15234
+ this.debug.warn('Invalid source format');
15235
+ return;
15236
+ } // Cancel current network requests
15237
 
 
15238
 
15239
+ html5.cancelRequests.call(this); // Destroy instance and re-setup
15240
 
15241
+ this.destroy.call(this, function () {
15242
+ // Reset quality options
15243
+ _this2.options.quality = []; // Remove elements
15244
 
15245
+ removeElement(_this2.media);
15246
+ _this2.media = null; // Reset class name
15247
 
15248
+ if (is$1.element(_this2.elements.container)) {
15249
+ _this2.elements.container.removeAttribute('class');
15250
+ } // Set the type and provider
15251
 
 
15252
 
15253
+ var sources = input.sources,
15254
+ type = input.type;
15255
 
15256
+ var _sources = _slicedToArray(sources, 1),
15257
+ _sources$ = _sources[0],
15258
+ _sources$$provider = _sources$.provider,
15259
+ provider = _sources$$provider === void 0 ? providers.html5 : _sources$$provider,
15260
+ src = _sources$.src;
15261
 
15262
+ var tagName = provider === 'html5' ? type : 'div';
15263
+ var attributes = provider === 'html5' ? {} : {
15264
+ src: src
15265
+ };
15266
+ Object.assign(_this2, {
15267
+ provider: provider,
15268
+ type: type,
15269
+ // Check for support
15270
+ supported: support.check(type, provider, _this2.config.playsinline),
15271
+ // Create new element
15272
+ media: createElement(tagName, attributes)
15273
+ }); // Inject the new element
15274
 
15275
+ _this2.elements.container.appendChild(_this2.media); // Autoplay the new source?
15276
 
 
15277
 
15278
+ if (is$1.boolean(input.autoplay)) {
15279
+ _this2.config.autoplay = input.autoplay;
15280
+ } // Set attributes for audio and video
15281
 
15282
 
15283
+ if (_this2.isHTML5) {
15284
+ if (_this2.config.crossorigin) {
15285
+ _this2.media.setAttribute('crossorigin', '');
15286
+ }
15287
 
15288
+ if (_this2.config.autoplay) {
15289
+ _this2.media.setAttribute('autoplay', '');
15290
+ }
15291
 
15292
+ if (!is$1.empty(input.poster)) {
15293
+ _this2.poster = input.poster;
15294
+ }
15295
 
15296
+ if (_this2.config.loop.active) {
15297
+ _this2.media.setAttribute('loop', '');
15298
+ }
15299
 
15300
+ if (_this2.config.muted) {
15301
+ _this2.media.setAttribute('muted', '');
15302
+ }
 
15303
 
15304
+ if (_this2.config.playsinline) {
15305
+ _this2.media.setAttribute('playsinline', '');
15306
+ }
15307
+ } // Restore class hook
 
 
 
 
 
 
 
 
 
 
15308
 
 
 
 
15309
 
15310
+ ui.addStyleHook.call(_this2); // Set new sources for html5
 
 
 
 
 
 
 
 
 
15311
 
15312
+ if (_this2.isHTML5) {
15313
+ source.insertElements.call(_this2, 'source', sources);
15314
+ } // Set video title
15315
 
 
 
 
15316
 
15317
+ _this2.config.title = input.title; // Set up from scratch
15318
 
15319
+ media.setup.call(_this2); // HTML5 stuff
15320
 
15321
+ if (_this2.isHTML5) {
15322
+ // Setup captions
15323
+ if (Object.keys(input).includes('tracks')) {
15324
+ source.insertElements.call(_this2, 'track', input.tracks);
15325
+ }
15326
+ } // If HTML5 or embed but not fully supported, setupInterface and call ready now
 
 
 
 
15327
 
 
 
 
 
 
 
 
15328
 
15329
+ if (_this2.isHTML5 || _this2.isEmbed && !_this2.supported.ui) {
15330
+ // Setup interface
15331
+ ui.build.call(_this2);
15332
+ } // Load HTML5 sources
15333
 
 
 
 
 
15334
 
15335
+ if (_this2.isHTML5) {
15336
+ _this2.media.load();
15337
+ } // Reload thumbnails
15338
 
 
15339
 
15340
+ if (_this2.previewThumbnails) {
15341
+ _this2.previewThumbnails.load();
15342
+ } // Update the fullscreen support
15343
+
15344
+
15345
+ _this2.fullscreen.update();
15346
+ }, true);
15347
+ }
15348
+ };
15349
+
15350
+ /**
15351
+ * Returns a number whose value is limited to the given range.
15352
+ *
15353
+ * Example: limit the output of this computation to between 0 and 255
15354
+ * (x * 255).clamp(0, 255)
15355
+ *
15356
+ * @param {Number} input
15357
+ * @param {Number} min The lower boundary of the output range
15358
+ * @param {Number} max The upper boundary of the output range
15359
+ * @returns A number in the range [min, max]
15360
+ * @type Number
15361
+ */
15362
+ function clamp() {
15363
+ var input = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
15364
+ var min = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
15365
+ var max = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 255;
15366
+ return Math.min(Math.max(input, min), max);
15367
+ }
15368
+
15369
+ // TODO: Use a WeakMap for private globals
15370
+ // const globals = new WeakMap();
15371
+ // Plyr instance
15372
+
15373
+ var Plyr =
15374
+ /*#__PURE__*/
15375
+ function () {
15376
+ function Plyr(target, options) {
15377
+ var _this = this;
15378
 
15379
+ _classCallCheck(this, Plyr);
15380
 
15381
+ this.timers = {}; // State
 
 
 
 
 
 
 
 
 
 
15382
 
15383
+ this.ready = false;
15384
+ this.loading = false;
15385
+ this.failed = false; // Touch device
 
 
15386
 
15387
+ this.touch = support.touch; // Set the media element
 
 
15388
 
15389
+ this.media = target; // String selector passed
 
 
 
 
 
15390
 
15391
+ if (is$1.string(this.media)) {
15392
+ this.media = document.querySelectorAll(this.media);
15393
+ } // jQuery, NodeList or Array passed, use first element
15394
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15395
 
15396
+ if (window.jQuery && this.media instanceof jQuery || is$1.nodeList(this.media) || is$1.array(this.media)) {
15397
+ // eslint-disable-next-line
15398
+ this.media = this.media[0];
15399
+ } // Set config
15400
 
 
 
 
 
 
15401
 
15402
+ this.config = extend({}, defaults$1, Plyr.defaults, options || {}, function () {
15403
+ try {
15404
+ return JSON.parse(_this.media.getAttribute('data-plyr-config'));
15405
+ } catch (e) {
15406
+ return {};
15407
+ }
15408
+ }()); // Elements cache
15409
+
15410
+ this.elements = {
15411
+ container: null,
15412
+ captions: null,
15413
+ buttons: {},
15414
+ display: {},
15415
+ progress: {},
15416
+ inputs: {},
15417
+ settings: {
15418
+ popup: null,
15419
+ menu: null,
15420
+ panels: {},
15421
+ buttons: {}
15422
+ }
15423
+ }; // Captions
15424
 
15425
+ this.captions = {
15426
+ active: null,
15427
+ currentTrack: -1,
15428
+ meta: new WeakMap()
15429
+ }; // Fullscreen
15430
 
15431
+ this.fullscreen = {
15432
+ active: false
15433
+ }; // Options
15434
 
15435
+ this.options = {
15436
+ speed: [],
15437
+ quality: []
15438
+ }; // Debugging
15439
+ // TODO: move to globals
15440
 
15441
+ this.debug = new Console(this.config.debug); // Log config options and support
 
 
 
 
 
 
15442
 
15443
+ this.debug.log('Config', this.config);
15444
+ this.debug.log('Support', support); // We need an element to setup
15445
 
15446
+ if (is$1.nullOrUndefined(this.media) || !is$1.element(this.media)) {
15447
+ this.debug.error('Setup failed: no suitable element passed');
15448
+ return;
15449
+ } // Bail if the element is initialized
15450
 
 
15451
 
15452
+ if (this.media.plyr) {
15453
+ this.debug.warn('Target already setup');
15454
+ return;
15455
+ } // Bail if not enabled
15456
 
 
15457
 
15458
+ if (!this.config.enabled) {
15459
+ this.debug.error('Setup failed: disabled by config');
15460
+ return;
15461
+ } // Bail if disabled or no basic support
15462
+ // You may want to disable certain UAs etc
15463
 
 
15464
 
15465
+ if (!support.check().api) {
15466
+ this.debug.error('Setup failed: no support');
15467
+ return;
15468
+ } // Cache original element state for .destroy()
 
 
 
 
15469
 
 
15470
 
15471
+ var clone = this.media.cloneNode(true);
15472
+ clone.autoplay = false;
15473
+ this.elements.original = clone; // Set media type based on tag or data attribute
15474
+ // Supported: video, audio, vimeo, youtube
15475
 
15476
+ var type = this.media.tagName.toLowerCase(); // Embed properties
15477
 
15478
+ var iframe = null;
15479
+ var url = null; // Different setup based on type
 
 
 
15480
 
15481
+ switch (type) {
15482
+ case 'div':
15483
+ // Find the frame
15484
+ iframe = this.media.querySelector('iframe'); // <iframe> type
15485
 
15486
+ if (is$1.element(iframe)) {
15487
+ // Detect provider
15488
+ url = parseUrl(iframe.getAttribute('src'));
15489
+ this.provider = getProviderByUrl(url.toString()); // Rework elements
 
 
 
 
 
15490
 
15491
+ this.elements.container = this.media;
15492
+ this.media = iframe; // Reset classname
15493
 
15494
+ this.elements.container.className = ''; // Get attributes from URL and set config
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15495
 
15496
+ if (url.search.length) {
15497
+ var truthy = ['1', 'true'];
 
 
15498
 
15499
+ if (truthy.includes(url.searchParams.get('autoplay'))) {
15500
+ this.config.autoplay = true;
15501
+ }
15502
 
15503
+ if (truthy.includes(url.searchParams.get('loop'))) {
15504
+ this.config.loop.active = true;
15505
+ } // TODO: replace fullscreen.iosNative with this playsinline config option
15506
+ // YouTube requires the playsinline in the URL
 
15507
 
 
 
 
 
 
 
15508
 
15509
+ if (this.isYouTube) {
15510
+ this.config.playsinline = truthy.includes(url.searchParams.get('playsinline'));
15511
+ this.config.youtube.hl = url.searchParams.get('hl'); // TODO: Should this be setting language?
15512
+ } else {
15513
+ this.config.playsinline = true;
15514
+ }
15515
+ }
15516
+ } else {
15517
+ // <div> with attributes
15518
+ this.provider = this.media.getAttribute(this.config.attributes.embed.provider); // Remove attribute
15519
 
15520
+ this.media.removeAttribute(this.config.attributes.embed.provider);
15521
+ } // Unsupported or missing provider
 
 
 
 
 
 
 
 
 
15522
 
 
15523
 
15524
+ if (is$1.empty(this.provider) || !Object.keys(providers).includes(this.provider)) {
15525
+ this.debug.error('Setup failed: Invalid provider');
15526
+ return;
15527
+ } // Audio will come later for external providers
15528
 
 
15529
 
15530
+ this.type = types.video;
15531
+ break;
15532
 
15533
+ case 'video':
15534
+ case 'audio':
15535
+ this.type = type;
15536
+ this.provider = providers.html5; // Get config from attributes
15537
 
15538
+ if (this.media.hasAttribute('crossorigin')) {
15539
+ this.config.crossorigin = true;
15540
+ }
15541
 
15542
+ if (this.media.hasAttribute('autoplay')) {
15543
+ this.config.autoplay = true;
15544
+ }
15545
 
15546
+ if (this.media.hasAttribute('playsinline') || this.media.hasAttribute('webkit-playsinline')) {
15547
+ this.config.playsinline = true;
15548
+ }
 
15549
 
15550
+ if (this.media.hasAttribute('muted')) {
15551
+ this.config.muted = true;
15552
+ }
15553
 
15554
+ if (this.media.hasAttribute('loop')) {
15555
+ this.config.loop.active = true;
15556
+ }
 
 
 
 
 
 
15557
 
15558
+ break;
 
 
15559
 
15560
+ default:
15561
+ this.debug.error('Setup failed: unsupported type');
15562
+ return;
15563
+ } // Check for support again but with type
 
 
 
 
 
 
15564
 
 
 
15565
 
15566
+ this.supported = support.check(this.type, this.provider, this.config.playsinline); // If no support for even API, bail
15567
 
15568
+ if (!this.supported.api) {
15569
+ this.debug.error('Setup failed: no support');
15570
+ return;
15571
+ }
15572
 
15573
+ this.eventListeners = []; // Create listeners
 
 
 
 
15574
 
15575
+ this.listeners = new Listeners(this); // Setup local storage for user settings
 
15576
 
15577
+ this.storage = new Storage(this); // Store reference
 
15578
 
15579
+ this.media.plyr = this; // Wrap media
 
15580
 
15581
+ if (!is$1.element(this.elements.container)) {
15582
+ this.elements.container = createElement('div', {
15583
+ tabindex: 0
15584
+ });
15585
+ wrap(this.media, this.elements.container);
15586
+ } // Add style hook
15587
 
 
 
 
 
 
 
 
 
 
 
 
 
15588
 
15589
+ ui.addStyleHook.call(this); // Setup media
15590
+
15591
+ media.setup.call(this); // Listen for events if debugging
15592
+
15593
+ if (this.config.debug) {
15594
+ on.call(this, this.elements.container, this.config.events.join(' '), function (event) {
15595
+ _this.debug.log("event: ".concat(event.type));
15596
+ });
15597
+ } // Setup interface
15598
+ // If embed but not fully supported, build interface now to avoid flash of controls
15599
 
 
 
 
 
 
 
15600
 
15601
+ if (this.isHTML5 || this.isEmbed && !this.supported.ui) {
15602
+ ui.build.call(this);
15603
+ } // Container listeners
15604
 
 
 
 
 
 
 
 
 
 
15605
 
15606
+ this.listeners.container(); // Global listeners
 
 
 
 
15607
 
15608
+ this.listeners.global(); // Setup fullscreen
 
 
 
 
 
 
15609
 
15610
+ this.fullscreen = new Fullscreen(this); // Setup ads if provided
 
 
 
15611
 
15612
+ if (this.config.ads.enabled) {
15613
+ this.ads = new Ads(this);
15614
+ } // Autoplay if required
15615
 
 
 
15616
 
15617
+ if (this.isHTML5 && this.config.autoplay) {
15618
+ setTimeout(function () {
15619
+ return _this.play();
15620
+ }, 10);
15621
+ } // Seek time will be recorded (in listeners.js) so we can prevent hiding controls for a few seconds after seek
 
 
 
 
15622
 
 
 
15623
 
15624
+ this.lastSeekTime = 0; // Setup preview thumbnails if enabled
 
 
 
 
15625
 
15626
+ if (this.config.previewThumbnails.enabled) {
15627
+ this.previewThumbnails = new PreviewThumbnails(this);
15628
+ }
15629
+ } // ---------------------------------------
15630
+ // API
15631
+ // ---------------------------------------
15632
 
15633
+ /**
15634
+ * Types and provider helpers
15635
+ */
15636
 
 
 
 
 
 
 
 
 
15637
 
15638
+ _createClass(Plyr, [{
15639
+ key: "play",
15640
 
15641
+ /**
15642
+ * Play the media, or play the advertisement (if they are not blocked)
15643
+ */
15644
+ value: function play() {
15645
+ var _this2 = this;
 
 
 
15646
 
15647
+ if (!is$1.function(this.media.play)) {
15648
+ return null;
15649
+ } // Intecept play with ads
15650
 
 
 
 
 
15651
 
15652
+ if (this.ads && this.ads.enabled) {
15653
+ this.ads.managerPromise.then(function () {
15654
+ return _this2.ads.play();
15655
+ }).catch(function () {
15656
+ return _this2.media.play();
15657
+ });
15658
+ } // Return the promise (for HTML5)
15659
 
 
 
 
 
 
 
 
 
 
 
 
 
15660
 
15661
+ return this.media.play();
15662
+ }
15663
+ /**
15664
+ * Pause the media
15665
+ */
15666
+
15667
+ }, {
15668
+ key: "pause",
15669
+ value: function pause() {
15670
+ if (!this.playing || !is$1.function(this.media.pause)) {
15671
+ return;
15672
+ }
15673
 
15674
+ this.media.pause();
15675
+ }
15676
+ /**
15677
+ * Get playing state
15678
+ */
15679
+
15680
+ }, {
15681
+ key: "togglePlay",
15682
+
15683
+ /**
15684
+ * Toggle playback based on current status
15685
+ * @param {Boolean} input
15686
+ */
15687
+ value: function togglePlay(input) {
15688
+ // Toggle based on current state if nothing passed
15689
+ var toggle = is$1.boolean(input) ? input : !this.playing;
15690
+
15691
+ if (toggle) {
15692
+ this.play();
15693
+ } else {
15694
+ this.pause();
15695
+ }
15696
+ }
15697
+ /**
15698
+ * Stop playback
15699
+ */
15700
+
15701
+ }, {
15702
+ key: "stop",
15703
+ value: function stop() {
15704
+ if (this.isHTML5) {
15705
+ this.pause();
15706
+ this.restart();
15707
+ } else if (is$1.function(this.media.stop)) {
15708
+ this.media.stop();
15709
+ }
15710
+ }
15711
+ /**
15712
+ * Restart playback
15713
+ */
15714
+
15715
+ }, {
15716
+ key: "restart",
15717
+ value: function restart() {
15718
+ this.currentTime = 0;
15719
+ }
15720
+ /**
15721
+ * Rewind
15722
+ * @param {Number} seekTime - how far to rewind in seconds. Defaults to the config.seekTime
15723
+ */
15724
+
15725
+ }, {
15726
+ key: "rewind",
15727
+ value: function rewind(seekTime) {
15728
+ this.currentTime = this.currentTime - (is$1.number(seekTime) ? seekTime : this.config.seekTime);
15729
+ }
15730
+ /**
15731
+ * Fast forward
15732
+ * @param {Number} seekTime - how far to fast forward in seconds. Defaults to the config.seekTime
15733
+ */
15734
+
15735
+ }, {
15736
+ key: "forward",
15737
+ value: function forward(seekTime) {
15738
+ this.currentTime = this.currentTime + (is$1.number(seekTime) ? seekTime : this.config.seekTime);
15739
+ }
15740
+ /**
15741
+ * Seek to a time
15742
+ * @param {Number} input - where to seek to in seconds. Defaults to 0 (the start)
15743
+ */
15744
+
15745
+ }, {
15746
+ key: "increaseVolume",
15747
+
15748
+ /**
15749
+ * Increase volume
15750
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
15751
+ */
15752
+ value: function increaseVolume(step) {
15753
+ var volume = this.media.muted ? 0 : this.volume;
15754
+ this.volume = volume + (is$1.number(step) ? step : 0);
15755
+ }
15756
+ /**
15757
+ * Decrease volume
15758
+ * @param {Boolean} step - How much to decrease by (between 0 and 1)
15759
+ */
15760
+
15761
+ }, {
15762
+ key: "decreaseVolume",
15763
+ value: function decreaseVolume(step) {
15764
+ this.increaseVolume(-step);
15765
+ }
15766
+ /**
15767
+ * Set muted state
15768
+ * @param {Boolean} mute
15769
+ */
15770
+
15771
+ }, {
15772
+ key: "toggleCaptions",
15773
+
15774
+ /**
15775
+ * Toggle captions
15776
+ * @param {Boolean} input - Whether to enable captions
15777
+ */
15778
+ value: function toggleCaptions(input) {
15779
+ captions.toggle.call(this, input, false);
15780
+ }
15781
+ /**
15782
+ * Set the caption track by index
15783
+ * @param {Number} - Caption index
15784
+ */
15785
+
15786
+ }, {
15787
+ key: "airplay",
15788
+
15789
+ /**
15790
+ * Trigger the airplay dialog
15791
+ * TODO: update player with state, support, enabled
15792
+ */
15793
+ value: function airplay() {
15794
+ // Show dialog if supported
15795
+ if (support.airplay) {
15796
+ this.media.webkitShowPlaybackTargetPicker();
15797
+ }
15798
+ }
15799
+ /**
15800
+ * Toggle the player controls
15801
+ * @param {Boolean} [toggle] - Whether to show the controls
15802
+ */
15803
 
15804
+ }, {
15805
+ key: "toggleControls",
15806
+ value: function toggleControls(toggle) {
15807
+ // Don't toggle if missing UI support or if it's audio
15808
+ if (this.supported.ui && !this.isAudio) {
15809
+ // Get state before change
15810
+ var isHidden = hasClass(this.elements.container, this.config.classNames.hideControls); // Negate the argument if not undefined since adding the class to hides the controls
15811
 
15812
+ var force = typeof toggle === 'undefined' ? undefined : !toggle; // Apply and get updated state
 
15813
 
15814
+ var hiding = toggleClass(this.elements.container, this.config.classNames.hideControls, force); // Close menu
15815
 
15816
+ if (hiding && this.config.controls.includes('settings') && !is$1.empty(this.config.settings)) {
15817
+ controls.toggleMenu.call(this, false);
15818
+ } // Trigger event on change
15819
 
 
 
 
 
15820
 
15821
+ if (hiding !== isHidden) {
15822
+ var eventName = hiding ? 'controlshidden' : 'controlsshown';
15823
+ triggerEvent.call(this, this.media, eventName);
15824
+ }
15825
 
15826
+ return !hiding;
15827
+ }
15828
 
15829
+ return false;
15830
+ }
15831
+ /**
15832
+ * Add event listeners
15833
+ * @param {String} event - Event type
15834
+ * @param {Function} callback - Callback for when event occurs
15835
+ */
15836
+
15837
+ }, {
15838
+ key: "on",
15839
+ value: function on$1(event, callback) {
15840
+ on.call(this, this.elements.container, event, callback);
15841
+ }
15842
+ /**
15843
+ * Add event listeners once
15844
+ * @param {String} event - Event type
15845
+ * @param {Function} callback - Callback for when event occurs
15846
+ */
15847
+
15848
+ }, {
15849
+ key: "once",
15850
+ value: function once$1(event, callback) {
15851
+ once.call(this, this.elements.container, event, callback);
15852
+ }
15853
+ /**
15854
+ * Remove event listeners
15855
+ * @param {String} event - Event type
15856
+ * @param {Function} callback - Callback for when event occurs
15857
+ */
15858
+
15859
+ }, {
15860
+ key: "off",
15861
+ value: function off$1(event, callback) {
15862
+ off(this.elements.container, event, callback);
15863
+ }
15864
+ /**
15865
+ * Destroy an instance
15866
+ * Event listeners are removed when elements are removed
15867
+ * http://stackoverflow.com/questions/12528049/if-a-dom-element-is-removed-are-its-listeners-also-removed-from-memory
15868
+ * @param {Function} callback - Callback for when destroy is complete
15869
+ * @param {Boolean} soft - Whether it's a soft destroy (for source changes etc)
15870
+ */
15871
+
15872
+ }, {
15873
+ key: "destroy",
15874
+ value: function destroy(callback) {
15875
+ var _this3 = this;
15876
+
15877
+ var soft = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : false;
15878
+
15879
+ if (!this.ready) {
15880
+ return;
15881
+ }
15882
 
15883
+ var done = function done() {
15884
+ // Reset overflow (incase destroyed while in fullscreen)
15885
+ document.body.style.overflow = ''; // GC for embed
15886
 
15887
+ _this3.embed = null; // If it's a soft destroy, make minimal changes
15888
 
15889
+ if (soft) {
15890
+ if (Object.keys(_this3.elements).length) {
15891
+ // Remove elements
15892
+ removeElement(_this3.elements.buttons.play);
15893
+ removeElement(_this3.elements.captions);
15894
+ removeElement(_this3.elements.controls);
15895
+ removeElement(_this3.elements.wrapper); // Clear for GC
15896
 
15897
+ _this3.elements.buttons.play = null;
15898
+ _this3.elements.captions = null;
15899
+ _this3.elements.controls = null;
15900
+ _this3.elements.wrapper = null;
15901
+ } // Callback
15902
 
 
15903
 
15904
+ if (is$1.function(callback)) {
15905
+ callback();
15906
+ }
15907
+ } else {
15908
+ // Unbind listeners
15909
+ unbindListeners.call(_this3); // Replace the container with the original element provided
15910
 
15911
+ replaceElement(_this3.elements.original, _this3.elements.container); // Event
 
 
 
 
15912
 
15913
+ triggerEvent.call(_this3, _this3.elements.original, 'destroyed', true); // Callback
15914
 
15915
+ if (is$1.function(callback)) {
15916
+ callback.call(_this3.elements.original);
15917
+ } // Reset state
15918
 
 
 
 
 
 
 
 
15919
 
15920
+ _this3.ready = false; // Clear for garbage collection
 
 
15921
 
15922
+ setTimeout(function () {
15923
+ _this3.elements = null;
15924
+ _this3.media = null;
15925
+ }, 200);
15926
+ }
15927
+ }; // Stop playback
15928
 
 
15929
 
15930
+ this.stop(); // Clear timeouts
 
 
 
 
 
 
 
 
 
15931
 
15932
+ clearTimeout(this.timers.loading);
15933
+ clearTimeout(this.timers.controls);
15934
+ clearTimeout(this.timers.resized); // Provider specific stuff
15935
 
15936
+ if (this.isHTML5) {
15937
+ // Restore native video controls
15938
+ ui.toggleNativeControls.call(this, true); // Clean up
 
 
 
 
15939
 
15940
+ done();
15941
+ } else if (this.isYouTube) {
15942
+ // Clear timers
15943
+ clearInterval(this.timers.buffering);
15944
+ clearInterval(this.timers.playing); // Destroy YouTube API
 
 
 
15945
 
15946
+ if (this.embed !== null && is$1.function(this.embed.destroy)) {
15947
+ this.embed.destroy();
15948
+ } // Clean up
 
15949
 
15950
 
15951
+ done();
15952
+ } else if (this.isVimeo) {
15953
+ // Destroy Vimeo API
15954
+ // then clean up (wait, to prevent postmessage errors)
15955
+ if (this.embed !== null) {
15956
+ this.embed.unload().then(done);
15957
+ } // Vimeo does not always return
 
 
 
15958
 
 
 
 
 
 
 
 
 
 
15959
 
15960
+ setTimeout(done, 200);
15961
  }
15962
+ }
15963
+ /**
15964
+ * Check for support for a mime type (HTML5 only)
15965
+ * @param {String} type - Mime type
15966
+ */
15967
+
15968
+ }, {
15969
+ key: "supports",
15970
+ value: function supports(type) {
15971
+ return support.mime.call(this, type);
15972
+ }
15973
+ /**
15974
+ * Check for support
15975
+ * @param {String} type - Player type (audio/video)
15976
+ * @param {String} provider - Provider (html5/youtube/vimeo)
15977
+ * @param {Boolean} inline - Where player has `playsinline` sttribute
15978
+ */
15979
+
15980
+ }, {
15981
+ key: "isHTML5",
15982
+ get: function get() {
15983
+ return this.provider === providers.html5;
15984
+ }
15985
+ }, {
15986
+ key: "isEmbed",
15987
+ get: function get() {
15988
+ return this.isYouTube || this.isVimeo;
15989
+ }
15990
+ }, {
15991
+ key: "isYouTube",
15992
+ get: function get() {
15993
+ return this.provider === providers.youtube;
15994
+ }
15995
+ }, {
15996
+ key: "isVimeo",
15997
+ get: function get() {
15998
+ return this.provider === providers.vimeo;
15999
+ }
16000
+ }, {
16001
+ key: "isVideo",
16002
+ get: function get() {
16003
+ return this.type === types.video;
16004
+ }
16005
+ }, {
16006
+ key: "isAudio",
16007
+ get: function get() {
16008
+ return this.type === types.audio;
16009
+ }
16010
+ }, {
16011
+ key: "playing",
16012
+ get: function get() {
16013
+ return Boolean(this.ready && !this.paused && !this.ended);
16014
+ }
16015
+ /**
16016
+ * Get paused state
16017
+ */
16018
+
16019
+ }, {
16020
+ key: "paused",
16021
+ get: function get() {
16022
+ return Boolean(this.media.paused);
16023
+ }
16024
+ /**
16025
+ * Get stopped state
16026
+ */
16027
+
16028
+ }, {
16029
+ key: "stopped",
16030
+ get: function get() {
16031
+ return Boolean(this.paused && this.currentTime === 0);
16032
+ }
16033
+ /**
16034
+ * Get ended state
16035
+ */
16036
+
16037
+ }, {
16038
+ key: "ended",
16039
+ get: function get() {
16040
+ return Boolean(this.media.ended);
16041
+ }
16042
+ }, {
16043
+ key: "currentTime",
16044
+ set: function set(input) {
16045
+ // Bail if media duration isn't available yet
16046
+ if (!this.duration) {
16047
+ return;
16048
+ } // Validate input
16049
 
16050
 
16051
+ var inputIsValid = is$1.number(input) && input > 0; // Set
16052
 
16053
+ this.media.currentTime = inputIsValid ? Math.min(input, this.duration) : 0; // Logging
16054
 
16055
+ this.debug.log("Seeking to ".concat(this.currentTime, " seconds"));
16056
+ }
16057
+ /**
16058
+ * Get current time
16059
+ */
16060
+ ,
16061
+ get: function get() {
16062
+ return Number(this.media.currentTime);
16063
+ }
16064
+ /**
16065
+ * Get buffered
16066
+ */
16067
 
16068
+ }, {
16069
+ key: "buffered",
16070
+ get: function get() {
16071
+ var buffered = this.media.buffered; // YouTube / Vimeo return a float between 0-1
16072
 
16073
+ if (is$1.number(buffered)) {
16074
+ return buffered;
16075
+ } // HTML5
16076
+ // TODO: Handle buffered chunks of the media
16077
+ // (i.e. seek to another section buffers only that section)
16078
+
16079
+
16080
+ if (buffered && buffered.length && this.duration > 0) {
16081
+ return buffered.end(0) / this.duration;
16082
+ }
16083
+
16084
+ return 0;
16085
+ }
16086
+ /**
16087
+ * Get seeking status
16088
+ */
16089
+
16090
+ }, {
16091
+ key: "seeking",
16092
+ get: function get() {
16093
+ return Boolean(this.media.seeking);
16094
+ }
16095
+ /**
16096
+ * Get the duration of the current media
16097
+ */
16098
+
16099
+ }, {
16100
+ key: "duration",
16101
+ get: function get() {
16102
+ // Faux duration set via config
16103
+ var fauxDuration = parseFloat(this.config.duration); // Media duration can be NaN or Infinity before the media has loaded
16104
+
16105
+ var realDuration = (this.media || {}).duration;
16106
+ var duration = !is$1.number(realDuration) || realDuration === Infinity ? 0 : realDuration; // If config duration is funky, use regular duration
16107
+
16108
+ return fauxDuration || duration;
16109
+ }
16110
+ /**
16111
+ * Set the player volume
16112
+ * @param {Number} value - must be between 0 and 1. Defaults to the value from local storage and config.volume if not set in storage
16113
+ */
16114
 
16115
+ }, {
16116
+ key: "volume",
16117
+ set: function set(value) {
16118
+ var volume = value;
16119
+ var max = 1;
16120
+ var min = 0;
 
16121
 
16122
+ if (is$1.string(volume)) {
16123
+ volume = Number(volume);
16124
+ } // Load volume from storage if no value specified
16125
 
 
 
 
 
 
16126
 
16127
+ if (!is$1.number(volume)) {
16128
+ volume = this.storage.get('volume');
16129
+ } // Use config if all else fails
16130
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16131
 
16132
+ if (!is$1.number(volume)) {
16133
+ volume = this.config.volume;
16134
+ } // Maximum is volumeMax
16135