Happy Addons for Elementor (Mega Menu, Post Grid, Woocommerce Product Grid, Table, Event Calendar, Slider Elementor Widget) - Version 1.2.0

Version Description

  • New: Justified Grid Widget
  • New: Logo Grid Widget
  • New: Number Widget
Download this release

Release Info

Developer thehappymonster
Plugin Icon 128x128 Happy Addons for Elementor (Mega Menu, Post Grid, Woocommerce Product Grid, Table, Event Calendar, Slider Elementor Widget)
Version 1.2.0
Comparing to
See all releases

Code changes from version 1.1.1 to 1.2.0

assets/admin/css/dashboard.css CHANGED
@@ -88,8 +88,8 @@
88
  transform: translateX(4px);
89
  }
90
  .ha-switch input:checked + .ha-slider:before {
91
- -webkit-transform: translateX(19px);
92
- -ms-transform: translateX(19px);
93
  transform: translateX(22px);
94
  }
95
 
88
  transform: translateX(4px);
89
  }
90
  .ha-switch input:checked + .ha-slider:before {
91
+ -webkit-transform: translateX(22px);
92
+ -ms-transform: translateX(22px);
93
  transform: translateX(22px);
94
  }
95
 
assets/css/main.css CHANGED
@@ -30,12 +30,15 @@
30
  }
31
 
32
  .ha-cf:before,
33
- .ha-cf:after {
 
 
34
  display: table;
35
  content: " ";
36
  }
37
 
38
- .ha-cf:after {
 
39
  clear: both;
40
  }
41
 
@@ -532,6 +535,283 @@ span .ha-review-ratting--star:before,
532
  border-radius: inherit;
533
  }
534
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
535
  .ha-skills > .elementor-widget-container {
536
  padding-top: 1px;
537
  }
@@ -612,6 +892,491 @@ span .ha-review-ratting--star:before,
612
  text-decoration: none;
613
  }
614
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
615
  .ha-dual-button > .elementor-widget-container {
616
  display: -webkit-box;
617
  display: -webkit-flex;
@@ -708,6 +1473,7 @@ span .ha-review-ratting--star:before,
708
  bottom: -14px;
709
  color: #fff;
710
  content: "\e911";
 
711
  font-size: 36px;
712
  font-family: "Happy Icons";
713
  -webkit-transform: rotate(-180deg);
@@ -804,3 +1570,40 @@ span .ha-review-ratting--star:before,
804
  .ha-testimonial--center {
805
  text-align: center;
806
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
30
  }
31
 
32
  .ha-cf:before,
33
+ .ha-logo-grid-wrapper:before,
34
+ .ha-cf:after,
35
+ .ha-logo-grid-wrapper:after {
36
  display: table;
37
  content: " ";
38
  }
39
 
40
+ .ha-cf:after,
41
+ .ha-logo-grid-wrapper:after {
42
  clear: both;
43
  }
44
 
535
  border-radius: inherit;
536
  }
537
 
538
+ .ha-gallery-filter {
539
+ margin: 0 10px 2rem;
540
+ padding: 0;
541
+ list-style: none;
542
+ }
543
+ .ha-gallery-filter > li {
544
+ display: inline-block;
545
+ margin-bottom: 10px;
546
+ }
547
+ .ha-gallery-filter > li:not(:last-child) {
548
+ margin-right: 10px;
549
+ }
550
+ .ha-gallery-filter > li > button {
551
+ display: block;
552
+ padding: 10px 25px;
553
+ border: 2px solid #562dd4;
554
+ border-radius: .25rem;
555
+ background-color: transparent;
556
+ color: #562dd4;
557
+ text-transform: uppercase;
558
+ font-size: 14px;
559
+ cursor: pointer;
560
+ -webkit-transition: all .3s;
561
+ transition: all .3s;
562
+ }
563
+ .ha-gallery-filter > li > button:hover,
564
+ .ha-gallery-filter > li > button:focus {
565
+ outline: 0;
566
+ background-color: #562dd4;
567
+ color: #fff;
568
+ }
569
+ .ha-gallery-filter > .ha-filter-active > button {
570
+ background-color: #562dd4;
571
+ color: #fff;
572
+ }
573
+
574
+ .ha-image-grid-item {
575
+ float: left;
576
+ }
577
+
578
+ .ha-image-grid-link {
579
+ position: relative;
580
+ display: block;
581
+ overflow: hidden;
582
+ margin: 10px;
583
+ text-decoration: none;
584
+ }
585
+ .ha-image-grid-link:focus {
586
+ outline: none;
587
+ }
588
+ .ha-image-grid-link img {
589
+ vertical-align: bottom;
590
+ -webkit-transition: -webkit-transform .25s linear;
591
+ transition: -webkit-transform .25s linear;
592
+ transition: transform .25s linear;
593
+ transition: transform .25s linear, -webkit-transform .25s linear;
594
+ }
595
+ .ha-image-grid-link:hover img {
596
+ -webkit-transform: scale(1.25);
597
+ -ms-transform: scale(1.25);
598
+ transform: scale(1.25);
599
+ }
600
+ .ha-image-grid-link:hover .ha-image-grid-overlay {
601
+ opacity: 1;
602
+ }
603
+ .ha-image-grid-link:hover .ha-image-grid-content {
604
+ opacity: 1;
605
+ }
606
+ .ha-image-grid-link:hover .ha-image-grid-content:before {
607
+ width: 80px;
608
+ }
609
+
610
+ .ha-image-grid-overlay {
611
+ position: absolute;
612
+ top: 0;
613
+ right: 0;
614
+ bottom: 0;
615
+ left: 0;
616
+ padding: 30px;
617
+ background-color: rgba(0, 0, 0, .8);
618
+ opacity: 0;
619
+ -webkit-transition: opacity .5s;
620
+ transition: opacity .5s;
621
+ }
622
+
623
+ .ha-image-grid-content {
624
+ position: absolute;
625
+ width: 100%;
626
+ color: #fff;
627
+ font-size: 16px;
628
+ opacity: 0;
629
+ -webkit-transition: opacity .5s;
630
+ transition: opacity .5s;
631
+ }
632
+ .ha-image-grid-content:before {
633
+ position: absolute;
634
+ top: -15px;
635
+ width: 35px;
636
+ height: 1px;
637
+ background: #fe413b;
638
+ content: "";
639
+ -webkit-transition: all .3s;
640
+ transition: all .3s;
641
+ }
642
+ .ha-image-grid-content--topleft {
643
+ top: 2.9rem;
644
+ left: 2rem;
645
+ text-align: left;
646
+ }
647
+ .ha-image-grid-content--topleft:before {
648
+ left: 0;
649
+ }
650
+ .ha-image-grid-content--topcenter {
651
+ top: 2.9rem;
652
+ left: 50%;
653
+ text-align: center;
654
+ -webkit-transform: translateX(-50%);
655
+ -ms-transform: translateX(-50%);
656
+ transform: translateX(-50%);
657
+ }
658
+ .ha-image-grid-content--topcenter:before {
659
+ left: 50%;
660
+ -webkit-transform: translateX(-50%);
661
+ -ms-transform: translateX(-50%);
662
+ transform: translateX(-50%);
663
+ }
664
+ .ha-image-grid-content--topright {
665
+ top: 2.9rem;
666
+ right: 2rem;
667
+ text-align: right;
668
+ }
669
+ .ha-image-grid-content--topright:before {
670
+ right: 0;
671
+ }
672
+ .ha-image-grid-content--bottomleft {
673
+ bottom: 2rem;
674
+ left: 2rem;
675
+ text-align: left;
676
+ }
677
+ .ha-image-grid-content--bottomleft:before {
678
+ left: 0;
679
+ }
680
+ .ha-image-grid-content--bottomcenter {
681
+ bottom: 2rem;
682
+ left: 50%;
683
+ text-align: center;
684
+ -webkit-transform: translateX(-50%);
685
+ -ms-transform: translateX(-50%);
686
+ transform: translateX(-50%);
687
+ }
688
+ .ha-image-grid-content--bottomcenter:before {
689
+ left: 50%;
690
+ -webkit-transform: translateX(-50%);
691
+ -ms-transform: translateX(-50%);
692
+ transform: translateX(-50%);
693
+ }
694
+ .ha-image-grid-content--bottomright {
695
+ right: 2rem;
696
+ bottom: 2rem;
697
+ text-align: right;
698
+ }
699
+ .ha-image-grid-content--bottomright:before {
700
+ right: 0;
701
+ }
702
+ .ha-image-grid-content--middleleft {
703
+ top: 50%;
704
+ left: 2rem;
705
+ text-align: left;
706
+ -webkit-transform: translateY(-50%);
707
+ -ms-transform: translateY(-50%);
708
+ transform: translateY(-50%);
709
+ }
710
+ .ha-image-grid-content--middleleft:before {
711
+ left: 0;
712
+ }
713
+ .ha-image-grid-content--middlecenter {
714
+ top: 50%;
715
+ left: 50%;
716
+ text-align: center;
717
+ -webkit-transform: translateX(-50%);
718
+ -ms-transform: translateX(-50%);
719
+ transform: translateX(-50%);
720
+ }
721
+ .ha-image-grid-content--middlecenter:before {
722
+ left: 50%;
723
+ -webkit-transform: translateX(-50%);
724
+ -ms-transform: translateX(-50%);
725
+ transform: translateX(-50%);
726
+ }
727
+ .ha-image-grid-content--middleright {
728
+ top: 50%;
729
+ right: 2rem;
730
+ text-align: right;
731
+ -webkit-transform: translateY(-50%);
732
+ -ms-transform: translateY(-50%);
733
+ transform: translateY(-50%);
734
+ }
735
+ .ha-image-grid-content--middleright:before {
736
+ right: 0;
737
+ }
738
+
739
+ .ha-image-grid--col-2 .ha-image-grid-item {
740
+ width: 50%;
741
+ }
742
+
743
+ .ha-image-grid--col-3 .ha-image-grid-item {
744
+ width: 33.33%;
745
+ }
746
+
747
+ .ha-image-grid--col-4 .ha-image-grid-item {
748
+ width: 25%;
749
+ }
750
+
751
+ .ha-image-grid--col-5 .ha-image-grid-item {
752
+ width: 20%;
753
+ }
754
+
755
+ .ha-justified-gallery-item {
756
+ border-radius: 6px;
757
+ -webkit-transition: all .3s;
758
+ transition: all .3s;
759
+ }
760
+ .ha-justified-gallery-item > img {
761
+ width: 100%;
762
+ -webkit-transition: all .25s !important;
763
+ transition: all .25s !important;
764
+ }
765
+ .ha-justified-gallery-item:hover > img {
766
+ -webkit-transform: scale(1.25);
767
+ -ms-transform: scale(1.25);
768
+ transform: scale(1.25);
769
+ }
770
+
771
+ .justified-gallery > a > .caption,
772
+ .justified-gallery > div > .caption,
773
+ .justified-gallery > figure > .caption {
774
+ padding: 10px;
775
+ }
776
+
777
+ .justified-gallery > a > .caption,
778
+ .justified-gallery > div > .caption,
779
+ .justified-gallery > figure > .caption {
780
+ bottom: -100px !important;
781
+ -webkit-transition: all .25s !important;
782
+ transition: all .25s !important;
783
+ -webkit-animation: haSmoothReveal .3s forwards;
784
+ animation: haSmoothReveal .3s forwards;
785
+ }
786
+
787
+ .justified-gallery > a > .caption.caption-visible,
788
+ .justified-gallery > div > .caption.caption-visible,
789
+ .justified-gallery > figure > .caption.caption-visible {
790
+ bottom: 0 !important;
791
+ }
792
+
793
+ @-webkit-keyframes haSmoothReveal {
794
+ 0% {
795
+ -webkit-transform: translateY(100px);
796
+ transform: translateY(100px);
797
+ }
798
+ to {
799
+ -webkit-transform: translateY(0);
800
+ transform: translateY(0);
801
+ }
802
+ }
803
+
804
+ @keyframes haSmoothReveal {
805
+ 0% {
806
+ -webkit-transform: translateY(100px);
807
+ transform: translateY(100px);
808
+ }
809
+ to {
810
+ -webkit-transform: translateY(0);
811
+ transform: translateY(0);
812
+ }
813
+ }
814
+
815
  .ha-skills > .elementor-widget-container {
816
  padding-top: 1px;
817
  }
892
  text-decoration: none;
893
  }
894
 
895
+ .ha-logo-grid-item {
896
+ float: left;
897
+ overflow: hidden;
898
+ height: 180px;
899
+ border-color: #e7e7e7;
900
+ }
901
+
902
+ .ha-logo-grid-figure {
903
+ display: -webkit-box;
904
+ display: -webkit-flex;
905
+ display: -ms-flexbox;
906
+ display: flex;
907
+ -webkit-box-align: center;
908
+ -webkit-align-items: center;
909
+ align-items: center;
910
+ -ms-flex-align: center;
911
+ -webkit-box-pack: center;
912
+ -ms-flex-pack: center;
913
+ -webkit-justify-content: center;
914
+ justify-content: center;
915
+ margin: 0;
916
+ padding: 30px;
917
+ width: 100%;
918
+ height: 100%;
919
+ }
920
+
921
+ .ha-logo-grid-img {
922
+ max-height: 100%;
923
+ }
924
+
925
+ .ha-logo-grid--col-2 .ha-logo-grid-item {
926
+ width: calc(100% / 2);
927
+ }
928
+
929
+ .ha-logo-grid--col-3 .ha-logo-grid-item {
930
+ width: calc(100% / 3);
931
+ }
932
+
933
+ .ha-logo-grid--col-4 .ha-logo-grid-item {
934
+ width: calc(100% / 4);
935
+ }
936
+
937
+ .ha-logo-grid--col-5 .ha-logo-grid-item {
938
+ width: calc(100% / 5);
939
+ }
940
+
941
+ .ha-logo-grid--col-6 .ha-logo-grid-item {
942
+ width: calc(100% / 6);
943
+ }
944
+
945
+ @media (max-width: 1024px) {
946
+ .ha-logo-grid--col--tablet2 .ha-logo-grid-item {
947
+ width: calc(100% / 2);
948
+ }
949
+ .ha-logo-grid--col--tablet3 .ha-logo-grid-item {
950
+ width: calc(100% / 3);
951
+ }
952
+ .ha-logo-grid--col--tablet4 .ha-logo-grid-item {
953
+ width: calc(100% / 4);
954
+ }
955
+ .ha-logo-grid--col--tablet5 .ha-logo-grid-item {
956
+ width: calc(100% / 5);
957
+ }
958
+ .ha-logo-grid--col--tablet6 .ha-logo-grid-item {
959
+ width: calc(100% / 6);
960
+ }
961
+ }
962
+
963
+ @media (max-width: 767px) {
964
+ .ha-logo-grid--col--mobile2 .ha-logo-grid-item {
965
+ width: calc(100% / 2);
966
+ }
967
+ .ha-logo-grid--col--mobile3 .ha-logo-grid-item {
968
+ width: calc(100% / 3);
969
+ }
970
+ .ha-logo-grid--col--mobile4 .ha-logo-grid-item {
971
+ width: calc(100% / 4);
972
+ }
973
+ .ha-logo-grid--col--mobile5 .ha-logo-grid-item {
974
+ width: calc(100% / 5);
975
+ }
976
+ .ha-logo-grid--col--mobile6 .ha-logo-grid-item {
977
+ width: calc(100% / 6);
978
+ }
979
+ }
980
+
981
+ .ha-logo-grid--tictactoe .ha-logo-grid-item {
982
+ border-width: 2px 2px 0 0;
983
+ border-style: solid;
984
+ }
985
+
986
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n) {
987
+ border-right-width: 0;
988
+ }
989
+
990
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n + 2) {
991
+ border-top-width: 0;
992
+ }
993
+
994
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n) {
995
+ border-right-width: 0;
996
+ }
997
+
998
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n + 3) {
999
+ border-top-width: 0;
1000
+ }
1001
+
1002
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n) {
1003
+ border-right-width: 0;
1004
+ }
1005
+
1006
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n + 4) {
1007
+ border-top-width: 0;
1008
+ }
1009
+
1010
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n) {
1011
+ border-right-width: 0;
1012
+ }
1013
+
1014
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n + 5) {
1015
+ border-top-width: 0;
1016
+ }
1017
+
1018
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n) {
1019
+ border-right-width: 0;
1020
+ }
1021
+
1022
+ .ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n + 6) {
1023
+ border-top-width: 0;
1024
+ }
1025
+
1026
+ @media (max-width: 1024px) {
1027
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n) {
1028
+ border-right-width: 0;
1029
+ }
1030
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n + 2) {
1031
+ border-top-width: 0;
1032
+ }
1033
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n) {
1034
+ border-right-width: 0;
1035
+ }
1036
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n + 3) {
1037
+ border-top-width: 0;
1038
+ }
1039
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n) {
1040
+ border-right-width: 0;
1041
+ }
1042
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n + 4) {
1043
+ border-top-width: 0;
1044
+ }
1045
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n) {
1046
+ border-right-width: 0;
1047
+ }
1048
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n + 5) {
1049
+ border-top-width: 0;
1050
+ }
1051
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n) {
1052
+ border-right-width: 0;
1053
+ }
1054
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n + 6) {
1055
+ border-top-width: 0;
1056
+ }
1057
+ }
1058
+
1059
+ @media (max-width: 767px) {
1060
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n) {
1061
+ border-right-width: 0;
1062
+ }
1063
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n + 2) {
1064
+ border-top-width: 0;
1065
+ }
1066
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n) {
1067
+ border-right-width: 0;
1068
+ }
1069
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n + 3) {
1070
+ border-top-width: 0;
1071
+ }
1072
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n) {
1073
+ border-right-width: 0;
1074
+ }
1075
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n + 4) {
1076
+ border-top-width: 0;
1077
+ }
1078
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n) {
1079
+ border-right-width: 0;
1080
+ }
1081
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n + 5) {
1082
+ border-top-width: 0;
1083
+ }
1084
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n) {
1085
+ border-right-width: 0;
1086
+ }
1087
+ .ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n + 6) {
1088
+ border-top-width: 0;
1089
+ }
1090
+ }
1091
+
1092
+ .ha-logo-grid--border {
1093
+ border-radius: .5rem;
1094
+ }
1095
+
1096
+ .ha-logo-grid--border .ha-logo-grid-item {
1097
+ border-width: 0 2px 2px 0;
1098
+ border-style: solid;
1099
+ }
1100
+ .ha-logo-grid--border .ha-logo-grid-item:first-child {
1101
+ border-top-left-radius: 10px;
1102
+ }
1103
+ .ha-logo-grid--border .ha-logo-grid-item:last-child {
1104
+ border-bottom-right-radius: 10px;
1105
+ }
1106
+
1107
+ .ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n + 2) {
1108
+ border-top-width: 2px;
1109
+ }
1110
+
1111
+ .ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n + 1) {
1112
+ border-left-width: 2px;
1113
+ }
1114
+
1115
+ .ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2) {
1116
+ border-top-right-radius: 10px;
1117
+ }
1118
+
1119
+ .ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-last-child(2) {
1120
+ border-bottom-left-radius: 10px;
1121
+ }
1122
+
1123
+ .ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n + 3) {
1124
+ border-top-width: 2px;
1125
+ }
1126
+
1127
+ .ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n + 1) {
1128
+ border-left-width: 2px;
1129
+ }
1130
+
1131
+ .ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3) {
1132
+ border-top-right-radius: 10px;
1133
+ }
1134
+
1135
+ .ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-last-child(3) {
1136
+ border-bottom-left-radius: 10px;
1137
+ }
1138
+
1139
+ .ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n + 4) {
1140
+ border-top-width: 2px;
1141
+ }
1142
+
1143
+ .ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n + 1) {
1144
+ border-left-width: 2px;
1145
+ }
1146
+
1147
+ .ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4) {
1148
+ border-top-right-radius: 10px;
1149
+ }
1150
+
1151
+ .ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-last-child(4) {
1152
+ border-bottom-left-radius: 10px;
1153
+ }
1154
+
1155
+ .ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n + 5) {
1156
+ border-top-width: 2px;
1157
+ }
1158
+
1159
+ .ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n + 1) {
1160
+ border-left-width: 2px;
1161
+ }
1162
+
1163
+ .ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5) {
1164
+ border-top-right-radius: 10px;
1165
+ }
1166
+
1167
+ .ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-last-child(5) {
1168
+ border-bottom-left-radius: 10px;
1169
+ }
1170
+
1171
+ .ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n + 6) {
1172
+ border-top-width: 2px;
1173
+ }
1174
+
1175
+ .ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n + 1) {
1176
+ border-left-width: 2px;
1177
+ }
1178
+
1179
+ .ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6) {
1180
+ border-top-right-radius: 10px;
1181
+ }
1182
+
1183
+ .ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-last-child(6) {
1184
+ border-bottom-left-radius: 10px;
1185
+ }
1186
+
1187
+ @media (max-width: 1024px) {
1188
+ .ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n + 2) {
1189
+ border-top-width: 2px;
1190
+ }
1191
+ .ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n + 1) {
1192
+ border-left-width: 2px;
1193
+ }
1194
+ .ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2) {
1195
+ border-top-right-radius: 10px;
1196
+ }
1197
+ .ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-last-child(2) {
1198
+ border-bottom-left-radius: 10px;
1199
+ }
1200
+ .ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n + 3) {
1201
+ border-top-width: 2px;
1202
+ }
1203
+ .ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n + 1) {
1204
+ border-left-width: 2px;
1205
+ }
1206
+ .ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3) {
1207
+ border-top-right-radius: 10px;
1208
+ }
1209
+ .ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-last-child(3) {
1210
+ border-bottom-left-radius: 10px;
1211
+ }
1212
+ .ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n + 4) {
1213
+ border-top-width: 2px;
1214
+ }
1215
+ .ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n + 1) {
1216
+ border-left-width: 2px;
1217
+ }
1218
+ .ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4) {
1219
+ border-top-right-radius: 10px;
1220
+ }
1221
+ .ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-last-child(4) {
1222
+ border-bottom-left-radius: 10px;
1223
+ }
1224
+ .ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n + 5) {
1225
+ border-top-width: 2px;
1226
+ }
1227
+ .ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n + 1) {
1228
+ border-left-width: 2px;
1229
+ }
1230
+ .ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5) {
1231
+ border-top-right-radius: 10px;
1232
+ }
1233
+ .ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-last-child(5) {
1234
+ border-bottom-left-radius: 10px;
1235
+ }
1236
+ .ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n + 6) {
1237
+ border-top-width: 2px;
1238
+ }
1239
+ .ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n + 1) {
1240
+ border-left-width: 2px;
1241
+ }
1242
+ .ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6) {
1243
+ border-top-right-radius: 10px;
1244
+ }
1245
+ .ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-last-child(6) {
1246
+ border-bottom-left-radius: 10px;
1247
+ }
1248
+ }
1249
+
1250
+ @media (max-width: 767px) {
1251
+ .ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n + 2) {
1252
+ border-top-width: 2px;
1253
+ }
1254
+ .ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n + 1) {
1255
+ border-left-width: 2px;
1256
+ }
1257
+ .ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2) {
1258
+ border-top-right-radius: 10px;
1259
+ }
1260
+ .ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-last-child(2) {
1261
+ border-bottom-left-radius: 10px;
1262
+ }
1263
+ .ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n + 3) {
1264
+ border-top-width: 2px;
1265
+ }
1266
+ .ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n + 1) {
1267
+ border-left-width: 2px;
1268
+ }
1269
+ .ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3) {
1270
+ border-top-right-radius: 10px;
1271
+ }
1272
+ .ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-last-child(3) {
1273
+ border-bottom-left-radius: 10px;
1274
+ }
1275
+ .ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n + 4) {
1276
+ border-top-width: 2px;
1277
+ }
1278
+ .ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n + 1) {
1279
+ border-left-width: 2px;
1280
+ }
1281
+ .ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4) {
1282
+ border-top-right-radius: 10px;
1283
+ }
1284
+ .ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-last-child(4) {
1285
+ border-bottom-left-radius: 10px;
1286
+ }
1287
+ .ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n + 5) {
1288
+ border-top-width: 2px;
1289
+ }
1290
+ .ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n + 1) {
1291
+ border-left-width: 2px;
1292
+ }
1293
+ .ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5) {
1294
+ border-top-right-radius: 10px;
1295
+ }
1296
+ .ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-last-child(5) {
1297
+ border-bottom-left-radius: 10px;
1298
+ }
1299
+ .ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n + 6) {
1300
+ border-top-width: 2px;
1301
+ }
1302
+ .ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n + 1) {
1303
+ border-left-width: 2px;
1304
+ }
1305
+ .ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6) {
1306
+ border-top-right-radius: 10px;
1307
+ }
1308
+ .ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-last-child(6) {
1309
+ border-bottom-left-radius: 10px;
1310
+ }
1311
+ }
1312
+
1313
+ .ha-logo-grid--box .ha-logo-grid-wrapper {
1314
+ margin: -.5rem;
1315
+ }
1316
+
1317
+ .ha-logo-grid--box .ha-logo-grid-item {
1318
+ margin: .5rem;
1319
+ border-width: 2px;
1320
+ border-style: solid;
1321
+ border-radius: .5rem;
1322
+ }
1323
+
1324
+ .ha-logo-grid--box.ha-logo-grid--col-2 .ha-logo-grid-item {
1325
+ width: calc((100% / 2) - 1rem);
1326
+ }
1327
+
1328
+ .ha-logo-grid--box.ha-logo-grid--col-3 .ha-logo-grid-item {
1329
+ width: calc((100% / 3) - 1rem);
1330
+ }
1331
+
1332
+ .ha-logo-grid--box.ha-logo-grid--col-4 .ha-logo-grid-item {
1333
+ width: calc((100% / 4) - 1rem);
1334
+ }
1335
+
1336
+ .ha-logo-grid--box.ha-logo-grid--col-5 .ha-logo-grid-item {
1337
+ width: calc((100% / 5) - 1rem);
1338
+ }
1339
+
1340
+ .ha-logo-grid--box.ha-logo-grid--col-6 .ha-logo-grid-item {
1341
+ width: calc((100% / 6) - 1rem);
1342
+ }
1343
+
1344
+ @media (max-width: 1024px) {
1345
+ .ha-logo-grid--box.ha-logo-grid--col--tablet2 .ha-logo-grid-item {
1346
+ width: calc((100% / 2) - 1rem);
1347
+ }
1348
+ .ha-logo-grid--box.ha-logo-grid--col--tablet3 .ha-logo-grid-item {
1349
+ width: calc((100% / 3) - 1rem);
1350
+ }
1351
+ .ha-logo-grid--box.ha-logo-grid--col--tablet4 .ha-logo-grid-item {
1352
+ width: calc((100% / 4) - 1rem);
1353
+ }
1354
+ .ha-logo-grid--box.ha-logo-grid--col--tablet5 .ha-logo-grid-item {
1355
+ width: calc((100% / 5) - 1rem);
1356
+ }
1357
+ .ha-logo-grid--box.ha-logo-grid--col--tablet6 .ha-logo-grid-item {
1358
+ width: calc((100% / 6) - 1rem);
1359
+ }
1360
+ }
1361
+
1362
+ @media (max-width: 767px) {
1363
+ .ha-logo-grid--box.ha-logo-grid--col--mobile2 .ha-logo-grid-item {
1364
+ width: calc((100% / 2) - 1rem);
1365
+ }
1366
+ .ha-logo-grid--box.ha-logo-grid--col--mobile3 .ha-logo-grid-item {
1367
+ width: calc((100% / 3) - 1rem);
1368
+ }
1369
+ .ha-logo-grid--box.ha-logo-grid--col--mobile4 .ha-logo-grid-item {
1370
+ width: calc((100% / 4) - 1rem);
1371
+ }
1372
+ .ha-logo-grid--box.ha-logo-grid--col--mobile5 .ha-logo-grid-item {
1373
+ width: calc((100% / 5) - 1rem);
1374
+ }
1375
+ .ha-logo-grid--box.ha-logo-grid--col--mobile6 .ha-logo-grid-item {
1376
+ width: calc((100% / 6) - 1rem);
1377
+ }
1378
+ }
1379
+
1380
  .ha-dual-button > .elementor-widget-container {
1381
  display: -webkit-box;
1382
  display: -webkit-flex;
1473
  bottom: -14px;
1474
  color: #fff;
1475
  content: "\e911";
1476
+ font-style: normal;
1477
  font-size: 36px;
1478
  font-family: "Happy Icons";
1479
  -webkit-transform: rotate(-180deg);
1570
  .ha-testimonial--center {
1571
  text-align: center;
1572
  }
1573
+
1574
+ .ha-number-body .ha-number-border {
1575
+ position: relative;
1576
+ display: -webkit-flex;
1577
+ /* Safari 7.0+ */
1578
+ display: -webkit-box;
1579
+ display: -ms-flexbox;
1580
+ display: flex;
1581
+ overflow: hidden;
1582
+ -webkit-box-align: center;
1583
+ /* Safari */
1584
+ -webkit-align-items: center;
1585
+ align-items: center;
1586
+ -ms-flex-align: center;
1587
+ padding: 6px 6px 6px 6px;
1588
+ width: 50px;
1589
+ height: 50px;
1590
+ border-radius: 100%;
1591
+ background: #c36;
1592
+ color: #fff;
1593
+ text-align: center;
1594
+ font-size: 20px;
1595
+ }
1596
+ .ha-number-body .ha-number-border .ha-number-border-overlay {
1597
+ position: absolute;
1598
+ top: 0;
1599
+ left: 0;
1600
+ width: 100%;
1601
+ height: 100%;
1602
+ }
1603
+ .ha-number-body .ha-number-border span {
1604
+ /* Safari 6.1+ */
1605
+ -webkit-box-flex: 1;
1606
+ -webkit-flex: 1;
1607
+ -ms-flex: 1;
1608
+ flex: 1;
1609
+ }
assets/css/main.min.css CHANGED
@@ -1 +1 @@
1
- .ha-card>.elementor-widget-container,.ha-icon-box>.elementor-widget-container,.ha-image-compare>.elementor-widget-container,.ha-infobox>.elementor-widget-container,.ha-member>.elementor-widget-container,.ha-review>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word}.happy-addon,.happy-addon *{box-sizing:border-box}.happy-addon img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.happy-addon p:empty{display:none}.ha-cf:after,.ha-cf:before{display:table;content:" "}.ha-cf:after{clear:both}.ha-btn{display:inline-block;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon{-webkit-transition:all .3s;transition:all .3s}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-card-figure{position:relative;height:250px}.ha-card-figure>img{border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.ha-card-body{padding:1.5rem}.ha-card-title{margin-top:0;margin-bottom:.75rem;color:#151515;font-weight:700;font-size:22px}.ha-card-text{margin-bottom:2rem;color:#616161;font-size:16px;line-height:1.7}.ha-card-text>p,.ha-infobox-text>p{margin-top:0;margin-bottom:0}.ha-card--top .ha-card-figure,.ha-member-links>a{display:inline-block}.ha-card--left>.elementor-widget-container,.ha-card--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-card--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-card--left .ha-card-body,.ha-card--left .ha-card-figure,.ha-card--right .ha-card-body,.ha-card--right .ha-card-figure{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ha-card--left .ha-card-body,.ha-card--right .ha-card-body{padding:2.5rem}.ha-card--left .ha-card-figure>img{border-radius:calc(.5rem - 1px) 0 0 calc(.5rem - 1px)}.ha-card--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;text-align:right}.ha-card--right .ha-card-figure>img{border-radius:0 calc(.5rem - 1px) calc(.5rem - 1px) 0}.ha-card .ha-badge{position:absolute}.ha-badge{padding:.475rem 1.1rem;border-radius:50px;background-color:#fff;font-size:12px}.ha-badge--top-left{top:1rem;left:1rem}.ha-badge--top-center{top:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--top-right{top:1rem;right:1rem}.ha-badge--middle-left{top:50%;left:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--middle-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ha-badge--middle-right{top:50%;right:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--bottom-left{bottom:1rem;left:1rem}.ha-badge--bottom-center{bottom:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--bottom-right{right:1rem;bottom:1rem}.ha-infobox>.elementor-widget-container{padding:1.5rem}.ha-infobox-title{margin-top:0;margin-bottom:1rem;color:#151515;font-size:24px}.ha-infobox-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-infobox-figure--icon{text-align:center;font-size:3rem}.ha-icon-box-icon>i,.ha-infobox-figure>i{position:relative;display:block;width:1em;height:1em}.ha-icon-box-icon>i:before,.ha-infobox-figure>i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-card-figure>img,.ha-infobox-figure>img,.ha-member-figure img{width:100%;height:100%;vertical-align:bottom}.ha-infobox-text+.ha-btn--link{margin-top:1rem}.ha-icon-box>.elementor-widget-container{position:relative;padding:1.25rem}.ha-icon-box-title{margin-top:0;margin-bottom:0;color:#151515;font-size:24px;-webkit-transition:color .3s;transition:color .3s}.ha-icon-box-icon{display:inline-block;margin-bottom:1rem;color:#151515;text-align:center;font-size:3rem;-webkit-transition:border .3s,background .3s,color .3s,-webkit-transform .3s;transition:transform .3s,border .3s,background .3s,color .3s;transition:transform .3s,border .3s,background .3s,color .3s,-webkit-transform .3s}.ha-icon-box-icon>i{-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ha-icon-box-link{display:block;color:transparent;text-decoration:none}.ha-icon-box .ha-badge{position:absolute;z-index:9999;background-color:#e2498a;color:#fff}.ha-member>.elementor-widget-container{padding:1.25rem}.ha-member-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-member-name{margin-top:0;margin-bottom:.5rem;color:#151515;font-size:18px}.ha-member-position{margin-bottom:1.5rem;color:#7f7f7f;font-size:14px}.ha-member-bio{margin-bottom:1.5rem;font-size:14px;line-height:1.6}.ha-member-links>a{color:#9895ad;text-align:center;line-height:1;-webkit-transition:all .2s;transition:all .2s}.ha-member-links>a:focus,.ha-member-links>a:hover{color:#222}.ha-member-links>a>i{width:1em;height:1em}.ha-member-links>a:not(:last-child){margin-right:.3rem}.ha-review-header{margin-top:1.5rem}.ha-review-desc p,.ha-review-figure{margin:0}.ha-review-figure>img{width:100%;height:100%;border-radius:50%;vertical-align:bottom}.ha-review-reviewer{margin-top:0;margin-bottom:.3rem;color:#151515;font-size:18px}.ha-review-position{margin-bottom:.5rem;color:#7f7f7f;font-size:15px}.ha-review-ratting{display:inline-block;font-size:12px;line-height:1}.ha-review-ratting--num{padding:.25em .66em;border-radius:2.5em;background-color:#287dfe;color:#fff}.ha-review-ratting--star{display:inline-block;color:#ffbf36;font-family:"Fontawesome"}.ha-review-ratting--star>span{position:relative;overflow:hidden;height:1em}.ha-review-ratting--star span>span{position:absolute;top:0;left:0;overflow:hidden;padding-top:1.5em}.ha-review-ratting--star span>span:before,span .ha-review-ratting--star:before{position:absolute;top:0;left:0}.ha-review-ratting--star span:before{content:"\f006\f006\f006\f006\f006"}.ha-review-ratting--star span>span:before{content:"\f005\f005\f005\f005\f005"}.ha-review-desc{margin-top:1.5rem;font-size:16px;line-height:1.6}.ha-review--top>.elementor-widget-container{padding:2rem}.ha-review--top .ha-review-figure{display:inline-block;max-width:70px;height:70px}.ha-review--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-review--left>.elementor-widget-container,.ha-review--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding-left:2rem}.ha-review--left .ha-review-figure,.ha-review--right .ha-review-figure{-webkit-box-flex:0;-webkit-flex:0 0 150px;-ms-flex:0 0 150px;flex:0 0 150px;max-width:150px;height:150px}.ha-review--left .ha-review-body,.ha-review--right .ha-review-body{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 150px);-ms-flex:0 0 calc(100% - 150px);flex:0 0 calc(100% - 150px);padding:2rem;max-width:calc(100% - 150px)}.ha-review--left .ha-review-body>:first-child,.ha-review--right .ha-review-body>:first-child{margin-top:0}.ha-review--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:2rem;padding-left:0;text-align:right}.ha-image-compare .twentytwenty-container,.ha-image-compare .twentytwenty-wrapper{border-radius:inherit}.ha-skills>.elementor-widget-container{padding-top:1px}.ha-skill{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background-color:#e9ecef;font-size:.75rem}.ha-skill--inside .ha-skill-info,.ha-skill--outside .ha-skill-info{text-align:left;font-size:14px}.ha-skill--inside .ha-skill-level-text,.ha-skill--outside .ha-skill-level-text{float:right}.ha-skill--outside{height:2px}.ha-skill--outside .ha-skill-level{position:relative}.ha-skill--outside .ha-skill-info{position:absolute;top:-25px;width:100%;color:#242424}.ha-skill--inside{overflow:hidden;height:30px;border-radius:.3rem}.ha-skill--inside .ha-skill-info{padding-right:1rem;padding-left:1rem;color:#fff}.ha-skill-level{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;background-color:#007bff;color:#fff;text-align:center;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.ha-skill--outside{margin-top:40px}.ha-skill--inside:not(:first-child){margin-top:20px}.ha-gradient-heading{margin-top:0;margin-bottom:0}.ha-gradient-heading>a{color:inherit;text-decoration:none}.ha-dual-button>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-btn,.ha-dual-btn-connector{display:inline-block}.ha-dual-btn-wrapper{position:relative;text-align:center;font-weight:400}.ha-dual-btn{padding:1.2rem 3rem;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{border-top-left-radius:50px;border-bottom-left-radius:50px;background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab}.ha-dual-btn--right{border-top-right-radius:50px;border-bottom-right-radius:50px;background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e}.ha-dual-btn-connector{position:absolute!important;top:50%;right:0;z-index:9;width:30px;height:30px;border-radius:100%;background-color:#fff;box-shadow:0 0 0 5px rgba(255,255,255,.3);color:#27374c;text-transform:uppercase;font-size:12px;line-height:30px;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%)}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}.ha-testimonial--basic>.elementor-widget-container{padding:2rem;border:1px solid #ececec;border-radius:.5rem}.ha-testimonial--basic .ha-testimonial__content{margin-bottom:2.5em}.ha-testimonial--bubble .ha-testimonial__content{position:relative;margin-bottom:1.5rem;padding:2rem;border-radius:6px;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);line-height:1.6rem}.ha-testimonial--bubble .ha-testimonial__content:after{position:absolute;bottom:-14px;color:#fff;content:"\e911";font-size:36px;font-family:"Happy Icons";-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.ha-testimonial--left.ha-testimonial--bubble .ha-testimonial__content:after{left:15px}.ha-testimonial--center.ha-testimonial--bubble .ha-testimonial__content:after{left:50%;-webkit-transform:translateX(-50%) rotate(-180deg);-ms-transform:translateX(-50%) rotate(-180deg);transform:translateX(-50%) rotate(-180deg)}.ha-testimonial--right.ha-testimonial--bubble .ha-testimonial__content:after{right:15px}.ha-testimonial__reviewer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{width:65px;height:65px}.ha-testimonial__reviewer-thumb>img{width:100%;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover}.ha-testimonial__reviewer-name{margin-bottom:.3rem;color:#562dd4;font-weight:700;font-size:18px}.ha-testimonial__reviewer-title{color:#8c8c8c;font-size:16px}.ha-testimonial--left .ha-testimonial__reviewer-meta{padding-left:1em}.ha-testimonial--center .ha-testimonial__reviewer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-testimonial--center .ha-testimonial__reviewer-meta{padding-top:1em}.ha-testimonial--right .ha-testimonial__reviewer{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-testimonial--right .ha-testimonial__reviewer-meta{padding-right:1em}.ha-testimonial--left{text-align:left}.ha-testimonial--right{text-align:right}.ha-testimonial--center{text-align:center}
1
+ .ha-card>.elementor-widget-container,.ha-icon-box>.elementor-widget-container,.ha-image-compare>.elementor-widget-container,.ha-infobox>.elementor-widget-container,.ha-member>.elementor-widget-container,.ha-review>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word}.happy-addon,.happy-addon *{box-sizing:border-box}.happy-addon img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.happy-addon p:empty{display:none}.ha-cf:after,.ha-cf:before,.ha-logo-grid-wrapper:after,.ha-logo-grid-wrapper:before{display:table;content:" "}.ha-cf:after,.ha-logo-grid-wrapper:after{clear:both}.ha-btn{display:inline-block;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon{-webkit-transition:all .3s;transition:all .3s}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-card-figure{position:relative;height:250px}.ha-card-figure>img{border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.ha-card-body{padding:1.5rem}.ha-card-title{margin-top:0;margin-bottom:.75rem;color:#151515;font-weight:700;font-size:22px}.ha-card-text{margin-bottom:2rem;color:#616161;font-size:16px;line-height:1.7}.ha-card-text>p,.ha-infobox-text>p{margin-top:0;margin-bottom:0}.ha-card--top .ha-card-figure,.ha-member-links>a{display:inline-block}.ha-card--left>.elementor-widget-container,.ha-card--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-card--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-card--left .ha-card-body,.ha-card--left .ha-card-figure,.ha-card--right .ha-card-body,.ha-card--right .ha-card-figure{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ha-card--left .ha-card-body,.ha-card--right .ha-card-body{padding:2.5rem}.ha-card--left .ha-card-figure>img{border-radius:calc(.5rem - 1px) 0 0 calc(.5rem - 1px)}.ha-card--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;text-align:right}.ha-card--right .ha-card-figure>img{border-radius:0 calc(.5rem - 1px) calc(.5rem - 1px) 0}.ha-card .ha-badge{position:absolute}.ha-badge{padding:.475rem 1.1rem;border-radius:50px;background-color:#fff;font-size:12px}.ha-badge--top-left{top:1rem;left:1rem}.ha-badge--top-center{top:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--top-right{top:1rem;right:1rem}.ha-badge--middle-left{top:50%;left:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--middle-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ha-badge--middle-right{top:50%;right:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--bottom-left{bottom:1rem;left:1rem}.ha-badge--bottom-center{bottom:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--bottom-right{right:1rem;bottom:1rem}.ha-infobox>.elementor-widget-container{padding:1.5rem}.ha-infobox-title{margin-top:0;margin-bottom:1rem;color:#151515;font-size:24px}.ha-infobox-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-infobox-figure--icon{text-align:center;font-size:3rem}.ha-icon-box-icon>i,.ha-infobox-figure>i{position:relative;display:block;width:1em;height:1em}.ha-icon-box-icon>i:before,.ha-infobox-figure>i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-card-figure>img,.ha-infobox-figure>img,.ha-member-figure img{width:100%;height:100%;vertical-align:bottom}.ha-infobox-text+.ha-btn--link{margin-top:1rem}.ha-icon-box>.elementor-widget-container{position:relative;padding:1.25rem}.ha-icon-box-title{margin-top:0;margin-bottom:0;color:#151515;font-size:24px;-webkit-transition:color .3s;transition:color .3s}.ha-icon-box-icon{display:inline-block;margin-bottom:1rem;color:#151515;text-align:center;font-size:3rem;-webkit-transition:border .3s,background .3s,color .3s,-webkit-transform .3s;transition:transform .3s,border .3s,background .3s,color .3s;transition:transform .3s,border .3s,background .3s,color .3s,-webkit-transform .3s}.ha-icon-box-icon>i{-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ha-icon-box-link{display:block;color:transparent;text-decoration:none}.ha-icon-box .ha-badge{position:absolute;z-index:9999;background-color:#e2498a;color:#fff}.ha-member>.elementor-widget-container{padding:1.25rem}.ha-member-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-member-name{margin-top:0;margin-bottom:.5rem;color:#151515;font-size:18px}.ha-member-position{margin-bottom:1.5rem;color:#7f7f7f;font-size:14px}.ha-member-bio{margin-bottom:1.5rem;font-size:14px;line-height:1.6}.ha-member-links>a{color:#9895ad;text-align:center;line-height:1;-webkit-transition:all .2s;transition:all .2s}.ha-member-links>a:focus,.ha-member-links>a:hover{color:#222}.ha-member-links>a>i{width:1em;height:1em}.ha-member-links>a:not(:last-child){margin-right:.3rem}.ha-review-header{margin-top:1.5rem}.ha-review-desc p,.ha-review-figure{margin:0}.ha-review-figure>img{width:100%;height:100%;border-radius:50%;vertical-align:bottom}.ha-review-reviewer{margin-top:0;margin-bottom:.3rem;color:#151515;font-size:18px}.ha-review-position{margin-bottom:.5rem;color:#7f7f7f;font-size:15px}.ha-review-ratting{display:inline-block;font-size:12px;line-height:1}.ha-review-ratting--num{padding:.25em .66em;border-radius:2.5em;background-color:#287dfe;color:#fff}.ha-review-ratting--star{display:inline-block;color:#ffbf36;font-family:"Fontawesome"}.ha-review-ratting--star>span{position:relative;overflow:hidden;height:1em}.ha-review-ratting--star span>span{position:absolute;top:0;left:0;overflow:hidden;padding-top:1.5em}.ha-review-ratting--star span>span:before,span .ha-review-ratting--star:before{position:absolute;top:0;left:0}.ha-review-ratting--star span:before{content:"\f006\f006\f006\f006\f006"}.ha-review-ratting--star span>span:before{content:"\f005\f005\f005\f005\f005"}.ha-review-desc{margin-top:1.5rem;font-size:16px;line-height:1.6}.ha-review--top>.elementor-widget-container{padding:2rem}.ha-review--top .ha-review-figure{display:inline-block;max-width:70px;height:70px}.ha-review--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-review--left>.elementor-widget-container,.ha-review--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding-left:2rem}.ha-review--left .ha-review-figure,.ha-review--right .ha-review-figure{-webkit-box-flex:0;-webkit-flex:0 0 150px;-ms-flex:0 0 150px;flex:0 0 150px;max-width:150px;height:150px}.ha-review--left .ha-review-body,.ha-review--right .ha-review-body{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 150px);-ms-flex:0 0 calc(100% - 150px);flex:0 0 calc(100% - 150px);padding:2rem;max-width:calc(100% - 150px)}.ha-review--left .ha-review-body>:first-child,.ha-review--right .ha-review-body>:first-child{margin-top:0}.ha-review--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:2rem;padding-left:0;text-align:right}.ha-image-compare .twentytwenty-container,.ha-image-compare .twentytwenty-wrapper{border-radius:inherit}.ha-gallery-filter{margin:0 10px 2rem;padding:0;list-style:none}.ha-gallery-filter>li{display:inline-block;margin-bottom:10px}.ha-gallery-filter>li:not(:last-child){margin-right:10px}.ha-gallery-filter>li>button{display:block;padding:10px 25px;border:2px solid #562dd4;border-radius:.25rem;background-color:transparent;color:#562dd4;text-transform:uppercase;font-size:14px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ha-gallery-filter>li>button:focus,.ha-gallery-filter>li>button:hover{outline:0;background-color:#562dd4;color:#fff}.ha-gallery-filter>.ha-filter-active>button{background-color:#562dd4;color:#fff}.ha-image-grid-item{float:left}.ha-image-grid-link{position:relative;display:block;overflow:hidden;margin:10px;text-decoration:none}.ha-image-grid-link:focus{outline:none}.ha-image-grid-link img{vertical-align:bottom;-webkit-transition:-webkit-transform .25s linear;transition:transform .25s linear;transition:transform .25s linear,-webkit-transform .25s linear}.ha-image-grid-link:hover img,.ha-justified-gallery-item:hover>img{-webkit-transform:scale(1.25);-ms-transform:scale(1.25);transform:scale(1.25)}.ha-image-grid-link:hover .ha-image-grid-content,.ha-image-grid-link:hover .ha-image-grid-overlay{opacity:1}.ha-image-grid-link:hover .ha-image-grid-content:before{width:80px}.ha-image-grid-content,.ha-image-grid-overlay{position:absolute;opacity:0;-webkit-transition:opacity .5s;transition:opacity .5s}.ha-image-grid-overlay{top:0;right:0;bottom:0;left:0;padding:30px;background-color:rgba(0,0,0,.8)}.ha-image-grid-content{width:100%;color:#fff;font-size:16px}.ha-image-grid-content:before{position:absolute;top:-15px;width:35px;height:1px;background:#fe413b;content:"";-webkit-transition:all .3s;transition:all .3s}.ha-image-grid-content--topleft{top:2.9rem;left:2rem;text-align:left}.ha-image-grid-content--topleft:before{left:0}.ha-image-grid-content--topcenter{top:2.9rem;text-align:center}.ha-image-grid-content--topcenter,.ha-image-grid-content--topcenter:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-image-grid-content--topright{top:2.9rem;right:2rem;text-align:right}.ha-image-grid-content--topright:before{right:0}.ha-image-grid-content--bottomleft{bottom:2rem;left:2rem;text-align:left}.ha-image-grid-content--bottomleft:before{left:0}.ha-image-grid-content--bottomcenter{bottom:2rem;text-align:center}.ha-image-grid-content--bottomcenter,.ha-image-grid-content--bottomcenter:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-image-grid-content--bottomright{right:2rem;bottom:2rem;text-align:right}.ha-image-grid-content--bottomright:before{right:0}.ha-image-grid-content--middleleft{top:50%;left:2rem;text-align:left;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-image-grid-content--middleleft:before{left:0}.ha-image-grid-content--middlecenter{top:50%;text-align:center}.ha-image-grid-content--middlecenter,.ha-image-grid-content--middlecenter:before{left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-image-grid-content--middleright{top:50%;right:2rem;text-align:right;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-image-grid-content--middleright:before{right:0}.ha-image-grid--col-2 .ha-image-grid-item{width:50%}.ha-image-grid--col-3 .ha-image-grid-item{width:33.33%}.ha-image-grid--col-4 .ha-image-grid-item{width:25%}.ha-image-grid--col-5 .ha-image-grid-item{width:20%}.ha-justified-gallery-item{border-radius:6px;-webkit-transition:all .3s;transition:all .3s}.ha-justified-gallery-item>img{width:100%;-webkit-transition:all .25s!important;transition:all .25s!important}.justified-gallery>a>.caption,.justified-gallery>div>.caption,.justified-gallery>figure>.caption{padding:10px;bottom:-100px!important;-webkit-transition:all .25s!important;transition:all .25s!important;-webkit-animation:haSmoothReveal .3s forwards;animation:haSmoothReveal .3s forwards}.justified-gallery>a>.caption.caption-visible,.justified-gallery>div>.caption.caption-visible,.justified-gallery>figure>.caption.caption-visible{bottom:0!important}@-webkit-keyframes haSmoothReveal{0%{-webkit-transform:translateY(100px);transform:translateY(100px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes haSmoothReveal{0%{-webkit-transform:translateY(100px);transform:translateY(100px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}.ha-skills>.elementor-widget-container{padding-top:1px}.ha-skill{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;background-color:#e9ecef;font-size:.75rem}.ha-skill--inside .ha-skill-info,.ha-skill--outside .ha-skill-info{text-align:left;font-size:14px}.ha-skill--inside .ha-skill-level-text,.ha-skill--outside .ha-skill-level-text{float:right}.ha-skill--outside{height:2px}.ha-skill--outside .ha-skill-level{position:relative}.ha-skill--outside .ha-skill-info{position:absolute;top:-25px;width:100%;color:#242424}.ha-skill--inside{overflow:hidden;height:30px;border-radius:.3rem}.ha-skill--inside .ha-skill-info{padding-right:1rem;padding-left:1rem;color:#fff}.ha-skill-level{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;background-color:#007bff;color:#fff;text-align:center;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.ha-skill--outside{margin-top:40px}.ha-skill--inside:not(:first-child){margin-top:20px}.ha-gradient-heading{margin-top:0;margin-bottom:0}.ha-gradient-heading>a{color:inherit;text-decoration:none}.ha-logo-grid-item{float:left;overflow:hidden;height:180px;border-color:#e7e7e7}.ha-logo-grid-figure{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0;padding:30px;width:100%;height:100%}.ha-logo-grid-img{max-height:100%}.ha-logo-grid--col-2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col-3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col-4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col-5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col-6 .ha-logo-grid-item{width:calc(100%/6)}@media (max-width:1024px){.ha-logo-grid--col--tablet2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col--tablet3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col--tablet4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col--tablet5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col--tablet6 .ha-logo-grid-item{width:calc(100%/6)}}@media (max-width:767px){.ha-logo-grid--col--mobile2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col--mobile3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col--mobile4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col--mobile5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col--mobile6 .ha-logo-grid-item{width:calc(100%/6)}}.ha-logo-grid--tictactoe .ha-logo-grid-item{border-width:2px 2px 0 0;border-style:solid}.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0}@media (max-width:1024px){.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0}}@media (max-width:767px){.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n){border-right-width:0}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0}}.ha-logo-grid--border{border-radius:.5rem}.ha-logo-grid--border .ha-logo-grid-item{border-width:0 2px 2px 0;border-style:solid}.ha-logo-grid--border .ha-logo-grid-item:first-child{border-top-left-radius:10px}.ha-logo-grid--border .ha-logo-grid-item:last-child{border-bottom-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}@media (max-width:1024px){.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}}@media (max-width:767px){.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}}.ha-logo-grid--box .ha-logo-grid-wrapper{margin:-.5rem}.ha-logo-grid--box .ha-logo-grid-item{margin:.5rem;border-width:2px;border-style:solid;border-radius:.5rem}.ha-logo-grid--box.ha-logo-grid--col-2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}@media (max-width:1024px){.ha-logo-grid--box.ha-logo-grid--col--tablet2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}}@media (max-width:767px){.ha-logo-grid--box.ha-logo-grid--col--mobile2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}}.ha-dual-button>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-btn,.ha-dual-btn-connector{display:inline-block}.ha-dual-btn-wrapper{position:relative;text-align:center;font-weight:400}.ha-dual-btn{padding:1.2rem 3rem;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{border-top-left-radius:50px;border-bottom-left-radius:50px;background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab}.ha-dual-btn--right{border-top-right-radius:50px;border-bottom-right-radius:50px;background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e}.ha-dual-btn-connector{position:absolute!important;top:50%;right:0;z-index:9;width:30px;height:30px;border-radius:100%;background-color:#fff;box-shadow:0 0 0 5px rgba(255,255,255,.3);color:#27374c;text-transform:uppercase;font-size:12px;line-height:30px;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%)}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}.ha-testimonial--basic>.elementor-widget-container{padding:2rem;border:1px solid #ececec;border-radius:.5rem}.ha-testimonial--basic .ha-testimonial__content{margin-bottom:2.5em}.ha-testimonial--bubble .ha-testimonial__content{position:relative;margin-bottom:1.5rem;padding:2rem;border-radius:6px;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);line-height:1.6rem}.ha-testimonial--bubble .ha-testimonial__content:after{position:absolute;bottom:-14px;color:#fff;content:"\e911";font-style:normal;font-size:36px;font-family:"Happy Icons";-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.ha-testimonial--left.ha-testimonial--bubble .ha-testimonial__content:after{left:15px}.ha-testimonial--center.ha-testimonial--bubble .ha-testimonial__content:after{left:50%;-webkit-transform:translateX(-50%) rotate(-180deg);-ms-transform:translateX(-50%) rotate(-180deg);transform:translateX(-50%) rotate(-180deg)}.ha-testimonial--right.ha-testimonial--bubble .ha-testimonial__content:after{right:15px}.ha-testimonial__reviewer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{width:65px;height:65px}.ha-testimonial__reviewer-thumb>img{width:100%;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover}.ha-testimonial__reviewer-name{margin-bottom:.3rem;color:#562dd4;font-weight:700;font-size:18px}.ha-testimonial__reviewer-title{color:#8c8c8c;font-size:16px}.ha-testimonial--left .ha-testimonial__reviewer-meta{padding-left:1em}.ha-testimonial--center .ha-testimonial__reviewer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-testimonial--center .ha-testimonial__reviewer-meta{padding-top:1em}.ha-testimonial--right .ha-testimonial__reviewer{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-testimonial--right .ha-testimonial__reviewer-meta{padding-right:1em}.ha-testimonial--left{text-align:left}.ha-testimonial--right{text-align:right}.ha-testimonial--center{text-align:center}.ha-number-body .ha-number-border{position:relative;display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding:6px;width:50px;height:50px;border-radius:100%;background:#c36;color:#fff;text-align:center;font-size:20px}.ha-number-body .ha-number-border .ha-number-border-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ha-number-body .ha-number-border span{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}
assets/js/happy-addons.js CHANGED
@@ -8,6 +8,23 @@ window.Happy = window.Happy || {};
8
  return this.data('happy-settings');
9
  };
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
  Happy.initImageComparison = function($scope) {
12
  var $item = $scope.find('.hajs-image-comparison'),
13
  settings = $item.getHappySettings(),
@@ -24,29 +41,42 @@ window.Happy = window.Happy || {};
24
  });
25
  };
26
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
27
  $window.on('elementor/frontend/init', function() {
28
  var HappyEffects = elementorModules.frontend.handlers.Base.extend({
29
  onInit: function() {
30
  elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
 
31
  this.run();
32
  },
33
 
34
- getWrapper: function() {
35
- return this.$element.find('.elementor-widget-container')[0];
36
- },
37
-
38
- factoryReset: function() {
39
- anime.remove(this.getWrapper());
40
- this.getWrapper() && this.getWrapper().removeAttribute('style');
41
- },
42
-
43
- onDestroy: function() {
44
- elementorModules.frontend.handlers.Base.prototype.onDestroy.apply(this, arguments);
45
- this.factoryReset();
46
  },
47
 
48
  onElementChange: function() {
49
- this.factoryReset();
50
  this.run();
51
  },
52
 
@@ -55,12 +85,7 @@ window.Happy = window.Happy || {};
55
  },
56
 
57
  run: function() {
58
- var config = {
59
- targets: this.getWrapper(),
60
- loop: true,
61
- direction: 'alternate',
62
- easing: 'easeInOutSine',
63
- };
64
 
65
  if (this.getConfig('translate_toggle')) {
66
  if (this.getConfig('translate_x.size') || this.getConfig('translate_x.sizes.to')) {
@@ -121,8 +146,8 @@ window.Happy = window.Happy || {};
121
  }
122
 
123
  if (this.getConfig('translate_toggle') || this.getConfig('rotate_toggle') || this.getConfig('scale_toggle')) {
124
- this.getWrapper() && this.getWrapper().style.setProperty('will-change', 'transform');
125
- anime(config);
126
  }
127
  }
128
  });
@@ -131,7 +156,10 @@ window.Happy = window.Happy || {};
131
  'frontend/element_ready/ha-image-compare.default',
132
  Happy.initImageComparison
133
  );
134
-
 
 
 
135
  elementorFrontend.hooks.addAction(
136
  'frontend/element_ready/widget',
137
  function($scope) {
8
  return this.data('happy-settings');
9
  };
10
 
11
+ function initFilterable($scope, filterFn) {
12
+ var $filterable = $scope.find('.hajs-gallery-filter');
13
+ if ($filterable.length) {
14
+ $filterable.on('click', 'button', function(event) {
15
+ event.stopPropagation();
16
+
17
+ var $current = $(this);
18
+ $current
19
+ .parent()
20
+ .addClass('ha-filter-active')
21
+ .siblings()
22
+ .removeClass('ha-filter-active');
23
+ filterFn($current.data('filter'));
24
+ });
25
+ }
26
+ }
27
+
28
  Happy.initImageComparison = function($scope) {
29
  var $item = $scope.find('.hajs-image-comparison'),
30
  settings = $item.getHappySettings(),
41
  });
42
  };
43
 
44
+ Happy.initJustifiedGallery = function($scope) {
45
+ var $item = $scope.find('.hajs-justified-gallery'),
46
+ settings = $item.getHappySettings()
47
+ $item.justifiedGallery($.extend({}, {
48
+ rowHeight: 150,
49
+ lastRow: 'justify',
50
+ margins: 10,
51
+ }, settings));
52
+
53
+ initFilterable($scope, function(filter) {
54
+ $item.justifiedGallery({
55
+ lastRow: (filter === '*' ? settings.lastRow : 'nojustify'),
56
+ filter: filter
57
+ });
58
+ });
59
+ };
60
+
61
  $window.on('elementor/frontend/init', function() {
62
  var HappyEffects = elementorModules.frontend.handlers.Base.extend({
63
  onInit: function() {
64
  elementorModules.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
65
+ this.$container = this.$element.find('.elementor-widget-container')[0];
66
  this.run();
67
  },
68
 
69
+ getDefaultSettings: function() {
70
+ return {
71
+ targets: this.$container,
72
+ loop: true,
73
+ direction: 'alternate',
74
+ easing: 'easeInOutSine',
75
+ };
 
 
 
 
 
76
  },
77
 
78
  onElementChange: function() {
79
+ this.animation && this.animation.restart();
80
  this.run();
81
  },
82
 
85
  },
86
 
87
  run: function() {
88
+ var config = this.getDefaultSettings();
 
 
 
 
 
89
 
90
  if (this.getConfig('translate_toggle')) {
91
  if (this.getConfig('translate_x.size') || this.getConfig('translate_x.sizes.to')) {
146
  }
147
 
148
  if (this.getConfig('translate_toggle') || this.getConfig('rotate_toggle') || this.getConfig('scale_toggle')) {
149
+ this.$container.style.setProperty('will-change', 'transform');
150
+ this.animation = anime(config);
151
  }
152
  }
153
  });
156
  'frontend/element_ready/ha-image-compare.default',
157
  Happy.initImageComparison
158
  );
159
+ elementorFrontend.hooks.addAction(
160
+ 'frontend/element_ready/ha-justified-gallery.default',
161
+ Happy.initJustifiedGallery
162
+ );
163
  elementorFrontend.hooks.addAction(
164
  'frontend/element_ready/widget',
165
  function($scope) {
assets/js/happy-addons.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";window.Happy=window.Happy||{},function(t,e,i){var s=t(i);t.fn.getHappySettings=function(){return this.data("happy-settings")},e.initImageComparison=function(t){var e=t.find(".hajs-image-comparison"),i=e.getHappySettings();i[{on_hover:"move_slider_on_hover",on_swipe:"move_with_handle_only",on_click:"click_to_move"}[i.move_handle||"on_swipe"]]=!0,delete i.move_handle,e.imagesLoaded().done(function(){e.twentytwenty(i)})},s.on("elementor/frontend/init",function(){var t=elementorModules.frontend.handlers.Base.extend({onInit:function(){elementorModules.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.run()},getWrapper:function(){return this.$element.find(".elementor-widget-container")[0]},factoryReset:function(){anime.remove(this.getWrapper()),this.getWrapper()&&this.getWrapper().removeAttribute("style")},onDestroy:function(){elementorModules.frontend.handlers.Base.prototype.onDestroy.apply(this,arguments),this.factoryReset()},onElementChange:function(){this.factoryReset(),this.run()},getConfig:function(t){return this.getElementSettings("ha_floating_fx_"+t)},run:function(){var t={targets:this.getWrapper(),loop:!0,direction:"alternate",easing:"easeInOutSine"};this.getConfig("translate_toggle")&&((this.getConfig("translate_x.size")||this.getConfig("translate_x.sizes.to"))&&(t.translateX={value:[this.getConfig("translate_x.sizes.from")||0,this.getConfig("translate_x.size")||this.getConfig("translate_x.sizes.to")],duration:this.getConfig("translate_duration.size"),delay:this.getConfig("translate_delay.size")||0}),(this.getConfig("translate_y.size")||this.getConfig("translate_y.sizes.to"))&&(t.translateY={value:[this.getConfig("translate_y.sizes.from")||0,this.getConfig("translate_y.size")||this.getConfig("translate_y.sizes.to")],duration:this.getConfig("translate_duration.size"),delay:this.getConfig("translate_delay.size")||0})),this.getConfig("rotate_toggle")&&((this.getConfig("rotate_x.size")||this.getConfig("rotate_x.sizes.to"))&&(t.rotateX={value:[this.getConfig("rotate_x.sizes.from")||0,this.getConfig("rotate_x.size")||this.getConfig("rotate_x.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0}),(this.getConfig("rotate_y.size")||this.getConfig("rotate_y.sizes.to"))&&(t.rotateY={value:[this.getConfig("rotate_y.sizes.from")||0,this.getConfig("rotate_y.size")||this.getConfig("rotate_y.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0}),(this.getConfig("rotate_z.size")||this.getConfig("rotate_z.sizes.to"))&&(t.rotateZ={value:[this.getConfig("rotate_z.sizes.from")||0,this.getConfig("rotate_z.size")||this.getConfig("rotate_z.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0})),this.getConfig("scale_toggle")&&((this.getConfig("scale_x.size")||this.getConfig("scale_x.sizes.to"))&&(t.scaleX={value:[this.getConfig("scale_x.sizes.from")||0,this.getConfig("scale_x.size")||this.getConfig("scale_x.sizes.to")],duration:this.getConfig("scale_duration.size"),delay:this.getConfig("scale_delay.size")||0}),(this.getConfig("scale_y.size")||this.getConfig("scale_y.sizes.to"))&&(t.scaleY={value:[this.getConfig("scale_y.sizes.from")||0,this.getConfig("scale_y.size")||this.getConfig("scale_y.sizes.to")],duration:this.getConfig("scale_duration.size"),delay:this.getConfig("scale_delay.size")||0})),(this.getConfig("translate_toggle")||this.getConfig("rotate_toggle")||this.getConfig("scale_toggle"))&&(this.getWrapper()&&this.getWrapper().style.setProperty("will-change","transform"),anime(t))}});elementorFrontend.hooks.addAction("frontend/element_ready/ha-image-compare.default",e.initImageComparison),elementorFrontend.hooks.addAction("frontend/element_ready/widget",function(e){elementorFrontend.elementsHandler.addHandler(t,{$element:e})})})}(jQuery,Happy,window);
1
+ "use strict";window.Happy=window.Happy||{},function(t,e,i){function n(e,i){var n=e.find(".hajs-gallery-filter");n.length&&n.on("click","button",function(e){e.stopPropagation();var n=t(this);n.parent().addClass("ha-filter-active").siblings().removeClass("ha-filter-active"),i(n.data("filter"))})}var s=t(i);t.fn.getHappySettings=function(){return this.data("happy-settings")},e.initImageComparison=function(t){var e=t.find(".hajs-image-comparison"),i=e.getHappySettings();i[{on_hover:"move_slider_on_hover",on_swipe:"move_with_handle_only",on_click:"click_to_move"}[i.move_handle||"on_swipe"]]=!0,delete i.move_handle,e.imagesLoaded().done(function(){e.twentytwenty(i)})},e.initJustifiedGallery=function(e){var i=e.find(".hajs-justified-gallery"),s=i.getHappySettings();i.justifiedGallery(t.extend({},{rowHeight:150,lastRow:"justify",margins:10},s)),n(e,function(t){i.justifiedGallery({lastRow:"*"===t?s.lastRow:"nojustify",filter:t})})},s.on("elementor/frontend/init",function(){var t=elementorModules.frontend.handlers.Base.extend({onInit:function(){elementorModules.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.$container=this.$element.find(".elementor-widget-container")[0],this.run()},getDefaultSettings:function(){return{targets:this.$container,loop:!0,direction:"alternate",easing:"easeInOutSine"}},onElementChange:function(){this.animation&&this.animation.restart(),this.run()},getConfig:function(t){return this.getElementSettings("ha_floating_fx_"+t)},run:function(){var t=this.getDefaultSettings();this.getConfig("translate_toggle")&&((this.getConfig("translate_x.size")||this.getConfig("translate_x.sizes.to"))&&(t.translateX={value:[this.getConfig("translate_x.sizes.from")||0,this.getConfig("translate_x.size")||this.getConfig("translate_x.sizes.to")],duration:this.getConfig("translate_duration.size"),delay:this.getConfig("translate_delay.size")||0}),(this.getConfig("translate_y.size")||this.getConfig("translate_y.sizes.to"))&&(t.translateY={value:[this.getConfig("translate_y.sizes.from")||0,this.getConfig("translate_y.size")||this.getConfig("translate_y.sizes.to")],duration:this.getConfig("translate_duration.size"),delay:this.getConfig("translate_delay.size")||0})),this.getConfig("rotate_toggle")&&((this.getConfig("rotate_x.size")||this.getConfig("rotate_x.sizes.to"))&&(t.rotateX={value:[this.getConfig("rotate_x.sizes.from")||0,this.getConfig("rotate_x.size")||this.getConfig("rotate_x.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0}),(this.getConfig("rotate_y.size")||this.getConfig("rotate_y.sizes.to"))&&(t.rotateY={value:[this.getConfig("rotate_y.sizes.from")||0,this.getConfig("rotate_y.size")||this.getConfig("rotate_y.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0}),(this.getConfig("rotate_z.size")||this.getConfig("rotate_z.sizes.to"))&&(t.rotateZ={value:[this.getConfig("rotate_z.sizes.from")||0,this.getConfig("rotate_z.size")||this.getConfig("rotate_z.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0})),this.getConfig("scale_toggle")&&((this.getConfig("scale_x.size")||this.getConfig("scale_x.sizes.to"))&&(t.scaleX={value:[this.getConfig("scale_x.sizes.from")||0,this.getConfig("scale_x.size")||this.getConfig("scale_x.sizes.to")],duration:this.getConfig("scale_duration.size"),delay:this.getConfig("scale_delay.size")||0}),(this.getConfig("scale_y.size")||this.getConfig("scale_y.sizes.to"))&&(t.scaleY={value:[this.getConfig("scale_y.sizes.from")||0,this.getConfig("scale_y.size")||this.getConfig("scale_y.sizes.to")],duration:this.getConfig("scale_duration.size"),delay:this.getConfig("scale_delay.size")||0})),(this.getConfig("translate_toggle")||this.getConfig("rotate_toggle")||this.getConfig("scale_toggle"))&&(this.$container.style.setProperty("will-change","transform"),this.animation=anime(t))}});elementorFrontend.hooks.addAction("frontend/element_ready/ha-image-compare.default",e.initImageComparison),elementorFrontend.hooks.addAction("frontend/element_ready/ha-justified-gallery.default",e.initJustifiedGallery),elementorFrontend.hooks.addAction("frontend/element_ready/widget",function(e){elementorFrontend.elementsHandler.addHandler(t,{$element:e})})})}(jQuery,Happy,window);
assets/vendor/justifiedGallery/css/justifiedGallery.min.css ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * justifiedGallery - v3.7.0
3
+ * http://miromannino.github.io/Justified-Gallery/
4
+ * Copyright (c) 2018 Miro Mannino
5
+ * Licensed under the MIT license.
6
+ */
7
+ .justified-gallery {
8
+ width: 100%;
9
+ position: relative;
10
+ overflow: hidden;
11
+ }
12
+ .justified-gallery > a,
13
+ .justified-gallery > div,
14
+ .justified-gallery > figure {
15
+ position: absolute;
16
+ display: inline-block;
17
+ overflow: hidden;
18
+ /* background: #888888; To have gray placeholders while the gallery is loading with waitThumbnailsLoad = false */
19
+ filter: "alpha(opacity=10)";
20
+ opacity: 0.1;
21
+ margin: 0;
22
+ padding: 0;
23
+ }
24
+ .justified-gallery > a > img,
25
+ .justified-gallery > div > img,
26
+ .justified-gallery > figure > img,
27
+ .justified-gallery > a > a > img,
28
+ .justified-gallery > div > a > img,
29
+ .justified-gallery > figure > a > img {
30
+ position: absolute;
31
+ top: 50%;
32
+ left: 50%;
33
+ margin: 0;
34
+ padding: 0;
35
+ border: none;
36
+ filter: "alpha(opacity=0)";
37
+ opacity: 0;
38
+ }
39
+ .justified-gallery > a > .caption,
40
+ .justified-gallery > div > .caption,
41
+ .justified-gallery > figure > .caption {
42
+ display: none;
43
+ position: absolute;
44
+ bottom: 0;
45
+ padding: 5px;
46
+ background-color: #000000;
47
+ left: 0;
48
+ right: 0;
49
+ margin: 0;
50
+ color: white;
51
+ font-size: 12px;
52
+ font-weight: 300;
53
+ font-family: sans-serif;
54
+ }
55
+ .justified-gallery > a > .caption.caption-visible,
56
+ .justified-gallery > div > .caption.caption-visible,
57
+ .justified-gallery > figure > .caption.caption-visible {
58
+ display: initial;
59
+ filter: "alpha(opacity=70)";
60
+ opacity: 0.7;
61
+ -webkit-transition: opacity 500ms ease-in;
62
+ -moz-transition: opacity 500ms ease-in;
63
+ -o-transition: opacity 500ms ease-in;
64
+ transition: opacity 500ms ease-in;
65
+ }
66
+ .justified-gallery > .entry-visible {
67
+ filter: "alpha(opacity=100)";
68
+ opacity: 1;
69
+ background: none;
70
+ }
71
+ .justified-gallery > .entry-visible > img,
72
+ .justified-gallery > .entry-visible > a > img {
73
+ filter: "alpha(opacity=100)";
74
+ opacity: 1;
75
+ -webkit-transition: opacity 500ms ease-in;
76
+ -moz-transition: opacity 500ms ease-in;
77
+ -o-transition: opacity 500ms ease-in;
78
+ transition: opacity 500ms ease-in;
79
+ }
80
+ .justified-gallery > .jg-filtered {
81
+ display: none;
82
+ }
83
+ .justified-gallery > .spinner {
84
+ position: absolute;
85
+ bottom: 0;
86
+ margin-left: -24px;
87
+ padding: 10px 0 10px 0;
88
+ left: 50%;
89
+ filter: "alpha(opacity=100)";
90
+ opacity: 1;
91
+ overflow: initial;
92
+ }
93
+ .justified-gallery > .spinner > span {
94
+ display: inline-block;
95
+ filter: "alpha(opacity=0)";
96
+ opacity: 0;
97
+ width: 8px;
98
+ height: 8px;
99
+ margin: 0 4px 0 4px;
100
+ background-color: #000;
101
+ border-radius: 6px;
102
+ }
assets/vendor/justifiedGallery/js/jquery.justifiedGallery.min.js ADDED
@@ -0,0 +1,8 @@
 
 
 
 
 
 
 
 
1
+ /*!
2
+ * justifiedGallery - v3.7.0
3
+ * http://miromannino.github.io/Justified-Gallery/
4
+ * Copyright (c) 2018 Miro Mannino
5
+ * Licensed under the MIT license.
6
+ */
7
+
8
+ !function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,i){return void 0===i&&(i="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(i),i}:e(jQuery)}(function(g){var r=function(t,i){this.settings=i,this.checkSettings(),this.imgAnalyzerTimeout=null,this.entries=null,this.buildingRow={entriesBuff:[],width:0,height:0,aspectRatio:0},this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.yield={every:2,flushed:0},this.border=0<=i.border?i.border:i.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges(),this.offY=this.border,this.rows=0,this.spinner={phase:0,timeSlot:150,$el:g('<div class="spinner"><span></span><span></span><span></span></div>'),intervalId:null},this.scrollBarOn=!1,this.checkWidthIntervalId=null,this.galleryWidth=t.width(),this.$gallery=t};r.prototype.getSuffix=function(t,i){var e,s;for(e=i<t?t:i,s=0;s<this.suffixRanges.length;s++)if(e<=this.suffixRanges[s])return this.settings.sizeRangeSuffixes[this.suffixRanges[s]];return this.settings.sizeRangeSuffixes[this.suffixRanges[s-1]]},r.prototype.removeSuffix=function(t,i){return t.substring(0,t.length-i.length)},r.prototype.endsWith=function(t,i){return-1!==t.indexOf(i,t.length-i.length)},r.prototype.getUsedSuffix=function(t){for(var i in this.settings.sizeRangeSuffixes)if(this.settings.sizeRangeSuffixes.hasOwnProperty(i)){if(0===this.settings.sizeRangeSuffixes[i].length)continue;if(this.endsWith(t,this.settings.sizeRangeSuffixes[i]))return this.settings.sizeRangeSuffixes[i]}return""},r.prototype.newSrc=function(t,i,e,s){var n;if(this.settings.thumbnailPath)n=this.settings.thumbnailPath(t,i,e,s);else{var r=t.match(this.settings.extension),o=null!==r?r[0]:"";n=t.replace(this.settings.extension,""),n=this.removeSuffix(n,this.getUsedSuffix(n)),n+=this.getSuffix(i,e)+o}return n},r.prototype.showImg=function(t,i){this.settings.cssAnimation?(t.addClass("entry-visible"),i&&i()):(t.stop().fadeTo(this.settings.imagesAnimationDuration,1,i),t.find(this.settings.imgSelector).stop().fadeTo(this.settings.imagesAnimationDuration,1,i))},r.prototype.extractImgSrcFromImage=function(t){var i=void 0!==t.data("safe-src")?t.data("safe-src"):t.attr("src");return t.data("jg.originalSrc",i),i},r.prototype.imgFromEntry=function(t){var i=t.find(this.settings.imgSelector);return 0===i.length?null:i},r.prototype.captionFromEntry=function(t){var i=t.find("> .caption");return 0===i.length?null:i},r.prototype.displayEntry=function(t,i,e,s,n,r){t.width(s),t.height(r),t.css("top",e),t.css("left",i);var o=this.imgFromEntry(t);if(null!==o){o.css("width",s),o.css("height",n),o.css("margin-left",-s/2),o.css("margin-top",-n/2);var a=o.attr("src"),h=this.newSrc(a,s,n,o[0]);o.one("error",function(){o.attr("src",o.data("jg.originalSrc"))});var l=function(){a!==h&&o.attr("src",h)};"skipped"===t.data("jg.loaded")?this.onImageEvent(a,g.proxy(function(){this.showImg(t,l),t.data("jg.loaded",!0)},this)):this.showImg(t,l)}else this.showImg(t);this.displayEntryCaption(t)},r.prototype.displayEntryCaption=function(t){var i=this.imgFromEntry(t);if(null!==i&&this.settings.captions){var e=this.captionFromEntry(t);if(null===e){var s=i.attr("alt");this.isValidCaption(s)||(s=t.attr("title")),this.isValidCaption(s)&&(e=g('<div class="caption">'+s+"</div>"),t.append(e),t.data("jg.createdCaption",!0))}null!==e&&(this.settings.cssAnimation||e.stop().fadeTo(0,this.settings.captionSettings.nonVisibleOpacity),this.addCaptionEventsHandlers(t))}else this.removeCaptionEventsHandlers(t)},r.prototype.isValidCaption=function(t){return void 0!==t&&0<t.length},r.prototype.onEntryMouseEnterForCaption=function(t){var i=this.captionFromEntry(g(t.currentTarget));this.settings.cssAnimation?i.addClass("caption-visible").removeClass("caption-hidden"):i.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.visibleOpacity)},r.prototype.onEntryMouseLeaveForCaption=function(t){var i=this.captionFromEntry(g(t.currentTarget));this.settings.cssAnimation?i.removeClass("caption-visible").removeClass("caption-hidden"):i.stop().fadeTo(this.settings.captionSettings.animationDuration,this.settings.captionSettings.nonVisibleOpacity)},r.prototype.addCaptionEventsHandlers=function(t){var i=t.data("jg.captionMouseEvents");void 0===i&&(i={mouseenter:g.proxy(this.onEntryMouseEnterForCaption,this),mouseleave:g.proxy(this.onEntryMouseLeaveForCaption,this)},t.on("mouseenter",void 0,void 0,i.mouseenter),t.on("mouseleave",void 0,void 0,i.mouseleave),t.data("jg.captionMouseEvents",i))},r.prototype.removeCaptionEventsHandlers=function(t){var i=t.data("jg.captionMouseEvents");void 0!==i&&(t.off("mouseenter",void 0,i.mouseenter),t.off("mouseleave",void 0,i.mouseleave),t.removeData("jg.captionMouseEvents"))},r.prototype.clearBuildingRow=function(){this.buildingRow.entriesBuff=[],this.buildingRow.aspectRatio=0,this.buildingRow.width=0},r.prototype.prepareBuildingRow=function(t){var i,e,s,n,r,o=!0,a=0,h=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*this.settings.margins,l=h/this.buildingRow.aspectRatio,g=this.settings.rowHeight,u=this.buildingRow.width/h>this.settings.justifyThreshold;if(t&&"hide"===this.settings.lastRow&&!u){for(i=0;i<this.buildingRow.entriesBuff.length;i++)e=this.buildingRow.entriesBuff[i],this.settings.cssAnimation?e.removeClass("entry-visible"):(e.stop().fadeTo(0,.1),e.find("> img, > a > img").fadeTo(0,0));return-1}for(t&&!u&&"justify"!==this.settings.lastRow&&"hide"!==this.settings.lastRow&&(o=!1,0<this.rows&&(o=(g=(this.offY-this.border-this.settings.margins*this.rows)/this.rows)*this.buildingRow.aspectRatio/h>this.settings.justifyThreshold)),i=0;i<this.buildingRow.entriesBuff.length;i++)s=(e=this.buildingRow.entriesBuff[i]).data("jg.width")/e.data("jg.height"),o?(n=i===this.buildingRow.entriesBuff.length-1?h:l*s,r=l):(n=g*s,r=g),h-=Math.round(n),e.data("jg.jwidth",Math.round(n)),e.data("jg.jheight",Math.ceil(r)),(0===i||r<a)&&(a=r);return this.buildingRow.height=a,o},r.prototype.flushRow=function(t){var i,e,s,n=this.settings,r=this.border;if(e=this.prepareBuildingRow(t),t&&"hide"===n.lastRow&&-1===e)this.clearBuildingRow();else{if(this.maxRowHeight&&this.maxRowHeight<this.buildingRow.height&&(this.buildingRow.height=this.maxRowHeight),t&&("center"===n.lastRow||"right"===n.lastRow)){var o=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*n.margins;for(s=0;s<this.buildingRow.entriesBuff.length;s++)o-=(i=this.buildingRow.entriesBuff[s]).data("jg.jwidth");"center"===n.lastRow?r+=o/2:"right"===n.lastRow&&(r+=o)}var a=this.buildingRow.entriesBuff.length-1;for(s=0;s<=a;s++)i=this.buildingRow.entriesBuff[this.settings.rtl?a-s:s],this.displayEntry(i,r,this.offY,i.data("jg.jwidth"),i.data("jg.jheight"),this.buildingRow.height),r+=i.data("jg.jwidth")+n.margins;this.galleryHeightToSet=this.offY+this.buildingRow.height+this.border,this.setGalleryTempHeight(this.galleryHeightToSet+this.getSpinnerHeight()),(!t||this.buildingRow.height<=n.rowHeight&&e)&&(this.offY+=this.buildingRow.height+n.margins,this.rows+=1,this.clearBuildingRow(),this.settings.triggerEvent.call(this,"jg.rowflush"))}};var i=0;function e(){return g("body").height()>g(window).height()}r.prototype.rememberGalleryHeight=function(){i=this.$gallery.height(),this.$gallery.height(i)},r.prototype.setGalleryTempHeight=function(t){i=Math.max(t,i),this.$gallery.height(i)},r.prototype.setGalleryFinalHeight=function(t){i=t,this.$gallery.height(t)},r.prototype.checkWidth=function(){this.checkWidthIntervalId=setInterval(g.proxy(function(){if(this.$gallery.is(":visible")){var t=parseFloat(this.$gallery.width());e()===this.scrollBarOn?Math.abs(t-this.galleryWidth)>this.settings.refreshSensitivity&&(this.galleryWidth=t,this.rewind(),this.rememberGalleryHeight(),this.startImgAnalyzer(!0)):(this.scrollBarOn=e(),this.galleryWidth=t)}},this),this.settings.refreshTime)},r.prototype.isSpinnerActive=function(){return null!==this.spinner.intervalId},r.prototype.getSpinnerHeight=function(){return this.spinner.$el.innerHeight()},r.prototype.stopLoadingSpinnerAnimation=function(){clearInterval(this.spinner.intervalId),this.spinner.intervalId=null,this.setGalleryTempHeight(this.$gallery.height()-this.getSpinnerHeight()),this.spinner.$el.detach()},r.prototype.startLoadingSpinnerAnimation=function(){var t=this.spinner,i=t.$el.find("span");clearInterval(t.intervalId),this.$gallery.append(t.$el),this.setGalleryTempHeight(this.offY+this.buildingRow.height+this.getSpinnerHeight()),t.intervalId=setInterval(function(){t.phase<i.length?i.eq(t.phase).fadeTo(t.timeSlot,1):i.eq(t.phase-i.length).fadeTo(t.timeSlot,0),t.phase=(t.phase+1)%(2*i.length)},t.timeSlot)},r.prototype.rewind=function(){this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.offY=this.border,this.rows=0,this.clearBuildingRow()},r.prototype.updateEntries=function(t){var i;return t&&null!=this.lastFetchedEntry?i=g(this.lastFetchedEntry).nextAll(this.settings.selector).toArray():(this.entries=[],i=this.$gallery.children(this.settings.selector).toArray()),0<i.length&&(g.isFunction(this.settings.sort)?i=this.sortArray(i):this.settings.randomize&&(i=this.shuffleArray(i)),this.lastFetchedEntry=i[i.length-1],this.settings.filter?i=this.filterArray(i):this.resetFilters(i)),this.entries=this.entries.concat(i),!0},r.prototype.insertToGallery=function(t){var i=this;g.each(t,function(){g(this).appendTo(i.$gallery)})},r.prototype.shuffleArray=function(t){var i,e,s;for(i=t.length-1;0<i;i--)e=Math.floor(Math.random()*(i+1)),s=t[i],t[i]=t[e],t[e]=s;return this.insertToGallery(t),t},r.prototype.sortArray=function(t){return t.sort(this.settings.sort),this.insertToGallery(t),t},r.prototype.resetFilters=function(t){for(var i=0;i<t.length;i++)g(t[i]).removeClass("jg-filtered")},r.prototype.filterArray=function(t){var e=this.settings;if("string"===g.type(e.filter))return t.filter(function(t){var i=g(t);return i.is(e.filter)?(i.removeClass("jg-filtered"),!0):(i.addClass("jg-filtered").removeClass("jg-visible"),!1)});if(g.isFunction(e.filter)){for(var i=t.filter(e.filter),s=0;s<t.length;s++)-1===i.indexOf(t[s])?g(t[s]).addClass("jg-filtered").removeClass("jg-visible"):g(t[s]).removeClass("jg-filtered");return i}},r.prototype.destroy=function(){clearInterval(this.checkWidthIntervalId),g.each(this.entries,g.proxy(function(t,i){var e=g(i);e.css("width",""),e.css("height",""),e.css("top",""),e.css("left",""),e.data("jg.loaded",void 0),e.removeClass("jg-entry");var s=this.imgFromEntry(e);s.css("width",""),s.css("height",""),s.css("margin-left",""),s.css("margin-top",""),s.attr("src",s.data("jg.originalSrc")),s.data("jg.originalSrc",void 0),this.removeCaptionEventsHandlers(e);var n=this.captionFromEntry(e);e.data("jg.createdCaption")?(e.data("jg.createdCaption",void 0),null!==n&&n.remove()):null!==n&&n.fadeTo(0,1)},this)),this.$gallery.css("height",""),this.$gallery.removeClass("justified-gallery"),this.$gallery.data("jg.controller",void 0)},r.prototype.analyzeImages=function(t){for(var i=this.lastAnalyzedIndex+1;i<this.entries.length;i++){var e=g(this.entries[i]);if(!0===e.data("jg.loaded")||"skipped"===e.data("jg.loaded")){var s=this.galleryWidth-2*this.border-(this.buildingRow.entriesBuff.length-1)*this.settings.margins,n=e.data("jg.width")/e.data("jg.height");if(s/(this.buildingRow.aspectRatio+n)<this.settings.rowHeight&&(this.flushRow(!1),++this.yield.flushed>=this.yield.every))return void this.startImgAnalyzer(t);this.buildingRow.entriesBuff.push(e),this.buildingRow.aspectRatio+=n,this.buildingRow.width+=n*this.settings.rowHeight,this.lastAnalyzedIndex=i}else if("error"!==e.data("jg.loaded"))return}0<this.buildingRow.entriesBuff.length&&this.flushRow(!0),this.isSpinnerActive()&&this.stopLoadingSpinnerAnimation(),this.stopImgAnalyzerStarter(),this.settings.triggerEvent.call(this,t?"jg.resize":"jg.complete"),this.setGalleryFinalHeight(this.galleryHeightToSet)},r.prototype.stopImgAnalyzerStarter=function(){this.yield.flushed=0,null!==this.imgAnalyzerTimeout&&(clearTimeout(this.imgAnalyzerTimeout),this.imgAnalyzerTimeout=null)},r.prototype.startImgAnalyzer=function(t){var i=this;this.stopImgAnalyzerStarter(),this.imgAnalyzerTimeout=setTimeout(function(){i.analyzeImages(t)},.001)},r.prototype.onImageEvent=function(t,i,e){if(i||e){var s=new Image,n=g(s);i&&n.one("load",function(){n.off("load error"),i(s)}),e&&n.one("error",function(){n.off("load error"),e(s)}),s.src=t}},r.prototype.init=function(){var a=!1,h=!1,l=this;g.each(this.entries,function(t,i){var e=g(i),s=l.imgFromEntry(e);if(e.addClass("jg-entry"),!0!==e.data("jg.loaded")&&"skipped"!==e.data("jg.loaded"))if(null!==l.settings.rel&&e.attr("rel",l.settings.rel),null!==l.settings.target&&e.attr("target",l.settings.target),null!==s){var n=l.extractImgSrcFromImage(s);if(s.attr("src",n),!1===l.settings.waitThumbnailsLoad){var r=parseFloat(s.prop("width")),o=parseFloat(s.prop("height"));if(!isNaN(r)&&!isNaN(o))return e.data("jg.width",r),e.data("jg.height",o),e.data("jg.loaded","skipped"),h=!0,l.startImgAnalyzer(!1),!0}e.data("jg.loaded",!1),a=!0,l.isSpinnerActive()||l.startLoadingSpinnerAnimation(),l.onImageEvent(n,function(t){e.data("jg.width",t.width),e.data("jg.height",t.height),e.data("jg.loaded",!0),l.startImgAnalyzer(!1)},function(){e.data("jg.loaded","error"),l.startImgAnalyzer(!1)})}else e.data("jg.loaded",!0),e.data("jg.width",e.width()|parseFloat(e.css("width"))|1),e.data("jg.height",e.height()|parseFloat(e.css("height"))|1)}),a||h||this.startImgAnalyzer(!1),this.checkWidth()},r.prototype.checkOrConvertNumber=function(t,i){if("string"===g.type(t[i])&&(t[i]=parseFloat(t[i])),"number"!==g.type(t[i]))throw i+" must be a number";if(isNaN(t[i]))throw"invalid number for "+i},r.prototype.checkSizeRangesSuffixes=function(){if("object"!==g.type(this.settings.sizeRangeSuffixes))throw"sizeRangeSuffixes must be defined and must be an object";var t=[];for(var i in this.settings.sizeRangeSuffixes)this.settings.sizeRangeSuffixes.hasOwnProperty(i)&&t.push(i);for(var e={0:""},s=0;s<t.length;s++)if("string"===g.type(t[s]))try{e[parseInt(t[s].replace(/^[a-z]+/,""),10)]=this.settings.sizeRangeSuffixes[t[s]]}catch(t){throw"sizeRangeSuffixes keys must contains correct numbers ("+t+")"}else e[t[s]]=this.settings.sizeRangeSuffixes[t[s]];this.settings.sizeRangeSuffixes=e},r.prototype.retrieveMaxRowHeight=function(){var t=null,i=this.settings.rowHeight;if("string"===g.type(this.settings.maxRowHeight))t=this.settings.maxRowHeight.match(/^[0-9]+%$/)?i*parseFloat(this.settings.maxRowHeight.match(/^([0-9]+)%$/)[1])/100:parseFloat(this.settings.maxRowHeight);else{if("number"!==g.type(this.settings.maxRowHeight)){if(!1===this.settings.maxRowHeight||null==this.settings.maxRowHeight)return null;throw"maxRowHeight must be a number or a percentage"}t=this.settings.maxRowHeight}if(isNaN(t))throw"invalid number for maxRowHeight";return t<i&&(t=i),t},r.prototype.checkSettings=function(){this.checkSizeRangesSuffixes(),this.checkOrConvertNumber(this.settings,"rowHeight"),this.checkOrConvertNumber(this.settings,"margins"),this.checkOrConvertNumber(this.settings,"border");var t=["justify","nojustify","left","center","right","hide"];if(-1===t.indexOf(this.settings.lastRow))throw"lastRow must be one of: "+t.join(", ");if(this.checkOrConvertNumber(this.settings,"justifyThreshold"),this.settings.justifyThreshold<0||1<this.settings.justifyThreshold)throw"justifyThreshold must be in the interval [0,1]";if("boolean"!==g.type(this.settings.cssAnimation))throw"cssAnimation must be a boolean";if("boolean"!==g.type(this.settings.captions))throw"captions must be a boolean";if(this.checkOrConvertNumber(this.settings.captionSettings,"animationDuration"),this.checkOrConvertNumber(this.settings.captionSettings,"visibleOpacity"),this.settings.captionSettings.visibleOpacity<0||1<this.settings.captionSettings.visibleOpacity)throw"captionSettings.visibleOpacity must be in the interval [0, 1]";if(this.checkOrConvertNumber(this.settings.captionSettings,"nonVisibleOpacity"),this.settings.captionSettings.nonVisibleOpacity<0||1<this.settings.captionSettings.nonVisibleOpacity)throw"captionSettings.nonVisibleOpacity must be in the interval [0, 1]";if(this.checkOrConvertNumber(this.settings,"imagesAnimationDuration"),this.checkOrConvertNumber(this.settings,"refreshTime"),this.checkOrConvertNumber(this.settings,"refreshSensitivity"),"boolean"!==g.type(this.settings.randomize))throw"randomize must be a boolean";if("string"!==g.type(this.settings.selector))throw"selector must be a string";if(!1!==this.settings.sort&&!g.isFunction(this.settings.sort))throw"sort must be false or a comparison function";if(!1!==this.settings.filter&&!g.isFunction(this.settings.filter)&&"string"!==g.type(this.settings.filter))throw"filter must be false, a string or a filter function"},r.prototype.retrieveSuffixRanges=function(){var t=[];for(var i in this.settings.sizeRangeSuffixes)this.settings.sizeRangeSuffixes.hasOwnProperty(i)&&t.push(parseInt(i,10));return t.sort(function(t,i){return i<t?1:t<i?-1:0}),t},r.prototype.updateSettings=function(t){this.settings=g.extend({},this.settings,t),this.checkSettings(),this.border=0<=this.settings.border?this.settings.border:this.settings.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges()},r.prototype.defaults={sizeRangeSuffixes:{},thumbnailPath:void 0,rowHeight:120,maxRowHeight:!1,margins:1,border:-1,lastRow:"nojustify",justifyThreshold:.9,waitThumbnailsLoad:!0,captions:!0,cssAnimation:!0,imagesAnimationDuration:500,captionSettings:{animationDuration:500,visibleOpacity:.7,nonVisibleOpacity:0},rel:null,target:null,extension:/\.[^.\\/]+$/,refreshTime:200,refreshSensitivity:0,randomize:!1,rtl:!1,sort:!1,filter:!1,selector:"a, div:not(.spinner)",imgSelector:"> img, > a > img",triggerEvent:function(t){this.$gallery.trigger(t)}},g.fn.justifiedGallery=function(n){return this.each(function(t,i){var e=g(i);e.addClass("justified-gallery");var s=e.data("jg.controller");if(void 0===s){if(null!=n&&"object"!==g.type(n)){if("destroy"===n)return;throw"The argument must be an object"}s=new r(e,g.extend({},r.prototype.defaults,n)),e.data("jg.controller",s)}else if("norewind"===n);else{if("destroy"===n)return void s.destroy();s.updateSettings(n),s.rewind()}s.updateEntries("norewind"===n)&&s.init()})}});
base.php CHANGED
@@ -9,13 +9,12 @@ namespace Happy_Addons\Elementor;
9
  use Happy_Addons\Elementor\Manager\Assets;
10
  use Happy_Addons\Elementor\Manager\Widgets;
11
  use Happy_Addons\Elementor\Extension\Happy_Effects;
12
- use Happy_Addons\Elementor\Admin\Dashboard;
13
 
14
  defined( 'ABSPATH' ) || die();
15
 
16
  class Base {
17
 
18
- const VERSION = '1.1.1';
19
 
20
  const MINIMUM_ELEMENTOR_VERSION = '2.5.0';
21
 
@@ -69,7 +68,6 @@ class Base {
69
  Widgets::init();
70
  Assets::init();
71
  Happy_Effects::init();
72
- // Dashboard::init();
73
  }
74
 
75
  public function include_files() {
@@ -78,7 +76,10 @@ class Base {
78
  require( __DIR__ . '/classes/widget-manager.php' );
79
  require( __DIR__ . '/classes/asset-manager.php' );
80
  require( __DIR__ . '/classes/happy-effects.php' );
81
- // require( __DIR__ . '/classes/dashboard.php' );
 
 
 
82
  }
83
 
84
  /**
9
  use Happy_Addons\Elementor\Manager\Assets;
10
  use Happy_Addons\Elementor\Manager\Widgets;
11
  use Happy_Addons\Elementor\Extension\Happy_Effects;
 
12
 
13
  defined( 'ABSPATH' ) || die();
14
 
15
  class Base {
16
 
17
+ const VERSION = '1.2.0';
18
 
19
  const MINIMUM_ELEMENTOR_VERSION = '2.5.0';
20
 
68
  Widgets::init();
69
  Assets::init();
70
  Happy_Effects::init();
 
71
  }
72
 
73
  public function include_files() {
76
  require( __DIR__ . '/classes/widget-manager.php' );
77
  require( __DIR__ . '/classes/asset-manager.php' );
78
  require( __DIR__ . '/classes/happy-effects.php' );
79
+
80
+ if ( is_admin() ) {
81
+ require( __DIR__ . '/classes/class.communicator.php' );
82
+ }
83
  }
84
 
85
  /**
base/widget-base.php CHANGED
@@ -69,15 +69,6 @@ abstract class Base extends Widget_Base {
69
  return rtrim( $html_class );
70
  }
71
 
72
- /**
73
- * Register design controls
74
- *
75
- * Design controls are fixed for all widgets
76
- */
77
- private function register_design_controls() {
78
-
79
- }
80
-
81
  /**
82
  * Register faq controls
83
  */
@@ -94,7 +85,7 @@ abstract class Base extends Widget_Base {
94
  '_faq_notes',
95
  [
96
  'type' => Controls_Manager::RAW_HTML,
97
- 'raw' => __( 'A very important message to show in the panel.', 'plugin-name' ),
98
  'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
99
  ]
100
  );
69
  return rtrim( $html_class );
70
  }
71
 
 
 
 
 
 
 
 
 
 
72
  /**
73
  * Register faq controls
74
  */
85
  '_faq_notes',
86
  [
87
  'type' => Controls_Manager::RAW_HTML,
88
+ 'raw' => __( 'A very important message to show in the panel.', 'happy-elementor-addons' ),
89
  'content_classes' => 'elementor-panel-alert elementor-panel-alert-info',
90
  ]
91
  );
classes/asset-manager.php CHANGED
@@ -12,7 +12,7 @@ class Assets {
12
  */
13
  public static function init() {
14
  // Frontend scripts
15
- add_action( 'wp_enqueue_scripts', [__CLASS__, 'enqueue_frontend_scripts'] );
16
 
17
  // Dashboard scripts
18
  add_action( 'admin_enqueue_scripts', [__CLASS__, 'dashboard_enqueue_scripts'] );
@@ -50,6 +50,34 @@ class Assets {
50
  Base::VERSION
51
  );
52
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
53
  wp_enqueue_style(
54
  'happy-elementor-addons',
55
  HAPPY_ASSETS . 'css/main' . $suffix . 'css',
@@ -74,6 +102,38 @@ class Assets {
74
  true
75
  );
76
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  wp_enqueue_script(
78
  'anime',
79
  HAPPY_ASSETS . 'vendor/anime/lib/anime.min.js',
@@ -85,7 +145,7 @@ class Assets {
85
  wp_enqueue_script(
86
  'happy-elementor-addons',
87
  HAPPY_ASSETS . 'js/happy-addons' . $suffix . 'js',
88
- ['jquery', 'imagesloaded'],
89
  Base::VERSION,
90
  true
91
  );
@@ -129,7 +189,7 @@ class Assets {
129
  }
130
 
131
  public static function enqueue_preview_style() {
132
- if( class_exists( 'WeForms' ) ) {
133
  wp_enqueue_style(
134
  'happy-elementor-weform-preview',
135
  plugins_url( '/weforms/assets/wpuf/css/frontend-forms.css', 'weforms' ),
@@ -137,7 +197,8 @@ class Assets {
137
  Base::VERSION
138
  );
139
  }
140
- if( class_exists( 'WPForms_Lite' ) ) {
 
141
  wp_enqueue_style(
142
  'happy-elementor-wpform-preview',
143
  plugins_url( '/wpforms-lite/assets/css/wpforms-full.css', 'wpforms-lite' ),
@@ -145,7 +206,8 @@ class Assets {
145
  Base::VERSION
146
  );
147
  }
148
- if( class_exists( 'Caldera_Forms' ) ) {
 
149
  wp_enqueue_style(
150
  'happy-elementor-caldera-preview',
151
  plugins_url( '/caldera-forms/assets/css/caldera-forms-front.css', 'caldera-forms' ),
12
  */
13
  public static function init() {
14
  // Frontend scripts
15
+ add_action( 'elementor/frontend/after_enqueue_scripts', [__CLASS__, 'enqueue_frontend_scripts'] );
16
 
17
  // Dashboard scripts
18
  add_action( 'admin_enqueue_scripts', [__CLASS__, 'dashboard_enqueue_scripts'] );
50
  Base::VERSION
51
  );
52
 
53
+ wp_enqueue_style(
54
+ 'justifiedGallery',
55
+ HAPPY_ASSETS . 'vendor/justifiedGallery/css/justifiedGallery.min.css',
56
+ null,
57
+ Base::VERSION
58
+ );
59
+
60
+ wp_enqueue_style(
61
+ 'magnific-popup',
62
+ HAPPY_ASSETS . 'vendor/magnific-popup/magnific-popup.css',
63
+ null,
64
+ Base::VERSION
65
+ );
66
+
67
+ wp_enqueue_style(
68
+ 'slick',
69
+ HAPPY_ASSETS . 'vendor/slick/slick.css',
70
+ null,
71
+ Base::VERSION
72
+ );
73
+
74
+ wp_enqueue_style(
75
+ 'slick-theme',
76
+ HAPPY_ASSETS . 'vendor/slick/slick-theme.css',
77
+ null,
78
+ Base::VERSION
79
+ );
80
+
81
  wp_enqueue_style(
82
  'happy-elementor-addons',
83
  HAPPY_ASSETS . 'css/main' . $suffix . 'css',
102
  true
103
  );
104
 
105
+ wp_enqueue_script(
106
+ 'jquery-justifiedGallery',
107
+ HAPPY_ASSETS . 'vendor/justifiedGallery/js/jquery.justifiedGallery.min.js',
108
+ ['jquery'],
109
+ Base::VERSION,
110
+ true
111
+ );
112
+
113
+ wp_enqueue_script(
114
+ 'jquery-magnific-popup',
115
+ HAPPY_ASSETS . 'vendor/magnific-popup/jquery.magnific-popup.min.js',
116
+ ['jquery'],
117
+ Base::VERSION,
118
+ true
119
+ );
120
+
121
+ wp_enqueue_script(
122
+ 'jquery-isotope',
123
+ HAPPY_ASSETS . 'vendor/jquery.isotope.js',
124
+ ['jquery'],
125
+ Base::VERSION,
126
+ true
127
+ );
128
+
129
+ wp_enqueue_script(
130
+ 'jquery-slick',
131
+ HAPPY_ASSETS . 'vendor/slick/slick' . $suffix . 'js',
132
+ ['jquery'],
133
+ Base::VERSION,
134
+ true
135
+ );
136
+
137
  wp_enqueue_script(
138
  'anime',
139
  HAPPY_ASSETS . 'vendor/anime/lib/anime.min.js',
145
  wp_enqueue_script(
146
  'happy-elementor-addons',
147
  HAPPY_ASSETS . 'js/happy-addons' . $suffix . 'js',
148
+ ['imagesloaded', 'jquery-slick', 'jquery'],
149
  Base::VERSION,
150
  true
151
  );
189
  }
190
 
191
  public static function enqueue_preview_style() {
192
+ if ( class_exists( 'WeForms' ) ) {
193
  wp_enqueue_style(
194
  'happy-elementor-weform-preview',
195
  plugins_url( '/weforms/assets/wpuf/css/frontend-forms.css', 'weforms' ),
197
  Base::VERSION
198
  );
199
  }
200
+
201
+ if ( class_exists( 'WPForms_Lite' ) ) {
202
  wp_enqueue_style(
203
  'happy-elementor-wpform-preview',
204
  plugins_url( '/wpforms-lite/assets/css/wpforms-full.css', 'wpforms-lite' ),
206
  Base::VERSION
207
  );
208
  }
209
+
210
+ if ( class_exists( 'Caldera_Forms' ) ) {
211
  wp_enqueue_style(
212
  'happy-elementor-caldera-preview',
213
  plugins_url( '/caldera-forms/assets/css/caldera-forms-front.css', 'caldera-forms' ),
classes/class.communicator.php ADDED
@@ -0,0 +1,109 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Happy_Addons\Communication;
4
+
5
+ defined( 'ABSPATH' ) || die();
6
+
7
+ define( 'HAPPY_API_COMMUNICATION_ENDPOINT', 'https://happyaddons.com/communication.php' );
8
+
9
+ if ( ! ha_is_localhost() ) {
10
+ define( 'HAPPY_API_COMMUNICATION_CHECK_INTERVAL', ( DAY_IN_SECONDS / 2 ) );
11
+ } else {
12
+ define( 'HAPPY_API_COMMUNICATION_CHECK_INTERVAL', 60 );
13
+ }
14
+
15
+ class Communicator {
16
+
17
+ public function __construct() {
18
+ add_action( 'admin_menu', function () {
19
+ $last_message = get_option( 'happyaddons_message', [ 'digest' => '404' ] );
20
+ $next_communication_time = get_option( 'happyaddons_communication_time', 0 );
21
+
22
+ if ( $next_communication_time < time() ) {
23
+ //make a call
24
+ $happy_data = wp_remote_get( HAPPY_API_COMMUNICATION_ENDPOINT . '?s=happy&action=notice' );
25
+
26
+ if ( is_array( $happy_data ) ) {
27
+ $body = json_decode( wp_remote_retrieve_body( $happy_data ), true );
28
+ if ( is_array( $body ) ) {
29
+ if ( $body['digest'] != $last_message['digest'] ) {
30
+ $options = [
31
+ 'happyaddons_message' => $body,
32
+ 'happyaddons_communication_time' => time() + HAPPY_API_COMMUNICATION_CHECK_INTERVAL,
33
+ 'happyaddons_message_dismissed' => 0
34
+ ];
35
+ foreach ( $options as $key => $value ) {
36
+ update_option( $key, $value );
37
+ }
38
+ }
39
+ } else {
40
+ $options = [
41
+ 'happyaddons_communication_time' => time() + HAPPY_API_COMMUNICATION_CHECK_INTERVAL,
42
+ ];
43
+ foreach ( $options as $key => $value ) {
44
+ update_option( $key, $value );
45
+ }
46
+ }
47
+ }
48
+ }
49
+
50
+ add_action( 'admin_notices', [ $this, 'display_admin_notice' ] );
51
+ } );
52
+
53
+ add_action( 'wp_ajax_happyaddons_dismiss_error', function () {
54
+ if ( wp_verify_nonce( $_POST['nonce'], 'happyaddons_dismiss_error' ) ) {
55
+ update_option( 'happyaddons_message_dismissed', '1' );
56
+ die();
57
+ }
58
+ } );
59
+
60
+ add_action( 'admin_footer', function () {
61
+ ?>
62
+ <script>
63
+ ;(function ($) {
64
+ $(document).ready(function () {
65
+
66
+ $('body').on('click', '#happyaddons_remote_notice .notice-dismiss', function () {
67
+ $.post('<?php echo admin_url( 'admin-ajax.php' ); ?>', {
68
+ action: 'happyaddons_dismiss_error',
69
+ nonce: $('#happyaddons_remote_dismiss').val()
70
+ }, function (data) {
71
+ //console.log(data);
72
+ });
73
+ return false;
74
+ });
75
+ })
76
+ })(jQuery);
77
+ </script>
78
+
79
+ <?php
80
+ } );
81
+ }
82
+
83
+ function display_admin_notice() {
84
+ $last_message = get_option( 'happyaddons_message', [] );
85
+
86
+ if ( is_array( $last_message ) && count( $last_message ) > 0 ) {
87
+ $dismissed = get_option( 'happyaddons_message_dismissed', 1 );
88
+ if ( $dismissed == 0 && trim( $last_message['message'] != '' ) ) {
89
+ $message_body = isset( $last_message['message'] ) ? $last_message['message'] : '';
90
+ $action_button_title = isset( $last_message['action'] ) ? $last_message['action'] : '';
91
+ $action_button_url = isset( $last_message['url'] ) ? $last_message['url'] : '';
92
+ $message_style = isset( $last_message['style'] ) ? $last_message['style'] : '';
93
+ ?>
94
+ <div id="happyaddons_remote_notice" class="notice notice-<?php echo $message_style; ?> is-dismissible">
95
+ <?php wp_nonce_field( 'happyaddons_dismiss_error', 'happyaddons_remote_dismiss' ); ?>
96
+ <div class="happyaddons-massage wp-clearfix"><?php echo $message_body; ?></div>
97
+ <?php if ( $action_button_title ): ?>
98
+ <p><a class="button button-primary"
99
+ href="<?php echo esc_url( $action_button_url ); ?>"><?php echo esc_html( $action_button_title ); ?></a>
100
+ </p>
101
+ <?php endif; ?>
102
+ </div>
103
+ <?php
104
+ }
105
+ }
106
+ }
107
+ }
108
+
109
+ new Communicator();
classes/dashboard.php DELETED
@@ -1,38 +0,0 @@
1
- <?php
2
- namespace Happy_Addons\Elementor\Admin;
3
-
4
- use Elementor\Base;
5
-
6
- defined( 'ABSPATH' ) || die();
7
-
8
- class Dashboard {
9
-
10
- public static function init() {
11
- add_action( 'admin_menu', [__CLASS__, 'happy_admin_menu'], 515 );
12
- }
13
-
14
- public static function happy_admin_menu() {
15
- add_submenu_page(
16
- 'elementor',
17
- __( 'Happy Addons', 'happy-elementor-addons' ),
18
- __( 'Happy Addons', 'happy-elementor-addons' ),
19
- 'manage_options',
20
- 'happy-settings',
21
- array( __CLASS__, 'happy_admin_settings' )
22
- );
23
- }
24
-
25
- public static function happy_admin_settings() {
26
- echo '<div class="happy-settings">';
27
-
28
- include_once HAPPY_DIR_PATH . 'inc/admin-templates/widgets.php';
29
- include_once HAPPY_DIR_PATH . 'inc/admin-templates/save.php';
30
-
31
- echo '</div>';
32
- }
33
-
34
- // public function save_settings() {
35
- //
36
- // }
37
-
38
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
classes/widget-manager.php CHANGED
@@ -6,6 +6,9 @@ use Elementor\Plugin as Elementor;
6
  defined( 'ABSPATH' ) || die();
7
 
8
  class Widgets {
 
 
 
9
  public static function init() {
10
  add_action( 'elementor/widgets/widgets_registered', [__CLASS__, 'register'] );
11
  }
@@ -30,18 +33,27 @@ class Widgets {
30
  'member',
31
  'review',
32
  'image-compare',
 
33
  'skills',
34
  'gradient-heading',
35
  'wpform',
36
  'ninjaform',
37
  'calderaform',
38
  'weform',
 
39
  'dual-button',
40
  'testimonial',
 
41
  ];
42
 
43
  foreach ( $widgets as $widget ) {
44
- require( HAPPY_DIR_PATH . 'widgets/' . $widget . '/widget.php' );
 
 
 
 
 
 
45
 
46
  $class_name = str_replace( '-', '_', $widget );
47
  $class_name = 'Happy_Addons\Elementor\Widget\\' . $class_name;
6
  defined( 'ABSPATH' ) || die();
7
 
8
  class Widgets {
9
+ /**
10
+ * Initialize
11
+ */
12
  public static function init() {
13
  add_action( 'elementor/widgets/widgets_registered', [__CLASS__, 'register'] );
14
  }
33
  'member',
34
  'review',
35
  'image-compare',
36
+ 'justified-gallery',
37
  'skills',
38
  'gradient-heading',
39
  'wpform',
40
  'ninjaform',
41
  'calderaform',
42
  'weform',
43
+ 'logo-grid',
44
  'dual-button',
45
  'testimonial',
46
+ 'number',
47
  ];
48
 
49
  foreach ( $widgets as $widget ) {
50
+ $widget_file = HAPPY_DIR_PATH . 'widgets/' . $widget . '/widget.php';
51
+
52
+ if ( ! is_readable( $widget_file ) ) {
53
+ continue;
54
+ }
55
+
56
+ include( $widget_file );
57
 
58
  $class_name = str_replace( '-', '_', $widget );
59
  $class_name = 'Happy_Addons\Elementor\Widget\\' . $class_name;
inc/admin-templates/save.php DELETED
@@ -1,8 +0,0 @@
1
- <div class="ha-button-wrap">
2
- <div class="brand">
3
- <?php _e( 'Happy Elementor Addons', 'happy-elementor-addons' ); ?>
4
- </div>
5
- <button type="submit" class="ha-save-button">
6
- <?php _e('Save settings', 'happy-elementor-addons'); ?>
7
- </button>
8
- </div>
 
 
 
 
 
 
 
 
inc/admin-templates/widgets.php DELETED
@@ -1,25 +0,0 @@
1
- <div id="widgets" class="ha-settings-tab">
2
- <div class="row">
3
- <div class="ha-container">
4
- <p class="ha-elements-control-notice">
5
- <?php _e( 'You can disable the elements you are not using on your site. That will disable all associated assets of those widgets to improve your site loading.', 'happy-elementor-addons' ) ?>
6
- </p>
7
- <div class="checkbox-wrapper">
8
- <div class="ha-checkbox">
9
- <?php _e( 'Card', 'happy-elementor-addons' ); ?>
10
- <label class="ha-switch" for="card">
11
- <input type="checkbox" checked id="card" name="card">
12
- <span class="ha-slider round"></span>
13
- </label>
14
- </div>
15
- <div class="ha-checkbox">
16
- <?php _e( 'Info Box', 'happy-elementor-addons' ); ?>
17
- <label class="ha-switch" for="info">
18
- <input type="checkbox" id="info" name="info">
19
- <span class="ha-slider round"></span>
20
- </label>
21
- </div>
22
- </div>
23
- </div>
24
- </div>
25
- </div>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
inc/functions.php CHANGED
@@ -277,3 +277,7 @@ function ha_get_setting_value( &$settings, $keys ) {
277
  }
278
  return $settings[ $keys[0] ];
279
  }
 
 
 
 
277
  }
278
  return $settings[ $keys[0] ];
279
  }
280
+
281
+ function ha_is_localhost() {
282
+ return isset( $_SERVER['REMOTE_ADDR'] ) && in_array( $_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'] );
283
+ }
plugin.php CHANGED
@@ -3,9 +3,9 @@
3
  * Plugin Name: Happy Elementor Addons
4
  * Plugin URI: https://happyaddons.com/
5
  * Description: <a href="https://happyaddons.com/">HappyAddons</a> is a collection of slick, powerful widgets that works seamlessly with Elementor page builder. It’s trendy look with detail customization features allows to create extraordinary designs instantly. <a href="https://happyaddons.com/">HappyAddons</a> is free, rapidly growing and comes with great support.
6
- * Version: 1.1.1
7
  * Author: HappyMonster
8
- * Author URI: https://happymonster.me/
9
  * License: GPLv2
10
  * License URI: https://www.gnu.org/licenses/gpl-2.0.html
11
  * Text Domain: happy-elementor-addons
3
  * Plugin Name: Happy Elementor Addons
4
  * Plugin URI: https://happyaddons.com/
5
  * Description: <a href="https://happyaddons.com/">HappyAddons</a> is a collection of slick, powerful widgets that works seamlessly with Elementor page builder. It’s trendy look with detail customization features allows to create extraordinary designs instantly. <a href="https://happyaddons.com/">HappyAddons</a> is free, rapidly growing and comes with great support.
6
+ * Version: 1.2.0
7
  * Author: HappyMonster
8
+ * Author URI: https://happyaddons.com/
9
  * License: GPLv2
10
  * License URI: https://www.gnu.org/licenses/gpl-2.0.html
11
  * Text Domain: happy-elementor-addons
readme.txt CHANGED
@@ -1,6 +1,6 @@
1
  === Happy Elementor Addons ===
2
  Plugin Name: Happy Elementor Addons
3
- Version: 1.1.1
4
  Author: HappyMonster
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, obiplabon, sourav926
@@ -17,7 +17,7 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html
17
 
18
  [HappyAddons](https://happyaddons.com/) is a collection of slick, powerful widgets that works seamlessly with Elementor page builder. It’s trendy look with detail customization features allows to create extraordinary designs instantly. [HappyAddons](https://happyaddons.com/) is free, rapidly growing and comes with great support.
19
 
20
- ### Included Free Widgets
21
 
22
  1. **[Card](https://happyaddons.com/elementor-card-widget-demo/)** - Incredibly powerful widget to demonstrate your products, articles, news, creative posts using a beautiful combination of texts, links, badge and image. Using built in positioning and offset feature you can create eye-candy designs in a twist. [Check demo](https://happyaddons.com/elementor-card-widget-demo/)
23
  2. **[Gradient Heading](https://happyaddons.com/elementor-gradient-heading-widget-demo/)** - Another gem to create eye candy headings for your websites. You can apply different gradient styles, angles, opacity, and positions to make them look even better across different device screens. [Check demo](https://happyaddons.com/elementor-gradient-heading-widget-demo/)
@@ -31,15 +31,20 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html
31
  10. **[ Caldera Forms](https://happyaddons.com/elementor-caldera-forms-widget-demo/)** - This widget can help you to display your caldera forms to display on your web pages designed with Elementor. [Check demo](https://happyaddons.com/elementor-caldera-forms-widget-demo/)
32
  11. **[weForms](https://happyaddons.com/elementor-we-forms-widget-demo/)** - Designed forms using weForms plugin and looking for a way to display those on your Elementor powered pages? This is the answer for that. [Check demo](https://happyaddons.com/elementor-we-forms-widget-demo/)
33
  12. **[Ninja Forms](https://happyaddons.com/elementor-ninja-form-widget-demo/)** - Use this widget to embed forms created using Ninja Forms to display seamlessly on your web pages. Various styling options will help you to look at them even better. [Check demo](https://happyaddons.com/elementor-ninja-form-widget-demo/)
34
- 13. **[WPForms](https://happyaddons.com/elementor-wpform-widget-demo/)** - Use this widget to embed forms created using WPForms to display seamlessly on your web pages. Various styling options will help you to look at them even better.
35
- 14. **[Dual Button](https://happyaddons.com/elementor-dual-button-widget-demo/)** - DualButton widget allows you to add two flexible and trendy action buttons in your sections, in different styles.
36
- 15. **Testimonial**
 
 
 
 
 
37
 
38
  ### Included Free Extensions
39
  **Happy Effects**
40
 
41
- 1. **[Floating Effects](https://happyaddons.com/elementor-floating-effect-demo/)**
42
- 2. **[CSS Transform](https://happyaddons.com/elementor-css-transform-demo/)**
43
 
44
  https://www.youtube.com/watch?v=LmtacsLcFPU
45
 
@@ -91,6 +96,12 @@ It's really easy and super simple to install **Happy Elementor Addons** plugin b
91
 
92
  == Changelog ==
93
 
 
 
 
 
 
 
94
  = 1.1.1 =
95
 
96
  * New: Testimonial Widget
1
  === Happy Elementor Addons ===
2
  Plugin Name: Happy Elementor Addons
3
+ Version: 1.2.0
4
  Author: HappyMonster
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, obiplabon, sourav926
17
 
18
  [HappyAddons](https://happyaddons.com/) is a collection of slick, powerful widgets that works seamlessly with Elementor page builder. It’s trendy look with detail customization features allows to create extraordinary designs instantly. [HappyAddons](https://happyaddons.com/) is free, rapidly growing and comes with great support.
19
 
20
+ ### Included 18 Free Widgets
21
 
22
  1. **[Card](https://happyaddons.com/elementor-card-widget-demo/)** - Incredibly powerful widget to demonstrate your products, articles, news, creative posts using a beautiful combination of texts, links, badge and image. Using built in positioning and offset feature you can create eye-candy designs in a twist. [Check demo](https://happyaddons.com/elementor-card-widget-demo/)
23
  2. **[Gradient Heading](https://happyaddons.com/elementor-gradient-heading-widget-demo/)** - Another gem to create eye candy headings for your websites. You can apply different gradient styles, angles, opacity, and positions to make them look even better across different device screens. [Check demo](https://happyaddons.com/elementor-gradient-heading-widget-demo/)
31
  10. **[ Caldera Forms](https://happyaddons.com/elementor-caldera-forms-widget-demo/)** - This widget can help you to display your caldera forms to display on your web pages designed with Elementor. [Check demo](https://happyaddons.com/elementor-caldera-forms-widget-demo/)
32
  11. **[weForms](https://happyaddons.com/elementor-we-forms-widget-demo/)** - Designed forms using weForms plugin and looking for a way to display those on your Elementor powered pages? This is the answer for that. [Check demo](https://happyaddons.com/elementor-we-forms-widget-demo/)
33
  12. **[Ninja Forms](https://happyaddons.com/elementor-ninja-form-widget-demo/)** - Use this widget to embed forms created using Ninja Forms to display seamlessly on your web pages. Various styling options will help you to look at them even better. [Check demo](https://happyaddons.com/elementor-ninja-form-widget-demo/)
34
+ 13. **[WPForms](https://happyaddons.com/elementor-wpform-widget-demo/)** - Use this widget to embed forms created using WPForms to display seamlessly on your web pages. Various styling options will help you to look at them even better. [Check demo](https://happyaddons.com/elementor-wpform-widget-demo/)
35
+ 14. **[Dual Button](https://happyaddons.com/elementor-dual-button-widget-demo/)** - DualButton widget allows you to add two flexible and trendy action buttons in your sections, in different styles. [Check demo](https://happyaddons.com/elementor-dual-button-widget-demo/)
36
+ 15. **[Testimonial](https://happyaddons.com/elementor-testimonial-widget-demo/)** - Create beautiful testimonial sections with different look-n-feels using HappyAddons Testimonial widget. [Check demo](https://happyaddons.com/elementor-testimonial-widget-demo/)
37
+ 16. **[Justified Grid](https://happyaddons.com/elementor-justified-grid-widget-demo/)** - Another pro grade widget which can help you to create beautiful justified grid. Comes packed with tons of options to make it stand out from the crowd. [Check demo](https://happyaddons.com/elementor-justified-grid-widget-demo/)
38
+ 17. **[Number](https://happyaddons.com/elementor-number-widget-demo/)** - Simply beautiful, this widget can help you create stunning number blocks with various styles, look-n-feels that’s literally going to blow your mind. [Check demo](https://happyaddons.com/elementor-number-widget-demo/)
39
+ 18. **Logo Grid** - Our happy design team is working hard to cook some awesome demo designs for you. [Subscribe to happy newsletter](https://happyaddons.com/) to smell what the design team is cooking :D
40
+ 19. **Carousel** - ETA 23 July, 2019
41
+ 20. **Slider** - ETA 23 July, 2019
42
 
43
  ### Included Free Extensions
44
  **Happy Effects**
45
 
46
+ 1. **[Floating Effects](https://happyaddons.com/elementor-floating-effect-demo/)** - Now you can create stunning animations for any Elementor widget using Floating Effects. Translate, Rotate or Scale - Imagination is the limit!
47
+ 2. **[CSS Transform](https://happyaddons.com/elementor-css-transform-demo/)** - Another missing piece, a great enhancement over core Elementor that works seamlessly with every widget. You can now apply various CSS transforms like translate, rotate, scale and skew without any limitations.
48
 
49
  https://www.youtube.com/watch?v=LmtacsLcFPU
50
 
96
 
97
  == Changelog ==
98
 
99
+ = 1.2.0 =
100
+
101
+ * New: Justified Grid Widget
102
+ * New: Logo Grid Widget
103
+ * New: Number Widget
104
+
105
  = 1.1.1 =
106
 
107
  * New: Testimonial Widget
widgets/card/widget.php CHANGED
@@ -991,7 +991,7 @@ class Card extends Base {
991
 
992
  protected function render() {
993
  $settings = $this->get_settings_for_display();
994
- $this->get_settings();
995
  $this->add_inline_editing_attributes( 'badge_text', 'none' );
996
  $this->add_render_attribute(
997
  'badge_text',
991
 
992
  protected function render() {
993
  $settings = $this->get_settings_for_display();
994
+
995
  $this->add_inline_editing_attributes( 'badge_text', 'none' );
996
  $this->add_render_attribute(
997
  'badge_text',
widgets/image-compare/widget.php CHANGED
@@ -242,7 +242,7 @@ class Image_Compare extends Base {
242
  $this->add_control(
243
  '_heading_bar',
244
  [
245
- 'label' => __( 'Handle Bar', 'plugin-name' ),
246
  'type' => Controls_Manager::HEADING,
247
  'separator' => 'before',
248
  ]
@@ -270,7 +270,7 @@ class Image_Compare extends Base {
270
  $this->add_control(
271
  '_heading_arrow',
272
  [
273
- 'label' => __( 'Handle Arrow', 'plugin-name' ),
274
  'type' => Controls_Manager::HEADING,
275
  'separator' => 'before',
276
  ]
242
  $this->add_control(
243
  '_heading_bar',
244
  [
245
+ 'label' => __( 'Handle Bar', 'happy-elementor-addons' ),
246
  'type' => Controls_Manager::HEADING,
247
  'separator' => 'before',
248
  ]
270
  $this->add_control(
271
  '_heading_arrow',
272
  [
273
+ 'label' => __( 'Handle Arrow', 'happy-elementor-addons' ),
274
  'type' => Controls_Manager::HEADING,
275
  'separator' => 'before',
276
  ]
widgets/infobox/widget.php CHANGED
@@ -392,7 +392,7 @@ class InfoBox extends Base {
392
  $this->add_control(
393
  'offset_toggle',
394
  [
395
- 'label' => __( 'Offset', 'plugin-name' ),
396
  'type' => Controls_Manager::POPOVER_TOGGLE,
397
  'label_off' => __( 'None', 'your-plugin' ),
398
  'label_on' => __( 'Custom', 'your-plugin' ),
392
  $this->add_control(
393
  'offset_toggle',
394
  [
395
+ 'label' => __( 'Offset', 'happy-elementor-addons' ),
396
  'type' => Controls_Manager::POPOVER_TOGGLE,
397
  'label_off' => __( 'None', 'your-plugin' ),
398
  'label_on' => __( 'Custom', 'your-plugin' ),
widgets/justified-gallery/widget.php ADDED
@@ -0,0 +1,659 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Justified gallery widget class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+ namespace Happy_Addons\Elementor\Widget;
8
+
9
+ use Elementor\Repeater;
10
+ use Elementor\Controls_Manager;
11
+ use Elementor\Group_Control_Border;
12
+ use Elementor\Group_Control_Box_Shadow;
13
+ use Elementor\Group_Control_Image_Size;
14
+ use Elementor\Group_Control_Typography;
15
+ use Elementor\Scheme_Typography;
16
+ use Elementor\Utils;
17
+
18
+ defined( 'ABSPATH' ) || die();
19
+
20
+ class Justified_Gallery extends Base {
21
+
22
+ /**
23
+ * Get widget title.
24
+ *
25
+ * @since 1.0.0
26
+ * @access public
27
+ *
28
+ * @return string Widget title.
29
+ */
30
+ public function get_title() {
31
+ return __( 'Justified Gallery', 'happy-elementor-addons' );
32
+ }
33
+
34
+ /**
35
+ * Get widget icon.
36
+ *
37
+ * @since 1.0.0
38
+ * @access public
39
+ *
40
+ * @return string Widget icon.
41
+ */
42
+ public function get_icon() {
43
+ return 'hm hm-brick-wall';
44
+ }
45
+
46
+ public function get_keywords() {
47
+ return [ 'gallery', 'image', 'justified', 'filter' ];
48
+ }
49
+
50
+ protected function register_content_controls() {
51
+ $this->start_controls_section(
52
+ '_section_gallery',
53
+ [
54
+ 'label' => __( 'Gallery', 'happy-elementor-addons' ),
55
+ 'tab' => Controls_Manager::TAB_CONTENT,
56
+ ]
57
+ );
58
+
59
+ $repeater = new Repeater();
60
+
61
+ $repeater->add_control(
62
+ 'filter',
63
+ [
64
+ 'label' => __( 'Filter Name', 'happy-elementor-addons' ),
65
+ 'type' => Controls_Manager::TEXT,
66
+ 'placeholder' => __( 'Type gallery filter name', 'happy-elementor-addons' ),
67
+ 'description' => __( 'Filter navigation will be built using filter name', 'happy-elementor-addons' ),
68
+ ]
69
+ );
70
+
71
+ $repeater->add_control(
72
+ 'images',
73
+ [
74
+ 'type' => Controls_Manager::GALLERY,
75
+ ]
76
+ );
77
+
78
+ $this->add_control(
79
+ 'gallery',
80
+ [
81
+ 'type' => Controls_Manager::REPEATER,
82
+ 'fields' => $repeater->get_controls(),
83
+ 'show_label' => false,
84
+ 'title_field' => 'Filter Group: {{filter}}',
85
+ 'default' => [
86
+ [
87
+ 'filter' => __( 'Happy', 'happy-elementor-addons' ),
88
+ ]
89
+ ]
90
+ ]
91
+ );
92
+
93
+ $this->add_group_control(
94
+ Group_Control_Image_Size::get_type(),
95
+ [
96
+ 'name' => 'thumbnail',
97
+ 'default' => 'medium_large',
98
+ 'separator' => 'before',
99
+ 'exclude' => [
100
+ 'custom'
101
+ ]
102
+ ]
103
+ );
104
+
105
+ $this->end_controls_section();
106
+
107
+ $this->start_controls_section(
108
+ '_section_settings',
109
+ [
110
+ 'label' => __( 'Settings', 'happy-elementor-addons' ),
111
+ 'tab' => Controls_Manager::TAB_CONTENT,
112
+ ]
113
+ );
114
+
115
+ $this->add_control(
116
+ 'show_filter',
117
+ [
118
+ 'label' => __( 'Show Filter?', 'happy-elementor-addons' ),
119
+ 'type' => Controls_Manager::SWITCHER,
120
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
121
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
122
+ 'return_value' => 'yes',
123
+ 'description' => __( 'Enable to display filter navigation. Filter navigation will be built using filter name from gallery', 'happy-elementor-addons' )
124
+ ]
125
+ );
126
+
127
+ $this->add_control(
128
+ 'show_all_filter',
129
+ [
130
+ 'label' => __( 'Show Everything Filter?', 'happy-elementor-addons' ),
131
+ 'type' => Controls_Manager::SWITCHER,
132
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
133
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
134
+ 'return_value' => 'yes',
135
+ 'default' => 'yes',
136
+ 'description' => __( 'Enable to display everything filter', 'happy-elementor-addons' ),
137
+ 'condition' => [
138
+ 'show_filter' => 'yes'
139
+ ]
140
+ ]
141
+ );
142
+
143
+ $this->add_control(
144
+ 'all_filter_label',
145
+ [
146
+ 'label' => __( 'Filter Label', 'happy-elementor-addons' ),
147
+ 'type' => Controls_Manager::TEXT,
148
+ 'default' => __( 'All', 'happy-elementor-addons' ),
149
+ 'placeholder' => __( 'Type filter label', 'happy-elementor-addons' ),
150
+ 'description' => __( 'Type everything filter label', 'happy-elementor-addons' ),
151
+ 'condition' => [
152
+ 'show_all_filter' => 'yes',
153
+ 'show_filter' => 'yes'
154
+ ]
155
+ ]
156
+ );
157
+
158
+ $this->add_control(
159
+ 'show_caption',
160
+ [
161
+ 'label' => __( 'Show Caption?', 'happy-elementor-addons' ),
162
+ 'type' => Controls_Manager::SWITCHER,
163
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
164
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
165
+ 'return_value' => 'yes',
166
+ 'description' => __( 'Make sure to add image caption otherwise you will not see anything', 'happy-elementor-addons' )
167
+ ]
168
+ );
169
+
170
+ $this->add_control(
171
+ 'row_height',
172
+ [
173
+ 'label' => __( 'Height', 'happy-elementor-addons' ),
174
+ 'type' => Controls_Manager::SLIDER,
175
+ 'size_units' => [ 'px' ],
176
+ 'default' => [
177
+ 'size' => 150,
178
+ ],
179
+ 'range' => [
180
+ 'px' => [
181
+ 'min' => 50,
182
+ 'max' => 500,
183
+ ],
184
+ ],
185
+ ]
186
+ );
187
+
188
+ $this->add_control(
189
+ 'margins',
190
+ [
191
+ 'label' => __( 'Margins', 'happy-elementor-addons' ),
192
+ 'type' => Controls_Manager::SLIDER,
193
+ 'size_units' => [ 'px' ],
194
+ 'default' => [
195
+ 'size' => 10,
196
+ ],
197
+ 'range' => [
198
+ 'px' => [
199
+ 'min' => 0,
200
+ 'max' => 100,
201
+ ],
202
+ ],
203
+ ]
204
+ );
205
+
206
+ $this->add_control(
207
+ 'last_row',
208
+ [
209
+ 'label' => __( 'Last Row', 'happy-elementor-addons' ),
210
+ 'type' => Controls_Manager::SELECT,
211
+ 'default' => 'justify',
212
+ 'options' => [
213
+ 'nojustify' => __( 'No Justify', 'happy-elementor-addons' ),
214
+ 'justify' => __( 'Justify', 'happy-elementor-addons' ),
215
+ 'hide' => __( 'Hide', 'happy-elementor-addons' ),
216
+ ]
217
+ ]
218
+ );
219
+
220
+ $this->end_controls_section();
221
+ }
222
+
223
+ protected function register_style_controls() {
224
+ $this->start_controls_section(
225
+ '_section_style_gallery',
226
+ [
227
+ 'label' => __( 'Gallery', 'happy-elementor-addons' ),
228
+ 'tab' => Controls_Manager::TAB_STYLE,
229
+ ]
230
+ );
231
+
232
+ $this->add_control(
233
+ '_heading_image',
234
+ [
235
+ 'label' => __( 'Image', 'happy-elementor-addons' ),
236
+ 'type' => Controls_Manager::HEADING,
237
+ ]
238
+ );
239
+
240
+ $this->add_responsive_control(
241
+ 'image_border_radius',
242
+ [
243
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
244
+ 'type' => Controls_Manager::DIMENSIONS,
245
+ 'size_units' => [ 'px', '%' ],
246
+ 'selectors' => [
247
+ '{{WRAPPER}} .ha-justified-gallery-item' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
248
+ ],
249
+ ]
250
+ );
251
+
252
+ $this->add_group_control(
253
+ Group_Control_Box_Shadow::get_type(),
254
+ [
255
+ 'name' => 'image_box_shadow',
256
+ 'exclude' => [
257
+ 'box_shadow_position',
258
+ ],
259
+ 'selector' => '{{WRAPPER}} .ha-justified-gallery-item'
260
+ ]
261
+ );
262
+
263
+ $this->add_control(
264
+ '_heading_caption',
265
+ [
266
+ 'label' => __( 'Caption', 'happy-elementor-addons' ),
267
+ 'type' => Controls_Manager::HEADING,
268
+ 'separator' => 'before',
269
+ ]
270
+ );
271
+
272
+ $this->add_responsive_control(
273
+ 'caption_padding',
274
+ [
275
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
276
+ 'type' => Controls_Manager::DIMENSIONS,
277
+ 'size_units' => [ 'px', 'em', '%' ],
278
+ 'selectors' => [
279
+ '{{WRAPPER}} .ha-justified-gallery-grid > a > .caption' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
280
+ ],
281
+ ]
282
+ );
283
+
284
+ $this->add_control(
285
+ 'caption_color',
286
+ [
287
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
288
+ 'type' => Controls_Manager::COLOR,
289
+ 'selectors' => [
290
+ '{{WRAPPER}} .ha-justified-gallery-grid > a > .caption' => 'color: {{VALUE}}',
291
+ ],
292
+ ]
293
+ );
294
+
295
+ $this->add_control(
296
+ 'caption_bg_color',
297
+ [
298
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
299
+ 'type' => Controls_Manager::COLOR,
300
+ 'selectors' => [
301
+ '{{WRAPPER}} .ha-justified-gallery-grid > a > .caption' => 'background-color: {{VALUE}}',
302
+ ],
303
+ ]
304
+ );
305
+
306
+ $this->add_group_control(
307
+ Group_Control_Typography::get_type(),
308
+ [
309
+ 'name' => 'caption_typography',
310
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
311
+ 'selector' => '{{WRAPPER}} .ha-justified-gallery-grid > a > .caption',
312
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
313
+ ]
314
+ );
315
+
316
+ $this->end_controls_section();
317
+
318
+ $this->start_controls_section(
319
+ '_section_style_menu',
320
+ [
321
+ 'label' => __( 'Filter Menu', 'happy-elementor-addons' ),
322
+ 'tab' => Controls_Manager::TAB_STYLE,
323
+ ]
324
+ );
325
+
326
+ $this->add_control(
327
+ '_heading_menu',
328
+ [
329
+ 'label' => __( 'Menu', 'happy-elementor-addons' ),
330
+ 'type' => Controls_Manager::HEADING,
331
+ ]
332
+ );
333
+
334
+ $this->add_responsive_control(
335
+ 'menu_margin',
336
+ [
337
+ 'label' => __( 'Margin', 'happy-elementor-addons' ),
338
+ 'type' => Controls_Manager::DIMENSIONS,
339
+ 'size_units' => [ 'px', '%' ],
340
+ 'selectors' => [
341
+ '{{WRAPPER}} .ha-gallery-filter' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
342
+ ],
343
+ ]
344
+ );
345
+
346
+ $this->add_control(
347
+ '_heading_buttons',
348
+ [
349
+ 'label' => __( 'Filter Buttons', 'happy-elementor-addons' ),
350
+ 'type' => Controls_Manager::HEADING,
351
+ 'separator' => 'before',
352
+ ]
353
+ );
354
+
355
+ $this->add_responsive_control(
356
+ 'button_padding',
357
+ [
358
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
359
+ 'type' => Controls_Manager::DIMENSIONS,
360
+ 'size_units' => [ 'px', 'em', '%' ],
361
+ 'selectors' => [
362
+ '{{WRAPPER}} .ha-gallery-filter > li > button' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
363
+ ],
364
+ ]
365
+ );
366
+
367
+ $this->add_responsive_control(
368
+ 'button_spacing',
369
+ [
370
+ 'label' => __( 'Spacing', 'happy-elementor-addons' ),
371
+ 'type' => Controls_Manager::SLIDER,
372
+ 'size_units' => ['px'],
373
+ 'selectors' => [
374
+ '{{WRAPPER}} .ha-gallery-filter > li:not(:last-child)' => 'margin-right: {{SIZE}}{{UNIT}};',
375
+ ],
376
+ ]
377
+ );
378
+
379
+ $this->add_group_control(
380
+ Group_Control_Border::get_type(),
381
+ [
382
+ 'name' => 'button_border',
383
+ 'selector' => '{{WRAPPER}} .ha-gallery-filter > li > button'
384
+ ]
385
+ );
386
+
387
+ $this->add_responsive_control(
388
+ 'button_border_radius',
389
+ [
390
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
391
+ 'type' => Controls_Manager::DIMENSIONS,
392
+ 'size_units' => [ 'px', '%' ],
393
+ 'selectors' => [
394
+ '{{WRAPPER}} .ha-gallery-filter > li > button' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
395
+ ],
396
+ ]
397
+ );
398
+
399
+ $this->add_group_control(
400
+ Group_Control_Box_Shadow::get_type(),
401
+ [
402
+ 'name' => 'button_box_shadow',
403
+ 'exclude' => [
404
+ 'box_shadow_position',
405
+ ],
406
+ 'selector' => '{{WRAPPER}} .ha-gallery-filter > li > button'
407
+ ]
408
+ );
409
+
410
+ $this->add_group_control(
411
+ Group_Control_Typography::get_type(),
412
+ [
413
+ 'name' => 'button_typography',
414
+ 'selector' => '{{WRAPPER}} .ha-gallery-filter > li > button',
415
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
416
+ ]
417
+ );
418
+
419
+ $this->add_responsive_control(
420
+ 'button_align',
421
+ [
422
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
423
+ 'type' => Controls_Manager::CHOOSE,
424
+ 'options' => [
425
+ 'left' => [
426
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
427
+ 'icon' => 'eicon-h-align-left',
428
+ ],
429
+ 'center' => [
430
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
431
+ 'icon' => 'eicon-h-align-center',
432
+ ],
433
+ 'right' => [
434
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
435
+ 'icon' => 'eicon-h-align-right',
436
+ ],
437
+ ],
438
+ 'desktop_default' => 'left',
439
+ 'toggle' => false,
440
+ 'selectors' => [
441
+ '{{WRAPPER}} .ha-gallery-filter' => 'text-align: {{VALUE}};'
442
+ ]
443
+ ]
444
+ );
445
+
446
+ $this->start_controls_tabs( '_tabs_style_button' );
447
+
448
+ $this->start_controls_tab(
449
+ '_tab_button_normal',
450
+ [
451
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
452
+ ]
453
+ );
454
+
455
+ $this->add_control(
456
+ 'button_color',
457
+ [
458
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
459
+ 'type' => Controls_Manager::COLOR,
460
+ 'default' => '',
461
+ 'selectors' => [
462
+ '{{WRAPPER}} .ha-gallery-filter > li > button' => 'color: {{VALUE}};',
463
+ ],
464
+ ]
465
+ );
466
+
467
+ $this->add_control(
468
+ 'button_bg_color',
469
+ [
470
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
471
+ 'type' => Controls_Manager::COLOR,
472
+ 'selectors' => [
473
+ '{{WRAPPER}} .ha-gallery-filter > li > button' => 'background-color: {{VALUE}};',
474
+ ],
475
+ ]
476
+ );
477
+
478
+ $this->end_controls_tab();
479
+
480
+ $this->start_controls_tab(
481
+ '_tab_button_hover',
482
+ [
483
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
484
+ ]
485
+ );
486
+
487
+ $this->add_control(
488
+ 'button_hover_color',
489
+ [
490
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
491
+ 'type' => Controls_Manager::COLOR,
492
+ 'selectors' => [
493
+ '{{WRAPPER}} .ha-gallery-filter > li > button:hover, {{WRAPPER}} .ha-gallery-filter > li > button:focus, {{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button:hover, {{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button:focus' => 'color: {{VALUE}};',
494
+ ],
495
+ ]
496
+ );
497
+
498
+ $this->add_control(
499
+ 'button_hover_bg_color',
500
+ [
501
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
502
+ 'type' => Controls_Manager::COLOR,
503
+ 'selectors' => [
504
+ '{{WRAPPER}} .ha-gallery-filter > li > button:hover, {{WRAPPER}} .ha-gallery-filter > li > button:focus, {{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button:hover, {{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button:focus' => 'background-color: {{VALUE}};',
505
+ ],
506
+ ]
507
+ );
508
+
509
+ $this->add_control(
510
+ 'button_hover_border_color',
511
+ [
512
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
513
+ 'type' => Controls_Manager::COLOR,
514
+ 'condition' => [
515
+ 'button_border_border!' => '',
516
+ ],
517
+ 'selectors' => [
518
+ '{{WRAPPER}} .ha-gallery-filter > li > button:hover, {{WRAPPER}} .ha-gallery-filter > li > button:focus, {{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button:hover, {{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button:focus' => 'border-color: {{VALUE}};',
519
+ ],
520
+ ]
521
+ );
522
+
523
+ $this->end_controls_tab();
524
+
525
+ $this->start_controls_tab(
526
+ '_tab_button_active',
527
+ [
528
+ 'label' => __( 'Active', 'happy-elementor-addons' ),
529
+ ]
530
+ );
531
+
532
+ $this->add_control(
533
+ 'button_active_color',
534
+ [
535
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
536
+ 'type' => Controls_Manager::COLOR,
537
+ 'selectors' => [
538
+ '{{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button' => 'color: {{VALUE}};',
539
+ ],
540
+ ]
541
+ );
542
+
543
+ $this->add_control(
544
+ 'button_active_bg_color',
545
+ [
546
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
547
+ 'type' => Controls_Manager::COLOR,
548
+ 'selectors' => [
549
+ '{{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button' => 'background-color: {{VALUE}};',
550
+ ],
551
+ ]
552
+ );
553
+
554
+ $this->add_control(
555
+ 'button_active_border_color',
556
+ [
557
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
558
+ 'type' => Controls_Manager::COLOR,
559
+ 'condition' => [
560
+ 'button_border_border!' => '',
561
+ ],
562
+ 'selectors' => [
563
+ '{{WRAPPER}} .ha-gallery-filter > .ha-filter-active > button' => 'border-color: {{VALUE}};',
564
+ ],
565
+ ]
566
+ );
567
+
568
+ $this->end_controls_tab();
569
+ $this->end_controls_tabs();
570
+
571
+ $this->end_controls_section();
572
+ }
573
+
574
+ protected static function get_data_prop_settings( $settings ) {
575
+ $field_map = [
576
+ 'show_caption' => 'captions.bool',
577
+ 'margins.size' => 'margins.int',
578
+ 'row_height.size' => 'rowHeight.int',
579
+ 'last_row' => 'lastRow.str',
580
+ ];
581
+ return ha_prepare_data_prop_settings( $settings, $field_map );
582
+ }
583
+
584
+ protected function get_gallery_data() {
585
+ $gallery = $this->get_settings_for_display( 'gallery' );
586
+
587
+ if ( ! is_array( $gallery ) || empty( $gallery ) ) {
588
+ return [];
589
+ }
590
+
591
+ $menu = [];
592
+ $items = [];
593
+
594
+ foreach ( $gallery as $item ) {
595
+ if ( empty( $item['images'] ) ) {
596
+ continue;
597
+ }
598
+
599
+ $images = $item['images'];
600
+ $filter = 'ha-filter-is--' . sanitize_title_with_dashes( $item['filter'] );
601
+
602
+ if ( $filter && ! isset( $data[ $filter ] ) ) {
603
+ $menu[ $filter ] = $item['filter'];
604
+ }
605
+
606
+ foreach ( $images as $image ) {
607
+ if ( ! isset( $items[ $image['id'] ] ) ) {
608
+ $items[ $image['id'] ] = [ $filter ];
609
+ } else {
610
+ array_push( $items[ $image['id'] ], $filter );
611
+ }
612
+ }
613
+ }
614
+
615
+ return [
616
+ 'menu' => $menu,
617
+ 'items' => $items
618
+ ];
619
+ }
620
+
621
+ protected function render() {
622
+ $settings = $this->get_settings_for_display();
623
+ $gallery = $this->get_gallery_data();
624
+
625
+ if ( empty( $gallery ) ) {
626
+ return;
627
+ }
628
+
629
+ $this->add_render_attribute( 'container', 'class', [
630
+ 'ha-justified-gallery-wrapper',
631
+ 'hajs-justified-gallery',
632
+ ] );
633
+
634
+ $this->add_render_attribute( 'container', 'data-happy-settings', self::get_data_prop_settings( $settings ) );
635
+
636
+ if ( $settings['show_filter'] === 'yes' ) : ?>
637
+ <ul class="ha-gallery-filter hajs-gallery-filter">
638
+ <?php if ( $settings['show_all_filter'] === 'yes' ) : ?>
639
+ <li class="ha-filter-active"><button type="button" data-filter="*"><?php echo esc_html( $settings['all_filter_label'] ); ?></button></li>
640
+ <?php endif; ?>
641
+ <?php foreach ( $gallery['menu'] as $key => $val ) : ?>
642
+ <li><button type="button" data-filter=".<?php echo esc_attr( $key ); ?>"><?php echo esc_html( $val ); ?></button></li>
643
+ <?php endforeach; ?>
644
+ </ul>
645
+ <?php endif; ?>
646
+
647
+ <div <?php echo $this->get_render_attribute_string( 'container' ); ?>>
648
+ <?php foreach ( $gallery['items'] as $id => $filters ) :
649
+ $caption = $settings['show_caption'] ? esc_attr( wp_get_attachment_caption( $id ) ) : '';
650
+ ?>
651
+ <a class="ha-justified-gallery-item <?php echo esc_attr( implode( ' ', $filters ) ); ?>">
652
+ <?php echo wp_get_attachment_image( $id, $settings['thumbnail_size'], false, [ 'alt' => $caption ] ); ?>
653
+ </a>
654
+ <?php endforeach; ?>
655
+ </div>
656
+
657
+ <?php
658
+ }
659
+ }
widgets/logo-grid/widget.php ADDED
@@ -0,0 +1,433 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Logo grid widget class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+ namespace Happy_Addons\Elementor\Widget;
8
+
9
+ use Elementor\Group_Control_Css_Filter;
10
+ use Elementor\Repeater;
11
+ use Elementor\Controls_Manager;
12
+ use Elementor\Group_Control_Box_Shadow;
13
+ use Elementor\Group_Control_Image_Size;
14
+ use Elementor\Utils;
15
+
16
+ defined( 'ABSPATH' ) || die();
17
+
18
+ class Logo_Grid extends Base {
19
+
20
+ /**
21
+ * Get widget title.
22
+ *
23
+ * @since 1.0.0
24
+ * @access public
25
+ *
26
+ * @return string Widget title.
27
+ */
28
+ public function get_title() {
29
+ return __('Logo Grid', 'happy-elementor-addons');
30
+ }
31
+
32
+ /**
33
+ * Get widget icon.
34
+ *
35
+ * @since 1.0.0
36
+ * @access public
37
+ *
38
+ * @return string Widget icon.
39
+ */
40
+ public function get_icon() {
41
+ return 'hm hm-logo-grid';
42
+ }
43
+
44
+ public function get_keywords() {
45
+ return ['logo', 'grid', 'brand', 'client'];
46
+ }
47
+
48
+ protected function register_content_controls() {
49
+ $this->start_controls_section(
50
+ '_section_logo',
51
+ [
52
+ 'label' => __( 'Logo Grid', 'happy-elementor-addons' ),
53
+ 'tab' => Controls_Manager::TAB_CONTENT,
54
+ ]
55
+ );
56
+
57
+ $repeater = new Repeater();
58
+
59
+ $repeater->add_control(
60
+ 'image',
61
+ [
62
+ 'label' => __('Logo', 'happy-elementor-addons'),
63
+ 'type' => Controls_Manager::MEDIA,
64
+ 'default' => [
65
+ 'url' => Utils::get_placeholder_image_src(),
66
+ ],
67
+ ]
68
+ );
69
+
70
+ $repeater->add_control(
71
+ 'link',
72
+ [
73
+ 'label' => __('Website Url', 'happy-elementor-addons'),
74
+ 'type' => Controls_Manager::URL,
75
+ 'show_external' => false,
76
+ 'label_block' => false,
77
+ ]
78
+ );
79
+
80
+ $repeater->add_control(
81
+ 'name',
82
+ [
83
+ 'label' => __('Brand Name', 'happy-elementor-addons'),
84
+ 'type' => Controls_Manager::TEXT,
85
+ 'default' => __('Brand Name', 'happy-elementor-addons'),
86
+ ]
87
+ );
88
+
89
+ $this->add_control(
90
+ 'logo_list',
91
+ [
92
+ 'show_label' => false,
93
+ 'type' => Controls_Manager::REPEATER,
94
+ 'fields' => $repeater->get_controls(),
95
+ 'title_field' => '{{{ name }}}',
96
+ ]
97
+ );
98
+
99
+ $this->end_controls_section();
100
+
101
+ $this->start_controls_section(
102
+ '_section_settings',
103
+ [
104
+ 'label' => __( 'Settings', 'happy-elementor-addons' ),
105
+ 'tab' => Controls_Manager::TAB_CONTENT,
106
+ ]
107
+ );
108
+
109
+ $this->add_group_control(
110
+ Group_Control_Image_Size::get_type(),
111
+ [
112
+ 'name' => 'thumbnail',
113
+ 'default' => 'large',
114
+ 'separator' => 'before',
115
+ 'exclude' => [
116
+ 'custom'
117
+ ]
118
+ ]
119
+ );
120
+
121
+ $this->add_control(
122
+ 'layout',
123
+ [
124
+ 'label' => __( 'Grid Layout', 'happy-elementor-addons' ),
125
+ 'type' => Controls_Manager::SELECT,
126
+ 'options' => [
127
+ 'box' => __( 'Box', 'happy-elementor-addons' ),
128
+ 'border' => __( 'Border', 'happy-elementor-addons' ),
129
+ 'tictactoe' => __( 'Tic Tac Toe', 'happy-elementor-addons' ),
130
+ ],
131
+ 'default' => 'box',
132
+ 'prefix_class' => 'ha-logo-grid--'
133
+ ]
134
+ );
135
+
136
+ $this->add_responsive_control(
137
+ 'columns',
138
+ [
139
+ 'label' => __( 'Columns', 'happy-elementor-addons' ),
140
+ 'type' => Controls_Manager::SELECT,
141
+ 'options' => [
142
+ 2 => __( '2 Columns', 'happy-elementor-addons' ),
143
+ 3 => __( '3 Columns', 'happy-elementor-addons' ),
144
+ 4 => __( '4 Columns', 'happy-elementor-addons' ),
145
+ 5 => __( '5 Columns', 'happy-elementor-addons' ),
146
+ 6 => __( '6 Columns', 'happy-elementor-addons' ),
147
+ ],
148
+ 'desktop_default' => 4,
149
+ 'tablet_default' => 2,
150
+ 'mobile_default' => 2,
151
+ 'prefix_class' => 'ha-logo-grid--col-%s',
152
+ ]
153
+ );
154
+
155
+ $this->end_controls_section();
156
+ }
157
+
158
+ protected function register_style_controls() {
159
+ $this->start_controls_section(
160
+ '_section_style_grid',
161
+ [
162
+ 'label' => __( 'Grid', 'happy-elementor-addons' ),
163
+ 'tab' => Controls_Manager::TAB_STYLE,
164
+ ]
165
+ );
166
+
167
+ $this->add_control(
168
+ 'grid_border_type',
169
+ [
170
+ 'label' => __( 'Border Type', 'happy-elementor-addons' ),
171
+ 'type' => Controls_Manager::SELECT,
172
+ 'options' => [
173
+ 'none' => __( 'None', 'happy-elementor-addons' ),
174
+ 'solid' => __( 'Solid', 'happy-elementor-addons' ),
175
+ 'double' => __( 'Double', 'happy-elementor-addons' ),
176
+ 'dotted' => __( 'Dotted', 'happy-elementor-addons' ),
177
+ 'dashed' => __( 'Dashed', 'happy-elementor-addons' ),
178
+ 'groove' => __( 'Groove', 'happy-elementor-addons' ),
179
+ ],
180
+ 'default' => 'solid',
181
+ 'selectors' => [
182
+ '{{WRAPPER}} .ha-logo-grid-item' => 'border-style: {{VALUE}};',
183
+ ],
184
+ ]
185
+ );
186
+
187
+ $this->add_responsive_control(
188
+ 'grid_border_width',
189
+ [
190
+ 'label' => __( 'Border Width', 'happy-elementor-addons' ),
191
+ 'type' => Controls_Manager::SLIDER,
192
+ 'size_units' => ['px'],
193
+ 'selectors' => [
194
+ '{{WRAPPER}}.ha-logo-grid--border .ha-logo-grid-item' => 'border-right-width: {{SIZE}}{{UNIT}}; border-bottom-width: {{SIZE}}{{UNIT}};',
195
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n+1)' => 'border-left-width: {{SIZE}}{{UNIT}};',
196
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n+1)' => 'border-left-width: {{SIZE}}{{UNIT}};',
197
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n+1)' => 'border-left-width: {{SIZE}}{{UNIT}};',
198
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n+1)' => 'border-left-width: {{SIZE}}{{UNIT}};',
199
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n+1)' => 'border-left-width: {{SIZE}}{{UNIT}};',
200
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2)' => 'border-top-width: {{SIZE}}{{UNIT}};',
201
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3)' => 'border-top-width: {{SIZE}}{{UNIT}};',
202
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4)' => 'border-top-width: {{SIZE}}{{UNIT}};',
203
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5)' => 'border-top-width: {{SIZE}}{{UNIT}};',
204
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6)' => 'border-top-width: {{SIZE}}{{UNIT}};',
205
+
206
+ '{{WRAPPER}}.ha-logo-grid--tictactoe .ha-logo-grid-item' => 'border-top-width: {{SIZE}}{{UNIT}}; border-right-width: {{SIZE}}{{UNIT}};',
207
+
208
+ '{{WRAPPER}}.ha-logo-grid--box .ha-logo-grid-item' => 'border-width: {{SIZE}}{{UNIT}};',
209
+ ],
210
+ 'condition' => [
211
+ 'grid_border_type!' => 'none',
212
+ ]
213
+ ]
214
+ );
215
+
216
+ $this->add_control(
217
+ 'grid_border_color',
218
+ [
219
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
220
+ 'type' => Controls_Manager::COLOR,
221
+ 'selectors' => [
222
+ '{{WRAPPER}} .ha-logo-grid-item' => 'border-color: {{VALUE}};',
223
+ ],
224
+ 'condition' => [
225
+ 'grid_border_type!' => 'none',
226
+ ]
227
+ ]
228
+ );
229
+
230
+ $this->add_control(
231
+ 'grid_bg_color',
232
+ [
233
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
234
+ 'type' => Controls_Manager::COLOR,
235
+ 'selectors' => [
236
+ '{{WRAPPER}} .ha-logo-grid-figure' => 'background-color: {{VALUE}};',
237
+ ],
238
+ ]
239
+ );
240
+
241
+ $this->add_responsive_control(
242
+ 'grid_border_radius',
243
+ [
244
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
245
+ 'type' => Controls_Manager::DIMENSIONS,
246
+ 'size_units' => ['px', '%'],
247
+ 'selectors' => [
248
+ '{{WRAPPER}}.ha-logo-grid--border .ha-logo-grid-wrapper, {{WRAPPER}}.ha-logo-grid--box .ha-logo-grid-item' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
249
+ '{{WRAPPER}}.ha-logo-grid--border .ha-logo-grid-item:first-child' => 'border-top-left-radius: {{TOP}}{{UNIT}};',
250
+ '{{WRAPPER}}.ha-logo-grid--border .ha-logo-grid-item:last-child' => 'border-bottom-right-radius: {{BOTTOM}}{{UNIT}};',
251
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
252
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-last-child(2)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
253
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
254
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-last-child(3)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
255
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
256
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-last-child(4)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
257
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
258
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-last-child(5)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
259
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
260
+ '{{WRAPPER}}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-last-child(6)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
261
+
262
+ '{{WRAPPER}}.ha-logo-grid--tictactoe .ha-logo-grid-wrapper' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
263
+ '{{WRAPPER}}.ha-logo-grid--tictactoe .ha-logo-grid-item:first-child' => 'border-top-left-radius: {{TOP}}{{UNIT}};',
264
+ '{{WRAPPER}}.ha-logo-grid--tictactoe .ha-logo-grid-item:last-child' => 'border-bottom-right-radius: {{BOTTOM}}{{UNIT}};',
265
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
266
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-last-child(2)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
267
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
268
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-last-child(3)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
269
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
270
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-last-child(4)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
271
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
272
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-last-child(5)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
273
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6)' => 'border-top-right-radius: {{RIGHT}}{{UNIT}};',
274
+ '{{WRAPPER}}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-last-child(6)' => 'border-bottom-left-radius: {{LEFT}}{{UNIT}};',
275
+ ],
276
+ ]
277
+ );
278
+
279
+ $this->add_group_control(
280
+ Group_Control_Box_Shadow::get_type(),
281
+ [
282
+ 'name' => 'grid_box_shadow',
283
+ 'exclude' => [
284
+ 'box_shadow_position',
285
+ ],
286
+ 'selector' => '{{WRAPPER}}.ha-logo-grid--tictactoe .ha-logo-grid-wrapper, {{WRAPPER}}.ha-logo-grid--border .ha-logo-grid-wrapper, {{WRAPPER}}.ha-logo-grid--box .ha-logo-grid-item'
287
+ ]
288
+ );
289
+
290
+
291
+ $this->start_controls_tabs(
292
+ '_tabs_image_effects',
293
+ [
294
+ 'separator' => 'before'
295
+ ]
296
+ );
297
+
298
+ $this->start_controls_tab(
299
+ '_tab_image_effects_normal',
300
+ [
301
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
302
+ ]
303
+ );
304
+
305
+ $this->add_control(
306
+ 'image_opacity',
307
+ [
308
+ 'label' => __( 'Opacity', 'happy-elementor-addons' ),
309
+ 'type' => Controls_Manager::SLIDER,
310
+ 'range' => [
311
+ 'px' => [
312
+ 'max' => 1,
313
+ 'min' => 0.10,
314
+ 'step' => 0.01,
315
+ ],
316
+ ],
317
+ 'selectors' => [
318
+ '{{WRAPPER}} .ha-logo-grid-figure > img' => 'opacity: {{SIZE}};',
319
+ ],
320
+ ]
321
+ );
322
+
323
+ $this->add_group_control(
324
+ Group_Control_Css_Filter::get_type(),
325
+ [
326
+ 'name' => 'image_css_filters',
327
+ 'selector' => '{{WRAPPER}} .ha-logo-grid-figure > img',
328
+ ]
329
+ );
330
+
331
+ $this->end_controls_tab();
332
+
333
+ $this->start_controls_tab( 'hover',
334
+ [
335
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
336
+ ]
337
+ );
338
+
339
+ $this->add_control(
340
+ 'image_opacity_hover',
341
+ [
342
+ 'label' => __( 'Opacity', 'happy-elementor-addons' ),
343
+ 'type' => Controls_Manager::SLIDER,
344
+ 'range' => [
345
+ 'px' => [
346
+ 'max' => 1,
347
+ 'min' => 0.10,
348
+ 'step' => 0.01,
349
+ ],
350
+ ],
351
+ 'selectors' => [
352
+ '{{WRAPPER}} .ha-logo-grid-figure:hover > img' => 'opacity: {{SIZE}};',
353
+ ],
354
+ ]
355
+ );
356
+
357
+ $this->add_group_control(
358
+ Group_Control_Css_Filter::get_type(),
359
+ [
360
+ 'name' => 'image_css_filters_hover',
361
+ 'selector' => '{{WRAPPER}} .ha-logo-grid-figure:hover > img',
362
+ ]
363
+ );
364
+
365
+ $this->add_control(
366
+ 'image_bg_hover_transition',
367
+ [
368
+ 'label' => __( 'Transition Duration', 'happy-elementor-addons' ),
369
+ 'type' => Controls_Manager::SLIDER,
370
+ 'range' => [
371
+ 'px' => [
372
+ 'max' => 3,
373
+ 'step' => 0.1,
374
+ ],
375
+ ],
376
+ 'selectors' => [
377
+ '{{WRAPPER}} .ha-logo-grid-figure:hover > img' => 'transition-duration: {{SIZE}}s',
378
+ ],
379
+ ]
380
+ );
381
+
382
+ $this->add_control(
383
+ 'hover_animation',
384
+ [
385
+ 'label' => __( 'Hover Animation', 'happy-elementor-addons' ),
386
+ 'type' => Controls_Manager::HOVER_ANIMATION,
387
+ ]
388
+ );
389
+
390
+ $this->end_controls_tab();
391
+ $this->end_controls_tabs();
392
+
393
+ $this->end_controls_section();
394
+ }
395
+
396
+ protected function render() {
397
+ $settings = $this->get_settings_for_display();
398
+
399
+ if ( empty($settings['logo_list'] ) ) {
400
+ return;
401
+ }
402
+ ?>
403
+
404
+ <div class="ha-logo-grid-wrapper">
405
+ <?php
406
+ foreach ( $settings['logo_list'] as $index => $item ) :
407
+ $image = wp_get_attachment_image_url( $item['image']['id'], $settings['thumbnail_size'] );
408
+ if ( ! $image ) {
409
+ $image = Utils::get_placeholder_image_src();
410
+ }
411
+ $repeater_key = 'grid_item' . $index;
412
+ $tag = 'div';
413
+ $this->add_render_attribute( $repeater_key, 'class', 'ha-logo-grid-item' );
414
+
415
+ if ( $item['link']['url'] ) {
416
+ $tag = 'a';
417
+ $this->add_render_attribute( $repeater_key, 'class', 'ha-logo-grid-link' );
418
+ $this->add_render_attribute( $repeater_key, 'target', '_blank' );
419
+ $this->add_render_attribute( $repeater_key, 'rel', 'noopener' );
420
+ $this->add_render_attribute( $repeater_key, 'href', esc_url( $item['link']['url'] ) );
421
+ }
422
+ ?>
423
+ <<?php echo $tag; ?> <?php $this->print_render_attribute_string( $repeater_key ); ?>>
424
+ <figure class="ha-logo-grid-figure elementor-animation-<?php echo esc_attr( $settings['hover_animation'] ); ?>">
425
+ <img class="ha-logo-grid-img" src="<?php echo esc_url( $image ); ?>" alt="<?php echo esc_attr( $item['name'] ); ?>">
426
+ </figure>
427
+ </<?php echo $tag; ?>>
428
+ <?php endforeach; ?>
429
+ </div>
430
+
431
+ <?php
432
+ }
433
+ }
widgets/number/widget.php ADDED
@@ -0,0 +1,351 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Blurb widget class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+ namespace Happy_Addons\Elementor\Widget;
8
+
9
+ use Elementor\Utils;
10
+ use Elementor\Control_Media;
11
+ use Elementor\Controls_Manager;
12
+ use Elementor\Group_Control_Border;
13
+ use Elementor\Group_Control_Box_Shadow;
14
+ use Elementor\Group_Control_Image_Size;
15
+ use Elementor\Group_Control_Typography;
16
+ use Elementor\Group_Control_Background;
17
+ use Elementor\Group_Control_Text_Shadow;
18
+ use Happy_Addons\Elementor\Controls\Group_Control_Foreground;
19
+
20
+ defined( 'ABSPATH' ) || die();
21
+
22
+ class Number extends Base {
23
+
24
+ /**
25
+ * Get widget title.
26
+ *
27
+ * @since 1.0.0
28
+ * @access public
29
+ *
30
+ * @return string Widget title.
31
+ */
32
+ public function get_title() {
33
+ return __( 'Number', 'happy-elementor-addons' );
34
+ }
35
+
36
+ /**
37
+ * Get widget icon.
38
+ *
39
+ * @since 1.0.0
40
+ * @access public
41
+ *
42
+ * @return string Widget icon.
43
+ */
44
+ public function get_icon() {
45
+ return 'hm hm-madel';
46
+ }
47
+
48
+ public function get_keywords() {
49
+ return [ 'info', 'blurb', 'box', 'text', 'content' ];
50
+ }
51
+
52
+ /**
53
+ * Register content related controls
54
+ */
55
+ protected function register_content_controls() {
56
+ $this->start_controls_section(
57
+ '_section_number',
58
+ [
59
+ 'label' => __( 'Number', 'happy-elementor-addons' ),
60
+ 'tab' => Controls_Manager::TAB_CONTENT,
61
+ ]
62
+ );
63
+
64
+ $this->add_control(
65
+ 'number_text',
66
+ [
67
+ 'label' => __( 'Text', 'happy-elementor-addons' ),
68
+ 'label_block' => false,
69
+ 'type' => Controls_Manager::TEXT,
70
+ 'default' => 1
71
+ ]
72
+ );
73
+
74
+ $this->end_controls_section();
75
+ }
76
+
77
+ /**
78
+ * Register styles related controls
79
+ */
80
+ protected function register_style_controls() {
81
+ $this->start_controls_section(
82
+ '_section_style_number',
83
+ [
84
+ 'label' => __( 'Text', 'happy-elementor-addons' ),
85
+ 'tab' => Controls_Manager::TAB_STYLE,
86
+ ]
87
+ );
88
+
89
+ $this->add_control(
90
+ 'number_text_color',
91
+ [
92
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
93
+ 'type' => Controls_Manager::COLOR,
94
+ 'selectors' => [
95
+ '{{WRAPPER}} .ha-number-border' => 'color: {{VALUE}};',
96
+ ],
97
+ ]
98
+ );
99
+
100
+ $this->add_group_control(
101
+ Group_Control_Typography::get_type(),
102
+ [
103
+ 'name' => 'number_text_typography',
104
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
105
+ 'selector' => '{{WRAPPER}} .ha-number-border',
106
+ ]
107
+ );
108
+
109
+ $this->add_group_control(
110
+ Group_Control_Text_Shadow::get_type(),
111
+ [
112
+ 'name' => 'number_text_shadow',
113
+ 'label' => __( 'Text Shadow', 'happy-elementor-addons' ),
114
+ 'selector' => '{{WRAPPER}} .ha-number-border span',
115
+ ]
116
+ );
117
+
118
+ $this->add_control(
119
+ 'number_text_rotate',
120
+ [
121
+ 'label' => __( 'Text Rotate', 'happy-elementor-addons' ),
122
+ 'type' => Controls_Manager::SLIDER,
123
+ 'size_units' => [ 'px' ],
124
+ 'range' => [
125
+ 'px' => [
126
+ 'min' => 0,
127
+ 'max' => 360,
128
+ 'step' => 5,
129
+ ],
130
+
131
+ ],
132
+ 'default' => [
133
+ 'unit' => 'px',
134
+ 'size' => 0,
135
+ ],
136
+ 'selectors' => [
137
+ '{{WRAPPER}} .ha-number-text' => '-webkit-transform: rotate({{SIZE}}deg);-ms-transform: rotate({{SIZE}}deg);transform: rotate({{SIZE}}deg);'
138
+ ],
139
+ ]
140
+ );
141
+
142
+ $this->end_controls_section();
143
+
144
+ $this->start_controls_section(
145
+ 'number_background_style',
146
+ [
147
+ 'label' => __( 'General', 'happy-elementor-addons' ),
148
+ 'tab' => Controls_Manager::TAB_STYLE,
149
+ ]
150
+ );
151
+
152
+ $this->add_responsive_control(
153
+ 'number_width_height',
154
+ [
155
+ 'label' => __( 'Width and Height', 'happy-elementor-addons' ),
156
+ 'type' => Controls_Manager::SLIDER,
157
+ 'size_units' => [ 'px' ],
158
+ 'range' => [
159
+ 'px' => [
160
+ 'min' => 0,
161
+ 'max' => 1000,
162
+ 'step' => 5,
163
+ ],
164
+ '%' => [
165
+ 'min' => 0,
166
+ 'max' => 100,
167
+ ],
168
+ ],
169
+ 'default' => [
170
+ 'unit' => 'px',
171
+ 'size' => 50,
172
+ ],
173
+ 'selectors' => [
174
+ '{{WRAPPER}} .ha-number-border' => 'width: {{SIZE}}{{UNIT}};height: {{SIZE}}{{UNIT}};',
175
+ ],
176
+ ]
177
+ );
178
+
179
+ $this->add_control(
180
+ 'number_padding',
181
+ [
182
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
183
+ 'type' => Controls_Manager::DIMENSIONS,
184
+ 'size_units' => [ 'px', '%', 'em' ],
185
+ 'selectors' => [
186
+ '{{WRAPPER}} .ha-number-border ' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
187
+ ],
188
+ ]
189
+ );
190
+
191
+ $this->add_control(
192
+ 'number_border_radius',
193
+ [
194
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
195
+ 'type' => Controls_Manager::DIMENSIONS,
196
+ 'size_units' => [ 'px', '%', 'em' ],
197
+ 'selectors' => [
198
+ '{{WRAPPER}} .ha-number-border' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
199
+ ],
200
+ ]
201
+ );
202
+
203
+ $this->add_group_control(
204
+ Group_Control_Border::get_type(),
205
+ [
206
+ 'name' => 'number_border',
207
+ 'label' => __( 'Border', 'happy-elementor-addons' ),
208
+ 'selector' => '{{WRAPPER}} .ha-number-border',
209
+ ]
210
+ );
211
+
212
+ $this->add_group_control(
213
+ Group_Control_Background::get_type(),
214
+ [
215
+ 'name' => 'number_background_color',
216
+ 'label' => __( 'Background', 'happy-elementor-addons' ),
217
+ 'types' => [ 'classic', 'gradient' ],
218
+ 'selector' => '{{WRAPPER}} .ha-number-border',
219
+ ]
220
+ );
221
+
222
+ $this->add_group_control(
223
+ Group_Control_Box_Shadow::get_type(),
224
+ [
225
+ 'name' => 'number_box_shadow',
226
+ 'label' => __( 'Box Shadow', 'happy-elementor-addons' ),
227
+ 'selector' => '{{WRAPPER}} .ha-number-border',
228
+ ]
229
+ );
230
+
231
+ $this->add_responsive_control(
232
+ 'number_align',
233
+ [
234
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
235
+ 'type' => Controls_Manager::CHOOSE,
236
+ 'options' => [
237
+ 'left' => [
238
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
239
+ 'icon' => 'fa fa-align-left',
240
+ ],
241
+ 'center' => [
242
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
243
+ 'icon' => 'fa fa-align-center',
244
+ ],
245
+ 'right' => [
246
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
247
+ 'icon' => 'fa fa-align-right',
248
+ ],
249
+ ],
250
+ 'toggle' => true,
251
+ 'selectors' => [
252
+ '{{WRAPPER}} .ha-number-border' => '{{VALUE}};'
253
+ ],
254
+ 'selectors_dictionary' => [
255
+ 'left' => 'float: left',
256
+ 'center' => 'margin: 0 auto',
257
+ 'right' => 'float:right'
258
+ ],
259
+ ]
260
+ );
261
+
262
+ $this->end_controls_section();
263
+ $this->start_controls_section(
264
+ 'number_background_style_overlay',
265
+ [
266
+ 'label' => __( 'Background Overlay', 'happy-elementor-addons' ),
267
+ 'tab' => Controls_Manager::TAB_STYLE,
268
+ ]
269
+ );
270
+
271
+ $this->add_group_control(
272
+ Group_Control_Background::get_type(),
273
+ [
274
+ 'name' => 'number_background_overlay_color',
275
+ 'label' => __( 'Background', 'happy-elementor-addons' ),
276
+ 'types' => [ 'classic', 'gradient' ],
277
+ 'selector' => '{{WRAPPER}} .ha-number-border .ha-number-border-overlay',
278
+ ]
279
+ );
280
+
281
+
282
+ $this->add_control(
283
+ 'number_background_overlay_blend_mode',
284
+ [
285
+ 'label' => __( 'Blend Mood', 'happy-elementor-addons' ),
286
+ 'type' => Controls_Manager::SELECT,
287
+ 'default' => 'normal',
288
+ 'options' => [
289
+ 'normal' => 'Normal',
290
+ 'multiply' => 'Multiply',
291
+ 'screen' => 'Screen',
292
+ 'overlay' => 'Overlay',
293
+ 'darken' => 'Darken',
294
+ 'lighten' => 'Lighten',
295
+ 'color-dodge' => 'Color Dodge',
296
+ 'color-burn' => 'Color Burn',
297
+ 'saturation' => 'Saturation',
298
+ 'difference' => 'Difference',
299
+ 'exclusion' => 'Exclusion',
300
+ 'hue' => 'Hue',
301
+ 'saturation' => 'Saturation',
302
+ 'color' => 'Color',
303
+ 'luminosity' => 'Luminosity',
304
+ ],
305
+ 'selectors' => [
306
+ '{{WRAPPER}} .ha-number-border-overlay' => 'mix-blend-mode: {{VALUE}}',
307
+ ],
308
+ ]
309
+ );
310
+
311
+
312
+ $this->add_responsive_control(
313
+ 'number_background_overlay_blend_mode_opacity',
314
+ [
315
+ 'label' => __( 'Opacity', 'happy-elementor-addons' ),
316
+ 'type' => Controls_Manager::SLIDER,
317
+ 'size_units' => [ 'px' ],
318
+ 'range' => [
319
+ 'px' => [
320
+ 'min' => 0,
321
+ 'max' => 1,
322
+ 'step' => .1,
323
+ ],
324
+ ],
325
+ 'default' => [
326
+ 'unit' => 'px',
327
+ 'size' => .5,
328
+ ],
329
+ 'selectors' => [
330
+ '{{WRAPPER}} .ha-number-border-overlay' => 'opacity: {{SIZE}};',
331
+ ],
332
+ ]
333
+ );
334
+
335
+ $this->end_controls_section();
336
+ }
337
+
338
+ protected function render() {
339
+ $settings = $this->get_settings_for_display();
340
+ ?>
341
+
342
+ <div class="ha-number-body">
343
+ <div class="ha-number-border">
344
+ <div class="ha-number-border-overlay"></div>
345
+ <span class="ha-number-text"><?php echo esc_html( $settings['number_text'] ); ?></span>
346
+ </div>
347
+ </div>
348
+
349
+ <?php
350
+ }
351
+ }
widgets/review/widget.php CHANGED
@@ -319,7 +319,7 @@ class Review extends Base {
319
  $this->add_control(
320
  'offset_toggle',
321
  [
322
- 'label' => __( 'Offset', 'plugin-name' ),
323
  'type' => Controls_Manager::POPOVER_TOGGLE,
324
  'label_off' => __( 'None', 'your-plugin' ),
325
  'label_on' => __( 'Custom', 'your-plugin' ),
319
  $this->add_control(
320
  'offset_toggle',
321
  [
322
+ 'label' => __( 'Offset', 'happy-elementor-addons' ),
323
  'type' => Controls_Manager::POPOVER_TOGGLE,
324
  'label_off' => __( 'None', 'your-plugin' ),
325
  'label_on' => __( 'Custom', 'your-plugin' ),
widgets/testimonial/widget.php CHANGED
@@ -165,10 +165,97 @@ class Testimonial extends Base {
165
  }
166
 
167
  protected function register_style_controls() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
168
  $this->start_controls_section(
169
  '_section_style_image',
170
  [
171
- 'label' => __( 'Reviewer Image', 'happy-elementor-addons' ),
172
  'tab' => Controls_Manager::TAB_STYLE,
173
  ]
174
  );
@@ -187,8 +274,8 @@ class Testimonial extends Base {
187
  ],
188
  'selectors' => [
189
  '{{WRAPPER}} .ha-testimonial__reviewer-thumb' => 'width: {{SIZE}}{{UNIT}};',
190
- '{{WRAPPER}}.ha-testimonial--left .ha-testimonial__content:after' => 'left: calc(({{SIZE}}{{UNIT}} / 2) - 13px);',
191
- '{{WRAPPER}}.ha-testimonial--right .ha-testimonial__content:after' => 'right: calc(({{SIZE}}{{UNIT}} / 2) - 13px);',
192
  ],
193
  ]
194
  );
@@ -258,7 +345,7 @@ class Testimonial extends Base {
258
  $this->start_controls_section(
259
  '_section_style_reviewer',
260
  [
261
- 'label' => __( 'Reviewer Text', 'happy-elementor-addons' ),
262
  'tab' => Controls_Manager::TAB_STYLE,
263
  ]
264
  );
@@ -298,10 +385,6 @@ class Testimonial extends Base {
298
  'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
299
  'type' => Controls_Manager::SLIDER,
300
  'size_units' => ['px'],
301
- 'default' => [
302
- 'unit' => 'px',
303
- 'size' => 20,
304
- ],
305
  'selectors' => [
306
  '{{WRAPPER}} .ha-testimonial__reviewer-name' => 'margin-bottom: {{SIZE}}{{UNIT}};',
307
  ],
@@ -313,7 +396,7 @@ class Testimonial extends Base {
313
  [
314
  'label' => __( 'Title', 'happy-elementor-addons' ),
315
  'type' => Controls_Manager::HEADING,
316
- 'separator' => 'before',
317
  ]
318
  );
319
 
@@ -339,97 +422,6 @@ class Testimonial extends Base {
339
  );
340
 
341
  $this->end_controls_section();
342
-
343
- $this->start_controls_section(
344
- '_section_style_testimonial',
345
- [
346
- 'label' => __( 'Testimonial', 'happy-elementor-addons' ),
347
- 'tab' => Controls_Manager::TAB_STYLE,
348
- ]
349
- );
350
-
351
- $this->add_responsive_control(
352
- 'testimonial_padding',
353
- [
354
- 'label' => __( 'Padding', 'happy-elementor-addons' ),
355
- 'type' => Controls_Manager::DIMENSIONS,
356
- 'size_units' => [ 'px', 'em', '%' ],
357
- 'selectors' => [
358
- '{{WRAPPER}} .ha-testimonial__content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
359
- ],
360
- ]
361
- );
362
-
363
- $this->add_responsive_control(
364
- 'description_spacing',
365
- [
366
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
367
- 'type' => Controls_Manager::SLIDER,
368
- 'size_units' => ['px'],
369
- 'default' => [
370
- 'unit' => 'px',
371
- 'size' => 20,
372
- ],
373
- 'selectors' => [
374
- '{{WRAPPER}} .ha-testimonial__content' => 'margin-bottom: {{SIZE}}{{UNIT}};',
375
- ],
376
- ]
377
- );
378
-
379
- $this->add_control(
380
- 'testimonial_color',
381
- [
382
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
383
- 'type' => Controls_Manager::COLOR,
384
- 'selectors' => [
385
- '{{WRAPPER}} .ha-testimonial__content' => 'color: {{VALUE}}',
386
- ],
387
- ]
388
- );
389
-
390
- $this->add_control(
391
- 'testimonial_bg_color',
392
- [
393
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
394
- 'type' => Controls_Manager::COLOR,
395
- 'selectors' => [
396
- '{{WRAPPER}} .ha-testimonial__content' => 'background-color: {{VALUE}};',
397
- '{{WRAPPER}} .ha-testimonial__content:after' => 'color: {{VALUE}};',
398
- ],
399
- ]
400
- );
401
-
402
- $this->add_group_control(
403
- Group_Control_Typography::get_type(),
404
- [
405
- 'name' => 'testimonial_typography',
406
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
407
- 'selector' => '{{WRAPPER}} .ha-testimonial__content',
408
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
409
- ]
410
- );
411
-
412
- $this->add_responsive_control(
413
- 'testimonial_border_radius',
414
- [
415
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
416
- 'type' => Controls_Manager::DIMENSIONS,
417
- 'size_units' => [ 'px', '%' ],
418
- 'selectors' => [
419
- '{{WRAPPER}} .ha-testimonial__content' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
420
- ],
421
- ]
422
- );
423
-
424
- $this->add_group_control(
425
- Group_Control_Box_Shadow::get_type(),
426
- [
427
- 'name' => 'testimonial_box_shadow',
428
- 'selector' => '{{WRAPPER}} .ha-testimonial__content',
429
- ]
430
- );
431
-
432
- $this->end_controls_section();
433
  }
434
 
435
  protected function render() {
165
  }
166
 
167
  protected function register_style_controls() {
168
+ $this->start_controls_section(
169
+ '_section_style_testimonial',
170
+ [
171
+ 'label' => __( 'Testimonial', 'happy-elementor-addons' ),
172
+ 'tab' => Controls_Manager::TAB_STYLE,
173
+ ]
174
+ );
175
+
176
+ $this->add_responsive_control(
177
+ 'testimonial_padding',
178
+ [
179
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
180
+ 'type' => Controls_Manager::DIMENSIONS,
181
+ 'size_units' => [ 'px', 'em', '%' ],
182
+ 'selectors' => [
183
+ '{{WRAPPER}} .ha-testimonial__content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
184
+ ],
185
+ ]
186
+ );
187
+
188
+ $this->add_responsive_control(
189
+ 'testimonial_spacing',
190
+ [
191
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
192
+ 'type' => Controls_Manager::SLIDER,
193
+ 'size_units' => ['px'],
194
+ 'selectors' => [
195
+ '{{WRAPPER}} .ha-testimonial__content' => 'margin-bottom: {{SIZE}}{{UNIT}};',
196
+ ],
197
+ ]
198
+ );
199
+
200
+ $this->add_control(
201
+ 'testimonial_color',
202
+ [
203
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
204
+ 'type' => Controls_Manager::COLOR,
205
+ 'selectors' => [
206
+ '{{WRAPPER}} .ha-testimonial__content' => 'color: {{VALUE}}',
207
+ ],
208
+ ]
209
+ );
210
+
211
+ $this->add_control(
212
+ 'testimonial_bg_color',
213
+ [
214
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
215
+ 'type' => Controls_Manager::COLOR,
216
+ 'selectors' => [
217
+ '{{WRAPPER}} .ha-testimonial__content' => 'background-color: {{VALUE}};',
218
+ '{{WRAPPER}} .ha-testimonial__content:after' => 'color: {{VALUE}};',
219
+ ],
220
+ ]
221
+ );
222
+
223
+ $this->add_group_control(
224
+ Group_Control_Typography::get_type(),
225
+ [
226
+ 'name' => 'testimonial_typography',
227
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
228
+ 'selector' => '{{WRAPPER}} .ha-testimonial__content',
229
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
230
+ ]
231
+ );
232
+
233
+ $this->add_responsive_control(
234
+ 'testimonial_border_radius',
235
+ [
236
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
237
+ 'type' => Controls_Manager::DIMENSIONS,
238
+ 'size_units' => [ 'px', '%' ],
239
+ 'selectors' => [
240
+ '{{WRAPPER}} .ha-testimonial__content' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
241
+ ],
242
+ ]
243
+ );
244
+
245
+ $this->add_group_control(
246
+ Group_Control_Box_Shadow::get_type(),
247
+ [
248
+ 'name' => 'testimonial_box_shadow',
249
+ 'selector' => '{{WRAPPER}} .ha-testimonial__content',
250
+ ]
251
+ );
252
+
253
+ $this->end_controls_section();
254
+
255
  $this->start_controls_section(
256
  '_section_style_image',
257
  [
258
+ 'label' => __( 'Image', 'happy-elementor-addons' ),
259
  'tab' => Controls_Manager::TAB_STYLE,
260
  ]
261
  );
274
  ],
275
  'selectors' => [
276
  '{{WRAPPER}} .ha-testimonial__reviewer-thumb' => 'width: {{SIZE}}{{UNIT}};',
277
+ '{{WRAPPER}}.ha-testimonial--left .ha-testimonial__content:after' => 'left: calc(({{SIZE}}{{UNIT}} / 2) - 18px);',
278
+ '{{WRAPPER}}.ha-testimonial--right .ha-testimonial__content:after' => 'right: calc(({{SIZE}}{{UNIT}} / 2) - 18px);',
279
  ],
280
  ]
281
  );
345
  $this->start_controls_section(
346
  '_section_style_reviewer',
347
  [
348
+ 'label' => __( 'Reviewer Data', 'happy-elementor-addons' ),
349
  'tab' => Controls_Manager::TAB_STYLE,
350
  ]
351
  );
385
  'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
386
  'type' => Controls_Manager::SLIDER,
387
  'size_units' => ['px'],
 
 
 
 
388
  'selectors' => [
389
  '{{WRAPPER}} .ha-testimonial__reviewer-name' => 'margin-bottom: {{SIZE}}{{UNIT}};',
390
  ],
396
  [
397
  'label' => __( 'Title', 'happy-elementor-addons' ),
398
  'type' => Controls_Manager::HEADING,
399
+ 'separator' => 'after',
400
  ]
401
  );
402
 
422
  );
423
 
424
  $this->end_controls_section();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
425
  }
426
 
427
  protected function render() {