Elementor Essential Addons - Version 3.9.4

Version Description

  • 03/05/2020 =
  • Fixed: Image Accordion not showing 'Horizontal' layout
  • Fixed: Info Box not showing 'Margin' option in 'Advanced' tab
Download this release

Release Info

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

Code changes from version 3.9.3 to 3.9.4

assets/admin/css/cloud.css CHANGED
@@ -30,6 +30,7 @@
30
  }
31
  .template-cloud-install {
32
  display: flex;
 
33
  width: 100%;
34
  background-image: url(../images/templately/login-bg.png);
35
  background-size: cover;
@@ -43,20 +44,29 @@
43
  }
44
 
45
  .templately-left {
46
- padding-right: 15px;
47
  }
48
  .templately-right {
49
- padding-left: 15px;
50
- }
51
- .templately-admin-title, .templately-admin-install {
52
- width: 70%;
53
  }
 
54
  .templately-admin-title {
55
- float: right;
56
  font-size: 16px;
57
  text-align: left;
58
  }
59
- .templately-admin-title h1 {
 
 
 
 
 
 
 
 
 
 
 
60
  color: #fff;
61
  font-size: 50px;
62
  font-weight: 700;
@@ -64,18 +74,17 @@
64
  font-size: 60px;
65
  }
66
 
67
- .templately-admin-title p {
68
  font-size: 18px;
69
  line-height: 1.6;
70
  color: #fff;
71
  }
72
 
73
  .templately-admin-install {
74
- background-color: #5d53ff;
75
  color: #fff;
76
  padding: 50px;
77
  border-radius: 10px;
78
- float: left;
79
  }
80
 
81
  .templately-admin-install p {
@@ -86,7 +95,7 @@
86
 
87
  .templately-admin-install button.eae-activate-templately {
88
  background-color: #fff;
89
- border: 1px solid rgb(96, 114, 255);
90
  padding: 15px 30px;
91
  border-radius: 50px;
92
  color: rgb(96, 114, 255);
@@ -99,4 +108,15 @@
99
  .templately-admin-install button.eae-activate-templately:hover {
100
  background-color: rgb(250, 145, 150);
101
  color: rgb(255, 255, 255);
 
 
 
 
 
 
 
 
 
 
 
102
  }
30
  }
31
  .template-cloud-install {
32
  display: flex;
33
+ flex-flow: column nowrap;
34
  width: 100%;
35
  background-image: url(../images/templately/login-bg.png);
36
  background-size: cover;
44
  }
45
 
46
  .templately-left {
47
+ padding: 10px;
48
  }
49
  .templately-right {
50
+ padding: 10px;
51
+ max-width: 550px;
 
 
52
  }
53
+
54
  .templately-admin-title {
 
55
  font-size: 16px;
56
  text-align: left;
57
  }
58
+ .templately-cloud-title {
59
+ text-align: center;
60
+ margin-bottom: 50px;
61
+ }
62
+ .templately-installer-wrapper {
63
+ display: flex;
64
+ flex-flow: row wrap;
65
+ justify-content: center;
66
+ align-items: center;
67
+ width: 100%;
68
+ }
69
+ .templately-cloud-title h1 {
70
  color: #fff;
71
  font-size: 50px;
72
  font-weight: 700;
74
  font-size: 60px;
75
  }
76
 
77
+ .templately-cloud-title p {
78
  font-size: 18px;
79
  line-height: 1.6;
80
  color: #fff;
81
  }
82
 
83
  .templately-admin-install {
84
+ background-color: transparent;
85
  color: #fff;
86
  padding: 50px;
87
  border-radius: 10px;
 
88
  }
89
 
90
  .templately-admin-install p {
95
 
96
  .templately-admin-install button.eae-activate-templately {
97
  background-color: #fff;
98
+ border: 1px solid rgb(96, 114, 255, 0);
99
  padding: 15px 30px;
100
  border-radius: 50px;
101
  color: rgb(96, 114, 255);
108
  .templately-admin-install button.eae-activate-templately:hover {
109
  background-color: rgb(250, 145, 150);
110
  color: rgb(255, 255, 255);
111
+ }
112
+ .templately-cloud-video-container {
113
+ background-color: #fff;
114
+ padding: 8px;
115
+ width: 620px;
116
+ max-width: 100%;
117
+ border-radius: 4px;
118
+ box-shadow: 0 0 30px 5px rgba(0,0,0, .15);
119
+ }
120
+ .templately-cloud-video-container iframe {
121
+ width: 100%;
122
  }
assets/front-end/css/eael.css CHANGED
@@ -688,6 +688,76 @@
688
  }
689
  }
690
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
691
  /*--------------------------------*/
692
  /* 11. Contact Form 7 Styles
693
  /*--------------------------------*/
@@ -781,76 +851,6 @@
781
  font-weight: normal;
782
  }
783
 
784
- @-webkit-keyframes "loaderSpin" {
785
- 0% {
786
- transform: rotate(0deg);
787
- }
788
- 100% {
789
- transform: rotate(360deg);
790
- }
791
- }
792
- @keyframes "loaderSpin" {
793
- 0% {
794
- transform: rotate(0deg);
795
- }
796
- 100% {
797
- transform: rotate(360deg);
798
- }
799
- }
800
- .eael-button-wrap,
801
- .eael-load-more-button-wrap {
802
- display: flex;
803
- }
804
-
805
- .eael-button,
806
- .eael-load-more-button {
807
- display: flex !important;
808
- align-items: center;
809
- justify-content: center;
810
- padding: 1em 2em;
811
- border: 0px solid;
812
- font-size: 16px;
813
- overflow: hidden;
814
- }
815
- .eael-button > span,
816
- .eael-load-more-button > span {
817
- margin-left: -20px;
818
- }
819
- .eael-button .eael-btn-loader,
820
- .eael-load-more-button .eael-btn-loader {
821
- border-radius: 50%;
822
- width: 20px;
823
- height: 20px;
824
- font-size: 10px;
825
- position: relative;
826
- text-indent: -9999em;
827
- border-top: 4px solid rgba(255, 255, 255, 0.2);
828
- border-right: 4px solid rgba(255, 255, 255, 0.2);
829
- border-bottom: 4px solid rgba(255, 255, 255, 0.2);
830
- border-left: 4px solid #ffffff;
831
- transform: translateZ(0);
832
- -webkit-animation: loaderSpin 1.1s infinite linear;
833
- animation: loaderSpin 1.1s infinite linear;
834
- left: -100%;
835
- top: auto;
836
- margin-right: 5px;
837
- transition: all 0.2s;
838
- }
839
- .eael-button .eael-btn-loader:after,
840
- .eael-load-more-button .eael-btn-loader:after {
841
- border-radius: 50%;
842
- width: 20px;
843
- height: 20px;
844
- }
845
- .eael-button.button--loading > span,
846
- .eael-load-more-button.button--loading > span {
847
- margin-left: 0;
848
- }
849
- .eael-button.button--loading .eael-btn-loader,
850
- .eael-load-more-button.button--loading .eael-btn-loader {
851
- left: 0;
852
- }
853
-
854
  .eael-ticker-wrap {
855
  overflow: hidden;
856
  display: flex;
@@ -914,6 +914,65 @@
914
  justify-content: center;
915
  }
916
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
917
  /*--------------------------------*/
918
  /* 08. Creative Button styles
919
  /*--------------------------------*/
@@ -1169,102 +1228,43 @@
1169
  margin-left: 5px;
1170
  }
1171
 
1172
- /*---------------------------------*/
1173
- /* 05. Countdown Styles
1174
- /*---------------------------------*/
1175
- /*--- General ---*/
1176
- .eael-countdown-items {
1177
- list-style: none;
1178
- margin: 0;
1179
- padding: 0;
1180
- display: table;
1181
- table-layout: fixed;
1182
- width: 100%;
1183
  }
1184
 
1185
- .eael-countdown-items > li {
1186
- list-style: none;
1187
- margin: 0;
1188
- padding: 0;
1189
- display: table-cell;
1190
- position: relative;
 
 
 
 
1191
  }
1192
 
1193
- .eael-countdown-item > div {
1194
- text-align: center;
1195
- padding: 20px;
 
 
1196
  }
1197
 
1198
- .eael-countdown-label-block .eael-countdown-digits,
1199
- .eael-countdown-label-block .eael-countdown-label {
1200
- display: block;
1201
- text-align: center;
1202
  }
1203
 
1204
- .eael-countdown-digits {
1205
- font-size: 54px;
1206
- line-height: 1;
1207
- }
1208
-
1209
- .eael-countdown-label {
1210
- font-size: 18px;
1211
- line-height: 1;
1212
- color: #ffffff;
1213
- }
1214
-
1215
- .eael-countdown-show-separator .eael-countdown-digits::after {
1216
- content: ":";
1217
- position: absolute;
1218
- left: 98%;
1219
- z-index: 9999;
1220
- }
1221
-
1222
- .eael-countdown-item:last-child .eael-countdown-digits::after {
1223
- display: none;
1224
- }
1225
-
1226
- /*--- Style 1 ---*/
1227
- .eael-countdown-items.style-1 .eael-countdown-item > div {
1228
- background: #262625;
1229
- }
1230
-
1231
- @charset "UTF-8";
1232
- table.eael-data-table thead .sorting_asc,
1233
- table.eael-data-table thead .sorting_desc,
1234
- table.eael-data-table thead .sorting {
1235
- position: relative;
1236
- z-index: 0;
1237
- outline: 0;
1238
- cursor: pointer;
1239
- }
1240
-
1241
- table.eael-data-table thead .sorting_asc:after,
1242
- table.eael-data-table thead .sorting_desc:after,
1243
- table.eael-data-table thead .sorting:after {
1244
- position: absolute;
1245
- top: 50%;
1246
- right: 10px;
1247
- font-family: "FontAwesome";
1248
- color: #fff;
1249
- z-index: 1;
1250
- transform: translateY(-50%);
1251
- }
1252
-
1253
- .eael-data-table-wrap .eael-data-tables_wrapper {
1254
- display: flex;
1255
- flex-flow: row wrap;
1256
- justify-content: flex-start;
1257
- width: 100%;
1258
- }
1259
-
1260
- .eael-data-table-wrap .eael-data-tables_filter {
1261
- flex-grow: 1;
1262
- flex-basis: 50%;
1263
- text-align: right;
1264
- }
1265
-
1266
- .eael-data-table-wrap .eael-data-tables_filter label {
1267
- font-weight: 700;
1268
  }
1269
 
1270
  .eael-data-table-wrap .eael-data-tables_filter label input[type="search"] {
@@ -2450,266 +2450,803 @@ span.fc-day-number {
2450
  padding: 10px 25px;
2451
  }
2452
 
2453
- /*------------------------------*/
2454
- /* 27. Filterable Gallery
2455
- /*------------------------------*/
2456
- .eael-filter-gallery-control {
2457
- width: 100%;
2458
  }
2459
-
2460
- .eael-filter-gallery-control ul,
2461
- .eael-filter-gallery-control ul li {
2462
- text-align: center;
2463
  }
2464
-
2465
- .eael-filter-gallery-control ul {
2466
- margin: 0px 0px 20px 0px;
2467
- padding: 0px;
2468
- text-align: center;
2469
  }
2470
-
2471
- .eael-filter-gallery-control {
2472
- display: flex;
2473
- flex-flow: 1 1 auto;
2474
- align-items: center;
2475
- justify-content: center;
2476
- flex-flow: row wrap;
2477
- padding: 0px;
2478
- margin: 0px;
2479
  }
2480
-
2481
- .eael-filter-gallery-control ul li {
2482
- list-style: none;
2483
- font-size: 24px;
2484
- display: inline-block;
2485
- text-align: center;
2486
  }
2487
-
2488
- .eael-filter-gallery-control ul li a.control {
2489
- font-family: 'Montserrat', sans-serif;
2490
- font-size: 16px;
2491
- font-weight: 600;
2492
- padding: 10px 25px;
2493
- margin: 10px 6px;
2494
  }
2495
-
2496
- .eael-filter-gallery-container {
2497
- text-align: justify;
2498
- font-size: 0.1px;
2499
  }
2500
-
2501
- .eael-filter-gallery-container:after {
2502
- content: '';
2503
- display: inline-block;
2504
- width: 100%;
2505
  }
2506
-
2507
- .eael-filter-gallery-container:not(.eael-cards) .item:before {
2508
- content: '';
2509
- display: inline-block;
2510
- padding-top: 56.25%;
2511
  }
2512
-
2513
- .eael-filter-gallery-container .item .caption {
2514
  position: absolute;
2515
- display: flex;
2516
- flex-flow: 1 1 100%;
2517
- align-items: center;
2518
- justify-content: center;
2519
  z-index: 1;
2520
- top: 0px;
2521
- left: 0px;
2522
- right: 0px;
2523
- bottom: 0px;
2524
- transition: transform .4s;
 
 
2525
  }
2526
-
2527
- .eael-filter-gallery-container.eael-cards .item .caption {
2528
  display: none;
2529
  }
2530
-
2531
- .eael-filter-gallery-container.eael-cards .item .item-img .caption {
2532
- position: absolute;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2533
  display: flex;
2534
- flex-flow: 1 1 100%;
2535
  align-items: center;
2536
  justify-content: center;
2537
- z-index: 10;
2538
- top: 0px;
2539
- left: 0px;
2540
- right: 0px;
2541
- bottom: 0px;
2542
- transition: transform .4s;
2543
  }
2544
-
2545
- .gallery-item-caption-over {
2546
- width: 100%;
2547
- height: auto;
2548
  }
2549
-
2550
- a.eael-gallery-load-more, a.eael-gallery-load-more:hover {
2551
- text-decoration: none;
 
 
2552
  }
2553
-
2554
- /*--- Caption Animation ---*/
2555
- .eael-filter-gallery-container .item .caption.eael-zoom-in,
2556
- .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-zoom-in {
2557
- transform: scale(0);
2558
  }
2559
-
2560
- .eael-filter-gallery-container .item:hover .caption.eael-zoom-in,
2561
- .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-zoom-in {
2562
- transform: scale(1);
2563
  }
2564
-
2565
- .eael-filter-gallery-container .item .caption.eael-slide-left,
2566
- .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-left {
2567
- transform: translateX(-100%);
2568
  }
2569
-
2570
- .eael-filter-gallery-container .item:hover .caption.eael-slide-left,
2571
- .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-left {
2572
- transform: translateX(0%);
2573
  }
2574
-
2575
- .eael-filter-gallery-container .item .caption.eael-slide-right,
2576
- .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-right {
2577
- transform: translateX(100%);
 
2578
  }
2579
-
2580
- .eael-filter-gallery-container .item:hover .caption.eael-slide-right,
2581
- .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-right {
2582
- transform: translateX(0%);
2583
- }
2584
-
2585
- .eael-filter-gallery-container .item .caption.eael-slide-top,
2586
- .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-top {
2587
- transform: translateY(-100%);
2588
- }
2589
-
2590
- .eael-filter-gallery-container .item:hover .caption.eael-slide-top,
2591
- .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-top {
2592
- transform: translateY(0%);
2593
- }
2594
-
2595
- .eael-filter-gallery-container .item .caption.eael-slide-bottom,
2596
- .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-bottom {
2597
- transform: translateY(100%);
2598
  }
2599
-
2600
- .eael-filter-gallery-container .item:hover .caption.eael-slide-bottom,
2601
- .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-bottom {
2602
- transform: translateY(0%);
2603
  }
2604
-
2605
- .eael-filter-gallery-container .item .caption a {
2606
- display: inline-block;
2607
- width: 50px;
2608
- height: 50px;
2609
- text-align: center;
2610
- line-height: 50px;
2611
  border-radius: 50%;
2612
- margin: 0 5px;
2613
- font-size: 20px;
2614
- cursor: pointer;
2615
- transition: .3s;
2616
- }
2617
-
2618
- .eael-filter-gallery-container .item .caption a:nth-child(1),
2619
- .eael-container .item .caption a:nth-child(2) {
2620
- transition: .6s;
2621
- opacity: 0;
2622
  }
2623
-
2624
- .eael-filter-gallery-container .item .caption a:nth-child(1) {
2625
- transform: translateY(-100%);
2626
  }
2627
-
2628
- .eael-filter-gallery-container .item .caption a:nth-child(2) {
2629
- transform: translateY(100%);
2630
  }
2631
-
2632
- .eael-filter-gallery-container .item .caption:hover a:nth-child(1),
2633
- .eael-filter-gallery-container .item .caption:hover a:nth-child(2) {
2634
- transform: translateY(0%);
2635
- opacity: 1;
2636
  }
2637
-
2638
- .eael-filter-gallery-container .item .caption .eael-popup-link {
2639
- outline: 0;
2640
  }
2641
-
2642
- /*--- Filter Gallery Card Style ---*/
2643
- .eael-filter-gallery-container.eael-cards .item:before {
2644
- padding-top: 0px;
2645
  }
2646
-
2647
- .eael-filter-gallery-container.eael-cards .item-img {
2648
  position: relative;
2649
- background-repeat: no-repeat;
2650
- background-position: center;
2651
- background-size: cover;
2652
- height: 220px;
2653
- z-index: 0;
2654
- overflow: hidden;
2655
- }
2656
-
2657
- .eael-filter-gallery-container.eael-cards .item-content {
2658
- padding: 15px;
2659
  }
2660
-
2661
- .eael-filter-gallery-container.eael-cards .item-content .title,
2662
- .eael-filter-gallery-container.eael-cards .item-content .title a {
2663
- font-size: 20px;
2664
- line-height: 1;
2665
- margin-bottom: 0px;
2666
- transition: .3s;
2667
  }
2668
-
2669
- .eael-filter-gallery-container.eael-cards .item-content p {
2670
- font-size: 14px;
2671
- line-height: 26px;
2672
  }
2673
-
2674
- .eael-fg-card-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over {
2675
- text-align: center;
 
 
 
 
2676
  }
2677
-
2678
- .eael-fg-card-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over {
2679
- text-align: right;
 
 
 
 
 
2680
  }
2681
-
2682
- .eael-fg-hoverer-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over {
2683
- text-align: center;
2684
  }
2685
-
2686
- .eael-fg-hoverer-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over {
2687
- text-align: right;
 
 
 
 
 
 
 
 
 
 
 
 
 
2688
  }
2689
-
2690
- /*--- Editor Specific Style ---*/
2691
- .eael-fg-content-align-left .eael-cards .item .item-content {
2692
- text-align: left;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2693
  }
2694
-
2695
- .eael-fg-content-align-center .eael-cards .item .item-content {
2696
- text-align: center;
 
 
 
 
 
 
 
 
 
2697
  }
2698
-
2699
- .eael-fg-content-align-right .eael-cards .item .item-content {
2700
- text-align: right;
 
 
 
 
 
 
 
 
 
2701
  }
2702
-
2703
- /*--- Magnific Gallery Fix ---*/
2704
- .mfp-wrap ~ div.dialog-widget {
2705
- display: none !important;
 
 
 
2706
  }
2707
-
2708
- .eael-filterable-gallery-item-wrap {
2709
- float: left;
2710
- width: 33.33%;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2711
  }
2712
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2713
  .eael-filter-gallery-container.eael-col-1 .eael-filterable-gallery-item-wrap {
2714
  width: 100%;
2715
  }
@@ -3251,824 +3788,287 @@ a.eael-gallery-load-more, a.eael-gallery-load-more:hover {
3251
  margin-right: 0 !important;
3252
  }
3253
 
3254
- .elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1) {
3255
- clear: left;
3256
- }
3257
-
3258
- .elementor-element.elementor-grid-mobile-6 {
3259
- position: relative;
3260
- }
3261
-
3262
- .elementor-element.elementor-grid-mobile-6 .pp-logo-grid {
3263
- margin-right: -6px;
3264
- }
3265
-
3266
- .elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap {
3267
- width: 16%;
3268
- float: left;
3269
- }
3270
-
3271
- .elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n) {
3272
- margin-right: 0 !important;
3273
- }
3274
-
3275
- .elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1) {
3276
- clear: left;
3277
- }
3278
- }
3279
- /* ------------- Layout 3 Style ----------------- */
3280
- .fg-layout-3-filter-controls {
3281
- margin: 0;
3282
- padding: 0;
3283
- list-style: none;
3284
- }
3285
-
3286
- .fg-layout-3-item-content {
3287
- text-align: center;
3288
- }
3289
-
3290
- .fg-layout-3-item-content .fg-item-title {
3291
- font-size: 18px;
3292
- line-height: 1;
3293
- font-weight: 500;
3294
- margin: 0;
3295
- transition: 300ms;
3296
- }
3297
-
3298
- .fg-layout-3-item-content .fg-item-content p {
3299
- font-size: 13px;
3300
- font-weight: 400;
3301
- }
3302
-
3303
- .fg-filter-wrap {
3304
- position: relative;
3305
- flex-basis: 30%;
3306
- }
3307
-
3308
- .fg-layout-3-filter-controls {
3309
- position: absolute;
3310
- left: 0;
3311
- background: #fff;
3312
- z-index: 999;
3313
- width: 150px;
3314
- visibility: hidden;
3315
- opacity: 0;
3316
- transition: 300ms;
3317
- width: 100%;
3318
- border-radius: 5px;
3319
- padding-top: 7px;
3320
- }
3321
-
3322
- .fg-layout-3-filter-controls.open-filters {
3323
- visibility: visible;
3324
- opacity: 1;
3325
- }
3326
-
3327
- .fg-layout-3-filter-controls li.control {
3328
- padding: 5px 5px 5px 10px;
3329
- cursor: pointer;
3330
- transition: 300ms;
3331
- font-size: 14px;
3332
- color: #7f8995;
3333
- font-weight: normal;
3334
- }
3335
-
3336
- .fg-layout-3-filter-controls li.control:hover {
3337
- color: #2d425a;
3338
- }
3339
-
3340
- .fg-layout-3-filter-controls li.control:first-child {
3341
- border-top: 0px solid;
3342
- }
3343
-
3344
- .fg-layout-3-filter-controls li.control:last-child {
3345
- border-bottom: 0px solid;
3346
- }
3347
-
3348
- .fg-layout-3-filters-wrap {
3349
- max-width: 600px;
3350
- margin: 15px auto 50px;
3351
- }
3352
-
3353
- .fg-filter-wrap button {
3354
- width: 100%;
3355
- border: 0px solid;
3356
- border-radius: 0px;
3357
- padding: 17px 13px;
3358
- font-size: 14px;
3359
- color: #2d425a;
3360
- background: #f7f8ff;
3361
- height: 55px;
3362
- border-right: 1px solid #abb5ff;
3363
- border-radius: 10px 0px 0 10px;
3364
- outline: none;
3365
- text-align: center;
3366
- position: relative;
3367
- }
3368
-
3369
- .fg-filter-wrap button > i {
3370
- font-size: 18px;
3371
- position: absolute;
3372
- top: 50%;
3373
- transform: translateY(-50%);
3374
- margin-left: 10px;
3375
- }
3376
-
3377
- .fg-layout-3-search-box {
3378
- flex-basis: 70%;
3379
- height: 100%;
3380
- }
3381
-
3382
- .fg-layout-3-search-box input[type="text"] {
3383
- width: 100%;
3384
- height: 100%;
3385
- margin: 0;
3386
- padding: 15px;
3387
- border: 0px solid;
3388
- outline: none;
3389
- background: none;
3390
- }
3391
-
3392
- .fg-layout-3-search-box input[type="text"]::-webkit-input-placeholder {
3393
- /* Chrome/Opera/Safari */
3394
- color: #7f8995;
3395
- font-size: 13px;
3396
- }
3397
-
3398
- .fg-layout-3-search-box input[type="text"]::-moz-placeholder {
3399
- /* Firefox 19+ */
3400
- color: #7f8995;
3401
- font-size: 13px;
3402
- }
3403
-
3404
- .fg-layout-3-search-box input[type="text"]:-ms-input-placeholder {
3405
- /* IE 10+ */
3406
- color: #7f8995;
3407
- font-size: 13px;
3408
- }
3409
-
3410
- .fg-layout-3-search-box input[type="text"]:-moz-placeholder {
3411
- /* Firefox 18- */
3412
- color: #7f8995;
3413
- font-size: 13px;
3414
- }
3415
-
3416
- .fg-layout-3-filters-wrap {
3417
- height: 55px;
3418
- border-radius: 5px;
3419
- display: flex;
3420
- flex-wrap: wrap;
3421
- align-items: center;
3422
- }
3423
-
3424
- .fg-layout-3-filters-wrap .fg-layout-3-search-box {
3425
- background: #f7f8ff;
3426
- border-radius: 0 10px 10px 0;
3427
- }
3428
-
3429
- .fg-layout-3-item-thumb {
3430
- position: relative;
3431
- overflow: hidden;
3432
- }
3433
-
3434
- .fg-layout-3-item-thumb .gallery-item-buttons {
3435
- text-align: center;
3436
- position: absolute;
3437
- left: 0;
3438
- top: 0;
3439
- height: 100%;
3440
- width: 100%;
3441
- display: flex;
3442
- align-items: center;
3443
- justify-content: center;
3444
- z-index: 4;
3445
- }
3446
-
3447
- .fg-layout-3-item-content {
3448
- padding: 27px 27px 30px;
3449
- text-align: center;
3450
- }
3451
 
3452
- .eael-fg-card-content-align-left .fg-layout-3-item-content {
3453
- text-align: left;
3454
- }
3455
 
3456
- .eael-fg-card-content-align-center .fg-layout-3-item-content {
3457
- text-align: center;
3458
- }
3459
 
3460
- .eael-fg-card-content-align-right .fg-layout-3-item-content {
3461
- text-align: right;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3462
  }
3463
 
3464
- .eael-filterable-gallery-item-wrap .fg-layout-3-item.eael-gallery-grid-item {
3465
- box-shadow: 0px 0px 30px 0px rgba(3, 29, 60, 0.05);
3466
- border-radius: 5px;
3467
  }
3468
 
3469
- .fg-caption-head {
3470
- position: absolute;
3471
- left: 0;
3472
- top: 0;
3473
- width: 100%;
3474
- display: flex;
3475
- justify-content: space-between;
3476
- padding: 35px 35px;
3477
- z-index: 3;
3478
- color: #fff;
3479
  font-size: 18px;
3480
- font-weight: 700;
 
 
 
3481
  }
3482
 
3483
- .fg-item-category > span {
3484
- font-size: 12px;
3485
- color: #fff;
3486
- background: #fa9196;
3487
- padding: 10px 12px;
3488
- display: inline-block;
3489
  }
3490
 
3491
- .fg-layout-3-item-content {
3492
  position: relative;
 
3493
  }
3494
 
3495
- .fg-item-category {
3496
  position: absolute;
3497
  left: 0;
3498
- top: 0;
3499
- text-align: center;
3500
- width: 100%;
3501
- height: 30px;
3502
- margin-top: -15px;
3503
- z-index: 11;
3504
- }
3505
-
3506
- .fg-item-category span {
3507
- border-radius: 5px;
3508
- line-height: 1;
3509
  visibility: hidden;
3510
  opacity: 0;
3511
  transition: 300ms;
 
 
 
3512
  }
3513
 
3514
- .fg-layout-3-item.eael-gallery-grid-item:hover .fg-item-category span {
3515
  visibility: visible;
3516
  opacity: 1;
3517
  }
3518
 
3519
- .mfp-iframe-holder .mfp-close,
3520
- .mfp-image-holder .mfp-close {
3521
- width: auto;
3522
- }
3523
-
3524
- .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
3525
  cursor: pointer;
 
 
 
 
3526
  }
3527
 
3528
- .mfp-zoom-out-cur .mfp-image-holder .mfp-close:hover {
3529
- text-decoration: none;
3530
  }
3531
 
3532
- button.mfp-close:not(.toggle),
3533
- button.mfp-arrow:not(.toggle) {
3534
- background: transparent;
3535
  }
3536
 
3537
- /*----------------------------*/
3538
- /* 35. Feature List
3539
- /*----------------------------*/
3540
- .elementor-widget-eael-feature-list.-icon-position-left .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, .elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:before {
3541
- top: 3px !important;
3542
- }
3543
- .elementor-widget-eael-feature-list.-icon-position-left .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, .elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:after {
3544
- top: 45px !important;
3545
- }
3546
- .elementor-widget-eael-feature-list.-icon-position-right .connector, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .connector {
3547
- right: 0;
3548
- left: calc(100% - 70px);
3549
- }
3550
- .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 {
3551
- padding: 0 50px 0 0;
3552
- }
3553
- @media (max-width: 767px) {
3554
- .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 {
3555
- padding: 0 30px 0 0;
3556
- }
3557
- }
3558
- .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 {
3559
- left: auto;
3560
- right: 0;
3561
- }
3562
- .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 {
3563
- left: auto;
3564
- right: 5px;
3565
- top: 30px;
3566
- }
3567
- .elementor-widget-eael-feature-list .eael-feature-list-items {
3568
- list-style-type: none;
3569
- margin: 0;
3570
- padding: 0;
3571
- }
3572
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item {
3573
- position: relative;
3574
- }
3575
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .connector {
3576
- display: block;
3577
- position: absolute;
3578
- width: 0;
3579
- margin: 0 auto;
3580
- z-index: 1;
3581
- height: 100%;
3582
- top: 0.5em;
3583
- font-size: 60px;
3584
- left: 0;
3585
- right: calc(100% - 60px);
3586
- border-left: 2px solid #2ecc71;
3587
- border-right: none !important;
3588
- }
3589
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item:last-child .connector {
3590
- display: none;
3591
- }
3592
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box {
3593
- z-index: 2;
3594
- transition: all 0.5s;
3595
- }
3596
- @media (prefers-reduced-motion: reduce) {
3597
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box {
3598
- transition: none;
3599
- }
3600
- }
3601
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner {
3602
- background-color: #37368e;
3603
- transition: all 0.5s;
3604
- display: inline-flex;
3605
  }
3606
- @media (prefers-reduced-motion: reduce) {
3607
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner {
3608
- transition: none;
3609
- }
3610
  }
3611
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon {
3612
- padding: 0.5em;
3613
- transition: all 0.5s;
3614
- font-size: 30px;
3615
- line-height: 1;
3616
- color: #37368e;
 
 
 
 
 
 
 
3617
  text-align: center;
3618
- display: inline-flex;
3619
- display: flex;
3620
- align-items: center;
3621
- justify-content: center;
3622
- }
3623
- @media (prefers-reduced-motion: reduce) {
3624
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon {
3625
- transition: none;
3626
- }
3627
- }
3628
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i {
3629
- width: 1em;
3630
- height: 1em;
3631
  position: relative;
3632
- display: block;
3633
  }
3634
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i:before {
 
 
3635
  position: absolute;
3636
- left: 50%;
3637
- transform: translateX(-50%);
3638
- }
3639
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-img {
3640
- font-size: 8px;
3641
- line-height: 1;
3642
- max-width: inherit;
3643
- }
3644
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box {
3645
- margin: 0 0 0 20px;
3646
- }
3647
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-title {
3648
- margin-top: -2px;
3649
- line-height: 1.5em;
3650
- }
3651
- .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-content {
3652
- padding: 0;
3653
- margin: 0;
3654
- font-size: 14px;
3655
- line-height: 1.5em;
3656
  }
3657
- .elementor-widget-eael-feature-list .eael-feature-list-items.stacked .eael-feature-list-icon-box .eael-feature-list-icon {
3658
- color: #fff;
 
 
3659
  }
3660
- .elementor-widget-eael-feature-list .eael-feature-list-items.framed .eael-feature-list-icon-box .eael-feature-list-icon {
3661
- background-color: #fff;
 
 
 
 
 
 
 
3662
  }
3663
- .elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner {
3664
- border-radius: 50%;
 
 
 
3665
  }
3666
- .elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner .eael-feature-list-icon {
3667
- border-radius: 50%;
 
 
 
3668
  }
3669
- .elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon-inner {
3670
- transform: rotate(45deg);
3671
- margin: 15px;
 
 
3672
  }
3673
- .elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon i {
3674
- transform: rotate(-45deg);
 
 
 
3675
  }
3676
- .elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon img {
3677
- transform: rotate(-45deg);
 
 
 
 
 
3678
  }
3679
- .elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-content-box .eael-feature-list-title {
3680
- margin-top: 15px;
 
 
3681
  }
3682
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item {
3683
- padding: 0 0 0 50px;
3684
  position: relative;
 
3685
  }
3686
- @media (max-width: 767px) {
3687
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item {
3688
- padding: 0 0 0 30px;
3689
- display: block;
3690
- }
3691
- }
3692
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before, .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after {
3693
- content: "";
3694
  position: absolute;
3695
- display: block;
3696
- }
3697
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before {
3698
  left: 0;
3699
  top: 0;
3700
- z-index: 1;
3701
- border-left: 1px solid #000;
3702
- border-right: none !important;
3703
  height: 100%;
 
 
 
 
 
3704
  }
3705
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after {
3706
- left: 5px;
3707
- top: 30px;
3708
- width: 23px;
3709
- display: block;
3710
- z-index: 2;
3711
- border-bottom: 1px dashed #000;
3712
- border-top: none !important;
3713
- }
3714
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item .connector {
3715
- display: none;
3716
- }
3717
- @media (min-width: 768px) {
3718
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item {
3719
- padding: 0 50px 0 0;
3720
- }
3721
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:before {
3722
- left: auto;
3723
- right: 0;
3724
- }
3725
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:after {
3726
- left: auto;
3727
- right: 5px;
3728
- top: 30px;
3729
- }
3730
- .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item .connector {
3731
- display: none;
3732
- }
3733
- }
3734
- @media (min-width: 1025px) {
3735
- .elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-content-box {
3736
- margin-right: 0 !important;
3737
- margin-top: 0 !important;
3738
- margin-bottom: 0 !important;
3739
- }
3740
- .elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-content-box {
3741
- margin-left: 0 !important;
3742
- margin-top: 0 !important;
3743
- margin-bottom: 0 !important;
3744
- }
3745
- .elementor-widget-eael-feature-list.-icon-position-top .eael-feature-list-content-box {
3746
- margin-left: 0 !important;
3747
- margin-right: 0 !important;
3748
- margin-bottom: 0 !important;
3749
- }
3750
- .elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item {
3751
- display: flex;
3752
- }
3753
- .elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item {
3754
- text-align: left;
3755
- flex-direction: row;
3756
- }
3757
- .elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item {
3758
- text-align: right;
3759
- flex-direction: row-reverse;
3760
- }
3761
- }
3762
- @media (max-width: 1024px) {
3763
- .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 {
3764
- display: flex;
3765
- }
3766
- .elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item {
3767
- text-align: left;
3768
- flex-direction: row;
3769
- }
3770
- .elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item {
3771
- text-align: right;
3772
- flex-direction: row-reverse;
3773
- }
3774
  }
3775
- @media (min-width: 768px) and (max-width: 1024px) {
3776
- .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 {
3777
- margin-right: 0 !important;
3778
- margin-top: 0 !important;
3779
- margin-bottom: 0 !important;
3780
- }
3781
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3782
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3783
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3784
- .eael-feature-list-item {
3785
- padding: 0 0 0 50px;
3786
- }
3787
  }
3788
- @media (min-width: 768px) and (max-width: 1024px) and (max-width: 767px) {
3789
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3790
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3791
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3792
- .eael-feature-list-item {
3793
- padding: 0 0 0 30px;
3794
- }
3795
  }
3796
- @media (min-width: 768px) and (max-width: 1024px) {
3797
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3798
- .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3799
- .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3800
- .eael-feature-list-item:before {
3801
- left: 0;
3802
- right: auto;
3803
- }
3804
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3805
- .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3806
- .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
3807
- .eael-feature-list-item:after {
3808
- left: 5px;
3809
- top: 30px;
3810
- }
3811
- .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 {
3812
- margin-left: 0 !important;
3813
- margin-right: 0 !important;
3814
- margin-bottom: 0 !important;
3815
- }
3816
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3817
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3818
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3819
- .eael-feature-list-item {
3820
- padding: 0 0 0 50px;
3821
- }
3822
  }
3823
- @media (min-width: 768px) and (max-width: 1024px) and (max-width: 767px) {
3824
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3825
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3826
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3827
- .eael-feature-list-item {
3828
- padding: 0 0 0 30px;
3829
- }
3830
  }
3831
- @media (min-width: 768px) and (max-width: 1024px) {
3832
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3833
- .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3834
- .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3835
- .eael-feature-list-item:before {
3836
- left: 0;
3837
- right: auto;
3838
- }
3839
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3840
- .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3841
- .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
3842
- .eael-feature-list-item:after {
3843
- left: 5px;
3844
- }
3845
- .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 {
3846
- margin-left: 0 !important;
3847
- margin-top: 0 !important;
3848
- margin-bottom: 0 !important;
3849
- }
3850
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3851
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3852
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3853
- .eael-feature-list-item {
3854
- padding: 0 50px 0 0;
3855
- }
3856
  }
3857
- @media (min-width: 768px) and (max-width: 1024px) and (max-width: 767px) {
3858
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3859
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3860
- .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3861
- .eael-feature-list-item {
3862
- padding: 0 30px 0 0;
3863
- }
3864
  }
3865
- @media (min-width: 768px) and (max-width: 1024px) {
3866
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3867
- .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3868
- .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3869
- .eael-feature-list-item:before {
3870
- right: 0;
3871
- left: auto;
3872
- }
3873
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3874
- .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3875
- .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
3876
- .eael-feature-list-item:after {
3877
- left: auto;
3878
- right: 5px;
3879
- }
3880
  }
3881
- @media (max-width: 767px) {
3882
- .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 {
3883
- display: block;
3884
- text-align: left;
3885
- }
3886
- .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 {
3887
- display: flex;
3888
- }
3889
- .elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item {
3890
- text-align: left;
3891
- flex-direction: row;
3892
- }
3893
- .elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item {
3894
- text-align: right;
3895
- flex-direction: row-reverse;
3896
- }
3897
- .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 {
3898
- margin-right: 0 !important;
3899
- margin-top: 0 !important;
3900
- margin-bottom: 0 !important;
3901
- }
3902
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern
3903
- .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
3904
- .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
3905
- .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
3906
- .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
3907
- .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
3908
- .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
3909
- .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
3910
- .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
3911
- .eael-feature-list-item {
3912
- padding: 0 0 0 50px;
3913
- }
3914
  }
3915
- @media (max-width: 767px) and (max-width: 767px) {
3916
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern
3917
- .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
3918
- .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
3919
- .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
3920
- .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
3921
- .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
3922
- .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
3923
- .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
3924
- .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
3925
- .eael-feature-list-item {
3926
- padding: 0 0 0 30px;
3927
- }
3928
  }
3929
- @media (max-width: 767px) {
3930
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern
3931
- .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
3932
- .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
3933
- .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
3934
- .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
3935
- .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
3936
- .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
3937
- .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
3938
- .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
3939
- .eael-feature-list-item:before {
3940
- left: 0;
3941
- right: auto;
3942
- }
3943
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern
3944
- .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
3945
- .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
3946
- .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
3947
- .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
3948
- .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
3949
- .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
3950
- .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
3951
- .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
3952
- .eael-feature-list-item:after {
3953
- left: 5px;
3954
- }
3955
- .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 {
3956
- margin-left: 0 !important;
3957
- margin-right: 0 !important;
3958
- margin-bottom: 0 !important;
3959
- }
3960
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern
3961
- .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
3962
- .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
3963
- .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
3964
- .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
3965
- .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
3966
- .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
3967
- .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
3968
- .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
3969
- .eael-feature-list-item {
3970
- padding: 0 0 0 50px;
3971
- }
3972
  }
3973
- @media (max-width: 767px) and (max-width: 767px) {
3974
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern
3975
- .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
3976
- .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
3977
- .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
3978
- .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
3979
- .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
3980
- .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
3981
- .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
3982
- .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
3983
- .eael-feature-list-item {
3984
- padding: 0 0 0 30px;
3985
- }
3986
  }
3987
- @media (max-width: 767px) {
3988
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern
3989
- .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
3990
- .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
3991
- .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
3992
- .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
3993
- .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
3994
- .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
3995
- .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
3996
- .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
3997
- .eael-feature-list-item:before {
3998
- left: 0;
3999
- right: auto;
4000
- }
4001
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern
4002
- .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
4003
- .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
4004
- .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
4005
- .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
4006
- .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
4007
- .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
4008
- .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
4009
- .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
4010
- .eael-feature-list-item:after {
4011
- left: 5px;
4012
- }
4013
- .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 {
4014
- margin-left: 0 !important;
4015
- margin-top: 0 !important;
4016
- margin-bottom: 0 !important;
4017
- }
4018
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern
4019
- .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
4020
- .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
4021
- .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
4022
- .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
4023
- .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
4024
- .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
4025
- .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
4026
- .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
4027
- .eael-feature-list-item {
4028
- padding: 0 50px 0 0;
4029
- }
4030
  }
4031
- @media (max-width: 767px) and (max-width: 767px) {
4032
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern
4033
- .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
4034
- .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
4035
- .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
4036
- .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
4037
- .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
4038
- .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
4039
- .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
4040
- .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
4041
- .eael-feature-list-item {
4042
- padding: 0 30px 0 0;
4043
- }
4044
  }
4045
- @media (max-width: 767px) {
4046
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern
4047
- .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
4048
- .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
4049
- .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
4050
- .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
4051
- .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
4052
- .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
4053
- .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
4054
- .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
4055
- .eael-feature-list-item:before {
4056
- right: 0;
4057
- left: auto;
4058
- }
4059
- .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern
4060
- .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
4061
- .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
4062
- .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
4063
- .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
4064
- .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
4065
- .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
4066
- .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
4067
- .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
4068
- .eael-feature-list-item:after {
4069
- left: auto;
4070
- right: 5px;
4071
- }
4072
  }
4073
 
4074
  /*---------------------------*/
688
  }
689
  }
690
 
691
+ @-webkit-keyframes "loaderSpin" {
692
+ 0% {
693
+ transform: rotate(0deg);
694
+ }
695
+ 100% {
696
+ transform: rotate(360deg);
697
+ }
698
+ }
699
+ @keyframes "loaderSpin" {
700
+ 0% {
701
+ transform: rotate(0deg);
702
+ }
703
+ 100% {
704
+ transform: rotate(360deg);
705
+ }
706
+ }
707
+ .eael-button-wrap,
708
+ .eael-load-more-button-wrap {
709
+ display: flex;
710
+ }
711
+
712
+ .eael-button,
713
+ .eael-load-more-button {
714
+ display: flex !important;
715
+ align-items: center;
716
+ justify-content: center;
717
+ padding: 1em 2em;
718
+ border: 0px solid;
719
+ font-size: 16px;
720
+ overflow: hidden;
721
+ }
722
+ .eael-button > span,
723
+ .eael-load-more-button > span {
724
+ margin-left: -20px;
725
+ }
726
+ .eael-button .eael-btn-loader,
727
+ .eael-load-more-button .eael-btn-loader {
728
+ border-radius: 50%;
729
+ width: 20px;
730
+ height: 20px;
731
+ font-size: 10px;
732
+ position: relative;
733
+ text-indent: -9999em;
734
+ border-top: 4px solid rgba(255, 255, 255, 0.2);
735
+ border-right: 4px solid rgba(255, 255, 255, 0.2);
736
+ border-bottom: 4px solid rgba(255, 255, 255, 0.2);
737
+ border-left: 4px solid #ffffff;
738
+ transform: translateZ(0);
739
+ -webkit-animation: loaderSpin 1.1s infinite linear;
740
+ animation: loaderSpin 1.1s infinite linear;
741
+ left: -100%;
742
+ top: auto;
743
+ margin-right: 5px;
744
+ transition: all 0.2s;
745
+ }
746
+ .eael-button .eael-btn-loader:after,
747
+ .eael-load-more-button .eael-btn-loader:after {
748
+ border-radius: 50%;
749
+ width: 20px;
750
+ height: 20px;
751
+ }
752
+ .eael-button.button--loading > span,
753
+ .eael-load-more-button.button--loading > span {
754
+ margin-left: 0;
755
+ }
756
+ .eael-button.button--loading .eael-btn-loader,
757
+ .eael-load-more-button.button--loading .eael-btn-loader {
758
+ left: 0;
759
+ }
760
+
761
  /*--------------------------------*/
762
  /* 11. Contact Form 7 Styles
763
  /*--------------------------------*/
851
  font-weight: normal;
852
  }
853
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
854
  .eael-ticker-wrap {
855
  overflow: hidden;
856
  display: flex;
914
  justify-content: center;
915
  }
916
 
917
+ /*---------------------------------*/
918
+ /* 05. Countdown Styles
919
+ /*---------------------------------*/
920
+ /*--- General ---*/
921
+ .eael-countdown-items {
922
+ list-style: none;
923
+ margin: 0;
924
+ padding: 0;
925
+ display: table;
926
+ table-layout: fixed;
927
+ width: 100%;
928
+ }
929
+
930
+ .eael-countdown-items > li {
931
+ list-style: none;
932
+ margin: 0;
933
+ padding: 0;
934
+ display: table-cell;
935
+ position: relative;
936
+ }
937
+
938
+ .eael-countdown-item > div {
939
+ text-align: center;
940
+ padding: 20px;
941
+ }
942
+
943
+ .eael-countdown-label-block .eael-countdown-digits,
944
+ .eael-countdown-label-block .eael-countdown-label {
945
+ display: block;
946
+ text-align: center;
947
+ }
948
+
949
+ .eael-countdown-digits {
950
+ font-size: 54px;
951
+ line-height: 1;
952
+ }
953
+
954
+ .eael-countdown-label {
955
+ font-size: 18px;
956
+ line-height: 1;
957
+ color: #ffffff;
958
+ }
959
+
960
+ .eael-countdown-show-separator .eael-countdown-digits::after {
961
+ content: ":";
962
+ position: absolute;
963
+ left: 98%;
964
+ z-index: 9999;
965
+ }
966
+
967
+ .eael-countdown-item:last-child .eael-countdown-digits::after {
968
+ display: none;
969
+ }
970
+
971
+ /*--- Style 1 ---*/
972
+ .eael-countdown-items.style-1 .eael-countdown-item > div {
973
+ background: #262625;
974
+ }
975
+
976
  /*--------------------------------*/
977
  /* 08. Creative Button styles
978
  /*--------------------------------*/
1228
  margin-left: 5px;
1229
  }
1230
 
1231
+ @charset "UTF-8";
1232
+ table.eael-data-table thead .sorting_asc,
1233
+ table.eael-data-table thead .sorting_desc,
1234
+ table.eael-data-table thead .sorting {
1235
+ position: relative;
1236
+ z-index: 0;
1237
+ outline: 0;
1238
+ cursor: pointer;
 
 
 
1239
  }
1240
 
1241
+ table.eael-data-table thead .sorting_asc:after,
1242
+ table.eael-data-table thead .sorting_desc:after,
1243
+ table.eael-data-table thead .sorting:after {
1244
+ position: absolute;
1245
+ top: 50%;
1246
+ right: 10px;
1247
+ font-family: "FontAwesome";
1248
+ color: #fff;
1249
+ z-index: 1;
1250
+ transform: translateY(-50%);
1251
  }
1252
 
1253
+ .eael-data-table-wrap .eael-data-tables_wrapper {
1254
+ display: flex;
1255
+ flex-flow: row wrap;
1256
+ justify-content: flex-start;
1257
+ width: 100%;
1258
  }
1259
 
1260
+ .eael-data-table-wrap .eael-data-tables_filter {
1261
+ flex-grow: 1;
1262
+ flex-basis: 50%;
1263
+ text-align: right;
1264
  }
1265
 
1266
+ .eael-data-table-wrap .eael-data-tables_filter label {
1267
+ font-weight: 700;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1268
  }
1269
 
1270
  .eael-data-table-wrap .eael-data-tables_filter label input[type="search"] {
2450
  padding: 10px 25px;
2451
  }
2452
 
2453
+ /*----------------------------*/
2454
+ /* 35. Feature List
2455
+ /*----------------------------*/
2456
+ .elementor-widget-eael-feature-list.-icon-position-left .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, .elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:before {
2457
+ top: 3px !important;
2458
  }
2459
+ .elementor-widget-eael-feature-list.-icon-position-left .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, .elementor-widget-eael-feature-list.-icon-position-right .connector-type-modern.rhombus .eael-feature-list-item:after {
2460
+ top: 45px !important;
 
 
2461
  }
2462
+ .elementor-widget-eael-feature-list.-icon-position-right .connector, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .connector {
2463
+ right: 0;
2464
+ left: calc(100% - 70px);
 
 
2465
  }
2466
+ .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 {
2467
+ padding: 0 50px 0 0;
 
 
 
 
 
 
 
2468
  }
2469
+ @media (max-width: 767px) {
2470
+ .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 {
2471
+ padding: 0 30px 0 0;
2472
+ }
 
 
2473
  }
2474
+ .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 {
2475
+ left: auto;
2476
+ right: 0;
 
 
 
 
2477
  }
2478
+ .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 {
2479
+ left: auto;
2480
+ right: 5px;
2481
+ top: 30px;
2482
  }
2483
+ .elementor-widget-eael-feature-list .eael-feature-list-items {
2484
+ list-style-type: none;
2485
+ margin: 0;
2486
+ padding: 0;
 
2487
  }
2488
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item {
2489
+ position: relative;
 
 
 
2490
  }
2491
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .connector {
2492
+ display: block;
2493
  position: absolute;
2494
+ width: 0;
2495
+ margin: 0 auto;
 
 
2496
  z-index: 1;
2497
+ height: 100%;
2498
+ top: 0.5em;
2499
+ font-size: 60px;
2500
+ left: 0;
2501
+ right: calc(100% - 60px);
2502
+ border-left: 2px solid #2ecc71;
2503
+ border-right: none !important;
2504
  }
2505
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item:last-child .connector {
 
2506
  display: none;
2507
  }
2508
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box {
2509
+ z-index: 2;
2510
+ transition: all 0.5s;
2511
+ }
2512
+ @media (prefers-reduced-motion: reduce) {
2513
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box {
2514
+ transition: none;
2515
+ }
2516
+ }
2517
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner {
2518
+ background-color: #37368e;
2519
+ transition: all 0.5s;
2520
+ display: inline-flex;
2521
+ }
2522
+ @media (prefers-reduced-motion: reduce) {
2523
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon-inner {
2524
+ transition: none;
2525
+ }
2526
+ }
2527
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon {
2528
+ padding: 0.5em;
2529
+ transition: all 0.5s;
2530
+ font-size: 30px;
2531
+ line-height: 1;
2532
+ color: #37368e;
2533
+ text-align: center;
2534
+ display: inline-flex;
2535
  display: flex;
 
2536
  align-items: center;
2537
  justify-content: center;
 
 
 
 
 
 
2538
  }
2539
+ @media (prefers-reduced-motion: reduce) {
2540
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon {
2541
+ transition: none;
2542
+ }
2543
  }
2544
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i {
2545
+ width: 1em;
2546
+ height: 1em;
2547
+ position: relative;
2548
+ display: block;
2549
  }
2550
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-icon i:before {
2551
+ position: absolute;
2552
+ left: 50%;
2553
+ transform: translateX(-50%);
 
2554
  }
2555
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-icon-box .eael-feature-list-img {
2556
+ font-size: 8px;
2557
+ line-height: 1;
2558
+ max-width: inherit;
2559
  }
2560
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box {
2561
+ margin: 0 0 0 20px;
 
 
2562
  }
2563
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-title {
2564
+ margin-top: -2px;
2565
+ line-height: 1.5em;
 
2566
  }
2567
+ .elementor-widget-eael-feature-list .eael-feature-list-items .eael-feature-list-item .eael-feature-list-content-box .eael-feature-list-content {
2568
+ padding: 0;
2569
+ margin: 0;
2570
+ font-size: 14px;
2571
+ line-height: 1.5em;
2572
  }
2573
+ .elementor-widget-eael-feature-list .eael-feature-list-items.stacked .eael-feature-list-icon-box .eael-feature-list-icon {
2574
+ color: #fff;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2575
  }
2576
+ .elementor-widget-eael-feature-list .eael-feature-list-items.framed .eael-feature-list-icon-box .eael-feature-list-icon {
2577
+ background-color: #fff;
 
 
2578
  }
2579
+ .elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner {
 
 
 
 
 
 
2580
  border-radius: 50%;
 
 
 
 
 
 
 
 
 
 
2581
  }
2582
+ .elementor-widget-eael-feature-list .eael-feature-list-items.circle .eael-feature-list-icon-box .eael-feature-list-icon-inner .eael-feature-list-icon {
2583
+ border-radius: 50%;
 
2584
  }
2585
+ .elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon-inner {
2586
+ transform: rotate(45deg);
2587
+ margin: 15px;
2588
  }
2589
+ .elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon i {
2590
+ transform: rotate(-45deg);
 
 
 
2591
  }
2592
+ .elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-icon-box .eael-feature-list-icon img {
2593
+ transform: rotate(-45deg);
 
2594
  }
2595
+ .elementor-widget-eael-feature-list .eael-feature-list-items.rhombus .eael-feature-list-content-box .eael-feature-list-title {
2596
+ margin-top: 15px;
 
 
2597
  }
2598
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item {
2599
+ padding: 0 0 0 50px;
2600
  position: relative;
 
 
 
 
 
 
 
 
 
 
2601
  }
2602
+ @media (max-width: 767px) {
2603
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item {
2604
+ padding: 0 0 0 30px;
2605
+ display: block;
2606
+ }
 
 
2607
  }
2608
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before, .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after {
2609
+ content: "";
2610
+ position: absolute;
2611
+ display: block;
2612
  }
2613
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:before {
2614
+ left: 0;
2615
+ top: 0;
2616
+ z-index: 1;
2617
+ border-left: 1px solid #000;
2618
+ border-right: none !important;
2619
+ height: 100%;
2620
  }
2621
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item:after {
2622
+ left: 5px;
2623
+ top: 30px;
2624
+ width: 23px;
2625
+ display: block;
2626
+ z-index: 2;
2627
+ border-bottom: 1px dashed #000;
2628
+ border-top: none !important;
2629
  }
2630
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern .eael-feature-list-item .connector {
2631
+ display: none;
 
2632
  }
2633
+ @media (min-width: 768px) {
2634
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item {
2635
+ padding: 0 50px 0 0;
2636
+ }
2637
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:before {
2638
+ left: auto;
2639
+ right: 0;
2640
+ }
2641
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item:after {
2642
+ left: auto;
2643
+ right: 5px;
2644
+ top: 30px;
2645
+ }
2646
+ .elementor-widget-eael-feature-list .eael-feature-list-items.connector-type-modern.-icon-position-right .eael-feature-list-item .connector {
2647
+ display: none;
2648
+ }
2649
  }
2650
+ @media (min-width: 1025px) {
2651
+ .elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-content-box {
2652
+ margin-right: 0 !important;
2653
+ margin-top: 0 !important;
2654
+ margin-bottom: 0 !important;
2655
+ }
2656
+ .elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-content-box {
2657
+ margin-left: 0 !important;
2658
+ margin-top: 0 !important;
2659
+ margin-bottom: 0 !important;
2660
+ }
2661
+ .elementor-widget-eael-feature-list.-icon-position-top .eael-feature-list-content-box {
2662
+ margin-left: 0 !important;
2663
+ margin-right: 0 !important;
2664
+ margin-bottom: 0 !important;
2665
+ }
2666
+ .elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item {
2667
+ display: flex;
2668
+ }
2669
+ .elementor-widget-eael-feature-list.-icon-position-left .eael-feature-list-item {
2670
+ text-align: left;
2671
+ flex-direction: row;
2672
+ }
2673
+ .elementor-widget-eael-feature-list.-icon-position-right .eael-feature-list-item {
2674
+ text-align: right;
2675
+ flex-direction: row-reverse;
2676
+ }
2677
  }
2678
+ @media (max-width: 1024px) {
2679
+ .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 {
2680
+ display: flex;
2681
+ }
2682
+ .elementor-widget-eael-feature-list.-tablet-icon-position-left .eael-feature-list-item {
2683
+ text-align: left;
2684
+ flex-direction: row;
2685
+ }
2686
+ .elementor-widget-eael-feature-list.-tablet-icon-position-right .eael-feature-list-item {
2687
+ text-align: right;
2688
+ flex-direction: row-reverse;
2689
+ }
2690
  }
2691
+ @media (min-width: 768px) and (max-width: 1024px) {
2692
+ .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 {
2693
+ margin-right: 0 !important;
2694
+ margin-top: 0 !important;
2695
+ margin-bottom: 0 !important;
2696
+ }
2697
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2698
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2699
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2700
+ .eael-feature-list-item {
2701
+ padding: 0 0 0 50px;
2702
+ }
2703
  }
2704
+ @media (min-width: 768px) and (max-width: 1024px) and (max-width: 767px) {
2705
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2706
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2707
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2708
+ .eael-feature-list-item {
2709
+ padding: 0 0 0 30px;
2710
+ }
2711
  }
2712
+ @media (min-width: 768px) and (max-width: 1024px) {
2713
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2714
+ .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2715
+ .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2716
+ .eael-feature-list-item:before {
2717
+ left: 0;
2718
+ right: auto;
2719
+ }
2720
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2721
+ .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2722
+ .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-left .eael-feature-list-items.connector-type-modern
2723
+ .eael-feature-list-item:after {
2724
+ left: 5px;
2725
+ top: 30px;
2726
+ }
2727
+ .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 {
2728
+ margin-left: 0 !important;
2729
+ margin-right: 0 !important;
2730
+ margin-bottom: 0 !important;
2731
+ }
2732
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2733
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2734
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2735
+ .eael-feature-list-item {
2736
+ padding: 0 0 0 50px;
2737
+ }
2738
  }
2739
+ @media (min-width: 768px) and (max-width: 1024px) and (max-width: 767px) {
2740
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2741
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2742
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2743
+ .eael-feature-list-item {
2744
+ padding: 0 0 0 30px;
2745
+ }
2746
+ }
2747
+ @media (min-width: 768px) and (max-width: 1024px) {
2748
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2749
+ .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2750
+ .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2751
+ .eael-feature-list-item:before {
2752
+ left: 0;
2753
+ right: auto;
2754
+ }
2755
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2756
+ .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2757
+ .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-top .eael-feature-list-items.connector-type-modern
2758
+ .eael-feature-list-item:after {
2759
+ left: 5px;
2760
+ }
2761
+ .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 {
2762
+ margin-left: 0 !important;
2763
+ margin-top: 0 !important;
2764
+ margin-bottom: 0 !important;
2765
+ }
2766
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2767
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2768
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2769
+ .eael-feature-list-item {
2770
+ padding: 0 50px 0 0;
2771
+ }
2772
+ }
2773
+ @media (min-width: 768px) and (max-width: 1024px) and (max-width: 767px) {
2774
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2775
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2776
+ .eael-feature-list-item, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2777
+ .eael-feature-list-item {
2778
+ padding: 0 30px 0 0;
2779
+ }
2780
+ }
2781
+ @media (min-width: 768px) and (max-width: 1024px) {
2782
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2783
+ .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2784
+ .eael-feature-list-item:before, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2785
+ .eael-feature-list-item:before {
2786
+ right: 0;
2787
+ left: auto;
2788
+ }
2789
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2790
+ .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-right.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2791
+ .eael-feature-list-item:after, .elementor-widget-eael-feature-list.-icon-position-top.-tablet-icon-position-right .eael-feature-list-items.connector-type-modern
2792
+ .eael-feature-list-item:after {
2793
+ left: auto;
2794
+ right: 5px;
2795
+ }
2796
+ }
2797
+ @media (max-width: 767px) {
2798
+ .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 {
2799
+ display: block;
2800
+ text-align: left;
2801
+ }
2802
+ .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 {
2803
+ display: flex;
2804
+ }
2805
+ .elementor-widget-eael-feature-list.-mobile-icon-position-left .eael-feature-list-item {
2806
+ text-align: left;
2807
+ flex-direction: row;
2808
+ }
2809
+ .elementor-widget-eael-feature-list.-mobile-icon-position-right .eael-feature-list-item {
2810
+ text-align: right;
2811
+ flex-direction: row-reverse;
2812
+ }
2813
+ .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 {
2814
+ margin-right: 0 !important;
2815
+ margin-top: 0 !important;
2816
+ margin-bottom: 0 !important;
2817
+ }
2818
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern
2819
+ .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
2820
+ .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
2821
+ .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
2822
+ .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
2823
+ .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
2824
+ .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
2825
+ .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
2826
+ .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
2827
+ .eael-feature-list-item {
2828
+ padding: 0 0 0 50px;
2829
+ }
2830
+ }
2831
+ @media (max-width: 767px) and (max-width: 767px) {
2832
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern
2833
+ .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
2834
+ .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
2835
+ .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
2836
+ .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
2837
+ .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
2838
+ .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
2839
+ .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
2840
+ .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
2841
+ .eael-feature-list-item {
2842
+ padding: 0 0 0 30px;
2843
+ }
2844
+ }
2845
+ @media (max-width: 767px) {
2846
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern
2847
+ .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
2848
+ .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
2849
+ .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
2850
+ .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
2851
+ .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
2852
+ .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
2853
+ .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
2854
+ .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
2855
+ .eael-feature-list-item:before {
2856
+ left: 0;
2857
+ right: auto;
2858
+ }
2859
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-left .eael-feature-list-items.connector-type-modern
2860
+ .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
2861
+ .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
2862
+ .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
2863
+ .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
2864
+ .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
2865
+ .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
2866
+ .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
2867
+ .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
2868
+ .eael-feature-list-item:after {
2869
+ left: 5px;
2870
+ }
2871
+ .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 {
2872
+ margin-left: 0 !important;
2873
+ margin-right: 0 !important;
2874
+ margin-bottom: 0 !important;
2875
+ }
2876
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern
2877
+ .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
2878
+ .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
2879
+ .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
2880
+ .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
2881
+ .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
2882
+ .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
2883
+ .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
2884
+ .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
2885
+ .eael-feature-list-item {
2886
+ padding: 0 0 0 50px;
2887
+ }
2888
+ }
2889
+ @media (max-width: 767px) and (max-width: 767px) {
2890
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern
2891
+ .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
2892
+ .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
2893
+ .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
2894
+ .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
2895
+ .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
2896
+ .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
2897
+ .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
2898
+ .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
2899
+ .eael-feature-list-item {
2900
+ padding: 0 0 0 30px;
2901
+ }
2902
+ }
2903
+ @media (max-width: 767px) {
2904
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern
2905
+ .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
2906
+ .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
2907
+ .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
2908
+ .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
2909
+ .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
2910
+ .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
2911
+ .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
2912
+ .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
2913
+ .eael-feature-list-item:before {
2914
+ left: 0;
2915
+ right: auto;
2916
+ }
2917
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-top .eael-feature-list-items.connector-type-modern
2918
+ .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
2919
+ .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
2920
+ .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
2921
+ .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
2922
+ .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
2923
+ .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
2924
+ .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
2925
+ .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
2926
+ .eael-feature-list-item:after {
2927
+ left: 5px;
2928
+ }
2929
+ .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 {
2930
+ margin-left: 0 !important;
2931
+ margin-top: 0 !important;
2932
+ margin-bottom: 0 !important;
2933
+ }
2934
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern
2935
+ .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
2936
+ .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
2937
+ .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
2938
+ .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
2939
+ .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
2940
+ .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
2941
+ .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
2942
+ .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
2943
+ .eael-feature-list-item {
2944
+ padding: 0 50px 0 0;
2945
+ }
2946
+ }
2947
+ @media (max-width: 767px) and (max-width: 767px) {
2948
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern
2949
+ .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
2950
+ .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
2951
+ .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
2952
+ .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
2953
+ .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
2954
+ .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
2955
+ .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
2956
+ .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
2957
+ .eael-feature-list-item {
2958
+ padding: 0 30px 0 0;
2959
+ }
2960
+ }
2961
+ @media (max-width: 767px) {
2962
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern
2963
+ .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
2964
+ .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
2965
+ .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
2966
+ .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
2967
+ .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
2968
+ .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
2969
+ .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
2970
+ .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
2971
+ .eael-feature-list-item:before {
2972
+ right: 0;
2973
+ left: auto;
2974
+ }
2975
+ .elementor-widget-eael-feature-list.-icon-position-left.-tablet-icon-position-left.-mobile-icon-position-right .eael-feature-list-items.connector-type-modern
2976
+ .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
2977
+ .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
2978
+ .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
2979
+ .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
2980
+ .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
2981
+ .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
2982
+ .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
2983
+ .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
2984
+ .eael-feature-list-item:after {
2985
+ left: auto;
2986
+ right: 5px;
2987
+ }
2988
+ }
2989
+
2990
+ /*------------------------------*/
2991
+ /* 27. Filterable Gallery
2992
+ /*------------------------------*/
2993
+ .eael-filter-gallery-control {
2994
+ width: 100%;
2995
+ }
2996
+
2997
+ .eael-filter-gallery-control ul,
2998
+ .eael-filter-gallery-control ul li {
2999
+ text-align: center;
3000
+ }
3001
+
3002
+ .eael-filter-gallery-control ul {
3003
+ margin: 0px 0px 20px 0px;
3004
+ padding: 0px;
3005
+ text-align: center;
3006
+ }
3007
+
3008
+ .eael-filter-gallery-control {
3009
+ display: flex;
3010
+ flex-flow: 1 1 auto;
3011
+ align-items: center;
3012
+ justify-content: center;
3013
+ flex-flow: row wrap;
3014
+ padding: 0px;
3015
+ margin: 0px;
3016
+ }
3017
+
3018
+ .eael-filter-gallery-control ul li {
3019
+ list-style: none;
3020
+ font-size: 24px;
3021
+ display: inline-block;
3022
+ text-align: center;
3023
+ }
3024
+
3025
+ .eael-filter-gallery-control ul li a.control {
3026
+ font-family: 'Montserrat', sans-serif;
3027
+ font-size: 16px;
3028
+ font-weight: 600;
3029
+ padding: 10px 25px;
3030
+ margin: 10px 6px;
3031
+ }
3032
+
3033
+ .eael-filter-gallery-container {
3034
+ text-align: justify;
3035
+ font-size: 0.1px;
3036
+ }
3037
+
3038
+ .eael-filter-gallery-container:after {
3039
+ content: '';
3040
+ display: inline-block;
3041
+ width: 100%;
3042
+ }
3043
+
3044
+ .eael-filter-gallery-container:not(.eael-cards) .item:before {
3045
+ content: '';
3046
+ display: inline-block;
3047
+ padding-top: 56.25%;
3048
+ }
3049
+
3050
+ .eael-filter-gallery-container .item .caption {
3051
+ position: absolute;
3052
+ display: flex;
3053
+ flex-flow: 1 1 100%;
3054
+ align-items: center;
3055
+ justify-content: center;
3056
+ z-index: 1;
3057
+ top: 0px;
3058
+ left: 0px;
3059
+ right: 0px;
3060
+ bottom: 0px;
3061
+ transition: transform .4s;
3062
+ }
3063
+
3064
+ .eael-filter-gallery-container.eael-cards .item .caption {
3065
+ display: none;
3066
+ }
3067
+
3068
+ .eael-filter-gallery-container.eael-cards .item .item-img .caption {
3069
+ position: absolute;
3070
+ display: flex;
3071
+ flex-flow: 1 1 100%;
3072
+ align-items: center;
3073
+ justify-content: center;
3074
+ z-index: 10;
3075
+ top: 0px;
3076
+ left: 0px;
3077
+ right: 0px;
3078
+ bottom: 0px;
3079
+ transition: transform .4s;
3080
+ }
3081
+
3082
+ .gallery-item-caption-over {
3083
+ width: 100%;
3084
+ height: auto;
3085
+ }
3086
+
3087
+ a.eael-gallery-load-more, a.eael-gallery-load-more:hover {
3088
+ text-decoration: none;
3089
+ }
3090
+
3091
+ /*--- Caption Animation ---*/
3092
+ .eael-filter-gallery-container .item .caption.eael-zoom-in,
3093
+ .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-zoom-in {
3094
+ transform: scale(0);
3095
+ }
3096
+
3097
+ .eael-filter-gallery-container .item:hover .caption.eael-zoom-in,
3098
+ .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-zoom-in {
3099
+ transform: scale(1);
3100
+ }
3101
+
3102
+ .eael-filter-gallery-container .item .caption.eael-slide-left,
3103
+ .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-left {
3104
+ transform: translateX(-100%);
3105
+ }
3106
+
3107
+ .eael-filter-gallery-container .item:hover .caption.eael-slide-left,
3108
+ .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-left {
3109
+ transform: translateX(0%);
3110
+ }
3111
+
3112
+ .eael-filter-gallery-container .item .caption.eael-slide-right,
3113
+ .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-right {
3114
+ transform: translateX(100%);
3115
+ }
3116
+
3117
+ .eael-filter-gallery-container .item:hover .caption.eael-slide-right,
3118
+ .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-right {
3119
+ transform: translateX(0%);
3120
+ }
3121
+
3122
+ .eael-filter-gallery-container .item .caption.eael-slide-top,
3123
+ .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-top {
3124
+ transform: translateY(-100%);
3125
+ }
3126
+
3127
+ .eael-filter-gallery-container .item:hover .caption.eael-slide-top,
3128
+ .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-top {
3129
+ transform: translateY(0%);
3130
+ }
3131
+
3132
+ .eael-filter-gallery-container .item .caption.eael-slide-bottom,
3133
+ .eael-filter-gallery-container.eael-cards .item .item-img .caption.eael-slide-bottom {
3134
+ transform: translateY(100%);
3135
+ }
3136
+
3137
+ .eael-filter-gallery-container .item:hover .caption.eael-slide-bottom,
3138
+ .eael-filter-gallery-container.eael-cards .item:hover .item-img .caption.eael-slide-bottom {
3139
+ transform: translateY(0%);
3140
+ }
3141
+
3142
+ .eael-filter-gallery-container .item .caption a {
3143
+ display: inline-block;
3144
+ width: 50px;
3145
+ height: 50px;
3146
+ text-align: center;
3147
+ line-height: 50px;
3148
+ border-radius: 50%;
3149
+ margin: 0 5px;
3150
+ font-size: 20px;
3151
+ cursor: pointer;
3152
+ transition: .3s;
3153
+ }
3154
+
3155
+ .eael-filter-gallery-container .item .caption a:nth-child(1),
3156
+ .eael-container .item .caption a:nth-child(2) {
3157
+ transition: .6s;
3158
+ opacity: 0;
3159
+ }
3160
+
3161
+ .eael-filter-gallery-container .item .caption a:nth-child(1) {
3162
+ transform: translateY(-100%);
3163
+ }
3164
+
3165
+ .eael-filter-gallery-container .item .caption a:nth-child(2) {
3166
+ transform: translateY(100%);
3167
+ }
3168
+
3169
+ .eael-filter-gallery-container .item .caption:hover a:nth-child(1),
3170
+ .eael-filter-gallery-container .item .caption:hover a:nth-child(2) {
3171
+ transform: translateY(0%);
3172
+ opacity: 1;
3173
+ }
3174
+
3175
+ .eael-filter-gallery-container .item .caption .eael-popup-link {
3176
+ outline: 0;
3177
+ }
3178
+
3179
+ /*--- Filter Gallery Card Style ---*/
3180
+ .eael-filter-gallery-container.eael-cards .item:before {
3181
+ padding-top: 0px;
3182
+ }
3183
+
3184
+ .eael-filter-gallery-container.eael-cards .item-img {
3185
+ position: relative;
3186
+ background-repeat: no-repeat;
3187
+ background-position: center;
3188
+ background-size: cover;
3189
+ height: 220px;
3190
+ z-index: 0;
3191
+ overflow: hidden;
3192
+ }
3193
+
3194
+ .eael-filter-gallery-container.eael-cards .item-content {
3195
+ padding: 15px;
3196
+ }
3197
+
3198
+ .eael-filter-gallery-container.eael-cards .item-content .title,
3199
+ .eael-filter-gallery-container.eael-cards .item-content .title a {
3200
+ font-size: 20px;
3201
+ line-height: 1;
3202
+ margin-bottom: 0px;
3203
+ transition: .3s;
3204
+ }
3205
+
3206
+ .eael-filter-gallery-container.eael-cards .item-content p {
3207
+ font-size: 14px;
3208
+ line-height: 26px;
3209
+ }
3210
+
3211
+ .eael-fg-card-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over {
3212
+ text-align: center;
3213
+ }
3214
+
3215
+ .eael-fg-card-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over {
3216
+ text-align: right;
3217
+ }
3218
+
3219
+ .eael-fg-hoverer-content-align-center .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over {
3220
+ text-align: center;
3221
+ }
3222
+
3223
+ .eael-fg-hoverer-content-align-right .eael-filterable-gallery-item-wrap .gallery-item-caption-wrap .gallery-item-caption-over {
3224
+ text-align: right;
3225
+ }
3226
+
3227
+ /*--- Editor Specific Style ---*/
3228
+ .eael-fg-content-align-left .eael-cards .item .item-content {
3229
+ text-align: left;
3230
+ }
3231
+
3232
+ .eael-fg-content-align-center .eael-cards .item .item-content {
3233
+ text-align: center;
3234
+ }
3235
+
3236
+ .eael-fg-content-align-right .eael-cards .item .item-content {
3237
+ text-align: right;
3238
+ }
3239
+
3240
+ /*--- Magnific Gallery Fix ---*/
3241
+ .mfp-wrap ~ div.dialog-widget {
3242
+ display: none !important;
3243
+ }
3244
+
3245
+ .eael-filterable-gallery-item-wrap {
3246
+ float: left;
3247
+ width: 33.33%;
3248
+ }
3249
+
3250
  .eael-filter-gallery-container.eael-col-1 .eael-filterable-gallery-item-wrap {
3251
  width: 100%;
3252
  }
3788
  margin-right: 0 !important;
3789
  }
3790
 
3791
+ .elementor-element.elementor-grid-mobile-5 .eael-filterable-gallery-item-wrap:nth-of-type(5n+1) {
3792
+ clear: left;
3793
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3794
 
3795
+ .elementor-element.elementor-grid-mobile-6 {
3796
+ position: relative;
3797
+ }
3798
 
3799
+ .elementor-element.elementor-grid-mobile-6 .pp-logo-grid {
3800
+ margin-right: -6px;
3801
+ }
3802
 
3803
+ .elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap {
3804
+ width: 16%;
3805
+ float: left;
3806
+ }
3807
+
3808
+ .elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n) {
3809
+ margin-right: 0 !important;
3810
+ }
3811
+
3812
+ .elementor-element.elementor-grid-mobile-6 .eael-filterable-gallery-item-wrap:nth-of-type(6n+1) {
3813
+ clear: left;
3814
+ }
3815
+ }
3816
+ /* ------------- Layout 3 Style ----------------- */
3817
+ .fg-layout-3-filter-controls {
3818
+ margin: 0;
3819
+ padding: 0;
3820
+ list-style: none;
3821
  }
3822
 
3823
+ .fg-layout-3-item-content {
3824
+ text-align: center;
 
3825
  }
3826
 
3827
+ .fg-layout-3-item-content .fg-item-title {
 
 
 
 
 
 
 
 
 
3828
  font-size: 18px;
3829
+ line-height: 1;
3830
+ font-weight: 500;
3831
+ margin: 0;
3832
+ transition: 300ms;
3833
  }
3834
 
3835
+ .fg-layout-3-item-content .fg-item-content p {
3836
+ font-size: 13px;
3837
+ font-weight: 400;
 
 
 
3838
  }
3839
 
3840
+ .fg-filter-wrap {
3841
  position: relative;
3842
+ flex-basis: 30%;
3843
  }
3844
 
3845
+ .fg-layout-3-filter-controls {
3846
  position: absolute;
3847
  left: 0;
3848
+ background: #fff;
3849
+ z-index: 999;
3850
+ width: 150px;
 
 
 
 
 
 
 
 
3851
  visibility: hidden;
3852
  opacity: 0;
3853
  transition: 300ms;
3854
+ width: 100%;
3855
+ border-radius: 5px;
3856
+ padding-top: 7px;
3857
  }
3858
 
3859
+ .fg-layout-3-filter-controls.open-filters {
3860
  visibility: visible;
3861
  opacity: 1;
3862
  }
3863
 
3864
+ .fg-layout-3-filter-controls li.control {
3865
+ padding: 5px 5px 5px 10px;
 
 
 
 
3866
  cursor: pointer;
3867
+ transition: 300ms;
3868
+ font-size: 14px;
3869
+ color: #7f8995;
3870
+ font-weight: normal;
3871
  }
3872
 
3873
+ .fg-layout-3-filter-controls li.control:hover {
3874
+ color: #2d425a;
3875
  }
3876
 
3877
+ .fg-layout-3-filter-controls li.control:first-child {
3878
+ border-top: 0px solid;
 
3879
  }
3880
 
3881
+ .fg-layout-3-filter-controls li.control:last-child {
3882
+ border-bottom: 0px solid;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3883
  }
3884
+
3885
+ .fg-layout-3-filters-wrap {
3886
+ max-width: 600px;
3887
+ margin: 15px auto 50px;
3888
  }
3889
+
3890
+ .fg-filter-wrap button {
3891
+ width: 100%;
3892
+ border: 0px solid;
3893
+ border-radius: 0px;
3894
+ padding: 17px 13px;
3895
+ font-size: 14px;
3896
+ color: #2d425a;
3897
+ background: #f7f8ff;
3898
+ height: 55px;
3899
+ border-right: 1px solid #abb5ff;
3900
+ border-radius: 10px 0px 0 10px;
3901
+ outline: none;
3902
  text-align: center;
 
 
 
 
 
 
 
 
 
 
 
 
 
3903
  position: relative;
 
3904
  }
3905
+
3906
+ .fg-filter-wrap button > i {
3907
+ font-size: 18px;
3908
  position: absolute;
3909
+ top: 50%;
3910
+ transform: translateY(-50%);
3911
+ margin-left: 10px;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3912
  }
3913
+
3914
+ .fg-layout-3-search-box {
3915
+ flex-basis: 70%;
3916
+ height: 100%;
3917
  }
3918
+
3919
+ .fg-layout-3-search-box input[type="text"] {
3920
+ width: 100%;
3921
+ height: 100%;
3922
+ margin: 0;
3923
+ padding: 15px;
3924
+ border: 0px solid;
3925
+ outline: none;
3926
+ background: none;
3927
  }
3928
+
3929
+ .fg-layout-3-search-box input[type="text"]::-webkit-input-placeholder {
3930
+ /* Chrome/Opera/Safari */
3931
+ color: #7f8995;
3932
+ font-size: 13px;
3933
  }
3934
+
3935
+ .fg-layout-3-search-box input[type="text"]::-moz-placeholder {
3936
+ /* Firefox 19+ */
3937
+ color: #7f8995;
3938
+ font-size: 13px;
3939
  }
3940
+
3941
+ .fg-layout-3-search-box input[type="text"]:-ms-input-placeholder {
3942
+ /* IE 10+ */
3943
+ color: #7f8995;
3944
+ font-size: 13px;
3945
  }
3946
+
3947
+ .fg-layout-3-search-box input[type="text"]:-moz-placeholder {
3948
+ /* Firefox 18- */
3949
+ color: #7f8995;
3950
+ font-size: 13px;
3951
  }
3952
+
3953
+ .fg-layout-3-filters-wrap {
3954
+ height: 55px;
3955
+ border-radius: 5px;
3956
+ display: flex;
3957
+ flex-wrap: wrap;
3958
+ align-items: center;
3959
  }
3960
+
3961
+ .fg-layout-3-filters-wrap .fg-layout-3-search-box {
3962
+ background: #f7f8ff;
3963
+ border-radius: 0 10px 10px 0;
3964
  }
3965
+
3966
+ .fg-layout-3-item-thumb {
3967
  position: relative;
3968
+ overflow: hidden;
3969
  }
3970
+
3971
+ .fg-layout-3-item-thumb .gallery-item-buttons {
3972
+ text-align: center;
 
 
 
 
 
3973
  position: absolute;
 
 
 
3974
  left: 0;
3975
  top: 0;
 
 
 
3976
  height: 100%;
3977
+ width: 100%;
3978
+ display: flex;
3979
+ align-items: center;
3980
+ justify-content: center;
3981
+ z-index: 4;
3982
  }
3983
+
3984
+ .fg-layout-3-item-content {
3985
+ padding: 27px 27px 30px;
3986
+ text-align: center;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3987
  }
3988
+
3989
+ .eael-fg-card-content-align-left .fg-layout-3-item-content {
3990
+ text-align: left;
 
 
 
 
 
 
 
 
 
3991
  }
3992
+
3993
+ .eael-fg-card-content-align-center .fg-layout-3-item-content {
3994
+ text-align: center;
 
 
 
 
3995
  }
3996
+
3997
+ .eael-fg-card-content-align-right .fg-layout-3-item-content {
3998
+ text-align: right;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3999
  }
4000
+
4001
+ .eael-filterable-gallery-item-wrap .fg-layout-3-item.eael-gallery-grid-item {
4002
+ box-shadow: 0px 0px 30px 0px rgba(3, 29, 60, 0.05);
4003
+ border-radius: 5px;
 
 
 
4004
  }
4005
+
4006
+ .fg-caption-head {
4007
+ position: absolute;
4008
+ left: 0;
4009
+ top: 0;
4010
+ width: 100%;
4011
+ display: flex;
4012
+ justify-content: space-between;
4013
+ padding: 35px 35px;
4014
+ z-index: 3;
4015
+ color: #fff;
4016
+ font-size: 18px;
4017
+ font-weight: 700;
 
 
 
 
 
 
 
 
 
 
 
 
4018
  }
4019
+
4020
+ .fg-item-category > span {
4021
+ font-size: 12px;
4022
+ color: #fff;
4023
+ background: #fa9196;
4024
+ padding: 10px 12px;
4025
+ display: inline-block;
4026
  }
4027
+
4028
+ .fg-layout-3-item-content {
4029
+ position: relative;
 
 
 
 
 
 
 
 
 
 
 
 
4030
  }
4031
+
4032
+ .fg-item-category {
4033
+ position: absolute;
4034
+ left: 0;
4035
+ top: 0;
4036
+ text-align: center;
4037
+ width: 100%;
4038
+ height: 30px;
4039
+ margin-top: -15px;
4040
+ z-index: 11;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4041
  }
4042
+
4043
+ .fg-item-category span {
4044
+ border-radius: 5px;
4045
+ line-height: 1;
4046
+ visibility: hidden;
4047
+ opacity: 0;
4048
+ transition: 300ms;
 
 
 
 
 
 
4049
  }
4050
+
4051
+ .fg-layout-3-item.eael-gallery-grid-item:hover .fg-item-category span {
4052
+ visibility: visible;
4053
+ opacity: 1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4054
  }
4055
+
4056
+ .mfp-iframe-holder .mfp-close,
4057
+ .mfp-image-holder .mfp-close {
4058
+ width: auto;
 
 
 
 
 
 
 
 
 
4059
  }
4060
+
4061
+ .mfp-zoom-out-cur .mfp-image-holder .mfp-close {
4062
+ cursor: pointer;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4063
  }
4064
+
4065
+ .mfp-zoom-out-cur .mfp-image-holder .mfp-close:hover {
4066
+ text-decoration: none;
 
 
 
 
 
 
 
 
 
 
4067
  }
4068
+
4069
+ button.mfp-close:not(.toggle),
4070
+ button.mfp-arrow:not(.toggle) {
4071
+ background: transparent;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
4072
  }
4073
 
4074
  /*---------------------------*/
assets/front-end/css/eael.min.css CHANGED
@@ -2,8 +2,8 @@
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;overflow:hidden}.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;flex-flow:row wrap}.eael-advance-tabs .eael-tabs-nav>ul li{flex:1 1 auto}.responsive-vertical-layout.eael-advance-tabs .eael-tabs-nav>ul li{flex:1 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
  .ea-advanced-data-table-wrap .ea-advanced-data-table-wrap-inner{width:100%;overflow-y:auto}.ea-advanced-data-table-wrap .ea-advanced-data-table{width:100%;border-collapse:collapse}.ea-advanced-data-table-wrap .ea-advanced-data-table td,.ea-advanced-data-table-wrap .ea-advanced-data-table th{background-color:transparent!important}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th{position:relative;cursor:pointer}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th:before{content:"";border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:5px solid #4d4d4d;position:absolute;top:50%;right:15px;margin-top:-6px}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th:after{content:"";border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid #4d4d4d;position:absolute;top:50%;right:15px;margin-top:1px}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th.asc:before{display:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th.asc:after{margin-top:-3px}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th.desc:before{margin-top:-3px}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th.desc:after{display:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-unsortable th{pointer-events:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-unsortable th:after,.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-unsortable th:before{display:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-paginated tbody tr{display:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th{position:relative}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th:before{border:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th:after{content:"";display:block;height:100%;position:absolute;right:0;top:0;width:10px;border:none;cursor:col-resize}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable td,.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th{padding:0}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable td textarea,.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th textarea{width:100%;min-width:100px;height:100%;background-color:transparent;border:none;box-shadow:none;resize:none;margin:0;padding:0;outline:0;vertical-align:middle}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable.ea-advanced-data-table-paginated tbody tr{display:table-row}.ea-advanced-data-table-wrap .ea-advanced-data-table .nt_add_cart_wrapper{text-align:center}.ea-advanced-data-table-wrap .ea-advanced-data-table .button{display:block;white-space:nowrap}.ea-advanced-data-table-wrap .ea-advanced-data-table-search-wrap.ea-advanced-data-table-search-center{text-align:center}.ea-advanced-data-table-wrap .ea-advanced-data-table-search-wrap.ea-advanced-data-table-search-right{text-align:right}.ea-advanced-data-table-wrap .ea-advanced-data-table-pagination a{display:inline-block}
5
- .eael-call-to-action{width:100%;height:auto;display:block;padding:30px;font-size:16px;color:#4d4d4d;font-weight:400;line-height:27px;margin:0 auto}.eael-call-to-action p{margin-bottom:10px}.eael-call-to-action .title{font-size:36px;font-weight:600;line-height:36px;margin-bottom:10px;text-transform:capitalize;font-style:normal}.eael-call-to-action.cta-center{text-align:center}.eael-call-to-action.cta-right{text-align:right}.eael-call-to-action.cta-left{text-align:left}.eael-call-to-action.bg-lite{background:#f4f4f4}.eael-call-to-action.bg-img{background-image:url(../img/bg.jpg);background-repeat:no-repeat;background-position:center;background-size:cover;position:relative;z-index:0;color:rgba(255,255,255,.7)}.eael-call-to-action.bg-img .icon{color:#fff}.eael-cta-overlay-yes .eael-call-to-action.bg-img:after{content:"";position:absolute;width:100%;height:100%;top:0;left:0;z-index:-1;background:rgba(0,0,0,.8)}.eael-call-to-action.bg-img.bg-fixed{background-attachment:fixed;background-position:center center}.eael-call-to-action.bg-img .title{color:rgba(255,255,255,.9)}.eael-call-to-action.cta-flex,.eael-call-to-action.cta-icon-flex{display:flex;justify-content:space-between;align-items:flex-start}.eael-call-to-action.cta-icon-flex .icon{flex-grow:1;font-size:80px;text-align:left;line-height:130px}.eael-call-to-action.cta-icon-flex .action{flex-grow:1;text-align:right;padding-top:22px;flex-basis:22%}.eael-call-to-action.cta-icon-flex .content{flex-grow:1;padding:0 30px}.eael-call-to-action.cta-flex .content{padding:0 15px;flex-grow:1}.eael-call-to-action.cta-flex .action{flex-grow:1;text-align:right;padding-top:25px;flex-basis:23%}.eael-call-to-action .cta-button{position:relative;display:inline-block;padding:12px 30px;background:#f9f9f9;font-size:16px;text-decoration:none;color:#4d4d4d;transition:.5s;-ms-box-shadow:0 0 3px -1px rgba(0,0,0,.2);box-shadow:0 0 3px -1px rgba(0,0,0,.2);margin-right:10px;margin-top:10px;z-index:0;overflow:hidden}.eael-call-to-action .cta-button:last-child{margin-right:0}.eael-call-to-action .cta-button:focus{outline:0}.eael-call-to-action .cta-button:hover{color:#fff;background:#3f51b5;-ms-box-shadow:0 1px 12px 1px rgba(0,0,0,.1);box-shadow:0 1px 12px 1px rgba(0,0,0,.1)}.eael-call-to-action .cta-button.effect-1:after{content:"";position:absolute;width:100%;height:100%;background:#3f51b5;top:0;left:0;transform:translateY(-100%);-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);z-index:-1;transition:.5s;color:#fff}.eael-call-to-action .cta-button.effect-1:hover::after{transform:translateY(0)}.eael-call-to-action .cta-button.effect-2:after{content:"";position:absolute;width:100%;height:100%;background:#3f51b5;top:0;left:0;z-index:-1;transition:.5s;color:#fff;transform:translateX(-100%)}.eael-call-to-action .cta-button.effect-2:hover::after{transform:translateX(0)}@media only screen and (max-width:768px){.eael-call-to-action.cta-flex,.eael-call-to-action.cta-icon-flex{flex-wrap:wrap}.eael-call-to-action .title{font-size:28px;line-height:36px;margin-top:0}.eael-call-to-action.cta-icon-flex .icon{flex-grow:1;font-size:48px;line-height:90px;text-align:center}.eael-call-to-action.cta-flex .content,.eael-call-to-action.cta-icon-flex .content{flex-grow:1;text-align:center;padding:0}.eael-call-to-action.cta-flex .action,.eael-call-to-action.cta-icon-flex .action{text-align:center;padding-top:0}.eael-call-to-action .cta-button{padding:12px 25px}}@media only screen and (max-width:360px){.eael-call-to-action{font-size:14px;line-height:26px}.eael-call-to-action .cta-button{padding:4px 20px;font-size:12px}.eael-call-to-action .title{font-size:20px;line-height:30px}}
6
  .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%}
 
7
  @-webkit-keyframes loaderSpin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes loaderSpin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.eael-button-wrap,.eael-load-more-button-wrap{display:flex}.eael-button,.eael-load-more-button{display:flex!important;align-items:center;justify-content:center;padding:1em 2em;border:0 solid;font-size:16px;overflow:hidden}.eael-button>span,.eael-load-more-button>span{margin-left:-20px}.eael-button .eael-btn-loader,.eael-load-more-button .eael-btn-loader{border-radius:50%;width:20px;height:20px;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;transform:translateZ(0);-webkit-animation:loaderSpin 1.1s infinite linear;animation:loaderSpin 1.1s infinite linear;left:-100%;top:auto;margin-right:5px;transition:all .2s}.eael-button .eael-btn-loader:after,.eael-load-more-button .eael-btn-loader:after{border-radius:50%;width:20px;height:20px}.eael-button.button--loading>span,.eael-load-more-button.button--loading>span{margin-left:0}.eael-button.button--loading .eael-btn-loader,.eael-load-more-button.button--loading .eael-btn-loader{left:0}
8
  .eael-contact-form-7.eael-contact-form-btn-align-center input.wpcf7-submit{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-7.eael-contact-form-btn-align-left input.wpcf7-submit{float:left;width:auto}.eael-contact-form-7.eael-contact-form-btn-align-right input.wpcf7-submit{float:right;width:auto}.eael-contact-form-7 .uneditable-input,.eael-contact-form-7 input[type=color],.eael-contact-form-7 input[type=date],.eael-contact-form-7 input[type=datetime-local],.eael-contact-form-7 input[type=datetime],.eael-contact-form-7 input[type=email],.eael-contact-form-7 input[type=month],.eael-contact-form-7 input[type=number],.eael-contact-form-7 input[type=password],.eael-contact-form-7 input[type=search],.eael-contact-form-7 input[type=tel],.eael-contact-form-7 input[type=text],.eael-contact-form-7 input[type=time],.eael-contact-form-7 input[type=url],.eael-contact-form-7 input[type=week],.eael-contact-form-7 textarea{transition:border linear .2s,box-shadow linear .2s}.eael-contact-form-7 .wpcf7-form::after,.eael-contact-form-7 .wpcf7-form::before{content:" ";clear:both;display:table}.eael-contact-form-7 .wpcf7-form:after{clear:both;content:"";font-size:0;height:0;display:block;visibility:hidden}.eael-contact-form-7.labels-hide .wpcf7-form label{display:none}.eael-contact-form-7-title{margin-bottom:10px}.eael-contact-form-7-description{margin-bottom:20px}.eael-contact-form-7-button-full-width .wpcf7-form-control.wpcf7-submit{width:100%}.wpcf7 form>div,.wpcf7 form>p{margin-bottom:20px}.eael-contact-form-7 .wpcf7-form p{margin-bottom:20px}.eael-contact-form-7 .wpcf7-form p span.wpcf7-form-control-wrap{margin-bottom:0}.eael-contact-form-7 .wpcf7-form label span.wpcf7-list-item-label{font-family:inherit;font-weight:400}.eael-contact-form-7 .wpcf7-form p input.wpcf7-submit{font-family:inherit;font-weight:400}
9
  .eael-ticker-wrap{overflow:hidden;display:flex;flex-flow:row nowrap;align-items:center;width:100%}.eael-ticker-wrap .ticker-badge{flex:0 0 auto;padding:8px 12px}.eael-ticker-wrap .eael-ticker{overflow:hidden;flex:1 1 auto}.eael-ticker-wrap .eael-ticker .ticker-content{padding:8px 12px;line-height:1.8}.eael-ticker-wrap .eael-ticker .ticker-content p{margin:0}.eael-ticker-wrap .swiper-button-prev{left:auto!important;right:25px}.eael-ticker-wrap div.swiper-slide,.eael-ticker-wrap div.swiper-slide.swiper-slide-next,.eael-ticker-wrap div.swiper-slide.swiper-slide-prev{opacity:0!important}.eael-ticker-wrap div.swiper-slide.swiper-slide-active{opacity:1!important}.eael-ticker-wrap .eael-content-ticker.swiper-container .swiper-slide{text-align:left}@media only screen and (max-width:767px){.eael-ticker-wrap{flex-flow:row wrap}.content-ticker-pagination{display:none}}.eael-ticker-wrap .swiper-button-next,.eael-ticker-wrap .swiper-button-prev{background-image:none;outline:0;display:flex;align-items:center;justify-content:center}
@@ -35,15 +35,15 @@ body div.mfp-bg{top:0;left:0;width:100%;height:100%;z-index:1042;overflow:hidden
35
  .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:hidden}.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)}.plyr__progress input[type=range]::-webkit-slider-runnable-track,.plyr__volume input[type=range]::-webkit-slider-runnable-track{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}.plyr__progress input[type=range]::-moz-range-track,.plyr__volume input[type=range]::-moz-range-track{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}
36
  html{scroll-behavior:smooth}.eael-toc{z-index:9999;width:300px;display:none}.eael-toc .eael-toc-button{display:none}.eael-toc .eael-toc-not-found{color:#a94442}.eael-toc.eael-toc-disable{display:none}.eael-toc.eael-sticky{position:fixed;top:100px;background:0 0;display:block}.eael-toc.collapsed{width:unset!important;box-shadow:none!important;border:none!important}.eael-toc.collapsed .eael-toc-body,.eael-toc.collapsed .eael-toc-close,.eael-toc.collapsed .eael-toc-header{display:none}.eael-toc.collapsed.eael-bottom-to-top .eael-toc-button{transform:rotate(-90deg);transform-origin:top left;margin-top:100%}.eael-toc.collapsed .eael-toc-button{position:relative;display:inline-block;font-size:80%!important;font-weight:400;text-align:center;text-decoration:none;text-transform:none;color:#fff;background:#ff7d50;padding:10px 20px;border-radius:3px;border:none;transform:rotate(90deg);transform-origin:bottom left;cursor:pointer}.eael-toc.collapsed .eael-toc-button:focus{outline:0}.eael-toc.collapsed .eael-toc-button i{margin-right:10px}.eael-toc.eael-toc-right{right:0}.eael-toc.eael-toc-right .eael-toc-close{left:-11px}.eael-toc.eael-toc-right.eael-bottom-to-top .eael-toc-button{transform:rotate(-90deg);transform-origin:bottom right;margin-top:-100%}.eael-toc.eael-toc-right .eael-toc-button{transform:rotate(90deg);transform-origin:top right;margin-top:100%}.eael-toc .eael-toc-header{position:relative;background:#ff7d50;padding:12px 30px}.eael-toc .eael-toc-header .eael-toc-title{font-size:18px;font-weight:400;letter-spacing:.1px;color:#fff;margin:0;padding:0}.eael-toc .eael-toc-header .eael-toc-title:before{content:none}.eael-toc .eael-toc-header .eael-toc-close{position:absolute;width:28px;height:28px;background:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19);right:-9px;top:-11px;border-radius:20px;font-family:serif;font-size:20px;font-weight:700;line-height:28px;text-align:center;color:#ff7d50;cursor:pointer;padding:0;margin:0;border:0}.eael-toc .eael-toc-body{padding:12px 30px;background:#fff6f3;min-width:20vh;max-height:50vh;overflow-y:scroll}.eael-toc .eael-toc-body::-webkit-scrollbar{width:6px}.eael-toc .eael-toc-body::-webkit-scrollbar-thumb{background:#aaa;border-radius:10px}.eael-toc .eael-toc-body ul.eael-toc-list{margin:0;padding:0;list-style:none}.eael-toc .eael-toc-body ul.eael-toc-list li ul{margin:0;padding:0;margin-left:20px;list-style:none}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-bullet li:before{content:"";position:relative;display:inline-block;width:8px;height:8px;border-radius:50%;background-color:#ff7d50;margin-right:8px;top:-2px}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number{counter-reset:counter}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li{counter-increment:counter}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li:before{content:counters(counter,".") " "}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li ul{counter-reset:counter}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li ul li{counter-increment:counter}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li ul li:before{content:counters(counter,".") " "}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-list-arrow li.eael-highlight-active>a:before{content:"";position:absolute;left:0;z-index:999999;border-bottom:10px solid #ff7d50;border-left:5px solid transparent;border-right:5px solid transparent;transform:rotate(90deg);margin-top:10px}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-list-bar li.eael-highlight-active>a:after{content:"";position:absolute;right:0;height:30px;width:2px;background:#ff7d50;z-index:999999}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-collapse :not(.eael-highlight-parent) ul{display:none}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-word-wrap li a{display:inline-flex}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-word-wrap li a span{width:140px!important;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media only screen and (max-width:767px){.eael-toc.eael-toc-mobile-hide{display:none!important}}
37
  .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}
38
- .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}
39
  .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%}}span.eael-tooltip-content,span.eael-tooltip-content a{width:100%;display:block;text-align:center}.eael-tooltip-text-align-left .eael-tooltip-content a,.eael-tooltip-text-align-left .eael-tooltip-text{text-align:left}.eael-tooltip-text-align-right .eael-tooltip-content a,.eael-tooltip-text-align-right .eael-tooltip-text{text-align:right}.eael-tooltip-text-align-center .eael-tooltip-content a,.eael-tooltip-text-align-center .eael-tooltip-text{text-align:center}.eael-tooltip-text-align-justify .eael-tooltip-content a,.eael-tooltip-text-align-justify .eael-tooltip-text{text-align:justify}
40
  .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}
 
41
  .eael-weform-container input,.eael-weform-container textarea{height:auto;padding:10px}.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-btn-align-left .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:left;width:auto}.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%}
42
  .ea-woo-checkout{font-size:14px;line-height:1.5em;font-weight:400}.ea-woo-checkout .woocommerce #ship-to-different-address span,.ea-woo-checkout .woocommerce h3{font-size:25px;line-height:1.5em;font-weight:600;margin-top:0;text-transform:capitalize}.ea-woo-checkout .woocommerce label{font-size:16px;line-height:1.5;font-weight:500}.ea-woo-checkout .woocommerce label.woocommerce-form__label-for-checkbox.checkbox{display:flex;align-items:center}.ea-woo-checkout .woocommerce .checkout li.wc_payment_method{border-bottom:none}.ea-woo-checkout .woocommerce .woo-checkout-coupon a,.ea-woo-checkout .woocommerce .woo-checkout-login a{color:#7866ff}.ea-woo-checkout .woocommerce .woo-checkout-coupon a :hover,.ea-woo-checkout .woocommerce .woo-checkout-login a :hover{color:#443d6d}.ea-woo-checkout .woocommerce .woo-checkout-coupon label,.ea-woo-checkout .woocommerce .woo-checkout-login label{margin-bottom:10px}.ea-woo-checkout .woocommerce .woo-checkout-coupon .input-text,.ea-woo-checkout .woocommerce .woo-checkout-coupon select,.ea-woo-checkout .woocommerce .woo-checkout-login .input-text,.ea-woo-checkout .woocommerce .woo-checkout-login select{border-radius:5px;background-color:#fff;padding:13px;border:1px solid transparent}.ea-woo-checkout .woocommerce .woo-checkout-coupon .input-text :active,.ea-woo-checkout .woocommerce .woo-checkout-coupon .input-text :hover,.ea-woo-checkout .woocommerce .woo-checkout-coupon select :active,.ea-woo-checkout .woocommerce .woo-checkout-coupon select :hover,.ea-woo-checkout .woocommerce .woo-checkout-login .input-text :active,.ea-woo-checkout .woocommerce .woo-checkout-login .input-text :hover,.ea-woo-checkout .woocommerce .woo-checkout-login select :active,.ea-woo-checkout .woocommerce .woo-checkout-login select :hover{border-color:inherit}.ea-woo-checkout .woocommerce .woo-checkout-coupon .input-text :focus,.ea-woo-checkout .woocommerce .woo-checkout-coupon select :focus,.ea-woo-checkout .woocommerce .woo-checkout-login .input-text :focus,.ea-woo-checkout .woocommerce .woo-checkout-login select :focus{outline:inherit;outline-offset:0}.ea-woo-checkout .woocommerce .woo-checkout-coupon .button,.ea-woo-checkout .woocommerce .woo-checkout-login .button{background-color:#7866ff;border-radius:5px;font-size:16px;line-height:1.5em;color:#fff;font-weight:400;margin:0;padding:13px 30px;border:none;text-transform:capitalize!important}.ea-woo-checkout .woocommerce .woo-checkout-coupon .button:hover,.ea-woo-checkout .woocommerce .woo-checkout-login .button:hover{text-decoration:none}.ea-woo-checkout .woocommerce .woo-checkout-login{border-radius:5px;background-color:#f1ebff;padding:30px;font-size:16px;line-height:1.5em;font-weight:400;margin-bottom:30px;position:relative;display:block}.ea-woo-checkout .woocommerce .woo-checkout-login .ea-login-icon{width:20px;position:absolute;top:20px;left:20px;font-size:20px}.ea-woo-checkout .woocommerce .woo-checkout-login .ea-login-icon i,.ea-woo-checkout .woocommerce .woo-checkout-login .ea-login-icon svg{width:1em;height:1em;position:relative;display:block}.ea-woo-checkout .woocommerce .woo-checkout-login .form-row-first{width:48.5%;float:left!important}.ea-woo-checkout .woocommerce .woo-checkout-login .form-row-last{float:right!important}.ea-woo-checkout .woocommerce .woo-checkout-login .clear{clear:both}.ea-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login{max-width:100%;margin:15px 0 0!important}.ea-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login p:first-child{margin-top:0}.ea-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login .woocommerce-form-login__submit{margin-right:30px}.ea-woo-checkout .woocommerce .woo-checkout-login .lost_password{margin-left:3px;margin-bottom:0}.ea-woo-checkout .woocommerce .woo-checkout-coupon .form-row-first{width:48.5%}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon{margin:15px 0 0!important;padding:20px;width:100%;text-align:left;border:1px solid inherit;border-radius:5px}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon p:first-child{margin:0 0 20px 0}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first{width:78%;float:left}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first input{border-radius:5px;box-shadow:0 12px 20px rgba(51,57,137,.1);background-color:#fff;height:50px}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first input :focus{outline:0;outline-offset:0}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-last{width:20%;margin-left:2%;float:right}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .clear{clear:both}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon p{margin-top:0}@media (max-width:1024px){.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first{width:50%}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-last{width:48%}}@media (max-width:767px){.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first,.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-last{width:100%}}.ea-woo-checkout .woocommerce .woo-checkout-coupon .lost_password{margin-bottom:0}.ea-woo-checkout .woocommerce h3#order_review_heading{float:none;width:100%}.ea-woo-checkout .woocommerce #customer_details.col2-set{width:100%!important;padding:0!important;float:none!important;margin:0 0 30px 0}.ea-woo-checkout .woocommerce #customer_details.col2-set h3{border:none;padding:0;font-size:25px}.ea-woo-checkout .woocommerce #customer_details.col2-set .col-1{padding-left:0;float:left!important;width:48%!important}.ea-woo-checkout .woocommerce #customer_details.col2-set .col-2{padding-right:0;float:right!important;width:48%!important}.ea-woo-checkout .woocommerce #customer_details.col2-set #ship-to-different-address label{display:flex;padding-top:0;padding-bottom:0}.ea-woo-checkout .woocommerce #customer_details.col2-set #ship-to-different-address label input{align-self:start;margin-top:9px;margin-right:10px}@media (max-width:767px){.ea-woo-checkout .woocommerce #customer_details.col2-set .col-1,.ea-woo-checkout .woocommerce #customer_details.col2-set .col-2{width:100%!important;float:none!important}}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review{margin-bottom:30px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table{padding:0;margin:0}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table li{display:flex;align-items:center;margin:0 0 12px 0}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-header{font-size:14px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-row{border-radius:3px;font-size:16px;font-weight:500;background-color:#fff}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-col-1{flex-basis:70%;max-width:70%}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-col-2{flex-basis:15%;max-width:15%;text-align:center}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-col-3{flex-basis:15%;max-width:15%;text-align:right;padding-right:25px!important}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-thum-name{align-items:center;display:flex}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-thum-name .product-thumbnail{width:65px;margin-right:15px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-thum-name .product-thumbnail img{display:block}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-quantity,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-total{padding:0 10px}@media all and (max-width:767px){.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table{overflow-y:auto}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-header,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-row{width:400px}}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer{display:flex;justify-content:space-between}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .back-to-shopping{margin:0 0 10px 0;text-transform:capitalize;font-size:15px;line-height:1.5em}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .back-to-shopping i{margin-right:5px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content{font-size:14px;border-radius:3px;padding:20px 25px;background-color:#fff;width:40%;font-weight:700;margin:0 0 0 auto}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content div:first-child{border:none}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content div:last-child{padding-bottom:0}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content label{font-size:inherit;font-weight:inherit;line-height:inherit}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content .woocommerce-remove-coupon{font-family:inherit;font-size:.7em;font-weight:inherit;line-height:inherit;transition:all .2s}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .cart-discount,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .cart-subtotal,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .order-total,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .shipping-area{display:flex;justify-content:space-between;border-top:1px solid inherit;padding:3px 0}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .woocommerce-shipping-methods{margin:0;padding:0;list-style:none}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .shipping-area #shipping_method li{margin-bottom:0}@media all and (max-width:1024px){.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content{width:40%}}@media all and (max-width:767px){.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer{flex-direction:column-reverse}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .back-to-shop{margin-top:15px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content{width:100%}}.eael-woo-checkout .woocommerce .woocommerce-error,.eael-woo-checkout .woocommerce .woocommerce-info,.eael-woo-checkout .woocommerce .woocommerce-message{border:0;border-radius:5px;text-align:left;background-color:transparent;text-transform:capitalize;padding:20px 20px 20px 50px;font-size:16px;line-height:1.5em;font-weight:400;margin-bottom:30px}.eael-woo-checkout .woocommerce .woocommerce-error::before,.eael-woo-checkout .woocommerce .woocommerce-info::before,.eael-woo-checkout .woocommerce .woocommerce-message::before{left:20px;top:20px;font-size:20px}.eael-woo-checkout .woocommerce .woocommerce-error a,.eael-woo-checkout .woocommerce .woocommerce-info a,.eael-woo-checkout .woocommerce .woocommerce-message a{box-shadow:none;text-transform:capitalize}.eael-woo-checkout .woocommerce .woocommerce-error{background-color:#fff3f5;color:#ff7e93}.eael-woo-checkout .woocommerce .woocommerce-info{background-color:#d1ecf1;color:#0c5460}.eael-woo-checkout .woocommerce .woocommerce-message{background-color:#d4edda;color:#155724}.eael-woo-checkout .woocommerce form.checkout_coupon{border:1px solid #404040}.eael-woo-checkout .woocommerce .woo-checkout-login.woo-checkout-login-editor{display:none!important}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-error,.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-info,.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-message{background-color:transparent!important;padding:0 0 0 40px!important;border:none!important;margin:0}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-error::before,.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-info::before,.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-message::before{left:20px;top:20px;font-size:20px}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-info{font-size:inherit;line-height:1.5em;font-weight:inherit;margin-bottom:0;display:block}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-info::before{content:none}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-info a{text-decoration:underline}.eael-woo-checkout .woocommerce .woo-checkout-coupon{border-radius:5px;background-color:#ebfaff;padding:30px;font-size:16px;line-height:1.5em;font-weight:400;margin-bottom:30px;position:relative;display:block}.eael-woo-checkout .woocommerce .woo-checkout-coupon .ea-coupon-icon{width:20px;position:absolute;top:20px;left:20px;font-size:20px}.eael-woo-checkout .woocommerce .woo-checkout-coupon .ea-coupon-icon i,.eael-woo-checkout .woocommerce .woo-checkout-coupon .ea-coupon-icon svg{width:1em;height:1em;position:relative;display:block}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-error,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-info,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-message{border-width:1px;border-style:solid;border-radius:3px;padding:10px 10px 10px 40px!important;margin:20px 0 0;color:inherit}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-error:before,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-info:before,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-message:before{left:10px;top:10px;color:inherit}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-error li,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-info li,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-message li{margin-left:0}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-error,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-message{background-color:transparent!important;padding:0 0 0 40px!important;border:none!important;margin:0}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-error::before,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info::before,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-message::before{left:20px;top:20px;font-size:20px}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info{font-size:inherit;line-height:1.5em;font-weight:inherit;margin-bottom:0;display:block}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info::before{content:none}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info a{text-decoration:underline}.eael-woo-checkout .woocommerce .woo-checkout-payment{clear:both}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods{padding:0 0 20px 0!important;margin:0;border:0}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods li:not(.woocommerce-notice){background-color:transparent}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method{margin:0;padding:0}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method>label{font-size:15px;padding:0;margin:0;display:inline-block;width:100%}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]{display:none}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]+label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:25px;position:relative}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]+label::before{transition:all 250ms cubic-bezier(.4,.25,.3,1);content:"";width:12px;height:12px;border-radius:50%;background-color:#b8b6ca;border:0 solid #fff;font-size:0;position:absolute;top:47%;left:0;transform:translateY(-50%)}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]+label::after{transition:all 250ms cubic-bezier(.4,.25,.3,1);content:"";width:0;height:0;border-radius:50%;background-color:#fff;position:absolute;top:47%;left:0;transform:translateY(-50%)}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]:checked+label::before{background-color:transparent;width:12px;height:12px;border-width:2px;border-color:#7362f0}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]:checked+label::after{width:6px;height:6px;left:3px;background-color:#fff}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .payment_box{border-radius:5px}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .payment_box p:first-child{margin:0!important}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .place-order{padding:20px 0 0 0;border-top:1px solid #fff}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .place-order p{margin-top:0}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .place-order a.woocommerce-privacy-policy-link{color:#fff;font-weight:600}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .place-order #place_order{width:auto;margin:0 0 0 auto;text-transform:capitalize;letter-spacing:unset}.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1{width:100%!important;float:none!important}@media (min-width:1024px){.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1 .woocommerce-billing-fields{float:left!important;width:48%!important;padding-right:2%}.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1 .woocommerce-account-fields,.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1 .woocommerce-additional-fields,.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1 .woocommerce-shipping-fields{float:left!important;width:48%!important;padding-left:2%}}.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-2{clear:both}.eael-woo-checkout.elementor-editor-active .woocommerce .woo-checkout-login.woo-checkout-login-editor{display:block!important}
43
  .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%}
 
44
  @charset "UTF-8";.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]{cursor:pointer}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4}.fc-event .fc-resizer{display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before{content:""}.fc-icon-chevron-right:before{content:""}.fc-icon-chevrons-left:before{content:""}.fc-icon-chevrons-right:before{content:""}.fc-icon-minus-square:before{content:""}.fc-icon-plus-square:before{content:""}.fc-icon-x:before{content:""}.fc-icon{display:inline-block;width:1em;height:1em;text-align:center}.fc-button{border-radius:0;overflow:visible;text-transform:none;margin:0;font-family:inherit;font-size:inherit;line-height:inherit}.fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc-button{-webkit-appearance:button}.fc-button:not(:disabled){cursor:pointer}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2c3e50;border-color:#2c3e50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2c3e50;border-color:#2c3e50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-button-group>.fc-button:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc-event .fc-resizer{display:none}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row{height:auto!important;min-height:0!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover{display:none}.fc-time-grid{min-height:0!important}.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-end:after{content:"..."}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}.fc button,.fc-button-group{display:none}}
45
  .fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px 0}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em}
46
  .fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt{float:right}.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee}
47
  @charset "UTF-8";.fc-timeGrid-view .fc-day-grid{position:relative;z-index:2}.fc-timeGrid-view .fc-day-grid .fc-row{min-height:3em}.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{position:relative;z-index:3}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-mirror-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-time-grid-event{margin-bottom:1px}.fc-time-grid-event-inset{-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event .fc-content{overflow:hidden;max-height:100%}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:" - "}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}
48
- @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}
49
  .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}
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;overflow:hidden}.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;flex-flow:row wrap}.eael-advance-tabs .eael-tabs-nav>ul li{flex:1 1 auto}.responsive-vertical-layout.eael-advance-tabs .eael-tabs-nav>ul li{flex:1 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
  .ea-advanced-data-table-wrap .ea-advanced-data-table-wrap-inner{width:100%;overflow-y:auto}.ea-advanced-data-table-wrap .ea-advanced-data-table{width:100%;border-collapse:collapse}.ea-advanced-data-table-wrap .ea-advanced-data-table td,.ea-advanced-data-table-wrap .ea-advanced-data-table th{background-color:transparent!important}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th{position:relative;cursor:pointer}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th:before{content:"";border-left:4px solid transparent;border-right:4px solid transparent;border-bottom:5px solid #4d4d4d;position:absolute;top:50%;right:15px;margin-top:-6px}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th:after{content:"";border-left:4px solid transparent;border-right:4px solid transparent;border-top:5px solid #4d4d4d;position:absolute;top:50%;right:15px;margin-top:1px}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th.asc:before{display:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th.asc:after{margin-top:-3px}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th.desc:before{margin-top:-3px}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-sortable th.desc:after{display:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-unsortable th{pointer-events:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-unsortable th:after,.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-unsortable th:before{display:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-paginated tbody tr{display:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th{position:relative}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th:before{border:none}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th:after{content:"";display:block;height:100%;position:absolute;right:0;top:0;width:10px;border:none;cursor:col-resize}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable td,.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th{padding:0}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable td textarea,.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable th textarea{width:100%;min-width:100px;height:100%;background-color:transparent;border:none;box-shadow:none;resize:none;margin:0;padding:0;outline:0;vertical-align:middle}.ea-advanced-data-table-wrap .ea-advanced-data-table.ea-advanced-data-table-editable.ea-advanced-data-table-paginated tbody tr{display:table-row}.ea-advanced-data-table-wrap .ea-advanced-data-table .nt_add_cart_wrapper{text-align:center}.ea-advanced-data-table-wrap .ea-advanced-data-table .button{display:block;white-space:nowrap}.ea-advanced-data-table-wrap .ea-advanced-data-table-search-wrap.ea-advanced-data-table-search-center{text-align:center}.ea-advanced-data-table-wrap .ea-advanced-data-table-search-wrap.ea-advanced-data-table-search-right{text-align:right}.ea-advanced-data-table-wrap .ea-advanced-data-table-pagination a{display:inline-block}
 
5
  .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%}
6
+ .eael-call-to-action{width:100%;height:auto;display:block;padding:30px;font-size:16px;color:#4d4d4d;font-weight:400;line-height:27px;margin:0 auto}.eael-call-to-action p{margin-bottom:10px}.eael-call-to-action .title{font-size:36px;font-weight:600;line-height:36px;margin-bottom:10px;text-transform:capitalize;font-style:normal}.eael-call-to-action.cta-center{text-align:center}.eael-call-to-action.cta-right{text-align:right}.eael-call-to-action.cta-left{text-align:left}.eael-call-to-action.bg-lite{background:#f4f4f4}.eael-call-to-action.bg-img{background-image:url(../img/bg.jpg);background-repeat:no-repeat;background-position:center;background-size:cover;position:relative;z-index:0;color:rgba(255,255,255,.7)}.eael-call-to-action.bg-img .icon{color:#fff}.eael-cta-overlay-yes .eael-call-to-action.bg-img:after{content:"";position:absolute;width:100%;height:100%;top:0;left:0;z-index:-1;background:rgba(0,0,0,.8)}.eael-call-to-action.bg-img.bg-fixed{background-attachment:fixed;background-position:center center}.eael-call-to-action.bg-img .title{color:rgba(255,255,255,.9)}.eael-call-to-action.cta-flex,.eael-call-to-action.cta-icon-flex{display:flex;justify-content:space-between;align-items:flex-start}.eael-call-to-action.cta-icon-flex .icon{flex-grow:1;font-size:80px;text-align:left;line-height:130px}.eael-call-to-action.cta-icon-flex .action{flex-grow:1;text-align:right;padding-top:22px;flex-basis:22%}.eael-call-to-action.cta-icon-flex .content{flex-grow:1;padding:0 30px}.eael-call-to-action.cta-flex .content{padding:0 15px;flex-grow:1}.eael-call-to-action.cta-flex .action{flex-grow:1;text-align:right;padding-top:25px;flex-basis:23%}.eael-call-to-action .cta-button{position:relative;display:inline-block;padding:12px 30px;background:#f9f9f9;font-size:16px;text-decoration:none;color:#4d4d4d;transition:.5s;-ms-box-shadow:0 0 3px -1px rgba(0,0,0,.2);box-shadow:0 0 3px -1px rgba(0,0,0,.2);margin-right:10px;margin-top:10px;z-index:0;overflow:hidden}.eael-call-to-action .cta-button:last-child{margin-right:0}.eael-call-to-action .cta-button:focus{outline:0}.eael-call-to-action .cta-button:hover{color:#fff;background:#3f51b5;-ms-box-shadow:0 1px 12px 1px rgba(0,0,0,.1);box-shadow:0 1px 12px 1px rgba(0,0,0,.1)}.eael-call-to-action .cta-button.effect-1:after{content:"";position:absolute;width:100%;height:100%;background:#3f51b5;top:0;left:0;transform:translateY(-100%);-webkit-transform:translateY(-100%);-ms-transform:translateY(-100%);z-index:-1;transition:.5s;color:#fff}.eael-call-to-action .cta-button.effect-1:hover::after{transform:translateY(0)}.eael-call-to-action .cta-button.effect-2:after{content:"";position:absolute;width:100%;height:100%;background:#3f51b5;top:0;left:0;z-index:-1;transition:.5s;color:#fff;transform:translateX(-100%)}.eael-call-to-action .cta-button.effect-2:hover::after{transform:translateX(0)}@media only screen and (max-width:768px){.eael-call-to-action.cta-flex,.eael-call-to-action.cta-icon-flex{flex-wrap:wrap}.eael-call-to-action .title{font-size:28px;line-height:36px;margin-top:0}.eael-call-to-action.cta-icon-flex .icon{flex-grow:1;font-size:48px;line-height:90px;text-align:center}.eael-call-to-action.cta-flex .content,.eael-call-to-action.cta-icon-flex .content{flex-grow:1;text-align:center;padding:0}.eael-call-to-action.cta-flex .action,.eael-call-to-action.cta-icon-flex .action{text-align:center;padding-top:0}.eael-call-to-action .cta-button{padding:12px 25px}}@media only screen and (max-width:360px){.eael-call-to-action{font-size:14px;line-height:26px}.eael-call-to-action .cta-button{padding:4px 20px;font-size:12px}.eael-call-to-action .title{font-size:20px;line-height:30px}}
7
  @-webkit-keyframes loaderSpin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}@keyframes loaderSpin{0%{transform:rotate(0)}100%{transform:rotate(360deg)}}.eael-button-wrap,.eael-load-more-button-wrap{display:flex}.eael-button,.eael-load-more-button{display:flex!important;align-items:center;justify-content:center;padding:1em 2em;border:0 solid;font-size:16px;overflow:hidden}.eael-button>span,.eael-load-more-button>span{margin-left:-20px}.eael-button .eael-btn-loader,.eael-load-more-button .eael-btn-loader{border-radius:50%;width:20px;height:20px;font-size:10px;position:relative;text-indent:-9999em;border-top:4px solid rgba(255,255,255,.2);border-right:4px solid rgba(255,255,255,.2);border-bottom:4px solid rgba(255,255,255,.2);border-left:4px solid #fff;transform:translateZ(0);-webkit-animation:loaderSpin 1.1s infinite linear;animation:loaderSpin 1.1s infinite linear;left:-100%;top:auto;margin-right:5px;transition:all .2s}.eael-button .eael-btn-loader:after,.eael-load-more-button .eael-btn-loader:after{border-radius:50%;width:20px;height:20px}.eael-button.button--loading>span,.eael-load-more-button.button--loading>span{margin-left:0}.eael-button.button--loading .eael-btn-loader,.eael-load-more-button.button--loading .eael-btn-loader{left:0}
8
  .eael-contact-form-7.eael-contact-form-btn-align-center input.wpcf7-submit{margin-left:auto!important;margin-right:auto!important;display:block;float:none}.eael-contact-form-7.eael-contact-form-btn-align-left input.wpcf7-submit{float:left;width:auto}.eael-contact-form-7.eael-contact-form-btn-align-right input.wpcf7-submit{float:right;width:auto}.eael-contact-form-7 .uneditable-input,.eael-contact-form-7 input[type=color],.eael-contact-form-7 input[type=date],.eael-contact-form-7 input[type=datetime-local],.eael-contact-form-7 input[type=datetime],.eael-contact-form-7 input[type=email],.eael-contact-form-7 input[type=month],.eael-contact-form-7 input[type=number],.eael-contact-form-7 input[type=password],.eael-contact-form-7 input[type=search],.eael-contact-form-7 input[type=tel],.eael-contact-form-7 input[type=text],.eael-contact-form-7 input[type=time],.eael-contact-form-7 input[type=url],.eael-contact-form-7 input[type=week],.eael-contact-form-7 textarea{transition:border linear .2s,box-shadow linear .2s}.eael-contact-form-7 .wpcf7-form::after,.eael-contact-form-7 .wpcf7-form::before{content:" ";clear:both;display:table}.eael-contact-form-7 .wpcf7-form:after{clear:both;content:"";font-size:0;height:0;display:block;visibility:hidden}.eael-contact-form-7.labels-hide .wpcf7-form label{display:none}.eael-contact-form-7-title{margin-bottom:10px}.eael-contact-form-7-description{margin-bottom:20px}.eael-contact-form-7-button-full-width .wpcf7-form-control.wpcf7-submit{width:100%}.wpcf7 form>div,.wpcf7 form>p{margin-bottom:20px}.eael-contact-form-7 .wpcf7-form p{margin-bottom:20px}.eael-contact-form-7 .wpcf7-form p span.wpcf7-form-control-wrap{margin-bottom:0}.eael-contact-form-7 .wpcf7-form label span.wpcf7-list-item-label{font-family:inherit;font-weight:400}.eael-contact-form-7 .wpcf7-form p input.wpcf7-submit{font-family:inherit;font-weight:400}
9
  .eael-ticker-wrap{overflow:hidden;display:flex;flex-flow:row nowrap;align-items:center;width:100%}.eael-ticker-wrap .ticker-badge{flex:0 0 auto;padding:8px 12px}.eael-ticker-wrap .eael-ticker{overflow:hidden;flex:1 1 auto}.eael-ticker-wrap .eael-ticker .ticker-content{padding:8px 12px;line-height:1.8}.eael-ticker-wrap .eael-ticker .ticker-content p{margin:0}.eael-ticker-wrap .swiper-button-prev{left:auto!important;right:25px}.eael-ticker-wrap div.swiper-slide,.eael-ticker-wrap div.swiper-slide.swiper-slide-next,.eael-ticker-wrap div.swiper-slide.swiper-slide-prev{opacity:0!important}.eael-ticker-wrap div.swiper-slide.swiper-slide-active{opacity:1!important}.eael-ticker-wrap .eael-content-ticker.swiper-container .swiper-slide{text-align:left}@media only screen and (max-width:767px){.eael-ticker-wrap{flex-flow:row wrap}.content-ticker-pagination{display:none}}.eael-ticker-wrap .swiper-button-next,.eael-ticker-wrap .swiper-button-prev{background-image:none;outline:0;display:flex;align-items:center;justify-content:center}
35
  .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:hidden}.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)}.plyr__progress input[type=range]::-webkit-slider-runnable-track,.plyr__volume input[type=range]::-webkit-slider-runnable-track{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}.plyr__progress input[type=range]::-moz-range-track,.plyr__volume input[type=range]::-moz-range-track{box-shadow:1px 1px 1px #000,0 0 1px #0d0d0d}
36
  html{scroll-behavior:smooth}.eael-toc{z-index:9999;width:300px;display:none}.eael-toc .eael-toc-button{display:none}.eael-toc .eael-toc-not-found{color:#a94442}.eael-toc.eael-toc-disable{display:none}.eael-toc.eael-sticky{position:fixed;top:100px;background:0 0;display:block}.eael-toc.collapsed{width:unset!important;box-shadow:none!important;border:none!important}.eael-toc.collapsed .eael-toc-body,.eael-toc.collapsed .eael-toc-close,.eael-toc.collapsed .eael-toc-header{display:none}.eael-toc.collapsed.eael-bottom-to-top .eael-toc-button{transform:rotate(-90deg);transform-origin:top left;margin-top:100%}.eael-toc.collapsed .eael-toc-button{position:relative;display:inline-block;font-size:80%!important;font-weight:400;text-align:center;text-decoration:none;text-transform:none;color:#fff;background:#ff7d50;padding:10px 20px;border-radius:3px;border:none;transform:rotate(90deg);transform-origin:bottom left;cursor:pointer}.eael-toc.collapsed .eael-toc-button:focus{outline:0}.eael-toc.collapsed .eael-toc-button i{margin-right:10px}.eael-toc.eael-toc-right{right:0}.eael-toc.eael-toc-right .eael-toc-close{left:-11px}.eael-toc.eael-toc-right.eael-bottom-to-top .eael-toc-button{transform:rotate(-90deg);transform-origin:bottom right;margin-top:-100%}.eael-toc.eael-toc-right .eael-toc-button{transform:rotate(90deg);transform-origin:top right;margin-top:100%}.eael-toc .eael-toc-header{position:relative;background:#ff7d50;padding:12px 30px}.eael-toc .eael-toc-header .eael-toc-title{font-size:18px;font-weight:400;letter-spacing:.1px;color:#fff;margin:0;padding:0}.eael-toc .eael-toc-header .eael-toc-title:before{content:none}.eael-toc .eael-toc-header .eael-toc-close{position:absolute;width:28px;height:28px;background:#fff;box-shadow:0 4px 8px 0 rgba(0,0,0,.2),0 6px 20px 0 rgba(0,0,0,.19);right:-9px;top:-11px;border-radius:20px;font-family:serif;font-size:20px;font-weight:700;line-height:28px;text-align:center;color:#ff7d50;cursor:pointer;padding:0;margin:0;border:0}.eael-toc .eael-toc-body{padding:12px 30px;background:#fff6f3;min-width:20vh;max-height:50vh;overflow-y:scroll}.eael-toc .eael-toc-body::-webkit-scrollbar{width:6px}.eael-toc .eael-toc-body::-webkit-scrollbar-thumb{background:#aaa;border-radius:10px}.eael-toc .eael-toc-body ul.eael-toc-list{margin:0;padding:0;list-style:none}.eael-toc .eael-toc-body ul.eael-toc-list li ul{margin:0;padding:0;margin-left:20px;list-style:none}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-bullet li:before{content:"";position:relative;display:inline-block;width:8px;height:8px;border-radius:50%;background-color:#ff7d50;margin-right:8px;top:-2px}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number{counter-reset:counter}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li{counter-increment:counter}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li:before{content:counters(counter,".") " "}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li ul{counter-reset:counter}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li ul li{counter-increment:counter}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-number li ul li:before{content:counters(counter,".") " "}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-list-arrow li.eael-highlight-active>a:before{content:"";position:absolute;left:0;z-index:999999;border-bottom:10px solid #ff7d50;border-left:5px solid transparent;border-right:5px solid transparent;transform:rotate(90deg);margin-top:10px}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-list-bar li.eael-highlight-active>a:after{content:"";position:absolute;right:0;height:30px;width:2px;background:#ff7d50;z-index:999999}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-collapse :not(.eael-highlight-parent) ul{display:none}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-word-wrap li a{display:inline-flex}.eael-toc .eael-toc-body ul.eael-toc-list.eael-toc-word-wrap li a span{width:140px!important;display:block;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}@media only screen and (max-width:767px){.eael-toc.eael-toc-mobile-hide{display:none!important}}
37
  .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}
 
38
  .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%}}span.eael-tooltip-content,span.eael-tooltip-content a{width:100%;display:block;text-align:center}.eael-tooltip-text-align-left .eael-tooltip-content a,.eael-tooltip-text-align-left .eael-tooltip-text{text-align:left}.eael-tooltip-text-align-right .eael-tooltip-content a,.eael-tooltip-text-align-right .eael-tooltip-text{text-align:right}.eael-tooltip-text-align-center .eael-tooltip-content a,.eael-tooltip-text-align-center .eael-tooltip-text{text-align:center}.eael-tooltip-text-align-justify .eael-tooltip-content a,.eael-tooltip-text-align-justify .eael-tooltip-text{text-align:justify}
39
  .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}
40
+ .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}
41
  .eael-weform-container input,.eael-weform-container textarea{height:auto;padding:10px}.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-btn-align-left .eael-weform-container ul.wpuf-form .wpuf-submit input[type=submit]{float:left;width:auto}.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%}
42
  .ea-woo-checkout{font-size:14px;line-height:1.5em;font-weight:400}.ea-woo-checkout .woocommerce #ship-to-different-address span,.ea-woo-checkout .woocommerce h3{font-size:25px;line-height:1.5em;font-weight:600;margin-top:0;text-transform:capitalize}.ea-woo-checkout .woocommerce label{font-size:16px;line-height:1.5;font-weight:500}.ea-woo-checkout .woocommerce label.woocommerce-form__label-for-checkbox.checkbox{display:flex;align-items:center}.ea-woo-checkout .woocommerce .checkout li.wc_payment_method{border-bottom:none}.ea-woo-checkout .woocommerce .woo-checkout-coupon a,.ea-woo-checkout .woocommerce .woo-checkout-login a{color:#7866ff}.ea-woo-checkout .woocommerce .woo-checkout-coupon a :hover,.ea-woo-checkout .woocommerce .woo-checkout-login a :hover{color:#443d6d}.ea-woo-checkout .woocommerce .woo-checkout-coupon label,.ea-woo-checkout .woocommerce .woo-checkout-login label{margin-bottom:10px}.ea-woo-checkout .woocommerce .woo-checkout-coupon .input-text,.ea-woo-checkout .woocommerce .woo-checkout-coupon select,.ea-woo-checkout .woocommerce .woo-checkout-login .input-text,.ea-woo-checkout .woocommerce .woo-checkout-login select{border-radius:5px;background-color:#fff;padding:13px;border:1px solid transparent}.ea-woo-checkout .woocommerce .woo-checkout-coupon .input-text :active,.ea-woo-checkout .woocommerce .woo-checkout-coupon .input-text :hover,.ea-woo-checkout .woocommerce .woo-checkout-coupon select :active,.ea-woo-checkout .woocommerce .woo-checkout-coupon select :hover,.ea-woo-checkout .woocommerce .woo-checkout-login .input-text :active,.ea-woo-checkout .woocommerce .woo-checkout-login .input-text :hover,.ea-woo-checkout .woocommerce .woo-checkout-login select :active,.ea-woo-checkout .woocommerce .woo-checkout-login select :hover{border-color:inherit}.ea-woo-checkout .woocommerce .woo-checkout-coupon .input-text :focus,.ea-woo-checkout .woocommerce .woo-checkout-coupon select :focus,.ea-woo-checkout .woocommerce .woo-checkout-login .input-text :focus,.ea-woo-checkout .woocommerce .woo-checkout-login select :focus{outline:inherit;outline-offset:0}.ea-woo-checkout .woocommerce .woo-checkout-coupon .button,.ea-woo-checkout .woocommerce .woo-checkout-login .button{background-color:#7866ff;border-radius:5px;font-size:16px;line-height:1.5em;color:#fff;font-weight:400;margin:0;padding:13px 30px;border:none;text-transform:capitalize!important}.ea-woo-checkout .woocommerce .woo-checkout-coupon .button:hover,.ea-woo-checkout .woocommerce .woo-checkout-login .button:hover{text-decoration:none}.ea-woo-checkout .woocommerce .woo-checkout-login{border-radius:5px;background-color:#f1ebff;padding:30px;font-size:16px;line-height:1.5em;font-weight:400;margin-bottom:30px;position:relative;display:block}.ea-woo-checkout .woocommerce .woo-checkout-login .ea-login-icon{width:20px;position:absolute;top:20px;left:20px;font-size:20px}.ea-woo-checkout .woocommerce .woo-checkout-login .ea-login-icon i,.ea-woo-checkout .woocommerce .woo-checkout-login .ea-login-icon svg{width:1em;height:1em;position:relative;display:block}.ea-woo-checkout .woocommerce .woo-checkout-login .form-row-first{width:48.5%;float:left!important}.ea-woo-checkout .woocommerce .woo-checkout-login .form-row-last{float:right!important}.ea-woo-checkout .woocommerce .woo-checkout-login .clear{clear:both}.ea-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login{max-width:100%;margin:15px 0 0!important}.ea-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login p:first-child{margin-top:0}.ea-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login .woocommerce-form-login__submit{margin-right:30px}.ea-woo-checkout .woocommerce .woo-checkout-login .lost_password{margin-left:3px;margin-bottom:0}.ea-woo-checkout .woocommerce .woo-checkout-coupon .form-row-first{width:48.5%}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon{margin:15px 0 0!important;padding:20px;width:100%;text-align:left;border:1px solid inherit;border-radius:5px}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon p:first-child{margin:0 0 20px 0}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first{width:78%;float:left}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first input{border-radius:5px;box-shadow:0 12px 20px rgba(51,57,137,.1);background-color:#fff;height:50px}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first input :focus{outline:0;outline-offset:0}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-last{width:20%;margin-left:2%;float:right}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .clear{clear:both}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon p{margin-top:0}@media (max-width:1024px){.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first{width:50%}.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-last{width:48%}}@media (max-width:767px){.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-first,.ea-woo-checkout .woocommerce .woo-checkout-coupon .checkout_coupon .form-row-last{width:100%}}.ea-woo-checkout .woocommerce .woo-checkout-coupon .lost_password{margin-bottom:0}.ea-woo-checkout .woocommerce h3#order_review_heading{float:none;width:100%}.ea-woo-checkout .woocommerce #customer_details.col2-set{width:100%!important;padding:0!important;float:none!important;margin:0 0 30px 0}.ea-woo-checkout .woocommerce #customer_details.col2-set h3{border:none;padding:0;font-size:25px}.ea-woo-checkout .woocommerce #customer_details.col2-set .col-1{padding-left:0;float:left!important;width:48%!important}.ea-woo-checkout .woocommerce #customer_details.col2-set .col-2{padding-right:0;float:right!important;width:48%!important}.ea-woo-checkout .woocommerce #customer_details.col2-set #ship-to-different-address label{display:flex;padding-top:0;padding-bottom:0}.ea-woo-checkout .woocommerce #customer_details.col2-set #ship-to-different-address label input{align-self:start;margin-top:9px;margin-right:10px}@media (max-width:767px){.ea-woo-checkout .woocommerce #customer_details.col2-set .col-1,.ea-woo-checkout .woocommerce #customer_details.col2-set .col-2{width:100%!important;float:none!important}}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review{margin-bottom:30px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table{padding:0;margin:0}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table li{display:flex;align-items:center;margin:0 0 12px 0}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-header{font-size:14px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-row{border-radius:3px;font-size:16px;font-weight:500;background-color:#fff}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-col-1{flex-basis:70%;max-width:70%}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-col-2{flex-basis:15%;max-width:15%;text-align:center}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-col-3{flex-basis:15%;max-width:15%;text-align:right;padding-right:25px!important}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-thum-name{align-items:center;display:flex}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-thum-name .product-thumbnail{width:65px;margin-right:15px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-thum-name .product-thumbnail img{display:block}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-quantity,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .product-total{padding:0 10px}@media all and (max-width:767px){.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table{overflow-y:auto}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-header,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table .table-row{width:400px}}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer{display:flex;justify-content:space-between}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .back-to-shopping{margin:0 0 10px 0;text-transform:capitalize;font-size:15px;line-height:1.5em}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .back-to-shopping i{margin-right:5px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content{font-size:14px;border-radius:3px;padding:20px 25px;background-color:#fff;width:40%;font-weight:700;margin:0 0 0 auto}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content div:first-child{border:none}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content div:last-child{padding-bottom:0}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content label{font-size:inherit;font-weight:inherit;line-height:inherit}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content .woocommerce-remove-coupon{font-family:inherit;font-size:.7em;font-weight:inherit;line-height:inherit;transition:all .2s}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .cart-discount,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .cart-subtotal,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .order-total,.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .shipping-area{display:flex;justify-content:space-between;border-top:1px solid inherit;padding:3px 0}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .woocommerce-shipping-methods{margin:0;padding:0;list-style:none}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .shipping-area #shipping_method li{margin-bottom:0}@media all and (max-width:1024px){.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content{width:40%}}@media all and (max-width:767px){.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer{flex-direction:column-reverse}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .back-to-shop{margin-top:15px}.ea-woo-checkout .woocommerce .ea-woo-checkout-order-review .ea-order-review-table-footer .footer-content{width:100%}}.eael-woo-checkout .woocommerce .woocommerce-error,.eael-woo-checkout .woocommerce .woocommerce-info,.eael-woo-checkout .woocommerce .woocommerce-message{border:0;border-radius:5px;text-align:left;background-color:transparent;text-transform:capitalize;padding:20px 20px 20px 50px;font-size:16px;line-height:1.5em;font-weight:400;margin-bottom:30px}.eael-woo-checkout .woocommerce .woocommerce-error::before,.eael-woo-checkout .woocommerce .woocommerce-info::before,.eael-woo-checkout .woocommerce .woocommerce-message::before{left:20px;top:20px;font-size:20px}.eael-woo-checkout .woocommerce .woocommerce-error a,.eael-woo-checkout .woocommerce .woocommerce-info a,.eael-woo-checkout .woocommerce .woocommerce-message a{box-shadow:none;text-transform:capitalize}.eael-woo-checkout .woocommerce .woocommerce-error{background-color:#fff3f5;color:#ff7e93}.eael-woo-checkout .woocommerce .woocommerce-info{background-color:#d1ecf1;color:#0c5460}.eael-woo-checkout .woocommerce .woocommerce-message{background-color:#d4edda;color:#155724}.eael-woo-checkout .woocommerce form.checkout_coupon{border:1px solid #404040}.eael-woo-checkout .woocommerce .woo-checkout-login.woo-checkout-login-editor{display:none!important}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-error,.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-info,.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-message{background-color:transparent!important;padding:0 0 0 40px!important;border:none!important;margin:0}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-error::before,.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-info::before,.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-form-login-toggle .woocommerce-message::before{left:20px;top:20px;font-size:20px}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-info{font-size:inherit;line-height:1.5em;font-weight:inherit;margin-bottom:0;display:block}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-info::before{content:none}.eael-woo-checkout .woocommerce .woo-checkout-login .woocommerce-info a{text-decoration:underline}.eael-woo-checkout .woocommerce .woo-checkout-coupon{border-radius:5px;background-color:#ebfaff;padding:30px;font-size:16px;line-height:1.5em;font-weight:400;margin-bottom:30px;position:relative;display:block}.eael-woo-checkout .woocommerce .woo-checkout-coupon .ea-coupon-icon{width:20px;position:absolute;top:20px;left:20px;font-size:20px}.eael-woo-checkout .woocommerce .woo-checkout-coupon .ea-coupon-icon i,.eael-woo-checkout .woocommerce .woo-checkout-coupon .ea-coupon-icon svg{width:1em;height:1em;position:relative;display:block}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-error,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-info,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-message{border-width:1px;border-style:solid;border-radius:3px;padding:10px 10px 10px 40px!important;margin:20px 0 0;color:inherit}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-error:before,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-info:before,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-message:before{left:10px;top:10px;color:inherit}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-error li,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-info li,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-message li{margin-left:0}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-error,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-message{background-color:transparent!important;padding:0 0 0 40px!important;border:none!important;margin:0}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-error::before,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info::before,.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-message::before{left:20px;top:20px;font-size:20px}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info{font-size:inherit;line-height:1.5em;font-weight:inherit;margin-bottom:0;display:block}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info::before{content:none}.eael-woo-checkout .woocommerce .woo-checkout-coupon .woocommerce-form-coupon-toggle .woocommerce-info a{text-decoration:underline}.eael-woo-checkout .woocommerce .woo-checkout-payment{clear:both}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods{padding:0 0 20px 0!important;margin:0;border:0}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods li:not(.woocommerce-notice){background-color:transparent}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method{margin:0;padding:0}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method>label{font-size:15px;padding:0;margin:0;display:inline-block;width:100%}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]{display:none}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]+label{cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding-left:25px;position:relative}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]+label::before{transition:all 250ms cubic-bezier(.4,.25,.3,1);content:"";width:12px;height:12px;border-radius:50%;background-color:#b8b6ca;border:0 solid #fff;font-size:0;position:absolute;top:47%;left:0;transform:translateY(-50%)}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]+label::after{transition:all 250ms cubic-bezier(.4,.25,.3,1);content:"";width:0;height:0;border-radius:50%;background-color:#fff;position:absolute;top:47%;left:0;transform:translateY(-50%)}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]:checked+label::before{background-color:transparent;width:12px;height:12px;border-width:2px;border-color:#7362f0}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .wc_payment_method input[type=radio]:checked+label::after{width:6px;height:6px;left:3px;background-color:#fff}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .payment_box{border-radius:5px}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .payment_methods .payment_box p:first-child{margin:0!important}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .place-order{padding:20px 0 0 0;border-top:1px solid #fff}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .place-order p{margin-top:0}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .place-order a.woocommerce-privacy-policy-link{color:#fff;font-weight:600}.eael-woo-checkout .woocommerce .woo-checkout-payment #payment .place-order #place_order{width:auto;margin:0 0 0 auto;text-transform:capitalize;letter-spacing:unset}.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1{width:100%!important;float:none!important}@media (min-width:1024px){.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1 .woocommerce-billing-fields{float:left!important;width:48%!important;padding-right:2%}.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1 .woocommerce-account-fields,.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1 .woocommerce-additional-fields,.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-1 .woocommerce-shipping-fields{float:left!important;width:48%!important;padding-left:2%}}.eael-woo-checkout.theme-astra:not(.elementor-editor-active) .woocommerce #customer_details.col2-set .col-2{clear:both}.eael-woo-checkout.elementor-editor-active .woocommerce .woo-checkout-login.woo-checkout-login-editor{display:block!important}
43
  .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%}
44
+ @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}
45
  @charset "UTF-8";.fc{direction:ltr;text-align:left}.fc-rtl{text-align:right}body .fc{font-size:1em}.fc-highlight{background:#bce8f1;opacity:.3}.fc-bgevent{background:#8fdf82;opacity:.3}.fc-nonbusiness{background:#d7d7d7}.fc-popover{position:absolute;box-shadow:0 2px 6px rgba(0,0,0,.15)}.fc-popover .fc-header{display:flex;flex-direction:row;justify-content:space-between;align-items:center;padding:2px 4px}.fc-rtl .fc-popover .fc-header{flex-direction:row-reverse}.fc-popover .fc-header .fc-title{margin:0 2px}.fc-popover .fc-header .fc-close{cursor:pointer;opacity:.65;font-size:1.1em}.fc-divider{border-style:solid;border-width:1px}hr.fc-divider{height:0;margin:0;padding:0 0 2px;border-width:1px 0}.fc-bg,.fc-bgevent-skeleton,.fc-highlight-skeleton,.fc-mirror-skeleton{position:absolute;top:0;left:0;right:0}.fc-bg{bottom:0}.fc-bg table{height:100%}.fc table{width:100%;box-sizing:border-box;table-layout:fixed;border-collapse:collapse;border-spacing:0;font-size:1em}.fc th{text-align:center}.fc td,.fc th{border-style:solid;border-width:1px;padding:0;vertical-align:top}.fc td.fc-today{border-style:double}a[data-goto]{cursor:pointer}a[data-goto]:hover{text-decoration:underline}.fc .fc-row{border-style:solid;border-width:0}.fc-row table{border-left:0 hidden transparent;border-right:0 hidden transparent;border-bottom:0 hidden transparent}.fc-row:first-child table{border-top:0 hidden transparent}.fc-row{position:relative}.fc-row .fc-bg{z-index:1}.fc-row .fc-bgevent-skeleton,.fc-row .fc-highlight-skeleton{bottom:0}.fc-row .fc-bgevent-skeleton table,.fc-row .fc-highlight-skeleton table{height:100%}.fc-row .fc-bgevent-skeleton td,.fc-row .fc-highlight-skeleton td{border-color:transparent}.fc-row .fc-bgevent-skeleton{z-index:2}.fc-row .fc-highlight-skeleton{z-index:3}.fc-row .fc-content-skeleton{position:relative;z-index:4;padding-bottom:2px}.fc-row .fc-mirror-skeleton{z-index:5}.fc .fc-row .fc-content-skeleton table,.fc .fc-row .fc-content-skeleton td,.fc .fc-row .fc-mirror-skeleton td{background:0 0;border-color:transparent}.fc-row .fc-content-skeleton td,.fc-row .fc-mirror-skeleton td{border-bottom:0}.fc-row .fc-content-skeleton tbody td,.fc-row .fc-mirror-skeleton tbody td{border-top:0}.fc-scroller{-webkit-overflow-scrolling:touch}.fc-scroller>.fc-day-grid,.fc-scroller>.fc-time-grid{position:relative;width:100%}.fc-event{position:relative;display:block;font-size:.85em;line-height:1.4;border-radius:3px;border:1px solid #3788d8}.fc-event,.fc-event-dot{background-color:#3788d8}.fc-event,.fc-event:hover{color:#fff;text-decoration:none}.fc-event.fc-draggable,.fc-event[href]{cursor:pointer}.fc-not-allowed,.fc-not-allowed .fc-event{cursor:not-allowed}.fc-event .fc-content{position:relative;z-index:2}.fc-event .fc-resizer{position:absolute;z-index:4}.fc-event .fc-resizer{display:none}.fc-event.fc-allow-mouse-resize .fc-resizer,.fc-event.fc-selected .fc-resizer{display:block}.fc-event.fc-selected .fc-resizer:before{content:"";position:absolute;z-index:9999;top:50%;left:50%;width:40px;height:40px;margin-left:-20px;margin-top:-20px}.fc-event.fc-selected{z-index:9999!important;box-shadow:0 2px 5px rgba(0,0,0,.2)}.fc-event.fc-selected:after{content:"";position:absolute;z-index:1;top:-1px;right:-1px;bottom:-1px;left:-1px;background:#000;opacity:.25}.fc-event.fc-dragging.fc-selected{box-shadow:0 2px 7px rgba(0,0,0,.3)}.fc-event.fc-dragging:not(.fc-selected){opacity:.75}.fc-h-event.fc-selected:before{content:"";position:absolute;z-index:3;top:-10px;bottom:-10px;left:0;right:0}.fc-ltr .fc-h-event.fc-not-start,.fc-rtl .fc-h-event.fc-not-end{margin-left:0;border-left-width:0;padding-left:1px;border-top-left-radius:0;border-bottom-left-radius:0}.fc-ltr .fc-h-event.fc-not-end,.fc-rtl .fc-h-event.fc-not-start{margin-right:0;border-right-width:0;padding-right:1px;border-top-right-radius:0;border-bottom-right-radius:0}.fc-ltr .fc-h-event .fc-start-resizer,.fc-rtl .fc-h-event .fc-end-resizer{cursor:w-resize;left:-1px}.fc-ltr .fc-h-event .fc-end-resizer,.fc-rtl .fc-h-event .fc-start-resizer{cursor:e-resize;right:-1px}.fc-h-event.fc-allow-mouse-resize .fc-resizer{width:7px;top:-1px;bottom:-1px}.fc-h-event.fc-selected .fc-resizer{border-radius:4px;border-width:1px;width:6px;height:6px;border-style:solid;border-color:inherit;background:#fff;top:50%;margin-top:-4px}.fc-ltr .fc-h-event.fc-selected .fc-start-resizer,.fc-rtl .fc-h-event.fc-selected .fc-end-resizer{margin-left:-4px}.fc-ltr .fc-h-event.fc-selected .fc-end-resizer,.fc-rtl .fc-h-event.fc-selected .fc-start-resizer{margin-right:-4px}.fc-day-grid-event{margin:1px 2px 0;padding:0 1px}tr:first-child>td>.fc-day-grid-event{margin-top:2px}.fc-mirror-skeleton tr:first-child>td>.fc-day-grid-event{margin-top:0}.fc-day-grid-event .fc-content{white-space:nowrap;overflow:hidden}.fc-day-grid-event .fc-time{font-weight:700}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer{margin-left:-2px}.fc-ltr .fc-day-grid-event.fc-allow-mouse-resize .fc-end-resizer,.fc-rtl .fc-day-grid-event.fc-allow-mouse-resize .fc-start-resizer{margin-right:-2px}a.fc-more{margin:1px 3px;font-size:.85em;cursor:pointer;text-decoration:none}a.fc-more:hover{text-decoration:underline}.fc-limited{display:none}.fc-day-grid .fc-row{z-index:1}.fc-more-popover{z-index:2;width:220px}.fc-more-popover .fc-event-container{padding:10px}.fc-now-indicator{position:absolute;border:0 solid red}.fc-unselectable{-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent}.fc-unthemed .fc-content,.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-list-view,.fc-unthemed .fc-popover,.fc-unthemed .fc-row,.fc-unthemed tbody,.fc-unthemed td,.fc-unthemed th,.fc-unthemed thead{border-color:#ddd}.fc-unthemed .fc-popover{background-color:#fff}.fc-unthemed .fc-divider,.fc-unthemed .fc-list-heading td,.fc-unthemed .fc-popover .fc-header{background:#eee}.fc-unthemed td.fc-today{background:#fcf8e3}.fc-unthemed .fc-disabled-day{background:#d7d7d7;opacity:.3}@font-face{font-family:fcicons;src:url("data:application/x-font-ttf;charset=utf-8;base64,AAEAAAALAIAAAwAwT1MvMg8SBfAAAAC8AAAAYGNtYXAXVtKNAAABHAAAAFRnYXNwAAAAEAAAAXAAAAAIZ2x5ZgYydxIAAAF4AAAFNGhlYWQUJ7cIAAAGrAAAADZoaGVhB20DzAAABuQAAAAkaG10eCIABhQAAAcIAAAALGxvY2ED4AU6AAAHNAAAABhtYXhwAA8AjAAAB0wAAAAgbmFtZXsr690AAAdsAAABhnBvc3QAAwAAAAAI9AAAACAAAwPAAZAABQAAApkCzAAAAI8CmQLMAAAB6wAzAQkAAAAAAAAAAAAAAAAAAAABEAAAAAAAAAAAAAAAAAAAAABAAADpBgPA/8AAQAPAAEAAAAABAAAAAAAAAAAAAAAgAAAAAAADAAAAAwAAABwAAQADAAAAHAADAAEAAAAcAAQAOAAAAAoACAACAAIAAQAg6Qb//f//AAAAAAAg6QD//f//AAH/4xcEAAMAAQAAAAAAAAAAAAAAAQAB//8ADwABAAAAAAAAAAAAAgAANzkBAAAAAAEAAAAAAAAAAAACAAA3OQEAAAAAAQAAAAAAAAAAAAIAADc5AQAAAAABAWIAjQKeAskAEwAAJSc3NjQnJiIHAQYUFwEWMjc2NCcCnuLiDQ0MJAz/AA0NAQAMJAwNDcni4gwjDQwM/wANIwz/AA0NDCMNAAAAAQFiAI0CngLJABMAACUBNjQnASYiBwYUHwEHBhQXFjI3AZ4BAA0N/wAMJAwNDeLiDQ0MJAyNAQAMIw0BAAwMDSMM4uINIwwNDQAAAAIA4gC3Ax4CngATACcAACUnNzY0JyYiDwEGFB8BFjI3NjQnISc3NjQnJiIPAQYUHwEWMjc2NCcB87e3DQ0MIw3VDQ3VDSMMDQ0BK7e3DQ0MJAzVDQ3VDCQMDQ3zuLcMJAwNDdUNIwzWDAwNIwy4twwkDA0N1Q0jDNYMDA0jDAAAAgDiALcDHgKeABMAJwAAJTc2NC8BJiIHBhQfAQcGFBcWMjchNzY0LwEmIgcGFB8BBwYUFxYyNwJJ1Q0N1Q0jDA0Nt7cNDQwjDf7V1Q0N1QwkDA0Nt7cNDQwkDLfWDCMN1Q0NDCQMt7gMIw0MDNYMIw3VDQ0MJAy3uAwjDQwMAAADAFUAAAOrA1UAMwBoAHcAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMhMjY1NCYjISIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAAVYRGRkR/qoRGRkRA1UFBAUOCQkVDAsZDf2rDRkLDBUJCA4FBQUFBQUOCQgVDAsZDQJVDRkLDBUJCQ4FBAVVAgECBQMCBwQECAX9qwQJAwQHAwMFAQICAgIBBQMDBwQDCQQCVQUIBAQHAgMFAgEC/oAZEhEZGRESGQAAAAADAFUAAAOrA1UAMwBoAIkAABMiBgcOAQcOAQcOARURFBYXHgEXHgEXHgEzITI2Nz4BNz4BNz4BNRE0JicuAScuAScuASMFITIWFx4BFx4BFx4BFREUBgcOAQcOAQcOASMhIiYnLgEnLgEnLgE1ETQ2Nz4BNz4BNz4BMxMzFRQWMzI2PQEzMjY1NCYrATU0JiMiBh0BIyIGFRQWM9UNGAwLFQkJDgUFBQUFBQ4JCRULDBgNAlYNGAwLFQkJDgUFBQUFBQ4JCRULDBgN/aoCVgQIBAQHAwMFAQIBAQIBBQMDBwQECAT9qgQIBAQHAwMFAQIBAQIBBQMDBwQECASAgBkSEhmAERkZEYAZEhIZgBEZGREDVQUEBQ4JCRUMCxkN/asNGQsMFQkIDgUFBQUFBQ4JCBUMCxkNAlUNGQsMFQkJDgUEBVUCAQIFAwIHBAQIBf2rBAkDBAcDAwUBAgICAgEFAwMHBAMJBAJVBQgEBAcCAwUCAQL+gIASGRkSgBkSERmAEhkZEoAZERIZAAABAOIAjQMeAskAIAAAExcHBhQXFjI/ARcWMjc2NC8BNzY0JyYiDwEnJiIHBhQX4uLiDQ0MJAzi4gwkDA0N4uINDQwkDOLiDCQMDQ0CjeLiDSMMDQ3h4Q0NDCMN4uIMIw0MDOLiDAwNIwwAAAABAAAAAQAAa5n0y18PPPUACwQAAAAAANivOVsAAAAA2K85WwAAAAADqwNVAAAACAACAAAAAAAAAAEAAAPA/8AAAAQAAAAAAAOrAAEAAAAAAAAAAAAAAAAAAAALBAAAAAAAAAAAAAAAAgAAAAQAAWIEAAFiBAAA4gQAAOIEAABVBAAAVQQAAOIAAAAAAAoAFAAeAEQAagCqAOoBngJkApoAAQAAAAsAigADAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAA4ArgABAAAAAAABAAcAAAABAAAAAAACAAcAYAABAAAAAAADAAcANgABAAAAAAAEAAcAdQABAAAAAAAFAAsAFQABAAAAAAAGAAcASwABAAAAAAAKABoAigADAAEECQABAA4ABwADAAEECQACAA4AZwADAAEECQADAA4APQADAAEECQAEAA4AfAADAAEECQAFABYAIAADAAEECQAGAA4AUgADAAEECQAKADQApGZjaWNvbnMAZgBjAGkAYwBvAG4Ac1ZlcnNpb24gMS4wAFYAZQByAHMAaQBvAG4AIAAxAC4AMGZjaWNvbnMAZgBjAGkAYwBvAG4Ac2ZjaWNvbnMAZgBjAGkAYwBvAG4Ac1JlZ3VsYXIAUgBlAGcAdQBsAGEAcmZjaWNvbnMAZgBjAGkAYwBvAG4Ac0ZvbnQgZ2VuZXJhdGVkIGJ5IEljb01vb24uAEYAbwBuAHQAIABnAGUAbgBlAHIAYQB0AGUAZAAgAGIAeQAgAEkAYwBvAE0AbwBvAG4ALgAAAAMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=") format("truetype");font-weight:400;font-style:normal}.fc-icon{font-family:fcicons!important;speak:none;font-style:normal;font-weight:400;font-variant:normal;text-transform:none;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fc-icon-chevron-left:before{content:""}.fc-icon-chevron-right:before{content:""}.fc-icon-chevrons-left:before{content:""}.fc-icon-chevrons-right:before{content:""}.fc-icon-minus-square:before{content:""}.fc-icon-plus-square:before{content:""}.fc-icon-x:before{content:""}.fc-icon{display:inline-block;width:1em;height:1em;text-align:center}.fc-button{border-radius:0;overflow:visible;text-transform:none;margin:0;font-family:inherit;font-size:inherit;line-height:inherit}.fc-button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}.fc-button{-webkit-appearance:button}.fc-button:not(:disabled){cursor:pointer}.fc-button::-moz-focus-inner{padding:0;border-style:none}.fc-button{display:inline-block;font-weight:400;color:#212529;text-align:center;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:transparent;border:1px solid transparent;padding:.4em .65em;font-size:1em;line-height:1.5;border-radius:.25em}.fc-button:hover{color:#212529;text-decoration:none}.fc-button:focus{outline:0;-webkit-box-shadow:0 0 0 .2rem rgba(44,62,80,.25);box-shadow:0 0 0 .2rem rgba(44,62,80,.25)}.fc-button:disabled{opacity:.65}.fc-button-primary{color:#fff;background-color:#2c3e50;border-color:#2c3e50}.fc-button-primary:hover{color:#fff;background-color:#1e2b37;border-color:#1a252f}.fc-button-primary:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button-primary:disabled{color:#fff;background-color:#2c3e50;border-color:#2c3e50}.fc-button-primary:not(:disabled).fc-button-active,.fc-button-primary:not(:disabled):active{color:#fff;background-color:#1a252f;border-color:#151e27}.fc-button-primary:not(:disabled).fc-button-active:focus,.fc-button-primary:not(:disabled):active:focus{-webkit-box-shadow:0 0 0 .2rem rgba(76,91,106,.5);box-shadow:0 0 0 .2rem rgba(76,91,106,.5)}.fc-button .fc-icon{vertical-align:middle;font-size:1.5em}.fc-button-group{position:relative;display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;vertical-align:middle}.fc-button-group>.fc-button{position:relative;-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.fc-button-group>.fc-button:hover{z-index:1}.fc-button-group>.fc-button.fc-button-active,.fc-button-group>.fc-button:active,.fc-button-group>.fc-button:focus{z-index:1}.fc-button-group>.fc-button:not(:first-child){margin-left:-1px}.fc-button-group>.fc-button:not(:last-child){border-top-right-radius:0;border-bottom-right-radius:0}.fc-button-group>.fc-button:not(:first-child){border-top-left-radius:0;border-bottom-left-radius:0}.fc-unthemed .fc-popover{border-width:1px;border-style:solid}.fc-unthemed .fc-list-item:hover td{background-color:#f5f5f5}.fc-toolbar{display:flex;justify-content:space-between;align-items:center}.fc-toolbar.fc-header-toolbar{margin-bottom:1.5em}.fc-toolbar.fc-footer-toolbar{margin-top:1.5em}.fc-toolbar>*>:not(:first-child){margin-left:.75em}.fc-toolbar h2{font-size:1.75em;margin:0}.fc-view-container{position:relative}.fc-view-container *,.fc-view-container :after,.fc-view-container :before{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box}.fc-view,.fc-view>table{position:relative;z-index:1}@media print{.fc{max-width:100%!important}.fc-event{background:#fff!important;color:#000!important;page-break-inside:avoid}.fc-event .fc-resizer{display:none}.fc hr,.fc tbody,.fc td,.fc th,.fc thead,.fc-row{border-color:#ccc!important;background:#fff!important}.fc-bg,.fc-bgevent-container,.fc-bgevent-skeleton,.fc-business-container,.fc-highlight-container,.fc-highlight-skeleton,.fc-mirror-container,.fc-mirror-skeleton{display:none}.fc tbody .fc-row{height:auto!important;min-height:0!important}.fc tbody .fc-row .fc-content-skeleton{position:static;padding-bottom:0!important}.fc tbody .fc-row .fc-content-skeleton tbody tr:last-child td{padding-bottom:1em}.fc tbody .fc-row .fc-content-skeleton table{height:1em}.fc-more,.fc-more-cell{display:none!important}.fc tr.fc-limited{display:table-row!important}.fc td.fc-limited{display:table-cell!important}.fc-popover{display:none}.fc-time-grid{min-height:0!important}.fc-timeGrid-view .fc-axis{display:none}.fc-slats,.fc-time-grid hr{display:none!important}.fc-time-grid .fc-content-skeleton{position:static}.fc-time-grid .fc-content-skeleton table{height:4em}.fc-time-grid .fc-event-container{margin:0!important}.fc-time-grid .fc-event{position:static!important;margin:3px 2px!important}.fc-time-grid .fc-event.fc-not-end{border-bottom-width:1px!important}.fc-time-grid .fc-event.fc-not-end:after{content:"..."}.fc-time-grid .fc-event.fc-not-start{border-top-width:1px!important}.fc-time-grid .fc-event.fc-not-start:before{content:"..."}.fc-time-grid .fc-event .fc-time{white-space:normal!important}.fc-time-grid .fc-event .fc-time span{display:none}.fc-time-grid .fc-event .fc-time:after{content:attr(data-full)}.fc-day-grid-container,.fc-scroller,.fc-time-grid-container{overflow:visible!important;height:auto!important}.fc-row{border:0!important;margin:0!important}.fc button,.fc-button-group{display:none}}
46
  .fc-dayGridDay-view .fc-content-skeleton,.fc-dayGridWeek-view .fc-content-skeleton{padding-bottom:1em}.fc-dayGrid-view .fc-body .fc-row{min-height:4em}.fc-row.fc-rigid{overflow:hidden}.fc-row.fc-rigid .fc-content-skeleton{position:absolute;top:0;left:0;right:0}.fc-day-top.fc-other-month{opacity:.3}.fc-dayGrid-view .fc-day-number,.fc-dayGrid-view .fc-week-number{padding:2px}.fc-dayGrid-view th.fc-day-number,.fc-dayGrid-view th.fc-week-number{padding:0 2px}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-day-number{float:right}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-day-number{float:left}.fc-ltr .fc-dayGrid-view .fc-day-top .fc-week-number{float:left;border-radius:0 0 3px 0}.fc-rtl .fc-dayGrid-view .fc-day-top .fc-week-number{float:right;border-radius:0 0 0 3px}.fc-dayGrid-view .fc-day-top .fc-week-number{min-width:1.5em;text-align:center;background-color:#f2f2f2;color:grey}.fc-dayGrid-view td.fc-week-number{text-align:center}.fc-dayGrid-view td.fc-week-number>*{display:inline-block;min-width:1.25em}
47
  .fc-event-dot{display:inline-block;width:10px;height:10px;border-radius:5px}.fc-rtl .fc-list-view{direction:rtl}.fc-list-view{border-width:1px;border-style:solid}.fc .fc-list-table{table-layout:auto}.fc-list-table td{border-width:1px 0 0;padding:8px 14px}.fc-list-table tr:first-child td{border-top-width:0}.fc-list-heading{border-bottom-width:1px}.fc-list-heading td{font-weight:700}.fc-ltr .fc-list-heading-main{float:left}.fc-ltr .fc-list-heading-alt{float:right}.fc-rtl .fc-list-heading-main{float:right}.fc-rtl .fc-list-heading-alt{float:left}.fc-list-item.fc-has-url{cursor:pointer}.fc-list-item-marker,.fc-list-item-time{white-space:nowrap;width:1px}.fc-ltr .fc-list-item-marker{padding-right:0}.fc-rtl .fc-list-item-marker{padding-left:0}.fc-list-item-title a{text-decoration:none;color:inherit}.fc-list-item-title a[href]:hover{text-decoration:underline}.fc-list-empty-wrap2{position:absolute;top:0;left:0;right:0;bottom:0}.fc-list-empty-wrap1{width:100%;height:100%;display:table}.fc-list-empty{display:table-cell;vertical-align:middle;text-align:center}.fc-unthemed .fc-list-empty{background-color:#eee}
48
  @charset "UTF-8";.fc-timeGrid-view .fc-day-grid{position:relative;z-index:2}.fc-timeGrid-view .fc-day-grid .fc-row{min-height:3em}.fc-timeGrid-view .fc-day-grid .fc-row .fc-content-skeleton{padding-bottom:1em}.fc .fc-axis{vertical-align:middle;padding:0 4px;white-space:nowrap}.fc-ltr .fc-axis{text-align:right}.fc-rtl .fc-axis{text-align:left}.fc-time-grid,.fc-time-grid-container{position:relative;z-index:1}.fc-time-grid{min-height:100%}.fc-time-grid table{border:0 hidden transparent}.fc-time-grid>.fc-bg{z-index:1}.fc-time-grid .fc-slats,.fc-time-grid>hr{position:relative;z-index:2}.fc-time-grid .fc-content-col{position:relative}.fc-time-grid .fc-content-skeleton{position:absolute;z-index:3;top:0;left:0;right:0}.fc-time-grid .fc-business-container{position:relative;z-index:1}.fc-time-grid .fc-bgevent-container{position:relative;z-index:2}.fc-time-grid .fc-highlight-container{position:relative;z-index:3}.fc-time-grid .fc-event-container{position:relative;z-index:4}.fc-time-grid .fc-now-indicator-line{z-index:5}.fc-time-grid .fc-mirror-container{position:relative;z-index:6}.fc-time-grid .fc-slats td{height:1.5em;border-bottom:0}.fc-time-grid .fc-slats .fc-minor td{border-top-style:dotted}.fc-time-grid .fc-highlight-container{position:relative}.fc-time-grid .fc-highlight{position:absolute;left:0;right:0}.fc-ltr .fc-time-grid .fc-event-container{margin:0 2.5% 0 2px}.fc-rtl .fc-time-grid .fc-event-container{margin:0 2px 0 2.5%}.fc-time-grid .fc-bgevent,.fc-time-grid .fc-event{position:absolute;z-index:1}.fc-time-grid .fc-bgevent{left:0;right:0}.fc-time-grid-event{margin-bottom:1px}.fc-time-grid-event-inset{-webkit-box-shadow:0 0 0 1px #fff;box-shadow:0 0 0 1px #fff}.fc-time-grid-event.fc-not-start{border-top-width:0;padding-top:1px;border-top-left-radius:0;border-top-right-radius:0}.fc-time-grid-event.fc-not-end{border-bottom-width:0;padding-bottom:1px;border-bottom-left-radius:0;border-bottom-right-radius:0}.fc-time-grid-event .fc-content{overflow:hidden;max-height:100%}.fc-time-grid-event .fc-time,.fc-time-grid-event .fc-title{padding:0 1px}.fc-time-grid-event .fc-time{font-size:.85em;white-space:nowrap}.fc-time-grid-event.fc-short .fc-content{white-space:nowrap}.fc-time-grid-event.fc-short .fc-time,.fc-time-grid-event.fc-short .fc-title{display:inline-block;vertical-align:top}.fc-time-grid-event.fc-short .fc-time span{display:none}.fc-time-grid-event.fc-short .fc-time:before{content:attr(data-start)}.fc-time-grid-event.fc-short .fc-time:after{content:" - "}.fc-time-grid-event.fc-short .fc-title{font-size:.85em;padding:0}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer{left:0;right:0;bottom:0;height:8px;overflow:hidden;line-height:8px;font-size:11px;font-family:monospace;text-align:center;cursor:s-resize}.fc-time-grid-event.fc-allow-mouse-resize .fc-resizer:after{content:"="}.fc-time-grid-event.fc-selected .fc-resizer{border-radius:5px;border-width:1px;width:8px;height:8px;border-style:solid;border-color:inherit;background:#fff;left:50%;margin-left:-5px;bottom:-5px}.fc-time-grid .fc-now-indicator-line{border-top-width:1px;left:0;right:0}.fc-time-grid .fc-now-indicator-arrow{margin-top:-5px}.fc-ltr .fc-time-grid .fc-now-indicator-arrow{left:0;border-width:5px 0 5px 6px;border-top-color:transparent;border-bottom-color:transparent}.fc-rtl .fc-time-grid .fc-now-indicator-arrow{right:0;border-width:5px 6px 5px 0;border-top-color:transparent;border-bottom-color:transparent}
 
49
  .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/js/eael.js CHANGED
@@ -269,14951 +269,1751 @@
269
 
270
  });
271
 
272
- //! moment.js
273
- //! version : 2.18.1
274
- //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
275
- //! license : MIT
276
- //! momentjs.com
277
- !function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return sd.apply(null,arguments)}function b(a){sd=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){return null!=a&&"[object Object]"===Object.prototype.toString.call(a)}function e(a){var b;for(b in a)return!1;return!0}function f(a){return void 0===a}function g(a){return"number"==typeof a||"[object Number]"===Object.prototype.toString.call(a)}function h(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function i(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function j(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function k(a,b){for(var c in b)j(b,c)&&(a[c]=b[c]);return j(b,"toString")&&(a.toString=b.toString),j(b,"valueOf")&&(a.valueOf=b.valueOf),a}function l(a,b,c,d){return sb(a,b,c,d,!0).utc()}function m(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function n(a){return null==a._pf&&(a._pf=m()),a._pf}function o(a){if(null==a._isValid){var b=n(a),c=ud.call(b.parsedDateParts,function(a){return null!=a}),d=!isNaN(a._d.getTime())&&b.overflow<0&&!b.empty&&!b.invalidMonth&&!b.invalidWeekday&&!b.nullInput&&!b.invalidFormat&&!b.userInvalidated&&(!b.meridiem||b.meridiem&&c);if(a._strict&&(d=d&&0===b.charsLeftOver&&0===b.unusedTokens.length&&void 0===b.bigHour),null!=Object.isFrozen&&Object.isFrozen(a))return d;a._isValid=d}return a._isValid}function p(a){var b=l(NaN);return null!=a?k(n(b),a):n(b).userInvalidated=!0,b}function q(a,b){var c,d,e;if(f(b._isAMomentObject)||(a._isAMomentObject=b._isAMomentObject),f(b._i)||(a._i=b._i),f(b._f)||(a._f=b._f),f(b._l)||(a._l=b._l),f(b._strict)||(a._strict=b._strict),f(b._tzm)||(a._tzm=b._tzm),f(b._isUTC)||(a._isUTC=b._isUTC),f(b._offset)||(a._offset=b._offset),f(b._pf)||(a._pf=n(b)),f(b._locale)||(a._locale=b._locale),vd.length>0)for(c=0;c<vd.length;c++)d=vd[c],e=b[d],f(e)||(a[d]=e);return a}function r(b){q(this,b),this._d=new Date(null!=b._d?b._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),wd===!1&&(wd=!0,a.updateOffset(this),wd=!1)}function s(a){return a instanceof r||null!=a&&null!=a._isAMomentObject}function t(a){return a<0?Math.ceil(a)||0:Math.floor(a)}function u(a){var b=+a,c=0;return 0!==b&&isFinite(b)&&(c=t(b)),c}function v(a,b,c){var d,e=Math.min(a.length,b.length),f=Math.abs(a.length-b.length),g=0;for(d=0;d<e;d++)(c&&a[d]!==b[d]||!c&&u(a[d])!==u(b[d]))&&g++;return g+f}function w(b){a.suppressDeprecationWarnings===!1&&"undefined"!=typeof console&&console.warn&&console.warn("Deprecation warning: "+b)}function x(b,c){var d=!0;return k(function(){if(null!=a.deprecationHandler&&a.deprecationHandler(null,b),d){for(var e,f=[],g=0;g<arguments.length;g++){if(e="","object"==typeof arguments[g]){e+="\n["+g+"] ";for(var h in arguments[0])e+=h+": "+arguments[0][h]+", ";e=e.slice(0,-2)}else e=arguments[g];f.push(e)}w(b+"\nArguments: "+Array.prototype.slice.call(f).join("")+"\n"+(new Error).stack),d=!1}return c.apply(this,arguments)},c)}function y(b,c){null!=a.deprecationHandler&&a.deprecationHandler(b,c),xd[b]||(w(c),xd[b]=!0)}function z(a){return a instanceof Function||"[object Function]"===Object.prototype.toString.call(a)}function A(a){var b,c;for(c in a)b=a[c],z(b)?this[c]=b:this["_"+c]=b;this._config=a,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+"|"+/\d{1,2}/.source)}function B(a,b){var c,e=k({},a);for(c in b)j(b,c)&&(d(a[c])&&d(b[c])?(e[c]={},k(e[c],a[c]),k(e[c],b[c])):null!=b[c]?e[c]=b[c]:delete e[c]);for(c in a)j(a,c)&&!j(b,c)&&d(a[c])&&(e[c]=k({},e[c]));return e}function C(a){null!=a&&this.set(a)}function D(a,b,c){var d=this._calendar[a]||this._calendar.sameElse;return z(d)?d.call(b,c):d}function E(a){var b=this._longDateFormat[a],c=this._longDateFormat[a.toUpperCase()];return b||!c?b:(this._longDateFormat[a]=c.replace(/MMMM|MM|DD|dddd/g,function(a){return a.slice(1)}),this._longDateFormat[a])}function F(){return this._invalidDate}function G(a){return this._ordinal.replace("%d",a)}function H(a,b,c,d){var e=this._relativeTime[c];return z(e)?e(a,b,c,d):e.replace(/%d/i,a)}function I(a,b){var c=this._relativeTime[a>0?"future":"past"];return z(c)?c(b):c.replace(/%s/i,b)}function J(a,b){var c=a.toLowerCase();Hd[c]=Hd[c+"s"]=Hd[b]=a}function K(a){return"string"==typeof a?Hd[a]||Hd[a.toLowerCase()]:void 0}function L(a){var b,c,d={};for(c in a)j(a,c)&&(b=K(c),b&&(d[b]=a[c]));return d}function M(a,b){Id[a]=b}function N(a){var b=[];for(var c in a)b.push({unit:c,priority:Id[c]});return b.sort(function(a,b){return a.priority-b.priority}),b}function O(b,c){return function(d){return null!=d?(Q(this,b,d),a.updateOffset(this,c),this):P(this,b)}}function P(a,b){return a.isValid()?a._d["get"+(a._isUTC?"UTC":"")+b]():NaN}function Q(a,b,c){a.isValid()&&a._d["set"+(a._isUTC?"UTC":"")+b](c)}function R(a){return a=K(a),z(this[a])?this[a]():this}function S(a,b){if("object"==typeof a){a=L(a);for(var c=N(a),d=0;d<c.length;d++)this[c[d].unit](a[c[d].unit])}else if(a=K(a),z(this[a]))return this[a](b);return this}function T(a,b,c){var d=""+Math.abs(a),e=b-d.length,f=a>=0;return(f?c?"+":"":"-")+Math.pow(10,Math.max(0,e)).toString().substr(1)+d}function U(a,b,c,d){var e=d;"string"==typeof d&&(e=function(){return this[d]()}),a&&(Md[a]=e),b&&(Md[b[0]]=function(){return T(e.apply(this,arguments),b[1],b[2])}),c&&(Md[c]=function(){return this.localeData().ordinal(e.apply(this,arguments),a)})}function V(a){return a.match(/\[[\s\S]/)?a.replace(/^\[|\]$/g,""):a.replace(/\\/g,"")}function W(a){var b,c,d=a.match(Jd);for(b=0,c=d.length;b<c;b++)Md[d[b]]?d[b]=Md[d[b]]:d[b]=V(d[b]);return function(b){var e,f="";for(e=0;e<c;e++)f+=z(d[e])?d[e].call(b,a):d[e];return f}}function X(a,b){return a.isValid()?(b=Y(b,a.localeData()),Ld[b]=Ld[b]||W(b),Ld[b](a)):a.localeData().invalidDate()}function Y(a,b){function c(a){return b.longDateFormat(a)||a}var d=5;for(Kd.lastIndex=0;d>=0&&Kd.test(a);)a=a.replace(Kd,c),Kd.lastIndex=0,d-=1;return a}function Z(a,b,c){ce[a]=z(b)?b:function(a,d){return a&&c?c:b}}function $(a,b){return j(ce,a)?ce[a](b._strict,b._locale):new RegExp(_(a))}function _(a){return aa(a.replace("\\","").replace(/\\(\[)|\\(\])|\[([^\]\[]*)\]|\\(.)/g,function(a,b,c,d,e){return b||c||d||e}))}function aa(a){return a.replace(/[-\/\\^$*+?.()|[\]{}]/g,"\\$&")}function ba(a,b){var c,d=b;for("string"==typeof a&&(a=[a]),g(b)&&(d=function(a,c){c[b]=u(a)}),c=0;c<a.length;c++)de[a[c]]=d}function ca(a,b){ba(a,function(a,c,d,e){d._w=d._w||{},b(a,d._w,d,e)})}function da(a,b,c){null!=b&&j(de,a)&&de[a](b,c._a,c,a)}function ea(a,b){return new Date(Date.UTC(a,b+1,0)).getUTCDate()}function fa(a,b){return a?c(this._months)?this._months[a.month()]:this._months[(this._months.isFormat||oe).test(b)?"format":"standalone"][a.month()]:c(this._months)?this._months:this._months.standalone}function ga(a,b){return a?c(this._monthsShort)?this._monthsShort[a.month()]:this._monthsShort[oe.test(b)?"format":"standalone"][a.month()]:c(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function ha(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],d=0;d<12;++d)f=l([2e3,d]),this._shortMonthsParse[d]=this.monthsShort(f,"").toLocaleLowerCase(),this._longMonthsParse[d]=this.months(f,"").toLocaleLowerCase();return c?"MMM"===b?(e=ne.call(this._shortMonthsParse,g),e!==-1?e:null):(e=ne.call(this._longMonthsParse,g),e!==-1?e:null):"MMM"===b?(e=ne.call(this._shortMonthsParse,g),e!==-1?e:(e=ne.call(this._longMonthsParse,g),e!==-1?e:null)):(e=ne.call(this._longMonthsParse,g),e!==-1?e:(e=ne.call(this._shortMonthsParse,g),e!==-1?e:null))}function ia(a,b,c){var d,e,f;if(this._monthsParseExact)return ha.call(this,a,b,c);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),d=0;d<12;d++){if(e=l([2e3,d]),c&&!this._longMonthsParse[d]&&(this._longMonthsParse[d]=new RegExp("^"+this.months(e,"").replace(".","")+"$","i"),this._shortMonthsParse[d]=new RegExp("^"+this.monthsShort(e,"").replace(".","")+"$","i")),c||this._monthsParse[d]||(f="^"+this.months(e,"")+"|^"+this.monthsShort(e,""),this._monthsParse[d]=new RegExp(f.replace(".",""),"i")),c&&"MMMM"===b&&this._longMonthsParse[d].test(a))return d;if(c&&"MMM"===b&&this._shortMonthsParse[d].test(a))return d;if(!c&&this._monthsParse[d].test(a))return d}}function ja(a,b){var c;if(!a.isValid())return a;if("string"==typeof b)if(/^\d+$/.test(b))b=u(b);else if(b=a.localeData().monthsParse(b),!g(b))return a;return c=Math.min(a.date(),ea(a.year(),b)),a._d["set"+(a._isUTC?"UTC":"")+"Month"](b,c),a}function ka(b){return null!=b?(ja(this,b),a.updateOffset(this,!0),this):P(this,"Month")}function la(){return ea(this.year(),this.month())}function ma(a){return this._monthsParseExact?(j(this,"_monthsRegex")||oa.call(this),a?this._monthsShortStrictRegex:this._monthsShortRegex):(j(this,"_monthsShortRegex")||(this._monthsShortRegex=re),this._monthsShortStrictRegex&&a?this._monthsShortStrictRegex:this._monthsShortRegex)}function na(a){return this._monthsParseExact?(j(this,"_monthsRegex")||oa.call(this),a?this._monthsStrictRegex:this._monthsRegex):(j(this,"_monthsRegex")||(this._monthsRegex=se),this._monthsStrictRegex&&a?this._monthsStrictRegex:this._monthsRegex)}function oa(){function a(a,b){return b.length-a.length}var b,c,d=[],e=[],f=[];for(b=0;b<12;b++)c=l([2e3,b]),d.push(this.monthsShort(c,"")),e.push(this.months(c,"")),f.push(this.months(c,"")),f.push(this.monthsShort(c,""));for(d.sort(a),e.sort(a),f.sort(a),b=0;b<12;b++)d[b]=aa(d[b]),e[b]=aa(e[b]);for(b=0;b<24;b++)f[b]=aa(f[b]);this._monthsRegex=new RegExp("^("+f.join("|")+")","i"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp("^("+e.join("|")+")","i"),this._monthsShortStrictRegex=new RegExp("^("+d.join("|")+")","i")}function pa(a){return qa(a)?366:365}function qa(a){return a%4===0&&a%100!==0||a%400===0}function ra(){return qa(this.year())}function sa(a,b,c,d,e,f,g){var h=new Date(a,b,c,d,e,f,g);return a<100&&a>=0&&isFinite(h.getFullYear())&&h.setFullYear(a),h}function ta(a){var b=new Date(Date.UTC.apply(null,arguments));return a<100&&a>=0&&isFinite(b.getUTCFullYear())&&b.setUTCFullYear(a),b}function ua(a,b,c){var d=7+b-c,e=(7+ta(a,0,d).getUTCDay()-b)%7;return-e+d-1}function va(a,b,c,d,e){var f,g,h=(7+c-d)%7,i=ua(a,d,e),j=1+7*(b-1)+h+i;return j<=0?(f=a-1,g=pa(f)+j):j>pa(a)?(f=a+1,g=j-pa(a)):(f=a,g=j),{year:f,dayOfYear:g}}function wa(a,b,c){var d,e,f=ua(a.year(),b,c),g=Math.floor((a.dayOfYear()-f-1)/7)+1;return g<1?(e=a.year()-1,d=g+xa(e,b,c)):g>xa(a.year(),b,c)?(d=g-xa(a.year(),b,c),e=a.year()+1):(e=a.year(),d=g),{week:d,year:e}}function xa(a,b,c){var d=ua(a,b,c),e=ua(a+1,b,c);return(pa(a)-d+e)/7}function ya(a){return wa(a,this._week.dow,this._week.doy).week}function za(){return this._week.dow}function Aa(){return this._week.doy}function Ba(a){var b=this.localeData().week(this);return null==a?b:this.add(7*(a-b),"d")}function Ca(a){var b=wa(this,1,4).week;return null==a?b:this.add(7*(a-b),"d")}function Da(a,b){return"string"!=typeof a?a:isNaN(a)?(a=b.weekdaysParse(a),"number"==typeof a?a:null):parseInt(a,10)}function Ea(a,b){return"string"==typeof a?b.weekdaysParse(a)%7||7:isNaN(a)?null:a}function Fa(a,b){return a?c(this._weekdays)?this._weekdays[a.day()]:this._weekdays[this._weekdays.isFormat.test(b)?"format":"standalone"][a.day()]:c(this._weekdays)?this._weekdays:this._weekdays.standalone}function Ga(a){return a?this._weekdaysShort[a.day()]:this._weekdaysShort}function Ha(a){return a?this._weekdaysMin[a.day()]:this._weekdaysMin}function Ia(a,b,c){var d,e,f,g=a.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],d=0;d<7;++d)f=l([2e3,1]).day(d),this._minWeekdaysParse[d]=this.weekdaysMin(f,"").toLocaleLowerCase(),this._shortWeekdaysParse[d]=this.weekdaysShort(f,"").toLocaleLowerCase(),this._weekdaysParse[d]=this.weekdays(f,"").toLocaleLowerCase();return c?"dddd"===b?(e=ne.call(this._weekdaysParse,g),e!==-1?e:null):"ddd"===b?(e=ne.call(this._shortWeekdaysParse,g),e!==-1?e:null):(e=ne.call(this._minWeekdaysParse,g),e!==-1?e:null):"dddd"===b?(e=ne.call(this._weekdaysParse,g),e!==-1?e:(e=ne.call(this._shortWeekdaysParse,g),e!==-1?e:(e=ne.call(this._minWeekdaysParse,g),e!==-1?e:null))):"ddd"===b?(e=ne.call(this._shortWeekdaysParse,g),e!==-1?e:(e=ne.call(this._weekdaysParse,g),e!==-1?e:(e=ne.call(this._minWeekdaysParse,g),e!==-1?e:null))):(e=ne.call(this._minWeekdaysParse,g),e!==-1?e:(e=ne.call(this._weekdaysParse,g),e!==-1?e:(e=ne.call(this._shortWeekdaysParse,g),e!==-1?e:null)))}function Ja(a,b,c){var d,e,f;if(this._weekdaysParseExact)return Ia.call(this,a,b,c);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),d=0;d<7;d++){if(e=l([2e3,1]).day(d),c&&!this._fullWeekdaysParse[d]&&(this._fullWeekdaysParse[d]=new RegExp("^"+this.weekdays(e,"").replace(".",".?")+"$","i"),this._shortWeekdaysParse[d]=new RegExp("^"+this.weekdaysShort(e,"").replace(".",".?")+"$","i"),this._minWeekdaysParse[d]=new RegExp("^"+this.weekdaysMin(e,"").replace(".",".?")+"$","i")),this._weekdaysParse[d]||(f="^"+this.weekdays(e,"")+"|^"+this.weekdaysShort(e,"")+"|^"+this.weekdaysMin(e,""),this._weekdaysParse[d]=new RegExp(f.replace(".",""),"i")),c&&"dddd"===b&&this._fullWeekdaysParse[d].test(a))return d;if(c&&"ddd"===b&&this._shortWeekdaysParse[d].test(a))return d;if(c&&"dd"===b&&this._minWeekdaysParse[d].test(a))return d;if(!c&&this._weekdaysParse[d].test(a))return d}}function Ka(a){if(!this.isValid())return null!=a?this:NaN;var b=this._isUTC?this._d.getUTCDay():this._d.getDay();return null!=a?(a=Da(a,this.localeData()),this.add(a-b,"d")):b}function La(a){if(!this.isValid())return null!=a?this:NaN;var b=(this.day()+7-this.localeData()._week.dow)%7;return null==a?b:this.add(a-b,"d")}function Ma(a){if(!this.isValid())return null!=a?this:NaN;if(null!=a){var b=Ea(a,this.localeData());return this.day(this.day()%7?b:b-7)}return this.day()||7}function Na(a){return this._weekdaysParseExact?(j(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysStrictRegex:this._weekdaysRegex):(j(this,"_weekdaysRegex")||(this._weekdaysRegex=ye),this._weekdaysStrictRegex&&a?this._weekdaysStrictRegex:this._weekdaysRegex)}function Oa(a){return this._weekdaysParseExact?(j(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(j(this,"_weekdaysShortRegex")||(this._weekdaysShortRegex=ze),this._weekdaysShortStrictRegex&&a?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function Pa(a){return this._weekdaysParseExact?(j(this,"_weekdaysRegex")||Qa.call(this),a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(j(this,"_weekdaysMinRegex")||(this._weekdaysMinRegex=Ae),this._weekdaysMinStrictRegex&&a?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function Qa(){function a(a,b){return b.length-a.length}var b,c,d,e,f,g=[],h=[],i=[],j=[];for(b=0;b<7;b++)c=l([2e3,1]).day(b),d=this.weekdaysMin(c,""),e=this.weekdaysShort(c,""),f=this.weekdays(c,""),g.push(d),h.push(e),i.push(f),j.push(d),j.push(e),j.push(f);for(g.sort(a),h.sort(a),i.sort(a),j.sort(a),b=0;b<7;b++)h[b]=aa(h[b]),i[b]=aa(i[b]),j[b]=aa(j[b]);this._weekdaysRegex=new RegExp("^("+j.join("|")+")","i"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp("^("+i.join("|")+")","i"),this._weekdaysShortStrictRegex=new RegExp("^("+h.join("|")+")","i"),this._weekdaysMinStrictRegex=new RegExp("^("+g.join("|")+")","i")}function Ra(){return this.hours()%12||12}function Sa(){return this.hours()||24}function Ta(a,b){U(a,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),b)})}function Ua(a,b){return b._meridiemParse}function Va(a){return"p"===(a+"").toLowerCase().charAt(0)}function Wa(a,b,c){return a>11?c?"pm":"PM":c?"am":"AM"}function Xa(a){return a?a.toLowerCase().replace("_","-"):a}function Ya(a){for(var b,c,d,e,f=0;f<a.length;){for(e=Xa(a[f]).split("-"),b=e.length,c=Xa(a[f+1]),c=c?c.split("-"):null;b>0;){if(d=Za(e.slice(0,b).join("-")))return d;if(c&&c.length>=b&&v(e,c,!0)>=b-1)break;b--}f++}return null}function Za(a){var b=null;if(!Fe[a]&&"undefined"!=typeof module&&module&&module.exports)try{b=Be._abbr,require("./locale/"+a),$a(b)}catch(a){}return Fe[a]}function $a(a,b){var c;return a&&(c=f(b)?bb(a):_a(a,b),c&&(Be=c)),Be._abbr}function _a(a,b){if(null!==b){var c=Ee;if(b.abbr=a,null!=Fe[a])y("defineLocaleOverride","use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info."),c=Fe[a]._config;else if(null!=b.parentLocale){if(null==Fe[b.parentLocale])return Ge[b.parentLocale]||(Ge[b.parentLocale]=[]),Ge[b.parentLocale].push({name:a,config:b}),null;c=Fe[b.parentLocale]._config}return Fe[a]=new C(B(c,b)),Ge[a]&&Ge[a].forEach(function(a){_a(a.name,a.config)}),$a(a),Fe[a]}return delete Fe[a],null}function ab(a,b){if(null!=b){var c,d=Ee;null!=Fe[a]&&(d=Fe[a]._config),b=B(d,b),c=new C(b),c.parentLocale=Fe[a],Fe[a]=c,$a(a)}else null!=Fe[a]&&(null!=Fe[a].parentLocale?Fe[a]=Fe[a].parentLocale:null!=Fe[a]&&delete Fe[a]);return Fe[a]}function bb(a){var b;if(a&&a._locale&&a._locale._abbr&&(a=a._locale._abbr),!a)return Be;if(!c(a)){if(b=Za(a))return b;a=[a]}return Ya(a)}function cb(){return Ad(Fe)}function db(a){var b,c=a._a;return c&&n(a).overflow===-2&&(b=c[fe]<0||c[fe]>11?fe:c[ge]<1||c[ge]>ea(c[ee],c[fe])?ge:c[he]<0||c[he]>24||24===c[he]&&(0!==c[ie]||0!==c[je]||0!==c[ke])?he:c[ie]<0||c[ie]>59?ie:c[je]<0||c[je]>59?je:c[ke]<0||c[ke]>999?ke:-1,n(a)._overflowDayOfYear&&(b<ee||b>ge)&&(b=ge),n(a)._overflowWeeks&&b===-1&&(b=le),n(a)._overflowWeekday&&b===-1&&(b=me),n(a).overflow=b),a}function eb(a){var b,c,d,e,f,g,h=a._i,i=He.exec(h)||Ie.exec(h);if(i){for(n(a).iso=!0,b=0,c=Ke.length;b<c;b++)if(Ke[b][1].exec(i[1])){e=Ke[b][0],d=Ke[b][2]!==!1;break}if(null==e)return void(a._isValid=!1);if(i[3]){for(b=0,c=Le.length;b<c;b++)if(Le[b][1].exec(i[3])){f=(i[2]||" ")+Le[b][0];break}if(null==f)return void(a._isValid=!1)}if(!d&&null!=f)return void(a._isValid=!1);if(i[4]){if(!Je.exec(i[4]))return void(a._isValid=!1);g="Z"}a._f=e+(f||"")+(g||""),lb(a)}else a._isValid=!1}function fb(a){var b,c,d,e,f,g,h,i,j={" GMT":" +0000"," EDT":" -0400"," EST":" -0500"," CDT":" -0500"," CST":" -0600"," MDT":" -0600"," MST":" -0700"," PDT":" -0700"," PST":" -0800"},k="YXWVUTSRQPONZABCDEFGHIKLM";if(b=a._i.replace(/\([^\)]*\)|[\n\t]/g," ").replace(/(\s\s+)/g," ").replace(/^\s|\s$/g,""),c=Ne.exec(b)){if(d=c[1]?"ddd"+(5===c[1].length?", ":" "):"",e="D MMM "+(c[2].length>10?"YYYY ":"YY "),f="HH:mm"+(c[4]?":ss":""),c[1]){var l=new Date(c[2]),m=["Sun","Mon","Tue","Wed","Thu","Fri","Sat"][l.getDay()];if(c[1].substr(0,3)!==m)return n(a).weekdayMismatch=!0,void(a._isValid=!1)}switch(c[5].length){case 2:0===i?h=" +0000":(i=k.indexOf(c[5][1].toUpperCase())-12,h=(i<0?" -":" +")+(""+i).replace(/^-?/,"0").match(/..$/)[0]+"00");break;case 4:h=j[c[5]];break;default:h=j[" GMT"]}c[5]=h,a._i=c.splice(1).join(""),g=" ZZ",a._f=d+e+f+g,lb(a),n(a).rfc2822=!0}else a._isValid=!1}function gb(b){var c=Me.exec(b._i);return null!==c?void(b._d=new Date(+c[1])):(eb(b),void(b._isValid===!1&&(delete b._isValid,fb(b),b._isValid===!1&&(delete b._isValid,a.createFromInputFallback(b)))))}function hb(a,b,c){return null!=a?a:null!=b?b:c}function ib(b){var c=new Date(a.now());return b._useUTC?[c.getUTCFullYear(),c.getUTCMonth(),c.getUTCDate()]:[c.getFullYear(),c.getMonth(),c.getDate()]}function jb(a){var b,c,d,e,f=[];if(!a._d){for(d=ib(a),a._w&&null==a._a[ge]&&null==a._a[fe]&&kb(a),null!=a._dayOfYear&&(e=hb(a._a[ee],d[ee]),(a._dayOfYear>pa(e)||0===a._dayOfYear)&&(n(a)._overflowDayOfYear=!0),c=ta(e,0,a._dayOfYear),a._a[fe]=c.getUTCMonth(),a._a[ge]=c.getUTCDate()),b=0;b<3&&null==a._a[b];++b)a._a[b]=f[b]=d[b];for(;b<7;b++)a._a[b]=f[b]=null==a._a[b]?2===b?1:0:a._a[b];24===a._a[he]&&0===a._a[ie]&&0===a._a[je]&&0===a._a[ke]&&(a._nextDay=!0,a._a[he]=0),a._d=(a._useUTC?ta:sa).apply(null,f),null!=a._tzm&&a._d.setUTCMinutes(a._d.getUTCMinutes()-a._tzm),a._nextDay&&(a._a[he]=24)}}function kb(a){var b,c,d,e,f,g,h,i;if(b=a._w,null!=b.GG||null!=b.W||null!=b.E)f=1,g=4,c=hb(b.GG,a._a[ee],wa(tb(),1,4).year),d=hb(b.W,1),e=hb(b.E,1),(e<1||e>7)&&(i=!0);else{f=a._locale._week.dow,g=a._locale._week.doy;var j=wa(tb(),f,g);c=hb(b.gg,a._a[ee],j.year),d=hb(b.w,j.week),null!=b.d?(e=b.d,(e<0||e>6)&&(i=!0)):null!=b.e?(e=b.e+f,(b.e<0||b.e>6)&&(i=!0)):e=f}d<1||d>xa(c,f,g)?n(a)._overflowWeeks=!0:null!=i?n(a)._overflowWeekday=!0:(h=va(c,d,e,f,g),a._a[ee]=h.year,a._dayOfYear=h.dayOfYear)}function lb(b){if(b._f===a.ISO_8601)return void eb(b);if(b._f===a.RFC_2822)return void fb(b);b._a=[],n(b).empty=!0;var c,d,e,f,g,h=""+b._i,i=h.length,j=0;for(e=Y(b._f,b._locale).match(Jd)||[],c=0;c<e.length;c++)f=e[c],d=(h.match($(f,b))||[])[0],d&&(g=h.substr(0,h.indexOf(d)),g.length>0&&n(b).unusedInput.push(g),h=h.slice(h.indexOf(d)+d.length),j+=d.length),Md[f]?(d?n(b).empty=!1:n(b).unusedTokens.push(f),da(f,d,b)):b._strict&&!d&&n(b).unusedTokens.push(f);n(b).charsLeftOver=i-j,h.length>0&&n(b).unusedInput.push(h),b._a[he]<=12&&n(b).bigHour===!0&&b._a[he]>0&&(n(b).bigHour=void 0),n(b).parsedDateParts=b._a.slice(0),n(b).meridiem=b._meridiem,b._a[he]=mb(b._locale,b._a[he],b._meridiem),jb(b),db(b)}function mb(a,b,c){var d;return null==c?b:null!=a.meridiemHour?a.meridiemHour(b,c):null!=a.isPM?(d=a.isPM(c),d&&b<12&&(b+=12),d||12!==b||(b=0),b):b}function nb(a){var b,c,d,e,f;if(0===a._f.length)return n(a).invalidFormat=!0,void(a._d=new Date(NaN));for(e=0;e<a._f.length;e++)f=0,b=q({},a),null!=a._useUTC&&(b._useUTC=a._useUTC),b._f=a._f[e],lb(b),o(b)&&(f+=n(b).charsLeftOver,f+=10*n(b).unusedTokens.length,n(b).score=f,(null==d||f<d)&&(d=f,c=b));k(a,c||b)}function ob(a){if(!a._d){var b=L(a._i);a._a=i([b.year,b.month,b.day||b.date,b.hour,b.minute,b.second,b.millisecond],function(a){return a&&parseInt(a,10)}),jb(a)}}function pb(a){var b=new r(db(qb(a)));return b._nextDay&&(b.add(1,"d"),b._nextDay=void 0),b}function qb(a){var b=a._i,d=a._f;return a._locale=a._locale||bb(a._l),null===b||void 0===d&&""===b?p({nullInput:!0}):("string"==typeof b&&(a._i=b=a._locale.preparse(b)),s(b)?new r(db(b)):(h(b)?a._d=b:c(d)?nb(a):d?lb(a):rb(a),o(a)||(a._d=null),a))}function rb(b){var e=b._i;f(e)?b._d=new Date(a.now()):h(e)?b._d=new Date(e.valueOf()):"string"==typeof e?gb(b):c(e)?(b._a=i(e.slice(0),function(a){return parseInt(a,10)}),jb(b)):d(e)?ob(b):g(e)?b._d=new Date(e):a.createFromInputFallback(b)}function sb(a,b,f,g,h){var i={};return f!==!0&&f!==!1||(g=f,f=void 0),(d(a)&&e(a)||c(a)&&0===a.length)&&(a=void 0),i._isAMomentObject=!0,i._useUTC=i._isUTC=h,i._l=f,i._i=a,i._f=b,i._strict=g,pb(i)}function tb(a,b,c,d){return sb(a,b,c,d,!1)}function ub(a,b){var d,e;if(1===b.length&&c(b[0])&&(b=b[0]),!b.length)return tb();for(d=b[0],e=1;e<b.length;++e)b[e].isValid()&&!b[e][a](d)||(d=b[e]);return d}function vb(){var a=[].slice.call(arguments,0);return ub("isBefore",a)}function wb(){var a=[].slice.call(arguments,0);return ub("isAfter",a)}function xb(a){for(var b in a)if(Re.indexOf(b)===-1||null!=a[b]&&isNaN(a[b]))return!1;for(var c=!1,d=0;d<Re.length;++d)if(a[Re[d]]){if(c)return!1;parseFloat(a[Re[d]])!==u(a[Re[d]])&&(c=!0)}return!0}function yb(){return this._isValid}function zb(){return Sb(NaN)}function Ab(a){var b=L(a),c=b.year||0,d=b.quarter||0,e=b.month||0,f=b.week||0,g=b.day||0,h=b.hour||0,i=b.minute||0,j=b.second||0,k=b.millisecond||0;this._isValid=xb(b),this._milliseconds=+k+1e3*j+6e4*i+1e3*h*60*60,this._days=+g+7*f,this._months=+e+3*d+12*c,this._data={},this._locale=bb(),this._bubble()}function Bb(a){return a instanceof Ab}function Cb(a){return a<0?Math.round(-1*a)*-1:Math.round(a)}function Db(a,b){U(a,0,0,function(){var a=this.utcOffset(),c="+";return a<0&&(a=-a,c="-"),c+T(~~(a/60),2)+b+T(~~a%60,2)})}function Eb(a,b){var c=(b||"").match(a);if(null===c)return null;var d=c[c.length-1]||[],e=(d+"").match(Se)||["-",0,0],f=+(60*e[1])+u(e[2]);return 0===f?0:"+"===e[0]?f:-f}function Fb(b,c){var d,e;return c._isUTC?(d=c.clone(),e=(s(b)||h(b)?b.valueOf():tb(b).valueOf())-d.valueOf(),d._d.setTime(d._d.valueOf()+e),a.updateOffset(d,!1),d):tb(b).local()}function Gb(a){return 15*-Math.round(a._d.getTimezoneOffset()/15)}function Hb(b,c,d){var e,f=this._offset||0;if(!this.isValid())return null!=b?this:NaN;if(null!=b){if("string"==typeof b){if(b=Eb(_d,b),null===b)return this}else Math.abs(b)<16&&!d&&(b=60*b);return!this._isUTC&&c&&(e=Gb(this)),this._offset=b,this._isUTC=!0,null!=e&&this.add(e,"m"),f!==b&&(!c||this._changeInProgress?Xb(this,Sb(b-f,"m"),1,!1):this._changeInProgress||(this._changeInProgress=!0,a.updateOffset(this,!0),this._changeInProgress=null)),this}return this._isUTC?f:Gb(this)}function Ib(a,b){return null!=a?("string"!=typeof a&&(a=-a),this.utcOffset(a,b),this):-this.utcOffset()}function Jb(a){return this.utcOffset(0,a)}function Kb(a){return this._isUTC&&(this.utcOffset(0,a),this._isUTC=!1,a&&this.subtract(Gb(this),"m")),this}function Lb(){if(null!=this._tzm)this.utcOffset(this._tzm,!1,!0);else if("string"==typeof this._i){var a=Eb($d,this._i);null!=a?this.utcOffset(a):this.utcOffset(0,!0)}return this}function Mb(a){return!!this.isValid()&&(a=a?tb(a).utcOffset():0,(this.utcOffset()-a)%60===0)}function Nb(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function Ob(){if(!f(this._isDSTShifted))return this._isDSTShifted;var a={};if(q(a,this),a=qb(a),a._a){var b=a._isUTC?l(a._a):tb(a._a);this._isDSTShifted=this.isValid()&&v(a._a,b.toArray())>0}else this._isDSTShifted=!1;return this._isDSTShifted}function Pb(){return!!this.isValid()&&!this._isUTC}function Qb(){return!!this.isValid()&&this._isUTC}function Rb(){return!!this.isValid()&&(this._isUTC&&0===this._offset)}function Sb(a,b){var c,d,e,f=a,h=null;return Bb(a)?f={ms:a._milliseconds,d:a._days,M:a._months}:g(a)?(f={},b?f[b]=a:f.milliseconds=a):(h=Te.exec(a))?(c="-"===h[1]?-1:1,f={y:0,d:u(h[ge])*c,h:u(h[he])*c,m:u(h[ie])*c,s:u(h[je])*c,ms:u(Cb(1e3*h[ke]))*c}):(h=Ue.exec(a))?(c="-"===h[1]?-1:1,f={y:Tb(h[2],c),M:Tb(h[3],c),w:Tb(h[4],c),d:Tb(h[5],c),h:Tb(h[6],c),m:Tb(h[7],c),s:Tb(h[8],c)}):null==f?f={}:"object"==typeof f&&("from"in f||"to"in f)&&(e=Vb(tb(f.from),tb(f.to)),f={},f.ms=e.milliseconds,f.M=e.months),d=new Ab(f),Bb(a)&&j(a,"_locale")&&(d._locale=a._locale),d}function Tb(a,b){var c=a&&parseFloat(a.replace(",","."));return(isNaN(c)?0:c)*b}function Ub(a,b){var c={milliseconds:0,months:0};return c.months=b.month()-a.month()+12*(b.year()-a.year()),a.clone().add(c.months,"M").isAfter(b)&&--c.months,c.milliseconds=+b-+a.clone().add(c.months,"M"),c}function Vb(a,b){var c;return a.isValid()&&b.isValid()?(b=Fb(b,a),a.isBefore(b)?c=Ub(a,b):(c=Ub(b,a),c.milliseconds=-c.milliseconds,c.months=-c.months),c):{milliseconds:0,months:0}}function Wb(a,b){return function(c,d){var e,f;return null===d||isNaN(+d)||(y(b,"moment()."+b+"(period, number) is deprecated. Please use moment()."+b+"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info."),f=c,c=d,d=f),c="string"==typeof c?+c:c,e=Sb(c,d),Xb(this,e,a),this}}function Xb(b,c,d,e){var f=c._milliseconds,g=Cb(c._days),h=Cb(c._months);b.isValid()&&(e=null==e||e,f&&b._d.setTime(b._d.valueOf()+f*d),g&&Q(b,"Date",P(b,"Date")+g*d),h&&ja(b,P(b,"Month")+h*d),e&&a.updateOffset(b,g||h))}function Yb(a,b){var c=a.diff(b,"days",!0);return c<-6?"sameElse":c<-1?"lastWeek":c<0?"lastDay":c<1?"sameDay":c<2?"nextDay":c<7?"nextWeek":"sameElse"}function Zb(b,c){var d=b||tb(),e=Fb(d,this).startOf("day"),f=a.calendarFormat(this,e)||"sameElse",g=c&&(z(c[f])?c[f].call(this,d):c[f]);return this.format(g||this.localeData().calendar(f,this,tb(d)))}function $b(){return new r(this)}function _b(a,b){var c=s(a)?a:tb(a);return!(!this.isValid()||!c.isValid())&&(b=K(f(b)?"millisecond":b),"millisecond"===b?this.valueOf()>c.valueOf():c.valueOf()<this.clone().startOf(b).valueOf())}function ac(a,b){var c=s(a)?a:tb(a);return!(!this.isValid()||!c.isValid())&&(b=K(f(b)?"millisecond":b),"millisecond"===b?this.valueOf()<c.valueOf():this.clone().endOf(b).valueOf()<c.valueOf())}function bc(a,b,c,d){return d=d||"()",("("===d[0]?this.isAfter(a,c):!this.isBefore(a,c))&&(")"===d[1]?this.isBefore(b,c):!this.isAfter(b,c))}function cc(a,b){var c,d=s(a)?a:tb(a);return!(!this.isValid()||!d.isValid())&&(b=K(b||"millisecond"),"millisecond"===b?this.valueOf()===d.valueOf():(c=d.valueOf(),this.clone().startOf(b).valueOf()<=c&&c<=this.clone().endOf(b).valueOf()))}function dc(a,b){return this.isSame(a,b)||this.isAfter(a,b)}function ec(a,b){return this.isSame(a,b)||this.isBefore(a,b)}function fc(a,b,c){var d,e,f,g;return this.isValid()?(d=Fb(a,this),d.isValid()?(e=6e4*(d.utcOffset()-this.utcOffset()),b=K(b),"year"===b||"month"===b||"quarter"===b?(g=gc(this,d),"quarter"===b?g/=3:"year"===b&&(g/=12)):(f=this-d,g="second"===b?f/1e3:"minute"===b?f/6e4:"hour"===b?f/36e5:"day"===b?(f-e)/864e5:"week"===b?(f-e)/6048e5:f),c?g:t(g)):NaN):NaN}function gc(a,b){var c,d,e=12*(b.year()-a.year())+(b.month()-a.month()),f=a.clone().add(e,"months");return b-f<0?(c=a.clone().add(e-1,"months"),d=(b-f)/(f-c)):(c=a.clone().add(e+1,"months"),d=(b-f)/(c-f)),-(e+d)||0}function hc(){return this.clone().locale("en").format("ddd MMM DD YYYY HH:mm:ss [GMT]ZZ")}function ic(){if(!this.isValid())return null;var a=this.clone().utc();return a.year()<0||a.year()>9999?X(a,"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]"):z(Date.prototype.toISOString)?this.toDate().toISOString():X(a,"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]")}function jc(){if(!this.isValid())return"moment.invalid(/* "+this._i+" */)";var a="moment",b="";this.isLocal()||(a=0===this.utcOffset()?"moment.utc":"moment.parseZone",b="Z");var c="["+a+'("]',d=0<=this.year()&&this.year()<=9999?"YYYY":"YYYYYY",e="-MM-DD[T]HH:mm:ss.SSS",f=b+'[")]';return this.format(c+d+e+f)}function kc(b){b||(b=this.isUtc()?a.defaultFormatUtc:a.defaultFormat);var c=X(this,b);return this.localeData().postformat(c)}function lc(a,b){return this.isValid()&&(s(a)&&a.isValid()||tb(a).isValid())?Sb({to:this,from:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function mc(a){return this.from(tb(),a)}function nc(a,b){return this.isValid()&&(s(a)&&a.isValid()||tb(a).isValid())?Sb({from:this,to:a}).locale(this.locale()).humanize(!b):this.localeData().invalidDate()}function oc(a){return this.to(tb(),a)}function pc(a){var b;return void 0===a?this._locale._abbr:(b=bb(a),null!=b&&(this._locale=b),this)}function qc(){return this._locale}function rc(a){switch(a=K(a)){case"year":this.month(0);case"quarter":case"month":this.date(1);case"week":case"isoWeek":case"day":case"date":this.hours(0);case"hour":this.minutes(0);case"minute":this.seconds(0);case"second":this.milliseconds(0)}return"week"===a&&this.weekday(0),"isoWeek"===a&&this.isoWeekday(1),"quarter"===a&&this.month(3*Math.floor(this.month()/3)),this}function sc(a){return a=K(a),void 0===a||"millisecond"===a?this:("date"===a&&(a="day"),this.startOf(a).add(1,"isoWeek"===a?"week":a).subtract(1,"ms"))}function tc(){return this._d.valueOf()-6e4*(this._offset||0)}function uc(){return Math.floor(this.valueOf()/1e3)}function vc(){return new Date(this.valueOf())}function wc(){var a=this;return[a.year(),a.month(),a.date(),a.hour(),a.minute(),a.second(),a.millisecond()]}function xc(){var a=this;return{years:a.year(),months:a.month(),date:a.date(),hours:a.hours(),minutes:a.minutes(),seconds:a.seconds(),milliseconds:a.milliseconds()}}function yc(){return this.isValid()?this.toISOString():null}function zc(){return o(this)}function Ac(){
278
- return k({},n(this))}function Bc(){return n(this).overflow}function Cc(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}function Dc(a,b){U(0,[a,a.length],0,b)}function Ec(a){return Ic.call(this,a,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function Fc(a){return Ic.call(this,a,this.isoWeek(),this.isoWeekday(),1,4)}function Gc(){return xa(this.year(),1,4)}function Hc(){var a=this.localeData()._week;return xa(this.year(),a.dow,a.doy)}function Ic(a,b,c,d,e){var f;return null==a?wa(this,d,e).year:(f=xa(a,d,e),b>f&&(b=f),Jc.call(this,a,b,c,d,e))}function Jc(a,b,c,d,e){var f=va(a,b,c,d,e),g=ta(f.year,0,f.dayOfYear);return this.year(g.getUTCFullYear()),this.month(g.getUTCMonth()),this.date(g.getUTCDate()),this}function Kc(a){return null==a?Math.ceil((this.month()+1)/3):this.month(3*(a-1)+this.month()%3)}function Lc(a){var b=Math.round((this.clone().startOf("day")-this.clone().startOf("year"))/864e5)+1;return null==a?b:this.add(a-b,"d")}function Mc(a,b){b[ke]=u(1e3*("0."+a))}function Nc(){return this._isUTC?"UTC":""}function Oc(){return this._isUTC?"Coordinated Universal Time":""}function Pc(a){return tb(1e3*a)}function Qc(){return tb.apply(null,arguments).parseZone()}function Rc(a){return a}function Sc(a,b,c,d){var e=bb(),f=l().set(d,b);return e[c](f,a)}function Tc(a,b,c){if(g(a)&&(b=a,a=void 0),a=a||"",null!=b)return Sc(a,b,c,"month");var d,e=[];for(d=0;d<12;d++)e[d]=Sc(a,d,c,"month");return e}function Uc(a,b,c,d){"boolean"==typeof a?(g(b)&&(c=b,b=void 0),b=b||""):(b=a,c=b,a=!1,g(b)&&(c=b,b=void 0),b=b||"");var e=bb(),f=a?e._week.dow:0;if(null!=c)return Sc(b,(c+f)%7,d,"day");var h,i=[];for(h=0;h<7;h++)i[h]=Sc(b,(h+f)%7,d,"day");return i}function Vc(a,b){return Tc(a,b,"months")}function Wc(a,b){return Tc(a,b,"monthsShort")}function Xc(a,b,c){return Uc(a,b,c,"weekdays")}function Yc(a,b,c){return Uc(a,b,c,"weekdaysShort")}function Zc(a,b,c){return Uc(a,b,c,"weekdaysMin")}function $c(){var a=this._data;return this._milliseconds=df(this._milliseconds),this._days=df(this._days),this._months=df(this._months),a.milliseconds=df(a.milliseconds),a.seconds=df(a.seconds),a.minutes=df(a.minutes),a.hours=df(a.hours),a.months=df(a.months),a.years=df(a.years),this}function _c(a,b,c,d){var e=Sb(b,c);return a._milliseconds+=d*e._milliseconds,a._days+=d*e._days,a._months+=d*e._months,a._bubble()}function ad(a,b){return _c(this,a,b,1)}function bd(a,b){return _c(this,a,b,-1)}function cd(a){return a<0?Math.floor(a):Math.ceil(a)}function dd(){var a,b,c,d,e,f=this._milliseconds,g=this._days,h=this._months,i=this._data;return f>=0&&g>=0&&h>=0||f<=0&&g<=0&&h<=0||(f+=864e5*cd(fd(h)+g),g=0,h=0),i.milliseconds=f%1e3,a=t(f/1e3),i.seconds=a%60,b=t(a/60),i.minutes=b%60,c=t(b/60),i.hours=c%24,g+=t(c/24),e=t(ed(g)),h+=e,g-=cd(fd(e)),d=t(h/12),h%=12,i.days=g,i.months=h,i.years=d,this}function ed(a){return 4800*a/146097}function fd(a){return 146097*a/4800}function gd(a){if(!this.isValid())return NaN;var b,c,d=this._milliseconds;if(a=K(a),"month"===a||"year"===a)return b=this._days+d/864e5,c=this._months+ed(b),"month"===a?c:c/12;switch(b=this._days+Math.round(fd(this._months)),a){case"week":return b/7+d/6048e5;case"day":return b+d/864e5;case"hour":return 24*b+d/36e5;case"minute":return 1440*b+d/6e4;case"second":return 86400*b+d/1e3;case"millisecond":return Math.floor(864e5*b)+d;default:throw new Error("Unknown unit "+a)}}function hd(){return this.isValid()?this._milliseconds+864e5*this._days+this._months%12*2592e6+31536e6*u(this._months/12):NaN}function id(a){return function(){return this.as(a)}}function jd(a){return a=K(a),this.isValid()?this[a+"s"]():NaN}function kd(a){return function(){return this.isValid()?this._data[a]:NaN}}function ld(){return t(this.days()/7)}function md(a,b,c,d,e){return e.relativeTime(b||1,!!c,a,d)}function nd(a,b,c){var d=Sb(a).abs(),e=uf(d.as("s")),f=uf(d.as("m")),g=uf(d.as("h")),h=uf(d.as("d")),i=uf(d.as("M")),j=uf(d.as("y")),k=e<=vf.ss&&["s",e]||e<vf.s&&["ss",e]||f<=1&&["m"]||f<vf.m&&["mm",f]||g<=1&&["h"]||g<vf.h&&["hh",g]||h<=1&&["d"]||h<vf.d&&["dd",h]||i<=1&&["M"]||i<vf.M&&["MM",i]||j<=1&&["y"]||["yy",j];return k[2]=b,k[3]=+a>0,k[4]=c,md.apply(null,k)}function od(a){return void 0===a?uf:"function"==typeof a&&(uf=a,!0)}function pd(a,b){return void 0!==vf[a]&&(void 0===b?vf[a]:(vf[a]=b,"s"===a&&(vf.ss=b-1),!0))}function qd(a){if(!this.isValid())return this.localeData().invalidDate();var b=this.localeData(),c=nd(this,!a,b);return a&&(c=b.pastFuture(+this,c)),b.postformat(c)}function rd(){if(!this.isValid())return this.localeData().invalidDate();var a,b,c,d=wf(this._milliseconds)/1e3,e=wf(this._days),f=wf(this._months);a=t(d/60),b=t(a/60),d%=60,a%=60,c=t(f/12),f%=12;var g=c,h=f,i=e,j=b,k=a,l=d,m=this.asSeconds();return m?(m<0?"-":"")+"P"+(g?g+"Y":"")+(h?h+"M":"")+(i?i+"D":"")+(j||k||l?"T":"")+(j?j+"H":"")+(k?k+"M":"")+(l?l+"S":""):"P0D"}var sd,td;td=Array.prototype.some?Array.prototype.some:function(a){for(var b=Object(this),c=b.length>>>0,d=0;d<c;d++)if(d in b&&a.call(this,b[d],d,b))return!0;return!1};var ud=td,vd=a.momentProperties=[],wd=!1,xd={};a.suppressDeprecationWarnings=!1,a.deprecationHandler=null;var yd;yd=Object.keys?Object.keys:function(a){var b,c=[];for(b in a)j(a,b)&&c.push(b);return c};var zd,Ad=yd,Bd={sameDay:"[Today at] LT",nextDay:"[Tomorrow at] LT",nextWeek:"dddd [at] LT",lastDay:"[Yesterday at] LT",lastWeek:"[Last] dddd [at] LT",sameElse:"L"},Cd={LTS:"h:mm:ss A",LT:"h:mm A",L:"MM/DD/YYYY",LL:"MMMM D, YYYY",LLL:"MMMM D, YYYY h:mm A",LLLL:"dddd, MMMM D, YYYY h:mm A"},Dd="Invalid date",Ed="%d",Fd=/\d{1,2}/,Gd={future:"in %s",past:"%s ago",s:"a few seconds",ss:"%d seconds",m:"a minute",mm:"%d minutes",h:"an hour",hh:"%d hours",d:"a day",dd:"%d days",M:"a month",MM:"%d months",y:"a year",yy:"%d years"},Hd={},Id={},Jd=/(\[[^\[]*\])|(\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|YYYYYY|YYYYY|YYYY|YY|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,Kd=/(\[[^\[]*\])|(\\)?(LTS|LT|LL?L?L?|l{1,4})/g,Ld={},Md={},Nd=/\d/,Od=/\d\d/,Pd=/\d{3}/,Qd=/\d{4}/,Rd=/[+-]?\d{6}/,Sd=/\d\d?/,Td=/\d\d\d\d?/,Ud=/\d\d\d\d\d\d?/,Vd=/\d{1,3}/,Wd=/\d{1,4}/,Xd=/[+-]?\d{1,6}/,Yd=/\d+/,Zd=/[+-]?\d+/,$d=/Z|[+-]\d\d:?\d\d/gi,_d=/Z|[+-]\d\d(?::?\d\d)?/gi,ae=/[+-]?\d+(\.\d{1,3})?/,be=/[0-9]*['a-z\u00A0-\u05FF\u0700-\uD7FF\uF900-\uFDCF\uFDF0-\uFFEF]+|[\u0600-\u06FF\/]+(\s*?[\u0600-\u06FF]+){1,2}/i,ce={},de={},ee=0,fe=1,ge=2,he=3,ie=4,je=5,ke=6,le=7,me=8;zd=Array.prototype.indexOf?Array.prototype.indexOf:function(a){var b;for(b=0;b<this.length;++b)if(this[b]===a)return b;return-1};var ne=zd;U("M",["MM",2],"Mo",function(){return this.month()+1}),U("MMM",0,0,function(a){return this.localeData().monthsShort(this,a)}),U("MMMM",0,0,function(a){return this.localeData().months(this,a)}),J("month","M"),M("month",8),Z("M",Sd),Z("MM",Sd,Od),Z("MMM",function(a,b){return b.monthsShortRegex(a)}),Z("MMMM",function(a,b){return b.monthsRegex(a)}),ba(["M","MM"],function(a,b){b[fe]=u(a)-1}),ba(["MMM","MMMM"],function(a,b,c,d){var e=c._locale.monthsParse(a,d,c._strict);null!=e?b[fe]=e:n(c).invalidMonth=a});var oe=/D[oD]?(\[[^\[\]]*\]|\s)+MMMM?/,pe="January_February_March_April_May_June_July_August_September_October_November_December".split("_"),qe="Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec".split("_"),re=be,se=be;U("Y",0,0,function(){var a=this.year();return a<=9999?""+a:"+"+a}),U(0,["YY",2],0,function(){return this.year()%100}),U(0,["YYYY",4],0,"year"),U(0,["YYYYY",5],0,"year"),U(0,["YYYYYY",6,!0],0,"year"),J("year","y"),M("year",1),Z("Y",Zd),Z("YY",Sd,Od),Z("YYYY",Wd,Qd),Z("YYYYY",Xd,Rd),Z("YYYYYY",Xd,Rd),ba(["YYYYY","YYYYYY"],ee),ba("YYYY",function(b,c){c[ee]=2===b.length?a.parseTwoDigitYear(b):u(b)}),ba("YY",function(b,c){c[ee]=a.parseTwoDigitYear(b)}),ba("Y",function(a,b){b[ee]=parseInt(a,10)}),a.parseTwoDigitYear=function(a){return u(a)+(u(a)>68?1900:2e3)};var te=O("FullYear",!0);U("w",["ww",2],"wo","week"),U("W",["WW",2],"Wo","isoWeek"),J("week","w"),J("isoWeek","W"),M("week",5),M("isoWeek",5),Z("w",Sd),Z("ww",Sd,Od),Z("W",Sd),Z("WW",Sd,Od),ca(["w","ww","W","WW"],function(a,b,c,d){b[d.substr(0,1)]=u(a)});var ue={dow:0,doy:6};U("d",0,"do","day"),U("dd",0,0,function(a){return this.localeData().weekdaysMin(this,a)}),U("ddd",0,0,function(a){return this.localeData().weekdaysShort(this,a)}),U("dddd",0,0,function(a){return this.localeData().weekdays(this,a)}),U("e",0,0,"weekday"),U("E",0,0,"isoWeekday"),J("day","d"),J("weekday","e"),J("isoWeekday","E"),M("day",11),M("weekday",11),M("isoWeekday",11),Z("d",Sd),Z("e",Sd),Z("E",Sd),Z("dd",function(a,b){return b.weekdaysMinRegex(a)}),Z("ddd",function(a,b){return b.weekdaysShortRegex(a)}),Z("dddd",function(a,b){return b.weekdaysRegex(a)}),ca(["dd","ddd","dddd"],function(a,b,c,d){var e=c._locale.weekdaysParse(a,d,c._strict);null!=e?b.d=e:n(c).invalidWeekday=a}),ca(["d","e","E"],function(a,b,c,d){b[d]=u(a)});var ve="Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),we="Sun_Mon_Tue_Wed_Thu_Fri_Sat".split("_"),xe="Su_Mo_Tu_We_Th_Fr_Sa".split("_"),ye=be,ze=be,Ae=be;U("H",["HH",2],0,"hour"),U("h",["hh",2],0,Ra),U("k",["kk",2],0,Sa),U("hmm",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)}),U("hmmss",0,0,function(){return""+Ra.apply(this)+T(this.minutes(),2)+T(this.seconds(),2)}),U("Hmm",0,0,function(){return""+this.hours()+T(this.minutes(),2)}),U("Hmmss",0,0,function(){return""+this.hours()+T(this.minutes(),2)+T(this.seconds(),2)}),Ta("a",!0),Ta("A",!1),J("hour","h"),M("hour",13),Z("a",Ua),Z("A",Ua),Z("H",Sd),Z("h",Sd),Z("k",Sd),Z("HH",Sd,Od),Z("hh",Sd,Od),Z("kk",Sd,Od),Z("hmm",Td),Z("hmmss",Ud),Z("Hmm",Td),Z("Hmmss",Ud),ba(["H","HH"],he),ba(["k","kk"],function(a,b,c){var d=u(a);b[he]=24===d?0:d}),ba(["a","A"],function(a,b,c){c._isPm=c._locale.isPM(a),c._meridiem=a}),ba(["h","hh"],function(a,b,c){b[he]=u(a),n(c).bigHour=!0}),ba("hmm",function(a,b,c){var d=a.length-2;b[he]=u(a.substr(0,d)),b[ie]=u(a.substr(d)),n(c).bigHour=!0}),ba("hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[he]=u(a.substr(0,d)),b[ie]=u(a.substr(d,2)),b[je]=u(a.substr(e)),n(c).bigHour=!0}),ba("Hmm",function(a,b,c){var d=a.length-2;b[he]=u(a.substr(0,d)),b[ie]=u(a.substr(d))}),ba("Hmmss",function(a,b,c){var d=a.length-4,e=a.length-2;b[he]=u(a.substr(0,d)),b[ie]=u(a.substr(d,2)),b[je]=u(a.substr(e))});var Be,Ce=/[ap]\.?m?\.?/i,De=O("Hours",!0),Ee={calendar:Bd,longDateFormat:Cd,invalidDate:Dd,ordinal:Ed,dayOfMonthOrdinalParse:Fd,relativeTime:Gd,months:pe,monthsShort:qe,week:ue,weekdays:ve,weekdaysMin:xe,weekdaysShort:we,meridiemParse:Ce},Fe={},Ge={},He=/^\s*((?:[+-]\d{6}|\d{4})-(?:\d\d-\d\d|W\d\d-\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?::\d\d(?::\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Ie=/^\s*((?:[+-]\d{6}|\d{4})(?:\d\d\d\d|W\d\d\d|W\d\d|\d\d\d|\d\d))(?:(T| )(\d\d(?:\d\d(?:\d\d(?:[.,]\d+)?)?)?)([\+\-]\d\d(?::?\d\d)?|\s*Z)?)?$/,Je=/Z|[+-]\d\d(?::?\d\d)?/,Ke=[["YYYYYY-MM-DD",/[+-]\d{6}-\d\d-\d\d/],["YYYY-MM-DD",/\d{4}-\d\d-\d\d/],["GGGG-[W]WW-E",/\d{4}-W\d\d-\d/],["GGGG-[W]WW",/\d{4}-W\d\d/,!1],["YYYY-DDD",/\d{4}-\d{3}/],["YYYY-MM",/\d{4}-\d\d/,!1],["YYYYYYMMDD",/[+-]\d{10}/],["YYYYMMDD",/\d{8}/],["GGGG[W]WWE",/\d{4}W\d{3}/],["GGGG[W]WW",/\d{4}W\d{2}/,!1],["YYYYDDD",/\d{7}/]],Le=[["HH:mm:ss.SSSS",/\d\d:\d\d:\d\d\.\d+/],["HH:mm:ss,SSSS",/\d\d:\d\d:\d\d,\d+/],["HH:mm:ss",/\d\d:\d\d:\d\d/],["HH:mm",/\d\d:\d\d/],["HHmmss.SSSS",/\d\d\d\d\d\d\.\d+/],["HHmmss,SSSS",/\d\d\d\d\d\d,\d+/],["HHmmss",/\d\d\d\d\d\d/],["HHmm",/\d\d\d\d/],["HH",/\d\d/]],Me=/^\/?Date\((\-?\d+)/i,Ne=/^((?:Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\s)?(\d?\d\s(?:Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s(?:\d\d)?\d\d\s)(\d\d:\d\d)(\:\d\d)?(\s(?:UT|GMT|[ECMP][SD]T|[A-IK-Za-ik-z]|[+-]\d{4}))$/;a.createFromInputFallback=x("value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged and will be removed in an upcoming major release. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.",function(a){a._d=new Date(a._i+(a._useUTC?" UTC":""))}),a.ISO_8601=function(){},a.RFC_2822=function(){};var Oe=x("moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=tb.apply(null,arguments);return this.isValid()&&a.isValid()?a<this?this:a:p()}),Pe=x("moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/",function(){var a=tb.apply(null,arguments);return this.isValid()&&a.isValid()?a>this?this:a:p()}),Qe=function(){return Date.now?Date.now():+new Date},Re=["year","quarter","month","week","day","hour","minute","second","millisecond"];Db("Z",":"),Db("ZZ",""),Z("Z",_d),Z("ZZ",_d),ba(["Z","ZZ"],function(a,b,c){c._useUTC=!0,c._tzm=Eb(_d,a)});var Se=/([\+\-]|\d\d)/gi;a.updateOffset=function(){};var Te=/^(\-)?(?:(\d*)[. ])?(\d+)\:(\d+)(?:\:(\d+)(\.\d*)?)?$/,Ue=/^(-)?P(?:(-?[0-9,.]*)Y)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)W)?(?:(-?[0-9,.]*)D)?(?:T(?:(-?[0-9,.]*)H)?(?:(-?[0-9,.]*)M)?(?:(-?[0-9,.]*)S)?)?$/;Sb.fn=Ab.prototype,Sb.invalid=zb;var Ve=Wb(1,"add"),We=Wb(-1,"subtract");a.defaultFormat="YYYY-MM-DDTHH:mm:ssZ",a.defaultFormatUtc="YYYY-MM-DDTHH:mm:ss[Z]";var Xe=x("moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.",function(a){return void 0===a?this.localeData():this.locale(a)});U(0,["gg",2],0,function(){return this.weekYear()%100}),U(0,["GG",2],0,function(){return this.isoWeekYear()%100}),Dc("gggg","weekYear"),Dc("ggggg","weekYear"),Dc("GGGG","isoWeekYear"),Dc("GGGGG","isoWeekYear"),J("weekYear","gg"),J("isoWeekYear","GG"),M("weekYear",1),M("isoWeekYear",1),Z("G",Zd),Z("g",Zd),Z("GG",Sd,Od),Z("gg",Sd,Od),Z("GGGG",Wd,Qd),Z("gggg",Wd,Qd),Z("GGGGG",Xd,Rd),Z("ggggg",Xd,Rd),ca(["gggg","ggggg","GGGG","GGGGG"],function(a,b,c,d){b[d.substr(0,2)]=u(a)}),ca(["gg","GG"],function(b,c,d,e){c[e]=a.parseTwoDigitYear(b)}),U("Q",0,"Qo","quarter"),J("quarter","Q"),M("quarter",7),Z("Q",Nd),ba("Q",function(a,b){b[fe]=3*(u(a)-1)}),U("D",["DD",2],"Do","date"),J("date","D"),M("date",9),Z("D",Sd),Z("DD",Sd,Od),Z("Do",function(a,b){return a?b._dayOfMonthOrdinalParse||b._ordinalParse:b._dayOfMonthOrdinalParseLenient}),ba(["D","DD"],ge),ba("Do",function(a,b){b[ge]=u(a.match(Sd)[0],10)});var Ye=O("Date",!0);U("DDD",["DDDD",3],"DDDo","dayOfYear"),J("dayOfYear","DDD"),M("dayOfYear",4),Z("DDD",Vd),Z("DDDD",Pd),ba(["DDD","DDDD"],function(a,b,c){c._dayOfYear=u(a)}),U("m",["mm",2],0,"minute"),J("minute","m"),M("minute",14),Z("m",Sd),Z("mm",Sd,Od),ba(["m","mm"],ie);var Ze=O("Minutes",!1);U("s",["ss",2],0,"second"),J("second","s"),M("second",15),Z("s",Sd),Z("ss",Sd,Od),ba(["s","ss"],je);var $e=O("Seconds",!1);U("S",0,0,function(){return~~(this.millisecond()/100)}),U(0,["SS",2],0,function(){return~~(this.millisecond()/10)}),U(0,["SSS",3],0,"millisecond"),U(0,["SSSS",4],0,function(){return 10*this.millisecond()}),U(0,["SSSSS",5],0,function(){return 100*this.millisecond()}),U(0,["SSSSSS",6],0,function(){return 1e3*this.millisecond()}),U(0,["SSSSSSS",7],0,function(){return 1e4*this.millisecond()}),U(0,["SSSSSSSS",8],0,function(){return 1e5*this.millisecond()}),U(0,["SSSSSSSSS",9],0,function(){return 1e6*this.millisecond()}),J("millisecond","ms"),M("millisecond",16),Z("S",Vd,Nd),Z("SS",Vd,Od),Z("SSS",Vd,Pd);var _e;for(_e="SSSS";_e.length<=9;_e+="S")Z(_e,Yd);for(_e="S";_e.length<=9;_e+="S")ba(_e,Mc);var af=O("Milliseconds",!1);U("z",0,0,"zoneAbbr"),U("zz",0,0,"zoneName");var bf=r.prototype;bf.add=Ve,bf.calendar=Zb,bf.clone=$b,bf.diff=fc,bf.endOf=sc,bf.format=kc,bf.from=lc,bf.fromNow=mc,bf.to=nc,bf.toNow=oc,bf.get=R,bf.invalidAt=Bc,bf.isAfter=_b,bf.isBefore=ac,bf.isBetween=bc,bf.isSame=cc,bf.isSameOrAfter=dc,bf.isSameOrBefore=ec,bf.isValid=zc,bf.lang=Xe,bf.locale=pc,bf.localeData=qc,bf.max=Pe,bf.min=Oe,bf.parsingFlags=Ac,bf.set=S,bf.startOf=rc,bf.subtract=We,bf.toArray=wc,bf.toObject=xc,bf.toDate=vc,bf.toISOString=ic,bf.inspect=jc,bf.toJSON=yc,bf.toString=hc,bf.unix=uc,bf.valueOf=tc,bf.creationData=Cc,bf.year=te,bf.isLeapYear=ra,bf.weekYear=Ec,bf.isoWeekYear=Fc,bf.quarter=bf.quarters=Kc,bf.month=ka,bf.daysInMonth=la,bf.week=bf.weeks=Ba,bf.isoWeek=bf.isoWeeks=Ca,bf.weeksInYear=Hc,bf.isoWeeksInYear=Gc,bf.date=Ye,bf.day=bf.days=Ka,bf.weekday=La,bf.isoWeekday=Ma,bf.dayOfYear=Lc,bf.hour=bf.hours=De,bf.minute=bf.minutes=Ze,bf.second=bf.seconds=$e,bf.millisecond=bf.milliseconds=af,bf.utcOffset=Hb,bf.utc=Jb,bf.local=Kb,bf.parseZone=Lb,bf.hasAlignedHourOffset=Mb,bf.isDST=Nb,bf.isLocal=Pb,bf.isUtcOffset=Qb,bf.isUtc=Rb,bf.isUTC=Rb,bf.zoneAbbr=Nc,bf.zoneName=Oc,bf.dates=x("dates accessor is deprecated. Use date instead.",Ye),bf.months=x("months accessor is deprecated. Use month instead",ka),bf.years=x("years accessor is deprecated. Use year instead",te),bf.zone=x("moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/",Ib),bf.isDSTShifted=x("isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information",Ob);var cf=C.prototype;cf.calendar=D,cf.longDateFormat=E,cf.invalidDate=F,cf.ordinal=G,cf.preparse=Rc,cf.postformat=Rc,cf.relativeTime=H,cf.pastFuture=I,cf.set=A,cf.months=fa,cf.monthsShort=ga,cf.monthsParse=ia,cf.monthsRegex=na,cf.monthsShortRegex=ma,cf.week=ya,cf.firstDayOfYear=Aa,cf.firstDayOfWeek=za,cf.weekdays=Fa,cf.weekdaysMin=Ha,cf.weekdaysShort=Ga,cf.weekdaysParse=Ja,cf.weekdaysRegex=Na,cf.weekdaysShortRegex=Oa,cf.weekdaysMinRegex=Pa,cf.isPM=Va,cf.meridiem=Wa,$a("en",{dayOfMonthOrdinalParse:/\d{1,2}(th|st|nd|rd)/,ordinal:function(a){var b=a%10,c=1===u(a%100/10)?"th":1===b?"st":2===b?"nd":3===b?"rd":"th";return a+c}}),a.lang=x("moment.lang is deprecated. Use moment.locale instead.",$a),a.langData=x("moment.langData is deprecated. Use moment.localeData instead.",bb);var df=Math.abs,ef=id("ms"),ff=id("s"),gf=id("m"),hf=id("h"),jf=id("d"),kf=id("w"),lf=id("M"),mf=id("y"),nf=kd("milliseconds"),of=kd("seconds"),pf=kd("minutes"),qf=kd("hours"),rf=kd("days"),sf=kd("months"),tf=kd("years"),uf=Math.round,vf={ss:44,s:45,m:45,h:22,d:26,M:11},wf=Math.abs,xf=Ab.prototype;return xf.isValid=yb,xf.abs=$c,xf.add=ad,xf.subtract=bd,xf.as=gd,xf.asMilliseconds=ef,xf.asSeconds=ff,xf.asMinutes=gf,xf.asHours=hf,xf.asDays=jf,xf.asWeeks=kf,xf.asMonths=lf,xf.asYears=mf,xf.valueOf=hd,xf._bubble=dd,xf.get=jd,xf.milliseconds=nf,xf.seconds=of,xf.minutes=pf,xf.hours=qf,xf.days=rf,xf.weeks=ld,xf.months=sf,xf.years=tf,xf.humanize=qd,xf.toISOString=rd,xf.toString=rd,xf.toJSON=rd,xf.locale=pc,xf.localeData=qc,xf.toIsoString=x("toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)",rd),xf.lang=Xe,U("X",0,0,"unix"),U("x",0,0,"valueOf"),Z("x",Zd),Z("X",ae),ba("X",function(a,b,c){c._d=new Date(1e3*parseFloat(a,10))}),ba("x",function(a,b,c){c._d=new Date(u(a))}),a.version="2.18.1",b(tb),a.fn=bf,a.min=vb,a.max=wb,a.now=Qe,a.utc=l,a.unix=Pc,a.months=Vc,a.isDate=h,a.locale=$a,a.invalid=p,a.duration=Sb,a.isMoment=s,a.weekdays=Xc,a.parseZone=Qc,a.localeData=bb,a.isDuration=Bb,a.monthsShort=Wc,a.weekdaysMin=Zc,a.defineLocale=_a,a.updateLocale=ab,a.locales=cb,a.weekdaysShort=Yc,a.normalizeUnits=K,a.relativeTimeRounding=od,a.relativeTimeThreshold=pd,a.calendarFormat=Yb,a.prototype=bf,a});
279
 
 
 
 
 
 
280
 
 
281
 
 
 
 
 
 
 
 
 
 
 
 
 
 
282
 
 
283
 
284
- /*!
285
- FullCalendar Core Package v4.3.1
286
- Docs & License: https://fullcalendar.io/
287
- (c) 2019 Adam Shaw
288
- */
289
 
290
- (function (global, factory) {
291
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
292
- typeof define === 'function' && define.amd ? define(['exports'], factory) :
293
- (global = global || self, factory(global.FullCalendar = {}));
294
- }(this, function (exports) { 'use strict';
295
 
296
- // Creating
297
- // ----------------------------------------------------------------------------------------------------------------
298
- var elementPropHash = {
299
- className: true,
300
- colSpan: true,
301
- rowSpan: true
302
- };
303
- var containerTagHash = {
304
- '<tr': 'tbody',
305
- '<td': 'tr'
306
- };
307
- function createElement(tagName, attrs, content) {
308
- var el = document.createElement(tagName);
309
- if (attrs) {
310
- for (var attrName in attrs) {
311
- if (attrName === 'style') {
312
- applyStyle(el, attrs[attrName]);
313
- }
314
- else if (elementPropHash[attrName]) {
315
- el[attrName] = attrs[attrName];
316
- }
317
- else {
318
- el.setAttribute(attrName, attrs[attrName]);
319
- }
320
- }
321
- }
322
- if (typeof content === 'string') {
323
- el.innerHTML = content; // shortcut. no need to process HTML in any way
324
- }
325
- else if (content != null) {
326
- appendToElement(el, content);
327
- }
328
- return el;
329
- }
330
- function htmlToElement(html) {
331
- html = html.trim();
332
- var container = document.createElement(computeContainerTag(html));
333
- container.innerHTML = html;
334
- return container.firstChild;
335
- }
336
- function htmlToElements(html) {
337
- return Array.prototype.slice.call(htmlToNodeList(html));
338
- }
339
- function htmlToNodeList(html) {
340
- html = html.trim();
341
- var container = document.createElement(computeContainerTag(html));
342
- container.innerHTML = html;
343
- return container.childNodes;
344
- }
345
- // assumes html already trimmed and tag names are lowercase
346
- function computeContainerTag(html) {
347
- return containerTagHash[html.substr(0, 3) // faster than using regex
348
- ] || 'div';
349
- }
350
- function appendToElement(el, content) {
351
- var childNodes = normalizeContent(content);
352
- for (var i = 0; i < childNodes.length; i++) {
353
- el.appendChild(childNodes[i]);
354
- }
355
- }
356
- function prependToElement(parent, content) {
357
- var newEls = normalizeContent(content);
358
- var afterEl = parent.firstChild || null; // if no firstChild, will append to end, but that's okay, b/c there were no children
359
- for (var i = 0; i < newEls.length; i++) {
360
- parent.insertBefore(newEls[i], afterEl);
361
- }
362
- }
363
- function insertAfterElement(refEl, content) {
364
- var newEls = normalizeContent(content);
365
- var afterEl = refEl.nextSibling || null;
366
- for (var i = 0; i < newEls.length; i++) {
367
- refEl.parentNode.insertBefore(newEls[i], afterEl);
368
- }
369
- }
370
- function normalizeContent(content) {
371
- var els;
372
- if (typeof content === 'string') {
373
- els = htmlToElements(content);
374
- }
375
- else if (content instanceof Node) {
376
- els = [content];
377
- }
378
- else { // Node[] or NodeList
379
- els = Array.prototype.slice.call(content);
380
- }
381
- return els;
382
- }
383
- function removeElement(el) {
384
- if (el.parentNode) {
385
- el.parentNode.removeChild(el);
386
- }
387
- }
388
- // Querying
389
- // ----------------------------------------------------------------------------------------------------------------
390
- // from https://developer.mozilla.org/en-US/docs/Web/API/Element/closest
391
- var matchesMethod = Element.prototype.matches ||
392
- Element.prototype.matchesSelector ||
393
- Element.prototype.msMatchesSelector;
394
- var closestMethod = Element.prototype.closest || function (selector) {
395
- // polyfill
396
- var el = this;
397
- if (!document.documentElement.contains(el)) {
398
- return null;
399
- }
400
- do {
401
- if (elementMatches(el, selector)) {
402
- return el;
403
- }
404
- el = el.parentElement || el.parentNode;
405
- } while (el !== null && el.nodeType === 1);
406
- return null;
407
- };
408
- function elementClosest(el, selector) {
409
- return closestMethod.call(el, selector);
410
- }
411
- function elementMatches(el, selector) {
412
- return matchesMethod.call(el, selector);
413
- }
414
- // accepts multiple subject els
415
- // returns a real array. good for methods like forEach
416
- function findElements(container, selector) {
417
- var containers = container instanceof HTMLElement ? [container] : container;
418
- var allMatches = [];
419
- for (var i = 0; i < containers.length; i++) {
420
- var matches = containers[i].querySelectorAll(selector);
421
- for (var j = 0; j < matches.length; j++) {
422
- allMatches.push(matches[j]);
423
- }
424
- }
425
- return allMatches;
426
- }
427
- // accepts multiple subject els
428
- // only queries direct child elements
429
- function findChildren(parent, selector) {
430
- var parents = parent instanceof HTMLElement ? [parent] : parent;
431
- var allMatches = [];
432
- for (var i = 0; i < parents.length; i++) {
433
- var childNodes = parents[i].children; // only ever elements
434
- for (var j = 0; j < childNodes.length; j++) {
435
- var childNode = childNodes[j];
436
- if (!selector || elementMatches(childNode, selector)) {
437
- allMatches.push(childNode);
438
- }
439
- }
440
- }
441
- return allMatches;
442
- }
443
- // Attributes
444
- // ----------------------------------------------------------------------------------------------------------------
445
- function forceClassName(el, className, bool) {
446
- if (bool) {
447
- el.classList.add(className);
448
- }
449
- else {
450
- el.classList.remove(className);
451
- }
452
- }
453
- // Style
454
- // ----------------------------------------------------------------------------------------------------------------
455
- var PIXEL_PROP_RE = /(top|left|right|bottom|width|height)$/i;
456
- function applyStyle(el, props) {
457
- for (var propName in props) {
458
- applyStyleProp(el, propName, props[propName]);
459
- }
460
- }
461
- function applyStyleProp(el, name, val) {
462
- if (val == null) {
463
- el.style[name] = '';
464
- }
465
- else if (typeof val === 'number' && PIXEL_PROP_RE.test(name)) {
466
- el.style[name] = val + 'px';
467
- }
468
- else {
469
- el.style[name] = val;
470
- }
471
- }
472
 
473
- function pointInsideRect(point, rect) {
474
- return point.left >= rect.left &&
475
- point.left < rect.right &&
476
- point.top >= rect.top &&
477
- point.top < rect.bottom;
478
- }
479
- // Returns a new rectangle that is the intersection of the two rectangles. If they don't intersect, returns false
480
- function intersectRects(rect1, rect2) {
481
- var res = {
482
- left: Math.max(rect1.left, rect2.left),
483
- right: Math.min(rect1.right, rect2.right),
484
- top: Math.max(rect1.top, rect2.top),
485
- bottom: Math.min(rect1.bottom, rect2.bottom)
486
- };
487
- if (res.left < res.right && res.top < res.bottom) {
488
- return res;
489
- }
490
- return false;
491
- }
492
- function translateRect(rect, deltaX, deltaY) {
493
- return {
494
- left: rect.left + deltaX,
495
- right: rect.right + deltaX,
496
- top: rect.top + deltaY,
497
- bottom: rect.bottom + deltaY
498
- };
499
- }
500
- // Returns a new point that will have been moved to reside within the given rectangle
501
- function constrainPoint(point, rect) {
502
- return {
503
- left: Math.min(Math.max(point.left, rect.left), rect.right),
504
- top: Math.min(Math.max(point.top, rect.top), rect.bottom)
505
- };
506
- }
507
- // Returns a point that is the center of the given rectangle
508
- function getRectCenter(rect) {
509
- return {
510
- left: (rect.left + rect.right) / 2,
511
- top: (rect.top + rect.bottom) / 2
512
- };
513
- }
514
- // Subtracts point2's coordinates from point1's coordinates, returning a delta
515
- function diffPoints(point1, point2) {
516
- return {
517
- left: point1.left - point2.left,
518
- top: point1.top - point2.top
519
- };
520
- }
521
 
522
- // Logic for determining if, when the element is right-to-left, the scrollbar appears on the left side
523
- var isRtlScrollbarOnLeft = null;
524
- function getIsRtlScrollbarOnLeft() {
525
- if (isRtlScrollbarOnLeft === null) {
526
- isRtlScrollbarOnLeft = computeIsRtlScrollbarOnLeft();
527
- }
528
- return isRtlScrollbarOnLeft;
529
- }
530
- function computeIsRtlScrollbarOnLeft() {
531
- var outerEl = createElement('div', {
532
- style: {
533
- position: 'absolute',
534
- top: -1000,
535
- left: 0,
536
- border: 0,
537
- padding: 0,
538
- overflow: 'scroll',
539
- direction: 'rtl'
540
- }
541
- }, '<div></div>');
542
- document.body.appendChild(outerEl);
543
- var innerEl = outerEl.firstChild;
544
- var res = innerEl.getBoundingClientRect().left > outerEl.getBoundingClientRect().left;
545
- removeElement(outerEl);
546
- return res;
547
- }
548
- // The scrollbar width computations in computeEdges are sometimes flawed when it comes to
549
- // retina displays, rounding, and IE11. Massage them into a usable value.
550
- function sanitizeScrollbarWidth(width) {
551
- width = Math.max(0, width); // no negatives
552
- width = Math.round(width);
553
- return width;
554
- }
555
 
556
- function computeEdges(el, getPadding) {
557
- if (getPadding === void 0) { getPadding = false; }
558
- var computedStyle = window.getComputedStyle(el);
559
- var borderLeft = parseInt(computedStyle.borderLeftWidth, 10) || 0;
560
- var borderRight = parseInt(computedStyle.borderRightWidth, 10) || 0;
561
- var borderTop = parseInt(computedStyle.borderTopWidth, 10) || 0;
562
- var borderBottom = parseInt(computedStyle.borderBottomWidth, 10) || 0;
563
- // must use offset(Width|Height) because compatible with client(Width|Height)
564
- var scrollbarLeftRight = sanitizeScrollbarWidth(el.offsetWidth - el.clientWidth - borderLeft - borderRight);
565
- var scrollbarBottom = sanitizeScrollbarWidth(el.offsetHeight - el.clientHeight - borderTop - borderBottom);
566
- var res = {
567
- borderLeft: borderLeft,
568
- borderRight: borderRight,
569
- borderTop: borderTop,
570
- borderBottom: borderBottom,
571
- scrollbarBottom: scrollbarBottom,
572
- scrollbarLeft: 0,
573
- scrollbarRight: 0
574
- };
575
- if (getIsRtlScrollbarOnLeft() && computedStyle.direction === 'rtl') { // is the scrollbar on the left side?
576
- res.scrollbarLeft = scrollbarLeftRight;
577
- }
578
- else {
579
- res.scrollbarRight = scrollbarLeftRight;
580
- }
581
- if (getPadding) {
582
- res.paddingLeft = parseInt(computedStyle.paddingLeft, 10) || 0;
583
- res.paddingRight = parseInt(computedStyle.paddingRight, 10) || 0;
584
- res.paddingTop = parseInt(computedStyle.paddingTop, 10) || 0;
585
- res.paddingBottom = parseInt(computedStyle.paddingBottom, 10) || 0;
586
- }
587
- return res;
588
- }
589
- function computeInnerRect(el, goWithinPadding) {
590
- if (goWithinPadding === void 0) { goWithinPadding = false; }
591
- var outerRect = computeRect(el);
592
- var edges = computeEdges(el, goWithinPadding);
593
- var res = {
594
- left: outerRect.left + edges.borderLeft + edges.scrollbarLeft,
595
- right: outerRect.right - edges.borderRight - edges.scrollbarRight,
596
- top: outerRect.top + edges.borderTop,
597
- bottom: outerRect.bottom - edges.borderBottom - edges.scrollbarBottom
598
- };
599
- if (goWithinPadding) {
600
- res.left += edges.paddingLeft;
601
- res.right -= edges.paddingRight;
602
- res.top += edges.paddingTop;
603
- res.bottom -= edges.paddingBottom;
604
- }
605
- return res;
606
- }
607
- function computeRect(el) {
608
- var rect = el.getBoundingClientRect();
609
- return {
610
- left: rect.left + window.pageXOffset,
611
- top: rect.top + window.pageYOffset,
612
- right: rect.right + window.pageXOffset,
613
- bottom: rect.bottom + window.pageYOffset
614
- };
615
- }
616
- function computeViewportRect() {
617
- return {
618
- left: window.pageXOffset,
619
- right: window.pageXOffset + document.documentElement.clientWidth,
620
- top: window.pageYOffset,
621
- bottom: window.pageYOffset + document.documentElement.clientHeight
622
- };
623
- }
624
- function computeHeightAndMargins(el) {
625
- return el.getBoundingClientRect().height + computeVMargins(el);
626
- }
627
- function computeVMargins(el) {
628
- var computed = window.getComputedStyle(el);
629
- return parseInt(computed.marginTop, 10) +
630
- parseInt(computed.marginBottom, 10);
631
- }
632
- // does not return window
633
- function getClippingParents(el) {
634
- var parents = [];
635
- while (el instanceof HTMLElement) { // will stop when gets to document or null
636
- var computedStyle = window.getComputedStyle(el);
637
- if (computedStyle.position === 'fixed') {
638
- break;
639
- }
640
- if ((/(auto|scroll)/).test(computedStyle.overflow + computedStyle.overflowY + computedStyle.overflowX)) {
641
- parents.push(el);
642
- }
643
- el = el.parentNode;
644
- }
645
- return parents;
646
- }
647
- function computeClippingRect(el) {
648
- return getClippingParents(el)
649
- .map(function (el) {
650
- return computeInnerRect(el);
651
- })
652
- .concat(computeViewportRect())
653
- .reduce(function (rect0, rect1) {
654
- return intersectRects(rect0, rect1) || rect1; // should always intersect
655
- });
656
- }
657
 
658
- // Stops a mouse/touch event from doing it's native browser action
659
- function preventDefault(ev) {
660
- ev.preventDefault();
661
- }
662
- // Event Delegation
663
- // ----------------------------------------------------------------------------------------------------------------
664
- function listenBySelector(container, eventType, selector, handler) {
665
- function realHandler(ev) {
666
- var matchedChild = elementClosest(ev.target, selector);
667
- if (matchedChild) {
668
- handler.call(matchedChild, ev, matchedChild);
669
- }
670
- }
671
- container.addEventListener(eventType, realHandler);
672
- return function () {
673
- container.removeEventListener(eventType, realHandler);
674
- };
675
- }
676
- function listenToHoverBySelector(container, selector, onMouseEnter, onMouseLeave) {
677
- var currentMatchedChild;
678
- return listenBySelector(container, 'mouseover', selector, function (ev, matchedChild) {
679
- if (matchedChild !== currentMatchedChild) {
680
- currentMatchedChild = matchedChild;
681
- onMouseEnter(ev, matchedChild);
682
- var realOnMouseLeave_1 = function (ev) {
683
- currentMatchedChild = null;
684
- onMouseLeave(ev, matchedChild);
685
- matchedChild.removeEventListener('mouseleave', realOnMouseLeave_1);
686
- };
687
- // listen to the next mouseleave, and then unattach
688
- matchedChild.addEventListener('mouseleave', realOnMouseLeave_1);
689
- }
690
- });
691
- }
692
- // Animation
693
- // ----------------------------------------------------------------------------------------------------------------
694
- var transitionEventNames = [
695
- 'webkitTransitionEnd',
696
- 'otransitionend',
697
- 'oTransitionEnd',
698
- 'msTransitionEnd',
699
- 'transitionend'
700
- ];
701
- // triggered only when the next single subsequent transition finishes
702
- function whenTransitionDone(el, callback) {
703
- var realCallback = function (ev) {
704
- callback(ev);
705
- transitionEventNames.forEach(function (eventName) {
706
- el.removeEventListener(eventName, realCallback);
707
- });
708
- };
709
- transitionEventNames.forEach(function (eventName) {
710
- el.addEventListener(eventName, realCallback); // cross-browser way to determine when the transition finishes
711
- });
712
- }
713
 
714
- var DAY_IDS = ['sun', 'mon', 'tue', 'wed', 'thu', 'fri', 'sat'];
715
- // Adding
716
- function addWeeks(m, n) {
717
- var a = dateToUtcArray(m);
718
- a[2] += n * 7;
719
- return arrayToUtcDate(a);
720
- }
721
- function addDays(m, n) {
722
- var a = dateToUtcArray(m);
723
- a[2] += n;
724
- return arrayToUtcDate(a);
725
- }
726
- function addMs(m, n) {
727
- var a = dateToUtcArray(m);
728
- a[6] += n;
729
- return arrayToUtcDate(a);
730
- }
731
- // Diffing (all return floats)
732
- function diffWeeks(m0, m1) {
733
- return diffDays(m0, m1) / 7;
734
- }
735
- function diffDays(m0, m1) {
736
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60 * 24);
737
- }
738
- function diffHours(m0, m1) {
739
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60 * 60);
740
- }
741
- function diffMinutes(m0, m1) {
742
- return (m1.valueOf() - m0.valueOf()) / (1000 * 60);
 
 
 
 
 
 
 
743
  }
744
- function diffSeconds(m0, m1) {
745
- return (m1.valueOf() - m0.valueOf()) / 1000;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
746
  }
747
- function diffDayAndTime(m0, m1) {
748
- var m0day = startOfDay(m0);
749
- var m1day = startOfDay(m1);
750
- return {
751
- years: 0,
752
- months: 0,
753
- days: Math.round(diffDays(m0day, m1day)),
754
- milliseconds: (m1.valueOf() - m1day.valueOf()) - (m0.valueOf() - m0day.valueOf())
755
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
756
  }
757
- // Diffing Whole Units
758
- function diffWholeWeeks(m0, m1) {
759
- var d = diffWholeDays(m0, m1);
760
- if (d !== null && d % 7 === 0) {
761
- return d / 7;
762
- }
763
- return null;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
764
  }
765
- function diffWholeDays(m0, m1) {
766
- if (timeAsMs(m0) === timeAsMs(m1)) {
767
- return Math.round(diffDays(m0, m1));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
768
  }
769
- return null;
770
- }
771
- // Start-Of
772
- function startOfDay(m) {
773
- return arrayToUtcDate([
774
- m.getUTCFullYear(),
775
- m.getUTCMonth(),
776
- m.getUTCDate()
777
- ]);
778
- }
779
- function startOfHour(m) {
780
- return arrayToUtcDate([
781
- m.getUTCFullYear(),
782
- m.getUTCMonth(),
783
- m.getUTCDate(),
784
- m.getUTCHours()
785
- ]);
786
- }
787
- function startOfMinute(m) {
788
- return arrayToUtcDate([
789
- m.getUTCFullYear(),
790
- m.getUTCMonth(),
791
- m.getUTCDate(),
792
- m.getUTCHours(),
793
- m.getUTCMinutes()
794
- ]);
795
- }
796
- function startOfSecond(m) {
797
- return arrayToUtcDate([
798
- m.getUTCFullYear(),
799
- m.getUTCMonth(),
800
- m.getUTCDate(),
801
- m.getUTCHours(),
802
- m.getUTCMinutes(),
803
- m.getUTCSeconds()
804
- ]);
805
- }
806
- // Week Computation
807
- function weekOfYear(marker, dow, doy) {
808
- var y = marker.getUTCFullYear();
809
- var w = weekOfGivenYear(marker, y, dow, doy);
810
- if (w < 1) {
811
- return weekOfGivenYear(marker, y - 1, dow, doy);
812
- }
813
- var nextW = weekOfGivenYear(marker, y + 1, dow, doy);
814
- if (nextW >= 1) {
815
- return Math.min(w, nextW);
816
- }
817
- return w;
818
- }
819
- function weekOfGivenYear(marker, year, dow, doy) {
820
- var firstWeekStart = arrayToUtcDate([year, 0, 1 + firstWeekOffset(year, dow, doy)]);
821
- var dayStart = startOfDay(marker);
822
- var days = Math.round(diffDays(firstWeekStart, dayStart));
823
- return Math.floor(days / 7) + 1; // zero-indexed
824
- }
825
- // start-of-first-week - start-of-year
826
- function firstWeekOffset(year, dow, doy) {
827
- // first-week day -- which january is always in the first week (4 for iso, 1 for other)
828
- var fwd = 7 + dow - doy;
829
- // first-week day local weekday -- which local weekday is fwd
830
- var fwdlw = (7 + arrayToUtcDate([year, 0, fwd]).getUTCDay() - dow) % 7;
831
- return -fwdlw + fwd - 1;
832
- }
833
- // Array Conversion
834
- function dateToLocalArray(date) {
835
- return [
836
- date.getFullYear(),
837
- date.getMonth(),
838
- date.getDate(),
839
- date.getHours(),
840
- date.getMinutes(),
841
- date.getSeconds(),
842
- date.getMilliseconds()
843
- ];
844
- }
845
- function arrayToLocalDate(a) {
846
- return new Date(a[0], a[1] || 0, a[2] == null ? 1 : a[2], // day of month
847
- a[3] || 0, a[4] || 0, a[5] || 0);
848
- }
849
- function dateToUtcArray(date) {
850
- return [
851
- date.getUTCFullYear(),
852
- date.getUTCMonth(),
853
- date.getUTCDate(),
854
- date.getUTCHours(),
855
- date.getUTCMinutes(),
856
- date.getUTCSeconds(),
857
- date.getUTCMilliseconds()
858
- ];
859
- }
860
- function arrayToUtcDate(a) {
861
- // according to web standards (and Safari), a month index is required.
862
- // massage if only given a year.
863
- if (a.length === 1) {
864
- a = a.concat([0]);
865
- }
866
- return new Date(Date.UTC.apply(Date, a));
867
- }
868
- // Other Utils
869
- function isValidDate(m) {
870
- return !isNaN(m.valueOf());
871
- }
872
- function timeAsMs(m) {
873
- return m.getUTCHours() * 1000 * 60 * 60 +
874
- m.getUTCMinutes() * 1000 * 60 +
875
- m.getUTCSeconds() * 1000 +
876
- m.getUTCMilliseconds();
877
- }
878
 
879
- var INTERNAL_UNITS = ['years', 'months', 'days', 'milliseconds'];
880
- var PARSE_RE = /^(-?)(?:(\d+)\.)?(\d+):(\d\d)(?::(\d\d)(?:\.(\d\d\d))?)?/;
881
- // Parsing and Creation
882
- function createDuration(input, unit) {
883
- var _a;
884
- if (typeof input === 'string') {
885
- return parseString(input);
886
- }
887
- else if (typeof input === 'object' && input) { // non-null object
888
- return normalizeObject(input);
889
- }
890
- else if (typeof input === 'number') {
891
- return normalizeObject((_a = {}, _a[unit || 'milliseconds'] = input, _a));
892
- }
893
- else {
894
- return null;
895
- }
896
- }
897
- function parseString(s) {
898
- var m = PARSE_RE.exec(s);
899
- if (m) {
900
- var sign = m[1] ? -1 : 1;
901
- return {
902
- years: 0,
903
- months: 0,
904
- days: sign * (m[2] ? parseInt(m[2], 10) : 0),
905
- milliseconds: sign * ((m[3] ? parseInt(m[3], 10) : 0) * 60 * 60 * 1000 + // hours
906
- (m[4] ? parseInt(m[4], 10) : 0) * 60 * 1000 + // minutes
907
- (m[5] ? parseInt(m[5], 10) : 0) * 1000 + // seconds
908
- (m[6] ? parseInt(m[6], 10) : 0) // ms
909
- )
910
- };
911
  }
912
- return null;
913
- }
914
- function normalizeObject(obj) {
915
- return {
916
- years: obj.years || obj.year || 0,
917
- months: obj.months || obj.month || 0,
918
- days: (obj.days || obj.day || 0) +
919
- getWeeksFromInput(obj) * 7,
920
- milliseconds: (obj.hours || obj.hour || 0) * 60 * 60 * 1000 + // hours
921
- (obj.minutes || obj.minute || 0) * 60 * 1000 + // minutes
922
- (obj.seconds || obj.second || 0) * 1000 + // seconds
923
- (obj.milliseconds || obj.millisecond || obj.ms || 0) // ms
924
- };
925
- }
926
- function getWeeksFromInput(obj) {
927
- return obj.weeks || obj.week || 0;
928
- }
929
- // Equality
930
- function durationsEqual(d0, d1) {
931
- return d0.years === d1.years &&
932
- d0.months === d1.months &&
933
- d0.days === d1.days &&
934
- d0.milliseconds === d1.milliseconds;
935
- }
936
- function isSingleDay(dur) {
937
- return dur.years === 0 && dur.months === 0 && dur.days === 1 && dur.milliseconds === 0;
938
- }
939
- // Simple Math
940
- function addDurations(d0, d1) {
941
- return {
942
- years: d0.years + d1.years,
943
- months: d0.months + d1.months,
944
- days: d0.days + d1.days,
945
- milliseconds: d0.milliseconds + d1.milliseconds
946
- };
947
- }
948
- function subtractDurations(d1, d0) {
949
- return {
950
- years: d1.years - d0.years,
951
- months: d1.months - d0.months,
952
- days: d1.days - d0.days,
953
- milliseconds: d1.milliseconds - d0.milliseconds
954
- };
955
  }
956
- function multiplyDuration(d, n) {
 
957
  return {
958
- years: d.years * n,
959
- months: d.months * n,
960
- days: d.days * n,
961
- milliseconds: d.milliseconds * n
962
  };
963
  }
964
- // Conversions
965
- // "Rough" because they are based on average-case Gregorian months/years
966
- function asRoughYears(dur) {
967
- return asRoughDays(dur) / 365;
968
- }
969
- function asRoughMonths(dur) {
970
- return asRoughDays(dur) / 30;
971
- }
972
- function asRoughDays(dur) {
973
- return asRoughMs(dur) / 864e5;
974
- }
975
- function asRoughMinutes(dur) {
976
- return asRoughMs(dur) / (1000 * 60);
977
- }
978
- function asRoughSeconds(dur) {
979
- return asRoughMs(dur) / 1000;
980
- }
981
- function asRoughMs(dur) {
982
- return dur.years * (365 * 864e5) +
983
- dur.months * (30 * 864e5) +
984
- dur.days * 864e5 +
985
- dur.milliseconds;
986
- }
987
- // Advanced Math
988
- function wholeDivideDurations(numerator, denominator) {
989
- var res = null;
990
- for (var i = 0; i < INTERNAL_UNITS.length; i++) {
991
- var unit = INTERNAL_UNITS[i];
992
- if (denominator[unit]) {
993
- var localRes = numerator[unit] / denominator[unit];
994
- if (!isInt(localRes) || (res !== null && res !== localRes)) {
995
- return null;
996
- }
997
- res = localRes;
998
- }
999
- else if (numerator[unit]) {
1000
- // needs to divide by something but can't!
1001
- return null;
1002
- }
1003
- }
1004
- return res;
1005
- }
1006
- function greatestDurationDenominator(dur, dontReturnWeeks) {
1007
- var ms = dur.milliseconds;
1008
- if (ms) {
1009
- if (ms % 1000 !== 0) {
1010
- return { unit: 'millisecond', value: ms };
1011
- }
1012
- if (ms % (1000 * 60) !== 0) {
1013
- return { unit: 'second', value: ms / 1000 };
1014
- }
1015
- if (ms % (1000 * 60 * 60) !== 0) {
1016
- return { unit: 'minute', value: ms / (1000 * 60) };
1017
- }
1018
- if (ms) {
1019
- return { unit: 'hour', value: ms / (1000 * 60 * 60) };
1020
- }
1021
- }
1022
- if (dur.days) {
1023
- if (!dontReturnWeeks && dur.days % 7 === 0) {
1024
- return { unit: 'week', value: dur.days / 7 };
1025
- }
1026
- return { unit: 'day', value: dur.days };
1027
- }
1028
- if (dur.months) {
1029
- return { unit: 'month', value: dur.months };
1030
- }
1031
- if (dur.years) {
1032
- return { unit: 'year', value: dur.years };
1033
- }
1034
- return { unit: 'millisecond', value: 0 };
1035
- }
1036
 
1037
- /* FullCalendar-specific DOM Utilities
1038
- ----------------------------------------------------------------------------------------------------------------------*/
1039
- // Given the scrollbar widths of some other container, create borders/margins on rowEls in order to match the left
1040
- // and right space that was offset by the scrollbars. A 1-pixel border first, then margin beyond that.
1041
- function compensateScroll(rowEl, scrollbarWidths) {
1042
- if (scrollbarWidths.left) {
1043
- applyStyle(rowEl, {
1044
- borderLeftWidth: 1,
1045
- marginLeft: scrollbarWidths.left - 1
1046
- });
1047
- }
1048
- if (scrollbarWidths.right) {
1049
- applyStyle(rowEl, {
1050
- borderRightWidth: 1,
1051
- marginRight: scrollbarWidths.right - 1
1052
- });
1053
  }
1054
- }
1055
- // Undoes compensateScroll and restores all borders/margins
1056
- function uncompensateScroll(rowEl) {
1057
- applyStyle(rowEl, {
1058
- marginLeft: '',
1059
- marginRight: '',
1060
- borderLeftWidth: '',
1061
- borderRightWidth: ''
1062
  });
1063
- }
1064
- // Make the mouse cursor express that an event is not allowed in the current area
1065
- function disableCursor() {
1066
- document.body.classList.add('fc-not-allowed');
1067
- }
1068
- // Returns the mouse cursor to its original look
1069
- function enableCursor() {
1070
- document.body.classList.remove('fc-not-allowed');
1071
- }
1072
- // Given a total available height to fill, have `els` (essentially child rows) expand to accomodate.
1073
- // By default, all elements that are shorter than the recommended height are expanded uniformly, not considering
1074
- // any other els that are already too tall. if `shouldRedistribute` is on, it considers these tall rows and
1075
- // reduces the available height.
1076
- function distributeHeight(els, availableHeight, shouldRedistribute) {
1077
- // *FLOORING NOTE*: we floor in certain places because zoom can give inaccurate floating-point dimensions,
1078
- // and it is better to be shorter than taller, to avoid creating unnecessary scrollbars.
1079
- var minOffset1 = Math.floor(availableHeight / els.length); // for non-last element
1080
- var minOffset2 = Math.floor(availableHeight - minOffset1 * (els.length - 1)); // for last element *FLOORING NOTE*
1081
- var flexEls = []; // elements that are allowed to expand. array of DOM nodes
1082
- var flexOffsets = []; // amount of vertical space it takes up
1083
- var flexHeights = []; // actual css height
1084
- var usedHeight = 0;
1085
- undistributeHeight(els); // give all elements their natural height
1086
- // find elements that are below the recommended height (expandable).
1087
- // important to query for heights in a single first pass (to avoid reflow oscillation).
1088
- els.forEach(function (el, i) {
1089
- var minOffset = i === els.length - 1 ? minOffset2 : minOffset1;
1090
- var naturalHeight = el.getBoundingClientRect().height;
1091
- var naturalOffset = naturalHeight + computeVMargins(el);
1092
- if (naturalOffset < minOffset) {
1093
- flexEls.push(el);
1094
- flexOffsets.push(naturalOffset);
1095
- flexHeights.push(naturalHeight);
1096
- }
1097
- else {
1098
- // this element stretches past recommended height (non-expandable). mark the space as occupied.
1099
- usedHeight += naturalOffset;
1100
  }
1101
- });
1102
- // readjust the recommended height to only consider the height available to non-maxed-out rows.
1103
- if (shouldRedistribute) {
1104
- availableHeight -= usedHeight;
1105
- minOffset1 = Math.floor(availableHeight / flexEls.length);
1106
- minOffset2 = Math.floor(availableHeight - minOffset1 * (flexEls.length - 1)); // *FLOORING NOTE*
1107
- }
1108
- // assign heights to all expandable elements
1109
- flexEls.forEach(function (el, i) {
1110
- var minOffset = i === flexEls.length - 1 ? minOffset2 : minOffset1;
1111
- var naturalOffset = flexOffsets[i];
1112
- var naturalHeight = flexHeights[i];
1113
- var newHeight = minOffset - (naturalOffset - naturalHeight); // subtract the margin/padding
1114
- if (naturalOffset < minOffset) { // we check this again because redistribution might have changed things
1115
- el.style.height = newHeight + 'px';
1116
  }
1117
- });
1118
- }
1119
- // Undoes distrubuteHeight, restoring all els to their natural height
1120
- function undistributeHeight(els) {
1121
- els.forEach(function (el) {
1122
- el.style.height = '';
1123
- });
1124
- }
1125
- // Given `els`, a set of <td> cells, find the cell with the largest natural width and set the widths of all the
1126
- // cells to be that width.
1127
- // PREREQUISITE: if you want a cell to take up width, it needs to have a single inner element w/ display:inline
1128
- function matchCellWidths(els) {
1129
- var maxInnerWidth = 0;
1130
- els.forEach(function (el) {
1131
- var innerEl = el.firstChild; // hopefully an element
1132
- if (innerEl instanceof HTMLElement) {
1133
- var innerWidth_1 = innerEl.getBoundingClientRect().width;
1134
- if (innerWidth_1 > maxInnerWidth) {
1135
- maxInnerWidth = innerWidth_1;
1136
  }
1137
- }
1138
- });
1139
- maxInnerWidth++; // sometimes not accurate of width the text needs to stay on one line. insurance
1140
- els.forEach(function (el) {
1141
- el.style.width = maxInnerWidth + 'px';
1142
- });
1143
- return maxInnerWidth;
1144
- }
1145
- // Given one element that resides inside another,
1146
- // Subtracts the height of the inner element from the outer element.
1147
- function subtractInnerElHeight(outerEl, innerEl) {
1148
- // effin' IE8/9/10/11 sometimes returns 0 for dimensions. this weird hack was the only thing that worked
1149
- var reflowStyleProps = {
1150
- position: 'relative',
1151
- left: -1 // ensure reflow in case the el was already relative. negative is less likely to cause new scroll
1152
- };
1153
- applyStyle(outerEl, reflowStyleProps);
1154
- applyStyle(innerEl, reflowStyleProps);
1155
- var diff = // grab the dimensions
1156
- outerEl.getBoundingClientRect().height -
1157
- innerEl.getBoundingClientRect().height;
1158
- // undo hack
1159
- var resetStyleProps = { position: '', left: '' };
1160
- applyStyle(outerEl, resetStyleProps);
1161
- applyStyle(innerEl, resetStyleProps);
1162
- return diff;
1163
- }
1164
- /* Selection
1165
- ----------------------------------------------------------------------------------------------------------------------*/
1166
- function preventSelection(el) {
1167
- el.classList.add('fc-unselectable');
1168
- el.addEventListener('selectstart', preventDefault);
1169
- }
1170
- function allowSelection(el) {
1171
- el.classList.remove('fc-unselectable');
1172
- el.removeEventListener('selectstart', preventDefault);
1173
- }
1174
- /* Context Menu
1175
- ----------------------------------------------------------------------------------------------------------------------*/
1176
- function preventContextMenu(el) {
1177
- el.addEventListener('contextmenu', preventDefault);
1178
- }
1179
- function allowContextMenu(el) {
1180
- el.removeEventListener('contextmenu', preventDefault);
1181
- }
1182
- /* Object Ordering by Field
1183
- ----------------------------------------------------------------------------------------------------------------------*/
1184
- function parseFieldSpecs(input) {
1185
- var specs = [];
1186
- var tokens = [];
1187
- var i;
1188
- var token;
1189
- if (typeof input === 'string') {
1190
- tokens = input.split(/\s*,\s*/);
1191
- }
1192
- else if (typeof input === 'function') {
1193
- tokens = [input];
1194
- }
1195
- else if (Array.isArray(input)) {
1196
- tokens = input;
1197
- }
1198
- for (i = 0; i < tokens.length; i++) {
1199
- token = tokens[i];
1200
- if (typeof token === 'string') {
1201
- specs.push(token.charAt(0) === '-' ?
1202
- { field: token.substring(1), order: -1 } :
1203
- { field: token, order: 1 });
1204
- }
1205
- else if (typeof token === 'function') {
1206
- specs.push({ func: token });
1207
- }
1208
- }
1209
- return specs;
1210
- }
1211
- function compareByFieldSpecs(obj0, obj1, fieldSpecs) {
1212
- var i;
1213
- var cmp;
1214
- for (i = 0; i < fieldSpecs.length; i++) {
1215
- cmp = compareByFieldSpec(obj0, obj1, fieldSpecs[i]);
1216
- if (cmp) {
1217
- return cmp;
1218
  }
1219
  }
1220
- return 0;
1221
  }
1222
- function compareByFieldSpec(obj0, obj1, fieldSpec) {
1223
- if (fieldSpec.func) {
1224
- return fieldSpec.func(obj0, obj1);
1225
- }
1226
- return flexibleCompare(obj0[fieldSpec.field], obj1[fieldSpec.field])
1227
- * (fieldSpec.order || 1);
1228
- }
1229
- function flexibleCompare(a, b) {
1230
- if (!a && !b) {
1231
- return 0;
1232
- }
1233
- if (b == null) {
1234
- return -1;
1235
- }
1236
- if (a == null) {
1237
- return 1;
1238
- }
1239
- if (typeof a === 'string' || typeof b === 'string') {
1240
- return String(a).localeCompare(String(b));
1241
- }
1242
- return a - b;
1243
- }
1244
- /* String Utilities
1245
- ----------------------------------------------------------------------------------------------------------------------*/
1246
- function capitaliseFirstLetter(str) {
1247
- return str.charAt(0).toUpperCase() + str.slice(1);
1248
- }
1249
- function padStart(val, len) {
1250
- var s = String(val);
1251
- return '000'.substr(0, len - s.length) + s;
1252
- }
1253
- /* Number Utilities
1254
- ----------------------------------------------------------------------------------------------------------------------*/
1255
- function compareNumbers(a, b) {
1256
- return a - b;
1257
- }
1258
- function isInt(n) {
1259
- return n % 1 === 0;
1260
- }
1261
- /* Weird Utilities
1262
- ----------------------------------------------------------------------------------------------------------------------*/
1263
- function applyAll(functions, thisObj, args) {
1264
- if (typeof functions === 'function') { // supplied a single function
1265
- functions = [functions];
1266
- }
1267
- if (functions) {
1268
- var i = void 0;
1269
- var ret = void 0;
1270
- for (i = 0; i < functions.length; i++) {
1271
- ret = functions[i].apply(thisObj, args) || ret;
1272
- }
1273
- return ret;
1274
- }
1275
- }
1276
- function firstDefined() {
1277
- var args = [];
1278
- for (var _i = 0; _i < arguments.length; _i++) {
1279
- args[_i] = arguments[_i];
1280
- }
1281
- for (var i = 0; i < args.length; i++) {
1282
- if (args[i] !== undefined) {
1283
- return args[i];
1284
- }
1285
- }
1286
- }
1287
- // Returns a function, that, as long as it continues to be invoked, will not
1288
- // be triggered. The function will be called after it stops being called for
1289
- // N milliseconds. If `immediate` is passed, trigger the function on the
1290
- // leading edge, instead of the trailing.
1291
- // https://github.com/jashkenas/underscore/blob/1.6.0/underscore.js#L714
1292
- function debounce(func, wait) {
1293
- var timeout;
1294
- var args;
1295
- var context;
1296
- var timestamp;
1297
- var result;
1298
- var later = function () {
1299
- var last = new Date().valueOf() - timestamp;
1300
- if (last < wait) {
1301
- timeout = setTimeout(later, wait - last);
1302
- }
1303
- else {
1304
- timeout = null;
1305
- result = func.apply(context, args);
1306
- context = args = null;
1307
- }
1308
- };
1309
- return function () {
1310
- context = this;
1311
- args = arguments;
1312
- timestamp = new Date().valueOf();
1313
- if (!timeout) {
1314
- timeout = setTimeout(later, wait);
1315
- }
1316
- return result;
1317
- };
1318
- }
1319
- // Number and Boolean are only types that defaults or not computed for
1320
- // TODO: write more comments
1321
- function refineProps(rawProps, processors, defaults, leftoverProps) {
1322
- if (defaults === void 0) { defaults = {}; }
1323
- var refined = {};
1324
- for (var key in processors) {
1325
- var processor = processors[key];
1326
- if (rawProps[key] !== undefined) {
1327
- // found
1328
- if (processor === Function) {
1329
- refined[key] = typeof rawProps[key] === 'function' ? rawProps[key] : null;
1330
- }
1331
- else if (processor) { // a refining function?
1332
- refined[key] = processor(rawProps[key]);
1333
- }
1334
- else {
1335
- refined[key] = rawProps[key];
1336
- }
1337
- }
1338
- else if (defaults[key] !== undefined) {
1339
- // there's an explicit default
1340
- refined[key] = defaults[key];
1341
- }
1342
- else {
1343
- // must compute a default
1344
- if (processor === String) {
1345
- refined[key] = ''; // empty string is default for String
1346
- }
1347
- else if (!processor || processor === Number || processor === Boolean || processor === Function) {
1348
- refined[key] = null; // assign null for other non-custom processor funcs
1349
- }
1350
- else {
1351
- refined[key] = processor(null); // run the custom processor func
1352
- }
1353
- }
1354
- }
1355
- if (leftoverProps) {
1356
- for (var key in rawProps) {
1357
- if (processors[key] === undefined) {
1358
- leftoverProps[key] = rawProps[key];
1359
- }
1360
- }
1361
- }
1362
- return refined;
1363
- }
1364
- /* Date stuff that doesn't belong in datelib core
1365
- ----------------------------------------------------------------------------------------------------------------------*/
1366
- // given a timed range, computes an all-day range that has the same exact duration,
1367
- // but whose start time is aligned with the start of the day.
1368
- function computeAlignedDayRange(timedRange) {
1369
- var dayCnt = Math.floor(diffDays(timedRange.start, timedRange.end)) || 1;
1370
- var start = startOfDay(timedRange.start);
1371
- var end = addDays(start, dayCnt);
1372
- return { start: start, end: end };
1373
- }
1374
- // given a timed range, computes an all-day range based on how for the end date bleeds into the next day
1375
- // TODO: give nextDayThreshold a default arg
1376
- function computeVisibleDayRange(timedRange, nextDayThreshold) {
1377
- if (nextDayThreshold === void 0) { nextDayThreshold = createDuration(0); }
1378
- var startDay = null;
1379
- var endDay = null;
1380
- if (timedRange.end) {
1381
- endDay = startOfDay(timedRange.end);
1382
- var endTimeMS = timedRange.end.valueOf() - endDay.valueOf(); // # of milliseconds into `endDay`
1383
- // If the end time is actually inclusively part of the next day and is equal to or
1384
- // beyond the next day threshold, adjust the end to be the exclusive end of `endDay`.
1385
- // Otherwise, leaving it as inclusive will cause it to exclude `endDay`.
1386
- if (endTimeMS && endTimeMS >= asRoughMs(nextDayThreshold)) {
1387
- endDay = addDays(endDay, 1);
1388
- }
1389
- }
1390
- if (timedRange.start) {
1391
- startDay = startOfDay(timedRange.start); // the beginning of the day the range starts
1392
- // If end is within `startDay` but not past nextDayThreshold, assign the default duration of one day.
1393
- if (endDay && endDay <= startDay) {
1394
- endDay = addDays(startDay, 1);
1395
- }
1396
- }
1397
- return { start: startDay, end: endDay };
1398
- }
1399
- // spans from one day into another?
1400
- function isMultiDayRange(range) {
1401
- var visibleRange = computeVisibleDayRange(range);
1402
- return diffDays(visibleRange.start, visibleRange.end) > 1;
1403
- }
1404
- function diffDates(date0, date1, dateEnv, largeUnit) {
1405
- if (largeUnit === 'year') {
1406
- return createDuration(dateEnv.diffWholeYears(date0, date1), 'year');
1407
- }
1408
- else if (largeUnit === 'month') {
1409
- return createDuration(dateEnv.diffWholeMonths(date0, date1), 'month');
1410
- }
1411
- else {
1412
- return diffDayAndTime(date0, date1); // returns a duration
1413
- }
1414
  }
 
 
 
 
 
 
 
 
 
 
1415
 
1416
- /*! *****************************************************************************
1417
- Copyright (c) Microsoft Corporation. All rights reserved.
1418
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
1419
- this file except in compliance with the License. You may obtain a copy of the
1420
- License at http://www.apache.org/licenses/LICENSE-2.0
1421
 
1422
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
1423
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
1424
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
1425
- MERCHANTABLITY OR NON-INFRINGEMENT.
1426
 
1427
- See the Apache Version 2.0 License for specific language governing permissions
1428
- and limitations under the License.
1429
- ***************************************************************************** */
1430
- /* global Reflect, Promise */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1431
 
1432
- var extendStatics = function(d, b) {
1433
- extendStatics = Object.setPrototypeOf ||
1434
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
1435
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
1436
- return extendStatics(d, b);
1437
- };
1438
 
1439
- function __extends(d, b) {
1440
- extendStatics(d, b);
1441
- function __() { this.constructor = d; }
1442
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
1443
- }
1444
 
1445
- var __assign = function() {
1446
- __assign = Object.assign || function __assign(t) {
1447
- for (var s, i = 1, n = arguments.length; i < n; i++) {
1448
- s = arguments[i];
1449
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
1450
- }
1451
- return t;
1452
- };
1453
- return __assign.apply(this, arguments);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1454
  };
 
1455
 
1456
- function parseRecurring(eventInput, allDayDefault, dateEnv, recurringTypes, leftovers) {
1457
- for (var i = 0; i < recurringTypes.length; i++) {
1458
- var localLeftovers = {};
1459
- var parsed = recurringTypes[i].parse(eventInput, localLeftovers, dateEnv);
1460
- if (parsed) {
1461
- var allDay = localLeftovers.allDay;
1462
- delete localLeftovers.allDay; // remove from leftovers
1463
- if (allDay == null) {
1464
- allDay = allDayDefault;
1465
- if (allDay == null) {
1466
- allDay = parsed.allDayGuess;
1467
- if (allDay == null) {
1468
- allDay = false;
1469
- }
1470
- }
1471
- }
1472
- __assign(leftovers, localLeftovers);
1473
- return {
1474
- allDay: allDay,
1475
- duration: parsed.duration,
1476
- typeData: parsed.typeData,
1477
- typeId: i
1478
- };
1479
- }
1480
- }
1481
- return null;
1482
- }
1483
- /*
1484
- Event MUST have a recurringDef
1485
- */
1486
- function expandRecurringRanges(eventDef, duration, framingRange, dateEnv, recurringTypes) {
1487
- var typeDef = recurringTypes[eventDef.recurringDef.typeId];
1488
- var markers = typeDef.expand(eventDef.recurringDef.typeData, {
1489
- start: dateEnv.subtract(framingRange.start, duration),
1490
- end: framingRange.end
1491
- }, dateEnv);
1492
- // the recurrence plugins don't guarantee that all-day events are start-of-day, so we have to
1493
- if (eventDef.allDay) {
1494
- markers = markers.map(startOfDay);
1495
- }
1496
- return markers;
1497
  }
 
 
 
 
1498
 
1499
- var hasOwnProperty = Object.prototype.hasOwnProperty;
1500
- // Merges an array of objects into a single object.
1501
- // The second argument allows for an array of property names who's object values will be merged together.
1502
- function mergeProps(propObjs, complexProps) {
1503
- var dest = {};
1504
- var i;
1505
- var name;
1506
- var complexObjs;
1507
- var j;
1508
- var val;
1509
- var props;
1510
- if (complexProps) {
1511
- for (i = 0; i < complexProps.length; i++) {
1512
- name = complexProps[i];
1513
- complexObjs = [];
1514
- // collect the trailing object values, stopping when a non-object is discovered
1515
- for (j = propObjs.length - 1; j >= 0; j--) {
1516
- val = propObjs[j][name];
1517
- if (typeof val === 'object' && val) { // non-null object
1518
- complexObjs.unshift(val);
1519
- }
1520
- else if (val !== undefined) {
1521
- dest[name] = val; // if there were no objects, this value will be used
1522
- break;
1523
- }
1524
- }
1525
- // if the trailing values were objects, use the merged value
1526
- if (complexObjs.length) {
1527
- dest[name] = mergeProps(complexObjs);
1528
- }
1529
- }
1530
- }
1531
- // copy values into the destination, going from last to first
1532
- for (i = propObjs.length - 1; i >= 0; i--) {
1533
- props = propObjs[i];
1534
- for (name in props) {
1535
- if (!(name in dest)) { // if already assigned by previous props or complex props, don't reassign
1536
- dest[name] = props[name];
1537
- }
1538
- }
1539
- }
1540
- return dest;
1541
- }
1542
- function filterHash(hash, func) {
1543
- var filtered = {};
1544
- for (var key in hash) {
1545
- if (func(hash[key], key)) {
1546
- filtered[key] = hash[key];
1547
- }
1548
- }
1549
- return filtered;
1550
- }
1551
- function mapHash(hash, func) {
1552
- var newHash = {};
1553
- for (var key in hash) {
1554
- newHash[key] = func(hash[key], key);
1555
- }
1556
- return newHash;
1557
- }
1558
- function arrayToHash(a) {
1559
- var hash = {};
1560
- for (var _i = 0, a_1 = a; _i < a_1.length; _i++) {
1561
- var item = a_1[_i];
1562
- hash[item] = true;
1563
- }
1564
- return hash;
1565
- }
1566
- function hashValuesToArray(obj) {
1567
- var a = [];
1568
- for (var key in obj) {
1569
- a.push(obj[key]);
1570
- }
1571
- return a;
1572
- }
1573
- function isPropsEqual(obj0, obj1) {
1574
- for (var key in obj0) {
1575
- if (hasOwnProperty.call(obj0, key)) {
1576
- if (!(key in obj1)) {
1577
- return false;
1578
- }
1579
- }
1580
- }
1581
- for (var key in obj1) {
1582
- if (hasOwnProperty.call(obj1, key)) {
1583
- if (obj0[key] !== obj1[key]) {
1584
- return false;
1585
- }
1586
- }
1587
- }
1588
- return true;
1589
- }
1590
 
1591
- function parseEvents(rawEvents, sourceId, calendar, allowOpenRange) {
1592
- var eventStore = createEmptyEventStore();
1593
- for (var _i = 0, rawEvents_1 = rawEvents; _i < rawEvents_1.length; _i++) {
1594
- var rawEvent = rawEvents_1[_i];
1595
- var tuple = parseEvent(rawEvent, sourceId, calendar, allowOpenRange);
1596
- if (tuple) {
1597
- eventTupleToStore(tuple, eventStore);
1598
- }
1599
- }
1600
- return eventStore;
1601
- }
1602
- function eventTupleToStore(tuple, eventStore) {
1603
- if (eventStore === void 0) { eventStore = createEmptyEventStore(); }
1604
- eventStore.defs[tuple.def.defId] = tuple.def;
1605
- if (tuple.instance) {
1606
- eventStore.instances[tuple.instance.instanceId] = tuple.instance;
1607
- }
1608
- return eventStore;
1609
- }
1610
- function expandRecurring(eventStore, framingRange, calendar) {
1611
- var dateEnv = calendar.dateEnv;
1612
- var defs = eventStore.defs, instances = eventStore.instances;
1613
- // remove existing recurring instances
1614
- instances = filterHash(instances, function (instance) {
1615
- return !defs[instance.defId].recurringDef;
1616
- });
1617
- for (var defId in defs) {
1618
- var def = defs[defId];
1619
- if (def.recurringDef) {
1620
- var duration = def.recurringDef.duration;
1621
- if (!duration) {
1622
- duration = def.allDay ?
1623
- calendar.defaultAllDayEventDuration :
1624
- calendar.defaultTimedEventDuration;
1625
- }
1626
- var starts = expandRecurringRanges(def, duration, framingRange, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes);
1627
- for (var _i = 0, starts_1 = starts; _i < starts_1.length; _i++) {
1628
- var start = starts_1[_i];
1629
- var instance = createEventInstance(defId, {
1630
- start: start,
1631
- end: dateEnv.add(start, duration)
1632
- });
1633
- instances[instance.instanceId] = instance;
1634
- }
1635
- }
1636
- }
1637
- return { defs: defs, instances: instances };
1638
- }
1639
- // retrieves events that have the same groupId as the instance specified by `instanceId`
1640
- // or they are the same as the instance.
1641
- // why might instanceId not be in the store? an event from another calendar?
1642
- function getRelevantEvents(eventStore, instanceId) {
1643
- var instance = eventStore.instances[instanceId];
1644
- if (instance) {
1645
- var def_1 = eventStore.defs[instance.defId];
1646
- // get events/instances with same group
1647
- var newStore = filterEventStoreDefs(eventStore, function (lookDef) {
1648
- return isEventDefsGrouped(def_1, lookDef);
1649
- });
1650
- // add the original
1651
- // TODO: wish we could use eventTupleToStore or something like it
1652
- newStore.defs[def_1.defId] = def_1;
1653
- newStore.instances[instance.instanceId] = instance;
1654
- return newStore;
1655
- }
1656
- return createEmptyEventStore();
1657
- }
1658
- function isEventDefsGrouped(def0, def1) {
1659
- return Boolean(def0.groupId && def0.groupId === def1.groupId);
1660
- }
1661
- function transformRawEvents(rawEvents, eventSource, calendar) {
1662
- var calEachTransform = calendar.opt('eventDataTransform');
1663
- var sourceEachTransform = eventSource ? eventSource.eventDataTransform : null;
1664
- if (sourceEachTransform) {
1665
- rawEvents = transformEachRawEvent(rawEvents, sourceEachTransform);
1666
- }
1667
- if (calEachTransform) {
1668
- rawEvents = transformEachRawEvent(rawEvents, calEachTransform);
1669
- }
1670
- return rawEvents;
1671
- }
1672
- function transformEachRawEvent(rawEvents, func) {
1673
- var refinedEvents;
1674
- if (!func) {
1675
- refinedEvents = rawEvents;
1676
- }
1677
- else {
1678
- refinedEvents = [];
1679
- for (var _i = 0, rawEvents_2 = rawEvents; _i < rawEvents_2.length; _i++) {
1680
- var rawEvent = rawEvents_2[_i];
1681
- var refinedEvent = func(rawEvent);
1682
- if (refinedEvent) {
1683
- refinedEvents.push(refinedEvent);
1684
- }
1685
- else if (refinedEvent == null) {
1686
- refinedEvents.push(rawEvent);
1687
- } // if a different falsy value, do nothing
1688
- }
1689
- }
1690
- return refinedEvents;
1691
- }
1692
- function createEmptyEventStore() {
1693
- return { defs: {}, instances: {} };
1694
- }
1695
- function mergeEventStores(store0, store1) {
1696
- return {
1697
- defs: __assign({}, store0.defs, store1.defs),
1698
- instances: __assign({}, store0.instances, store1.instances)
1699
- };
1700
- }
1701
- function filterEventStoreDefs(eventStore, filterFunc) {
1702
- var defs = filterHash(eventStore.defs, filterFunc);
1703
- var instances = filterHash(eventStore.instances, function (instance) {
1704
- return defs[instance.defId]; // still exists?
1705
- });
1706
- return { defs: defs, instances: instances };
1707
- }
1708
 
1709
- function parseRange(input, dateEnv) {
1710
- var start = null;
1711
- var end = null;
1712
- if (input.start) {
1713
- start = dateEnv.createMarker(input.start);
1714
- }
1715
- if (input.end) {
1716
- end = dateEnv.createMarker(input.end);
1717
- }
1718
- if (!start && !end) {
1719
- return null;
1720
- }
1721
- if (start && end && end < start) {
1722
- return null;
1723
- }
1724
- return { start: start, end: end };
1725
- }
1726
- // SIDE-EFFECT: will mutate ranges.
1727
- // Will return a new array result.
1728
- function invertRanges(ranges, constraintRange) {
1729
- var invertedRanges = [];
1730
- var start = constraintRange.start; // the end of the previous range. the start of the new range
1731
- var i;
1732
- var dateRange;
1733
- // ranges need to be in order. required for our date-walking algorithm
1734
- ranges.sort(compareRanges);
1735
- for (i = 0; i < ranges.length; i++) {
1736
- dateRange = ranges[i];
1737
- // add the span of time before the event (if there is any)
1738
- if (dateRange.start > start) { // compare millisecond time (skip any ambig logic)
1739
- invertedRanges.push({ start: start, end: dateRange.start });
1740
- }
1741
- if (dateRange.end > start) {
1742
- start = dateRange.end;
1743
- }
1744
- }
1745
- // add the span of time after the last event (if there is any)
1746
- if (start < constraintRange.end) { // compare millisecond time (skip any ambig logic)
1747
- invertedRanges.push({ start: start, end: constraintRange.end });
1748
- }
1749
- return invertedRanges;
1750
- }
1751
- function compareRanges(range0, range1) {
1752
- return range0.start.valueOf() - range1.start.valueOf(); // earlier ranges go first
1753
- }
1754
- function intersectRanges(range0, range1) {
1755
- var start = range0.start;
1756
- var end = range0.end;
1757
- var newRange = null;
1758
- if (range1.start !== null) {
1759
- if (start === null) {
1760
- start = range1.start;
1761
- }
1762
- else {
1763
- start = new Date(Math.max(start.valueOf(), range1.start.valueOf()));
1764
- }
1765
- }
1766
- if (range1.end != null) {
1767
- if (end === null) {
1768
- end = range1.end;
1769
- }
1770
- else {
1771
- end = new Date(Math.min(end.valueOf(), range1.end.valueOf()));
1772
- }
1773
- }
1774
- if (start === null || end === null || start < end) {
1775
- newRange = { start: start, end: end };
1776
- }
1777
- return newRange;
1778
- }
1779
- function rangesEqual(range0, range1) {
1780
- return (range0.start === null ? null : range0.start.valueOf()) === (range1.start === null ? null : range1.start.valueOf()) &&
1781
- (range0.end === null ? null : range0.end.valueOf()) === (range1.end === null ? null : range1.end.valueOf());
1782
- }
1783
- function rangesIntersect(range0, range1) {
1784
- return (range0.end === null || range1.start === null || range0.end > range1.start) &&
1785
- (range0.start === null || range1.end === null || range0.start < range1.end);
1786
- }
1787
- function rangeContainsRange(outerRange, innerRange) {
1788
- return (outerRange.start === null || (innerRange.start !== null && innerRange.start >= outerRange.start)) &&
1789
- (outerRange.end === null || (innerRange.end !== null && innerRange.end <= outerRange.end));
1790
- }
1791
- function rangeContainsMarker(range, date) {
1792
- return (range.start === null || date >= range.start) &&
1793
- (range.end === null || date < range.end);
1794
- }
1795
- // If the given date is not within the given range, move it inside.
1796
- // (If it's past the end, make it one millisecond before the end).
1797
- function constrainMarkerToRange(date, range) {
1798
- if (range.start != null && date < range.start) {
1799
- return range.start;
1800
- }
1801
- if (range.end != null && date >= range.end) {
1802
- return new Date(range.end.valueOf() - 1);
1803
- }
1804
- return date;
1805
- }
1806
 
1807
- function removeExact(array, exactVal) {
1808
- var removeCnt = 0;
1809
- var i = 0;
1810
- while (i < array.length) {
1811
- if (array[i] === exactVal) {
1812
- array.splice(i, 1);
1813
- removeCnt++;
1814
- }
1815
- else {
1816
- i++;
1817
- }
1818
- }
1819
- return removeCnt;
1820
- }
1821
- function isArraysEqual(a0, a1) {
1822
- var len = a0.length;
1823
- var i;
1824
- if (len !== a1.length) { // not array? or not same length?
1825
- return false;
1826
- }
1827
- for (i = 0; i < len; i++) {
1828
- if (a0[i] !== a1[i]) {
1829
- return false;
1830
- }
1831
- }
1832
- return true;
1833
- }
1834
 
1835
- function memoize(workerFunc) {
1836
- var args;
1837
- var res;
1838
- return function () {
1839
- if (!args || !isArraysEqual(args, arguments)) {
1840
- args = arguments;
1841
- res = workerFunc.apply(this, arguments);
1842
- }
1843
- return res;
1844
- };
1845
- }
1846
- /*
1847
- always executes the workerFunc, but if the result is equal to the previous result,
1848
- return the previous result instead.
1849
- */
1850
- function memoizeOutput(workerFunc, equalityFunc) {
1851
- var cachedRes = null;
1852
- return function () {
1853
- var newRes = workerFunc.apply(this, arguments);
1854
- if (cachedRes === null || !(cachedRes === newRes || equalityFunc(cachedRes, newRes))) {
1855
- cachedRes = newRes;
1856
- }
1857
- return cachedRes;
1858
- };
1859
- }
1860
 
1861
- var EXTENDED_SETTINGS_AND_SEVERITIES = {
1862
- week: 3,
1863
- separator: 0,
1864
- omitZeroMinute: 0,
1865
- meridiem: 0,
1866
- omitCommas: 0
1867
- };
1868
- var STANDARD_DATE_PROP_SEVERITIES = {
1869
- timeZoneName: 7,
1870
- era: 6,
1871
- year: 5,
1872
- month: 4,
1873
- day: 2,
1874
- weekday: 2,
1875
- hour: 1,
1876
- minute: 1,
1877
- second: 1
1878
- };
1879
- var MERIDIEM_RE = /\s*([ap])\.?m\.?/i; // eats up leading spaces too
1880
- var COMMA_RE = /,/g; // we need re for globalness
1881
- var MULTI_SPACE_RE = /\s+/g;
1882
- var LTR_RE = /\u200e/g; // control character
1883
- var UTC_RE = /UTC|GMT/;
1884
- var NativeFormatter = /** @class */ (function () {
1885
- function NativeFormatter(formatSettings) {
1886
- var standardDateProps = {};
1887
- var extendedSettings = {};
1888
- var severity = 0;
1889
- for (var name_1 in formatSettings) {
1890
- if (name_1 in EXTENDED_SETTINGS_AND_SEVERITIES) {
1891
- extendedSettings[name_1] = formatSettings[name_1];
1892
- severity = Math.max(EXTENDED_SETTINGS_AND_SEVERITIES[name_1], severity);
1893
- }
1894
- else {
1895
- standardDateProps[name_1] = formatSettings[name_1];
1896
- if (name_1 in STANDARD_DATE_PROP_SEVERITIES) {
1897
- severity = Math.max(STANDARD_DATE_PROP_SEVERITIES[name_1], severity);
1898
- }
1899
- }
1900
- }
1901
- this.standardDateProps = standardDateProps;
1902
- this.extendedSettings = extendedSettings;
1903
- this.severity = severity;
1904
- this.buildFormattingFunc = memoize(buildFormattingFunc);
1905
- }
1906
- NativeFormatter.prototype.format = function (date, context) {
1907
- return this.buildFormattingFunc(this.standardDateProps, this.extendedSettings, context)(date);
1908
- };
1909
- NativeFormatter.prototype.formatRange = function (start, end, context) {
1910
- var _a = this, standardDateProps = _a.standardDateProps, extendedSettings = _a.extendedSettings;
1911
- var diffSeverity = computeMarkerDiffSeverity(start.marker, end.marker, context.calendarSystem);
1912
- if (!diffSeverity) {
1913
- return this.format(start, context);
1914
- }
1915
- var biggestUnitForPartial = diffSeverity;
1916
- if (biggestUnitForPartial > 1 && // the two dates are different in a way that's larger scale than time
1917
- (standardDateProps.year === 'numeric' || standardDateProps.year === '2-digit') &&
1918
- (standardDateProps.month === 'numeric' || standardDateProps.month === '2-digit') &&
1919
- (standardDateProps.day === 'numeric' || standardDateProps.day === '2-digit')) {
1920
- biggestUnitForPartial = 1; // make it look like the dates are only different in terms of time
1921
- }
1922
- var full0 = this.format(start, context);
1923
- var full1 = this.format(end, context);
1924
- if (full0 === full1) {
1925
- return full0;
1926
- }
1927
- var partialDateProps = computePartialFormattingOptions(standardDateProps, biggestUnitForPartial);
1928
- var partialFormattingFunc = buildFormattingFunc(partialDateProps, extendedSettings, context);
1929
- var partial0 = partialFormattingFunc(start);
1930
- var partial1 = partialFormattingFunc(end);
1931
- var insertion = findCommonInsertion(full0, partial0, full1, partial1);
1932
- var separator = extendedSettings.separator || '';
1933
- if (insertion) {
1934
- return insertion.before + partial0 + separator + partial1 + insertion.after;
1935
- }
1936
- return full0 + separator + full1;
1937
- };
1938
- NativeFormatter.prototype.getLargestUnit = function () {
1939
- switch (this.severity) {
1940
- case 7:
1941
- case 6:
1942
- case 5:
1943
- return 'year';
1944
- case 4:
1945
- return 'month';
1946
- case 3:
1947
- return 'week';
1948
- default:
1949
- return 'day';
1950
- }
1951
- };
1952
- return NativeFormatter;
1953
- }());
1954
- function buildFormattingFunc(standardDateProps, extendedSettings, context) {
1955
- var standardDatePropCnt = Object.keys(standardDateProps).length;
1956
- if (standardDatePropCnt === 1 && standardDateProps.timeZoneName === 'short') {
1957
- return function (date) {
1958
- return formatTimeZoneOffset(date.timeZoneOffset);
1959
- };
1960
- }
1961
- if (standardDatePropCnt === 0 && extendedSettings.week) {
1962
- return function (date) {
1963
- return formatWeekNumber(context.computeWeekNumber(date.marker), context.weekLabel, context.locale, extendedSettings.week);
1964
- };
1965
- }
1966
- return buildNativeFormattingFunc(standardDateProps, extendedSettings, context);
1967
- }
1968
- function buildNativeFormattingFunc(standardDateProps, extendedSettings, context) {
1969
- standardDateProps = __assign({}, standardDateProps); // copy
1970
- extendedSettings = __assign({}, extendedSettings); // copy
1971
- sanitizeSettings(standardDateProps, extendedSettings);
1972
- standardDateProps.timeZone = 'UTC'; // we leverage the only guaranteed timeZone for our UTC markers
1973
- var normalFormat = new Intl.DateTimeFormat(context.locale.codes, standardDateProps);
1974
- var zeroFormat; // needed?
1975
- if (extendedSettings.omitZeroMinute) {
1976
- var zeroProps = __assign({}, standardDateProps);
1977
- delete zeroProps.minute; // seconds and ms were already considered in sanitizeSettings
1978
- zeroFormat = new Intl.DateTimeFormat(context.locale.codes, zeroProps);
1979
- }
1980
- return function (date) {
1981
- var marker = date.marker;
1982
- var format;
1983
- if (zeroFormat && !marker.getUTCMinutes()) {
1984
- format = zeroFormat;
1985
- }
1986
- else {
1987
- format = normalFormat;
1988
- }
1989
- var s = format.format(marker);
1990
- return postProcess(s, date, standardDateProps, extendedSettings, context);
1991
- };
1992
- }
1993
- function sanitizeSettings(standardDateProps, extendedSettings) {
1994
- // deal with a browser inconsistency where formatting the timezone
1995
- // requires that the hour/minute be present.
1996
- if (standardDateProps.timeZoneName) {
1997
- if (!standardDateProps.hour) {
1998
- standardDateProps.hour = '2-digit';
1999
- }
2000
- if (!standardDateProps.minute) {
2001
- standardDateProps.minute = '2-digit';
2002
- }
2003
- }
2004
- // only support short timezone names
2005
- if (standardDateProps.timeZoneName === 'long') {
2006
- standardDateProps.timeZoneName = 'short';
2007
- }
2008
- // if requesting to display seconds, MUST display minutes
2009
- if (extendedSettings.omitZeroMinute && (standardDateProps.second || standardDateProps.millisecond)) {
2010
- delete extendedSettings.omitZeroMinute;
2011
- }
2012
- }
2013
- function postProcess(s, date, standardDateProps, extendedSettings, context) {
2014
- s = s.replace(LTR_RE, ''); // remove left-to-right control chars. do first. good for other regexes
2015
- if (standardDateProps.timeZoneName === 'short') {
2016
- s = injectTzoStr(s, (context.timeZone === 'UTC' || date.timeZoneOffset == null) ?
2017
- 'UTC' : // important to normalize for IE, which does "GMT"
2018
- formatTimeZoneOffset(date.timeZoneOffset));
2019
- }
2020
- if (extendedSettings.omitCommas) {
2021
- s = s.replace(COMMA_RE, '').trim();
2022
- }
2023
- if (extendedSettings.omitZeroMinute) {
2024
- s = s.replace(':00', ''); // zeroFormat doesn't always achieve this
2025
- }
2026
- // ^ do anything that might create adjacent spaces before this point,
2027
- // because MERIDIEM_RE likes to eat up loading spaces
2028
- if (extendedSettings.meridiem === false) {
2029
- s = s.replace(MERIDIEM_RE, '').trim();
2030
- }
2031
- else if (extendedSettings.meridiem === 'narrow') { // a/p
2032
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
2033
- return m1.toLocaleLowerCase();
2034
- });
2035
- }
2036
- else if (extendedSettings.meridiem === 'short') { // am/pm
2037
- s = s.replace(MERIDIEM_RE, function (m0, m1) {
2038
- return m1.toLocaleLowerCase() + 'm';
2039
- });
2040
- }
2041
- else if (extendedSettings.meridiem === 'lowercase') { // other meridiem transformers already converted to lowercase
2042
- s = s.replace(MERIDIEM_RE, function (m0) {
2043
- return m0.toLocaleLowerCase();
2044
- });
2045
- }
2046
- s = s.replace(MULTI_SPACE_RE, ' ');
2047
- s = s.trim();
2048
- return s;
2049
- }
2050
- function injectTzoStr(s, tzoStr) {
2051
- var replaced = false;
2052
- s = s.replace(UTC_RE, function () {
2053
- replaced = true;
2054
- return tzoStr;
2055
- });
2056
- // IE11 doesn't include UTC/GMT in the original string, so append to end
2057
- if (!replaced) {
2058
- s += ' ' + tzoStr;
2059
- }
2060
- return s;
2061
- }
2062
- function formatWeekNumber(num, weekLabel, locale, display) {
2063
- var parts = [];
2064
- if (display === 'narrow') {
2065
- parts.push(weekLabel);
2066
- }
2067
- else if (display === 'short') {
2068
- parts.push(weekLabel, ' ');
2069
- }
2070
- // otherwise, considered 'numeric'
2071
- parts.push(locale.simpleNumberFormat.format(num));
2072
- if (locale.options.isRtl) { // TODO: use control characters instead?
2073
- parts.reverse();
2074
- }
2075
- return parts.join('');
2076
- }
2077
- // Range Formatting Utils
2078
- // 0 = exactly the same
2079
- // 1 = different by time
2080
- // and bigger
2081
- function computeMarkerDiffSeverity(d0, d1, ca) {
2082
- if (ca.getMarkerYear(d0) !== ca.getMarkerYear(d1)) {
2083
- return 5;
2084
- }
2085
- if (ca.getMarkerMonth(d0) !== ca.getMarkerMonth(d1)) {
2086
- return 4;
2087
- }
2088
- if (ca.getMarkerDay(d0) !== ca.getMarkerDay(d1)) {
2089
- return 2;
2090
- }
2091
- if (timeAsMs(d0) !== timeAsMs(d1)) {
2092
- return 1;
2093
- }
2094
- return 0;
2095
- }
2096
- function computePartialFormattingOptions(options, biggestUnit) {
2097
- var partialOptions = {};
2098
- for (var name_2 in options) {
2099
- if (!(name_2 in STANDARD_DATE_PROP_SEVERITIES) || // not a date part prop (like timeZone)
2100
- STANDARD_DATE_PROP_SEVERITIES[name_2] <= biggestUnit) {
2101
- partialOptions[name_2] = options[name_2];
2102
- }
2103
- }
2104
- return partialOptions;
2105
- }
2106
- function findCommonInsertion(full0, partial0, full1, partial1) {
2107
- var i0 = 0;
2108
- while (i0 < full0.length) {
2109
- var found0 = full0.indexOf(partial0, i0);
2110
- if (found0 === -1) {
2111
- break;
2112
- }
2113
- var before0 = full0.substr(0, found0);
2114
- i0 = found0 + partial0.length;
2115
- var after0 = full0.substr(i0);
2116
- var i1 = 0;
2117
- while (i1 < full1.length) {
2118
- var found1 = full1.indexOf(partial1, i1);
2119
- if (found1 === -1) {
2120
- break;
2121
- }
2122
- var before1 = full1.substr(0, found1);
2123
- i1 = found1 + partial1.length;
2124
- var after1 = full1.substr(i1);
2125
- if (before0 === before1 && after0 === after1) {
2126
- return {
2127
- before: before0,
2128
- after: after0
2129
- };
2130
- }
2131
- }
2132
- }
2133
- return null;
2134
- }
2135
 
2136
- /*
2137
- TODO: fix the terminology of "formatter" vs "formatting func"
2138
- */
2139
- /*
2140
- At the time of instantiation, this object does not know which cmd-formatting system it will use.
2141
- It receives this at the time of formatting, as a setting.
2142
- */
2143
- var CmdFormatter = /** @class */ (function () {
2144
- function CmdFormatter(cmdStr, separator) {
2145
- this.cmdStr = cmdStr;
2146
- this.separator = separator;
2147
- }
2148
- CmdFormatter.prototype.format = function (date, context) {
2149
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(date, null, context, this.separator));
2150
- };
2151
- CmdFormatter.prototype.formatRange = function (start, end, context) {
2152
- return context.cmdFormatter(this.cmdStr, createVerboseFormattingArg(start, end, context, this.separator));
2153
- };
2154
- return CmdFormatter;
2155
- }());
2156
 
2157
- var FuncFormatter = /** @class */ (function () {
2158
- function FuncFormatter(func) {
2159
- this.func = func;
2160
- }
2161
- FuncFormatter.prototype.format = function (date, context) {
2162
- return this.func(createVerboseFormattingArg(date, null, context));
2163
- };
2164
- FuncFormatter.prototype.formatRange = function (start, end, context) {
2165
- return this.func(createVerboseFormattingArg(start, end, context));
2166
- };
2167
- return FuncFormatter;
2168
- }());
2169
 
2170
- // Formatter Object Creation
2171
- function createFormatter(input, defaultSeparator) {
2172
- if (typeof input === 'object' && input) { // non-null object
2173
- if (typeof defaultSeparator === 'string') {
2174
- input = __assign({ separator: defaultSeparator }, input);
2175
- }
2176
- return new NativeFormatter(input);
2177
- }
2178
- else if (typeof input === 'string') {
2179
- return new CmdFormatter(input, defaultSeparator);
2180
- }
2181
- else if (typeof input === 'function') {
2182
- return new FuncFormatter(input);
2183
- }
2184
- }
2185
- // String Utils
2186
- // timeZoneOffset is in minutes
2187
- function buildIsoString(marker, timeZoneOffset, stripZeroTime) {
2188
- if (stripZeroTime === void 0) { stripZeroTime = false; }
2189
- var s = marker.toISOString();
2190
- s = s.replace('.000', '');
2191
- if (stripZeroTime) {
2192
- s = s.replace('T00:00:00Z', '');
2193
- }
2194
- if (s.length > 10) { // time part wasn't stripped, can add timezone info
2195
- if (timeZoneOffset == null) {
2196
- s = s.replace('Z', '');
2197
- }
2198
- else if (timeZoneOffset !== 0) {
2199
- s = s.replace('Z', formatTimeZoneOffset(timeZoneOffset, true));
2200
- }
2201
- // otherwise, its UTC-0 and we want to keep the Z
2202
- }
2203
- return s;
2204
- }
2205
- function formatIsoTimeString(marker) {
2206
- return padStart(marker.getUTCHours(), 2) + ':' +
2207
- padStart(marker.getUTCMinutes(), 2) + ':' +
2208
- padStart(marker.getUTCSeconds(), 2);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2209
  }
2210
- function formatTimeZoneOffset(minutes, doIso) {
2211
- if (doIso === void 0) { doIso = false; }
2212
- var sign = minutes < 0 ? '-' : '+';
2213
- var abs = Math.abs(minutes);
2214
- var hours = Math.floor(abs / 60);
2215
- var mins = Math.round(abs % 60);
2216
- if (doIso) {
2217
- return sign + padStart(hours, 2) + ':' + padStart(mins, 2);
2218
- }
2219
- else {
2220
- return 'GMT' + sign + hours + (mins ? ':' + padStart(mins, 2) : '');
2221
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2222
  }
2223
- // Arg Utils
2224
- function createVerboseFormattingArg(start, end, context, separator) {
2225
- var startInfo = expandZonedMarker(start, context.calendarSystem);
2226
- var endInfo = end ? expandZonedMarker(end, context.calendarSystem) : null;
2227
- return {
2228
- date: startInfo,
2229
- start: startInfo,
2230
- end: endInfo,
2231
- timeZone: context.timeZone,
2232
- localeCodes: context.locale.codes,
2233
- separator: separator
2234
- };
2235
  }
2236
- function expandZonedMarker(dateInfo, calendarSystem) {
2237
- var a = calendarSystem.markerToArray(dateInfo.marker);
2238
- return {
2239
- marker: dateInfo.marker,
2240
- timeZoneOffset: dateInfo.timeZoneOffset,
2241
- array: a,
2242
- year: a[0],
2243
- month: a[1],
2244
- day: a[2],
2245
- hour: a[3],
2246
- minute: a[4],
2247
- second: a[5],
2248
- millisecond: a[6]
2249
- };
2250
  }
 
2251
 
2252
- var EventSourceApi = /** @class */ (function () {
2253
- function EventSourceApi(calendar, internalEventSource) {
2254
- this.calendar = calendar;
2255
- this.internalEventSource = internalEventSource;
2256
- }
2257
- EventSourceApi.prototype.remove = function () {
2258
- this.calendar.dispatch({
2259
- type: 'REMOVE_EVENT_SOURCE',
2260
- sourceId: this.internalEventSource.sourceId
2261
- });
2262
- };
2263
- EventSourceApi.prototype.refetch = function () {
2264
- this.calendar.dispatch({
2265
- type: 'FETCH_EVENT_SOURCES',
2266
- sourceIds: [this.internalEventSource.sourceId]
2267
- });
2268
- };
2269
- Object.defineProperty(EventSourceApi.prototype, "id", {
2270
- get: function () {
2271
- return this.internalEventSource.publicId;
2272
- },
2273
- enumerable: true,
2274
- configurable: true
2275
- });
2276
- Object.defineProperty(EventSourceApi.prototype, "url", {
2277
- // only relevant to json-feed event sources
2278
- get: function () {
2279
- return this.internalEventSource.meta.url;
2280
- },
2281
- enumerable: true,
2282
- configurable: true
2283
- });
2284
- return EventSourceApi;
2285
- }());
2286
 
2287
- var EventApi = /** @class */ (function () {
2288
- function EventApi(calendar, def, instance) {
2289
- this._calendar = calendar;
2290
- this._def = def;
2291
- this._instance = instance || null;
2292
- }
2293
- /*
2294
- TODO: make event struct more responsible for this
2295
- */
2296
- EventApi.prototype.setProp = function (name, val) {
2297
- var _a, _b;
2298
- if (name in DATE_PROPS) ;
2299
- else if (name in NON_DATE_PROPS) {
2300
- if (typeof NON_DATE_PROPS[name] === 'function') {
2301
- val = NON_DATE_PROPS[name](val);
2302
- }
2303
- this.mutate({
2304
- standardProps: (_a = {}, _a[name] = val, _a)
2305
- });
2306
- }
2307
- else if (name in UNSCOPED_EVENT_UI_PROPS) {
2308
- var ui = void 0;
2309
- if (typeof UNSCOPED_EVENT_UI_PROPS[name] === 'function') {
2310
- val = UNSCOPED_EVENT_UI_PROPS[name](val);
2311
- }
2312
- if (name === 'color') {
2313
- ui = { backgroundColor: val, borderColor: val };
2314
- }
2315
- else if (name === 'editable') {
2316
- ui = { startEditable: val, durationEditable: val };
2317
- }
2318
- else {
2319
- ui = (_b = {}, _b[name] = val, _b);
2320
- }
2321
- this.mutate({
2322
- standardProps: { ui: ui }
2323
- });
2324
- }
2325
- };
2326
- EventApi.prototype.setExtendedProp = function (name, val) {
2327
- var _a;
2328
- this.mutate({
2329
- extendedProps: (_a = {}, _a[name] = val, _a)
2330
- });
2331
- };
2332
- EventApi.prototype.setStart = function (startInput, options) {
2333
- if (options === void 0) { options = {}; }
2334
- var dateEnv = this._calendar.dateEnv;
2335
- var start = dateEnv.createMarker(startInput);
2336
- if (start && this._instance) { // TODO: warning if parsed bad
2337
- var instanceRange = this._instance.range;
2338
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity); // what if parsed bad!?
2339
- if (options.maintainDuration) {
2340
- this.mutate({ datesDelta: startDelta });
2341
- }
2342
- else {
2343
- this.mutate({ startDelta: startDelta });
2344
- }
2345
- }
2346
- };
2347
- EventApi.prototype.setEnd = function (endInput, options) {
2348
- if (options === void 0) { options = {}; }
2349
- var dateEnv = this._calendar.dateEnv;
2350
- var end;
2351
- if (endInput != null) {
2352
- end = dateEnv.createMarker(endInput);
2353
- if (!end) {
2354
- return; // TODO: warning if parsed bad
2355
- }
2356
- }
2357
- if (this._instance) {
2358
- if (end) {
2359
- var endDelta = diffDates(this._instance.range.end, end, dateEnv, options.granularity);
2360
- this.mutate({ endDelta: endDelta });
2361
- }
2362
- else {
2363
- this.mutate({ standardProps: { hasEnd: false } });
2364
- }
2365
- }
2366
- };
2367
- EventApi.prototype.setDates = function (startInput, endInput, options) {
2368
- if (options === void 0) { options = {}; }
2369
- var dateEnv = this._calendar.dateEnv;
2370
- var standardProps = { allDay: options.allDay };
2371
- var start = dateEnv.createMarker(startInput);
2372
- var end;
2373
- if (!start) {
2374
- return; // TODO: warning if parsed bad
2375
- }
2376
- if (endInput != null) {
2377
- end = dateEnv.createMarker(endInput);
2378
- if (!end) { // TODO: warning if parsed bad
2379
- return;
2380
- }
2381
- }
2382
- if (this._instance) {
2383
- var instanceRange = this._instance.range;
2384
- // when computing the diff for an event being converted to all-day,
2385
- // compute diff off of the all-day values the way event-mutation does.
2386
- if (options.allDay === true) {
2387
- instanceRange = computeAlignedDayRange(instanceRange);
2388
- }
2389
- var startDelta = diffDates(instanceRange.start, start, dateEnv, options.granularity);
2390
- if (end) {
2391
- var endDelta = diffDates(instanceRange.end, end, dateEnv, options.granularity);
2392
- if (durationsEqual(startDelta, endDelta)) {
2393
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
2394
- }
2395
- else {
2396
- this.mutate({ startDelta: startDelta, endDelta: endDelta, standardProps: standardProps });
2397
- }
2398
- }
2399
- else { // means "clear the end"
2400
- standardProps.hasEnd = false;
2401
- this.mutate({ datesDelta: startDelta, standardProps: standardProps });
2402
- }
2403
- }
2404
- };
2405
- EventApi.prototype.moveStart = function (deltaInput) {
2406
- var delta = createDuration(deltaInput);
2407
- if (delta) { // TODO: warning if parsed bad
2408
- this.mutate({ startDelta: delta });
2409
- }
2410
- };
2411
- EventApi.prototype.moveEnd = function (deltaInput) {
2412
- var delta = createDuration(deltaInput);
2413
- if (delta) { // TODO: warning if parsed bad
2414
- this.mutate({ endDelta: delta });
2415
- }
2416
- };
2417
- EventApi.prototype.moveDates = function (deltaInput) {
2418
- var delta = createDuration(deltaInput);
2419
- if (delta) { // TODO: warning if parsed bad
2420
- this.mutate({ datesDelta: delta });
2421
- }
2422
- };
2423
- EventApi.prototype.setAllDay = function (allDay, options) {
2424
- if (options === void 0) { options = {}; }
2425
- var standardProps = { allDay: allDay };
2426
- var maintainDuration = options.maintainDuration;
2427
- if (maintainDuration == null) {
2428
- maintainDuration = this._calendar.opt('allDayMaintainDuration');
2429
- }
2430
- if (this._def.allDay !== allDay) {
2431
- standardProps.hasEnd = maintainDuration;
2432
- }
2433
- this.mutate({ standardProps: standardProps });
2434
- };
2435
- EventApi.prototype.formatRange = function (formatInput) {
2436
- var dateEnv = this._calendar.dateEnv;
2437
- var instance = this._instance;
2438
- var formatter = createFormatter(formatInput, this._calendar.opt('defaultRangeSeparator'));
2439
- if (this._def.hasEnd) {
2440
- return dateEnv.formatRange(instance.range.start, instance.range.end, formatter, {
2441
- forcedStartTzo: instance.forcedStartTzo,
2442
- forcedEndTzo: instance.forcedEndTzo
2443
- });
2444
- }
2445
- else {
2446
- return dateEnv.format(instance.range.start, formatter, {
2447
- forcedTzo: instance.forcedStartTzo
2448
- });
2449
- }
2450
- };
2451
- EventApi.prototype.mutate = function (mutation) {
2452
- var def = this._def;
2453
- var instance = this._instance;
2454
- if (instance) {
2455
- this._calendar.dispatch({
2456
- type: 'MUTATE_EVENTS',
2457
- instanceId: instance.instanceId,
2458
- mutation: mutation,
2459
- fromApi: true
2460
- });
2461
- var eventStore = this._calendar.state.eventStore;
2462
- this._def = eventStore.defs[def.defId];
2463
- this._instance = eventStore.instances[instance.instanceId];
2464
- }
2465
- };
2466
- EventApi.prototype.remove = function () {
2467
- this._calendar.dispatch({
2468
- type: 'REMOVE_EVENT_DEF',
2469
- defId: this._def.defId
2470
- });
2471
- };
2472
- Object.defineProperty(EventApi.prototype, "source", {
2473
- get: function () {
2474
- var sourceId = this._def.sourceId;
2475
- if (sourceId) {
2476
- return new EventSourceApi(this._calendar, this._calendar.state.eventSources[sourceId]);
2477
- }
2478
- return null;
2479
- },
2480
- enumerable: true,
2481
- configurable: true
2482
- });
2483
- Object.defineProperty(EventApi.prototype, "start", {
2484
- get: function () {
2485
- return this._instance ?
2486
- this._calendar.dateEnv.toDate(this._instance.range.start) :
2487
- null;
2488
- },
2489
- enumerable: true,
2490
- configurable: true
2491
- });
2492
- Object.defineProperty(EventApi.prototype, "end", {
2493
- get: function () {
2494
- return (this._instance && this._def.hasEnd) ?
2495
- this._calendar.dateEnv.toDate(this._instance.range.end) :
2496
- null;
2497
- },
2498
- enumerable: true,
2499
- configurable: true
2500
- });
2501
- Object.defineProperty(EventApi.prototype, "id", {
2502
- // computable props that all access the def
2503
- // TODO: find a TypeScript-compatible way to do this at scale
2504
- get: function () { return this._def.publicId; },
2505
- enumerable: true,
2506
- configurable: true
2507
- });
2508
- Object.defineProperty(EventApi.prototype, "groupId", {
2509
- get: function () { return this._def.groupId; },
2510
- enumerable: true,
2511
- configurable: true
2512
- });
2513
- Object.defineProperty(EventApi.prototype, "allDay", {
2514
- get: function () { return this._def.allDay; },
2515
- enumerable: true,
2516
- configurable: true
2517
- });
2518
- Object.defineProperty(EventApi.prototype, "title", {
2519
- get: function () { return this._def.title; },
2520
- enumerable: true,
2521
- configurable: true
2522
- });
2523
- Object.defineProperty(EventApi.prototype, "url", {
2524
- get: function () { return this._def.url; },
2525
- enumerable: true,
2526
- configurable: true
2527
- });
2528
- Object.defineProperty(EventApi.prototype, "rendering", {
2529
- get: function () { return this._def.rendering; },
2530
- enumerable: true,
2531
- configurable: true
2532
- });
2533
- Object.defineProperty(EventApi.prototype, "startEditable", {
2534
- get: function () { return this._def.ui.startEditable; },
2535
- enumerable: true,
2536
- configurable: true
2537
- });
2538
- Object.defineProperty(EventApi.prototype, "durationEditable", {
2539
- get: function () { return this._def.ui.durationEditable; },
2540
- enumerable: true,
2541
- configurable: true
2542
- });
2543
- Object.defineProperty(EventApi.prototype, "constraint", {
2544
- get: function () { return this._def.ui.constraints[0] || null; },
2545
- enumerable: true,
2546
- configurable: true
2547
- });
2548
- Object.defineProperty(EventApi.prototype, "overlap", {
2549
- get: function () { return this._def.ui.overlap; },
2550
- enumerable: true,
2551
- configurable: true
2552
- });
2553
- Object.defineProperty(EventApi.prototype, "allow", {
2554
- get: function () { return this._def.ui.allows[0] || null; },
2555
- enumerable: true,
2556
- configurable: true
2557
- });
2558
- Object.defineProperty(EventApi.prototype, "backgroundColor", {
2559
- get: function () { return this._def.ui.backgroundColor; },
2560
- enumerable: true,
2561
- configurable: true
2562
- });
2563
- Object.defineProperty(EventApi.prototype, "borderColor", {
2564
- get: function () { return this._def.ui.borderColor; },
2565
- enumerable: true,
2566
- configurable: true
2567
- });
2568
- Object.defineProperty(EventApi.prototype, "textColor", {
2569
- get: function () { return this._def.ui.textColor; },
2570
- enumerable: true,
2571
- configurable: true
2572
- });
2573
- Object.defineProperty(EventApi.prototype, "classNames", {
2574
- // NOTE: user can't modify these because Object.freeze was called in event-def parsing
2575
- get: function () { return this._def.ui.classNames; },
2576
- enumerable: true,
2577
- configurable: true
2578
- });
2579
- Object.defineProperty(EventApi.prototype, "extendedProps", {
2580
- get: function () { return this._def.extendedProps; },
2581
- enumerable: true,
2582
- configurable: true
2583
- });
2584
- return EventApi;
2585
- }());
2586
 
2587
- /*
2588
- Specifying nextDayThreshold signals that all-day ranges should be sliced.
2589
- */
2590
- function sliceEventStore(eventStore, eventUiBases, framingRange, nextDayThreshold) {
2591
- var inverseBgByGroupId = {};
2592
- var inverseBgByDefId = {};
2593
- var defByGroupId = {};
2594
- var bgRanges = [];
2595
- var fgRanges = [];
2596
- var eventUis = compileEventUis(eventStore.defs, eventUiBases);
2597
- for (var defId in eventStore.defs) {
2598
- var def = eventStore.defs[defId];
2599
- if (def.rendering === 'inverse-background') {
2600
- if (def.groupId) {
2601
- inverseBgByGroupId[def.groupId] = [];
2602
- if (!defByGroupId[def.groupId]) {
2603
- defByGroupId[def.groupId] = def;
2604
- }
2605
- }
2606
- else {
2607
- inverseBgByDefId[defId] = [];
2608
- }
2609
- }
2610
- }
2611
- for (var instanceId in eventStore.instances) {
2612
- var instance = eventStore.instances[instanceId];
2613
- var def = eventStore.defs[instance.defId];
2614
- var ui = eventUis[def.defId];
2615
- var origRange = instance.range;
2616
- var normalRange = (!def.allDay && nextDayThreshold) ?
2617
- computeVisibleDayRange(origRange, nextDayThreshold) :
2618
- origRange;
2619
- var slicedRange = intersectRanges(normalRange, framingRange);
2620
- if (slicedRange) {
2621
- if (def.rendering === 'inverse-background') {
2622
- if (def.groupId) {
2623
- inverseBgByGroupId[def.groupId].push(slicedRange);
2624
- }
2625
- else {
2626
- inverseBgByDefId[instance.defId].push(slicedRange);
2627
- }
2628
- }
2629
- else {
2630
- (def.rendering === 'background' ? bgRanges : fgRanges).push({
2631
- def: def,
2632
- ui: ui,
2633
- instance: instance,
2634
- range: slicedRange,
2635
- isStart: normalRange.start && normalRange.start.valueOf() === slicedRange.start.valueOf(),
2636
- isEnd: normalRange.end && normalRange.end.valueOf() === slicedRange.end.valueOf()
2637
- });
2638
- }
2639
- }
2640
- }
2641
- for (var groupId in inverseBgByGroupId) { // BY GROUP
2642
- var ranges = inverseBgByGroupId[groupId];
2643
- var invertedRanges = invertRanges(ranges, framingRange);
2644
- for (var _i = 0, invertedRanges_1 = invertedRanges; _i < invertedRanges_1.length; _i++) {
2645
- var invertedRange = invertedRanges_1[_i];
2646
- var def = defByGroupId[groupId];
2647
- var ui = eventUis[def.defId];
2648
- bgRanges.push({
2649
- def: def,
2650
- ui: ui,
2651
- instance: null,
2652
- range: invertedRange,
2653
- isStart: false,
2654
- isEnd: false
2655
- });
2656
- }
2657
- }
2658
- for (var defId in inverseBgByDefId) {
2659
- var ranges = inverseBgByDefId[defId];
2660
- var invertedRanges = invertRanges(ranges, framingRange);
2661
- for (var _a = 0, invertedRanges_2 = invertedRanges; _a < invertedRanges_2.length; _a++) {
2662
- var invertedRange = invertedRanges_2[_a];
2663
- bgRanges.push({
2664
- def: eventStore.defs[defId],
2665
- ui: eventUis[defId],
2666
- instance: null,
2667
- range: invertedRange,
2668
- isStart: false,
2669
- isEnd: false
2670
- });
2671
- }
2672
- }
2673
- return { bg: bgRanges, fg: fgRanges };
2674
- }
2675
- function hasBgRendering(def) {
2676
- return def.rendering === 'background' || def.rendering === 'inverse-background';
2677
- }
2678
- function filterSegsViaEls(view, segs, isMirror) {
2679
- if (view.hasPublicHandlers('eventRender')) {
2680
- segs = segs.filter(function (seg) {
2681
- var custom = view.publiclyTrigger('eventRender', [
2682
- {
2683
- event: new EventApi(view.calendar, seg.eventRange.def, seg.eventRange.instance),
2684
- isMirror: isMirror,
2685
- isStart: seg.isStart,
2686
- isEnd: seg.isEnd,
2687
- // TODO: include seg.range once all components consistently generate it
2688
- el: seg.el,
2689
- view: view
2690
- }
2691
- ]);
2692
- if (custom === false) { // means don't render at all
2693
- return false;
2694
- }
2695
- else if (custom && custom !== true) {
2696
- seg.el = custom;
2697
- }
2698
- return true;
2699
- });
2700
- }
2701
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
2702
- var seg = segs_1[_i];
2703
- setElSeg(seg.el, seg);
2704
- }
2705
- return segs;
2706
- }
2707
- function setElSeg(el, seg) {
2708
- el.fcSeg = seg;
2709
- }
2710
- function getElSeg(el) {
2711
- return el.fcSeg || null;
2712
- }
2713
- // event ui computation
2714
- function compileEventUis(eventDefs, eventUiBases) {
2715
- return mapHash(eventDefs, function (eventDef) {
2716
- return compileEventUi(eventDef, eventUiBases);
2717
- });
2718
- }
2719
- function compileEventUi(eventDef, eventUiBases) {
2720
- var uis = [];
2721
- if (eventUiBases['']) {
2722
- uis.push(eventUiBases['']);
2723
- }
2724
- if (eventUiBases[eventDef.defId]) {
2725
- uis.push(eventUiBases[eventDef.defId]);
2726
- }
2727
- uis.push(eventDef.ui);
2728
- return combineEventUis(uis);
2729
- }
2730
 
2731
- // applies the mutation to ALL defs/instances within the event store
2732
- function applyMutationToEventStore(eventStore, eventConfigBase, mutation, calendar) {
2733
- var eventConfigs = compileEventUis(eventStore.defs, eventConfigBase);
2734
- var dest = createEmptyEventStore();
2735
- for (var defId in eventStore.defs) {
2736
- var def = eventStore.defs[defId];
2737
- dest.defs[defId] = applyMutationToEventDef(def, eventConfigs[defId], mutation, calendar.pluginSystem.hooks.eventDefMutationAppliers, calendar);
2738
- }
2739
- for (var instanceId in eventStore.instances) {
2740
- var instance = eventStore.instances[instanceId];
2741
- var def = dest.defs[instance.defId]; // important to grab the newly modified def
2742
- dest.instances[instanceId] = applyMutationToEventInstance(instance, def, eventConfigs[instance.defId], mutation, calendar);
2743
- }
2744
- return dest;
2745
- }
2746
- function applyMutationToEventDef(eventDef, eventConfig, mutation, appliers, calendar) {
2747
- var standardProps = mutation.standardProps || {};
2748
- // if hasEnd has not been specified, guess a good value based on deltas.
2749
- // if duration will change, there's no way the default duration will persist,
2750
- // and thus, we need to mark the event as having a real end
2751
- if (standardProps.hasEnd == null &&
2752
- eventConfig.durationEditable &&
2753
- (mutation.startDelta || mutation.endDelta)) {
2754
- standardProps.hasEnd = true; // TODO: is this mutation okay?
2755
- }
2756
- var copy = __assign({}, eventDef, standardProps, { ui: __assign({}, eventDef.ui, standardProps.ui) });
2757
- if (mutation.extendedProps) {
2758
- copy.extendedProps = __assign({}, copy.extendedProps, mutation.extendedProps);
2759
- }
2760
- for (var _i = 0, appliers_1 = appliers; _i < appliers_1.length; _i++) {
2761
- var applier = appliers_1[_i];
2762
- applier(copy, mutation, calendar);
2763
- }
2764
- if (!copy.hasEnd && calendar.opt('forceEventDuration')) {
2765
- copy.hasEnd = true;
2766
- }
2767
- return copy;
2768
- }
2769
- function applyMutationToEventInstance(eventInstance, eventDef, // must first be modified by applyMutationToEventDef
2770
- eventConfig, mutation, calendar) {
2771
- var dateEnv = calendar.dateEnv;
2772
- var forceAllDay = mutation.standardProps && mutation.standardProps.allDay === true;
2773
- var clearEnd = mutation.standardProps && mutation.standardProps.hasEnd === false;
2774
- var copy = __assign({}, eventInstance);
2775
- if (forceAllDay) {
2776
- copy.range = computeAlignedDayRange(copy.range);
2777
- }
2778
- if (mutation.datesDelta && eventConfig.startEditable) {
2779
- copy.range = {
2780
- start: dateEnv.add(copy.range.start, mutation.datesDelta),
2781
- end: dateEnv.add(copy.range.end, mutation.datesDelta)
2782
- };
2783
- }
2784
- if (mutation.startDelta && eventConfig.durationEditable) {
2785
- copy.range = {
2786
- start: dateEnv.add(copy.range.start, mutation.startDelta),
2787
- end: copy.range.end
2788
- };
2789
- }
2790
- if (mutation.endDelta && eventConfig.durationEditable) {
2791
- copy.range = {
2792
- start: copy.range.start,
2793
- end: dateEnv.add(copy.range.end, mutation.endDelta)
2794
- };
2795
- }
2796
- if (clearEnd) {
2797
- copy.range = {
2798
- start: copy.range.start,
2799
- end: calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start)
2800
- };
2801
- }
2802
- // in case event was all-day but the supplied deltas were not
2803
- // better util for this?
2804
- if (eventDef.allDay) {
2805
- copy.range = {
2806
- start: startOfDay(copy.range.start),
2807
- end: startOfDay(copy.range.end)
2808
- };
2809
- }
2810
- // handle invalid durations
2811
- if (copy.range.end < copy.range.start) {
2812
- copy.range.end = calendar.getDefaultEventEnd(eventDef.allDay, copy.range.start);
2813
- }
2814
- return copy;
2815
- }
2816
 
2817
- function reduceEventStore (eventStore, action, eventSources, dateProfile, calendar) {
2818
- switch (action.type) {
2819
- case 'RECEIVE_EVENTS': // raw
2820
- return receiveRawEvents(eventStore, eventSources[action.sourceId], action.fetchId, action.fetchRange, action.rawEvents, calendar);
2821
- case 'ADD_EVENTS': // already parsed, but not expanded
2822
- return addEvent(eventStore, action.eventStore, // new ones
2823
- dateProfile ? dateProfile.activeRange : null, calendar);
2824
- case 'MERGE_EVENTS': // already parsed and expanded
2825
- return mergeEventStores(eventStore, action.eventStore);
2826
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
2827
- case 'NEXT':
2828
- case 'SET_DATE':
2829
- case 'SET_VIEW_TYPE':
2830
- if (dateProfile) {
2831
- return expandRecurring(eventStore, dateProfile.activeRange, calendar);
2832
- }
2833
- else {
2834
- return eventStore;
2835
- }
2836
- case 'CHANGE_TIMEZONE':
2837
- return rezoneDates(eventStore, action.oldDateEnv, calendar.dateEnv);
2838
- case 'MUTATE_EVENTS':
2839
- return applyMutationToRelated(eventStore, action.instanceId, action.mutation, action.fromApi, calendar);
2840
- case 'REMOVE_EVENT_INSTANCES':
2841
- return excludeInstances(eventStore, action.instances);
2842
- case 'REMOVE_EVENT_DEF':
2843
- return filterEventStoreDefs(eventStore, function (eventDef) {
2844
- return eventDef.defId !== action.defId;
2845
- });
2846
- case 'REMOVE_EVENT_SOURCE':
2847
- return excludeEventsBySourceId(eventStore, action.sourceId);
2848
- case 'REMOVE_ALL_EVENT_SOURCES':
2849
- return filterEventStoreDefs(eventStore, function (eventDef) {
2850
- return !eventDef.sourceId; // only keep events with no source id
2851
- });
2852
- case 'REMOVE_ALL_EVENTS':
2853
- return createEmptyEventStore();
2854
- case 'RESET_EVENTS':
2855
- return {
2856
- defs: eventStore.defs,
2857
- instances: eventStore.instances
2858
- };
2859
- default:
2860
- return eventStore;
2861
- }
2862
- }
2863
- function receiveRawEvents(eventStore, eventSource, fetchId, fetchRange, rawEvents, calendar) {
2864
- if (eventSource && // not already removed
2865
- fetchId === eventSource.latestFetchId // TODO: wish this logic was always in event-sources
2866
- ) {
2867
- var subset = parseEvents(transformRawEvents(rawEvents, eventSource, calendar), eventSource.sourceId, calendar);
2868
- if (fetchRange) {
2869
- subset = expandRecurring(subset, fetchRange, calendar);
2870
- }
2871
- return mergeEventStores(excludeEventsBySourceId(eventStore, eventSource.sourceId), subset);
2872
- }
2873
- return eventStore;
2874
- }
2875
- function addEvent(eventStore, subset, expandRange, calendar) {
2876
- if (expandRange) {
2877
- subset = expandRecurring(subset, expandRange, calendar);
2878
- }
2879
- return mergeEventStores(eventStore, subset);
2880
- }
2881
- function rezoneDates(eventStore, oldDateEnv, newDateEnv) {
2882
- var defs = eventStore.defs;
2883
- var instances = mapHash(eventStore.instances, function (instance) {
2884
- var def = defs[instance.defId];
2885
- if (def.allDay || def.recurringDef) {
2886
- return instance; // isn't dependent on timezone
2887
- }
2888
- else {
2889
- return __assign({}, instance, { range: {
2890
- start: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.start, instance.forcedStartTzo)),
2891
- end: newDateEnv.createMarker(oldDateEnv.toDate(instance.range.end, instance.forcedEndTzo))
2892
- }, forcedStartTzo: newDateEnv.canComputeOffset ? null : instance.forcedStartTzo, forcedEndTzo: newDateEnv.canComputeOffset ? null : instance.forcedEndTzo });
2893
- }
2894
- });
2895
- return { defs: defs, instances: instances };
2896
- }
2897
- function applyMutationToRelated(eventStore, instanceId, mutation, fromApi, calendar) {
2898
- var relevant = getRelevantEvents(eventStore, instanceId);
2899
- var eventConfigBase = fromApi ?
2900
- { '': {
2901
- startEditable: true,
2902
- durationEditable: true,
2903
- constraints: [],
2904
- overlap: null,
2905
- allows: [],
2906
- backgroundColor: '',
2907
- borderColor: '',
2908
- textColor: '',
2909
- classNames: []
2910
- } } :
2911
- calendar.eventUiBases;
2912
- relevant = applyMutationToEventStore(relevant, eventConfigBase, mutation, calendar);
2913
- return mergeEventStores(eventStore, relevant);
2914
- }
2915
- function excludeEventsBySourceId(eventStore, sourceId) {
2916
- return filterEventStoreDefs(eventStore, function (eventDef) {
2917
- return eventDef.sourceId !== sourceId;
2918
- });
2919
- }
2920
- // QUESTION: why not just return instances? do a general object-property-exclusion util
2921
- function excludeInstances(eventStore, removals) {
2922
- return {
2923
- defs: eventStore.defs,
2924
- instances: filterHash(eventStore.instances, function (instance) {
2925
- return !removals[instance.instanceId];
2926
- })
2927
- };
2928
- }
2929
 
2930
- // high-level segmenting-aware tester functions
2931
- // ------------------------------------------------------------------------------------------------------------------------
2932
- function isInteractionValid(interaction, calendar) {
2933
- return isNewPropsValid({ eventDrag: interaction }, calendar); // HACK: the eventDrag props is used for ALL interactions
2934
- }
2935
- function isDateSelectionValid(dateSelection, calendar) {
2936
- return isNewPropsValid({ dateSelection: dateSelection }, calendar);
2937
- }
2938
- function isNewPropsValid(newProps, calendar) {
2939
- var view = calendar.view;
2940
- var props = __assign({ businessHours: view ? view.props.businessHours : createEmptyEventStore(), dateSelection: '', eventStore: calendar.state.eventStore, eventUiBases: calendar.eventUiBases, eventSelection: '', eventDrag: null, eventResize: null }, newProps);
2941
- return (calendar.pluginSystem.hooks.isPropsValid || isPropsValid)(props, calendar);
2942
- }
2943
- function isPropsValid(state, calendar, dateSpanMeta, filterConfig) {
2944
- if (dateSpanMeta === void 0) { dateSpanMeta = {}; }
2945
- if (state.eventDrag && !isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
2946
- return false;
2947
- }
2948
- if (state.dateSelection && !isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig)) {
2949
- return false;
2950
- }
2951
- return true;
2952
- }
2953
- // Moving Event Validation
2954
- // ------------------------------------------------------------------------------------------------------------------------
2955
- function isInteractionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
2956
- var interaction = state.eventDrag; // HACK: the eventDrag props is used for ALL interactions
2957
- var subjectEventStore = interaction.mutatedEvents;
2958
- var subjectDefs = subjectEventStore.defs;
2959
- var subjectInstances = subjectEventStore.instances;
2960
- var subjectConfigs = compileEventUis(subjectDefs, interaction.isEvent ?
2961
- state.eventUiBases :
2962
- { '': calendar.selectionConfig } // if not a real event, validate as a selection
2963
- );
2964
- if (filterConfig) {
2965
- subjectConfigs = mapHash(subjectConfigs, filterConfig);
2966
- }
2967
- var otherEventStore = excludeInstances(state.eventStore, interaction.affectedEvents.instances); // exclude the subject events. TODO: exclude defs too?
2968
- var otherDefs = otherEventStore.defs;
2969
- var otherInstances = otherEventStore.instances;
2970
- var otherConfigs = compileEventUis(otherDefs, state.eventUiBases);
2971
- for (var subjectInstanceId in subjectInstances) {
2972
- var subjectInstance = subjectInstances[subjectInstanceId];
2973
- var subjectRange = subjectInstance.range;
2974
- var subjectConfig = subjectConfigs[subjectInstance.defId];
2975
- var subjectDef = subjectDefs[subjectInstance.defId];
2976
- // constraint
2977
- if (!allConstraintsPass(subjectConfig.constraints, subjectRange, otherEventStore, state.businessHours, calendar)) {
2978
- return false;
2979
- }
2980
- // overlap
2981
- var overlapFunc = calendar.opt('eventOverlap');
2982
- if (typeof overlapFunc !== 'function') {
2983
- overlapFunc = null;
2984
- }
2985
- for (var otherInstanceId in otherInstances) {
2986
- var otherInstance = otherInstances[otherInstanceId];
2987
- // intersect! evaluate
2988
- if (rangesIntersect(subjectRange, otherInstance.range)) {
2989
- var otherOverlap = otherConfigs[otherInstance.defId].overlap;
2990
- // consider the other event's overlap. only do this if the subject event is a "real" event
2991
- if (otherOverlap === false && interaction.isEvent) {
2992
- return false;
2993
- }
2994
- if (subjectConfig.overlap === false) {
2995
- return false;
2996
- }
2997
- if (overlapFunc && !overlapFunc(new EventApi(calendar, otherDefs[otherInstance.defId], otherInstance), // still event
2998
- new EventApi(calendar, subjectDef, subjectInstance) // moving event
2999
- )) {
3000
- return false;
3001
- }
3002
- }
3003
- }
3004
- // allow (a function)
3005
- var calendarEventStore = calendar.state.eventStore; // need global-to-calendar, not local to component (splittable)state
3006
- for (var _i = 0, _a = subjectConfig.allows; _i < _a.length; _i++) {
3007
- var subjectAllow = _a[_i];
3008
- var subjectDateSpan = __assign({}, dateSpanMeta, { range: subjectInstance.range, allDay: subjectDef.allDay });
3009
- var origDef = calendarEventStore.defs[subjectDef.defId];
3010
- var origInstance = calendarEventStore.instances[subjectInstanceId];
3011
- var eventApi = void 0;
3012
- if (origDef) { // was previously in the calendar
3013
- eventApi = new EventApi(calendar, origDef, origInstance);
3014
- }
3015
- else { // was an external event
3016
- eventApi = new EventApi(calendar, subjectDef); // no instance, because had no dates
3017
- }
3018
- if (!subjectAllow(calendar.buildDateSpanApi(subjectDateSpan), eventApi)) {
3019
- return false;
3020
- }
3021
- }
3022
- }
3023
- return true;
3024
- }
3025
- // Date Selection Validation
3026
- // ------------------------------------------------------------------------------------------------------------------------
3027
- function isDateSelectionPropsValid(state, calendar, dateSpanMeta, filterConfig) {
3028
- var relevantEventStore = state.eventStore;
3029
- var relevantDefs = relevantEventStore.defs;
3030
- var relevantInstances = relevantEventStore.instances;
3031
- var selection = state.dateSelection;
3032
- var selectionRange = selection.range;
3033
- var selectionConfig = calendar.selectionConfig;
3034
- if (filterConfig) {
3035
- selectionConfig = filterConfig(selectionConfig);
3036
- }
3037
- // constraint
3038
- if (!allConstraintsPass(selectionConfig.constraints, selectionRange, relevantEventStore, state.businessHours, calendar)) {
3039
- return false;
3040
- }
3041
- // overlap
3042
- var overlapFunc = calendar.opt('selectOverlap');
3043
- if (typeof overlapFunc !== 'function') {
3044
- overlapFunc = null;
3045
- }
3046
- for (var relevantInstanceId in relevantInstances) {
3047
- var relevantInstance = relevantInstances[relevantInstanceId];
3048
- // intersect! evaluate
3049
- if (rangesIntersect(selectionRange, relevantInstance.range)) {
3050
- if (selectionConfig.overlap === false) {
3051
- return false;
3052
- }
3053
- if (overlapFunc && !overlapFunc(new EventApi(calendar, relevantDefs[relevantInstance.defId], relevantInstance))) {
3054
- return false;
3055
- }
3056
- }
3057
- }
3058
- // allow (a function)
3059
- for (var _i = 0, _a = selectionConfig.allows; _i < _a.length; _i++) {
3060
- var selectionAllow = _a[_i];
3061
- var fullDateSpan = __assign({}, dateSpanMeta, selection);
3062
- if (!selectionAllow(calendar.buildDateSpanApi(fullDateSpan), null)) {
3063
- return false;
3064
- }
3065
- }
3066
- return true;
3067
- }
3068
- // Constraint Utils
3069
- // ------------------------------------------------------------------------------------------------------------------------
3070
- function allConstraintsPass(constraints, subjectRange, otherEventStore, businessHoursUnexpanded, calendar) {
3071
- for (var _i = 0, constraints_1 = constraints; _i < constraints_1.length; _i++) {
3072
- var constraint = constraints_1[_i];
3073
- if (!anyRangesContainRange(constraintToRanges(constraint, subjectRange, otherEventStore, businessHoursUnexpanded, calendar), subjectRange)) {
3074
- return false;
3075
- }
3076
- }
3077
- return true;
3078
- }
3079
- function constraintToRanges(constraint, subjectRange, // for expanding a recurring constraint, or expanding business hours
3080
- otherEventStore, // for if constraint is an even group ID
3081
- businessHoursUnexpanded, // for if constraint is 'businessHours'
3082
- calendar // for expanding businesshours
3083
- ) {
3084
- if (constraint === 'businessHours') {
3085
- return eventStoreToRanges(expandRecurring(businessHoursUnexpanded, subjectRange, calendar));
3086
- }
3087
- else if (typeof constraint === 'string') { // an group ID
3088
- return eventStoreToRanges(filterEventStoreDefs(otherEventStore, function (eventDef) {
3089
- return eventDef.groupId === constraint;
3090
- }));
3091
- }
3092
- else if (typeof constraint === 'object' && constraint) { // non-null object
3093
- return eventStoreToRanges(expandRecurring(constraint, subjectRange, calendar));
3094
- }
3095
- return []; // if it's false
3096
- }
3097
- // TODO: move to event-store file?
3098
- function eventStoreToRanges(eventStore) {
3099
- var instances = eventStore.instances;
3100
- var ranges = [];
3101
- for (var instanceId in instances) {
3102
- ranges.push(instances[instanceId].range);
3103
- }
3104
- return ranges;
3105
- }
3106
- // TODO: move to geom file?
3107
- function anyRangesContainRange(outerRanges, innerRange) {
3108
- for (var _i = 0, outerRanges_1 = outerRanges; _i < outerRanges_1.length; _i++) {
3109
- var outerRange = outerRanges_1[_i];
3110
- if (rangeContainsRange(outerRange, innerRange)) {
3111
- return true;
3112
- }
3113
- }
3114
- return false;
3115
- }
3116
- // Parsing
3117
- // ------------------------------------------------------------------------------------------------------------------------
3118
- function normalizeConstraint(input, calendar) {
3119
- if (Array.isArray(input)) {
3120
- return parseEvents(input, '', calendar, true); // allowOpenRange=true
3121
- }
3122
- else if (typeof input === 'object' && input) { // non-null object
3123
- return parseEvents([input], '', calendar, true); // allowOpenRange=true
3124
- }
3125
- else if (input != null) {
3126
- return String(input);
3127
- }
3128
- else {
3129
- return null;
3130
- }
3131
  }
 
 
3132
 
3133
- function htmlEscape(s) {
3134
- return (s + '').replace(/&/g, '&amp;')
3135
- .replace(/</g, '&lt;')
3136
- .replace(/>/g, '&gt;')
3137
- .replace(/'/g, '&#039;')
3138
- .replace(/"/g, '&quot;')
3139
- .replace(/\n/g, '<br />');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3140
  }
3141
- // Given a hash of CSS properties, returns a string of CSS.
3142
- // Uses property names as-is (no camel-case conversion). Will not make statements for null/undefined values.
3143
- function cssToStr(cssProps) {
3144
- var statements = [];
3145
- for (var name_1 in cssProps) {
3146
- var val = cssProps[name_1];
3147
- if (val != null && val !== '') {
3148
- statements.push(name_1 + ':' + val);
3149
- }
3150
- }
3151
- return statements.join(';');
3152
  }
3153
- // Given an object hash of HTML attribute names to values,
3154
- // generates a string that can be injected between < > in HTML
3155
- function attrsToStr(attrs) {
3156
- var parts = [];
3157
- for (var name_2 in attrs) {
3158
- var val = attrs[name_2];
3159
- if (val != null) {
3160
- parts.push(name_2 + '="' + htmlEscape(val) + '"');
3161
- }
3162
- }
3163
- return parts.join(' ');
3164
  }
3165
- function parseClassName(raw) {
3166
- if (Array.isArray(raw)) {
3167
- return raw;
3168
- }
3169
- else if (typeof raw === 'string') {
3170
- return raw.split(/\s+/);
3171
- }
3172
- else {
3173
- return [];
3174
- }
3175
  }
 
3176
 
3177
- var UNSCOPED_EVENT_UI_PROPS = {
3178
- editable: Boolean,
3179
- startEditable: Boolean,
3180
- durationEditable: Boolean,
3181
- constraint: null,
3182
- overlap: null,
3183
- allow: null,
3184
- className: parseClassName,
3185
- classNames: parseClassName,
3186
- color: String,
3187
- backgroundColor: String,
3188
- borderColor: String,
3189
- textColor: String
3190
- };
3191
- function processUnscopedUiProps(rawProps, calendar, leftovers) {
3192
- var props = refineProps(rawProps, UNSCOPED_EVENT_UI_PROPS, {}, leftovers);
3193
- var constraint = normalizeConstraint(props.constraint, calendar);
3194
- return {
3195
- startEditable: props.startEditable != null ? props.startEditable : props.editable,
3196
- durationEditable: props.durationEditable != null ? props.durationEditable : props.editable,
3197
- constraints: constraint != null ? [constraint] : [],
3198
- overlap: props.overlap,
3199
- allows: props.allow != null ? [props.allow] : [],
3200
- backgroundColor: props.backgroundColor || props.color,
3201
- borderColor: props.borderColor || props.color,
3202
- textColor: props.textColor,
3203
- classNames: props.classNames.concat(props.className)
3204
- };
3205
- }
3206
- function processScopedUiProps(prefix, rawScoped, calendar, leftovers) {
3207
- var rawUnscoped = {};
3208
- var wasFound = {};
3209
- for (var key in UNSCOPED_EVENT_UI_PROPS) {
3210
- var scopedKey = prefix + capitaliseFirstLetter(key);
3211
- rawUnscoped[key] = rawScoped[scopedKey];
3212
- wasFound[scopedKey] = true;
3213
- }
3214
- if (prefix === 'event') {
3215
- rawUnscoped.editable = rawScoped.editable; // special case. there is no 'eventEditable', just 'editable'
3216
- }
3217
- if (leftovers) {
3218
- for (var key in rawScoped) {
3219
- if (!wasFound[key]) {
3220
- leftovers[key] = rawScoped[key];
3221
- }
3222
- }
3223
- }
3224
- return processUnscopedUiProps(rawUnscoped, calendar);
3225
- }
3226
- var EMPTY_EVENT_UI = {
3227
- startEditable: null,
3228
- durationEditable: null,
3229
- constraints: [],
3230
- overlap: null,
3231
- allows: [],
3232
- backgroundColor: '',
3233
- borderColor: '',
3234
- textColor: '',
3235
- classNames: []
3236
- };
3237
- // prevent against problems with <2 args!
3238
- function combineEventUis(uis) {
3239
- return uis.reduce(combineTwoEventUis, EMPTY_EVENT_UI);
3240
- }
3241
- function combineTwoEventUis(item0, item1) {
3242
- return {
3243
- startEditable: item1.startEditable != null ? item1.startEditable : item0.startEditable,
3244
- durationEditable: item1.durationEditable != null ? item1.durationEditable : item0.durationEditable,
3245
- constraints: item0.constraints.concat(item1.constraints),
3246
- overlap: typeof item1.overlap === 'boolean' ? item1.overlap : item0.overlap,
3247
- allows: item0.allows.concat(item1.allows),
3248
- backgroundColor: item1.backgroundColor || item0.backgroundColor,
3249
- borderColor: item1.borderColor || item0.borderColor,
3250
- textColor: item1.textColor || item0.textColor,
3251
- classNames: item0.classNames.concat(item1.classNames)
3252
- };
3253
- }
3254
 
3255
- var NON_DATE_PROPS = {
3256
- id: String,
3257
- groupId: String,
3258
- title: String,
3259
- url: String,
3260
- rendering: String,
3261
- extendedProps: null
3262
- };
3263
- var DATE_PROPS = {
3264
- start: null,
3265
- date: null,
3266
- end: null,
3267
- allDay: null
3268
- };
3269
- var uid = 0;
3270
- function parseEvent(raw, sourceId, calendar, allowOpenRange) {
3271
- var allDayDefault = computeIsAllDayDefault(sourceId, calendar);
3272
- var leftovers0 = {};
3273
- var recurringRes = parseRecurring(raw, // raw, but with single-event stuff stripped out
3274
- allDayDefault, calendar.dateEnv, calendar.pluginSystem.hooks.recurringTypes, leftovers0 // will populate with non-recurring props
3275
- );
3276
- if (recurringRes) {
3277
- var def = parseEventDef(leftovers0, sourceId, recurringRes.allDay, Boolean(recurringRes.duration), calendar);
3278
- def.recurringDef = {
3279
- typeId: recurringRes.typeId,
3280
- typeData: recurringRes.typeData,
3281
- duration: recurringRes.duration
3282
- };
3283
- return { def: def, instance: null };
3284
- }
3285
- else {
3286
- var leftovers1 = {};
3287
- var singleRes = parseSingle(raw, allDayDefault, calendar, leftovers1, allowOpenRange);
3288
- if (singleRes) {
3289
- var def = parseEventDef(leftovers1, sourceId, singleRes.allDay, singleRes.hasEnd, calendar);
3290
- var instance = createEventInstance(def.defId, singleRes.range, singleRes.forcedStartTzo, singleRes.forcedEndTzo);
3291
- return { def: def, instance: instance };
3292
- }
3293
- }
3294
- return null;
3295
- }
3296
- /*
3297
- Will NOT populate extendedProps with the leftover properties.
3298
- Will NOT populate date-related props.
3299
- The EventNonDateInput has been normalized (id => publicId, etc).
3300
- */
3301
- function parseEventDef(raw, sourceId, allDay, hasEnd, calendar) {
3302
- var leftovers = {};
3303
- var def = pluckNonDateProps(raw, calendar, leftovers);
3304
- def.defId = String(uid++);
3305
- def.sourceId = sourceId;
3306
- def.allDay = allDay;
3307
- def.hasEnd = hasEnd;
3308
- for (var _i = 0, _a = calendar.pluginSystem.hooks.eventDefParsers; _i < _a.length; _i++) {
3309
- var eventDefParser = _a[_i];
3310
- var newLeftovers = {};
3311
- eventDefParser(def, leftovers, newLeftovers);
3312
- leftovers = newLeftovers;
3313
- }
3314
- def.extendedProps = __assign(leftovers, def.extendedProps || {});
3315
- // help out EventApi from having user modify props
3316
- Object.freeze(def.ui.classNames);
3317
- Object.freeze(def.extendedProps);
3318
- return def;
3319
- }
3320
- function createEventInstance(defId, range, forcedStartTzo, forcedEndTzo) {
3321
- return {
3322
- instanceId: String(uid++),
3323
- defId: defId,
3324
- range: range,
3325
- forcedStartTzo: forcedStartTzo == null ? null : forcedStartTzo,
3326
- forcedEndTzo: forcedEndTzo == null ? null : forcedEndTzo
3327
- };
3328
- }
3329
- function parseSingle(raw, allDayDefault, calendar, leftovers, allowOpenRange) {
3330
- var props = pluckDateProps(raw, leftovers);
3331
- var allDay = props.allDay;
3332
- var startMeta;
3333
- var startMarker = null;
3334
- var hasEnd = false;
3335
- var endMeta;
3336
- var endMarker = null;
3337
- startMeta = calendar.dateEnv.createMarkerMeta(props.start);
3338
- if (startMeta) {
3339
- startMarker = startMeta.marker;
3340
- }
3341
- else if (!allowOpenRange) {
3342
- return null;
3343
- }
3344
- if (props.end != null) {
3345
- endMeta = calendar.dateEnv.createMarkerMeta(props.end);
3346
- }
3347
- if (allDay == null) {
3348
- if (allDayDefault != null) {
3349
- allDay = allDayDefault;
3350
- }
3351
- else {
3352
- // fall back to the date props LAST
3353
- allDay = (!startMeta || startMeta.isTimeUnspecified) &&
3354
- (!endMeta || endMeta.isTimeUnspecified);
3355
- }
3356
- }
3357
- if (allDay && startMarker) {
3358
- startMarker = startOfDay(startMarker);
3359
- }
3360
- if (endMeta) {
3361
- endMarker = endMeta.marker;
3362
- if (allDay) {
3363
- endMarker = startOfDay(endMarker);
3364
- }
3365
- if (startMarker && endMarker <= startMarker) {
3366
- endMarker = null;
3367
- }
3368
- }
3369
- if (endMarker) {
3370
- hasEnd = true;
3371
- }
3372
- else if (!allowOpenRange) {
3373
- hasEnd = calendar.opt('forceEventDuration') || false;
3374
- endMarker = calendar.dateEnv.add(startMarker, allDay ?
3375
- calendar.defaultAllDayEventDuration :
3376
- calendar.defaultTimedEventDuration);
3377
- }
3378
- return {
3379
- allDay: allDay,
3380
- hasEnd: hasEnd,
3381
- range: { start: startMarker, end: endMarker },
3382
- forcedStartTzo: startMeta ? startMeta.forcedTzo : null,
3383
- forcedEndTzo: endMeta ? endMeta.forcedTzo : null
3384
- };
3385
- }
3386
- function pluckDateProps(raw, leftovers) {
3387
- var props = refineProps(raw, DATE_PROPS, {}, leftovers);
3388
- props.start = (props.start !== null) ? props.start : props.date;
3389
- delete props.date;
3390
- return props;
3391
- }
3392
- function pluckNonDateProps(raw, calendar, leftovers) {
3393
- var preLeftovers = {};
3394
- var props = refineProps(raw, NON_DATE_PROPS, {}, preLeftovers);
3395
- var ui = processUnscopedUiProps(preLeftovers, calendar, leftovers);
3396
- props.publicId = props.id;
3397
- delete props.id;
3398
- props.ui = ui;
3399
- return props;
3400
- }
3401
- function computeIsAllDayDefault(sourceId, calendar) {
3402
- var res = null;
3403
- if (sourceId) {
3404
- var source = calendar.state.eventSources[sourceId];
3405
- res = source.allDayDefault;
3406
- }
3407
- if (res == null) {
3408
- res = calendar.opt('allDayDefault');
3409
- }
3410
- return res;
3411
- }
3412
 
3413
- var DEF_DEFAULTS = {
3414
- startTime: '09:00',
3415
- endTime: '17:00',
3416
- daysOfWeek: [1, 2, 3, 4, 5],
3417
- rendering: 'inverse-background',
3418
- classNames: 'fc-nonbusiness',
3419
- groupId: '_businessHours' // so multiple defs get grouped
3420
- };
3421
- /*
3422
- TODO: pass around as EventDefHash!!!
3423
- */
3424
- function parseBusinessHours(input, calendar) {
3425
- return parseEvents(refineInputs(input), '', calendar);
3426
- }
3427
- function refineInputs(input) {
3428
- var rawDefs;
3429
- if (input === true) {
3430
- rawDefs = [{}]; // will get DEF_DEFAULTS verbatim
3431
- }
3432
- else if (Array.isArray(input)) {
3433
- // if specifying an array, every sub-definition NEEDS a day-of-week
3434
- rawDefs = input.filter(function (rawDef) {
3435
- return rawDef.daysOfWeek;
3436
- });
3437
- }
3438
- else if (typeof input === 'object' && input) { // non-null object
3439
- rawDefs = [input];
3440
- }
3441
- else { // is probably false
3442
- rawDefs = [];
3443
- }
3444
- rawDefs = rawDefs.map(function (rawDef) {
3445
- return __assign({}, DEF_DEFAULTS, rawDef);
3446
- });
3447
- return rawDefs;
3448
- }
3449
 
3450
- function memoizeRendering(renderFunc, unrenderFunc, dependencies) {
3451
- if (dependencies === void 0) { dependencies = []; }
3452
- var dependents = [];
3453
- var thisContext;
3454
- var prevArgs;
3455
- function unrender() {
3456
- if (prevArgs) {
3457
- for (var _i = 0, dependents_1 = dependents; _i < dependents_1.length; _i++) {
3458
- var dependent = dependents_1[_i];
3459
- dependent.unrender();
3460
- }
3461
- if (unrenderFunc) {
3462
- unrenderFunc.apply(thisContext, prevArgs);
3463
- }
3464
- prevArgs = null;
3465
- }
3466
- }
3467
- function res() {
3468
- if (!prevArgs || !isArraysEqual(prevArgs, arguments)) {
3469
- unrender();
3470
- thisContext = this;
3471
- prevArgs = arguments;
3472
- renderFunc.apply(this, arguments);
3473
- }
3474
- }
3475
- res.dependents = dependents;
3476
- res.unrender = unrender;
3477
- for (var _i = 0, dependencies_1 = dependencies; _i < dependencies_1.length; _i++) {
3478
- var dependency = dependencies_1[_i];
3479
- dependency.dependents.push(res);
3480
- }
3481
- return res;
3482
- }
3483
 
3484
- var EMPTY_EVENT_STORE = createEmptyEventStore(); // for purecomponents. TODO: keep elsewhere
3485
- var Splitter = /** @class */ (function () {
3486
- function Splitter() {
3487
- this.getKeysForEventDefs = memoize(this._getKeysForEventDefs);
3488
- this.splitDateSelection = memoize(this._splitDateSpan);
3489
- this.splitEventStore = memoize(this._splitEventStore);
3490
- this.splitIndividualUi = memoize(this._splitIndividualUi);
3491
- this.splitEventDrag = memoize(this._splitInteraction);
3492
- this.splitEventResize = memoize(this._splitInteraction);
3493
- this.eventUiBuilders = {}; // TODO: typescript protection
3494
- }
3495
- Splitter.prototype.splitProps = function (props) {
3496
- var _this = this;
3497
- var keyInfos = this.getKeyInfo(props);
3498
- var defKeys = this.getKeysForEventDefs(props.eventStore);
3499
- var dateSelections = this.splitDateSelection(props.dateSelection);
3500
- var individualUi = this.splitIndividualUi(props.eventUiBases, defKeys); // the individual *bases*
3501
- var eventStores = this.splitEventStore(props.eventStore, defKeys);
3502
- var eventDrags = this.splitEventDrag(props.eventDrag);
3503
- var eventResizes = this.splitEventResize(props.eventResize);
3504
- var splitProps = {};
3505
- this.eventUiBuilders = mapHash(keyInfos, function (info, key) {
3506
- return _this.eventUiBuilders[key] || memoize(buildEventUiForKey);
3507
- });
3508
- for (var key in keyInfos) {
3509
- var keyInfo = keyInfos[key];
3510
- var eventStore = eventStores[key] || EMPTY_EVENT_STORE;
3511
- var buildEventUi = this.eventUiBuilders[key];
3512
- splitProps[key] = {
3513
- businessHours: keyInfo.businessHours || props.businessHours,
3514
- dateSelection: dateSelections[key] || null,
3515
- eventStore: eventStore,
3516
- eventUiBases: buildEventUi(props.eventUiBases[''], keyInfo.ui, individualUi[key]),
3517
- eventSelection: eventStore.instances[props.eventSelection] ? props.eventSelection : '',
3518
- eventDrag: eventDrags[key] || null,
3519
- eventResize: eventResizes[key] || null
3520
- };
3521
- }
3522
- return splitProps;
3523
- };
3524
- Splitter.prototype._splitDateSpan = function (dateSpan) {
3525
- var dateSpans = {};
3526
- if (dateSpan) {
3527
- var keys = this.getKeysForDateSpan(dateSpan);
3528
- for (var _i = 0, keys_1 = keys; _i < keys_1.length; _i++) {
3529
- var key = keys_1[_i];
3530
- dateSpans[key] = dateSpan;
3531
- }
3532
- }
3533
- return dateSpans;
3534
- };
3535
- Splitter.prototype._getKeysForEventDefs = function (eventStore) {
3536
- var _this = this;
3537
- return mapHash(eventStore.defs, function (eventDef) {
3538
- return _this.getKeysForEventDef(eventDef);
3539
- });
3540
- };
3541
- Splitter.prototype._splitEventStore = function (eventStore, defKeys) {
3542
- var defs = eventStore.defs, instances = eventStore.instances;
3543
- var splitStores = {};
3544
- for (var defId in defs) {
3545
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
3546
- var key = _a[_i];
3547
- if (!splitStores[key]) {
3548
- splitStores[key] = createEmptyEventStore();
3549
- }
3550
- splitStores[key].defs[defId] = defs[defId];
3551
- }
3552
- }
3553
- for (var instanceId in instances) {
3554
- var instance = instances[instanceId];
3555
- for (var _b = 0, _c = defKeys[instance.defId]; _b < _c.length; _b++) {
3556
- var key = _c[_b];
3557
- if (splitStores[key]) { // must have already been created
3558
- splitStores[key].instances[instanceId] = instance;
3559
- }
3560
- }
3561
- }
3562
- return splitStores;
3563
- };
3564
- Splitter.prototype._splitIndividualUi = function (eventUiBases, defKeys) {
3565
- var splitHashes = {};
3566
- for (var defId in eventUiBases) {
3567
- if (defId) { // not the '' key
3568
- for (var _i = 0, _a = defKeys[defId]; _i < _a.length; _i++) {
3569
- var key = _a[_i];
3570
- if (!splitHashes[key]) {
3571
- splitHashes[key] = {};
3572
- }
3573
- splitHashes[key][defId] = eventUiBases[defId];
3574
- }
3575
- }
3576
- }
3577
- return splitHashes;
3578
- };
3579
- Splitter.prototype._splitInteraction = function (interaction) {
3580
- var splitStates = {};
3581
- if (interaction) {
3582
- var affectedStores_1 = this._splitEventStore(interaction.affectedEvents, this._getKeysForEventDefs(interaction.affectedEvents) // can't use cached. might be events from other calendar
3583
- );
3584
- // can't rely on defKeys because event data is mutated
3585
- var mutatedKeysByDefId = this._getKeysForEventDefs(interaction.mutatedEvents);
3586
- var mutatedStores_1 = this._splitEventStore(interaction.mutatedEvents, mutatedKeysByDefId);
3587
- var populate = function (key) {
3588
- if (!splitStates[key]) {
3589
- splitStates[key] = {
3590
- affectedEvents: affectedStores_1[key] || EMPTY_EVENT_STORE,
3591
- mutatedEvents: mutatedStores_1[key] || EMPTY_EVENT_STORE,
3592
- isEvent: interaction.isEvent,
3593
- origSeg: interaction.origSeg
3594
- };
3595
- }
3596
- };
3597
- for (var key in affectedStores_1) {
3598
- populate(key);
3599
- }
3600
- for (var key in mutatedStores_1) {
3601
- populate(key);
3602
- }
3603
- }
3604
- return splitStates;
3605
- };
3606
- return Splitter;
3607
- }());
3608
- function buildEventUiForKey(allUi, eventUiForKey, individualUi) {
3609
- var baseParts = [];
3610
- if (allUi) {
3611
- baseParts.push(allUi);
3612
- }
3613
- if (eventUiForKey) {
3614
- baseParts.push(eventUiForKey);
3615
- }
3616
- var stuff = {
3617
- '': combineEventUis(baseParts)
3618
- };
3619
- if (individualUi) {
3620
- __assign(stuff, individualUi);
3621
  }
3622
- return stuff;
3623
- }
 
 
 
 
 
 
 
3624
 
3625
- // Generates HTML for an anchor to another view into the calendar.
3626
- // Will either generate an <a> tag or a non-clickable <span> tag, depending on enabled settings.
3627
- // `gotoOptions` can either be a DateMarker, or an object with the form:
3628
- // { date, type, forceOff }
3629
- // `type` is a view-type like "day" or "week". default value is "day".
3630
- // `attrs` and `innerHtml` are use to generate the rest of the HTML tag.
3631
- function buildGotoAnchorHtml(component, gotoOptions, attrs, innerHtml) {
3632
- var dateEnv = component.dateEnv;
3633
- var date;
3634
- var type;
3635
- var forceOff;
3636
- var finalOptions;
3637
- if (gotoOptions instanceof Date) {
3638
- date = gotoOptions; // a single date-like input
3639
- }
3640
- else {
3641
- date = gotoOptions.date;
3642
- type = gotoOptions.type;
3643
- forceOff = gotoOptions.forceOff;
3644
- }
3645
- finalOptions = {
3646
- date: dateEnv.formatIso(date, { omitTime: true }),
3647
- type: type || 'day'
3648
- };
3649
- if (typeof attrs === 'string') {
3650
- innerHtml = attrs;
3651
- attrs = null;
3652
- }
3653
- attrs = attrs ? ' ' + attrsToStr(attrs) : ''; // will have a leading space
3654
- innerHtml = innerHtml || '';
3655
- if (!forceOff && component.opt('navLinks')) {
3656
- return '<a' + attrs +
3657
- ' data-goto="' + htmlEscape(JSON.stringify(finalOptions)) + '">' +
3658
- innerHtml +
3659
- '</a>';
3660
- }
3661
- else {
3662
- return '<span' + attrs + '>' +
3663
- innerHtml +
3664
- '</span>';
3665
- }
3666
- }
3667
- function getAllDayHtml(component) {
3668
- return component.opt('allDayHtml') || htmlEscape(component.opt('allDayText'));
3669
- }
3670
- // Computes HTML classNames for a single-day element
3671
- function getDayClasses(date, dateProfile, context, noThemeHighlight) {
3672
- var calendar = context.calendar, view = context.view, theme = context.theme, dateEnv = context.dateEnv;
3673
- var classes = [];
3674
- var todayStart;
3675
- var todayEnd;
3676
- if (!rangeContainsMarker(dateProfile.activeRange, date)) {
3677
- classes.push('fc-disabled-day');
3678
- }
3679
- else {
3680
- classes.push('fc-' + DAY_IDS[date.getUTCDay()]);
3681
- if (view.opt('monthMode') &&
3682
- dateEnv.getMonth(date) !== dateEnv.getMonth(dateProfile.currentRange.start)) {
3683
- classes.push('fc-other-month');
3684
- }
3685
- todayStart = startOfDay(calendar.getNow());
3686
- todayEnd = addDays(todayStart, 1);
3687
- if (date < todayStart) {
3688
- classes.push('fc-past');
3689
- }
3690
- else if (date >= todayEnd) {
3691
- classes.push('fc-future');
3692
- }
3693
- else {
3694
- classes.push('fc-today');
3695
- if (noThemeHighlight !== true) {
3696
- classes.push(theme.getClass('today'));
3697
- }
3698
- }
3699
- }
3700
- return classes;
3701
- }
3702
 
3703
- // given a function that resolves a result asynchronously.
3704
- // the function can either call passed-in success and failure callbacks,
3705
- // or it can return a promise.
3706
- // if you need to pass additional params to func, bind them first.
3707
- function unpromisify(func, success, failure) {
3708
- // guard against success/failure callbacks being called more than once
3709
- // and guard against a promise AND callback being used together.
3710
- var isResolved = false;
3711
- var wrappedSuccess = function () {
3712
- if (!isResolved) {
3713
- isResolved = true;
3714
- success.apply(this, arguments);
3715
- }
3716
- };
3717
- var wrappedFailure = function () {
3718
- if (!isResolved) {
3719
- isResolved = true;
3720
- if (failure) {
3721
- failure.apply(this, arguments);
3722
- }
3723
- }
3724
- };
3725
- var res = func(wrappedSuccess, wrappedFailure);
3726
- if (res && typeof res.then === 'function') {
3727
- res.then(wrappedSuccess, wrappedFailure);
3728
- }
3729
- }
3730
 
3731
- var Mixin = /** @class */ (function () {
3732
- function Mixin() {
3733
- }
3734
- // mix into a CLASS
3735
- Mixin.mixInto = function (destClass) {
3736
- this.mixIntoObj(destClass.prototype);
3737
- };
3738
- // mix into ANY object
3739
- Mixin.mixIntoObj = function (destObj) {
3740
- var _this = this;
3741
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
3742
- if (!destObj[name]) { // if destination doesn't already define it
3743
- destObj[name] = _this.prototype[name];
3744
- }
3745
- });
3746
- };
3747
- /*
3748
- will override existing methods
3749
- TODO: remove! not used anymore
3750
- */
3751
- Mixin.mixOver = function (destClass) {
3752
- var _this = this;
3753
- Object.getOwnPropertyNames(this.prototype).forEach(function (name) {
3754
- destClass.prototype[name] = _this.prototype[name];
3755
- });
3756
- };
3757
- return Mixin;
3758
- }());
3759
 
3760
- /*
3761
- USAGE:
3762
- import { default as EmitterMixin, EmitterInterface } from './EmitterMixin'
3763
- in class:
3764
- on: EmitterInterface['on']
3765
- one: EmitterInterface['one']
3766
- off: EmitterInterface['off']
3767
- trigger: EmitterInterface['trigger']
3768
- triggerWith: EmitterInterface['triggerWith']
3769
- hasHandlers: EmitterInterface['hasHandlers']
3770
- after class:
3771
- EmitterMixin.mixInto(TheClass)
3772
- */
3773
- var EmitterMixin = /** @class */ (function (_super) {
3774
- __extends(EmitterMixin, _super);
3775
- function EmitterMixin() {
3776
- return _super !== null && _super.apply(this, arguments) || this;
3777
- }
3778
- EmitterMixin.prototype.on = function (type, handler) {
3779
- addToHash(this._handlers || (this._handlers = {}), type, handler);
3780
- return this; // for chaining
3781
- };
3782
- // todo: add comments
3783
- EmitterMixin.prototype.one = function (type, handler) {
3784
- addToHash(this._oneHandlers || (this._oneHandlers = {}), type, handler);
3785
- return this; // for chaining
3786
- };
3787
- EmitterMixin.prototype.off = function (type, handler) {
3788
- if (this._handlers) {
3789
- removeFromHash(this._handlers, type, handler);
3790
- }
3791
- if (this._oneHandlers) {
3792
- removeFromHash(this._oneHandlers, type, handler);
3793
- }
3794
- return this; // for chaining
3795
- };
3796
- EmitterMixin.prototype.trigger = function (type) {
3797
- var args = [];
3798
- for (var _i = 1; _i < arguments.length; _i++) {
3799
- args[_i - 1] = arguments[_i];
3800
- }
3801
- this.triggerWith(type, this, args);
3802
- return this; // for chaining
3803
- };
3804
- EmitterMixin.prototype.triggerWith = function (type, context, args) {
3805
- if (this._handlers) {
3806
- applyAll(this._handlers[type], context, args);
3807
- }
3808
- if (this._oneHandlers) {
3809
- applyAll(this._oneHandlers[type], context, args);
3810
- delete this._oneHandlers[type]; // will never fire again
3811
- }
3812
- return this; // for chaining
3813
- };
3814
- EmitterMixin.prototype.hasHandlers = function (type) {
3815
- return (this._handlers && this._handlers[type] && this._handlers[type].length) ||
3816
- (this._oneHandlers && this._oneHandlers[type] && this._oneHandlers[type].length);
3817
- };
3818
- return EmitterMixin;
3819
- }(Mixin));
3820
- function addToHash(hash, type, handler) {
3821
- (hash[type] || (hash[type] = []))
3822
- .push(handler);
3823
- }
3824
- function removeFromHash(hash, type, handler) {
3825
- if (handler) {
3826
- if (hash[type]) {
3827
- hash[type] = hash[type].filter(function (func) {
3828
- return func !== handler;
3829
- });
3830
- }
3831
- }
3832
- else {
3833
- delete hash[type]; // remove all handler funcs for this type
3834
- }
3835
- }
3836
 
3837
- /*
3838
- Records offset information for a set of elements, relative to an origin element.
3839
- Can record the left/right OR the top/bottom OR both.
3840
- Provides methods for querying the cache by position.
3841
- */
3842
- var PositionCache = /** @class */ (function () {
3843
- function PositionCache(originEl, els, isHorizontal, isVertical) {
3844
- this.originEl = originEl;
3845
- this.els = els;
3846
- this.isHorizontal = isHorizontal;
3847
- this.isVertical = isVertical;
3848
- }
3849
- // Queries the els for coordinates and stores them.
3850
- // Call this method before using and of the get* methods below.
3851
- PositionCache.prototype.build = function () {
3852
- var originEl = this.originEl;
3853
- var originClientRect = this.originClientRect =
3854
- originEl.getBoundingClientRect(); // relative to viewport top-left
3855
- if (this.isHorizontal) {
3856
- this.buildElHorizontals(originClientRect.left);
3857
- }
3858
- if (this.isVertical) {
3859
- this.buildElVerticals(originClientRect.top);
3860
- }
3861
- };
3862
- // Populates the left/right internal coordinate arrays
3863
- PositionCache.prototype.buildElHorizontals = function (originClientLeft) {
3864
- var lefts = [];
3865
- var rights = [];
3866
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
3867
- var el = _a[_i];
3868
- var rect = el.getBoundingClientRect();
3869
- lefts.push(rect.left - originClientLeft);
3870
- rights.push(rect.right - originClientLeft);
3871
- }
3872
- this.lefts = lefts;
3873
- this.rights = rights;
3874
- };
3875
- // Populates the top/bottom internal coordinate arrays
3876
- PositionCache.prototype.buildElVerticals = function (originClientTop) {
3877
- var tops = [];
3878
- var bottoms = [];
3879
- for (var _i = 0, _a = this.els; _i < _a.length; _i++) {
3880
- var el = _a[_i];
3881
- var rect = el.getBoundingClientRect();
3882
- tops.push(rect.top - originClientTop);
3883
- bottoms.push(rect.bottom - originClientTop);
3884
- }
3885
- this.tops = tops;
3886
- this.bottoms = bottoms;
3887
- };
3888
- // Given a left offset (from document left), returns the index of the el that it horizontally intersects.
3889
- // If no intersection is made, returns undefined.
3890
- PositionCache.prototype.leftToIndex = function (leftPosition) {
3891
- var lefts = this.lefts;
3892
- var rights = this.rights;
3893
- var len = lefts.length;
3894
- var i;
3895
- for (i = 0; i < len; i++) {
3896
- if (leftPosition >= lefts[i] && leftPosition < rights[i]) {
3897
- return i;
3898
- }
3899
- }
3900
- };
3901
- // Given a top offset (from document top), returns the index of the el that it vertically intersects.
3902
- // If no intersection is made, returns undefined.
3903
- PositionCache.prototype.topToIndex = function (topPosition) {
3904
- var tops = this.tops;
3905
- var bottoms = this.bottoms;
3906
- var len = tops.length;
3907
- var i;
3908
- for (i = 0; i < len; i++) {
3909
- if (topPosition >= tops[i] && topPosition < bottoms[i]) {
3910
- return i;
3911
- }
3912
- }
3913
- };
3914
- // Gets the width of the element at the given index
3915
- PositionCache.prototype.getWidth = function (leftIndex) {
3916
- return this.rights[leftIndex] - this.lefts[leftIndex];
3917
- };
3918
- // Gets the height of the element at the given index
3919
- PositionCache.prototype.getHeight = function (topIndex) {
3920
- return this.bottoms[topIndex] - this.tops[topIndex];
3921
- };
3922
- return PositionCache;
3923
- }());
3924
 
3925
- /*
3926
- An object for getting/setting scroll-related information for an element.
3927
- Internally, this is done very differently for window versus DOM element,
3928
- so this object serves as a common interface.
3929
- */
3930
- var ScrollController = /** @class */ (function () {
3931
- function ScrollController() {
3932
- }
3933
- ScrollController.prototype.getMaxScrollTop = function () {
3934
- return this.getScrollHeight() - this.getClientHeight();
3935
- };
3936
- ScrollController.prototype.getMaxScrollLeft = function () {
3937
- return this.getScrollWidth() - this.getClientWidth();
3938
- };
3939
- ScrollController.prototype.canScrollVertically = function () {
3940
- return this.getMaxScrollTop() > 0;
3941
- };
3942
- ScrollController.prototype.canScrollHorizontally = function () {
3943
- return this.getMaxScrollLeft() > 0;
3944
- };
3945
- ScrollController.prototype.canScrollUp = function () {
3946
- return this.getScrollTop() > 0;
3947
- };
3948
- ScrollController.prototype.canScrollDown = function () {
3949
- return this.getScrollTop() < this.getMaxScrollTop();
3950
- };
3951
- ScrollController.prototype.canScrollLeft = function () {
3952
- return this.getScrollLeft() > 0;
3953
- };
3954
- ScrollController.prototype.canScrollRight = function () {
3955
- return this.getScrollLeft() < this.getMaxScrollLeft();
3956
- };
3957
- return ScrollController;
3958
- }());
3959
- var ElementScrollController = /** @class */ (function (_super) {
3960
- __extends(ElementScrollController, _super);
3961
- function ElementScrollController(el) {
3962
- var _this = _super.call(this) || this;
3963
- _this.el = el;
3964
- return _this;
3965
- }
3966
- ElementScrollController.prototype.getScrollTop = function () {
3967
- return this.el.scrollTop;
3968
- };
3969
- ElementScrollController.prototype.getScrollLeft = function () {
3970
- return this.el.scrollLeft;
3971
- };
3972
- ElementScrollController.prototype.setScrollTop = function (top) {
3973
- this.el.scrollTop = top;
3974
- };
3975
- ElementScrollController.prototype.setScrollLeft = function (left) {
3976
- this.el.scrollLeft = left;
3977
- };
3978
- ElementScrollController.prototype.getScrollWidth = function () {
3979
- return this.el.scrollWidth;
3980
- };
3981
- ElementScrollController.prototype.getScrollHeight = function () {
3982
- return this.el.scrollHeight;
3983
- };
3984
- ElementScrollController.prototype.getClientHeight = function () {
3985
- return this.el.clientHeight;
3986
- };
3987
- ElementScrollController.prototype.getClientWidth = function () {
3988
- return this.el.clientWidth;
3989
- };
3990
- return ElementScrollController;
3991
- }(ScrollController));
3992
- var WindowScrollController = /** @class */ (function (_super) {
3993
- __extends(WindowScrollController, _super);
3994
- function WindowScrollController() {
3995
- return _super !== null && _super.apply(this, arguments) || this;
3996
- }
3997
- WindowScrollController.prototype.getScrollTop = function () {
3998
- return window.pageYOffset;
3999
- };
4000
- WindowScrollController.prototype.getScrollLeft = function () {
4001
- return window.pageXOffset;
4002
- };
4003
- WindowScrollController.prototype.setScrollTop = function (n) {
4004
- window.scroll(window.pageXOffset, n);
4005
- };
4006
- WindowScrollController.prototype.setScrollLeft = function (n) {
4007
- window.scroll(n, window.pageYOffset);
4008
- };
4009
- WindowScrollController.prototype.getScrollWidth = function () {
4010
- return document.documentElement.scrollWidth;
4011
- };
4012
- WindowScrollController.prototype.getScrollHeight = function () {
4013
- return document.documentElement.scrollHeight;
4014
- };
4015
- WindowScrollController.prototype.getClientHeight = function () {
4016
- return document.documentElement.clientHeight;
4017
- };
4018
- WindowScrollController.prototype.getClientWidth = function () {
4019
- return document.documentElement.clientWidth;
4020
- };
4021
- return WindowScrollController;
4022
- }(ScrollController));
4023
 
4024
- /*
4025
- Embodies a div that has potential scrollbars
4026
- */
4027
- var ScrollComponent = /** @class */ (function (_super) {
4028
- __extends(ScrollComponent, _super);
4029
- function ScrollComponent(overflowX, overflowY) {
4030
- var _this = _super.call(this, createElement('div', {
4031
- className: 'fc-scroller'
4032
- })) || this;
4033
- _this.overflowX = overflowX;
4034
- _this.overflowY = overflowY;
4035
- _this.applyOverflow();
4036
- return _this;
4037
- }
4038
- // sets to natural height, unlocks overflow
4039
- ScrollComponent.prototype.clear = function () {
4040
- this.setHeight('auto');
4041
- this.applyOverflow();
4042
- };
4043
- ScrollComponent.prototype.destroy = function () {
4044
- removeElement(this.el);
4045
- };
4046
- // Overflow
4047
- // -----------------------------------------------------------------------------------------------------------------
4048
- ScrollComponent.prototype.applyOverflow = function () {
4049
- applyStyle(this.el, {
4050
- overflowX: this.overflowX,
4051
- overflowY: this.overflowY
4052
- });
4053
- };
4054
- // Causes any 'auto' overflow values to resolves to 'scroll' or 'hidden'.
4055
- // Useful for preserving scrollbar widths regardless of future resizes.
4056
- // Can pass in scrollbarWidths for optimization.
4057
- ScrollComponent.prototype.lockOverflow = function (scrollbarWidths) {
4058
- var overflowX = this.overflowX;
4059
- var overflowY = this.overflowY;
4060
- scrollbarWidths = scrollbarWidths || this.getScrollbarWidths();
4061
- if (overflowX === 'auto') {
4062
- overflowX = (scrollbarWidths.bottom || // horizontal scrollbars?
4063
- this.canScrollHorizontally() // OR scrolling pane with massless scrollbars?
4064
- ) ? 'scroll' : 'hidden';
4065
- }
4066
- if (overflowY === 'auto') {
4067
- overflowY = (scrollbarWidths.left || scrollbarWidths.right || // horizontal scrollbars?
4068
- this.canScrollVertically() // OR scrolling pane with massless scrollbars?
4069
- ) ? 'scroll' : 'hidden';
4070
- }
4071
- applyStyle(this.el, { overflowX: overflowX, overflowY: overflowY });
4072
- };
4073
- ScrollComponent.prototype.setHeight = function (height) {
4074
- applyStyleProp(this.el, 'height', height);
4075
- };
4076
- ScrollComponent.prototype.getScrollbarWidths = function () {
4077
- var edges = computeEdges(this.el);
4078
- return {
4079
- left: edges.scrollbarLeft,
4080
- right: edges.scrollbarRight,
4081
- bottom: edges.scrollbarBottom
4082
- };
4083
- };
4084
- return ScrollComponent;
4085
- }(ElementScrollController));
4086
 
4087
- var Theme = /** @class */ (function () {
4088
- function Theme(calendarOptions) {
4089
- this.calendarOptions = calendarOptions;
4090
- this.processIconOverride();
4091
- }
4092
- Theme.prototype.processIconOverride = function () {
4093
- if (this.iconOverrideOption) {
4094
- this.setIconOverride(this.calendarOptions[this.iconOverrideOption]);
4095
- }
4096
- };
4097
- Theme.prototype.setIconOverride = function (iconOverrideHash) {
4098
- var iconClassesCopy;
4099
- var buttonName;
4100
- if (typeof iconOverrideHash === 'object' && iconOverrideHash) { // non-null object
4101
- iconClassesCopy = __assign({}, this.iconClasses);
4102
- for (buttonName in iconOverrideHash) {
4103
- iconClassesCopy[buttonName] = this.applyIconOverridePrefix(iconOverrideHash[buttonName]);
4104
- }
4105
- this.iconClasses = iconClassesCopy;
4106
- }
4107
- else if (iconOverrideHash === false) {
4108
- this.iconClasses = {};
4109
- }
4110
- };
4111
- Theme.prototype.applyIconOverridePrefix = function (className) {
4112
- var prefix = this.iconOverridePrefix;
4113
- if (prefix && className.indexOf(prefix) !== 0) { // if not already present
4114
- className = prefix + className;
4115
- }
4116
- return className;
4117
- };
4118
- Theme.prototype.getClass = function (key) {
4119
- return this.classes[key] || '';
4120
- };
4121
- Theme.prototype.getIconClass = function (buttonName) {
4122
- var className = this.iconClasses[buttonName];
4123
- if (className) {
4124
- return this.baseIconClass + ' ' + className;
4125
- }
4126
- return '';
4127
- };
4128
- Theme.prototype.getCustomButtonIconClass = function (customButtonProps) {
4129
- var className;
4130
- if (this.iconOverrideCustomButtonOption) {
4131
- className = customButtonProps[this.iconOverrideCustomButtonOption];
4132
- if (className) {
4133
- return this.baseIconClass + ' ' + this.applyIconOverridePrefix(className);
4134
- }
4135
- }
4136
- return '';
4137
- };
4138
- return Theme;
4139
- }());
4140
- Theme.prototype.classes = {};
4141
- Theme.prototype.iconClasses = {};
4142
- Theme.prototype.baseIconClass = '';
4143
- Theme.prototype.iconOverridePrefix = '';
4144
 
4145
- var guid = 0;
4146
- var Component = /** @class */ (function () {
4147
- function Component(context, isView) {
4148
- // HACK to populate view at top of component instantiation call chain
4149
- if (isView) {
4150
- context.view = this;
4151
- }
4152
- this.uid = String(guid++);
4153
- this.context = context;
4154
- this.dateEnv = context.dateEnv;
4155
- this.theme = context.theme;
4156
- this.view = context.view;
4157
- this.calendar = context.calendar;
4158
- this.isRtl = this.opt('dir') === 'rtl';
4159
- }
4160
- Component.addEqualityFuncs = function (newFuncs) {
4161
- this.prototype.equalityFuncs = __assign({}, this.prototype.equalityFuncs, newFuncs);
4162
- };
4163
- Component.prototype.opt = function (name) {
4164
- return this.context.options[name];
4165
- };
4166
- Component.prototype.receiveProps = function (props) {
4167
- var _a = recycleProps(this.props || {}, props, this.equalityFuncs), anyChanges = _a.anyChanges, comboProps = _a.comboProps;
4168
- this.props = comboProps;
4169
- if (anyChanges) {
4170
- this.render(comboProps);
4171
- }
4172
- };
4173
- Component.prototype.render = function (props) {
4174
- };
4175
- // after destroy is called, this component won't ever be used again
4176
- Component.prototype.destroy = function () {
4177
- };
4178
- return Component;
4179
- }());
4180
- Component.prototype.equalityFuncs = {};
4181
- /*
4182
- Reuses old values when equal. If anything is unequal, returns newProps as-is.
4183
- Great for PureComponent, but won't be feasible with React, so just eliminate and use React's DOM diffing.
4184
- */
4185
- function recycleProps(oldProps, newProps, equalityFuncs) {
4186
- var comboProps = {}; // some old, some new
4187
- var anyChanges = false;
4188
- for (var key in newProps) {
4189
- if (key in oldProps && (oldProps[key] === newProps[key] ||
4190
- (equalityFuncs[key] && equalityFuncs[key](oldProps[key], newProps[key])))) {
4191
- // equal to old? use old prop
4192
- comboProps[key] = oldProps[key];
4193
- }
4194
- else {
4195
- comboProps[key] = newProps[key];
4196
- anyChanges = true;
4197
- }
4198
- }
4199
- for (var key in oldProps) {
4200
- if (!(key in newProps)) {
4201
- anyChanges = true;
4202
- break;
4203
- }
4204
- }
4205
- return { anyChanges: anyChanges, comboProps: comboProps };
4206
- }
4207
 
4208
- /*
4209
- PURPOSES:
4210
- - hook up to fg, fill, and mirror renderers
4211
- - interface for dragging and hits
4212
- */
4213
- var DateComponent = /** @class */ (function (_super) {
4214
- __extends(DateComponent, _super);
4215
- function DateComponent(context, el, isView) {
4216
- var _this = _super.call(this, context, isView) || this;
4217
- _this.el = el;
4218
- return _this;
4219
- }
4220
- DateComponent.prototype.destroy = function () {
4221
- _super.prototype.destroy.call(this);
4222
- removeElement(this.el);
4223
- };
4224
- // TODO: WHAT ABOUT (sourceSeg && sourceSeg.component.doesDragMirror)
4225
- //
4226
- // Event Drag-n-Drop Rendering (for both events and external elements)
4227
- // ---------------------------------------------------------------------------------------------------------------
4228
- /*
4229
- renderEventDragSegs(state: EventSegUiInteractionState) {
4230
- if (state) {
4231
- let { isEvent, segs, sourceSeg } = state
4232
-
4233
- if (this.eventRenderer) {
4234
- this.eventRenderer.hideByHash(state.affectedInstances)
4235
- }
4236
-
4237
- // if the user is dragging something that is considered an event with real event data,
4238
- // and this component likes to do drag mirrors OR the component where the seg came from
4239
- // likes to do drag mirrors, then render a drag mirror.
4240
- if (isEvent && (this.doesDragMirror || sourceSeg && sourceSeg.component.doesDragMirror)) {
4241
- if (this.mirrorRenderer) {
4242
- this.mirrorRenderer.renderSegs(segs, { isDragging: true, sourceSeg })
4243
- }
4244
- }
4245
-
4246
- // if it would be impossible to render a drag mirror OR this component likes to render
4247
- // highlights, then render a highlight.
4248
- if (!isEvent || this.doesDragHighlight) {
4249
- if (this.fillRenderer) {
4250
- this.fillRenderer.renderSegs('highlight', segs)
4251
- }
4252
- }
4253
- }
4254
- }
4255
- */
4256
- // Hit System
4257
- // -----------------------------------------------------------------------------------------------------------------
4258
- DateComponent.prototype.buildPositionCaches = function () {
4259
- };
4260
- DateComponent.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
4261
- return null; // this should be abstract
4262
- };
4263
- // Validation
4264
- // -----------------------------------------------------------------------------------------------------------------
4265
- DateComponent.prototype.isInteractionValid = function (interaction) {
4266
- var calendar = this.calendar;
4267
- var dateProfile = this.props.dateProfile; // HACK
4268
- var instances = interaction.mutatedEvents.instances;
4269
- if (dateProfile) { // HACK for DayTile
4270
- for (var instanceId in instances) {
4271
- if (!rangeContainsRange(dateProfile.validRange, instances[instanceId].range)) {
4272
- return false;
4273
- }
4274
- }
4275
- }
4276
- return isInteractionValid(interaction, calendar);
4277
- };
4278
- DateComponent.prototype.isDateSelectionValid = function (selection) {
4279
- var dateProfile = this.props.dateProfile; // HACK
4280
- if (dateProfile && // HACK for DayTile
4281
- !rangeContainsRange(dateProfile.validRange, selection.range)) {
4282
- return false;
4283
- }
4284
- return isDateSelectionValid(selection, this.calendar);
4285
- };
4286
- // Triggering
4287
- // -----------------------------------------------------------------------------------------------------------------
4288
- // TODO: move to Calendar
4289
- DateComponent.prototype.publiclyTrigger = function (name, args) {
4290
- var calendar = this.calendar;
4291
- return calendar.publiclyTrigger(name, args);
4292
- };
4293
- DateComponent.prototype.publiclyTriggerAfterSizing = function (name, args) {
4294
- var calendar = this.calendar;
4295
- return calendar.publiclyTriggerAfterSizing(name, args);
4296
- };
4297
- DateComponent.prototype.hasPublicHandlers = function (name) {
4298
- var calendar = this.calendar;
4299
- return calendar.hasPublicHandlers(name);
4300
- };
4301
- DateComponent.prototype.triggerRenderedSegs = function (segs, isMirrors) {
4302
- var calendar = this.calendar;
4303
- if (this.hasPublicHandlers('eventPositioned')) {
4304
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
4305
- var seg = segs_1[_i];
4306
- this.publiclyTriggerAfterSizing('eventPositioned', [
4307
- {
4308
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
4309
- isMirror: isMirrors,
4310
- isStart: seg.isStart,
4311
- isEnd: seg.isEnd,
4312
- el: seg.el,
4313
- view: this // safe to cast because this method is only called on context.view
4314
- }
4315
- ]);
4316
- }
4317
- }
4318
- if (!calendar.state.loadingLevel) { // avoid initial empty state while pending
4319
- calendar.afterSizingTriggers._eventsPositioned = [null]; // fire once
4320
- }
4321
- };
4322
- DateComponent.prototype.triggerWillRemoveSegs = function (segs, isMirrors) {
4323
- var calendar = this.calendar;
4324
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
4325
- var seg = segs_2[_i];
4326
- calendar.trigger('eventElRemove', seg.el);
4327
- }
4328
- if (this.hasPublicHandlers('eventDestroy')) {
4329
- for (var _a = 0, segs_3 = segs; _a < segs_3.length; _a++) {
4330
- var seg = segs_3[_a];
4331
- this.publiclyTrigger('eventDestroy', [
4332
- {
4333
- event: new EventApi(calendar, seg.eventRange.def, seg.eventRange.instance),
4334
- isMirror: isMirrors,
4335
- el: seg.el,
4336
- view: this // safe to cast because this method is only called on context.view
4337
- }
4338
- ]);
4339
- }
4340
- }
4341
- };
4342
- // Pointer Interaction Utils
4343
- // -----------------------------------------------------------------------------------------------------------------
4344
- DateComponent.prototype.isValidSegDownEl = function (el) {
4345
- return !this.props.eventDrag && // HACK
4346
- !this.props.eventResize && // HACK
4347
- !elementClosest(el, '.fc-mirror') &&
4348
- (this.isPopover() || !this.isInPopover(el));
4349
- // ^above line ensures we don't detect a seg interaction within a nested component.
4350
- // it's a HACK because it only supports a popover as the nested component.
4351
- };
4352
- DateComponent.prototype.isValidDateDownEl = function (el) {
4353
- var segEl = elementClosest(el, this.fgSegSelector);
4354
- return (!segEl || segEl.classList.contains('fc-mirror')) &&
4355
- !elementClosest(el, '.fc-more') && // a "more.." link
4356
- !elementClosest(el, 'a[data-goto]') && // a clickable nav link
4357
- !this.isInPopover(el);
4358
- };
4359
- DateComponent.prototype.isPopover = function () {
4360
- return this.el.classList.contains('fc-popover');
4361
- };
4362
- DateComponent.prototype.isInPopover = function (el) {
4363
- return Boolean(elementClosest(el, '.fc-popover'));
4364
- };
4365
- return DateComponent;
4366
- }(Component));
4367
- DateComponent.prototype.fgSegSelector = '.fc-event-container > *';
4368
- DateComponent.prototype.bgSegSelector = '.fc-bgevent:not(.fc-nonbusiness)';
4369
 
4370
- var uid$1 = 0;
4371
- function createPlugin(input) {
4372
- return {
4373
- id: String(uid$1++),
4374
- deps: input.deps || [],
4375
- reducers: input.reducers || [],
4376
- eventDefParsers: input.eventDefParsers || [],
4377
- isDraggableTransformers: input.isDraggableTransformers || [],
4378
- eventDragMutationMassagers: input.eventDragMutationMassagers || [],
4379
- eventDefMutationAppliers: input.eventDefMutationAppliers || [],
4380
- dateSelectionTransformers: input.dateSelectionTransformers || [],
4381
- datePointTransforms: input.datePointTransforms || [],
4382
- dateSpanTransforms: input.dateSpanTransforms || [],
4383
- views: input.views || {},
4384
- viewPropsTransformers: input.viewPropsTransformers || [],
4385
- isPropsValid: input.isPropsValid || null,
4386
- externalDefTransforms: input.externalDefTransforms || [],
4387
- eventResizeJoinTransforms: input.eventResizeJoinTransforms || [],
4388
- viewContainerModifiers: input.viewContainerModifiers || [],
4389
- eventDropTransformers: input.eventDropTransformers || [],
4390
- componentInteractions: input.componentInteractions || [],
4391
- calendarInteractions: input.calendarInteractions || [],
4392
- themeClasses: input.themeClasses || {},
4393
- eventSourceDefs: input.eventSourceDefs || [],
4394
- cmdFormatter: input.cmdFormatter,
4395
- recurringTypes: input.recurringTypes || [],
4396
- namedTimeZonedImpl: input.namedTimeZonedImpl,
4397
- defaultView: input.defaultView || '',
4398
- elementDraggingImpl: input.elementDraggingImpl,
4399
- optionChangeHandlers: input.optionChangeHandlers || {}
4400
- };
4401
- }
4402
- var PluginSystem = /** @class */ (function () {
4403
- function PluginSystem() {
4404
- this.hooks = {
4405
- reducers: [],
4406
- eventDefParsers: [],
4407
- isDraggableTransformers: [],
4408
- eventDragMutationMassagers: [],
4409
- eventDefMutationAppliers: [],
4410
- dateSelectionTransformers: [],
4411
- datePointTransforms: [],
4412
- dateSpanTransforms: [],
4413
- views: {},
4414
- viewPropsTransformers: [],
4415
- isPropsValid: null,
4416
- externalDefTransforms: [],
4417
- eventResizeJoinTransforms: [],
4418
- viewContainerModifiers: [],
4419
- eventDropTransformers: [],
4420
- componentInteractions: [],
4421
- calendarInteractions: [],
4422
- themeClasses: {},
4423
- eventSourceDefs: [],
4424
- cmdFormatter: null,
4425
- recurringTypes: [],
4426
- namedTimeZonedImpl: null,
4427
- defaultView: '',
4428
- elementDraggingImpl: null,
4429
- optionChangeHandlers: {}
4430
- };
4431
- this.addedHash = {};
4432
- }
4433
- PluginSystem.prototype.add = function (plugin) {
4434
- if (!this.addedHash[plugin.id]) {
4435
- this.addedHash[plugin.id] = true;
4436
- for (var _i = 0, _a = plugin.deps; _i < _a.length; _i++) {
4437
- var dep = _a[_i];
4438
- this.add(dep);
4439
- }
4440
- this.hooks = combineHooks(this.hooks, plugin);
4441
- }
4442
- };
4443
- return PluginSystem;
4444
- }());
4445
- function combineHooks(hooks0, hooks1) {
4446
- return {
4447
- reducers: hooks0.reducers.concat(hooks1.reducers),
4448
- eventDefParsers: hooks0.eventDefParsers.concat(hooks1.eventDefParsers),
4449
- isDraggableTransformers: hooks0.isDraggableTransformers.concat(hooks1.isDraggableTransformers),
4450
- eventDragMutationMassagers: hooks0.eventDragMutationMassagers.concat(hooks1.eventDragMutationMassagers),
4451
- eventDefMutationAppliers: hooks0.eventDefMutationAppliers.concat(hooks1.eventDefMutationAppliers),
4452
- dateSelectionTransformers: hooks0.dateSelectionTransformers.concat(hooks1.dateSelectionTransformers),
4453
- datePointTransforms: hooks0.datePointTransforms.concat(hooks1.datePointTransforms),
4454
- dateSpanTransforms: hooks0.dateSpanTransforms.concat(hooks1.dateSpanTransforms),
4455
- views: __assign({}, hooks0.views, hooks1.views),
4456
- viewPropsTransformers: hooks0.viewPropsTransformers.concat(hooks1.viewPropsTransformers),
4457
- isPropsValid: hooks1.isPropsValid || hooks0.isPropsValid,
4458
- externalDefTransforms: hooks0.externalDefTransforms.concat(hooks1.externalDefTransforms),
4459
- eventResizeJoinTransforms: hooks0.eventResizeJoinTransforms.concat(hooks1.eventResizeJoinTransforms),
4460
- viewContainerModifiers: hooks0.viewContainerModifiers.concat(hooks1.viewContainerModifiers),
4461
- eventDropTransformers: hooks0.eventDropTransformers.concat(hooks1.eventDropTransformers),
4462
- calendarInteractions: hooks0.calendarInteractions.concat(hooks1.calendarInteractions),
4463
- componentInteractions: hooks0.componentInteractions.concat(hooks1.componentInteractions),
4464
- themeClasses: __assign({}, hooks0.themeClasses, hooks1.themeClasses),
4465
- eventSourceDefs: hooks0.eventSourceDefs.concat(hooks1.eventSourceDefs),
4466
- cmdFormatter: hooks1.cmdFormatter || hooks0.cmdFormatter,
4467
- recurringTypes: hooks0.recurringTypes.concat(hooks1.recurringTypes),
4468
- namedTimeZonedImpl: hooks1.namedTimeZonedImpl || hooks0.namedTimeZonedImpl,
4469
- defaultView: hooks0.defaultView || hooks1.defaultView,
4470
- elementDraggingImpl: hooks0.elementDraggingImpl || hooks1.elementDraggingImpl,
4471
- optionChangeHandlers: __assign({}, hooks0.optionChangeHandlers, hooks1.optionChangeHandlers)
4472
- };
4473
- }
4474
 
4475
- var eventSourceDef = {
4476
- ignoreRange: true,
4477
- parseMeta: function (raw) {
4478
- if (Array.isArray(raw)) { // short form
4479
- return raw;
4480
- }
4481
- else if (Array.isArray(raw.events)) {
4482
- return raw.events;
4483
- }
4484
- return null;
4485
- },
4486
- fetch: function (arg, success) {
4487
- success({
4488
- rawEvents: arg.eventSource.meta
4489
- });
4490
- }
4491
- };
4492
- var ArrayEventSourcePlugin = createPlugin({
4493
- eventSourceDefs: [eventSourceDef]
4494
- });
4495
 
4496
- var eventSourceDef$1 = {
4497
- parseMeta: function (raw) {
4498
- if (typeof raw === 'function') { // short form
4499
- return raw;
4500
- }
4501
- else if (typeof raw.events === 'function') {
4502
- return raw.events;
4503
- }
4504
- return null;
4505
- },
4506
- fetch: function (arg, success, failure) {
4507
- var dateEnv = arg.calendar.dateEnv;
4508
- var func = arg.eventSource.meta;
4509
- unpromisify(func.bind(null, {
4510
- start: dateEnv.toDate(arg.range.start),
4511
- end: dateEnv.toDate(arg.range.end),
4512
- startStr: dateEnv.formatIso(arg.range.start),
4513
- endStr: dateEnv.formatIso(arg.range.end),
4514
- timeZone: dateEnv.timeZone
4515
- }), function (rawEvents) {
4516
- success({ rawEvents: rawEvents }); // needs an object response
4517
- }, failure // send errorObj directly to failure callback
4518
- );
4519
- }
4520
- };
4521
- var FuncEventSourcePlugin = createPlugin({
4522
- eventSourceDefs: [eventSourceDef$1]
4523
- });
4524
 
4525
- function requestJson(method, url, params, successCallback, failureCallback) {
4526
- method = method.toUpperCase();
4527
- var body = null;
4528
- if (method === 'GET') {
4529
- url = injectQueryStringParams(url, params);
4530
- }
4531
- else {
4532
- body = encodeParams(params);
4533
- }
4534
- var xhr = new XMLHttpRequest();
4535
- xhr.open(method, url, true);
4536
- if (method !== 'GET') {
4537
- xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
4538
- }
4539
- xhr.onload = function () {
4540
- if (xhr.status >= 200 && xhr.status < 400) {
4541
- try {
4542
- var res = JSON.parse(xhr.responseText);
4543
- successCallback(res, xhr);
4544
- }
4545
- catch (err) {
4546
- failureCallback('Failure parsing JSON', xhr);
4547
- }
4548
- }
4549
- else {
4550
- failureCallback('Request failed', xhr);
4551
- }
4552
- };
4553
- xhr.onerror = function () {
4554
- failureCallback('Request failed', xhr);
4555
- };
4556
- xhr.send(body);
4557
- }
4558
- function injectQueryStringParams(url, params) {
4559
- return url +
4560
- (url.indexOf('?') === -1 ? '?' : '&') +
4561
- encodeParams(params);
4562
- }
4563
- function encodeParams(params) {
4564
- var parts = [];
4565
- for (var key in params) {
4566
- parts.push(encodeURIComponent(key) + '=' + encodeURIComponent(params[key]));
4567
- }
4568
- return parts.join('&');
4569
- }
4570
 
4571
- var eventSourceDef$2 = {
4572
- parseMeta: function (raw) {
4573
- if (typeof raw === 'string') { // short form
4574
- raw = { url: raw };
4575
- }
4576
- else if (!raw || typeof raw !== 'object' || !raw.url) {
4577
- return null;
4578
- }
4579
- return {
4580
- url: raw.url,
4581
- method: (raw.method || 'GET').toUpperCase(),
4582
- extraParams: raw.extraParams,
4583
- startParam: raw.startParam,
4584
- endParam: raw.endParam,
4585
- timeZoneParam: raw.timeZoneParam
4586
- };
4587
- },
4588
- fetch: function (arg, success, failure) {
4589
- var meta = arg.eventSource.meta;
4590
- var requestParams = buildRequestParams(meta, arg.range, arg.calendar);
4591
- requestJson(meta.method, meta.url, requestParams, function (rawEvents, xhr) {
4592
- success({ rawEvents: rawEvents, xhr: xhr });
4593
- }, function (errorMessage, xhr) {
4594
- failure({ message: errorMessage, xhr: xhr });
4595
- });
4596
- }
4597
- };
4598
- var JsonFeedEventSourcePlugin = createPlugin({
4599
- eventSourceDefs: [eventSourceDef$2]
4600
- });
4601
- function buildRequestParams(meta, range, calendar) {
4602
- var dateEnv = calendar.dateEnv;
4603
- var startParam;
4604
- var endParam;
4605
- var timeZoneParam;
4606
- var customRequestParams;
4607
- var params = {};
4608
- startParam = meta.startParam;
4609
- if (startParam == null) {
4610
- startParam = calendar.opt('startParam');
4611
- }
4612
- endParam = meta.endParam;
4613
- if (endParam == null) {
4614
- endParam = calendar.opt('endParam');
4615
- }
4616
- timeZoneParam = meta.timeZoneParam;
4617
- if (timeZoneParam == null) {
4618
- timeZoneParam = calendar.opt('timeZoneParam');
4619
- }
4620
- // retrieve any outbound GET/POST data from the options
4621
- if (typeof meta.extraParams === 'function') {
4622
- // supplied as a function that returns a key/value object
4623
- customRequestParams = meta.extraParams();
4624
- }
4625
- else {
4626
- // probably supplied as a straight key/value object
4627
- customRequestParams = meta.extraParams || {};
4628
- }
4629
- __assign(params, customRequestParams);
4630
- params[startParam] = dateEnv.formatIso(range.start);
4631
- params[endParam] = dateEnv.formatIso(range.end);
4632
- if (dateEnv.timeZone !== 'local') {
4633
- params[timeZoneParam] = dateEnv.timeZone;
4634
- }
4635
- return params;
4636
- }
4637
 
4638
- var recurring = {
4639
- parse: function (rawEvent, leftoverProps, dateEnv) {
4640
- var createMarker = dateEnv.createMarker.bind(dateEnv);
4641
- var processors = {
4642
- daysOfWeek: null,
4643
- startTime: createDuration,
4644
- endTime: createDuration,
4645
- startRecur: createMarker,
4646
- endRecur: createMarker
4647
- };
4648
- var props = refineProps(rawEvent, processors, {}, leftoverProps);
4649
- var anyValid = false;
4650
- for (var propName in props) {
4651
- if (props[propName] != null) {
4652
- anyValid = true;
4653
- break;
4654
- }
4655
- }
4656
- if (anyValid) {
4657
- var duration = null;
4658
- if ('duration' in leftoverProps) {
4659
- duration = createDuration(leftoverProps.duration);
4660
- delete leftoverProps.duration;
4661
- }
4662
- if (!duration && props.startTime && props.endTime) {
4663
- duration = subtractDurations(props.endTime, props.startTime);
4664
- }
4665
- return {
4666
- allDayGuess: Boolean(!props.startTime && !props.endTime),
4667
- duration: duration,
4668
- typeData: props // doesn't need endTime anymore but oh well
4669
- };
4670
- }
4671
- return null;
4672
- },
4673
- expand: function (typeData, framingRange, dateEnv) {
4674
- var clippedFramingRange = intersectRanges(framingRange, { start: typeData.startRecur, end: typeData.endRecur });
4675
- if (clippedFramingRange) {
4676
- return expandRanges(typeData.daysOfWeek, typeData.startTime, clippedFramingRange, dateEnv);
4677
- }
4678
- else {
4679
- return [];
4680
- }
4681
- }
4682
- };
4683
- var SimpleRecurrencePlugin = createPlugin({
4684
- recurringTypes: [recurring]
4685
- });
4686
- function expandRanges(daysOfWeek, startTime, framingRange, dateEnv) {
4687
- var dowHash = daysOfWeek ? arrayToHash(daysOfWeek) : null;
4688
- var dayMarker = startOfDay(framingRange.start);
4689
- var endMarker = framingRange.end;
4690
- var instanceStarts = [];
4691
- while (dayMarker < endMarker) {
4692
- var instanceStart
4693
- // if everyday, or this particular day-of-week
4694
- = void 0;
4695
- // if everyday, or this particular day-of-week
4696
- if (!dowHash || dowHash[dayMarker.getUTCDay()]) {
4697
- if (startTime) {
4698
- instanceStart = dateEnv.add(dayMarker, startTime);
4699
- }
4700
- else {
4701
- instanceStart = dayMarker;
4702
- }
4703
- instanceStarts.push(instanceStart);
4704
- }
4705
- dayMarker = addDays(dayMarker, 1);
4706
- }
4707
- return instanceStarts;
4708
- }
4709
 
4710
- var DefaultOptionChangeHandlers = createPlugin({
4711
- optionChangeHandlers: {
4712
- events: function (events, calendar, deepEqual) {
4713
- handleEventSources([events], calendar, deepEqual);
4714
- },
4715
- eventSources: handleEventSources,
4716
- plugins: handlePlugins
4717
- }
4718
- });
4719
- function handleEventSources(inputs, calendar, deepEqual) {
4720
- var unfoundSources = hashValuesToArray(calendar.state.eventSources);
4721
- var newInputs = [];
4722
- for (var _i = 0, inputs_1 = inputs; _i < inputs_1.length; _i++) {
4723
- var input = inputs_1[_i];
4724
- var inputFound = false;
4725
- for (var i = 0; i < unfoundSources.length; i++) {
4726
- if (deepEqual(unfoundSources[i]._raw, input)) {
4727
- unfoundSources.splice(i, 1); // delete
4728
- inputFound = true;
4729
- break;
4730
- }
4731
- }
4732
- if (!inputFound) {
4733
- newInputs.push(input);
4734
- }
4735
- }
4736
- for (var _a = 0, unfoundSources_1 = unfoundSources; _a < unfoundSources_1.length; _a++) {
4737
- var unfoundSource = unfoundSources_1[_a];
4738
- calendar.dispatch({
4739
- type: 'REMOVE_EVENT_SOURCE',
4740
- sourceId: unfoundSource.sourceId
4741
- });
4742
- }
4743
- for (var _b = 0, newInputs_1 = newInputs; _b < newInputs_1.length; _b++) {
4744
- var newInput = newInputs_1[_b];
4745
- calendar.addEventSource(newInput);
4746
- }
4747
- }
4748
- // shortcoming: won't remove plugins
4749
- function handlePlugins(inputs, calendar) {
4750
- calendar.addPluginInputs(inputs); // will gracefully handle duplicates
4751
- }
4752
 
4753
- var config = {}; // TODO: make these options
4754
- var globalDefaults = {
4755
- defaultRangeSeparator: ' - ',
4756
- titleRangeSeparator: ' \u2013 ',
4757
- defaultTimedEventDuration: '01:00:00',
4758
- defaultAllDayEventDuration: { day: 1 },
4759
- forceEventDuration: false,
4760
- nextDayThreshold: '00:00:00',
4761
- // display
4762
- columnHeader: true,
4763
- defaultView: '',
4764
- aspectRatio: 1.35,
4765
- header: {
4766
- left: 'title',
4767
- center: '',
4768
- right: 'today prev,next'
4769
- },
4770
- weekends: true,
4771
- weekNumbers: false,
4772
- weekNumberCalculation: 'local',
4773
- editable: false,
4774
- // nowIndicator: false,
4775
- scrollTime: '06:00:00',
4776
- minTime: '00:00:00',
4777
- maxTime: '24:00:00',
4778
- showNonCurrentDates: true,
4779
- // event ajax
4780
- lazyFetching: true,
4781
- startParam: 'start',
4782
- endParam: 'end',
4783
- timeZoneParam: 'timeZone',
4784
- timeZone: 'local',
4785
- // allDayDefault: undefined,
4786
- // locale
4787
- locales: [],
4788
- locale: '',
4789
- // dir: will get this from the default locale
4790
- // buttonIcons: null,
4791
- // allows setting a min-height to the event segment to prevent short events overlapping each other
4792
- timeGridEventMinHeight: 0,
4793
- themeSystem: 'standard',
4794
- // eventResizableFromStart: false,
4795
- dragRevertDuration: 500,
4796
- dragScroll: true,
4797
- allDayMaintainDuration: false,
4798
- // selectable: false,
4799
- unselectAuto: true,
4800
- // selectMinDistance: 0,
4801
- dropAccept: '*',
4802
- eventOrder: 'start,-duration,allDay,title',
4803
- // ^ if start tie, longer events go before shorter. final tie-breaker is title text
4804
- // rerenderDelay: null,
4805
- eventLimit: false,
4806
- eventLimitClick: 'popover',
4807
- dayPopoverFormat: { month: 'long', day: 'numeric', year: 'numeric' },
4808
- handleWindowResize: true,
4809
- windowResizeDelay: 100,
4810
- longPressDelay: 1000,
4811
- eventDragMinDistance: 5 // only applies to mouse
4812
- };
4813
- var rtlDefaults = {
4814
- header: {
4815
- left: 'next,prev today',
4816
- center: '',
4817
- right: 'title'
4818
- },
4819
- buttonIcons: {
4820
- // TODO: make RTL support the responibility of the theme
4821
- prev: 'fc-icon-chevron-right',
4822
- next: 'fc-icon-chevron-left',
4823
- prevYear: 'fc-icon-chevrons-right',
4824
- nextYear: 'fc-icon-chevrons-left'
4825
- }
4826
- };
4827
- var complexOptions = [
4828
- 'header',
4829
- 'footer',
4830
- 'buttonText',
4831
- 'buttonIcons'
4832
- ];
4833
- // Merges an array of option objects into a single object
4834
- function mergeOptions(optionObjs) {
4835
- return mergeProps(optionObjs, complexOptions);
4836
- }
4837
- // TODO: move this stuff to a "plugin"-related file...
4838
- var INTERNAL_PLUGINS = [
4839
- ArrayEventSourcePlugin,
4840
- FuncEventSourcePlugin,
4841
- JsonFeedEventSourcePlugin,
4842
- SimpleRecurrencePlugin,
4843
- DefaultOptionChangeHandlers
4844
- ];
4845
- function refinePluginDefs(pluginInputs) {
4846
- var plugins = [];
4847
- for (var _i = 0, pluginInputs_1 = pluginInputs; _i < pluginInputs_1.length; _i++) {
4848
- var pluginInput = pluginInputs_1[_i];
4849
- if (typeof pluginInput === 'string') {
4850
- var globalName = 'FullCalendar' + capitaliseFirstLetter(pluginInput);
4851
- if (!window[globalName]) {
4852
- console.warn('Plugin file not loaded for ' + pluginInput);
4853
- }
4854
- else {
4855
- plugins.push(window[globalName].default); // is an ES6 module
4856
- }
4857
- }
4858
- else {
4859
- plugins.push(pluginInput);
4860
- }
4861
- }
4862
- return INTERNAL_PLUGINS.concat(plugins);
4863
- }
4864
 
4865
- var RAW_EN_LOCALE = {
4866
- code: 'en',
4867
- week: {
4868
- dow: 0,
4869
- doy: 4 // 4 days need to be within the year to be considered the first week
4870
- },
4871
- dir: 'ltr',
4872
- buttonText: {
4873
- prev: 'prev',
4874
- next: 'next',
4875
- prevYear: 'prev year',
4876
- nextYear: 'next year',
4877
- year: 'year',
4878
- today: 'today',
4879
- month: 'month',
4880
- week: 'week',
4881
- day: 'day',
4882
- list: 'list'
4883
- },
4884
- weekLabel: 'W',
4885
- allDayText: 'all-day',
4886
- eventLimitText: 'more',
4887
- noEventsMessage: 'No events to display'
4888
- };
4889
- function parseRawLocales(explicitRawLocales) {
4890
- var defaultCode = explicitRawLocales.length > 0 ? explicitRawLocales[0].code : 'en';
4891
- var globalArray = window['FullCalendarLocalesAll'] || []; // from locales-all.js
4892
- var globalObject = window['FullCalendarLocales'] || {}; // from locales/*.js. keys are meaningless
4893
- var allRawLocales = globalArray.concat(// globalArray is low prio
4894
- hashValuesToArray(globalObject), // medium prio
4895
- explicitRawLocales // highest prio
4896
- );
4897
- var rawLocaleMap = {
4898
- en: RAW_EN_LOCALE // necessary?
4899
- };
4900
- for (var _i = 0, allRawLocales_1 = allRawLocales; _i < allRawLocales_1.length; _i++) {
4901
- var rawLocale = allRawLocales_1[_i];
4902
- rawLocaleMap[rawLocale.code] = rawLocale;
4903
- }
4904
- return {
4905
- map: rawLocaleMap,
4906
- defaultCode: defaultCode
4907
- };
4908
- }
4909
- function buildLocale(inputSingular, available) {
4910
- if (typeof inputSingular === 'object' && !Array.isArray(inputSingular)) {
4911
- return parseLocale(inputSingular.code, [inputSingular.code], inputSingular);
4912
- }
4913
- else {
4914
- return queryLocale(inputSingular, available);
4915
- }
4916
- }
4917
- function queryLocale(codeArg, available) {
4918
- var codes = [].concat(codeArg || []); // will convert to array
4919
- var raw = queryRawLocale(codes, available) || RAW_EN_LOCALE;
4920
- return parseLocale(codeArg, codes, raw);
4921
- }
4922
- function queryRawLocale(codes, available) {
4923
- for (var i = 0; i < codes.length; i++) {
4924
- var parts = codes[i].toLocaleLowerCase().split('-');
4925
- for (var j = parts.length; j > 0; j--) {
4926
- var simpleId = parts.slice(0, j).join('-');
4927
- if (available[simpleId]) {
4928
- return available[simpleId];
4929
- }
4930
- }
4931
- }
4932
- return null;
4933
- }
4934
- function parseLocale(codeArg, codes, raw) {
4935
- var merged = mergeProps([RAW_EN_LOCALE, raw], ['buttonText']);
4936
- delete merged.code; // don't want this part of the options
4937
- var week = merged.week;
4938
- delete merged.week;
4939
- return {
4940
- codeArg: codeArg,
4941
- codes: codes,
4942
- week: week,
4943
- simpleNumberFormat: new Intl.NumberFormat(codeArg),
4944
- options: merged
4945
- };
4946
- }
4947
 
4948
- var OptionsManager = /** @class */ (function () {
4949
- function OptionsManager(overrides) {
4950
- this.overrides = __assign({}, overrides); // make a copy
4951
- this.dynamicOverrides = {};
4952
- this.compute();
4953
- }
4954
- OptionsManager.prototype.mutate = function (updates, removals, isDynamic) {
4955
- var overrideHash = isDynamic ? this.dynamicOverrides : this.overrides;
4956
- __assign(overrideHash, updates);
4957
- for (var _i = 0, removals_1 = removals; _i < removals_1.length; _i++) {
4958
- var propName = removals_1[_i];
4959
- delete overrideHash[propName];
4960
- }
4961
- this.compute();
4962
- };
4963
- // Computes the flattened options hash for the calendar and assigns to `this.options`.
4964
- // Assumes this.overrides and this.dynamicOverrides have already been initialized.
4965
- OptionsManager.prototype.compute = function () {
4966
- // TODO: not a very efficient system
4967
- var locales = firstDefined(// explicit locale option given?
4968
- this.dynamicOverrides.locales, this.overrides.locales, globalDefaults.locales);
4969
- var locale = firstDefined(// explicit locales option given?
4970
- this.dynamicOverrides.locale, this.overrides.locale, globalDefaults.locale);
4971
- var available = parseRawLocales(locales);
4972
- var localeDefaults = buildLocale(locale || available.defaultCode, available.map).options;
4973
- var dir = firstDefined(// based on options computed so far, is direction RTL?
4974
- this.dynamicOverrides.dir, this.overrides.dir, localeDefaults.dir);
4975
- var dirDefaults = dir === 'rtl' ? rtlDefaults : {};
4976
- this.dirDefaults = dirDefaults;
4977
- this.localeDefaults = localeDefaults;
4978
- this.computed = mergeOptions([
4979
- globalDefaults,
4980
- dirDefaults,
4981
- localeDefaults,
4982
- this.overrides,
4983
- this.dynamicOverrides
4984
- ]);
4985
- };
4986
- return OptionsManager;
4987
- }());
4988
 
4989
- var calendarSystemClassMap = {};
4990
- function registerCalendarSystem(name, theClass) {
4991
- calendarSystemClassMap[name] = theClass;
4992
- }
4993
- function createCalendarSystem(name) {
4994
- return new calendarSystemClassMap[name]();
4995
- }
4996
- var GregorianCalendarSystem = /** @class */ (function () {
4997
- function GregorianCalendarSystem() {
4998
- }
4999
- GregorianCalendarSystem.prototype.getMarkerYear = function (d) {
5000
- return d.getUTCFullYear();
5001
- };
5002
- GregorianCalendarSystem.prototype.getMarkerMonth = function (d) {
5003
- return d.getUTCMonth();
5004
- };
5005
- GregorianCalendarSystem.prototype.getMarkerDay = function (d) {
5006
- return d.getUTCDate();
5007
- };
5008
- GregorianCalendarSystem.prototype.arrayToMarker = function (arr) {
5009
- return arrayToUtcDate(arr);
5010
- };
5011
- GregorianCalendarSystem.prototype.markerToArray = function (marker) {
5012
- return dateToUtcArray(marker);
5013
- };
5014
- return GregorianCalendarSystem;
5015
- }());
5016
- registerCalendarSystem('gregory', GregorianCalendarSystem);
5017
 
5018
- var ISO_RE = /^\s*(\d{4})(-(\d{2})(-(\d{2})([T ](\d{2}):(\d{2})(:(\d{2})(\.(\d+))?)?(Z|(([-+])(\d{2})(:?(\d{2}))?))?)?)?)?$/;
5019
- function parse(str) {
5020
- var m = ISO_RE.exec(str);
5021
- if (m) {
5022
- var marker = new Date(Date.UTC(Number(m[1]), m[3] ? Number(m[3]) - 1 : 0, Number(m[5] || 1), Number(m[7] || 0), Number(m[8] || 0), Number(m[10] || 0), m[12] ? Number('0.' + m[12]) * 1000 : 0));
5023
- if (isValidDate(marker)) {
5024
- var timeZoneOffset = null;
5025
- if (m[13]) {
5026
- timeZoneOffset = (m[15] === '-' ? -1 : 1) * (Number(m[16] || 0) * 60 +
5027
- Number(m[18] || 0));
5028
- }
5029
- return {
5030
- marker: marker,
5031
- isTimeUnspecified: !m[6],
5032
- timeZoneOffset: timeZoneOffset
5033
- };
5034
- }
5035
- }
5036
- return null;
5037
- }
5038
 
5039
- var DateEnv = /** @class */ (function () {
5040
- function DateEnv(settings) {
5041
- var timeZone = this.timeZone = settings.timeZone;
5042
- var isNamedTimeZone = timeZone !== 'local' && timeZone !== 'UTC';
5043
- if (settings.namedTimeZoneImpl && isNamedTimeZone) {
5044
- this.namedTimeZoneImpl = new settings.namedTimeZoneImpl(timeZone);
5045
- }
5046
- this.canComputeOffset = Boolean(!isNamedTimeZone || this.namedTimeZoneImpl);
5047
- this.calendarSystem = createCalendarSystem(settings.calendarSystem);
5048
- this.locale = settings.locale;
5049
- this.weekDow = settings.locale.week.dow;
5050
- this.weekDoy = settings.locale.week.doy;
5051
- if (settings.weekNumberCalculation === 'ISO') {
5052
- this.weekDow = 1;
5053
- this.weekDoy = 4;
5054
- }
5055
- if (typeof settings.firstDay === 'number') {
5056
- this.weekDow = settings.firstDay;
5057
- }
5058
- if (typeof settings.weekNumberCalculation === 'function') {
5059
- this.weekNumberFunc = settings.weekNumberCalculation;
5060
- }
5061
- this.weekLabel = settings.weekLabel != null ? settings.weekLabel : settings.locale.options.weekLabel;
5062
- this.cmdFormatter = settings.cmdFormatter;
5063
- }
5064
- // Creating / Parsing
5065
- DateEnv.prototype.createMarker = function (input) {
5066
- var meta = this.createMarkerMeta(input);
5067
- if (meta === null) {
5068
- return null;
5069
- }
5070
- return meta.marker;
5071
- };
5072
- DateEnv.prototype.createNowMarker = function () {
5073
- if (this.canComputeOffset) {
5074
- return this.timestampToMarker(new Date().valueOf());
5075
- }
5076
- else {
5077
- // if we can't compute the current date val for a timezone,
5078
- // better to give the current local date vals than UTC
5079
- return arrayToUtcDate(dateToLocalArray(new Date()));
5080
- }
5081
- };
5082
- DateEnv.prototype.createMarkerMeta = function (input) {
5083
- if (typeof input === 'string') {
5084
- return this.parse(input);
5085
- }
5086
- var marker = null;
5087
- if (typeof input === 'number') {
5088
- marker = this.timestampToMarker(input);
5089
- }
5090
- else if (input instanceof Date) {
5091
- input = input.valueOf();
5092
- if (!isNaN(input)) {
5093
- marker = this.timestampToMarker(input);
5094
- }
5095
- }
5096
- else if (Array.isArray(input)) {
5097
- marker = arrayToUtcDate(input);
5098
- }
5099
- if (marker === null || !isValidDate(marker)) {
5100
- return null;
5101
- }
5102
- return { marker: marker, isTimeUnspecified: false, forcedTzo: null };
5103
- };
5104
- DateEnv.prototype.parse = function (s) {
5105
- var parts = parse(s);
5106
- if (parts === null) {
5107
- return null;
5108
- }
5109
- var marker = parts.marker;
5110
- var forcedTzo = null;
5111
- if (parts.timeZoneOffset !== null) {
5112
- if (this.canComputeOffset) {
5113
- marker = this.timestampToMarker(marker.valueOf() - parts.timeZoneOffset * 60 * 1000);
5114
- }
5115
- else {
5116
- forcedTzo = parts.timeZoneOffset;
5117
- }
5118
- }
5119
- return { marker: marker, isTimeUnspecified: parts.isTimeUnspecified, forcedTzo: forcedTzo };
5120
- };
5121
- // Accessors
5122
- DateEnv.prototype.getYear = function (marker) {
5123
- return this.calendarSystem.getMarkerYear(marker);
5124
- };
5125
- DateEnv.prototype.getMonth = function (marker) {
5126
- return this.calendarSystem.getMarkerMonth(marker);
5127
- };
5128
- // Adding / Subtracting
5129
- DateEnv.prototype.add = function (marker, dur) {
5130
- var a = this.calendarSystem.markerToArray(marker);
5131
- a[0] += dur.years;
5132
- a[1] += dur.months;
5133
- a[2] += dur.days;
5134
- a[6] += dur.milliseconds;
5135
- return this.calendarSystem.arrayToMarker(a);
5136
- };
5137
- DateEnv.prototype.subtract = function (marker, dur) {
5138
- var a = this.calendarSystem.markerToArray(marker);
5139
- a[0] -= dur.years;
5140
- a[1] -= dur.months;
5141
- a[2] -= dur.days;
5142
- a[6] -= dur.milliseconds;
5143
- return this.calendarSystem.arrayToMarker(a);
5144
- };
5145
- DateEnv.prototype.addYears = function (marker, n) {
5146
- var a = this.calendarSystem.markerToArray(marker);
5147
- a[0] += n;
5148
- return this.calendarSystem.arrayToMarker(a);
5149
- };
5150
- DateEnv.prototype.addMonths = function (marker, n) {
5151
- var a = this.calendarSystem.markerToArray(marker);
5152
- a[1] += n;
5153
- return this.calendarSystem.arrayToMarker(a);
5154
- };
5155
- // Diffing Whole Units
5156
- DateEnv.prototype.diffWholeYears = function (m0, m1) {
5157
- var calendarSystem = this.calendarSystem;
5158
- if (timeAsMs(m0) === timeAsMs(m1) &&
5159
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1) &&
5160
- calendarSystem.getMarkerMonth(m0) === calendarSystem.getMarkerMonth(m1)) {
5161
- return calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0);
5162
- }
5163
- return null;
5164
- };
5165
- DateEnv.prototype.diffWholeMonths = function (m0, m1) {
5166
- var calendarSystem = this.calendarSystem;
5167
- if (timeAsMs(m0) === timeAsMs(m1) &&
5168
- calendarSystem.getMarkerDay(m0) === calendarSystem.getMarkerDay(m1)) {
5169
- return (calendarSystem.getMarkerMonth(m1) - calendarSystem.getMarkerMonth(m0)) +
5170
- (calendarSystem.getMarkerYear(m1) - calendarSystem.getMarkerYear(m0)) * 12;
5171
- }
5172
- return null;
5173
- };
5174
- // Range / Duration
5175
- DateEnv.prototype.greatestWholeUnit = function (m0, m1) {
5176
- var n = this.diffWholeYears(m0, m1);
5177
- if (n !== null) {
5178
- return { unit: 'year', value: n };
5179
- }
5180
- n = this.diffWholeMonths(m0, m1);
5181
- if (n !== null) {
5182
- return { unit: 'month', value: n };
5183
- }
5184
- n = diffWholeWeeks(m0, m1);
5185
- if (n !== null) {
5186
- return { unit: 'week', value: n };
5187
- }
5188
- n = diffWholeDays(m0, m1);
5189
- if (n !== null) {
5190
- return { unit: 'day', value: n };
5191
- }
5192
- n = diffHours(m0, m1);
5193
- if (isInt(n)) {
5194
- return { unit: 'hour', value: n };
5195
- }
5196
- n = diffMinutes(m0, m1);
5197
- if (isInt(n)) {
5198
- return { unit: 'minute', value: n };
5199
- }
5200
- n = diffSeconds(m0, m1);
5201
- if (isInt(n)) {
5202
- return { unit: 'second', value: n };
5203
- }
5204
- return { unit: 'millisecond', value: m1.valueOf() - m0.valueOf() };
5205
- };
5206
- DateEnv.prototype.countDurationsBetween = function (m0, m1, d) {
5207
- // TODO: can use greatestWholeUnit
5208
- var diff;
5209
- if (d.years) {
5210
- diff = this.diffWholeYears(m0, m1);
5211
- if (diff !== null) {
5212
- return diff / asRoughYears(d);
5213
- }
5214
- }
5215
- if (d.months) {
5216
- diff = this.diffWholeMonths(m0, m1);
5217
- if (diff !== null) {
5218
- return diff / asRoughMonths(d);
5219
- }
5220
- }
5221
- if (d.days) {
5222
- diff = diffWholeDays(m0, m1);
5223
- if (diff !== null) {
5224
- return diff / asRoughDays(d);
5225
- }
5226
- }
5227
- return (m1.valueOf() - m0.valueOf()) / asRoughMs(d);
5228
- };
5229
- // Start-Of
5230
- DateEnv.prototype.startOf = function (m, unit) {
5231
- if (unit === 'year') {
5232
- return this.startOfYear(m);
5233
- }
5234
- else if (unit === 'month') {
5235
- return this.startOfMonth(m);
5236
- }
5237
- else if (unit === 'week') {
5238
- return this.startOfWeek(m);
5239
- }
5240
- else if (unit === 'day') {
5241
- return startOfDay(m);
5242
- }
5243
- else if (unit === 'hour') {
5244
- return startOfHour(m);
5245
- }
5246
- else if (unit === 'minute') {
5247
- return startOfMinute(m);
5248
- }
5249
- else if (unit === 'second') {
5250
- return startOfSecond(m);
5251
- }
5252
- };
5253
- DateEnv.prototype.startOfYear = function (m) {
5254
- return this.calendarSystem.arrayToMarker([
5255
- this.calendarSystem.getMarkerYear(m)
5256
- ]);
5257
- };
5258
- DateEnv.prototype.startOfMonth = function (m) {
5259
- return this.calendarSystem.arrayToMarker([
5260
- this.calendarSystem.getMarkerYear(m),
5261
- this.calendarSystem.getMarkerMonth(m)
5262
- ]);
5263
- };
5264
- DateEnv.prototype.startOfWeek = function (m) {
5265
- return this.calendarSystem.arrayToMarker([
5266
- this.calendarSystem.getMarkerYear(m),
5267
- this.calendarSystem.getMarkerMonth(m),
5268
- m.getUTCDate() - ((m.getUTCDay() - this.weekDow + 7) % 7)
5269
- ]);
5270
- };
5271
- // Week Number
5272
- DateEnv.prototype.computeWeekNumber = function (marker) {
5273
- if (this.weekNumberFunc) {
5274
- return this.weekNumberFunc(this.toDate(marker));
5275
- }
5276
- else {
5277
- return weekOfYear(marker, this.weekDow, this.weekDoy);
5278
- }
5279
- };
5280
- // TODO: choke on timeZoneName: long
5281
- DateEnv.prototype.format = function (marker, formatter, dateOptions) {
5282
- if (dateOptions === void 0) { dateOptions = {}; }
5283
- return formatter.format({
5284
- marker: marker,
5285
- timeZoneOffset: dateOptions.forcedTzo != null ?
5286
- dateOptions.forcedTzo :
5287
- this.offsetForMarker(marker)
5288
- }, this);
5289
- };
5290
- DateEnv.prototype.formatRange = function (start, end, formatter, dateOptions) {
5291
- if (dateOptions === void 0) { dateOptions = {}; }
5292
- if (dateOptions.isEndExclusive) {
5293
- end = addMs(end, -1);
5294
- }
5295
- return formatter.formatRange({
5296
- marker: start,
5297
- timeZoneOffset: dateOptions.forcedStartTzo != null ?
5298
- dateOptions.forcedStartTzo :
5299
- this.offsetForMarker(start)
5300
- }, {
5301
- marker: end,
5302
- timeZoneOffset: dateOptions.forcedEndTzo != null ?
5303
- dateOptions.forcedEndTzo :
5304
- this.offsetForMarker(end)
5305
- }, this);
5306
- };
5307
- DateEnv.prototype.formatIso = function (marker, extraOptions) {
5308
- if (extraOptions === void 0) { extraOptions = {}; }
5309
- var timeZoneOffset = null;
5310
- if (!extraOptions.omitTimeZoneOffset) {
5311
- if (extraOptions.forcedTzo != null) {
5312
- timeZoneOffset = extraOptions.forcedTzo;
5313
- }
5314
- else {
5315
- timeZoneOffset = this.offsetForMarker(marker);
5316
- }
5317
- }
5318
- return buildIsoString(marker, timeZoneOffset, extraOptions.omitTime);
5319
- };
5320
- // TimeZone
5321
- DateEnv.prototype.timestampToMarker = function (ms) {
5322
- if (this.timeZone === 'local') {
5323
- return arrayToUtcDate(dateToLocalArray(new Date(ms)));
5324
- }
5325
- else if (this.timeZone === 'UTC' || !this.namedTimeZoneImpl) {
5326
- return new Date(ms);
5327
- }
5328
- else {
5329
- return arrayToUtcDate(this.namedTimeZoneImpl.timestampToArray(ms));
5330
- }
5331
- };
5332
- DateEnv.prototype.offsetForMarker = function (m) {
5333
- if (this.timeZone === 'local') {
5334
- return -arrayToLocalDate(dateToUtcArray(m)).getTimezoneOffset(); // convert "inverse" offset to "normal" offset
5335
- }
5336
- else if (this.timeZone === 'UTC') {
5337
- return 0;
5338
- }
5339
- else if (this.namedTimeZoneImpl) {
5340
- return this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m));
5341
- }
5342
- return null;
5343
- };
5344
- // Conversion
5345
- DateEnv.prototype.toDate = function (m, forcedTzo) {
5346
- if (this.timeZone === 'local') {
5347
- return arrayToLocalDate(dateToUtcArray(m));
5348
- }
5349
- else if (this.timeZone === 'UTC') {
5350
- return new Date(m.valueOf()); // make sure it's a copy
5351
- }
5352
- else if (!this.namedTimeZoneImpl) {
5353
- return new Date(m.valueOf() - (forcedTzo || 0));
5354
- }
5355
- else {
5356
- return new Date(m.valueOf() -
5357
- this.namedTimeZoneImpl.offsetForArray(dateToUtcArray(m)) * 1000 * 60 // convert minutes -> ms
5358
- );
5359
- }
5360
- };
5361
- return DateEnv;
5362
- }());
5363
 
5364
- var SIMPLE_SOURCE_PROPS = {
5365
- id: String,
5366
- allDayDefault: Boolean,
5367
- eventDataTransform: Function,
5368
- success: Function,
5369
- failure: Function
5370
- };
5371
- var uid$2 = 0;
5372
- function doesSourceNeedRange(eventSource, calendar) {
5373
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
5374
- return !defs[eventSource.sourceDefId].ignoreRange;
5375
- }
5376
- function parseEventSource(raw, calendar) {
5377
- var defs = calendar.pluginSystem.hooks.eventSourceDefs;
5378
- for (var i = defs.length - 1; i >= 0; i--) { // later-added plugins take precedence
5379
- var def = defs[i];
5380
- var meta = def.parseMeta(raw);
5381
- if (meta) {
5382
- var res = parseEventSourceProps(typeof raw === 'object' ? raw : {}, meta, i, calendar);
5383
- res._raw = raw;
5384
- return res;
5385
- }
5386
- }
5387
- return null;
5388
- }
5389
- function parseEventSourceProps(raw, meta, sourceDefId, calendar) {
5390
- var leftovers0 = {};
5391
- var props = refineProps(raw, SIMPLE_SOURCE_PROPS, {}, leftovers0);
5392
- var leftovers1 = {};
5393
- var ui = processUnscopedUiProps(leftovers0, calendar, leftovers1);
5394
- props.isFetching = false;
5395
- props.latestFetchId = '';
5396
- props.fetchRange = null;
5397
- props.publicId = String(raw.id || '');
5398
- props.sourceId = String(uid$2++);
5399
- props.sourceDefId = sourceDefId;
5400
- props.meta = meta;
5401
- props.ui = ui;
5402
- props.extendedProps = leftovers1;
5403
- return props;
5404
- }
5405
 
5406
- function reduceEventSources (eventSources, action, dateProfile, calendar) {
5407
- switch (action.type) {
5408
- case 'ADD_EVENT_SOURCES': // already parsed
5409
- return addSources(eventSources, action.sources, dateProfile ? dateProfile.activeRange : null, calendar);
5410
- case 'REMOVE_EVENT_SOURCE':
5411
- return removeSource(eventSources, action.sourceId);
5412
- case 'PREV': // TODO: how do we track all actions that affect dateProfile :(
5413
- case 'NEXT':
5414
- case 'SET_DATE':
5415
- case 'SET_VIEW_TYPE':
5416
- if (dateProfile) {
5417
- return fetchDirtySources(eventSources, dateProfile.activeRange, calendar);
5418
- }
5419
- else {
5420
- return eventSources;
5421
- }
5422
- case 'FETCH_EVENT_SOURCES':
5423
- case 'CHANGE_TIMEZONE':
5424
- return fetchSourcesByIds(eventSources, action.sourceIds ?
5425
- arrayToHash(action.sourceIds) :
5426
- excludeStaticSources(eventSources, calendar), dateProfile ? dateProfile.activeRange : null, calendar);
5427
- case 'RECEIVE_EVENTS':
5428
- case 'RECEIVE_EVENT_ERROR':
5429
- return receiveResponse(eventSources, action.sourceId, action.fetchId, action.fetchRange);
5430
- case 'REMOVE_ALL_EVENT_SOURCES':
5431
- return {};
5432
- default:
5433
- return eventSources;
5434
- }
5435
- }
5436
- var uid$3 = 0;
5437
- function addSources(eventSourceHash, sources, fetchRange, calendar) {
5438
- var hash = {};
5439
- for (var _i = 0, sources_1 = sources; _i < sources_1.length; _i++) {
5440
- var source = sources_1[_i];
5441
- hash[source.sourceId] = source;
5442
- }
5443
- if (fetchRange) {
5444
- hash = fetchDirtySources(hash, fetchRange, calendar);
5445
- }
5446
- return __assign({}, eventSourceHash, hash);
5447
- }
5448
- function removeSource(eventSourceHash, sourceId) {
5449
- return filterHash(eventSourceHash, function (eventSource) {
5450
- return eventSource.sourceId !== sourceId;
5451
- });
5452
- }
5453
- function fetchDirtySources(sourceHash, fetchRange, calendar) {
5454
- return fetchSourcesByIds(sourceHash, filterHash(sourceHash, function (eventSource) {
5455
- return isSourceDirty(eventSource, fetchRange, calendar);
5456
- }), fetchRange, calendar);
5457
- }
5458
- function isSourceDirty(eventSource, fetchRange, calendar) {
5459
- if (!doesSourceNeedRange(eventSource, calendar)) {
5460
- return !eventSource.latestFetchId;
5461
- }
5462
- else {
5463
- return !calendar.opt('lazyFetching') ||
5464
- !eventSource.fetchRange ||
5465
- fetchRange.start < eventSource.fetchRange.start ||
5466
- fetchRange.end > eventSource.fetchRange.end;
5467
- }
5468
- }
5469
- function fetchSourcesByIds(prevSources, sourceIdHash, fetchRange, calendar) {
5470
- var nextSources = {};
5471
- for (var sourceId in prevSources) {
5472
- var source = prevSources[sourceId];
5473
- if (sourceIdHash[sourceId]) {
5474
- nextSources[sourceId] = fetchSource(source, fetchRange, calendar);
5475
- }
5476
- else {
5477
- nextSources[sourceId] = source;
5478
- }
5479
- }
5480
- return nextSources;
5481
- }
5482
- function fetchSource(eventSource, fetchRange, calendar) {
5483
- var sourceDef = calendar.pluginSystem.hooks.eventSourceDefs[eventSource.sourceDefId];
5484
- var fetchId = String(uid$3++);
5485
- sourceDef.fetch({
5486
- eventSource: eventSource,
5487
- calendar: calendar,
5488
- range: fetchRange
5489
- }, function (res) {
5490
- var rawEvents = res.rawEvents;
5491
- var calSuccess = calendar.opt('eventSourceSuccess');
5492
- var calSuccessRes;
5493
- var sourceSuccessRes;
5494
- if (eventSource.success) {
5495
- sourceSuccessRes = eventSource.success(rawEvents, res.xhr);
5496
- }
5497
- if (calSuccess) {
5498
- calSuccessRes = calSuccess(rawEvents, res.xhr);
5499
- }
5500
- rawEvents = sourceSuccessRes || calSuccessRes || rawEvents;
5501
- calendar.dispatch({
5502
- type: 'RECEIVE_EVENTS',
5503
- sourceId: eventSource.sourceId,
5504
- fetchId: fetchId,
5505
- fetchRange: fetchRange,
5506
- rawEvents: rawEvents
5507
- });
5508
- }, function (error) {
5509
- var callFailure = calendar.opt('eventSourceFailure');
5510
- console.warn(error.message, error);
5511
- if (eventSource.failure) {
5512
- eventSource.failure(error);
5513
- }
5514
- if (callFailure) {
5515
- callFailure(error);
5516
- }
5517
- calendar.dispatch({
5518
- type: 'RECEIVE_EVENT_ERROR',
5519
- sourceId: eventSource.sourceId,
5520
- fetchId: fetchId,
5521
- fetchRange: fetchRange,
5522
- error: error
5523
- });
5524
- });
5525
- return __assign({}, eventSource, { isFetching: true, latestFetchId: fetchId });
5526
- }
5527
- function receiveResponse(sourceHash, sourceId, fetchId, fetchRange) {
5528
- var _a;
5529
- var eventSource = sourceHash[sourceId];
5530
- if (eventSource && // not already removed
5531
- fetchId === eventSource.latestFetchId) {
5532
- return __assign({}, sourceHash, (_a = {}, _a[sourceId] = __assign({}, eventSource, { isFetching: false, fetchRange: fetchRange }), _a));
5533
- }
5534
- return sourceHash;
5535
- }
5536
- function excludeStaticSources(eventSources, calendar) {
5537
- return filterHash(eventSources, function (eventSource) {
5538
- return doesSourceNeedRange(eventSource, calendar);
5539
- });
5540
- }
5541
 
5542
- var DateProfileGenerator = /** @class */ (function () {
5543
- function DateProfileGenerator(viewSpec, calendar) {
5544
- this.viewSpec = viewSpec;
5545
- this.options = viewSpec.options;
5546
- this.dateEnv = calendar.dateEnv;
5547
- this.calendar = calendar;
5548
- this.initHiddenDays();
5549
- }
5550
- /* Date Range Computation
5551
- ------------------------------------------------------------------------------------------------------------------*/
5552
- // Builds a structure with info about what the dates/ranges will be for the "prev" view.
5553
- DateProfileGenerator.prototype.buildPrev = function (currentDateProfile, currentDate) {
5554
- var dateEnv = this.dateEnv;
5555
- var prevDate = dateEnv.subtract(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
5556
- currentDateProfile.dateIncrement);
5557
- return this.build(prevDate, -1);
5558
- };
5559
- // Builds a structure with info about what the dates/ranges will be for the "next" view.
5560
- DateProfileGenerator.prototype.buildNext = function (currentDateProfile, currentDate) {
5561
- var dateEnv = this.dateEnv;
5562
- var nextDate = dateEnv.add(dateEnv.startOf(currentDate, currentDateProfile.currentRangeUnit), // important for start-of-month
5563
- currentDateProfile.dateIncrement);
5564
- return this.build(nextDate, 1);
5565
- };
5566
- // Builds a structure holding dates/ranges for rendering around the given date.
5567
- // Optional direction param indicates whether the date is being incremented/decremented
5568
- // from its previous value. decremented = -1, incremented = 1 (default).
5569
- DateProfileGenerator.prototype.build = function (currentDate, direction, forceToValid) {
5570
- if (forceToValid === void 0) { forceToValid = false; }
5571
- var validRange;
5572
- var minTime = null;
5573
- var maxTime = null;
5574
- var currentInfo;
5575
- var isRangeAllDay;
5576
- var renderRange;
5577
- var activeRange;
5578
- var isValid;
5579
- validRange = this.buildValidRange();
5580
- validRange = this.trimHiddenDays(validRange);
5581
- if (forceToValid) {
5582
- currentDate = constrainMarkerToRange(currentDate, validRange);
5583
- }
5584
- currentInfo = this.buildCurrentRangeInfo(currentDate, direction);
5585
- isRangeAllDay = /^(year|month|week|day)$/.test(currentInfo.unit);
5586
- renderRange = this.buildRenderRange(this.trimHiddenDays(currentInfo.range), currentInfo.unit, isRangeAllDay);
5587
- renderRange = this.trimHiddenDays(renderRange);
5588
- activeRange = renderRange;
5589
- if (!this.options.showNonCurrentDates) {
5590
- activeRange = intersectRanges(activeRange, currentInfo.range);
5591
- }
5592
- minTime = createDuration(this.options.minTime);
5593
- maxTime = createDuration(this.options.maxTime);
5594
- activeRange = this.adjustActiveRange(activeRange, minTime, maxTime);
5595
- activeRange = intersectRanges(activeRange, validRange); // might return null
5596
- // it's invalid if the originally requested date is not contained,
5597
- // or if the range is completely outside of the valid range.
5598
- isValid = rangesIntersect(currentInfo.range, validRange);
5599
- return {
5600
- // constraint for where prev/next operations can go and where events can be dragged/resized to.
5601
- // an object with optional start and end properties.
5602
- validRange: validRange,
5603
- // range the view is formally responsible for.
5604
- // for example, a month view might have 1st-31st, excluding padded dates
5605
- currentRange: currentInfo.range,
5606
- // name of largest unit being displayed, like "month" or "week"
5607
- currentRangeUnit: currentInfo.unit,
5608
- isRangeAllDay: isRangeAllDay,
5609
- // dates that display events and accept drag-n-drop
5610
- // will be `null` if no dates accept events
5611
- activeRange: activeRange,
5612
- // date range with a rendered skeleton
5613
- // includes not-active days that need some sort of DOM
5614
- renderRange: renderRange,
5615
- // Duration object that denotes the first visible time of any given day
5616
- minTime: minTime,
5617
- // Duration object that denotes the exclusive visible end time of any given day
5618
- maxTime: maxTime,
5619
- isValid: isValid,
5620
- // how far the current date will move for a prev/next operation
5621
- dateIncrement: this.buildDateIncrement(currentInfo.duration)
5622
- // pass a fallback (might be null) ^
5623
- };
5624
- };
5625
- // Builds an object with optional start/end properties.
5626
- // Indicates the minimum/maximum dates to display.
5627
- // not responsible for trimming hidden days.
5628
- DateProfileGenerator.prototype.buildValidRange = function () {
5629
- return this.getRangeOption('validRange', this.calendar.getNow()) ||
5630
- { start: null, end: null }; // completely open-ended
5631
- };
5632
- // Builds a structure with info about the "current" range, the range that is
5633
- // highlighted as being the current month for example.
5634
- // See build() for a description of `direction`.
5635
- // Guaranteed to have `range` and `unit` properties. `duration` is optional.
5636
- DateProfileGenerator.prototype.buildCurrentRangeInfo = function (date, direction) {
5637
- var _a = this, viewSpec = _a.viewSpec, dateEnv = _a.dateEnv;
5638
- var duration = null;
5639
- var unit = null;
5640
- var range = null;
5641
- var dayCount;
5642
- if (viewSpec.duration) {
5643
- duration = viewSpec.duration;
5644
- unit = viewSpec.durationUnit;
5645
- range = this.buildRangeFromDuration(date, direction, duration, unit);
5646
- }
5647
- else if ((dayCount = this.options.dayCount)) {
5648
- unit = 'day';
5649
- range = this.buildRangeFromDayCount(date, direction, dayCount);
5650
- }
5651
- else if ((range = this.buildCustomVisibleRange(date))) {
5652
- unit = dateEnv.greatestWholeUnit(range.start, range.end).unit;
5653
- }
5654
- else {
5655
- duration = this.getFallbackDuration();
5656
- unit = greatestDurationDenominator(duration).unit;
5657
- range = this.buildRangeFromDuration(date, direction, duration, unit);
5658
- }
5659
- return { duration: duration, unit: unit, range: range };
5660
- };
5661
- DateProfileGenerator.prototype.getFallbackDuration = function () {
5662
- return createDuration({ day: 1 });
5663
- };
5664
- // Returns a new activeRange to have time values (un-ambiguate)
5665
- // minTime or maxTime causes the range to expand.
5666
- DateProfileGenerator.prototype.adjustActiveRange = function (range, minTime, maxTime) {
5667
- var dateEnv = this.dateEnv;
5668
- var start = range.start;
5669
- var end = range.end;
5670
- if (this.viewSpec.class.prototype.usesMinMaxTime) {
5671
- // expand active range if minTime is negative (why not when positive?)
5672
- if (asRoughDays(minTime) < 0) {
5673
- start = startOfDay(start); // necessary?
5674
- start = dateEnv.add(start, minTime);
5675
- }
5676
- // expand active range if maxTime is beyond one day (why not when positive?)
5677
- if (asRoughDays(maxTime) > 1) {
5678
- end = startOfDay(end); // necessary?
5679
- end = addDays(end, -1);
5680
- end = dateEnv.add(end, maxTime);
5681
- }
5682
- }
5683
- return { start: start, end: end };
5684
- };
5685
- // Builds the "current" range when it is specified as an explicit duration.
5686
- // `unit` is the already-computed greatestDurationDenominator unit of duration.
5687
- DateProfileGenerator.prototype.buildRangeFromDuration = function (date, direction, duration, unit) {
5688
- var dateEnv = this.dateEnv;
5689
- var alignment = this.options.dateAlignment;
5690
- var dateIncrementInput;
5691
- var dateIncrementDuration;
5692
- var start;
5693
- var end;
5694
- var res;
5695
- // compute what the alignment should be
5696
- if (!alignment) {
5697
- dateIncrementInput = this.options.dateIncrement;
5698
- if (dateIncrementInput) {
5699
- dateIncrementDuration = createDuration(dateIncrementInput);
5700
- // use the smaller of the two units
5701
- if (asRoughMs(dateIncrementDuration) < asRoughMs(duration)) {
5702
- alignment = greatestDurationDenominator(dateIncrementDuration, !getWeeksFromInput(dateIncrementInput)).unit;
5703
- }
5704
- else {
5705
- alignment = unit;
5706
- }
5707
- }
5708
- else {
5709
- alignment = unit;
5710
- }
5711
- }
5712
- // if the view displays a single day or smaller
5713
- if (asRoughDays(duration) <= 1) {
5714
- if (this.isHiddenDay(start)) {
5715
- start = this.skipHiddenDays(start, direction);
5716
- start = startOfDay(start);
5717
- }
5718
- }
5719
- function computeRes() {
5720
- start = dateEnv.startOf(date, alignment);
5721
- end = dateEnv.add(start, duration);
5722
- res = { start: start, end: end };
5723
- }
5724
- computeRes();
5725
- // if range is completely enveloped by hidden days, go past the hidden days
5726
- if (!this.trimHiddenDays(res)) {
5727
- date = this.skipHiddenDays(date, direction);
5728
- computeRes();
5729
- }
5730
- return res;
5731
- };
5732
- // Builds the "current" range when a dayCount is specified.
5733
- DateProfileGenerator.prototype.buildRangeFromDayCount = function (date, direction, dayCount) {
5734
- var dateEnv = this.dateEnv;
5735
- var customAlignment = this.options.dateAlignment;
5736
- var runningCount = 0;
5737
- var start = date;
5738
- var end;
5739
- if (customAlignment) {
5740
- start = dateEnv.startOf(start, customAlignment);
5741
- }
5742
- start = startOfDay(start);
5743
- start = this.skipHiddenDays(start, direction);
5744
- end = start;
5745
- do {
5746
- end = addDays(end, 1);
5747
- if (!this.isHiddenDay(end)) {
5748
- runningCount++;
5749
- }
5750
- } while (runningCount < dayCount);
5751
- return { start: start, end: end };
5752
- };
5753
- // Builds a normalized range object for the "visible" range,
5754
- // which is a way to define the currentRange and activeRange at the same time.
5755
- DateProfileGenerator.prototype.buildCustomVisibleRange = function (date) {
5756
- var dateEnv = this.dateEnv;
5757
- var visibleRange = this.getRangeOption('visibleRange', dateEnv.toDate(date));
5758
- if (visibleRange && (visibleRange.start == null || visibleRange.end == null)) {
5759
- return null;
5760
- }
5761
- return visibleRange;
5762
- };
5763
- // Computes the range that will represent the element/cells for *rendering*,
5764
- // but which may have voided days/times.
5765
- // not responsible for trimming hidden days.
5766
- DateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
5767
- return currentRange;
5768
- };
5769
- // Compute the duration value that should be added/substracted to the current date
5770
- // when a prev/next operation happens.
5771
- DateProfileGenerator.prototype.buildDateIncrement = function (fallback) {
5772
- var dateIncrementInput = this.options.dateIncrement;
5773
- var customAlignment;
5774
- if (dateIncrementInput) {
5775
- return createDuration(dateIncrementInput);
5776
- }
5777
- else if ((customAlignment = this.options.dateAlignment)) {
5778
- return createDuration(1, customAlignment);
5779
- }
5780
- else if (fallback) {
5781
- return fallback;
5782
- }
5783
- else {
5784
- return createDuration({ days: 1 });
5785
- }
5786
- };
5787
- // Arguments after name will be forwarded to a hypothetical function value
5788
- // WARNING: passed-in arguments will be given to generator functions as-is and can cause side-effects.
5789
- // Always clone your objects if you fear mutation.
5790
- DateProfileGenerator.prototype.getRangeOption = function (name) {
5791
- var otherArgs = [];
5792
- for (var _i = 1; _i < arguments.length; _i++) {
5793
- otherArgs[_i - 1] = arguments[_i];
5794
- }
5795
- var val = this.options[name];
5796
- if (typeof val === 'function') {
5797
- val = val.apply(null, otherArgs);
5798
- }
5799
- if (val) {
5800
- val = parseRange(val, this.dateEnv);
5801
- }
5802
- if (val) {
5803
- val = computeVisibleDayRange(val);
5804
- }
5805
- return val;
5806
- };
5807
- /* Hidden Days
5808
- ------------------------------------------------------------------------------------------------------------------*/
5809
- // Initializes internal variables related to calculating hidden days-of-week
5810
- DateProfileGenerator.prototype.initHiddenDays = function () {
5811
- var hiddenDays = this.options.hiddenDays || []; // array of day-of-week indices that are hidden
5812
- var isHiddenDayHash = []; // is the day-of-week hidden? (hash with day-of-week-index -> bool)
5813
- var dayCnt = 0;
5814
- var i;
5815
- if (this.options.weekends === false) {
5816
- hiddenDays.push(0, 6); // 0=sunday, 6=saturday
5817
- }
5818
- for (i = 0; i < 7; i++) {
5819
- if (!(isHiddenDayHash[i] = hiddenDays.indexOf(i) !== -1)) {
5820
- dayCnt++;
5821
- }
5822
- }
5823
- if (!dayCnt) {
5824
- throw new Error('invalid hiddenDays'); // all days were hidden? bad.
5825
- }
5826
- this.isHiddenDayHash = isHiddenDayHash;
5827
- };
5828
- // Remove days from the beginning and end of the range that are computed as hidden.
5829
- // If the whole range is trimmed off, returns null
5830
- DateProfileGenerator.prototype.trimHiddenDays = function (range) {
5831
- var start = range.start;
5832
- var end = range.end;
5833
- if (start) {
5834
- start = this.skipHiddenDays(start);
5835
- }
5836
- if (end) {
5837
- end = this.skipHiddenDays(end, -1, true);
5838
- }
5839
- if (start == null || end == null || start < end) {
5840
- return { start: start, end: end };
5841
- }
5842
- return null;
5843
- };
5844
- // Is the current day hidden?
5845
- // `day` is a day-of-week index (0-6), or a Date (used for UTC)
5846
- DateProfileGenerator.prototype.isHiddenDay = function (day) {
5847
- if (day instanceof Date) {
5848
- day = day.getUTCDay();
5849
- }
5850
- return this.isHiddenDayHash[day];
5851
- };
5852
- // Incrementing the current day until it is no longer a hidden day, returning a copy.
5853
- // DOES NOT CONSIDER validRange!
5854
- // If the initial value of `date` is not a hidden day, don't do anything.
5855
- // Pass `isExclusive` as `true` if you are dealing with an end date.
5856
- // `inc` defaults to `1` (increment one day forward each time)
5857
- DateProfileGenerator.prototype.skipHiddenDays = function (date, inc, isExclusive) {
5858
- if (inc === void 0) { inc = 1; }
5859
- if (isExclusive === void 0) { isExclusive = false; }
5860
- while (this.isHiddenDayHash[(date.getUTCDay() + (isExclusive ? inc : 0) + 7) % 7]) {
5861
- date = addDays(date, inc);
5862
- }
5863
- return date;
5864
- };
5865
- return DateProfileGenerator;
5866
- }());
5867
- // TODO: find a way to avoid comparing DateProfiles. it's tedious
5868
- function isDateProfilesEqual(p0, p1) {
5869
- return rangesEqual(p0.validRange, p1.validRange) &&
5870
- rangesEqual(p0.activeRange, p1.activeRange) &&
5871
- rangesEqual(p0.renderRange, p1.renderRange) &&
5872
- durationsEqual(p0.minTime, p1.minTime) &&
5873
- durationsEqual(p0.maxTime, p1.maxTime);
5874
- /*
5875
- TODO: compare more?
5876
- currentRange: DateRange
5877
- currentRangeUnit: string
5878
- isRangeAllDay: boolean
5879
- isValid: boolean
5880
- dateIncrement: Duration
5881
- */
5882
- }
5883
 
5884
- function reduce (state, action, calendar) {
5885
- var viewType = reduceViewType(state.viewType, action);
5886
- var dateProfile = reduceDateProfile(state.dateProfile, action, state.currentDate, viewType, calendar);
5887
- var eventSources = reduceEventSources(state.eventSources, action, dateProfile, calendar);
5888
- var nextState = __assign({}, state, { viewType: viewType,
5889
- dateProfile: dateProfile, currentDate: reduceCurrentDate(state.currentDate, action, dateProfile), eventSources: eventSources, eventStore: reduceEventStore(state.eventStore, action, eventSources, dateProfile, calendar), dateSelection: reduceDateSelection(state.dateSelection, action, calendar), eventSelection: reduceSelectedEvent(state.eventSelection, action), eventDrag: reduceEventDrag(state.eventDrag, action, eventSources, calendar), eventResize: reduceEventResize(state.eventResize, action, eventSources, calendar), eventSourceLoadingLevel: computeLoadingLevel(eventSources), loadingLevel: computeLoadingLevel(eventSources) });
5890
- for (var _i = 0, _a = calendar.pluginSystem.hooks.reducers; _i < _a.length; _i++) {
5891
- var reducerFunc = _a[_i];
5892
- nextState = reducerFunc(nextState, action, calendar);
5893
- }
5894
- // console.log(action.type, nextState)
5895
- return nextState;
5896
- }
5897
- function reduceViewType(currentViewType, action) {
5898
- switch (action.type) {
5899
- case 'SET_VIEW_TYPE':
5900
- return action.viewType;
5901
- default:
5902
- return currentViewType;
5903
- }
5904
- }
5905
- function reduceDateProfile(currentDateProfile, action, currentDate, viewType, calendar) {
5906
- var newDateProfile;
5907
- switch (action.type) {
5908
- case 'PREV':
5909
- newDateProfile = calendar.dateProfileGenerators[viewType].buildPrev(currentDateProfile, currentDate);
5910
- break;
5911
- case 'NEXT':
5912
- newDateProfile = calendar.dateProfileGenerators[viewType].buildNext(currentDateProfile, currentDate);
5913
- break;
5914
- case 'SET_DATE':
5915
- if (!currentDateProfile.activeRange ||
5916
- !rangeContainsMarker(currentDateProfile.currentRange, action.dateMarker)) {
5917
- newDateProfile = calendar.dateProfileGenerators[viewType].build(action.dateMarker, undefined, true // forceToValid
5918
- );
5919
- }
5920
- break;
5921
- case 'SET_VIEW_TYPE':
5922
- var generator = calendar.dateProfileGenerators[viewType];
5923
- if (!generator) {
5924
- throw new Error(viewType ?
5925
- 'The FullCalendar view "' + viewType + '" does not exist. Make sure your plugins are loaded correctly.' :
5926
- 'No available FullCalendar view plugins.');
5927
- }
5928
- newDateProfile = generator.build(action.dateMarker || currentDate, undefined, true // forceToValid
5929
- );
5930
- break;
5931
- }
5932
- if (newDateProfile &&
5933
- newDateProfile.isValid &&
5934
- !(currentDateProfile && isDateProfilesEqual(currentDateProfile, newDateProfile))) {
5935
- return newDateProfile;
5936
- }
5937
- else {
5938
- return currentDateProfile;
5939
- }
5940
- }
5941
- function reduceCurrentDate(currentDate, action, dateProfile) {
5942
- switch (action.type) {
5943
- case 'PREV':
5944
- case 'NEXT':
5945
- if (!rangeContainsMarker(dateProfile.currentRange, currentDate)) {
5946
- return dateProfile.currentRange.start;
5947
- }
5948
- else {
5949
- return currentDate;
5950
- }
5951
- case 'SET_DATE':
5952
- case 'SET_VIEW_TYPE':
5953
- var newDate = action.dateMarker || currentDate;
5954
- if (dateProfile.activeRange && !rangeContainsMarker(dateProfile.activeRange, newDate)) {
5955
- return dateProfile.currentRange.start;
5956
- }
5957
- else {
5958
- return newDate;
5959
- }
5960
- default:
5961
- return currentDate;
5962
- }
5963
- }
5964
- function reduceDateSelection(currentSelection, action, calendar) {
5965
- switch (action.type) {
5966
- case 'SELECT_DATES':
5967
- return action.selection;
5968
- case 'UNSELECT_DATES':
5969
- return null;
5970
- default:
5971
- return currentSelection;
5972
- }
5973
- }
5974
- function reduceSelectedEvent(currentInstanceId, action) {
5975
- switch (action.type) {
5976
- case 'SELECT_EVENT':
5977
- return action.eventInstanceId;
5978
- case 'UNSELECT_EVENT':
5979
- return '';
5980
- default:
5981
- return currentInstanceId;
5982
- }
5983
- }
5984
- function reduceEventDrag(currentDrag, action, sources, calendar) {
5985
- switch (action.type) {
5986
- case 'SET_EVENT_DRAG':
5987
- var newDrag = action.state;
5988
- return {
5989
- affectedEvents: newDrag.affectedEvents,
5990
- mutatedEvents: newDrag.mutatedEvents,
5991
- isEvent: newDrag.isEvent,
5992
- origSeg: newDrag.origSeg
5993
- };
5994
- case 'UNSET_EVENT_DRAG':
5995
- return null;
5996
- default:
5997
- return currentDrag;
5998
- }
5999
- }
6000
- function reduceEventResize(currentResize, action, sources, calendar) {
6001
- switch (action.type) {
6002
- case 'SET_EVENT_RESIZE':
6003
- var newResize = action.state;
6004
- return {
6005
- affectedEvents: newResize.affectedEvents,
6006
- mutatedEvents: newResize.mutatedEvents,
6007
- isEvent: newResize.isEvent,
6008
- origSeg: newResize.origSeg
6009
- };
6010
- case 'UNSET_EVENT_RESIZE':
6011
- return null;
6012
- default:
6013
- return currentResize;
6014
- }
6015
- }
6016
- function computeLoadingLevel(eventSources) {
6017
- var cnt = 0;
6018
- for (var sourceId in eventSources) {
6019
- if (eventSources[sourceId].isFetching) {
6020
- cnt++;
6021
- }
6022
- }
6023
- return cnt;
6024
- }
6025
 
6026
- var STANDARD_PROPS = {
6027
- start: null,
6028
- end: null,
6029
- allDay: Boolean
6030
- };
6031
- function parseDateSpan(raw, dateEnv, defaultDuration) {
6032
- var span = parseOpenDateSpan(raw, dateEnv);
6033
- var range = span.range;
6034
- if (!range.start) {
6035
- return null;
6036
- }
6037
- if (!range.end) {
6038
- if (defaultDuration == null) {
6039
- return null;
6040
- }
6041
- else {
6042
- range.end = dateEnv.add(range.start, defaultDuration);
6043
- }
6044
- }
6045
- return span;
6046
- }
6047
- /*
6048
- TODO: somehow combine with parseRange?
6049
- Will return null if the start/end props were present but parsed invalidly.
6050
- */
6051
- function parseOpenDateSpan(raw, dateEnv) {
6052
- var leftovers = {};
6053
- var standardProps = refineProps(raw, STANDARD_PROPS, {}, leftovers);
6054
- var startMeta = standardProps.start ? dateEnv.createMarkerMeta(standardProps.start) : null;
6055
- var endMeta = standardProps.end ? dateEnv.createMarkerMeta(standardProps.end) : null;
6056
- var allDay = standardProps.allDay;
6057
- if (allDay == null) {
6058
- allDay = (startMeta && startMeta.isTimeUnspecified) &&
6059
- (!endMeta || endMeta.isTimeUnspecified);
6060
- }
6061
- // use this leftover object as the selection object
6062
- leftovers.range = {
6063
- start: startMeta ? startMeta.marker : null,
6064
- end: endMeta ? endMeta.marker : null
6065
- };
6066
- leftovers.allDay = allDay;
6067
- return leftovers;
6068
- }
6069
- function isDateSpansEqual(span0, span1) {
6070
- return rangesEqual(span0.range, span1.range) &&
6071
- span0.allDay === span1.allDay &&
6072
- isSpanPropsEqual(span0, span1);
6073
- }
6074
- // the NON-DATE-RELATED props
6075
- function isSpanPropsEqual(span0, span1) {
6076
- for (var propName in span1) {
6077
- if (propName !== 'range' && propName !== 'allDay') {
6078
- if (span0[propName] !== span1[propName]) {
6079
- return false;
6080
- }
6081
- }
6082
- }
6083
- // are there any props that span0 has that span1 DOESN'T have?
6084
- // both have range/allDay, so no need to special-case.
6085
- for (var propName in span0) {
6086
- if (!(propName in span1)) {
6087
- return false;
6088
- }
6089
- }
6090
- return true;
6091
- }
6092
- function buildDateSpanApi(span, dateEnv) {
6093
- return {
6094
- start: dateEnv.toDate(span.range.start),
6095
- end: dateEnv.toDate(span.range.end),
6096
- startStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
6097
- endStr: dateEnv.formatIso(span.range.end, { omitTime: span.allDay }),
6098
- allDay: span.allDay
6099
- };
6100
- }
6101
- function buildDatePointApi(span, dateEnv) {
6102
- return {
6103
- date: dateEnv.toDate(span.range.start),
6104
- dateStr: dateEnv.formatIso(span.range.start, { omitTime: span.allDay }),
6105
- allDay: span.allDay
6106
- };
6107
- }
6108
- function fabricateEventRange(dateSpan, eventUiBases, calendar) {
6109
- var def = parseEventDef({ editable: false }, '', // sourceId
6110
- dateSpan.allDay, true, // hasEnd
6111
- calendar);
6112
- return {
6113
- def: def,
6114
- ui: compileEventUi(def, eventUiBases),
6115
- instance: createEventInstance(def.defId, dateSpan.range),
6116
- range: dateSpan.range,
6117
- isStart: true,
6118
- isEnd: true
6119
- };
6120
- }
6121
 
6122
- function compileViewDefs(defaultConfigs, overrideConfigs) {
6123
- var hash = {};
6124
- var viewType;
6125
- for (viewType in defaultConfigs) {
6126
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
6127
- }
6128
- for (viewType in overrideConfigs) {
6129
- ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs);
6130
- }
6131
- return hash;
6132
- }
6133
- function ensureViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
6134
- if (hash[viewType]) {
6135
- return hash[viewType];
6136
- }
6137
- var viewDef = buildViewDef(viewType, hash, defaultConfigs, overrideConfigs);
6138
- if (viewDef) {
6139
- hash[viewType] = viewDef;
6140
- }
6141
- return viewDef;
6142
- }
6143
- function buildViewDef(viewType, hash, defaultConfigs, overrideConfigs) {
6144
- var defaultConfig = defaultConfigs[viewType];
6145
- var overrideConfig = overrideConfigs[viewType];
6146
- var queryProp = function (name) {
6147
- return (defaultConfig && defaultConfig[name] !== null) ? defaultConfig[name] :
6148
- ((overrideConfig && overrideConfig[name] !== null) ? overrideConfig[name] : null);
6149
- };
6150
- var theClass = queryProp('class');
6151
- var superType = queryProp('superType');
6152
- if (!superType && theClass) {
6153
- superType =
6154
- findViewNameBySubclass(theClass, overrideConfigs) ||
6155
- findViewNameBySubclass(theClass, defaultConfigs);
6156
- }
6157
- var superDef = null;
6158
- if (superType) {
6159
- if (superType === viewType) {
6160
- throw new Error('Can\'t have a custom view type that references itself');
6161
- }
6162
- superDef = ensureViewDef(superType, hash, defaultConfigs, overrideConfigs);
6163
- }
6164
- if (!theClass && superDef) {
6165
- theClass = superDef.class;
6166
- }
6167
- if (!theClass) {
6168
- return null; // don't throw a warning, might be settings for a single-unit view
6169
- }
6170
- return {
6171
- type: viewType,
6172
- class: theClass,
6173
- defaults: __assign({}, (superDef ? superDef.defaults : {}), (defaultConfig ? defaultConfig.options : {})),
6174
- overrides: __assign({}, (superDef ? superDef.overrides : {}), (overrideConfig ? overrideConfig.options : {}))
6175
- };
6176
- }
6177
- function findViewNameBySubclass(viewSubclass, configs) {
6178
- var superProto = Object.getPrototypeOf(viewSubclass.prototype);
6179
- for (var viewType in configs) {
6180
- var parsed = configs[viewType];
6181
- // need DIRECT subclass, so instanceof won't do it
6182
- if (parsed.class && parsed.class.prototype === superProto) {
6183
- return viewType;
6184
- }
6185
- }
6186
- return '';
6187
- }
6188
 
6189
- function parseViewConfigs(inputs) {
6190
- return mapHash(inputs, parseViewConfig);
6191
- }
6192
- var VIEW_DEF_PROPS = {
6193
- type: String,
6194
- class: null
6195
- };
6196
- function parseViewConfig(input) {
6197
- if (typeof input === 'function') {
6198
- input = { class: input };
6199
- }
6200
- var options = {};
6201
- var props = refineProps(input, VIEW_DEF_PROPS, {}, options);
6202
- return {
6203
- superType: props.type,
6204
- class: props.class,
6205
- options: options
6206
- };
6207
- }
6208
 
6209
- function buildViewSpecs(defaultInputs, optionsManager) {
6210
- var defaultConfigs = parseViewConfigs(defaultInputs);
6211
- var overrideConfigs = parseViewConfigs(optionsManager.overrides.views);
6212
- var viewDefs = compileViewDefs(defaultConfigs, overrideConfigs);
6213
- return mapHash(viewDefs, function (viewDef) {
6214
- return buildViewSpec(viewDef, overrideConfigs, optionsManager);
6215
- });
6216
- }
6217
- function buildViewSpec(viewDef, overrideConfigs, optionsManager) {
6218
- var durationInput = viewDef.overrides.duration ||
6219
- viewDef.defaults.duration ||
6220
- optionsManager.dynamicOverrides.duration ||
6221
- optionsManager.overrides.duration;
6222
- var duration = null;
6223
- var durationUnit = '';
6224
- var singleUnit = '';
6225
- var singleUnitOverrides = {};
6226
- if (durationInput) {
6227
- duration = createDuration(durationInput);
6228
- if (duration) { // valid?
6229
- var denom = greatestDurationDenominator(duration, !getWeeksFromInput(durationInput));
6230
- durationUnit = denom.unit;
6231
- if (denom.value === 1) {
6232
- singleUnit = durationUnit;
6233
- singleUnitOverrides = overrideConfigs[durationUnit] ? overrideConfigs[durationUnit].options : {};
6234
- }
6235
- }
6236
- }
6237
- var queryButtonText = function (options) {
6238
- var buttonTextMap = options.buttonText || {};
6239
- var buttonTextKey = viewDef.defaults.buttonTextKey;
6240
- if (buttonTextKey != null && buttonTextMap[buttonTextKey] != null) {
6241
- return buttonTextMap[buttonTextKey];
6242
- }
6243
- if (buttonTextMap[viewDef.type] != null) {
6244
- return buttonTextMap[viewDef.type];
6245
- }
6246
- if (buttonTextMap[singleUnit] != null) {
6247
- return buttonTextMap[singleUnit];
6248
- }
6249
- };
6250
- return {
6251
- type: viewDef.type,
6252
- class: viewDef.class,
6253
- duration: duration,
6254
- durationUnit: durationUnit,
6255
- singleUnit: singleUnit,
6256
- options: __assign({}, globalDefaults, viewDef.defaults, optionsManager.dirDefaults, optionsManager.localeDefaults, optionsManager.overrides, singleUnitOverrides, viewDef.overrides, optionsManager.dynamicOverrides),
6257
- buttonTextOverride: queryButtonText(optionsManager.dynamicOverrides) ||
6258
- queryButtonText(optionsManager.overrides) || // constructor-specified buttonText lookup hash takes precedence
6259
- viewDef.overrides.buttonText,
6260
- buttonTextDefault: queryButtonText(optionsManager.localeDefaults) ||
6261
- queryButtonText(optionsManager.dirDefaults) ||
6262
- viewDef.defaults.buttonText ||
6263
- queryButtonText(globalDefaults) ||
6264
- viewDef.type // fall back to given view name
6265
- };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
6266
  }
 
6267
 
6268
- var Toolbar = /** @class */ (function (_super) {
6269
- __extends(Toolbar, _super);
6270
- function Toolbar(context, extraClassName) {
6271
- var _this = _super.call(this, context) || this;
6272
- _this._renderLayout = memoizeRendering(_this.renderLayout, _this.unrenderLayout);
6273
- _this._updateTitle = memoizeRendering(_this.updateTitle, null, [_this._renderLayout]);
6274
- _this._updateActiveButton = memoizeRendering(_this.updateActiveButton, null, [_this._renderLayout]);
6275
- _this._updateToday = memoizeRendering(_this.updateToday, null, [_this._renderLayout]);
6276
- _this._updatePrev = memoizeRendering(_this.updatePrev, null, [_this._renderLayout]);
6277
- _this._updateNext = memoizeRendering(_this.updateNext, null, [_this._renderLayout]);
6278
- _this.el = createElement('div', { className: 'fc-toolbar ' + extraClassName });
6279
- return _this;
6280
- }
6281
- Toolbar.prototype.destroy = function () {
6282
- _super.prototype.destroy.call(this);
6283
- this._renderLayout.unrender(); // should unrender everything else
6284
- removeElement(this.el);
6285
- };
6286
- Toolbar.prototype.render = function (props) {
6287
- this._renderLayout(props.layout);
6288
- this._updateTitle(props.title);
6289
- this._updateActiveButton(props.activeButton);
6290
- this._updateToday(props.isTodayEnabled);
6291
- this._updatePrev(props.isPrevEnabled);
6292
- this._updateNext(props.isNextEnabled);
6293
- };
6294
- Toolbar.prototype.renderLayout = function (layout) {
6295
- var el = this.el;
6296
- this.viewsWithButtons = [];
6297
- appendToElement(el, this.renderSection('left', layout.left));
6298
- appendToElement(el, this.renderSection('center', layout.center));
6299
- appendToElement(el, this.renderSection('right', layout.right));
6300
- };
6301
- Toolbar.prototype.unrenderLayout = function () {
6302
- this.el.innerHTML = '';
6303
- };
6304
- Toolbar.prototype.renderSection = function (position, buttonStr) {
6305
- var _this = this;
6306
- var _a = this, theme = _a.theme, calendar = _a.calendar;
6307
- var optionsManager = calendar.optionsManager;
6308
- var viewSpecs = calendar.viewSpecs;
6309
- var sectionEl = createElement('div', { className: 'fc-' + position });
6310
- var calendarCustomButtons = optionsManager.computed.customButtons || {};
6311
- var calendarButtonTextOverrides = optionsManager.overrides.buttonText || {};
6312
- var calendarButtonText = optionsManager.computed.buttonText || {};
6313
- if (buttonStr) {
6314
- buttonStr.split(' ').forEach(function (buttonGroupStr, i) {
6315
- var groupChildren = [];
6316
- var isOnlyButtons = true;
6317
- var groupEl;
6318
- buttonGroupStr.split(',').forEach(function (buttonName, j) {
6319
- var customButtonProps;
6320
- var viewSpec;
6321
- var buttonClick;
6322
- var buttonIcon; // only one of these will be set
6323
- var buttonText; // "
6324
- var buttonInnerHtml;
6325
- var buttonClasses;
6326
- var buttonEl;
6327
- var buttonAriaAttr;
6328
- if (buttonName === 'title') {
6329
- groupChildren.push(htmlToElement('<h2>&nbsp;</h2>')); // we always want it to take up height
6330
- isOnlyButtons = false;
6331
- }
6332
- else {
6333
- if ((customButtonProps = calendarCustomButtons[buttonName])) {
6334
- buttonClick = function (ev) {
6335
- if (customButtonProps.click) {
6336
- customButtonProps.click.call(buttonEl, ev);
6337
- }
6338
- };
6339
- (buttonIcon = theme.getCustomButtonIconClass(customButtonProps)) ||
6340
- (buttonIcon = theme.getIconClass(buttonName)) ||
6341
- (buttonText = customButtonProps.text);
6342
- }
6343
- else if ((viewSpec = viewSpecs[buttonName])) {
6344
- _this.viewsWithButtons.push(buttonName);
6345
- buttonClick = function () {
6346
- calendar.changeView(buttonName);
6347
- };
6348
- (buttonText = viewSpec.buttonTextOverride) ||
6349
- (buttonIcon = theme.getIconClass(buttonName)) ||
6350
- (buttonText = viewSpec.buttonTextDefault);
6351
- }
6352
- else if (calendar[buttonName]) { // a calendar method
6353
- buttonClick = function () {
6354
- calendar[buttonName]();
6355
- };
6356
- (buttonText = calendarButtonTextOverrides[buttonName]) ||
6357
- (buttonIcon = theme.getIconClass(buttonName)) ||
6358
- (buttonText = calendarButtonText[buttonName]);
6359
- // ^ everything else is considered default
6360
- }
6361
- if (buttonClick) {
6362
- buttonClasses = [
6363
- 'fc-' + buttonName + '-button',
6364
- theme.getClass('button')
6365
- ];
6366
- if (buttonText) {
6367
- buttonInnerHtml = htmlEscape(buttonText);
6368
- buttonAriaAttr = '';
6369
- }
6370
- else if (buttonIcon) {
6371
- buttonInnerHtml = "<span class='" + buttonIcon + "'></span>";
6372
- buttonAriaAttr = ' aria-label="' + buttonName + '"';
6373
- }
6374
- buttonEl = htmlToElement(// type="button" so that it doesn't submit a form
6375
- '<button type="button" class="' + buttonClasses.join(' ') + '"' +
6376
- buttonAriaAttr +
6377
- '>' + buttonInnerHtml + '</button>');
6378
- buttonEl.addEventListener('click', buttonClick);
6379
- groupChildren.push(buttonEl);
6380
- }
6381
- }
6382
- });
6383
- if (groupChildren.length > 1) {
6384
- groupEl = document.createElement('div');
6385
- var buttonGroupClassName = theme.getClass('buttonGroup');
6386
- if (isOnlyButtons && buttonGroupClassName) {
6387
- groupEl.classList.add(buttonGroupClassName);
6388
- }
6389
- appendToElement(groupEl, groupChildren);
6390
- sectionEl.appendChild(groupEl);
6391
- }
6392
- else {
6393
- appendToElement(sectionEl, groupChildren); // 1 or 0 children
6394
- }
6395
- });
6396
- }
6397
- return sectionEl;
6398
- };
6399
- Toolbar.prototype.updateToday = function (isTodayEnabled) {
6400
- this.toggleButtonEnabled('today', isTodayEnabled);
6401
- };
6402
- Toolbar.prototype.updatePrev = function (isPrevEnabled) {
6403
- this.toggleButtonEnabled('prev', isPrevEnabled);
6404
- };
6405
- Toolbar.prototype.updateNext = function (isNextEnabled) {
6406
- this.toggleButtonEnabled('next', isNextEnabled);
6407
- };
6408
- Toolbar.prototype.updateTitle = function (text) {
6409
- findElements(this.el, 'h2').forEach(function (titleEl) {
6410
- titleEl.innerText = text;
6411
- });
6412
- };
6413
- Toolbar.prototype.updateActiveButton = function (buttonName) {
6414
- var className = this.theme.getClass('buttonActive');
6415
- findElements(this.el, 'button').forEach(function (buttonEl) {
6416
- if (buttonName && buttonEl.classList.contains('fc-' + buttonName + '-button')) {
6417
- buttonEl.classList.add(className);
6418
- }
6419
- else {
6420
- buttonEl.classList.remove(className);
6421
- }
6422
- });
6423
- };
6424
- Toolbar.prototype.toggleButtonEnabled = function (buttonName, bool) {
6425
- findElements(this.el, '.fc-' + buttonName + '-button').forEach(function (buttonEl) {
6426
- buttonEl.disabled = !bool;
6427
- });
6428
- };
6429
- return Toolbar;
6430
- }(Component));
6431
 
6432
- var CalendarComponent = /** @class */ (function (_super) {
6433
- __extends(CalendarComponent, _super);
6434
- function CalendarComponent(context, el) {
6435
- var _this = _super.call(this, context) || this;
6436
- _this._renderToolbars = memoizeRendering(_this.renderToolbars);
6437
- _this.buildViewPropTransformers = memoize(buildViewPropTransformers);
6438
- _this.el = el;
6439
- prependToElement(el, _this.contentEl = createElement('div', { className: 'fc-view-container' }));
6440
- var calendar = _this.calendar;
6441
- for (var _i = 0, _a = calendar.pluginSystem.hooks.viewContainerModifiers; _i < _a.length; _i++) {
6442
- var modifyViewContainer = _a[_i];
6443
- modifyViewContainer(_this.contentEl, calendar);
6444
- }
6445
- _this.toggleElClassNames(true);
6446
- _this.computeTitle = memoize(computeTitle);
6447
- _this.parseBusinessHours = memoize(function (input) {
6448
- return parseBusinessHours(input, _this.calendar);
6449
- });
6450
- return _this;
6451
- }
6452
- CalendarComponent.prototype.destroy = function () {
6453
- if (this.header) {
6454
- this.header.destroy();
6455
- }
6456
- if (this.footer) {
6457
- this.footer.destroy();
6458
- }
6459
- if (this.view) {
6460
- this.view.destroy();
6461
- }
6462
- removeElement(this.contentEl);
6463
- this.toggleElClassNames(false);
6464
- _super.prototype.destroy.call(this);
6465
- };
6466
- CalendarComponent.prototype.toggleElClassNames = function (bool) {
6467
- var classList = this.el.classList;
6468
- var dirClassName = 'fc-' + this.opt('dir');
6469
- var themeClassName = this.theme.getClass('widget');
6470
- if (bool) {
6471
- classList.add('fc');
6472
- classList.add(dirClassName);
6473
- classList.add(themeClassName);
6474
- }
6475
- else {
6476
- classList.remove('fc');
6477
- classList.remove(dirClassName);
6478
- classList.remove(themeClassName);
6479
- }
6480
- };
6481
- CalendarComponent.prototype.render = function (props) {
6482
- this.freezeHeight();
6483
- var title = this.computeTitle(props.dateProfile, props.viewSpec.options);
6484
- this._renderToolbars(props.viewSpec, props.dateProfile, props.currentDate, props.dateProfileGenerator, title);
6485
- this.renderView(props, title);
6486
- this.updateSize();
6487
- this.thawHeight();
6488
- };
6489
- CalendarComponent.prototype.renderToolbars = function (viewSpec, dateProfile, currentDate, dateProfileGenerator, title) {
6490
- var headerLayout = this.opt('header');
6491
- var footerLayout = this.opt('footer');
6492
- var now = this.calendar.getNow();
6493
- var todayInfo = dateProfileGenerator.build(now);
6494
- var prevInfo = dateProfileGenerator.buildPrev(dateProfile, currentDate);
6495
- var nextInfo = dateProfileGenerator.buildNext(dateProfile, currentDate);
6496
- var toolbarProps = {
6497
- title: title,
6498
- activeButton: viewSpec.type,
6499
- isTodayEnabled: todayInfo.isValid && !rangeContainsMarker(dateProfile.currentRange, now),
6500
- isPrevEnabled: prevInfo.isValid,
6501
- isNextEnabled: nextInfo.isValid
6502
- };
6503
- if (headerLayout) {
6504
- if (!this.header) {
6505
- this.header = new Toolbar(this.context, 'fc-header-toolbar');
6506
- prependToElement(this.el, this.header.el);
6507
- }
6508
- this.header.receiveProps(__assign({ layout: headerLayout }, toolbarProps));
6509
- }
6510
- else if (this.header) {
6511
- this.header.destroy();
6512
- this.header = null;
6513
- }
6514
- if (footerLayout) {
6515
- if (!this.footer) {
6516
- this.footer = new Toolbar(this.context, 'fc-footer-toolbar');
6517
- appendToElement(this.el, this.footer.el);
6518
- }
6519
- this.footer.receiveProps(__assign({ layout: footerLayout }, toolbarProps));
6520
- }
6521
- else if (this.footer) {
6522
- this.footer.destroy();
6523
- this.footer = null;
6524
- }
6525
- };
6526
- CalendarComponent.prototype.renderView = function (props, title) {
6527
- var view = this.view;
6528
- var viewSpec = props.viewSpec, dateProfileGenerator = props.dateProfileGenerator;
6529
- if (!view || view.viewSpec !== viewSpec) {
6530
- if (view) {
6531
- view.destroy();
6532
- }
6533
- view = this.view = new viewSpec['class']({
6534
- calendar: this.calendar,
6535
- view: null,
6536
- dateEnv: this.dateEnv,
6537
- theme: this.theme,
6538
- options: viewSpec.options
6539
- }, viewSpec, dateProfileGenerator, this.contentEl);
6540
- }
6541
- else {
6542
- view.addScroll(view.queryScroll());
6543
- }
6544
- view.title = title; // for the API
6545
- var viewProps = {
6546
- dateProfile: props.dateProfile,
6547
- businessHours: this.parseBusinessHours(viewSpec.options.businessHours),
6548
- eventStore: props.eventStore,
6549
- eventUiBases: props.eventUiBases,
6550
- dateSelection: props.dateSelection,
6551
- eventSelection: props.eventSelection,
6552
- eventDrag: props.eventDrag,
6553
- eventResize: props.eventResize
6554
- };
6555
- var transformers = this.buildViewPropTransformers(this.calendar.pluginSystem.hooks.viewPropsTransformers);
6556
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
6557
- var transformer = transformers_1[_i];
6558
- __assign(viewProps, transformer.transform(viewProps, viewSpec, props, view));
6559
- }
6560
- view.receiveProps(viewProps);
6561
- };
6562
- // Sizing
6563
- // -----------------------------------------------------------------------------------------------------------------
6564
- CalendarComponent.prototype.updateSize = function (isResize) {
6565
- if (isResize === void 0) { isResize = false; }
6566
- var view = this.view;
6567
- if (isResize) {
6568
- view.addScroll(view.queryScroll());
6569
- }
6570
- if (isResize || this.isHeightAuto == null) {
6571
- this.computeHeightVars();
6572
- }
6573
- view.updateSize(isResize, this.viewHeight, this.isHeightAuto);
6574
- view.updateNowIndicator(); // we need to guarantee this will run after updateSize
6575
- view.popScroll(isResize);
6576
- };
6577
- CalendarComponent.prototype.computeHeightVars = function () {
6578
- var calendar = this.calendar; // yuck. need to handle dynamic options
6579
- var heightInput = calendar.opt('height');
6580
- var contentHeightInput = calendar.opt('contentHeight');
6581
- this.isHeightAuto = heightInput === 'auto' || contentHeightInput === 'auto';
6582
- if (typeof contentHeightInput === 'number') { // exists and not 'auto'
6583
- this.viewHeight = contentHeightInput;
6584
- }
6585
- else if (typeof contentHeightInput === 'function') { // exists and is a function
6586
- this.viewHeight = contentHeightInput();
6587
- }
6588
- else if (typeof heightInput === 'number') { // exists and not 'auto'
6589
- this.viewHeight = heightInput - this.queryToolbarsHeight();
6590
- }
6591
- else if (typeof heightInput === 'function') { // exists and is a function
6592
- this.viewHeight = heightInput() - this.queryToolbarsHeight();
6593
- }
6594
- else if (heightInput === 'parent') { // set to height of parent element
6595
- var parentEl = this.el.parentNode;
6596
- this.viewHeight = parentEl.getBoundingClientRect().height - this.queryToolbarsHeight();
6597
- }
6598
- else {
6599
- this.viewHeight = Math.round(this.contentEl.getBoundingClientRect().width /
6600
- Math.max(calendar.opt('aspectRatio'), .5));
6601
- }
6602
- };
6603
- CalendarComponent.prototype.queryToolbarsHeight = function () {
6604
- var height = 0;
6605
- if (this.header) {
6606
- height += computeHeightAndMargins(this.header.el);
6607
- }
6608
- if (this.footer) {
6609
- height += computeHeightAndMargins(this.footer.el);
6610
- }
6611
- return height;
6612
- };
6613
- // Height "Freezing"
6614
- // -----------------------------------------------------------------------------------------------------------------
6615
- CalendarComponent.prototype.freezeHeight = function () {
6616
- applyStyle(this.el, {
6617
- height: this.el.getBoundingClientRect().height,
6618
- overflow: 'hidden'
6619
- });
6620
- };
6621
- CalendarComponent.prototype.thawHeight = function () {
6622
- applyStyle(this.el, {
6623
- height: '',
6624
- overflow: ''
6625
- });
6626
- };
6627
- return CalendarComponent;
6628
- }(Component));
6629
- // Title and Date Formatting
6630
- // -----------------------------------------------------------------------------------------------------------------
6631
- // Computes what the title at the top of the calendar should be for this view
6632
- function computeTitle(dateProfile, viewOptions) {
6633
- var range;
6634
- // for views that span a large unit of time, show the proper interval, ignoring stray days before and after
6635
- if (/^(year|month)$/.test(dateProfile.currentRangeUnit)) {
6636
- range = dateProfile.currentRange;
6637
- }
6638
- else { // for day units or smaller, use the actual day range
6639
- range = dateProfile.activeRange;
6640
- }
6641
- return this.dateEnv.formatRange(range.start, range.end, createFormatter(viewOptions.titleFormat || computeTitleFormat(dateProfile), viewOptions.titleRangeSeparator), { isEndExclusive: dateProfile.isRangeAllDay });
6642
- }
6643
- // Generates the format string that should be used to generate the title for the current date range.
6644
- // Attempts to compute the most appropriate format if not explicitly specified with `titleFormat`.
6645
- function computeTitleFormat(dateProfile) {
6646
- var currentRangeUnit = dateProfile.currentRangeUnit;
6647
- if (currentRangeUnit === 'year') {
6648
- return { year: 'numeric' };
6649
- }
6650
- else if (currentRangeUnit === 'month') {
6651
- return { year: 'numeric', month: 'long' }; // like "September 2014"
6652
- }
6653
- else {
6654
- var days = diffWholeDays(dateProfile.currentRange.start, dateProfile.currentRange.end);
6655
- if (days !== null && days > 1) {
6656
- // multi-day range. shorter, like "Sep 9 - 10 2014"
6657
- return { year: 'numeric', month: 'short', day: 'numeric' };
6658
- }
6659
- else {
6660
- // one day. longer, like "September 9 2014"
6661
- return { year: 'numeric', month: 'long', day: 'numeric' };
6662
- }
6663
- }
6664
- }
6665
- // Plugin
6666
- // -----------------------------------------------------------------------------------------------------------------
6667
- function buildViewPropTransformers(theClasses) {
6668
- return theClasses.map(function (theClass) {
6669
- return new theClass();
6670
- });
6671
- }
6672
 
6673
- var Interaction = /** @class */ (function () {
6674
- function Interaction(settings) {
6675
- this.component = settings.component;
6676
- }
6677
- Interaction.prototype.destroy = function () {
6678
- };
6679
- return Interaction;
6680
- }());
6681
- function parseInteractionSettings(component, input) {
6682
- return {
6683
- component: component,
6684
- el: input.el,
6685
- useEventCenter: input.useEventCenter != null ? input.useEventCenter : true
6686
- };
6687
- }
6688
- function interactionSettingsToStore(settings) {
6689
- var _a;
6690
- return _a = {},
6691
- _a[settings.component.uid] = settings,
6692
- _a;
6693
- }
6694
- // global state
6695
- var interactionSettingsStore = {};
6696
 
6697
- /*
6698
- Detects when the user clicks on an event within a DateComponent
6699
- */
6700
- var EventClicking = /** @class */ (function (_super) {
6701
- __extends(EventClicking, _super);
6702
- function EventClicking(settings) {
6703
- var _this = _super.call(this, settings) || this;
6704
- _this.handleSegClick = function (ev, segEl) {
6705
- var component = _this.component;
6706
- var seg = getElSeg(segEl);
6707
- if (seg && // might be the <div> surrounding the more link
6708
- component.isValidSegDownEl(ev.target)) {
6709
- // our way to simulate a link click for elements that can't be <a> tags
6710
- // grab before trigger fired in case trigger trashes DOM thru rerendering
6711
- var hasUrlContainer = elementClosest(ev.target, '.fc-has-url');
6712
- var url = hasUrlContainer ? hasUrlContainer.querySelector('a[href]').href : '';
6713
- component.publiclyTrigger('eventClick', [
6714
- {
6715
- el: segEl,
6716
- event: new EventApi(component.calendar, seg.eventRange.def, seg.eventRange.instance),
6717
- jsEvent: ev,
6718
- view: component.view
6719
- }
6720
- ]);
6721
- if (url && !ev.defaultPrevented) {
6722
- window.location.href = url;
6723
- }
6724
- }
6725
- };
6726
- var component = settings.component;
6727
- _this.destroy = listenBySelector(component.el, 'click', component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegClick);
6728
- return _this;
6729
- }
6730
- return EventClicking;
6731
- }(Interaction));
6732
 
6733
- /*
6734
- Triggers events and adds/removes core classNames when the user's pointer
6735
- enters/leaves event-elements of a component.
6736
- */
6737
- var EventHovering = /** @class */ (function (_super) {
6738
- __extends(EventHovering, _super);
6739
- function EventHovering(settings) {
6740
- var _this = _super.call(this, settings) || this;
6741
- // for simulating an eventMouseLeave when the event el is destroyed while mouse is over it
6742
- _this.handleEventElRemove = function (el) {
6743
- if (el === _this.currentSegEl) {
6744
- _this.handleSegLeave(null, _this.currentSegEl);
6745
- }
6746
- };
6747
- _this.handleSegEnter = function (ev, segEl) {
6748
- if (getElSeg(segEl)) { // TODO: better way to make sure not hovering over more+ link or its wrapper
6749
- segEl.classList.add('fc-allow-mouse-resize');
6750
- _this.currentSegEl = segEl;
6751
- _this.triggerEvent('eventMouseEnter', ev, segEl);
6752
- }
6753
- };
6754
- _this.handleSegLeave = function (ev, segEl) {
6755
- if (_this.currentSegEl) {
6756
- segEl.classList.remove('fc-allow-mouse-resize');
6757
- _this.currentSegEl = null;
6758
- _this.triggerEvent('eventMouseLeave', ev, segEl);
6759
- }
6760
- };
6761
- var component = settings.component;
6762
- _this.removeHoverListeners = listenToHoverBySelector(component.el, component.fgSegSelector + ',' + component.bgSegSelector, _this.handleSegEnter, _this.handleSegLeave);
6763
- component.calendar.on('eventElRemove', _this.handleEventElRemove);
6764
- return _this;
6765
- }
6766
- EventHovering.prototype.destroy = function () {
6767
- this.removeHoverListeners();
6768
- this.component.calendar.off('eventElRemove', this.handleEventElRemove);
6769
- };
6770
- EventHovering.prototype.triggerEvent = function (publicEvName, ev, segEl) {
6771
- var component = this.component;
6772
- var seg = getElSeg(segEl);
6773
- if (!ev || component.isValidSegDownEl(ev.target)) {
6774
- component.publiclyTrigger(publicEvName, [
6775
- {
6776
- el: segEl,
6777
- event: new EventApi(this.component.calendar, seg.eventRange.def, seg.eventRange.instance),
6778
- jsEvent: ev,
6779
- view: component.view
6780
- }
6781
- ]);
6782
- }
6783
- };
6784
- return EventHovering;
6785
- }(Interaction));
6786
 
6787
- var StandardTheme = /** @class */ (function (_super) {
6788
- __extends(StandardTheme, _super);
6789
- function StandardTheme() {
6790
- return _super !== null && _super.apply(this, arguments) || this;
6791
- }
6792
- return StandardTheme;
6793
- }(Theme));
6794
- StandardTheme.prototype.classes = {
6795
- widget: 'fc-unthemed',
6796
- widgetHeader: 'fc-widget-header',
6797
- widgetContent: 'fc-widget-content',
6798
- buttonGroup: 'fc-button-group',
6799
- button: 'fc-button fc-button-primary',
6800
- buttonActive: 'fc-button-active',
6801
- popoverHeader: 'fc-widget-header',
6802
- popoverContent: 'fc-widget-content',
6803
- // day grid
6804
- headerRow: 'fc-widget-header',
6805
- dayRow: 'fc-widget-content',
6806
- // list view
6807
- listView: 'fc-widget-content'
6808
- };
6809
- StandardTheme.prototype.baseIconClass = 'fc-icon';
6810
- StandardTheme.prototype.iconClasses = {
6811
- close: 'fc-icon-x',
6812
- prev: 'fc-icon-chevron-left',
6813
- next: 'fc-icon-chevron-right',
6814
- prevYear: 'fc-icon-chevrons-left',
6815
- nextYear: 'fc-icon-chevrons-right'
6816
- };
6817
- StandardTheme.prototype.iconOverrideOption = 'buttonIcons';
6818
- StandardTheme.prototype.iconOverrideCustomButtonOption = 'icon';
6819
- StandardTheme.prototype.iconOverridePrefix = 'fc-icon-';
6820
-
6821
- var Calendar = /** @class */ (function () {
6822
- function Calendar(el, overrides) {
6823
- var _this = this;
6824
- this.parseRawLocales = memoize(parseRawLocales);
6825
- this.buildLocale = memoize(buildLocale);
6826
- this.buildDateEnv = memoize(buildDateEnv);
6827
- this.buildTheme = memoize(buildTheme);
6828
- this.buildEventUiSingleBase = memoize(this._buildEventUiSingleBase);
6829
- this.buildSelectionConfig = memoize(this._buildSelectionConfig);
6830
- this.buildEventUiBySource = memoizeOutput(buildEventUiBySource, isPropsEqual);
6831
- this.buildEventUiBases = memoize(buildEventUiBases);
6832
- this.interactionsStore = {};
6833
- this.actionQueue = [];
6834
- this.isReducing = false;
6835
- // isDisplaying: boolean = false // installed in DOM? accepting renders?
6836
- this.needsRerender = false; // needs a render?
6837
- this.needsFullRerender = false;
6838
- this.isRendering = false; // currently in the executeRender function?
6839
- this.renderingPauseDepth = 0;
6840
- this.buildDelayedRerender = memoize(buildDelayedRerender);
6841
- this.afterSizingTriggers = {};
6842
- this.isViewUpdated = false;
6843
- this.isDatesUpdated = false;
6844
- this.isEventsUpdated = false;
6845
- this.el = el;
6846
- this.optionsManager = new OptionsManager(overrides || {});
6847
- this.pluginSystem = new PluginSystem();
6848
- // only do once. don't do in handleOptions. because can't remove plugins
6849
- this.addPluginInputs(this.optionsManager.computed.plugins || []);
6850
- this.handleOptions(this.optionsManager.computed);
6851
- this.publiclyTrigger('_init'); // for tests
6852
- this.hydrate();
6853
- this.calendarInteractions = this.pluginSystem.hooks.calendarInteractions
6854
- .map(function (calendarInteractionClass) {
6855
- return new calendarInteractionClass(_this);
6856
- });
6857
- }
6858
- Calendar.prototype.addPluginInputs = function (pluginInputs) {
6859
- var pluginDefs = refinePluginDefs(pluginInputs);
6860
- for (var _i = 0, pluginDefs_1 = pluginDefs; _i < pluginDefs_1.length; _i++) {
6861
- var pluginDef = pluginDefs_1[_i];
6862
- this.pluginSystem.add(pluginDef);
6863
- }
6864
- };
6865
- Object.defineProperty(Calendar.prototype, "view", {
6866
- // public API
6867
- get: function () {
6868
- return this.component ? this.component.view : null;
6869
- },
6870
- enumerable: true,
6871
- configurable: true
6872
- });
6873
- // Public API for rendering
6874
- // -----------------------------------------------------------------------------------------------------------------
6875
- Calendar.prototype.render = function () {
6876
- if (!this.component) {
6877
- this.renderableEventStore = createEmptyEventStore();
6878
- this.bindHandlers();
6879
- this.executeRender();
6880
- }
6881
- else {
6882
- this.requestRerender(true);
6883
- }
6884
- };
6885
- Calendar.prototype.destroy = function () {
6886
- if (this.component) {
6887
- this.unbindHandlers();
6888
- this.component.destroy(); // don't null-out. in case API needs access
6889
- this.component = null; // umm ???
6890
- for (var _i = 0, _a = this.calendarInteractions; _i < _a.length; _i++) {
6891
- var interaction = _a[_i];
6892
- interaction.destroy();
6893
- }
6894
- this.publiclyTrigger('_destroyed');
6895
- }
6896
- };
6897
- // Handlers
6898
- // -----------------------------------------------------------------------------------------------------------------
6899
- Calendar.prototype.bindHandlers = function () {
6900
- var _this = this;
6901
- // event delegation for nav links
6902
- this.removeNavLinkListener = listenBySelector(this.el, 'click', 'a[data-goto]', function (ev, anchorEl) {
6903
- var gotoOptions = anchorEl.getAttribute('data-goto');
6904
- gotoOptions = gotoOptions ? JSON.parse(gotoOptions) : {};
6905
- var dateEnv = _this.dateEnv;
6906
- var dateMarker = dateEnv.createMarker(gotoOptions.date);
6907
- var viewType = gotoOptions.type;
6908
- // property like "navLinkDayClick". might be a string or a function
6909
- var customAction = _this.viewOpt('navLink' + capitaliseFirstLetter(viewType) + 'Click');
6910
- if (typeof customAction === 'function') {
6911
- customAction(dateEnv.toDate(dateMarker), ev);
6912
- }
6913
- else {
6914
- if (typeof customAction === 'string') {
6915
- viewType = customAction;
6916
- }
6917
- _this.zoomTo(dateMarker, viewType);
6918
- }
6919
- });
6920
- if (this.opt('handleWindowResize')) {
6921
- window.addEventListener('resize', this.windowResizeProxy = debounce(// prevents rapid calls
6922
- this.windowResize.bind(this), this.opt('windowResizeDelay')));
6923
- }
6924
- };
6925
- Calendar.prototype.unbindHandlers = function () {
6926
- this.removeNavLinkListener();
6927
- if (this.windowResizeProxy) {
6928
- window.removeEventListener('resize', this.windowResizeProxy);
6929
- this.windowResizeProxy = null;
6930
- }
6931
- };
6932
- // Dispatcher
6933
- // -----------------------------------------------------------------------------------------------------------------
6934
- Calendar.prototype.hydrate = function () {
6935
- var _this = this;
6936
- this.state = this.buildInitialState();
6937
- var rawSources = this.opt('eventSources') || [];
6938
- var singleRawSource = this.opt('events');
6939
- var sources = []; // parsed
6940
- if (singleRawSource) {
6941
- rawSources.unshift(singleRawSource);
6942
- }
6943
- for (var _i = 0, rawSources_1 = rawSources; _i < rawSources_1.length; _i++) {
6944
- var rawSource = rawSources_1[_i];
6945
- var source = parseEventSource(rawSource, this);
6946
- if (source) {
6947
- sources.push(source);
6948
- }
6949
- }
6950
- this.batchRendering(function () {
6951
- _this.dispatch({ type: 'INIT' }); // pass in sources here?
6952
- _this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: sources });
6953
- _this.dispatch({
6954
- type: 'SET_VIEW_TYPE',
6955
- viewType: _this.opt('defaultView') || _this.pluginSystem.hooks.defaultView
6956
- });
6957
- });
6958
- };
6959
- Calendar.prototype.buildInitialState = function () {
6960
- return {
6961
- viewType: null,
6962
- loadingLevel: 0,
6963
- eventSourceLoadingLevel: 0,
6964
- currentDate: this.getInitialDate(),
6965
- dateProfile: null,
6966
- eventSources: {},
6967
- eventStore: createEmptyEventStore(),
6968
- dateSelection: null,
6969
- eventSelection: '',
6970
- eventDrag: null,
6971
- eventResize: null
6972
- };
6973
- };
6974
- Calendar.prototype.dispatch = function (action) {
6975
- this.actionQueue.push(action);
6976
- if (!this.isReducing) {
6977
- this.isReducing = true;
6978
- var oldState = this.state;
6979
- while (this.actionQueue.length) {
6980
- this.state = this.reduce(this.state, this.actionQueue.shift(), this);
6981
- }
6982
- var newState = this.state;
6983
- this.isReducing = false;
6984
- if (!oldState.loadingLevel && newState.loadingLevel) {
6985
- this.publiclyTrigger('loading', [true]);
6986
- }
6987
- else if (oldState.loadingLevel && !newState.loadingLevel) {
6988
- this.publiclyTrigger('loading', [false]);
6989
- }
6990
- var view = this.component && this.component.view;
6991
- if (oldState.eventStore !== newState.eventStore || this.needsFullRerender) {
6992
- if (oldState.eventStore) {
6993
- this.isEventsUpdated = true;
6994
- }
6995
- }
6996
- if (oldState.dateProfile !== newState.dateProfile || this.needsFullRerender) {
6997
- if (oldState.dateProfile && view) { // why would view be null!?
6998
- this.publiclyTrigger('datesDestroy', [
6999
- {
7000
- view: view,
7001
- el: view.el
7002
- }
7003
- ]);
7004
- }
7005
- this.isDatesUpdated = true;
7006
- }
7007
- if (oldState.viewType !== newState.viewType || this.needsFullRerender) {
7008
- if (oldState.viewType && view) { // why would view be null!?
7009
- this.publiclyTrigger('viewSkeletonDestroy', [
7010
- {
7011
- view: view,
7012
- el: view.el
7013
- }
7014
- ]);
7015
- }
7016
- this.isViewUpdated = true;
7017
- }
7018
- this.requestRerender();
7019
- }
7020
- };
7021
- Calendar.prototype.reduce = function (state, action, calendar) {
7022
- return reduce(state, action, calendar);
7023
- };
7024
- // Render Queue
7025
- // -----------------------------------------------------------------------------------------------------------------
7026
- Calendar.prototype.requestRerender = function (needsFull) {
7027
- if (needsFull === void 0) { needsFull = false; }
7028
- this.needsRerender = true;
7029
- this.needsFullRerender = this.needsFullRerender || needsFull;
7030
- this.delayedRerender(); // will call a debounced-version of tryRerender
7031
- };
7032
- Calendar.prototype.tryRerender = function () {
7033
- if (this.component && // must be accepting renders
7034
- this.needsRerender && // indicates that a rerender was requested
7035
- !this.renderingPauseDepth && // not paused
7036
- !this.isRendering // not currently in the render loop
7037
- ) {
7038
- this.executeRender();
7039
- }
7040
- };
7041
- Calendar.prototype.batchRendering = function (func) {
7042
- this.renderingPauseDepth++;
7043
- func();
7044
- this.renderingPauseDepth--;
7045
- if (this.needsRerender) {
7046
- this.requestRerender();
7047
- }
7048
- };
7049
- // Rendering
7050
- // -----------------------------------------------------------------------------------------------------------------
7051
- Calendar.prototype.executeRender = function () {
7052
- var needsFullRerender = this.needsFullRerender; // save before clearing
7053
- // clear these BEFORE the render so that new values will accumulate during render
7054
- this.needsRerender = false;
7055
- this.needsFullRerender = false;
7056
- this.isRendering = true;
7057
- this.renderComponent(needsFullRerender);
7058
- this.isRendering = false;
7059
- // received a rerender request while rendering
7060
- if (this.needsRerender) {
7061
- this.delayedRerender();
7062
- }
7063
- };
7064
- /*
7065
- don't call this directly. use executeRender instead
7066
- */
7067
- Calendar.prototype.renderComponent = function (needsFull) {
7068
- var _a = this, state = _a.state, component = _a.component;
7069
- var viewType = state.viewType;
7070
- var viewSpec = this.viewSpecs[viewType];
7071
- var savedScroll = (needsFull && component) ? component.view.queryScroll() : null;
7072
- if (!viewSpec) {
7073
- throw new Error("View type \"" + viewType + "\" is not valid");
7074
- }
7075
- // if event sources are still loading and progressive rendering hasn't been enabled,
7076
- // keep rendering the last fully loaded set of events
7077
- var renderableEventStore = this.renderableEventStore =
7078
- (state.eventSourceLoadingLevel && !this.opt('progressiveEventRendering')) ?
7079
- this.renderableEventStore :
7080
- state.eventStore;
7081
- var eventUiSingleBase = this.buildEventUiSingleBase(viewSpec.options);
7082
- var eventUiBySource = this.buildEventUiBySource(state.eventSources);
7083
- var eventUiBases = this.eventUiBases = this.buildEventUiBases(renderableEventStore.defs, eventUiSingleBase, eventUiBySource);
7084
- if (needsFull || !component) {
7085
- if (component) {
7086
- component.freezeHeight(); // next component will unfreeze it
7087
- component.destroy();
7088
- }
7089
- component = this.component = new CalendarComponent({
7090
- calendar: this,
7091
- view: null,
7092
- dateEnv: this.dateEnv,
7093
- theme: this.theme,
7094
- options: this.optionsManager.computed
7095
- }, this.el);
7096
- this.isViewUpdated = true;
7097
- this.isDatesUpdated = true;
7098
- this.isEventsUpdated = true;
7099
- }
7100
- component.receiveProps(__assign({}, state, { viewSpec: viewSpec, dateProfile: state.dateProfile, dateProfileGenerator: this.dateProfileGenerators[viewType], eventStore: renderableEventStore, eventUiBases: eventUiBases, dateSelection: state.dateSelection, eventSelection: state.eventSelection, eventDrag: state.eventDrag, eventResize: state.eventResize }));
7101
- if (savedScroll) {
7102
- component.view.applyScroll(savedScroll, false);
7103
- }
7104
- if (this.isViewUpdated) {
7105
- this.isViewUpdated = false;
7106
- this.publiclyTrigger('viewSkeletonRender', [
7107
- {
7108
- view: component.view,
7109
- el: component.view.el
7110
- }
7111
- ]);
7112
- }
7113
- if (this.isDatesUpdated) {
7114
- this.isDatesUpdated = false;
7115
- this.publiclyTrigger('datesRender', [
7116
- {
7117
- view: component.view,
7118
- el: component.view.el
7119
- }
7120
- ]);
7121
- }
7122
- if (this.isEventsUpdated) {
7123
- this.isEventsUpdated = false;
7124
- }
7125
- this.releaseAfterSizingTriggers();
7126
- };
7127
- // Options
7128
- // -----------------------------------------------------------------------------------------------------------------
7129
- Calendar.prototype.setOption = function (name, val) {
7130
- var _a;
7131
- this.mutateOptions((_a = {}, _a[name] = val, _a), [], true);
7132
- };
7133
- Calendar.prototype.getOption = function (name) {
7134
- return this.optionsManager.computed[name];
7135
- };
7136
- Calendar.prototype.opt = function (name) {
7137
- return this.optionsManager.computed[name];
7138
- };
7139
- Calendar.prototype.viewOpt = function (name) {
7140
- return this.viewOpts()[name];
7141
- };
7142
- Calendar.prototype.viewOpts = function () {
7143
- return this.viewSpecs[this.state.viewType].options;
7144
- };
7145
- /*
7146
- handles option changes (like a diff)
7147
- */
7148
- Calendar.prototype.mutateOptions = function (updates, removals, isDynamic, deepEqual) {
7149
- var _this = this;
7150
- var changeHandlers = this.pluginSystem.hooks.optionChangeHandlers;
7151
- var normalUpdates = {};
7152
- var specialUpdates = {};
7153
- var oldDateEnv = this.dateEnv; // do this before handleOptions
7154
- var isTimeZoneDirty = false;
7155
- var isSizeDirty = false;
7156
- var anyDifficultOptions = Boolean(removals.length);
7157
- for (var name_1 in updates) {
7158
- if (changeHandlers[name_1]) {
7159
- specialUpdates[name_1] = updates[name_1];
7160
- }
7161
- else {
7162
- normalUpdates[name_1] = updates[name_1];
7163
- }
7164
- }
7165
- for (var name_2 in normalUpdates) {
7166
- if (/^(height|contentHeight|aspectRatio)$/.test(name_2)) {
7167
- isSizeDirty = true;
7168
- }
7169
- else if (/^(defaultDate|defaultView)$/.test(name_2)) ;
7170
- else {
7171
- anyDifficultOptions = true;
7172
- if (name_2 === 'timeZone') {
7173
- isTimeZoneDirty = true;
7174
- }
7175
- }
7176
- }
7177
- this.optionsManager.mutate(normalUpdates, removals, isDynamic);
7178
- if (anyDifficultOptions) {
7179
- this.handleOptions(this.optionsManager.computed);
7180
- this.needsFullRerender = true;
7181
- }
7182
- this.batchRendering(function () {
7183
- if (anyDifficultOptions) {
7184
- if (isTimeZoneDirty) {
7185
- _this.dispatch({
7186
- type: 'CHANGE_TIMEZONE',
7187
- oldDateEnv: oldDateEnv
7188
- });
7189
- }
7190
- /* HACK
7191
- has the same effect as calling this.requestRerender(true)
7192
- but recomputes the state's dateProfile
7193
- */
7194
- _this.dispatch({
7195
- type: 'SET_VIEW_TYPE',
7196
- viewType: _this.state.viewType
7197
- });
7198
- }
7199
- else if (isSizeDirty) {
7200
- _this.updateSize();
7201
- }
7202
- // special updates
7203
- if (deepEqual) {
7204
- for (var name_3 in specialUpdates) {
7205
- changeHandlers[name_3](specialUpdates[name_3], _this, deepEqual);
7206
- }
7207
- }
7208
- });
7209
- };
7210
- /*
7211
- rebuilds things based off of a complete set of refined options
7212
- */
7213
- Calendar.prototype.handleOptions = function (options) {
7214
- var _this = this;
7215
- var pluginHooks = this.pluginSystem.hooks;
7216
- this.defaultAllDayEventDuration = createDuration(options.defaultAllDayEventDuration);
7217
- this.defaultTimedEventDuration = createDuration(options.defaultTimedEventDuration);
7218
- this.delayedRerender = this.buildDelayedRerender(options.rerenderDelay);
7219
- this.theme = this.buildTheme(options);
7220
- var available = this.parseRawLocales(options.locales);
7221
- this.availableRawLocales = available.map;
7222
- var locale = this.buildLocale(options.locale || available.defaultCode, available.map);
7223
- this.dateEnv = this.buildDateEnv(locale, options.timeZone, pluginHooks.namedTimeZonedImpl, options.firstDay, options.weekNumberCalculation, options.weekLabel, pluginHooks.cmdFormatter);
7224
- this.selectionConfig = this.buildSelectionConfig(options); // needs dateEnv. do after :(
7225
- // ineffecient to do every time?
7226
- this.viewSpecs = buildViewSpecs(pluginHooks.views, this.optionsManager);
7227
- // ineffecient to do every time?
7228
- this.dateProfileGenerators = mapHash(this.viewSpecs, function (viewSpec) {
7229
- return new viewSpec.class.prototype.dateProfileGeneratorClass(viewSpec, _this);
7230
- });
7231
- };
7232
- Calendar.prototype.getAvailableLocaleCodes = function () {
7233
- return Object.keys(this.availableRawLocales);
7234
- };
7235
- Calendar.prototype._buildSelectionConfig = function (rawOpts) {
7236
- return processScopedUiProps('select', rawOpts, this);
7237
- };
7238
- Calendar.prototype._buildEventUiSingleBase = function (rawOpts) {
7239
- if (rawOpts.editable) { // so 'editable' affected events
7240
- rawOpts = __assign({}, rawOpts, { eventEditable: true });
7241
- }
7242
- return processScopedUiProps('event', rawOpts, this);
7243
- };
7244
- // Trigger
7245
- // -----------------------------------------------------------------------------------------------------------------
7246
- Calendar.prototype.hasPublicHandlers = function (name) {
7247
- return this.hasHandlers(name) ||
7248
- this.opt(name); // handler specified in options
7249
- };
7250
- Calendar.prototype.publiclyTrigger = function (name, args) {
7251
- var optHandler = this.opt(name);
7252
- this.triggerWith(name, this, args);
7253
- if (optHandler) {
7254
- return optHandler.apply(this, args);
7255
- }
7256
- };
7257
- Calendar.prototype.publiclyTriggerAfterSizing = function (name, args) {
7258
- var afterSizingTriggers = this.afterSizingTriggers;
7259
- (afterSizingTriggers[name] || (afterSizingTriggers[name] = [])).push(args);
7260
- };
7261
- Calendar.prototype.releaseAfterSizingTriggers = function () {
7262
- var afterSizingTriggers = this.afterSizingTriggers;
7263
- for (var name_4 in afterSizingTriggers) {
7264
- for (var _i = 0, _a = afterSizingTriggers[name_4]; _i < _a.length; _i++) {
7265
- var args = _a[_i];
7266
- this.publiclyTrigger(name_4, args);
7267
- }
7268
- }
7269
- this.afterSizingTriggers = {};
7270
- };
7271
- // View
7272
- // -----------------------------------------------------------------------------------------------------------------
7273
- // Returns a boolean about whether the view is okay to instantiate at some point
7274
- Calendar.prototype.isValidViewType = function (viewType) {
7275
- return Boolean(this.viewSpecs[viewType]);
7276
- };
7277
- Calendar.prototype.changeView = function (viewType, dateOrRange) {
7278
- var dateMarker = null;
7279
- if (dateOrRange) {
7280
- if (dateOrRange.start && dateOrRange.end) { // a range
7281
- this.optionsManager.mutate({ visibleRange: dateOrRange }, []); // will not rerender
7282
- this.handleOptions(this.optionsManager.computed); // ...but yuck
7283
- }
7284
- else { // a date
7285
- dateMarker = this.dateEnv.createMarker(dateOrRange); // just like gotoDate
7286
- }
7287
- }
7288
- this.unselect();
7289
- this.dispatch({
7290
- type: 'SET_VIEW_TYPE',
7291
- viewType: viewType,
7292
- dateMarker: dateMarker
7293
- });
7294
- };
7295
- // Forces navigation to a view for the given date.
7296
- // `viewType` can be a specific view name or a generic one like "week" or "day".
7297
- // needs to change
7298
- Calendar.prototype.zoomTo = function (dateMarker, viewType) {
7299
- var spec;
7300
- viewType = viewType || 'day'; // day is default zoom
7301
- spec = this.viewSpecs[viewType] ||
7302
- this.getUnitViewSpec(viewType);
7303
- this.unselect();
7304
- if (spec) {
7305
- this.dispatch({
7306
- type: 'SET_VIEW_TYPE',
7307
- viewType: spec.type,
7308
- dateMarker: dateMarker
7309
- });
7310
- }
7311
- else {
7312
- this.dispatch({
7313
- type: 'SET_DATE',
7314
- dateMarker: dateMarker
7315
- });
7316
- }
7317
- };
7318
- // Given a duration singular unit, like "week" or "day", finds a matching view spec.
7319
- // Preference is given to views that have corresponding buttons.
7320
- Calendar.prototype.getUnitViewSpec = function (unit) {
7321
- var component = this.component;
7322
- var viewTypes = [];
7323
- var i;
7324
- var spec;
7325
- // put views that have buttons first. there will be duplicates, but oh
7326
- if (component.header) {
7327
- viewTypes.push.apply(viewTypes, component.header.viewsWithButtons);
7328
- }
7329
- if (component.footer) {
7330
- viewTypes.push.apply(viewTypes, component.footer.viewsWithButtons);
7331
- }
7332
- for (var viewType in this.viewSpecs) {
7333
- viewTypes.push(viewType);
7334
- }
7335
- for (i = 0; i < viewTypes.length; i++) {
7336
- spec = this.viewSpecs[viewTypes[i]];
7337
- if (spec) {
7338
- if (spec.singleUnit === unit) {
7339
- return spec;
7340
- }
7341
- }
7342
- }
7343
- };
7344
- // Current Date
7345
- // -----------------------------------------------------------------------------------------------------------------
7346
- Calendar.prototype.getInitialDate = function () {
7347
- var defaultDateInput = this.opt('defaultDate');
7348
- // compute the initial ambig-timezone date
7349
- if (defaultDateInput != null) {
7350
- return this.dateEnv.createMarker(defaultDateInput);
7351
- }
7352
- else {
7353
- return this.getNow(); // getNow already returns unzoned
7354
- }
7355
- };
7356
- Calendar.prototype.prev = function () {
7357
- this.unselect();
7358
- this.dispatch({ type: 'PREV' });
7359
- };
7360
- Calendar.prototype.next = function () {
7361
- this.unselect();
7362
- this.dispatch({ type: 'NEXT' });
7363
- };
7364
- Calendar.prototype.prevYear = function () {
7365
- this.unselect();
7366
- this.dispatch({
7367
- type: 'SET_DATE',
7368
- dateMarker: this.dateEnv.addYears(this.state.currentDate, -1)
7369
- });
7370
- };
7371
- Calendar.prototype.nextYear = function () {
7372
- this.unselect();
7373
- this.dispatch({
7374
- type: 'SET_DATE',
7375
- dateMarker: this.dateEnv.addYears(this.state.currentDate, 1)
7376
- });
7377
- };
7378
- Calendar.prototype.today = function () {
7379
- this.unselect();
7380
- this.dispatch({
7381
- type: 'SET_DATE',
7382
- dateMarker: this.getNow()
7383
- });
7384
- };
7385
- Calendar.prototype.gotoDate = function (zonedDateInput) {
7386
- this.unselect();
7387
- this.dispatch({
7388
- type: 'SET_DATE',
7389
- dateMarker: this.dateEnv.createMarker(zonedDateInput)
7390
- });
7391
- };
7392
- Calendar.prototype.incrementDate = function (deltaInput) {
7393
- var delta = createDuration(deltaInput);
7394
- if (delta) { // else, warn about invalid input?
7395
- this.unselect();
7396
- this.dispatch({
7397
- type: 'SET_DATE',
7398
- dateMarker: this.dateEnv.add(this.state.currentDate, delta)
7399
- });
7400
- }
7401
- };
7402
- // for external API
7403
- Calendar.prototype.getDate = function () {
7404
- return this.dateEnv.toDate(this.state.currentDate);
7405
- };
7406
- // Date Formatting Utils
7407
- // -----------------------------------------------------------------------------------------------------------------
7408
- Calendar.prototype.formatDate = function (d, formatter) {
7409
- var dateEnv = this.dateEnv;
7410
- return dateEnv.format(dateEnv.createMarker(d), createFormatter(formatter));
7411
- };
7412
- // `settings` is for formatter AND isEndExclusive
7413
- Calendar.prototype.formatRange = function (d0, d1, settings) {
7414
- var dateEnv = this.dateEnv;
7415
- return dateEnv.formatRange(dateEnv.createMarker(d0), dateEnv.createMarker(d1), createFormatter(settings, this.opt('defaultRangeSeparator')), settings);
7416
- };
7417
- Calendar.prototype.formatIso = function (d, omitTime) {
7418
- var dateEnv = this.dateEnv;
7419
- return dateEnv.formatIso(dateEnv.createMarker(d), { omitTime: omitTime });
7420
- };
7421
- // Sizing
7422
- // -----------------------------------------------------------------------------------------------------------------
7423
- Calendar.prototype.windowResize = function (ev) {
7424
- if (!this.isHandlingWindowResize &&
7425
- this.component && // why?
7426
- ev.target === window // not a jqui resize event
7427
- ) {
7428
- this.isHandlingWindowResize = true;
7429
- this.updateSize();
7430
- this.publiclyTrigger('windowResize', [this.view]);
7431
- this.isHandlingWindowResize = false;
7432
- }
7433
- };
7434
- Calendar.prototype.updateSize = function () {
7435
- if (this.component) { // when?
7436
- this.component.updateSize(true);
7437
- }
7438
- };
7439
- // Component Registration
7440
- // -----------------------------------------------------------------------------------------------------------------
7441
- Calendar.prototype.registerInteractiveComponent = function (component, settingsInput) {
7442
- var settings = parseInteractionSettings(component, settingsInput);
7443
- var DEFAULT_INTERACTIONS = [
7444
- EventClicking,
7445
- EventHovering
7446
- ];
7447
- var interactionClasses = DEFAULT_INTERACTIONS.concat(this.pluginSystem.hooks.componentInteractions);
7448
- var interactions = interactionClasses.map(function (interactionClass) {
7449
- return new interactionClass(settings);
7450
- });
7451
- this.interactionsStore[component.uid] = interactions;
7452
- interactionSettingsStore[component.uid] = settings;
7453
- };
7454
- Calendar.prototype.unregisterInteractiveComponent = function (component) {
7455
- for (var _i = 0, _a = this.interactionsStore[component.uid]; _i < _a.length; _i++) {
7456
- var listener = _a[_i];
7457
- listener.destroy();
7458
- }
7459
- delete this.interactionsStore[component.uid];
7460
- delete interactionSettingsStore[component.uid];
7461
- };
7462
- // Date Selection / Event Selection / DayClick
7463
- // -----------------------------------------------------------------------------------------------------------------
7464
- // this public method receives start/end dates in any format, with any timezone
7465
- // NOTE: args were changed from v3
7466
- Calendar.prototype.select = function (dateOrObj, endDate) {
7467
- var selectionInput;
7468
- if (endDate == null) {
7469
- if (dateOrObj.start != null) {
7470
- selectionInput = dateOrObj;
7471
- }
7472
- else {
7473
- selectionInput = {
7474
- start: dateOrObj,
7475
- end: null
7476
- };
7477
- }
7478
- }
7479
- else {
7480
- selectionInput = {
7481
- start: dateOrObj,
7482
- end: endDate
7483
- };
7484
- }
7485
- var selection = parseDateSpan(selectionInput, this.dateEnv, createDuration({ days: 1 }) // TODO: cache this?
7486
- );
7487
- if (selection) { // throw parse error otherwise?
7488
- this.dispatch({ type: 'SELECT_DATES', selection: selection });
7489
- this.triggerDateSelect(selection);
7490
- }
7491
- };
7492
- // public method
7493
- Calendar.prototype.unselect = function (pev) {
7494
- if (this.state.dateSelection) {
7495
- this.dispatch({ type: 'UNSELECT_DATES' });
7496
- this.triggerDateUnselect(pev);
7497
- }
7498
- };
7499
- Calendar.prototype.triggerDateSelect = function (selection, pev) {
7500
- var arg = __assign({}, this.buildDateSpanApi(selection), { jsEvent: pev ? pev.origEvent : null, view: this.view });
7501
- this.publiclyTrigger('select', [arg]);
7502
- };
7503
- Calendar.prototype.triggerDateUnselect = function (pev) {
7504
- this.publiclyTrigger('unselect', [
7505
- {
7506
- jsEvent: pev ? pev.origEvent : null,
7507
- view: this.view
7508
- }
7509
- ]);
7510
- };
7511
- // TODO: receive pev?
7512
- Calendar.prototype.triggerDateClick = function (dateSpan, dayEl, view, ev) {
7513
- var arg = __assign({}, this.buildDatePointApi(dateSpan), { dayEl: dayEl, jsEvent: ev, // Is this always a mouse event? See #4655
7514
- view: view });
7515
- this.publiclyTrigger('dateClick', [arg]);
7516
- };
7517
- Calendar.prototype.buildDatePointApi = function (dateSpan) {
7518
- var props = {};
7519
- for (var _i = 0, _a = this.pluginSystem.hooks.datePointTransforms; _i < _a.length; _i++) {
7520
- var transform = _a[_i];
7521
- __assign(props, transform(dateSpan, this));
7522
- }
7523
- __assign(props, buildDatePointApi(dateSpan, this.dateEnv));
7524
- return props;
7525
- };
7526
- Calendar.prototype.buildDateSpanApi = function (dateSpan) {
7527
- var props = {};
7528
- for (var _i = 0, _a = this.pluginSystem.hooks.dateSpanTransforms; _i < _a.length; _i++) {
7529
- var transform = _a[_i];
7530
- __assign(props, transform(dateSpan, this));
7531
- }
7532
- __assign(props, buildDateSpanApi(dateSpan, this.dateEnv));
7533
- return props;
7534
- };
7535
- // Date Utils
7536
- // -----------------------------------------------------------------------------------------------------------------
7537
- // Returns a DateMarker for the current date, as defined by the client's computer or from the `now` option
7538
- Calendar.prototype.getNow = function () {
7539
- var now = this.opt('now');
7540
- if (typeof now === 'function') {
7541
- now = now();
7542
- }
7543
- if (now == null) {
7544
- return this.dateEnv.createNowMarker();
7545
- }
7546
- return this.dateEnv.createMarker(now);
7547
- };
7548
- // Event-Date Utilities
7549
- // -----------------------------------------------------------------------------------------------------------------
7550
- // Given an event's allDay status and start date, return what its fallback end date should be.
7551
- // TODO: rename to computeDefaultEventEnd
7552
- Calendar.prototype.getDefaultEventEnd = function (allDay, marker) {
7553
- var end = marker;
7554
- if (allDay) {
7555
- end = startOfDay(end);
7556
- end = this.dateEnv.add(end, this.defaultAllDayEventDuration);
7557
- }
7558
- else {
7559
- end = this.dateEnv.add(end, this.defaultTimedEventDuration);
7560
- }
7561
- return end;
7562
- };
7563
- // Public Events API
7564
- // -----------------------------------------------------------------------------------------------------------------
7565
- Calendar.prototype.addEvent = function (eventInput, sourceInput) {
7566
- if (eventInput instanceof EventApi) {
7567
- var def = eventInput._def;
7568
- var instance = eventInput._instance;
7569
- // not already present? don't want to add an old snapshot
7570
- if (!this.state.eventStore.defs[def.defId]) {
7571
- this.dispatch({
7572
- type: 'ADD_EVENTS',
7573
- eventStore: eventTupleToStore({ def: def, instance: instance }) // TODO: better util for two args?
7574
- });
7575
- }
7576
- return eventInput;
7577
- }
7578
- var sourceId;
7579
- if (sourceInput instanceof EventSourceApi) {
7580
- sourceId = sourceInput.internalEventSource.sourceId;
7581
- }
7582
- else if (sourceInput != null) {
7583
- var sourceApi = this.getEventSourceById(sourceInput); // TODO: use an internal function
7584
- if (!sourceApi) {
7585
- console.warn('Could not find an event source with ID "' + sourceInput + '"'); // TODO: test
7586
- return null;
7587
- }
7588
- else {
7589
- sourceId = sourceApi.internalEventSource.sourceId;
7590
- }
7591
- }
7592
- var tuple = parseEvent(eventInput, sourceId, this);
7593
- if (tuple) {
7594
- this.dispatch({
7595
- type: 'ADD_EVENTS',
7596
- eventStore: eventTupleToStore(tuple)
7597
- });
7598
- return new EventApi(this, tuple.def, tuple.def.recurringDef ? null : tuple.instance);
7599
- }
7600
- return null;
7601
- };
7602
- // TODO: optimize
7603
- Calendar.prototype.getEventById = function (id) {
7604
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
7605
- id = String(id);
7606
- for (var defId in defs) {
7607
- var def = defs[defId];
7608
- if (def.publicId === id) {
7609
- if (def.recurringDef) {
7610
- return new EventApi(this, def, null);
7611
- }
7612
- else {
7613
- for (var instanceId in instances) {
7614
- var instance = instances[instanceId];
7615
- if (instance.defId === def.defId) {
7616
- return new EventApi(this, def, instance);
7617
- }
7618
- }
7619
- }
7620
- }
7621
- }
7622
- return null;
7623
- };
7624
- Calendar.prototype.getEvents = function () {
7625
- var _a = this.state.eventStore, defs = _a.defs, instances = _a.instances;
7626
- var eventApis = [];
7627
- for (var id in instances) {
7628
- var instance = instances[id];
7629
- var def = defs[instance.defId];
7630
- eventApis.push(new EventApi(this, def, instance));
7631
- }
7632
- return eventApis;
7633
- };
7634
- Calendar.prototype.removeAllEvents = function () {
7635
- this.dispatch({ type: 'REMOVE_ALL_EVENTS' });
7636
- };
7637
- Calendar.prototype.rerenderEvents = function () {
7638
- this.dispatch({ type: 'RESET_EVENTS' });
7639
- };
7640
- // Public Event Sources API
7641
- // -----------------------------------------------------------------------------------------------------------------
7642
- Calendar.prototype.getEventSources = function () {
7643
- var sourceHash = this.state.eventSources;
7644
- var sourceApis = [];
7645
- for (var internalId in sourceHash) {
7646
- sourceApis.push(new EventSourceApi(this, sourceHash[internalId]));
7647
- }
7648
- return sourceApis;
7649
- };
7650
- Calendar.prototype.getEventSourceById = function (id) {
7651
- var sourceHash = this.state.eventSources;
7652
- id = String(id);
7653
- for (var sourceId in sourceHash) {
7654
- if (sourceHash[sourceId].publicId === id) {
7655
- return new EventSourceApi(this, sourceHash[sourceId]);
7656
- }
7657
- }
7658
- return null;
7659
- };
7660
- Calendar.prototype.addEventSource = function (sourceInput) {
7661
- if (sourceInput instanceof EventSourceApi) {
7662
- // not already present? don't want to add an old snapshot
7663
- if (!this.state.eventSources[sourceInput.internalEventSource.sourceId]) {
7664
- this.dispatch({
7665
- type: 'ADD_EVENT_SOURCES',
7666
- sources: [sourceInput.internalEventSource]
7667
- });
7668
- }
7669
- return sourceInput;
7670
- }
7671
- var eventSource = parseEventSource(sourceInput, this);
7672
- if (eventSource) { // TODO: error otherwise?
7673
- this.dispatch({ type: 'ADD_EVENT_SOURCES', sources: [eventSource] });
7674
- return new EventSourceApi(this, eventSource);
7675
- }
7676
- return null;
7677
- };
7678
- Calendar.prototype.removeAllEventSources = function () {
7679
- this.dispatch({ type: 'REMOVE_ALL_EVENT_SOURCES' });
7680
- };
7681
- Calendar.prototype.refetchEvents = function () {
7682
- this.dispatch({ type: 'FETCH_EVENT_SOURCES' });
7683
- };
7684
- // Scroll
7685
- // -----------------------------------------------------------------------------------------------------------------
7686
- Calendar.prototype.scrollToTime = function (timeInput) {
7687
- var duration = createDuration(timeInput);
7688
- if (duration) {
7689
- this.component.view.scrollToDuration(duration);
7690
- }
7691
- };
7692
- return Calendar;
7693
- }());
7694
- EmitterMixin.mixInto(Calendar);
7695
- // for memoizers
7696
- // -----------------------------------------------------------------------------------------------------------------
7697
- function buildDateEnv(locale, timeZone, namedTimeZoneImpl, firstDay, weekNumberCalculation, weekLabel, cmdFormatter) {
7698
- return new DateEnv({
7699
- calendarSystem: 'gregory',
7700
- timeZone: timeZone,
7701
- namedTimeZoneImpl: namedTimeZoneImpl,
7702
- locale: locale,
7703
- weekNumberCalculation: weekNumberCalculation,
7704
- firstDay: firstDay,
7705
- weekLabel: weekLabel,
7706
- cmdFormatter: cmdFormatter
7707
- });
7708
- }
7709
- function buildTheme(calendarOptions) {
7710
- var themeClass = this.pluginSystem.hooks.themeClasses[calendarOptions.themeSystem] || StandardTheme;
7711
- return new themeClass(calendarOptions);
7712
- }
7713
- function buildDelayedRerender(wait) {
7714
- var func = this.tryRerender.bind(this);
7715
- if (wait != null) {
7716
- func = debounce(func, wait);
7717
- }
7718
- return func;
7719
- }
7720
- function buildEventUiBySource(eventSources) {
7721
- return mapHash(eventSources, function (eventSource) {
7722
- return eventSource.ui;
7723
- });
7724
- }
7725
- function buildEventUiBases(eventDefs, eventUiSingleBase, eventUiBySource) {
7726
- var eventUiBases = { '': eventUiSingleBase };
7727
- for (var defId in eventDefs) {
7728
- var def = eventDefs[defId];
7729
- if (def.sourceId && eventUiBySource[def.sourceId]) {
7730
- eventUiBases[defId] = eventUiBySource[def.sourceId];
7731
- }
7732
- }
7733
- return eventUiBases;
7734
- }
7735
-
7736
- var View = /** @class */ (function (_super) {
7737
- __extends(View, _super);
7738
- function View(context, viewSpec, dateProfileGenerator, parentEl) {
7739
- var _this = _super.call(this, context, createElement('div', { className: 'fc-view fc-' + viewSpec.type + '-view' }), true // isView (HACK)
7740
- ) || this;
7741
- _this.renderDatesMem = memoizeRendering(_this.renderDatesWrap, _this.unrenderDatesWrap);
7742
- _this.renderBusinessHoursMem = memoizeRendering(_this.renderBusinessHours, _this.unrenderBusinessHours, [_this.renderDatesMem]);
7743
- _this.renderDateSelectionMem = memoizeRendering(_this.renderDateSelectionWrap, _this.unrenderDateSelectionWrap, [_this.renderDatesMem]);
7744
- _this.renderEventsMem = memoizeRendering(_this.renderEvents, _this.unrenderEvents, [_this.renderDatesMem]);
7745
- _this.renderEventSelectionMem = memoizeRendering(_this.renderEventSelectionWrap, _this.unrenderEventSelectionWrap, [_this.renderEventsMem]);
7746
- _this.renderEventDragMem = memoizeRendering(_this.renderEventDragWrap, _this.unrenderEventDragWrap, [_this.renderDatesMem]);
7747
- _this.renderEventResizeMem = memoizeRendering(_this.renderEventResizeWrap, _this.unrenderEventResizeWrap, [_this.renderDatesMem]);
7748
- _this.viewSpec = viewSpec;
7749
- _this.dateProfileGenerator = dateProfileGenerator;
7750
- _this.type = viewSpec.type;
7751
- _this.eventOrderSpecs = parseFieldSpecs(_this.opt('eventOrder'));
7752
- _this.nextDayThreshold = createDuration(_this.opt('nextDayThreshold'));
7753
- parentEl.appendChild(_this.el);
7754
- _this.initialize();
7755
- return _this;
7756
- }
7757
- View.prototype.initialize = function () {
7758
- };
7759
- Object.defineProperty(View.prototype, "activeStart", {
7760
- // Date Setting/Unsetting
7761
- // -----------------------------------------------------------------------------------------------------------------
7762
- get: function () {
7763
- return this.dateEnv.toDate(this.props.dateProfile.activeRange.start);
7764
- },
7765
- enumerable: true,
7766
- configurable: true
7767
- });
7768
- Object.defineProperty(View.prototype, "activeEnd", {
7769
- get: function () {
7770
- return this.dateEnv.toDate(this.props.dateProfile.activeRange.end);
7771
- },
7772
- enumerable: true,
7773
- configurable: true
7774
- });
7775
- Object.defineProperty(View.prototype, "currentStart", {
7776
- get: function () {
7777
- return this.dateEnv.toDate(this.props.dateProfile.currentRange.start);
7778
- },
7779
- enumerable: true,
7780
- configurable: true
7781
- });
7782
- Object.defineProperty(View.prototype, "currentEnd", {
7783
- get: function () {
7784
- return this.dateEnv.toDate(this.props.dateProfile.currentRange.end);
7785
- },
7786
- enumerable: true,
7787
- configurable: true
7788
- });
7789
- // General Rendering
7790
- // -----------------------------------------------------------------------------------------------------------------
7791
- View.prototype.render = function (props) {
7792
- this.renderDatesMem(props.dateProfile);
7793
- this.renderBusinessHoursMem(props.businessHours);
7794
- this.renderDateSelectionMem(props.dateSelection);
7795
- this.renderEventsMem(props.eventStore);
7796
- this.renderEventSelectionMem(props.eventSelection);
7797
- this.renderEventDragMem(props.eventDrag);
7798
- this.renderEventResizeMem(props.eventResize);
7799
- };
7800
- View.prototype.destroy = function () {
7801
- _super.prototype.destroy.call(this);
7802
- this.renderDatesMem.unrender(); // should unrender everything else
7803
- };
7804
- // Sizing
7805
- // -----------------------------------------------------------------------------------------------------------------
7806
- View.prototype.updateSize = function (isResize, viewHeight, isAuto) {
7807
- var calendar = this.calendar;
7808
- if (isResize || // HACKS...
7809
- calendar.isViewUpdated ||
7810
- calendar.isDatesUpdated ||
7811
- calendar.isEventsUpdated) {
7812
- // sort of the catch-all sizing
7813
- // anything that might cause dimension changes
7814
- this.updateBaseSize(isResize, viewHeight, isAuto);
7815
- }
7816
- };
7817
- View.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
7818
- };
7819
- // Date Rendering
7820
- // -----------------------------------------------------------------------------------------------------------------
7821
- View.prototype.renderDatesWrap = function (dateProfile) {
7822
- this.renderDates(dateProfile);
7823
- this.addScroll({
7824
- duration: createDuration(this.opt('scrollTime'))
7825
- });
7826
- this.startNowIndicator(dateProfile); // shouldn't render yet because updateSize will be called soon
7827
- };
7828
- View.prototype.unrenderDatesWrap = function () {
7829
- this.stopNowIndicator();
7830
- this.unrenderDates();
7831
- };
7832
- View.prototype.renderDates = function (dateProfile) { };
7833
- View.prototype.unrenderDates = function () { };
7834
- // Business Hours
7835
- // -----------------------------------------------------------------------------------------------------------------
7836
- View.prototype.renderBusinessHours = function (businessHours) { };
7837
- View.prototype.unrenderBusinessHours = function () { };
7838
- // Date Selection
7839
- // -----------------------------------------------------------------------------------------------------------------
7840
- View.prototype.renderDateSelectionWrap = function (selection) {
7841
- if (selection) {
7842
- this.renderDateSelection(selection);
7843
- }
7844
- };
7845
- View.prototype.unrenderDateSelectionWrap = function (selection) {
7846
- if (selection) {
7847
- this.unrenderDateSelection(selection);
7848
- }
7849
- };
7850
- View.prototype.renderDateSelection = function (selection) { };
7851
- View.prototype.unrenderDateSelection = function (selection) { };
7852
- // Event Rendering
7853
- // -----------------------------------------------------------------------------------------------------------------
7854
- View.prototype.renderEvents = function (eventStore) { };
7855
- View.prototype.unrenderEvents = function () { };
7856
- // util for subclasses
7857
- View.prototype.sliceEvents = function (eventStore, allDay) {
7858
- var props = this.props;
7859
- return sliceEventStore(eventStore, props.eventUiBases, props.dateProfile.activeRange, allDay ? this.nextDayThreshold : null).fg;
7860
- };
7861
- View.prototype.computeEventDraggable = function (eventDef, eventUi) {
7862
- var transformers = this.calendar.pluginSystem.hooks.isDraggableTransformers;
7863
- var val = eventUi.startEditable;
7864
- for (var _i = 0, transformers_1 = transformers; _i < transformers_1.length; _i++) {
7865
- var transformer = transformers_1[_i];
7866
- val = transformer(val, eventDef, eventUi, this);
7867
- }
7868
- return val;
7869
- };
7870
- View.prototype.computeEventStartResizable = function (eventDef, eventUi) {
7871
- return eventUi.durationEditable && this.opt('eventResizableFromStart');
7872
- };
7873
- View.prototype.computeEventEndResizable = function (eventDef, eventUi) {
7874
- return eventUi.durationEditable;
7875
- };
7876
- // Event Selection
7877
- // -----------------------------------------------------------------------------------------------------------------
7878
- View.prototype.renderEventSelectionWrap = function (instanceId) {
7879
- if (instanceId) {
7880
- this.renderEventSelection(instanceId);
7881
- }
7882
- };
7883
- View.prototype.unrenderEventSelectionWrap = function (instanceId) {
7884
- if (instanceId) {
7885
- this.unrenderEventSelection(instanceId);
7886
- }
7887
- };
7888
- View.prototype.renderEventSelection = function (instanceId) { };
7889
- View.prototype.unrenderEventSelection = function (instanceId) { };
7890
- // Event Drag
7891
- // -----------------------------------------------------------------------------------------------------------------
7892
- View.prototype.renderEventDragWrap = function (state) {
7893
- if (state) {
7894
- this.renderEventDrag(state);
7895
- }
7896
- };
7897
- View.prototype.unrenderEventDragWrap = function (state) {
7898
- if (state) {
7899
- this.unrenderEventDrag(state);
7900
- }
7901
- };
7902
- View.prototype.renderEventDrag = function (state) { };
7903
- View.prototype.unrenderEventDrag = function (state) { };
7904
- // Event Resize
7905
- // -----------------------------------------------------------------------------------------------------------------
7906
- View.prototype.renderEventResizeWrap = function (state) {
7907
- if (state) {
7908
- this.renderEventResize(state);
7909
- }
7910
- };
7911
- View.prototype.unrenderEventResizeWrap = function (state) {
7912
- if (state) {
7913
- this.unrenderEventResize(state);
7914
- }
7915
- };
7916
- View.prototype.renderEventResize = function (state) { };
7917
- View.prototype.unrenderEventResize = function (state) { };
7918
- /* Now Indicator
7919
- ------------------------------------------------------------------------------------------------------------------*/
7920
- // Immediately render the current time indicator and begins re-rendering it at an interval,
7921
- // which is defined by this.getNowIndicatorUnit().
7922
- // TODO: somehow do this for the current whole day's background too
7923
- View.prototype.startNowIndicator = function (dateProfile) {
7924
- var _this = this;
7925
- var dateEnv = this.dateEnv;
7926
- var unit;
7927
- var update;
7928
- var delay; // ms wait value
7929
- if (this.opt('nowIndicator')) {
7930
- unit = this.getNowIndicatorUnit(dateProfile);
7931
- if (unit) {
7932
- update = this.updateNowIndicator.bind(this);
7933
- this.initialNowDate = this.calendar.getNow();
7934
- this.initialNowQueriedMs = new Date().valueOf();
7935
- // wait until the beginning of the next interval
7936
- delay = dateEnv.add(dateEnv.startOf(this.initialNowDate, unit), createDuration(1, unit)).valueOf() - this.initialNowDate.valueOf();
7937
- // TODO: maybe always use setTimeout, waiting until start of next unit
7938
- this.nowIndicatorTimeoutID = setTimeout(function () {
7939
- _this.nowIndicatorTimeoutID = null;
7940
- update();
7941
- if (unit === 'second') {
7942
- delay = 1000; // every second
7943
- }
7944
- else {
7945
- delay = 1000 * 60; // otherwise, every minute
7946
- }
7947
- _this.nowIndicatorIntervalID = setInterval(update, delay); // update every interval
7948
- }, delay);
7949
- }
7950
- // rendering will be initiated in updateSize
7951
- }
7952
- };
7953
- // rerenders the now indicator, computing the new current time from the amount of time that has passed
7954
- // since the initial getNow call.
7955
- View.prototype.updateNowIndicator = function () {
7956
- if (this.props.dateProfile && // a way to determine if dates were rendered yet
7957
- this.initialNowDate // activated before?
7958
- ) {
7959
- this.unrenderNowIndicator(); // won't unrender if unnecessary
7960
- this.renderNowIndicator(addMs(this.initialNowDate, new Date().valueOf() - this.initialNowQueriedMs));
7961
- this.isNowIndicatorRendered = true;
7962
- }
7963
- };
7964
- // Immediately unrenders the view's current time indicator and stops any re-rendering timers.
7965
- // Won't cause side effects if indicator isn't rendered.
7966
- View.prototype.stopNowIndicator = function () {
7967
- if (this.isNowIndicatorRendered) {
7968
- if (this.nowIndicatorTimeoutID) {
7969
- clearTimeout(this.nowIndicatorTimeoutID);
7970
- this.nowIndicatorTimeoutID = null;
7971
- }
7972
- if (this.nowIndicatorIntervalID) {
7973
- clearInterval(this.nowIndicatorIntervalID);
7974
- this.nowIndicatorIntervalID = null;
7975
- }
7976
- this.unrenderNowIndicator();
7977
- this.isNowIndicatorRendered = false;
7978
- }
7979
- };
7980
- View.prototype.getNowIndicatorUnit = function (dateProfile) {
7981
- // subclasses should implement
7982
- };
7983
- // Renders a current time indicator at the given datetime
7984
- View.prototype.renderNowIndicator = function (date) {
7985
- // SUBCLASSES MUST PASS TO CHILDREN!
7986
- };
7987
- // Undoes the rendering actions from renderNowIndicator
7988
- View.prototype.unrenderNowIndicator = function () {
7989
- // SUBCLASSES MUST PASS TO CHILDREN!
7990
- };
7991
- /* Scroller
7992
- ------------------------------------------------------------------------------------------------------------------*/
7993
- View.prototype.addScroll = function (scroll) {
7994
- var queuedScroll = this.queuedScroll || (this.queuedScroll = {});
7995
- __assign(queuedScroll, scroll);
7996
- };
7997
- View.prototype.popScroll = function (isResize) {
7998
- this.applyQueuedScroll(isResize);
7999
- this.queuedScroll = null;
8000
- };
8001
- View.prototype.applyQueuedScroll = function (isResize) {
8002
- this.applyScroll(this.queuedScroll || {}, isResize);
8003
- };
8004
- View.prototype.queryScroll = function () {
8005
- var scroll = {};
8006
- if (this.props.dateProfile) { // dates rendered yet?
8007
- __assign(scroll, this.queryDateScroll());
8008
- }
8009
- return scroll;
8010
- };
8011
- View.prototype.applyScroll = function (scroll, isResize) {
8012
- var duration = scroll.duration;
8013
- if (duration != null) {
8014
- delete scroll.duration;
8015
- if (this.props.dateProfile) { // dates rendered yet?
8016
- __assign(scroll, this.computeDateScroll(duration));
8017
- }
8018
- }
8019
- if (this.props.dateProfile) { // dates rendered yet?
8020
- this.applyDateScroll(scroll);
8021
- }
8022
- };
8023
- View.prototype.computeDateScroll = function (duration) {
8024
- return {}; // subclasses must implement
8025
- };
8026
- View.prototype.queryDateScroll = function () {
8027
- return {}; // subclasses must implement
8028
- };
8029
- View.prototype.applyDateScroll = function (scroll) {
8030
- // subclasses must implement
8031
- };
8032
- // for API
8033
- View.prototype.scrollToDuration = function (duration) {
8034
- this.applyScroll({ duration: duration }, false);
8035
- };
8036
- return View;
8037
- }(DateComponent));
8038
- EmitterMixin.mixInto(View);
8039
- View.prototype.usesMinMaxTime = false;
8040
- View.prototype.dateProfileGeneratorClass = DateProfileGenerator;
8041
-
8042
- var FgEventRenderer = /** @class */ (function () {
8043
- function FgEventRenderer(context) {
8044
- this.segs = [];
8045
- this.isSizeDirty = false;
8046
- this.context = context;
8047
- }
8048
- FgEventRenderer.prototype.renderSegs = function (segs, mirrorInfo) {
8049
- this.rangeUpdated(); // called too frequently :(
8050
- // render an `.el` on each seg
8051
- // returns a subset of the segs. segs that were actually rendered
8052
- segs = this.renderSegEls(segs, mirrorInfo);
8053
- this.segs = segs;
8054
- this.attachSegs(segs, mirrorInfo);
8055
- this.isSizeDirty = true;
8056
- this.context.view.triggerRenderedSegs(this.segs, Boolean(mirrorInfo));
8057
- };
8058
- FgEventRenderer.prototype.unrender = function (_segs, mirrorInfo) {
8059
- this.context.view.triggerWillRemoveSegs(this.segs, Boolean(mirrorInfo));
8060
- this.detachSegs(this.segs);
8061
- this.segs = [];
8062
- };
8063
- // Updates values that rely on options and also relate to range
8064
- FgEventRenderer.prototype.rangeUpdated = function () {
8065
- var options = this.context.options;
8066
- var displayEventTime;
8067
- var displayEventEnd;
8068
- this.eventTimeFormat = createFormatter(options.eventTimeFormat || this.computeEventTimeFormat(), options.defaultRangeSeparator);
8069
- displayEventTime = options.displayEventTime;
8070
- if (displayEventTime == null) {
8071
- displayEventTime = this.computeDisplayEventTime(); // might be based off of range
8072
- }
8073
- displayEventEnd = options.displayEventEnd;
8074
- if (displayEventEnd == null) {
8075
- displayEventEnd = this.computeDisplayEventEnd(); // might be based off of range
8076
- }
8077
- this.displayEventTime = displayEventTime;
8078
- this.displayEventEnd = displayEventEnd;
8079
- };
8080
- // Renders and assigns an `el` property for each foreground event segment.
8081
- // Only returns segments that successfully rendered.
8082
- FgEventRenderer.prototype.renderSegEls = function (segs, mirrorInfo) {
8083
- var html = '';
8084
- var i;
8085
- if (segs.length) { // don't build an empty html string
8086
- // build a large concatenation of event segment HTML
8087
- for (i = 0; i < segs.length; i++) {
8088
- html += this.renderSegHtml(segs[i], mirrorInfo);
8089
- }
8090
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
8091
- // Then, compute the 'el' for each segment. An el might be null if the eventRender callback returned false.
8092
- htmlToElements(html).forEach(function (el, i) {
8093
- var seg = segs[i];
8094
- if (el) {
8095
- seg.el = el;
8096
- }
8097
- });
8098
- segs = filterSegsViaEls(this.context.view, segs, Boolean(mirrorInfo));
8099
- }
8100
- return segs;
8101
- };
8102
- // Generic utility for generating the HTML classNames for an event segment's element
8103
- FgEventRenderer.prototype.getSegClasses = function (seg, isDraggable, isResizable, mirrorInfo) {
8104
- var classes = [
8105
- 'fc-event',
8106
- seg.isStart ? 'fc-start' : 'fc-not-start',
8107
- seg.isEnd ? 'fc-end' : 'fc-not-end'
8108
- ].concat(seg.eventRange.ui.classNames);
8109
- if (isDraggable) {
8110
- classes.push('fc-draggable');
8111
- }
8112
- if (isResizable) {
8113
- classes.push('fc-resizable');
8114
- }
8115
- if (mirrorInfo) {
8116
- classes.push('fc-mirror');
8117
- if (mirrorInfo.isDragging) {
8118
- classes.push('fc-dragging');
8119
- }
8120
- if (mirrorInfo.isResizing) {
8121
- classes.push('fc-resizing');
8122
- }
8123
- }
8124
- return classes;
8125
- };
8126
- // Compute the text that should be displayed on an event's element.
8127
- // `range` can be the Event object itself, or something range-like, with at least a `start`.
8128
- // If event times are disabled, or the event has no time, will return a blank string.
8129
- // If not specified, formatter will default to the eventTimeFormat setting,
8130
- // and displayEnd will default to the displayEventEnd setting.
8131
- FgEventRenderer.prototype.getTimeText = function (eventRange, formatter, displayEnd) {
8132
- var def = eventRange.def, instance = eventRange.instance;
8133
- return this._getTimeText(instance.range.start, def.hasEnd ? instance.range.end : null, def.allDay, formatter, displayEnd, instance.forcedStartTzo, instance.forcedEndTzo);
8134
- };
8135
- FgEventRenderer.prototype._getTimeText = function (start, end, allDay, formatter, displayEnd, forcedStartTzo, forcedEndTzo) {
8136
- var dateEnv = this.context.dateEnv;
8137
- if (formatter == null) {
8138
- formatter = this.eventTimeFormat;
8139
- }
8140
- if (displayEnd == null) {
8141
- displayEnd = this.displayEventEnd;
8142
- }
8143
- if (this.displayEventTime && !allDay) {
8144
- if (displayEnd && end) {
8145
- return dateEnv.formatRange(start, end, formatter, {
8146
- forcedStartTzo: forcedStartTzo,
8147
- forcedEndTzo: forcedEndTzo
8148
- });
8149
- }
8150
- else {
8151
- return dateEnv.format(start, formatter, {
8152
- forcedTzo: forcedStartTzo
8153
- });
8154
- }
8155
- }
8156
- return '';
8157
- };
8158
- FgEventRenderer.prototype.computeEventTimeFormat = function () {
8159
- return {
8160
- hour: 'numeric',
8161
- minute: '2-digit',
8162
- omitZeroMinute: true
8163
- };
8164
- };
8165
- FgEventRenderer.prototype.computeDisplayEventTime = function () {
8166
- return true;
8167
- };
8168
- FgEventRenderer.prototype.computeDisplayEventEnd = function () {
8169
- return true;
8170
- };
8171
- // Utility for generating event skin-related CSS properties
8172
- FgEventRenderer.prototype.getSkinCss = function (ui) {
8173
- return {
8174
- 'background-color': ui.backgroundColor,
8175
- 'border-color': ui.borderColor,
8176
- color: ui.textColor
8177
- };
8178
- };
8179
- FgEventRenderer.prototype.sortEventSegs = function (segs) {
8180
- var specs = this.context.view.eventOrderSpecs;
8181
- var objs = segs.map(buildSegCompareObj);
8182
- objs.sort(function (obj0, obj1) {
8183
- return compareByFieldSpecs(obj0, obj1, specs);
8184
- });
8185
- return objs.map(function (c) {
8186
- return c._seg;
8187
- });
8188
- };
8189
- FgEventRenderer.prototype.computeSizes = function (force) {
8190
- if (force || this.isSizeDirty) {
8191
- this.computeSegSizes(this.segs);
8192
- }
8193
- };
8194
- FgEventRenderer.prototype.assignSizes = function (force) {
8195
- if (force || this.isSizeDirty) {
8196
- this.assignSegSizes(this.segs);
8197
- this.isSizeDirty = false;
8198
- }
8199
- };
8200
- FgEventRenderer.prototype.computeSegSizes = function (segs) {
8201
- };
8202
- FgEventRenderer.prototype.assignSegSizes = function (segs) {
8203
- };
8204
- // Manipulation on rendered segs
8205
- FgEventRenderer.prototype.hideByHash = function (hash) {
8206
- if (hash) {
8207
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
8208
- var seg = _a[_i];
8209
- if (hash[seg.eventRange.instance.instanceId]) {
8210
- seg.el.style.visibility = 'hidden';
8211
- }
8212
- }
8213
- }
8214
- };
8215
- FgEventRenderer.prototype.showByHash = function (hash) {
8216
- if (hash) {
8217
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
8218
- var seg = _a[_i];
8219
- if (hash[seg.eventRange.instance.instanceId]) {
8220
- seg.el.style.visibility = '';
8221
- }
8222
- }
8223
- }
8224
- };
8225
- FgEventRenderer.prototype.selectByInstanceId = function (instanceId) {
8226
- if (instanceId) {
8227
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
8228
- var seg = _a[_i];
8229
- var eventInstance = seg.eventRange.instance;
8230
- if (eventInstance && eventInstance.instanceId === instanceId &&
8231
- seg.el // necessary?
8232
- ) {
8233
- seg.el.classList.add('fc-selected');
8234
- }
8235
- }
8236
- }
8237
- };
8238
- FgEventRenderer.prototype.unselectByInstanceId = function (instanceId) {
8239
- if (instanceId) {
8240
- for (var _i = 0, _a = this.segs; _i < _a.length; _i++) {
8241
- var seg = _a[_i];
8242
- if (seg.el) { // necessary?
8243
- seg.el.classList.remove('fc-selected');
8244
- }
8245
- }
8246
- }
8247
- };
8248
- return FgEventRenderer;
8249
- }());
8250
- // returns a object with all primitive props that can be compared
8251
- function buildSegCompareObj(seg) {
8252
- var eventDef = seg.eventRange.def;
8253
- var range = seg.eventRange.instance.range;
8254
- var start = range.start ? range.start.valueOf() : 0; // TODO: better support for open-range events
8255
- var end = range.end ? range.end.valueOf() : 0; // "
8256
- return __assign({}, eventDef.extendedProps, eventDef, { id: eventDef.publicId, start: start,
8257
- end: end, duration: end - start, allDay: Number(eventDef.allDay), _seg: seg // for later retrieval
8258
- });
8259
- }
8260
-
8261
- var FillRenderer = /** @class */ (function () {
8262
- function FillRenderer(context) {
8263
- this.fillSegTag = 'div';
8264
- this.dirtySizeFlags = {};
8265
- this.context = context;
8266
- this.containerElsByType = {};
8267
- this.segsByType = {};
8268
- }
8269
- FillRenderer.prototype.getSegsByType = function (type) {
8270
- return this.segsByType[type] || [];
8271
- };
8272
- FillRenderer.prototype.renderSegs = function (type, segs) {
8273
- var _a;
8274
- var renderedSegs = this.renderSegEls(type, segs); // assignes `.el` to each seg. returns successfully rendered segs
8275
- var containerEls = this.attachSegs(type, renderedSegs);
8276
- if (containerEls) {
8277
- (_a = (this.containerElsByType[type] || (this.containerElsByType[type] = []))).push.apply(_a, containerEls);
8278
- }
8279
- this.segsByType[type] = renderedSegs;
8280
- if (type === 'bgEvent') {
8281
- this.context.view.triggerRenderedSegs(renderedSegs, false); // isMirror=false
8282
- }
8283
- this.dirtySizeFlags[type] = true;
8284
- };
8285
- // Unrenders a specific type of fill that is currently rendered on the grid
8286
- FillRenderer.prototype.unrender = function (type) {
8287
- var segs = this.segsByType[type];
8288
- if (segs) {
8289
- if (type === 'bgEvent') {
8290
- this.context.view.triggerWillRemoveSegs(segs, false); // isMirror=false
8291
- }
8292
- this.detachSegs(type, segs);
8293
- }
8294
- };
8295
- // Renders and assigns an `el` property for each fill segment. Generic enough to work with different types.
8296
- // Only returns segments that successfully rendered.
8297
- FillRenderer.prototype.renderSegEls = function (type, segs) {
8298
- var _this = this;
8299
- var html = '';
8300
- var i;
8301
- if (segs.length) {
8302
- // build a large concatenation of segment HTML
8303
- for (i = 0; i < segs.length; i++) {
8304
- html += this.renderSegHtml(type, segs[i]);
8305
- }
8306
- // Grab individual elements from the combined HTML string. Use each as the default rendering.
8307
- // Then, compute the 'el' for each segment.
8308
- htmlToElements(html).forEach(function (el, i) {
8309
- var seg = segs[i];
8310
- if (el) {
8311
- seg.el = el;
8312
- }
8313
- });
8314
- if (type === 'bgEvent') {
8315
- segs = filterSegsViaEls(this.context.view, segs, false // isMirror. background events can never be mirror elements
8316
- );
8317
- }
8318
- // correct element type? (would be bad if a non-TD were inserted into a table for example)
8319
- segs = segs.filter(function (seg) {
8320
- return elementMatches(seg.el, _this.fillSegTag);
8321
- });
8322
- }
8323
- return segs;
8324
- };
8325
- // Builds the HTML needed for one fill segment. Generic enough to work with different types.
8326
- FillRenderer.prototype.renderSegHtml = function (type, seg) {
8327
- var css = null;
8328
- var classNames = [];
8329
- if (type !== 'highlight' && type !== 'businessHours') {
8330
- css = {
8331
- 'background-color': seg.eventRange.ui.backgroundColor
8332
- };
8333
- }
8334
- if (type !== 'highlight') {
8335
- classNames = classNames.concat(seg.eventRange.ui.classNames);
8336
- }
8337
- if (type === 'businessHours') {
8338
- classNames.push('fc-bgevent');
8339
- }
8340
- else {
8341
- classNames.push('fc-' + type.toLowerCase());
8342
- }
8343
- return '<' + this.fillSegTag +
8344
- (classNames.length ? ' class="' + classNames.join(' ') + '"' : '') +
8345
- (css ? ' style="' + cssToStr(css) + '"' : '') +
8346
- '></' + this.fillSegTag + '>';
8347
- };
8348
- FillRenderer.prototype.detachSegs = function (type, segs) {
8349
- var containerEls = this.containerElsByType[type];
8350
- if (containerEls) {
8351
- containerEls.forEach(removeElement);
8352
- delete this.containerElsByType[type];
8353
- }
8354
- };
8355
- FillRenderer.prototype.computeSizes = function (force) {
8356
- for (var type in this.segsByType) {
8357
- if (force || this.dirtySizeFlags[type]) {
8358
- this.computeSegSizes(this.segsByType[type]);
8359
- }
8360
- }
8361
- };
8362
- FillRenderer.prototype.assignSizes = function (force) {
8363
- for (var type in this.segsByType) {
8364
- if (force || this.dirtySizeFlags[type]) {
8365
- this.assignSegSizes(this.segsByType[type]);
8366
- }
8367
- }
8368
- this.dirtySizeFlags = {};
8369
- };
8370
- FillRenderer.prototype.computeSegSizes = function (segs) {
8371
- };
8372
- FillRenderer.prototype.assignSegSizes = function (segs) {
8373
- };
8374
- return FillRenderer;
8375
- }());
8376
-
8377
- var NamedTimeZoneImpl = /** @class */ (function () {
8378
- function NamedTimeZoneImpl(timeZoneName) {
8379
- this.timeZoneName = timeZoneName;
8380
- }
8381
- return NamedTimeZoneImpl;
8382
- }());
8383
-
8384
- /*
8385
- An abstraction for a dragging interaction originating on an event.
8386
- Does higher-level things than PointerDragger, such as possibly:
8387
- - a "mirror" that moves with the pointer
8388
- - a minimum number of pixels or other criteria for a true drag to begin
8389
-
8390
- subclasses must emit:
8391
- - pointerdown
8392
- - dragstart
8393
- - dragmove
8394
- - pointerup
8395
- - dragend
8396
- */
8397
- var ElementDragging = /** @class */ (function () {
8398
- function ElementDragging(el) {
8399
- this.emitter = new EmitterMixin();
8400
- }
8401
- ElementDragging.prototype.destroy = function () {
8402
- };
8403
- ElementDragging.prototype.setMirrorIsVisible = function (bool) {
8404
- // optional if subclass doesn't want to support a mirror
8405
- };
8406
- ElementDragging.prototype.setMirrorNeedsRevert = function (bool) {
8407
- // optional if subclass doesn't want to support a mirror
8408
- };
8409
- ElementDragging.prototype.setAutoScrollEnabled = function (bool) {
8410
- // optional
8411
- };
8412
- return ElementDragging;
8413
- }());
8414
-
8415
- function formatDate(dateInput, settings) {
8416
- if (settings === void 0) { settings = {}; }
8417
- var dateEnv = buildDateEnv$1(settings);
8418
- var formatter = createFormatter(settings);
8419
- var dateMeta = dateEnv.createMarkerMeta(dateInput);
8420
- if (!dateMeta) { // TODO: warning?
8421
- return '';
8422
- }
8423
- return dateEnv.format(dateMeta.marker, formatter, {
8424
- forcedTzo: dateMeta.forcedTzo
8425
- });
8426
- }
8427
- function formatRange(startInput, endInput, settings // mixture of env and formatter settings
8428
- ) {
8429
- var dateEnv = buildDateEnv$1(typeof settings === 'object' && settings ? settings : {}); // pass in if non-null object
8430
- var formatter = createFormatter(settings, globalDefaults.defaultRangeSeparator);
8431
- var startMeta = dateEnv.createMarkerMeta(startInput);
8432
- var endMeta = dateEnv.createMarkerMeta(endInput);
8433
- if (!startMeta || !endMeta) { // TODO: warning?
8434
- return '';
8435
- }
8436
- return dateEnv.formatRange(startMeta.marker, endMeta.marker, formatter, {
8437
- forcedStartTzo: startMeta.forcedTzo,
8438
- forcedEndTzo: endMeta.forcedTzo,
8439
- isEndExclusive: settings.isEndExclusive
8440
- });
8441
- }
8442
- // TODO: more DRY and optimized
8443
- function buildDateEnv$1(settings) {
8444
- var locale = buildLocale(settings.locale || 'en', parseRawLocales([]).map); // TODO: don't hardcode 'en' everywhere
8445
- // ensure required settings
8446
- settings = __assign({ timeZone: globalDefaults.timeZone, calendarSystem: 'gregory' }, settings, { locale: locale });
8447
- return new DateEnv(settings);
8448
- }
8449
-
8450
- var DRAG_META_PROPS = {
8451
- startTime: createDuration,
8452
- duration: createDuration,
8453
- create: Boolean,
8454
- sourceId: String
8455
- };
8456
- var DRAG_META_DEFAULTS = {
8457
- create: true
8458
- };
8459
- function parseDragMeta(raw) {
8460
- var leftoverProps = {};
8461
- var refined = refineProps(raw, DRAG_META_PROPS, DRAG_META_DEFAULTS, leftoverProps);
8462
- refined.leftoverProps = leftoverProps;
8463
- return refined;
8464
- }
8465
-
8466
- // Computes a default column header formatting string if `colFormat` is not explicitly defined
8467
- function computeFallbackHeaderFormat(datesRepDistinctDays, dayCnt) {
8468
- // if more than one week row, or if there are a lot of columns with not much space,
8469
- // put just the day numbers will be in each cell
8470
- if (!datesRepDistinctDays || dayCnt > 10) {
8471
- return { weekday: 'short' }; // "Sat"
8472
- }
8473
- else if (dayCnt > 1) {
8474
- return { weekday: 'short', month: 'numeric', day: 'numeric', omitCommas: true }; // "Sat 11/12"
8475
- }
8476
- else {
8477
- return { weekday: 'long' }; // "Saturday"
8478
- }
8479
- }
8480
- function renderDateCell(dateMarker, dateProfile, datesRepDistinctDays, colCnt, colHeadFormat, context, colspan, otherAttrs) {
8481
- var view = context.view, dateEnv = context.dateEnv, theme = context.theme, options = context.options;
8482
- var isDateValid = rangeContainsMarker(dateProfile.activeRange, dateMarker); // TODO: called too frequently. cache somehow.
8483
- var classNames = [
8484
- 'fc-day-header',
8485
- theme.getClass('widgetHeader')
8486
- ];
8487
- var innerHtml;
8488
- if (typeof options.columnHeaderHtml === 'function') {
8489
- innerHtml = options.columnHeaderHtml(dateEnv.toDate(dateMarker));
8490
- }
8491
- else if (typeof options.columnHeaderText === 'function') {
8492
- innerHtml = htmlEscape(options.columnHeaderText(dateEnv.toDate(dateMarker)));
8493
- }
8494
- else {
8495
- innerHtml = htmlEscape(dateEnv.format(dateMarker, colHeadFormat));
8496
- }
8497
- // if only one row of days, the classNames on the header can represent the specific days beneath
8498
- if (datesRepDistinctDays) {
8499
- classNames = classNames.concat(
8500
- // includes the day-of-week class
8501
- // noThemeHighlight=true (don't highlight the header)
8502
- getDayClasses(dateMarker, dateProfile, context, true));
8503
- }
8504
- else {
8505
- classNames.push('fc-' + DAY_IDS[dateMarker.getUTCDay()]); // only add the day-of-week class
8506
- }
8507
- return '' +
8508
- '<th class="' + classNames.join(' ') + '"' +
8509
- ((isDateValid && datesRepDistinctDays) ?
8510
- ' data-date="' + dateEnv.formatIso(dateMarker, { omitTime: true }) + '"' :
8511
- '') +
8512
- (colspan > 1 ?
8513
- ' colspan="' + colspan + '"' :
8514
- '') +
8515
- (otherAttrs ?
8516
- ' ' + otherAttrs :
8517
- '') +
8518
- '>' +
8519
- (isDateValid ?
8520
- // don't make a link if the heading could represent multiple days, or if there's only one day (forceOff)
8521
- buildGotoAnchorHtml(view, { date: dateMarker, forceOff: !datesRepDistinctDays || colCnt === 1 }, innerHtml) :
8522
- // if not valid, display text, but no link
8523
- innerHtml) +
8524
- '</th>';
8525
- }
8526
-
8527
- var DayHeader = /** @class */ (function (_super) {
8528
- __extends(DayHeader, _super);
8529
- function DayHeader(context, parentEl) {
8530
- var _this = _super.call(this, context) || this;
8531
- parentEl.innerHTML = ''; // because might be nbsp
8532
- parentEl.appendChild(_this.el = htmlToElement('<div class="fc-row ' + _this.theme.getClass('headerRow') + '">' +
8533
- '<table class="' + _this.theme.getClass('tableGrid') + '">' +
8534
- '<thead></thead>' +
8535
- '</table>' +
8536
- '</div>'));
8537
- _this.thead = _this.el.querySelector('thead');
8538
- return _this;
8539
- }
8540
- DayHeader.prototype.destroy = function () {
8541
- removeElement(this.el);
8542
- };
8543
- DayHeader.prototype.render = function (props) {
8544
- var dates = props.dates, datesRepDistinctDays = props.datesRepDistinctDays;
8545
- var parts = [];
8546
- if (props.renderIntroHtml) {
8547
- parts.push(props.renderIntroHtml());
8548
- }
8549
- var colHeadFormat = createFormatter(this.opt('columnHeaderFormat') ||
8550
- computeFallbackHeaderFormat(datesRepDistinctDays, dates.length));
8551
- for (var _i = 0, dates_1 = dates; _i < dates_1.length; _i++) {
8552
- var date = dates_1[_i];
8553
- parts.push(renderDateCell(date, props.dateProfile, datesRepDistinctDays, dates.length, colHeadFormat, this.context));
8554
- }
8555
- if (this.isRtl) {
8556
- parts.reverse();
8557
- }
8558
- this.thead.innerHTML = '<tr>' + parts.join('') + '</tr>';
8559
- };
8560
- return DayHeader;
8561
- }(Component));
8562
-
8563
- var DaySeries = /** @class */ (function () {
8564
- function DaySeries(range, dateProfileGenerator) {
8565
- var date = range.start;
8566
- var end = range.end;
8567
- var indices = [];
8568
- var dates = [];
8569
- var dayIndex = -1;
8570
- while (date < end) { // loop each day from start to end
8571
- if (dateProfileGenerator.isHiddenDay(date)) {
8572
- indices.push(dayIndex + 0.5); // mark that it's between indices
8573
- }
8574
- else {
8575
- dayIndex++;
8576
- indices.push(dayIndex);
8577
- dates.push(date);
8578
- }
8579
- date = addDays(date, 1);
8580
- }
8581
- this.dates = dates;
8582
- this.indices = indices;
8583
- this.cnt = dates.length;
8584
- }
8585
- DaySeries.prototype.sliceRange = function (range) {
8586
- var firstIndex = this.getDateDayIndex(range.start); // inclusive first index
8587
- var lastIndex = this.getDateDayIndex(addDays(range.end, -1)); // inclusive last index
8588
- var clippedFirstIndex = Math.max(0, firstIndex);
8589
- var clippedLastIndex = Math.min(this.cnt - 1, lastIndex);
8590
- // deal with in-between indices
8591
- clippedFirstIndex = Math.ceil(clippedFirstIndex); // in-between starts round to next cell
8592
- clippedLastIndex = Math.floor(clippedLastIndex); // in-between ends round to prev cell
8593
- if (clippedFirstIndex <= clippedLastIndex) {
8594
- return {
8595
- firstIndex: clippedFirstIndex,
8596
- lastIndex: clippedLastIndex,
8597
- isStart: firstIndex === clippedFirstIndex,
8598
- isEnd: lastIndex === clippedLastIndex
8599
- };
8600
- }
8601
- else {
8602
- return null;
8603
- }
8604
- };
8605
- // Given a date, returns its chronolocial cell-index from the first cell of the grid.
8606
- // If the date lies between cells (because of hiddenDays), returns a floating-point value between offsets.
8607
- // If before the first offset, returns a negative number.
8608
- // If after the last offset, returns an offset past the last cell offset.
8609
- // Only works for *start* dates of cells. Will not work for exclusive end dates for cells.
8610
- DaySeries.prototype.getDateDayIndex = function (date) {
8611
- var indices = this.indices;
8612
- var dayOffset = Math.floor(diffDays(this.dates[0], date));
8613
- if (dayOffset < 0) {
8614
- return indices[0] - 1;
8615
- }
8616
- else if (dayOffset >= indices.length) {
8617
- return indices[indices.length - 1] + 1;
8618
- }
8619
- else {
8620
- return indices[dayOffset];
8621
- }
8622
- };
8623
- return DaySeries;
8624
- }());
8625
-
8626
- var DayTable = /** @class */ (function () {
8627
- function DayTable(daySeries, breakOnWeeks) {
8628
- var dates = daySeries.dates;
8629
- var daysPerRow;
8630
- var firstDay;
8631
- var rowCnt;
8632
- if (breakOnWeeks) {
8633
- // count columns until the day-of-week repeats
8634
- firstDay = dates[0].getUTCDay();
8635
- for (daysPerRow = 1; daysPerRow < dates.length; daysPerRow++) {
8636
- if (dates[daysPerRow].getUTCDay() === firstDay) {
8637
- break;
8638
- }
8639
- }
8640
- rowCnt = Math.ceil(dates.length / daysPerRow);
8641
- }
8642
- else {
8643
- rowCnt = 1;
8644
- daysPerRow = dates.length;
8645
- }
8646
- this.rowCnt = rowCnt;
8647
- this.colCnt = daysPerRow;
8648
- this.daySeries = daySeries;
8649
- this.cells = this.buildCells();
8650
- this.headerDates = this.buildHeaderDates();
8651
- }
8652
- DayTable.prototype.buildCells = function () {
8653
- var rows = [];
8654
- for (var row = 0; row < this.rowCnt; row++) {
8655
- var cells = [];
8656
- for (var col = 0; col < this.colCnt; col++) {
8657
- cells.push(this.buildCell(row, col));
8658
- }
8659
- rows.push(cells);
8660
- }
8661
- return rows;
8662
- };
8663
- DayTable.prototype.buildCell = function (row, col) {
8664
- return {
8665
- date: this.daySeries.dates[row * this.colCnt + col]
8666
- };
8667
- };
8668
- DayTable.prototype.buildHeaderDates = function () {
8669
- var dates = [];
8670
- for (var col = 0; col < this.colCnt; col++) {
8671
- dates.push(this.cells[0][col].date);
8672
- }
8673
- return dates;
8674
- };
8675
- DayTable.prototype.sliceRange = function (range) {
8676
- var colCnt = this.colCnt;
8677
- var seriesSeg = this.daySeries.sliceRange(range);
8678
- var segs = [];
8679
- if (seriesSeg) {
8680
- var firstIndex = seriesSeg.firstIndex, lastIndex = seriesSeg.lastIndex;
8681
- var index = firstIndex;
8682
- while (index <= lastIndex) {
8683
- var row = Math.floor(index / colCnt);
8684
- var nextIndex = Math.min((row + 1) * colCnt, lastIndex + 1);
8685
- segs.push({
8686
- row: row,
8687
- firstCol: index % colCnt,
8688
- lastCol: (nextIndex - 1) % colCnt,
8689
- isStart: seriesSeg.isStart && index === firstIndex,
8690
- isEnd: seriesSeg.isEnd && (nextIndex - 1) === lastIndex
8691
- });
8692
- index = nextIndex;
8693
- }
8694
- }
8695
- return segs;
8696
- };
8697
- return DayTable;
8698
- }());
8699
-
8700
- var Slicer = /** @class */ (function () {
8701
- function Slicer() {
8702
- this.sliceBusinessHours = memoize(this._sliceBusinessHours);
8703
- this.sliceDateSelection = memoize(this._sliceDateSpan);
8704
- this.sliceEventStore = memoize(this._sliceEventStore);
8705
- this.sliceEventDrag = memoize(this._sliceInteraction);
8706
- this.sliceEventResize = memoize(this._sliceInteraction);
8707
- }
8708
- Slicer.prototype.sliceProps = function (props, dateProfile, nextDayThreshold, component) {
8709
- var extraArgs = [];
8710
- for (var _i = 4; _i < arguments.length; _i++) {
8711
- extraArgs[_i - 4] = arguments[_i];
8712
- }
8713
- var eventUiBases = props.eventUiBases;
8714
- var eventSegs = this.sliceEventStore.apply(this, [props.eventStore, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs));
8715
- return {
8716
- dateSelectionSegs: this.sliceDateSelection.apply(this, [props.dateSelection, eventUiBases, component].concat(extraArgs)),
8717
- businessHourSegs: this.sliceBusinessHours.apply(this, [props.businessHours, dateProfile, nextDayThreshold, component].concat(extraArgs)),
8718
- fgEventSegs: eventSegs.fg,
8719
- bgEventSegs: eventSegs.bg,
8720
- eventDrag: this.sliceEventDrag.apply(this, [props.eventDrag, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
8721
- eventResize: this.sliceEventResize.apply(this, [props.eventResize, eventUiBases, dateProfile, nextDayThreshold, component].concat(extraArgs)),
8722
- eventSelection: props.eventSelection
8723
- }; // TODO: give interactionSegs?
8724
- };
8725
- Slicer.prototype.sliceNowDate = function (// does not memoize
8726
- date, component) {
8727
- var extraArgs = [];
8728
- for (var _i = 2; _i < arguments.length; _i++) {
8729
- extraArgs[_i - 2] = arguments[_i];
8730
- }
8731
- return this._sliceDateSpan.apply(this, [{ range: { start: date, end: addMs(date, 1) }, allDay: false },
8732
- {},
8733
- component].concat(extraArgs));
8734
- };
8735
- Slicer.prototype._sliceBusinessHours = function (businessHours, dateProfile, nextDayThreshold, component) {
8736
- var extraArgs = [];
8737
- for (var _i = 4; _i < arguments.length; _i++) {
8738
- extraArgs[_i - 4] = arguments[_i];
8739
- }
8740
- if (!businessHours) {
8741
- return [];
8742
- }
8743
- return this._sliceEventStore.apply(this, [expandRecurring(businessHours, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), component.calendar),
8744
- {},
8745
- dateProfile,
8746
- nextDayThreshold,
8747
- component].concat(extraArgs)).bg;
8748
- };
8749
- Slicer.prototype._sliceEventStore = function (eventStore, eventUiBases, dateProfile, nextDayThreshold, component) {
8750
- var extraArgs = [];
8751
- for (var _i = 5; _i < arguments.length; _i++) {
8752
- extraArgs[_i - 5] = arguments[_i];
8753
- }
8754
- if (eventStore) {
8755
- var rangeRes = sliceEventStore(eventStore, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
8756
- return {
8757
- bg: this.sliceEventRanges(rangeRes.bg, component, extraArgs),
8758
- fg: this.sliceEventRanges(rangeRes.fg, component, extraArgs)
8759
- };
8760
- }
8761
- else {
8762
- return { bg: [], fg: [] };
8763
- }
8764
- };
8765
- Slicer.prototype._sliceInteraction = function (interaction, eventUiBases, dateProfile, nextDayThreshold, component) {
8766
- var extraArgs = [];
8767
- for (var _i = 5; _i < arguments.length; _i++) {
8768
- extraArgs[_i - 5] = arguments[_i];
8769
- }
8770
- if (!interaction) {
8771
- return null;
8772
- }
8773
- var rangeRes = sliceEventStore(interaction.mutatedEvents, eventUiBases, computeActiveRange(dateProfile, Boolean(nextDayThreshold)), nextDayThreshold);
8774
- return {
8775
- segs: this.sliceEventRanges(rangeRes.fg, component, extraArgs),
8776
- affectedInstances: interaction.affectedEvents.instances,
8777
- isEvent: interaction.isEvent,
8778
- sourceSeg: interaction.origSeg
8779
- };
8780
- };
8781
- Slicer.prototype._sliceDateSpan = function (dateSpan, eventUiBases, component) {
8782
- var extraArgs = [];
8783
- for (var _i = 3; _i < arguments.length; _i++) {
8784
- extraArgs[_i - 3] = arguments[_i];
8785
- }
8786
- if (!dateSpan) {
8787
- return [];
8788
- }
8789
- var eventRange = fabricateEventRange(dateSpan, eventUiBases, component.calendar);
8790
- var segs = this.sliceRange.apply(this, [dateSpan.range].concat(extraArgs));
8791
- for (var _a = 0, segs_1 = segs; _a < segs_1.length; _a++) {
8792
- var seg = segs_1[_a];
8793
- seg.component = component;
8794
- seg.eventRange = eventRange;
8795
- }
8796
- return segs;
8797
- };
8798
- /*
8799
- "complete" seg means it has component and eventRange
8800
- */
8801
- Slicer.prototype.sliceEventRanges = function (eventRanges, component, // TODO: kill
8802
- extraArgs) {
8803
- var segs = [];
8804
- for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
8805
- var eventRange = eventRanges_1[_i];
8806
- segs.push.apply(segs, this.sliceEventRange(eventRange, component, extraArgs));
8807
- }
8808
- return segs;
8809
- };
8810
- /*
8811
- "complete" seg means it has component and eventRange
8812
- */
8813
- Slicer.prototype.sliceEventRange = function (eventRange, component, // TODO: kill
8814
- extraArgs) {
8815
- var segs = this.sliceRange.apply(this, [eventRange.range].concat(extraArgs));
8816
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
8817
- var seg = segs_2[_i];
8818
- seg.component = component;
8819
- seg.eventRange = eventRange;
8820
- seg.isStart = eventRange.isStart && seg.isStart;
8821
- seg.isEnd = eventRange.isEnd && seg.isEnd;
8822
- }
8823
- return segs;
8824
- };
8825
- return Slicer;
8826
- }());
8827
- /*
8828
- for incorporating minTime/maxTime if appropriate
8829
- TODO: should be part of DateProfile!
8830
- TimelineDateProfile already does this btw
8831
- */
8832
- function computeActiveRange(dateProfile, isComponentAllDay) {
8833
- var range = dateProfile.activeRange;
8834
- if (isComponentAllDay) {
8835
- return range;
8836
- }
8837
- return {
8838
- start: addMs(range.start, dateProfile.minTime.milliseconds),
8839
- end: addMs(range.end, dateProfile.maxTime.milliseconds - 864e5) // 864e5 = ms in a day
8840
- };
8841
- }
8842
-
8843
- // exports
8844
- // --------------------------------------------------------------------------------------------------
8845
- var version = '4.3.1';
8846
-
8847
- exports.Calendar = Calendar;
8848
- exports.Component = Component;
8849
- exports.DateComponent = DateComponent;
8850
- exports.DateEnv = DateEnv;
8851
- exports.DateProfileGenerator = DateProfileGenerator;
8852
- exports.DayHeader = DayHeader;
8853
- exports.DaySeries = DaySeries;
8854
- exports.DayTable = DayTable;
8855
- exports.ElementDragging = ElementDragging;
8856
- exports.ElementScrollController = ElementScrollController;
8857
- exports.EmitterMixin = EmitterMixin;
8858
- exports.EventApi = EventApi;
8859
- exports.FgEventRenderer = FgEventRenderer;
8860
- exports.FillRenderer = FillRenderer;
8861
- exports.Interaction = Interaction;
8862
- exports.Mixin = Mixin;
8863
- exports.NamedTimeZoneImpl = NamedTimeZoneImpl;
8864
- exports.PositionCache = PositionCache;
8865
- exports.ScrollComponent = ScrollComponent;
8866
- exports.ScrollController = ScrollController;
8867
- exports.Slicer = Slicer;
8868
- exports.Splitter = Splitter;
8869
- exports.Theme = Theme;
8870
- exports.View = View;
8871
- exports.WindowScrollController = WindowScrollController;
8872
- exports.addDays = addDays;
8873
- exports.addDurations = addDurations;
8874
- exports.addMs = addMs;
8875
- exports.addWeeks = addWeeks;
8876
- exports.allowContextMenu = allowContextMenu;
8877
- exports.allowSelection = allowSelection;
8878
- exports.appendToElement = appendToElement;
8879
- exports.applyAll = applyAll;
8880
- exports.applyMutationToEventStore = applyMutationToEventStore;
8881
- exports.applyStyle = applyStyle;
8882
- exports.applyStyleProp = applyStyleProp;
8883
- exports.asRoughMinutes = asRoughMinutes;
8884
- exports.asRoughMs = asRoughMs;
8885
- exports.asRoughSeconds = asRoughSeconds;
8886
- exports.buildGotoAnchorHtml = buildGotoAnchorHtml;
8887
- exports.buildSegCompareObj = buildSegCompareObj;
8888
- exports.capitaliseFirstLetter = capitaliseFirstLetter;
8889
- exports.combineEventUis = combineEventUis;
8890
- exports.compareByFieldSpec = compareByFieldSpec;
8891
- exports.compareByFieldSpecs = compareByFieldSpecs;
8892
- exports.compareNumbers = compareNumbers;
8893
- exports.compensateScroll = compensateScroll;
8894
- exports.computeClippingRect = computeClippingRect;
8895
- exports.computeEdges = computeEdges;
8896
- exports.computeFallbackHeaderFormat = computeFallbackHeaderFormat;
8897
- exports.computeHeightAndMargins = computeHeightAndMargins;
8898
- exports.computeInnerRect = computeInnerRect;
8899
- exports.computeRect = computeRect;
8900
- exports.computeVisibleDayRange = computeVisibleDayRange;
8901
- exports.config = config;
8902
- exports.constrainPoint = constrainPoint;
8903
- exports.createDuration = createDuration;
8904
- exports.createElement = createElement;
8905
- exports.createEmptyEventStore = createEmptyEventStore;
8906
- exports.createEventInstance = createEventInstance;
8907
- exports.createFormatter = createFormatter;
8908
- exports.createPlugin = createPlugin;
8909
- exports.cssToStr = cssToStr;
8910
- exports.debounce = debounce;
8911
- exports.diffDates = diffDates;
8912
- exports.diffDayAndTime = diffDayAndTime;
8913
- exports.diffDays = diffDays;
8914
- exports.diffPoints = diffPoints;
8915
- exports.diffWeeks = diffWeeks;
8916
- exports.diffWholeDays = diffWholeDays;
8917
- exports.diffWholeWeeks = diffWholeWeeks;
8918
- exports.disableCursor = disableCursor;
8919
- exports.distributeHeight = distributeHeight;
8920
- exports.elementClosest = elementClosest;
8921
- exports.elementMatches = elementMatches;
8922
- exports.enableCursor = enableCursor;
8923
- exports.eventTupleToStore = eventTupleToStore;
8924
- exports.filterEventStoreDefs = filterEventStoreDefs;
8925
- exports.filterHash = filterHash;
8926
- exports.findChildren = findChildren;
8927
- exports.findElements = findElements;
8928
- exports.flexibleCompare = flexibleCompare;
8929
- exports.forceClassName = forceClassName;
8930
- exports.formatDate = formatDate;
8931
- exports.formatIsoTimeString = formatIsoTimeString;
8932
- exports.formatRange = formatRange;
8933
- exports.getAllDayHtml = getAllDayHtml;
8934
- exports.getClippingParents = getClippingParents;
8935
- exports.getDayClasses = getDayClasses;
8936
- exports.getElSeg = getElSeg;
8937
- exports.getRectCenter = getRectCenter;
8938
- exports.getRelevantEvents = getRelevantEvents;
8939
- exports.globalDefaults = globalDefaults;
8940
- exports.greatestDurationDenominator = greatestDurationDenominator;
8941
- exports.hasBgRendering = hasBgRendering;
8942
- exports.htmlEscape = htmlEscape;
8943
- exports.htmlToElement = htmlToElement;
8944
- exports.insertAfterElement = insertAfterElement;
8945
- exports.interactionSettingsStore = interactionSettingsStore;
8946
- exports.interactionSettingsToStore = interactionSettingsToStore;
8947
- exports.intersectRanges = intersectRanges;
8948
- exports.intersectRects = intersectRects;
8949
- exports.isArraysEqual = isArraysEqual;
8950
- exports.isDateSpansEqual = isDateSpansEqual;
8951
- exports.isInt = isInt;
8952
- exports.isInteractionValid = isInteractionValid;
8953
- exports.isMultiDayRange = isMultiDayRange;
8954
- exports.isPropsEqual = isPropsEqual;
8955
- exports.isPropsValid = isPropsValid;
8956
- exports.isSingleDay = isSingleDay;
8957
- exports.isValidDate = isValidDate;
8958
- exports.listenBySelector = listenBySelector;
8959
- exports.mapHash = mapHash;
8960
- exports.matchCellWidths = matchCellWidths;
8961
- exports.memoize = memoize;
8962
- exports.memoizeOutput = memoizeOutput;
8963
- exports.memoizeRendering = memoizeRendering;
8964
- exports.mergeEventStores = mergeEventStores;
8965
- exports.multiplyDuration = multiplyDuration;
8966
- exports.padStart = padStart;
8967
- exports.parseBusinessHours = parseBusinessHours;
8968
- exports.parseDragMeta = parseDragMeta;
8969
- exports.parseEventDef = parseEventDef;
8970
- exports.parseFieldSpecs = parseFieldSpecs;
8971
- exports.parseMarker = parse;
8972
- exports.pointInsideRect = pointInsideRect;
8973
- exports.prependToElement = prependToElement;
8974
- exports.preventContextMenu = preventContextMenu;
8975
- exports.preventDefault = preventDefault;
8976
- exports.preventSelection = preventSelection;
8977
- exports.processScopedUiProps = processScopedUiProps;
8978
- exports.rangeContainsMarker = rangeContainsMarker;
8979
- exports.rangeContainsRange = rangeContainsRange;
8980
- exports.rangesEqual = rangesEqual;
8981
- exports.rangesIntersect = rangesIntersect;
8982
- exports.refineProps = refineProps;
8983
- exports.removeElement = removeElement;
8984
- exports.removeExact = removeExact;
8985
- exports.renderDateCell = renderDateCell;
8986
- exports.requestJson = requestJson;
8987
- exports.sliceEventStore = sliceEventStore;
8988
- exports.startOfDay = startOfDay;
8989
- exports.subtractInnerElHeight = subtractInnerElHeight;
8990
- exports.translateRect = translateRect;
8991
- exports.uncompensateScroll = uncompensateScroll;
8992
- exports.undistributeHeight = undistributeHeight;
8993
- exports.unpromisify = unpromisify;
8994
- exports.version = version;
8995
- exports.whenTransitionDone = whenTransitionDone;
8996
- exports.wholeDivideDurations = wholeDivideDurations;
8997
-
8998
- Object.defineProperty(exports, '__esModule', { value: true });
8999
-
9000
- }));
9001
-
9002
- /*!
9003
- FullCalendar Day Grid Plugin v4.3.0
9004
- Docs & License: https://fullcalendar.io/
9005
- (c) 2019 Adam Shaw
9006
- */
9007
-
9008
- (function (global, factory) {
9009
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
9010
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
9011
- (global = global || self, factory(global.FullCalendarDayGrid = {}, global.FullCalendar));
9012
- }(this, function (exports, core) { 'use strict';
9013
-
9014
- /*! *****************************************************************************
9015
- Copyright (c) Microsoft Corporation. All rights reserved.
9016
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
9017
- this file except in compliance with the License. You may obtain a copy of the
9018
- License at http://www.apache.org/licenses/LICENSE-2.0
9019
-
9020
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
9021
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
9022
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
9023
- MERCHANTABLITY OR NON-INFRINGEMENT.
9024
-
9025
- See the Apache Version 2.0 License for specific language governing permissions
9026
- and limitations under the License.
9027
- ***************************************************************************** */
9028
- /* global Reflect, Promise */
9029
-
9030
- var extendStatics = function(d, b) {
9031
- extendStatics = Object.setPrototypeOf ||
9032
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
9033
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
9034
- return extendStatics(d, b);
9035
- };
9036
-
9037
- function __extends(d, b) {
9038
- extendStatics(d, b);
9039
- function __() { this.constructor = d; }
9040
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
9041
- }
9042
-
9043
- var __assign = function() {
9044
- __assign = Object.assign || function __assign(t) {
9045
- for (var s, i = 1, n = arguments.length; i < n; i++) {
9046
- s = arguments[i];
9047
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
9048
- }
9049
- return t;
9050
- };
9051
- return __assign.apply(this, arguments);
9052
- };
9053
-
9054
- var DayGridDateProfileGenerator = /** @class */ (function (_super) {
9055
- __extends(DayGridDateProfileGenerator, _super);
9056
- function DayGridDateProfileGenerator() {
9057
- return _super !== null && _super.apply(this, arguments) || this;
9058
- }
9059
- // Computes the date range that will be rendered.
9060
- DayGridDateProfileGenerator.prototype.buildRenderRange = function (currentRange, currentRangeUnit, isRangeAllDay) {
9061
- var dateEnv = this.dateEnv;
9062
- var renderRange = _super.prototype.buildRenderRange.call(this, currentRange, currentRangeUnit, isRangeAllDay);
9063
- var start = renderRange.start;
9064
- var end = renderRange.end;
9065
- var endOfWeek;
9066
- // year and month views should be aligned with weeks. this is already done for week
9067
- if (/^(year|month)$/.test(currentRangeUnit)) {
9068
- start = dateEnv.startOfWeek(start);
9069
- // make end-of-week if not already
9070
- endOfWeek = dateEnv.startOfWeek(end);
9071
- if (endOfWeek.valueOf() !== end.valueOf()) {
9072
- end = core.addWeeks(endOfWeek, 1);
9073
- }
9074
- }
9075
- // ensure 6 weeks
9076
- if (this.options.monthMode &&
9077
- this.options.fixedWeekCount) {
9078
- var rowCnt = Math.ceil(// could be partial weeks due to hiddenDays
9079
- core.diffWeeks(start, end));
9080
- end = core.addWeeks(end, 6 - rowCnt);
9081
- }
9082
- return { start: start, end: end };
9083
- };
9084
- return DayGridDateProfileGenerator;
9085
- }(core.DateProfileGenerator));
9086
-
9087
- /* A rectangular panel that is absolutely positioned over other content
9088
- ------------------------------------------------------------------------------------------------------------------------
9089
- Options:
9090
- - className (string)
9091
- - content (HTML string, element, or element array)
9092
- - parentEl
9093
- - top
9094
- - left
9095
- - right (the x coord of where the right edge should be. not a "CSS" right)
9096
- - autoHide (boolean)
9097
- - show (callback)
9098
- - hide (callback)
9099
- */
9100
- var Popover = /** @class */ (function () {
9101
- function Popover(options) {
9102
- var _this = this;
9103
- this.isHidden = true;
9104
- this.margin = 10; // the space required between the popover and the edges of the scroll container
9105
- // Triggered when the user clicks *anywhere* in the document, for the autoHide feature
9106
- this.documentMousedown = function (ev) {
9107
- // only hide the popover if the click happened outside the popover
9108
- if (_this.el && !_this.el.contains(ev.target)) {
9109
- _this.hide();
9110
- }
9111
- };
9112
- this.options = options;
9113
- }
9114
- // Shows the popover on the specified position. Renders it if not already
9115
- Popover.prototype.show = function () {
9116
- if (this.isHidden) {
9117
- if (!this.el) {
9118
- this.render();
9119
- }
9120
- this.el.style.display = '';
9121
- this.position();
9122
- this.isHidden = false;
9123
- this.trigger('show');
9124
- }
9125
- };
9126
- // Hides the popover, through CSS, but does not remove it from the DOM
9127
- Popover.prototype.hide = function () {
9128
- if (!this.isHidden) {
9129
- this.el.style.display = 'none';
9130
- this.isHidden = true;
9131
- this.trigger('hide');
9132
- }
9133
- };
9134
- // Creates `this.el` and renders content inside of it
9135
- Popover.prototype.render = function () {
9136
- var _this = this;
9137
- var options = this.options;
9138
- var el = this.el = core.createElement('div', {
9139
- className: 'fc-popover ' + (options.className || ''),
9140
- style: {
9141
- top: '0',
9142
- left: '0'
9143
- }
9144
- });
9145
- if (typeof options.content === 'function') {
9146
- options.content(el);
9147
- }
9148
- options.parentEl.appendChild(el);
9149
- // when a click happens on anything inside with a 'fc-close' className, hide the popover
9150
- core.listenBySelector(el, 'click', '.fc-close', function (ev) {
9151
- _this.hide();
9152
- });
9153
- if (options.autoHide) {
9154
- document.addEventListener('mousedown', this.documentMousedown);
9155
- }
9156
- };
9157
- // Hides and unregisters any handlers
9158
- Popover.prototype.destroy = function () {
9159
- this.hide();
9160
- if (this.el) {
9161
- core.removeElement(this.el);
9162
- this.el = null;
9163
- }
9164
- document.removeEventListener('mousedown', this.documentMousedown);
9165
- };
9166
- // Positions the popover optimally, using the top/left/right options
9167
- Popover.prototype.position = function () {
9168
- var options = this.options;
9169
- var el = this.el;
9170
- var elDims = el.getBoundingClientRect(); // only used for width,height
9171
- var origin = core.computeRect(el.offsetParent);
9172
- var clippingRect = core.computeClippingRect(options.parentEl);
9173
- var top; // the "position" (not "offset") values for the popover
9174
- var left; //
9175
- // compute top and left
9176
- top = options.top || 0;
9177
- if (options.left !== undefined) {
9178
- left = options.left;
9179
- }
9180
- else if (options.right !== undefined) {
9181
- left = options.right - elDims.width; // derive the left value from the right value
9182
- }
9183
- else {
9184
- left = 0;
9185
- }
9186
- // constrain to the view port. if constrained by two edges, give precedence to top/left
9187
- top = Math.min(top, clippingRect.bottom - elDims.height - this.margin);
9188
- top = Math.max(top, clippingRect.top + this.margin);
9189
- left = Math.min(left, clippingRect.right - elDims.width - this.margin);
9190
- left = Math.max(left, clippingRect.left + this.margin);
9191
- core.applyStyle(el, {
9192
- top: top - origin.top,
9193
- left: left - origin.left
9194
- });
9195
- };
9196
- // Triggers a callback. Calls a function in the option hash of the same name.
9197
- // Arguments beyond the first `name` are forwarded on.
9198
- // TODO: better code reuse for this. Repeat code
9199
- // can kill this???
9200
- Popover.prototype.trigger = function (name) {
9201
- if (this.options[name]) {
9202
- this.options[name].apply(this, Array.prototype.slice.call(arguments, 1));
9203
- }
9204
- };
9205
- return Popover;
9206
- }());
9207
-
9208
- /* Event-rendering methods for the DayGrid class
9209
- ----------------------------------------------------------------------------------------------------------------------*/
9210
- // "Simple" is bad a name. has nothing to do with SimpleDayGrid
9211
- var SimpleDayGridEventRenderer = /** @class */ (function (_super) {
9212
- __extends(SimpleDayGridEventRenderer, _super);
9213
- function SimpleDayGridEventRenderer() {
9214
- return _super !== null && _super.apply(this, arguments) || this;
9215
- }
9216
- // Builds the HTML to be used for the default element for an individual segment
9217
- SimpleDayGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
9218
- var _a = this.context, view = _a.view, options = _a.options;
9219
- var eventRange = seg.eventRange;
9220
- var eventDef = eventRange.def;
9221
- var eventUi = eventRange.ui;
9222
- var allDay = eventDef.allDay;
9223
- var isDraggable = view.computeEventDraggable(eventDef, eventUi);
9224
- var isResizableFromStart = allDay && seg.isStart && view.computeEventStartResizable(eventDef, eventUi);
9225
- var isResizableFromEnd = allDay && seg.isEnd && view.computeEventEndResizable(eventDef, eventUi);
9226
- var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
9227
- var skinCss = core.cssToStr(this.getSkinCss(eventUi));
9228
- var timeHtml = '';
9229
- var timeText;
9230
- var titleHtml;
9231
- classes.unshift('fc-day-grid-event', 'fc-h-event');
9232
- // Only display a timed events time if it is the starting segment
9233
- if (seg.isStart) {
9234
- timeText = this.getTimeText(eventRange);
9235
- if (timeText) {
9236
- timeHtml = '<span class="fc-time">' + core.htmlEscape(timeText) + '</span>';
9237
- }
9238
- }
9239
- titleHtml =
9240
- '<span class="fc-title">' +
9241
- (core.htmlEscape(eventDef.title || '') || '&nbsp;') + // we always want one line of height
9242
- '</span>';
9243
- return '<a class="' + classes.join(' ') + '"' +
9244
- (eventDef.url ?
9245
- ' href="' + core.htmlEscape(eventDef.url) + '"' :
9246
- '') +
9247
- (skinCss ?
9248
- ' style="' + skinCss + '"' :
9249
- '') +
9250
- '>' +
9251
- '<div class="fc-content">' +
9252
- (options.dir === 'rtl' ?
9253
- titleHtml + ' ' + timeHtml : // put a natural space in between
9254
- timeHtml + ' ' + titleHtml //
9255
- ) +
9256
- '</div>' +
9257
- (isResizableFromStart ?
9258
- '<div class="fc-resizer fc-start-resizer"></div>' :
9259
- '') +
9260
- (isResizableFromEnd ?
9261
- '<div class="fc-resizer fc-end-resizer"></div>' :
9262
- '') +
9263
- '</a>';
9264
- };
9265
- // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
9266
- SimpleDayGridEventRenderer.prototype.computeEventTimeFormat = function () {
9267
- return {
9268
- hour: 'numeric',
9269
- minute: '2-digit',
9270
- omitZeroMinute: true,
9271
- meridiem: 'narrow'
9272
- };
9273
- };
9274
- SimpleDayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
9275
- return false; // TODO: somehow consider the originating DayGrid's column count
9276
- };
9277
- return SimpleDayGridEventRenderer;
9278
- }(core.FgEventRenderer));
9279
-
9280
- /* Event-rendering methods for the DayGrid class
9281
- ----------------------------------------------------------------------------------------------------------------------*/
9282
- var DayGridEventRenderer = /** @class */ (function (_super) {
9283
- __extends(DayGridEventRenderer, _super);
9284
- function DayGridEventRenderer(dayGrid) {
9285
- var _this = _super.call(this, dayGrid.context) || this;
9286
- _this.dayGrid = dayGrid;
9287
- return _this;
9288
- }
9289
- // Renders the given foreground event segments onto the grid
9290
- DayGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
9291
- var rowStructs = this.rowStructs = this.renderSegRows(segs);
9292
- // append to each row's content skeleton
9293
- this.dayGrid.rowEls.forEach(function (rowNode, i) {
9294
- rowNode.querySelector('.fc-content-skeleton > table').appendChild(rowStructs[i].tbodyEl);
9295
- });
9296
- // removes the "more.." events popover
9297
- if (!mirrorInfo) {
9298
- this.dayGrid.removeSegPopover();
9299
- }
9300
- };
9301
- // Unrenders all currently rendered foreground event segments
9302
- DayGridEventRenderer.prototype.detachSegs = function () {
9303
- var rowStructs = this.rowStructs || [];
9304
- var rowStruct;
9305
- while ((rowStruct = rowStructs.pop())) {
9306
- core.removeElement(rowStruct.tbodyEl);
9307
- }
9308
- this.rowStructs = null;
9309
- };
9310
- // Uses the given events array to generate <tbody> elements that should be appended to each row's content skeleton.
9311
- // Returns an array of rowStruct objects (see the bottom of `renderSegRow`).
9312
- // PRECONDITION: each segment shoud already have a rendered and assigned `.el`
9313
- DayGridEventRenderer.prototype.renderSegRows = function (segs) {
9314
- var rowStructs = [];
9315
- var segRows;
9316
- var row;
9317
- segRows = this.groupSegRows(segs); // group into nested arrays
9318
- // iterate each row of segment groupings
9319
- for (row = 0; row < segRows.length; row++) {
9320
- rowStructs.push(this.renderSegRow(row, segRows[row]));
9321
- }
9322
- return rowStructs;
9323
- };
9324
- // Given a row # and an array of segments all in the same row, render a <tbody> element, a skeleton that contains
9325
- // the segments. Returns object with a bunch of internal data about how the render was calculated.
9326
- // NOTE: modifies rowSegs
9327
- DayGridEventRenderer.prototype.renderSegRow = function (row, rowSegs) {
9328
- var dayGrid = this.dayGrid;
9329
- var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
9330
- var segLevels = this.buildSegLevels(rowSegs); // group into sub-arrays of levels
9331
- var levelCnt = Math.max(1, segLevels.length); // ensure at least one level
9332
- var tbody = document.createElement('tbody');
9333
- var segMatrix = []; // lookup for which segments are rendered into which level+col cells
9334
- var cellMatrix = []; // lookup for all <td> elements of the level+col matrix
9335
- var loneCellMatrix = []; // lookup for <td> elements that only take up a single column
9336
- var i;
9337
- var levelSegs;
9338
- var col;
9339
- var tr;
9340
- var j;
9341
- var seg;
9342
- var td;
9343
- // populates empty cells from the current column (`col`) to `endCol`
9344
- function emptyCellsUntil(endCol) {
9345
- while (col < endCol) {
9346
- // try to grab a cell from the level above and extend its rowspan. otherwise, create a fresh cell
9347
- td = (loneCellMatrix[i - 1] || [])[col];
9348
- if (td) {
9349
- td.rowSpan = (td.rowSpan || 1) + 1;
9350
- }
9351
- else {
9352
- td = document.createElement('td');
9353
- tr.appendChild(td);
9354
- }
9355
- cellMatrix[i][col] = td;
9356
- loneCellMatrix[i][col] = td;
9357
- col++;
9358
- }
9359
- }
9360
- for (i = 0; i < levelCnt; i++) { // iterate through all levels
9361
- levelSegs = segLevels[i];
9362
- col = 0;
9363
- tr = document.createElement('tr');
9364
- segMatrix.push([]);
9365
- cellMatrix.push([]);
9366
- loneCellMatrix.push([]);
9367
- // levelCnt might be 1 even though there are no actual levels. protect against this.
9368
- // this single empty row is useful for styling.
9369
- if (levelSegs) {
9370
- for (j = 0; j < levelSegs.length; j++) { // iterate through segments in level
9371
- seg = levelSegs[j];
9372
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
9373
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
9374
- emptyCellsUntil(leftCol);
9375
- // create a container that occupies or more columns. append the event element.
9376
- td = core.createElement('td', { className: 'fc-event-container' }, seg.el);
9377
- if (leftCol !== rightCol) {
9378
- td.colSpan = rightCol - leftCol + 1;
9379
- }
9380
- else { // a single-column segment
9381
- loneCellMatrix[i][col] = td;
9382
- }
9383
- while (col <= rightCol) {
9384
- cellMatrix[i][col] = td;
9385
- segMatrix[i][col] = seg;
9386
- col++;
9387
- }
9388
- tr.appendChild(td);
9389
- }
9390
- }
9391
- emptyCellsUntil(colCnt); // finish off the row
9392
- var introHtml = dayGrid.renderProps.renderIntroHtml();
9393
- if (introHtml) {
9394
- if (dayGrid.isRtl) {
9395
- core.appendToElement(tr, introHtml);
9396
- }
9397
- else {
9398
- core.prependToElement(tr, introHtml);
9399
- }
9400
- }
9401
- tbody.appendChild(tr);
9402
- }
9403
- return {
9404
- row: row,
9405
- tbodyEl: tbody,
9406
- cellMatrix: cellMatrix,
9407
- segMatrix: segMatrix,
9408
- segLevels: segLevels,
9409
- segs: rowSegs
9410
- };
9411
- };
9412
- // Stacks a flat array of segments, which are all assumed to be in the same row, into subarrays of vertical levels.
9413
- // NOTE: modifies segs
9414
- DayGridEventRenderer.prototype.buildSegLevels = function (segs) {
9415
- var _a = this.dayGrid, isRtl = _a.isRtl, colCnt = _a.colCnt;
9416
- var levels = [];
9417
- var i;
9418
- var seg;
9419
- var j;
9420
- // Give preference to elements with certain criteria, so they have
9421
- // a chance to be closer to the top.
9422
- segs = this.sortEventSegs(segs);
9423
- for (i = 0; i < segs.length; i++) {
9424
- seg = segs[i];
9425
- // loop through levels, starting with the topmost, until the segment doesn't collide with other segments
9426
- for (j = 0; j < levels.length; j++) {
9427
- if (!isDaySegCollision(seg, levels[j])) {
9428
- break;
9429
- }
9430
- }
9431
- // `j` now holds the desired subrow index
9432
- seg.level = j;
9433
- seg.leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol; // for sorting only
9434
- seg.rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol // for sorting only
9435
- ;
9436
- (levels[j] || (levels[j] = [])).push(seg);
9437
- }
9438
- // order segments left-to-right. very important if calendar is RTL
9439
- for (j = 0; j < levels.length; j++) {
9440
- levels[j].sort(compareDaySegCols);
9441
- }
9442
- return levels;
9443
- };
9444
- // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's row
9445
- DayGridEventRenderer.prototype.groupSegRows = function (segs) {
9446
- var segRows = [];
9447
- var i;
9448
- for (i = 0; i < this.dayGrid.rowCnt; i++) {
9449
- segRows.push([]);
9450
- }
9451
- for (i = 0; i < segs.length; i++) {
9452
- segRows[segs[i].row].push(segs[i]);
9453
- }
9454
- return segRows;
9455
- };
9456
- // Computes a default `displayEventEnd` value if one is not expliclty defined
9457
- DayGridEventRenderer.prototype.computeDisplayEventEnd = function () {
9458
- return this.dayGrid.colCnt === 1; // we'll likely have space if there's only one day
9459
- };
9460
- return DayGridEventRenderer;
9461
- }(SimpleDayGridEventRenderer));
9462
- // Computes whether two segments' columns collide. They are assumed to be in the same row.
9463
- function isDaySegCollision(seg, otherSegs) {
9464
- var i;
9465
- var otherSeg;
9466
- for (i = 0; i < otherSegs.length; i++) {
9467
- otherSeg = otherSegs[i];
9468
- if (otherSeg.firstCol <= seg.lastCol &&
9469
- otherSeg.lastCol >= seg.firstCol) {
9470
- return true;
9471
- }
9472
- }
9473
- return false;
9474
- }
9475
- // A cmp function for determining the leftmost event
9476
- function compareDaySegCols(a, b) {
9477
- return a.leftCol - b.leftCol;
9478
- }
9479
-
9480
- var DayGridMirrorRenderer = /** @class */ (function (_super) {
9481
- __extends(DayGridMirrorRenderer, _super);
9482
- function DayGridMirrorRenderer() {
9483
- return _super !== null && _super.apply(this, arguments) || this;
9484
- }
9485
- DayGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
9486
- var sourceSeg = mirrorInfo.sourceSeg;
9487
- var rowStructs = this.rowStructs = this.renderSegRows(segs);
9488
- // inject each new event skeleton into each associated row
9489
- this.dayGrid.rowEls.forEach(function (rowNode, row) {
9490
- var skeletonEl = core.htmlToElement('<div class="fc-mirror-skeleton"><table></table></div>'); // will be absolutely positioned
9491
- var skeletonTopEl;
9492
- var skeletonTop;
9493
- // If there is an original segment, match the top position. Otherwise, put it at the row's top level
9494
- if (sourceSeg && sourceSeg.row === row) {
9495
- skeletonTopEl = sourceSeg.el;
9496
- }
9497
- else {
9498
- skeletonTopEl = rowNode.querySelector('.fc-content-skeleton tbody');
9499
- if (!skeletonTopEl) { // when no events
9500
- skeletonTopEl = rowNode.querySelector('.fc-content-skeleton table');
9501
- }
9502
- }
9503
- skeletonTop = skeletonTopEl.getBoundingClientRect().top -
9504
- rowNode.getBoundingClientRect().top; // the offsetParent origin
9505
- skeletonEl.style.top = skeletonTop + 'px';
9506
- skeletonEl.querySelector('table').appendChild(rowStructs[row].tbodyEl);
9507
- rowNode.appendChild(skeletonEl);
9508
- });
9509
- };
9510
- return DayGridMirrorRenderer;
9511
- }(DayGridEventRenderer));
9512
-
9513
- var EMPTY_CELL_HTML = '<td style="pointer-events:none"></td>';
9514
- var DayGridFillRenderer = /** @class */ (function (_super) {
9515
- __extends(DayGridFillRenderer, _super);
9516
- function DayGridFillRenderer(dayGrid) {
9517
- var _this = _super.call(this, dayGrid.context) || this;
9518
- _this.fillSegTag = 'td'; // override the default tag name
9519
- _this.dayGrid = dayGrid;
9520
- return _this;
9521
- }
9522
- DayGridFillRenderer.prototype.renderSegs = function (type, segs) {
9523
- // don't render timed background events
9524
- if (type === 'bgEvent') {
9525
- segs = segs.filter(function (seg) {
9526
- return seg.eventRange.def.allDay;
9527
- });
9528
- }
9529
- _super.prototype.renderSegs.call(this, type, segs);
9530
- };
9531
- DayGridFillRenderer.prototype.attachSegs = function (type, segs) {
9532
- var els = [];
9533
- var i;
9534
- var seg;
9535
- var skeletonEl;
9536
- for (i = 0; i < segs.length; i++) {
9537
- seg = segs[i];
9538
- skeletonEl = this.renderFillRow(type, seg);
9539
- this.dayGrid.rowEls[seg.row].appendChild(skeletonEl);
9540
- els.push(skeletonEl);
9541
- }
9542
- return els;
9543
- };
9544
- // Generates the HTML needed for one row of a fill. Requires the seg's el to be rendered.
9545
- DayGridFillRenderer.prototype.renderFillRow = function (type, seg) {
9546
- var dayGrid = this.dayGrid;
9547
- var colCnt = dayGrid.colCnt, isRtl = dayGrid.isRtl;
9548
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
9549
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
9550
- var startCol = leftCol;
9551
- var endCol = rightCol + 1;
9552
- var className;
9553
- var skeletonEl;
9554
- var trEl;
9555
- if (type === 'businessHours') {
9556
- className = 'bgevent';
9557
- }
9558
- else {
9559
- className = type.toLowerCase();
9560
- }
9561
- skeletonEl = core.htmlToElement('<div class="fc-' + className + '-skeleton">' +
9562
- '<table><tr></tr></table>' +
9563
- '</div>');
9564
- trEl = skeletonEl.getElementsByTagName('tr')[0];
9565
- if (startCol > 0) {
9566
- core.appendToElement(trEl,
9567
- // will create (startCol + 1) td's
9568
- new Array(startCol + 1).join(EMPTY_CELL_HTML));
9569
- }
9570
- seg.el.colSpan = endCol - startCol;
9571
- trEl.appendChild(seg.el);
9572
- if (endCol < colCnt) {
9573
- core.appendToElement(trEl,
9574
- // will create (colCnt - endCol) td's
9575
- new Array(colCnt - endCol + 1).join(EMPTY_CELL_HTML));
9576
- }
9577
- var introHtml = dayGrid.renderProps.renderIntroHtml();
9578
- if (introHtml) {
9579
- if (dayGrid.isRtl) {
9580
- core.appendToElement(trEl, introHtml);
9581
- }
9582
- else {
9583
- core.prependToElement(trEl, introHtml);
9584
- }
9585
- }
9586
- return skeletonEl;
9587
- };
9588
- return DayGridFillRenderer;
9589
- }(core.FillRenderer));
9590
-
9591
- var DayTile = /** @class */ (function (_super) {
9592
- __extends(DayTile, _super);
9593
- function DayTile(context, el) {
9594
- var _this = _super.call(this, context, el) || this;
9595
- var eventRenderer = _this.eventRenderer = new DayTileEventRenderer(_this);
9596
- var renderFrame = _this.renderFrame = core.memoizeRendering(_this._renderFrame);
9597
- _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderFrame]);
9598
- _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
9599
- _this.renderEventDrag = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
9600
- _this.renderEventResize = core.memoizeRendering(eventRenderer.hideByHash.bind(eventRenderer), eventRenderer.showByHash.bind(eventRenderer), [renderFrame]);
9601
- context.calendar.registerInteractiveComponent(_this, {
9602
- el: _this.el,
9603
- useEventCenter: false
9604
- });
9605
- return _this;
9606
- }
9607
- DayTile.prototype.render = function (props) {
9608
- this.renderFrame(props.date);
9609
- this.renderFgEvents(props.fgSegs);
9610
- this.renderEventSelection(props.eventSelection);
9611
- this.renderEventDrag(props.eventDragInstances);
9612
- this.renderEventResize(props.eventResizeInstances);
9613
- };
9614
- DayTile.prototype.destroy = function () {
9615
- _super.prototype.destroy.call(this);
9616
- this.renderFrame.unrender(); // should unrender everything else
9617
- this.calendar.unregisterInteractiveComponent(this);
9618
- };
9619
- DayTile.prototype._renderFrame = function (date) {
9620
- var _a = this, theme = _a.theme, dateEnv = _a.dateEnv;
9621
- var title = dateEnv.format(date, core.createFormatter(this.opt('dayPopoverFormat')) // TODO: cache
9622
- );
9623
- this.el.innerHTML =
9624
- '<div class="fc-header ' + theme.getClass('popoverHeader') + '">' +
9625
- '<span class="fc-title">' +
9626
- core.htmlEscape(title) +
9627
- '</span>' +
9628
- '<span class="fc-close ' + theme.getIconClass('close') + '"></span>' +
9629
- '</div>' +
9630
- '<div class="fc-body ' + theme.getClass('popoverContent') + '">' +
9631
- '<div class="fc-event-container"></div>' +
9632
- '</div>';
9633
- this.segContainerEl = this.el.querySelector('.fc-event-container');
9634
- };
9635
- DayTile.prototype.queryHit = function (positionLeft, positionTop, elWidth, elHeight) {
9636
- var date = this.props.date; // HACK
9637
- if (positionLeft < elWidth && positionTop < elHeight) {
9638
- return {
9639
- component: this,
9640
- dateSpan: {
9641
- allDay: true,
9642
- range: { start: date, end: core.addDays(date, 1) }
9643
- },
9644
- dayEl: this.el,
9645
- rect: {
9646
- left: 0,
9647
- top: 0,
9648
- right: elWidth,
9649
- bottom: elHeight
9650
- },
9651
- layer: 1
9652
- };
9653
- }
9654
- };
9655
- return DayTile;
9656
- }(core.DateComponent));
9657
- var DayTileEventRenderer = /** @class */ (function (_super) {
9658
- __extends(DayTileEventRenderer, _super);
9659
- function DayTileEventRenderer(dayTile) {
9660
- var _this = _super.call(this, dayTile.context) || this;
9661
- _this.dayTile = dayTile;
9662
- return _this;
9663
- }
9664
- DayTileEventRenderer.prototype.attachSegs = function (segs) {
9665
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
9666
- var seg = segs_1[_i];
9667
- this.dayTile.segContainerEl.appendChild(seg.el);
9668
- }
9669
- };
9670
- DayTileEventRenderer.prototype.detachSegs = function (segs) {
9671
- for (var _i = 0, segs_2 = segs; _i < segs_2.length; _i++) {
9672
- var seg = segs_2[_i];
9673
- core.removeElement(seg.el);
9674
- }
9675
- };
9676
- return DayTileEventRenderer;
9677
- }(SimpleDayGridEventRenderer));
9678
-
9679
- var DayBgRow = /** @class */ (function () {
9680
- function DayBgRow(context) {
9681
- this.context = context;
9682
- }
9683
- DayBgRow.prototype.renderHtml = function (props) {
9684
- var parts = [];
9685
- if (props.renderIntroHtml) {
9686
- parts.push(props.renderIntroHtml());
9687
- }
9688
- for (var _i = 0, _a = props.cells; _i < _a.length; _i++) {
9689
- var cell = _a[_i];
9690
- parts.push(renderCellHtml(cell.date, props.dateProfile, this.context, cell.htmlAttrs));
9691
- }
9692
- if (!props.cells.length) {
9693
- parts.push('<td class="fc-day ' + this.context.theme.getClass('widgetContent') + '"></td>');
9694
- }
9695
- if (this.context.options.dir === 'rtl') {
9696
- parts.reverse();
9697
- }
9698
- return '<tr>' + parts.join('') + '</tr>';
9699
- };
9700
- return DayBgRow;
9701
- }());
9702
- function renderCellHtml(date, dateProfile, context, otherAttrs) {
9703
- var dateEnv = context.dateEnv, theme = context.theme;
9704
- var isDateValid = core.rangeContainsMarker(dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
9705
- var classes = core.getDayClasses(date, dateProfile, context);
9706
- classes.unshift('fc-day', theme.getClass('widgetContent'));
9707
- return '<td class="' + classes.join(' ') + '"' +
9708
- (isDateValid ?
9709
- ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
9710
- '') +
9711
- (otherAttrs ?
9712
- ' ' + otherAttrs :
9713
- '') +
9714
- '></td>';
9715
- }
9716
-
9717
- var DAY_NUM_FORMAT = core.createFormatter({ day: 'numeric' });
9718
- var WEEK_NUM_FORMAT = core.createFormatter({ week: 'numeric' });
9719
- var DayGrid = /** @class */ (function (_super) {
9720
- __extends(DayGrid, _super);
9721
- function DayGrid(context, el, renderProps) {
9722
- var _this = _super.call(this, context, el) || this;
9723
- _this.bottomCoordPadding = 0; // hack for extending the hit area for the last row of the coordinate grid
9724
- _this.isCellSizesDirty = false;
9725
- var eventRenderer = _this.eventRenderer = new DayGridEventRenderer(_this);
9726
- var fillRenderer = _this.fillRenderer = new DayGridFillRenderer(_this);
9727
- _this.mirrorRenderer = new DayGridMirrorRenderer(_this);
9728
- var renderCells = _this.renderCells = core.memoizeRendering(_this._renderCells, _this._unrenderCells);
9729
- _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderCells]);
9730
- _this.renderDateSelection = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'highlight'), fillRenderer.unrender.bind(fillRenderer, 'highlight'), [renderCells]);
9731
- _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderCells]);
9732
- _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderCells]);
9733
- _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
9734
- _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderCells]);
9735
- _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderCells]);
9736
- _this.renderProps = renderProps;
9737
- return _this;
9738
- }
9739
- DayGrid.prototype.render = function (props) {
9740
- var cells = props.cells;
9741
- this.rowCnt = cells.length;
9742
- this.colCnt = cells[0].length;
9743
- this.renderCells(cells, props.isRigid);
9744
- this.renderBusinessHours(props.businessHourSegs);
9745
- this.renderDateSelection(props.dateSelectionSegs);
9746
- this.renderBgEvents(props.bgEventSegs);
9747
- this.renderFgEvents(props.fgEventSegs);
9748
- this.renderEventSelection(props.eventSelection);
9749
- this.renderEventDrag(props.eventDrag);
9750
- this.renderEventResize(props.eventResize);
9751
- if (this.segPopoverTile) {
9752
- this.updateSegPopoverTile();
9753
- }
9754
- };
9755
- DayGrid.prototype.destroy = function () {
9756
- _super.prototype.destroy.call(this);
9757
- this.renderCells.unrender(); // will unrender everything else
9758
- };
9759
- DayGrid.prototype.getCellRange = function (row, col) {
9760
- var start = this.props.cells[row][col].date;
9761
- var end = core.addDays(start, 1);
9762
- return { start: start, end: end };
9763
- };
9764
- DayGrid.prototype.updateSegPopoverTile = function (date, segs) {
9765
- var ownProps = this.props;
9766
- this.segPopoverTile.receiveProps({
9767
- date: date || this.segPopoverTile.props.date,
9768
- fgSegs: segs || this.segPopoverTile.props.fgSegs,
9769
- eventSelection: ownProps.eventSelection,
9770
- eventDragInstances: ownProps.eventDrag ? ownProps.eventDrag.affectedInstances : null,
9771
- eventResizeInstances: ownProps.eventResize ? ownProps.eventResize.affectedInstances : null
9772
- });
9773
- };
9774
- /* Date Rendering
9775
- ------------------------------------------------------------------------------------------------------------------*/
9776
- DayGrid.prototype._renderCells = function (cells, isRigid) {
9777
- var _a = this, view = _a.view, dateEnv = _a.dateEnv;
9778
- var _b = this, rowCnt = _b.rowCnt, colCnt = _b.colCnt;
9779
- var html = '';
9780
- var row;
9781
- var col;
9782
- for (row = 0; row < rowCnt; row++) {
9783
- html += this.renderDayRowHtml(row, isRigid);
9784
- }
9785
- this.el.innerHTML = html;
9786
- this.rowEls = core.findElements(this.el, '.fc-row');
9787
- this.cellEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
9788
- if (this.isRtl) {
9789
- this.cellEls.reverse();
9790
- }
9791
- this.rowPositions = new core.PositionCache(this.el, this.rowEls, false, true // vertical
9792
- );
9793
- this.colPositions = new core.PositionCache(this.el, this.cellEls.slice(0, colCnt), // only the first row
9794
- true, false // horizontal
9795
- );
9796
- // trigger dayRender with each cell's element
9797
- for (row = 0; row < rowCnt; row++) {
9798
- for (col = 0; col < colCnt; col++) {
9799
- this.publiclyTrigger('dayRender', [
9800
- {
9801
- date: dateEnv.toDate(cells[row][col].date),
9802
- el: this.getCellEl(row, col),
9803
- view: view
9804
- }
9805
- ]);
9806
- }
9807
- }
9808
- this.isCellSizesDirty = true;
9809
- };
9810
- DayGrid.prototype._unrenderCells = function () {
9811
- this.removeSegPopover();
9812
- };
9813
- // Generates the HTML for a single row, which is a div that wraps a table.
9814
- // `row` is the row number.
9815
- DayGrid.prototype.renderDayRowHtml = function (row, isRigid) {
9816
- var theme = this.theme;
9817
- var classes = ['fc-row', 'fc-week', theme.getClass('dayRow')];
9818
- if (isRigid) {
9819
- classes.push('fc-rigid');
9820
- }
9821
- var bgRow = new DayBgRow(this.context);
9822
- return '' +
9823
- '<div class="' + classes.join(' ') + '">' +
9824
- '<div class="fc-bg">' +
9825
- '<table class="' + theme.getClass('tableGrid') + '">' +
9826
- bgRow.renderHtml({
9827
- cells: this.props.cells[row],
9828
- dateProfile: this.props.dateProfile,
9829
- renderIntroHtml: this.renderProps.renderBgIntroHtml
9830
- }) +
9831
- '</table>' +
9832
- '</div>' +
9833
- '<div class="fc-content-skeleton">' +
9834
- '<table>' +
9835
- (this.getIsNumbersVisible() ?
9836
- '<thead>' +
9837
- this.renderNumberTrHtml(row) +
9838
- '</thead>' :
9839
- '') +
9840
- '</table>' +
9841
- '</div>' +
9842
- '</div>';
9843
- };
9844
- DayGrid.prototype.getIsNumbersVisible = function () {
9845
- return this.getIsDayNumbersVisible() ||
9846
- this.renderProps.cellWeekNumbersVisible ||
9847
- this.renderProps.colWeekNumbersVisible;
9848
- };
9849
- DayGrid.prototype.getIsDayNumbersVisible = function () {
9850
- return this.rowCnt > 1;
9851
- };
9852
- /* Grid Number Rendering
9853
- ------------------------------------------------------------------------------------------------------------------*/
9854
- DayGrid.prototype.renderNumberTrHtml = function (row) {
9855
- var intro = this.renderProps.renderNumberIntroHtml(row, this);
9856
- return '' +
9857
- '<tr>' +
9858
- (this.isRtl ? '' : intro) +
9859
- this.renderNumberCellsHtml(row) +
9860
- (this.isRtl ? intro : '') +
9861
- '</tr>';
9862
- };
9863
- DayGrid.prototype.renderNumberCellsHtml = function (row) {
9864
- var htmls = [];
9865
- var col;
9866
- var date;
9867
- for (col = 0; col < this.colCnt; col++) {
9868
- date = this.props.cells[row][col].date;
9869
- htmls.push(this.renderNumberCellHtml(date));
9870
- }
9871
- if (this.isRtl) {
9872
- htmls.reverse();
9873
- }
9874
- return htmls.join('');
9875
- };
9876
- // Generates the HTML for the <td>s of the "number" row in the DayGrid's content skeleton.
9877
- // The number row will only exist if either day numbers or week numbers are turned on.
9878
- DayGrid.prototype.renderNumberCellHtml = function (date) {
9879
- var _a = this, view = _a.view, dateEnv = _a.dateEnv;
9880
- var html = '';
9881
- var isDateValid = core.rangeContainsMarker(this.props.dateProfile.activeRange, date); // TODO: called too frequently. cache somehow.
9882
- var isDayNumberVisible = this.getIsDayNumbersVisible() && isDateValid;
9883
- var classes;
9884
- var weekCalcFirstDow;
9885
- if (!isDayNumberVisible && !this.renderProps.cellWeekNumbersVisible) {
9886
- // no numbers in day cell (week number must be along the side)
9887
- return '<td></td>'; // will create an empty space above events :(
9888
- }
9889
- classes = core.getDayClasses(date, this.props.dateProfile, this.context);
9890
- classes.unshift('fc-day-top');
9891
- if (this.renderProps.cellWeekNumbersVisible) {
9892
- weekCalcFirstDow = dateEnv.weekDow;
9893
- }
9894
- html += '<td class="' + classes.join(' ') + '"' +
9895
- (isDateValid ?
9896
- ' data-date="' + dateEnv.formatIso(date, { omitTime: true }) + '"' :
9897
- '') +
9898
- '>';
9899
- if (this.renderProps.cellWeekNumbersVisible && (date.getUTCDay() === weekCalcFirstDow)) {
9900
- html += core.buildGotoAnchorHtml(view, { date: date, type: 'week' }, { 'class': 'fc-week-number' }, dateEnv.format(date, WEEK_NUM_FORMAT) // inner HTML
9901
- );
9902
- }
9903
- if (isDayNumberVisible) {
9904
- html += core.buildGotoAnchorHtml(view, date, { 'class': 'fc-day-number' }, dateEnv.format(date, DAY_NUM_FORMAT) // inner HTML
9905
- );
9906
- }
9907
- html += '</td>';
9908
- return html;
9909
- };
9910
- /* Sizing
9911
- ------------------------------------------------------------------------------------------------------------------*/
9912
- DayGrid.prototype.updateSize = function (isResize) {
9913
- var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
9914
- if (isResize ||
9915
- this.isCellSizesDirty ||
9916
- this.view.calendar.isEventsUpdated // hack
9917
- ) {
9918
- this.buildPositionCaches();
9919
- this.isCellSizesDirty = false;
9920
- }
9921
- fillRenderer.computeSizes(isResize);
9922
- eventRenderer.computeSizes(isResize);
9923
- mirrorRenderer.computeSizes(isResize);
9924
- fillRenderer.assignSizes(isResize);
9925
- eventRenderer.assignSizes(isResize);
9926
- mirrorRenderer.assignSizes(isResize);
9927
- };
9928
- DayGrid.prototype.buildPositionCaches = function () {
9929
- this.buildColPositions();
9930
- this.buildRowPositions();
9931
- };
9932
- DayGrid.prototype.buildColPositions = function () {
9933
- this.colPositions.build();
9934
- };
9935
- DayGrid.prototype.buildRowPositions = function () {
9936
- this.rowPositions.build();
9937
- this.rowPositions.bottoms[this.rowCnt - 1] += this.bottomCoordPadding; // hack
9938
- };
9939
- /* Hit System
9940
- ------------------------------------------------------------------------------------------------------------------*/
9941
- DayGrid.prototype.positionToHit = function (leftPosition, topPosition) {
9942
- var _a = this, colPositions = _a.colPositions, rowPositions = _a.rowPositions;
9943
- var col = colPositions.leftToIndex(leftPosition);
9944
- var row = rowPositions.topToIndex(topPosition);
9945
- if (row != null && col != null) {
9946
- return {
9947
- row: row,
9948
- col: col,
9949
- dateSpan: {
9950
- range: this.getCellRange(row, col),
9951
- allDay: true
9952
- },
9953
- dayEl: this.getCellEl(row, col),
9954
- relativeRect: {
9955
- left: colPositions.lefts[col],
9956
- right: colPositions.rights[col],
9957
- top: rowPositions.tops[row],
9958
- bottom: rowPositions.bottoms[row]
9959
- }
9960
- };
9961
- }
9962
- };
9963
- /* Cell System
9964
- ------------------------------------------------------------------------------------------------------------------*/
9965
- // FYI: the first column is the leftmost column, regardless of date
9966
- DayGrid.prototype.getCellEl = function (row, col) {
9967
- return this.cellEls[row * this.colCnt + col];
9968
- };
9969
- /* Event Drag Visualization
9970
- ------------------------------------------------------------------------------------------------------------------*/
9971
- DayGrid.prototype._renderEventDrag = function (state) {
9972
- if (state) {
9973
- this.eventRenderer.hideByHash(state.affectedInstances);
9974
- this.fillRenderer.renderSegs('highlight', state.segs);
9975
- }
9976
- };
9977
- DayGrid.prototype._unrenderEventDrag = function (state) {
9978
- if (state) {
9979
- this.eventRenderer.showByHash(state.affectedInstances);
9980
- this.fillRenderer.unrender('highlight');
9981
- }
9982
- };
9983
- /* Event Resize Visualization
9984
- ------------------------------------------------------------------------------------------------------------------*/
9985
- DayGrid.prototype._renderEventResize = function (state) {
9986
- if (state) {
9987
- this.eventRenderer.hideByHash(state.affectedInstances);
9988
- this.fillRenderer.renderSegs('highlight', state.segs);
9989
- this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
9990
- }
9991
- };
9992
- DayGrid.prototype._unrenderEventResize = function (state) {
9993
- if (state) {
9994
- this.eventRenderer.showByHash(state.affectedInstances);
9995
- this.fillRenderer.unrender('highlight');
9996
- this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
9997
- }
9998
- };
9999
- /* More+ Link Popover
10000
- ------------------------------------------------------------------------------------------------------------------*/
10001
- DayGrid.prototype.removeSegPopover = function () {
10002
- if (this.segPopover) {
10003
- this.segPopover.hide(); // in handler, will call segPopover's removeElement
10004
- }
10005
- };
10006
- // Limits the number of "levels" (vertically stacking layers of events) for each row of the grid.
10007
- // `levelLimit` can be false (don't limit), a number, or true (should be computed).
10008
- DayGrid.prototype.limitRows = function (levelLimit) {
10009
- var rowStructs = this.eventRenderer.rowStructs || [];
10010
- var row; // row #
10011
- var rowLevelLimit;
10012
- for (row = 0; row < rowStructs.length; row++) {
10013
- this.unlimitRow(row);
10014
- if (!levelLimit) {
10015
- rowLevelLimit = false;
10016
- }
10017
- else if (typeof levelLimit === 'number') {
10018
- rowLevelLimit = levelLimit;
10019
- }
10020
- else {
10021
- rowLevelLimit = this.computeRowLevelLimit(row);
10022
- }
10023
- if (rowLevelLimit !== false) {
10024
- this.limitRow(row, rowLevelLimit);
10025
- }
10026
- }
10027
- };
10028
- // Computes the number of levels a row will accomodate without going outside its bounds.
10029
- // Assumes the row is "rigid" (maintains a constant height regardless of what is inside).
10030
- // `row` is the row number.
10031
- DayGrid.prototype.computeRowLevelLimit = function (row) {
10032
- var rowEl = this.rowEls[row]; // the containing "fake" row div
10033
- var rowBottom = rowEl.getBoundingClientRect().bottom; // relative to viewport!
10034
- var trEls = core.findChildren(this.eventRenderer.rowStructs[row].tbodyEl);
10035
- var i;
10036
- var trEl;
10037
- // Reveal one level <tr> at a time and stop when we find one out of bounds
10038
- for (i = 0; i < trEls.length; i++) {
10039
- trEl = trEls[i];
10040
- trEl.classList.remove('fc-limited'); // reset to original state (reveal)
10041
- if (trEl.getBoundingClientRect().bottom > rowBottom) {
10042
- return i;
10043
- }
10044
- }
10045
- return false; // should not limit at all
10046
- };
10047
- // Limits the given grid row to the maximum number of levels and injects "more" links if necessary.
10048
- // `row` is the row number.
10049
- // `levelLimit` is a number for the maximum (inclusive) number of levels allowed.
10050
- DayGrid.prototype.limitRow = function (row, levelLimit) {
10051
- var _this = this;
10052
- var _a = this, colCnt = _a.colCnt, isRtl = _a.isRtl;
10053
- var rowStruct = this.eventRenderer.rowStructs[row];
10054
- var moreNodes = []; // array of "more" <a> links and <td> DOM nodes
10055
- var col = 0; // col #, left-to-right (not chronologically)
10056
- var levelSegs; // array of segment objects in the last allowable level, ordered left-to-right
10057
- var cellMatrix; // a matrix (by level, then column) of all <td> elements in the row
10058
- var limitedNodes; // array of temporarily hidden level <tr> and segment <td> DOM nodes
10059
- var i;
10060
- var seg;
10061
- var segsBelow; // array of segment objects below `seg` in the current `col`
10062
- var totalSegsBelow; // total number of segments below `seg` in any of the columns `seg` occupies
10063
- var colSegsBelow; // array of segment arrays, below seg, one for each column (offset from segs's first column)
10064
- var td;
10065
- var rowSpan;
10066
- var segMoreNodes; // array of "more" <td> cells that will stand-in for the current seg's cell
10067
- var j;
10068
- var moreTd;
10069
- var moreWrap;
10070
- var moreLink;
10071
- // Iterates through empty level cells and places "more" links inside if need be
10072
- var emptyCellsUntil = function (endCol) {
10073
- while (col < endCol) {
10074
- segsBelow = _this.getCellSegs(row, col, levelLimit);
10075
- if (segsBelow.length) {
10076
- td = cellMatrix[levelLimit - 1][col];
10077
- moreLink = _this.renderMoreLink(row, col, segsBelow);
10078
- moreWrap = core.createElement('div', null, moreLink);
10079
- td.appendChild(moreWrap);
10080
- moreNodes.push(moreWrap);
10081
- }
10082
- col++;
10083
- }
10084
- };
10085
- if (levelLimit && levelLimit < rowStruct.segLevels.length) { // is it actually over the limit?
10086
- levelSegs = rowStruct.segLevels[levelLimit - 1];
10087
- cellMatrix = rowStruct.cellMatrix;
10088
- limitedNodes = core.findChildren(rowStruct.tbodyEl).slice(levelLimit); // get level <tr> elements past the limit
10089
- limitedNodes.forEach(function (node) {
10090
- node.classList.add('fc-limited'); // hide elements and get a simple DOM-nodes array
10091
- });
10092
- // iterate though segments in the last allowable level
10093
- for (i = 0; i < levelSegs.length; i++) {
10094
- seg = levelSegs[i];
10095
- var leftCol = isRtl ? (colCnt - 1 - seg.lastCol) : seg.firstCol;
10096
- var rightCol = isRtl ? (colCnt - 1 - seg.firstCol) : seg.lastCol;
10097
- emptyCellsUntil(leftCol); // process empty cells before the segment
10098
- // determine *all* segments below `seg` that occupy the same columns
10099
- colSegsBelow = [];
10100
- totalSegsBelow = 0;
10101
- while (col <= rightCol) {
10102
- segsBelow = this.getCellSegs(row, col, levelLimit);
10103
- colSegsBelow.push(segsBelow);
10104
- totalSegsBelow += segsBelow.length;
10105
- col++;
10106
- }
10107
- if (totalSegsBelow) { // do we need to replace this segment with one or many "more" links?
10108
- td = cellMatrix[levelLimit - 1][leftCol]; // the segment's parent cell
10109
- rowSpan = td.rowSpan || 1;
10110
- segMoreNodes = [];
10111
- // make a replacement <td> for each column the segment occupies. will be one for each colspan
10112
- for (j = 0; j < colSegsBelow.length; j++) {
10113
- moreTd = core.createElement('td', { className: 'fc-more-cell', rowSpan: rowSpan });
10114
- segsBelow = colSegsBelow[j];
10115
- moreLink = this.renderMoreLink(row, leftCol + j, [seg].concat(segsBelow) // count seg as hidden too
10116
- );
10117
- moreWrap = core.createElement('div', null, moreLink);
10118
- moreTd.appendChild(moreWrap);
10119
- segMoreNodes.push(moreTd);
10120
- moreNodes.push(moreTd);
10121
- }
10122
- td.classList.add('fc-limited');
10123
- core.insertAfterElement(td, segMoreNodes);
10124
- limitedNodes.push(td);
10125
- }
10126
- }
10127
- emptyCellsUntil(this.colCnt); // finish off the level
10128
- rowStruct.moreEls = moreNodes; // for easy undoing later
10129
- rowStruct.limitedEls = limitedNodes; // for easy undoing later
10130
- }
10131
- };
10132
- // Reveals all levels and removes all "more"-related elements for a grid's row.
10133
- // `row` is a row number.
10134
- DayGrid.prototype.unlimitRow = function (row) {
10135
- var rowStruct = this.eventRenderer.rowStructs[row];
10136
- if (rowStruct.moreEls) {
10137
- rowStruct.moreEls.forEach(core.removeElement);
10138
- rowStruct.moreEls = null;
10139
- }
10140
- if (rowStruct.limitedEls) {
10141
- rowStruct.limitedEls.forEach(function (limitedEl) {
10142
- limitedEl.classList.remove('fc-limited');
10143
- });
10144
- rowStruct.limitedEls = null;
10145
- }
10146
- };
10147
- // Renders an <a> element that represents hidden event element for a cell.
10148
- // Responsible for attaching click handler as well.
10149
- DayGrid.prototype.renderMoreLink = function (row, col, hiddenSegs) {
10150
- var _this = this;
10151
- var _a = this, view = _a.view, dateEnv = _a.dateEnv;
10152
- var a = core.createElement('a', { className: 'fc-more' });
10153
- a.innerText = this.getMoreLinkText(hiddenSegs.length);
10154
- a.addEventListener('click', function (ev) {
10155
- var clickOption = _this.opt('eventLimitClick');
10156
- var _col = _this.isRtl ? _this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
10157
- var date = _this.props.cells[row][_col].date;
10158
- var moreEl = ev.currentTarget;
10159
- var dayEl = _this.getCellEl(row, col);
10160
- var allSegs = _this.getCellSegs(row, col);
10161
- // rescope the segments to be within the cell's date
10162
- var reslicedAllSegs = _this.resliceDaySegs(allSegs, date);
10163
- var reslicedHiddenSegs = _this.resliceDaySegs(hiddenSegs, date);
10164
- if (typeof clickOption === 'function') {
10165
- // the returned value can be an atomic option
10166
- clickOption = _this.publiclyTrigger('eventLimitClick', [
10167
- {
10168
- date: dateEnv.toDate(date),
10169
- allDay: true,
10170
- dayEl: dayEl,
10171
- moreEl: moreEl,
10172
- segs: reslicedAllSegs,
10173
- hiddenSegs: reslicedHiddenSegs,
10174
- jsEvent: ev,
10175
- view: view
10176
- }
10177
- ]);
10178
- }
10179
- if (clickOption === 'popover') {
10180
- _this.showSegPopover(row, col, moreEl, reslicedAllSegs);
10181
- }
10182
- else if (typeof clickOption === 'string') { // a view name
10183
- view.calendar.zoomTo(date, clickOption);
10184
- }
10185
- });
10186
- return a;
10187
- };
10188
- // Reveals the popover that displays all events within a cell
10189
- DayGrid.prototype.showSegPopover = function (row, col, moreLink, segs) {
10190
- var _this = this;
10191
- var _a = this, calendar = _a.calendar, view = _a.view, theme = _a.theme;
10192
- var _col = this.isRtl ? this.colCnt - col - 1 : col; // HACK: props.cells has different dir system?
10193
- var moreWrap = moreLink.parentNode; // the <div> wrapper around the <a>
10194
- var topEl; // the element we want to match the top coordinate of
10195
- var options;
10196
- if (this.rowCnt === 1) {
10197
- topEl = view.el; // will cause the popover to cover any sort of header
10198
- }
10199
- else {
10200
- topEl = this.rowEls[row]; // will align with top of row
10201
- }
10202
- options = {
10203
- className: 'fc-more-popover ' + theme.getClass('popover'),
10204
- parentEl: view.el,
10205
- top: core.computeRect(topEl).top,
10206
- autoHide: true,
10207
- content: function (el) {
10208
- _this.segPopoverTile = new DayTile(_this.context, el);
10209
- _this.updateSegPopoverTile(_this.props.cells[row][_col].date, segs);
10210
- },
10211
- hide: function () {
10212
- _this.segPopoverTile.destroy();
10213
- _this.segPopoverTile = null;
10214
- _this.segPopover.destroy();
10215
- _this.segPopover = null;
10216
- }
10217
- };
10218
- // Determine horizontal coordinate.
10219
- // We use the moreWrap instead of the <td> to avoid border confusion.
10220
- if (this.isRtl) {
10221
- options.right = core.computeRect(moreWrap).right + 1; // +1 to be over cell border
10222
- }
10223
- else {
10224
- options.left = core.computeRect(moreWrap).left - 1; // -1 to be over cell border
10225
- }
10226
- this.segPopover = new Popover(options);
10227
- this.segPopover.show();
10228
- calendar.releaseAfterSizingTriggers(); // hack for eventPositioned
10229
- };
10230
- // Given the events within an array of segment objects, reslice them to be in a single day
10231
- DayGrid.prototype.resliceDaySegs = function (segs, dayDate) {
10232
- var dayStart = dayDate;
10233
- var dayEnd = core.addDays(dayStart, 1);
10234
- var dayRange = { start: dayStart, end: dayEnd };
10235
- var newSegs = [];
10236
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
10237
- var seg = segs_1[_i];
10238
- var eventRange = seg.eventRange;
10239
- var origRange = eventRange.range;
10240
- var slicedRange = core.intersectRanges(origRange, dayRange);
10241
- if (slicedRange) {
10242
- newSegs.push(__assign({}, seg, { eventRange: {
10243
- def: eventRange.def,
10244
- ui: __assign({}, eventRange.ui, { durationEditable: false }),
10245
- instance: eventRange.instance,
10246
- range: slicedRange
10247
- }, isStart: seg.isStart && slicedRange.start.valueOf() === origRange.start.valueOf(), isEnd: seg.isEnd && slicedRange.end.valueOf() === origRange.end.valueOf() }));
10248
- }
10249
- }
10250
- return newSegs;
10251
- };
10252
- // Generates the text that should be inside a "more" link, given the number of events it represents
10253
- DayGrid.prototype.getMoreLinkText = function (num) {
10254
- var opt = this.opt('eventLimitText');
10255
- if (typeof opt === 'function') {
10256
- return opt(num);
10257
- }
10258
- else {
10259
- return '+' + num + ' ' + opt;
10260
- }
10261
- };
10262
- // Returns segments within a given cell.
10263
- // If `startLevel` is specified, returns only events including and below that level. Otherwise returns all segs.
10264
- DayGrid.prototype.getCellSegs = function (row, col, startLevel) {
10265
- var segMatrix = this.eventRenderer.rowStructs[row].segMatrix;
10266
- var level = startLevel || 0;
10267
- var segs = [];
10268
- var seg;
10269
- while (level < segMatrix.length) {
10270
- seg = segMatrix[level][col];
10271
- if (seg) {
10272
- segs.push(seg);
10273
- }
10274
- level++;
10275
- }
10276
- return segs;
10277
- };
10278
- return DayGrid;
10279
- }(core.DateComponent));
10280
-
10281
- var WEEK_NUM_FORMAT$1 = core.createFormatter({ week: 'numeric' });
10282
- /* An abstract class for the daygrid views, as well as month view. Renders one or more rows of day cells.
10283
- ----------------------------------------------------------------------------------------------------------------------*/
10284
- // It is a manager for a DayGrid subcomponent, which does most of the heavy lifting.
10285
- // It is responsible for managing width/height.
10286
- var DayGridView = /** @class */ (function (_super) {
10287
- __extends(DayGridView, _super);
10288
- function DayGridView(context, viewSpec, dateProfileGenerator, parentEl) {
10289
- var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
10290
- /* Header Rendering
10291
- ------------------------------------------------------------------------------------------------------------------*/
10292
- // Generates the HTML that will go before the day-of week header cells
10293
- _this.renderHeadIntroHtml = function () {
10294
- var theme = _this.theme;
10295
- if (_this.colWeekNumbersVisible) {
10296
- return '' +
10297
- '<th class="fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.weekNumberStyleAttr() + '>' +
10298
- '<span>' + // needed for matchCellWidths
10299
- core.htmlEscape(_this.opt('weekLabel')) +
10300
- '</span>' +
10301
- '</th>';
10302
- }
10303
- return '';
10304
- };
10305
- /* Day Grid Rendering
10306
- ------------------------------------------------------------------------------------------------------------------*/
10307
- // Generates the HTML that will go before content-skeleton cells that display the day/week numbers
10308
- _this.renderDayGridNumberIntroHtml = function (row, dayGrid) {
10309
- var dateEnv = _this.dateEnv;
10310
- var weekStart = dayGrid.props.cells[row][0].date;
10311
- if (_this.colWeekNumbersVisible) {
10312
- return '' +
10313
- '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '>' +
10314
- core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
10315
- _this, { date: weekStart, type: 'week', forceOff: dayGrid.colCnt === 1 }, dateEnv.format(weekStart, WEEK_NUM_FORMAT$1) // inner HTML
10316
- ) +
10317
- '</td>';
10318
- }
10319
- return '';
10320
- };
10321
- // Generates the HTML that goes before the day bg cells for each day-row
10322
- _this.renderDayGridBgIntroHtml = function () {
10323
- var theme = _this.theme;
10324
- if (_this.colWeekNumbersVisible) {
10325
- return '<td class="fc-week-number ' + theme.getClass('widgetContent') + '" ' + _this.weekNumberStyleAttr() + '></td>';
10326
- }
10327
- return '';
10328
- };
10329
- // Generates the HTML that goes before every other type of row generated by DayGrid.
10330
- // Affects mirror-skeleton and highlight-skeleton rows.
10331
- _this.renderDayGridIntroHtml = function () {
10332
- if (_this.colWeekNumbersVisible) {
10333
- return '<td class="fc-week-number" ' + _this.weekNumberStyleAttr() + '></td>';
10334
- }
10335
- return '';
10336
- };
10337
- _this.el.classList.add('fc-dayGrid-view');
10338
- _this.el.innerHTML = _this.renderSkeletonHtml();
10339
- _this.scroller = new core.ScrollComponent('hidden', // overflow x
10340
- 'auto' // overflow y
10341
- );
10342
- var dayGridContainerEl = _this.scroller.el;
10343
- _this.el.querySelector('.fc-body > tr > td').appendChild(dayGridContainerEl);
10344
- dayGridContainerEl.classList.add('fc-day-grid-container');
10345
- var dayGridEl = core.createElement('div', { className: 'fc-day-grid' });
10346
- dayGridContainerEl.appendChild(dayGridEl);
10347
- var cellWeekNumbersVisible;
10348
- if (_this.opt('weekNumbers')) {
10349
- if (_this.opt('weekNumbersWithinDays')) {
10350
- cellWeekNumbersVisible = true;
10351
- _this.colWeekNumbersVisible = false;
10352
- }
10353
- else {
10354
- cellWeekNumbersVisible = false;
10355
- _this.colWeekNumbersVisible = true;
10356
- }
10357
- }
10358
- else {
10359
- _this.colWeekNumbersVisible = false;
10360
- cellWeekNumbersVisible = false;
10361
- }
10362
- _this.dayGrid = new DayGrid(_this.context, dayGridEl, {
10363
- renderNumberIntroHtml: _this.renderDayGridNumberIntroHtml,
10364
- renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
10365
- renderIntroHtml: _this.renderDayGridIntroHtml,
10366
- colWeekNumbersVisible: _this.colWeekNumbersVisible,
10367
- cellWeekNumbersVisible: cellWeekNumbersVisible
10368
- });
10369
- return _this;
10370
- }
10371
- DayGridView.prototype.destroy = function () {
10372
- _super.prototype.destroy.call(this);
10373
- this.dayGrid.destroy();
10374
- this.scroller.destroy();
10375
- };
10376
- // Builds the HTML skeleton for the view.
10377
- // The day-grid component will render inside of a container defined by this HTML.
10378
- DayGridView.prototype.renderSkeletonHtml = function () {
10379
- var theme = this.theme;
10380
- return '' +
10381
- '<table class="' + theme.getClass('tableGrid') + '">' +
10382
- (this.opt('columnHeader') ?
10383
- '<thead class="fc-head">' +
10384
- '<tr>' +
10385
- '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
10386
- '</tr>' +
10387
- '</thead>' :
10388
- '') +
10389
- '<tbody class="fc-body">' +
10390
- '<tr>' +
10391
- '<td class="' + theme.getClass('widgetContent') + '"></td>' +
10392
- '</tr>' +
10393
- '</tbody>' +
10394
- '</table>';
10395
- };
10396
- // Generates an HTML attribute string for setting the width of the week number column, if it is known
10397
- DayGridView.prototype.weekNumberStyleAttr = function () {
10398
- if (this.weekNumberWidth != null) {
10399
- return 'style="width:' + this.weekNumberWidth + 'px"';
10400
- }
10401
- return '';
10402
- };
10403
- // Determines whether each row should have a constant height
10404
- DayGridView.prototype.hasRigidRows = function () {
10405
- var eventLimit = this.opt('eventLimit');
10406
- return eventLimit && typeof eventLimit !== 'number';
10407
- };
10408
- /* Dimensions
10409
- ------------------------------------------------------------------------------------------------------------------*/
10410
- DayGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
10411
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
10412
- this.dayGrid.updateSize(isResize);
10413
- };
10414
- // Refreshes the horizontal dimensions of the view
10415
- DayGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
10416
- var dayGrid = this.dayGrid;
10417
- var eventLimit = this.opt('eventLimit');
10418
- var headRowEl = this.header ? this.header.el : null; // HACK
10419
- var scrollerHeight;
10420
- var scrollbarWidths;
10421
- // hack to give the view some height prior to dayGrid's columns being rendered
10422
- // TODO: separate setting height from scroller VS dayGrid.
10423
- if (!dayGrid.rowEls) {
10424
- if (!isAuto) {
10425
- scrollerHeight = this.computeScrollerHeight(viewHeight);
10426
- this.scroller.setHeight(scrollerHeight);
10427
- }
10428
- return;
10429
- }
10430
- if (this.colWeekNumbersVisible) {
10431
- // Make sure all week number cells running down the side have the same width.
10432
- this.weekNumberWidth = core.matchCellWidths(core.findElements(this.el, '.fc-week-number'));
10433
- }
10434
- // reset all heights to be natural
10435
- this.scroller.clear();
10436
- if (headRowEl) {
10437
- core.uncompensateScroll(headRowEl);
10438
- }
10439
- dayGrid.removeSegPopover(); // kill the "more" popover if displayed
10440
- // is the event limit a constant level number?
10441
- if (eventLimit && typeof eventLimit === 'number') {
10442
- dayGrid.limitRows(eventLimit); // limit the levels first so the height can redistribute after
10443
- }
10444
- // distribute the height to the rows
10445
- // (viewHeight is a "recommended" value if isAuto)
10446
- scrollerHeight = this.computeScrollerHeight(viewHeight);
10447
- this.setGridHeight(scrollerHeight, isAuto);
10448
- // is the event limit dynamically calculated?
10449
- if (eventLimit && typeof eventLimit !== 'number') {
10450
- dayGrid.limitRows(eventLimit); // limit the levels after the grid's row heights have been set
10451
- }
10452
- if (!isAuto) { // should we force dimensions of the scroll container?
10453
- this.scroller.setHeight(scrollerHeight);
10454
- scrollbarWidths = this.scroller.getScrollbarWidths();
10455
- if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
10456
- if (headRowEl) {
10457
- core.compensateScroll(headRowEl, scrollbarWidths);
10458
- }
10459
- // doing the scrollbar compensation might have created text overflow which created more height. redo
10460
- scrollerHeight = this.computeScrollerHeight(viewHeight);
10461
- this.scroller.setHeight(scrollerHeight);
10462
- }
10463
- // guarantees the same scrollbar widths
10464
- this.scroller.lockOverflow(scrollbarWidths);
10465
- }
10466
- };
10467
- // given a desired total height of the view, returns what the height of the scroller should be
10468
- DayGridView.prototype.computeScrollerHeight = function (viewHeight) {
10469
- return viewHeight -
10470
- core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
10471
- };
10472
- // Sets the height of just the DayGrid component in this view
10473
- DayGridView.prototype.setGridHeight = function (height, isAuto) {
10474
- if (this.opt('monthMode')) {
10475
- // if auto, make the height of each row the height that it would be if there were 6 weeks
10476
- if (isAuto) {
10477
- height *= this.dayGrid.rowCnt / 6;
10478
- }
10479
- core.distributeHeight(this.dayGrid.rowEls, height, !isAuto); // if auto, don't compensate for height-hogging rows
10480
- }
10481
- else {
10482
- if (isAuto) {
10483
- core.undistributeHeight(this.dayGrid.rowEls); // let the rows be their natural height with no expanding
10484
- }
10485
- else {
10486
- core.distributeHeight(this.dayGrid.rowEls, height, true); // true = compensate for height-hogging rows
10487
- }
10488
- }
10489
- };
10490
- /* Scroll
10491
- ------------------------------------------------------------------------------------------------------------------*/
10492
- DayGridView.prototype.computeDateScroll = function (duration) {
10493
- return { top: 0 };
10494
- };
10495
- DayGridView.prototype.queryDateScroll = function () {
10496
- return { top: this.scroller.getScrollTop() };
10497
- };
10498
- DayGridView.prototype.applyDateScroll = function (scroll) {
10499
- if (scroll.top !== undefined) {
10500
- this.scroller.setScrollTop(scroll.top);
10501
- }
10502
- };
10503
- return DayGridView;
10504
- }(core.View));
10505
- DayGridView.prototype.dateProfileGeneratorClass = DayGridDateProfileGenerator;
10506
-
10507
- var SimpleDayGrid = /** @class */ (function (_super) {
10508
- __extends(SimpleDayGrid, _super);
10509
- function SimpleDayGrid(context, dayGrid) {
10510
- var _this = _super.call(this, context, dayGrid.el) || this;
10511
- _this.slicer = new DayGridSlicer();
10512
- _this.dayGrid = dayGrid;
10513
- context.calendar.registerInteractiveComponent(_this, { el: _this.dayGrid.el });
10514
- return _this;
10515
- }
10516
- SimpleDayGrid.prototype.destroy = function () {
10517
- _super.prototype.destroy.call(this);
10518
- this.calendar.unregisterInteractiveComponent(this);
10519
- };
10520
- SimpleDayGrid.prototype.render = function (props) {
10521
- var dayGrid = this.dayGrid;
10522
- var dateProfile = props.dateProfile, dayTable = props.dayTable;
10523
- dayGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, props.nextDayThreshold, dayGrid, dayTable), { dateProfile: dateProfile, cells: dayTable.cells, isRigid: props.isRigid }));
10524
- };
10525
- SimpleDayGrid.prototype.buildPositionCaches = function () {
10526
- this.dayGrid.buildPositionCaches();
10527
- };
10528
- SimpleDayGrid.prototype.queryHit = function (positionLeft, positionTop) {
10529
- var rawHit = this.dayGrid.positionToHit(positionLeft, positionTop);
10530
- if (rawHit) {
10531
- return {
10532
- component: this.dayGrid,
10533
- dateSpan: rawHit.dateSpan,
10534
- dayEl: rawHit.dayEl,
10535
- rect: {
10536
- left: rawHit.relativeRect.left,
10537
- right: rawHit.relativeRect.right,
10538
- top: rawHit.relativeRect.top,
10539
- bottom: rawHit.relativeRect.bottom
10540
- },
10541
- layer: 0
10542
- };
10543
- }
10544
- };
10545
- return SimpleDayGrid;
10546
- }(core.DateComponent));
10547
- var DayGridSlicer = /** @class */ (function (_super) {
10548
- __extends(DayGridSlicer, _super);
10549
- function DayGridSlicer() {
10550
- return _super !== null && _super.apply(this, arguments) || this;
10551
- }
10552
- DayGridSlicer.prototype.sliceRange = function (dateRange, dayTable) {
10553
- return dayTable.sliceRange(dateRange);
10554
- };
10555
- return DayGridSlicer;
10556
- }(core.Slicer));
10557
-
10558
- var DayGridView$1 = /** @class */ (function (_super) {
10559
- __extends(DayGridView, _super);
10560
- function DayGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
10561
- var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
10562
- _this.buildDayTable = core.memoize(buildDayTable);
10563
- if (_this.opt('columnHeader')) {
10564
- _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
10565
- }
10566
- _this.simpleDayGrid = new SimpleDayGrid(_this.context, _this.dayGrid);
10567
- return _this;
10568
- }
10569
- DayGridView.prototype.destroy = function () {
10570
- _super.prototype.destroy.call(this);
10571
- if (this.header) {
10572
- this.header.destroy();
10573
- }
10574
- this.simpleDayGrid.destroy();
10575
- };
10576
- DayGridView.prototype.render = function (props) {
10577
- _super.prototype.render.call(this, props);
10578
- var dateProfile = this.props.dateProfile;
10579
- var dayTable = this.dayTable =
10580
- this.buildDayTable(dateProfile, this.dateProfileGenerator);
10581
- if (this.header) {
10582
- this.header.receiveProps({
10583
- dateProfile: dateProfile,
10584
- dates: dayTable.headerDates,
10585
- datesRepDistinctDays: dayTable.rowCnt === 1,
10586
- renderIntroHtml: this.renderHeadIntroHtml
10587
- });
10588
- }
10589
- this.simpleDayGrid.receiveProps({
10590
- dateProfile: dateProfile,
10591
- dayTable: dayTable,
10592
- businessHours: props.businessHours,
10593
- dateSelection: props.dateSelection,
10594
- eventStore: props.eventStore,
10595
- eventUiBases: props.eventUiBases,
10596
- eventSelection: props.eventSelection,
10597
- eventDrag: props.eventDrag,
10598
- eventResize: props.eventResize,
10599
- isRigid: this.hasRigidRows(),
10600
- nextDayThreshold: this.nextDayThreshold
10601
- });
10602
- };
10603
- return DayGridView;
10604
- }(DayGridView));
10605
- function buildDayTable(dateProfile, dateProfileGenerator) {
10606
- var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
10607
- return new core.DayTable(daySeries, /year|month|week/.test(dateProfile.currentRangeUnit));
10608
- }
10609
-
10610
- var main = core.createPlugin({
10611
- defaultView: 'dayGridMonth',
10612
- views: {
10613
- dayGrid: DayGridView$1,
10614
- dayGridDay: {
10615
- type: 'dayGrid',
10616
- duration: { days: 1 }
10617
- },
10618
- dayGridWeek: {
10619
- type: 'dayGrid',
10620
- duration: { weeks: 1 }
10621
- },
10622
- dayGridMonth: {
10623
- type: 'dayGrid',
10624
- duration: { months: 1 },
10625
- monthMode: true,
10626
- fixedWeekCount: true
10627
- }
10628
- }
10629
- });
10630
-
10631
- exports.AbstractDayGridView = DayGridView;
10632
- exports.DayBgRow = DayBgRow;
10633
- exports.DayGrid = DayGrid;
10634
- exports.DayGridSlicer = DayGridSlicer;
10635
- exports.DayGridView = DayGridView$1;
10636
- exports.SimpleDayGrid = SimpleDayGrid;
10637
- exports.buildBasicDayTable = buildDayTable;
10638
- exports.default = main;
10639
-
10640
- Object.defineProperty(exports, '__esModule', { value: true });
10641
-
10642
- }));
10643
-
10644
- /*!
10645
- FullCalendar List View Plugin v4.3.0
10646
- Docs & License: https://fullcalendar.io/
10647
- (c) 2019 Adam Shaw
10648
- */
10649
-
10650
- (function (global, factory) {
10651
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core')) :
10652
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core'], factory) :
10653
- (global = global || self, factory(global.FullCalendarList = {}, global.FullCalendar));
10654
- }(this, function (exports, core) { 'use strict';
10655
-
10656
- /*! *****************************************************************************
10657
- Copyright (c) Microsoft Corporation. All rights reserved.
10658
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
10659
- this file except in compliance with the License. You may obtain a copy of the
10660
- License at http://www.apache.org/licenses/LICENSE-2.0
10661
-
10662
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
10663
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
10664
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
10665
- MERCHANTABLITY OR NON-INFRINGEMENT.
10666
-
10667
- See the Apache Version 2.0 License for specific language governing permissions
10668
- and limitations under the License.
10669
- ***************************************************************************** */
10670
- /* global Reflect, Promise */
10671
-
10672
- var extendStatics = function(d, b) {
10673
- extendStatics = Object.setPrototypeOf ||
10674
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
10675
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
10676
- return extendStatics(d, b);
10677
- };
10678
-
10679
- function __extends(d, b) {
10680
- extendStatics(d, b);
10681
- function __() { this.constructor = d; }
10682
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
10683
- }
10684
-
10685
- var ListEventRenderer = /** @class */ (function (_super) {
10686
- __extends(ListEventRenderer, _super);
10687
- function ListEventRenderer(listView) {
10688
- var _this = _super.call(this, listView.context) || this;
10689
- _this.listView = listView;
10690
- return _this;
10691
- }
10692
- ListEventRenderer.prototype.attachSegs = function (segs) {
10693
- if (!segs.length) {
10694
- this.listView.renderEmptyMessage();
10695
- }
10696
- else {
10697
- this.listView.renderSegList(segs);
10698
- }
10699
- };
10700
- ListEventRenderer.prototype.detachSegs = function () {
10701
- };
10702
- // generates the HTML for a single event row
10703
- ListEventRenderer.prototype.renderSegHtml = function (seg) {
10704
- var _a = this.context, view = _a.view, theme = _a.theme;
10705
- var eventRange = seg.eventRange;
10706
- var eventDef = eventRange.def;
10707
- var eventInstance = eventRange.instance;
10708
- var eventUi = eventRange.ui;
10709
- var url = eventDef.url;
10710
- var classes = ['fc-list-item'].concat(eventUi.classNames);
10711
- var bgColor = eventUi.backgroundColor;
10712
- var timeHtml;
10713
- if (eventDef.allDay) {
10714
- timeHtml = core.getAllDayHtml(view);
10715
- }
10716
- else if (core.isMultiDayRange(eventRange.range)) {
10717
- if (seg.isStart) {
10718
- timeHtml = core.htmlEscape(this._getTimeText(eventInstance.range.start, seg.end, false // allDay
10719
- ));
10720
- }
10721
- else if (seg.isEnd) {
10722
- timeHtml = core.htmlEscape(this._getTimeText(seg.start, eventInstance.range.end, false // allDay
10723
- ));
10724
- }
10725
- else { // inner segment that lasts the whole day
10726
- timeHtml = core.getAllDayHtml(view);
10727
- }
10728
- }
10729
- else {
10730
- // Display the normal time text for the *event's* times
10731
- timeHtml = core.htmlEscape(this.getTimeText(eventRange));
10732
- }
10733
- if (url) {
10734
- classes.push('fc-has-url');
10735
- }
10736
- return '<tr class="' + classes.join(' ') + '">' +
10737
- (this.displayEventTime ?
10738
- '<td class="fc-list-item-time ' + theme.getClass('widgetContent') + '">' +
10739
- (timeHtml || '') +
10740
- '</td>' :
10741
- '') +
10742
- '<td class="fc-list-item-marker ' + theme.getClass('widgetContent') + '">' +
10743
- '<span class="fc-event-dot"' +
10744
- (bgColor ?
10745
- ' style="background-color:' + bgColor + '"' :
10746
- '') +
10747
- '></span>' +
10748
- '</td>' +
10749
- '<td class="fc-list-item-title ' + theme.getClass('widgetContent') + '">' +
10750
- '<a' + (url ? ' href="' + core.htmlEscape(url) + '"' : '') + '>' +
10751
- core.htmlEscape(eventDef.title || '') +
10752
- '</a>' +
10753
- '</td>' +
10754
- '</tr>';
10755
- };
10756
- // like "4:00am"
10757
- ListEventRenderer.prototype.computeEventTimeFormat = function () {
10758
- return {
10759
- hour: 'numeric',
10760
- minute: '2-digit',
10761
- meridiem: 'short'
10762
- };
10763
- };
10764
- return ListEventRenderer;
10765
- }(core.FgEventRenderer));
10766
-
10767
- /*
10768
- Responsible for the scroller, and forwarding event-related actions into the "grid".
10769
- */
10770
- var ListView = /** @class */ (function (_super) {
10771
- __extends(ListView, _super);
10772
- function ListView(context, viewSpec, dateProfileGenerator, parentEl) {
10773
- var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
10774
- _this.computeDateVars = core.memoize(computeDateVars);
10775
- _this.eventStoreToSegs = core.memoize(_this._eventStoreToSegs);
10776
- var eventRenderer = _this.eventRenderer = new ListEventRenderer(_this);
10777
- _this.renderContent = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer));
10778
- _this.el.classList.add('fc-list-view');
10779
- var listViewClassNames = (_this.theme.getClass('listView') || '').split(' '); // wish we didn't have to do this
10780
- for (var _i = 0, listViewClassNames_1 = listViewClassNames; _i < listViewClassNames_1.length; _i++) {
10781
- var listViewClassName = listViewClassNames_1[_i];
10782
- if (listViewClassName) { // in case input was empty string
10783
- _this.el.classList.add(listViewClassName);
10784
- }
10785
- }
10786
- _this.scroller = new core.ScrollComponent('hidden', // overflow x
10787
- 'auto' // overflow y
10788
- );
10789
- _this.el.appendChild(_this.scroller.el);
10790
- _this.contentEl = _this.scroller.el; // shortcut
10791
- context.calendar.registerInteractiveComponent(_this, {
10792
- el: _this.el
10793
- // TODO: make aware that it doesn't do Hits
10794
- });
10795
- return _this;
10796
- }
10797
- ListView.prototype.render = function (props) {
10798
- var _a = this.computeDateVars(props.dateProfile), dayDates = _a.dayDates, dayRanges = _a.dayRanges;
10799
- this.dayDates = dayDates;
10800
- this.renderContent(this.eventStoreToSegs(props.eventStore, props.eventUiBases, dayRanges));
10801
- };
10802
- ListView.prototype.destroy = function () {
10803
- _super.prototype.destroy.call(this);
10804
- this.renderContent.unrender();
10805
- this.scroller.destroy(); // will remove the Grid too
10806
- this.calendar.unregisterInteractiveComponent(this);
10807
- };
10808
- ListView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
10809
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto);
10810
- this.eventRenderer.computeSizes(isResize);
10811
- this.eventRenderer.assignSizes(isResize);
10812
- this.scroller.clear(); // sets height to 'auto' and clears overflow
10813
- if (!isAuto) {
10814
- this.scroller.setHeight(this.computeScrollerHeight(viewHeight));
10815
- }
10816
- };
10817
- ListView.prototype.computeScrollerHeight = function (viewHeight) {
10818
- return viewHeight -
10819
- core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
10820
- };
10821
- ListView.prototype._eventStoreToSegs = function (eventStore, eventUiBases, dayRanges) {
10822
- return this.eventRangesToSegs(core.sliceEventStore(eventStore, eventUiBases, this.props.dateProfile.activeRange, this.nextDayThreshold).fg, dayRanges);
10823
- };
10824
- ListView.prototype.eventRangesToSegs = function (eventRanges, dayRanges) {
10825
- var segs = [];
10826
- for (var _i = 0, eventRanges_1 = eventRanges; _i < eventRanges_1.length; _i++) {
10827
- var eventRange = eventRanges_1[_i];
10828
- segs.push.apply(segs, this.eventRangeToSegs(eventRange, dayRanges));
10829
- }
10830
- return segs;
10831
- };
10832
- ListView.prototype.eventRangeToSegs = function (eventRange, dayRanges) {
10833
- var _a = this, dateEnv = _a.dateEnv, nextDayThreshold = _a.nextDayThreshold;
10834
- var range = eventRange.range;
10835
- var allDay = eventRange.def.allDay;
10836
- var dayIndex;
10837
- var segRange;
10838
- var seg;
10839
- var segs = [];
10840
- for (dayIndex = 0; dayIndex < dayRanges.length; dayIndex++) {
10841
- segRange = core.intersectRanges(range, dayRanges[dayIndex]);
10842
- if (segRange) {
10843
- seg = {
10844
- component: this,
10845
- eventRange: eventRange,
10846
- start: segRange.start,
10847
- end: segRange.end,
10848
- isStart: eventRange.isStart && segRange.start.valueOf() === range.start.valueOf(),
10849
- isEnd: eventRange.isEnd && segRange.end.valueOf() === range.end.valueOf(),
10850
- dayIndex: dayIndex
10851
- };
10852
- segs.push(seg);
10853
- // detect when range won't go fully into the next day,
10854
- // and mutate the latest seg to the be the end.
10855
- if (!seg.isEnd && !allDay &&
10856
- dayIndex + 1 < dayRanges.length &&
10857
- range.end <
10858
- dateEnv.add(dayRanges[dayIndex + 1].start, nextDayThreshold)) {
10859
- seg.end = range.end;
10860
- seg.isEnd = true;
10861
- break;
10862
- }
10863
- }
10864
- }
10865
- return segs;
10866
- };
10867
- ListView.prototype.renderEmptyMessage = function () {
10868
- this.contentEl.innerHTML =
10869
- '<div class="fc-list-empty-wrap2">' + // TODO: try less wraps
10870
- '<div class="fc-list-empty-wrap1">' +
10871
- '<div class="fc-list-empty">' +
10872
- core.htmlEscape(this.opt('noEventsMessage')) +
10873
- '</div>' +
10874
- '</div>' +
10875
- '</div>';
10876
- };
10877
- // called by ListEventRenderer
10878
- ListView.prototype.renderSegList = function (allSegs) {
10879
- var segsByDay = this.groupSegsByDay(allSegs); // sparse array
10880
- var dayIndex;
10881
- var daySegs;
10882
- var i;
10883
- var tableEl = core.htmlToElement('<table class="fc-list-table ' + this.calendar.theme.getClass('tableList') + '"><tbody></tbody></table>');
10884
- var tbodyEl = tableEl.querySelector('tbody');
10885
- for (dayIndex = 0; dayIndex < segsByDay.length; dayIndex++) {
10886
- daySegs = segsByDay[dayIndex];
10887
- if (daySegs) { // sparse array, so might be undefined
10888
- // append a day header
10889
- tbodyEl.appendChild(this.buildDayHeaderRow(this.dayDates[dayIndex]));
10890
- daySegs = this.eventRenderer.sortEventSegs(daySegs);
10891
- for (i = 0; i < daySegs.length; i++) {
10892
- tbodyEl.appendChild(daySegs[i].el); // append event row
10893
- }
10894
- }
10895
- }
10896
- this.contentEl.innerHTML = '';
10897
- this.contentEl.appendChild(tableEl);
10898
- };
10899
- // Returns a sparse array of arrays, segs grouped by their dayIndex
10900
- ListView.prototype.groupSegsByDay = function (segs) {
10901
- var segsByDay = []; // sparse array
10902
- var i;
10903
- var seg;
10904
- for (i = 0; i < segs.length; i++) {
10905
- seg = segs[i];
10906
- (segsByDay[seg.dayIndex] || (segsByDay[seg.dayIndex] = []))
10907
- .push(seg);
10908
- }
10909
- return segsByDay;
10910
- };
10911
- // generates the HTML for the day headers that live amongst the event rows
10912
- ListView.prototype.buildDayHeaderRow = function (dayDate) {
10913
- var dateEnv = this.dateEnv;
10914
- var mainFormat = core.createFormatter(this.opt('listDayFormat')); // TODO: cache
10915
- var altFormat = core.createFormatter(this.opt('listDayAltFormat')); // TODO: cache
10916
- return core.createElement('tr', {
10917
- className: 'fc-list-heading',
10918
- 'data-date': dateEnv.formatIso(dayDate, { omitTime: true })
10919
- }, '<td class="' + (this.calendar.theme.getClass('tableListHeading') ||
10920
- this.calendar.theme.getClass('widgetHeader')) + '" colspan="3">' +
10921
- (mainFormat ?
10922
- core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-main' }, core.htmlEscape(dateEnv.format(dayDate, mainFormat)) // inner HTML
10923
- ) :
10924
- '') +
10925
- (altFormat ?
10926
- core.buildGotoAnchorHtml(this, dayDate, { 'class': 'fc-list-heading-alt' }, core.htmlEscape(dateEnv.format(dayDate, altFormat)) // inner HTML
10927
- ) :
10928
- '') +
10929
- '</td>');
10930
- };
10931
- return ListView;
10932
- }(core.View));
10933
- ListView.prototype.fgSegSelector = '.fc-list-item'; // which elements accept event actions
10934
- function computeDateVars(dateProfile) {
10935
- var dayStart = core.startOfDay(dateProfile.renderRange.start);
10936
- var viewEnd = dateProfile.renderRange.end;
10937
- var dayDates = [];
10938
- var dayRanges = [];
10939
- while (dayStart < viewEnd) {
10940
- dayDates.push(dayStart);
10941
- dayRanges.push({
10942
- start: dayStart,
10943
- end: core.addDays(dayStart, 1)
10944
- });
10945
- dayStart = core.addDays(dayStart, 1);
10946
- }
10947
- return { dayDates: dayDates, dayRanges: dayRanges };
10948
- }
10949
-
10950
- var main = core.createPlugin({
10951
- views: {
10952
- list: {
10953
- class: ListView,
10954
- buttonTextKey: 'list',
10955
- listDayFormat: { month: 'long', day: 'numeric', year: 'numeric' } // like "January 1, 2016"
10956
- },
10957
- listDay: {
10958
- type: 'list',
10959
- duration: { days: 1 },
10960
- listDayFormat: { weekday: 'long' } // day-of-week is all we need. full date is probably in header
10961
- },
10962
- listWeek: {
10963
- type: 'list',
10964
- duration: { weeks: 1 },
10965
- listDayFormat: { weekday: 'long' },
10966
- listDayAltFormat: { month: 'long', day: 'numeric', year: 'numeric' }
10967
- },
10968
- listMonth: {
10969
- type: 'list',
10970
- duration: { month: 1 },
10971
- listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
10972
- },
10973
- listYear: {
10974
- type: 'list',
10975
- duration: { year: 1 },
10976
- listDayAltFormat: { weekday: 'long' } // day-of-week is nice-to-have
10977
- }
10978
- }
10979
- });
10980
-
10981
- exports.ListView = ListView;
10982
- exports.default = main;
10983
-
10984
- Object.defineProperty(exports, '__esModule', { value: true });
10985
-
10986
- }));
10987
-
10988
- /*!
10989
- FullCalendar Time Grid Plugin v4.3.0
10990
- Docs & License: https://fullcalendar.io/
10991
- (c) 2019 Adam Shaw
10992
- */
10993
-
10994
- (function (global, factory) {
10995
- typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('@fullcalendar/core'), require('@fullcalendar/daygrid')) :
10996
- typeof define === 'function' && define.amd ? define(['exports', '@fullcalendar/core', '@fullcalendar/daygrid'], factory) :
10997
- (global = global || self, factory(global.FullCalendarTimeGrid = {}, global.FullCalendar, global.FullCalendarDayGrid));
10998
- }(this, function (exports, core, daygrid) { 'use strict';
10999
-
11000
- /*! *****************************************************************************
11001
- Copyright (c) Microsoft Corporation. All rights reserved.
11002
- Licensed under the Apache License, Version 2.0 (the "License"); you may not use
11003
- this file except in compliance with the License. You may obtain a copy of the
11004
- License at http://www.apache.org/licenses/LICENSE-2.0
11005
-
11006
- THIS CODE IS PROVIDED ON AN *AS IS* BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
11007
- KIND, EITHER EXPRESS OR IMPLIED, INCLUDING WITHOUT LIMITATION ANY IMPLIED
11008
- WARRANTIES OR CONDITIONS OF TITLE, FITNESS FOR A PARTICULAR PURPOSE,
11009
- MERCHANTABLITY OR NON-INFRINGEMENT.
11010
-
11011
- See the Apache Version 2.0 License for specific language governing permissions
11012
- and limitations under the License.
11013
- ***************************************************************************** */
11014
- /* global Reflect, Promise */
11015
-
11016
- var extendStatics = function(d, b) {
11017
- extendStatics = Object.setPrototypeOf ||
11018
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
11019
- function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
11020
- return extendStatics(d, b);
11021
- };
11022
-
11023
- function __extends(d, b) {
11024
- extendStatics(d, b);
11025
- function __() { this.constructor = d; }
11026
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
11027
- }
11028
-
11029
- var __assign = function() {
11030
- __assign = Object.assign || function __assign(t) {
11031
- for (var s, i = 1, n = arguments.length; i < n; i++) {
11032
- s = arguments[i];
11033
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];
11034
- }
11035
- return t;
11036
- };
11037
- return __assign.apply(this, arguments);
11038
- };
11039
-
11040
- /*
11041
- Only handles foreground segs.
11042
- Does not own rendering. Use for low-level util methods by TimeGrid.
11043
- */
11044
- var TimeGridEventRenderer = /** @class */ (function (_super) {
11045
- __extends(TimeGridEventRenderer, _super);
11046
- function TimeGridEventRenderer(timeGrid) {
11047
- var _this = _super.call(this, timeGrid.context) || this;
11048
- _this.timeGrid = timeGrid;
11049
- _this.fullTimeFormat = core.createFormatter({
11050
- hour: 'numeric',
11051
- minute: '2-digit',
11052
- separator: _this.context.options.defaultRangeSeparator
11053
- });
11054
- return _this;
11055
- }
11056
- // Given an array of foreground segments, render a DOM element for each, computes position,
11057
- // and attaches to the column inner-container elements.
11058
- TimeGridEventRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
11059
- var segsByCol = this.timeGrid.groupSegsByCol(segs);
11060
- // order the segs within each column
11061
- // TODO: have groupSegsByCol do this?
11062
- for (var col = 0; col < segsByCol.length; col++) {
11063
- segsByCol[col] = this.sortEventSegs(segsByCol[col]);
11064
- }
11065
- this.segsByCol = segsByCol;
11066
- this.timeGrid.attachSegsByCol(segsByCol, this.timeGrid.fgContainerEls);
11067
- };
11068
- TimeGridEventRenderer.prototype.detachSegs = function (segs) {
11069
- segs.forEach(function (seg) {
11070
- core.removeElement(seg.el);
11071
- });
11072
- this.segsByCol = null;
11073
- };
11074
- TimeGridEventRenderer.prototype.computeSegSizes = function (allSegs) {
11075
- var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
11076
- var colCnt = timeGrid.colCnt;
11077
- timeGrid.computeSegVerticals(allSegs); // horizontals relies on this
11078
- if (segsByCol) {
11079
- for (var col = 0; col < colCnt; col++) {
11080
- this.computeSegHorizontals(segsByCol[col]); // compute horizontal coordinates, z-index's, and reorder the array
11081
- }
11082
- }
11083
- };
11084
- TimeGridEventRenderer.prototype.assignSegSizes = function (allSegs) {
11085
- var _a = this, timeGrid = _a.timeGrid, segsByCol = _a.segsByCol;
11086
- var colCnt = timeGrid.colCnt;
11087
- timeGrid.assignSegVerticals(allSegs); // horizontals relies on this
11088
- if (segsByCol) {
11089
- for (var col = 0; col < colCnt; col++) {
11090
- this.assignSegCss(segsByCol[col]);
11091
- }
11092
- }
11093
- };
11094
- // Computes a default event time formatting string if `eventTimeFormat` is not explicitly defined
11095
- TimeGridEventRenderer.prototype.computeEventTimeFormat = function () {
11096
- return {
11097
- hour: 'numeric',
11098
- minute: '2-digit',
11099
- meridiem: false
11100
- };
11101
- };
11102
- // Computes a default `displayEventEnd` value if one is not expliclty defined
11103
- TimeGridEventRenderer.prototype.computeDisplayEventEnd = function () {
11104
- return true;
11105
- };
11106
- // Renders the HTML for a single event segment's default rendering
11107
- TimeGridEventRenderer.prototype.renderSegHtml = function (seg, mirrorInfo) {
11108
- var view = this.context.view;
11109
- var eventRange = seg.eventRange;
11110
- var eventDef = eventRange.def;
11111
- var eventUi = eventRange.ui;
11112
- var allDay = eventDef.allDay;
11113
- var isDraggable = view.computeEventDraggable(eventDef, eventUi);
11114
- var isResizableFromStart = seg.isStart && view.computeEventStartResizable(eventDef, eventUi);
11115
- var isResizableFromEnd = seg.isEnd && view.computeEventEndResizable(eventDef, eventUi);
11116
- var classes = this.getSegClasses(seg, isDraggable, isResizableFromStart || isResizableFromEnd, mirrorInfo);
11117
- var skinCss = core.cssToStr(this.getSkinCss(eventUi));
11118
- var timeText;
11119
- var fullTimeText; // more verbose time text. for the print stylesheet
11120
- var startTimeText; // just the start time text
11121
- classes.unshift('fc-time-grid-event');
11122
- // if the event appears to span more than one day...
11123
- if (core.isMultiDayRange(eventRange.range)) {
11124
- // Don't display time text on segments that run entirely through a day.
11125
- // That would appear as midnight-midnight and would look dumb.
11126
- // Otherwise, display the time text for the *segment's* times (like 6pm-midnight or midnight-10am)
11127
- if (seg.isStart || seg.isEnd) {
11128
- var unzonedStart = seg.start;
11129
- var unzonedEnd = seg.end;
11130
- timeText = this._getTimeText(unzonedStart, unzonedEnd, allDay); // TODO: give the timezones
11131
- fullTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, this.fullTimeFormat);
11132
- startTimeText = this._getTimeText(unzonedStart, unzonedEnd, allDay, null, false); // displayEnd=false
11133
- }
11134
- }
11135
- else {
11136
- // Display the normal time text for the *event's* times
11137
- timeText = this.getTimeText(eventRange);
11138
- fullTimeText = this.getTimeText(eventRange, this.fullTimeFormat);
11139
- startTimeText = this.getTimeText(eventRange, null, false); // displayEnd=false
11140
- }
11141
- return '<a class="' + classes.join(' ') + '"' +
11142
- (eventDef.url ?
11143
- ' href="' + core.htmlEscape(eventDef.url) + '"' :
11144
- '') +
11145
- (skinCss ?
11146
- ' style="' + skinCss + '"' :
11147
- '') +
11148
- '>' +
11149
- '<div class="fc-content">' +
11150
- (timeText ?
11151
- '<div class="fc-time"' +
11152
- ' data-start="' + core.htmlEscape(startTimeText) + '"' +
11153
- ' data-full="' + core.htmlEscape(fullTimeText) + '"' +
11154
- '>' +
11155
- '<span>' + core.htmlEscape(timeText) + '</span>' +
11156
- '</div>' :
11157
- '') +
11158
- (eventDef.title ?
11159
- '<div class="fc-title">' +
11160
- core.htmlEscape(eventDef.title) +
11161
- '</div>' :
11162
- '') +
11163
- '</div>' +
11164
- /* TODO: write CSS for this
11165
- (isResizableFromStart ?
11166
- '<div class="fc-resizer fc-start-resizer"></div>' :
11167
- ''
11168
- ) +
11169
- */
11170
- (isResizableFromEnd ?
11171
- '<div class="fc-resizer fc-end-resizer"></div>' :
11172
- '') +
11173
- '</a>';
11174
- };
11175
- // Given an array of segments that are all in the same column, sets the backwardCoord and forwardCoord on each.
11176
- // Assumed the segs are already ordered.
11177
- // NOTE: Also reorders the given array by date!
11178
- TimeGridEventRenderer.prototype.computeSegHorizontals = function (segs) {
11179
- var levels;
11180
- var level0;
11181
- var i;
11182
- levels = buildSlotSegLevels(segs);
11183
- computeForwardSlotSegs(levels);
11184
- if ((level0 = levels[0])) {
11185
- for (i = 0; i < level0.length; i++) {
11186
- computeSlotSegPressures(level0[i]);
11187
- }
11188
- for (i = 0; i < level0.length; i++) {
11189
- this.computeSegForwardBack(level0[i], 0, 0);
11190
- }
11191
- }
11192
- };
11193
- // Calculate seg.forwardCoord and seg.backwardCoord for the segment, where both values range
11194
- // from 0 to 1. If the calendar is left-to-right, the seg.backwardCoord maps to "left" and
11195
- // seg.forwardCoord maps to "right" (via percentage). Vice-versa if the calendar is right-to-left.
11196
- //
11197
- // The segment might be part of a "series", which means consecutive segments with the same pressure
11198
- // who's width is unknown until an edge has been hit. `seriesBackwardPressure` is the number of
11199
- // segments behind this one in the current series, and `seriesBackwardCoord` is the starting
11200
- // coordinate of the first segment in the series.
11201
- TimeGridEventRenderer.prototype.computeSegForwardBack = function (seg, seriesBackwardPressure, seriesBackwardCoord) {
11202
- var forwardSegs = seg.forwardSegs;
11203
- var i;
11204
- if (seg.forwardCoord === undefined) { // not already computed
11205
- if (!forwardSegs.length) {
11206
- // if there are no forward segments, this segment should butt up against the edge
11207
- seg.forwardCoord = 1;
11208
- }
11209
- else {
11210
- // sort highest pressure first
11211
- this.sortForwardSegs(forwardSegs);
11212
- // this segment's forwardCoord will be calculated from the backwardCoord of the
11213
- // highest-pressure forward segment.
11214
- this.computeSegForwardBack(forwardSegs[0], seriesBackwardPressure + 1, seriesBackwardCoord);
11215
- seg.forwardCoord = forwardSegs[0].backwardCoord;
11216
- }
11217
- // calculate the backwardCoord from the forwardCoord. consider the series
11218
- seg.backwardCoord = seg.forwardCoord -
11219
- (seg.forwardCoord - seriesBackwardCoord) / // available width for series
11220
- (seriesBackwardPressure + 1); // # of segments in the series
11221
- // use this segment's coordinates to computed the coordinates of the less-pressurized
11222
- // forward segments
11223
- for (i = 0; i < forwardSegs.length; i++) {
11224
- this.computeSegForwardBack(forwardSegs[i], 0, seg.forwardCoord);
11225
- }
11226
- }
11227
- };
11228
- TimeGridEventRenderer.prototype.sortForwardSegs = function (forwardSegs) {
11229
- var objs = forwardSegs.map(buildTimeGridSegCompareObj);
11230
- var specs = [
11231
- // put higher-pressure first
11232
- { field: 'forwardPressure', order: -1 },
11233
- // put segments that are closer to initial edge first (and favor ones with no coords yet)
11234
- { field: 'backwardCoord', order: 1 }
11235
- ].concat(this.context.view.eventOrderSpecs);
11236
- objs.sort(function (obj0, obj1) {
11237
- return core.compareByFieldSpecs(obj0, obj1, specs);
11238
- });
11239
- return objs.map(function (c) {
11240
- return c._seg;
11241
- });
11242
- };
11243
- // Given foreground event segments that have already had their position coordinates computed,
11244
- // assigns position-related CSS values to their elements.
11245
- TimeGridEventRenderer.prototype.assignSegCss = function (segs) {
11246
- for (var _i = 0, segs_1 = segs; _i < segs_1.length; _i++) {
11247
- var seg = segs_1[_i];
11248
- core.applyStyle(seg.el, this.generateSegCss(seg));
11249
- if (seg.level > 0) {
11250
- seg.el.classList.add('fc-time-grid-event-inset');
11251
- }
11252
- // if the event is short that the title will be cut off,
11253
- // attach a className that condenses the title into the time area.
11254
- if (seg.eventRange.def.title && seg.bottom - seg.top < 30) {
11255
- seg.el.classList.add('fc-short'); // TODO: "condensed" is a better name
11256
- }
11257
- }
11258
- };
11259
- // Generates an object with CSS properties/values that should be applied to an event segment element.
11260
- // Contains important positioning-related properties that should be applied to any event element, customized or not.
11261
- TimeGridEventRenderer.prototype.generateSegCss = function (seg) {
11262
- var shouldOverlap = this.context.options.slotEventOverlap;
11263
- var backwardCoord = seg.backwardCoord; // the left side if LTR. the right side if RTL. floating-point
11264
- var forwardCoord = seg.forwardCoord; // the right side if LTR. the left side if RTL. floating-point
11265
- var props = this.timeGrid.generateSegVerticalCss(seg); // get top/bottom first
11266
- var isRtl = this.timeGrid.isRtl;
11267
- var left; // amount of space from left edge, a fraction of the total width
11268
- var right; // amount of space from right edge, a fraction of the total width
11269
- if (shouldOverlap) {
11270
- // double the width, but don't go beyond the maximum forward coordinate (1.0)
11271
- forwardCoord = Math.min(1, backwardCoord + (forwardCoord - backwardCoord) * 2);
11272
- }
11273
- if (isRtl) {
11274
- left = 1 - forwardCoord;
11275
- right = backwardCoord;
11276
- }
11277
- else {
11278
- left = backwardCoord;
11279
- right = 1 - forwardCoord;
11280
- }
11281
- props.zIndex = seg.level + 1; // convert from 0-base to 1-based
11282
- props.left = left * 100 + '%';
11283
- props.right = right * 100 + '%';
11284
- if (shouldOverlap && seg.forwardPressure) {
11285
- // add padding to the edge so that forward stacked events don't cover the resizer's icon
11286
- props[isRtl ? 'marginLeft' : 'marginRight'] = 10 * 2; // 10 is a guesstimate of the icon's width
11287
- }
11288
- return props;
11289
- };
11290
- return TimeGridEventRenderer;
11291
- }(core.FgEventRenderer));
11292
- // Builds an array of segments "levels". The first level will be the leftmost tier of segments if the calendar is
11293
- // left-to-right, or the rightmost if the calendar is right-to-left. Assumes the segments are already ordered by date.
11294
- function buildSlotSegLevels(segs) {
11295
- var levels = [];
11296
- var i;
11297
- var seg;
11298
- var j;
11299
- for (i = 0; i < segs.length; i++) {
11300
- seg = segs[i];
11301
- // go through all the levels and stop on the first level where there are no collisions
11302
- for (j = 0; j < levels.length; j++) {
11303
- if (!computeSlotSegCollisions(seg, levels[j]).length) {
11304
- break;
11305
- }
11306
- }
11307
- seg.level = j;
11308
- (levels[j] || (levels[j] = [])).push(seg);
11309
- }
11310
- return levels;
11311
- }
11312
- // For every segment, figure out the other segments that are in subsequent
11313
- // levels that also occupy the same vertical space. Accumulate in seg.forwardSegs
11314
- function computeForwardSlotSegs(levels) {
11315
- var i;
11316
- var level;
11317
- var j;
11318
- var seg;
11319
- var k;
11320
- for (i = 0; i < levels.length; i++) {
11321
- level = levels[i];
11322
- for (j = 0; j < level.length; j++) {
11323
- seg = level[j];
11324
- seg.forwardSegs = [];
11325
- for (k = i + 1; k < levels.length; k++) {
11326
- computeSlotSegCollisions(seg, levels[k], seg.forwardSegs);
11327
- }
11328
- }
11329
- }
11330
- }
11331
- // Figure out which path forward (via seg.forwardSegs) results in the longest path until
11332
- // the furthest edge is reached. The number of segments in this path will be seg.forwardPressure
11333
- function computeSlotSegPressures(seg) {
11334
- var forwardSegs = seg.forwardSegs;
11335
- var forwardPressure = 0;
11336
- var i;
11337
- var forwardSeg;
11338
- if (seg.forwardPressure === undefined) { // not already computed
11339
- for (i = 0; i < forwardSegs.length; i++) {
11340
- forwardSeg = forwardSegs[i];
11341
- // figure out the child's maximum forward path
11342
- computeSlotSegPressures(forwardSeg);
11343
- // either use the existing maximum, or use the child's forward pressure
11344
- // plus one (for the forwardSeg itself)
11345
- forwardPressure = Math.max(forwardPressure, 1 + forwardSeg.forwardPressure);
11346
- }
11347
- seg.forwardPressure = forwardPressure;
11348
- }
11349
- }
11350
- // Find all the segments in `otherSegs` that vertically collide with `seg`.
11351
- // Append into an optionally-supplied `results` array and return.
11352
- function computeSlotSegCollisions(seg, otherSegs, results) {
11353
- if (results === void 0) { results = []; }
11354
- for (var i = 0; i < otherSegs.length; i++) {
11355
- if (isSlotSegCollision(seg, otherSegs[i])) {
11356
- results.push(otherSegs[i]);
11357
- }
11358
- }
11359
- return results;
11360
- }
11361
- // Do these segments occupy the same vertical space?
11362
- function isSlotSegCollision(seg1, seg2) {
11363
- return seg1.bottom > seg2.top && seg1.top < seg2.bottom;
11364
- }
11365
- function buildTimeGridSegCompareObj(seg) {
11366
- var obj = core.buildSegCompareObj(seg);
11367
- obj.forwardPressure = seg.forwardPressure;
11368
- obj.backwardCoord = seg.backwardCoord;
11369
- return obj;
11370
- }
11371
-
11372
- var TimeGridMirrorRenderer = /** @class */ (function (_super) {
11373
- __extends(TimeGridMirrorRenderer, _super);
11374
- function TimeGridMirrorRenderer() {
11375
- return _super !== null && _super.apply(this, arguments) || this;
11376
- }
11377
- TimeGridMirrorRenderer.prototype.attachSegs = function (segs, mirrorInfo) {
11378
- this.segsByCol = this.timeGrid.groupSegsByCol(segs);
11379
- this.timeGrid.attachSegsByCol(this.segsByCol, this.timeGrid.mirrorContainerEls);
11380
- this.sourceSeg = mirrorInfo.sourceSeg;
11381
- };
11382
- TimeGridMirrorRenderer.prototype.generateSegCss = function (seg) {
11383
- var props = _super.prototype.generateSegCss.call(this, seg);
11384
- var sourceSeg = this.sourceSeg;
11385
- if (sourceSeg && sourceSeg.col === seg.col) {
11386
- var sourceSegProps = _super.prototype.generateSegCss.call(this, sourceSeg);
11387
- props.left = sourceSegProps.left;
11388
- props.right = sourceSegProps.right;
11389
- props.marginLeft = sourceSegProps.marginLeft;
11390
- props.marginRight = sourceSegProps.marginRight;
11391
- }
11392
- return props;
11393
- };
11394
- return TimeGridMirrorRenderer;
11395
- }(TimeGridEventRenderer));
11396
-
11397
- var TimeGridFillRenderer = /** @class */ (function (_super) {
11398
- __extends(TimeGridFillRenderer, _super);
11399
- function TimeGridFillRenderer(timeGrid) {
11400
- var _this = _super.call(this, timeGrid.context) || this;
11401
- _this.timeGrid = timeGrid;
11402
- return _this;
11403
- }
11404
- TimeGridFillRenderer.prototype.attachSegs = function (type, segs) {
11405
- var timeGrid = this.timeGrid;
11406
- var containerEls;
11407
- // TODO: more efficient lookup
11408
- if (type === 'bgEvent') {
11409
- containerEls = timeGrid.bgContainerEls;
11410
- }
11411
- else if (type === 'businessHours') {
11412
- containerEls = timeGrid.businessContainerEls;
11413
- }
11414
- else if (type === 'highlight') {
11415
- containerEls = timeGrid.highlightContainerEls;
11416
- }
11417
- timeGrid.attachSegsByCol(timeGrid.groupSegsByCol(segs), containerEls);
11418
- return segs.map(function (seg) {
11419
- return seg.el;
11420
- });
11421
- };
11422
- TimeGridFillRenderer.prototype.computeSegSizes = function (segs) {
11423
- this.timeGrid.computeSegVerticals(segs);
11424
- };
11425
- TimeGridFillRenderer.prototype.assignSegSizes = function (segs) {
11426
- this.timeGrid.assignSegVerticals(segs);
11427
- };
11428
- return TimeGridFillRenderer;
11429
- }(core.FillRenderer));
11430
-
11431
- /* A component that renders one or more columns of vertical time slots
11432
- ----------------------------------------------------------------------------------------------------------------------*/
11433
- // potential nice values for the slot-duration and interval-duration
11434
- // from largest to smallest
11435
- var AGENDA_STOCK_SUB_DURATIONS = [
11436
- { hours: 1 },
11437
- { minutes: 30 },
11438
- { minutes: 15 },
11439
- { seconds: 30 },
11440
- { seconds: 15 }
11441
- ];
11442
- var TimeGrid = /** @class */ (function (_super) {
11443
- __extends(TimeGrid, _super);
11444
- function TimeGrid(context, el, renderProps) {
11445
- var _this = _super.call(this, context, el) || this;
11446
- _this.isSlatSizesDirty = false;
11447
- _this.isColSizesDirty = false;
11448
- _this.renderSlats = core.memoizeRendering(_this._renderSlats);
11449
- var eventRenderer = _this.eventRenderer = new TimeGridEventRenderer(_this);
11450
- var fillRenderer = _this.fillRenderer = new TimeGridFillRenderer(_this);
11451
- _this.mirrorRenderer = new TimeGridMirrorRenderer(_this);
11452
- var renderColumns = _this.renderColumns = core.memoizeRendering(_this._renderColumns, _this._unrenderColumns);
11453
- _this.renderBusinessHours = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'businessHours'), fillRenderer.unrender.bind(fillRenderer, 'businessHours'), [renderColumns]);
11454
- _this.renderDateSelection = core.memoizeRendering(_this._renderDateSelection, _this._unrenderDateSelection, [renderColumns]);
11455
- _this.renderFgEvents = core.memoizeRendering(eventRenderer.renderSegs.bind(eventRenderer), eventRenderer.unrender.bind(eventRenderer), [renderColumns]);
11456
- _this.renderBgEvents = core.memoizeRendering(fillRenderer.renderSegs.bind(fillRenderer, 'bgEvent'), fillRenderer.unrender.bind(fillRenderer, 'bgEvent'), [renderColumns]);
11457
- _this.renderEventSelection = core.memoizeRendering(eventRenderer.selectByInstanceId.bind(eventRenderer), eventRenderer.unselectByInstanceId.bind(eventRenderer), [_this.renderFgEvents]);
11458
- _this.renderEventDrag = core.memoizeRendering(_this._renderEventDrag, _this._unrenderEventDrag, [renderColumns]);
11459
- _this.renderEventResize = core.memoizeRendering(_this._renderEventResize, _this._unrenderEventResize, [renderColumns]);
11460
- _this.processOptions();
11461
- el.innerHTML =
11462
- '<div class="fc-bg"></div>' +
11463
- '<div class="fc-slats"></div>' +
11464
- '<hr class="fc-divider ' + _this.theme.getClass('widgetHeader') + '" style="display:none" />';
11465
- _this.rootBgContainerEl = el.querySelector('.fc-bg');
11466
- _this.slatContainerEl = el.querySelector('.fc-slats');
11467
- _this.bottomRuleEl = el.querySelector('.fc-divider');
11468
- _this.renderProps = renderProps;
11469
- return _this;
11470
- }
11471
- /* Options
11472
- ------------------------------------------------------------------------------------------------------------------*/
11473
- // Parses various options into properties of this object
11474
- TimeGrid.prototype.processOptions = function () {
11475
- var slotDuration = this.opt('slotDuration');
11476
- var snapDuration = this.opt('snapDuration');
11477
- var snapsPerSlot;
11478
- var input;
11479
- slotDuration = core.createDuration(slotDuration);
11480
- snapDuration = snapDuration ? core.createDuration(snapDuration) : slotDuration;
11481
- snapsPerSlot = core.wholeDivideDurations(slotDuration, snapDuration);
11482
- if (snapsPerSlot === null) {
11483
- snapDuration = slotDuration;
11484
- snapsPerSlot = 1;
11485
- // TODO: say warning?
11486
- }
11487
- this.slotDuration = slotDuration;
11488
- this.snapDuration = snapDuration;
11489
- this.snapsPerSlot = snapsPerSlot;
11490
- // might be an array value (for TimelineView).
11491
- // if so, getting the most granular entry (the last one probably).
11492
- input = this.opt('slotLabelFormat');
11493
- if (Array.isArray(input)) {
11494
- input = input[input.length - 1];
11495
- }
11496
- this.labelFormat = core.createFormatter(input || {
11497
- hour: 'numeric',
11498
- minute: '2-digit',
11499
- omitZeroMinute: true,
11500
- meridiem: 'short'
11501
- });
11502
- input = this.opt('slotLabelInterval');
11503
- this.labelInterval = input ?
11504
- core.createDuration(input) :
11505
- this.computeLabelInterval(slotDuration);
11506
- };
11507
- // Computes an automatic value for slotLabelInterval
11508
- TimeGrid.prototype.computeLabelInterval = function (slotDuration) {
11509
- var i;
11510
- var labelInterval;
11511
- var slotsPerLabel;
11512
- // find the smallest stock label interval that results in more than one slots-per-label
11513
- for (i = AGENDA_STOCK_SUB_DURATIONS.length - 1; i >= 0; i--) {
11514
- labelInterval = core.createDuration(AGENDA_STOCK_SUB_DURATIONS[i]);
11515
- slotsPerLabel = core.wholeDivideDurations(labelInterval, slotDuration);
11516
- if (slotsPerLabel !== null && slotsPerLabel > 1) {
11517
- return labelInterval;
11518
- }
11519
- }
11520
- return slotDuration; // fall back
11521
- };
11522
- /* Rendering
11523
- ------------------------------------------------------------------------------------------------------------------*/
11524
- TimeGrid.prototype.render = function (props) {
11525
- var cells = props.cells;
11526
- this.colCnt = cells.length;
11527
- this.renderSlats(props.dateProfile);
11528
- this.renderColumns(props.cells, props.dateProfile);
11529
- this.renderBusinessHours(props.businessHourSegs);
11530
- this.renderDateSelection(props.dateSelectionSegs);
11531
- this.renderFgEvents(props.fgEventSegs);
11532
- this.renderBgEvents(props.bgEventSegs);
11533
- this.renderEventSelection(props.eventSelection);
11534
- this.renderEventDrag(props.eventDrag);
11535
- this.renderEventResize(props.eventResize);
11536
- };
11537
- TimeGrid.prototype.destroy = function () {
11538
- _super.prototype.destroy.call(this);
11539
- // should unrender everything else too
11540
- this.renderSlats.unrender();
11541
- this.renderColumns.unrender();
11542
- };
11543
- TimeGrid.prototype.updateSize = function (isResize) {
11544
- var _a = this, fillRenderer = _a.fillRenderer, eventRenderer = _a.eventRenderer, mirrorRenderer = _a.mirrorRenderer;
11545
- if (isResize || this.isSlatSizesDirty) {
11546
- this.buildSlatPositions();
11547
- this.isSlatSizesDirty = false;
11548
- }
11549
- if (isResize || this.isColSizesDirty) {
11550
- this.buildColPositions();
11551
- this.isColSizesDirty = false;
11552
- }
11553
- fillRenderer.computeSizes(isResize);
11554
- eventRenderer.computeSizes(isResize);
11555
- mirrorRenderer.computeSizes(isResize);
11556
- fillRenderer.assignSizes(isResize);
11557
- eventRenderer.assignSizes(isResize);
11558
- mirrorRenderer.assignSizes(isResize);
11559
- };
11560
- TimeGrid.prototype._renderSlats = function (dateProfile) {
11561
- var theme = this.theme;
11562
- this.slatContainerEl.innerHTML =
11563
- '<table class="' + theme.getClass('tableGrid') + '">' +
11564
- this.renderSlatRowHtml(dateProfile) +
11565
- '</table>';
11566
- this.slatEls = core.findElements(this.slatContainerEl, 'tr');
11567
- this.slatPositions = new core.PositionCache(this.el, this.slatEls, false, true // vertical
11568
- );
11569
- this.isSlatSizesDirty = true;
11570
- };
11571
- // Generates the HTML for the horizontal "slats" that run width-wise. Has a time axis on a side. Depends on RTL.
11572
- TimeGrid.prototype.renderSlatRowHtml = function (dateProfile) {
11573
- var _a = this, dateEnv = _a.dateEnv, theme = _a.theme, isRtl = _a.isRtl;
11574
- var html = '';
11575
- var dayStart = core.startOfDay(dateProfile.renderRange.start);
11576
- var slotTime = dateProfile.minTime;
11577
- var slotIterator = core.createDuration(0);
11578
- var slotDate; // will be on the view's first day, but we only care about its time
11579
- var isLabeled;
11580
- var axisHtml;
11581
- // Calculate the time for each slot
11582
- while (core.asRoughMs(slotTime) < core.asRoughMs(dateProfile.maxTime)) {
11583
- slotDate = dateEnv.add(dayStart, slotTime);
11584
- isLabeled = core.wholeDivideDurations(slotIterator, this.labelInterval) !== null;
11585
- axisHtml =
11586
- '<td class="fc-axis fc-time ' + theme.getClass('widgetContent') + '">' +
11587
- (isLabeled ?
11588
- '<span>' + // for matchCellWidths
11589
- core.htmlEscape(dateEnv.format(slotDate, this.labelFormat)) +
11590
- '</span>' :
11591
- '') +
11592
- '</td>';
11593
- html +=
11594
- '<tr data-time="' + core.formatIsoTimeString(slotDate) + '"' +
11595
- (isLabeled ? '' : ' class="fc-minor"') +
11596
- '>' +
11597
- (!isRtl ? axisHtml : '') +
11598
- '<td class="' + theme.getClass('widgetContent') + '"></td>' +
11599
- (isRtl ? axisHtml : '') +
11600
- '</tr>';
11601
- slotTime = core.addDurations(slotTime, this.slotDuration);
11602
- slotIterator = core.addDurations(slotIterator, this.slotDuration);
11603
- }
11604
- return html;
11605
- };
11606
- TimeGrid.prototype._renderColumns = function (cells, dateProfile) {
11607
- var _a = this, theme = _a.theme, dateEnv = _a.dateEnv, view = _a.view;
11608
- var bgRow = new daygrid.DayBgRow(this.context);
11609
- this.rootBgContainerEl.innerHTML =
11610
- '<table class="' + theme.getClass('tableGrid') + '">' +
11611
- bgRow.renderHtml({
11612
- cells: cells,
11613
- dateProfile: dateProfile,
11614
- renderIntroHtml: this.renderProps.renderBgIntroHtml
11615
- }) +
11616
- '</table>';
11617
- this.colEls = core.findElements(this.el, '.fc-day, .fc-disabled-day');
11618
- for (var col = 0; col < this.colCnt; col++) {
11619
- this.publiclyTrigger('dayRender', [
11620
- {
11621
- date: dateEnv.toDate(cells[col].date),
11622
- el: this.colEls[col],
11623
- view: view
11624
- }
11625
- ]);
11626
- }
11627
- if (this.isRtl) {
11628
- this.colEls.reverse();
11629
- }
11630
- this.colPositions = new core.PositionCache(this.el, this.colEls, true, // horizontal
11631
- false);
11632
- this.renderContentSkeleton();
11633
- this.isColSizesDirty = true;
11634
- };
11635
- TimeGrid.prototype._unrenderColumns = function () {
11636
- this.unrenderContentSkeleton();
11637
- };
11638
- /* Content Skeleton
11639
- ------------------------------------------------------------------------------------------------------------------*/
11640
- // Renders the DOM that the view's content will live in
11641
- TimeGrid.prototype.renderContentSkeleton = function () {
11642
- var parts = [];
11643
- var skeletonEl;
11644
- parts.push(this.renderProps.renderIntroHtml());
11645
- for (var i = 0; i < this.colCnt; i++) {
11646
- parts.push('<td>' +
11647
- '<div class="fc-content-col">' +
11648
- '<div class="fc-event-container fc-mirror-container"></div>' +
11649
- '<div class="fc-event-container"></div>' +
11650
- '<div class="fc-highlight-container"></div>' +
11651
- '<div class="fc-bgevent-container"></div>' +
11652
- '<div class="fc-business-container"></div>' +
11653
- '</div>' +
11654
- '</td>');
11655
- }
11656
- if (this.isRtl) {
11657
- parts.reverse();
11658
- }
11659
- skeletonEl = this.contentSkeletonEl = core.htmlToElement('<div class="fc-content-skeleton">' +
11660
- '<table>' +
11661
- '<tr>' + parts.join('') + '</tr>' +
11662
- '</table>' +
11663
- '</div>');
11664
- this.colContainerEls = core.findElements(skeletonEl, '.fc-content-col');
11665
- this.mirrorContainerEls = core.findElements(skeletonEl, '.fc-mirror-container');
11666
- this.fgContainerEls = core.findElements(skeletonEl, '.fc-event-container:not(.fc-mirror-container)');
11667
- this.bgContainerEls = core.findElements(skeletonEl, '.fc-bgevent-container');
11668
- this.highlightContainerEls = core.findElements(skeletonEl, '.fc-highlight-container');
11669
- this.businessContainerEls = core.findElements(skeletonEl, '.fc-business-container');
11670
- if (this.isRtl) {
11671
- this.colContainerEls.reverse();
11672
- this.mirrorContainerEls.reverse();
11673
- this.fgContainerEls.reverse();
11674
- this.bgContainerEls.reverse();
11675
- this.highlightContainerEls.reverse();
11676
- this.businessContainerEls.reverse();
11677
- }
11678
- this.el.appendChild(skeletonEl);
11679
- };
11680
- TimeGrid.prototype.unrenderContentSkeleton = function () {
11681
- core.removeElement(this.contentSkeletonEl);
11682
- };
11683
- // Given a flat array of segments, return an array of sub-arrays, grouped by each segment's col
11684
- TimeGrid.prototype.groupSegsByCol = function (segs) {
11685
- var segsByCol = [];
11686
- var i;
11687
- for (i = 0; i < this.colCnt; i++) {
11688
- segsByCol.push([]);
11689
- }
11690
- for (i = 0; i < segs.length; i++) {
11691
- segsByCol[segs[i].col].push(segs[i]);
11692
- }
11693
- return segsByCol;
11694
- };
11695
- // Given segments grouped by column, insert the segments' elements into a parallel array of container
11696
- // elements, each living within a column.
11697
- TimeGrid.prototype.attachSegsByCol = function (segsByCol, containerEls) {
11698
- var col;
11699
- var segs;
11700
- var i;
11701
- for (col = 0; col < this.colCnt; col++) { // iterate each column grouping
11702
- segs = segsByCol[col];
11703
- for (i = 0; i < segs.length; i++) {
11704
- containerEls[col].appendChild(segs[i].el);
11705
- }
11706
- }
11707
- };
11708
- /* Now Indicator
11709
- ------------------------------------------------------------------------------------------------------------------*/
11710
- TimeGrid.prototype.getNowIndicatorUnit = function () {
11711
- return 'minute'; // will refresh on the minute
11712
- };
11713
- TimeGrid.prototype.renderNowIndicator = function (segs, date) {
11714
- // HACK: if date columns not ready for some reason (scheduler)
11715
- if (!this.colContainerEls) {
11716
- return;
11717
- }
11718
- var top = this.computeDateTop(date);
11719
- var nodes = [];
11720
- var i;
11721
- // render lines within the columns
11722
- for (i = 0; i < segs.length; i++) {
11723
- var lineEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-line' });
11724
- lineEl.style.top = top + 'px';
11725
- this.colContainerEls[segs[i].col].appendChild(lineEl);
11726
- nodes.push(lineEl);
11727
- }
11728
- // render an arrow over the axis
11729
- if (segs.length > 0) { // is the current time in view?
11730
- var arrowEl = core.createElement('div', { className: 'fc-now-indicator fc-now-indicator-arrow' });
11731
- arrowEl.style.top = top + 'px';
11732
- this.contentSkeletonEl.appendChild(arrowEl);
11733
- nodes.push(arrowEl);
11734
- }
11735
- this.nowIndicatorEls = nodes;
11736
- };
11737
- TimeGrid.prototype.unrenderNowIndicator = function () {
11738
- if (this.nowIndicatorEls) {
11739
- this.nowIndicatorEls.forEach(core.removeElement);
11740
- this.nowIndicatorEls = null;
11741
- }
11742
- };
11743
- /* Coordinates
11744
- ------------------------------------------------------------------------------------------------------------------*/
11745
- TimeGrid.prototype.getTotalSlatHeight = function () {
11746
- return this.slatContainerEl.getBoundingClientRect().height;
11747
- };
11748
- // Computes the top coordinate, relative to the bounds of the grid, of the given date.
11749
- // A `startOfDayDate` must be given for avoiding ambiguity over how to treat midnight.
11750
- TimeGrid.prototype.computeDateTop = function (when, startOfDayDate) {
11751
- if (!startOfDayDate) {
11752
- startOfDayDate = core.startOfDay(when);
11753
- }
11754
- return this.computeTimeTop(core.createDuration(when.valueOf() - startOfDayDate.valueOf()));
11755
- };
11756
- // Computes the top coordinate, relative to the bounds of the grid, of the given time (a Duration).
11757
- TimeGrid.prototype.computeTimeTop = function (duration) {
11758
- var len = this.slatEls.length;
11759
- var dateProfile = this.props.dateProfile;
11760
- var slatCoverage = (duration.milliseconds - core.asRoughMs(dateProfile.minTime)) / core.asRoughMs(this.slotDuration); // floating-point value of # of slots covered
11761
- var slatIndex;
11762
- var slatRemainder;
11763
- // compute a floating-point number for how many slats should be progressed through.
11764
- // from 0 to number of slats (inclusive)
11765
- // constrained because minTime/maxTime might be customized.
11766
- slatCoverage = Math.max(0, slatCoverage);
11767
- slatCoverage = Math.min(len, slatCoverage);
11768
- // an integer index of the furthest whole slat
11769
- // from 0 to number slats (*exclusive*, so len-1)
11770
- slatIndex = Math.floor(slatCoverage);
11771
- slatIndex = Math.min(slatIndex, len - 1);
11772
- // how much further through the slatIndex slat (from 0.0-1.0) must be covered in addition.
11773
- // could be 1.0 if slatCoverage is covering *all* the slots
11774
- slatRemainder = slatCoverage - slatIndex;
11775
- return this.slatPositions.tops[slatIndex] +
11776
- this.slatPositions.getHeight(slatIndex) * slatRemainder;
11777
- };
11778
- // For each segment in an array, computes and assigns its top and bottom properties
11779
- TimeGrid.prototype.computeSegVerticals = function (segs) {
11780
- var eventMinHeight = this.opt('timeGridEventMinHeight');
11781
- var i;
11782
- var seg;
11783
- var dayDate;
11784
- for (i = 0; i < segs.length; i++) {
11785
- seg = segs[i];
11786
- dayDate = this.props.cells[seg.col].date;
11787
- seg.top = this.computeDateTop(seg.start, dayDate);
11788
- seg.bottom = Math.max(seg.top + eventMinHeight, this.computeDateTop(seg.end, dayDate));
11789
- }
11790
- };
11791
- // Given segments that already have their top/bottom properties computed, applies those values to
11792
- // the segments' elements.
11793
- TimeGrid.prototype.assignSegVerticals = function (segs) {
11794
- var i;
11795
- var seg;
11796
- for (i = 0; i < segs.length; i++) {
11797
- seg = segs[i];
11798
- core.applyStyle(seg.el, this.generateSegVerticalCss(seg));
11799
- }
11800
- };
11801
- // Generates an object with CSS properties for the top/bottom coordinates of a segment element
11802
- TimeGrid.prototype.generateSegVerticalCss = function (seg) {
11803
- return {
11804
- top: seg.top,
11805
- bottom: -seg.bottom // flipped because needs to be space beyond bottom edge of event container
11806
- };
11807
- };
11808
- /* Sizing
11809
- ------------------------------------------------------------------------------------------------------------------*/
11810
- TimeGrid.prototype.buildPositionCaches = function () {
11811
- this.buildColPositions();
11812
- this.buildSlatPositions();
11813
- };
11814
- TimeGrid.prototype.buildColPositions = function () {
11815
- this.colPositions.build();
11816
- };
11817
- TimeGrid.prototype.buildSlatPositions = function () {
11818
- this.slatPositions.build();
11819
- };
11820
- /* Hit System
11821
- ------------------------------------------------------------------------------------------------------------------*/
11822
- TimeGrid.prototype.positionToHit = function (positionLeft, positionTop) {
11823
- var _a = this, dateEnv = _a.dateEnv, snapsPerSlot = _a.snapsPerSlot, slatPositions = _a.slatPositions, colPositions = _a.colPositions;
11824
- var colIndex = colPositions.leftToIndex(positionLeft);
11825
- var slatIndex = slatPositions.topToIndex(positionTop);
11826
- if (colIndex != null && slatIndex != null) {
11827
- var slatTop = slatPositions.tops[slatIndex];
11828
- var slatHeight = slatPositions.getHeight(slatIndex);
11829
- var partial = (positionTop - slatTop) / slatHeight; // floating point number between 0 and 1
11830
- var localSnapIndex = Math.floor(partial * snapsPerSlot); // the snap # relative to start of slat
11831
- var snapIndex = slatIndex * snapsPerSlot + localSnapIndex;
11832
- var dayDate = this.props.cells[colIndex].date;
11833
- var time = core.addDurations(this.props.dateProfile.minTime, core.multiplyDuration(this.snapDuration, snapIndex));
11834
- var start = dateEnv.add(dayDate, time);
11835
- var end = dateEnv.add(start, this.snapDuration);
11836
- return {
11837
- col: colIndex,
11838
- dateSpan: {
11839
- range: { start: start, end: end },
11840
- allDay: false
11841
- },
11842
- dayEl: this.colEls[colIndex],
11843
- relativeRect: {
11844
- left: colPositions.lefts[colIndex],
11845
- right: colPositions.rights[colIndex],
11846
- top: slatTop,
11847
- bottom: slatTop + slatHeight
11848
- }
11849
- };
11850
- }
11851
- };
11852
- /* Event Drag Visualization
11853
- ------------------------------------------------------------------------------------------------------------------*/
11854
- TimeGrid.prototype._renderEventDrag = function (state) {
11855
- if (state) {
11856
- this.eventRenderer.hideByHash(state.affectedInstances);
11857
- if (state.isEvent) {
11858
- this.mirrorRenderer.renderSegs(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
11859
- }
11860
- else {
11861
- this.fillRenderer.renderSegs('highlight', state.segs);
11862
- }
11863
- }
11864
- };
11865
- TimeGrid.prototype._unrenderEventDrag = function (state) {
11866
- if (state) {
11867
- this.eventRenderer.showByHash(state.affectedInstances);
11868
- this.mirrorRenderer.unrender(state.segs, { isDragging: true, sourceSeg: state.sourceSeg });
11869
- this.fillRenderer.unrender('highlight');
11870
- }
11871
- };
11872
- /* Event Resize Visualization
11873
- ------------------------------------------------------------------------------------------------------------------*/
11874
- TimeGrid.prototype._renderEventResize = function (state) {
11875
- if (state) {
11876
- this.eventRenderer.hideByHash(state.affectedInstances);
11877
- this.mirrorRenderer.renderSegs(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
11878
- }
11879
- };
11880
- TimeGrid.prototype._unrenderEventResize = function (state) {
11881
- if (state) {
11882
- this.eventRenderer.showByHash(state.affectedInstances);
11883
- this.mirrorRenderer.unrender(state.segs, { isResizing: true, sourceSeg: state.sourceSeg });
11884
- }
11885
- };
11886
- /* Selection
11887
- ------------------------------------------------------------------------------------------------------------------*/
11888
- // Renders a visual indication of a selection. Overrides the default, which was to simply render a highlight.
11889
- TimeGrid.prototype._renderDateSelection = function (segs) {
11890
- if (segs) {
11891
- if (this.opt('selectMirror')) {
11892
- this.mirrorRenderer.renderSegs(segs, { isSelecting: true });
11893
- }
11894
- else {
11895
- this.fillRenderer.renderSegs('highlight', segs);
11896
- }
11897
- }
11898
- };
11899
- TimeGrid.prototype._unrenderDateSelection = function (segs) {
11900
- this.mirrorRenderer.unrender(segs, { isSelecting: true });
11901
- this.fillRenderer.unrender('highlight');
11902
- };
11903
- return TimeGrid;
11904
- }(core.DateComponent));
11905
-
11906
- var AllDaySplitter = /** @class */ (function (_super) {
11907
- __extends(AllDaySplitter, _super);
11908
- function AllDaySplitter() {
11909
- return _super !== null && _super.apply(this, arguments) || this;
11910
- }
11911
- AllDaySplitter.prototype.getKeyInfo = function () {
11912
- return {
11913
- allDay: {},
11914
- timed: {}
11915
- };
11916
- };
11917
- AllDaySplitter.prototype.getKeysForDateSpan = function (dateSpan) {
11918
- if (dateSpan.allDay) {
11919
- return ['allDay'];
11920
- }
11921
- else {
11922
- return ['timed'];
11923
- }
11924
- };
11925
- AllDaySplitter.prototype.getKeysForEventDef = function (eventDef) {
11926
- if (!eventDef.allDay) {
11927
- return ['timed'];
11928
- }
11929
- else if (core.hasBgRendering(eventDef)) {
11930
- return ['timed', 'allDay'];
11931
- }
11932
- else {
11933
- return ['allDay'];
11934
- }
11935
- };
11936
- return AllDaySplitter;
11937
- }(core.Splitter));
11938
-
11939
- var TIMEGRID_ALL_DAY_EVENT_LIMIT = 5;
11940
- var WEEK_HEADER_FORMAT = core.createFormatter({ week: 'short' });
11941
- /* An abstract class for all timegrid-related views. Displays one more columns with time slots running vertically.
11942
- ----------------------------------------------------------------------------------------------------------------------*/
11943
- // Is a manager for the TimeGrid subcomponent and possibly the DayGrid subcomponent (if allDaySlot is on).
11944
- // Responsible for managing width/height.
11945
- var TimeGridView = /** @class */ (function (_super) {
11946
- __extends(TimeGridView, _super);
11947
- function TimeGridView(context, viewSpec, dateProfileGenerator, parentEl) {
11948
- var _this = _super.call(this, context, viewSpec, dateProfileGenerator, parentEl) || this;
11949
- _this.splitter = new AllDaySplitter();
11950
- /* Header Render Methods
11951
- ------------------------------------------------------------------------------------------------------------------*/
11952
- // Generates the HTML that will go before the day-of week header cells
11953
- _this.renderHeadIntroHtml = function () {
11954
- var _a = _this, theme = _a.theme, dateEnv = _a.dateEnv;
11955
- var range = _this.props.dateProfile.renderRange;
11956
- var dayCnt = core.diffDays(range.start, range.end);
11957
- var weekText;
11958
- if (_this.opt('weekNumbers')) {
11959
- weekText = dateEnv.format(range.start, WEEK_HEADER_FORMAT);
11960
- return '' +
11961
- '<th class="fc-axis fc-week-number ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '>' +
11962
- core.buildGotoAnchorHtml(// aside from link, important for matchCellWidths
11963
- _this, { date: range.start, type: 'week', forceOff: dayCnt > 1 }, core.htmlEscape(weekText) // inner HTML
11964
- ) +
11965
- '</th>';
11966
- }
11967
- else {
11968
- return '<th class="fc-axis ' + theme.getClass('widgetHeader') + '" ' + _this.axisStyleAttr() + '></th>';
11969
- }
11970
- };
11971
- /* Time Grid Render Methods
11972
- ------------------------------------------------------------------------------------------------------------------*/
11973
- // Generates the HTML that goes before the bg of the TimeGrid slot area. Long vertical column.
11974
- _this.renderTimeGridBgIntroHtml = function () {
11975
- var theme = _this.theme;
11976
- return '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '></td>';
11977
- };
11978
- // Generates the HTML that goes before all other types of cells.
11979
- // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
11980
- _this.renderTimeGridIntroHtml = function () {
11981
- return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
11982
- };
11983
- /* Day Grid Render Methods
11984
- ------------------------------------------------------------------------------------------------------------------*/
11985
- // Generates the HTML that goes before the all-day cells
11986
- _this.renderDayGridBgIntroHtml = function () {
11987
- var theme = _this.theme;
11988
- return '' +
11989
- '<td class="fc-axis ' + theme.getClass('widgetContent') + '" ' + _this.axisStyleAttr() + '>' +
11990
- '<span>' + // needed for matchCellWidths
11991
- core.getAllDayHtml(_this) +
11992
- '</span>' +
11993
- '</td>';
11994
- };
11995
- // Generates the HTML that goes before all other types of cells.
11996
- // Affects content-skeleton, mirror-skeleton, highlight-skeleton for both the time-grid and day-grid.
11997
- _this.renderDayGridIntroHtml = function () {
11998
- return '<td class="fc-axis" ' + _this.axisStyleAttr() + '></td>';
11999
- };
12000
- _this.el.classList.add('fc-timeGrid-view');
12001
- _this.el.innerHTML = _this.renderSkeletonHtml();
12002
- _this.scroller = new core.ScrollComponent('hidden', // overflow x
12003
- 'auto' // overflow y
12004
- );
12005
- var timeGridWrapEl = _this.scroller.el;
12006
- _this.el.querySelector('.fc-body > tr > td').appendChild(timeGridWrapEl);
12007
- timeGridWrapEl.classList.add('fc-time-grid-container');
12008
- var timeGridEl = core.createElement('div', { className: 'fc-time-grid' });
12009
- timeGridWrapEl.appendChild(timeGridEl);
12010
- _this.timeGrid = new TimeGrid(_this.context, timeGridEl, {
12011
- renderBgIntroHtml: _this.renderTimeGridBgIntroHtml,
12012
- renderIntroHtml: _this.renderTimeGridIntroHtml
12013
- });
12014
- if (_this.opt('allDaySlot')) { // should we display the "all-day" area?
12015
- _this.dayGrid = new daygrid.DayGrid(// the all-day subcomponent of this view
12016
- _this.context, _this.el.querySelector('.fc-day-grid'), {
12017
- renderNumberIntroHtml: _this.renderDayGridIntroHtml,
12018
- renderBgIntroHtml: _this.renderDayGridBgIntroHtml,
12019
- renderIntroHtml: _this.renderDayGridIntroHtml,
12020
- colWeekNumbersVisible: false,
12021
- cellWeekNumbersVisible: false
12022
- });
12023
- // have the day-grid extend it's coordinate area over the <hr> dividing the two grids
12024
- var dividerEl = _this.el.querySelector('.fc-divider');
12025
- _this.dayGrid.bottomCoordPadding = dividerEl.getBoundingClientRect().height;
12026
- }
12027
- return _this;
12028
- }
12029
- TimeGridView.prototype.destroy = function () {
12030
- _super.prototype.destroy.call(this);
12031
- this.timeGrid.destroy();
12032
- if (this.dayGrid) {
12033
- this.dayGrid.destroy();
12034
- }
12035
- this.scroller.destroy();
12036
- };
12037
- /* Rendering
12038
- ------------------------------------------------------------------------------------------------------------------*/
12039
- // Builds the HTML skeleton for the view.
12040
- // The day-grid and time-grid components will render inside containers defined by this HTML.
12041
- TimeGridView.prototype.renderSkeletonHtml = function () {
12042
- var theme = this.theme;
12043
- return '' +
12044
- '<table class="' + theme.getClass('tableGrid') + '">' +
12045
- (this.opt('columnHeader') ?
12046
- '<thead class="fc-head">' +
12047
- '<tr>' +
12048
- '<td class="fc-head-container ' + theme.getClass('widgetHeader') + '">&nbsp;</td>' +
12049
- '</tr>' +
12050
- '</thead>' :
12051
- '') +
12052
- '<tbody class="fc-body">' +
12053
- '<tr>' +
12054
- '<td class="' + theme.getClass('widgetContent') + '">' +
12055
- (this.opt('allDaySlot') ?
12056
- '<div class="fc-day-grid"></div>' +
12057
- '<hr class="fc-divider ' + theme.getClass('widgetHeader') + '" />' :
12058
- '') +
12059
- '</td>' +
12060
- '</tr>' +
12061
- '</tbody>' +
12062
- '</table>';
12063
- };
12064
- /* Now Indicator
12065
- ------------------------------------------------------------------------------------------------------------------*/
12066
- TimeGridView.prototype.getNowIndicatorUnit = function () {
12067
- return this.timeGrid.getNowIndicatorUnit();
12068
- };
12069
- // subclasses should implement
12070
- // renderNowIndicator(date: DateMarker) {
12071
- // }
12072
- TimeGridView.prototype.unrenderNowIndicator = function () {
12073
- this.timeGrid.unrenderNowIndicator();
12074
- };
12075
- /* Dimensions
12076
- ------------------------------------------------------------------------------------------------------------------*/
12077
- TimeGridView.prototype.updateSize = function (isResize, viewHeight, isAuto) {
12078
- _super.prototype.updateSize.call(this, isResize, viewHeight, isAuto); // will call updateBaseSize. important that executes first
12079
- this.timeGrid.updateSize(isResize);
12080
- if (this.dayGrid) {
12081
- this.dayGrid.updateSize(isResize);
12082
- }
12083
- };
12084
- // Adjusts the vertical dimensions of the view to the specified values
12085
- TimeGridView.prototype.updateBaseSize = function (isResize, viewHeight, isAuto) {
12086
- var _this = this;
12087
- var eventLimit;
12088
- var scrollerHeight;
12089
- var scrollbarWidths;
12090
- // make all axis cells line up
12091
- this.axisWidth = core.matchCellWidths(core.findElements(this.el, '.fc-axis'));
12092
- // hack to give the view some height prior to timeGrid's columns being rendered
12093
- // TODO: separate setting height from scroller VS timeGrid.
12094
- if (!this.timeGrid.colEls) {
12095
- if (!isAuto) {
12096
- scrollerHeight = this.computeScrollerHeight(viewHeight);
12097
- this.scroller.setHeight(scrollerHeight);
12098
- }
12099
- return;
12100
- }
12101
- // set of fake row elements that must compensate when scroller has scrollbars
12102
- var noScrollRowEls = core.findElements(this.el, '.fc-row').filter(function (node) {
12103
- return !_this.scroller.el.contains(node);
12104
- });
12105
- // reset all dimensions back to the original state
12106
- this.timeGrid.bottomRuleEl.style.display = 'none'; // will be shown later if this <hr> is necessary
12107
- this.scroller.clear(); // sets height to 'auto' and clears overflow
12108
- noScrollRowEls.forEach(core.uncompensateScroll);
12109
- // limit number of events in the all-day area
12110
- if (this.dayGrid) {
12111
- this.dayGrid.removeSegPopover(); // kill the "more" popover if displayed
12112
- eventLimit = this.opt('eventLimit');
12113
- if (eventLimit && typeof eventLimit !== 'number') {
12114
- eventLimit = TIMEGRID_ALL_DAY_EVENT_LIMIT; // make sure "auto" goes to a real number
12115
- }
12116
- if (eventLimit) {
12117
- this.dayGrid.limitRows(eventLimit);
12118
- }
12119
- }
12120
- if (!isAuto) { // should we force dimensions of the scroll container?
12121
- scrollerHeight = this.computeScrollerHeight(viewHeight);
12122
- this.scroller.setHeight(scrollerHeight);
12123
- scrollbarWidths = this.scroller.getScrollbarWidths();
12124
- if (scrollbarWidths.left || scrollbarWidths.right) { // using scrollbars?
12125
- // make the all-day and header rows lines up
12126
- noScrollRowEls.forEach(function (rowEl) {
12127
- core.compensateScroll(rowEl, scrollbarWidths);
12128
- });
12129
- // the scrollbar compensation might have changed text flow, which might affect height, so recalculate
12130
- // and reapply the desired height to the scroller.
12131
- scrollerHeight = this.computeScrollerHeight(viewHeight);
12132
- this.scroller.setHeight(scrollerHeight);
12133
- }
12134
- // guarantees the same scrollbar widths
12135
- this.scroller.lockOverflow(scrollbarWidths);
12136
- // if there's any space below the slats, show the horizontal rule.
12137
- // this won't cause any new overflow, because lockOverflow already called.
12138
- if (this.timeGrid.getTotalSlatHeight() < scrollerHeight) {
12139
- this.timeGrid.bottomRuleEl.style.display = '';
12140
- }
12141
- }
12142
- };
12143
- // given a desired total height of the view, returns what the height of the scroller should be
12144
- TimeGridView.prototype.computeScrollerHeight = function (viewHeight) {
12145
- return viewHeight -
12146
- core.subtractInnerElHeight(this.el, this.scroller.el); // everything that's NOT the scroller
12147
- };
12148
- /* Scroll
12149
- ------------------------------------------------------------------------------------------------------------------*/
12150
- // Computes the initial pre-configured scroll state prior to allowing the user to change it
12151
- TimeGridView.prototype.computeDateScroll = function (duration) {
12152
- var top = this.timeGrid.computeTimeTop(duration);
12153
- // zoom can give weird floating-point values. rather scroll a little bit further
12154
- top = Math.ceil(top);
12155
- if (top) {
12156
- top++; // to overcome top border that slots beyond the first have. looks better
12157
- }
12158
- return { top: top };
12159
- };
12160
- TimeGridView.prototype.queryDateScroll = function () {
12161
- return { top: this.scroller.getScrollTop() };
12162
- };
12163
- TimeGridView.prototype.applyDateScroll = function (scroll) {
12164
- if (scroll.top !== undefined) {
12165
- this.scroller.setScrollTop(scroll.top);
12166
- }
12167
- };
12168
- // Generates an HTML attribute string for setting the width of the axis, if it is known
12169
- TimeGridView.prototype.axisStyleAttr = function () {
12170
- if (this.axisWidth != null) {
12171
- return 'style="width:' + this.axisWidth + 'px"';
12172
- }
12173
- return '';
12174
- };
12175
- return TimeGridView;
12176
- }(core.View));
12177
- TimeGridView.prototype.usesMinMaxTime = true; // indicates that minTime/maxTime affects rendering
12178
-
12179
- var SimpleTimeGrid = /** @class */ (function (_super) {
12180
- __extends(SimpleTimeGrid, _super);
12181
- function SimpleTimeGrid(context, timeGrid) {
12182
- var _this = _super.call(this, context, timeGrid.el) || this;
12183
- _this.buildDayRanges = core.memoize(buildDayRanges);
12184
- _this.slicer = new TimeGridSlicer();
12185
- _this.timeGrid = timeGrid;
12186
- context.calendar.registerInteractiveComponent(_this, {
12187
- el: _this.timeGrid.el
12188
- });
12189
- return _this;
12190
- }
12191
- SimpleTimeGrid.prototype.destroy = function () {
12192
- _super.prototype.destroy.call(this);
12193
- this.calendar.unregisterInteractiveComponent(this);
12194
- };
12195
- SimpleTimeGrid.prototype.render = function (props) {
12196
- var dateProfile = props.dateProfile, dayTable = props.dayTable;
12197
- var dayRanges = this.dayRanges = this.buildDayRanges(dayTable, dateProfile, this.dateEnv);
12198
- this.timeGrid.receiveProps(__assign({}, this.slicer.sliceProps(props, dateProfile, null, this.timeGrid, dayRanges), { dateProfile: dateProfile, cells: dayTable.cells[0] }));
12199
- };
12200
- SimpleTimeGrid.prototype.renderNowIndicator = function (date) {
12201
- this.timeGrid.renderNowIndicator(this.slicer.sliceNowDate(date, this.timeGrid, this.dayRanges), date);
12202
- };
12203
- SimpleTimeGrid.prototype.buildPositionCaches = function () {
12204
- this.timeGrid.buildPositionCaches();
12205
- };
12206
- SimpleTimeGrid.prototype.queryHit = function (positionLeft, positionTop) {
12207
- var rawHit = this.timeGrid.positionToHit(positionLeft, positionTop);
12208
- if (rawHit) {
12209
- return {
12210
- component: this.timeGrid,
12211
- dateSpan: rawHit.dateSpan,
12212
- dayEl: rawHit.dayEl,
12213
- rect: {
12214
- left: rawHit.relativeRect.left,
12215
- right: rawHit.relativeRect.right,
12216
- top: rawHit.relativeRect.top,
12217
- bottom: rawHit.relativeRect.bottom
12218
- },
12219
- layer: 0
12220
- };
12221
- }
12222
- };
12223
- return SimpleTimeGrid;
12224
- }(core.DateComponent));
12225
- function buildDayRanges(dayTable, dateProfile, dateEnv) {
12226
- var ranges = [];
12227
- for (var _i = 0, _a = dayTable.headerDates; _i < _a.length; _i++) {
12228
- var date = _a[_i];
12229
- ranges.push({
12230
- start: dateEnv.add(date, dateProfile.minTime),
12231
- end: dateEnv.add(date, dateProfile.maxTime)
12232
- });
12233
- }
12234
- return ranges;
12235
- }
12236
- var TimeGridSlicer = /** @class */ (function (_super) {
12237
- __extends(TimeGridSlicer, _super);
12238
- function TimeGridSlicer() {
12239
- return _super !== null && _super.apply(this, arguments) || this;
12240
- }
12241
- TimeGridSlicer.prototype.sliceRange = function (range, dayRanges) {
12242
- var segs = [];
12243
- for (var col = 0; col < dayRanges.length; col++) {
12244
- var segRange = core.intersectRanges(range, dayRanges[col]);
12245
- if (segRange) {
12246
- segs.push({
12247
- start: segRange.start,
12248
- end: segRange.end,
12249
- isStart: segRange.start.valueOf() === range.start.valueOf(),
12250
- isEnd: segRange.end.valueOf() === range.end.valueOf(),
12251
- col: col
12252
- });
12253
- }
12254
- }
12255
- return segs;
12256
- };
12257
- return TimeGridSlicer;
12258
- }(core.Slicer));
12259
-
12260
- var TimeGridView$1 = /** @class */ (function (_super) {
12261
- __extends(TimeGridView, _super);
12262
- function TimeGridView(_context, viewSpec, dateProfileGenerator, parentEl) {
12263
- var _this = _super.call(this, _context, viewSpec, dateProfileGenerator, parentEl) || this;
12264
- _this.buildDayTable = core.memoize(buildDayTable);
12265
- if (_this.opt('columnHeader')) {
12266
- _this.header = new core.DayHeader(_this.context, _this.el.querySelector('.fc-head-container'));
12267
- }
12268
- _this.simpleTimeGrid = new SimpleTimeGrid(_this.context, _this.timeGrid);
12269
- if (_this.dayGrid) {
12270
- _this.simpleDayGrid = new daygrid.SimpleDayGrid(_this.context, _this.dayGrid);
12271
- }
12272
- return _this;
12273
- }
12274
- TimeGridView.prototype.destroy = function () {
12275
- _super.prototype.destroy.call(this);
12276
- if (this.header) {
12277
- this.header.destroy();
12278
- }
12279
- this.simpleTimeGrid.destroy();
12280
- if (this.simpleDayGrid) {
12281
- this.simpleDayGrid.destroy();
12282
- }
12283
- };
12284
- TimeGridView.prototype.render = function (props) {
12285
- _super.prototype.render.call(this, props); // for flags for updateSize
12286
- var dateProfile = this.props.dateProfile;
12287
- var dayTable = this.buildDayTable(dateProfile, this.dateProfileGenerator);
12288
- var splitProps = this.splitter.splitProps(props);
12289
- if (this.header) {
12290
- this.header.receiveProps({
12291
- dateProfile: dateProfile,
12292
- dates: dayTable.headerDates,
12293
- datesRepDistinctDays: true,
12294
- renderIntroHtml: this.renderHeadIntroHtml
12295
- });
12296
- }
12297
- this.simpleTimeGrid.receiveProps(__assign({}, splitProps['timed'], { dateProfile: dateProfile,
12298
- dayTable: dayTable }));
12299
- if (this.simpleDayGrid) {
12300
- this.simpleDayGrid.receiveProps(__assign({}, splitProps['allDay'], { dateProfile: dateProfile,
12301
- dayTable: dayTable, nextDayThreshold: this.nextDayThreshold, isRigid: false }));
12302
- }
12303
- };
12304
- TimeGridView.prototype.renderNowIndicator = function (date) {
12305
- this.simpleTimeGrid.renderNowIndicator(date);
12306
- };
12307
- return TimeGridView;
12308
- }(TimeGridView));
12309
- function buildDayTable(dateProfile, dateProfileGenerator) {
12310
- var daySeries = new core.DaySeries(dateProfile.renderRange, dateProfileGenerator);
12311
- return new core.DayTable(daySeries, false);
12312
- }
12313
-
12314
- var main = core.createPlugin({
12315
- defaultView: 'timeGridWeek',
12316
- views: {
12317
- timeGrid: {
12318
- class: TimeGridView$1,
12319
- allDaySlot: true,
12320
- slotDuration: '00:30:00',
12321
- slotEventOverlap: true // a bad name. confused with overlap/constraint system
12322
- },
12323
- timeGridDay: {
12324
- type: 'timeGrid',
12325
- duration: { days: 1 }
12326
- },
12327
- timeGridWeek: {
12328
- type: 'timeGrid',
12329
- duration: { weeks: 1 }
12330
- }
12331
- }
12332
- });
12333
-
12334
- exports.AbstractTimeGridView = TimeGridView;
12335
- exports.TimeGrid = TimeGrid;
12336
- exports.TimeGridSlicer = TimeGridSlicer;
12337
- exports.TimeGridView = TimeGridView$1;
12338
- exports.buildDayRanges = buildDayRanges;
12339
- exports.buildDayTable = buildDayTable;
12340
- exports.default = main;
12341
-
12342
- Object.defineProperty(exports, '__esModule', { value: true });
12343
-
12344
- }));
12345
-
12346
- !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);
12347
- !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);
12348
-
12349
- /*!
12350
- * Morphext - Text Rotating Plugin for jQuery
12351
- * https://github.com/MrSaints/Morphext
12352
- *
12353
- * Built on jQuery Boilerplate
12354
- * http://jqueryboilerplate.com/
12355
- *
12356
- * Copyright 2014 Ian Lai and other contributors
12357
- * Released under the MIT license
12358
- * http://ian.mit-license.org/
12359
- */
12360
-
12361
- /*eslint-env browser */
12362
- /*global jQuery:false */
12363
- /*eslint-disable no-underscore-dangle */
12364
-
12365
- (function ($) {
12366
- "use strict";
12367
-
12368
- var pluginName = "Morphext",
12369
- defaults = {
12370
- animation: "bounceIn",
12371
- separator: ",",
12372
- speed: 2000,
12373
- complete: $.noop
12374
- };
12375
-
12376
- function Plugin (element, options) {
12377
- this.element = $(element);
12378
-
12379
- this.settings = $.extend({}, defaults, options);
12380
- this._defaults = defaults;
12381
- this._init();
12382
- }
12383
-
12384
- Plugin.prototype = {
12385
- _init: function () {
12386
- var $that = this;
12387
- this.phrases = [];
12388
-
12389
- this.element.addClass("morphext");
12390
-
12391
- $.each(this.element.text().split(this.settings.separator), function (key, value) {
12392
- $that.phrases.push($.trim(value));
12393
- });
12394
-
12395
- this.index = -1;
12396
- this.animate();
12397
- this.start();
12398
- },
12399
- animate: function () {
12400
- this.index = ++this.index % this.phrases.length;
12401
- this.element[0].innerHTML = "<span class=\"animated " + this.settings.animation + "\">" + this.phrases[this.index] + "</span>";
12402
-
12403
- if ($.isFunction(this.settings.complete)) {
12404
- this.settings.complete.call(this);
12405
- }
12406
- },
12407
- start: function () {
12408
- var $that = this;
12409
- this._interval = setInterval(function () {
12410
- $that.animate();
12411
- }, this.settings.speed);
12412
- },
12413
- stop: function () {
12414
- this._interval = clearInterval(this._interval);
12415
- }
12416
- };
12417
-
12418
- $.fn[pluginName] = function (options) {
12419
- return this.each(function() {
12420
- if (!$.data(this, "plugin_" + pluginName)) {
12421
- $.data(this, "plugin_" + pluginName, new Plugin(this, options));
12422
- }
12423
- });
12424
- };
12425
- })(jQuery);
12426
-
12427
- /*!
12428
- *
12429
- * typed.js - A JavaScript Typing Animation Library
12430
- * Author: Matt Boldt <me@mattboldt.com>
12431
- * Version: v2.0.9
12432
- * Url: https://github.com/mattboldt/typed.js
12433
- * License(s): MIT
12434
- *
12435
- */
12436
- (function webpackUniversalModuleDefinition(root, factory) {
12437
- if(typeof exports === 'object' && typeof module === 'object')
12438
- module.exports = factory();
12439
- else if(typeof define === 'function' && define.amd)
12440
- define([], factory);
12441
- else if(typeof exports === 'object')
12442
- exports["Typed"] = factory();
12443
- else
12444
- root["Typed"] = factory();
12445
- })(this, function() {
12446
- return /******/ (function(modules) { // webpackBootstrap
12447
- /******/ // The module cache
12448
- /******/ var installedModules = {};
12449
- /******/
12450
- /******/ // The require function
12451
- /******/ function __webpack_require__(moduleId) {
12452
- /******/
12453
- /******/ // Check if module is in cache
12454
- /******/ if(installedModules[moduleId])
12455
- /******/ return installedModules[moduleId].exports;
12456
- /******/
12457
- /******/ // Create a new module (and put it into the cache)
12458
- /******/ var module = installedModules[moduleId] = {
12459
- /******/ exports: {},
12460
- /******/ id: moduleId,
12461
- /******/ loaded: false
12462
- /******/ };
12463
- /******/
12464
- /******/ // Execute the module function
12465
- /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
12466
- /******/
12467
- /******/ // Flag the module as loaded
12468
- /******/ module.loaded = true;
12469
- /******/
12470
- /******/ // Return the exports of the module
12471
- /******/ return module.exports;
12472
- /******/ }
12473
- /******/
12474
- /******/
12475
- /******/ // expose the modules object (__webpack_modules__)
12476
- /******/ __webpack_require__.m = modules;
12477
- /******/
12478
- /******/ // expose the module cache
12479
- /******/ __webpack_require__.c = installedModules;
12480
- /******/
12481
- /******/ // __webpack_public_path__
12482
- /******/ __webpack_require__.p = "";
12483
- /******/
12484
- /******/ // Load entry module and return exports
12485
- /******/ return __webpack_require__(0);
12486
- /******/ })
12487
- /************************************************************************/
12488
- /******/ ([
12489
- /* 0 */
12490
- /***/ (function(module, exports, __webpack_require__) {
12491
-
12492
- 'use strict';
12493
-
12494
- Object.defineProperty(exports, '__esModule', {
12495
- value: true
12496
- });
12497
-
12498
- 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; }; })();
12499
-
12500
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
12501
-
12502
- var _initializerJs = __webpack_require__(1);
12503
-
12504
- var _htmlParserJs = __webpack_require__(3);
12505
-
12506
- /**
12507
- * Welcome to Typed.js!
12508
- * @param {string} elementId HTML element ID _OR_ HTML element
12509
- * @param {object} options options object
12510
- * @returns {object} a new Typed object
12511
- */
12512
-
12513
- var Typed = (function () {
12514
- function Typed(elementId, options) {
12515
- _classCallCheck(this, Typed);
12516
-
12517
- // Initialize it up
12518
- _initializerJs.initializer.load(this, options, elementId);
12519
- // All systems go!
12520
- this.begin();
12521
- }
12522
-
12523
- /**
12524
- * Toggle start() and stop() of the Typed instance
12525
- * @public
12526
- */
12527
-
12528
- _createClass(Typed, [{
12529
- key: 'toggle',
12530
- value: function toggle() {
12531
- this.pause.status ? this.start() : this.stop();
12532
- }
12533
-
12534
- /**
12535
- * Stop typing / backspacing and enable cursor blinking
12536
- * @public
12537
- */
12538
- }, {
12539
- key: 'stop',
12540
- value: function stop() {
12541
- if (this.typingComplete) return;
12542
- if (this.pause.status) return;
12543
- this.toggleBlinking(true);
12544
- this.pause.status = true;
12545
- this.options.onStop(this.arrayPos, this);
12546
- }
12547
-
12548
- /**
12549
- * Start typing / backspacing after being stopped
12550
- * @public
12551
- */
12552
- }, {
12553
- key: 'start',
12554
- value: function start() {
12555
- if (this.typingComplete) return;
12556
- if (!this.pause.status) return;
12557
- this.pause.status = false;
12558
- if (this.pause.typewrite) {
12559
- this.typewrite(this.pause.curString, this.pause.curStrPos);
12560
- } else {
12561
- this.backspace(this.pause.curString, this.pause.curStrPos);
12562
- }
12563
- this.options.onStart(this.arrayPos, this);
12564
- }
12565
-
12566
- /**
12567
- * Destroy this instance of Typed
12568
- * @public
12569
- */
12570
- }, {
12571
- key: 'destroy',
12572
- value: function destroy() {
12573
- this.reset(false);
12574
- this.options.onDestroy(this);
12575
- }
12576
-
12577
- /**
12578
- * Reset Typed and optionally restarts
12579
- * @param {boolean} restart
12580
- * @public
12581
- */
12582
- }, {
12583
- key: 'reset',
12584
- value: function reset() {
12585
- var restart = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
12586
-
12587
- clearInterval(this.timeout);
12588
- this.replaceText('');
12589
- if (this.cursor && this.cursor.parentNode) {
12590
- this.cursor.parentNode.removeChild(this.cursor);
12591
- this.cursor = null;
12592
- }
12593
- this.strPos = 0;
12594
- this.arrayPos = 0;
12595
- this.curLoop = 0;
12596
- if (restart) {
12597
- this.insertCursor();
12598
- this.options.onReset(this);
12599
- this.begin();
12600
- }
12601
- }
12602
-
12603
- /**
12604
- * Begins the typing animation
12605
- * @private
12606
- */
12607
- }, {
12608
- key: 'begin',
12609
- value: function begin() {
12610
- var _this = this;
12611
-
12612
- this.typingComplete = false;
12613
- this.shuffleStringsIfNeeded(this);
12614
- this.insertCursor();
12615
- if (this.bindInputFocusEvents) this.bindFocusEvents();
12616
- this.timeout = setTimeout(function () {
12617
- // Check if there is some text in the element, if yes start by backspacing the default message
12618
- if (!_this.currentElContent || _this.currentElContent.length === 0) {
12619
- _this.typewrite(_this.strings[_this.sequence[_this.arrayPos]], _this.strPos);
12620
- } else {
12621
- // Start typing
12622
- _this.backspace(_this.currentElContent, _this.currentElContent.length);
12623
- }
12624
- }, this.startDelay);
12625
- }
12626
-
12627
- /**
12628
- * Called for each character typed
12629
- * @param {string} curString the current string in the strings array
12630
- * @param {number} curStrPos the current position in the curString
12631
- * @private
12632
- */
12633
- }, {
12634
- key: 'typewrite',
12635
- value: function typewrite(curString, curStrPos) {
12636
- var _this2 = this;
12637
-
12638
- if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) {
12639
- this.el.classList.remove(this.fadeOutClass);
12640
- if (this.cursor) this.cursor.classList.remove(this.fadeOutClass);
12641
- }
12642
-
12643
- var humanize = this.humanizer(this.typeSpeed);
12644
- var numChars = 1;
12645
-
12646
- if (this.pause.status === true) {
12647
- this.setPauseStatus(curString, curStrPos, true);
12648
- return;
12649
- }
12650
-
12651
- // contain typing function in a timeout humanize'd delay
12652
- this.timeout = setTimeout(function () {
12653
- // skip over any HTML chars
12654
- curStrPos = _htmlParserJs.htmlParser.typeHtmlChars(curString, curStrPos, _this2);
12655
-
12656
- var pauseTime = 0;
12657
- var substr = curString.substr(curStrPos);
12658
- // check for an escape character before a pause value
12659
- // format: \^\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^
12660
- // single ^ are removed from string
12661
- if (substr.charAt(0) === '^') {
12662
- if (/^\^\d+/.test(substr)) {
12663
- var skip = 1; // skip at least 1
12664
- substr = /\d+/.exec(substr)[0];
12665
- skip += substr.length;
12666
- pauseTime = parseInt(substr);
12667
- _this2.temporaryPause = true;
12668
- _this2.options.onTypingPaused(_this2.arrayPos, _this2);
12669
- // strip out the escape character and pause value so they're not printed
12670
- curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip);
12671
- _this2.toggleBlinking(true);
12672
- }
12673
- }
12674
-
12675
- // check for skip characters formatted as
12676
- // "this is a `string to print NOW` ..."
12677
- if (substr.charAt(0) === '`') {
12678
- while (curString.substr(curStrPos + numChars).charAt(0) !== '`') {
12679
- numChars++;
12680
- if (curStrPos + numChars > curString.length) break;
12681
- }
12682
- // strip out the escape characters and append all the string in between
12683
- var stringBeforeSkip = curString.substring(0, curStrPos);
12684
- var stringSkipped = curString.substring(stringBeforeSkip.length + 1, curStrPos + numChars);
12685
- var stringAfterSkip = curString.substring(curStrPos + numChars + 1);
12686
- curString = stringBeforeSkip + stringSkipped + stringAfterSkip;
12687
- numChars--;
12688
- }
12689
-
12690
- // timeout for any pause after a character
12691
- _this2.timeout = setTimeout(function () {
12692
- // Accounts for blinking while paused
12693
- _this2.toggleBlinking(false);
12694
-
12695
- // We're done with this sentence!
12696
- if (curStrPos >= curString.length) {
12697
- _this2.doneTyping(curString, curStrPos);
12698
- } else {
12699
- _this2.keepTyping(curString, curStrPos, numChars);
12700
- }
12701
- // end of character pause
12702
- if (_this2.temporaryPause) {
12703
- _this2.temporaryPause = false;
12704
- _this2.options.onTypingResumed(_this2.arrayPos, _this2);
12705
- }
12706
- }, pauseTime);
12707
-
12708
- // humanized value for typing
12709
- }, humanize);
12710
- }
12711
-
12712
- /**
12713
- * Continue to the next string & begin typing
12714
- * @param {string} curString the current string in the strings array
12715
- * @param {number} curStrPos the current position in the curString
12716
- * @private
12717
- */
12718
- }, {
12719
- key: 'keepTyping',
12720
- value: function keepTyping(curString, curStrPos, numChars) {
12721
- // call before functions if applicable
12722
- if (curStrPos === 0) {
12723
- this.toggleBlinking(false);
12724
- this.options.preStringTyped(this.arrayPos, this);
12725
- }
12726
- // start typing each new char into existing string
12727
- // curString: arg, this.el.html: original text inside element
12728
- curStrPos += numChars;
12729
- var nextString = curString.substr(0, curStrPos);
12730
- this.replaceText(nextString);
12731
- // loop the function
12732
- this.typewrite(curString, curStrPos);
12733
- }
12734
-
12735
- /**
12736
- * We're done typing all strings
12737
- * @param {string} curString the current string in the strings array
12738
- * @param {number} curStrPos the current position in the curString
12739
- * @private
12740
- */
12741
- }, {
12742
- key: 'doneTyping',
12743
- value: function doneTyping(curString, curStrPos) {
12744
- var _this3 = this;
12745
-
12746
- // fires callback function
12747
- this.options.onStringTyped(this.arrayPos, this);
12748
- this.toggleBlinking(true);
12749
- // is this the final string
12750
- if (this.arrayPos === this.strings.length - 1) {
12751
- // callback that occurs on the last typed string
12752
- this.complete();
12753
- // quit if we wont loop back
12754
- if (this.loop === false || this.curLoop === this.loopCount) {
12755
- return;
12756
- }
12757
- }
12758
- this.timeout = setTimeout(function () {
12759
- _this3.backspace(curString, curStrPos);
12760
- }, this.backDelay);
12761
- }
12762
-
12763
- /**
12764
- * Backspaces 1 character at a time
12765
- * @param {string} curString the current string in the strings array
12766
- * @param {number} curStrPos the current position in the curString
12767
- * @private
12768
- */
12769
- }, {
12770
- key: 'backspace',
12771
- value: function backspace(curString, curStrPos) {
12772
- var _this4 = this;
12773
-
12774
- if (this.pause.status === true) {
12775
- this.setPauseStatus(curString, curStrPos, true);
12776
- return;
12777
- }
12778
- if (this.fadeOut) return this.initFadeOut();
12779
-
12780
- this.toggleBlinking(false);
12781
- var humanize = this.humanizer(this.backSpeed);
12782
-
12783
- this.timeout = setTimeout(function () {
12784
- curStrPos = _htmlParserJs.htmlParser.backSpaceHtmlChars(curString, curStrPos, _this4);
12785
- // replace text with base text + typed characters
12786
- var curStringAtPosition = curString.substr(0, curStrPos);
12787
- _this4.replaceText(curStringAtPosition);
12788
-
12789
- // if smartBack is enabled
12790
- if (_this4.smartBackspace) {
12791
- // the remaining part of the current string is equal of the same part of the new string
12792
- var nextString = _this4.strings[_this4.arrayPos + 1];
12793
- if (nextString && curStringAtPosition === nextString.substr(0, curStrPos)) {
12794
- _this4.stopNum = curStrPos;
12795
- } else {
12796
- _this4.stopNum = 0;
12797
- }
12798
- }
12799
-
12800
- // if the number (id of character in current string) is
12801
- // less than the stop number, keep going
12802
- if (curStrPos > _this4.stopNum) {
12803
- // subtract characters one by one
12804
- curStrPos--;
12805
- // loop the function
12806
- _this4.backspace(curString, curStrPos);
12807
- } else if (curStrPos <= _this4.stopNum) {
12808
- // if the stop number has been reached, increase
12809
- // array position to next string
12810
- _this4.arrayPos++;
12811
- // When looping, begin at the beginning after backspace complete
12812
- if (_this4.arrayPos === _this4.strings.length) {
12813
- _this4.arrayPos = 0;
12814
- _this4.options.onLastStringBackspaced();
12815
- _this4.shuffleStringsIfNeeded();
12816
- _this4.begin();
12817
- } else {
12818
- _this4.typewrite(_this4.strings[_this4.sequence[_this4.arrayPos]], curStrPos);
12819
- }
12820
- }
12821
- // humanized value for typing
12822
- }, humanize);
12823
- }
12824
-
12825
- /**
12826
- * Full animation is complete
12827
- * @private
12828
- */
12829
- }, {
12830
- key: 'complete',
12831
- value: function complete() {
12832
- this.options.onComplete(this);
12833
- if (this.loop) {
12834
- this.curLoop++;
12835
- } else {
12836
- this.typingComplete = true;
12837
- }
12838
- }
12839
-
12840
- /**
12841
- * Has the typing been stopped
12842
- * @param {string} curString the current string in the strings array
12843
- * @param {number} curStrPos the current position in the curString
12844
- * @param {boolean} isTyping
12845
- * @private
12846
- */
12847
- }, {
12848
- key: 'setPauseStatus',
12849
- value: function setPauseStatus(curString, curStrPos, isTyping) {
12850
- this.pause.typewrite = isTyping;
12851
- this.pause.curString = curString;
12852
- this.pause.curStrPos = curStrPos;
12853
- }
12854
-
12855
- /**
12856
- * Toggle the blinking cursor
12857
- * @param {boolean} isBlinking
12858
- * @private
12859
- */
12860
- }, {
12861
- key: 'toggleBlinking',
12862
- value: function toggleBlinking(isBlinking) {
12863
- if (!this.cursor) return;
12864
- // if in paused state, don't toggle blinking a 2nd time
12865
- if (this.pause.status) return;
12866
- if (this.cursorBlinking === isBlinking) return;
12867
- this.cursorBlinking = isBlinking;
12868
- if (isBlinking) {
12869
- this.cursor.classList.add('typed-cursor--blink');
12870
- } else {
12871
- this.cursor.classList.remove('typed-cursor--blink');
12872
- }
12873
- }
12874
-
12875
- /**
12876
- * Speed in MS to type
12877
- * @param {number} speed
12878
- * @private
12879
- */
12880
- }, {
12881
- key: 'humanizer',
12882
- value: function humanizer(speed) {
12883
- return Math.round(Math.random() * speed / 2) + speed;
12884
- }
12885
-
12886
- /**
12887
- * Shuffle the sequence of the strings array
12888
- * @private
12889
- */
12890
- }, {
12891
- key: 'shuffleStringsIfNeeded',
12892
- value: function shuffleStringsIfNeeded() {
12893
- if (!this.shuffle) return;
12894
- this.sequence = this.sequence.sort(function () {
12895
- return Math.random() - 0.5;
12896
- });
12897
- }
12898
-
12899
- /**
12900
- * Adds a CSS class to fade out current string
12901
- * @private
12902
- */
12903
- }, {
12904
- key: 'initFadeOut',
12905
- value: function initFadeOut() {
12906
- var _this5 = this;
12907
-
12908
- this.el.className += ' ' + this.fadeOutClass;
12909
- if (this.cursor) this.cursor.className += ' ' + this.fadeOutClass;
12910
- return setTimeout(function () {
12911
- _this5.arrayPos++;
12912
- _this5.replaceText('');
12913
-
12914
- // Resets current string if end of loop reached
12915
- if (_this5.strings.length > _this5.arrayPos) {
12916
- _this5.typewrite(_this5.strings[_this5.sequence[_this5.arrayPos]], 0);
12917
- } else {
12918
- _this5.typewrite(_this5.strings[0], 0);
12919
- _this5.arrayPos = 0;
12920
- }
12921
- }, this.fadeOutDelay);
12922
- }
12923
-
12924
- /**
12925
- * Replaces current text in the HTML element
12926
- * depending on element type
12927
- * @param {string} str
12928
- * @private
12929
- */
12930
- }, {
12931
- key: 'replaceText',
12932
- value: function replaceText(str) {
12933
- if (this.attr) {
12934
- this.el.setAttribute(this.attr, str);
12935
- } else {
12936
- if (this.isInput) {
12937
- this.el.value = str;
12938
- } else if (this.contentType === 'html') {
12939
- this.el.innerHTML = str;
12940
- } else {
12941
- this.el.textContent = str;
12942
- }
12943
- }
12944
- }
12945
-
12946
- /**
12947
- * If using input elements, bind focus in order to
12948
- * start and stop the animation
12949
- * @private
12950
- */
12951
- }, {
12952
- key: 'bindFocusEvents',
12953
- value: function bindFocusEvents() {
12954
- var _this6 = this;
12955
-
12956
- if (!this.isInput) return;
12957
- this.el.addEventListener('focus', function (e) {
12958
- _this6.stop();
12959
- });
12960
- this.el.addEventListener('blur', function (e) {
12961
- if (_this6.el.value && _this6.el.value.length !== 0) {
12962
- return;
12963
- }
12964
- _this6.start();
12965
- });
12966
- }
12967
-
12968
- /**
12969
- * On init, insert the cursor element
12970
- * @private
12971
- */
12972
- }, {
12973
- key: 'insertCursor',
12974
- value: function insertCursor() {
12975
- if (!this.showCursor) return;
12976
- if (this.cursor) return;
12977
- this.cursor = document.createElement('span');
12978
- this.cursor.className = 'typed-cursor';
12979
- this.cursor.innerHTML = this.cursorChar;
12980
- this.el.parentNode && this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling);
12981
- }
12982
- }]);
12983
-
12984
- return Typed;
12985
- })();
12986
-
12987
- exports['default'] = Typed;
12988
- module.exports = exports['default'];
12989
-
12990
- /***/ }),
12991
- /* 1 */
12992
- /***/ (function(module, exports, __webpack_require__) {
12993
-
12994
- 'use strict';
12995
-
12996
- Object.defineProperty(exports, '__esModule', {
12997
- value: true
12998
- });
12999
-
13000
- 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; };
13001
-
13002
- 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; }; })();
13003
-
13004
- function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
13005
-
13006
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
13007
-
13008
- var _defaultsJs = __webpack_require__(2);
13009
-
13010
- var _defaultsJs2 = _interopRequireDefault(_defaultsJs);
13011
-
13012
- /**
13013
- * Initialize the Typed object
13014
- */
13015
-
13016
- var Initializer = (function () {
13017
- function Initializer() {
13018
- _classCallCheck(this, Initializer);
13019
- }
13020
-
13021
- _createClass(Initializer, [{
13022
- key: 'load',
13023
-
13024
- /**
13025
- * Load up defaults & options on the Typed instance
13026
- * @param {Typed} self instance of Typed
13027
- * @param {object} options options object
13028
- * @param {string} elementId HTML element ID _OR_ instance of HTML element
13029
- * @private
13030
- */
13031
-
13032
- value: function load(self, options, elementId) {
13033
- // chosen element to manipulate text
13034
- if (typeof elementId === 'string') {
13035
- self.el = document.querySelector(elementId);
13036
- } else {
13037
- self.el = elementId;
13038
- }
13039
-
13040
- self.options = _extends({}, _defaultsJs2['default'], options);
13041
-
13042
- // attribute to type into
13043
- self.isInput = self.el.tagName.toLowerCase() === 'input';
13044
- self.attr = self.options.attr;
13045
- self.bindInputFocusEvents = self.options.bindInputFocusEvents;
13046
-
13047
- // show cursor
13048
- self.showCursor = self.isInput ? false : self.options.showCursor;
13049
-
13050
- // custom cursor
13051
- self.cursorChar = self.options.cursorChar;
13052
-
13053
- // Is the cursor blinking
13054
- self.cursorBlinking = true;
13055
-
13056
- // text content of element
13057
- self.elContent = self.attr ? self.el.getAttribute(self.attr) : self.el.textContent;
13058
-
13059
- // html or plain text
13060
- self.contentType = self.options.contentType;
13061
-
13062
- // typing speed
13063
- self.typeSpeed = self.options.typeSpeed;
13064
-
13065
- // add a delay before typing starts
13066
- self.startDelay = self.options.startDelay;
13067
-
13068
- // backspacing speed
13069
- self.backSpeed = self.options.backSpeed;
13070
-
13071
- // only backspace what doesn't match the previous string
13072
- self.smartBackspace = self.options.smartBackspace;
13073
-
13074
- // amount of time to wait before backspacing
13075
- self.backDelay = self.options.backDelay;
13076
-
13077
- // Fade out instead of backspace
13078
- self.fadeOut = self.options.fadeOut;
13079
- self.fadeOutClass = self.options.fadeOutClass;
13080
- self.fadeOutDelay = self.options.fadeOutDelay;
13081
-
13082
- // variable to check whether typing is currently paused
13083
- self.isPaused = false;
13084
-
13085
- // input strings of text
13086
- self.strings = self.options.strings.map(function (s) {
13087
- return s.trim();
13088
- });
13089
-
13090
- // div containing strings
13091
- if (typeof self.options.stringsElement === 'string') {
13092
- self.stringsElement = document.querySelector(self.options.stringsElement);
13093
- } else {
13094
- self.stringsElement = self.options.stringsElement;
13095
- }
13096
-
13097
- if (self.stringsElement) {
13098
- self.strings = [];
13099
- self.stringsElement.style.display = 'none';
13100
- var strings = Array.prototype.slice.apply(self.stringsElement.children);
13101
- var stringsLength = strings.length;
13102
-
13103
- if (stringsLength) {
13104
- for (var i = 0; i < stringsLength; i += 1) {
13105
- var stringEl = strings[i];
13106
- self.strings.push(stringEl.innerHTML.trim());
13107
- }
13108
- }
13109
- }
13110
-
13111
- // character number position of current string
13112
- self.strPos = 0;
13113
-
13114
- // current array position
13115
- self.arrayPos = 0;
13116
-
13117
- // index of string to stop backspacing on
13118
- self.stopNum = 0;
13119
-
13120
- // Looping logic
13121
- self.loop = self.options.loop;
13122
- self.loopCount = self.options.loopCount;
13123
- self.curLoop = 0;
13124
-
13125
- // shuffle the strings
13126
- self.shuffle = self.options.shuffle;
13127
- // the order of strings
13128
- self.sequence = [];
13129
-
13130
- self.pause = {
13131
- status: false,
13132
- typewrite: true,
13133
- curString: '',
13134
- curStrPos: 0
13135
- };
13136
-
13137
- // When the typing is complete (when not looped)
13138
- self.typingComplete = false;
13139
-
13140
- // Set the order in which the strings are typed
13141
- for (var i in self.strings) {
13142
- self.sequence[i] = i;
13143
- }
13144
-
13145
- // If there is some text in the element
13146
- self.currentElContent = this.getCurrentElContent(self);
13147
-
13148
- self.autoInsertCss = self.options.autoInsertCss;
13149
-
13150
- this.appendAnimationCss(self);
13151
- }
13152
- }, {
13153
- key: 'getCurrentElContent',
13154
- value: function getCurrentElContent(self) {
13155
- var elContent = '';
13156
- if (self.attr) {
13157
- elContent = self.el.getAttribute(self.attr);
13158
- } else if (self.isInput) {
13159
- elContent = self.el.value;
13160
- } else if (self.contentType === 'html') {
13161
- elContent = self.el.innerHTML;
13162
- } else {
13163
- elContent = self.el.textContent;
13164
- }
13165
- return elContent;
13166
- }
13167
- }, {
13168
- key: 'appendAnimationCss',
13169
- value: function appendAnimationCss(self) {
13170
- var cssDataName = 'data-typed-js-css';
13171
- if (!self.autoInsertCss) {
13172
- return;
13173
- }
13174
- if (!self.showCursor && !self.fadeOut) {
13175
- return;
13176
- }
13177
- if (document.querySelector('[' + cssDataName + ']')) {
13178
- return;
13179
- }
13180
-
13181
- var css = document.createElement('style');
13182
- css.type = 'text/css';
13183
- css.setAttribute(cssDataName, true);
13184
-
13185
- var innerCss = '';
13186
- if (self.showCursor) {
13187
- 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 ';
13188
- }
13189
- if (self.fadeOut) {
13190
- 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 ';
13191
- }
13192
- if (css.length === 0) {
13193
- return;
13194
- }
13195
- css.innerHTML = innerCss;
13196
- document.body.appendChild(css);
13197
- }
13198
- }]);
13199
-
13200
- return Initializer;
13201
- })();
13202
-
13203
- exports['default'] = Initializer;
13204
- var initializer = new Initializer();
13205
- exports.initializer = initializer;
13206
-
13207
- /***/ }),
13208
- /* 2 */
13209
- /***/ (function(module, exports) {
13210
-
13211
- /**
13212
- * Defaults & options
13213
- * @returns {object} Typed defaults & options
13214
- * @public
13215
- */
13216
-
13217
- 'use strict';
13218
-
13219
- Object.defineProperty(exports, '__esModule', {
13220
- value: true
13221
- });
13222
- var defaults = {
13223
- /**
13224
- * @property {array} strings strings to be typed
13225
- * @property {string} stringsElement ID of element containing string children
13226
- */
13227
- strings: ['These are the default values...', 'You know what you should do?', 'Use your own!', 'Have a great day!'],
13228
- stringsElement: null,
13229
-
13230
- /**
13231
- * @property {number} typeSpeed type speed in milliseconds
13232
- */
13233
- typeSpeed: 0,
13234
-
13235
- /**
13236
- * @property {number} startDelay time before typing starts in milliseconds
13237
- */
13238
- startDelay: 0,
13239
-
13240
- /**
13241
- * @property {number} backSpeed backspacing speed in milliseconds
13242
- */
13243
- backSpeed: 0,
13244
-
13245
- /**
13246
- * @property {boolean} smartBackspace only backspace what doesn't match the previous string
13247
- */
13248
- smartBackspace: true,
13249
-
13250
- /**
13251
- * @property {boolean} shuffle shuffle the strings
13252
- */
13253
- shuffle: false,
13254
-
13255
- /**
13256
- * @property {number} backDelay time before backspacing in milliseconds
13257
- */
13258
- backDelay: 700,
13259
-
13260
- /**
13261
- * @property {boolean} fadeOut Fade out instead of backspace
13262
- * @property {string} fadeOutClass css class for fade animation
13263
- * @property {boolean} fadeOutDelay Fade out delay in milliseconds
13264
- */
13265
- fadeOut: false,
13266
- fadeOutClass: 'typed-fade-out',
13267
- fadeOutDelay: 500,
13268
-
13269
- /**
13270
- * @property {boolean} loop loop strings
13271
- * @property {number} loopCount amount of loops
13272
- */
13273
- loop: false,
13274
- loopCount: Infinity,
13275
-
13276
- /**
13277
- * @property {boolean} showCursor show cursor
13278
- * @property {string} cursorChar character for cursor
13279
- * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML <head>
13280
- */
13281
- showCursor: true,
13282
- cursorChar: '|',
13283
- autoInsertCss: true,
13284
-
13285
- /**
13286
- * @property {string} attr attribute for typing
13287
- * Ex: input placeholder, value, or just HTML text
13288
- */
13289
- attr: null,
13290
-
13291
- /**
13292
- * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input
13293
- */
13294
- bindInputFocusEvents: false,
13295
-
13296
- /**
13297
- * @property {string} contentType 'html' or 'null' for plaintext
13298
- */
13299
- contentType: 'html',
13300
-
13301
- /**
13302
- * All typing is complete
13303
- * @param {Typed} self
13304
- */
13305
- onComplete: function onComplete(self) {},
13306
-
13307
- /**
13308
- * Before each string is typed
13309
- * @param {number} arrayPos
13310
- * @param {Typed} self
13311
- */
13312
- preStringTyped: function preStringTyped(arrayPos, self) {},
13313
-
13314
- /**
13315
- * After each string is typed
13316
- * @param {number} arrayPos
13317
- * @param {Typed} self
13318
- */
13319
- onStringTyped: function onStringTyped(arrayPos, self) {},
13320
-
13321
- /**
13322
- * During looping, after last string is typed
13323
- * @param {Typed} self
13324
- */
13325
- onLastStringBackspaced: function onLastStringBackspaced(self) {},
13326
-
13327
- /**
13328
- * Typing has been stopped
13329
- * @param {number} arrayPos
13330
- * @param {Typed} self
13331
- */
13332
- onTypingPaused: function onTypingPaused(arrayPos, self) {},
13333
-
13334
- /**
13335
- * Typing has been started after being stopped
13336
- * @param {number} arrayPos
13337
- * @param {Typed} self
13338
- */
13339
- onTypingResumed: function onTypingResumed(arrayPos, self) {},
13340
-
13341
- /**
13342
- * After reset
13343
- * @param {Typed} self
13344
- */
13345
- onReset: function onReset(self) {},
13346
-
13347
- /**
13348
- * After stop
13349
- * @param {number} arrayPos
13350
- * @param {Typed} self
13351
- */
13352
- onStop: function onStop(arrayPos, self) {},
13353
-
13354
- /**
13355
- * After start
13356
- * @param {number} arrayPos
13357
- * @param {Typed} self
13358
- */
13359
- onStart: function onStart(arrayPos, self) {},
13360
-
13361
- /**
13362
- * After destroy
13363
- * @param {Typed} self
13364
- */
13365
- onDestroy: function onDestroy(self) {}
13366
- };
13367
-
13368
- exports['default'] = defaults;
13369
- module.exports = exports['default'];
13370
-
13371
- /***/ }),
13372
- /* 3 */
13373
- /***/ (function(module, exports) {
13374
-
13375
-
13376
- /**
13377
- * TODO: These methods can probably be combined somehow
13378
- * Parse HTML tags & HTML Characters
13379
- */
13380
-
13381
- 'use strict';
13382
-
13383
- Object.defineProperty(exports, '__esModule', {
13384
- value: true
13385
- });
13386
-
13387
- 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; }; })();
13388
-
13389
- function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
13390
-
13391
- var HTMLParser = (function () {
13392
- function HTMLParser() {
13393
- _classCallCheck(this, HTMLParser);
13394
- }
13395
-
13396
- _createClass(HTMLParser, [{
13397
- key: 'typeHtmlChars',
13398
-
13399
- /**
13400
- * Type HTML tags & HTML Characters
13401
- * @param {string} curString Current string
13402
- * @param {number} curStrPos Position in current string
13403
- * @param {Typed} self instance of Typed
13404
- * @returns {number} a new string position
13405
- * @private
13406
- */
13407
-
13408
- value: function typeHtmlChars(curString, curStrPos, self) {
13409
- if (self.contentType !== 'html') return curStrPos;
13410
- var curChar = curString.substr(curStrPos).charAt(0);
13411
- if (curChar === '<' || curChar === '&') {
13412
- var endTag = '';
13413
- if (curChar === '<') {
13414
- endTag = '>';
13415
- } else {
13416
- endTag = ';';
13417
- }
13418
- while (curString.substr(curStrPos + 1).charAt(0) !== endTag) {
13419
- curStrPos++;
13420
- if (curStrPos + 1 > curString.length) {
13421
- break;
13422
- }
13423
- }
13424
- curStrPos++;
13425
- }
13426
- return curStrPos;
13427
- }
13428
-
13429
- /**
13430
- * Backspace HTML tags and HTML Characters
13431
- * @param {string} curString Current string
13432
- * @param {number} curStrPos Position in current string
13433
- * @param {Typed} self instance of Typed
13434
- * @returns {number} a new string position
13435
- * @private
13436
- */
13437
- }, {
13438
- key: 'backSpaceHtmlChars',
13439
- value: function backSpaceHtmlChars(curString, curStrPos, self) {
13440
- if (self.contentType !== 'html') return curStrPos;
13441
- var curChar = curString.substr(curStrPos).charAt(0);
13442
- if (curChar === '>' || curChar === ';') {
13443
- var endTag = '';
13444
- if (curChar === '>') {
13445
- endTag = '<';
13446
- } else {
13447
- endTag = '&';
13448
- }
13449
- while (curString.substr(curStrPos - 1).charAt(0) !== endTag) {
13450
- curStrPos--;
13451
- if (curStrPos < 0) {
13452
- break;
13453
- }
13454
- }
13455
- curStrPos--;
13456
- }
13457
- return curStrPos;
13458
- }
13459
- }]);
13460
-
13461
- return HTMLParser;
13462
- })();
13463
-
13464
- exports['default'] = HTMLParser;
13465
- var htmlParser = new HTMLParser();
13466
- exports.htmlParser = htmlParser;
13467
-
13468
- /***/ })
13469
- /******/ ])
13470
- });
13471
- ;
13472
- /*!
13473
- * imagesLoaded PACKAGED v4.1.4
13474
- * JavaScript is all like "You images are done yet or what?"
13475
- * MIT License
13476
- */
13477
-
13478
- /**
13479
- * EvEmitter v1.1.0
13480
- * Lil' event emitter
13481
- * MIT License
13482
- */
13483
-
13484
- /* jshint unused: true, undef: true, strict: true */
13485
-
13486
- ( function( global, factory ) {
13487
- // universal module definition
13488
- /* jshint strict: false */ /* globals define, module, window */
13489
- if ( typeof define == 'function' && define.amd ) {
13490
- // AMD - RequireJS
13491
- define( 'ev-emitter/ev-emitter',factory );
13492
- } else if ( typeof module == 'object' && module.exports ) {
13493
- // CommonJS - Browserify, Webpack
13494
- module.exports = factory();
13495
- } else {
13496
- // Browser globals
13497
- global.EvEmitter = factory();
13498
- }
13499
-
13500
- }( typeof window != 'undefined' ? window : this, function() {
13501
-
13502
-
13503
-
13504
- function EvEmitter() {}
13505
-
13506
- var proto = EvEmitter.prototype;
13507
-
13508
- proto.on = function( eventName, listener ) {
13509
- if ( !eventName || !listener ) {
13510
- return;
13511
- }
13512
- // set events hash
13513
- var events = this._events = this._events || {};
13514
- // set listeners array
13515
- var listeners = events[ eventName ] = events[ eventName ] || [];
13516
- // only add once
13517
- if ( listeners.indexOf( listener ) == -1 ) {
13518
- listeners.push( listener );
13519
- }
13520
-
13521
- return this;
13522
- };
13523
-
13524
- proto.once = function( eventName, listener ) {
13525
- if ( !eventName || !listener ) {
13526
- return;
13527
- }
13528
- // add event
13529
- this.on( eventName, listener );
13530
- // set once flag
13531
- // set onceEvents hash
13532
- var onceEvents = this._onceEvents = this._onceEvents || {};
13533
- // set onceListeners object
13534
- var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
13535
- // set flag
13536
- onceListeners[ listener ] = true;
13537
-
13538
- return this;
13539
- };
13540
-
13541
- proto.off = function( eventName, listener ) {
13542
- var listeners = this._events && this._events[ eventName ];
13543
- if ( !listeners || !listeners.length ) {
13544
- return;
13545
- }
13546
- var index = listeners.indexOf( listener );
13547
- if ( index != -1 ) {
13548
- listeners.splice( index, 1 );
13549
- }
13550
-
13551
- return this;
13552
- };
13553
-
13554
- proto.emitEvent = function( eventName, args ) {
13555
- var listeners = this._events && this._events[ eventName ];
13556
- if ( !listeners || !listeners.length ) {
13557
- return;
13558
- }
13559
- // copy over to avoid interference if .off() in listener
13560
- listeners = listeners.slice(0);
13561
- args = args || [];
13562
- // once stuff
13563
- var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
13564
-
13565
- for ( var i=0; i < listeners.length; i++ ) {
13566
- var listener = listeners[i]
13567
- var isOnce = onceListeners && onceListeners[ listener ];
13568
- if ( isOnce ) {
13569
- // remove listener
13570
- // remove before trigger to prevent recursion
13571
- this.off( eventName, listener );
13572
- // unset once flag
13573
- delete onceListeners[ listener ];
13574
- }
13575
- // trigger listener
13576
- listener.apply( this, args );
13577
- }
13578
-
13579
- return this;
13580
- };
13581
-
13582
- proto.allOff = function() {
13583
- delete this._events;
13584
- delete this._onceEvents;
13585
- };
13586
-
13587
- return EvEmitter;
13588
-
13589
- }));
13590
-
13591
- /*!
13592
- * imagesLoaded v4.1.4
13593
- * JavaScript is all like "You images are done yet or what?"
13594
- * MIT License
13595
- */
13596
-
13597
- ( function( window, factory ) { 'use strict';
13598
- // universal module definition
13599
-
13600
- /*global define: false, module: false, require: false */
13601
-
13602
- if ( typeof define == 'function' && define.amd ) {
13603
- // AMD
13604
- define( [
13605
- 'ev-emitter/ev-emitter'
13606
- ], function( EvEmitter ) {
13607
- return factory( window, EvEmitter );
13608
- });
13609
- } else if ( typeof module == 'object' && module.exports ) {
13610
- // CommonJS
13611
- module.exports = factory(
13612
- window,
13613
- require('ev-emitter')
13614
- );
13615
- } else {
13616
- // browser global
13617
- window.imagesLoaded = factory(
13618
- window,
13619
- window.EvEmitter
13620
- );
13621
- }
13622
-
13623
- })( typeof window !== 'undefined' ? window : this,
13624
-
13625
- // -------------------------- factory -------------------------- //
13626
-
13627
- function factory( window, EvEmitter ) {
13628
-
13629
-
13630
-
13631
- var $ = window.jQuery;
13632
- var console = window.console;
13633
-
13634
- // -------------------------- helpers -------------------------- //
13635
-
13636
- // extend objects
13637
- function extend( a, b ) {
13638
- for ( var prop in b ) {
13639
- a[ prop ] = b[ prop ];
13640
- }
13641
- return a;
13642
- }
13643
-
13644
- var arraySlice = Array.prototype.slice;
13645
-
13646
- // turn element or nodeList into an array
13647
- function makeArray( obj ) {
13648
- if ( Array.isArray( obj ) ) {
13649
- // use object if already an array
13650
- return obj;
13651
- }
13652
-
13653
- var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
13654
- if ( isArrayLike ) {
13655
- // convert nodeList to array
13656
- return arraySlice.call( obj );
13657
- }
13658
-
13659
- // array of single index
13660
- return [ obj ];
13661
- }
13662
-
13663
- // -------------------------- imagesLoaded -------------------------- //
13664
-
13665
- /**
13666
- * @param {Array, Element, NodeList, String} elem
13667
- * @param {Object or Function} options - if function, use as callback
13668
- * @param {Function} onAlways - callback function
13669
- */
13670
- function ImagesLoaded( elem, options, onAlways ) {
13671
- // coerce ImagesLoaded() without new, to be new ImagesLoaded()
13672
- if ( !( this instanceof ImagesLoaded ) ) {
13673
- return new ImagesLoaded( elem, options, onAlways );
13674
- }
13675
- // use elem as selector string
13676
- var queryElem = elem;
13677
- if ( typeof elem == 'string' ) {
13678
- queryElem = document.querySelectorAll( elem );
13679
- }
13680
- // bail if bad element
13681
- if ( !queryElem ) {
13682
- console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
13683
- return;
13684
- }
13685
-
13686
- this.elements = makeArray( queryElem );
13687
- this.options = extend( {}, this.options );
13688
- // shift arguments if no options set
13689
- if ( typeof options == 'function' ) {
13690
- onAlways = options;
13691
- } else {
13692
- extend( this.options, options );
13693
- }
13694
-
13695
- if ( onAlways ) {
13696
- this.on( 'always', onAlways );
13697
- }
13698
-
13699
- this.getImages();
13700
-
13701
- if ( $ ) {
13702
- // add jQuery Deferred object
13703
- this.jqDeferred = new $.Deferred();
13704
- }
13705
-
13706
- // HACK check async to allow time to bind listeners
13707
- setTimeout( this.check.bind( this ) );
13708
- }
13709
-
13710
- ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
13711
-
13712
- ImagesLoaded.prototype.options = {};
13713
-
13714
- ImagesLoaded.prototype.getImages = function() {
13715
- this.images = [];
13716
-
13717
- // filter & find items if we have an item selector
13718
- this.elements.forEach( this.addElementImages, this );
13719
- };
13720
-
13721
- /**
13722
- * @param {Node} element
13723
- */
13724
- ImagesLoaded.prototype.addElementImages = function( elem ) {
13725
- // filter siblings
13726
- if ( elem.nodeName == 'IMG' ) {
13727
- this.addImage( elem );
13728
- }
13729
- // get background image on element
13730
- if ( this.options.background === true ) {
13731
- this.addElementBackgroundImages( elem );
13732
- }
13733
-
13734
- // find children
13735
- // no non-element nodes, #143
13736
- var nodeType = elem.nodeType;
13737
- if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
13738
- return;
13739
- }
13740
- var childImgs = elem.querySelectorAll('img');
13741
- // concat childElems to filterFound array
13742
- for ( var i=0; i < childImgs.length; i++ ) {
13743
- var img = childImgs[i];
13744
- this.addImage( img );
13745
- }
13746
-
13747
- // get child background images
13748
- if ( typeof this.options.background == 'string' ) {
13749
- var children = elem.querySelectorAll( this.options.background );
13750
- for ( i=0; i < children.length; i++ ) {
13751
- var child = children[i];
13752
- this.addElementBackgroundImages( child );
13753
- }
13754
- }
13755
- };
13756
-
13757
- var elementNodeTypes = {
13758
- 1: true,
13759
- 9: true,
13760
- 11: true
13761
- };
13762
-
13763
- ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
13764
- var style = getComputedStyle( elem );
13765
- if ( !style ) {
13766
- // Firefox returns null if in a hidden iframe https://bugzil.la/548397
13767
- return;
13768
- }
13769
- // get url inside url("...")
13770
- var reURL = /url\((['"])?(.*?)\1\)/gi;
13771
- var matches = reURL.exec( style.backgroundImage );
13772
- while ( matches !== null ) {
13773
- var url = matches && matches[2];
13774
- if ( url ) {
13775
- this.addBackground( url, elem );
13776
- }
13777
- matches = reURL.exec( style.backgroundImage );
13778
- }
13779
- };
13780
-
13781
- /**
13782
- * @param {Image} img
13783
- */
13784
- ImagesLoaded.prototype.addImage = function( img ) {
13785
- var loadingImage = new LoadingImage( img );
13786
- this.images.push( loadingImage );
13787
- };
13788
-
13789
- ImagesLoaded.prototype.addBackground = function( url, elem ) {
13790
- var background = new Background( url, elem );
13791
- this.images.push( background );
13792
- };
13793
-
13794
- ImagesLoaded.prototype.check = function() {
13795
- var _this = this;
13796
- this.progressedCount = 0;
13797
- this.hasAnyBroken = false;
13798
- // complete if no images
13799
- if ( !this.images.length ) {
13800
- this.complete();
13801
- return;
13802
- }
13803
-
13804
- function onProgress( image, elem, message ) {
13805
- // HACK - Chrome triggers event before object properties have changed. #83
13806
- setTimeout( function() {
13807
- _this.progress( image, elem, message );
13808
- });
13809
- }
13810
-
13811
- this.images.forEach( function( loadingImage ) {
13812
- loadingImage.once( 'progress', onProgress );
13813
- loadingImage.check();
13814
- });
13815
- };
13816
-
13817
- ImagesLoaded.prototype.progress = function( image, elem, message ) {
13818
- this.progressedCount++;
13819
- this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
13820
- // progress event
13821
- this.emitEvent( 'progress', [ this, image, elem ] );
13822
- if ( this.jqDeferred && this.jqDeferred.notify ) {
13823
- this.jqDeferred.notify( this, image );
13824
- }
13825
- // check if completed
13826
- if ( this.progressedCount == this.images.length ) {
13827
- this.complete();
13828
- }
13829
-
13830
- if ( this.options.debug && console ) {
13831
- console.log( 'progress: ' + message, image, elem );
13832
- }
13833
- };
13834
-
13835
- ImagesLoaded.prototype.complete = function() {
13836
- var eventName = this.hasAnyBroken ? 'fail' : 'done';
13837
- this.isComplete = true;
13838
- this.emitEvent( eventName, [ this ] );
13839
- this.emitEvent( 'always', [ this ] );
13840
- if ( this.jqDeferred ) {
13841
- var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
13842
- this.jqDeferred[ jqMethod ]( this );
13843
- }
13844
- };
13845
-
13846
- // -------------------------- -------------------------- //
13847
-
13848
- function LoadingImage( img ) {
13849
- this.img = img;
13850
- }
13851
-
13852
- LoadingImage.prototype = Object.create( EvEmitter.prototype );
13853
-
13854
- LoadingImage.prototype.check = function() {
13855
- // If complete is true and browser supports natural sizes,
13856
- // try to check for image status manually.
13857
- var isComplete = this.getIsImageComplete();
13858
- if ( isComplete ) {
13859
- // report based on naturalWidth
13860
- this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
13861
- return;
13862
- }
13863
-
13864
- // If none of the checks above matched, simulate loading on detached element.
13865
- this.proxyImage = new Image();
13866
- this.proxyImage.addEventListener( 'load', this );
13867
- this.proxyImage.addEventListener( 'error', this );
13868
- // bind to image as well for Firefox. #191
13869
- this.img.addEventListener( 'load', this );
13870
- this.img.addEventListener( 'error', this );
13871
- this.proxyImage.src = this.img.src;
13872
- };
13873
-
13874
- LoadingImage.prototype.getIsImageComplete = function() {
13875
- // check for non-zero, non-undefined naturalWidth
13876
- // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
13877
- return this.img.complete && this.img.naturalWidth;
13878
- };
13879
-
13880
- LoadingImage.prototype.confirm = function( isLoaded, message ) {
13881
- this.isLoaded = isLoaded;
13882
- this.emitEvent( 'progress', [ this, this.img, message ] );
13883
- };
13884
-
13885
- // ----- events ----- //
13886
-
13887
- // trigger specified handler for event type
13888
- LoadingImage.prototype.handleEvent = function( event ) {
13889
- var method = 'on' + event.type;
13890
- if ( this[ method ] ) {
13891
- this[ method ]( event );
13892
- }
13893
- };
13894
-
13895
- LoadingImage.prototype.onload = function() {
13896
- this.confirm( true, 'onload' );
13897
- this.unbindEvents();
13898
- };
13899
-
13900
- LoadingImage.prototype.onerror = function() {
13901
- this.confirm( false, 'onerror' );
13902
- this.unbindEvents();
13903
- };
13904
-
13905
- LoadingImage.prototype.unbindEvents = function() {
13906
- this.proxyImage.removeEventListener( 'load', this );
13907
- this.proxyImage.removeEventListener( 'error', this );
13908
- this.img.removeEventListener( 'load', this );
13909
- this.img.removeEventListener( 'error', this );
13910
- };
13911
-
13912
- // -------------------------- Background -------------------------- //
13913
-
13914
- function Background( url, element ) {
13915
- this.url = url;
13916
- this.element = element;
13917
- this.img = new Image();
13918
- }
13919
-
13920
- // inherit LoadingImage prototype
13921
- Background.prototype = Object.create( LoadingImage.prototype );
13922
-
13923
- Background.prototype.check = function() {
13924
- this.img.addEventListener( 'load', this );
13925
- this.img.addEventListener( 'error', this );
13926
- this.img.src = this.url;
13927
- // check if image is already complete
13928
- var isComplete = this.getIsImageComplete();
13929
- if ( isComplete ) {
13930
- this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
13931
- this.unbindEvents();
13932
- }
13933
- };
13934
-
13935
- Background.prototype.unbindEvents = function() {
13936
- this.img.removeEventListener( 'load', this );
13937
- this.img.removeEventListener( 'error', this );
13938
- };
13939
-
13940
- Background.prototype.confirm = function( isLoaded, message ) {
13941
- this.isLoaded = isLoaded;
13942
- this.emitEvent( 'progress', [ this, this.element, message ] );
13943
- };
13944
-
13945
- // -------------------------- jQuery -------------------------- //
13946
-
13947
- ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
13948
- jQuery = jQuery || window.jQuery;
13949
- if ( !jQuery ) {
13950
- return;
13951
- }
13952
- // set local variable
13953
- $ = jQuery;
13954
- // $().imagesLoaded()
13955
- $.fn.imagesLoaded = function( options, callback ) {
13956
- var instance = new ImagesLoaded( this, options, callback );
13957
- return instance.jqDeferred.promise( $(this) );
13958
- };
13959
- };
13960
- // try making plugin
13961
- ImagesLoaded.makeJQueryPlugin();
13962
-
13963
- // -------------------------- -------------------------- //
13964
-
13965
- return ImagesLoaded;
13966
-
13967
- });
13968
-
13969
-
13970
- /**
13971
- * author Christopher Blum
13972
- * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/
13973
- * - forked from http://github.com/zuk/jquery.inview/
13974
- */
13975
- (function (factory) {
13976
- if (typeof define == 'function' && define.amd) {
13977
- // AMD
13978
- define(['jquery'], factory);
13979
- } else if (typeof exports === 'object') {
13980
- // Node, CommonJS
13981
- module.exports = factory(require('jquery'));
13982
- } else {
13983
- // Browser globals
13984
- factory(jQuery);
13985
- }
13986
- }(function ($) {
13987
-
13988
- var inviewObjects = [], viewportSize, viewportOffset,
13989
- d = document, w = window, documentElement = d.documentElement, timer;
13990
-
13991
- $.event.special.inview = {
13992
- add: function (data) {
13993
- inviewObjects.push({ data: data, $element: $(this), element: this });
13994
- // Use setInterval in order to also make sure this captures elements within
13995
- // "overflow:scroll" elements or elements that appeared in the dom tree due to
13996
- // dom manipulation and reflow
13997
- // old: $(window).scroll(checkInView);
13998
- //
13999
- // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays
14000
- // intervals while the user scrolls. Therefore the inview event might fire a bit late there
14001
- //
14002
- // Don't waste cycles with an interval until we get at least one element that
14003
- // has bound to the inview event.
14004
- if (!timer && inviewObjects.length) {
14005
- timer = setInterval(checkInView, 250);
14006
- }
14007
- },
14008
-
14009
- remove: function (data) {
14010
- for (var i = 0; i < inviewObjects.length; i++) {
14011
- var inviewObject = inviewObjects[i];
14012
- if (inviewObject.element === this && inviewObject.data.guid === data.guid) {
14013
- inviewObjects.splice(i, 1);
14014
- break;
14015
- }
14016
- }
14017
-
14018
- // Clear interval when we no longer have any elements listening
14019
- if (!inviewObjects.length) {
14020
- clearInterval(timer);
14021
- timer = null;
14022
- }
14023
- }
14024
- };
14025
-
14026
- function getViewportSize() {
14027
- var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth };
14028
-
14029
- // if this is correct then return it. iPad has compat Mode, so will
14030
- // go into check clientHeight/clientWidth (which has the wrong value).
14031
- if (!size.height) {
14032
- mode = d.compatMode;
14033
- if (mode || !$.support.boxModel) { // IE, Gecko
14034
- domObject = mode === 'CSS1Compat' ?
14035
- documentElement : // Standards
14036
- d.body; // Quirks
14037
- size = {
14038
- height: domObject.clientHeight,
14039
- width: domObject.clientWidth
14040
- };
14041
- }
14042
- }
14043
-
14044
- return size;
14045
- }
14046
-
14047
- function getViewportOffset() {
14048
- return {
14049
- top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop,
14050
- left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft
14051
- };
14052
- }
14053
-
14054
- function checkInView() {
14055
- if (!inviewObjects.length) {
14056
- return;
14057
- }
14058
-
14059
- var i = 0, $elements = $.map(inviewObjects, function (inviewObject) {
14060
- var selector = inviewObject.data.selector,
14061
- $element = inviewObject.$element;
14062
- return selector ? $element.find(selector) : $element;
14063
- });
14064
-
14065
- viewportSize = viewportSize || getViewportSize();
14066
- viewportOffset = viewportOffset || getViewportOffset();
14067
-
14068
- for (; i < inviewObjects.length; i++) {
14069
- // Ignore elements that are not in the DOM tree
14070
- if (!$.contains(documentElement, $elements[i][0])) {
14071
- continue;
14072
- }
14073
-
14074
- var $element = $($elements[i]),
14075
- elementSize = { height: $element[0].offsetHeight, width: $element[0].offsetWidth },
14076
- elementOffset = $element.offset(),
14077
- inView = $element.data('inview');
14078
-
14079
- // Don't ask me why because I haven't figured out yet:
14080
- // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
14081
- // Even though it sounds weird:
14082
- // It seems that the execution of this function is interferred by the onresize/onscroll event
14083
- // where viewportOffset and viewportSize are unset
14084
- if (!viewportOffset || !viewportSize) {
14085
- return;
14086
- }
14087
-
14088
- if (elementOffset.top + elementSize.height > viewportOffset.top &&
14089
- elementOffset.top < viewportOffset.top + viewportSize.height &&
14090
- elementOffset.left + elementSize.width > viewportOffset.left &&
14091
- elementOffset.left < viewportOffset.left + viewportSize.width) {
14092
- if (!inView) {
14093
- $element.data('inview', true).trigger('inview', [true]);
14094
- }
14095
- } else if (inView) {
14096
- $element.data('inview', false).trigger('inview', [false]);
14097
- }
14098
- }
14099
- }
14100
-
14101
- $(w).on("scroll resize scrollstop", function () {
14102
- viewportSize = viewportOffset = null;
14103
- });
14104
-
14105
- // IE < 9 scrolls to focused elements without firing the "scroll" event
14106
- if (!documentElement.addEventListener && documentElement.attachEvent) {
14107
- documentElement.attachEvent("onfocusin", function () {
14108
- viewportOffset = null;
14109
- });
14110
- }
14111
- }));
14112
- /*!
14113
- * Isotope PACKAGED v3.0.6
14114
- *
14115
- * Licensed GPLv3 for open source use
14116
- * or Isotope Commercial License for commercial use
14117
- *
14118
- * https://isotope.metafizzy.co
14119
- * Copyright 2010-2018 Metafizzy
14120
- */
14121
-
14122
- /**
14123
- * Bridget makes jQuery widgets
14124
- * v2.0.1
14125
- * MIT license
14126
- */
14127
-
14128
- /* jshint browser: true, strict: true, undef: true, unused: true */
14129
-
14130
- ( function( window, factory ) {
14131
- // universal module definition
14132
- /*jshint strict: false */ /* globals define, module, require */
14133
- if ( typeof define == 'function' && define.amd ) {
14134
- // AMD
14135
- define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {
14136
- return factory( window, jQuery );
14137
- });
14138
- } else if ( typeof module == 'object' && module.exports ) {
14139
- // CommonJS
14140
- module.exports = factory(
14141
- window,
14142
- require('jquery')
14143
- );
14144
- } else {
14145
- // browser global
14146
- window.jQueryBridget = factory(
14147
- window,
14148
- window.jQuery
14149
- );
14150
- }
14151
-
14152
- }( window, function factory( window, jQuery ) {
14153
- 'use strict';
14154
-
14155
- // ----- utils ----- //
14156
-
14157
- var arraySlice = Array.prototype.slice;
14158
-
14159
- // helper function for logging errors
14160
- // $.error breaks jQuery chaining
14161
- var console = window.console;
14162
- var logError = typeof console == 'undefined' ? function() {} :
14163
- function( message ) {
14164
- console.error( message );
14165
- };
14166
-
14167
- // ----- jQueryBridget ----- //
14168
-
14169
- function jQueryBridget( namespace, PluginClass, $ ) {
14170
- $ = $ || jQuery || window.jQuery;
14171
- if ( !$ ) {
14172
- return;
14173
- }
14174
-
14175
- // add option method -> $().plugin('option', {...})
14176
- if ( !PluginClass.prototype.option ) {
14177
- // option setter
14178
- PluginClass.prototype.option = function( opts ) {
14179
- // bail out if not an object
14180
- if ( !$.isPlainObject( opts ) ){
14181
- return;
14182
- }
14183
- this.options = $.extend( true, this.options, opts );
14184
- };
14185
- }
14186
-
14187
- // make jQuery plugin
14188
- $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {
14189
- if ( typeof arg0 == 'string' ) {
14190
- // method call $().plugin( 'methodName', { options } )
14191
- // shift arguments by 1
14192
- var args = arraySlice.call( arguments, 1 );
14193
- return methodCall( this, arg0, args );
14194
- }
14195
- // just $().plugin({ options })
14196
- plainCall( this, arg0 );
14197
- return this;
14198
- };
14199
-
14200
- // $().plugin('methodName')
14201
- function methodCall( $elems, methodName, args ) {
14202
- var returnValue;
14203
- var pluginMethodStr = '$().' + namespace + '("' + methodName + '")';
14204
-
14205
- $elems.each( function( i, elem ) {
14206
- // get instance
14207
- var instance = $.data( elem, namespace );
14208
- if ( !instance ) {
14209
- logError( namespace + ' not initialized. Cannot call methods, i.e. ' +
14210
- pluginMethodStr );
14211
- return;
14212
- }
14213
-
14214
- var method = instance[ methodName ];
14215
- if ( !method || methodName.charAt(0) == '_' ) {
14216
- logError( pluginMethodStr + ' is not a valid method' );
14217
- return;
14218
- }
14219
-
14220
- // apply method, get return value
14221
- var value = method.apply( instance, args );
14222
- // set return value if value is returned, use only first value
14223
- returnValue = returnValue === undefined ? value : returnValue;
14224
- });
14225
-
14226
- return returnValue !== undefined ? returnValue : $elems;
14227
- }
14228
-
14229
- function plainCall( $elems, options ) {
14230
- $elems.each( function( i, elem ) {
14231
- var instance = $.data( elem, namespace );
14232
- if ( instance ) {
14233
- // set options & init
14234
- instance.option( options );
14235
- instance._init();
14236
- } else {
14237
- // initialize new instance
14238
- instance = new PluginClass( elem, options );
14239
- $.data( elem, namespace, instance );
14240
- }
14241
- });
14242
- }
14243
-
14244
- updateJQuery( $ );
14245
-
14246
- }
14247
-
14248
- // ----- updateJQuery ----- //
14249
-
14250
- // set $.bridget for v1 backwards compatibility
14251
- function updateJQuery( $ ) {
14252
- if ( !$ || ( $ && $.bridget ) ) {
14253
- return;
14254
- }
14255
- $.bridget = jQueryBridget;
14256
- }
14257
-
14258
- updateJQuery( jQuery || window.jQuery );
14259
-
14260
- // ----- ----- //
14261
-
14262
- return jQueryBridget;
14263
-
14264
- }));
14265
-
14266
- /**
14267
- * EvEmitter v1.1.0
14268
- * Lil' event emitter
14269
- * MIT License
14270
- */
14271
-
14272
- /* jshint unused: true, undef: true, strict: true */
14273
-
14274
- ( function( global, factory ) {
14275
- // universal module definition
14276
- /* jshint strict: false */ /* globals define, module, window */
14277
- if ( typeof define == 'function' && define.amd ) {
14278
- // AMD - RequireJS
14279
- define( 'ev-emitter/ev-emitter',factory );
14280
- } else if ( typeof module == 'object' && module.exports ) {
14281
- // CommonJS - Browserify, Webpack
14282
- module.exports = factory();
14283
- } else {
14284
- // Browser globals
14285
- global.EvEmitter = factory();
14286
- }
14287
-
14288
- }( typeof window != 'undefined' ? window : this, function() {
14289
-
14290
-
14291
-
14292
- function EvEmitter() {}
14293
-
14294
- var proto = EvEmitter.prototype;
14295
-
14296
- proto.on = function( eventName, listener ) {
14297
- if ( !eventName || !listener ) {
14298
- return;
14299
- }
14300
- // set events hash
14301
- var events = this._events = this._events || {};
14302
- // set listeners array
14303
- var listeners = events[ eventName ] = events[ eventName ] || [];
14304
- // only add once
14305
- if ( listeners.indexOf( listener ) == -1 ) {
14306
- listeners.push( listener );
14307
- }
14308
-
14309
- return this;
14310
- };
14311
-
14312
- proto.once = function( eventName, listener ) {
14313
- if ( !eventName || !listener ) {
14314
- return;
14315
- }
14316
- // add event
14317
- this.on( eventName, listener );
14318
- // set once flag
14319
- // set onceEvents hash
14320
- var onceEvents = this._onceEvents = this._onceEvents || {};
14321
- // set onceListeners object
14322
- var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
14323
- // set flag
14324
- onceListeners[ listener ] = true;
14325
-
14326
- return this;
14327
- };
14328
-
14329
- proto.off = function( eventName, listener ) {
14330
- var listeners = this._events && this._events[ eventName ];
14331
- if ( !listeners || !listeners.length ) {
14332
- return;
14333
- }
14334
- var index = listeners.indexOf( listener );
14335
- if ( index != -1 ) {
14336
- listeners.splice( index, 1 );
14337
- }
14338
-
14339
- return this;
14340
- };
14341
-
14342
- proto.emitEvent = function( eventName, args ) {
14343
- var listeners = this._events && this._events[ eventName ];
14344
- if ( !listeners || !listeners.length ) {
14345
- return;
14346
- }
14347
- // copy over to avoid interference if .off() in listener
14348
- listeners = listeners.slice(0);
14349
- args = args || [];
14350
- // once stuff
14351
- var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
14352
-
14353
- for ( var i=0; i < listeners.length; i++ ) {
14354
- var listener = listeners[i]
14355
- var isOnce = onceListeners && onceListeners[ listener ];
14356
- if ( isOnce ) {
14357
- // remove listener
14358
- // remove before trigger to prevent recursion
14359
- this.off( eventName, listener );
14360
- // unset once flag
14361
- delete onceListeners[ listener ];
14362
- }
14363
- // trigger listener
14364
- listener.apply( this, args );
14365
- }
14366
-
14367
- return this;
14368
- };
14369
-
14370
- proto.allOff = function() {
14371
- delete this._events;
14372
- delete this._onceEvents;
14373
- };
14374
-
14375
- return EvEmitter;
14376
-
14377
- }));
14378
-
14379
- /*!
14380
- * getSize v2.0.3
14381
- * measure size of elements
14382
- * MIT license
14383
- */
14384
-
14385
- /* jshint browser: true, strict: true, undef: true, unused: true */
14386
- /* globals console: false */
14387
-
14388
- ( function( window, factory ) {
14389
- /* jshint strict: false */ /* globals define, module */
14390
- if ( typeof define == 'function' && define.amd ) {
14391
- // AMD
14392
- define( 'get-size/get-size',factory );
14393
- } else if ( typeof module == 'object' && module.exports ) {
14394
- // CommonJS
14395
- module.exports = factory();
14396
- } else {
14397
- // browser global
14398
- window.getSize = factory();
14399
- }
14400
-
14401
- })( window, function factory() {
14402
- 'use strict';
14403
-
14404
- // -------------------------- helpers -------------------------- //
14405
-
14406
- // get a number from a string, not a percentage
14407
- function getStyleSize( value ) {
14408
- var num = parseFloat( value );
14409
- // not a percent like '100%', and a number
14410
- var isValid = value.indexOf('%') == -1 && !isNaN( num );
14411
- return isValid && num;
14412
- }
14413
-
14414
- function noop() {}
14415
-
14416
- var logError = typeof console == 'undefined' ? noop :
14417
- function( message ) {
14418
- console.error( message );
14419
- };
14420
-
14421
- // -------------------------- measurements -------------------------- //
14422
-
14423
- var measurements = [
14424
- 'paddingLeft',
14425
- 'paddingRight',
14426
- 'paddingTop',
14427
- 'paddingBottom',
14428
- 'marginLeft',
14429
- 'marginRight',
14430
- 'marginTop',
14431
- 'marginBottom',
14432
- 'borderLeftWidth',
14433
- 'borderRightWidth',
14434
- 'borderTopWidth',
14435
- 'borderBottomWidth'
14436
- ];
14437
-
14438
- var measurementsLength = measurements.length;
14439
-
14440
- function getZeroSize() {
14441
- var size = {
14442
- width: 0,
14443
- height: 0,
14444
- innerWidth: 0,
14445
- innerHeight: 0,
14446
- outerWidth: 0,
14447
- outerHeight: 0
14448
- };
14449
- for ( var i=0; i < measurementsLength; i++ ) {
14450
- var measurement = measurements[i];
14451
- size[ measurement ] = 0;
14452
- }
14453
- return size;
14454
- }
14455
-
14456
- // -------------------------- getStyle -------------------------- //
14457
-
14458
- /**
14459
- * getStyle, get style of element, check for Firefox bug
14460
- * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
14461
- */
14462
- function getStyle( elem ) {
14463
- var style = getComputedStyle( elem );
14464
- if ( !style ) {
14465
- logError( 'Style returned ' + style +
14466
- '. Are you running this code in a hidden iframe on Firefox? ' +
14467
- 'See https://bit.ly/getsizebug1' );
14468
- }
14469
- return style;
14470
- }
14471
-
14472
- // -------------------------- setup -------------------------- //
14473
-
14474
- var isSetup = false;
14475
-
14476
- var isBoxSizeOuter;
14477
-
14478
- /**
14479
- * setup
14480
- * check isBoxSizerOuter
14481
- * do on first getSize() rather than on page load for Firefox bug
14482
- */
14483
- function setup() {
14484
- // setup once
14485
- if ( isSetup ) {
14486
- return;
14487
- }
14488
- isSetup = true;
14489
-
14490
- // -------------------------- box sizing -------------------------- //
14491
-
14492
- /**
14493
- * Chrome & Safari measure the outer-width on style.width on border-box elems
14494
- * IE11 & Firefox<29 measures the inner-width
14495
- */
14496
- var div = document.createElement('div');
14497
- div.style.width = '200px';
14498
- div.style.padding = '1px 2px 3px 4px';
14499
- div.style.borderStyle = 'solid';
14500
- div.style.borderWidth = '1px 2px 3px 4px';
14501
- div.style.boxSizing = 'border-box';
14502
-
14503
- var body = document.body || document.documentElement;
14504
- body.appendChild( div );
14505
- var style = getStyle( div );
14506
- // round value for browser zoom. desandro/masonry#928
14507
- isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;
14508
- getSize.isBoxSizeOuter = isBoxSizeOuter;
14509
-
14510
- body.removeChild( div );
14511
- }
14512
-
14513
- // -------------------------- getSize -------------------------- //
14514
-
14515
- function getSize( elem ) {
14516
- setup();
14517
-
14518
- // use querySeletor if elem is string
14519
- if ( typeof elem == 'string' ) {
14520
- elem = document.querySelector( elem );
14521
- }
14522
-
14523
- // do not proceed on non-objects
14524
- if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
14525
- return;
14526
- }
14527
-
14528
- var style = getStyle( elem );
14529
-
14530
- // if hidden, everything is 0
14531
- if ( style.display == 'none' ) {
14532
- return getZeroSize();
14533
- }
14534
-
14535
- var size = {};
14536
- size.width = elem.offsetWidth;
14537
- size.height = elem.offsetHeight;
14538
-
14539
- var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';
14540
-
14541
- // get all measurements
14542
- for ( var i=0; i < measurementsLength; i++ ) {
14543
- var measurement = measurements[i];
14544
- var value = style[ measurement ];
14545
- var num = parseFloat( value );
14546
- // any 'auto', 'medium' value will be 0
14547
- size[ measurement ] = !isNaN( num ) ? num : 0;
14548
- }
14549
-
14550
- var paddingWidth = size.paddingLeft + size.paddingRight;
14551
- var paddingHeight = size.paddingTop + size.paddingBottom;
14552
- var marginWidth = size.marginLeft + size.marginRight;
14553
- var marginHeight = size.marginTop + size.marginBottom;
14554
- var borderWidth = size.borderLeftWidth + size.borderRightWidth;
14555
- var borderHeight = size.borderTopWidth + size.borderBottomWidth;
14556
-
14557
- var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
14558
-
14559
- // overwrite width and height if we can get it from style
14560
- var styleWidth = getStyleSize( style.width );
14561
- if ( styleWidth !== false ) {
14562
- size.width = styleWidth +
14563
- // add padding and border unless it's already including it
14564
- ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
14565
- }
14566
-
14567
- var styleHeight = getStyleSize( style.height );
14568
- if ( styleHeight !== false ) {
14569
- size.height = styleHeight +
14570
- // add padding and border unless it's already including it
14571
- ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
14572
- }
14573
-
14574
- size.innerWidth = size.width - ( paddingWidth + borderWidth );
14575
- size.innerHeight = size.height - ( paddingHeight + borderHeight );
14576
-
14577
- size.outerWidth = size.width + marginWidth;
14578
- size.outerHeight = size.height + marginHeight;
14579
-
14580
- return size;
14581
- }
14582
-
14583
- return getSize;
14584
-
14585
- });
14586
-
14587
- /**
14588
- * matchesSelector v2.0.2
14589
- * matchesSelector( element, '.selector' )
14590
- * MIT license
14591
- */
14592
-
14593
- /*jshint browser: true, strict: true, undef: true, unused: true */
14594
-
14595
- ( function( window, factory ) {
14596
- /*global define: false, module: false */
14597
- 'use strict';
14598
- // universal module definition
14599
- if ( typeof define == 'function' && define.amd ) {
14600
- // AMD
14601
- define( 'desandro-matches-selector/matches-selector',factory );
14602
- } else if ( typeof module == 'object' && module.exports ) {
14603
- // CommonJS
14604
- module.exports = factory();
14605
- } else {
14606
- // browser global
14607
- window.matchesSelector = factory();
14608
- }
14609
-
14610
- }( window, function factory() {
14611
- 'use strict';
14612
-
14613
- var matchesMethod = ( function() {
14614
- var ElemProto = window.Element.prototype;
14615
- // check for the standard method name first
14616
- if ( ElemProto.matches ) {
14617
- return 'matches';
14618
- }
14619
- // check un-prefixed
14620
- if ( ElemProto.matchesSelector ) {
14621
- return 'matchesSelector';
14622
- }
14623
- // check vendor prefixes
14624
- var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];
14625
-
14626
- for ( var i=0; i < prefixes.length; i++ ) {
14627
- var prefix = prefixes[i];
14628
- var method = prefix + 'MatchesSelector';
14629
- if ( ElemProto[ method ] ) {
14630
- return method;
14631
- }
14632
- }
14633
- })();
14634
-
14635
- return function matchesSelector( elem, selector ) {
14636
- return elem[ matchesMethod ]( selector );
14637
- };
14638
-
14639
- }));
14640
-
14641
- /**
14642
- * Fizzy UI utils v2.0.7
14643
- * MIT license
14644
- */
14645
-
14646
- /*jshint browser: true, undef: true, unused: true, strict: true */
14647
-
14648
- ( function( window, factory ) {
14649
- // universal module definition
14650
- /*jshint strict: false */ /*globals define, module, require */
14651
-
14652
- if ( typeof define == 'function' && define.amd ) {
14653
- // AMD
14654
- define( 'fizzy-ui-utils/utils',[
14655
- 'desandro-matches-selector/matches-selector'
14656
- ], function( matchesSelector ) {
14657
- return factory( window, matchesSelector );
14658
- });
14659
- } else if ( typeof module == 'object' && module.exports ) {
14660
- // CommonJS
14661
- module.exports = factory(
14662
- window,
14663
- require('desandro-matches-selector')
14664
- );
14665
- } else {
14666
- // browser global
14667
- window.fizzyUIUtils = factory(
14668
- window,
14669
- window.matchesSelector
14670
- );
14671
- }
14672
-
14673
- }( window, function factory( window, matchesSelector ) {
14674
-
14675
-
14676
-
14677
- var utils = {};
14678
-
14679
- // ----- extend ----- //
14680
-
14681
- // extends objects
14682
- utils.extend = function( a, b ) {
14683
- for ( var prop in b ) {
14684
- a[ prop ] = b[ prop ];
14685
- }
14686
- return a;
14687
- };
14688
-
14689
- // ----- modulo ----- //
14690
-
14691
- utils.modulo = function( num, div ) {
14692
- return ( ( num % div ) + div ) % div;
14693
- };
14694
-
14695
- // ----- makeArray ----- //
14696
-
14697
- var arraySlice = Array.prototype.slice;
14698
-
14699
- // turn element or nodeList into an array
14700
- utils.makeArray = function( obj ) {
14701
- if ( Array.isArray( obj ) ) {
14702
- // use object if already an array
14703
- return obj;
14704
- }
14705
- // return empty array if undefined or null. #6
14706
- if ( obj === null || obj === undefined ) {
14707
- return [];
14708
- }
14709
-
14710
- var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
14711
- if ( isArrayLike ) {
14712
- // convert nodeList to array
14713
- return arraySlice.call( obj );
14714
- }
14715
-
14716
- // array of single index
14717
- return [ obj ];
14718
- };
14719
-
14720
- // ----- removeFrom ----- //
14721
-
14722
- utils.removeFrom = function( ary, obj ) {
14723
- var index = ary.indexOf( obj );
14724
- if ( index != -1 ) {
14725
- ary.splice( index, 1 );
14726
- }
14727
- };
14728
-
14729
- // ----- getParent ----- //
14730
-
14731
- utils.getParent = function( elem, selector ) {
14732
- while ( elem.parentNode && elem != document.body ) {
14733
- elem = elem.parentNode;
14734
- if ( matchesSelector( elem, selector ) ) {
14735
- return elem;
14736
- }
14737
- }
14738
- };
14739
-
14740
- // ----- getQueryElement ----- //
14741
-
14742
- // use element as selector string
14743
- utils.getQueryElement = function( elem ) {
14744
- if ( typeof elem == 'string' ) {
14745
- return document.querySelector( elem );
14746
- }
14747
- return elem;
14748
- };
14749
-
14750
- // ----- handleEvent ----- //
14751
-
14752
- // enable .ontype to trigger from .addEventListener( elem, 'type' )
14753
- utils.handleEvent = function( event ) {
14754
- var method = 'on' + event.type;
14755
- if ( this[ method ] ) {
14756
- this[ method ]( event );
14757
- }
14758
- };
14759
-
14760
- // ----- filterFindElements ----- //
14761
-
14762
- utils.filterFindElements = function( elems, selector ) {
14763
- // make array of elems
14764
- elems = utils.makeArray( elems );
14765
- var ffElems = [];
14766
-
14767
- elems.forEach( function( elem ) {
14768
- // check that elem is an actual element
14769
- if ( !( elem instanceof HTMLElement ) ) {
14770
- return;
14771
- }
14772
- // add elem if no selector
14773
- if ( !selector ) {
14774
- ffElems.push( elem );
14775
- return;
14776
- }
14777
- // filter & find items if we have a selector
14778
- // filter
14779
- if ( matchesSelector( elem, selector ) ) {
14780
- ffElems.push( elem );
14781
- }
14782
- // find children
14783
- var childElems = elem.querySelectorAll( selector );
14784
- // concat childElems to filterFound array
14785
- for ( var i=0; i < childElems.length; i++ ) {
14786
- ffElems.push( childElems[i] );
14787
- }
14788
- });
14789
-
14790
- return ffElems;
14791
- };
14792
-
14793
- // ----- debounceMethod ----- //
14794
-
14795
- utils.debounceMethod = function( _class, methodName, threshold ) {
14796
- threshold = threshold || 100;
14797
- // original method
14798
- var method = _class.prototype[ methodName ];
14799
- var timeoutName = methodName + 'Timeout';
14800
-
14801
- _class.prototype[ methodName ] = function() {
14802
- var timeout = this[ timeoutName ];
14803
- clearTimeout( timeout );
14804
-
14805
- var args = arguments;
14806
- var _this = this;
14807
- this[ timeoutName ] = setTimeout( function() {
14808
- method.apply( _this, args );
14809
- delete _this[ timeoutName ];
14810
- }, threshold );
14811
- };
14812
- };
14813
-
14814
- // ----- docReady ----- //
14815
-
14816
- utils.docReady = function( callback ) {
14817
- var readyState = document.readyState;
14818
- if ( readyState == 'complete' || readyState == 'interactive' ) {
14819
- // do async to allow for other scripts to run. metafizzy/flickity#441
14820
- setTimeout( callback );
14821
- } else {
14822
- document.addEventListener( 'DOMContentLoaded', callback );
14823
- }
14824
- };
14825
-
14826
- // ----- htmlInit ----- //
14827
-
14828
- // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
14829
- utils.toDashed = function( str ) {
14830
- return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
14831
- return $1 + '-' + $2;
14832
- }).toLowerCase();
14833
- };
14834
-
14835
- var console = window.console;
14836
- /**
14837
- * allow user to initialize classes via [data-namespace] or .js-namespace class
14838
- * htmlInit( Widget, 'widgetName' )
14839
- * options are parsed from data-namespace-options
14840
- */
14841
- utils.htmlInit = function( WidgetClass, namespace ) {
14842
- utils.docReady( function() {
14843
- var dashedNamespace = utils.toDashed( namespace );
14844
- var dataAttr = 'data-' + dashedNamespace;
14845
- var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
14846
- var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
14847
- var elems = utils.makeArray( dataAttrElems )
14848
- .concat( utils.makeArray( jsDashElems ) );
14849
- var dataOptionsAttr = dataAttr + '-options';
14850
- var jQuery = window.jQuery;
14851
-
14852
- elems.forEach( function( elem ) {
14853
- var attr = elem.getAttribute( dataAttr ) ||
14854
- elem.getAttribute( dataOptionsAttr );
14855
- var options;
14856
- try {
14857
- options = attr && JSON.parse( attr );
14858
- } catch ( error ) {
14859
- // log error, do not initialize
14860
- if ( console ) {
14861
- console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
14862
- ': ' + error );
14863
- }
14864
- return;
14865
- }
14866
- // initialize
14867
- var instance = new WidgetClass( elem, options );
14868
- // make available via $().data('namespace')
14869
- if ( jQuery ) {
14870
- jQuery.data( elem, namespace, instance );
14871
- }
14872
- });
14873
-
14874
- });
14875
- };
14876
-
14877
- // ----- ----- //
14878
-
14879
- return utils;
14880
-
14881
- }));
14882
-
14883
- /**
14884
- * Outlayer Item
14885
- */
14886
-
14887
- ( function( window, factory ) {
14888
- // universal module definition
14889
- /* jshint strict: false */ /* globals define, module, require */
14890
- if ( typeof define == 'function' && define.amd ) {
14891
- // AMD - RequireJS
14892
- define( 'outlayer/item',[
14893
- 'ev-emitter/ev-emitter',
14894
- 'get-size/get-size'
14895
- ],
14896
- factory
14897
- );
14898
- } else if ( typeof module == 'object' && module.exports ) {
14899
- // CommonJS - Browserify, Webpack
14900
- module.exports = factory(
14901
- require('ev-emitter'),
14902
- require('get-size')
14903
- );
14904
- } else {
14905
- // browser global
14906
- window.Outlayer = {};
14907
- window.Outlayer.Item = factory(
14908
- window.EvEmitter,
14909
- window.getSize
14910
- );
14911
- }
14912
-
14913
- }( window, function factory( EvEmitter, getSize ) {
14914
- 'use strict';
14915
-
14916
- // ----- helpers ----- //
14917
-
14918
- function isEmptyObj( obj ) {
14919
- for ( var prop in obj ) {
14920
- return false;
14921
- }
14922
- prop = null;
14923
- return true;
14924
- }
14925
-
14926
- // -------------------------- CSS3 support -------------------------- //
14927
-
14928
-
14929
- var docElemStyle = document.documentElement.style;
14930
-
14931
- var transitionProperty = typeof docElemStyle.transition == 'string' ?
14932
- 'transition' : 'WebkitTransition';
14933
- var transformProperty = typeof docElemStyle.transform == 'string' ?
14934
- 'transform' : 'WebkitTransform';
14935
-
14936
- var transitionEndEvent = {
14937
- WebkitTransition: 'webkitTransitionEnd',
14938
- transition: 'transitionend'
14939
- }[ transitionProperty ];
14940
-
14941
- // cache all vendor properties that could have vendor prefix
14942
- var vendorProperties = {
14943
- transform: transformProperty,
14944
- transition: transitionProperty,
14945
- transitionDuration: transitionProperty + 'Duration',
14946
- transitionProperty: transitionProperty + 'Property',
14947
- transitionDelay: transitionProperty + 'Delay'
14948
- };
14949
-
14950
- // -------------------------- Item -------------------------- //
14951
-
14952
- function Item( element, layout ) {
14953
- if ( !element ) {
14954
- return;
14955
- }
14956
-
14957
- this.element = element;
14958
- // parent layout class, i.e. Masonry, Isotope, or Packery
14959
- this.layout = layout;
14960
- this.position = {
14961
- x: 0,
14962
- y: 0
14963
- };
14964
-
14965
- this._create();
14966
- }
14967
-
14968
- // inherit EvEmitter
14969
- var proto = Item.prototype = Object.create( EvEmitter.prototype );
14970
- proto.constructor = Item;
14971
-
14972
- proto._create = function() {
14973
- // transition objects
14974
- this._transn = {
14975
- ingProperties: {},
14976
- clean: {},
14977
- onEnd: {}
14978
- };
14979
-
14980
- this.css({
14981
- position: 'absolute'
14982
- });
14983
- };
14984
-
14985
- // trigger specified handler for event type
14986
- proto.handleEvent = function( event ) {
14987
- var method = 'on' + event.type;
14988
- if ( this[ method ] ) {
14989
- this[ method ]( event );
14990
- }
14991
- };
14992
-
14993
- proto.getSize = function() {
14994
- this.size = getSize( this.element );
14995
- };
14996
-
14997
- /**
14998
- * apply CSS styles to element
14999
- * @param {Object} style
15000
- */
15001
- proto.css = function( style ) {
15002
- var elemStyle = this.element.style;
15003
-
15004
- for ( var prop in style ) {
15005
- // use vendor property if available
15006
- var supportedProp = vendorProperties[ prop ] || prop;
15007
- elemStyle[ supportedProp ] = style[ prop ];
15008
- }
15009
- };
15010
-
15011
- // measure position, and sets it
15012
- proto.getPosition = function() {
15013
- var style = getComputedStyle( this.element );
15014
- var isOriginLeft = this.layout._getOption('originLeft');
15015
- var isOriginTop = this.layout._getOption('originTop');
15016
- var xValue = style[ isOriginLeft ? 'left' : 'right' ];
15017
- var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
15018
- var x = parseFloat( xValue );
15019
- var y = parseFloat( yValue );
15020
- // convert percent to pixels
15021
- var layoutSize = this.layout.size;
15022
- if ( xValue.indexOf('%') != -1 ) {
15023
- x = ( x / 100 ) * layoutSize.width;
15024
- }
15025
- if ( yValue.indexOf('%') != -1 ) {
15026
- y = ( y / 100 ) * layoutSize.height;
15027
- }
15028
- // clean up 'auto' or other non-integer values
15029
- x = isNaN( x ) ? 0 : x;
15030
- y = isNaN( y ) ? 0 : y;
15031
- // remove padding from measurement
15032
- x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
15033
- y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
15034
-
15035
- this.position.x = x;
15036
- this.position.y = y;
15037
- };
15038
-
15039
- // set settled position, apply padding
15040
- proto.layoutPosition = function() {
15041
- var layoutSize = this.layout.size;
15042
- var style = {};
15043
- var isOriginLeft = this.layout._getOption('originLeft');
15044
- var isOriginTop = this.layout._getOption('originTop');
15045
-
15046
- // x
15047
- var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
15048
- var xProperty = isOriginLeft ? 'left' : 'right';
15049
- var xResetProperty = isOriginLeft ? 'right' : 'left';
15050
-
15051
- var x = this.position.x + layoutSize[ xPadding ];
15052
- // set in percentage or pixels
15053
- style[ xProperty ] = this.getXValue( x );
15054
- // reset other property
15055
- style[ xResetProperty ] = '';
15056
-
15057
- // y
15058
- var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
15059
- var yProperty = isOriginTop ? 'top' : 'bottom';
15060
- var yResetProperty = isOriginTop ? 'bottom' : 'top';
15061
-
15062
- var y = this.position.y + layoutSize[ yPadding ];
15063
- // set in percentage or pixels
15064
- style[ yProperty ] = this.getYValue( y );
15065
- // reset other property
15066
- style[ yResetProperty ] = '';
15067
-
15068
- this.css( style );
15069
- this.emitEvent( 'layout', [ this ] );
15070
- };
15071
-
15072
- proto.getXValue = function( x ) {
15073
- var isHorizontal = this.layout._getOption('horizontal');
15074
- return this.layout.options.percentPosition && !isHorizontal ?
15075
- ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
15076
- };
15077
-
15078
- proto.getYValue = function( y ) {
15079
- var isHorizontal = this.layout._getOption('horizontal');
15080
- return this.layout.options.percentPosition && isHorizontal ?
15081
- ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
15082
- };
15083
-
15084
- proto._transitionTo = function( x, y ) {
15085
- this.getPosition();
15086
- // get current x & y from top/left
15087
- var curX = this.position.x;
15088
- var curY = this.position.y;
15089
-
15090
- var didNotMove = x == this.position.x && y == this.position.y;
15091
-
15092
- // save end position
15093
- this.setPosition( x, y );
15094
-
15095
- // if did not move and not transitioning, just go to layout
15096
- if ( didNotMove && !this.isTransitioning ) {
15097
- this.layoutPosition();
15098
- return;
15099
- }
15100
-
15101
- var transX = x - curX;
15102
- var transY = y - curY;
15103
- var transitionStyle = {};
15104
- transitionStyle.transform = this.getTranslate( transX, transY );
15105
-
15106
- this.transition({
15107
- to: transitionStyle,
15108
- onTransitionEnd: {
15109
- transform: this.layoutPosition
15110
- },
15111
- isCleaning: true
15112
- });
15113
- };
15114
-
15115
- proto.getTranslate = function( x, y ) {
15116
- // flip cooridinates if origin on right or bottom
15117
- var isOriginLeft = this.layout._getOption('originLeft');
15118
- var isOriginTop = this.layout._getOption('originTop');
15119
- x = isOriginLeft ? x : -x;
15120
- y = isOriginTop ? y : -y;
15121
- return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
15122
- };
15123
-
15124
- // non transition + transform support
15125
- proto.goTo = function( x, y ) {
15126
- this.setPosition( x, y );
15127
- this.layoutPosition();
15128
- };
15129
-
15130
- proto.moveTo = proto._transitionTo;
15131
-
15132
- proto.setPosition = function( x, y ) {
15133
- this.position.x = parseFloat( x );
15134
- this.position.y = parseFloat( y );
15135
- };
15136
-
15137
- // ----- transition ----- //
15138
-
15139
- /**
15140
- * @param {Object} style - CSS
15141
- * @param {Function} onTransitionEnd
15142
- */
15143
-
15144
- // non transition, just trigger callback
15145
- proto._nonTransition = function( args ) {
15146
- this.css( args.to );
15147
- if ( args.isCleaning ) {
15148
- this._removeStyles( args.to );
15149
- }
15150
- for ( var prop in args.onTransitionEnd ) {
15151
- args.onTransitionEnd[ prop ].call( this );
15152
- }
15153
- };
15154
-
15155
- /**
15156
- * proper transition
15157
- * @param {Object} args - arguments
15158
- * @param {Object} to - style to transition to
15159
- * @param {Object} from - style to start transition from
15160
- * @param {Boolean} isCleaning - removes transition styles after transition
15161
- * @param {Function} onTransitionEnd - callback
15162
- */
15163
- proto.transition = function( args ) {
15164
- // redirect to nonTransition if no transition duration
15165
- if ( !parseFloat( this.layout.options.transitionDuration ) ) {
15166
- this._nonTransition( args );
15167
- return;
15168
- }
15169
-
15170
- var _transition = this._transn;
15171
- // keep track of onTransitionEnd callback by css property
15172
- for ( var prop in args.onTransitionEnd ) {
15173
- _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
15174
- }
15175
- // keep track of properties that are transitioning
15176
- for ( prop in args.to ) {
15177
- _transition.ingProperties[ prop ] = true;
15178
- // keep track of properties to clean up when transition is done
15179
- if ( args.isCleaning ) {
15180
- _transition.clean[ prop ] = true;
15181
- }
15182
- }
15183
-
15184
- // set from styles
15185
- if ( args.from ) {
15186
- this.css( args.from );
15187
- // force redraw. http://blog.alexmaccaw.com/css-transitions
15188
- var h = this.element.offsetHeight;
15189
- // hack for JSHint to hush about unused var
15190
- h = null;
15191
- }
15192
- // enable transition
15193
- this.enableTransition( args.to );
15194
- // set styles that are transitioning
15195
- this.css( args.to );
15196
-
15197
- this.isTransitioning = true;
15198
-
15199
- };
15200
-
15201
- // dash before all cap letters, including first for
15202
- // WebkitTransform => -webkit-transform
15203
- function toDashedAll( str ) {
15204
- return str.replace( /([A-Z])/g, function( $1 ) {
15205
- return '-' + $1.toLowerCase();
15206
- });
15207
- }
15208
-
15209
- var transitionProps = 'opacity,' + toDashedAll( transformProperty );
15210
-
15211
- proto.enableTransition = function(/* style */) {
15212
- // HACK changing transitionProperty during a transition
15213
- // will cause transition to jump
15214
- if ( this.isTransitioning ) {
15215
- return;
15216
- }
15217
 
15218
  // make `transition: foo, bar, baz` from style object
15219
  // HACK un-comment this when enableTransition can work
@@ -38888,8 +25688,13208 @@ $.tooltipster._plugin({
38888
  }
38889
  });
38890
 
38891
- /* a build task will add "return $;" here */
38892
- return $;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ /**
771
+ * author Christopher Blum
772
+ * - based on the idea of Remy Sharp, http://remysharp.com/2009/01/26/element-in-view-event-plugin/
773
+ * - forked from http://github.com/zuk/jquery.inview/
774
+ */
775
+ (function (factory) {
776
+ if (typeof define == 'function' && define.amd) {
777
+ // AMD
778
+ define(['jquery'], factory);
779
+ } else if (typeof exports === 'object') {
780
+ // Node, CommonJS
781
+ module.exports = factory(require('jquery'));
782
+ } else {
783
+ // Browser globals
784
+ factory(jQuery);
785
  }
786
+ }(function ($) {
787
+
788
+ var inviewObjects = [], viewportSize, viewportOffset,
789
+ d = document, w = window, documentElement = d.documentElement, timer;
790
+
791
+ $.event.special.inview = {
792
+ add: function (data) {
793
+ inviewObjects.push({ data: data, $element: $(this), element: this });
794
+ // Use setInterval in order to also make sure this captures elements within
795
+ // "overflow:scroll" elements or elements that appeared in the dom tree due to
796
+ // dom manipulation and reflow
797
+ // old: $(window).scroll(checkInView);
798
+ //
799
+ // By the way, iOS (iPad, iPhone, ...) seems to not execute, or at least delays
800
+ // intervals while the user scrolls. Therefore the inview event might fire a bit late there
801
+ //
802
+ // Don't waste cycles with an interval until we get at least one element that
803
+ // has bound to the inview event.
804
+ if (!timer && inviewObjects.length) {
805
+ timer = setInterval(checkInView, 250);
806
+ }
807
+ },
808
+
809
+ remove: function (data) {
810
+ for (var i = 0; i < inviewObjects.length; i++) {
811
+ var inviewObject = inviewObjects[i];
812
+ if (inviewObject.element === this && inviewObject.data.guid === data.guid) {
813
+ inviewObjects.splice(i, 1);
814
+ break;
815
+ }
816
+ }
817
+
818
+ // Clear interval when we no longer have any elements listening
819
+ if (!inviewObjects.length) {
820
+ clearInterval(timer);
821
+ timer = null;
822
+ }
823
  }
824
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
825
 
826
+ function getViewportSize() {
827
+ var mode, domObject, size = { height: w.innerHeight, width: w.innerWidth };
828
+
829
+ // if this is correct then return it. iPad has compat Mode, so will
830
+ // go into check clientHeight/clientWidth (which has the wrong value).
831
+ if (!size.height) {
832
+ mode = d.compatMode;
833
+ if (mode || !$.support.boxModel) { // IE, Gecko
834
+ domObject = mode === 'CSS1Compat' ?
835
+ documentElement : // Standards
836
+ d.body; // Quirks
837
+ size = {
838
+ height: domObject.clientHeight,
839
+ width: domObject.clientWidth
840
+ };
841
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
842
  }
843
+
844
+ return size;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
845
  }
846
+
847
+ function getViewportOffset() {
848
  return {
849
+ top: w.pageYOffset || documentElement.scrollTop || d.body.scrollTop,
850
+ left: w.pageXOffset || documentElement.scrollLeft || d.body.scrollLeft
 
 
851
  };
852
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
853
 
854
+ function checkInView() {
855
+ if (!inviewObjects.length) {
856
+ return;
 
 
 
 
 
 
 
 
 
 
 
 
 
857
  }
858
+
859
+ var i = 0, $elements = $.map(inviewObjects, function (inviewObject) {
860
+ var selector = inviewObject.data.selector,
861
+ $element = inviewObject.$element;
862
+ return selector ? $element.find(selector) : $element;
 
 
 
863
  });
864
+
865
+ viewportSize = viewportSize || getViewportSize();
866
+ viewportOffset = viewportOffset || getViewportOffset();
867
+
868
+ for (; i < inviewObjects.length; i++) {
869
+ // Ignore elements that are not in the DOM tree
870
+ if (!$.contains(documentElement, $elements[i][0])) {
871
+ continue;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
872
  }
873
+
874
+ var $element = $($elements[i]),
875
+ elementSize = { height: $element[0].offsetHeight, width: $element[0].offsetWidth },
876
+ elementOffset = $element.offset(),
877
+ inView = $element.data('inview');
878
+
879
+ // Don't ask me why because I haven't figured out yet:
880
+ // viewportOffset and viewportSize are sometimes suddenly null in Firefox 5.
881
+ // Even though it sounds weird:
882
+ // It seems that the execution of this function is interferred by the onresize/onscroll event
883
+ // where viewportOffset and viewportSize are unset
884
+ if (!viewportOffset || !viewportSize) {
885
+ return;
 
 
886
  }
887
+
888
+ if (elementOffset.top + elementSize.height > viewportOffset.top &&
889
+ elementOffset.top < viewportOffset.top + viewportSize.height &&
890
+ elementOffset.left + elementSize.width > viewportOffset.left &&
891
+ elementOffset.left < viewportOffset.left + viewportSize.width) {
892
+ if (!inView) {
893
+ $element.data('inview', true).trigger('inview', [true]);
 
 
 
 
 
 
 
 
 
 
 
 
894
  }
895
+ } else if (inView) {
896
+ $element.data('inview', false).trigger('inview', [false]);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
897
  }
898
  }
 
899
  }
900
+
901
+ $(w).on("scroll resize scrollstop", function () {
902
+ viewportSize = viewportOffset = null;
903
+ });
904
+
905
+ // IE < 9 scrolls to focused elements without firing the "scroll" event
906
+ if (!documentElement.addEventListener && documentElement.attachEvent) {
907
+ documentElement.attachEvent("onfocusin", function () {
908
+ viewportOffset = null;
909
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
910
  }
911
+ }));
912
+ /*!
913
+ * Isotope PACKAGED v3.0.6
914
+ *
915
+ * Licensed GPLv3 for open source use
916
+ * or Isotope Commercial License for commercial use
917
+ *
918
+ * https://isotope.metafizzy.co
919
+ * Copyright 2010-2018 Metafizzy
920
+ */
921
 
922
+ /**
923
+ * Bridget makes jQuery widgets
924
+ * v2.0.1
925
+ * MIT license
926
+ */
927
 
928
+ /* jshint browser: true, strict: true, undef: true, unused: true */
 
 
 
929
 
930
+ ( function( window, factory ) {
931
+ // universal module definition
932
+ /*jshint strict: false */ /* globals define, module, require */
933
+ if ( typeof define == 'function' && define.amd ) {
934
+ // AMD
935
+ define( 'jquery-bridget/jquery-bridget',[ 'jquery' ], function( jQuery ) {
936
+ return factory( window, jQuery );
937
+ });
938
+ } else if ( typeof module == 'object' && module.exports ) {
939
+ // CommonJS
940
+ module.exports = factory(
941
+ window,
942
+ require('jquery')
943
+ );
944
+ } else {
945
+ // browser global
946
+ window.jQueryBridget = factory(
947
+ window,
948
+ window.jQuery
949
+ );
950
+ }
951
 
952
+ }( window, function factory( window, jQuery ) {
953
+ 'use strict';
 
 
 
 
954
 
955
+ // ----- utils ----- //
 
 
 
 
956
 
957
+ var arraySlice = Array.prototype.slice;
958
+
959
+ // helper function for logging errors
960
+ // $.error breaks jQuery chaining
961
+ var console = window.console;
962
+ var logError = typeof console == 'undefined' ? function() {} :
963
+ function( message ) {
964
+ console.error( message );
965
+ };
966
+
967
+ // ----- jQueryBridget ----- //
968
+
969
+ function jQueryBridget( namespace, PluginClass, $ ) {
970
+ $ = $ || jQuery || window.jQuery;
971
+ if ( !$ ) {
972
+ return;
973
+ }
974
+
975
+ // add option method -> $().plugin('option', {...})
976
+ if ( !PluginClass.prototype.option ) {
977
+ // option setter
978
+ PluginClass.prototype.option = function( opts ) {
979
+ // bail out if not an object
980
+ if ( !$.isPlainObject( opts ) ){
981
+ return;
982
+ }
983
+ this.options = $.extend( true, this.options, opts );
984
  };
985
+ }
986
 
987
+ // make jQuery plugin
988
+ $.fn[ namespace ] = function( arg0 /*, arg1 */ ) {
989
+ if ( typeof arg0 == 'string' ) {
990
+ // method call $().plugin( 'methodName', { options } )
991
+ // shift arguments by 1
992
+ var args = arraySlice.call( arguments, 1 );
993
+ return methodCall( this, arg0, args );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
994
  }
995
+ // just $().plugin({ options })
996
+ plainCall( this, arg0 );
997
+ return this;
998
+ };
999
 
1000
+ // $().plugin('methodName')
1001
+ function methodCall( $elems, methodName, args ) {
1002
+ var returnValue;
1003
+ var pluginMethodStr = '$().' + namespace + '("' + methodName + '")';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1004
 
1005
+ $elems.each( function( i, elem ) {
1006
+ // get instance
1007
+ var instance = $.data( elem, namespace );
1008
+ if ( !instance ) {
1009
+ logError( namespace + ' not initialized. Cannot call methods, i.e. ' +
1010
+ pluginMethodStr );
1011
+ return;
1012
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1013
 
1014
+ var method = instance[ methodName ];
1015
+ if ( !method || methodName.charAt(0) == '_' ) {
1016
+ logError( pluginMethodStr + ' is not a valid method' );
1017
+ return;
1018
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1019
 
1020
+ // apply method, get return value
1021
+ var value = method.apply( instance, args );
1022
+ // set return value if value is returned, use only first value
1023
+ returnValue = returnValue === undefined ? value : returnValue;
1024
+ });
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1025
 
1026
+ return returnValue !== undefined ? returnValue : $elems;
1027
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1028
 
1029
+ function plainCall( $elems, options ) {
1030
+ $elems.each( function( i, elem ) {
1031
+ var instance = $.data( elem, namespace );
1032
+ if ( instance ) {
1033
+ // set options & init
1034
+ instance.option( options );
1035
+ instance._init();
1036
+ } else {
1037
+ // initialize new instance
1038
+ instance = new PluginClass( elem, options );
1039
+ $.data( elem, namespace, instance );
1040
+ }
1041
+ });
1042
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1043
 
1044
+ updateJQuery( $ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1045
 
1046
+ }
 
 
 
 
 
 
 
 
 
 
 
1047
 
1048
+ // ----- updateJQuery ----- //
1049
+
1050
+ // set $.bridget for v1 backwards compatibility
1051
+ function updateJQuery( $ ) {
1052
+ if ( !$ || ( $ && $.bridget ) ) {
1053
+ return;
1054
+ }
1055
+ $.bridget = jQueryBridget;
1056
+ }
1057
+
1058
+ updateJQuery( jQuery || window.jQuery );
1059
+
1060
+ // ----- ----- //
1061
+
1062
+ return jQueryBridget;
1063
+
1064
+ }));
1065
+
1066
+ /**
1067
+ * EvEmitter v1.1.0
1068
+ * Lil' event emitter
1069
+ * MIT License
1070
+ */
1071
+
1072
+ /* jshint unused: true, undef: true, strict: true */
1073
+
1074
+ ( function( global, factory ) {
1075
+ // universal module definition
1076
+ /* jshint strict: false */ /* globals define, module, window */
1077
+ if ( typeof define == 'function' && define.amd ) {
1078
+ // AMD - RequireJS
1079
+ define( 'ev-emitter/ev-emitter',factory );
1080
+ } else if ( typeof module == 'object' && module.exports ) {
1081
+ // CommonJS - Browserify, Webpack
1082
+ module.exports = factory();
1083
+ } else {
1084
+ // Browser globals
1085
+ global.EvEmitter = factory();
1086
+ }
1087
+
1088
+ }( typeof window != 'undefined' ? window : this, function() {
1089
+
1090
+
1091
+
1092
+ function EvEmitter() {}
1093
+
1094
+ var proto = EvEmitter.prototype;
1095
+
1096
+ proto.on = function( eventName, listener ) {
1097
+ if ( !eventName || !listener ) {
1098
+ return;
1099
+ }
1100
+ // set events hash
1101
+ var events = this._events = this._events || {};
1102
+ // set listeners array
1103
+ var listeners = events[ eventName ] = events[ eventName ] || [];
1104
+ // only add once
1105
+ if ( listeners.indexOf( listener ) == -1 ) {
1106
+ listeners.push( listener );
1107
+ }
1108
+
1109
+ return this;
1110
+ };
1111
+
1112
+ proto.once = function( eventName, listener ) {
1113
+ if ( !eventName || !listener ) {
1114
+ return;
1115
+ }
1116
+ // add event
1117
+ this.on( eventName, listener );
1118
+ // set once flag
1119
+ // set onceEvents hash
1120
+ var onceEvents = this._onceEvents = this._onceEvents || {};
1121
+ // set onceListeners object
1122
+ var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
1123
+ // set flag
1124
+ onceListeners[ listener ] = true;
1125
+
1126
+ return this;
1127
+ };
1128
+
1129
+ proto.off = function( eventName, listener ) {
1130
+ var listeners = this._events && this._events[ eventName ];
1131
+ if ( !listeners || !listeners.length ) {
1132
+ return;
1133
+ }
1134
+ var index = listeners.indexOf( listener );
1135
+ if ( index != -1 ) {
1136
+ listeners.splice( index, 1 );
1137
+ }
1138
+
1139
+ return this;
1140
+ };
1141
+
1142
+ proto.emitEvent = function( eventName, args ) {
1143
+ var listeners = this._events && this._events[ eventName ];
1144
+ if ( !listeners || !listeners.length ) {
1145
+ return;
1146
+ }
1147
+ // copy over to avoid interference if .off() in listener
1148
+ listeners = listeners.slice(0);
1149
+ args = args || [];
1150
+ // once stuff
1151
+ var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
1152
+
1153
+ for ( var i=0; i < listeners.length; i++ ) {
1154
+ var listener = listeners[i]
1155
+ var isOnce = onceListeners && onceListeners[ listener ];
1156
+ if ( isOnce ) {
1157
+ // remove listener
1158
+ // remove before trigger to prevent recursion
1159
+ this.off( eventName, listener );
1160
+ // unset once flag
1161
+ delete onceListeners[ listener ];
1162
  }
1163
+ // trigger listener
1164
+ listener.apply( this, args );
1165
+ }
1166
+
1167
+ return this;
1168
+ };
1169
+
1170
+ proto.allOff = function() {
1171
+ delete this._events;
1172
+ delete this._onceEvents;
1173
+ };
1174
+
1175
+ return EvEmitter;
1176
+
1177
+ }));
1178
+
1179
+ /*!
1180
+ * getSize v2.0.3
1181
+ * measure size of elements
1182
+ * MIT license
1183
+ */
1184
+
1185
+ /* jshint browser: true, strict: true, undef: true, unused: true */
1186
+ /* globals console: false */
1187
+
1188
+ ( function( window, factory ) {
1189
+ /* jshint strict: false */ /* globals define, module */
1190
+ if ( typeof define == 'function' && define.amd ) {
1191
+ // AMD
1192
+ define( 'get-size/get-size',factory );
1193
+ } else if ( typeof module == 'object' && module.exports ) {
1194
+ // CommonJS
1195
+ module.exports = factory();
1196
+ } else {
1197
+ // browser global
1198
+ window.getSize = factory();
1199
+ }
1200
+
1201
+ })( window, function factory() {
1202
+ 'use strict';
1203
+
1204
+ // -------------------------- helpers -------------------------- //
1205
+
1206
+ // get a number from a string, not a percentage
1207
+ function getStyleSize( value ) {
1208
+ var num = parseFloat( value );
1209
+ // not a percent like '100%', and a number
1210
+ var isValid = value.indexOf('%') == -1 && !isNaN( num );
1211
+ return isValid && num;
1212
+ }
1213
+
1214
+ function noop() {}
1215
+
1216
+ var logError = typeof console == 'undefined' ? noop :
1217
+ function( message ) {
1218
+ console.error( message );
1219
+ };
1220
+
1221
+ // -------------------------- measurements -------------------------- //
1222
+
1223
+ var measurements = [
1224
+ 'paddingLeft',
1225
+ 'paddingRight',
1226
+ 'paddingTop',
1227
+ 'paddingBottom',
1228
+ 'marginLeft',
1229
+ 'marginRight',
1230
+ 'marginTop',
1231
+ 'marginBottom',
1232
+ 'borderLeftWidth',
1233
+ 'borderRightWidth',
1234
+ 'borderTopWidth',
1235
+ 'borderBottomWidth'
1236
+ ];
1237
+
1238
+ var measurementsLength = measurements.length;
1239
+
1240
+ function getZeroSize() {
1241
+ var size = {
1242
+ width: 0,
1243
+ height: 0,
1244
+ innerWidth: 0,
1245
+ innerHeight: 0,
1246
+ outerWidth: 0,
1247
+ outerHeight: 0
1248
+ };
1249
+ for ( var i=0; i < measurementsLength; i++ ) {
1250
+ var measurement = measurements[i];
1251
+ size[ measurement ] = 0;
1252
+ }
1253
+ return size;
1254
+ }
1255
+
1256
+ // -------------------------- getStyle -------------------------- //
1257
+
1258
+ /**
1259
+ * getStyle, get style of element, check for Firefox bug
1260
+ * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
1261
+ */
1262
+ function getStyle( elem ) {
1263
+ var style = getComputedStyle( elem );
1264
+ if ( !style ) {
1265
+ logError( 'Style returned ' + style +
1266
+ '. Are you running this code in a hidden iframe on Firefox? ' +
1267
+ 'See https://bit.ly/getsizebug1' );
1268
+ }
1269
+ return style;
1270
+ }
1271
+
1272
+ // -------------------------- setup -------------------------- //
1273
+
1274
+ var isSetup = false;
1275
+
1276
+ var isBoxSizeOuter;
1277
+
1278
+ /**
1279
+ * setup
1280
+ * check isBoxSizerOuter
1281
+ * do on first getSize() rather than on page load for Firefox bug
1282
+ */
1283
+ function setup() {
1284
+ // setup once
1285
+ if ( isSetup ) {
1286
+ return;
1287
+ }
1288
+ isSetup = true;
1289
+
1290
+ // -------------------------- box sizing -------------------------- //
1291
+
1292
+ /**
1293
+ * Chrome & Safari measure the outer-width on style.width on border-box elems
1294
+ * IE11 & Firefox<29 measures the inner-width
1295
+ */
1296
+ var div = document.createElement('div');
1297
+ div.style.width = '200px';
1298
+ div.style.padding = '1px 2px 3px 4px';
1299
+ div.style.borderStyle = 'solid';
1300
+ div.style.borderWidth = '1px 2px 3px 4px';
1301
+ div.style.boxSizing = 'border-box';
1302
+
1303
+ var body = document.body || document.documentElement;
1304
+ body.appendChild( div );
1305
+ var style = getStyle( div );
1306
+ // round value for browser zoom. desandro/masonry#928
1307
+ isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;
1308
+ getSize.isBoxSizeOuter = isBoxSizeOuter;
1309
+
1310
+ body.removeChild( div );
1311
+ }
1312
+
1313
+ // -------------------------- getSize -------------------------- //
1314
+
1315
+ function getSize( elem ) {
1316
+ setup();
1317
+
1318
+ // use querySeletor if elem is string
1319
+ if ( typeof elem == 'string' ) {
1320
+ elem = document.querySelector( elem );
1321
+ }
1322
+
1323
+ // do not proceed on non-objects
1324
+ if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
1325
+ return;
1326
+ }
1327
+
1328
+ var style = getStyle( elem );
1329
+
1330
+ // if hidden, everything is 0
1331
+ if ( style.display == 'none' ) {
1332
+ return getZeroSize();
1333
+ }
1334
+
1335
+ var size = {};
1336
+ size.width = elem.offsetWidth;
1337
+ size.height = elem.offsetHeight;
1338
+
1339
+ var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';
1340
+
1341
+ // get all measurements
1342
+ for ( var i=0; i < measurementsLength; i++ ) {
1343
+ var measurement = measurements[i];
1344
+ var value = style[ measurement ];
1345
+ var num = parseFloat( value );
1346
+ // any 'auto', 'medium' value will be 0
1347
+ size[ measurement ] = !isNaN( num ) ? num : 0;
1348
+ }
1349
+
1350
+ var paddingWidth = size.paddingLeft + size.paddingRight;
1351
+ var paddingHeight = size.paddingTop + size.paddingBottom;
1352
+ var marginWidth = size.marginLeft + size.marginRight;
1353
+ var marginHeight = size.marginTop + size.marginBottom;
1354
+ var borderWidth = size.borderLeftWidth + size.borderRightWidth;
1355
+ var borderHeight = size.borderTopWidth + size.borderBottomWidth;
1356
+
1357
+ var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;
1358
+
1359
+ // overwrite width and height if we can get it from style
1360
+ var styleWidth = getStyleSize( style.width );
1361
+ if ( styleWidth !== false ) {
1362
+ size.width = styleWidth +
1363
+ // add padding and border unless it's already including it
1364
+ ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
1365
+ }
1366
+
1367
+ var styleHeight = getStyleSize( style.height );
1368
+ if ( styleHeight !== false ) {
1369
+ size.height = styleHeight +
1370
+ // add padding and border unless it's already including it
1371
+ ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
1372
+ }
1373
+
1374
+ size.innerWidth = size.width - ( paddingWidth + borderWidth );
1375
+ size.innerHeight = size.height - ( paddingHeight + borderHeight );
1376
+
1377
+ size.outerWidth = size.width + marginWidth;
1378
+ size.outerHeight = size.height + marginHeight;
1379
+
1380
+ return size;
1381
+ }
1382
+
1383
+ return getSize;
1384
+
1385
+ });
1386
+
1387
+ /**
1388
+ * matchesSelector v2.0.2
1389
+ * matchesSelector( element, '.selector' )
1390
+ * MIT license
1391
+ */
1392
+
1393
+ /*jshint browser: true, strict: true, undef: true, unused: true */
1394
+
1395
+ ( function( window, factory ) {
1396
+ /*global define: false, module: false */
1397
+ 'use strict';
1398
+ // universal module definition
1399
+ if ( typeof define == 'function' && define.amd ) {
1400
+ // AMD
1401
+ define( 'desandro-matches-selector/matches-selector',factory );
1402
+ } else if ( typeof module == 'object' && module.exports ) {
1403
+ // CommonJS
1404
+ module.exports = factory();
1405
+ } else {
1406
+ // browser global
1407
+ window.matchesSelector = factory();
1408
+ }
1409
+
1410
+ }( window, function factory() {
1411
+ 'use strict';
1412
+
1413
+ var matchesMethod = ( function() {
1414
+ var ElemProto = window.Element.prototype;
1415
+ // check for the standard method name first
1416
+ if ( ElemProto.matches ) {
1417
+ return 'matches';
1418
  }
1419
+ // check un-prefixed
1420
+ if ( ElemProto.matchesSelector ) {
1421
+ return 'matchesSelector';
 
 
 
 
 
 
 
 
 
1422
  }
1423
+ // check vendor prefixes
1424
+ var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];
1425
+
1426
+ for ( var i=0; i < prefixes.length; i++ ) {
1427
+ var prefix = prefixes[i];
1428
+ var method = prefix + 'MatchesSelector';
1429
+ if ( ElemProto[ method ] ) {
1430
+ return method;
1431
+ }
 
 
 
 
 
1432
  }
1433
+ })();
1434
 
1435
+ return function matchesSelector( elem, selector ) {
1436
+ return elem[ matchesMethod ]( selector );
1437
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1438
 
1439
+ }));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1440
 
1441
+ /**
1442
+ * Fizzy UI utils v2.0.7
1443
+ * MIT license
1444
+ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1445
 
1446
+ /*jshint browser: true, undef: true, unused: true, strict: true */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1447
 
1448
+ ( function( window, factory ) {
1449
+ // universal module definition
1450
+ /*jshint strict: false */ /*globals define, module, require */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1451
 
1452
+ if ( typeof define == 'function' && define.amd ) {
1453
+ // AMD
1454
+ define( 'fizzy-ui-utils/utils',[
1455
+ 'desandro-matches-selector/matches-selector'
1456
+ ], function( matchesSelector ) {
1457
+ return factory( window, matchesSelector );
1458
+ });
1459
+ } else if ( typeof module == 'object' && module.exports ) {
1460
+ // CommonJS
1461
+ module.exports = factory(
1462
+ window,
1463
+ require('desandro-matches-selector')
1464
+ );
1465
+ } else {
1466
+ // browser global
1467
+ window.fizzyUIUtils = factory(
1468
+ window,
1469
+ window.matchesSelector
1470
+ );
1471
+ }
1472
+
1473
+ }( window, function factory( window, matchesSelector ) {
1474
+
1475
+
1476
+
1477
+ var utils = {};
1478
+
1479
+ // ----- extend ----- //
1480
+
1481
+ // extends objects
1482
+ utils.extend = function( a, b ) {
1483
+ for ( var prop in b ) {
1484
+ a[ prop ] = b[ prop ];
1485
+ }
1486
+ return a;
1487
+ };
1488
+
1489
+ // ----- modulo ----- //
1490
+
1491
+ utils.modulo = function( num, div ) {
1492
+ return ( ( num % div ) + div ) % div;
1493
+ };
1494
+
1495
+ // ----- makeArray ----- //
1496
+
1497
+ var arraySlice = Array.prototype.slice;
1498
+
1499
+ // turn element or nodeList into an array
1500
+ utils.makeArray = function( obj ) {
1501
+ if ( Array.isArray( obj ) ) {
1502
+ // use object if already an array
1503
+ return obj;
1504
+ }
1505
+ // return empty array if undefined or null. #6
1506
+ if ( obj === null || obj === undefined ) {
1507
+ return [];
1508
+ }
1509
+
1510
+ var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
1511
+ if ( isArrayLike ) {
1512
+ // convert nodeList to array
1513
+ return arraySlice.call( obj );
1514
+ }
1515
+
1516
+ // array of single index
1517
+ return [ obj ];
1518
+ };
1519
+
1520
+ // ----- removeFrom ----- //
1521
+
1522
+ utils.removeFrom = function( ary, obj ) {
1523
+ var index = ary.indexOf( obj );
1524
+ if ( index != -1 ) {
1525
+ ary.splice( index, 1 );
1526
+ }
1527
+ };
1528
+
1529
+ // ----- getParent ----- //
1530
+
1531
+ utils.getParent = function( elem, selector ) {
1532
+ while ( elem.parentNode && elem != document.body ) {
1533
+ elem = elem.parentNode;
1534
+ if ( matchesSelector( elem, selector ) ) {
1535
+ return elem;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1536
  }
1537
+ }
1538
+ };
1539
 
1540
+ // ----- getQueryElement ----- //
1541
+
1542
+ // use element as selector string
1543
+ utils.getQueryElement = function( elem ) {
1544
+ if ( typeof elem == 'string' ) {
1545
+ return document.querySelector( elem );
1546
+ }
1547
+ return elem;
1548
+ };
1549
+
1550
+ // ----- handleEvent ----- //
1551
+
1552
+ // enable .ontype to trigger from .addEventListener( elem, 'type' )
1553
+ utils.handleEvent = function( event ) {
1554
+ var method = 'on' + event.type;
1555
+ if ( this[ method ] ) {
1556
+ this[ method ]( event );
1557
+ }
1558
+ };
1559
+
1560
+ // ----- filterFindElements ----- //
1561
+
1562
+ utils.filterFindElements = function( elems, selector ) {
1563
+ // make array of elems
1564
+ elems = utils.makeArray( elems );
1565
+ var ffElems = [];
1566
+
1567
+ elems.forEach( function( elem ) {
1568
+ // check that elem is an actual element
1569
+ if ( !( elem instanceof HTMLElement ) ) {
1570
+ return;
1571
  }
1572
+ // add elem if no selector
1573
+ if ( !selector ) {
1574
+ ffElems.push( elem );
1575
+ return;
 
 
 
 
 
 
 
1576
  }
1577
+ // filter & find items if we have a selector
1578
+ // filter
1579
+ if ( matchesSelector( elem, selector ) ) {
1580
+ ffElems.push( elem );
 
 
 
 
 
 
 
1581
  }
1582
+ // find children
1583
+ var childElems = elem.querySelectorAll( selector );
1584
+ // concat childElems to filterFound array
1585
+ for ( var i=0; i < childElems.length; i++ ) {
1586
+ ffElems.push( childElems[i] );
 
 
 
 
 
1587
  }
1588
+ });
1589
 
1590
+ return ffElems;
1591
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1592
 
1593
+ // ----- debounceMethod ----- //
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1594
 
1595
+ utils.debounceMethod = function( _class, methodName, threshold ) {
1596
+ threshold = threshold || 100;
1597
+ // original method
1598
+ var method = _class.prototype[ methodName ];
1599
+ var timeoutName = methodName + 'Timeout';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1600
 
1601
+ _class.prototype[ methodName ] = function() {
1602
+ var timeout = this[ timeoutName ];
1603
+ clearTimeout( timeout );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1604
 
1605
+ var args = arguments;
1606
+ var _this = this;
1607
+ this[ timeoutName ] = setTimeout( function() {
1608
+ method.apply( _this, args );
1609
+ delete _this[ timeoutName ];
1610
+ }, threshold );
1611
+ };
1612
+ };
1613
+
1614
+ // ----- docReady ----- //
1615
+
1616
+ utils.docReady = function( callback ) {
1617
+ var readyState = document.readyState;
1618
+ if ( readyState == 'complete' || readyState == 'interactive' ) {
1619
+ // do async to allow for other scripts to run. metafizzy/flickity#441
1620
+ setTimeout( callback );
1621
+ } else {
1622
+ document.addEventListener( 'DOMContentLoaded', callback );
1623
+ }
1624
+ };
1625
+
1626
+ // ----- htmlInit ----- //
1627
+
1628
+ // http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
1629
+ utils.toDashed = function( str ) {
1630
+ return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
1631
+ return $1 + '-' + $2;
1632
+ }).toLowerCase();
1633
+ };
1634
+
1635
+ var console = window.console;
1636
+ /**
1637
+ * allow user to initialize classes via [data-namespace] or .js-namespace class
1638
+ * htmlInit( Widget, 'widgetName' )
1639
+ * options are parsed from data-namespace-options
1640
+ */
1641
+ utils.htmlInit = function( WidgetClass, namespace ) {
1642
+ utils.docReady( function() {
1643
+ var dashedNamespace = utils.toDashed( namespace );
1644
+ var dataAttr = 'data-' + dashedNamespace;
1645
+ var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
1646
+ var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
1647
+ var elems = utils.makeArray( dataAttrElems )
1648
+ .concat( utils.makeArray( jsDashElems ) );
1649
+ var dataOptionsAttr = dataAttr + '-options';
1650
+ var jQuery = window.jQuery;
1651
+
1652
+ elems.forEach( function( elem ) {
1653
+ var attr = elem.getAttribute( dataAttr ) ||
1654
+ elem.getAttribute( dataOptionsAttr );
1655
+ var options;
1656
+ try {
1657
+ options = attr && JSON.parse( attr );
1658
+ } catch ( error ) {
1659
+ // log error, do not initialize
1660
+ if ( console ) {
1661
+ console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
1662
+ ': ' + error );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1663
  }
1664
+ return;
1665
+ }
1666
+ // initialize
1667
+ var instance = new WidgetClass( elem, options );
1668
+ // make available via $().data('namespace')
1669
+ if ( jQuery ) {
1670
+ jQuery.data( elem, namespace, instance );
1671
+ }
1672
+ });
1673
 
1674
+ });
1675
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1676
 
1677
+ // ----- ----- //
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1678
 
1679
+ return utils;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1680
 
1681
+ }));
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1682
 
1683
+ /**
1684
+ * Outlayer Item
1685
+ */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1686
 
1687
+ ( function( window, factory ) {
1688
+ // universal module definition
1689
+ /* jshint strict: false */ /* globals define, module, require */
1690
+ if ( typeof define == 'function' && define.amd ) {
1691
+ // AMD - RequireJS
1692
+ define( 'outlayer/item',[
1693
+ 'ev-emitter/ev-emitter',
1694
+ 'get-size/get-size'
1695
+ ],
1696
+ factory
1697
+ );
1698
+ } else if ( typeof module == 'object' && module.exports ) {
1699
+ // CommonJS - Browserify, Webpack
1700
+ module.exports = factory(
1701
+ require('ev-emitter'),
1702
+ require('get-size')
1703
+ );
1704
+ } else {
1705
+ // browser global
1706
+ window.Outlayer = {};
1707
+ window.Outlayer.Item = factory(
1708
+ window.EvEmitter,
1709
+ window.getSize
1710
+ );
1711
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1712
 
1713
+ }( window, function factory( EvEmitter, getSize ) {
1714
+ 'use strict';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1715
 
1716
+ // ----- helpers ----- //
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1717
 
1718
+ function isEmptyObj( obj ) {
1719
+ for ( var prop in obj ) {
1720
+ return false;
1721
+ }
1722
+ prop = null;
1723
+ return true;
1724
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1725
 
1726
+ // -------------------------- CSS3 support -------------------------- //
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1727
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1728
 
1729
+ var docElemStyle = document.documentElement.style;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1730
 
1731
+ var transitionProperty = typeof docElemStyle.transition == 'string' ?
1732
+ 'transition' : 'WebkitTransition';
1733
+ var transformProperty = typeof docElemStyle.transform == 'string' ?
1734
+ 'transform' : 'WebkitTransform';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1735
 
1736
+ var transitionEndEvent = {
1737
+ WebkitTransition: 'webkitTransitionEnd',
1738
+ transition: 'transitionend'
1739
+ }[ transitionProperty ];
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1740
 
1741
+ // cache all vendor properties that could have vendor prefix
1742
+ var vendorProperties = {
1743
+ transform: transformProperty,
1744
+ transition: transitionProperty,
1745
+ transitionDuration: transitionProperty + 'Duration',
1746
+ transitionProperty: transitionProperty + 'Property',
1747
+ transitionDelay: transitionProperty + 'Delay'
1748
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1749
 
1750
+ // -------------------------- Item -------------------------- //
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1751
 
1752
+ function Item( element, layout ) {
1753
+ if ( !element ) {
1754
+ return;
1755
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1756
 
1757
+ this.element = element;
1758
+ // parent layout class, i.e. Masonry, Isotope, or Packery
1759
+ this.layout = layout;
1760
+ this.position = {
1761
+ x: 0,
1762
+ y: 0
1763
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1764
 
1765
+ this._create();
1766
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1767
 
1768
+ // inherit EvEmitter
1769
+ var proto = Item.prototype = Object.create( EvEmitter.prototype );
1770
+ proto.constructor = Item;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1771
 
1772
+ proto._create = function() {
1773
+ // transition objects
1774
+ this._transn = {
1775
+ ingProperties: {},
1776
+ clean: {},
1777
+ onEnd: {}
1778
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1779
 
1780
+ this.css({
1781
+ position: 'absolute'
1782
+ });
1783
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1784
 
1785
+ // trigger specified handler for event type
1786
+ proto.handleEvent = function( event ) {
1787
+ var method = 'on' + event.type;
1788
+ if ( this[ method ] ) {
1789
+ this[ method ]( event );
1790
+ }
1791
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1792
 
1793
+ proto.getSize = function() {
1794
+ this.size = getSize( this.element );
1795
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1796
 
1797
+ /**
1798
+ * apply CSS styles to element
1799
+ * @param {Object} style
1800
+ */
1801
+ proto.css = function( style ) {
1802
+ var elemStyle = this.element.style;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1803
 
1804
+ for ( var prop in style ) {
1805
+ // use vendor property if available
1806
+ var supportedProp = vendorProperties[ prop ] || prop;
1807
+ elemStyle[ supportedProp ] = style[ prop ];
1808
+ }
1809
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1810
 
1811
+ // measure position, and sets it
1812
+ proto.getPosition = function() {
1813
+ var style = getComputedStyle( this.element );
1814
+ var isOriginLeft = this.layout._getOption('originLeft');
1815
+ var isOriginTop = this.layout._getOption('originTop');
1816
+ var xValue = style[ isOriginLeft ? 'left' : 'right' ];
1817
+ var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
1818
+ var x = parseFloat( xValue );
1819
+ var y = parseFloat( yValue );
1820
+ // convert percent to pixels
1821
+ var layoutSize = this.layout.size;
1822
+ if ( xValue.indexOf('%') != -1 ) {
1823
+ x = ( x / 100 ) * layoutSize.width;
1824
+ }
1825
+ if ( yValue.indexOf('%') != -1 ) {
1826
+ y = ( y / 100 ) * layoutSize.height;
1827
+ }
1828
+ // clean up 'auto' or other non-integer values
1829
+ x = isNaN( x ) ? 0 : x;
1830
+ y = isNaN( y ) ? 0 : y;
1831
+ // remove padding from measurement
1832
+ x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
1833
+ y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1834
 
1835
+ this.position.x = x;
1836
+ this.position.y = y;
1837
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1838
 
1839
+ // set settled position, apply padding
1840
+ proto.layoutPosition = function() {
1841
+ var layoutSize = this.layout.size;
1842
+ var style = {};
1843
+ var isOriginLeft = this.layout._getOption('originLeft');
1844
+ var isOriginTop = this.layout._getOption('originTop');
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1845
 
1846
+ // x
1847
+ var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
1848
+ var xProperty = isOriginLeft ? 'left' : 'right';
1849
+ var xResetProperty = isOriginLeft ? 'right' : 'left';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1850
 
1851
+ var x = this.position.x + layoutSize[ xPadding ];
1852
+ // set in percentage or pixels
1853
+ style[ xProperty ] = this.getXValue( x );
1854
+ // reset other property
1855
+ style[ xResetProperty ] = '';
1856
+
1857
+ // y
1858
+ var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
1859
+ var yProperty = isOriginTop ? 'top' : 'bottom';
1860
+ var yResetProperty = isOriginTop ? 'bottom' : 'top';
1861
+
1862
+ var y = this.position.y + layoutSize[ yPadding ];
1863
+ // set in percentage or pixels
1864
+ style[ yProperty ] = this.getYValue( y );
1865
+ // reset other property
1866
+ style[ yResetProperty ] = '';
1867
+
1868
+ this.css( style );
1869
+ this.emitEvent( 'layout', [ this ] );
1870
+ };
1871
+
1872
+ proto.getXValue = function( x ) {
1873
+ var isHorizontal = this.layout._getOption('horizontal');
1874
+ return this.layout.options.percentPosition && !isHorizontal ?
1875
+ ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
1876
+ };
1877
+
1878
+ proto.getYValue = function( y ) {
1879
+ var isHorizontal = this.layout._getOption('horizontal');
1880
+ return this.layout.options.percentPosition && isHorizontal ?
1881
+ ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
1882
+ };
1883
+
1884
+ proto._transitionTo = function( x, y ) {
1885
+ this.getPosition();
1886
+ // get current x & y from top/left
1887
+ var curX = this.position.x;
1888
+ var curY = this.position.y;
1889
+
1890
+ var didNotMove = x == this.position.x && y == this.position.y;
1891
+
1892
+ // save end position
1893
+ this.setPosition( x, y );
1894
+
1895
+ // if did not move and not transitioning, just go to layout
1896
+ if ( didNotMove && !this.isTransitioning ) {
1897
+ this.layoutPosition();
1898
+ return;
1899
+ }
1900
+
1901
+ var transX = x - curX;
1902
+ var transY = y - curY;
1903
+ var transitionStyle = {};
1904
+ transitionStyle.transform = this.getTranslate( transX, transY );
1905
+
1906
+ this.transition({
1907
+ to: transitionStyle,
1908
+ onTransitionEnd: {
1909
+ transform: this.layoutPosition
1910
+ },
1911
+ isCleaning: true
1912
+ });
1913
+ };
1914
+
1915
+ proto.getTranslate = function( x, y ) {
1916
+ // flip cooridinates if origin on right or bottom
1917
+ var isOriginLeft = this.layout._getOption('originLeft');
1918
+ var isOriginTop = this.layout._getOption('originTop');
1919
+ x = isOriginLeft ? x : -x;
1920
+ y = isOriginTop ? y : -y;
1921
+ return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
1922
+ };
1923
+
1924
+ // non transition + transform support
1925
+ proto.goTo = function( x, y ) {
1926
+ this.setPosition( x, y );
1927
+ this.layoutPosition();
1928
+ };
1929
+
1930
+ proto.moveTo = proto._transitionTo;
1931
+
1932
+ proto.setPosition = function( x, y ) {
1933
+ this.position.x = parseFloat( x );
1934
+ this.position.y = parseFloat( y );
1935
+ };
1936
+
1937
+ // ----- transition ----- //
1938
+
1939
+ /**
1940
+ * @param {Object} style - CSS
1941
+ * @param {Function} onTransitionEnd
1942
+ */
1943
+
1944
+ // non transition, just trigger callback
1945
+ proto._nonTransition = function( args ) {
1946
+ this.css( args.to );
1947
+ if ( args.isCleaning ) {
1948
+ this._removeStyles( args.to );
1949
+ }
1950
+ for ( var prop in args.onTransitionEnd ) {
1951
+ args.onTransitionEnd[ prop ].call( this );
1952
+ }
1953
+ };
1954
+
1955
+ /**
1956
+ * proper transition
1957
+ * @param {Object} args - arguments
1958
+ * @param {Object} to - style to transition to
1959
+ * @param {Object} from - style to start transition from
1960
+ * @param {Boolean} isCleaning - removes transition styles after transition
1961
+ * @param {Function} onTransitionEnd - callback
1962
+ */
1963
+ proto.transition = function( args ) {
1964
+ // redirect to nonTransition if no transition duration
1965
+ if ( !parseFloat( this.layout.options.transitionDuration ) ) {
1966
+ this._nonTransition( args );
1967
+ return;
1968
+ }
1969
+
1970
+ var _transition = this._transn;
1971
+ // keep track of onTransitionEnd callback by css property
1972
+ for ( var prop in args.onTransitionEnd ) {
1973
+ _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
1974
+ }
1975
+ // keep track of properties that are transitioning
1976
+ for ( prop in args.to ) {
1977
+ _transition.ingProperties[ prop ] = true;
1978
+ // keep track of properties to clean up when transition is done
1979
+ if ( args.isCleaning ) {
1980
+ _transition.clean[ prop ] = true;
1981
  }
1982
+ }
1983
 
1984
+ // set from styles
1985
+ if ( args.from ) {
1986
+ this.css( args.from );
1987
+ // force redraw. http://blog.alexmaccaw.com/css-transitions
1988
+ var h = this.element.offsetHeight;
1989
+ // hack for JSHint to hush about unused var
1990
+ h = null;
1991
+ }
1992
+ // enable transition
1993
+ this.enableTransition( args.to );
1994
+ // set styles that are transitioning
1995
+ this.css( args.to );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1996
 
1997
+ this.isTransitioning = true;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1998
 
1999
+ };
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2000
 
2001
+ // dash before all cap letters, including first for
2002
+ // WebkitTransform => -webkit-transform
2003
+ function toDashedAll( str ) {
2004
+ return str.replace( /([A-Z])/g, function( $1 ) {
2005
+ return '-' + $1.toLowerCase();
2006
+ });
2007
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2008
 
2009
+ var transitionProps = 'opacity,' + toDashedAll( transformProperty );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2010
 
2011
+ proto.enableTransition = function(/* style */) {
2012
+ // HACK changing transitionProperty during a transition
2013
+ // will cause transition to jump
2014
+ if ( this.isTransitioning ) {
2015
+ return;
2016
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2017
 
2018
  // make `transition: foo, bar, baz` from style object
2019
  // HACK un-comment this when enableTransition can work
25688
  }
25689
  });
25690
 
25691
+ /* a build task will add "return $;" here */
25692
+ return $;
25693
+
25694
+ }));
25695
+
25696
+ !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);
25697
+ !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);
25698
+
25699
+ /*!
25700
+ * Morphext - Text Rotating Plugin for jQuery
25701
+ * https://github.com/MrSaints/Morphext
25702
+ *
25703
+ * Built on jQuery Boilerplate
25704
+ * http://jqueryboilerplate.com/
25705
+ *
25706
+ * Copyright 2014 Ian Lai and other contributors
25707
+ * Released under the MIT license
25708
+ * http://ian.mit-license.org/
25709
+ */
25710
+
25711
+ /*eslint-env browser */
25712
+ /*global jQuery:false */
25713
+ /*eslint-disable no-underscore-dangle */
25714
+
25715
+ (function ($) {
25716
+ "use strict";
25717
+
25718
+ var pluginName = "Morphext",
25719
+ defaults = {
25720
+ animation: "bounceIn",
25721
+ separator: ",",
25722
+ speed: 2000,
25723
+ complete: $.noop
25724
+ };
25725
+
25726
+ function Plugin (element, options) {
25727
+ this.element = $(element);
25728
+
25729
+ this.settings = $.extend({}, defaults, options);
25730
+ this._defaults = defaults;
25731
+ this._init();
25732
+ }
25733
+
25734
+ Plugin.prototype = {
25735
+ _init: function () {
25736
+ var $that = this;
25737
+ this.phrases = [];
25738
+
25739
+ this.element.addClass("morphext");
25740
+
25741
+ $.each(this.element.text().split(this.settings.separator), function (key, value) {
25742
+ $that.phrases.push($.trim(value));
25743
+ });
25744
+
25745
+ this.index = -1;
25746
+ this.animate();
25747
+ this.start();
25748
+ },
25749
+ animate: function () {
25750
+ this.index = ++this.index % this.phrases.length;
25751
+ this.element[0].innerHTML = "<span class=\"animated " + this.settings.animation + "\">" + this.phrases[this.index] + "</span>";
25752
+
25753
+ if ($.isFunction(this.settings.complete)) {
25754
+ this.settings.complete.call(this);
25755
+ }
25756
+ },
25757
+ start: function () {
25758
+ var $that = this;
25759
+ this._interval = setInterval(function () {
25760
+ $that.animate();
25761
+ }, this.settings.speed);
25762
+ },
25763
+ stop: function () {
25764
+ this._interval = clearInterval(this._interval);
25765
+ }
25766
+ };
25767
+
25768
+ $.fn[pluginName] = function (options) {
25769
+ return this.each(function() {
25770
+ if (!$.data(this, "plugin_" + pluginName)) {
25771
+ $.data(this, "plugin_" + pluginName, new Plugin(this, options));
25772
+ }
25773
+ });
25774
+ };
25775
+ })(jQuery);
25776
+
25777
+ /*!
25778
+ *
25779
+ * typed.js - A JavaScript Typing Animation Library
25780
+ * Author: Matt Boldt <me@mattboldt.com>
25781
+ * Version: v2.0.9
25782
+ * Url: https://github.com/mattboldt/typed.js
25783
+ * License(s): MIT
25784
+ *
25785
+ */
25786
+ (function webpackUniversalModuleDefinition(root, factory) {
25787
+ if(typeof exports === 'object' && typeof module === 'object')
25788
+ module.exports = factory();
25789
+ else if(typeof define === 'function' && define.amd)
25790
+ define([], factory);
25791
+ else if(typeof exports === 'object')
25792
+ exports["Typed"] = factory();
25793
+ else
25794
+ root["Typed"] = factory();
25795
+ })(this, function() {
25796
+ return /******/ (function(modules) { // webpackBootstrap
25797
+ /******/ // The module cache
25798
+ /******/ var installedModules = {};
25799
+ /******/
25800
+ /******/ // The require function
25801
+ /******/ function __webpack_require__(moduleId) {
25802
+ /******/
25803
+ /******/ // Check if module is in cache
25804
+ /******/ if(installedModules[moduleId])
25805
+ /******/ return installedModules[moduleId].exports;
25806
+ /******/
25807
+ /******/ // Create a new module (and put it into the cache)
25808
+ /******/ var module = installedModules[moduleId] = {
25809
+ /******/ exports: {},
25810
+ /******/ id: moduleId,
25811
+ /******/ loaded: false
25812
+ /******/ };
25813
+ /******/
25814
+ /******/ // Execute the module function
25815
+ /******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
25816
+ /******/
25817
+ /******/ // Flag the module as loaded
25818
+ /******/ module.loaded = true;
25819
+ /******/
25820
+ /******/ // Return the exports of the module
25821
+ /******/ return module.exports;
25822
+ /******/ }
25823
+ /******/
25824
+ /******/
25825
+ /******/ // expose the modules object (__webpack_modules__)
25826
+ /******/ __webpack_require__.m = modules;
25827
+ /******/
25828
+ /******/ // expose the module cache
25829
+ /******/ __webpack_require__.c = installedModules;
25830
+ /******/
25831
+ /******/ // __webpack_public_path__
25832
+ /******/ __webpack_require__.p = "";
25833
+ /******/
25834
+ /******/ // Load entry module and return exports
25835
+ /******/ return __webpack_require__(0);
25836
+ /******/ })
25837
+ /************************************************************************/
25838
+ /******/ ([
25839
+ /* 0 */
25840
+ /***/ (function(module, exports, __webpack_require__) {
25841
+
25842
+ 'use strict';
25843
+
25844
+ Object.defineProperty(exports, '__esModule', {
25845
+ value: true
25846
+ });
25847
+
25848
+ 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; }; })();
25849
+
25850
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
25851
+
25852
+ var _initializerJs = __webpack_require__(1);
25853
+
25854
+ var _htmlParserJs = __webpack_require__(3);
25855
+
25856
+ /**
25857
+ * Welcome to Typed.js!
25858
+ * @param {string} elementId HTML element ID _OR_ HTML element
25859
+ * @param {object} options options object
25860
+ * @returns {object} a new Typed object
25861
+ */
25862
+
25863
+ var Typed = (function () {
25864
+ function Typed(elementId, options) {
25865
+ _classCallCheck(this, Typed);
25866
+
25867
+ // Initialize it up
25868
+ _initializerJs.initializer.load(this, options, elementId);
25869
+ // All systems go!
25870
+ this.begin();
25871
+ }
25872
+
25873
+ /**
25874
+ * Toggle start() and stop() of the Typed instance
25875
+ * @public
25876
+ */
25877
+
25878
+ _createClass(Typed, [{
25879
+ key: 'toggle',
25880
+ value: function toggle() {
25881
+ this.pause.status ? this.start() : this.stop();
25882
+ }
25883
+
25884
+ /**
25885
+ * Stop typing / backspacing and enable cursor blinking
25886
+ * @public
25887
+ */
25888
+ }, {
25889
+ key: 'stop',
25890
+ value: function stop() {
25891
+ if (this.typingComplete) return;
25892
+ if (this.pause.status) return;
25893
+ this.toggleBlinking(true);
25894
+ this.pause.status = true;
25895
+ this.options.onStop(this.arrayPos, this);
25896
+ }
25897
+
25898
+ /**
25899
+ * Start typing / backspacing after being stopped
25900
+ * @public
25901
+ */
25902
+ }, {
25903
+ key: 'start',
25904
+ value: function start() {
25905
+ if (this.typingComplete) return;
25906
+ if (!this.pause.status) return;
25907
+ this.pause.status = false;
25908
+ if (this.pause.typewrite) {
25909
+ this.typewrite(this.pause.curString, this.pause.curStrPos);
25910
+ } else {
25911
+ this.backspace(this.pause.curString, this.pause.curStrPos);
25912
+ }
25913
+ this.options.onStart(this.arrayPos, this);
25914
+ }
25915
+
25916
+ /**
25917
+ * Destroy this instance of Typed
25918
+ * @public
25919
+ */
25920
+ }, {
25921
+ key: 'destroy',
25922
+ value: function destroy() {
25923
+ this.reset(false);
25924
+ this.options.onDestroy(this);
25925
+ }
25926
+
25927
+ /**
25928
+ * Reset Typed and optionally restarts
25929
+ * @param {boolean} restart
25930
+ * @public
25931
+ */
25932
+ }, {
25933
+ key: 'reset',
25934
+ value: function reset() {
25935
+ var restart = arguments.length <= 0 || arguments[0] === undefined ? true : arguments[0];
25936
+
25937
+ clearInterval(this.timeout);
25938
+ this.replaceText('');
25939
+ if (this.cursor && this.cursor.parentNode) {
25940
+ this.cursor.parentNode.removeChild(this.cursor);
25941
+ this.cursor = null;
25942
+ }
25943
+ this.strPos = 0;
25944
+ this.arrayPos = 0;
25945
+ this.curLoop = 0;
25946
+ if (restart) {
25947
+ this.insertCursor();
25948
+ this.options.onReset(this);
25949
+ this.begin();
25950
+ }
25951
+ }
25952
+
25953
+ /**
25954
+ * Begins the typing animation
25955
+ * @private
25956
+ */
25957
+ }, {
25958
+ key: 'begin',
25959
+ value: function begin() {
25960
+ var _this = this;
25961
+
25962
+ this.typingComplete = false;
25963
+ this.shuffleStringsIfNeeded(this);
25964
+ this.insertCursor();
25965
+ if (this.bindInputFocusEvents) this.bindFocusEvents();
25966
+ this.timeout = setTimeout(function () {
25967
+ // Check if there is some text in the element, if yes start by backspacing the default message
25968
+ if (!_this.currentElContent || _this.currentElContent.length === 0) {
25969
+ _this.typewrite(_this.strings[_this.sequence[_this.arrayPos]], _this.strPos);
25970
+ } else {
25971
+ // Start typing
25972
+ _this.backspace(_this.currentElContent, _this.currentElContent.length);
25973
+ }
25974
+ }, this.startDelay);
25975
+ }
25976
+
25977
+ /**
25978
+ * Called for each character typed
25979
+ * @param {string} curString the current string in the strings array
25980
+ * @param {number} curStrPos the current position in the curString
25981
+ * @private
25982
+ */
25983
+ }, {
25984
+ key: 'typewrite',
25985
+ value: function typewrite(curString, curStrPos) {
25986
+ var _this2 = this;
25987
+
25988
+ if (this.fadeOut && this.el.classList.contains(this.fadeOutClass)) {
25989
+ this.el.classList.remove(this.fadeOutClass);
25990
+ if (this.cursor) this.cursor.classList.remove(this.fadeOutClass);
25991
+ }
25992
+
25993
+ var humanize = this.humanizer(this.typeSpeed);
25994
+ var numChars = 1;
25995
+
25996
+ if (this.pause.status === true) {
25997
+ this.setPauseStatus(curString, curStrPos, true);
25998
+ return;
25999
+ }
26000
+
26001
+ // contain typing function in a timeout humanize'd delay
26002
+ this.timeout = setTimeout(function () {
26003
+ // skip over any HTML chars
26004
+ curStrPos = _htmlParserJs.htmlParser.typeHtmlChars(curString, curStrPos, _this2);
26005
+
26006
+ var pauseTime = 0;
26007
+ var substr = curString.substr(curStrPos);
26008
+ // check for an escape character before a pause value
26009
+ // format: \^\d+ .. eg: ^1000 .. should be able to print the ^ too using ^^
26010
+ // single ^ are removed from string
26011
+ if (substr.charAt(0) === '^') {
26012
+ if (/^\^\d+/.test(substr)) {
26013
+ var skip = 1; // skip at least 1
26014
+ substr = /\d+/.exec(substr)[0];
26015
+ skip += substr.length;
26016
+ pauseTime = parseInt(substr);
26017
+ _this2.temporaryPause = true;
26018
+ _this2.options.onTypingPaused(_this2.arrayPos, _this2);
26019
+ // strip out the escape character and pause value so they're not printed
26020
+ curString = curString.substring(0, curStrPos) + curString.substring(curStrPos + skip);
26021
+ _this2.toggleBlinking(true);
26022
+ }
26023
+ }
26024
+
26025
+ // check for skip characters formatted as
26026
+ // "this is a `string to print NOW` ..."
26027
+ if (substr.charAt(0) === '`') {
26028
+ while (curString.substr(curStrPos + numChars).charAt(0) !== '`') {
26029
+ numChars++;
26030
+ if (curStrPos + numChars > curString.length) break;
26031
+ }
26032
+ // strip out the escape characters and append all the string in between
26033
+ var stringBeforeSkip = curString.substring(0, curStrPos);
26034
+ var stringSkipped = curString.substring(stringBeforeSkip.length + 1, curStrPos + numChars);
26035
+ var stringAfterSkip = curString.substring(curStrPos + numChars + 1);
26036
+ curString = stringBeforeSkip + stringSkipped + stringAfterSkip;
26037
+ numChars--;
26038
+ }
26039
+
26040
+ // timeout for any pause after a character
26041
+ _this2.timeout = setTimeout(function () {
26042
+ // Accounts for blinking while paused
26043
+ _this2.toggleBlinking(false);
26044
+
26045
+ // We're done with this sentence!
26046
+ if (curStrPos >= curString.length) {
26047
+ _this2.doneTyping(curString, curStrPos);
26048
+ } else {
26049
+ _this2.keepTyping(curString, curStrPos, numChars);
26050
+ }
26051
+ // end of character pause
26052
+ if (_this2.temporaryPause) {
26053
+ _this2.temporaryPause = false;
26054
+ _this2.options.onTypingResumed(_this2.arrayPos, _this2);
26055
+ }
26056
+ }, pauseTime);
26057
+
26058
+ // humanized value for typing
26059
+ }, humanize);
26060
+ }
26061
+
26062
+ /**
26063
+ * Continue to the next string & begin typing
26064
+ * @param {string} curString the current string in the strings array
26065
+ * @param {number} curStrPos the current position in the curString
26066
+ * @private
26067
+ */
26068
+ }, {
26069
+ key: 'keepTyping',
26070
+ value: function keepTyping(curString, curStrPos, numChars) {
26071
+ // call before functions if applicable
26072
+ if (curStrPos === 0) {
26073
+ this.toggleBlinking(false);
26074
+ this.options.preStringTyped(this.arrayPos, this);
26075
+ }
26076
+ // start typing each new char into existing string
26077
+ // curString: arg, this.el.html: original text inside element
26078
+ curStrPos += numChars;
26079
+ var nextString = curString.substr(0, curStrPos);
26080
+ this.replaceText(nextString);
26081
+ // loop the function
26082
+ this.typewrite(curString, curStrPos);
26083
+ }
26084
+
26085
+ /**
26086
+ * We're done typing all strings
26087
+ * @param {string} curString the current string in the strings array
26088
+ * @param {number} curStrPos the current position in the curString
26089
+ * @private
26090
+ */
26091
+ }, {
26092
+ key: 'doneTyping',
26093
+ value: function doneTyping(curString, curStrPos) {
26094
+ var _this3 = this;
26095
+
26096
+ // fires callback function
26097
+ this.options.onStringTyped(this.arrayPos, this);
26098
+ this.toggleBlinking(true);
26099
+ // is this the final string
26100
+ if (this.arrayPos === this.strings.length - 1) {
26101
+ // callback that occurs on the last typed string
26102
+ this.complete();
26103
+ // quit if we wont loop back
26104
+ if (this.loop === false || this.curLoop === this.loopCount) {
26105
+ return;
26106
+ }
26107
+ }
26108
+ this.timeout = setTimeout(function () {
26109
+ _this3.backspace(curString, curStrPos);
26110
+ }, this.backDelay);
26111
+ }
26112
+
26113
+ /**
26114
+ * Backspaces 1 character at a time
26115
+ * @param {string} curString the current string in the strings array
26116
+ * @param {number} curStrPos the current position in the curString
26117
+ * @private
26118
+ */
26119
+ }, {
26120
+ key: 'backspace',
26121
+ value: function backspace(curString, curStrPos) {
26122
+ var _this4 = this;
26123
+
26124
+ if (this.pause.status === true) {
26125
+ this.setPauseStatus(curString, curStrPos, true);
26126
+ return;
26127
+ }
26128
+ if (this.fadeOut) return this.initFadeOut();
26129
+
26130
+ this.toggleBlinking(false);
26131
+ var humanize = this.humanizer(this.backSpeed);
26132
+
26133
+ this.timeout = setTimeout(function () {
26134
+ curStrPos = _htmlParserJs.htmlParser.backSpaceHtmlChars(curString, curStrPos, _this4);
26135
+ // replace text with base text + typed characters
26136
+ var curStringAtPosition = curString.substr(0, curStrPos);
26137
+ _this4.replaceText(curStringAtPosition);
26138
+
26139
+ // if smartBack is enabled
26140
+ if (_this4.smartBackspace) {
26141
+ // the remaining part of the current string is equal of the same part of the new string
26142
+ var nextString = _this4.strings[_this4.arrayPos + 1];
26143
+ if (nextString && curStringAtPosition === nextString.substr(0, curStrPos)) {
26144
+ _this4.stopNum = curStrPos;
26145
+ } else {
26146
+ _this4.stopNum = 0;
26147
+ }
26148
+ }
26149
+
26150
+ // if the number (id of character in current string) is
26151
+ // less than the stop number, keep going
26152
+ if (curStrPos > _this4.stopNum) {
26153
+ // subtract characters one by one
26154
+ curStrPos--;
26155
+ // loop the function
26156
+ _this4.backspace(curString, curStrPos);
26157
+ } else if (curStrPos <= _this4.stopNum) {
26158
+ // if the stop number has been reached, increase
26159
+ // array position to next string
26160
+ _this4.arrayPos++;
26161
+ // When looping, begin at the beginning after backspace complete
26162
+ if (_this4.arrayPos === _this4.strings.length) {
26163
+ _this4.arrayPos = 0;
26164
+ _this4.options.onLastStringBackspaced();
26165
+ _this4.shuffleStringsIfNeeded();
26166
+ _this4.begin();
26167
+ } else {
26168
+ _this4.typewrite(_this4.strings[_this4.sequence[_this4.arrayPos]], curStrPos);
26169
+ }
26170
+ }
26171
+ // humanized value for typing
26172
+ }, humanize);
26173
+ }
26174
+
26175
+ /**
26176
+ * Full animation is complete
26177
+ * @private
26178
+ */
26179
+ }, {
26180
+ key: 'complete',
26181
+ value: function complete() {
26182
+ this.options.onComplete(this);
26183
+ if (this.loop) {
26184
+ this.curLoop++;
26185
+ } else {
26186
+ this.typingComplete = true;
26187
+ }
26188
+ }
26189
+
26190
+ /**
26191
+ * Has the typing been stopped
26192
+ * @param {string} curString the current string in the strings array
26193
+ * @param {number} curStrPos the current position in the curString
26194
+ * @param {boolean} isTyping
26195
+ * @private
26196
+ */
26197
+ }, {
26198
+ key: 'setPauseStatus',
26199
+ value: function setPauseStatus(curString, curStrPos, isTyping) {
26200
+ this.pause.typewrite = isTyping;
26201
+ this.pause.curString = curString;
26202
+ this.pause.curStrPos = curStrPos;
26203
+ }
26204
+
26205
+ /**
26206
+ * Toggle the blinking cursor
26207
+ * @param {boolean} isBlinking
26208
+ * @private
26209
+ */
26210
+ }, {
26211
+ key: 'toggleBlinking',
26212
+ value: function toggleBlinking(isBlinking) {
26213
+ if (!this.cursor) return;
26214
+ // if in paused state, don't toggle blinking a 2nd time
26215
+ if (this.pause.status) return;
26216
+ if (this.cursorBlinking === isBlinking) return;
26217
+ this.cursorBlinking = isBlinking;
26218
+ if (isBlinking) {
26219
+ this.cursor.classList.add('typed-cursor--blink');
26220
+ } else {
26221
+ this.cursor.classList.remove('typed-cursor--blink');
26222
+ }
26223
+ }
26224
+
26225
+ /**
26226
+ * Speed in MS to type
26227
+ * @param {number} speed
26228
+ * @private
26229
+ */
26230
+ }, {
26231
+ key: 'humanizer',
26232
+ value: function humanizer(speed) {
26233
+ return Math.round(Math.random() * speed / 2) + speed;
26234
+ }
26235
+
26236
+ /**
26237
+ * Shuffle the sequence of the strings array
26238
+ * @private
26239
+ */
26240
+ }, {
26241
+ key: 'shuffleStringsIfNeeded',
26242
+ value: function shuffleStringsIfNeeded() {
26243
+ if (!this.shuffle) return;
26244
+ this.sequence = this.sequence.sort(function () {
26245
+ return Math.random() - 0.5;
26246
+ });
26247
+ }
26248
+
26249
+ /**
26250
+ * Adds a CSS class to fade out current string
26251
+ * @private
26252
+ */
26253
+ }, {
26254
+ key: 'initFadeOut',
26255
+ value: function initFadeOut() {
26256
+ var _this5 = this;
26257
+
26258
+ this.el.className += ' ' + this.fadeOutClass;
26259
+ if (this.cursor) this.cursor.className += ' ' + this.fadeOutClass;
26260
+ return setTimeout(function () {
26261
+ _this5.arrayPos++;
26262
+ _this5.replaceText('');
26263
+
26264
+ // Resets current string if end of loop reached
26265
+ if (_this5.strings.length > _this5.arrayPos) {
26266
+ _this5.typewrite(_this5.strings[_this5.sequence[_this5.arrayPos]], 0);
26267
+ } else {
26268
+ _this5.typewrite(_this5.strings[0], 0);
26269
+ _this5.arrayPos = 0;
26270
+ }
26271
+ }, this.fadeOutDelay);
26272
+ }
26273
+
26274
+ /**
26275
+ * Replaces current text in the HTML element
26276
+ * depending on element type
26277
+ * @param {string} str
26278
+ * @private
26279
+ */
26280
+ }, {
26281
+ key: 'replaceText',
26282
+ value: function replaceText(str) {
26283
+ if (this.attr) {
26284
+ this.el.setAttribute(this.attr, str);
26285
+ } else {
26286
+ if (this.isInput) {
26287
+ this.el.value = str;
26288
+ } else if (this.contentType === 'html') {
26289
+ this.el.innerHTML = str;
26290
+ } else {
26291
+ this.el.textContent = str;
26292
+ }
26293
+ }
26294
+ }
26295
+
26296
+ /**
26297
+ * If using input elements, bind focus in order to
26298
+ * start and stop the animation
26299
+ * @private
26300
+ */
26301
+ }, {
26302
+ key: 'bindFocusEvents',
26303
+ value: function bindFocusEvents() {
26304
+ var _this6 = this;
26305
+
26306
+ if (!this.isInput) return;
26307
+ this.el.addEventListener('focus', function (e) {
26308
+ _this6.stop();
26309
+ });
26310
+ this.el.addEventListener('blur', function (e) {
26311
+ if (_this6.el.value && _this6.el.value.length !== 0) {
26312
+ return;
26313
+ }
26314
+ _this6.start();
26315
+ });
26316
+ }
26317
+
26318
+ /**
26319
+ * On init, insert the cursor element
26320
+ * @private
26321
+ */
26322
+ }, {
26323
+ key: 'insertCursor',
26324
+ value: function insertCursor() {
26325
+ if (!this.showCursor) return;
26326
+ if (this.cursor) return;
26327
+ this.cursor = document.createElement('span');
26328
+ this.cursor.className = 'typed-cursor';
26329
+ this.cursor.innerHTML = this.cursorChar;
26330
+ this.el.parentNode && this.el.parentNode.insertBefore(this.cursor, this.el.nextSibling);
26331
+ }
26332
+ }]);
26333
+
26334
+ return Typed;
26335
+ })();
26336
+
26337
+ exports['default'] = Typed;
26338
+ module.exports = exports['default'];
26339
+
26340
+ /***/ }),
26341
+ /* 1 */
26342
+ /***/ (function(module, exports, __webpack_require__) {
26343
+
26344
+ 'use strict';
26345
+
26346
+ Object.defineProperty(exports, '__esModule', {
26347
+ value: true
26348
+ });
26349
+
26350
+ 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; };
26351
+
26352
+ 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; }; })();
26353
+
26354
+ function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { 'default': obj }; }
26355
+
26356
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
26357
+
26358
+ var _defaultsJs = __webpack_require__(2);
26359
+
26360
+ var _defaultsJs2 = _interopRequireDefault(_defaultsJs);
26361
+
26362
+ /**
26363
+ * Initialize the Typed object
26364
+ */
26365
+
26366
+ var Initializer = (function () {
26367
+ function Initializer() {
26368
+ _classCallCheck(this, Initializer);
26369
+ }
26370
+
26371
+ _createClass(Initializer, [{
26372
+ key: 'load',
26373
+
26374
+ /**
26375
+ * Load up defaults & options on the Typed instance
26376
+ * @param {Typed} self instance of Typed
26377
+ * @param {object} options options object
26378
+ * @param {string} elementId HTML element ID _OR_ instance of HTML element
26379
+ * @private
26380
+ */
26381
+
26382
+ value: function load(self, options, elementId) {
26383
+ // chosen element to manipulate text
26384
+ if (typeof elementId === 'string') {
26385
+ self.el = document.querySelector(elementId);
26386
+ } else {
26387
+ self.el = elementId;
26388
+ }
26389
+
26390
+ self.options = _extends({}, _defaultsJs2['default'], options);
26391
+
26392
+ // attribute to type into
26393
+ self.isInput = self.el.tagName.toLowerCase() === 'input';
26394
+ self.attr = self.options.attr;
26395
+ self.bindInputFocusEvents = self.options.bindInputFocusEvents;
26396
+
26397
+ // show cursor
26398
+ self.showCursor = self.isInput ? false : self.options.showCursor;
26399
+
26400
+ // custom cursor
26401
+ self.cursorChar = self.options.cursorChar;
26402
+
26403
+ // Is the cursor blinking
26404
+ self.cursorBlinking = true;
26405
+
26406
+ // text content of element
26407
+ self.elContent = self.attr ? self.el.getAttribute(self.attr) : self.el.textContent;
26408
+
26409
+ // html or plain text
26410
+ self.contentType = self.options.contentType;
26411
+
26412
+ // typing speed
26413
+ self.typeSpeed = self.options.typeSpeed;
26414
+
26415
+ // add a delay before typing starts
26416
+ self.startDelay = self.options.startDelay;
26417
+
26418
+ // backspacing speed
26419
+ self.backSpeed = self.options.backSpeed;
26420
+
26421
+ // only backspace what doesn't match the previous string
26422
+ self.smartBackspace = self.options.smartBackspace;
26423
+
26424
+ // amount of time to wait before backspacing
26425
+ self.backDelay = self.options.backDelay;
26426
+
26427
+ // Fade out instead of backspace
26428
+ self.fadeOut = self.options.fadeOut;
26429
+ self.fadeOutClass = self.options.fadeOutClass;
26430
+ self.fadeOutDelay = self.options.fadeOutDelay;
26431
+
26432
+ // variable to check whether typing is currently paused
26433
+ self.isPaused = false;
26434
+
26435
+ // input strings of text
26436
+ self.strings = self.options.strings.map(function (s) {
26437
+ return s.trim();
26438
+ });
26439
+
26440
+ // div containing strings
26441
+ if (typeof self.options.stringsElement === 'string') {
26442
+ self.stringsElement = document.querySelector(self.options.stringsElement);
26443
+ } else {
26444
+ self.stringsElement = self.options.stringsElement;
26445
+ }
26446
+
26447
+ if (self.stringsElement) {
26448
+ self.strings = [];
26449
+ self.stringsElement.style.display = 'none';
26450
+ var strings = Array.prototype.slice.apply(self.stringsElement.children);
26451
+ var stringsLength = strings.length;
26452
+
26453
+ if (stringsLength) {
26454
+ for (var i = 0; i < stringsLength; i += 1) {
26455
+ var stringEl = strings[i];
26456
+ self.strings.push(stringEl.innerHTML.trim());
26457
+ }
26458
+ }
26459
+ }
26460
+
26461
+ // character number position of current string
26462
+ self.strPos = 0;
26463
+
26464
+ // current array position
26465
+ self.arrayPos = 0;
26466
+
26467
+ // index of string to stop backspacing on
26468
+ self.stopNum = 0;
26469
+
26470
+ // Looping logic
26471
+ self.loop = self.options.loop;
26472
+ self.loopCount = self.options.loopCount;
26473
+ self.curLoop = 0;
26474
+
26475
+ // shuffle the strings
26476
+ self.shuffle = self.options.shuffle;
26477
+ // the order of strings
26478
+ self.sequence = [];
26479
+
26480
+ self.pause = {
26481
+ status: false,
26482
+ typewrite: true,
26483
+ curString: '',
26484
+ curStrPos: 0
26485
+ };
26486
+
26487
+ // When the typing is complete (when not looped)
26488
+ self.typingComplete = false;
26489
+
26490
+ // Set the order in which the strings are typed
26491
+ for (var i in self.strings) {
26492
+ self.sequence[i] = i;
26493
+ }
26494
+
26495
+ // If there is some text in the element
26496
+ self.currentElContent = this.getCurrentElContent(self);
26497
+
26498
+ self.autoInsertCss = self.options.autoInsertCss;
26499
+
26500
+ this.appendAnimationCss(self);
26501
+ }
26502
+ }, {
26503
+ key: 'getCurrentElContent',
26504
+ value: function getCurrentElContent(self) {
26505
+ var elContent = '';
26506
+ if (self.attr) {
26507
+ elContent = self.el.getAttribute(self.attr);
26508
+ } else if (self.isInput) {
26509
+ elContent = self.el.value;
26510
+ } else if (self.contentType === 'html') {
26511
+ elContent = self.el.innerHTML;
26512
+ } else {
26513
+ elContent = self.el.textContent;
26514
+ }
26515
+ return elContent;
26516
+ }
26517
+ }, {
26518
+ key: 'appendAnimationCss',
26519
+ value: function appendAnimationCss(self) {
26520
+ var cssDataName = 'data-typed-js-css';
26521
+ if (!self.autoInsertCss) {
26522
+ return;
26523
+ }
26524
+ if (!self.showCursor && !self.fadeOut) {
26525
+ return;
26526
+ }
26527
+ if (document.querySelector('[' + cssDataName + ']')) {
26528
+ return;
26529
+ }
26530
+
26531
+ var css = document.createElement('style');
26532
+ css.type = 'text/css';
26533
+ css.setAttribute(cssDataName, true);
26534
+
26535
+ var innerCss = '';
26536
+ if (self.showCursor) {
26537
+ 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 ';
26538
+ }
26539
+ if (self.fadeOut) {
26540
+ 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 ';
26541
+ }
26542
+ if (css.length === 0) {
26543
+ return;
26544
+ }
26545
+ css.innerHTML = innerCss;
26546
+ document.body.appendChild(css);
26547
+ }
26548
+ }]);
26549
+
26550
+ return Initializer;
26551
+ })();
26552
+
26553
+ exports['default'] = Initializer;
26554
+ var initializer = new Initializer();
26555
+ exports.initializer = initializer;
26556
+
26557
+ /***/ }),
26558
+ /* 2 */
26559
+ /***/ (function(module, exports) {
26560
+
26561
+ /**
26562
+ * Defaults & options
26563
+ * @returns {object} Typed defaults & options
26564
+ * @public
26565
+ */
26566
+
26567
+ 'use strict';
26568
+
26569
+ Object.defineProperty(exports, '__esModule', {
26570
+ value: true
26571
+ });
26572
+ var defaults = {
26573
+ /**
26574
+ * @property {array} strings strings to be typed
26575
+ * @property {string} stringsElement ID of element containing string children
26576
+ */
26577
+ strings: ['These are the default values...', 'You know what you should do?', 'Use your own!', 'Have a great day!'],
26578
+ stringsElement: null,
26579
+
26580
+ /**
26581
+ * @property {number} typeSpeed type speed in milliseconds
26582
+ */
26583
+ typeSpeed: 0,
26584
+
26585
+ /**
26586
+ * @property {number} startDelay time before typing starts in milliseconds
26587
+ */
26588
+ startDelay: 0,
26589
+
26590
+ /**
26591
+ * @property {number} backSpeed backspacing speed in milliseconds
26592
+ */
26593
+ backSpeed: 0,
26594
+
26595
+ /**
26596
+ * @property {boolean} smartBackspace only backspace what doesn't match the previous string
26597
+ */
26598
+ smartBackspace: true,
26599
+
26600
+ /**
26601
+ * @property {boolean} shuffle shuffle the strings
26602
+ */
26603
+ shuffle: false,
26604
+
26605
+ /**
26606
+ * @property {number} backDelay time before backspacing in milliseconds
26607
+ */
26608
+ backDelay: 700,
26609
+
26610
+ /**
26611
+ * @property {boolean} fadeOut Fade out instead of backspace
26612
+ * @property {string} fadeOutClass css class for fade animation
26613
+ * @property {boolean} fadeOutDelay Fade out delay in milliseconds
26614
+ */
26615
+ fadeOut: false,
26616
+ fadeOutClass: 'typed-fade-out',
26617
+ fadeOutDelay: 500,
26618
+
26619
+ /**
26620
+ * @property {boolean} loop loop strings
26621
+ * @property {number} loopCount amount of loops
26622
+ */
26623
+ loop: false,
26624
+ loopCount: Infinity,
26625
+
26626
+ /**
26627
+ * @property {boolean} showCursor show cursor
26628
+ * @property {string} cursorChar character for cursor
26629
+ * @property {boolean} autoInsertCss insert CSS for cursor and fadeOut into HTML <head>
26630
+ */
26631
+ showCursor: true,
26632
+ cursorChar: '|',
26633
+ autoInsertCss: true,
26634
+
26635
+ /**
26636
+ * @property {string} attr attribute for typing
26637
+ * Ex: input placeholder, value, or just HTML text
26638
+ */
26639
+ attr: null,
26640
+
26641
+ /**
26642
+ * @property {boolean} bindInputFocusEvents bind to focus and blur if el is text input
26643
+ */
26644
+ bindInputFocusEvents: false,
26645
+
26646
+ /**
26647
+ * @property {string} contentType 'html' or 'null' for plaintext
26648
+ */
26649
+ contentType: 'html',
26650
+
26651
+ /**
26652
+ * All typing is complete
26653
+ * @param {Typed} self
26654
+ */
26655
+ onComplete: function onComplete(self) {},
26656
+
26657
+ /**
26658
+ * Before each string is typed
26659
+ * @param {number} arrayPos
26660
+ * @param {Typed} self
26661
+ */
26662
+ preStringTyped: function preStringTyped(arrayPos, self) {},
26663
+
26664
+ /**
26665
+ * After each string is typed
26666
+ * @param {number} arrayPos
26667
+ * @param {Typed} self
26668
+ */
26669
+ onStringTyped: function onStringTyped(arrayPos, self) {},
26670
+
26671
+ /**
26672
+ * During looping, after last string is typed
26673
+ * @param {Typed} self
26674
+ */
26675
+ onLastStringBackspaced: function onLastStringBackspaced(self) {},
26676
+
26677
+ /**
26678
+ * Typing has been stopped
26679
+ * @param {number} arrayPos
26680
+ * @param {Typed} self
26681
+ */
26682
+ onTypingPaused: function onTypingPaused(arrayPos, self) {},
26683
+
26684
+ /**
26685
+ * Typing has been started after being stopped
26686
+ * @param {number} arrayPos
26687
+ * @param {Typed} self
26688
+ */
26689
+ onTypingResumed: function onTypingResumed(arrayPos, self) {},
26690
+
26691
+ /**
26692
+ * After reset
26693
+ * @param {Typed} self
26694
+ */
26695
+ onReset: function onReset(self) {},
26696
+
26697
+ /**
26698
+ * After stop
26699
+ * @param {number} arrayPos
26700
+ * @param {Typed} self
26701
+ */
26702
+ onStop: function onStop(arrayPos, self) {},
26703
+
26704
+ /**
26705
+ * After start
26706
+ * @param {number} arrayPos
26707
+ * @param {Typed} self
26708
+ */
26709
+ onStart: function onStart(arrayPos, self) {},
26710
+
26711
+ /**
26712
+ * After destroy
26713
+ * @param {Typed} self
26714
+ */
26715
+ onDestroy: function onDestroy(self) {}
26716
+ };
26717
+
26718
+ exports['default'] = defaults;
26719
+ module.exports = exports['default'];
26720
+
26721
+ /***/ }),
26722
+ /* 3 */
26723
+ /***/ (function(module, exports) {
26724
+
26725
+
26726
+ /**
26727
+ * TODO: These methods can probably be combined somehow
26728
+ * Parse HTML tags & HTML Characters
26729
+ */
26730
+
26731
+ 'use strict';
26732
+
26733
+ Object.defineProperty(exports, '__esModule', {
26734
+ value: true
26735
+ });
26736
+
26737
+ 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; }; })();
26738
+
26739
+ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError('Cannot call a class as a function'); } }
26740
+
26741
+ var HTMLParser = (function () {
26742
+ function HTMLParser() {
26743
+ _classCallCheck(this, HTMLParser);
26744
+ }
26745
+
26746
+ _createClass(HTMLParser, [{
26747
+ key: 'typeHtmlChars',
26748
+
26749
+ /**
26750
+ * Type HTML tags & HTML Characters
26751
+ * @param {string} curString Current string
26752
+ * @param {number} curStrPos Position in current string
26753
+ * @param {Typed} self instance of Typed
26754
+ * @returns {number} a new string position
26755
+ * @private
26756
+ */
26757
+
26758
+ value: function typeHtmlChars(curString, curStrPos, self) {
26759
+ if (self.contentType !== 'html') return curStrPos;
26760
+ var curChar = curString.substr(curStrPos).charAt(0);
26761
+ if (curChar === '<' || curChar === '&') {
26762
+ var endTag = '';
26763
+ if (curChar === '<') {
26764
+ endTag = '>';
26765
+ } else {
26766
+ endTag = ';';
26767
+ }
26768
+ while (curString.substr(curStrPos + 1).charAt(0) !== endTag) {
26769
+ curStrPos++;
26770
+ if (curStrPos + 1 > curString.length) {
26771
+ break;
26772
+ }
26773
+ }
26774
+ curStrPos++;
26775
+ }
26776
+ return curStrPos;
26777
+ }
26778
+
26779
+ /**
26780
+ * Backspace HTML tags and HTML Characters
26781
+ * @param {string} curString Current string
26782
+ * @param {number} curStrPos Position in current string
26783
+ * @param {Typed} self instance of Typed
26784
+ * @returns {number} a new string position
26785
+ * @private
26786
+ */
26787
+ }, {
26788
+ key: 'backSpaceHtmlChars',
26789
+ value: function backSpaceHtmlChars(curString, curStrPos, self) {
26790
+ if (self.contentType !== 'html') return curStrPos;
26791
+ var curChar = curString.substr(curStrPos).charAt(0);
26792
+ if (curChar === '>' || curChar === ';') {
26793
+ var endTag = '';
26794
+ if (curChar === '>') {
26795
+ endTag = '<';
26796
+ } else {
26797
+ endTag = '&';
26798
+ }
26799
+ while (curString.substr(curStrPos - 1).charAt(0) !== endTag) {
26800
+ curStrPos--;
26801
+ if (curStrPos < 0) {
26802
+ break;
26803
+ }
26804
+ }
26805
+ curStrPos--;
26806
+ }
26807
+ return curStrPos;
26808
+ }
26809
+ }]);
26810
+
26811
+ return HTMLParser;
26812
+ })();
26813
+
26814
+ exports['default'] = HTMLParser;
26815
+ var htmlParser = new HTMLParser();
26816
+ exports.htmlParser = htmlParser;
26817
+
26818
+ /***/ })
26819
+ /******/ ])
26820
+ });
26821
+ ;
26822
+ //! moment.js
26823
+ //! version : 2.18.1
26824
+ //! authors : Tim Wood, Iskren Chernev, Moment.js contributors
26825
+ //! license : MIT
26826
+ //! momentjs.com
26827
+ !function(a,b){"object"==typeof exports&&"undefined"!=typeof module?module.exports=b():"function"==typeof define&&define.amd?define(b):a.moment=b()}(this,function(){"use strict";function a(){return sd.apply(null,arguments)}function b(a){sd=a}function c(a){return a instanceof Array||"[object Array]"===Object.prototype.toString.call(a)}function d(a){return null!=a&&"[object Object]"===Object.prototype.toString.call(a)}function e(a){var b;for(b in a)return!1;return!0}function f(a){return void 0===a}function g(a){return"number"==typeof a||"[object Number]"===Object.prototype.toString.call(a)}function h(a){return a instanceof Date||"[object Date]"===Object.prototype.toString.call(a)}function i(a,b){var c,d=[];for(c=0;c<a.length;++c)d.push(b(a[c],c));return d}function j(a,b){return Object.prototype.hasOwnProperty.call(a,b)}function k(a,b){for(var c in b)j(b,c)