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

Version Description

  • 3 December 2019 =

  • New: Happy Clone - (duplicate post/page from anywhere!)

  • New: News Ticker Widget

  • New: Fixed size controls in Elementor Button widget

  • Fix: Badge offset responsive issue for Icon Box Widget

  • Fix: Wrapper is rendered when icon/image is missing issue

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 2.4.0
Comparing to
See all releases

Code changes from version 2.3.0 to 2.4.0

assets/css/main.css CHANGED
@@ -2640,3 +2640,65 @@
2640
  font-size: 16px;
2641
  line-height: 1.5;
2642
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2640
  font-size: 16px;
2641
  line-height: 1.5;
2642
  }
2643
+
2644
+ .ha-news-ticker-wrapper {
2645
+ position: relative;
2646
+ overflow: hidden;
2647
+ padding: 20px 0;
2648
+ border: 1px solid #d2d2d2;
2649
+ border-radius: 5px;
2650
+ }
2651
+
2652
+ .ha-news-ticker-wrapper ul.ha-news-ticker-container {
2653
+ display: -webkit-box;
2654
+ display: -webkit-flex;
2655
+ display: -ms-flexbox;
2656
+ display: flex;
2657
+ margin: 0;
2658
+ padding: 0;
2659
+ list-style: none;
2660
+ }
2661
+
2662
+ .ha-news-ticker-wrapper ul.ha-news-ticker-container:hover,
2663
+ .ha-news-ticker-wrapper ul.ha-news-ticker-container:focus {
2664
+ -webkit-animation-play-state: paused !important;
2665
+ animation-play-state: paused !important;
2666
+ }
2667
+
2668
+ .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title {
2669
+ position: absolute;
2670
+ top: 50%;
2671
+ left: auto;
2672
+ z-index: 1;
2673
+ padding: 20px;
2674
+ background: #333;
2675
+ color: #fff;
2676
+ font-size: 1rem;
2677
+ line-height: 1;
2678
+ -webkit-transform: translateY(-50%);
2679
+ -ms-transform: translateY(-50%);
2680
+ transform: translateY(-50%);
2681
+ }
2682
+
2683
+ .ha-news-ticker-wrapper li.ha-news-ticker-item {
2684
+ margin-right: 20px;
2685
+ white-space: nowrap;
2686
+ }
2687
+
2688
+ .ha-news-ticker-wrapper li.ha-news-ticker-item:last-child {
2689
+ margin-right: 0;
2690
+ }
2691
+
2692
+ .ha-news-ticker-wrapper .ha-news-ticker-title {
2693
+ margin: 0;
2694
+ font-size: 1rem;
2695
+ line-height: 1;
2696
+ }
2697
+
2698
+ .ha-news-ticker-wrapper li.ha-news-ticker-item a {
2699
+ color: #242424;
2700
+ }
2701
+
2702
+ .ha-news-ticker-wrapper li.ha-news-ticker-item a:hover {
2703
+ color: #e04c8a;
2704
+ }
assets/css/main.min.css CHANGED
@@ -1 +1 @@
1
- .happy-addon>.elementor-widget-container{word-wrap:break-word;overflow-wrap:break-word;box-sizing:border-box}.happy-addon>.elementor-widget-container *{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-screen-reader-text{position:absolute;overflow:hidden;clip:rect(1px,1px,1px,1px);margin:-1px;padding:0;width:1px;height:1px;border:0;word-wrap:normal!important;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.ha-has-background-overlay>.elementor-widget-container{position:relative;z-index:1}.ha-has-background-overlay>.elementor-widget-container:before{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;content:""}.ha-popup--is-enabled .ha-js-popup,.ha-popup--is-enabled .ha-js-popup img{cursor:-webkit-zoom-in!important;cursor:zoom-in!important}.mfp-wrap .mfp-arrow,.mfp-wrap .mfp-close{background-color:transparent}.mfp-wrap .mfp-arrow:focus,.mfp-wrap .mfp-close:focus{outline-width:thin}.ha-btn{display:inline-block;max-width:100%;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+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-badge{padding:.475rem 1.1rem;max-width:100%;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-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{display:inline-block;width:100%}.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-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-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i:before,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i:before,.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{display:inline-block;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:#562dd4;color:#fff}.ha-review-ratting--star{color:#ffbf36}.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;max-width:100%}.ha-gallery-filter>li:not(:last-child){margin-right:10px}.ha-gallery-filter>li>button{display:block;overflow:hidden;padding:10px 25px;max-width:100%;border:2px solid #562dd4;border-radius:.25rem;background-color:transparent;color:#562dd4;text-transform:uppercase;text-overflow:ellipsis;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-inner{position:relative;display:block;overflow:hidden;margin:10px;text-decoration:none}.ha-image-grid-inner img{display:block;width:100%;-webkit-transition:all .25s;transition:all .25s}.ha-image-grid--layout-even .ha-image-grid-inner{height:250px}.ha-image-grid--layout-even .ha-image-grid-inner img{height:100%}.ha-justified-gallery-item,.ha-justified-gallery-item>img{border-radius:6px}.ha-justified-gallery .justified-gallery>.ha-justified-gallery-item>.caption{bottom:-100px!important;padding:10px;-webkit-transition:all .25s!important;transition:all .25s!important;-webkit-animation:haSmoothReveal .3s forwards;animation:haSmoothReveal .3s forwards}.ha-justified-gallery .justified-gallery>.ha-justified-gallery-item>.caption.caption-visible{bottom:0!important}.ha-justified-gallery .justified-gallery>.entry-visible>a>img,.ha-justified-gallery .justified-gallery>.entry-visible>img{-webkit-transition:all 300ms,opacity 500ms ease-in;transition:all 300ms,opacity 500ms ease-in}@-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-carousel .slick-vertical .slick-slide,.ha-slider .slick-vertical .slick-slide{border:0}.ha-carousel .slick-next,.ha-carousel .slick-prev,.ha-slider .slick-next,.ha-slider .slick-prev{z-index:999;padding:0;border:1px solid rgba(255,255,255,.8);border-radius:50%;background-color:rgba(255,255,255,.8);color:#8c8c8c;text-align:center;font-size:12px;opacity:1}.ha-carousel .slick-next:focus,.ha-carousel .slick-next:hover,.ha-carousel .slick-prev:focus,.ha-carousel .slick-prev:hover,.ha-slider .slick-next:focus,.ha-slider .slick-next:hover,.ha-slider .slick-prev:focus,.ha-slider .slick-prev:hover{background-color:#fff}.ha-carousel .slick-next:before,.ha-carousel .slick-prev:before,.ha-slider .slick-next:before,.ha-slider .slick-prev:before{content:""}.ha-carousel .slick-disabled,.ha-slider .slick-disabled{opacity:.7}.ha-carousel .slick-prev,.ha-slider .slick-prev{left:25px}.ha-carousel .slick-next,.ha-slider .slick-next{right:25px}.ha-carousel .slick-dots,.ha-slider .slick-dots{bottom:-40px}.ha-carousel .slick-dots li,.ha-slider .slick-dots li{margin-right:2px;margin-left:2px}.ha-carousel .slick-dots li button:focus,.ha-carousel .slick-dots li button:hover,.ha-slider .slick-dots li button:focus,.ha-slider .slick-dots li button:hover{background-color:transparent}.ha-carousel .slick-dots li button:before,.ha-slider .slick-dots li button:before{color:#1b1b1b;opacity:1}.ha-carousel .slick-dots .slick-active button:before,.ha-carousel .slick-dots li button:hover:before,.ha-slider .slick-dots .slick-active button:before,.ha-slider .slick-dots li button:hover:before{-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.ha-carousel .slick-next,.ha-carousel .slick-prev{width:40px;height:40px;line-height:40px}.ha-slider .slick-next,.ha-slider .slick-prev{width:50px;height:50px;line-height:50px}.ha-carousel .slick-slider:not(.slick-vertical) .slick-slide{padding-right:5px;padding-left:5px}.ha-carousel .slick-slider.slick-vertical .slick-slide{padding-top:5px;padding-bottom:5px}.ha-slick-item{position:relative;overflow:hidden;vertical-align:bottom}.ha-slick-content{position:absolute;bottom:0;padding:1.5rem;width:100%;background:-webkit-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.3));background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.3))}.ha-slick-title{margin-top:0;margin-bottom:.2rem;color:#fff;font-size:20px}.ha-slick-subtitle{margin:0;color:#fff}.ha-skills>.elementor-widget-container{padding-top:1px}.ha-skill{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-radius:15px;background-color:#e9ecef;font-size:.75rem}.ha-skill--inside .ha-skill-info,.ha-skill--outside .ha-skill-info{text-align:left;font-size:14px;line-height:1}.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{height:30px}.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;width:10%;border-radius:inherit;background-color:#562dd4;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-skill-name{display:inline-block;overflow:hidden;max-width:70%;text-overflow:ellipsis}.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%}@media (min-width:1025px){.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) and (min-width:768px){.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}@media (min-width:1025px){.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}@media (max-width:767px){.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}.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}@media (min-width:1025px){.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) and (min-width:768px){.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}@media (min-width:1025px){.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) and (min-width:768px){.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-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;max-width:100%;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab;color:#fff}.ha-dual-btn--right{background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e;color:#fff}.ha-dual-btn-connector{position:absolute!important;z-index:9;overflow:hidden;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>svg{width:1em;height:auto}.ha-dual-btn-icon>i{font-size:1em}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}.ha-dual-button>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-button--mobile-layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--mobile-layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--mobile-layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--mobile-layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--mobile-layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-center>.elementor-widget-container,.ha-testimonial__reviewer{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--mobile-layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--mobile-layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--mobile-layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--mobile-layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--mobile-layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}@media (min-width:768px){.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-center>.elementor-widget-container{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--tablet-layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--tablet-layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--tablet-layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--tablet-layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--tablet-layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--tablet-layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--tablet-layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--tablet-layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--tablet-layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--tablet-layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}}@media (min-width:1025px){.ha-dual-button--layout-stack.ha-dual-button--align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--layout-stack.ha-dual-button--align-center>.elementor-widget-container{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--layout-stack.ha-dual-button--align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--layout-queue.ha-dual-button--align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--layout-queue.ha-dual-button--align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--layout-queue.ha-dual-button--align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}}.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-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{-webkit-box-flex:0;-webkit-flex:0 0 65px;-ms-flex:0 0 65px;flex:0 0 65px;max-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;max-width:100%}.ha-testimonial--left .ha-testimonial__reviewer-meta,.ha-testimonial--right .ha-testimonial__reviewer-meta{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 65px);-ms-flex:0 0 calc(100% - 65px);flex:0 0 calc(100% - 65px);max-width:calc(100% - 65px)}.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-number-body,.ha-testimonial--center{text-align:center}.ha-number-body{position:relative;display:-webkit-box;display:-webkit-flex;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-color:#562dd4;color:#fff;font-size:20px}.ha-number-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ha-number-text{position:relative;z-index:1;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-flip-box-container:after{display:block;visibility:hidden;clear:both;height:0;content:" ";font-size:0}.ha-flip-box-container .ha-flip-box-inner{position:relative;z-index:1;margin:0;padding:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-back{z-index:1}.ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-front{z-index:-1}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-inner-wrapper{position:relative;-webkit-transform:translateZ(0);-webkit-perspective:1000px;perspective:1000px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front{top:0;right:0;left:0;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;height:250px;background-position:center;background-clip:padding-box;background-size:cover;background-repeat:no-repeat;text-align:center;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front{background-color:transparent;position:relative;bottom:0;z-index:10;padding:30px;border:1px solid #ddd;border-radius:.3rem}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back:before,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front:before{position:absolute;top:0;left:0;z-index:-9;width:100%;height:100%;background-color:transparent;content:""}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back{position:absolute;z-index:-1;padding:46px;border-radius:.3rem;background-color:#562dd4;color:#fff}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner{position:relative;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;width:100%}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-text,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-text{text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-text p,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-text p{margin-top:10px;margin-bottom:0}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon.icon{padding:20px;border-radius:50%;background-color:#f1f4f8;color:#242424}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon{display:inline-block;margin-bottom:20px;text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i{position:relative;display:block;width:1em;height:1em;font-size:28px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon img,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon img{width:60px;height:60px;vertical-align:middle}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-box-heading{margin:0;font-weight:700;font-size:20px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner p{margin-bottom:0;font-size:16px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-box-heading-back{margin:0;color:#fff;font-size:18px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon{display:inline-block;margin-bottom:20px;text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i{position:relative;display:block;width:1em;height:1em;color:#fff;font-size:20px}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-back{-webkit-transform:rotateY(0);transform:rotateY(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-back{-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-front{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-back{-webkit-transform:rotateX(0);transform:rotateX(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-back{-webkit-transform:rotateX(-180deg);transform:rotateX(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-front{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-back,.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-front{-webkit-transition:-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275),-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275)}.ha-logo-grid-wrapper:after{display:block;clear:both;content:""}.ha-pricing-table>.elementor-widget-container{position:relative;overflow:hidden;padding:3em 4em}.ha-pricing-table-badge{position:absolute;top:-1px;padding:.8rem 1rem;background-color:#e2498a;color:#fff;line-height:1}.ha-pricing-table-badge--left{left:0;-webkit-transform:rotate(-90deg) translateX(-100%);-ms-transform:rotate(-90deg) translateX(-100%);transform:rotate(-90deg) translateX(-100%);-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.ha-pricing-table-badge--right{right:0;-webkit-transform:rotate(-90deg) translateY(-100%);-ms-transform:rotate(-90deg) translateY(-100%);transform:rotate(-90deg) translateY(-100%);-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top}.ha-pricing-table-title{margin-top:0;margin-bottom:.5rem;color:#242424;font-weight:400;font-size:24px}.ha-pricing-table-price{margin-bottom:3rem}.ha-pricing-table-price-tag{margin-bottom:.5rem;color:#242424;font-weight:700;font-size:60px;line-height:normal}.ha-pricing-table-currency{font-size:24px}.ha-pricing-table-period{color:#8c8c8c;font-size:16px}.ha-pricing-table-body{margin-bottom:3rem}.ha-pricing-table-features-title{margin-top:0;margin-bottom:1rem;font-weight:700;font-size:16px}.ha-pricing-table-features-list{margin:0;padding:0;list-style:none}.ha-pricing-table-features-list li{margin-bottom:1rem;font-size:16px}.ha-pricing-table-features-list i{margin-right:.5rem;min-width:15px;font-size:.8em}.ha-pricing-table-feature-text{display:inline-block}.ha-pricing-table-btn{display:inline-block;padding:.8rem 2rem;border-radius:40px;background-color:#e2498a;color:#fff;text-decoration:none;text-transform:uppercase;font-size:12px;-webkit-transition:all .3s;transition:all .3s}.ha-pricing-table-btn:hover{background-color:#562dd4;color:#fff}.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-pricing-table>.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)}.ha-step-flow>.elementor-widget-container{padding:30px;text-align:center}.ha-step-arrow,.ha-step-arrow:after{position:absolute;display:inline-block;border-top:1px solid #ddd}.ha-step-arrow{left:calc(100% + 20px);top:49%;width:100px}.ha-step-arrow:after{top:-2px;right:5px;width:12px;height:12px;border-right:1px solid #ddd;color:#ddd;content:"";-webkit-transform:rotate(45deg) translateY(-50%);-ms-transform:rotate(45deg) translateY(-50%);transform:rotate(45deg) translateY(-50%)}.ha-steps-icon{position:relative;display:inline-block;margin-bottom:2rem;padding:40px;border-radius:50%;background-color:#e9ecf0;box-shadow:0 2px 6px -2px #989898;color:#8056ee;text-align:center;font-size:46px}.ha-steps-icon i{position:relative;display:block;width:1em;height:1em}.ha-steps-icon i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-steps-icon .ha-steps-label{position:absolute;top:5px;right:0;overflow:hidden;padding:12px 8px;max-width:200%;border:3px solid #fff;border-radius:20px;background-color:#8056ee;color:#fff;text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1}.ha-steps-title{margin-top:0;margin-bottom:30px;font-weight:700;font-size:16px}.ha-steps-title a{display:block;color:#562dd4}.ha-steps-title a:hover{color:#242424}.ha-step-description{margin:0;color:#616161;font-weight:400;font-size:16px;line-height:1.5}
1
+ .happy-addon>.elementor-widget-container{word-wrap:break-word;overflow-wrap:break-word;box-sizing:border-box}.happy-addon>.elementor-widget-container *{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-screen-reader-text{position:absolute;overflow:hidden;clip:rect(1px,1px,1px,1px);margin:-1px;padding:0;width:1px;height:1px;border:0;word-wrap:normal!important;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.ha-has-background-overlay>.elementor-widget-container{position:relative;z-index:1}.ha-has-background-overlay>.elementor-widget-container:before{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;content:""}.ha-popup--is-enabled .ha-js-popup,.ha-popup--is-enabled .ha-js-popup img{cursor:-webkit-zoom-in!important;cursor:zoom-in!important}.mfp-wrap .mfp-arrow,.mfp-wrap .mfp-close{background-color:transparent}.mfp-wrap .mfp-arrow:focus,.mfp-wrap .mfp-close:focus{outline-width:thin}.ha-btn{display:inline-block;max-width:100%;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+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-badge{padding:.475rem 1.1rem;max-width:100%;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-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{display:inline-block;width:100%}.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-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-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i:before,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i:before,.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{display:inline-block;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:#562dd4;color:#fff}.ha-review-ratting--star{color:#ffbf36}.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;max-width:100%}.ha-gallery-filter>li:not(:last-child){margin-right:10px}.ha-gallery-filter>li>button{display:block;overflow:hidden;padding:10px 25px;max-width:100%;border:2px solid #562dd4;border-radius:.25rem;background-color:transparent;color:#562dd4;text-transform:uppercase;text-overflow:ellipsis;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-inner{position:relative;display:block;overflow:hidden;margin:10px;text-decoration:none}.ha-image-grid-inner img{display:block;width:100%;-webkit-transition:all .25s;transition:all .25s}.ha-image-grid--layout-even .ha-image-grid-inner{height:250px}.ha-image-grid--layout-even .ha-image-grid-inner img{height:100%}.ha-justified-gallery-item,.ha-justified-gallery-item>img{border-radius:6px}.ha-justified-gallery .justified-gallery>.ha-justified-gallery-item>.caption{bottom:-100px!important;padding:10px;-webkit-transition:all .25s!important;transition:all .25s!important;-webkit-animation:haSmoothReveal .3s forwards;animation:haSmoothReveal .3s forwards}.ha-justified-gallery .justified-gallery>.ha-justified-gallery-item>.caption.caption-visible{bottom:0!important}.ha-justified-gallery .justified-gallery>.entry-visible>a>img,.ha-justified-gallery .justified-gallery>.entry-visible>img{-webkit-transition:all 300ms,opacity 500ms ease-in;transition:all 300ms,opacity 500ms ease-in}@-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-carousel .slick-vertical .slick-slide,.ha-slider .slick-vertical .slick-slide{border:0}.ha-carousel .slick-next,.ha-carousel .slick-prev,.ha-slider .slick-next,.ha-slider .slick-prev{z-index:999;padding:0;border:1px solid rgba(255,255,255,.8);border-radius:50%;background-color:rgba(255,255,255,.8);color:#8c8c8c;text-align:center;font-size:12px;opacity:1}.ha-carousel .slick-next:focus,.ha-carousel .slick-next:hover,.ha-carousel .slick-prev:focus,.ha-carousel .slick-prev:hover,.ha-slider .slick-next:focus,.ha-slider .slick-next:hover,.ha-slider .slick-prev:focus,.ha-slider .slick-prev:hover{background-color:#fff}.ha-carousel .slick-next:before,.ha-carousel .slick-prev:before,.ha-slider .slick-next:before,.ha-slider .slick-prev:before{content:""}.ha-carousel .slick-disabled,.ha-slider .slick-disabled{opacity:.7}.ha-carousel .slick-prev,.ha-slider .slick-prev{left:25px}.ha-carousel .slick-next,.ha-slider .slick-next{right:25px}.ha-carousel .slick-dots,.ha-slider .slick-dots{bottom:-40px}.ha-carousel .slick-dots li,.ha-slider .slick-dots li{margin-right:2px;margin-left:2px}.ha-carousel .slick-dots li button:focus,.ha-carousel .slick-dots li button:hover,.ha-slider .slick-dots li button:focus,.ha-slider .slick-dots li button:hover{background-color:transparent}.ha-carousel .slick-dots li button:before,.ha-slider .slick-dots li button:before{color:#1b1b1b;opacity:1}.ha-carousel .slick-dots .slick-active button:before,.ha-carousel .slick-dots li button:hover:before,.ha-slider .slick-dots .slick-active button:before,.ha-slider .slick-dots li button:hover:before{-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.ha-carousel .slick-next,.ha-carousel .slick-prev{width:40px;height:40px;line-height:40px}.ha-slider .slick-next,.ha-slider .slick-prev{width:50px;height:50px;line-height:50px}.ha-carousel .slick-slider:not(.slick-vertical) .slick-slide{padding-right:5px;padding-left:5px}.ha-carousel .slick-slider.slick-vertical .slick-slide{padding-top:5px;padding-bottom:5px}.ha-slick-item{position:relative;overflow:hidden;vertical-align:bottom}.ha-slick-content{position:absolute;bottom:0;padding:1.5rem;width:100%;background:-webkit-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.3));background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.3))}.ha-slick-title{margin-top:0;margin-bottom:.2rem;color:#fff;font-size:20px}.ha-slick-subtitle{margin:0;color:#fff}.ha-skills>.elementor-widget-container{padding-top:1px}.ha-skill{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-radius:15px;background-color:#e9ecef;font-size:.75rem}.ha-skill--inside .ha-skill-info,.ha-skill--outside .ha-skill-info{text-align:left;font-size:14px;line-height:1}.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{height:30px}.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;width:10%;border-radius:inherit;background-color:#562dd4;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-skill-name{display:inline-block;overflow:hidden;max-width:70%;text-overflow:ellipsis}.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%}@media (min-width:1025px){.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) and (min-width:768px){.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}@media (min-width:1025px){.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}@media (max-width:767px){.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}.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}@media (min-width:1025px){.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) and (min-width:768px){.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}@media (min-width:1025px){.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) and (min-width:768px){.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-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;max-width:100%;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab;color:#fff}.ha-dual-btn--right{background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e;color:#fff}.ha-dual-btn-connector{position:absolute!important;z-index:9;overflow:hidden;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>svg{width:1em;height:auto}.ha-dual-btn-icon>i{font-size:1em}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}.ha-dual-button>.elementor-widget-container,.ha-news-ticker-wrapper ul.ha-news-ticker-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-button--mobile-layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--mobile-layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--mobile-layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--mobile-layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--mobile-layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-center>.elementor-widget-container,.ha-testimonial__reviewer{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--mobile-layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--mobile-layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--mobile-layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--mobile-layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--mobile-layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}@media (min-width:768px){.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-center>.elementor-widget-container{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--tablet-layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--tablet-layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--tablet-layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--tablet-layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--tablet-layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--tablet-layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--tablet-layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--tablet-layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--tablet-layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--tablet-layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}}@media (min-width:1025px){.ha-dual-button--layout-stack.ha-dual-button--align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--layout-stack.ha-dual-button--align-center>.elementor-widget-container{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--layout-stack.ha-dual-button--align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--layout-queue.ha-dual-button--align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--layout-queue.ha-dual-button--align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--layout-queue.ha-dual-button--align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}}.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-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{-webkit-box-flex:0;-webkit-flex:0 0 65px;-ms-flex:0 0 65px;flex:0 0 65px;max-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;max-width:100%}.ha-testimonial--left .ha-testimonial__reviewer-meta,.ha-testimonial--right .ha-testimonial__reviewer-meta{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 65px);-ms-flex:0 0 calc(100% - 65px);flex:0 0 calc(100% - 65px);max-width:calc(100% - 65px)}.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-number-body,.ha-testimonial--center{text-align:center}.ha-number-body{position:relative;display:-webkit-box;display:-webkit-flex;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-color:#562dd4;color:#fff;font-size:20px}.ha-number-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ha-number-text{position:relative;z-index:1;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-flip-box-container:after{display:block;visibility:hidden;clear:both;height:0;content:" ";font-size:0}.ha-flip-box-container .ha-flip-box-inner{position:relative;z-index:1;margin:0;padding:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-back{z-index:1}.ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-front{z-index:-1}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-inner-wrapper{position:relative;-webkit-transform:translateZ(0);-webkit-perspective:1000px;perspective:1000px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front{top:0;right:0;left:0;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;height:250px;background-position:center;background-clip:padding-box;background-size:cover;background-repeat:no-repeat;text-align:center;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front{background-color:transparent;position:relative;bottom:0;z-index:10;padding:30px;border:1px solid #ddd;border-radius:.3rem}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back:before,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front:before{position:absolute;top:0;left:0;z-index:-9;width:100%;height:100%;background-color:transparent;content:""}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back{position:absolute;z-index:-1;padding:46px;border-radius:.3rem;background-color:#562dd4;color:#fff}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner{position:relative;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;width:100%}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-text,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-text{text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-text p,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-text p{margin-top:10px;margin-bottom:0}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon.icon{padding:20px;border-radius:50%;background-color:#f1f4f8;color:#242424}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon{display:inline-block;margin-bottom:20px;text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i{position:relative;display:block;width:1em;height:1em;font-size:28px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon img,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon img{width:60px;height:60px;vertical-align:middle}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-box-heading{margin:0;font-weight:700;font-size:20px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner p{margin-bottom:0;font-size:16px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-box-heading-back{margin:0;color:#fff;font-size:18px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon{display:inline-block;margin-bottom:20px;text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i{position:relative;display:block;width:1em;height:1em;color:#fff;font-size:20px}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-back{-webkit-transform:rotateY(0);transform:rotateY(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-back{-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-front{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-back{-webkit-transform:rotateX(0);transform:rotateX(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-back{-webkit-transform:rotateX(-180deg);transform:rotateX(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-front{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-back,.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-front{-webkit-transition:-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275),-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275)}.ha-logo-grid-wrapper:after{display:block;clear:both;content:""}.ha-pricing-table>.elementor-widget-container{position:relative;overflow:hidden;padding:3em 4em}.ha-pricing-table-badge{position:absolute;top:-1px;padding:.8rem 1rem;background-color:#e2498a;color:#fff;line-height:1}.ha-pricing-table-badge--left{left:0;-webkit-transform:rotate(-90deg) translateX(-100%);-ms-transform:rotate(-90deg) translateX(-100%);transform:rotate(-90deg) translateX(-100%);-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.ha-pricing-table-badge--right{right:0;-webkit-transform:rotate(-90deg) translateY(-100%);-ms-transform:rotate(-90deg) translateY(-100%);transform:rotate(-90deg) translateY(-100%);-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top}.ha-pricing-table-title{margin-top:0;margin-bottom:.5rem;color:#242424;font-weight:400;font-size:24px}.ha-pricing-table-price{margin-bottom:3rem}.ha-pricing-table-price-tag{margin-bottom:.5rem;color:#242424;font-weight:700;font-size:60px;line-height:normal}.ha-pricing-table-currency{font-size:24px}.ha-pricing-table-period{color:#8c8c8c;font-size:16px}.ha-pricing-table-body{margin-bottom:3rem}.ha-pricing-table-features-title{margin-top:0;margin-bottom:1rem;font-weight:700;font-size:16px}.ha-pricing-table-features-list{margin:0;padding:0;list-style:none}.ha-pricing-table-features-list li{margin-bottom:1rem;font-size:16px}.ha-pricing-table-features-list i{margin-right:.5rem;min-width:15px;font-size:.8em}.ha-pricing-table-feature-text{display:inline-block}.ha-pricing-table-btn{display:inline-block;padding:.8rem 2rem;border-radius:40px;background-color:#e2498a;color:#fff;text-decoration:none;text-transform:uppercase;font-size:12px;-webkit-transition:all .3s;transition:all .3s}.ha-pricing-table-btn:hover{background-color:#562dd4;color:#fff}.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-pricing-table>.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)}.ha-step-flow>.elementor-widget-container{padding:30px;text-align:center}.ha-step-arrow,.ha-step-arrow:after{position:absolute;display:inline-block;border-top:1px solid #ddd}.ha-step-arrow{left:calc(100% + 20px);top:49%;width:100px}.ha-step-arrow:after{top:-2px;right:5px;width:12px;height:12px;border-right:1px solid #ddd;color:#ddd;content:"";-webkit-transform:rotate(45deg) translateY(-50%);-ms-transform:rotate(45deg) translateY(-50%);transform:rotate(45deg) translateY(-50%)}.ha-steps-icon{position:relative;display:inline-block;margin-bottom:2rem;padding:40px;border-radius:50%;background-color:#e9ecf0;box-shadow:0 2px 6px -2px #989898;color:#8056ee;text-align:center;font-size:46px}.ha-steps-icon i{position:relative;display:block;width:1em;height:1em}.ha-steps-icon i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-steps-icon .ha-steps-label{position:absolute;top:5px;right:0;overflow:hidden;padding:12px 8px;max-width:200%;border:3px solid #fff;border-radius:20px;background-color:#8056ee;color:#fff;text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1}.ha-steps-title{margin-top:0;margin-bottom:30px;font-weight:700;font-size:16px}.ha-steps-title a{display:block;color:#562dd4}.ha-news-ticker-wrapper li.ha-news-ticker-item a,.ha-steps-title a:hover{color:#242424}.ha-step-description{margin:0;color:#616161;font-weight:400;font-size:16px;line-height:1.5}.ha-news-ticker-wrapper{position:relative;overflow:hidden;padding:20px 0;border:1px solid #d2d2d2;border-radius:5px}.ha-news-ticker-wrapper ul.ha-news-ticker-container{margin:0;padding:0;list-style:none}.ha-news-ticker-wrapper ul.ha-news-ticker-container:focus,.ha-news-ticker-wrapper ul.ha-news-ticker-container:hover{-webkit-animation-play-state:paused!important;animation-play-state:paused!important}.ha-news-ticker-wrapper span.ha-news-ticker-sticky-title{position:absolute;top:50%;left:auto;z-index:1;padding:20px;background:#333;color:#fff;font-size:1rem;line-height:1;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-news-ticker-wrapper li.ha-news-ticker-item{margin-right:20px;white-space:nowrap}.ha-news-ticker-wrapper li.ha-news-ticker-item:last-child{margin-right:0}.ha-news-ticker-wrapper .ha-news-ticker-title{margin:0;font-size:1rem;line-height:1}.ha-news-ticker-wrapper li.ha-news-ticker-item a:hover{color:#e04c8a}
assets/css/widgets/news-ticker.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-news-ticker-wrapper{position:relative;overflow:hidden;padding:20px 0;border:1px solid #d2d2d2;border-radius:5px}.ha-news-ticker-wrapper ul.ha-news-ticker-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0;padding:0;list-style:none}.ha-news-ticker-wrapper ul.ha-news-ticker-container:focus,.ha-news-ticker-wrapper ul.ha-news-ticker-container:hover{-webkit-animation-play-state:paused!important;animation-play-state:paused!important}.ha-news-ticker-wrapper span.ha-news-ticker-sticky-title{position:absolute;top:50%;left:auto;z-index:1;padding:20px;background:#333;color:#fff;font-size:1rem;line-height:1;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-news-ticker-wrapper li.ha-news-ticker-item{margin-right:20px;white-space:nowrap}.ha-news-ticker-wrapper li.ha-news-ticker-item:last-child{margin-right:0}.ha-news-ticker-wrapper .ha-news-ticker-title{margin:0;font-size:1rem;line-height:1}.ha-news-ticker-wrapper li.ha-news-ticker-item a{color:#242424}.ha-news-ticker-wrapper li.ha-news-ticker-item a:hover{color:#e04c8a}
assets/js/happy-addons.js CHANGED
@@ -385,6 +385,58 @@
385
  }
386
  });
387
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
388
  var handlersFnMap = {
389
  'ha-image-compare.default': HandleImageCompare,
390
  'ha-justified-gallery.default': HandleJustifiedGallery,
@@ -400,6 +452,7 @@
400
  'ha-slider.default': Slick,
401
  'ha-carousel.default': Slick,
402
  'ha-image-grid.default': Isotope,
 
403
  'widget': ExtensionHandler
404
  };
405
 
385
  }
386
  });
387
 
388
+ //NewsTicker
389
+ var NewsTicker = EM.frontend.handlers.Base.extend({
390
+
391
+ onInit: function () {
392
+ EM.frontend.handlers.Base.prototype.onInit.apply(this, arguments);
393
+ this.wrapper = this.$element.find('.ha-news-ticker-wrapper');
394
+ this.run();
395
+ },
396
+ onElementChange: function (changed_prop) {
397
+ if( changed_prop === 'item_space' || changed_prop === 'title_typography_font_size' ){
398
+ this.run();
399
+ }
400
+ },
401
+ run: function () {
402
+ var wrapper_height = this.wrapper.innerHeight(),
403
+ wrapper_width = this.wrapper.innerWidth(),
404
+ container = this.wrapper.find('.ha-news-ticker-container'),
405
+ single_item = container.find('.ha-news-ticker-item'),
406
+ scroll_direction = this.wrapper.data('scroll-direction'),
407
+ scroll = 'scroll'+scroll_direction+wrapper_height+wrapper_width,
408
+ duration = this.wrapper.data('duration'),
409
+ direction = 'normal',
410
+ all_title_width = 10;
411
+
412
+ var start = {'transform': 'translateX(0'+wrapper_width+'px)'},
413
+ end = {'transform': 'translateX(-101%)'};
414
+ if('right' === scroll_direction){
415
+ direction = 'reverse';
416
+ }
417
+ single_item.each(function(){
418
+ all_title_width += $(this).outerWidth(true);
419
+ });
420
+ container.css({'width':all_title_width,'display':'flex'});
421
+ $.keyframe.define([{
422
+ name: scroll,
423
+ '0%': start,
424
+ '100%':end,
425
+ }]);
426
+ container.playKeyframe({
427
+ name: scroll,
428
+ duration: duration+'ms',
429
+ timingFunction: 'linear',
430
+ delay: '0s',
431
+ iterationCount: 'infinite',
432
+ direction: direction,
433
+ fillMode: 'none',
434
+ complete: function(){
435
+ }
436
+ });
437
+ }
438
+ });
439
+
440
  var handlersFnMap = {
441
  'ha-image-compare.default': HandleImageCompare,
442
  'ha-justified-gallery.default': HandleJustifiedGallery,
452
  'ha-slider.default': Slick,
453
  'ha-carousel.default': Slick,
454
  'ha-image-grid.default': Isotope,
455
+ 'ha-news-ticker.default': NewsTicker,
456
  'widget': ExtensionHandler
457
  };
458
 
assets/js/happy-addons.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";!function(t,e){function i(t,e,i){var n;return function(){var s=this,o=arguments,a=function(){n=null,i||t.apply(s,o)},l=i&&!n;clearTimeout(n),n=setTimeout(a,e),l&&t.apply(s,o)}}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"))})}function s(e,i,n,s){if(t.fn.magnificPopup){if(!n)return void t.magnificPopup.close();e.on("click",i,function(t){t.stopPropagation()}),e.find(i).magnificPopup({key:s,type:"image",image:{titleSrc:function(t){return t.el.attr("title")?t.el.attr("title"):t.el.find("img").attr("alt")}},gallery:{enabled:!0,preload:[1,2]},zoom:{enabled:!0,duration:300,easing:"ease-in-out",opener:function(t){return t.is("img")?t:t.find("img")}}})}}var o=t(e);t.fn.getHappySettings=function(){return this.data("happy-settings")};var a=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)})},l=function(e){var i=e.find(".hajs-justified-gallery"),o=i.getHappySettings(),a=o.enable_popup;i.justifiedGallery(t.extend({},{rowHeight:150,lastRow:"justify",margins:10},o)),s(e,".ha-js-popup",a,"justifiedgallery"),n(e,function(t){i.justifiedGallery({lastRow:"*"===t?o.lastRow:"nojustify",filter:t}),s(e,"*"!==t?t:".ha-js-popup",a,"justifiedgallery")})};o.on("elementor/frontend/init",function(){var e=elementorFrontend,o=elementorModules,r=o.frontend.handlers.Base.extend({onInit:function(){o.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.widgetContainer=this.$element.find(".elementor-widget-container")[0],this.initFloatingEffects(),this.initBackgroundOverlay()},initBackgroundOverlay:function(){this.isEdit&&this.$element.addClass("ha-has-background-overlay")},getDefaultSettings:function(){return{targets:this.widgetContainer,loop:!0,direction:"alternate",easing:"easeInOutSine"}},onElementChange:function(t){-1!==t.indexOf("ha_floating")&&this.runOnElementChange()},runOnElementChange:i(function(){this.animation&&this.animation.restart(),this.initFloatingEffects()},200),getConfig:function(t){return this.getElementSettings("ha_floating_fx_"+t)},initFloatingEffects: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.widgetContainer.style.setProperty("will-change","transform"),this.animation=anime(t))}}),g=o.frontend.handlers.Base.extend({onInit:function(){o.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.$container=this.$element.find(".hajs-slick"),this.run()},isCarousel:function(){return this.$element.hasClass("ha-carousel")},getDefaultSettings:function(){return{arrows:!1,dots:!1,checkVisible:!1,infinite:!0,slidesToShow:this.isCarousel()?3:1,rows:0,prevArrow:'<button type="button" class="slick-prev"><i class="fa fa-chevron-left"></i></button>',nextArrow:'<button type="button" class="slick-next"><i class="fa fa-chevron-right"></i></button>'}},onElementChange:function(){this.$container.slick("unslick"),this.run()},getReadySettings:function(){var i={infinite:!!this.getElementSettings("loop"),autoplay:!!this.getElementSettings("autoplay"),autoplaySpeed:this.getElementSettings("autoplay_speed"),speed:this.getElementSettings("animation_speed"),centerMode:!!this.getElementSettings("center"),vertical:!!this.getElementSettings("vertical"),slidesToScroll:1};switch(this.getElementSettings("navigation")){case"arrow":i.arrows=!0;break;case"dots":i.dots=!0;break;case"both":i.arrows=!0,i.dots=!0}return this.isCarousel()&&(i.slidesToShow=this.getElementSettings("slides_to_show")||3,i.responsive=[{breakpoint:e.config.breakpoints.lg,settings:{slidesToShow:this.getElementSettings("slides_to_show_tablet")||i.slidesToShow}},{breakpoint:e.config.breakpoints.md,settings:{slidesToShow:this.getElementSettings("slides_to_show_mobile")||this.getElementSettings("slides_to_show_tablet")||i.slidesToShow}}]),t.extend({},this.getDefaultSettings(),i)},run:function(){this.$container.slick(this.getReadySettings())}}),h=function(t){e.waypoint(t,function(){var e=t.find(".ha-number-text");e.numerator(e.data("animation"))})},f=function(i){e.waypoint(i,function(){i.find(".ha-skill-level").each(function(){var e=t(this),i=e.find(".ha-skill-level-text"),n=e.data("level");e.animate({width:n+"%"},500),i.numerator({toValue:n+"%",duration:1300,onStep:function(){i.append("%")}})})})},u=o.frontend.handlers.Base.extend({onInit:function(){o.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.$container=this.$element.find(".hajs-isotope"),this.run(),this.runFilter()},getLayoutMode:function(){var t=this.getElementSettings("layout");return"even"===t?"masonry":t},getDefaultSettings:function(){return{itemSelector:".ha-image-grid-item",percentPosition:!0,layoutMode:this.getLayoutMode()}},runFilter:function(){var t=this;n(this.$element,function(e){t.$container.isotope({filter:e});var i="*"!==e?e:".ha-js-popup";s(t.$element,i,t.getElementSettings("enable_popup"),"imagegrid")})},onElementChange:function(t){-1!==["layout","image_height","columns","image_margin","enable_popup"].indexOf(t)&&this.run()},run:function(){var t=this;this.$container.isotope(t.getDefaultSettings()),this.$container.imagesLoaded().progress(function(){t.$container.isotope("layout")}),s(this.$element,".ha-js-popup",this.getElementSettings("enable_popup"),"imagegrid")}}),d={"ha-image-compare.default":a,"ha-justified-gallery.default":l,"ha-number.default":h,"ha-skills.default":f};t.each(d,function(t,i){e.hooks.addAction("frontend/element_ready/"+t,i)});var c={"ha-slider.default":g,"ha-carousel.default":g,"ha-image-grid.default":u,widget:r};t.each(c,function(t,i){e.hooks.addAction("frontend/element_ready/"+t,function(t){e.elementsHandler.addHandler(i,{$element:t})})})})}(jQuery,window);
1
+ "use strict";!function(t,e){function i(t,e,i){var n;return function(){var s=this,a=arguments,o=function(){n=null,i||t.apply(s,a)},r=i&&!n;clearTimeout(n),n=setTimeout(o,e),r&&t.apply(s,a)}}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"))})}function s(e,i,n,s){if(t.fn.magnificPopup){if(!n)return void t.magnificPopup.close();e.on("click",i,function(t){t.stopPropagation()}),e.find(i).magnificPopup({key:s,type:"image",image:{titleSrc:function(t){return t.el.attr("title")?t.el.attr("title"):t.el.find("img").attr("alt")}},gallery:{enabled:!0,preload:[1,2]},zoom:{enabled:!0,duration:300,easing:"ease-in-out",opener:function(t){return t.is("img")?t:t.find("img")}}})}}var a=t(e);t.fn.getHappySettings=function(){return this.data("happy-settings")};var o=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)})},r=function(e){var i=e.find(".hajs-justified-gallery"),a=i.getHappySettings(),o=a.enable_popup;i.justifiedGallery(t.extend({},{rowHeight:150,lastRow:"justify",margins:10},a)),s(e,".ha-js-popup",o,"justifiedgallery"),n(e,function(t){i.justifiedGallery({lastRow:"*"===t?a.lastRow:"nojustify",filter:t}),s(e,"*"!==t?t:".ha-js-popup",o,"justifiedgallery")})};a.on("elementor/frontend/init",function(){var e=elementorFrontend,a=elementorModules,l=a.frontend.handlers.Base.extend({onInit:function(){a.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.widgetContainer=this.$element.find(".elementor-widget-container")[0],this.initFloatingEffects(),this.initBackgroundOverlay()},initBackgroundOverlay:function(){this.isEdit&&this.$element.addClass("ha-has-background-overlay")},getDefaultSettings:function(){return{targets:this.widgetContainer,loop:!0,direction:"alternate",easing:"easeInOutSine"}},onElementChange:function(t){-1!==t.indexOf("ha_floating")&&this.runOnElementChange()},runOnElementChange:i(function(){this.animation&&this.animation.restart(),this.initFloatingEffects()},200),getConfig:function(t){return this.getElementSettings("ha_floating_fx_"+t)},initFloatingEffects: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.widgetContainer.style.setProperty("will-change","transform"),this.animation=anime(t))}}),g=a.frontend.handlers.Base.extend({onInit:function(){a.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.$container=this.$element.find(".hajs-slick"),this.run()},isCarousel:function(){return this.$element.hasClass("ha-carousel")},getDefaultSettings:function(){return{arrows:!1,dots:!1,checkVisible:!1,infinite:!0,slidesToShow:this.isCarousel()?3:1,rows:0,prevArrow:'<button type="button" class="slick-prev"><i class="fa fa-chevron-left"></i></button>',nextArrow:'<button type="button" class="slick-next"><i class="fa fa-chevron-right"></i></button>'}},onElementChange:function(){this.$container.slick("unslick"),this.run()},getReadySettings:function(){var i={infinite:!!this.getElementSettings("loop"),autoplay:!!this.getElementSettings("autoplay"),autoplaySpeed:this.getElementSettings("autoplay_speed"),speed:this.getElementSettings("animation_speed"),centerMode:!!this.getElementSettings("center"),vertical:!!this.getElementSettings("vertical"),slidesToScroll:1};switch(this.getElementSettings("navigation")){case"arrow":i.arrows=!0;break;case"dots":i.dots=!0;break;case"both":i.arrows=!0,i.dots=!0}return this.isCarousel()&&(i.slidesToShow=this.getElementSettings("slides_to_show")||3,i.responsive=[{breakpoint:e.config.breakpoints.lg,settings:{slidesToShow:this.getElementSettings("slides_to_show_tablet")||i.slidesToShow}},{breakpoint:e.config.breakpoints.md,settings:{slidesToShow:this.getElementSettings("slides_to_show_mobile")||this.getElementSettings("slides_to_show_tablet")||i.slidesToShow}}]),t.extend({},this.getDefaultSettings(),i)},run:function(){this.$container.slick(this.getReadySettings())}}),h=function(t){e.waypoint(t,function(){var e=t.find(".ha-number-text");e.numerator(e.data("animation"))})},f=function(i){e.waypoint(i,function(){i.find(".ha-skill-level").each(function(){var e=t(this),i=e.find(".ha-skill-level-text"),n=e.data("level");e.animate({width:n+"%"},500),i.numerator({toValue:n+"%",duration:1300,onStep:function(){i.append("%")}})})})},d=a.frontend.handlers.Base.extend({onInit:function(){a.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.$container=this.$element.find(".hajs-isotope"),this.run(),this.runFilter()},getLayoutMode:function(){var t=this.getElementSettings("layout");return"even"===t?"masonry":t},getDefaultSettings:function(){return{itemSelector:".ha-image-grid-item",percentPosition:!0,layoutMode:this.getLayoutMode()}},runFilter:function(){var t=this;n(this.$element,function(e){t.$container.isotope({filter:e});var i="*"!==e?e:".ha-js-popup";s(t.$element,i,t.getElementSettings("enable_popup"),"imagegrid")})},onElementChange:function(t){-1!==["layout","image_height","columns","image_margin","enable_popup"].indexOf(t)&&this.run()},run:function(){var t=this;this.$container.isotope(t.getDefaultSettings()),this.$container.imagesLoaded().progress(function(){t.$container.isotope("layout")}),s(this.$element,".ha-js-popup",this.getElementSettings("enable_popup"),"imagegrid")}}),u=a.frontend.handlers.Base.extend({onInit:function(){a.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.wrapper=this.$element.find(".ha-news-ticker-wrapper"),this.run()},onElementChange:function(t){"item_space"!==t&&"title_typography_font_size"!==t||this.run()},run:function(){var e=this.wrapper.innerHeight(),i=this.wrapper.innerWidth(),n=this.wrapper.find(".ha-news-ticker-container"),s=n.find(".ha-news-ticker-item"),a=this.wrapper.data("scroll-direction"),o="scroll"+a+e+i,r=this.wrapper.data("duration"),l="normal",g=10,h={transform:"translateX(0"+i+"px)"},f={transform:"translateX(-101%)"};"right"===a&&(l="reverse"),s.each(function(){g+=t(this).outerWidth(!0)}),n.css({width:g,display:"flex"}),t.keyframe.define([{name:o,"0%":h,"100%":f}]),n.playKeyframe({name:o,duration:r+"ms",timingFunction:"linear",delay:"0s",iterationCount:"infinite",direction:l,fillMode:"none",complete:function(){}})}}),c={"ha-image-compare.default":o,"ha-justified-gallery.default":r,"ha-number.default":h,"ha-skills.default":f};t.each(c,function(t,i){e.hooks.addAction("frontend/element_ready/"+t,i)});var p={"ha-slider.default":g,"ha-carousel.default":g,"ha-image-grid.default":d,"ha-news-ticker.default":u,widget:l};t.each(p,function(t,i){e.hooks.addAction("frontend/element_ready/"+t,function(t){e.elementsHandler.addHandler(i,{$element:t})})})})}(jQuery,window);
assets/vendor/keyframes/jquery.keyframes.min.js ADDED
@@ -0,0 +1 @@
 
1
+ !function a(o,u,s){function f(t,e){if(!u[t]){if(!o[t]){var n="function"==typeof require&&require;if(!e&&n)return n(t,!0);if(l)return l(t,!0);var r=new Error("Cannot find module '"+t+"'");throw r.code="MODULE_NOT_FOUND",r}var i=u[t]={exports:{}};o[t][0].call(i.exports,function(e){return f(o[t][1][e]||e)},i,i.exports,a,o,u,s)}return u[t].exports}for(var l="function"==typeof require&&require,e=0;e<s.length;e++)f(s[e]);return f}({1:[function(e,t,n){"use strict";var r,i,a,o=(r=e("@keyframes/core"))&&r.__esModule?r:{default:r};i=jQuery,a=function(e,n){e.each(function(e,t){t.Keyframes||(t.Keyframes=new o.default(t)),n(t.Keyframes)})},i.keyframe={isSupported:o.default.isSupported,generate:o.default.generate,generateCSS:o.default.generateCSS,define:o.default.define},i.fn.resetKeyframe=function(t){a(this,function(e){return e.reset(t)})},i.fn.pauseKeyframe=function(){a(this,function(e){return e.pause()})},i.fn.resumeKeyframe=function(){a(this,function(e){return e.resume()})},i.fn.playKeyframe=function(t,n){a(this,function(e){return e.play(t,n)})}},{"@keyframes/core":2}],2:[function(e,t,n){"use strict";function i(){return(i=Object.assign||function(e){for(var t=1;t<arguments.length;t++){var n=arguments[t];for(var r in n)Object.prototype.hasOwnProperty.call(n,r)&&(e[r]=n[r])}return e}).apply(this,arguments)}function r(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,"value"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}Object.defineProperty(n,"__esModule",{value:!0}),n.default=void 0;var a=function(){function a(e){!function(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}(this,a),this.elem=e}var e,t,n;return e=a,n=[{key:"playCSS",value:function(e){var t=function(e){var t=i({},{duration:"0s",timingFunction:"ease",delay:"0s",iterationCount:1,direction:"normal",fillMode:"forwards"},e);return[t.name,t.duration,t.timingFunction,t.delay,t.iterationCount,t.direction,t.fillMode].join(" ")};if(e.constructor!==Array)return"string"==typeof e?e:t(e);for(var n=[],r=0;r<e.length;r+=1)n.push("string"==typeof e[r]?e[r]:t(e[r]));return n.join(", ")}},{key:"generateCSS",value:function(e){var t="@keyframes ".concat(e.name," {");for(var n in e)if("name"!==n&&"media"!==n&&"complete"!==n){for(var r in t+="".concat(n," {"),e[n])t+="".concat(r,":").concat(e[n][r],";");t+="}"}return t+="}",e.media&&(t="@media ".concat(e.media,"{").concat(t,"}")),t}},{key:"generate",value:function(e){var t=this.generateCSS(e),n=a.rules.indexOf(e.name);-1<n&&(a.sheet.deleteRule(n),delete a.rules[n]);var r=a.sheet.insertRule(t,0);a.rules[r]=e.name}},{key:"define",value:function(e){if(e.length)for(var t=0;t<e.length;t+=1)this.generate(e[t]);else this.generate(e)}},{key:"defineCSS",value:function(e){if(e.length){for(var t="",n=0;n<e.length;n+=1)t+=this.generateCSS(e[n]);return t}return this.generateCSS(e)}},{key:"plugin",value:function(e){if(e.constructor===Array)for(var t=0;t<e.length;t+=1)e[t](a);else e(a)}}],(t=[{key:"isSupported",value:function(){return void 0!==document.body.style.animationName}},{key:"reset",value:function(e){this.removeEvents(),this.elem.style.animationPlayState="running",this.elem.style.animation="none",e&&requestAnimationFrame(e)}},{key:"pause",value:function(){this.elem.style.animationPlayState="paused"}},{key:"resume",value:function(){this.elem.style.animationPlayState="running"}},{key:"play",value:function(e,t){var r=this;if(this.elem.style.animationName===e.name)return this.reset(function(){return r.play(e,t)}),this;var n=a.playCSS(e),i=function(e,t){var n="".concat(e,"Listener");r.elem.removeEventListener(e,r[n]),r[n]=t,r.elem.addEventListener(e,r[n])};return this.elem.style.animationPlayState="running",this.elem.style.animation=n,this.frameOptions=e,i("animationiteration",t||e.complete),i("animationend",t||e.complete),this}},{key:"removeEvents",value:function(){this.elem.removeEventListener("animationiteration",this.animationiterationListener),this.elem.removeEventListener("animationend",this.animationendListener)}}])&&r(e.prototype,t),n&&r(e,n),a}();if("undefined"!=typeof document){var o=document.createElement("style");o.setAttribute("id","keyframesjs-stylesheet"),document.head.appendChild(o),a.sheet=o.sheet,a.rules=[]}var u=a;n.default=u},{}]},{},[1]);
base.php CHANGED
@@ -34,14 +34,16 @@ class Base {
34
  $this->include_files();
35
 
36
  // Register custom category
37
- add_action( 'elementor/elements/categories_registered', [$this, 'add_category'] );
38
 
39
  // Register custom controls
40
- add_action( 'elementor/controls/controls_registered', [$this, 'register_controls'] );
 
 
 
41
 
42
  Widgets_Manager::init();
43
  Assets_Manager::init();
44
- Extensions_Manager::init();
45
  Cache_Manager::init();
46
  Icons_Manager::init();
47
 
@@ -49,6 +51,7 @@ class Base {
49
 
50
  if ( is_user_logged_in() ) {
51
  Admin_Bar::init();
 
52
  }
53
 
54
  if ( is_admin() ) {
@@ -86,25 +89,27 @@ class Base {
86
  }
87
 
88
  public function include_files() {
89
- include( HAPPY_ADDONS_DIR_PATH . 'inc/functions-forms.php' );
90
- include( HAPPY_ADDONS_DIR_PATH . 'classes/icons-manager.php' );
91
- include( HAPPY_ADDONS_DIR_PATH . 'classes/widgets-manager.php' );
92
- include( HAPPY_ADDONS_DIR_PATH . 'classes/assets-manager.php' );
93
- include( HAPPY_ADDONS_DIR_PATH . 'classes/extensions-manager.php' );
94
- include( HAPPY_ADDONS_DIR_PATH . 'classes/cache-manager.php' );
95
 
96
- include( HAPPY_ADDONS_DIR_PATH . 'classes/widgets-cache.php' );
97
- include( HAPPY_ADDONS_DIR_PATH . 'classes/assets-cache.php' );
98
 
99
  if ( is_admin() ) {
100
- include( HAPPY_ADDONS_DIR_PATH . 'classes/class.communicator.php' );
101
- include( HAPPY_ADDONS_DIR_PATH . 'classes/updater.php' );
102
- include( HAPPY_ADDONS_DIR_PATH . 'classes/dashboard.php' );
103
- include( HAPPY_ADDONS_DIR_PATH . 'classes/attention-seeker.php' );
104
  }
105
 
106
  if ( is_user_logged_in() ) {
107
- include( HAPPY_ADDONS_DIR_PATH . 'classes/admin-bar.php' );
 
 
108
  }
109
  }
110
 
@@ -138,4 +143,17 @@ class Base {
138
 
139
  ha_elementor()->controls_manager->add_group_control( $foreground::get_type(), new $foreground() );
140
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
141
  }
34
  $this->include_files();
35
 
36
  // Register custom category
37
+ add_action( 'elementor/elements/categories_registered', [ $this, 'add_category' ] );
38
 
39
  // Register custom controls
40
+ add_action( 'elementor/controls/controls_registered', [ $this, 'register_controls' ] );
41
+
42
+ // Register finder category
43
+ add_action( 'elementor/finder/categories/init', [ $this, 'register_finder' ] );
44
 
45
  Widgets_Manager::init();
46
  Assets_Manager::init();
 
47
  Cache_Manager::init();
48
  Icons_Manager::init();
49
 
51
 
52
  if ( is_user_logged_in() ) {
53
  Admin_Bar::init();
54
+ Extensions_Manager::init();
55
  }
56
 
57
  if ( is_admin() ) {
89
  }
90
 
91
  public function include_files() {
92
+ include_once( HAPPY_ADDONS_DIR_PATH . 'inc/functions-forms.php' );
93
+
94
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/icons-manager.php' );
95
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/widgets-manager.php' );
96
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/assets-manager.php' );
97
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/cache-manager.php' );
98
 
99
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/widgets-cache.php' );
100
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/assets-cache.php' );
101
 
102
  if ( is_admin() ) {
103
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/class.communicator.php' );
104
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/updater.php' );
105
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/dashboard.php' );
106
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/attention-seeker.php' );
107
  }
108
 
109
  if ( is_user_logged_in() ) {
110
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/admin-bar.php' );
111
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/clone-handler.php' );
112
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/extensions-manager.php' );
113
  }
114
  }
115
 
143
 
144
  ha_elementor()->controls_manager->add_group_control( $foreground::get_type(), new $foreground() );
145
  }
146
+
147
+ /**
148
+ * Register finder category and category items
149
+ *
150
+ * @param $categories_manager
151
+ */
152
+ public function register_finder( $categories_manager ) {
153
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/finder.php' );
154
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/finder-edit.php' );
155
+ // Add the category
156
+ $categories_manager->add_category( Finder::SLUG, new Finder() );
157
+ $categories_manager->add_category( Finder_Edit::SLUG, new Finder_Edit() );
158
+ }
159
  }
changelog.txt CHANGED
@@ -1,3 +1,11 @@
 
 
 
 
 
 
 
 
1
  = 2.3.0 - 20 November 2019 =
2
 
3
  - New: Gravity Forms Widget
1
+ = 2.4.0 - 3 December 2019 =
2
+
3
+ - New: Happy Clone - (duplicate post/page from anywhere!)
4
+ - New: News Ticker Widget
5
+ - New: Fixed size controls in Elementor Button widget
6
+ - Fix: Badge offset responsive issue for Icon Box Widget
7
+ - Fix: Wrapper is rendered when icon/image is missing issue
8
+
9
  = 2.3.0 - 20 November 2019 =
10
 
11
  - New: Gravity Forms Widget
classes/assets-manager.php CHANGED
@@ -182,6 +182,15 @@ class Assets_Manager {
182
  true
183
  );
184
 
 
 
 
 
 
 
 
 
 
185
  // Main assets
186
  wp_register_style(
187
  'happy-elementor-addons',
182
  true
183
  );
184
 
185
+ // keyframes
186
+ wp_register_script(
187
+ 'jquery-keyframes',
188
+ HAPPY_ADDONS_ASSETS . 'vendor/keyframes/jquery.keyframes.min.js',
189
+ [ 'jquery' ],
190
+ HAPPY_ADDONS_VERSION,
191
+ true
192
+ );
193
+
194
  // Main assets
195
  wp_register_style(
196
  'happy-elementor-addons',
classes/attention-seeker.php CHANGED
@@ -53,8 +53,8 @@ class Attention_Seeker {
53
 
54
  if ( wp_verify_nonce( $nonce, 'ignore_attention_seeker' ) && $id ) {
55
  $seeker = wp_list_filter( self::get_attentions(), ['_id' => $id] );
56
- $expire_date = $seeker[0]['end_date'];
57
- set_transient( self::generate_db_key( $id ), 'ignore', intval( $expire_date ) );
58
  wp_send_json_success();
59
  }
60
 
53
 
54
  if ( wp_verify_nonce( $nonce, 'ignore_attention_seeker' ) && $id ) {
55
  $seeker = wp_list_filter( self::get_attentions(), ['_id' => $id] );
56
+ $expire_date = $seeker[0]['end_date'] - time();
57
+ set_transient( self::generate_db_key( $id ), 'ignore', $expire_date );
58
  wp_send_json_success();
59
  }
60
 
classes/clone-handler.php ADDED
@@ -0,0 +1,199 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Happy_Addons\Elementor;
3
+
4
+ class Clone_Handler {
5
+
6
+ /**
7
+ * Request and nonce action name
8
+ */
9
+ const ACTION = 'ha_duplicate_thing';
10
+
11
+ /**
12
+ * Register hooks and initialize
13
+ */
14
+ public static function init() {
15
+ add_action( 'admin_action_' . self::ACTION, [ __CLASS__, 'duplicate_thing' ] );
16
+ add_filter( 'post_row_actions', [ __CLASS__, 'add_row_actions' ], 10, 2 );
17
+ add_filter( 'page_row_actions', [ __CLASS__, 'add_row_actions' ], 10, 2 );
18
+ }
19
+
20
+ /**
21
+ * Check if current user can clone
22
+ *
23
+ * @return bool
24
+ */
25
+ public static function can_clone() {
26
+ return current_user_can( 'edit_posts' );
27
+ }
28
+
29
+ /**
30
+ * Add clone link in row actions
31
+ *
32
+ * @param array $actions
33
+ * @param \WP_Post $post
34
+ * @return array
35
+ */
36
+ public static function add_row_actions( $actions, $post ) {
37
+ if ( self::can_clone() && post_type_supports( $post->post_type, 'elementor' ) ) {
38
+ $actions[ self::ACTION ] = sprintf(
39
+ '<a href="%1$s" title="%2$s"><span class="screen-reader-text">%2$s</span>%3$s</a>',
40
+ esc_url( self::get_url( $post->ID, 'list' ) ),
41
+ sprintf( esc_attr__( 'Clone - %s', 'happy-elementor-addons' ), esc_attr( $post->post_title ) ),
42
+ esc_html__( 'Happy Clone', 'happy-elementor-addons' )
43
+ );
44
+ }
45
+
46
+ return $actions;
47
+ }
48
+
49
+ /**
50
+ * Duplicate requested post
51
+ *
52
+ * @return void
53
+ */
54
+ public static function duplicate_thing() {
55
+ if ( ! self::can_clone() ) {
56
+ return;
57
+ }
58
+
59
+ $_uri = $_SERVER['REQUEST_URI'];
60
+
61
+ // Resolve finder clone request issue
62
+ if ( stripos( $_uri, '&amp;' ) !== false ) {
63
+ $_uri = html_entity_decode( $_uri );
64
+ $_uri = parse_url( $_uri, PHP_URL_QUERY );
65
+ $valid_args = ['_wpnonce', 'post_id', 'ref'];
66
+ parse_str( $_uri, $args );
67
+
68
+ if ( ! empty( $args ) && is_array( $args ) ) {
69
+ foreach ( $args as $key => $val ) {
70
+ if ( in_array( $key, $valid_args, true ) ) {
71
+ $_GET[ $key ] = $val;
72
+ }
73
+ }
74
+ }
75
+ }
76
+
77
+ $nonce = isset( $_GET['_wpnonce'] ) ? $_GET['_wpnonce'] : '';
78
+ $post_id = isset( $_GET['post_id'] ) ? absint( $_GET['post_id'] ) : 0;
79
+ $ref = isset( $_GET['ref'] ) ? $_GET['ref'] : '';
80
+
81
+ if ( ! wp_verify_nonce( $nonce, self::ACTION ) ) {
82
+ return;
83
+ }
84
+
85
+ if ( is_null( ( $post = get_post( $post_id ) ) ) ) {
86
+ return;
87
+ }
88
+
89
+ $post = sanitize_post( $post, 'db' );
90
+ $duplicated_post_id = self::duplicate_post( $post );
91
+ $redirect = add_query_arg( [ 'post_type' => $post->post_type ], admin_url( 'edit.php' ) );
92
+
93
+ if ( ! is_wp_error( $duplicated_post_id ) ) {
94
+ self::duplicate_taxonomies( $post, $duplicated_post_id );
95
+ self::duplicate_meta_entries( $post, $duplicated_post_id );
96
+
97
+ if ( $ref === 'editor' ) {
98
+ $document = ha_elementor()->documents->get( $duplicated_post_id );
99
+ $redirect = $document->get_edit_url();
100
+ }
101
+ }
102
+
103
+ wp_safe_redirect( $redirect );
104
+ die();
105
+ }
106
+
107
+ /**
108
+ * Get clone url with required query params
109
+ *
110
+ * @param $post_id
111
+ * @param string $ref
112
+ * @return string
113
+ */
114
+ public static function get_url( $post_id, $ref = '' ) {
115
+ return wp_nonce_url(
116
+ add_query_arg(
117
+ [
118
+ 'action' => self::ACTION,
119
+ 'post_id' => $post_id,
120
+ 'ref' => $ref,
121
+ ],
122
+ admin_url( 'admin.php' )
123
+ ),
124
+ self::ACTION
125
+ );
126
+ }
127
+
128
+ /**
129
+ * Clone post
130
+ *
131
+ * @param $old_post
132
+ * @return int $dulicated post id
133
+ */
134
+ protected static function duplicate_post( $post ) {
135
+ $current_user = wp_get_current_user();
136
+
137
+ $duplicated_post_args = [
138
+ 'post_status' => 'draft',
139
+ 'to_ping' => $post->to_ping,
140
+ 'post_type' => $post->post_type,
141
+ 'menu_order' => $post->menu_order,
142
+ 'post_author' => $current_user->ID,
143
+ 'post_parent' => $post->post_parent,
144
+ 'ping_status' => $post->ping_status,
145
+ 'post_excerpt' => $post->post_excerpt,
146
+ 'post_content' => $post->post_content,
147
+ 'post_password' => $post->post_password,
148
+ 'comment_status' => $post->comment_status,
149
+ 'post_title' => sprintf( __( '%s - [Cloned #%d]', 'happy-elementor-addons' ), $post->post_title,
150
+ $post->ID ),
151
+ ];
152
+
153
+ return wp_insert_post( $duplicated_post_args );
154
+ }
155
+
156
+ /**
157
+ * Copy post taxonomies to cloned post
158
+ *
159
+ * @param $post
160
+ * @param $duplicated_post_id
161
+ */
162
+ protected static function duplicate_taxonomies( $post, $duplicated_post_id ) {
163
+ $taxonomies = get_object_taxonomies( $post->post_type );
164
+ if ( ! empty( $taxonomies ) && is_array( $taxonomies ) ) {
165
+ foreach ( $taxonomies as $taxonomy ) {
166
+ $terms = wp_get_object_terms( $post->ID, $taxonomy, [ 'fields' => 'slugs' ] );
167
+ wp_set_object_terms( $duplicated_post_id, $terms, $taxonomy, false );
168
+ }
169
+ }
170
+ }
171
+
172
+ /**
173
+ * Copy post meta entries to cloned post
174
+ *
175
+ * @param $post
176
+ * @param $duplicated_post_id
177
+ */
178
+ protected static function duplicate_meta_entries( $post, $duplicated_post_id ) {
179
+ global $wpdb;
180
+
181
+ $entries = $wpdb->get_results(
182
+ $wpdb->prepare( "SELECT meta_key, meta_value FROM {$wpdb->postmeta} WHERE post_id = %d", $post->ID )
183
+ );
184
+
185
+ if ( is_array( $entries ) ) {
186
+ $query = "INSERT INTO {$wpdb->postmeta} ( post_id, meta_key, meta_value ) VALUES ";
187
+ $_records = [];
188
+ foreach ( $entries as $entry ) {
189
+ $_value = wp_slash( $entry->meta_value );
190
+ $_records[] = "( $duplicated_post_id, '{$entry->meta_key}', '{$_value}' )";
191
+ }
192
+ $query .= implode( ', ', $_records ) . ';';
193
+ $wpdb->query( $query );
194
+ }
195
+ }
196
+
197
+ }
198
+
199
+ Clone_Handler::init();
classes/extensions-manager.php CHANGED
@@ -1,9 +1,10 @@
1
  <?php
2
  namespace Happy_Addons\Elementor;
3
 
4
- use Happy_Addons\Elementor\Extension\Background_Overlay;
5
- use Happy_Addons\Elementor\Extension\Column_Extended;
6
  use Happy_Addons\Elementor\Extension\Happy_Effects;
 
 
 
7
 
8
  defined( 'ABSPATH' ) || die();
9
 
@@ -13,12 +14,18 @@ class Extensions_Manager {
13
  * Initialize
14
  */
15
  public static function init() {
16
- include_once HAPPY_ADDONS_DIR_PATH . 'extensions/background-overlay.php';
17
- include_once HAPPY_ADDONS_DIR_PATH . 'extensions/happy-effects.php';
18
- include_once HAPPY_ADDONS_DIR_PATH . 'extensions/column-extended.php';
19
 
20
  Happy_Effects::init();
21
  Column_Extended::init();
22
  Background_Overlay::init();
 
 
 
 
 
 
 
 
23
  }
24
  }
1
  <?php
2
  namespace Happy_Addons\Elementor;
3
 
 
 
4
  use Happy_Addons\Elementor\Extension\Happy_Effects;
5
+ use Happy_Addons\Elementor\Extension\Column_Extended;
6
+ use Happy_Addons\Elementor\Extension\Widgets_Extended;
7
+ use Happy_Addons\Elementor\Extension\Background_Overlay;
8
 
9
  defined( 'ABSPATH' ) || die();
10
 
14
  * Initialize
15
  */
16
  public static function init() {
17
+ self::include_extensions();
 
 
18
 
19
  Happy_Effects::init();
20
  Column_Extended::init();
21
  Background_Overlay::init();
22
+ Widgets_Extended::init();
23
+ }
24
+
25
+ public static function include_extensions() {
26
+ include_once HAPPY_ADDONS_DIR_PATH . 'extensions/happy-effects.php';
27
+ include_once HAPPY_ADDONS_DIR_PATH . 'extensions/column-extended.php';
28
+ include_once HAPPY_ADDONS_DIR_PATH . 'extensions/widgets-extended.php';
29
+ include_once HAPPY_ADDONS_DIR_PATH . 'extensions/background-overlay.php';
30
  }
31
  }
classes/finder-edit.php ADDED
@@ -0,0 +1,169 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Finder tools class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+ namespace Happy_Addons\Elementor;
8
+
9
+ use Elementor\Core\Base\Document;
10
+ use Elementor\Core\Common\Modules\Finder\Base_Category as Finder_Category;
11
+ use Elementor\TemplateLibrary\Source_Local;
12
+ use Happy_Addons\Elementor\Clone_Handler as Cloner;
13
+
14
+ defined( 'ABSPATH' ) || die();
15
+
16
+ class Finder_Edit extends Finder_Category {
17
+
18
+ const SLUG = 'edit';
19
+
20
+ /**
21
+ * Get title.
22
+ *
23
+ * @access public
24
+ *
25
+ * @return string
26
+ */
27
+ public function get_title() {
28
+ return __( 'Edit + Happy Clone', 'happy-elementor-addons' );
29
+ }
30
+
31
+ /**
32
+ * Set category as dynamic
33
+ *
34
+ * @return bool
35
+ */
36
+ public function is_dynamic() {
37
+ return true;
38
+ }
39
+
40
+ /**
41
+ * Get category items.
42
+ *
43
+ * @access public
44
+ *
45
+ * @param array $options
46
+ *
47
+ * @return array
48
+ */
49
+ public function get_category_items( array $options = [] ) {
50
+ $post_types = get_post_types( [
51
+ 'exclude_from_search' => false,
52
+ ] );
53
+
54
+ $post_types[] = Source_Local::CPT;
55
+
56
+ $document_types = ha_elementor()->documents->get_document_types( [
57
+ 'is_editable' => true,
58
+ ] );
59
+
60
+ $query_args = [
61
+ 'post_type' => $post_types,
62
+ 'post_status' => [ 'publish', 'draft', 'private', 'pending', 'future' ],
63
+ 'posts_per_page' => '10',
64
+ 'meta_query' => [
65
+ [
66
+ 'key' => '_elementor_edit_mode',
67
+ 'value' => 'builder',
68
+ ],
69
+ [
70
+ 'relation' => 'or',
71
+ [
72
+ 'key' => Document::TYPE_META_KEY,
73
+ 'compare' => 'NOT EXISTS',
74
+ ],
75
+ [
76
+ 'key' => Document::TYPE_META_KEY,
77
+ 'value' => array_keys( $document_types ),
78
+ ],
79
+ ],
80
+ ],
81
+ 'orderby' => 'modified',
82
+ 's' => $options['filter'],
83
+ ];
84
+
85
+
86
+ if ( Cloner::can_clone() ) {
87
+ $editor_post_id = isset( $options['editor_post_id'] ) ? $options['editor_post_id'] : 0;
88
+ $editor_document = ha_elementor()->documents->get( $editor_post_id );
89
+ $items = [];
90
+
91
+ $ref = 'list';
92
+
93
+ if ( $editor_document ) {
94
+ $description = $editor_document->get_title();
95
+ $icon = 'document-file';
96
+ $ref = 'editor';
97
+
98
+ if ( $editor_document->get_post()->post_type === Source_Local::CPT ) {
99
+ $description = __( 'Template', 'happy-elementor-addons' ) . ' / ' . $description;
100
+ $icon = 'post-title';
101
+ }
102
+
103
+ $url = Cloner::get_url( $editor_document->get_id(), $ref );
104
+ $items[] = [
105
+ 'icon' => $icon,
106
+ 'title' => __( 'Clone / Duplicate This', 'happy-elementor-addons' ),
107
+ 'description' => $description,
108
+ 'url' => $url,
109
+ 'actions' => [
110
+ [
111
+ 'name' => 'clone',
112
+ 'url' => $url,
113
+ 'icon' => 'clone',
114
+ ]
115
+ ]
116
+ ];
117
+ }
118
+ }
119
+
120
+
121
+ $posts_query = new \WP_Query( $query_args );
122
+
123
+ foreach ( $posts_query->posts as $post ) {
124
+ $document = ha_elementor()->documents->get( $post->ID );
125
+
126
+ if ( ! $document ) {
127
+ continue;
128
+ }
129
+
130
+ $is_template = Source_Local::CPT === $post->post_type;
131
+
132
+ $description = $document->get_title();
133
+
134
+ $icon = 'document-file';
135
+
136
+ if ( $is_template ) {
137
+ $description = __( 'Template', 'happy-elementor-addons' ) . ' / ' . $description;
138
+
139
+ $icon = 'post-title';
140
+ }
141
+
142
+ $actions = [
143
+ [
144
+ 'name' => 'view',
145
+ 'url' => $document->get_permalink(),
146
+ 'icon' => 'eye',
147
+ ],
148
+ ];
149
+
150
+ if ( Cloner::can_clone() ) {
151
+ $actions[] = [
152
+ 'name' => 'clone',
153
+ 'url' => Cloner::get_url( $document->get_id(), $ref ),
154
+ 'icon' => 'clone',
155
+ ];
156
+ }
157
+
158
+ $items[] = [
159
+ 'icon' => $icon,
160
+ 'title' => $post->post_title,
161
+ 'description' => $description,
162
+ 'url' => $document->get_edit_url(),
163
+ 'actions' => $actions,
164
+ ];
165
+ }
166
+
167
+ return $items;
168
+ }
169
+ }
classes/finder.php CHANGED
@@ -12,6 +12,8 @@ defined( 'ABSPATH' ) || die();
12
 
13
  class Finder extends Finder_Category {
14
 
 
 
15
  /**
16
  * Get title.
17
  *
@@ -35,16 +37,32 @@ class Finder extends Finder_Category {
35
  public function get_category_items( array $options = [] ) {
36
  $items = [
37
  'home' => [
38
- 'title' => __( 'HappyAddons - Home', 'happy-elementor-addons' ),
 
39
  'url' => ha_get_dashboard_link(),
40
  'icon' => ' hm hm-happyaddons',
41
- 'keywords' => [ 'happy', 'setting', 'happyaddons', 'dashboard', 'widget', 'control', 'panel' ],
 
 
 
 
 
 
 
42
  ],
43
  'widgets' => [
44
- 'title' => __( 'HappyAddons - Widgets Control Panel', 'happy-elementor-addons' ),
45
- 'url' => ha_get_dashboard_link( '#widgets' ),
46
  'icon' => ' hm hm-cross-game',
47
- 'keywords' => [ 'happy', 'setting', 'happyaddons', 'dashboard', 'widget', 'control', 'panel' ],
 
 
 
 
 
 
 
 
48
  ],
49
  ];
50
 
12
 
13
  class Finder extends Finder_Category {
14
 
15
+ const SLUG = 'happy-addons';
16
+
17
  /**
18
  * Get title.
19
  *
37
  public function get_category_items( array $options = [] ) {
38
  $items = [
39
  'home' => [
40
+ 'title' => __( 'HappyAddons', 'happy-elementor-addons' ),
41
+ 'description' => __( 'Control Panel Home', 'happy-elementor-addons' ),
42
  'url' => ha_get_dashboard_link(),
43
  'icon' => ' hm hm-happyaddons',
44
+ 'keywords' => [ 'happy', 'setting', 'happyaddons', 'dashboard', 'widget', 'control', 'panel', 'essential' ],
45
+ 'actions' => [
46
+ [
47
+ 'name' => 'view',
48
+ 'url' => ha_get_dashboard_link(),
49
+ 'icon' => 'eye'
50
+ ]
51
+ ]
52
  ],
53
  'widgets' => [
54
+ 'title' => __( 'HappyAddons', 'happy-elementor-addons' ),
55
+ 'description' => __( 'Widgets Control Panel', 'happy-elementor-addons' ),
56
  'icon' => ' hm hm-cross-game',
57
+ 'url' => ha_get_dashboard_link( '#widgets' ),
58
+ 'keywords' => [ 'happy', 'setting', 'happyaddons', 'dashboard', 'widget', 'control', 'panel', 'essential' ],
59
+ 'actions' => [
60
+ [
61
+ 'name' => 'view',
62
+ 'url' => ha_get_dashboard_link( '#widgets' ),
63
+ 'icon' => 'eye'
64
+ ]
65
+ ]
66
  ],
67
  ];
68
 
classes/widgets-manager.php CHANGED
@@ -452,6 +452,16 @@ class Widgets_Manager {
452
  'css' => [],
453
  'js' => [],
454
  ],
 
 
 
 
 
 
 
 
 
 
455
  ],
456
  ];
457
  }
452
  'css' => [],
453
  'js' => [],
454
  ],
455
+ ],
456
+ 'news-ticker' => [
457
+ 'title' => __( 'News Ticker', 'happy-elementor-addons' ),
458
+ 'icon' => 'hm hm-slider',
459
+ 'css' => ['news-ticker'],
460
+ 'js' => [],
461
+ 'vendor' => [
462
+ 'css' => [],
463
+ 'js' => ['jquery-keyframes'],
464
+ ],
465
  ],
466
  ];
467
  }
extensions/widgets-extended.php ADDED
@@ -0,0 +1,166 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Elementor default widgets enhancements
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+ namespace Happy_Addons\Elementor\Extension;
8
+
9
+ use Elementor\Controls_Manager;
10
+ use Elementor\Widget_Base;
11
+
12
+ defined('ABSPATH') || die();
13
+
14
+ class Widgets_Extended {
15
+
16
+ public static function init() {
17
+ add_action( 'elementor/element/button/section_style/after_section_start', [ __CLASS__, 'add_button_controls'
18
+ ] );
19
+ }
20
+
21
+ public static function add_button_controls( Widget_Base $element ) {
22
+
23
+ $element->add_control(
24
+ 'ha_fixed_size_toggle',
25
+ [
26
+ 'label' => sprintf( __( 'Fixed Size %s', 'happy-elementor-addons' ), '<i style="color: #d5dadf;" class="hm hm-happyaddons"></i>' ),
27
+ 'type' => Controls_Manager::POPOVER_TOGGLE,
28
+ 'return_value' => 'yes',
29
+ ]
30
+ );
31
+
32
+ $element->start_popover();
33
+
34
+ $element->add_responsive_control(
35
+ 'ha_height',
36
+ [
37
+ 'label' => __( 'Height', 'happy-elementor-addons' ),
38
+ 'type' => Controls_Manager::SLIDER,
39
+ 'default' => [
40
+ 'unit' => 'px',
41
+ ],
42
+ 'range' => [
43
+ 'px' => [
44
+ 'max' => 500,
45
+ ]
46
+ ],
47
+ 'selectors' => [
48
+ '{{WRAPPER}} .elementor-button' => 'height: {{SIZE}}{{UNIT}};'
49
+ ],
50
+ 'condition' => [
51
+ 'ha_fixed_size_toggle' => 'yes',
52
+ ]
53
+ ]
54
+ );
55
+
56
+ $element->add_responsive_control(
57
+ 'ha_width',
58
+ [
59
+ 'label' => __( 'Width', 'happy-elementor-addons' ),
60
+ 'type' => Controls_Manager::SLIDER,
61
+ 'default' => [
62
+ 'unit' => 'px',
63
+ ],
64
+ 'range' => [
65
+ 'px' => [
66
+ 'max' => 500,
67
+ ]
68
+ ],
69
+ 'selectors' => [
70
+ '{{WRAPPER}} .elementor-button' => 'width: {{SIZE}}{{UNIT}};'
71
+ ],
72
+ 'condition' => [
73
+ 'ha_fixed_size_toggle' => 'yes',
74
+ ]
75
+ ]
76
+ );
77
+
78
+ $element->add_control(
79
+ 'ha_align_x',
80
+ [
81
+ 'type' => Controls_Manager::CHOOSE,
82
+ 'label' => __( 'Horizontal Align', 'happy-addons-pro' ),
83
+ 'default' => 'center',
84
+ 'toggle' => false,
85
+ 'options' => [
86
+ 'left' => [
87
+ 'title' => __( 'Left', 'happy-addons-pro' ),
88
+ 'icon' => 'eicon-h-align-left',
89
+ ],
90
+ 'center' => [
91
+ 'title' => __( 'Center', 'happy-addons-pro' ),
92
+ 'icon' => 'eicon-h-align-center',
93
+ ],
94
+ 'right' => [
95
+ 'title' => __( 'Right', 'happy-addons-pro' ),
96
+ 'icon' => 'eicon-h-align-right',
97
+ ],
98
+ ],
99
+ 'selectors' => [
100
+ '{{WRAPPER}} .elementor-button' => '{{VALUE}}'
101
+ ],
102
+ 'selectors_dictionary' => [
103
+ 'left' => '-webkit-box-pack: start; -ms-flex-pack: start; justify-content: flex-start;',
104
+ 'center' => '-webkit-box-pack: center; -ms-flex-pack: center; justify-content: center;',
105
+ 'right' => '-webkit-box-pack: end; -ms-flex-pack: end; justify-content: flex-end;',
106
+ ],
107
+ 'condition' => [
108
+ 'ha_fixed_size_toggle' => 'yes',
109
+ ],
110
+ ]
111
+ );
112
+
113
+ $element->add_control(
114
+ 'ha_align_y',
115
+ [
116
+ 'type' => Controls_Manager::CHOOSE,
117
+ 'label' => __( 'Vertical Align', 'happy-addons-pro' ),
118
+ 'default' => 'center',
119
+ 'toggle' => false,
120
+ 'options' => [
121
+ 'top' => [
122
+ 'title' => __( 'Top', 'happy-addons-pro' ),
123
+ 'icon' => 'eicon-v-align-top',
124
+ ],
125
+ 'center' => [
126
+ 'title' => __( 'Center', 'happy-addons-pro' ),
127
+ 'icon' => 'eicon-v-align-middle',
128
+ ],
129
+ 'bottom' => [
130
+ 'title' => __( 'Right', 'happy-addons-pro' ),
131
+ 'icon' => 'eicon-v-align-bottom',
132
+ ],
133
+ ],
134
+ 'selectors' => [
135
+ '{{WRAPPER}} .elementor-button' => '{{VALUE}}',
136
+ ],
137
+ 'selectors_dictionary' => [
138
+ 'top' => '-webkit-box-align: start; -ms-flex-align: start; align-items: flex-start;',
139
+ 'center' => '-webkit-box-align: center; -ms-flex-align: center; align-items: center;',
140
+ 'bottom' => '-webkit-box-align: end; -ms-flex-align: end; align-items: flex-end;',
141
+ ],
142
+ 'condition' => [
143
+ 'ha_fixed_size_toggle' => 'yes',
144
+ ],
145
+ ]
146
+ );
147
+
148
+ $element->add_control(
149
+ 'ha_flex_display',
150
+ [
151
+ 'type' => Controls_Manager::HIDDEN,
152
+ 'default' => 'inline-flex',
153
+ 'selectors' => [
154
+ '{{WRAPPER}} .elementor-button' => 'display: -webkit-inline-box; display: -ms-inline-flexbox; display: inline-flex;',
155
+ ],
156
+ 'condition' => [
157
+ 'ha_fixed_size_toggle' => 'yes',
158
+ 'ha_align_x!' => '',
159
+ 'ha_align_y!' => '',
160
+ ],
161
+ ]
162
+ );
163
+
164
+ $element->end_popover();
165
+ }
166
+ }
plugin.php CHANGED
@@ -3,7 +3,7 @@
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: 2.3.0
7
  * Author: weDevs
8
  * Author URI: https://happyaddons.com/
9
  * License: GPLv2
@@ -34,7 +34,7 @@ Copyright 2019 HappyMonster <http://happymonster.me>
34
 
35
  defined( 'ABSPATH' ) || die();
36
 
37
- define( 'HAPPY_ADDONS_VERSION', '2.3.0' );
38
  define( 'HAPPY_ADDONS__FILE__', __FILE__ );
39
  define( 'HAPPY_ADDONS_DIR_PATH', plugin_dir_path( HAPPY_ADDONS__FILE__ ) );
40
  define( 'HAPPY_ADDONS_DIR_URL', plugin_dir_url( HAPPY_ADDONS__FILE__ ) );
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: 2.4.0
7
  * Author: weDevs
8
  * Author URI: https://happyaddons.com/
9
  * License: GPLv2
34
 
35
  defined( 'ABSPATH' ) || die();
36
 
37
+ define( 'HAPPY_ADDONS_VERSION', '2.4.0' );
38
  define( 'HAPPY_ADDONS__FILE__', __FILE__ );
39
  define( 'HAPPY_ADDONS_DIR_PATH', plugin_dir_path( HAPPY_ADDONS__FILE__ ) );
40
  define( 'HAPPY_ADDONS_DIR_URL', plugin_dir_url( HAPPY_ADDONS__FILE__ ) );
readme.txt CHANGED
@@ -1,6 +1,6 @@
1
  === Happy Elementor Addons ===
2
  Plugin Name: Happy Elementor Addons
3
- Version: 2.3.0
4
  Author: weDevs
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, mosaddek73, tareq1988, sourav926, wedevs, iqbalrony, obiplabon
@@ -12,81 +12,194 @@ Requires PHP: 5.4
12
  License: GPLv2
13
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
14
 
15
- [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.
16
 
17
  == Description ==
18
 
19
- [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.
 
 
20
 
21
  https://www.youtube.com/watch?v=XpWm7zdvUoM
22
 
23
- > HappyAddons is a unique Elementor Addon
24
- — Adam Preiser, Founder of WP Crafter
25
-
26
- ### Included 25 Free Widgets
27
-
28
- 1. **[Card](https://demo.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://demo.happyaddons.com/elementor-card-widget-demo/)
29
- 2. **[Gradient Heading](https://demo.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://demo.happyaddons.com/elementor-gradient-heading-widget-demo/)
30
- 3. **[Info Box](https://demo.happyaddons.com/elementor-info-box-widget-demo/)** - Create beautiful information boxes using icons, links and texts, and make them slick using the built in positioning features. [Check demo](https://demo.happyaddons.com/elementor-info-box-widget-demo/)
31
- 4. **[Icon Box](https://demo.happyaddons.com/elementor-icon-box-widget-demo/)** - A simplified version of Info box but comes with powerful display features. Perfect for showcasing interesting information to your users in various styles. [Check demo](https://demo.happyaddons.com/elementor-icon-box-widget-demo/)
32
- 5. **[Image Compare](https://demo.happyaddons.com/elementor-image-compare-widget-demo/)** - Are you a photo-editor, agency or product designer who often needs to showcase their beautiful works in a form of before and after slider? This widget is perfect for this job. And built in styling options, vertical and horizontal orientation features can help you design these before-after sections with more creativity. [Check demo](https://demo.happyaddons.com/elementor-image-compare-widget-demo/)
33
- 6. **[Team Member](https://demo.happyaddons.com/elementor-team-member-widget-demo/)** - A perfect widget to showcase your beautiful team in various styles using texts, images, and social links. And just like our other widgets, you will find powerful styling options to make them stand out quite easily. [Check demo](https://demo.happyaddons.com/elementor-team-member-widget-demo/)
34
- 7. **[Review](https://demo.happyaddons.com/elementor-review-widget-demo/)** - Showcase your user feedback, reviews and rating easily than ever using our review widget. Display user photo, texts and star ratings. Make them stand out using built in offsets and positioning features. [Check demo](https://demo.happyaddons.com/elementor-review-widget-demo/)
35
- 8. **[Skill Bars](https://demo.happyaddons.com/elementor-skill-bars-widget-demo/)** - An essential building block to showcase user skills, task percentage, required tools and other progressive information in different ways. Comes with incredible customizing options to suit your needs. [Check demo](https://demo.happyaddons.com/elementor-skill-bars-widget-demo/)
36
- 9. **[Contact Form 7](https://demo.happyaddons.com/elementor-contact-form-7-widget-demo/)** - This utility widget helps you to integrate existing forms built using CF7 plugin across your web pages without spending too much time. [Check demo](https://demo.happyaddons.com/elementor-contact-form-7-widget-demo/)
37
- 10. **[ Caldera Forms](https://demo.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://demo.happyaddons.com/elementor-caldera-forms-widget-demo/)
38
- 11. **[weForms](https://demo.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://demo.happyaddons.com/elementor-we-forms-widget-demo/)
39
- 12. **[Ninja Forms](https://demo.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://demo.happyaddons.com/elementor-ninja-form-widget-demo/)
40
- 13. **[WPForms](https://demo.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://demo.happyaddons.com/elementor-wpform-widget-demo/)
41
- 14. **[Dual Button](https://demo.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://demo.happyaddons.com/elementor-dual-button-widget-demo/)
42
- 15. **[Testimonial](https://demo.happyaddons.com/elementor-testimonial-widget-demo/)** - Create beautiful testimonial sections with different look-n-feels using HappyAddons Testimonial widget. [Check demo](https://demo.happyaddons.com/elementor-testimonial-widget-demo/)
43
- 16. **[Justified Grid](https://demo.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://demo.happyaddons.com/elementor-justified-grid-widget-demo/)
44
- 17. **[Number](https://demo.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://demo.happyaddons.com/elementor-number-widget-demo/)
45
- 18. **[Logo Grid](https://demo.happyaddons.com/elementor-logo-grid-widget-demo)** - Showcase your clients or products using our logo grid widget, and display these items with styles. [Check demo](https://demo.happyaddons.com/elementor-logo-grid-widget-demo)
46
- 19. **[Carousel](https://demo.happyaddons.com/elementor-carousel-widget-demo/)** - Create interesting image and text carousels using our carousel widget which comes with lot of options. [Check demo](https://demo.happyaddons.com/elementor-carousel-widget-demo/)
47
- 20. **[Slider](https://demo.happyaddons.com/elementor-slider-widget-demo/)** - Now you can create sliders with beautiful animations and effects using our Slider widget. And just like our other widgets, there are lots of customization options for you. [Check demo](https://demo.happyaddons.com/elementor-slider-widget-demo/)
48
- 21. **[Step Flow](https://demo.happyaddons.com/elementor-step-flow-widget-demo/)** - Create excellent step by step visual diagram and instructions using this smart widget. Change directions, counters and make them look amazing with icons, texts and colors. [Check demo](https://demo.happyaddons.com/elementor-step-flow-widget-demo/)
49
- 22. **[Calendly](https://demo.happyaddons.com/elementor-calendly-widget-demo/)** - Schedule meetings without the back-and-forth emails through Calendly. We are happy to integrate this important application in our HappyAddons. [Check demo](https://demo.happyaddons.com/elementor-calendly-widget-demo/)
50
- 23. **[Flip Box](https://demo.happyaddons.com/elementor-flip-box-widget-demo/)** - FlipBox helps you to deliver messages in a beautiful way with before and after effects. [Check demo](https://demo.happyaddons.com/elementor-flip-box-widget-demo/)
51
- 24. **[Pricing Table](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)** - Create beautiful pricing tables with lots of customizations and sleek look-n-feel using this widget. [Check demo](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)
52
- 25. **[Image Grid](https://demo.happyaddons.com/elementor-image-grid-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://demo.happyaddons.com/elementor-image-grid-widget-demo/)
53
-
54
- ### INCLUDED FREE EXTENSIONS FOR EVERY ELEMENTOR WIDGET
55
-
56
- **Happy Extensions**
57
-
58
- 1. **Background Overlay** - You can add background overlay to any widget now.
59
- 2. **Happy Icons** - Custom icon fonts library.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
 
61
  **Happy Effects**
62
 
63
- 1. **[Floating Effects](https://demo.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!
64
- 2. **[CSS Transform](https://demo.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.
65
 
66
- https://www.youtube.com/watch?v=LmtacsLcFPU
67
 
68
- **Space Effects Using Floating Effects**
69
 
 
 
 
 
70
  https://www.youtube.com/watch?v=F33g3zqkeog
71
 
72
- ### Features
73
 
74
- The widgets in [HappyAddons](https://happyaddons.com/) are well tested on different devices to give you the best responsive output. Our code doesn’t stink and we don’t leave you blind folded when you need support from us. Before jumping into the details, let’s have a look at the features at a glance
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
75
 
76
- * Just because it’s free, we don’t compromise with the quality at all. You’re still getting the same carefully crafted collection of widgets that you get elsewhere which comes for a price
77
- * Responsive and tested on different screens to ensure it doesn’t break
78
- * Compatible with almost every themes out there. In case of any exception, let us know and we will fix it for you
79
- * Comes with demo designs so that you can quickly copy the styles without spending too much to design everything from scratch
80
- * Ever growing, which means that we’re constantly adding new features and widgets to this collection every week
81
- * Comes with excellent support, and that is sweet. If you don’t understand a feature, or fail to give it a desired look which was already demonstrated in a demo, or it’s not working as expected - we got your back. Just drop us a line and we will do our best to help you figure a way out.
82
- * Lightweight and fast. The widgets are carefully designed to remain fat-less and bloat free. We understand how important it is to serve your page faster and we took extra care for that
83
- * Comes with cohesive elements, which means that these widgets are so customizable that you can easily fit them in your existing designs, and they work nicely together with each other without making anything look bad.
84
- * [HappyAddons](https://happyaddons.com/) brings you some powerful features to the built-in motion effects section that helps you to animate and rotate objects on their x-axis, y-axis, and z-axis like never seen before, and brings lovely effects to help your websites stand out from others.
85
 
86
- ### Bugs, technical hints or contribute ###
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
87
 
88
  Please give us feedback, contribute and file technical bugs on [GitHub Repo](https://github.com/weDevsOfficial/happy-elementor-addons/issues).
89
 
 
 
 
 
90
 
91
  == Frequently Asked Questions ==
92
 
@@ -145,6 +258,14 @@ It's really easy and super simple to install **Happy Elementor Addons** plugin b
145
 
146
  == Changelog ==
147
 
 
 
 
 
 
 
 
 
148
  = 2.3.0 - 20 November 2019 =
149
 
150
  - New: Gravity Forms Widget
1
  === Happy Elementor Addons ===
2
  Plugin Name: Happy Elementor Addons
3
+ Version: 2.4.0
4
  Author: weDevs
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, mosaddek73, tareq1988, sourav926, wedevs, iqbalrony, obiplabon
12
  License: GPLv2
13
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
14
 
15
+ [Happy Elementor Addons](https://happyaddons.com/) is the ultimate freemium (free+premium) widgets library for Elementor to take your website design to the next level. The nifty plugin, not just aims to the trendy and sophisticated WordPress website design philosophy but also effortlessly aligns with any Elementor powered WordPress website design requirements.
16
 
17
  == Description ==
18
 
19
+ [Happy Elementor Addons](https://happyaddons.com/) is the ultimate freemium (free+premium) widgets library for Elementor to take your website design to the next level. The nifty plugin, not just aims to the trendy and sophisticated WordPress website design philosophy but also effortlessly aligns with any Elementor powered WordPress website design requirements.
20
+
21
+ Despite being the newest addition to the product line up of [weDevs](https://wedevs.com/), it has already managed to win the heart of its users with a staggering 5-star rating. The plugin doesn’t require any coding knowhow and it is completely cross-browser compatible with mobile responsive feature.
22
 
23
  https://www.youtube.com/watch?v=XpWm7zdvUoM
24
 
25
+ _HappyAddons is a unique Elementor Addon. It might be the best addon package for Elementor._
26
+
27
+ _— **Adam Preiser, Founder of WP Crafter**_
28
+
29
+
30
+ ### **INCLUDED 27 FREE WIDGETS**
31
+
32
+ Unlike other Elementor addons, the Happy Elementor Addons comes with a host of free yet powerful widgets. The magical widgets will impress you so much that you will be confused whether they are premium or free:
33
+
34
+ 1. **[Card](https://demo.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://demo.happyaddons.com/elementor-card-widget-demo/)
35
+ 2. **[Gradient Heading](https://demo.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://demo.happyaddons.com/elementor-gradient-heading-widget-demo/)
36
+ 3. **[Info Box](https://demo.happyaddons.com/elementor-info-box-widget-demo/)** Create beautiful information boxes using icons, links, and texts, and make them slick using the built-in positioning features. [Check demo](https://demo.happyaddons.com/elementor-info-box-widget-demo/)
37
+ 4. **[Icon Box](https://demo.happyaddons.com/elementor-icon-box-widget-demo/)** A simplified version of Infobox but comes with powerful display features. Perfect for showcasing interesting information to your users in various styles. [Check demo](https://demo.happyaddons.com/elementor-icon-box-widget-demo/)
38
+ 5. **[Image Compare](https://demo.happyaddons.com/elementor-image-compare-widget-demo/)** – Are you a photo-editor, agency or product designer who often needs to showcase their beautiful works in a form of before and after slider? This widget is perfect for this job. And built-in styling options, vertical and horizontal orientation features can help you design these before-after sections with more creativity. [Check demo](https://demo.happyaddons.com/elementor-image-compare-widget-demo/)
39
+ 6. **[Team Member](https://demo.happyaddons.com/elementor-team-member-widget-demo/)** A perfect widget to showcase your beautiful team in various styles using texts, images, and social links. And just like our other widgets, you will find powerful styling options to make them stand out quite easily. [Check demo](https://demo.happyaddons.com/elementor-team-member-widget-demo/)
40
+ 7. **[Review](https://demo.happyaddons.com/elementor-review-widget-demo/)** Showcase your user feedback, reviews, and rating easily than ever using our review widget. Display user photos, texts and star ratings. Make them stand out using built-in offsets and positioning features. [Check demo](https://demo.happyaddons.com/elementor-review-widget-demo/)
41
+ 8. **[Skill Bars](https://demo.happyaddons.com/elementor-skill-bars-widget-demo/)** An essential building block to showcase user skills, task percentage, required tools, and other progressive information in different ways. It comes with incredible customizing options to suit your needs. [Check demo](https://demo.happyaddons.com/elementor-skill-bars-widget-demo/)
42
+ 9. **[Contact Form 7](https://demo.happyaddons.com/elementor-contact-form-7-widget-demo/)** This utility widget helps you to integrate existing forms built using CF7 plugin across your web pages without spending too much time. [Check demo](https://demo.happyaddons.com/elementor-contact-form-7-widget-demo/)
43
+ 10. **[Caldera Forms](https://demo.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://demo.happyaddons.com/elementor-caldera-forms-widget-demo/)
44
+ 11. **[weForms](https://demo.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 to that. [Check demo](https://demo.happyaddons.com/elementor-we-forms-widget-demo/)
45
+ 12. **[Ninja Forms](https://demo.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://demo.happyaddons.com/elementor-ninja-form-widget-demo/)
46
+ 13. **[WPForms](https://demo.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://demo.happyaddons.com/elementor-wpform-widget-demo/)
47
+ 14. **[Dual Button](https://demo.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://demo.happyaddons.com/elementor-dual-button-widget-demo/)
48
+ 15. **[Testimonial](https://demo.happyaddons.com/elementor-testimonial-widget-demo/)** Create beautiful testimonial sections with different look-n-feels using HappyAddons Testimonial widget. [Check demo](https://demo.happyaddons.com/elementor-testimonial-widget-demo/)
49
+ 16. **[Justified Grid](https://demo.happyaddons.com/elementor-justified-grid-widget-demo/)** – Another pro-grade widget that can help you to create the beautiful justified grid. It comes packed with tons of options to make it stand out from the crowd. [Check demo](https://demo.happyaddons.com/elementor-justified-grid-widget-demo/)
50
+ 17. **[Number](https://demo.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://demo.happyaddons.com/elementor-number-widget-demo/)
51
+ 18. **[Logo Grid](https://demo.happyaddons.com/elementor-logo-grid-widget-demo)** Showcase your clients or products using our logo grid widget, and display these items with styles. [Check demo](https://demo.happyaddons.com/elementor-logo-grid-widget-demo)
52
+ 19. **[Carousel](https://demo.happyaddons.com/elementor-carousel-widget-demo/)** Create interesting image and text carousels using our carousel widget which comes with a lot of options. [Check demo](https://demo.happyaddons.com/elementor-carousel-widget-demo/)
53
+ 20. **[Slider](https://demo.happyaddons.com/elementor-slider-widget-demo/)** Now you can create sliders with beautiful animations and effects using our Slider widget. And just like our other widgets, there are lots of customization options for you. [Check demo](https://demo.happyaddons.com/elementor-slider-widget-demo/)
54
+ 21. **[Step Flow](https://demo.happyaddons.com/elementor-step-flow-widget-demo/)** Create an excellent step by step visual diagram and instructions using this smart widget. Change directions, counters and make them look amazing with icons, texts, and colors. [Check demo](https://demo.happyaddons.com/elementor-step-flow-widget-demo/)
55
+ 22. **[Calendly](https://demo.happyaddons.com/elementor-calendly-widget-demo/)** – Schedule meetings without the back-and-forth emails through Calendly. We are happy to integrate this important application in our HappyAddons. [Check demo](https://demo.happyaddons.com/elementor-calendly-widget-demo/)
56
+ 23. **[Flip Box](https://demo.happyaddons.com/elementor-flip-box-widget-demo/)** FlipBox helps you to deliver messages in a beautiful way with before and after-effects. [Check demo](https://demo.happyaddons.com/elementor-flip-box-widget-demo/)
57
+ 24. **[Pricing Table](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)** – Create beautiful pricing tables with lots of customizations and sleek look-n-feel using this widget. [Check demo](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)
58
+ 25. **[Image Grid](https://demo.happyaddons.com/elementor-image-grid-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://demo.happyaddons.com/elementor-image-grid-widget-demo/)
59
+ 26. **[Gravity Forms](https://happyaddons.com/docs/happy-addons-for-elementor/widgets/gravity-forms/)** - While using Gravity forms, you may want to change the appearance of the form fields. With the Happy Addons, you can spruce up your Gravity forms like a pro. [Check demo](https://happyaddons.com/docs/happy-addons-for-elementor/widgets/gravity-forms/)
60
+ 27. **[News Ticker](https://happyaddons.com/docs/happy-addons-for-elementor/widgets/news-ticker/)** - Want to show updates, popular content or messages on your website? With the Happy Elementor Addons Content Ticker widget, you can do this at your disposal with great customizability.
61
+
62
+
63
+ ### **Free Built-in Extensions to Give You an Awesome Experience**
64
+
65
+ **Happy Extensions contain free extensions augmenting the features of the Elementor page builder to add additional customizations. These effects are unique and exclusive that is only available in Happy Addons.**
66
+
67
+ **🔆 Background Overlay –** This extension will allow you to add images, colors, and icons behind a widget. You can add background overlay to any widget.
68
+
69
+ **🔆 Happy Icons –** This will help you embellish your web page with an army of free happy icons. To do so, you have to
70
+ choose a widget that supports happy icons. Currently, the custom fonts library contains 500+ icons.
71
+
72
+ **🔆 Managing Column Order on Mobile Responsive Mood -** Your designed web page may contain some columns that may require to reorder in the mobile device view. By using the Happy Elementor Addons, you can rearrange the order of the column.
73
+
74
+ **🔆 Manage Column Width by Adding Pixels -** You can control the column width of your widgets with percentage parameters in Elementor. However, sometimes, you need to adjust the column width to meet your design aesthetics. The Happy Addons will let you do so with ease.
75
+
76
+ **🔆 Happy Clone -** While designing with Elementor, you may need to duplicate page or posts from the finder of
77
+ Elementor Page Builder by using the buttons (CMD/CTRL + E). Surprisingly, you can copy pages and posts lighting fast from the Elementor finder using the Happy clone feature.
78
+
79
+ **🔆 Fixed Size Controls in Elementor Button Widget -** Some times, you may need to make perfectly circular shaped
80
+ buttons in Elementor. With this free feature, you can do that by just setting a fixed size, that is, by specifying an equal height and width of the Elementor Button widget.
81
 
82
  **Happy Effects**
83
 
84
+ As mentioned, the happy Elementor Addons caters you with these two effects that are dying to make you happy:
 
85
 
86
+ 👉 **[Floating Effects](https://demo.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!
87
 
88
+ 👉 **[CSS Transform](https://demo.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.
89
 
90
+ https://www.youtube.com/watch?v=LmtacsLcFPU
91
+
92
+ **Space Effects Using Floating Effects**
93
+
94
  https://www.youtube.com/watch?v=F33g3zqkeog
95
 
 
96
 
97
+ ### **Presenting the Mighty Happy Elementor Add Ons Pro**
98
+
99
+ The Happy Elementor Addons ships not only with some unique premium features but also with premium widgets. The premium features are 100% unique and exclusive and the premium widgets are there to give you professional assistance to craft any design.
100
+
101
+ https://www.youtube.com/watch?v=QwJrFMtfO2U
102
+
103
+
104
+ ## **Premium (Pro) Features of the Happy Elementor Addons**
105
+
106
+ The premium features of happy addons make it stand out from all the other Elementor add-ons. You will get the following three premium features from the Happy Addons:
107
+
108
+
109
+ ### **Cross-Domain Copy-Paste: Apply the Same Design to Multiple Domains with a Single Click**
110
+
111
+ If you are creating different web pages with WordPress, you will often try to use the same elements of a web page to other pages over and over again.
112
+
113
+ To address this issue, the Elementor page builder comes with a free copy and paste elements feature for a single domain. But the problem is, you can not copy and paste an element to other domains.
114
+
115
+ This is where the goodness of the Happy Addons comes to the rescue! With this tool, you can copy and paste any element (for example, buttons, navigation bars, carousel, accordion, etc.) from one domain to another domain. Cool, right?
116
+
117
+ [Watch Demo](https://demo.happyaddons.com/cross-domain-copy-paste/)
118
+
119
+ https://www.youtube.com/watch?v=s1WlUYweJl0
120
+
121
 
122
+ ### **Preset: Save Your Time and Effort by Using the Preset Feature**
 
 
 
 
 
 
 
 
123
 
124
+ If you try to create your website from scratch and give it a professional appearance, then it will take up a huge amount of time and effort.
125
+
126
+ To tackle this hassle, the Preset option of the Happy Addons comes into play! Much like its name, it will let you select pre-made designs to create a web page faster and of course without compromising the quality. Currently, there are 400+ preset designs available in Happy Addons.
127
+
128
+ [Watch Demo](https://demo.happyaddons.com/presets-demo/)
129
+
130
+ https://www.youtube.com/watch?v=fEEvoc6HRBA
131
+
132
+
133
+ ### **Unlimited Section Nesting: Use Unlimited Section Nesting to Go Beyond the Limit**
134
+
135
+ With Elementor, you can create sections to make room for elements. We feel happy to say that by integrating the Happy Elementor add-ons, you can create infinite sections within a single section.
136
+
137
+ And as usual, you can insert as many widgets as you want into those sections.
138
+
139
+ [Watch demo](https://demo.happyaddons.com/unlimited-section-nesting/)
140
+
141
+ https://www.youtube.com/watch?v=Vr0-msIB3jc
142
+
143
+
144
+ ### **Live Copy: Copy Designs from Demo Site to Get It Done Right Away!**
145
+
146
+ Sometimes you may wish to simulate exactly the same design that you see on our demo page. Amazingly, with the Live Copy option, you can do it at your disposal.
147
+
148
+ This is a go-to way that lets you copy the code of the demo design from the demo site and allows you to use it directly on your Elementor edit panel.
149
+
150
+ Unlike a theme template, using the demo designs won’t put any pressure on your media server which is a must-have to load the page faster.
151
+
152
+ [Watch Demo](https://demo.happyaddons.com/live-copy/)
153
+
154
+ https://www.youtube.com/watch?v=339WNqlDFAA
155
+
156
+
157
+ ## **Premium Widgets of Happy Elementor Addons**
158
+
159
+ If you are not contented with the free widgets, then the following premium widgets are there to quench your thirst. The best part is that you can copy and paste the design source code and so you won’t have to make any design from scratch:
160
+
161
+
162
+ 1. **[Pricing Table](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)** - This one of a kind widget
163
+ will allow you to create any kind of pricing table under the sun. As a surprise, you can use gradient background, oval-shaped button, font awesome icons, background fill color, different heights, dark mood and so on. [Check demo](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)
164
+ 2. **[Flip Box](https://demo.happyaddons.com/elementor-flip-box-widget-demo-2/)** - This exquisite widget will help
165
+ you show different messages or texts at the time before and after a user hover on a certain element. Just like the other widgets, you can customize this with background image, gutter and circular arrow navigation on both sides. [Check demo](https://demo.happyaddons.com/elementor-flip-box-widget-demo-2/)
166
+ 3. **[Advanced Heading](https://demo.happyaddons.com/elementor-advanced-heading-widget-demo/)** - With this useful widget you can create beautiful heading design for your text. Like the other widgets, you will get a bunch of free customization options for different sections of the texts. [Check demo](https://demo.happyaddons.com/elementor-advanced-heading-widget-demo/)
167
+ 4. **[Animated Text](https://demo.happyaddons.com/elementor-animated-text-widget-demo/)** - This widget is pretty useful
168
+ to make your text stand apart from the crowd applying smart animations. You can customize the cool animation effects with a variety of flexible styles. [Check demo](https://demo.happyaddons.com/elementor-animated-text-widget-demo/)
169
+ 5. **[Scrolling Image](https://demo.happyaddons.com/elementor-scrolling-image-widget-demo/)** - Using this widget, you can show your products or services in a way that slides horizontally or vertically. You can also create a stunning photo gallery with this awesome widget. [Check demo](v)
170
+ 6. **[Image Hover Box](https://demo.happyaddons.com/elementor-image-hover-box-widget-demo/)** - Give boring images lives by adding dynamic animated texts with this nifty little tool. You can display texts with this tool right after a user hovers an image. [Check demo](https://demo.happyaddons.com/elementor-image-hover-box-widget-demo/)
171
+ 7. **[Team Carousel](https://demo.happyaddons.com/elementor-team-carousel-widget-demo/)** - Present your team members with beautiful carousels that include social profile buttons, arrow icons, and great customizability. [Check demo](https://demo.happyaddons.com/elementor-team-carousel-widget-demo/)
172
+ 8. **[Timeline](https://demo.happyaddons.com/elementor-timeline-widget-demo/)** - Tell your story in the precise and the smartest way using this gorgeous tool. Your visitors will get to know everything about the history of your product or company through a bird’s eye view. [Check demo](https://demo.happyaddons.com/elementor-timeline-widget-demo/)
173
+ 9. **[Advanced Tab](https://demo.happyaddons.com/elementor-advanced-tab-widget-demo/)** - This elementor widget will enable you to show your content by creating advanced tabbed content sections using full-controlled customizations. You can also use other widgets inside the tab. [Check demo](https://demo.happyaddons.com/elementor-advanced-tab-widget-demo/)
174
+ 10. **[Advanced Accordion](https://demo.happyaddons.com/elementor-advanced-accordion-widget-demo/)** - Just like the Advanced Tab widget, if you want to provide your user with extra information using a collapsing effect in different directions, then this is the widget to you should go for. [Check demo](https://demo.happyaddons.com/elementor-advanced-accordion-widget-demo/)
175
+ 11. **[Testimonial Carousel](https://demo.happyaddons.com/elementor-testimonial-carousel-widget-demo/)** - This widget will provide you with a great way to showcase the recommendations of your customers. You can also control the carousel’s movement using various flexible styles. [Check demo](https://demo.happyaddons.com/elementor-testimonial-carousel-widget-demo/)
176
+ 12. **[Logo Carousel](https://demo.happyaddons.com/elementor-logo-carousel-widget-demo/)** - Unleash your design creativity with this beautiful logo carousel widget and showcase your partners and products using vertical or horizontal motion. [Check demo](https://demo.happyaddons.com/elementor-logo-carousel-widget-demo/)
177
+ 13. **[Countdown](https://demo.happyaddons.com/elementor-countdown-widget-demo/)** - This eye-catching widget will let you set a countdown clock which you can use to show the launch time of your website or prod the customers to take a particular action showing remaining time. [Check demo](https://demo.happyaddons.com/elementor-countdown-widget-demo/)
178
+ 14. **[Business Hour](https://demo.happyaddons.com/elementor-business-hour-widget-demo/)** - This widget will help you show the business hours in a tabular form. Your customers will get to know when your business is open or closed. [Check demo](https://demo.happyaddons.com/elementor-business-hour-widget-demo/)
179
+ 15. **[Instagram Feed](https://demo.happyaddons.com/elementor-instagram-feed-widget-demo/)** - This widget will pave you the way to dynamically show you your beautiful Instagram photos seamlessly on your website page. Users can interact with your photos and leave a comment. [Check demo](https://demo.happyaddons.com/elementor-instagram-feed-widget-demo/)
180
+ 16. **[Advanced Toggle](https://demo.happyaddons.com/elementor-advanced-toggle-widget-demo/)** - Similar to the Accordion widget, this will allow you to create a collapsible container area that will enable the user to show and hide items provided that the user clicks on it. [Check demo](https://demo.happyaddons.com/elementor-advanced-toggle-widget-demo/)
181
+ 17. **[List Group](https://demo.happyaddons.com/elementor-list-group-widget-demo/)** - With this incredibly handy widget, you can craft beautiful lists. You can also apply advanced styles to give the appearance of the items just like the way you want. [Check demo](https://demo.happyaddons.com/elementor-list-group-widget-demo/)
182
+ 18. **[Feature List](https://demo.happyaddons.com/elementor-feature-list-widget-demo/)** - You can display your product features using different styles using this widget. As a bonus, you can also customize each and every predefined design. [Check demo](https://demo.happyaddons.com/elementor-feature-list-widget-demo/)
183
+ 19. **[Source Code](https://demo.happyaddons.com/elementor-source-code-widget-demo/)** - While writing docs or tutorial posts, you can use this widget to skillfully show codes to your visitors so that they can copy and paste them anywhere on the page at their disposal. [Check demo](https://demo.happyaddons.com/elementor-source-code-widget-demo/)
184
+
185
+
186
+ ### **Enjoy Extra Benefits from the Happy Addons!**
187
+
188
+ Our code doesn’t stink and we don’t leave you blindfolded when you need support from us. Apart from the freemium widgets, the plugin will pamper you with a fleet of professional quality features.
189
+
190
+ For example, it’s compatible with almost every WordPress theme; it’s lightweight and fast; comes up with motion effects, and empowers you with enormous customizability options. In addition, the plugin also works cohesively with the stock Elementor widgets.
191
+
192
+ If you don’t understand a feature or fail to give it the desired look which was already demonstrated in a demo, or it’s not working as expected – we got your back. Just drop us a line and we will do our best to help you figure a way out.
193
+
194
+
195
+ ### **BUGS, TECHNICAL HINTS OR CONTRIBUTE**
196
 
197
  Please give us feedback, contribute and file technical bugs on [GitHub Repo](https://github.com/weDevsOfficial/happy-elementor-addons/issues).
198
 
199
+ **Connect with the Happy Community**
200
+
201
+ In case you want to share any ideas on Happy Addons with other users or if you are in any trouble, don’t feel stranded. Stay connected with [the Happy addons community](https://www.facebook.com/groups/HappyAddonsCommunity/).
202
+
203
 
204
  == Frequently Asked Questions ==
205
 
258
 
259
  == Changelog ==
260
 
261
+ = 2.4.0 - 3 December 2019 =
262
+
263
+ - New: Happy Clone - (duplicate post/page from anywhere!)
264
+ - New: News Ticker Widget
265
+ - New: Fixed size controls in Elementor Button widget
266
+ - Fix: Badge offset responsive issue for Icon Box Widget
267
+ - Fix: Wrapper is rendered when icon/image is missing issue
268
+
269
  = 2.3.0 - 20 November 2019 =
270
 
271
  - New: Gravity Forms Widget
templates/admin/dashboard-widgets.php CHANGED
@@ -4,12 +4,17 @@
4
  */
5
 
6
  defined( 'ABSPATH' ) || die();
 
 
 
 
 
7
  ?>
8
  <div class="ha-dashboard-panel">
9
  <div class="ha-dashboard-panel__header">
10
  <div class="ha-dashboard-panel__header-content">
11
  <h2><?php esc_html_e( 'Happy Widgets', 'happy-elementor-addons' ); ?></h2>
12
- <p class="f16"><?php _e( 'Here is the list of our all widgets. You can enable or disable widgets from here to optimize loading speed and Elementor editor experience. <strong>After enabling or disabling any widget make sure to click the Save Changes button.</strong>', 'happy-elementor-addons' ); ?></p>
13
 
14
  <div class="ha-action-list">
15
  <button type="button" class="ha-action--btn" data-filter="*"><?php esc_html_e( 'All', 'happy-elementor-addons' ); ?></button>
@@ -24,9 +29,6 @@ defined( 'ABSPATH' ) || die();
24
 
25
  <div class="ha-dashboard-widgets">
26
  <?php
27
- $widgets = self::get_widgets();
28
- $inactive_widgets = \Happy_Addons\Elementor\Widgets_Manager::get_inactive_widgets();
29
-
30
  foreach ( $widgets as $widget_key => $widget_data ) :
31
  $title = isset( $widget_data['title'] ) ? $widget_data['title'] : '';
32
  $icon = isset( $widget_data['icon'] ) ? $widget_data['icon'] : '';
4
  */
5
 
6
  defined( 'ABSPATH' ) || die();
7
+
8
+ $widgets = self::get_widgets();
9
+ $inactive_widgets = \Happy_Addons\Elementor\Widgets_Manager::get_inactive_widgets();
10
+
11
+ $total_widgets_count = count( $widgets );
12
  ?>
13
  <div class="ha-dashboard-panel">
14
  <div class="ha-dashboard-panel__header">
15
  <div class="ha-dashboard-panel__header-content">
16
  <h2><?php esc_html_e( 'Happy Widgets', 'happy-elementor-addons' ); ?></h2>
17
+ <p class="f16"><?php printf( esc_html__( 'Here is the list of our all %s widgets. You can enable or disable widgets from here to optimize loading speed and Elementor editor experience. %sAfter enabling or disabling any widget make sure to click the Save Changes button.%s', 'happy-elementor-addons' ), $total_widgets_count, '<strong>', '</strong>' ); ?></p>
18
 
19
  <div class="ha-action-list">
20
  <button type="button" class="ha-action--btn" data-filter="*"><?php esc_html_e( 'All', 'happy-elementor-addons' ); ?></button>
29
 
30
  <div class="ha-dashboard-widgets">
31
  <?php
 
 
 
32
  foreach ( $widgets as $widget_key => $widget_data ) :
33
  $title = isset( $widget_data['title'] ) ? $widget_data['title'] : '';
34
  $icon = isset( $widget_data['icon'] ) ? $widget_data['icon'] : '';
widgets/card/widget.php CHANGED
@@ -1064,7 +1064,7 @@ class Card extends Base {
1064
  <div class="ha-card-body">
1065
 
1066
  <?php
1067
- if ( $settings['title_tag'] ) :
1068
  printf( '<%1$s %2$s>%3$s</%1$s>',
1069
  tag_escape( $settings['title_tag'] ),
1070
  $this->get_render_attribute_string( 'title' ),
1064
  <div class="ha-card-body">
1065
 
1066
  <?php
1067
+ if ( $settings['title' ] ) :
1068
  printf( '<%1$s %2$s>%3$s</%1$s>',
1069
  tag_escape( $settings['title_tag'] ),
1070
  $this->get_render_attribute_string( 'title' ),
widgets/icon-box/widget.php CHANGED
@@ -179,6 +179,7 @@ class Icon_Box extends Base {
179
  ],
180
  ],
181
  'toggle' => true,
 
182
  'selectors' => [
183
  '{{WRAPPER}}' => 'text-align: {{VALUE}};'
184
  ]
@@ -533,12 +534,20 @@ class Icon_Box extends Base {
533
  ],
534
  'range' => [
535
  'px' => [
536
- 'min' => -250,
537
- 'max' => 250,
538
  ],
539
  ],
540
  'selectors' => [
541
- '{{WRAPPER}} .ha-badge' => '-ms-transform: translate({{badge_offset_x.SIZE}}{{UNIT}}, {{SIZE}}{{UNIT}}); -webkit-transform: translate({{badge_offset_x.SIZE}}{{UNIT}}, {{SIZE}}{{UNIT}}); transform: translate({{badge_offset_x.SIZE}}{{UNIT}}, {{SIZE}}{{UNIT}});',
 
 
 
 
 
 
 
 
542
  ],
543
  ]
544
  );
@@ -723,7 +732,7 @@ class Icon_Box extends Base {
723
  <span <?php $this->print_render_attribute_string( 'badge_text' ); ?>><?php echo esc_html( $settings['badge_text'] ); ?></span>
724
  <?php endif; ?>
725
 
726
- <?php if ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon'] ) ) : ?>
727
  <span class="ha-icon-box-icon">
728
  <?php ha_render_icon( $settings, 'icon', 'selected_icon' ); ?>
729
  </span>
@@ -764,7 +773,7 @@ class Icon_Box extends Base {
764
  <span {{{ view.getRenderAttributeString( 'badge_text' ) }}}>{{ settings.badge_text }}</span>
765
  <# } #>
766
 
767
- <# if ( settings.icon || settings.selected_icon ) { #>
768
  <span class="ha-icon-box-icon">
769
  <# if ( ha_has_icon_library() && iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
770
  {{{ iconHTML.value }}}
179
  ],
180
  ],
181
  'toggle' => true,
182
+ 'default' => 'center',
183
  'selectors' => [
184
  '{{WRAPPER}}' => 'text-align: {{VALUE}};'
185
  ]
534
  ],
535
  'range' => [
536
  'px' => [
537
+ 'min' => -500,
538
+ 'max' => 500,
539
  ],
540
  ],
541
  'selectors' => [
542
+ '(desktop){{WRAPPER}} .ha-badge' =>
543
+ '-webkit-transform: translate({{badge_offset_x.SIZE || 0}}{{UNIT}}, {{badge_offset_y.SIZE || 0}}{{UNIT}});
544
+ transform: translate({{badge_offset_x.SIZE || 0}}{{UNIT}}, {{badge_offset_y.SIZE || 0}}{{UNIT}});',
545
+ '(tablet){{WRAPPER}} .ha-badge' =>
546
+ '-webkit-transform: translate({{badge_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{badge_offset_y_tablet.SIZE || 0}}{{UNIT}});
547
+ transform: translate({{badge_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{badge_offset_y_tablet.SIZE || 0}}{{UNIT}});',
548
+ '(mobile){{WRAPPER}} .ha-badge' =>
549
+ '-webkit-transform: translate({{badge_offset_x_mobile.SIZE}}{{UNIT}}, {{badge_offset_y_mobile.SIZE || 0}}{{UNIT}});
550
+ transform: translate({{badge_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{badge_offset_y_mobile.SIZE || 0}}{{UNIT}});',
551
  ],
552
  ]
553
  );
732
  <span <?php $this->print_render_attribute_string( 'badge_text' ); ?>><?php echo esc_html( $settings['badge_text'] ); ?></span>
733
  <?php endif; ?>
734
 
735
+ <?php if ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon']['value'] ) ) : ?>
736
  <span class="ha-icon-box-icon">
737
  <?php ha_render_icon( $settings, 'icon', 'selected_icon' ); ?>
738
  </span>
773
  <span {{{ view.getRenderAttributeString( 'badge_text' ) }}}>{{ settings.badge_text }}</span>
774
  <# } #>
775
 
776
+ <# if ( settings.icon || settings.selected_icon.value ) { #>
777
  <span class="ha-icon-box-icon">
778
  <# if ( ha_has_icon_library() && iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
779
  {{{ iconHTML.value }}}
widgets/infobox/widget.php CHANGED
@@ -928,7 +928,7 @@ class InfoBox extends Base {
928
  <figure class="ha-infobox-figure ha-infobox-figure--image">
929
  <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
930
  </figure>
931
- <?php elseif ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon'] ) ) : ?>
932
  <figure class="ha-infobox-figure ha-infobox-figure--icon">
933
  <?php ha_render_icon( $settings, 'icon', 'selected_icon' ); ?>
934
  </figure>
@@ -1018,7 +1018,7 @@ class InfoBox extends Base {
1018
  <img src="{{ image_url }}">
1019
  </figure>
1020
  <# }
1021
- } else if ( settings.icon || settings.selected_icon ) { #>
1022
  <figure class="ha-infobox-figure ha-infobox-figure--icon">
1023
  <# if ( ha_has_icon_library() && iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
1024
  {{{ iconHTML.value }}}
928
  <figure class="ha-infobox-figure ha-infobox-figure--image">
929
  <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
930
  </figure>
931
+ <?php elseif ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon']['value'] ) ) : ?>
932
  <figure class="ha-infobox-figure ha-infobox-figure--icon">
933
  <?php ha_render_icon( $settings, 'icon', 'selected_icon' ); ?>
934
  </figure>
1018
  <img src="{{ image_url }}">
1019
  </figure>
1020
  <# }
1021
+ } else if ( settings.icon || settings.selected_icon.value ) { #>
1022
  <figure class="ha-infobox-figure ha-infobox-figure--icon">
1023
  <# if ( ha_has_icon_library() && iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
1024
  {{{ iconHTML.value }}}
widgets/news-ticker/widget.php ADDED
@@ -0,0 +1,485 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * News Ticker widget class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+
8
+ namespace Happy_Addons\Elementor\Widget;
9
+
10
+ use Elementor\Controls_Manager;
11
+ use Elementor\Group_Control_Border;
12
+ use Elementor\Group_Control_Box_Shadow;
13
+ use Elementor\Group_Control_Text_Shadow;
14
+ use Elementor\Group_Control_Typography;
15
+ use Elementor\Scheme_Typography;
16
+ use Elementor\Group_Control_Background;
17
+
18
+ defined( 'ABSPATH' ) || die();
19
+
20
+ class News_Ticker extends Base {
21
+
22
+ /**
23
+ * Get widget title.
24
+ *
25
+ * @return string Widget title.
26
+ * @since 1.0.0
27
+ * @access public
28
+ *
29
+ */
30
+ public function get_title () {
31
+ return __( 'News Ticker', 'happy-elementor-addons' );
32
+ }
33
+
34
+ /**
35
+ * Get widget icon.
36
+ *
37
+ * @return string Widget icon.
38
+ * @since 1.0.0
39
+ * @access public
40
+ *
41
+ */
42
+ public function get_icon () {
43
+ return 'hm hm-slider';
44
+ }
45
+
46
+ public function get_keywords () {
47
+ return [ 'news', 'news-ticker', 'ticker', 'text-slider', 'slider' ];
48
+ }
49
+
50
+ /**
51
+ * Get a list of all WPForms
52
+ *
53
+ * @return array
54
+ */
55
+ public function ha_get_posts () {
56
+ $posts = [];
57
+ $_posts = get_posts( [
58
+ 'post_type' => 'post',
59
+ 'post_status' => 'publish',
60
+ 'posts_per_page' => -1,
61
+ 'orderby' => 'title',
62
+ 'order' => 'ASC',
63
+ ] );
64
+
65
+ if ( ! empty( $_posts ) ) {
66
+ $posts = wp_list_pluck( $_posts, 'post_title', 'ID' );
67
+ }
68
+ return $posts;
69
+
70
+ }
71
+
72
+ protected function register_content_controls () {
73
+ $this->start_controls_section(
74
+ '_section_news_ticker',
75
+ [
76
+ 'label' => __( 'News Ticker', 'happy-elementor-addons' ),
77
+ 'tab' => Controls_Manager::TAB_CONTENT,
78
+ ]
79
+ );
80
+
81
+ $this->add_control(
82
+ 'sticky_title',
83
+ [
84
+ 'label' => __( 'Sticky Title', 'happy-elementor-addons' ),
85
+ 'type' => Controls_Manager::TEXT,
86
+ 'default' => __( 'Breaking News', 'happy-elementor-addons' ),
87
+ ]
88
+ );
89
+
90
+ $this->add_control(
91
+ 'sticky_title_position',
92
+ [
93
+ 'label' => __( 'Sticky Title Position', 'happy-elementor-addons' ),
94
+ 'type' => Controls_Manager::CHOOSE,
95
+ 'options' => [
96
+ 'left' => [
97
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
98
+ 'icon' => 'eicon-h-align-left',
99
+ ],
100
+ 'right' => [
101
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
102
+ 'icon' => 'eicon-h-align-right',
103
+ ],
104
+ ],
105
+ 'default' => 'left',
106
+ 'toggle' => false,
107
+ 'style_transfer' => true,
108
+ 'selectors' => [
109
+ '{{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => '{{VALUE}};'
110
+ ],
111
+ 'selectors_dictionary' => [
112
+ 'left' => 'left: 0',
113
+ 'right' => 'right: 0'
114
+ ],
115
+ 'condition' => [
116
+ 'sticky_title!' => '',
117
+ ]
118
+ ]
119
+ );
120
+
121
+ $this->add_control(
122
+ 'selected_posts',
123
+ [
124
+ 'label' => __( 'Select Posts', 'happy-elementor-addons' ),
125
+ 'label_block' => true,
126
+ 'type' => Controls_Manager::SELECT2,
127
+ 'default' => '',
128
+ 'options' => $this->ha_get_posts(),
129
+ 'multiple' => true,
130
+ ]
131
+ );
132
+
133
+ $this->add_control(
134
+ 'slide_direction',
135
+ [
136
+ 'label' => __( 'Slide direction', 'happy-elementor-addons' ),
137
+ 'type' => Controls_Manager::CHOOSE,
138
+ 'options' => [
139
+ 'left' => [
140
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
141
+ 'icon' => 'eicon-h-align-left',
142
+ ],
143
+ 'right' => [
144
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
145
+ 'icon' => 'eicon-h-align-right',
146
+ ],
147
+ ],
148
+ 'default' => 'left',
149
+ 'toggle' => false,
150
+ 'style_transfer' => true,
151
+ ]
152
+ );
153
+
154
+ $this->add_control(
155
+ 'item_space',
156
+ [
157
+ 'label' => __( 'Space between items', 'happy-elementor-addons' ),
158
+ 'type' => Controls_Manager::SLIDER,
159
+ 'size_units' => [ 'px' ],
160
+ 'range' => [
161
+ 'px' => [
162
+ 'min' => -100,
163
+ 'max' => 100,
164
+ ],
165
+ ],
166
+ 'selectors' => [
167
+ '{{WRAPPER}} .ha-news-ticker-wrapper .ha-news-ticker-item' => 'margin-right: {{SIZE}}{{UNIT}};',
168
+ '{{WRAPPER}} .ha-news-ticker-wrapper .ha-news-ticker-item:last-child' => 'margin-right: 0;',
169
+ ],
170
+ 'style_transfer' => true,
171
+ ]
172
+ );
173
+
174
+ $this->add_control(
175
+ 'speed',
176
+ [
177
+ 'label' => __( 'Slide Speed', 'happy-elementor-addons' ),
178
+ 'description' => __( 'Autoplay speed in seconds. Default 30', 'happy-elementor-addons' ),
179
+ 'type' => Controls_Manager::NUMBER,
180
+ 'min' => 1,
181
+ 'max' => 10000,
182
+ 'default' => 30,
183
+ 'frontend_available' => true,
184
+ ]
185
+ );
186
+
187
+ $this->end_controls_section();
188
+ }
189
+
190
+ protected function register_style_controls () {
191
+
192
+ $this->start_controls_section(
193
+ '_style_news_ticker_wrapper',
194
+ [
195
+ 'label' => __( 'Wrapper', 'happy-elementor-addons' ),
196
+ 'tab' => Controls_Manager::TAB_STYLE,
197
+ ]
198
+ );
199
+
200
+ $this->add_group_control(
201
+ Group_Control_Background::get_type(),
202
+ [
203
+ 'name' => 'wrapper_background',
204
+ 'label' => __( 'Background', 'happy-elementor-addons' ),
205
+ 'types' => [ 'classic', 'gradient' ],
206
+ 'selector' => '{{WRAPPER}} .ha-news-ticker-wrapper',
207
+ ]
208
+ );
209
+
210
+ $this->add_group_control(
211
+ Group_Control_Border::get_type(),
212
+ [
213
+ 'name' => 'wrapper_border',
214
+ 'label' => __( 'Border', 'happy-elementor-addons' ),
215
+ 'selector' => '{{WRAPPER}} .ha-news-ticker-wrapper',
216
+ ]
217
+ );
218
+
219
+ $this->add_control(
220
+ 'wrapper_border_radius',
221
+ [
222
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
223
+ 'type' => Controls_Manager::DIMENSIONS,
224
+ 'size_units' => [ 'px' ],
225
+ 'selectors' => [
226
+ '{{WRAPPER}} .ha-news-ticker-wrapper' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
227
+ ],
228
+ ]
229
+ );
230
+
231
+ $this->add_group_control(
232
+ Group_Control_Box_Shadow::get_type(),
233
+ [
234
+ 'name' => 'wrapper_box_shadow',
235
+ 'label' => __( 'Box Shadow', 'happy-elementor-addons' ),
236
+ 'selector' => '{{WRAPPER}} .ha-news-ticker-wrapper',
237
+ ]
238
+ );
239
+
240
+ $this->add_responsive_control(
241
+ 'wrapper_padding',
242
+ [
243
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
244
+ 'type' => Controls_Manager::DIMENSIONS,
245
+ 'size_units' => [ 'px', '%', 'em' ],
246
+ 'selectors' => [
247
+ '{{WRAPPER}} .ha-news-ticker-wrapper' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
248
+ ],
249
+ ]
250
+ );
251
+
252
+ $this->add_control(
253
+ 'sticky_title_position_left',
254
+ [
255
+ 'label' => __( 'Sticky Title Position Left', 'happy-elementor-addons' ),
256
+ 'type' => Controls_Manager::HIDDEN,
257
+ 'default' => 'left',
258
+ 'selectors' => [
259
+ '(desktop){{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'left: {{wrapper_padding.LEFT || 0}}{{wrapper_padding.UNIT}}; right:auto;',
260
+ '(tablet){{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'left: {{wrapper_padding_tablet.LEFT}}{{wrapper_padding_tablet.UNIT}}; right:auto;',
261
+ '(mobile){{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'left: {{wrapper_padding_mobile.LEFT}}{{wrapper_padding_mobile.UNIT}}; right:auto;',
262
+ ],
263
+ 'condition' => [
264
+ 'sticky_title!' => '',
265
+ 'sticky_title_position' => 'left',
266
+ ]
267
+ ]
268
+ );
269
+
270
+ $this->add_control(
271
+ 'sticky_title_position_right',
272
+ [
273
+ 'label' => __( 'Sticky Title Position Right', 'happy-elementor-addons' ),
274
+ 'type' => Controls_Manager::HIDDEN,
275
+ 'default' => 'right',
276
+ 'selectors' => [
277
+ '(desktop){{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'right: {{wrapper_padding.RIGHT || 0}}{{wrapper_padding.UNIT}}; left:auto;',
278
+ '(tablet){{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'right: {{wrapper_padding_tablet.RIGHT}}{{wrapper_padding_tablet.UNIT}}; left:auto;',
279
+ '(mobile){{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'right: {{wrapper_padding_mobile.RIGHT}}{{wrapper_padding_mobile.UNIT}}; left:auto;',
280
+ ],
281
+ 'condition' => [
282
+ 'sticky_title!' => '',
283
+ 'sticky_title_position' => 'right',
284
+ ]
285
+ ]
286
+ );
287
+
288
+ $this->end_controls_section();
289
+
290
+ $this->start_controls_section(
291
+ '_style_news_ticker_sticky_title',
292
+ [
293
+ 'label' => __( 'Sticky Title', 'happy-elementor-addons' ),
294
+ 'tab' => Controls_Manager::TAB_STYLE,
295
+ ]
296
+ );
297
+
298
+ $this->add_control(
299
+ 'sticky_title_color',
300
+ [
301
+ 'label' => __( 'Title Color', 'happy-elementor-addons' ),
302
+ 'type' => Controls_Manager::COLOR,
303
+ 'selectors' => [
304
+ '{{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'color: {{VALUE}};',
305
+ ],
306
+ ]
307
+ );
308
+
309
+ $this->add_group_control(
310
+ Group_Control_Typography::get_type(),
311
+ [
312
+ 'name' => 'sticky_title_typography',
313
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
314
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
315
+ 'selector' => '{{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title',
316
+ ]
317
+ );
318
+
319
+ $this->add_group_control(
320
+ Group_Control_Background::get_type(),
321
+ [
322
+ 'name' => 'sticky_title_background',
323
+ 'label' => __( 'Background', 'happy-elementor-addons' ),
324
+ 'types' => [ 'classic', 'gradient' ],
325
+ 'selector' => '{{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title',
326
+ ]
327
+ );
328
+
329
+ $this->add_group_control(
330
+ Group_Control_Border::get_type(),
331
+ [
332
+ 'name' => 'sticky_title_border',
333
+ 'label' => __( 'Border', 'happy-elementor-addons' ),
334
+ 'selector' => '{{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title',
335
+ ]
336
+ );
337
+
338
+ $this->add_control(
339
+ 'sticky_title_border_radius',
340
+ [
341
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
342
+ 'type' => Controls_Manager::DIMENSIONS,
343
+ 'size_units' => [ 'px' ],
344
+ 'selectors' => [
345
+ '{{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
346
+ ],
347
+ ]
348
+ );
349
+
350
+ $this->add_responsive_control(
351
+ 'sticky_title_padding',
352
+ [
353
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
354
+ 'type' => Controls_Manager::DIMENSIONS,
355
+ 'size_units' => [ 'px', '%', 'em' ],
356
+ 'selectors' => [
357
+ '{{WRAPPER}} .ha-news-ticker-wrapper span.ha-news-ticker-sticky-title' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
358
+ ],
359
+ ]
360
+ );
361
+
362
+ $this->end_controls_section();
363
+
364
+ $this->start_controls_section(
365
+ '_style_news_ticker_title',
366
+ [
367
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
368
+ 'tab' => Controls_Manager::TAB_STYLE,
369
+ ]
370
+ );
371
+
372
+ $this->start_controls_tabs( '_tabs_title' );
373
+
374
+ $this->start_controls_tab(
375
+ '_tab_title_normal',
376
+ [
377
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
378
+ ]
379
+ );
380
+
381
+ $this->add_control(
382
+ 'title_color',
383
+ [
384
+ 'label' => __( 'Title Color', 'happy-elementor-addons' ),
385
+ 'type' => Controls_Manager::COLOR,
386
+ 'selectors' => [
387
+ '{{WRAPPER}} .ha-news-ticker-wrapper li.ha-news-ticker-item a' => 'color: {{VALUE}};',
388
+ ],
389
+ ]
390
+ );
391
+
392
+ $this->end_controls_tab();
393
+
394
+ $this->start_controls_tab(
395
+ '_tab_title_hover',
396
+ [
397
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
398
+ ]
399
+ );
400
+
401
+ $this->add_control(
402
+ 'title_hover_color',
403
+ [
404
+ 'label' => __( 'Title Color', 'happy-elementor-addons' ),
405
+ 'type' => Controls_Manager::COLOR,
406
+ 'selectors' => [
407
+ '{{WRAPPER}} .ha-news-ticker-wrapper li.ha-news-ticker-item a:hover, {{WRAPPER}} .ha-news-ticker-wrapper li.ha-news-ticker-item a:focus' => 'color: {{VALUE}};',
408
+ ],
409
+ ]
410
+ );
411
+
412
+ $this->end_controls_tab();
413
+ $this->end_controls_tabs();
414
+
415
+ $this->add_group_control(
416
+ Group_Control_Typography::get_type(),
417
+ [
418
+ 'name' => 'title_typography',
419
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
420
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
421
+ 'selector' => '{{WRAPPER}} .ha-news-ticker-wrapper li.ha-news-ticker-item .ha-news-ticker-title',
422
+ ]
423
+ );
424
+
425
+ $this->add_group_control(
426
+ Group_Control_Text_Shadow::get_type(),
427
+ [
428
+ 'name' => 'title_shadow',
429
+ 'label' => __( 'Title Shadow', 'happy-elementor-addons' ),
430
+ 'selector' => '{{WRAPPER}} .ha-news-ticker-wrapper li.ha-news-ticker-item a',
431
+ 'style_transfer' => true,
432
+ ]
433
+ );
434
+
435
+ $this->end_controls_section();
436
+ }
437
+
438
+ protected function render () {
439
+
440
+ $settings = $this->get_settings_for_display();
441
+ if ( empty( $settings['selected_posts'] ) ) {
442
+ return;
443
+ }
444
+ $query_args = [
445
+ 'post_type' => 'post',
446
+ 'post_status' => 'publish',
447
+ 'ignore_sticky_posts' => 1,
448
+ 'post__in' => (array) $settings['selected_posts'],
449
+ ];
450
+
451
+ $news_posts = [];
452
+ $the_query = get_posts( $query_args );
453
+ if ( ! empty( $the_query ) ) {
454
+ $news_posts = wp_list_pluck( $the_query, 'post_title', 'post_status' );
455
+ }
456
+
457
+ $this->add_render_attribute( 'wrapper', 'class', [ 'ha-news-ticker-wrapper' ] );
458
+ $this->add_render_attribute( 'wrapper', 'data-duration', $settings['speed'] ? ( $settings['speed'] * '1000' ) : '30000' );
459
+ $this->add_render_attribute( 'wrapper', 'data-scroll-direction', $settings['slide_direction'] );
460
+ $this->add_render_attribute( 'container', 'class', [ 'ha-news-ticker-container' ] );
461
+ $this->add_render_attribute( 'item', 'class', [ 'ha-news-ticker-item' ] );
462
+
463
+ if ( count( $news_posts ) !== 0 ) :?>
464
+ <div <?php $this->print_render_attribute_string( 'wrapper' ); ?>>
465
+ <?php if ( $settings['sticky_title'] ): ?>
466
+ <span class="ha-news-ticker-sticky-title">
467
+ <?php echo esc_html( $settings['sticky_title'] ); ?>
468
+ </span>
469
+ <?php endif; ?>
470
+ <ul <?php $this->print_render_attribute_string( 'container' ); ?>>
471
+ <?php foreach ( $news_posts as $key => $value ): ?>
472
+ <li <?php $this->print_render_attribute_string( 'item' ); ?>>
473
+ <h2 class="ha-news-ticker-title">
474
+ <a href="<?php echo esc_url( $key ); ?>">
475
+ <?php echo esc_html( $value ); ?>
476
+ </a>
477
+ </h2>
478
+ </li>
479
+ <?php endforeach; ?>
480
+ </ul>
481
+ </div>
482
+ <?php
483
+ endif;
484
+ }
485
+ }
widgets/pricing-table/widget.php CHANGED
@@ -997,7 +997,7 @@ class Pricing_Table extends Base {
997
  $this->add_render_attribute( $name_key, 'class', 'ha-pricing-table-feature-text' );
998
  ?>
999
  <li class="<?php echo esc_attr( 'elementor-repeater-item-' . $feature['_id'] ); ?>">
1000
- <?php if ( ! empty( $feature['icon'] ) || ! empty( $feature['selected_icon'] ) ) :
1001
  ha_render_icon( $feature, 'icon', 'selected_icon' );
1002
  endif; ?>
1003
  <div <?php $this->print_render_attribute_string( $name_key ); ?>><?php echo ha_kses_intermediate( $feature['text'] ); ?></div>
997
  $this->add_render_attribute( $name_key, 'class', 'ha-pricing-table-feature-text' );
998
  ?>
999
  <li class="<?php echo esc_attr( 'elementor-repeater-item-' . $feature['_id'] ); ?>">
1000
+ <?php if ( ! empty( $feature['icon'] ) || ! empty( $feature['selected_icon']['value'] ) ) :
1001
  ha_render_icon( $feature, 'icon', 'selected_icon' );
1002
  endif; ?>
1003
  <div <?php $this->print_render_attribute_string( $name_key ); ?>><?php echo ha_kses_intermediate( $feature['text'] ); ?></div>
widgets/step-flow/widget.php CHANGED
@@ -650,7 +650,7 @@ class Step_Flow extends Base {
650
  <div class="ha-step-arrow"></div>
651
  <?php endif; ?>
652
 
653
- <?php if ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon'] ) ) :
654
  ha_render_icon( $settings, 'icon', 'selected_icon' );
655
  endif; ?>
656
 
650
  <div class="ha-step-arrow"></div>
651
  <?php endif; ?>
652
 
653
+ <?php if ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon']['value'] ) ) :
654
  ha_render_icon( $settings, 'icon', 'selected_icon' );
655
  endif; ?>
656