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

Version Description

  • 1 August 2019 =

  • New: On demand asset loading

  • New: On demand cached asset cleaning

  • New: Step Flow Widget

  • New: Calendly Widget

  • New: Flip Box Widget

  • New: Pricing Table Widget

  • Update: Added animated number support to Number Widget

  • Update: Added progress animation to Skill Bars Widget

  • Update: Various widgets default styles

  • Fix: Various responsive 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 1.4.0
Comparing to
See all releases

Code changes from version 1.3.1 to 1.4.0

Files changed (47) hide show
  1. assets/admin/css/admin-bar.css +54 -0
  2. assets/admin/css/dashboard.css +0 -139
  3. assets/admin/css/main.css +27 -0
  4. assets/admin/css/main.min.css +1 -1
  5. assets/admin/js/admin-bar.js +30 -0
  6. assets/css/main.css +1151 -24
  7. assets/css/main.min.css +1 -1
  8. assets/css/widgets/btn.min.css +1 -0
  9. assets/css/widgets/card.min.css +1 -0
  10. assets/css/widgets/common.min.css +1 -0
  11. assets/css/widgets/dual-btn.min.css +1 -0
  12. assets/css/widgets/flip-box.min.css +1 -0
  13. assets/css/widgets/gallery-filter.min.css +1 -0
  14. assets/css/widgets/gradient-heading.min.css +1 -0
  15. assets/css/widgets/hover-box.min.css +1 -0
  16. assets/css/widgets/icon-box.min.css +1 -0
  17. assets/css/widgets/image-comparison.min.css +1 -0
  18. assets/css/widgets/infobox.min.css +1 -0
  19. assets/css/widgets/justified-gallery.min.css +1 -0
  20. assets/css/widgets/logo-grid.min.css +1 -0
  21. assets/css/widgets/member.min.css +1 -0
  22. assets/css/widgets/number.min.css +1 -0
  23. assets/css/widgets/pricing-table.min.css +1 -0
  24. assets/css/widgets/review.min.css +1 -0
  25. assets/css/widgets/skills.min.css +1 -0
  26. assets/css/widgets/slider-carousel.min.css +1 -0
  27. assets/css/widgets/steps-flow.min.css +1 -0
  28. assets/css/widgets/testimonial.min.css +1 -0
  29. assets/js/happy-addons.js +36 -4
  30. assets/js/happy-addons.min.js +1 -1
  31. base.php +13 -1
  32. base/widget-base.php +46 -0
  33. classes/admin-bar.php +100 -0
  34. classes/asset-manager.php +110 -53
  35. classes/class.ondemand-loader.php +246 -0
  36. classes/widget-manager.php +284 -34
  37. inc/functions.php +36 -0
  38. plugin.php +1 -1
  39. readme.txt +19 -2
  40. widgets/calendly/widget.php +180 -0
  41. widgets/flip-box/widget.php +1181 -0
  42. widgets/icon-box/widget.php +3 -1
  43. widgets/justified-gallery/widget.php +1 -1
  44. widgets/number/widget.php +183 -174
  45. widgets/pricing-table/widget.php +967 -0
  46. widgets/skills/widget.php +29 -8
  47. widgets/step-flow/widget.php +598 -0
assets/admin/css/admin-bar.css ADDED
@@ -0,0 +1,54 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ #wpadminbar #wp-admin-bar-happy-addons > .ab-item::before {
2
+ content: "\f328";
3
+ font-family: dashicons;
4
+ top: 3px;
5
+ font-size: 18px;
6
+ }
7
+
8
+ #wp-admin-bar-happy-addons .ab-item .dashicons {
9
+ font-size: 16px;
10
+ display: inline-block;
11
+ font-family: dashicons;
12
+ font-size: inherit;
13
+ font-weight: normal;
14
+ font-style: normal;
15
+ font-variant: normal;
16
+ line-height: 1;
17
+ text-rendering: auto;
18
+ -webkit-font-smoothing: antialiased;
19
+ -moz-osx-font-smoothing: grayscale;
20
+ top: 7px;
21
+ position: relative;
22
+ }
23
+
24
+ #wp-admin-bar-happy-addons .ab-item .dashicons-update-alt:before {
25
+ content: "\f113";
26
+ }
27
+
28
+ #wp-admin-bar-happy-addons .ha-clear-cache--done .ab-item > i {
29
+ color: #46b450;
30
+ }
31
+
32
+ #wp-admin-bar-happy-addons .ha-clear-cache--init .ab-item > i {
33
+ -webkit-animation: ha-inifinite-rotate .5s infinite linear;
34
+ animation: ha-inifinite-rotate .5s infinite linear;
35
+ }
36
+
37
+ @-webkit-keyframes ha-inifinite-rotate {
38
+ from {
39
+ -webkit-transform: rotate(0deg);
40
+ }
41
+ to {
42
+ -webkit-transform: rotate(359deg);
43
+ }
44
+ }
45
+
46
+ @keyframes ha-inifinite-rotate {
47
+ from {
48
+ transform: rotate(0deg);
49
+ }
50
+ to {
51
+ transform: rotate(359deg);
52
+ }
53
+ }
54
+
assets/admin/css/dashboard.css DELETED
@@ -1,139 +0,0 @@
1
- .happy-settings {
2
- padding: 15px;
3
- }
4
- .happy-settings .ha-settings-tab {
5
- background-color: #fff;
6
- position: relative;
7
- padding: 10px 10px 20px 10px;
8
- }
9
- .happy-settings .row {
10
- width: 100%;
11
- height: auto;
12
- display: flex;
13
- flex-flow: row wrap;
14
- justify-content: space-between;
15
- align-content: flex-start;
16
- }
17
- .happy-settings .ha-container {
18
- width: 100%;
19
- height: auto;
20
- }
21
- .happy-settings .ha-container p.ha-elements-control-notice {
22
- margin: 10px 0 15px 10px;
23
- }
24
- .happy-settings #widgets .checkbox-wrapper {
25
- display: flex;
26
- flex-flow: row wrap;
27
- align-items: center;
28
- }
29
- .happy-settings #widgets .ha-checkbox {
30
- display: flex;
31
- flex-direction: row;
32
- flex: 0 0 250px;
33
- align-items: center;
34
- justify-content: space-between;
35
- font-size: 18px;
36
- margin: 10px 40px 10px 10px;
37
- border-radius: 3px;
38
- box-shadow: 1px 1px 6px 1px rgba(80,80,80,0.1);
39
- padding: 15px;
40
- }
41
-
42
- .ha-switch {
43
- position: relative;
44
- display: inline-block;
45
- width: 50px;
46
- height: 30px;
47
- }
48
- .ha-switch input {
49
- opacity: 0;
50
- width: 0;
51
- height: 0;
52
- }
53
-
54
- .ha-slider {
55
- position: absolute;
56
- cursor: pointer;
57
- top: 0;
58
- left: 0;
59
- right: 0;
60
- bottom: 0;
61
- background-color: #ccc;
62
- -webkit-transition: .4s;
63
- transition: .4s;
64
- }
65
-
66
- .ha-slider:before {
67
- content: "";
68
- position: absolute;
69
- height: 23px;
70
- width: 23px;
71
- left: 0px;
72
- bottom: 4px;
73
- background-color: white;
74
- -webkit-transition: .4s;
75
- transition: .4s;
76
- }
77
-
78
- .ha-switch input:checked + .ha-slider {
79
- background-color: #562dd4;
80
- }
81
-
82
- .ha-switch input:focus + .ha-slider {
83
- box-shadow: 0 0 1px #2196F3;
84
- }
85
- .ha-switch input + .ha-slider:before {
86
- -webkit-transform: translateX(4px);
87
- -ms-transform: translateX(4px);
88
- transform: translateX(4px);
89
- }
90
- .ha-switch input:checked + .ha-slider:before {
91
- -webkit-transform: translateX(22px);
92
- -ms-transform: translateX(22px);
93
- transform: translateX(22px);
94
- }
95
-
96
- /* Rounded sliders */
97
- .ha-slider.round {
98
- border-radius: 34px;
99
- }
100
- .ha-slider.round:before {
101
- border-radius: 50%;
102
- }
103
-
104
- /* save button */
105
- .ha-button-wrap {
106
- display: flex;
107
- flex-direction: row;
108
- align-items: center;
109
- justify-content: space-between;
110
- padding: 20px;
111
- margin-top: 20px;
112
- background: #fff;
113
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
114
- }
115
- .brand {
116
- font-size: 22px;
117
- text-transform: capitalize;
118
- color: #fff;
119
- font-weight: 500;
120
- margin: 0px;
121
- background: linear-gradient(90deg, #e2498a 0%, #562dd4 100%);
122
- padding: 10px;
123
- }
124
- button.ha-save-button {
125
- font-size: 16px;
126
- text-transform: capitalize;
127
- padding: 12px 18px;
128
- border-radius: 4px;
129
- border: none;
130
- background-color: #e2498a;
131
- box-shadow: 0 1px 0 #8a0d42;
132
- color: #fff;
133
- transition: background-color .4s, transform .4s;
134
- }
135
- button.ha-save-button:hover {
136
- background-color: #562dd4;
137
- box-shadow: 0 1px 0 #301963;
138
- transition: background-color .4s, transform .4s;
139
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
assets/admin/css/main.css CHANGED
@@ -35,3 +35,30 @@
35
 
36
  -webkit-text-fill-color: initial;
37
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
  -webkit-text-fill-color: initial;
37
  }
38
+
39
+ .elementor-panel .elementor-control-_section_happy_effects .elementor-panel-heading-toggle,
40
+ .elementor-panel .elementor-control-_section_happy_effects .elementor-panel-heading-title {
41
+ color: #562dd4;
42
+ }
43
+
44
+ .elementor-control-ha_floating_fx_translate_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-lower:after,
45
+ .elementor-control-ha_floating_fx_rotate_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-lower:after,
46
+ .elementor-control-ha_floating_fx_scale_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-lower:after {
47
+ left: -5px;
48
+ box-shadow: -2px 2px 3px 0 rgba(0, 0, 0, .1);
49
+ }
50
+
51
+ .elementor-control-ha_floating_fx_translate_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper:after,
52
+ .elementor-control-ha_floating_fx_rotate_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper:after,
53
+ .elementor-control-ha_floating_fx_scale_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper:after {
54
+ left: 5px;
55
+ box-shadow: 2px -2px 3px 0 rgba(0, 0, 0, .1);
56
+ }
57
+
58
+ .elementor-control-ha_floating_fx_translate_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper .noUi-tooltip,
59
+ .elementor-control-ha_floating_fx_rotate_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper .noUi-tooltip,
60
+ .elementor-control-ha_floating_fx_scale_toggle + .elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper .noUi-tooltip {
61
+ top: auto;
62
+ bottom: calc(100% + 5px);
63
+ left: 100%;
64
+ }
assets/admin/css/main.min.css CHANGED
@@ -1 +1 @@
1
- .elementor-panel #elementor-panel-category-happy_addons_category .elementor-element,.elementor-panel #elementor-panel-elements .happy-addons-addon{-webkit-transition:background-image .3s;transition:background-image .3s}.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element .icon,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element .title,.elementor-panel #elementor-panel-elements .happy-addons-addon .icon,.elementor-panel #elementor-panel-elements .happy-addons-addon .title{background-image:-webkit-linear-gradient(315deg,#e2498a 25%,#562dd4 100%);background-image:linear-gradient(135deg,#e2498a 25%,#562dd4 100%);-webkit-background-clip:text;-webkit-transition:background-image .2s,color .2s;transition:background-image .2s,color .2s;-webkit-text-fill-color:transparent}.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:focus,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:hover,.elementor-panel #elementor-panel-elements .happy-addons-addon:focus,.elementor-panel #elementor-panel-elements .happy-addons-addon:hover{background-image:-webkit-linear-gradient(315deg,#e2498a 0%,#562dd4 100%);background-image:linear-gradient(135deg,#e2498a 0%,#562dd4 100%)}.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:focus .icon,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:focus .title,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:hover .icon,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:hover .title,.elementor-panel #elementor-panel-elements .happy-addons-addon:focus .icon,.elementor-panel #elementor-panel-elements .happy-addons-addon:focus .title,.elementor-panel #elementor-panel-elements .happy-addons-addon:hover .icon,.elementor-panel #elementor-panel-elements .happy-addons-addon:hover .title{background:0 0;color:#fff;-webkit-text-fill-color:initial}
1
+ .elementor-panel #elementor-panel-category-happy_addons_category .elementor-element,.elementor-panel #elementor-panel-elements .happy-addons-addon{-webkit-transition:background-image .3s;transition:background-image .3s}.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element .icon,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element .title,.elementor-panel #elementor-panel-elements .happy-addons-addon .icon,.elementor-panel #elementor-panel-elements .happy-addons-addon .title{background-image:-webkit-linear-gradient(315deg,#e2498a 25%,#562dd4 100%);background-image:linear-gradient(135deg,#e2498a 25%,#562dd4 100%);-webkit-background-clip:text;-webkit-transition:background-image .2s,color .2s;transition:background-image .2s,color .2s;-webkit-text-fill-color:transparent}.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:focus,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:hover,.elementor-panel #elementor-panel-elements .happy-addons-addon:focus,.elementor-panel #elementor-panel-elements .happy-addons-addon:hover{background-image:-webkit-linear-gradient(315deg,#e2498a 0%,#562dd4 100%);background-image:linear-gradient(135deg,#e2498a 0%,#562dd4 100%)}.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:focus .icon,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:focus .title,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:hover .icon,.elementor-panel #elementor-panel-category-happy_addons_category .elementor-element:hover .title,.elementor-panel #elementor-panel-elements .happy-addons-addon:focus .icon,.elementor-panel #elementor-panel-elements .happy-addons-addon:focus .title,.elementor-panel #elementor-panel-elements .happy-addons-addon:hover .icon,.elementor-panel #elementor-panel-elements .happy-addons-addon:hover .title{background:0 0;color:#fff;-webkit-text-fill-color:initial}.elementor-panel .elementor-control-_section_happy_effects .elementor-panel-heading-title,.elementor-panel .elementor-control-_section_happy_effects .elementor-panel-heading-toggle{color:#562dd4}.elementor-control-ha_floating_fx_rotate_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-lower:after,.elementor-control-ha_floating_fx_scale_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-lower:after,.elementor-control-ha_floating_fx_translate_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-lower:after{left:-5px;box-shadow:-2px 2px 3px 0 rgba(0,0,0,.1)}.elementor-control-ha_floating_fx_rotate_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper:after,.elementor-control-ha_floating_fx_scale_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper:after,.elementor-control-ha_floating_fx_translate_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper:after{left:5px;box-shadow:2px -2px 3px 0 rgba(0,0,0,.1)}.elementor-control-ha_floating_fx_rotate_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper .noUi-tooltip,.elementor-control-ha_floating_fx_scale_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper .noUi-tooltip,.elementor-control-ha_floating_fx_translate_toggle+.elementor-controls-popover .elementor-control-type-slider--handles-range .elementor-slider .noUi-handle-upper .noUi-tooltip{top:auto;bottom:calc(100% + 5px);left:100%}
assets/admin/js/admin-bar.js ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ ;(function($) {
2
+ $(function() {
3
+ var $clearCache = $('.hajs-clear-cache ');
4
+
5
+ $clearCache.on('click', 'a', function(e) {
6
+ e.preventDefault();
7
+
8
+ var type = 'all',
9
+ $m = $(e.delegateTarget);
10
+
11
+ if ($m.hasClass('ha-clear-page-cache')) {
12
+ type = 'page';
13
+ }
14
+
15
+ $m.addClass('ha-clear-cache--init');
16
+
17
+ $.post(
18
+ HappyAdmin.ajax_url,
19
+ {
20
+ action: 'ha_clear_cache',
21
+ type: type,
22
+ nonce: HappyAdmin.nonce,
23
+ post_id: HappyAdmin.post_id
24
+ }
25
+ ).done(function(res) {
26
+ $m.removeClass('ha-clear-cache--init').addClass('ha-clear-cache--done');
27
+ });
28
+ });
29
+ })
30
+ }(jQuery));
assets/css/main.css CHANGED
@@ -3,7 +3,8 @@
3
  .ha-icon-box > .elementor-widget-container,
4
  .ha-member > .elementor-widget-container,
5
  .ha-review > .elementor-widget-container,
6
- .ha-image-compare > .elementor-widget-container {
 
7
  border-radius: .5rem;
8
  background-color: #fff;
9
  box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
@@ -12,6 +13,41 @@
12
  overflow-wrap: break-word;
13
  }
14
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15
  .happy-addon {
16
  box-sizing: border-box;
17
  }
@@ -29,15 +65,27 @@
29
  display: none;
30
  }
31
 
32
- .ha-cf:before,
 
 
 
 
 
 
 
 
 
 
 
 
 
 
33
  .ha-logo-grid-wrapper:before,
34
- .ha-cf:after,
35
  .ha-logo-grid-wrapper:after {
36
  display: table;
37
  content: " ";
38
  }
39
 
40
- .ha-cf:after,
41
  .ha-logo-grid-wrapper:after {
42
  clear: both;
43
  }
@@ -78,6 +126,31 @@
78
  margin-left: 5px;
79
  }
80
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
81
  .ha-card-figure {
82
  position: relative;
83
  height: 250px;
@@ -233,6 +306,31 @@
233
  bottom: 1rem;
234
  }
235
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
  .ha-infobox > .elementor-widget-container {
237
  padding: 1.5rem;
238
  }
@@ -280,6 +378,31 @@
280
  margin-bottom: 0;
281
  }
282
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
283
  .ha-icon-box > .elementor-widget-container {
284
  position: relative;
285
  padding: 1.25rem;
@@ -336,6 +459,31 @@
336
  color: #fff;
337
  }
338
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
339
  .ha-member > .elementor-widget-container {
340
  padding: 1.25rem;
341
  }
@@ -389,6 +537,31 @@
389
  margin-right: .3rem;
390
  }
391
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
392
  .ha-review-header {
393
  margin-top: 1.5rem;
394
  }
@@ -531,11 +704,61 @@ span .ha-review-ratting--star:before,
531
  text-align: right;
532
  }
533
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
534
  .ha-image-compare .twentytwenty-container,
535
  .ha-image-compare .twentytwenty-wrapper {
536
  border-radius: inherit;
537
  }
538
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
539
  .ha-gallery-filter {
540
  margin: 0 10px 2rem;
541
  padding: 0;
@@ -572,12 +795,37 @@ span .ha-review-ratting--star:before,
572
  color: #fff;
573
  }
574
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
575
  .ha-justified-gallery-item,
576
  .ha-justified-gallery-item > img {
577
  border-radius: 6px;
578
  }
579
 
580
- .justified-gallery > .ha-justified-gallery-item > .caption {
581
  bottom: -100px !important;
582
  padding: 10px;
583
  -webkit-transition: all .25s !important;
@@ -586,12 +834,12 @@ span .ha-review-ratting--star:before,
586
  animation: haSmoothReveal .3s forwards;
587
  }
588
 
589
- .justified-gallery > .ha-justified-gallery-item > .caption.caption-visible {
590
  bottom: 0 !important;
591
  }
592
 
593
- .justified-gallery > .entry-visible > img,
594
- .justified-gallery > .entry-visible > a > img {
595
  -webkit-transition: all 300ms, opacity 500ms ease-in;
596
  transition: all 300ms, opacity 500ms ease-in;
597
  }
@@ -618,6 +866,31 @@ span .ha-review-ratting--star:before,
618
  }
619
  }
620
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
621
  .ha-slider .slick-vertical .slick-slide,
622
  .ha-carousel .slick-vertical .slick-slide {
623
  border: 0;
@@ -749,16 +1022,42 @@ span .ha-review-ratting--star:before,
749
  color: #fff;
750
  }
751
 
752
- .ha-skills > .elementor-widget-container {
753
- padding-top: 1px;
754
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
755
 
756
  .ha-skill {
757
  display: -webkit-box;
758
  display: -webkit-flex;
759
  display: -ms-flexbox;
760
  display: flex;
761
- background-color: #e9ecef;
 
762
  font-size: .75rem;
763
  }
764
  .ha-skill--outside .ha-skill-info,
@@ -783,9 +1082,7 @@ span .ha-review-ratting--star:before,
783
  color: #242424;
784
  }
785
  .ha-skill--inside {
786
- overflow: hidden;
787
  height: 30px;
788
- border-radius: .3rem;
789
  }
790
  .ha-skill--inside .ha-skill-info {
791
  padding-right: 1rem;
@@ -806,7 +1103,9 @@ span .ha-review-ratting--star:before,
806
  -ms-flex-pack: center;
807
  -webkit-justify-content: center;
808
  justify-content: center;
809
- background-color: #007bff;
 
 
810
  color: #fff;
811
  text-align: center;
812
  white-space: nowrap;
@@ -820,6 +1119,31 @@ span .ha-review-ratting--star:before,
820
  margin-top: 20px;
821
  }
822
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
823
  .ha-gradient-heading {
824
  margin-top: 0;
825
  margin-bottom: 0;
@@ -829,6 +1153,31 @@ span .ha-review-ratting--star:before,
829
  text-decoration: none;
830
  }
831
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
832
  .ha-logo-grid-item {
833
  float: left;
834
  overflow: hidden;
@@ -1282,6 +1631,31 @@ span .ha-review-ratting--star:before,
1282
  }
1283
  }
1284
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1285
  .ha-dual-button > .elementor-widget-container {
1286
  display: -webkit-box;
1287
  display: -webkit-flex;
@@ -1354,6 +1728,31 @@ span .ha-review-ratting--star:before,
1354
  margin-left: 5px;
1355
  }
1356
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1357
  .ha-testimonial--basic > .elementor-widget-container {
1358
  padding: 2rem;
1359
  border: 1px solid #ececec;
@@ -1476,39 +1875,767 @@ span .ha-review-ratting--star:before,
1476
  text-align: center;
1477
  }
1478
 
1479
- .ha-number-body .ha-number-border {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1480
  position: relative;
1481
- display: -webkit-flex;
1482
- /* Safari 7.0+ */
1483
  display: -webkit-box;
 
1484
  display: -ms-flexbox;
1485
  display: flex;
1486
  overflow: hidden;
1487
  -webkit-box-align: center;
1488
- /* Safari */
1489
  -webkit-align-items: center;
1490
  align-items: center;
1491
  -ms-flex-align: center;
1492
- padding: 6px 6px 6px 6px;
1493
  width: 50px;
1494
  height: 50px;
1495
  border-radius: 100%;
1496
- background: #c36;
1497
  color: #fff;
1498
  text-align: center;
1499
  font-size: 20px;
1500
  }
1501
- .ha-number-body .ha-number-border .ha-number-border-overlay {
 
1502
  position: absolute;
1503
  top: 0;
1504
  left: 0;
1505
  width: 100%;
1506
  height: 100%;
1507
  }
1508
- .ha-number-body .ha-number-border span {
1509
- /* Safari 6.1+ */
 
 
1510
  -webkit-box-flex: 1;
1511
  -webkit-flex: 1;
1512
  -ms-flex: 1;
1513
  flex: 1;
1514
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
  .ha-icon-box > .elementor-widget-container,
4
  .ha-member > .elementor-widget-container,
5
  .ha-review > .elementor-widget-container,
6
+ .ha-image-compare > .elementor-widget-container,
7
+ .ha-pricing-table > .elementor-widget-container {
8
  border-radius: .5rem;
9
  background-color: #fff;
10
  box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
13
  overflow-wrap: break-word;
14
  }
15
 
16
+ .ha-logo-grid-wrapper:before,
17
+ .ha-logo-grid-wrapper:after {
18
+ display: table;
19
+ content: " ";
20
+ }
21
+
22
+ .ha-logo-grid-wrapper:after {
23
+ clear: both;
24
+ }
25
+
26
+ .ha-card > .elementor-widget-container,
27
+ .ha-infobox > .elementor-widget-container,
28
+ .ha-icon-box > .elementor-widget-container,
29
+ .ha-member > .elementor-widget-container,
30
+ .ha-review > .elementor-widget-container,
31
+ .ha-image-compare > .elementor-widget-container,
32
+ .ha-pricing-table > .elementor-widget-container {
33
+ border-radius: .5rem;
34
+ background-color: #fff;
35
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
36
+ word-wrap: break-word;
37
+
38
+ overflow-wrap: break-word;
39
+ }
40
+
41
+ .ha-logo-grid-wrapper:before,
42
+ .ha-logo-grid-wrapper:after {
43
+ display: table;
44
+ content: " ";
45
+ }
46
+
47
+ .ha-logo-grid-wrapper:after {
48
+ clear: both;
49
+ }
50
+
51
  .happy-addon {
52
  box-sizing: border-box;
53
  }
65
  display: none;
66
  }
67
 
68
+ .ha-card > .elementor-widget-container,
69
+ .ha-infobox > .elementor-widget-container,
70
+ .ha-icon-box > .elementor-widget-container,
71
+ .ha-member > .elementor-widget-container,
72
+ .ha-review > .elementor-widget-container,
73
+ .ha-image-compare > .elementor-widget-container,
74
+ .ha-pricing-table > .elementor-widget-container {
75
+ border-radius: .5rem;
76
+ background-color: #fff;
77
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
78
+ word-wrap: break-word;
79
+
80
+ overflow-wrap: break-word;
81
+ }
82
+
83
  .ha-logo-grid-wrapper:before,
 
84
  .ha-logo-grid-wrapper:after {
85
  display: table;
86
  content: " ";
87
  }
88
 
 
89
  .ha-logo-grid-wrapper:after {
90
  clear: both;
91
  }
126
  margin-left: 5px;
127
  }
128
 
129
+ .ha-card > .elementor-widget-container,
130
+ .ha-infobox > .elementor-widget-container,
131
+ .ha-icon-box > .elementor-widget-container,
132
+ .ha-member > .elementor-widget-container,
133
+ .ha-review > .elementor-widget-container,
134
+ .ha-image-compare > .elementor-widget-container,
135
+ .ha-pricing-table > .elementor-widget-container {
136
+ border-radius: .5rem;
137
+ background-color: #fff;
138
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
139
+ word-wrap: break-word;
140
+
141
+ overflow-wrap: break-word;
142
+ }
143
+
144
+ .ha-logo-grid-wrapper:before,
145
+ .ha-logo-grid-wrapper:after {
146
+ display: table;
147
+ content: " ";
148
+ }
149
+
150
+ .ha-logo-grid-wrapper:after {
151
+ clear: both;
152
+ }
153
+
154
  .ha-card-figure {
155
  position: relative;
156
  height: 250px;
306
  bottom: 1rem;
307
  }
308
 
309
+ .ha-card > .elementor-widget-container,
310
+ .ha-infobox > .elementor-widget-container,
311
+ .ha-icon-box > .elementor-widget-container,
312
+ .ha-member > .elementor-widget-container,
313
+ .ha-review > .elementor-widget-container,
314
+ .ha-image-compare > .elementor-widget-container,
315
+ .ha-pricing-table > .elementor-widget-container {
316
+ border-radius: .5rem;
317
+ background-color: #fff;
318
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
319
+ word-wrap: break-word;
320
+
321
+ overflow-wrap: break-word;
322
+ }
323
+
324
+ .ha-logo-grid-wrapper:before,
325
+ .ha-logo-grid-wrapper:after {
326
+ display: table;
327
+ content: " ";
328
+ }
329
+
330
+ .ha-logo-grid-wrapper:after {
331
+ clear: both;
332
+ }
333
+
334
  .ha-infobox > .elementor-widget-container {
335
  padding: 1.5rem;
336
  }
378
  margin-bottom: 0;
379
  }
380
 
381
+ .ha-card > .elementor-widget-container,
382
+ .ha-infobox > .elementor-widget-container,
383
+ .ha-icon-box > .elementor-widget-container,
384
+ .ha-member > .elementor-widget-container,
385
+ .ha-review > .elementor-widget-container,
386
+ .ha-image-compare > .elementor-widget-container,
387
+ .ha-pricing-table > .elementor-widget-container {
388
+ border-radius: .5rem;
389
+ background-color: #fff;
390
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
391
+ word-wrap: break-word;
392
+
393
+ overflow-wrap: break-word;
394
+ }
395
+
396
+ .ha-logo-grid-wrapper:before,
397
+ .ha-logo-grid-wrapper:after {
398
+ display: table;
399
+ content: " ";
400
+ }
401
+
402
+ .ha-logo-grid-wrapper:after {
403
+ clear: both;
404
+ }
405
+
406
  .ha-icon-box > .elementor-widget-container {
407
  position: relative;
408
  padding: 1.25rem;
459
  color: #fff;
460
  }
461
 
462
+ .ha-card > .elementor-widget-container,
463
+ .ha-infobox > .elementor-widget-container,
464
+ .ha-icon-box > .elementor-widget-container,
465
+ .ha-member > .elementor-widget-container,
466
+ .ha-review > .elementor-widget-container,
467
+ .ha-image-compare > .elementor-widget-container,
468
+ .ha-pricing-table > .elementor-widget-container {
469
+ border-radius: .5rem;
470
+ background-color: #fff;
471
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
472
+ word-wrap: break-word;
473
+
474
+ overflow-wrap: break-word;
475
+ }
476
+
477
+ .ha-logo-grid-wrapper:before,
478
+ .ha-logo-grid-wrapper:after {
479
+ display: table;
480
+ content: " ";
481
+ }
482
+
483
+ .ha-logo-grid-wrapper:after {
484
+ clear: both;
485
+ }
486
+
487
  .ha-member > .elementor-widget-container {
488
  padding: 1.25rem;
489
  }
537
  margin-right: .3rem;
538
  }
539
 
540
+ .ha-card > .elementor-widget-container,
541
+ .ha-infobox > .elementor-widget-container,
542
+ .ha-icon-box > .elementor-widget-container,
543
+ .ha-member > .elementor-widget-container,
544
+ .ha-review > .elementor-widget-container,
545
+ .ha-image-compare > .elementor-widget-container,
546
+ .ha-pricing-table > .elementor-widget-container {
547
+ border-radius: .5rem;
548
+ background-color: #fff;
549
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
550
+ word-wrap: break-word;
551
+
552
+ overflow-wrap: break-word;
553
+ }
554
+
555
+ .ha-logo-grid-wrapper:before,
556
+ .ha-logo-grid-wrapper:after {
557
+ display: table;
558
+ content: " ";
559
+ }
560
+
561
+ .ha-logo-grid-wrapper:after {
562
+ clear: both;
563
+ }
564
+
565
  .ha-review-header {
566
  margin-top: 1.5rem;
567
  }
704
  text-align: right;
705
  }
706
 
707
+ .ha-card > .elementor-widget-container,
708
+ .ha-infobox > .elementor-widget-container,
709
+ .ha-icon-box > .elementor-widget-container,
710
+ .ha-member > .elementor-widget-container,
711
+ .ha-review > .elementor-widget-container,
712
+ .ha-image-compare > .elementor-widget-container,
713
+ .ha-pricing-table > .elementor-widget-container {
714
+ border-radius: .5rem;
715
+ background-color: #fff;
716
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
717
+ word-wrap: break-word;
718
+
719
+ overflow-wrap: break-word;
720
+ }
721
+
722
+ .ha-logo-grid-wrapper:before,
723
+ .ha-logo-grid-wrapper:after {
724
+ display: table;
725
+ content: " ";
726
+ }
727
+
728
+ .ha-logo-grid-wrapper:after {
729
+ clear: both;
730
+ }
731
+
732
  .ha-image-compare .twentytwenty-container,
733
  .ha-image-compare .twentytwenty-wrapper {
734
  border-radius: inherit;
735
  }
736
 
737
+ .ha-card > .elementor-widget-container,
738
+ .ha-infobox > .elementor-widget-container,
739
+ .ha-icon-box > .elementor-widget-container,
740
+ .ha-member > .elementor-widget-container,
741
+ .ha-review > .elementor-widget-container,
742
+ .ha-image-compare > .elementor-widget-container,
743
+ .ha-pricing-table > .elementor-widget-container {
744
+ border-radius: .5rem;
745
+ background-color: #fff;
746
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
747
+ word-wrap: break-word;
748
+
749
+ overflow-wrap: break-word;
750
+ }
751
+
752
+ .ha-logo-grid-wrapper:before,
753
+ .ha-logo-grid-wrapper:after {
754
+ display: table;
755
+ content: " ";
756
+ }
757
+
758
+ .ha-logo-grid-wrapper:after {
759
+ clear: both;
760
+ }
761
+
762
  .ha-gallery-filter {
763
  margin: 0 10px 2rem;
764
  padding: 0;
795
  color: #fff;
796
  }
797
 
798
+ .ha-card > .elementor-widget-container,
799
+ .ha-infobox > .elementor-widget-container,
800
+ .ha-icon-box > .elementor-widget-container,
801
+ .ha-member > .elementor-widget-container,
802
+ .ha-review > .elementor-widget-container,
803
+ .ha-image-compare > .elementor-widget-container,
804
+ .ha-pricing-table > .elementor-widget-container {
805
+ border-radius: .5rem;
806
+ background-color: #fff;
807
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
808
+ word-wrap: break-word;
809
+
810
+ overflow-wrap: break-word;
811
+ }
812
+
813
+ .ha-logo-grid-wrapper:before,
814
+ .ha-logo-grid-wrapper:after {
815
+ display: table;
816
+ content: " ";
817
+ }
818
+
819
+ .ha-logo-grid-wrapper:after {
820
+ clear: both;
821
+ }
822
+
823
  .ha-justified-gallery-item,
824
  .ha-justified-gallery-item > img {
825
  border-radius: 6px;
826
  }
827
 
828
+ .ha-justified-gallery .justified-gallery > .ha-justified-gallery-item > .caption {
829
  bottom: -100px !important;
830
  padding: 10px;
831
  -webkit-transition: all .25s !important;
834
  animation: haSmoothReveal .3s forwards;
835
  }
836
 
837
+ .ha-justified-gallery .justified-gallery > .ha-justified-gallery-item > .caption.caption-visible {
838
  bottom: 0 !important;
839
  }
840
 
841
+ .ha-justified-gallery .justified-gallery > .entry-visible > img,
842
+ .ha-justified-gallery .justified-gallery > .entry-visible > a > img {
843
  -webkit-transition: all 300ms, opacity 500ms ease-in;
844
  transition: all 300ms, opacity 500ms ease-in;
845
  }
866
  }
867
  }
868
 
869
+ .ha-card > .elementor-widget-container,
870
+ .ha-infobox > .elementor-widget-container,
871
+ .ha-icon-box > .elementor-widget-container,
872
+ .ha-member > .elementor-widget-container,
873
+ .ha-review > .elementor-widget-container,
874
+ .ha-image-compare > .elementor-widget-container,
875
+ .ha-pricing-table > .elementor-widget-container {
876
+ border-radius: .5rem;
877
+ background-color: #fff;
878
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
879
+ word-wrap: break-word;
880
+
881
+ overflow-wrap: break-word;
882
+ }
883
+
884
+ .ha-logo-grid-wrapper:before,
885
+ .ha-logo-grid-wrapper:after {
886
+ display: table;
887
+ content: " ";
888
+ }
889
+
890
+ .ha-logo-grid-wrapper:after {
891
+ clear: both;
892
+ }
893
+
894
  .ha-slider .slick-vertical .slick-slide,
895
  .ha-carousel .slick-vertical .slick-slide {
896
  border: 0;
1022
  color: #fff;
1023
  }
1024
 
1025
+ .ha-card > .elementor-widget-container,
1026
+ .ha-infobox > .elementor-widget-container,
1027
+ .ha-icon-box > .elementor-widget-container,
1028
+ .ha-member > .elementor-widget-container,
1029
+ .ha-review > .elementor-widget-container,
1030
+ .ha-image-compare > .elementor-widget-container,
1031
+ .ha-pricing-table > .elementor-widget-container {
1032
+ border-radius: .5rem;
1033
+ background-color: #fff;
1034
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
1035
+ word-wrap: break-word;
1036
+
1037
+ overflow-wrap: break-word;
1038
+ }
1039
+
1040
+ .ha-logo-grid-wrapper:before,
1041
+ .ha-logo-grid-wrapper:after {
1042
+ display: table;
1043
+ content: " ";
1044
+ }
1045
+
1046
+ .ha-logo-grid-wrapper:after {
1047
+ clear: both;
1048
+ }
1049
+
1050
+ .ha-skills > .elementor-widget-container {
1051
+ padding-top: 1px;
1052
+ }
1053
 
1054
  .ha-skill {
1055
  display: -webkit-box;
1056
  display: -webkit-flex;
1057
  display: -ms-flexbox;
1058
  display: flex;
1059
+ border-radius: 15px;
1060
+ background-color: #e9ecef;
1061
  font-size: .75rem;
1062
  }
1063
  .ha-skill--outside .ha-skill-info,
1082
  color: #242424;
1083
  }
1084
  .ha-skill--inside {
 
1085
  height: 30px;
 
1086
  }
1087
  .ha-skill--inside .ha-skill-info {
1088
  padding-right: 1rem;
1103
  -ms-flex-pack: center;
1104
  -webkit-justify-content: center;
1105
  justify-content: center;
1106
+ width: 10%;
1107
+ border-radius: inherit;
1108
+ background-color: #562dd4;
1109
  color: #fff;
1110
  text-align: center;
1111
  white-space: nowrap;
1119
  margin-top: 20px;
1120
  }
1121
 
1122
+ .ha-card > .elementor-widget-container,
1123
+ .ha-infobox > .elementor-widget-container,
1124
+ .ha-icon-box > .elementor-widget-container,
1125
+ .ha-member > .elementor-widget-container,
1126
+ .ha-review > .elementor-widget-container,
1127
+ .ha-image-compare > .elementor-widget-container,
1128
+ .ha-pricing-table > .elementor-widget-container {
1129
+ border-radius: .5rem;
1130
+ background-color: #fff;
1131
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
1132
+ word-wrap: break-word;
1133
+
1134
+ overflow-wrap: break-word;
1135
+ }
1136
+
1137
+ .ha-logo-grid-wrapper:before,
1138
+ .ha-logo-grid-wrapper:after {
1139
+ display: table;
1140
+ content: " ";
1141
+ }
1142
+
1143
+ .ha-logo-grid-wrapper:after {
1144
+ clear: both;
1145
+ }
1146
+
1147
  .ha-gradient-heading {
1148
  margin-top: 0;
1149
  margin-bottom: 0;
1153
  text-decoration: none;
1154
  }
1155
 
1156
+ .ha-card > .elementor-widget-container,
1157
+ .ha-infobox > .elementor-widget-container,
1158
+ .ha-icon-box > .elementor-widget-container,
1159
+ .ha-member > .elementor-widget-container,
1160
+ .ha-review > .elementor-widget-container,
1161
+ .ha-image-compare > .elementor-widget-container,
1162
+ .ha-pricing-table > .elementor-widget-container {
1163
+ border-radius: .5rem;
1164
+ background-color: #fff;
1165
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
1166
+ word-wrap: break-word;
1167
+
1168
+ overflow-wrap: break-word;
1169
+ }
1170
+
1171
+ .ha-logo-grid-wrapper:before,
1172
+ .ha-logo-grid-wrapper:after {
1173
+ display: table;
1174
+ content: " ";
1175
+ }
1176
+
1177
+ .ha-logo-grid-wrapper:after {
1178
+ clear: both;
1179
+ }
1180
+
1181
  .ha-logo-grid-item {
1182
  float: left;
1183
  overflow: hidden;
1631
  }
1632
  }
1633
 
1634
+ .ha-card > .elementor-widget-container,
1635
+ .ha-infobox > .elementor-widget-container,
1636
+ .ha-icon-box > .elementor-widget-container,
1637
+ .ha-member > .elementor-widget-container,
1638
+ .ha-review > .elementor-widget-container,
1639
+ .ha-image-compare > .elementor-widget-container,
1640
+ .ha-pricing-table > .elementor-widget-container {
1641
+ border-radius: .5rem;
1642
+ background-color: #fff;
1643
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
1644
+ word-wrap: break-word;
1645
+
1646
+ overflow-wrap: break-word;
1647
+ }
1648
+
1649
+ .ha-logo-grid-wrapper:before,
1650
+ .ha-logo-grid-wrapper:after {
1651
+ display: table;
1652
+ content: " ";
1653
+ }
1654
+
1655
+ .ha-logo-grid-wrapper:after {
1656
+ clear: both;
1657
+ }
1658
+
1659
  .ha-dual-button > .elementor-widget-container {
1660
  display: -webkit-box;
1661
  display: -webkit-flex;
1728
  margin-left: 5px;
1729
  }
1730
 
1731
+ .ha-card > .elementor-widget-container,
1732
+ .ha-infobox > .elementor-widget-container,
1733
+ .ha-icon-box > .elementor-widget-container,
1734
+ .ha-member > .elementor-widget-container,
1735
+ .ha-review > .elementor-widget-container,
1736
+ .ha-image-compare > .elementor-widget-container,
1737
+ .ha-pricing-table > .elementor-widget-container {
1738
+ border-radius: .5rem;
1739
+ background-color: #fff;
1740
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
1741
+ word-wrap: break-word;
1742
+
1743
+ overflow-wrap: break-word;
1744
+ }
1745
+
1746
+ .ha-logo-grid-wrapper:before,
1747
+ .ha-logo-grid-wrapper:after {
1748
+ display: table;
1749
+ content: " ";
1750
+ }
1751
+
1752
+ .ha-logo-grid-wrapper:after {
1753
+ clear: both;
1754
+ }
1755
+
1756
  .ha-testimonial--basic > .elementor-widget-container {
1757
  padding: 2rem;
1758
  border: 1px solid #ececec;
1875
  text-align: center;
1876
  }
1877
 
1878
+ .ha-card > .elementor-widget-container,
1879
+ .ha-infobox > .elementor-widget-container,
1880
+ .ha-icon-box > .elementor-widget-container,
1881
+ .ha-member > .elementor-widget-container,
1882
+ .ha-review > .elementor-widget-container,
1883
+ .ha-image-compare > .elementor-widget-container,
1884
+ .ha-pricing-table > .elementor-widget-container {
1885
+ border-radius: .5rem;
1886
+ background-color: #fff;
1887
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
1888
+ word-wrap: break-word;
1889
+
1890
+ overflow-wrap: break-word;
1891
+ }
1892
+
1893
+ .ha-logo-grid-wrapper:before,
1894
+ .ha-logo-grid-wrapper:after {
1895
+ display: table;
1896
+ content: " ";
1897
+ }
1898
+
1899
+ .ha-logo-grid-wrapper:after {
1900
+ clear: both;
1901
+ }
1902
+
1903
+ .ha-number-body {
1904
  position: relative;
 
 
1905
  display: -webkit-box;
1906
+ display: -webkit-flex;
1907
  display: -ms-flexbox;
1908
  display: flex;
1909
  overflow: hidden;
1910
  -webkit-box-align: center;
 
1911
  -webkit-align-items: center;
1912
  align-items: center;
1913
  -ms-flex-align: center;
1914
+ padding: 6px;
1915
  width: 50px;
1916
  height: 50px;
1917
  border-radius: 100%;
1918
+ background-color: #562dd4;
1919
  color: #fff;
1920
  text-align: center;
1921
  font-size: 20px;
1922
  }
1923
+
1924
+ .ha-number-overlay {
1925
  position: absolute;
1926
  top: 0;
1927
  left: 0;
1928
  width: 100%;
1929
  height: 100%;
1930
  }
1931
+
1932
+ .ha-number-text {
1933
+ position: relative;
1934
+ z-index: 1;
1935
  -webkit-box-flex: 1;
1936
  -webkit-flex: 1;
1937
  -ms-flex: 1;
1938
  flex: 1;
1939
  }
1940
+
1941
+ .ha-card > .elementor-widget-container,
1942
+ .ha-infobox > .elementor-widget-container,
1943
+ .ha-icon-box > .elementor-widget-container,
1944
+ .ha-member > .elementor-widget-container,
1945
+ .ha-review > .elementor-widget-container,
1946
+ .ha-image-compare > .elementor-widget-container,
1947
+ .ha-pricing-table > .elementor-widget-container {
1948
+ border-radius: .5rem;
1949
+ background-color: #fff;
1950
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
1951
+ word-wrap: break-word;
1952
+
1953
+ overflow-wrap: break-word;
1954
+ }
1955
+
1956
+ .ha-logo-grid-wrapper:before,
1957
+ .ha-logo-grid-wrapper:after {
1958
+ display: table;
1959
+ content: " ";
1960
+ }
1961
+
1962
+ .ha-logo-grid-wrapper:after {
1963
+ clear: both;
1964
+ }
1965
+
1966
+ .ha-hover-box {
1967
+ overflow: hidden;
1968
+ }
1969
+ .ha-hover-box .ha-hover-box-main {
1970
+ position: relative;
1971
+ overflow: hidden;
1972
+ }
1973
+
1974
+ .ha-hover-box-wrapper {
1975
+ position: relative;
1976
+ display: -webkit-box;
1977
+ display: -webkit-flex;
1978
+ display: -ms-flexbox;
1979
+ display: flex;
1980
+ overflow: hidden;
1981
+ -webkit-box-align: center;
1982
+ -webkit-align-items: center;
1983
+ align-items: center;
1984
+ -ms-flex-align: center;
1985
+ padding: 50px;
1986
+ max-height: 100%;
1987
+ width: 100%;
1988
+ height: 400px;
1989
+ -webkit-transition-duration: .4s;
1990
+ transition-duration: .4s;
1991
+ }
1992
+ .ha-hover-box-wrapper:before {
1993
+ position: absolute;
1994
+ top: 0;
1995
+ left: 0;
1996
+ z-index: 1;
1997
+ width: 100%;
1998
+ height: 100%;
1999
+ content: "";
2000
+ }
2001
+ .ha-hover-box-wrapper:hover {
2002
+ -webkit-transition-duration: .3s;
2003
+ transition-duration: .3s;
2004
+ -webkit-transform: scale(1.06);
2005
+ -ms-transform: scale(1.06);
2006
+ transform: scale(1.06);
2007
+ }
2008
+ .ha-hover-box-wrapper:hover .ha-hover-box-content {
2009
+ opacity: 0;
2010
+ -webkit-transition-delay: 0ms;
2011
+ transition-delay: 0ms;
2012
+ -webkit-transition-timing-function: cubic-bezier(.57, .21, .69, 1);
2013
+ transition-timing-function: cubic-bezier(.57, .21, .69, 1);
2014
+ -webkit-transition-duration: .1s;
2015
+ transition-duration: .1s;
2016
+ -webkit-transition-property: opacity,-webkit-transform;
2017
+ transition-property: opacity,-webkit-transform;
2018
+ transition-property: transform,opacity;
2019
+ transition-property: transform,opacity,-webkit-transform;
2020
+ -webkit-transform: translate(0, 36px);
2021
+ -ms-transform: translate(0, 36px);
2022
+ transform: translate(0, 36px);
2023
+ }
2024
+ .ha-hover-box-wrapper .ha-hover-box-content {
2025
+ position: relative;
2026
+ z-index: 99;
2027
+ display: -webkit-box;
2028
+ display: -webkit-flex;
2029
+ display: -ms-flexbox;
2030
+ display: flex;
2031
+ -webkit-box-orient: vertical;
2032
+ -webkit-box-direction: normal;
2033
+ -webkit-flex-direction: column;
2034
+ -ms-flex-direction: column;
2035
+ flex-direction: column;
2036
+ width: 100%;
2037
+ text-align: left;
2038
+ opacity: 1;
2039
+ -webkit-transition: opacity .2s ease-in-out,-webkit-transform .2s ease-in-out;
2040
+ transition: opacity .2s ease-in-out,-webkit-transform .2s ease-in-out;
2041
+ transition: opacity .2s ease-in-out,transform .2s ease-in-out;
2042
+ transition: opacity .2s ease-in-out,transform .2s ease-in-out,-webkit-transform .2s ease-in-out;
2043
+ -webkit-transition-delay: .1s;
2044
+ transition-delay: .1s;
2045
+ -webkit-transition-duration: .1s;
2046
+ transition-duration: .1s;
2047
+ -webkit-transform: translate(0, 0);
2048
+ -ms-transform: translate(0, 0);
2049
+ transform: translate(0, 0);
2050
+ }
2051
+ .ha-hover-box-wrapper .ha-hover-sub-title {
2052
+ display: inline-block;
2053
+ margin-bottom: 20px;
2054
+ color: #222;
2055
+ }
2056
+ .ha-hover-box-wrapper .ha-hover-title {
2057
+ margin-top: 0;
2058
+ margin-bottom: 10px;
2059
+ color: #222;
2060
+ }
2061
+ .ha-hover-box-wrapper .ha-hover-description {
2062
+ margin: 0;
2063
+ color: #222;
2064
+ }
2065
+
2066
+ .ha-hover-box-wrapper.reverse:hover .ha-hover-box-content {
2067
+ opacity: 1;
2068
+ -webkit-transition-delay: .1s;
2069
+ transition-delay: .1s;
2070
+ -webkit-transform: translate(0, -16px);
2071
+ -ms-transform: translate(0, -16px);
2072
+ transform: translate(0, -16px);
2073
+ }
2074
+
2075
+ .ha-hover-box-wrapper.reverse .ha-hover-box-content {
2076
+ opacity: 0;
2077
+ -webkit-transition-delay: 0s;
2078
+ transition-delay: 0s;
2079
+ }
2080
+
2081
+ .ha-pre--column .ha-hover-sub-title {
2082
+ margin-bottom: 20px;
2083
+ }
2084
+
2085
+ .ha-pre--column-reverse p.ha-hover-sub-title {
2086
+ margin-top: 20px;
2087
+ margin-bottom: 0;
2088
+ }
2089
+
2090
+ .ha-card > .elementor-widget-container,
2091
+ .ha-infobox > .elementor-widget-container,
2092
+ .ha-icon-box > .elementor-widget-container,
2093
+ .ha-member > .elementor-widget-container,
2094
+ .ha-review > .elementor-widget-container,
2095
+ .ha-image-compare > .elementor-widget-container,
2096
+ .ha-pricing-table > .elementor-widget-container {
2097
+ border-radius: .5rem;
2098
+ background-color: #fff;
2099
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
2100
+ word-wrap: break-word;
2101
+
2102
+ overflow-wrap: break-word;
2103
+ }
2104
+
2105
+ .ha-logo-grid-wrapper:before,
2106
+ .ha-logo-grid-wrapper:after {
2107
+ display: table;
2108
+ content: " ";
2109
+ }
2110
+
2111
+ .ha-logo-grid-wrapper:after {
2112
+ clear: both;
2113
+ }
2114
+
2115
+ .ha-flip-box-container:after {
2116
+ display: block;
2117
+ visibility: hidden;
2118
+ clear: both;
2119
+ height: 0;
2120
+ content: " ";
2121
+ font-size: 0;
2122
+ }
2123
+
2124
+ .ha-flip-box-container .ha-flip-box-inner {
2125
+ position: relative;
2126
+ z-index: 1;
2127
+ margin: 0;
2128
+ padding: 0;
2129
+
2130
+ -webkit-backface-visibility: hidden;
2131
+ backface-visibility: hidden;
2132
+ }
2133
+ .ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-back {
2134
+ z-index: 1;
2135
+ }
2136
+ .ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-front {
2137
+ z-index: -1;
2138
+ }
2139
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-inner-wrapper {
2140
+ position: relative;
2141
+ -webkit-transform: translateZ(0);
2142
+
2143
+ -webkit-perspective: 1000px;
2144
+ perspective: 1000px;
2145
+ }
2146
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back,
2147
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front {
2148
+ top: 0;
2149
+ right: 0;
2150
+ left: 0;
2151
+ display: -webkit-box;
2152
+ display: -webkit-flex;
2153
+ display: -ms-flexbox;
2154
+ display: flex;
2155
+ -webkit-box-align: center;
2156
+ -webkit-align-items: center;
2157
+ align-items: center;
2158
+ -ms-flex-align: center;
2159
+ height: 250px;
2160
+ background-color: transparent;
2161
+ background-position: center;
2162
+ background-clip: padding-box;
2163
+ background-size: cover;
2164
+ background-repeat: no-repeat;
2165
+ text-align: center;
2166
+
2167
+ -webkit-backface-visibility: hidden;
2168
+ backface-visibility: hidden;
2169
+ -webkit-perspective: 1000px;
2170
+ perspective: 1000px;
2171
+ }
2172
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back:before,
2173
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front:before {
2174
+ position: absolute;
2175
+ top: 0;
2176
+ left: 0;
2177
+ z-index: -9;
2178
+ width: 100%;
2179
+ height: 100%;
2180
+ background-color: transparent;
2181
+ content: "";
2182
+ }
2183
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front {
2184
+ position: relative;
2185
+ bottom: 0;
2186
+ z-index: 10;
2187
+ padding: 30px;
2188
+ border: 1px solid #ddd;
2189
+ border-radius: .3rem;
2190
+ }
2191
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back {
2192
+ position: absolute;
2193
+ z-index: -1;
2194
+ padding: 46px;
2195
+ border-radius: .3rem;
2196
+ background-color: #562dd4;
2197
+ color: #fff;
2198
+ }
2199
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner,
2200
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner {
2201
+ position: relative;
2202
+ display: -webkit-box;
2203
+ display: -webkit-flex;
2204
+ display: -ms-flexbox;
2205
+ display: flex;
2206
+ -webkit-box-orient: vertical;
2207
+ -webkit-box-direction: normal;
2208
+ -webkit-flex-direction: column;
2209
+ -ms-flex-direction: column;
2210
+ flex-direction: column;
2211
+ width: 100%;
2212
+ }
2213
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-text,
2214
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-text {
2215
+ text-align: center;
2216
+ }
2217
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-text p,
2218
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-text p {
2219
+ margin-top: 10px;
2220
+ margin-bottom: 0;
2221
+ }
2222
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon.icon {
2223
+ padding: 20px;
2224
+ border-radius: 50%;
2225
+ background-color: #f1f4f8;
2226
+ color: #242424;
2227
+ }
2228
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon {
2229
+ display: inline-block;
2230
+ margin-bottom: 20px;
2231
+ text-align: center;
2232
+ }
2233
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i {
2234
+ position: relative;
2235
+ display: block;
2236
+ width: 1em;
2237
+ height: 1em;
2238
+ font-size: 28px;
2239
+ }
2240
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i:before {
2241
+ position: absolute;
2242
+ left: 50%;
2243
+ -webkit-transform: translateX(-50%);
2244
+ -ms-transform: translateX(-50%);
2245
+ transform: translateX(-50%);
2246
+ }
2247
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon img {
2248
+ width: 60px;
2249
+ height: 60px;
2250
+ vertical-align: middle;
2251
+ }
2252
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-box-heading {
2253
+ margin: 0;
2254
+ font-weight: bold;
2255
+ font-size: 20px;
2256
+ }
2257
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner p {
2258
+ margin-bottom: 0;
2259
+ font-size: 16px;
2260
+ }
2261
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-box-heading-back {
2262
+ margin: 0;
2263
+ color: #fff;
2264
+ font-size: 18px;
2265
+ }
2266
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon {
2267
+ display: inline-block;
2268
+ margin-bottom: 20px;
2269
+ text-align: center;
2270
+ }
2271
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i {
2272
+ position: relative;
2273
+ display: block;
2274
+ width: 1em;
2275
+ height: 1em;
2276
+ color: #fff;
2277
+ font-size: 20px;
2278
+ }
2279
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i:before {
2280
+ position: absolute;
2281
+ left: 50%;
2282
+ -webkit-transform: translateX(-50%);
2283
+ -ms-transform: translateX(-50%);
2284
+ transform: translateX(-50%);
2285
+ }
2286
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon img {
2287
+ width: 60px;
2288
+ height: 60px;
2289
+ vertical-align: middle;
2290
+ }
2291
+
2292
+ .ha-flip-box-container .ha-flip-box-back-inner .button-wrap {
2293
+ margin-top: 12px;
2294
+ }
2295
+
2296
+ .ha-flip-box-container .ha-flip-box-back-inner .ha-flip-btn {
2297
+ display: inline-block;
2298
+ padding: .8rem 2.5rem;
2299
+ border-radius: 4px;
2300
+ background-color: #fff;
2301
+ color: #562dd4;
2302
+ text-decoration: none;
2303
+ text-transform: uppercase;
2304
+ font-size: 12px;
2305
+ -webkit-transition: all .3s;
2306
+ transition: all .3s;
2307
+ }
2308
+ .ha-flip-box-container .ha-flip-box-back-inner .ha-flip-btn:hover {
2309
+ background-color: #fff;
2310
+ color: #562dd4;
2311
+ }
2312
+
2313
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-front {
2314
+ -webkit-transform: rotateY(0);
2315
+ transform: rotateY(0);
2316
+ }
2317
+
2318
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-back {
2319
+ -webkit-transform: rotateY(-180deg);
2320
+ transform: rotateY(-180deg);
2321
+ }
2322
+
2323
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-back {
2324
+ -webkit-transform: rotateY(0);
2325
+ transform: rotateY(0);
2326
+ }
2327
+
2328
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-front {
2329
+ -webkit-transform: rotateY(180deg);
2330
+ transform: rotateY(180deg);
2331
+ }
2332
+
2333
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-left .ha-flip-box-front {
2334
+ -webkit-transform: rotateY(0);
2335
+ transform: rotateY(0);
2336
+ }
2337
+
2338
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-left .ha-flip-box-back {
2339
+ -webkit-transform: rotateY(180deg);
2340
+ transform: rotateY(180deg);
2341
+ }
2342
+
2343
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-left:hover .ha-flip-box-back {
2344
+ -webkit-transform: rotateY(0);
2345
+ transform: rotateY(0);
2346
+ }
2347
+
2348
+ .ha-flip-box-container .ha-flip-box.ha-flip-left:hover .ha-flip-box-front {
2349
+ -webkit-transform: rotateY(-180deg);
2350
+ transform: rotateY(-180deg);
2351
+ }
2352
+
2353
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-front {
2354
+ -webkit-transform: rotateX(0);
2355
+ transform: rotateX(0);
2356
+ }
2357
+
2358
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-back {
2359
+ -webkit-transform: rotateX(-180deg);
2360
+ transform: rotateX(-180deg);
2361
+ }
2362
+
2363
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-back {
2364
+ -webkit-transform: rotateX(0);
2365
+ transform: rotateX(0);
2366
+ }
2367
+
2368
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-front {
2369
+ -webkit-transform: rotateX(180deg);
2370
+ transform: rotateX(180deg);
2371
+ }
2372
+
2373
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-down .ha-flip-box-front {
2374
+ -webkit-transform: rotateX(0);
2375
+ transform: rotateX(0);
2376
+ }
2377
+
2378
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-down .ha-flip-box-back {
2379
+ -webkit-transform: rotateX(180deg);
2380
+ transform: rotateX(180deg);
2381
+ }
2382
+
2383
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-down:hover .ha-flip-box-back {
2384
+ -webkit-transform: rotateX(0);
2385
+ transform: rotateX(0);
2386
+ }
2387
+
2388
+ .ha-flip-box-container .ha-flip-box-inner.ha-flip-down:hover .ha-flip-box-front {
2389
+ -webkit-transform: rotateX(-180deg);
2390
+ transform: rotateX(-180deg);
2391
+ }
2392
+
2393
+ .ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-back,
2394
+ .ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-front {
2395
+ -webkit-transition: -webkit-transform .6s cubic-bezier(.2, .85, .4, 1.275);
2396
+ transition: -webkit-transform .6s cubic-bezier(.2, .85, .4, 1.275);
2397
+ transition: transform .6s cubic-bezier(.2, .85, .4, 1.275);
2398
+ transition: transform .6s cubic-bezier(.2, .85, .4, 1.275), -webkit-transform .6s cubic-bezier(.2, .85, .4, 1.275);
2399
+ }
2400
+
2401
+ .ha-card > .elementor-widget-container,
2402
+ .ha-infobox > .elementor-widget-container,
2403
+ .ha-icon-box > .elementor-widget-container,
2404
+ .ha-member > .elementor-widget-container,
2405
+ .ha-review > .elementor-widget-container,
2406
+ .ha-image-compare > .elementor-widget-container,
2407
+ .ha-pricing-table > .elementor-widget-container {
2408
+ border-radius: .5rem;
2409
+ background-color: #fff;
2410
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
2411
+ word-wrap: break-word;
2412
+
2413
+ overflow-wrap: break-word;
2414
+ }
2415
+
2416
+ .ha-logo-grid-wrapper:before,
2417
+ .ha-logo-grid-wrapper:after {
2418
+ display: table;
2419
+ content: " ";
2420
+ }
2421
+
2422
+ .ha-logo-grid-wrapper:after {
2423
+ clear: both;
2424
+ }
2425
+
2426
+ .ha-pricing-table > .elementor-widget-container {
2427
+ position: relative;
2428
+ overflow: hidden;
2429
+ padding: 3em 4em;
2430
+ }
2431
+
2432
+ .ha-pricing-table-badge {
2433
+ position: absolute;
2434
+ top: 0;
2435
+ padding: .8rem 1rem;
2436
+ background-color: #e2498a;
2437
+ color: #fff;
2438
+ line-height: 1;
2439
+ }
2440
+ .ha-pricing-table-badge--left {
2441
+ left: 0;
2442
+ -webkit-transform: rotate(-90deg) translateX(-100%);
2443
+ -ms-transform: rotate(-90deg) translateX(-100%);
2444
+ transform: rotate(-90deg) translateX(-100%);
2445
+ -webkit-transform-origin: left top;
2446
+ -ms-transform-origin: left top;
2447
+ transform-origin: left top;
2448
+ }
2449
+ .ha-pricing-table-badge--right {
2450
+ right: 0;
2451
+ -webkit-transform: rotate(-90deg) translateY(-100%);
2452
+ -ms-transform: rotate(-90deg) translateY(-100%);
2453
+ transform: rotate(-90deg) translateY(-100%);
2454
+ -webkit-transform-origin: right top;
2455
+ -ms-transform-origin: right top;
2456
+ transform-origin: right top;
2457
+ }
2458
+
2459
+ .ha-pricing-table-title {
2460
+ margin-top: 0;
2461
+ margin-bottom: .5rem;
2462
+ color: #242424;
2463
+ font-weight: 400;
2464
+ font-size: 24px;
2465
+ }
2466
+
2467
+ .ha-pricing-table-price {
2468
+ margin-bottom: 3rem;
2469
+ }
2470
+
2471
+ .ha-pricing-table-price-tag {
2472
+ margin-bottom: .5rem;
2473
+ color: #242424;
2474
+ font-weight: bold;
2475
+ font-size: 60px;
2476
+ line-height: normal;
2477
+ }
2478
+
2479
+ .ha-pricing-table-currency {
2480
+ font-size: 24px;
2481
+ }
2482
+
2483
+ .ha-pricing-table-period {
2484
+ color: #8c8c8c;
2485
+ font-size: 16px;
2486
+ }
2487
+
2488
+ .ha-pricing-table-body {
2489
+ margin-bottom: 3rem;
2490
+ }
2491
+
2492
+ .ha-pricing-table-features-title {
2493
+ margin-top: 0;
2494
+ margin-bottom: 1rem;
2495
+ font-weight: bold;
2496
+ font-size: 16px;
2497
+ }
2498
+
2499
+ .ha-pricing-table-features-list {
2500
+ margin: 0;
2501
+ padding: 0;
2502
+ list-style: none;
2503
+ }
2504
+ .ha-pricing-table-features-list li {
2505
+ margin-bottom: 1rem;
2506
+ font-size: 16px;
2507
+ }
2508
+ .ha-pricing-table-features-list i {
2509
+ margin-right: .5rem;
2510
+ min-width: 15px;
2511
+ font-size: .8em;
2512
+ }
2513
+
2514
+ .ha-pricing-table-btn {
2515
+ display: inline-block;
2516
+ padding: .8rem 2rem;
2517
+ border-radius: 40px;
2518
+ background-color: #e2498a;
2519
+ color: #fff;
2520
+ text-decoration: none;
2521
+ text-transform: uppercase;
2522
+ font-size: 12px;
2523
+ -webkit-transition: all .3s;
2524
+ transition: all .3s;
2525
+ }
2526
+ .ha-pricing-table-btn:hover {
2527
+ background-color: #562dd4;
2528
+ color: #fff;
2529
+ }
2530
+
2531
+ .ha-card > .elementor-widget-container,
2532
+ .ha-infobox > .elementor-widget-container,
2533
+ .ha-icon-box > .elementor-widget-container,
2534
+ .ha-member > .elementor-widget-container,
2535
+ .ha-review > .elementor-widget-container,
2536
+ .ha-image-compare > .elementor-widget-container,
2537
+ .ha-pricing-table > .elementor-widget-container {
2538
+ border-radius: .5rem;
2539
+ background-color: #fff;
2540
+ box-shadow: 0 .2rem 2.8rem rgba(36, 36, 36, .1);
2541
+ word-wrap: break-word;
2542
+
2543
+ overflow-wrap: break-word;
2544
+ }
2545
+
2546
+ .ha-logo-grid-wrapper:before,
2547
+ .ha-logo-grid-wrapper:after {
2548
+ display: table;
2549
+ content: " ";
2550
+ }
2551
+
2552
+ .ha-logo-grid-wrapper:after {
2553
+ clear: both;
2554
+ }
2555
+
2556
+ .ha-step-flow > .elementor-widget-container {
2557
+ padding: 30px;
2558
+ text-align: center;
2559
+ }
2560
+
2561
+ .ha-step-arrow {
2562
+ position: absolute;
2563
+ top: 49%;
2564
+ left: calc(100% + 50px);
2565
+ display: inline-block;
2566
+ width: 100px;
2567
+ border-top: 1px dashed #ddd;
2568
+ }
2569
+ .ha-step-arrow:after {
2570
+ position: absolute;
2571
+ right: -6px;
2572
+ height: 1.5em;
2573
+ color: #ddd;
2574
+ content: "\e90b";
2575
+ font-size: 18px;
2576
+ font-family: "Happy Icons" !important;
2577
+ -webkit-transform: translateY(-50%);
2578
+ -ms-transform: translateY(-50%);
2579
+ transform: translateY(-50%);
2580
+ }
2581
+
2582
+ .ha-steps-icon {
2583
+ position: relative;
2584
+ display: inline-block;
2585
+ margin-bottom: 2rem;
2586
+ padding: 40px;
2587
+ border-radius: 50%;
2588
+ background-color: #f1f4f8;
2589
+ color: #242424;
2590
+ text-align: center;
2591
+ font-size: 46px;
2592
+ }
2593
+ .ha-steps-icon i {
2594
+ position: relative;
2595
+ display: block;
2596
+ width: 1em;
2597
+ height: 1em;
2598
+ }
2599
+ .ha-steps-icon i:before {
2600
+ position: absolute;
2601
+ left: 50%;
2602
+ -webkit-transform: translateX(-50%);
2603
+ -ms-transform: translateX(-50%);
2604
+ transform: translateX(-50%);
2605
+ }
2606
+ .ha-steps-icon .ha-steps-label {
2607
+ position: absolute;
2608
+ top: 5px;
2609
+ right: 0;
2610
+ padding: 10px 12px;
2611
+ border: 3px solid #fff;
2612
+ border-radius: 20px;
2613
+ background-color: #e2498a;
2614
+ color: #fff;
2615
+ font-size: 12px;
2616
+ line-height: 0;
2617
+ }
2618
+
2619
+ .ha-steps-title {
2620
+ margin-top: 0;
2621
+ margin-bottom: 30px;
2622
+ font-weight: bold;
2623
+ font-size: 16px;
2624
+ }
2625
+
2626
+ .ha-steps-title a {
2627
+ display: block;
2628
+ color: #562dd4;
2629
+ }
2630
+
2631
+ .ha-steps-title a:hover {
2632
+ color: #242424;
2633
+ }
2634
+
2635
+ .ha-step-description {
2636
+ margin: 0;
2637
+ color: #616161;
2638
+ font-weight: normal;
2639
+ font-size: 16px;
2640
+ line-height: 1.5;
2641
+ }
assets/css/main.min.css CHANGED
@@ -1 +1 @@
1
- .ha-card>.elementor-widget-container,.ha-icon-box>.elementor-widget-container,.ha-image-compare>.elementor-widget-container,.ha-infobox>.elementor-widget-container,.ha-member>.elementor-widget-container,.ha-review>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word}.happy-addon,.happy-addon *{box-sizing:border-box}.happy-addon img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.happy-addon p:empty{display:none}.ha-cf:after,.ha-cf:before,.ha-logo-grid-wrapper:after,.ha-logo-grid-wrapper:before{display:table;content:" "}.ha-cf:after,.ha-logo-grid-wrapper:after{clear:both}.ha-btn{display:inline-block;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon{-webkit-transition:all .3s;transition:all .3s}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-card-figure{position:relative;height:250px}.ha-card-figure>img{border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.ha-card-body{padding:1.5rem}.ha-card-title{margin-top:0;margin-bottom:.75rem;color:#151515;font-weight:700;font-size:22px}.ha-card-text{margin-bottom:2rem;color:#616161;font-size:16px;line-height:1.7}.ha-card-text>p,.ha-infobox-text>p{margin-top:0;margin-bottom:0}.ha-card--top .ha-card-figure{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-badge{padding:.475rem 1.1rem;border-radius:50px;background-color:#fff;font-size:12px}.ha-badge--top-left{top:1rem;left:1rem}.ha-badge--top-center{top:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--top-right{top:1rem;right:1rem}.ha-badge--middle-left{top:50%;left:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--middle-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ha-badge--middle-right{top:50%;right:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--bottom-left{bottom:1rem;left:1rem}.ha-badge--bottom-center{bottom:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--bottom-right{right:1rem;bottom:1rem}.ha-infobox>.elementor-widget-container{padding:1.5rem}.ha-infobox-title{margin-top:0;margin-bottom:1rem;color:#151515;font-size:24px}.ha-infobox-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-infobox-figure--icon{text-align:center;font-size:3rem}.ha-icon-box-icon>i,.ha-infobox-figure>i{position:relative;display:block;width:1em;height:1em}.ha-icon-box-icon>i:before,.ha-infobox-figure>i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-card-figure>img,.ha-infobox-figure>img,.ha-member-figure img{width:100%;height:100%;vertical-align:bottom}.ha-infobox-text+.ha-btn--link{margin-top:1rem}.ha-icon-box>.elementor-widget-container{position:relative;padding:1.25rem}.ha-icon-box-title{margin-top:0;margin-bottom:0;color:#151515;font-size:24px;-webkit-transition:color .3s;transition:color .3s}.ha-icon-box-icon{display:inline-block;margin-bottom:1rem;color:#151515;text-align:center;font-size:3rem;-webkit-transition:border .3s,background .3s,color .3s,-webkit-transform .3s;transition:transform .3s,border .3s,background .3s,color .3s;transition:transform .3s,border .3s,background .3s,color .3s,-webkit-transform .3s}.ha-icon-box-icon>i{-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ha-icon-box-link{display:block;color:transparent;text-decoration:none}.ha-icon-box .ha-badge{position:absolute;z-index:9999;background-color:#e2498a;color:#fff}.ha-member>.elementor-widget-container{padding:1.25rem}.ha-member-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-member-name{margin-top:0;margin-bottom:.5rem;color:#151515;font-size:18px}.ha-member-position{margin-bottom:1.5rem;color:#7f7f7f;font-size:14px}.ha-member-bio{margin-bottom:1.5rem;font-size:14px;line-height:1.6}.ha-member-links>a{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:#287dfe;color:#fff}.ha-review-ratting--star{display:inline-block;color:#ffbf36;font-family:"Fontawesome"}.ha-review-ratting--star>span{position:relative;overflow:hidden;height:1em}.ha-review-ratting--star span>span{position:absolute;top:0;left:0;overflow:hidden;padding-top:1.5em}.ha-review-ratting--star span>span:before,span .ha-review-ratting--star:before{position:absolute;top:0;left:0}.ha-review-ratting--star span:before{content:"\f006\f006\f006\f006\f006"}.ha-review-ratting--star span>span:before{content:"\f005\f005\f005\f005\f005"}.ha-review-desc{margin-top:1.5rem;font-size:16px;line-height:1.6}.ha-review--top>.elementor-widget-container{padding:2rem}.ha-review--top .ha-review-figure{display:inline-block;max-width:70px;height:70px}.ha-review--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-review--left>.elementor-widget-container,.ha-review--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding-left:2rem}.ha-review--left .ha-review-figure,.ha-review--right .ha-review-figure{-webkit-box-flex:0;-webkit-flex:0 0 150px;-ms-flex:0 0 150px;flex:0 0 150px;max-width:150px;height:150px}.ha-review--left .ha-review-body,.ha-review--right .ha-review-body{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 150px);-ms-flex:0 0 calc(100% - 150px);flex:0 0 calc(100% - 150px);padding:2rem;max-width:calc(100% - 150px)}.ha-review--left .ha-review-body>:first-child,.ha-review--right .ha-review-body>:first-child{margin-top:0}.ha-review--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:2rem;padding-left:0;text-align:right}.ha-image-compare .twentytwenty-container,.ha-image-compare .twentytwenty-wrapper{border-radius:inherit}.ha-gallery-filter{margin:0 10px 2rem;padding:0;list-style:none}.ha-gallery-filter>li{display:inline-block;margin-bottom:10px}.ha-gallery-filter>li:not(:last-child){margin-right:10px}.ha-gallery-filter>li>button{display:block;padding:10px 25px;border:2px solid #562dd4;border-radius:.25rem;background-color:transparent;color:#562dd4;text-transform:uppercase;font-size:14px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ha-gallery-filter>li>button:focus,.ha-gallery-filter>li>button:hover{outline:0;background-color:#562dd4;color:#fff}.ha-gallery-filter>.ha-filter-active>button{background-color:#562dd4;color:#fff}.ha-justified-gallery-item,.ha-justified-gallery-item>img{border-radius:6px}.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}.justified-gallery>.ha-justified-gallery-item>.caption.caption-visible{bottom:0!important}.justified-gallery>.entry-visible>a>img,.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;background-color:#e9ecef;font-size:.75rem}.ha-skill--inside .ha-skill-info,.ha-skill--outside .ha-skill-info{text-align:left;font-size:14px}.ha-skill--inside .ha-skill-level-text,.ha-skill--outside .ha-skill-level-text{float:right}.ha-skill--outside{height:2px}.ha-skill--outside .ha-skill-level{position:relative}.ha-skill--outside .ha-skill-info{position:absolute;top:-25px;width:100%;color:#242424}.ha-skill--inside{overflow:hidden;height:30px;border-radius:.3rem}.ha-skill--inside .ha-skill-info{padding-right:1rem;padding-left:1rem;color:#fff}.ha-skill-level{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;background-color:#007bff;color:#fff;text-align:center;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.ha-skill--outside{margin-top:40px}.ha-skill--inside:not(:first-child){margin-top:20px}.ha-gradient-heading{margin-top:0;margin-bottom:0}.ha-gradient-heading>a{color:inherit;text-decoration:none}.ha-logo-grid-item{float:left;overflow:hidden;height:180px;border-color:#e7e7e7}.ha-logo-grid-figure{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0;padding:30px;width:100%;height:100%}.ha-logo-grid-img{max-height:100%}@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-button>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-btn,.ha-dual-btn-connector{display:inline-block}.ha-dual-btn-wrapper{position:relative;text-align:center;font-weight:400}.ha-dual-btn{padding:1.2rem 3rem;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{border-top-left-radius:50px;border-bottom-left-radius:50px;background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab}.ha-dual-btn--right{border-top-right-radius:50px;border-bottom-right-radius:50px;background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e}.ha-dual-btn-connector{position:absolute!important;top:50%;right:0;z-index:9;width:30px;height:30px;border-radius:100%;background-color:#fff;box-shadow:0 0 0 5px rgba(255,255,255,.3);color:#27374c;text-transform:uppercase;font-size:12px;line-height:30px;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%)}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}.ha-testimonial--basic>.elementor-widget-container{padding:2rem;border:1px solid #ececec;border-radius:.5rem}.ha-testimonial--basic .ha-testimonial__content{margin-bottom:2.5em}.ha-testimonial--bubble .ha-testimonial__content{position:relative;margin-bottom:1.5rem;padding:2rem;border-radius:6px;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);line-height:1.6rem}.ha-testimonial--bubble .ha-testimonial__content:after{position:absolute;bottom:-14px;color:#fff;content:"\e911";font-style:normal;font-size:36px;font-family:"Happy Icons";-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.ha-testimonial--left.ha-testimonial--bubble .ha-testimonial__content:after{left:15px}.ha-testimonial--center.ha-testimonial--bubble .ha-testimonial__content:after{left:50%;-webkit-transform:translateX(-50%) rotate(-180deg);-ms-transform:translateX(-50%) rotate(-180deg);transform:translateX(-50%) rotate(-180deg)}.ha-testimonial--right.ha-testimonial--bubble .ha-testimonial__content:after{right:15px}.ha-testimonial__reviewer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{width:65px;height:65px}.ha-testimonial__reviewer-thumb>img{width:100%;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover}.ha-testimonial__reviewer-name{margin-bottom:.3rem;color:#562dd4;font-weight:700;font-size:18px}.ha-testimonial__reviewer-title{color:#8c8c8c;font-size:16px}.ha-testimonial--left .ha-testimonial__reviewer-meta{padding-left:1em}.ha-testimonial--center .ha-testimonial__reviewer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-testimonial--center .ha-testimonial__reviewer-meta{padding-top:1em}.ha-testimonial--right .ha-testimonial__reviewer{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-testimonial--right .ha-testimonial__reviewer-meta{padding-right:1em}.ha-testimonial--left{text-align:left}.ha-testimonial--right{text-align:right}.ha-testimonial--center{text-align:center}.ha-number-body .ha-number-border{position:relative;display:-webkit-flex;display:-webkit-box;display:-ms-flexbox;display:flex;overflow:hidden;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding:6px;width:50px;height:50px;border-radius:100%;background:#c36;color:#fff;text-align:center;font-size:20px}.ha-number-body .ha-number-border .ha-number-border-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ha-number-body .ha-number-border span{-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}
1
+ .happy-addon,.happy-addon *{box-sizing:border-box}.happy-addon img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.happy-addon p:empty{display:none}.ha-btn{display:inline-block;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon{-webkit-transition:all .3s;transition:all .3s}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-card-figure{position:relative;height:250px}.ha-card-figure>img{border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.ha-card-body{padding:1.5rem}.ha-card-title{margin-top:0;margin-bottom:.75rem;color:#151515;font-weight:700;font-size:22px}.ha-card-text{margin-bottom:2rem;color:#616161;font-size:16px;line-height:1.7}.ha-card-text>p,.ha-infobox-text>p{margin-top:0;margin-bottom:0}.ha-card--top .ha-card-figure{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-badge{padding:.475rem 1.1rem;border-radius:50px;background-color:#fff;font-size:12px}.ha-badge--top-left{top:1rem;left:1rem}.ha-badge--top-center{top:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--top-right{top:1rem;right:1rem}.ha-badge--middle-left{top:50%;left:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--middle-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ha-badge--middle-right{top:50%;right:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--bottom-left{bottom:1rem;left:1rem}.ha-badge--bottom-center{bottom:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--bottom-right{right:1rem;bottom:1rem}.ha-infobox>.elementor-widget-container{padding:1.5rem}.ha-infobox-title{margin-top:0;margin-bottom:1rem;color:#151515;font-size:24px}.ha-infobox-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-infobox-figure--icon{text-align:center;font-size:3rem}.ha-icon-box-icon>i,.ha-infobox-figure>i{position:relative;display:block;width:1em;height:1em}.ha-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:#287dfe;color:#fff}.ha-review-ratting--star{display:inline-block;color:#ffbf36;font-family:"Fontawesome"}.ha-review-ratting--star>span{position:relative;overflow:hidden;height:1em}.ha-review-ratting--star span>span{position:absolute;top:0;left:0;overflow:hidden;padding-top:1.5em}.ha-review-ratting--star span>span:before,span .ha-review-ratting--star:before{position:absolute;top:0;left:0}.ha-review-ratting--star span:before{content:"\f006\f006\f006\f006\f006"}.ha-review-ratting--star span>span:before{content:"\f005\f005\f005\f005\f005"}.ha-review-desc{margin-top:1.5rem;font-size:16px;line-height:1.6}.ha-review--top>.elementor-widget-container{padding:2rem}.ha-review--top .ha-review-figure{display:inline-block;max-width:70px;height:70px}.ha-review--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-review--left>.elementor-widget-container,.ha-review--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding-left:2rem}.ha-review--left .ha-review-figure,.ha-review--right .ha-review-figure{-webkit-box-flex:0;-webkit-flex:0 0 150px;-ms-flex:0 0 150px;flex:0 0 150px;max-width:150px;height:150px}.ha-review--left .ha-review-body,.ha-review--right .ha-review-body{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 150px);-ms-flex:0 0 calc(100% - 150px);flex:0 0 calc(100% - 150px);padding:2rem;max-width:calc(100% - 150px)}.ha-review--left .ha-review-body>:first-child,.ha-review--right .ha-review-body>:first-child{margin-top:0}.ha-review--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:2rem;padding-left:0;text-align:right}.ha-image-compare .twentytwenty-container,.ha-image-compare .twentytwenty-wrapper{border-radius:inherit}.ha-gallery-filter{margin:0 10px 2rem;padding:0;list-style:none}.ha-gallery-filter>li{display:inline-block;margin-bottom:10px}.ha-gallery-filter>li:not(:last-child){margin-right:10px}.ha-gallery-filter>li>button{display:block;padding:10px 25px;border:2px solid #562dd4;border-radius:.25rem;background-color:transparent;color:#562dd4;text-transform:uppercase;font-size:14px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ha-gallery-filter>li>button:focus,.ha-gallery-filter>li>button:hover{outline:0;background-color:#562dd4;color:#fff}.ha-gallery-filter>.ha-filter-active>button{background-color:#562dd4;color:#fff}.ha-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}.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-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-button>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-btn,.ha-dual-btn-connector{display:inline-block}.ha-dual-btn-wrapper{position:relative;text-align:center;font-weight:400}.ha-dual-btn{padding:1.2rem 3rem;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{border-top-left-radius:50px;border-bottom-left-radius:50px;background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab}.ha-dual-btn--right{border-top-right-radius:50px;border-bottom-right-radius:50px;background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e}.ha-dual-btn-connector{position:absolute!important;top:50%;right:0;z-index:9;width:30px;height:30px;border-radius:100%;background-color:#fff;box-shadow:0 0 0 5px rgba(255,255,255,.3);color:#27374c;text-transform:uppercase;font-size:12px;line-height:30px;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%)}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}.ha-testimonial--basic>.elementor-widget-container{padding:2rem;border:1px solid #ececec;border-radius:.5rem}.ha-testimonial--basic .ha-testimonial__content{margin-bottom:2.5em}.ha-testimonial--bubble .ha-testimonial__content{position:relative;margin-bottom:1.5rem;padding:2rem;border-radius:6px;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);line-height:1.6rem}.ha-testimonial--bubble .ha-testimonial__content:after{position:absolute;bottom:-14px;color:#fff;content:"\e911";font-style:normal;font-size:36px;font-family:"Happy Icons";-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.ha-testimonial--left.ha-testimonial--bubble .ha-testimonial__content:after{left:15px}.ha-testimonial--center.ha-testimonial--bubble .ha-testimonial__content:after{left:50%;-webkit-transform:translateX(-50%) rotate(-180deg);-ms-transform:translateX(-50%) rotate(-180deg);transform:translateX(-50%) rotate(-180deg)}.ha-testimonial--right.ha-testimonial--bubble .ha-testimonial__content:after{right:15px}.ha-testimonial__reviewer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{width:65px;height:65px}.ha-testimonial__reviewer-thumb>img{width:100%;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover}.ha-testimonial__reviewer-name{margin-bottom:.3rem;color:#562dd4;font-weight:700;font-size:18px}.ha-testimonial__reviewer-title{color:#8c8c8c;font-size:16px}.ha-testimonial--left .ha-testimonial__reviewer-meta{padding-left:1em}.ha-testimonial--center .ha-testimonial__reviewer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-testimonial--center .ha-testimonial__reviewer-meta{padding-top:1em}.ha-testimonial--right .ha-testimonial__reviewer{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-testimonial--right .ha-testimonial__reviewer-meta{padding-right:1em}.ha-testimonial--left{text-align:left}.ha-testimonial--right{text-align:right}.ha-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-hover-box-wrapper:before,.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-hover-box{overflow:hidden}.ha-hover-box .ha-hover-box-main{position:relative;overflow:hidden}.ha-hover-box-wrapper,.ha-hover-box-wrapper .ha-hover-box-content{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.ha-hover-box-wrapper{overflow:hidden;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding:50px;max-height:100%;height:400px;-webkit-transition-duration:.4s;transition-duration:.4s}.ha-hover-box-wrapper:before{z-index:1;content:""}.ha-hover-box-wrapper:hover{-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transform:scale(1.06);-ms-transform:scale(1.06);transform:scale(1.06)}.ha-hover-box-wrapper:hover .ha-hover-box-content{opacity:0;-webkit-transition-delay:0ms;transition-delay:0ms;-webkit-transition-timing-function:cubic-bezier(.57,.21,.69,1);transition-timing-function:cubic-bezier(.57,.21,.69,1);-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:translate(0,36px);-ms-transform:translate(0,36px);transform:translate(0,36px)}.ha-hover-box-wrapper .ha-hover-box-content{z-index:99;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;text-align:left;opacity:1;-webkit-transition:opacity .2s ease-in-out,-webkit-transform .2s ease-in-out;transition:opacity .2s ease-in-out,transform .2s ease-in-out;transition:opacity .2s ease-in-out,transform .2s ease-in-out,-webkit-transform .2s ease-in-out;-webkit-transition-delay:.1s;transition-delay:.1s;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.ha-hover-box-wrapper .ha-hover-sub-title{display:inline-block;margin-bottom:20px;color:#222}.ha-hover-box-wrapper .ha-hover-title{margin-top:0;margin-bottom:10px;color:#222}.ha-hover-box-wrapper .ha-hover-description{margin:0;color:#222}.ha-hover-box-wrapper.reverse:hover .ha-hover-box-content{opacity:1;-webkit-transition-delay:.1s;transition-delay:.1s;-webkit-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}.ha-hover-box-wrapper.reverse .ha-hover-box-content{opacity:0;-webkit-transition-delay:0s;transition-delay:0s}.ha-pre--column .ha-hover-sub-title{margin-bottom:20px}.ha-pre--column-reverse p.ha-hover-sub-title{margin-top:20px;margin-bottom:0}.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-back-inner .button-wrap{margin-top:12px}.ha-flip-box-container .ha-flip-box-back-inner .ha-flip-btn{display:inline-block;padding:.8rem 2.5rem;border-radius:4px;background-color:#fff;color:#562dd4;text-decoration:none;text-transform:uppercase;font-size:12px;-webkit-transition:all .3s;transition:all .3s}.ha-flip-box-container .ha-flip-box-back-inner .ha-flip-btn:hover{background-color:#fff;color:#562dd4}.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-left .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-left:hover .ha-flip-box-back{-webkit-transform:rotateY(0);transform:rotateY(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-left .ha-flip-box-back{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ha-flip-box-container .ha-flip-box.ha-flip-left: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-box-inner.ha-flip-down .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-down:hover .ha-flip-box-back{-webkit-transform:rotateX(0);transform:rotateX(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-down .ha-flip-box-back{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-down: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-pricing-table>.elementor-widget-container{position:relative;overflow:hidden;padding:3em 4em}.ha-pricing-table-badge{position:absolute;top:0;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-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);word-wrap:break-word;overflow-wrap:break-word}.ha-logo-grid-wrapper:after,.ha-logo-grid-wrapper:before{display:table;content:" "}.ha-logo-grid-wrapper:after{clear:both}.ha-step-flow>.elementor-widget-container{padding:30px;text-align:center}.ha-step-arrow{position:absolute;top:49%;left:calc(100% + 50px);display:inline-block;width:100px;border-top:1px dashed #ddd}.ha-step-arrow:after{position:absolute;right:-6px;height:1.5em;color:#ddd;content:"\e90b";font-size:18px;font-family:"Happy Icons"!important;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-steps-icon{position:relative;display:inline-block;margin-bottom:2rem;padding:40px;border-radius:50%;background-color:#f1f4f8;color:#242424;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;padding:10px 12px;border:3px solid #fff;border-radius:20px;background-color:#e2498a;color:#fff;font-size:12px;line-height:0}.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}
assets/css/widgets/btn.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-btn{display:inline-block;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon{-webkit-transition:all .3s;transition:all .3s}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}
assets/css/widgets/card.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-card>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word}.ha-card-figure{position:relative;height:250px}.ha-card-figure>img{width:100%;height:100%;border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px);vertical-align:bottom}.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{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-badge{padding:.475rem 1.1rem;border-radius:50px;background-color:#fff;font-size:12px}.ha-badge--top-left{top:1rem;left:1rem}.ha-badge--top-center{top:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--top-right{top:1rem;right:1rem}.ha-badge--middle-left{top:50%;left:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--middle-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ha-badge--middle-right{top:50%;right:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--bottom-left{bottom:1rem;left:1rem}.ha-badge--bottom-center{bottom:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--bottom-right{right:1rem;bottom:1rem}
assets/css/widgets/common.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .happy-addon,.happy-addon *{box-sizing:border-box}.happy-addon img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.happy-addon p:empty{display:none}
assets/css/widgets/dual-btn.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-dual-button>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-btn,.ha-dual-btn-connector{display:inline-block}.ha-dual-btn-wrapper{position:relative;text-align:center;font-weight:400}.ha-dual-btn{padding:1.2rem 3rem;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{border-top-left-radius:50px;border-bottom-left-radius:50px;background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab}.ha-dual-btn--right{border-top-right-radius:50px;border-bottom-right-radius:50px;background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e}.ha-dual-btn-connector{position:absolute!important;top:50%;right:0;z-index:9;width:30px;height:30px;border-radius:100%;background-color:#fff;box-shadow:0 0 0 5px rgba(255,255,255,.3);color:#27374c;text-transform:uppercase;font-size:12px;line-height:30px;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%)}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}
assets/css/widgets/flip-box.min.css ADDED
@@ -0,0 +1 @@
 
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 i:before,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.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-back-inner .button-wrap{margin-top:12px}.ha-flip-box-container .ha-flip-box-back-inner .ha-flip-btn{display:inline-block;padding:.8rem 2.5rem;border-radius:4px;background-color:#fff;color:#562dd4;text-decoration:none;text-transform:uppercase;font-size:12px;-webkit-transition:all .3s;transition:all .3s}.ha-flip-box-container .ha-flip-box-back-inner .ha-flip-btn:hover{background-color:#fff;color:#562dd4}.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-left .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-left:hover .ha-flip-box-back{-webkit-transform:rotateY(0);transform:rotateY(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-left .ha-flip-box-back{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ha-flip-box-container .ha-flip-box.ha-flip-left: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-box-inner.ha-flip-down .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-down:hover .ha-flip-box-back{-webkit-transform:rotateX(0);transform:rotateX(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-down .ha-flip-box-back{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-down: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)}
assets/css/widgets/gallery-filter.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-gallery-filter{margin:0 10px 2rem;padding:0;list-style:none}.ha-gallery-filter>li{display:inline-block;margin-bottom:10px}.ha-gallery-filter>li:not(:last-child){margin-right:10px}.ha-gallery-filter>li>button{display:block;padding:10px 25px;border:2px solid #562dd4;border-radius:.25rem;background-color:transparent;color:#562dd4;text-transform:uppercase;font-size:14px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ha-gallery-filter>li>button:focus,.ha-gallery-filter>li>button:hover{outline:0;background-color:#562dd4;color:#fff}.ha-gallery-filter>.ha-filter-active>button{background-color:#562dd4;color:#fff}
assets/css/widgets/gradient-heading.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-gradient-heading{margin-top:0;margin-bottom:0}.ha-gradient-heading>a{color:inherit;text-decoration:none}
assets/css/widgets/hover-box.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-hover-box{overflow:hidden}.ha-hover-box .ha-hover-box-main{position:relative;overflow:hidden}.ha-hover-box-wrapper,.ha-hover-box-wrapper .ha-hover-box-content{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;width:100%}.ha-hover-box-wrapper{overflow:hidden;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding:50px;max-height:100%;height:400px;-webkit-transition-duration:.4s;transition-duration:.4s}.ha-hover-box-wrapper:before{position:absolute;top:0;left:0;z-index:1;width:100%;height:100%;content:""}.ha-hover-box-wrapper:hover{-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transform:scale(1.06);-ms-transform:scale(1.06);transform:scale(1.06)}.ha-hover-box-wrapper:hover .ha-hover-box-content{opacity:0;-webkit-transition-delay:0ms;transition-delay:0ms;-webkit-transition-timing-function:cubic-bezier(.57,.21,.69,1);transition-timing-function:cubic-bezier(.57,.21,.69,1);-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform:translate(0,36px);-ms-transform:translate(0,36px);transform:translate(0,36px)}.ha-hover-box-wrapper .ha-hover-box-content{z-index:99;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;text-align:left;opacity:1;-webkit-transition:opacity .2s ease-in-out,-webkit-transform .2s ease-in-out;transition:opacity .2s ease-in-out,transform .2s ease-in-out;transition:opacity .2s ease-in-out,transform .2s ease-in-out,-webkit-transform .2s ease-in-out;-webkit-transition-delay:.1s;transition-delay:.1s;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transform:translate(0,0);-ms-transform:translate(0,0);transform:translate(0,0)}.ha-hover-box-wrapper .ha-hover-sub-title{display:inline-block;margin-bottom:20px;color:#222}.ha-hover-box-wrapper .ha-hover-title{margin-top:0;margin-bottom:10px;color:#222}.ha-hover-box-wrapper .ha-hover-description{margin:0;color:#222}.ha-hover-box-wrapper.reverse:hover .ha-hover-box-content{opacity:1;-webkit-transition-delay:.1s;transition-delay:.1s;-webkit-transform:translate(0,-16px);-ms-transform:translate(0,-16px);transform:translate(0,-16px)}.ha-hover-box-wrapper.reverse .ha-hover-box-content{opacity:0;-webkit-transition-delay:0s;transition-delay:0s}.ha-pre--column .ha-hover-sub-title{margin-bottom:20px}.ha-pre--column-reverse p.ha-hover-sub-title{margin-top:20px;margin-bottom:0}
assets/css/widgets/icon-box.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-icon-box>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word;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{position:relative;display:block;width:1em;height:1em;-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ha-icon-box-icon>i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.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}
assets/css/widgets/image-comparison.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-image-compare>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word}.ha-image-compare .twentytwenty-container,.ha-image-compare .twentytwenty-wrapper{border-radius:inherit}
assets/css/widgets/infobox.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-infobox>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word;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-infobox-figure>i{position:relative;display:block;width:1em;height:1em}.ha-infobox-figure>i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-infobox-figure>img{width:100%;height:100%;vertical-align:bottom}.ha-infobox-text+.ha-btn--link{margin-top:1rem}.ha-infobox-text>p{margin-top:0;margin-bottom:0}
assets/css/widgets/justified-gallery.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .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)}}
assets/css/widgets/logo-grid.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-logo-grid-wrapper:after,.ha-logo-grid-wrapper:before{display:table;content:" "}.ha-logo-grid-wrapper:after{clear:both}.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)}}
assets/css/widgets/member.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-member>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word;padding:1.25rem}.ha-member-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-member-figure img{width:100%;height:100%;vertical-align:bottom}.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}
assets/css/widgets/number.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .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;text-align:center;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}
assets/css/widgets/pricing-table.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-pricing-table>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word;position:relative;overflow:hidden;padding:3em 4em}.ha-pricing-table-badge{position:absolute;top:0;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-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}
assets/css/widgets/review.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-review>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);word-wrap:break-word;overflow-wrap:break-word}.ha-review-header{margin-top:1.5rem}.ha-review-desc p,.ha-review-figure{margin:0}.ha-review-figure>img{width:100%;height:100%;border-radius:50%;vertical-align:bottom}.ha-review-reviewer{margin-top:0;margin-bottom:.3rem;color:#151515;font-size:18px}.ha-review-position{margin-bottom:.5rem;color:#7f7f7f;font-size:15px}.ha-review-ratting{display:inline-block;font-size:12px;line-height:1}.ha-review-ratting--num{padding:.25em .66em;border-radius:2.5em;background-color:#287dfe;color:#fff}.ha-review-ratting--star{display:inline-block;color:#ffbf36;font-family:"Fontawesome"}.ha-review-ratting--star>span{position:relative;overflow:hidden;height:1em}.ha-review-ratting--star span>span{position:absolute;top:0;left:0;overflow:hidden;padding-top:1.5em}.ha-review-ratting--star span>span:before,span .ha-review-ratting--star:before{position:absolute;top:0;left:0}.ha-review-ratting--star span:before{content:"\f006\f006\f006\f006\f006"}.ha-review-ratting--star span>span:before{content:"\f005\f005\f005\f005\f005"}.ha-review-desc{margin-top:1.5rem;font-size:16px;line-height:1.6}.ha-review--top>.elementor-widget-container{padding:2rem}.ha-review--top .ha-review-figure{display:inline-block;max-width:70px;height:70px}.ha-review--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-review--left>.elementor-widget-container,.ha-review--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding-left:2rem}.ha-review--left .ha-review-figure,.ha-review--right .ha-review-figure{-webkit-box-flex:0;-webkit-flex:0 0 150px;-ms-flex:0 0 150px;flex:0 0 150px;max-width:150px;height:150px}.ha-review--left .ha-review-body,.ha-review--right .ha-review-body{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 150px);-ms-flex:0 0 calc(100% - 150px);flex:0 0 calc(100% - 150px);padding:2rem;max-width:calc(100% - 150px)}.ha-review--left .ha-review-body>:first-child,.ha-review--right .ha-review-body>:first-child{margin-top:0}.ha-review--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:2rem;padding-left:0;text-align:right}
assets/css/widgets/skills.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .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}.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}
assets/css/widgets/slider-carousel.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .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}
assets/css/widgets/steps-flow.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-step-flow>.elementor-widget-container{padding:30px;text-align:center}.ha-step-arrow{position:absolute;top:49%;left:calc(100% + 50px);display:inline-block;width:100px;border-top:1px dashed #ddd}.ha-step-arrow:after{position:absolute;right:-6px;height:1.5em;color:#ddd;content:"\e90b";font-size:18px;font-family:"Happy Icons"!important;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-steps-icon{position:relative;display:inline-block;margin-bottom:2rem;padding:40px;border-radius:50%;background-color:#f1f4f8;color:#242424;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;padding:10px 12px;border:3px solid #fff;border-radius:20px;background-color:#e2498a;color:#fff;font-size:12px;line-height:0}.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}
assets/css/widgets/testimonial.min.css ADDED
@@ -0,0 +1 @@
 
1
+ .ha-testimonial--basic>.elementor-widget-container{padding:2rem;border:1px solid #ececec;border-radius:.5rem}.ha-testimonial--basic .ha-testimonial__content{margin-bottom:2.5em}.ha-testimonial--bubble .ha-testimonial__content{position:relative;margin-bottom:1.5rem;padding:2rem;border-radius:6px;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);line-height:1.6rem}.ha-testimonial--bubble .ha-testimonial__content:after{position:absolute;bottom:-14px;color:#fff;content:"\e911";font-style:normal;font-size:36px;font-family:"Happy Icons";-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.ha-testimonial--left.ha-testimonial--bubble .ha-testimonial__content:after{left:15px}.ha-testimonial--center.ha-testimonial--bubble .ha-testimonial__content:after{left:50%;-webkit-transform:translateX(-50%) rotate(-180deg);-ms-transform:translateX(-50%) rotate(-180deg);transform:translateX(-50%) rotate(-180deg)}.ha-testimonial--right.ha-testimonial--bubble .ha-testimonial__content:after{right:15px}.ha-testimonial__reviewer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{width:65px;height:65px}.ha-testimonial__reviewer-thumb>img{width:100%;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover}.ha-testimonial__reviewer-name{margin-bottom:.3rem;color:#562dd4;font-weight:700;font-size:18px}.ha-testimonial__reviewer-title{color:#8c8c8c;font-size:16px}.ha-testimonial--left .ha-testimonial__reviewer-meta{padding-left:1em}.ha-testimonial--center .ha-testimonial__reviewer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-testimonial--center .ha-testimonial__reviewer-meta{padding-top:1em}.ha-testimonial--right .ha-testimonial__reviewer{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-testimonial--right .ha-testimonial__reviewer-meta{padding-right:1em}.ha-testimonial--left{text-align:left}.ha-testimonial--right{text-align:right}.ha-testimonial--center{text-align:center}
assets/js/happy-addons.js CHANGED
@@ -231,30 +231,62 @@ window.Happy = window.Happy || {};
231
  }
232
  });
233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  elementorFrontend.hooks.addAction(
235
  'frontend/element_ready/ha-image-compare.default',
236
  Happy.initImageComparison
237
  );
238
-
239
  elementorFrontend.hooks.addAction(
240
  'frontend/element_ready/ha-justified-gallery.default',
241
  Happy.initJustifiedGallery
242
  );
243
-
244
  elementorFrontend.hooks.addAction(
245
  'frontend/element_ready/ha-slider.default',
246
  function($scope) {
247
  elementorFrontend.elementsHandler.addHandler(Slick, {$element: $scope});
248
  }
249
  );
250
-
251
  elementorFrontend.hooks.addAction(
252
  'frontend/element_ready/ha-carousel.default',
253
  function($scope) {
254
  elementorFrontend.elementsHandler.addHandler(Slick, {$element: $scope});
255
  }
256
  );
257
-
 
 
 
 
 
 
 
258
  elementorFrontend.hooks.addAction(
259
  'frontend/element_ready/widget',
260
  function($scope) {
231
  }
232
  });
233
 
234
+ var NumberHandler = function($scope) {
235
+ elementorFrontend.waypoint($scope, function () {
236
+ var $number = $scope.find('.ha-number-text');
237
+ $number.numerator($number.data('animation'));
238
+ });
239
+ };
240
+
241
+ var SkillHandler = function($scope) {
242
+ elementorFrontend.waypoint($scope, function () {
243
+ $scope.find('.ha-skill-level').each(function() {
244
+ var $current = $(this),
245
+ $lt = $current.find('.ha-skill-level-text'),
246
+ lv = $current.data('level');
247
+
248
+ $current.animate({
249
+ width: lv+'%'
250
+ }, 500);
251
+ $lt.numerator({
252
+ toValue: lv + '%',
253
+ duration: 1300,
254
+ onComplete: function() {
255
+ $lt.append('%');
256
+ }
257
+ });
258
+ });
259
+ });
260
+ };
261
+
262
  elementorFrontend.hooks.addAction(
263
  'frontend/element_ready/ha-image-compare.default',
264
  Happy.initImageComparison
265
  );
 
266
  elementorFrontend.hooks.addAction(
267
  'frontend/element_ready/ha-justified-gallery.default',
268
  Happy.initJustifiedGallery
269
  );
 
270
  elementorFrontend.hooks.addAction(
271
  'frontend/element_ready/ha-slider.default',
272
  function($scope) {
273
  elementorFrontend.elementsHandler.addHandler(Slick, {$element: $scope});
274
  }
275
  );
 
276
  elementorFrontend.hooks.addAction(
277
  'frontend/element_ready/ha-carousel.default',
278
  function($scope) {
279
  elementorFrontend.elementsHandler.addHandler(Slick, {$element: $scope});
280
  }
281
  );
282
+ elementorFrontend.hooks.addAction(
283
+ 'frontend/element_ready/ha-number.default',
284
+ NumberHandler
285
+ );
286
+ elementorFrontend.hooks.addAction(
287
+ 'frontend/element_ready/ha-skills.default',
288
+ SkillHandler
289
+ );
290
  elementorFrontend.hooks.addAction(
291
  'frontend/element_ready/widget',
292
  function($scope) {
assets/js/happy-addons.min.js CHANGED
@@ -1 +1 @@
1
- "use strict";window.Happy=window.Happy||{},function(t,e,i){function n(e,i){var n=e.find(".hajs-gallery-filter");n.length&&n.on("click","button",function(e){e.stopPropagation();var n=t(this);n.parent().addClass("ha-filter-active").siblings().removeClass("ha-filter-active"),i(n.data("filter"))})}var s=t(i);t.fn.getHappySettings=function(){return this.data("happy-settings")},e.initImageComparison=function(t){var e=t.find(".hajs-image-comparison"),i=e.getHappySettings();i[{on_hover:"move_slider_on_hover",on_swipe:"move_with_handle_only",on_click:"click_to_move"}[i.move_handle||"on_swipe"]]=!0,delete i.move_handle,e.imagesLoaded().done(function(){e.twentytwenty(i)})},e.initJustifiedGallery=function(e){var i=e.find(".hajs-justified-gallery"),s=i.getHappySettings();i.justifiedGallery(t.extend({},{rowHeight:150,lastRow:"justify",margins:10},s)),n(e,function(t){i.justifiedGallery({lastRow:"*"===t?s.lastRow:"nojustify",filter:t})})},s.on("elementor/frontend/init",function(){var i=elementorModules.frontend.handlers.Base.extend({onInit:function(){elementorModules.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.$container=this.$element.find(".elementor-widget-container")[0],this.run()},getDefaultSettings:function(){return{targets:this.$container,loop:!0,direction:"alternate",easing:"easeInOutSine"}},onElementChange:function(){this.animation&&this.animation.restart(),this.run()},getConfig:function(t){return this.getElementSettings("ha_floating_fx_"+t)},run:function(){var t=this.getDefaultSettings();this.getConfig("translate_toggle")&&((this.getConfig("translate_x.size")||this.getConfig("translate_x.sizes.to"))&&(t.translateX={value:[this.getConfig("translate_x.sizes.from")||0,this.getConfig("translate_x.size")||this.getConfig("translate_x.sizes.to")],duration:this.getConfig("translate_duration.size"),delay:this.getConfig("translate_delay.size")||0}),(this.getConfig("translate_y.size")||this.getConfig("translate_y.sizes.to"))&&(t.translateY={value:[this.getConfig("translate_y.sizes.from")||0,this.getConfig("translate_y.size")||this.getConfig("translate_y.sizes.to")],duration:this.getConfig("translate_duration.size"),delay:this.getConfig("translate_delay.size")||0})),this.getConfig("rotate_toggle")&&((this.getConfig("rotate_x.size")||this.getConfig("rotate_x.sizes.to"))&&(t.rotateX={value:[this.getConfig("rotate_x.sizes.from")||0,this.getConfig("rotate_x.size")||this.getConfig("rotate_x.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0}),(this.getConfig("rotate_y.size")||this.getConfig("rotate_y.sizes.to"))&&(t.rotateY={value:[this.getConfig("rotate_y.sizes.from")||0,this.getConfig("rotate_y.size")||this.getConfig("rotate_y.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0}),(this.getConfig("rotate_z.size")||this.getConfig("rotate_z.sizes.to"))&&(t.rotateZ={value:[this.getConfig("rotate_z.sizes.from")||0,this.getConfig("rotate_z.size")||this.getConfig("rotate_z.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0})),this.getConfig("scale_toggle")&&((this.getConfig("scale_x.size")||this.getConfig("scale_x.sizes.to"))&&(t.scaleX={value:[this.getConfig("scale_x.sizes.from")||0,this.getConfig("scale_x.size")||this.getConfig("scale_x.sizes.to")],duration:this.getConfig("scale_duration.size"),delay:this.getConfig("scale_delay.size")||0}),(this.getConfig("scale_y.size")||this.getConfig("scale_y.sizes.to"))&&(t.scaleY={value:[this.getConfig("scale_y.sizes.from")||0,this.getConfig("scale_y.size")||this.getConfig("scale_y.sizes.to")],duration:this.getConfig("scale_duration.size"),delay:this.getConfig("scale_delay.size")||0})),(this.getConfig("translate_toggle")||this.getConfig("rotate_toggle")||this.getConfig("scale_toggle"))&&(this.$container.style.setProperty("will-change","transform"),this.animation=anime(t))}}),n=elementorModules.frontend.handlers.Base.extend({onInit:function(){elementorModules.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 e={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":e.arrows=!0;break;case"dots":e.dots=!0;break;case"both":e.arrows=!0,e.dots=!0}return this.isCarousel()&&(e.slidesToShow=this.getElementSettings("slides_to_show")||3,e.responsive=[{breakpoint:elementorFrontend.config.breakpoints.lg,settings:{slidesToShow:this.getElementSettings("slides_to_show_tablet")||e.slidesToShow}},{breakpoint:elementorFrontend.config.breakpoints.md,settings:{slidesToShow:this.getElementSettings("slides_to_show_mobile")||this.getElementSettings("slides_to_show_tablet")||e.slidesToShow}}]),t.extend({},this.getDefaultSettings(),e)},run:function(){this.$container.slick(this.getReadySettings())}});elementorFrontend.hooks.addAction("frontend/element_ready/ha-image-compare.default",e.initImageComparison),elementorFrontend.hooks.addAction("frontend/element_ready/ha-justified-gallery.default",e.initJustifiedGallery),elementorFrontend.hooks.addAction("frontend/element_ready/ha-slider.default",function(t){elementorFrontend.elementsHandler.addHandler(n,{$element:t})}),elementorFrontend.hooks.addAction("frontend/element_ready/ha-carousel.default",function(t){elementorFrontend.elementsHandler.addHandler(n,{$element:t})}),elementorFrontend.hooks.addAction("frontend/element_ready/widget",function(t){elementorFrontend.elementsHandler.addHandler(i,{$element:t})})})}(jQuery,Happy,window);
1
+ "use strict";window.Happy=window.Happy||{},function(t,e,n){function i(e,n){var i=e.find(".hajs-gallery-filter");i.length&&i.on("click","button",function(e){e.stopPropagation();var i=t(this);i.parent().addClass("ha-filter-active").siblings().removeClass("ha-filter-active"),n(i.data("filter"))})}var s=t(n);t.fn.getHappySettings=function(){return this.data("happy-settings")},e.initImageComparison=function(t){var e=t.find(".hajs-image-comparison"),n=e.getHappySettings();n[{on_hover:"move_slider_on_hover",on_swipe:"move_with_handle_only",on_click:"click_to_move"}[n.move_handle||"on_swipe"]]=!0,delete n.move_handle,e.imagesLoaded().done(function(){e.twentytwenty(n)})},e.initJustifiedGallery=function(e){var n=e.find(".hajs-justified-gallery"),s=n.getHappySettings();n.justifiedGallery(t.extend({},{rowHeight:150,lastRow:"justify",margins:10},s)),i(e,function(t){n.justifiedGallery({lastRow:"*"===t?s.lastRow:"nojustify",filter:t})})},s.on("elementor/frontend/init",function(){var n=elementorModules.frontend.handlers.Base.extend({onInit:function(){elementorModules.frontend.handlers.Base.prototype.onInit.apply(this,arguments),this.$container=this.$element.find(".elementor-widget-container")[0],this.run()},getDefaultSettings:function(){return{targets:this.$container,loop:!0,direction:"alternate",easing:"easeInOutSine"}},onElementChange:function(){this.animation&&this.animation.restart(),this.run()},getConfig:function(t){return this.getElementSettings("ha_floating_fx_"+t)},run:function(){var t=this.getDefaultSettings();this.getConfig("translate_toggle")&&((this.getConfig("translate_x.size")||this.getConfig("translate_x.sizes.to"))&&(t.translateX={value:[this.getConfig("translate_x.sizes.from")||0,this.getConfig("translate_x.size")||this.getConfig("translate_x.sizes.to")],duration:this.getConfig("translate_duration.size"),delay:this.getConfig("translate_delay.size")||0}),(this.getConfig("translate_y.size")||this.getConfig("translate_y.sizes.to"))&&(t.translateY={value:[this.getConfig("translate_y.sizes.from")||0,this.getConfig("translate_y.size")||this.getConfig("translate_y.sizes.to")],duration:this.getConfig("translate_duration.size"),delay:this.getConfig("translate_delay.size")||0})),this.getConfig("rotate_toggle")&&((this.getConfig("rotate_x.size")||this.getConfig("rotate_x.sizes.to"))&&(t.rotateX={value:[this.getConfig("rotate_x.sizes.from")||0,this.getConfig("rotate_x.size")||this.getConfig("rotate_x.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0}),(this.getConfig("rotate_y.size")||this.getConfig("rotate_y.sizes.to"))&&(t.rotateY={value:[this.getConfig("rotate_y.sizes.from")||0,this.getConfig("rotate_y.size")||this.getConfig("rotate_y.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0}),(this.getConfig("rotate_z.size")||this.getConfig("rotate_z.sizes.to"))&&(t.rotateZ={value:[this.getConfig("rotate_z.sizes.from")||0,this.getConfig("rotate_z.size")||this.getConfig("rotate_z.sizes.to")],duration:this.getConfig("rotate_duration.size"),delay:this.getConfig("rotate_delay.size")||0})),this.getConfig("scale_toggle")&&((this.getConfig("scale_x.size")||this.getConfig("scale_x.sizes.to"))&&(t.scaleX={value:[this.getConfig("scale_x.sizes.from")||0,this.getConfig("scale_x.size")||this.getConfig("scale_x.sizes.to")],duration:this.getConfig("scale_duration.size"),delay:this.getConfig("scale_delay.size")||0}),(this.getConfig("scale_y.size")||this.getConfig("scale_y.sizes.to"))&&(t.scaleY={value:[this.getConfig("scale_y.sizes.from")||0,this.getConfig("scale_y.size")||this.getConfig("scale_y.sizes.to")],duration:this.getConfig("scale_duration.size"),delay:this.getConfig("scale_delay.size")||0})),(this.getConfig("translate_toggle")||this.getConfig("rotate_toggle")||this.getConfig("scale_toggle"))&&(this.$container.style.setProperty("will-change","transform"),this.animation=anime(t))}}),i=elementorModules.frontend.handlers.Base.extend({onInit:function(){elementorModules.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 e={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":e.arrows=!0;break;case"dots":e.dots=!0;break;case"both":e.arrows=!0,e.dots=!0}return this.isCarousel()&&(e.slidesToShow=this.getElementSettings("slides_to_show")||3,e.responsive=[{breakpoint:elementorFrontend.config.breakpoints.lg,settings:{slidesToShow:this.getElementSettings("slides_to_show_tablet")||e.slidesToShow}},{breakpoint:elementorFrontend.config.breakpoints.md,settings:{slidesToShow:this.getElementSettings("slides_to_show_mobile")||this.getElementSettings("slides_to_show_tablet")||e.slidesToShow}}]),t.extend({},this.getDefaultSettings(),e)},run:function(){this.$container.slick(this.getReadySettings())}}),s=function(t){elementorFrontend.waypoint(t,function(){var e=t.find(".ha-number-text");e.numerator(e.data("animation"))})},o=function(e){elementorFrontend.waypoint(e,function(){e.find(".ha-skill-level").each(function(){var e=t(this),n=e.find(".ha-skill-level-text"),i=e.data("level");e.animate({width:i+"%"},500),n.numerator({toValue:i+"%",duration:1300,onComplete:function(){n.append("%")}})})})};elementorFrontend.hooks.addAction("frontend/element_ready/ha-image-compare.default",e.initImageComparison),elementorFrontend.hooks.addAction("frontend/element_ready/ha-justified-gallery.default",e.initJustifiedGallery),elementorFrontend.hooks.addAction("frontend/element_ready/ha-slider.default",function(t){elementorFrontend.elementsHandler.addHandler(i,{$element:t})}),elementorFrontend.hooks.addAction("frontend/element_ready/ha-carousel.default",function(t){elementorFrontend.elementsHandler.addHandler(i,{$element:t})}),elementorFrontend.hooks.addAction("frontend/element_ready/ha-number.default",s),elementorFrontend.hooks.addAction("frontend/element_ready/ha-skills.default",o),elementorFrontend.hooks.addAction("frontend/element_ready/widget",function(t){elementorFrontend.elementsHandler.addHandler(n,{$element:t})})})}(jQuery,Happy,window);
base.php CHANGED
@@ -6,6 +6,7 @@
6
  */
7
  namespace Happy_Addons\Elementor;
8
 
 
9
  use Happy_Addons\Elementor\Manager\Assets;
10
  use Happy_Addons\Elementor\Manager\Widgets;
11
  use Happy_Addons\Elementor\Extension\Happy_Effects;
@@ -14,7 +15,7 @@ defined( 'ABSPATH' ) || die();
14
 
15
  class Base {
16
 
17
- const VERSION = '1.3.1';
18
 
19
  const MINIMUM_ELEMENTOR_VERSION = '2.5.0';
20
 
@@ -68,8 +69,13 @@ class Base {
68
  Widgets::init();
69
  Assets::init();
70
  Happy_Effects::init();
 
71
 
72
  $this->init_appsero_tracking();
 
 
 
 
73
  }
74
 
75
  /**
@@ -98,10 +104,15 @@ class Base {
98
  require( __DIR__ . '/classes/widget-manager.php' );
99
  require( __DIR__ . '/classes/asset-manager.php' );
100
  require( __DIR__ . '/classes/happy-effects.php' );
 
101
 
102
  if ( is_admin() ) {
103
  require( __DIR__ . '/classes/class.communicator.php' );
104
  }
 
 
 
 
105
  }
106
 
107
  /**
@@ -202,6 +213,7 @@ class Base {
202
  public function register_controls() {
203
  require( __DIR__ . '/controls/foreground.php' );
204
  $foreground = __NAMESPACE__ . '\Controls\Group_Control_Foreground';
 
205
  \Elementor\Plugin::instance()->controls_manager->add_group_control( $foreground::get_type(), new $foreground() );
206
  }
207
  }
6
  */
7
  namespace Happy_Addons\Elementor;
8
 
9
+ use Happy_Addons\Elementor\Assets\OnDemand_Loader;
10
  use Happy_Addons\Elementor\Manager\Assets;
11
  use Happy_Addons\Elementor\Manager\Widgets;
12
  use Happy_Addons\Elementor\Extension\Happy_Effects;
15
 
16
  class Base {
17
 
18
+ const VERSION = '1.4.0';
19
 
20
  const MINIMUM_ELEMENTOR_VERSION = '2.5.0';
21
 
69
  Widgets::init();
70
  Assets::init();
71
  Happy_Effects::init();
72
+ OnDemand_Loader::init();
73
 
74
  $this->init_appsero_tracking();
75
+
76
+ if ( is_user_logged_in() ) {
77
+ Admin_Bar::init();
78
+ }
79
  }
80
 
81
  /**
104
  require( __DIR__ . '/classes/widget-manager.php' );
105
  require( __DIR__ . '/classes/asset-manager.php' );
106
  require( __DIR__ . '/classes/happy-effects.php' );
107
+ require( __DIR__ . '/classes/class.ondemand-loader.php' );
108
 
109
  if ( is_admin() ) {
110
  require( __DIR__ . '/classes/class.communicator.php' );
111
  }
112
+
113
+ if ( is_user_logged_in() ) {
114
+ require( __DIR__ . '/classes/admin-bar.php' );
115
+ }
116
  }
117
 
118
  /**
213
  public function register_controls() {
214
  require( __DIR__ . '/controls/foreground.php' );
215
  $foreground = __NAMESPACE__ . '\Controls\Group_Control_Foreground';
216
+
217
  \Elementor\Plugin::instance()->controls_manager->add_group_control( $foreground::get_type(), new $foreground() );
218
  }
219
  }
base/widget-base.php CHANGED
@@ -125,4 +125,50 @@ abstract class Base extends Widget_Base {
125
  parent::render_edit_tools();
126
  }
127
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
  }
125
  parent::render_edit_tools();
126
  }
127
  }
128
+
129
+ /**
130
+ * Overriding the parent method
131
+ *
132
+ * Add inline editing attributes.
133
+ *
134
+ * Define specific area in the element to be editable inline. The element can have several areas, with this method
135
+ * you can set the area inside the element that can be edited inline. You can also define the type of toolbar the
136
+ * user will see, whether it will be a basic toolbar or an advanced one.
137
+ *
138
+ * Note: When you use wysiwyg control use the advanced toolbar, with textarea control use the basic toolbar. Text
139
+ * control should not have toolbar.
140
+ *
141
+ * PHP usage (inside `Widget_Base::render()` method):
142
+ *
143
+ * $this->add_inline_editing_attributes( 'text', 'advanced' );
144
+ * echo '<div ' . $this->get_render_attribute_string( 'text' ) . '>' . $this->get_settings( 'text' ) . '</div>';
145
+ *
146
+ * @since 1.8.0
147
+ * @access protected
148
+ *
149
+ * @param string $key Element key.
150
+ * @param string $toolbar Optional. Toolbar type. Accepted values are `advanced`, `basic` or `none`. Default is
151
+ * `basic`.
152
+ * @param string $setting_key Additional settings key in case $key != $setting_key
153
+ */
154
+ protected function add_inline_editing_attributes( $key, $toolbar = 'basic', $setting_key = '' ) {
155
+ if ( ! \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
156
+ return;
157
+ }
158
+
159
+ if ( empty( $setting_key ) ) {
160
+ $setting_key = $key;
161
+ }
162
+
163
+ $this->add_render_attribute( $key, [
164
+ 'class' => 'elementor-inline-editing',
165
+ 'data-elementor-setting-key' => $setting_key,
166
+ ] );
167
+
168
+ if ( 'basic' !== $toolbar ) {
169
+ $this->add_render_attribute( $key, [
170
+ 'data-elementor-inline-editing-toolbar' => $toolbar,
171
+ ] );
172
+ }
173
+ }
174
  }
classes/admin-bar.php ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace Happy_Addons\Elementor;
3
+
4
+ use Happy_Addons\Elementor\Assets\OnDemand_Loader;
5
+
6
+ defined( 'ABSPATH' ) || die();
7
+
8
+ class Admin_Bar {
9
+
10
+ public static function init() {
11
+ add_action( 'admin_bar_menu', [__CLASS__, 'add_toolbar_items'], 500 );
12
+ add_action( 'wp_enqueue_scripts', [__CLASS__, 'enqueue_assets'] );
13
+ add_action( 'admin_enqueue_scripts', [__CLASS__, 'enqueue_assets'] );
14
+ add_action( 'wp_ajax_ha_clear_cache', [__CLASS__, 'clear_cache' ] );
15
+ }
16
+
17
+ public static function clear_cache() {
18
+ if ( ! current_user_can( 'manage_options' ) ) {
19
+ return;
20
+ }
21
+
22
+ if ( ! check_ajax_referer( 'ha_clear_cache', 'nonce' ) ) {
23
+ wp_send_json_error();
24
+ }
25
+ $type = isset( $_POST['type'] ) ? $_POST['type'] : '';
26
+
27
+ if ( $type === 'page' ) {
28
+ $post_id = isset( $_POST['post_id'] ) ? $_POST['post_id'] : 0;
29
+ OnDemand_Loader::clean_only_cache( $post_id );
30
+ } elseif ( $type === 'all' ) {
31
+ OnDemand_Loader::clean_all_cache();
32
+ }
33
+ wp_send_json_success();
34
+ }
35
+
36
+ public static function enqueue_assets() {
37
+ if ( ! current_user_can( 'manage_options' ) ) {
38
+ return;
39
+ }
40
+
41
+ wp_enqueue_style(
42
+ 'happy-admin-bar',
43
+ HAPPY_ASSETS . 'admin/css/admin-bar.css',
44
+ null,
45
+ Base::VERSION
46
+ );
47
+
48
+ wp_enqueue_script(
49
+ 'happy-admin-bar',
50
+ HAPPY_ASSETS . 'admin/js/admin-bar.js',
51
+ ['jquery'],
52
+ Base::VERSION,
53
+ true
54
+ );
55
+
56
+ wp_localize_script(
57
+ 'happy-admin-bar',
58
+ 'HappyAdmin',
59
+ [
60
+ 'nonce' => wp_create_nonce( 'ha_clear_cache' ),
61
+ 'post_id' => get_queried_object_id(),
62
+ 'ajax_url' => admin_url( 'admin-ajax.php' ),
63
+ ]
64
+ );
65
+ }
66
+
67
+ public static function add_toolbar_items( $admin_bar ) {
68
+ if ( ! current_user_can( 'manage_options' ) ) {
69
+ return;
70
+ }
71
+
72
+ $admin_bar->add_menu( array(
73
+ 'id' => 'happy-addons',
74
+ 'title' => __( 'HappyAddons', 'happy-elementor-addons' ),
75
+ 'href' => '#',
76
+ ) );
77
+
78
+ if ( is_singular() ) {
79
+ $admin_bar->add_menu( array(
80
+ 'id' => 'ha-clear-page-cache',
81
+ 'parent' => 'happy-addons',
82
+ 'title' => '<i class="dashicons dashicons-update-alt"></i> ' . __( 'Clear Page Cache', 'happy-elementor-addons' ),
83
+ 'href' => '#',
84
+ 'meta' => [
85
+ 'class' => 'hajs-clear-cache ha-clear-page-cache',
86
+ ]
87
+ ) );
88
+ }
89
+
90
+ $admin_bar->add_menu( array(
91
+ 'id' => 'ha-clear-all-cache',
92
+ 'parent' => 'happy-addons',
93
+ 'title' => '<i class="dashicons dashicons-update-alt"></i> ' . __( 'Clear All Cache', 'happy-elementor-addons' ),
94
+ 'href' => '#',
95
+ 'meta' => [
96
+ 'class' => 'hajs-clear-cache ha-clear-all-cache',
97
+ ]
98
+ ) );
99
+ }
100
+ }
classes/asset-manager.php CHANGED
@@ -1,6 +1,8 @@
1
  <?php
 
2
  namespace Happy_Addons\Elementor\Manager;
3
 
 
4
  use Happy_Addons\Elementor\Base;
5
 
6
  defined( 'ABSPATH' ) || die();
@@ -12,26 +14,24 @@ class Assets {
12
  */
13
  public static function init() {
14
  // Frontend scripts
15
- add_action( 'elementor/frontend/after_enqueue_scripts', [__CLASS__, 'enqueue_frontend_scripts'] );
 
16
 
17
  // Edit and preview enqueue
18
- add_action( 'elementor/preview/enqueue_styles', [__CLASS__, 'enqueue_preview_style'] );
19
 
20
- add_action( 'elementor/editor/before_enqueue_scripts', [__CLASS__, 'enqueue_editor_scripts'] );
21
 
22
  // Placeholder image replacement
23
- add_filter( 'elementor/utils/get_placeholder_image_src', [__CLASS__, 'set_placeholder_image'] );
24
  }
25
 
26
  public static function set_placeholder_image() {
27
  return HAPPY_ASSETS . 'imgs/placeholder.jpg';
28
  }
29
 
30
- /**
31
- * Enqueue frontend scripts
32
- */
33
- public static function enqueue_frontend_scripts() {
34
- $suffix = ha_is_script_debug_enabled() ? '.' : '.';
35
 
36
  wp_enqueue_style(
37
  'happy-icon',
@@ -40,75 +40,79 @@ class Assets {
40
  Base::VERSION
41
  );
42
 
43
- wp_enqueue_style(
 
 
 
44
  'twentytwenty',
45
  HAPPY_ASSETS . 'vendor/twentytwenty/css/twentytwenty.css',
46
  null,
47
  Base::VERSION
48
  );
49
 
50
- wp_enqueue_style(
51
- 'justifiedGallery',
52
- HAPPY_ASSETS . 'vendor/justifiedGallery/css/justifiedGallery.min.css',
53
- null,
54
- Base::VERSION
55
- );
56
-
57
- wp_enqueue_style(
58
- 'slick',
59
- HAPPY_ASSETS . 'vendor/slick/slick.css',
60
- null,
61
- Base::VERSION
62
- );
63
-
64
- wp_enqueue_style(
65
- 'slick-theme',
66
- HAPPY_ASSETS . 'vendor/slick/slick-theme.css',
67
- null,
68
- Base::VERSION
69
- );
70
-
71
- wp_enqueue_style(
72
- 'happy-elementor-addons',
73
- HAPPY_ASSETS . 'css/main' . $suffix . 'css',
74
- ['elementor-frontend'],
75
- Base::VERSION
76
- );
77
-
78
- // Scripts
79
- wp_enqueue_script(
80
  'jquery-event-move',
81
  HAPPY_ASSETS . 'vendor/twentytwenty/js/jquery.event.move.js',
82
- ['jquery'],
83
  Base::VERSION,
84
  true
85
  );
86
 
87
- wp_enqueue_script(
88
  'jquery-twentytwenty',
89
  HAPPY_ASSETS . 'vendor/twentytwenty/js/jquery.twentytwenty.js',
90
- ['jquery-event-move'],
91
  Base::VERSION,
92
  true
93
  );
94
 
95
- wp_enqueue_script(
 
 
 
 
 
 
 
 
 
 
96
  'jquery-justifiedGallery',
97
  HAPPY_ASSETS . 'vendor/justifiedGallery/js/jquery.justifiedGallery.min.js',
98
- ['jquery'],
99
  Base::VERSION,
100
  true
101
  );
102
 
103
- wp_enqueue_script(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  'jquery-slick',
105
  HAPPY_ASSETS . 'vendor/slick/slick' . $suffix . 'js',
106
- ['jquery'],
107
  Base::VERSION,
108
  true
109
  );
110
 
111
- wp_enqueue_script(
 
 
 
112
  'anime',
113
  HAPPY_ASSETS . 'vendor/anime/lib/anime.min.js',
114
  null,
@@ -116,10 +120,63 @@ class Assets {
116
  true
117
  );
118
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  wp_enqueue_script(
120
  'happy-elementor-addons',
121
  HAPPY_ASSETS . 'js/happy-addons' . $suffix . 'js',
122
- ['imagesloaded', 'jquery-slick', 'jquery'],
123
  Base::VERSION,
124
  true
125
  );
@@ -143,11 +200,11 @@ class Assets {
143
  wp_enqueue_script(
144
  'happy-elementor-addons-admin',
145
  HAPPY_ASSETS . 'admin/js/happy-addons.min.js',
146
- ['elementor-editor'],
147
  Base::VERSION,
148
  true
149
- );
150
- }
151
 
152
  public static function enqueue_preview_style() {
153
  if ( class_exists( 'WeForms' ) ) {
@@ -166,7 +223,7 @@ class Assets {
166
  null,
167
  Base::VERSION
168
  );
169
- }
170
 
171
  if ( class_exists( 'Caldera_Forms' ) ) {
172
  wp_enqueue_style(
1
  <?php
2
+
3
  namespace Happy_Addons\Elementor\Manager;
4
 
5
+ use Happy_Addons\Elementor\Assets\OnDemand_Loader;
6
  use Happy_Addons\Elementor\Base;
7
 
8
  defined( 'ABSPATH' ) || die();
14
  */
15
  public static function init() {
16
  // Frontend scripts
17
+ add_action( 'wp_enqueue_scripts', [ __CLASS__, 'enqueue_3rd_party_dependencies' ] );
18
+ add_action( 'wp_enqueue_scripts', [ __CLASS__, 'enqueue_self_dependencies' ], 99 );
19
 
20
  // Edit and preview enqueue
21
+ add_action( 'elementor/preview/enqueue_styles', [ __CLASS__, 'enqueue_preview_style' ] );
22
 
23
+ add_action( 'elementor/editor/before_enqueue_scripts', [ __CLASS__, 'enqueue_editor_scripts' ] );
24
 
25
  // Placeholder image replacement
26
+ add_filter( 'elementor/utils/get_placeholder_image_src', [ __CLASS__, 'set_placeholder_image' ] );
27
  }
28
 
29
  public static function set_placeholder_image() {
30
  return HAPPY_ASSETS . 'imgs/placeholder.jpg';
31
  }
32
 
33
+ public static function enqueue_3rd_party_dependencies() {
34
+ $suffix = ha_is_script_debug_enabled() ? '.' : '.min.';
 
 
 
35
 
36
  wp_enqueue_style(
37
  'happy-icon',
40
  Base::VERSION
41
  );
42
 
43
+ /**
44
+ * Image comparasion
45
+ */
46
+ wp_register_style(
47
  'twentytwenty',
48
  HAPPY_ASSETS . 'vendor/twentytwenty/css/twentytwenty.css',
49
  null,
50
  Base::VERSION
51
  );
52
 
53
+ wp_register_script(
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
54
  'jquery-event-move',
55
  HAPPY_ASSETS . 'vendor/twentytwenty/js/jquery.event.move.js',
56
+ [ 'jquery' ],
57
  Base::VERSION,
58
  true
59
  );
60
 
61
+ wp_register_script(
62
  'jquery-twentytwenty',
63
  HAPPY_ASSETS . 'vendor/twentytwenty/js/jquery.twentytwenty.js',
64
+ [ 'jquery-event-move' ],
65
  Base::VERSION,
66
  true
67
  );
68
 
69
+ /**
70
+ * Justified Grid
71
+ */
72
+ wp_register_style(
73
+ 'justifiedGallery',
74
+ HAPPY_ASSETS . 'vendor/justifiedGallery/css/justifiedGallery.min.css',
75
+ null,
76
+ Base::VERSION
77
+ );
78
+
79
+ wp_register_script(
80
  'jquery-justifiedGallery',
81
  HAPPY_ASSETS . 'vendor/justifiedGallery/js/jquery.justifiedGallery.min.js',
82
+ [ 'jquery' ],
83
  Base::VERSION,
84
  true
85
  );
86
 
87
+ /**
88
+ * Carousel and Slider
89
+ */
90
+ wp_register_style(
91
+ 'slick',
92
+ HAPPY_ASSETS . 'vendor/slick/slick.css',
93
+ null,
94
+ Base::VERSION
95
+ );
96
+
97
+ wp_register_style(
98
+ 'slick-theme',
99
+ HAPPY_ASSETS . 'vendor/slick/slick-theme.css',
100
+ null,
101
+ Base::VERSION
102
+ );
103
+
104
+ wp_register_script(
105
  'jquery-slick',
106
  HAPPY_ASSETS . 'vendor/slick/slick' . $suffix . 'js',
107
+ [ 'jquery' ],
108
  Base::VERSION,
109
  true
110
  );
111
 
112
+ /**
113
+ * Floating effects
114
+ */
115
+ wp_register_script(
116
  'anime',
117
  HAPPY_ASSETS . 'vendor/anime/lib/anime.min.js',
118
  null,
120
  true
121
  );
122
 
123
+ // Load used libraries only on frontend
124
+ if ( ha_should_load_used_library_only() ) {
125
+ OnDemand_Loader::load_used_libraries();
126
+ } else {
127
+ wp_enqueue_style( 'twentytwenty' );
128
+ wp_enqueue_script( 'jquery-event-move' );
129
+ wp_enqueue_script( 'jquery-twentytwenty' );
130
+
131
+ wp_enqueue_style( 'justifiedGallery' );
132
+ wp_enqueue_script( 'jquery-justifiedGallery' );
133
+
134
+ wp_enqueue_style( 'slick' );
135
+ wp_enqueue_style( 'slick-theme' );
136
+ wp_enqueue_script( 'jquery-slick' );
137
+
138
+ wp_enqueue_script( 'elementor-waypoints' );
139
+ wp_enqueue_script( 'jquery-numerator' );
140
+
141
+ wp_enqueue_script( 'anime' );
142
+ }
143
+ }
144
+
145
+ public static function enqueue_self_dependencies() {
146
+ $suffix = ha_is_script_debug_enabled() ? '.' : '.min.';
147
+
148
+ if ( ha_should_load_complied_assets() ) {
149
+ $compiled_asset = OnDemand_Loader::get_compiled_asset();
150
+
151
+ if ( $compiled_asset && $compiled_asset['url'] ) {
152
+ wp_enqueue_style(
153
+ 'happy-elementor-addons',
154
+ $compiled_asset['url'],
155
+ [ 'elementor-frontend' ],
156
+ $compiled_asset['version']
157
+ );
158
+ } else {
159
+ wp_enqueue_style(
160
+ 'happy-elementor-addons',
161
+ HAPPY_ASSETS . 'css/main' . $suffix . 'css',
162
+ [ 'elementor-frontend' ],
163
+ Base::VERSION
164
+ );
165
+ }
166
+ } else {
167
+ wp_enqueue_style(
168
+ 'happy-elementor-addons',
169
+ HAPPY_ASSETS . 'css/main' . $suffix . 'css',
170
+ [ 'elementor-frontend' ],
171
+ Base::VERSION
172
+ );
173
+ }
174
+
175
+ // Happy addons script
176
  wp_enqueue_script(
177
  'happy-elementor-addons',
178
  HAPPY_ASSETS . 'js/happy-addons' . $suffix . 'js',
179
+ [ 'elementor-frontend', 'imagesloaded', 'jquery' ],
180
  Base::VERSION,
181
  true
182
  );
200
  wp_enqueue_script(
201
  'happy-elementor-addons-admin',
202
  HAPPY_ASSETS . 'admin/js/happy-addons.min.js',
203
+ [ 'elementor-editor' ],
204
  Base::VERSION,
205
  true
206
+ );
207
+ }
208
 
209
  public static function enqueue_preview_style() {
210
  if ( class_exists( 'WeForms' ) ) {
223
  null,
224
  Base::VERSION
225
  );
226
+ }
227
 
228
  if ( class_exists( 'Caldera_Forms' ) ) {
229
  wp_enqueue_style(
classes/class.ondemand-loader.php ADDED
@@ -0,0 +1,246 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ namespace Happy_Addons\Elementor\Assets;
4
+
5
+ use Happy_Addons\Elementor\Base;
6
+ use Happy_Addons\Elementor\Manager\Widgets;
7
+
8
+ defined( 'ABSPATH' ) || die();
9
+
10
+ class OnDemand_Loader {
11
+
12
+ const DB_KEY = '_elementor_elements_usage';
13
+
14
+ private static $upload_path;
15
+
16
+ private static $upload_url;
17
+
18
+ private static $cache_dir;
19
+
20
+ private static $cache_dir_name;
21
+
22
+ private static $cache_url;
23
+
24
+ public static function init() {
25
+ $upload_dir = wp_upload_dir();
26
+ self::$upload_path = trailingslashit( $upload_dir['basedir'] );
27
+ self::$upload_url = trailingslashit( $upload_dir['baseurl'] );;
28
+
29
+ self::$cache_dir_name = trailingslashit( 'happyaddons/cache' );
30
+
31
+ self::$cache_dir = self::$upload_path . self::$cache_dir_name;
32
+ self::$cache_url = self::$upload_url . self::$cache_dir_name;
33
+
34
+ add_action( 'save_post', [__CLASS__, 'save_elements_usage'] );
35
+ }
36
+
37
+ /**
38
+ * Get used elements in a post
39
+ *
40
+ * @param $post_id
41
+ * @return array
42
+ */
43
+ public static function get_elements_usage( $post_id ) {
44
+ $usage = self::get_only_elements_usage( $post_id );
45
+ if ( ! $usage ) {
46
+ self::save_elements_usage( $post_id );
47
+ $usage = self::get_only_elements_usage( $post_id );
48
+ }
49
+ return $usage;
50
+ }
51
+
52
+ public static function get_only_elements_usage( $post_id ) {
53
+ $usage = get_post_meta( $post_id, self::DB_KEY, true );
54
+ return ( is_array( $usage ) ? $usage : [] );
55
+ }
56
+
57
+ /**
58
+ * Save used elements
59
+ *
60
+ * @param $post_id
61
+ * @return void
62
+ */
63
+ public static function save_elements_usage( $post_id ) {
64
+ /**
65
+ * Before version 2.6.5 elementor didn't store elements usage data
66
+ */
67
+ if ( version_compare( ELEMENTOR_VERSION, '2.6.5', '<=' ) || ! self::get_only_elements_usage( $post_id ) ) {
68
+ $usage = [];
69
+ //we need to populate _elementor_elements_usage;
70
+ $document = \Elementor\Plugin::$instance->documents->get( $post_id );
71
+ $data = $document ? $document->get_elements_data() : [];
72
+
73
+ \Elementor\Plugin::$instance->db->iterate_data( $data, function ( $element ) use ( & $usage ) {
74
+ if ( empty( $element['widgetType'] ) ) {
75
+ $type = $element['elType'];
76
+ } else {
77
+ $type = $element['widgetType'];
78
+ }
79
+
80
+ if ( ! isset( $usage[ $type ] ) ) {
81
+ $usage[ $type ] = 0;
82
+ }
83
+
84
+ $usage[ $type ] ++;
85
+
86
+ return $element;
87
+ } );
88
+
89
+ update_post_meta( $post_id, self::DB_KEY, $usage );
90
+ self::clean_only_cache( $post_id );
91
+ }
92
+ }
93
+
94
+ public static function get_supported_types() {
95
+ return get_option( 'elementor_cpt_support', ['post', 'page'] );
96
+ }
97
+
98
+ public static function get_compiled_asset() {
99
+ global $post;
100
+ if ( ! isset( $post ) || empty( $post ) ) {
101
+ return;
102
+ }
103
+
104
+ $filename = self::$cache_dir . "post-{$post->ID}.css";
105
+
106
+ if ( ! file_exists( $filename ) ) {
107
+ self::compile_assets( $post->ID );
108
+ }
109
+
110
+ if ( file_exists( $filename ) ) {
111
+ return [
112
+ 'url' => self::$cache_url . "post-{$post->ID}.css",
113
+ 'version' => Base::VERSION . '.' . get_post_modified_time( 'U', false, $post ),
114
+ ];
115
+ }
116
+
117
+ return [];
118
+ }
119
+
120
+ public static function get_self_elements_usage( $post_id ) {
121
+ return array_keys( array_filter( self::get_elements_usage( $post_id ), function( $widget_name ) {
122
+ return strpos( $widget_name, 'ha-' ) !== false;
123
+ }, ARRAY_FILTER_USE_KEY ) );
124
+ }
125
+
126
+ public static function compile_assets( $post_id ) {
127
+ if ( ! apply_filters( 'happyaddons_ondemand_asset_compiling', true ) ) {
128
+ return;
129
+ }
130
+
131
+ if ( ! in_array( get_post_type( $post_id ), self::get_supported_types() ) ) {
132
+ return;
133
+ }
134
+
135
+ $filename = self::$cache_dir . "post-{$post_id}.css";
136
+ $widgets = self::get_self_elements_usage( $post_id );
137
+
138
+ if ( $widgets && is_array( $widgets ) ) {
139
+ $widgets_map = Widgets::get_widgets_map();
140
+ $base_widget = isset( $widgets_map[ Widgets::get_base_widget_key() ] ) ? $widgets_map[ Widgets::get_base_widget_key() ] : [];
141
+ $data = '';
142
+
143
+ if ( isset( $base_widget['css'] ) && is_array( $base_widget['css'] ) ) {
144
+ foreach ( $base_widget['css'] as $_file_name_prefix ) {
145
+ if ( file_exists( HAPPY_DIR_PATH . "assets/css/widgets/{$_file_name_prefix}.min.css" ) ) {
146
+ $data .= file_get_contents( HAPPY_DIR_PATH . "assets/css/widgets/{$_file_name_prefix}.min.css" );
147
+ };
148
+ }
149
+ }
150
+
151
+ foreach ( $widgets as $_widget ) {
152
+ $map_key = substr( $_widget, 3 );
153
+
154
+ if ( ! isset( $widgets_map[ $map_key ] ) ) {
155
+ continue;
156
+ }
157
+
158
+ if ( ! isset( $widgets_map[ $map_key ]['css'] ) ) {
159
+ continue;
160
+ }
161
+
162
+ foreach ( $widgets_map[ $map_key ]['css'] as $_file_name_prefix ) {
163
+ if ( file_exists( HAPPY_DIR_PATH . "assets/css/widgets/{$_file_name_prefix}.min.css" ) ) {
164
+ $data .= file_get_contents( HAPPY_DIR_PATH . "assets/css/widgets/{$_file_name_prefix}.min.css" );
165
+ };
166
+ }
167
+ }
168
+
169
+ if ( ! is_dir( self::$cache_dir ) ) {
170
+ @mkdir( self::$cache_dir, 0777, true );
171
+ }
172
+
173
+ file_put_contents( $filename, $data );
174
+ }
175
+ }
176
+
177
+ public static function load_used_libraries() {
178
+ global $post;
179
+ if ( ! isset( $post ) || empty( $post ) ) {
180
+ return;
181
+ }
182
+
183
+ $widgets_used = self::get_elements_usage( $post->ID );
184
+
185
+ if ( is_array( $widgets_used ) ) {
186
+ $widgets = Widgets::get_widgets_map();
187
+
188
+ foreach( $widgets as $widget => $data ) {
189
+ if ( ! isset( $data['vendor'] ) || ! is_array( $data['vendor'] ) ) {
190
+ continue;
191
+ }
192
+
193
+ // Handle common assets only
194
+ if ( Widgets::get_base_widget_key() === $widget ) {
195
+ if ( isset( $data['vendor']['css'] ) && is_array( $data['vendor']['css'] ) ) {
196
+ foreach ( $data['vendor']['css'] as $vendor_css_handle ) {
197
+ wp_enqueue_style( $vendor_css_handle );
198
+ }
199
+ }
200
+
201
+ if ( isset( $data['vendor']['js'] ) && is_array( $data['vendor']['js'] ) ) {
202
+ foreach ( $data['vendor']['js'] as $vendor_css_handle ) {
203
+ wp_enqueue_script( $vendor_css_handle );
204
+ }
205
+ }
206
+ continue;
207
+ }
208
+
209
+ // Handle widgets assets only
210
+ $widget_id = 'ha-' . $widget;
211
+
212
+ if ( ! array_key_exists( $widget_id, $widgets_used ) ) {
213
+ continue;
214
+ }
215
+
216
+ if ( is_array( $data['vendor']['css'] ) ) {
217
+ foreach ( $data['vendor']['css'] as $vendor_css_handle ) {
218
+ wp_enqueue_style( $vendor_css_handle );
219
+ }
220
+ }
221
+
222
+ if ( is_array( $data['vendor']['js'] ) ) {
223
+ foreach ( $data['vendor']['js'] as $vendor_css_handle ) {
224
+ wp_enqueue_script( $vendor_css_handle );
225
+ }
226
+ }
227
+ }
228
+ }
229
+ }
230
+
231
+ public static function clean_all_cache() {
232
+ $files = glob( self::$cache_dir . '/*' );
233
+ foreach( $files as $file ) {
234
+ if ( is_file( $file ) ) {
235
+ unlink( $file );
236
+ }
237
+ }
238
+ }
239
+
240
+ public static function clean_only_cache( $post_id ) {
241
+ $filename = self::$cache_dir . "post-{$post_id}.css";
242
+ if ( file_exists( $filename ) ) {
243
+ unlink( $filename );
244
+ }
245
+ }
246
+ }
classes/widget-manager.php CHANGED
@@ -2,6 +2,35 @@
2
  namespace Happy_Addons\Elementor\Manager;
3
 
4
  use Elementor\Plugin as Elementor;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
5
 
6
  defined( 'ABSPATH' ) || die();
7
 
@@ -13,6 +42,258 @@ class Widgets {
13
  add_action( 'elementor/widgets/widgets_registered', [__CLASS__, 'register'] );
14
  }
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  /**
17
  * Init Widgets
18
  *
@@ -25,41 +306,10 @@ class Widgets {
25
  public static function register() {
26
  require( HAPPY_DIR_PATH . 'base/widget-base.php' );
27
 
28
- $widgets = [
29
- 'infobox',
30
- 'card',
31
- 'cf7',
32
- 'icon-box',
33
- 'member',
34
- 'review',
35
- 'image-compare',
36
- 'justified-gallery',
37
- 'slider',
38
- 'carousel',
39
- 'skills',
40
- 'gradient-heading',
41
- 'wpform',
42
- 'ninjaform',
43
- 'calderaform',
44
- 'weform',
45
- 'logo-grid',
46
- 'dual-button',
47
- 'testimonial',
48
- 'number',
49
- ];
50
-
51
- foreach ( $widgets as $widget ) {
52
- $widget_file = HAPPY_DIR_PATH . 'widgets/' . $widget . '/widget.php';
53
-
54
- if ( ! is_readable( $widget_file ) ) {
55
- continue;
56
  }
57
-
58
- include( $widget_file );
59
-
60
- $class_name = str_replace( '-', '_', $widget );
61
- $class_name = 'Happy_Addons\Elementor\Widget\\' . $class_name;
62
- Elementor::instance()->widgets_manager->register_widget_type( new $class_name() );
63
  }
64
  }
65
  }
2
  namespace Happy_Addons\Elementor\Manager;
3
 
4
  use Elementor\Plugin as Elementor;
5
+ use Happy_Addons\Elementor\Widget\Card;
6
+ use Happy_Addons\Elementor\Widget\AdCard;
7
+ use Happy_Addons\Elementor\Widget\CalderaForm;
8
+ use Happy_Addons\Elementor\Widget\Calendly;
9
+ use Happy_Addons\Elementor\Widget\Carousel;
10
+ use Happy_Addons\Elementor\Widget\CF7;
11
+ use Happy_Addons\Elementor\Widget\Dual_Button;
12
+ use Happy_Addons\Elementor\Widget\Feature_List;
13
+ use Happy_Addons\Elementor\Widget\Flip_Box;
14
+ use Happy_Addons\Elementor\Widget\Google_Map;
15
+ use Happy_Addons\Elementor\Widget\Gradient_Heading;
16
+ use Happy_Addons\Elementor\Widget\Hover_Box;
17
+ use Happy_Addons\Elementor\Widget\Icon_Box;
18
+ use Happy_Addons\Elementor\Widget\Image_Compare;
19
+ use Happy_Addons\Elementor\Widget\Image_Grid;
20
+ use Happy_Addons\Elementor\Widget\InfoBox;
21
+ use Happy_Addons\Elementor\Widget\Justified_Gallery;
22
+ use Happy_Addons\Elementor\Widget\Logo_Grid;
23
+ use Happy_Addons\Elementor\Widget\Member;
24
+ use Happy_Addons\Elementor\Widget\NinjaForm;
25
+ use Happy_Addons\Elementor\Widget\Number;
26
+ use Happy_Addons\Elementor\Widget\Pricing_Table;
27
+ use Happy_Addons\Elementor\Widget\Review;
28
+ use Happy_Addons\Elementor\Widget\Skills;
29
+ use Happy_Addons\Elementor\Widget\Slider;
30
+ use Happy_Addons\Elementor\Widget\Step_Flow;
31
+ use Happy_Addons\Elementor\Widget\Testimonial;
32
+ use Happy_Addons\Elementor\Widget\WeForm;
33
+ use Happy_Addons\Elementor\Widget\WPForm;
34
 
35
  defined( 'ABSPATH' ) || die();
36
 
42
  add_action( 'elementor/widgets/widgets_registered', [__CLASS__, 'register'] );
43
  }
44
 
45
+ public static function get_widgets_map() {
46
+ $widgets_map = [
47
+ // This is base for happy addons
48
+ self::get_base_widget_key() => [
49
+ 'css' => ['common', 'btn'],
50
+ 'js' => [],
51
+ 'vendor' => [
52
+ 'js' => ['anime']
53
+ ]
54
+ ],
55
+
56
+ // All the widgets are listed below with respective map
57
+ 'infobox' => [
58
+ 'class' => InfoBox::class,
59
+ 'css' => ['infobox'],
60
+ 'js' => [],
61
+ 'vendor' => [
62
+ 'css' => [],
63
+ 'js' => [],
64
+ ],
65
+ ],
66
+ 'card' => [
67
+ 'class' => Card::class,
68
+ 'css' => ['card'],
69
+ 'js' => [],
70
+ 'vendor' => [
71
+ 'css' => [],
72
+ 'js' => [],
73
+ ],
74
+ ],
75
+ 'cf7' => [
76
+ 'class' => CF7::class,
77
+ 'css' => [],
78
+ 'js' => [],
79
+ 'vendor' => [
80
+ 'css' => [],
81
+ 'js' => [],
82
+ ],
83
+ ],
84
+ 'icon-box' => [
85
+ 'class' => Icon_Box::class,
86
+ 'css' => ['icon-box'],
87
+ 'js' => [],
88
+ 'vendor' => [
89
+ 'css' => [],
90
+ 'js' => [],
91
+ ],
92
+ ],
93
+ 'member' => [
94
+ 'class' => Member::class,
95
+ 'css' => ['member'],
96
+ 'js' => [],
97
+ 'vendor' => [
98
+ 'css' => [],
99
+ 'js' => [],
100
+ ],
101
+ ],
102
+ 'review' => [
103
+ 'class' => Review::class,
104
+ 'css' => ['review'],
105
+ 'js' => [],
106
+ 'vendor' => [
107
+ 'css' => [],
108
+ 'js' => [],
109
+ ],
110
+ ],
111
+ 'image-compare' => [
112
+ 'class' => Image_Compare::class,
113
+ 'css' => ['image-comparison'],
114
+ 'js' => [],
115
+ 'vendor' => [
116
+ 'css' => ['twentytwenty'],
117
+ 'js' => ['jquery-event-move','jquery-twentytwenty'],
118
+ ],
119
+ ],
120
+ 'justified-gallery' => [
121
+ 'class' => Justified_Gallery::class,
122
+ 'css' => ['justified-gallery'],
123
+ 'js' => [],
124
+ 'vendor' => [
125
+ 'css' => ['justifiedGallery'],
126
+ 'js' => ['jquery-justifiedGallery'],
127
+ ],
128
+ ],
129
+ 'slider' => [
130
+ 'class' => Slider::class,
131
+ 'css' => ['slider-carousel'],
132
+ 'js' => [],
133
+ 'vendor' => [
134
+ 'css' => ['slick', 'slick-theme'],
135
+ 'js' => ['jquery-slick'],
136
+ ],
137
+ ],
138
+ 'carousel' => [
139
+ 'class' => Carousel::class,
140
+ 'css' => ['slider-carousel'],
141
+ 'js' => [],
142
+ 'vendor' => [
143
+ 'css' => ['slick', 'slick-theme'],
144
+ 'js' => ['jquery-slick'],
145
+ ],
146
+ ],
147
+ 'skills' => [
148
+ 'class' => Skills::class,
149
+ 'css' => ['skills'],
150
+ 'js' => [],
151
+ 'vendor' => [
152
+ 'css' => [],
153
+ 'js' => ['elementor-waypoints', 'jquery-numerator'],
154
+ ],
155
+ ],
156
+ 'gradient-heading' => [
157
+ 'class' => Gradient_Heading::class,
158
+ 'css' => ['gradient-heading'],
159
+ 'js' => [],
160
+ 'vendor' => [
161
+ 'css' => [],
162
+ 'js' => [],
163
+ ],
164
+ ],
165
+ 'wpform' => [
166
+ 'class' => WPForm::class,
167
+ 'css' => [],
168
+ 'js' => [],
169
+ 'vendor' => [
170
+ 'css' => [],
171
+ 'js' => [],
172
+ ],
173
+ ],
174
+ 'ninjaform' => [
175
+ 'class' => NinjaForm::class,
176
+ 'css' => [],
177
+ 'js' => [],
178
+ 'vendor' => [
179
+ 'css' => [],
180
+ 'js' => [],
181
+ ],
182
+ ],
183
+ 'calderaform' => [
184
+ 'class' => CalderaForm::class,
185
+ 'css' => [],
186
+ 'js' => [],
187
+ 'vendor' => [
188
+ 'css' => [],
189
+ 'js' => [],
190
+ ],
191
+ ],
192
+ 'weform' => [
193
+ 'class' => WeForm::class,
194
+ 'css' => [],
195
+ 'js' => [],
196
+ 'vendor' => [
197
+ 'css' => [],
198
+ 'js' => [],
199
+ ],
200
+ ],
201
+ 'logo-grid' => [
202
+ 'class' => Logo_Grid::class,
203
+ 'css' => ['logo-grid'],
204
+ 'js' => [],
205
+ 'vendor' => [
206
+ 'css' => [],
207
+ 'js' => [],
208
+ ],
209
+ ],
210
+ 'dual-button' => [
211
+ 'class' => Dual_Button::class,
212
+ 'css' => ['dual-btn'],
213
+ 'js' => [],
214
+ 'vendor' => [
215
+ 'css' => [],
216
+ 'js' => [],
217
+ ],
218
+ ],
219
+ 'testimonial' => [
220
+ 'class' => Testimonial::class,
221
+ 'css' => ['testimonial'],
222
+ 'js' => [],
223
+ 'vendor' => [
224
+ 'css' => [],
225
+ 'js' => [],
226
+ ],
227
+ ],
228
+ 'number' => [
229
+ 'class' => Number::class,
230
+ 'css' => ['number'],
231
+ 'js' => [],
232
+ 'vendor' => [
233
+ 'css' => [],
234
+ 'js' => ['elementor-waypoints', 'jquery-numerator'],
235
+ ],
236
+ ],
237
+ 'flip-box' => [
238
+ 'class' => Flip_Box::class,
239
+ 'css' => ['flip-box'],
240
+ 'js' => [],
241
+ 'vendor' => [
242
+ 'css' => [],
243
+ 'js' => [],
244
+ ],
245
+ ],
246
+ 'calendly' => [
247
+ 'class' => Calendly::class,
248
+ 'css' => [],
249
+ 'js' => [],
250
+ 'vendor' => [
251
+ 'css' => [],
252
+ 'js' => [],
253
+ ],
254
+ ],
255
+ 'pricing-table' => [
256
+ 'class' => Pricing_Table::class,
257
+ 'css' => ['pricing-table'],
258
+ 'js' => [],
259
+ 'vendor' => [
260
+ 'css' => [],
261
+ 'js' => [],
262
+ ],
263
+ ],
264
+ 'step-flow' => [
265
+ 'class' => Step_Flow::class,
266
+ 'css' => ['steps-flow'],
267
+ 'js' => [],
268
+ 'vendor' => [
269
+ 'css' => [],
270
+ 'js' => [],
271
+ ],
272
+ ],
273
+ ];
274
+
275
+ return apply_filters( 'happyaddons_widgets_map', $widgets_map );
276
+ }
277
+
278
+ /**
279
+ * Check widget file and include
280
+ *
281
+ * @param $widget
282
+ * @return bool
283
+ */
284
+ private static function is_registrable( $widget ) {
285
+ $widget_file = HAPPY_DIR_PATH . 'widgets/' . $widget . '/widget.php';
286
+ if ( $widget !== self::get_base_widget_key() && is_readable( $widget_file ) ) {
287
+ include( $widget_file );
288
+ return true;
289
+ }
290
+ return false;
291
+ }
292
+
293
+ public static function get_base_widget_key() {
294
+ return apply_filters( 'happyaddons_get_base_widget_key', '_happyaddons_base' );
295
+ }
296
+
297
  /**
298
  * Init Widgets
299
  *
306
  public static function register() {
307
  require( HAPPY_DIR_PATH . 'base/widget-base.php' );
308
 
309
+ foreach ( self::get_widgets_map() as $widget => $data ) {
310
+ if ( self::is_registrable( $widget ) && class_exists( $data['class'] ) ) {
311
+ Elementor::instance()->widgets_manager->register_widget_type( new $data['class'] );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
312
  }
 
 
 
 
 
 
313
  }
314
  }
315
  }
inc/functions.php CHANGED
@@ -322,3 +322,39 @@ function ha_get_css_cursors() {
322
  'none' => __( 'None', 'happy-elementor-addons' ),
323
  ];
324
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
322
  'none' => __( 'None', 'happy-elementor-addons' ),
323
  ];
324
  }
325
+
326
+ function ha_get_css_blend_modes() {
327
+ return [
328
+ 'normal' => __( 'Normal', 'happy-elementor-addons' ),
329
+ 'multiply' => __( 'Multiply', 'happy-elementor-addons' ),
330
+ 'screen' => __( 'Screen', 'happy-elementor-addons' ),
331
+ 'overlay' => __( 'Overlay', 'happy-elementor-addons' ),
332
+ 'darken' => __( 'Darken', 'happy-elementor-addons' ),
333
+ 'lighten' => __( 'Lighten', 'happy-elementor-addons' ),
334
+ 'color-dodge' => __( 'Color Dodge', 'happy-elementor-addons' ),
335
+ 'color-burn' => __( 'Color Burn', 'happy-elementor-addons' ),
336
+ 'saturation' => __( 'Saturation', 'happy-elementor-addons' ),
337
+ 'difference' => __( 'Difference', 'happy-elementor-addons' ),
338
+ 'exclusion' => __( 'Exclusion', 'happy-elementor-addons' ),
339
+ 'hue' => __( 'Hue', 'happy-elementor-addons' ),
340
+ 'color' => __( 'Color', 'happy-elementor-addons' ),
341
+ 'luminosity' => __( 'Luminosity', 'happy-elementor-addons' ),
342
+ ];
343
+ }
344
+
345
+ function ha_should_load_complied_assets() {
346
+ return (
347
+ apply_filters( 'happyaddons_ondemand_asset_compiling', true ) &&
348
+ ! \Elementor\Plugin::$instance->editor->is_edit_mode() &&
349
+ ! \Elementor\Plugin::$instance->preview->is_preview_mode() &&
350
+ ! is_preview()
351
+ );
352
+ }
353
+
354
+ function ha_should_load_used_library_only() {
355
+ return (
356
+ ! \Elementor\Plugin::$instance->editor->is_edit_mode() &&
357
+ ! \Elementor\Plugin::$instance->preview->is_preview_mode() &&
358
+ ! is_preview()
359
+ );
360
+ }
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: 1.3.1
7
  * Author: HappyMonster
8
  * Author URI: https://happyaddons.com/
9
  * License: GPLv2
3
  * Plugin Name: Happy Elementor Addons
4
  * Plugin URI: https://happyaddons.com/
5
  * Description: <a href="https://happyaddons.com/">HappyAddons</a> is a collection of slick, powerful widgets that works seamlessly with Elementor page builder. It’s trendy look with detail customization features allows to create extraordinary designs instantly. <a href="https://happyaddons.com/">HappyAddons</a> is free, rapidly growing and comes with great support.
6
+ * Version: 1.4.0
7
  * Author: HappyMonster
8
  * Author URI: https://happyaddons.com/
9
  * License: GPLv2
readme.txt CHANGED
@@ -1,6 +1,6 @@
1
  === Happy Elementor Addons ===
2
  Plugin Name: Happy Elementor Addons
3
- Version: 1.3.1
4
  Author: HappyMonster
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, mosaddek73, tareq1988, obiplabon, sourav926, wedevs
@@ -19,7 +19,7 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html
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
 
22
- ### Included 20 Free Widgets
23
 
24
  1. **[Card](https://happyaddons.com/elementor-card-widget-demo/)** - Incredibly powerful widget to demonstrate your products, articles, news, creative posts using a beautiful combination of texts, links, badge and image. Using built in positioning and offset feature you can create eye-candy designs in a twist. [Check demo](https://happyaddons.com/elementor-card-widget-demo/)
25
  2. **[Gradient Heading](https://happyaddons.com/elementor-gradient-heading-widget-demo/)** - Another gem to create eye candy headings for your websites. You can apply different gradient styles, angles, opacity, and positions to make them look even better across different device screens. [Check demo](https://happyaddons.com/elementor-gradient-heading-widget-demo/)
@@ -41,6 +41,10 @@ License URI: http://www.gnu.org/licenses/gpl-2.0.html
41
  18. **[Logo Grid](https://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://happyaddons.com/elementor-logo-grid-widget-demo)
42
  19. **[Carousel](https://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://happyaddons.com/elementor-carousel-widget-demo/)
43
  20. **[Slider](https://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://happyaddons.com/elementor-slider-widget-demo/)
 
 
 
 
44
 
45
  ### INCLUDED FREE EXTENSIONS FOR EVERY ELEMENTOR WIDGET
46
  **Happy Effects**
@@ -130,6 +134,19 @@ It's really easy and super simple to install **Happy Elementor Addons** plugin b
130
 
131
  == Changelog ==
132
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
  = 1.3.1 - 24 July 2019 =
134
 
135
  * Fix: Elementor 2.6.* version compatibility issue
1
  === Happy Elementor Addons ===
2
  Plugin Name: Happy Elementor Addons
3
+ Version: 1.4.0
4
  Author: HappyMonster
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, mosaddek73, tareq1988, obiplabon, sourav926, wedevs
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
 
22
+ ### Included 24 Free Widgets
23
 
24
  1. **[Card](https://happyaddons.com/elementor-card-widget-demo/)** - Incredibly powerful widget to demonstrate your products, articles, news, creative posts using a beautiful combination of texts, links, badge and image. Using built in positioning and offset feature you can create eye-candy designs in a twist. [Check demo](https://happyaddons.com/elementor-card-widget-demo/)
25
  2. **[Gradient Heading](https://happyaddons.com/elementor-gradient-heading-widget-demo/)** - Another gem to create eye candy headings for your websites. You can apply different gradient styles, angles, opacity, and positions to make them look even better across different device screens. [Check demo](https://happyaddons.com/elementor-gradient-heading-widget-demo/)
41
  18. **[Logo Grid](https://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://happyaddons.com/elementor-logo-grid-widget-demo)
42
  19. **[Carousel](https://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://happyaddons.com/elementor-carousel-widget-demo/)
43
  20. **[Slider](https://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://happyaddons.com/elementor-slider-widget-demo/)
44
+ 21. **[Step Flow](https://happyaddons.com/elementor-step-flow-widget-demo)**
45
+ 22. **[Calendly](https://happyaddons.com/elementor-calendly-widget-demo/)**
46
+ 23. **[Flip Box](https://happyaddons.com/elementor-flip-box-widget-demo/)**
47
+ 24. **Pricing Table**
48
 
49
  ### INCLUDED FREE EXTENSIONS FOR EVERY ELEMENTOR WIDGET
50
  **Happy Effects**
134
 
135
  == Changelog ==
136
 
137
+ = 1.4.0 - 1 August 2019 =
138
+
139
+ * New: On demand asset loading
140
+ * New: On demand cached asset cleaning
141
+ * New: Step Flow Widget
142
+ * New: Calendly Widget
143
+ * New: Flip Box Widget
144
+ * New: Pricing Table Widget
145
+ * Update: Added animated number support to Number Widget
146
+ * Update: Added progress animation to Skill Bars Widget
147
+ * Update: Various widgets default styles
148
+ * Fix: Various responsive issue
149
+
150
  = 1.3.1 - 24 July 2019 =
151
 
152
  * Fix: Elementor 2.6.* version compatibility issue
widgets/calendly/widget.php ADDED
@@ -0,0 +1,180 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Calendly widget class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+
8
+ namespace Happy_Addons\Elementor\Widget;
9
+
10
+ use Elementor\Controls_Manager;
11
+
12
+
13
+ defined( 'ABSPATH' ) || die();
14
+
15
+ class Calendly extends Base {
16
+
17
+ /**
18
+ * Get widget title.
19
+ *
20
+ * @return string Widget title.
21
+ * @since 1.0.0
22
+ * @access public
23
+ *
24
+ */
25
+ public function get_title() {
26
+ return __( 'Calendly', 'happy-elementor-addons' );
27
+ }
28
+
29
+ /**
30
+ * Get widget icon.
31
+ *
32
+ * @return string Widget icon.
33
+ * @since 1.0.0
34
+ * @access public
35
+ *
36
+ */
37
+ public function get_icon() {
38
+ return 'hm hm-calendar';
39
+ }
40
+
41
+ public function get_keywords() {
42
+ return [ 'info', 'blurb', 'box', 'text', 'content' ];
43
+ }
44
+
45
+ /**
46
+ * Register content related controls
47
+ */
48
+ protected function register_content_controls() {
49
+ $this->start_controls_section(
50
+ '_section_calendly',
51
+ [
52
+ 'label' => __( 'Calendly', 'happy-elementor-addons' ),
53
+ 'tab' => Controls_Manager::TAB_CONTENT,
54
+ ]
55
+ );
56
+
57
+ $this->add_control(
58
+ 'calendly_username',
59
+ [
60
+ 'label' => __( 'Username', 'happy-elementor-addons' ),
61
+ 'type' => Controls_Manager::TEXT,
62
+ 'default' => __( '', 'happy-elementor-addons' ),
63
+ 'placeholder' => __( 'Type calendly username here', 'happy-elementor-addons' ),
64
+ ]
65
+ );
66
+
67
+ $this->add_control(
68
+ 'calendly_time',
69
+ [
70
+ 'label' => __( 'Time Slot', 'happy-elementor-addons' ),
71
+ 'type' => Controls_Manager::SELECT,
72
+ 'options' => [
73
+ '15min' => __( '15 Minutes', 'happy-elementor-addons' ),
74
+ '30min' => __( '30 Minutes', 'happy-elementor-addons' ),
75
+ '60min' => __( '60 Minutes', 'happy-elementor-addons' ),
76
+ '' => __( 'All', 'happy-elementor-addons' ),
77
+ ],
78
+ 'default' => '15min'
79
+ ]
80
+ );
81
+
82
+ $this->add_control(
83
+ 'event_type_details',
84
+ [
85
+ 'label' => __( 'Hide Event Type Details', 'happy-elementor-addons' ),
86
+ 'type' => Controls_Manager::SWITCHER,
87
+ 'label_on' => __( 'yes', 'your-plugin' ),
88
+ 'label_off' => __( 'no', 'your-plugin' ),
89
+ 'return_value' => 'yes',
90
+ 'default' => '',
91
+ ]
92
+ );
93
+
94
+ $this->add_responsive_control(
95
+ 'height',
96
+ [
97
+ 'label' => __( 'Height', 'happy-elementor-addons' ),
98
+ 'type' => Controls_Manager::SLIDER,
99
+ 'size_units' => [ 'px', '%' ],
100
+ 'range' => [
101
+ 'px' => [
102
+ 'min' => 10,
103
+ 'max' => 1000,
104
+ 'step' => 5,
105
+ ],
106
+ '%' => [
107
+ 'min' => 5,
108
+ 'max' => 100,
109
+ ],
110
+ ],
111
+ 'default' => [
112
+ 'unit' => 'px',
113
+ 'size' => '630',
114
+ ],
115
+ 'selectors' => [
116
+ '{{WRAPPER}} .calendly-inline-widget' => 'height: {{SIZE}}{{UNIT}};',
117
+ '{{WRAPPER}} .calendly-wrapper' => 'height: {{SIZE}}{{UNIT}};',
118
+ ],
119
+ ]
120
+ );
121
+
122
+ $this->end_controls_section();
123
+ }
124
+
125
+ /**
126
+ * Register styles related controls
127
+ */
128
+ protected function register_style_controls() {
129
+ $this->start_controls_section(
130
+ '_section_style_calendly',
131
+ [
132
+ 'label' => __( 'Calendly', 'happy-elementor-addons' ),
133
+ 'tab' => Controls_Manager::TAB_STYLE,
134
+ ]
135
+ );
136
+
137
+ $this->add_control(
138
+ 'text_color',
139
+ [
140
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
141
+ 'type' => Controls_Manager::COLOR,
142
+ 'alpha' => false,
143
+ ]
144
+ );
145
+
146
+ $this->add_control(
147
+ 'button_link_color',
148
+ [
149
+ 'label' => __( 'Button & Link Color', 'happy-elementor-addons' ),
150
+ 'type' => Controls_Manager::COLOR,
151
+ ]
152
+ );
153
+
154
+ $this->add_control(
155
+ 'background_color',
156
+ [
157
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
158
+ 'type' => Controls_Manager::COLOR,
159
+ ]
160
+ );
161
+
162
+ $this->end_controls_section();
163
+ }
164
+
165
+ protected function render() {
166
+ $settings = $this->get_settings_for_display();
167
+ $calendly_time = $settings['calendly_time']!=''?"/{$settings['calendly_time']}":'';
168
+ ?>
169
+ <?php if ( $settings['calendly_username'] ): ?>
170
+ <div class="calendly-inline-widget"
171
+ data-url="https://calendly.com/<?php echo esc_attr( $settings['calendly_username'] ); ?><?php echo esc_attr( $calendly_time ); ?>/?<?php if ( 'yes' === $settings['event_type_details'] ): echo 'hide_event_type_details=1'; endif; ?><?php if ( $settings['text_color'] ): echo "&text_color=" . str_replace( '#', '', $settings['text_color'] ); endif; ?><?php if ( $settings['button_link_color'] ): echo "&primary_color=" . str_replace( '#', '', $settings['button_link_color'] ); endif; ?><?php if ( $settings['background_color'] ): echo "&background_color=" . str_replace( '#', '', $settings['background_color'] ); endif; ?>"
172
+ style="min-width:320px;"></div>
173
+ <script type="text/javascript" src="https://assets.calendly.com/assets/external/widget.js"></script>
174
+ <?php if ( \Elementor\Plugin::$instance->editor->is_edit_mode() ) : ?>
175
+ <div class="calendly-wrapper" style="width:100%; position:absolute; top:0; left:0; z-index:100;"></div>
176
+ <?php endif; ?>
177
+ <?php endif; ?>
178
+ <?php
179
+ }
180
+ }
widgets/flip-box/widget.php ADDED
@@ -0,0 +1,1181 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Flip Box widget class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+ namespace Happy_Addons\Elementor\Widget;
8
+
9
+ use Elementor\Control_Media;
10
+ use Elementor\Controls_Manager;
11
+ use Elementor\Group_Control_Background;
12
+ use Elementor\Group_Control_Border;
13
+ use Elementor\Group_Control_Box_Shadow;
14
+ use Elementor\Group_Control_Text_Shadow;
15
+ use Elementor\Group_Control_Image_Size;
16
+ use Elementor\Group_Control_Typography;
17
+ use Elementor\Scheme_Typography;
18
+ use Elementor\Utils;
19
+
20
+ defined( 'ABSPATH' ) || die();
21
+
22
+ class Flip_Box extends Base {
23
+ /**
24
+ * Get widget title.
25
+ *
26
+ * @since 1.0.0
27
+ * @access public
28
+ *
29
+ * @return string Widget title.
30
+ */
31
+ public function get_title() {
32
+ return __( 'Flip Box', 'happy-elementor-addons' );
33
+ }
34
+
35
+ /**
36
+ * Get widget icon.
37
+ *
38
+ * @since 1.0.0
39
+ * @access public
40
+ *
41
+ * @return string Widget icon.
42
+ */
43
+ public function get_icon() {
44
+ return 'hm hm-flip-card1';
45
+ }
46
+
47
+ public function get_keywords() {
48
+ return [ 'flip', 'box', 'flip', 'info', 'content', 'animation' ];
49
+ }
50
+
51
+ protected function register_content_controls() {
52
+ $this->start_controls_section(
53
+ '_section_front',
54
+ [
55
+ 'label' => __( 'Front Side', 'happy-elementor-addons' ),
56
+ 'tab' => Controls_Manager::TAB_CONTENT,
57
+ ]
58
+ );
59
+
60
+ $this->add_control(
61
+ 'front_icon_type',
62
+ [
63
+ 'label' => __( 'Media Type', 'happy-elementor-addons' ),
64
+ 'type' => Controls_Manager::CHOOSE,
65
+ 'label_block' => false,
66
+ 'default' => 'icon',
67
+ 'options' => [
68
+ 'none' => [
69
+ 'title' => __( 'None', 'happy-elementor-addons' ),
70
+ 'icon' => 'eicon-close',
71
+ ],
72
+ 'icon' => [
73
+ 'title' => __( 'Icon', 'happy-elementor-addons' ),
74
+ 'icon' => 'eicon-star',
75
+ ],
76
+ 'image' => [
77
+ 'title' => __( 'Image', 'happy-elementor-addons' ),
78
+ 'icon' => 'eicon-image',
79
+ ],
80
+ ],
81
+ 'toggle' => false,
82
+ ]
83
+ );
84
+
85
+ $this->add_control(
86
+ 'front_icon',
87
+ [
88
+ 'label' => __( 'Icon', 'happy-elementor-addons' ),
89
+ 'type' => Controls_Manager::ICON,
90
+ 'default' => 'fa fa-home',
91
+ 'condition' => [
92
+ 'front_icon_type' => 'icon'
93
+ ],
94
+ 'options' => ha_get_happy_icons(),
95
+ ]
96
+ );
97
+
98
+ $this->add_control(
99
+ 'front_icon_image',
100
+ [
101
+ 'label' => __( 'Image', 'happy-elementor-addons' ),
102
+ 'type' => Controls_Manager::MEDIA,
103
+ 'default' => [
104
+ 'url' => Utils::get_placeholder_image_src(),
105
+ ],
106
+ 'condition' => [
107
+ 'front_icon_type' => 'image'
108
+ ]
109
+ ]
110
+ );
111
+
112
+ $this->add_group_control(
113
+ Group_Control_Image_Size::get_type(),
114
+ [
115
+ 'name' => 'front_icon_thumbnail',
116
+ 'default' => 'thumbnail',
117
+ 'exclude' => [
118
+ 'full',
119
+ 'shop_catalog',
120
+ 'shop_single',
121
+ ],
122
+ 'condition' => [
123
+ 'front_icon_type' => 'image'
124
+ ]
125
+ ]
126
+ );
127
+
128
+ $this->add_control(
129
+ 'front_title',
130
+ [
131
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
132
+ 'label_block' => true,
133
+ 'separator' => 'before',
134
+ 'type' => Controls_Manager::TEXT,
135
+ 'default' => __( 'Start Marketing', 'happy-elementor-addons' ),
136
+ 'placeholder' => __( 'Type Flip Box Title', 'happy-elementor-addons' ),
137
+ ]
138
+ );
139
+
140
+ $this->add_control(
141
+ 'front_description',
142
+ [
143
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
144
+ 'label_block' => true,
145
+ 'type' => Controls_Manager::TEXTAREA,
146
+ 'default' => __( 'consectetur adipiscing elit, sed do<br>eiusmod Lorem ipsum dolor sit amet,<br> consectetur.', 'happy-elementor-addons' ),
147
+ 'placeholder' => __( 'Description', 'happy-elementor-addons' ),
148
+ ]
149
+ );
150
+
151
+ $this->add_control(
152
+ 'front_text_align',
153
+ [
154
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
155
+ 'type' => Controls_Manager::CHOOSE,
156
+ 'options' => [
157
+ 'left' => [
158
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
159
+ 'icon' => 'fa fa-align-left',
160
+ ],
161
+ 'center' => [
162
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
163
+ 'icon' => 'fa fa-align-center',
164
+ ],
165
+ 'right' => [
166
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
167
+ 'icon' => 'fa fa-align-right',
168
+ ],
169
+ ],
170
+ 'selectors' => [
171
+ '{{WRAPPER}} .ha-flip-box-front-inner .icon-wrap' => 'text-align: {{VALUE}};',
172
+ '{{WRAPPER}} .ha-flip-box-front-inner .ha-text' => 'text-align: {{VALUE}};'
173
+ ]
174
+ ]
175
+ );
176
+
177
+ $this->end_controls_section();
178
+
179
+ $this->start_controls_section(
180
+ '_section_back',
181
+ [
182
+ 'label' => __( 'Back Side', 'happy-elementor-addons' ),
183
+ 'tab' => Controls_Manager::TAB_CONTENT,
184
+ ]
185
+ );
186
+
187
+ $this->add_control(
188
+ 'back_icon_type',
189
+ [
190
+ 'label' => __( 'Media Type', 'happy-elementor-addons' ),
191
+ 'type' => Controls_Manager::CHOOSE,
192
+ 'label_block' => false,
193
+ 'default' => 'none',
194
+ 'options' => [
195
+ 'none' => [
196
+ 'title' => __( 'None', 'happy-elementor-addons' ),
197
+ 'icon' => 'eicon-close',
198
+ ],
199
+ 'icon' => [
200
+ 'title' => __( 'Icon', 'happy-elementor-addons' ),
201
+ 'icon' => 'eicon-star',
202
+ ],
203
+ 'image' => [
204
+ 'title' => __( 'Image', 'happy-elementor-addons' ),
205
+ 'icon' => 'eicon-image',
206
+ ],
207
+ ],
208
+ 'toggle' => false,
209
+ ]
210
+ );
211
+
212
+ $this->add_control(
213
+ 'back_icon_image',
214
+ [
215
+ 'label' => __( 'Image', 'happy-elementor-addons' ),
216
+ 'type' => Controls_Manager::MEDIA,
217
+ 'default' => [
218
+ 'url' => Utils::get_placeholder_image_src(),
219
+ ],
220
+ 'condition' => [
221
+ 'back_icon_type' => 'image'
222
+ ]
223
+ ]
224
+ );
225
+
226
+ $this->add_group_control(
227
+ Group_Control_Image_Size::get_type(),
228
+ [
229
+ 'name' => 'back_icon_thumbnail',
230
+ 'default' => 'thumbnail',
231
+ 'exclude' => [
232
+ 'full',
233
+ 'shop_catalog',
234
+ 'shop_single',
235
+ ],
236
+ 'condition' => [
237
+ 'back_icon_type' => 'image'
238
+ ]
239
+ ]
240
+ );
241
+
242
+ $this->add_control(
243
+ 'back_icon',
244
+ [
245
+ 'label' => __( 'Icon', 'happy-elementor-addons' ),
246
+ 'type' => Controls_Manager::ICON,
247
+ 'return_value' => 'yes',
248
+ 'condition' => [
249
+ 'back_icon_type' => 'icon',
250
+ ],
251
+ 'options' => ha_get_happy_icons(),
252
+ ]
253
+ );
254
+
255
+ $this->add_control(
256
+ 'back_title',
257
+ [
258
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
259
+ 'label_block' => true,
260
+ 'separator' => 'before',
261
+ 'type' => Controls_Manager::TEXT,
262
+ 'default' => __( 'Start Marketing', 'happy-elementor-addons' ),
263
+ 'placeholder' => __( 'Type Flip Box Title', 'happy-elementor-addons' ),
264
+ ]
265
+ );
266
+
267
+ $this->add_control(
268
+ 'back_description',
269
+ [
270
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
271
+ 'label_block' => true,
272
+ 'type' => Controls_Manager::TEXTAREA,
273
+ 'default' => __( 'consectetur adipiscing elit, sed do<br>eiusmod Lorem ipsum dolor sit amet.', 'happy-elementor-addons' ),
274
+ 'placeholder' => __( 'Description', 'happy-elementor-addons' ),
275
+ ]
276
+ );
277
+
278
+ $this->add_control(
279
+ 'back_text_align',
280
+ [
281
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
282
+ 'type' => Controls_Manager::CHOOSE,
283
+ 'options' => [
284
+ 'left' => [
285
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
286
+ 'icon' => 'fa fa-align-left',
287
+ ],
288
+ 'center' => [
289
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
290
+ 'icon' => 'fa fa-align-center',
291
+ ],
292
+ 'right' => [
293
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
294
+ 'icon' => 'fa fa-align-right',
295
+ ],
296
+ ],
297
+ 'selectors' => [
298
+ '{{WRAPPER}} .ha-flip-box-back-inner .icon-wrap' => 'text-align: {{VALUE}}',
299
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-text' => 'text-align: {{VALUE}}',
300
+ '{{WRAPPER}} .ha-flip-box-back-inner .button-wrap' => 'text-align: {{VALUE}}',
301
+ ]
302
+ ]
303
+ );
304
+
305
+ $this->end_controls_section();
306
+
307
+ $this->start_controls_section(
308
+ '_section_settings',
309
+ [
310
+ 'label' => __( 'Settings', 'happy-elementor-addons' ),
311
+ 'tab' => Controls_Manager::TAB_CONTENT,
312
+ ]
313
+ );
314
+
315
+ $this->add_control(
316
+ 'flip_position',
317
+ [
318
+ 'label' => __( 'Flip Direction', 'happy-elementor-addons' ),
319
+ 'type' => Controls_Manager::CHOOSE,
320
+ 'default' => 'right',
321
+ 'label_block' => false,
322
+ 'options' => [
323
+ 'up' => [
324
+ 'title' => __( 'Bottom To Top', 'happy-elementor-addons' ),
325
+ 'icon' => 'eicon-v-align-top',
326
+ ],
327
+ 'right' => [
328
+ 'title' => __( 'Left To Right', 'happy-elementor-addons' ),
329
+ 'icon' => 'eicon-h-align-right',
330
+ ],
331
+ ],
332
+ 'toggle' => false,
333
+ ]
334
+ );
335
+
336
+ $this->end_controls_section();
337
+
338
+ }
339
+
340
+ protected function register_style_controls() {
341
+ $this->start_controls_section(
342
+ '_section_common_style',
343
+ [
344
+ 'label' => __( 'Common', 'happy-elementor-addons' ),
345
+ 'tab' => Controls_Manager::TAB_STYLE,
346
+ ]
347
+ );
348
+
349
+ $this->add_responsive_control(
350
+ 'height',
351
+ [
352
+ 'label' => __( 'Height', 'happy-elementor-addons' ),
353
+ 'type' => Controls_Manager::SLIDER,
354
+ 'size_units' => ['px'],
355
+ 'range' => [
356
+ 'px' => [
357
+ 'min' => 100,
358
+ 'max' => 1000,
359
+ ],
360
+ ],
361
+ 'selectors' => [
362
+ '{{WRAPPER}} .ha-flip-box-front' => 'height: {{SIZE}}{{UNIT}};',
363
+ '{{WRAPPER}} .ha-flip-box-back' => 'height: {{SIZE}}{{UNIT}};',
364
+ ],
365
+ ]
366
+ );
367
+
368
+ $this->add_control(
369
+ 'content_area_border_radius',
370
+ [
371
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
372
+ 'type' => Controls_Manager::DIMENSIONS,
373
+ 'size_units' => [ 'px', '%' ],
374
+ 'separator' => 'after',
375
+ 'selectors' => [
376
+ '{{WRAPPER}} .ha-flip-box-front' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
377
+ '{{WRAPPER}} .ha-flip-box-front:before' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
378
+ '{{WRAPPER}} .ha-flip-box-back' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
379
+ '{{WRAPPER}} .ha-flip-box-back:before' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
380
+ ],
381
+ ]
382
+ );
383
+
384
+ $this->end_controls_section();
385
+
386
+ // front side
387
+ $this->start_controls_section(
388
+ '_section_front_style',
389
+ [
390
+ 'label' => __( 'Front Side', 'happy-elementor-addons' ),
391
+ 'tab' => Controls_Manager::TAB_STYLE,
392
+ ]
393
+ );
394
+
395
+ $this->add_responsive_control(
396
+ 'front_content_padding',
397
+ [
398
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
399
+ 'type' => Controls_Manager::DIMENSIONS,
400
+ 'size_units' => [ 'px', '%' ],
401
+ 'selectors' => [
402
+ '{{WRAPPER}} .ha-flip-box-front' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
403
+ ],
404
+ ]
405
+ );
406
+
407
+ $this->add_group_control(
408
+ Group_Control_Border::get_type(),
409
+ [
410
+ 'name' => 'front_border',
411
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front',
412
+ ]
413
+ );
414
+
415
+ $this->add_group_control(
416
+ Group_Control_Box_Shadow::get_type(),
417
+ [
418
+ 'name' => 'front_box_shadow',
419
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front',
420
+ ]
421
+ );
422
+
423
+ $this->add_group_control(
424
+ Group_Control_Background::get_type(),
425
+ [
426
+ 'name' => 'front_background_image',
427
+ 'types' => [ 'classic', 'gradient' ],
428
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front',
429
+ ]
430
+ );
431
+
432
+ $this->add_control(
433
+ 'front_background_overlay',
434
+ [
435
+ 'label' => __( 'Background Overlay', 'happy-elementor-addons' ),
436
+ 'type' => Controls_Manager::COLOR,
437
+ 'condition' => [
438
+ 'front_background_image_image[url]!' => ''
439
+ ],
440
+ 'selectors' => [
441
+ '{{WRAPPER}} .ha-flip-wrap .ha-flip-box .ha-flip-box-front:before' => 'background-color: {{VALUE}}',
442
+ ],
443
+ ]
444
+ );
445
+
446
+ $this->add_control(
447
+ 'front_background_color',
448
+ [
449
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
450
+ 'type' => Controls_Manager::COLOR,
451
+ 'default' => '#fff',
452
+ 'condition' => [
453
+ 'front_background_type' => 'color',
454
+ ],
455
+ 'selectors' => [
456
+ '{{WRAPPER}} .ha-flip-box-front' => 'background: {{VALUE}}',
457
+ ],
458
+ ]
459
+ );
460
+
461
+ $this->add_control(
462
+ 'front_icon_heading',
463
+ [
464
+ 'label' => __( 'Media Type - Icon', 'happy-elementor-addons' ),
465
+ 'type' => Controls_Manager::HEADING,
466
+ 'condition' => [
467
+ 'front_icon_type' => 'icon'
468
+ ],
469
+ 'separator' => 'before',
470
+ ]
471
+ );
472
+
473
+ $this->add_control(
474
+ 'front_icon_heading_image',
475
+ [
476
+ 'label' => __( 'Media Type - Image', 'happy-elementor-addons' ),
477
+ 'type' => Controls_Manager::HEADING,
478
+ 'condition' => [
479
+ 'front_icon_type' => 'image'
480
+ ],
481
+ 'separator' => 'before',
482
+ ]
483
+ );
484
+
485
+ $this->add_responsive_control(
486
+ 'front_icon_spacing',
487
+ [
488
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
489
+ 'type' => Controls_Manager::SLIDER,
490
+ 'size_units' => ['px', '%'],
491
+ 'selectors' => [
492
+ '{{WRAPPER}} .ha-flip-box-front .ha-flip-icon' => 'margin-bottom: {{SIZE}}{{UNIT}};',
493
+ ],
494
+ ]
495
+ );
496
+
497
+ $this->add_responsive_control(
498
+ 'front_icon_image_size',
499
+ [
500
+ 'label' => __( 'Resize Image', 'happy-elementor-addons' ),
501
+ 'type' => Controls_Manager::SLIDER,
502
+ 'size_units' => ['px'],
503
+ 'condition' => [
504
+ 'front_icon_type' => 'image'
505
+ ],
506
+ 'range' => [
507
+ 'px' => [
508
+ 'min' => 10,
509
+ 'max' => 500,
510
+ ]
511
+ ],
512
+ 'selectors' => [
513
+ '{{WRAPPER}} .ha-flip-box-front-inner .icon-wrap .ha-flip-icon img' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};',
514
+ ],
515
+ ]
516
+ );
517
+
518
+ $this->add_control(
519
+ 'front_icon_image_fit',
520
+ [
521
+ 'label' => __( 'Image Fit', 'happy-elementor-addons' ),
522
+ 'type' => Controls_Manager::SELECT,
523
+ 'options' => [
524
+ 'contain' => __( 'Contain', 'happy-elementor-addons' ),
525
+ 'cover' => __( 'Cover', 'happy-elementor-addons' ),
526
+ ],
527
+ 'condition' => [
528
+ 'front_icon_type' => 'image'
529
+ ],
530
+ 'selectors' => [
531
+ '{{WRAPPER}} .ha-flip-box-front-inner .icon-wrap .ha-flip-icon img' => 'object-fit: {{VALUE}};',
532
+ ],
533
+ ]
534
+ );
535
+
536
+ $this->add_responsive_control(
537
+ 'front_icon_font_size',
538
+ [
539
+ 'label' => __( 'Icon Size', 'happy-elementor-addons' ),
540
+ 'type' => Controls_Manager::SLIDER,
541
+ 'size_units' => ['px', 'em'],
542
+ 'condition' => [
543
+ 'front_icon_type' => 'icon'
544
+ ],
545
+ 'selectors' => [
546
+ '{{WRAPPER}} .ha-flip-box-front-inner .ha-flip-icon i' => 'font-size: {{SIZE}}{{UNIT}};',
547
+ ],
548
+ ]
549
+ );
550
+
551
+ $this->add_responsive_control(
552
+ 'front_icon_background_size',
553
+ [
554
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
555
+ 'type' => Controls_Manager::SLIDER,
556
+ 'size_units' => ['px'],
557
+ 'condition' => [
558
+ 'front_icon_type' => [ 'icon', 'image' ],
559
+ ],
560
+ 'selectors' => [
561
+ '{{WRAPPER}} .ha-flip-box-front-inner .icon-wrap .ha-flip-icon' => 'padding: {{SIZE}}{{UNIT}};',
562
+ ],
563
+ ]
564
+ );
565
+
566
+ $this->add_group_control(
567
+ Group_Control_Border::get_type(),
568
+ [
569
+ 'name' => 'front_icon_border',
570
+ 'condition' => [
571
+ 'front_icon_type' => [ 'icon', 'image' ],
572
+ ],
573
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front-inner .icon-wrap .ha-flip-icon',
574
+ ]
575
+ );
576
+
577
+ $this->add_control(
578
+ 'front_icon_border_radius',
579
+ [
580
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
581
+ 'type' => Controls_Manager::DIMENSIONS,
582
+ 'size_units' => [ 'px', '%' ],
583
+ 'condition' => [
584
+ 'front_icon_type' => [ 'icon', 'image' ],
585
+ ],
586
+ 'selectors' => [
587
+ '{{WRAPPER}} .ha-flip-box-front-inner .icon-wrap .ha-flip-icon' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
588
+ '{{WRAPPER}} .ha-flip-box-front-inner .ha-flip-icon img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
589
+ ],
590
+ ]
591
+ );
592
+
593
+ $this->add_group_control(
594
+ Group_Control_Box_Shadow::get_type(),
595
+ [
596
+ 'name' => 'front_icon_box_shadow',
597
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front-inner .ha-flip-icon',
598
+ 'condition' => [
599
+ 'front_icon_type' => [ 'icon', 'image' ],
600
+ ],
601
+ ]
602
+ );
603
+
604
+ $this->add_control(
605
+ 'front_icon_color',
606
+ [
607
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
608
+ 'type' => Controls_Manager::COLOR,
609
+ 'condition' => [
610
+ 'front_icon_type' => 'icon'
611
+ ],
612
+ 'selectors' => [
613
+ '{{WRAPPER}} .ha-flip-box-front-inner .icon-wrap .ha-flip-icon i' => 'color: {{VALUE}}',
614
+ ],
615
+ ]
616
+ );
617
+
618
+ $this->add_control(
619
+ 'front_icon_background_color',
620
+ [
621
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
622
+ 'type' => Controls_Manager::COLOR,
623
+ 'condition' => [
624
+ 'front_icon_type' => [ 'icon', 'image' ],
625
+ ],
626
+ 'selectors' => [
627
+ '{{WRAPPER}} .ha-flip-box-front-inner .icon-wrap .ha-flip-icon' => 'background: {{VALUE}}',
628
+ ],
629
+ ]
630
+ );
631
+
632
+ $this->add_control(
633
+ 'front_text',
634
+ [
635
+ 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
636
+ 'type' => Controls_Manager::HEADING,
637
+ 'separator' => 'before',
638
+ ]
639
+ );
640
+
641
+ $this->start_controls_tabs( '_tabs_front_text' );
642
+ $this->start_controls_tab(
643
+ '_tab_front_title',
644
+ [
645
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
646
+ ]
647
+ );
648
+
649
+ $this->add_control(
650
+ 'front_title_color',
651
+ [
652
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
653
+ 'type' => Controls_Manager::COLOR,
654
+ 'selectors' => [
655
+ '{{WRAPPER}} .ha-flip-box-front-inner .ha-flip-box-heading' => 'color: {{VALUE}}',
656
+ ],
657
+ ]
658
+ );
659
+
660
+ $this->add_group_control(
661
+ Group_Control_Typography::get_type(),
662
+ [
663
+ 'name' => 'front_title_typography',
664
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
665
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front-inner .ha-flip-box-heading',
666
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
667
+ ]
668
+ );
669
+
670
+ $this->add_group_control(
671
+ Group_Control_Text_Shadow::get_type(),
672
+ [
673
+ 'name' => 'front_title_text_shadow',
674
+ 'label' => __( 'Text Shadow', 'happy-elementor-addons' ),
675
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front-inner .ha-flip-box-heading',
676
+ ]
677
+ );
678
+
679
+ $this->end_controls_tab();
680
+
681
+ $this->start_controls_tab(
682
+ '_tab_front_description',
683
+ [
684
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
685
+ ]
686
+ );
687
+
688
+ $this->add_responsive_control(
689
+ 'front_description_space',
690
+ [
691
+ 'label' => __( 'Spacing', 'happy-elementor-addons' ),
692
+ 'type' => Controls_Manager::SLIDER,
693
+ 'size_units' => ['px', '%'],
694
+ 'selectors' => [
695
+ '{{WRAPPER}} .ha-flip-box-front-inner .ha-text p' => 'margin-top: {{SIZE}}{{UNIT}};',
696
+ ],
697
+ ]
698
+ );
699
+
700
+ $this->add_control(
701
+ 'front_description_color',
702
+ [
703
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
704
+ 'type' => Controls_Manager::COLOR,
705
+ 'selectors' => [
706
+ '{{WRAPPER}} .ha-flip-box-front-inner .ha-text p' => 'color: {{VALUE}}',
707
+ ],
708
+ ]
709
+ );
710
+
711
+ $this->add_group_control(
712
+ Group_Control_Typography::get_type(),
713
+ [
714
+ 'name' => 'front_description_typography',
715
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
716
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front-inner .ha-text p',
717
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
718
+ ]
719
+ );
720
+
721
+ $this->add_group_control(
722
+ Group_Control_Text_Shadow::get_type(),
723
+ [
724
+ 'name' => 'front_description_text_shadow',
725
+ 'label' => __( 'Text Shadow', 'happy-elementor-addons' ),
726
+ 'selector' => '{{WRAPPER}} .ha-flip-box-front-inner .ha-text p',
727
+ ]
728
+ );
729
+
730
+ $this->end_controls_tab();
731
+ $this->end_controls_tabs();
732
+
733
+ $this->end_controls_section();
734
+
735
+ // back side
736
+ $this->start_controls_section(
737
+ '_section_back_text_style',
738
+ [
739
+ 'label' => __( 'Back Side', 'happy-elementor-addons' ),
740
+ 'tab' => Controls_Manager::TAB_STYLE,
741
+ ]
742
+ );
743
+
744
+ $this->add_responsive_control(
745
+ 'back_content_padding',
746
+ [
747
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
748
+ 'type' => Controls_Manager::DIMENSIONS,
749
+ 'size_units' => [ 'px', '%' ],
750
+ 'selectors' => [
751
+ '{{WRAPPER}} .ha-flip-box-back' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
752
+ ],
753
+ ]
754
+ );
755
+
756
+ $this->add_group_control(
757
+ Group_Control_Border::get_type(),
758
+ [
759
+ 'name' => 'back_border',
760
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back',
761
+ ]
762
+ );
763
+
764
+ $this->add_group_control(
765
+ Group_Control_Box_Shadow::get_type(),
766
+ [
767
+ 'name' => 'back_box_shadow',
768
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back',
769
+ ]
770
+ );
771
+
772
+ $this->add_group_control(
773
+ Group_Control_Background::get_type(),
774
+ [
775
+ 'name' => 'back_background_image',
776
+ 'types' => [ 'classic', 'gradient' ],
777
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back',
778
+ ]
779
+ );
780
+
781
+ $this->add_control(
782
+ 'back_background_overlay',
783
+ [
784
+ 'label' => __( 'Background Overlay', 'happy-elementor-addons' ),
785
+ 'type' => Controls_Manager::COLOR,
786
+ 'default' => 'rgba(0,0,0,0.27)',
787
+ 'condition' => [
788
+ 'back_background_image_background' => 'classic'
789
+ ],
790
+ 'selectors' => [
791
+ '{{WRAPPER}} .ha-flip-wrap .ha-flip-box .ha-flip-box-back:before' => 'background-color: {{VALUE}}',
792
+ ],
793
+ ]
794
+ );
795
+
796
+ $this->add_control(
797
+ 'back_background_color',
798
+ [
799
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
800
+ 'type' => Controls_Manager::COLOR,
801
+ 'default' => '#27374c',
802
+ 'condition' => [
803
+ 'back_background_type' => 'color'
804
+ ],
805
+ 'selectors' => [
806
+ '{{WRAPPER}} .ha-flip-box-back' => 'background: {{VALUE}}',
807
+ ],
808
+ ]
809
+ );
810
+
811
+ $this->add_control(
812
+ 'back_icon_heading',
813
+ [
814
+ 'label' => __( 'Media Type - Icon', 'happy-elementor-addons' ),
815
+ 'type' => Controls_Manager::HEADING,
816
+ 'separator' => 'before',
817
+ 'condition' => [
818
+ 'back_icon_type' => 'icon'
819
+ ],
820
+ ]
821
+ );
822
+
823
+ $this->add_control(
824
+ 'back_icon_heading_image',
825
+ [
826
+ 'label' => __( 'Media Type - Image', 'happy-elementor-addons' ),
827
+ 'type' => Controls_Manager::HEADING,
828
+ 'separator' => 'before',
829
+ 'condition' => [
830
+ 'back_icon_type' => 'image'
831
+ ],
832
+ ]
833
+ );
834
+
835
+ $this->add_responsive_control(
836
+ 'back_icon_spacing',
837
+ [
838
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
839
+ 'type' => Controls_Manager::SLIDER,
840
+ 'size_units' => [ 'px', '%'],
841
+ 'condition' => [
842
+ 'back_icon_type' => [ 'icon', 'image' ],
843
+ ],
844
+ 'selectors' => [
845
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-icon' => 'margin-bottom: {{SIZE}}{{UNIT}};'
846
+ ],
847
+ ]
848
+ );
849
+
850
+ $this->add_responsive_control(
851
+ 'back_icon_image_size',
852
+ [
853
+ 'label' => __( 'Resize Image', 'happy-elementor-addons' ),
854
+ 'type' => Controls_Manager::SLIDER,
855
+ 'size_units' => ['px'],
856
+ 'condition' => [
857
+ 'back_icon_type' => 'image'
858
+ ],
859
+ 'range' => [
860
+ 'px' => [
861
+ 'min' => 10,
862
+ 'max' => 500,
863
+ ]
864
+ ],
865
+ 'selectors' => [
866
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-icon img' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};',
867
+ ],
868
+ ]
869
+ );
870
+
871
+ $this->add_control(
872
+ 'back_icon_image_fit',
873
+ [
874
+ 'label' => __( 'Image Fit', 'happy-elementor-addons' ),
875
+ 'type' => Controls_Manager::SELECT,
876
+ 'options' => [
877
+ 'contain' => __( 'Contain', 'happy-elementor-addons' ),
878
+ 'cover' => __( 'Cover', 'happy-elementor-addons' ),
879
+ ],
880
+ 'condition' => [
881
+ 'back_icon_type' => 'image'
882
+ ],
883
+ 'selectors' => [
884
+ '{{WRAPPER}} .ha-flip-box-back-inner .icon-wrap .ha-flip-icon img' => 'object-fit: {{VALUE}};',
885
+ ],
886
+ ]
887
+ );
888
+
889
+ $this->add_responsive_control(
890
+ 'back_icon_font_size',
891
+ [
892
+ 'label' => __( 'Icon Size', 'happy-elementor-addons' ),
893
+ 'type' => Controls_Manager::SLIDER,
894
+ 'size_units' => ['px', 'em'],
895
+ 'condition' => [
896
+ 'back_icon_type' => 'icon'
897
+ ],
898
+ 'selectors' => [
899
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-icon i' => 'font-size: {{SIZE}}{{UNIT}};',
900
+ ],
901
+ ]
902
+ );
903
+
904
+ $this->add_responsive_control(
905
+ 'back_icon_padding',
906
+ [
907
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
908
+ 'type' => Controls_Manager::SLIDER,
909
+ 'size_units' => ['px', '%'],
910
+ 'condition' => [
911
+ 'back_icon_type' => [ 'icon', 'image' ],
912
+ ],
913
+ 'selectors' => [
914
+ '{{WRAPPER}} .ha-flip-box-back-inner .icon-wrap .ha-flip-icon' => 'padding: {{SIZE}}{{UNIT}};',
915
+ ],
916
+ ]
917
+ );
918
+
919
+ $this->add_group_control(
920
+ Group_Control_Border::get_type(),
921
+ [
922
+ 'name' => 'back_icon_border',
923
+ 'condition' => [
924
+ 'back_icon_type' => [ 'icon', 'image' ],
925
+ ],
926
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back-inner .icon-wrap .ha-flip-icon',
927
+ ]
928
+ );
929
+
930
+ $this->add_control(
931
+ 'back_icon_border_radius',
932
+ [
933
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
934
+ 'type' => Controls_Manager::DIMENSIONS,
935
+ 'size_units' => [ 'px', '%' ],
936
+ 'condition' => [
937
+ 'back_icon_type' => [ 'icon', 'image']
938
+ ],
939
+ 'selectors' => [
940
+ '{{WRAPPER}} .ha-flip-box-back-inner .icon-wrap .ha-flip-icon' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
941
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-icon img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
942
+ ],
943
+ ]
944
+ );
945
+
946
+ $this->add_group_control(
947
+ Group_Control_Box_Shadow::get_type(),
948
+ [
949
+ 'name' => 'back_icon_box_shadow',
950
+ 'condition' => [
951
+ 'back_icon_type' => [ 'icon', 'image']
952
+ ],
953
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-icon',
954
+ ]
955
+ );
956
+
957
+ $this->add_control(
958
+ 'back_icon_color',
959
+ [
960
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
961
+ 'type' => Controls_Manager::COLOR,
962
+ 'condition' => [
963
+ 'back_icon_type' => 'icon'
964
+ ],
965
+ 'selectors' => [
966
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-icon i' => 'color: {{VALUE}}',
967
+ ],
968
+ ]
969
+ );
970
+
971
+ $this->add_control(
972
+ 'back_icon_background_color',
973
+ [
974
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
975
+ 'type' => Controls_Manager::COLOR,
976
+ 'condition' => [
977
+ 'back_icon_type' => [ 'icon', 'image' ],
978
+ ],
979
+ 'selectors' => [
980
+ '{{WRAPPER}} .ha-flip-box-back-inner .icon-wrap .ha-flip-icon' => 'background: {{VALUE}}',
981
+ ],
982
+ ]
983
+ );
984
+
985
+ $this->add_control(
986
+ 'back_text',
987
+ [
988
+ 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
989
+ 'type' => Controls_Manager::HEADING,
990
+ 'separator' => 'before',
991
+ ]
992
+ );
993
+
994
+ $this->start_controls_tabs( '_tabs_back_text' );
995
+ $this->start_controls_tab(
996
+ '_tab_back_title',
997
+ [
998
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
999
+ ]
1000
+ );
1001
+
1002
+ $this->add_control(
1003
+ 'back_title_color',
1004
+ [
1005
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
1006
+ 'type' => Controls_Manager::COLOR,
1007
+ 'selectors' => [
1008
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-box-heading-back' => 'color: {{VALUE}}',
1009
+ ],
1010
+ ]
1011
+ );
1012
+
1013
+ $this->add_group_control(
1014
+ Group_Control_Typography::get_type(),
1015
+ [
1016
+ 'name' => 'back_title_typography',
1017
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
1018
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-box-heading-back',
1019
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
1020
+ ]
1021
+ );
1022
+
1023
+ $this->add_group_control(
1024
+ Group_Control_Text_Shadow::get_type(),
1025
+ [
1026
+ 'name' => 'back_title_shadow',
1027
+ 'label' => __( 'Text Shadow', 'happy-elementor-addons' ),
1028
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-box-heading-back',
1029
+ ]
1030
+ );
1031
+
1032
+ $this->end_controls_tab();
1033
+
1034
+ $this->start_controls_tab(
1035
+ '_tab_back_description',
1036
+ [
1037
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
1038
+ ]
1039
+ );
1040
+
1041
+ $this->add_responsive_control(
1042
+ 'back_description_space',
1043
+ [
1044
+ 'label' => __( 'Spacing', 'happy-elementor-addons' ),
1045
+ 'type' => Controls_Manager::SLIDER,
1046
+ 'size_units' => ['px', '%'],
1047
+ 'selectors' => [
1048
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-text p' => 'margin-top: {{SIZE}}{{UNIT}};',
1049
+ ],
1050
+ ]
1051
+ );
1052
+
1053
+ $this->add_control(
1054
+ 'back_description_color',
1055
+ [
1056
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
1057
+ 'type' => Controls_Manager::COLOR,
1058
+ 'selectors' => [
1059
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-text p' => 'color: {{VALUE}}',
1060
+ ],
1061
+ ]
1062
+ );
1063
+
1064
+ $this->add_group_control(
1065
+ Group_Control_Typography::get_type(),
1066
+ [
1067
+ 'name' => 'back_description_typography',
1068
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
1069
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back-inner .ha-text p',
1070
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
1071
+ ]
1072
+ );
1073
+
1074
+ $this->add_group_control(
1075
+ Group_Control_Text_Shadow::get_type(),
1076
+ [
1077
+ 'name' => 'back_description_text_shadow',
1078
+ 'label' => __( 'Text Shadow', 'happy-elementor-addons' ),
1079
+ 'selector' => '{{WRAPPER}} .ha-flip-box-back-inner .ha-text p',
1080
+ ]
1081
+ );
1082
+
1083
+ $this->end_controls_tab();
1084
+ $this->end_controls_tabs();
1085
+
1086
+ $this->end_controls_section();
1087
+ }
1088
+
1089
+ protected function render() {
1090
+ $settings = $this->get_settings_for_display();
1091
+
1092
+ // icon/image
1093
+ if ( $settings['front_icon_image']['id'] && isset( $settings['front_icon_image']['url'] ) ) {
1094
+ $this->add_render_attribute( 'front_icon_image', 'src', $settings['front_icon_image']['url'] );
1095
+ $this->add_render_attribute( 'front_icon_image', 'alt', Control_Media::get_image_alt( $settings['front_icon_image'] ) );
1096
+ $this->add_render_attribute( 'front_icon_image', 'title', Control_Media::get_image_title( $settings['front_icon_image'] ) );
1097
+ }
1098
+
1099
+ // title & description
1100
+ $this->add_render_attribute( 'front_title', 'class', 'ha-flip-box-heading' );
1101
+ $this->add_render_attribute( 'back_title', 'class', 'ha-flip-box-heading-back' );
1102
+ $this->add_render_attribute( 'front_description', 'class', 'ha-desc' );
1103
+ $this->add_render_attribute( 'back_description', 'class', 'ha-desc' );
1104
+ $this->add_inline_editing_attributes( 'back_description', 'basic' );
1105
+
1106
+ // display type
1107
+ $this->add_render_attribute( 'display', 'class', 'ha-flip-box-container ha-flip-effect-classic' );
1108
+
1109
+ // flip position
1110
+ $this->add_render_attribute( 'flip-position', 'class', 'ha-flip-box-inner' );
1111
+ if ( $settings['flip_position'] === 'up' ) {
1112
+ $this->add_render_attribute( 'flip-position', 'class', 'ha-flip-up' );
1113
+ } elseif ( $settings['flip_position'] === 'right' ) {
1114
+ $this->add_render_attribute( 'flip-position', 'class', 'ha-flip-right' );
1115
+ }
1116
+ ?>
1117
+
1118
+ <div <?php echo $this->get_render_attribute_string( 'display' ); ?>>
1119
+
1120
+ <div <?php echo $this->get_render_attribute_string( 'flip-position' ); ?>>
1121
+ <div class="ha-flip-box-inner-wrapper">
1122
+ <div class="ha-flip-box-front">
1123
+ <div class="ha-flip-box-front-inner">
1124
+ <div class="icon-wrap">
1125
+ <?php if ( $settings['front_icon'] ) : ?>
1126
+ <div class="ha-flip-icon icon">
1127
+ <i class="<?php echo esc_attr( $settings['front_icon'] ); ?>"></i>
1128
+ </div>
1129
+ <?php endif; ?>
1130
+ <?php if ( $settings['front_icon_image'] ) : ?>
1131
+ <div class="ha-flip-icon">
1132
+ <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'front_icon_thumbnail', 'front_icon_image' ); ?>
1133
+ </div>
1134
+ <?php endif; ?>
1135
+ </div>
1136
+
1137
+ <div class="ha-text">
1138
+ <?php if ( $settings['front_title'] ) : ?>
1139
+ <h2 <?php echo $this->get_render_attribute_string( 'front_title' ); ?>><?php echo esc_html( $settings['front_title'] ); ?></h2>
1140
+ <?php endif; ?>
1141
+
1142
+ <?php if ( $settings['front_description'] ) : ?>
1143
+ <p <?php echo $this->get_render_attribute_string( 'front_description' ); ?>><?php echo $settings['front_description']; ?></p>
1144
+ <?php endif; ?>
1145
+ </div>
1146
+ </div>
1147
+ </div>
1148
+
1149
+ <div class="ha-flip-box-back">
1150
+ <div class="ha-flip-box-back-inner">
1151
+ <div class="icon-wrap">
1152
+ <?php if ( $settings['back_icon'] ) : ?>
1153
+ <div class="ha-flip-icon icon">
1154
+ <i class="<?php echo esc_attr( $settings['back_icon'] ); ?>"></i>
1155
+ </div>
1156
+ <?php endif; ?>
1157
+ <?php if ( $settings['back_icon_image'] ) : ?>
1158
+ <div class="ha-flip-icon">
1159
+ <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'back_icon_thumbnail', 'back_icon_image' ); ?>
1160
+ </div>
1161
+ <?php endif; ?>
1162
+ </div>
1163
+
1164
+ <div class="ha-text">
1165
+ <?php if ( $settings['back_title'] ) : ?>
1166
+ <h2 <?php echo $this->get_render_attribute_string( 'back_title' ); ?>><?php echo esc_html( $settings['back_title'] ); ?></h2>
1167
+ <?php endif; ?>
1168
+
1169
+ <?php if ( $settings['back_description'] ) : ?>
1170
+ <p <?php echo $this->get_render_attribute_string( 'back_description' ) ?>><?php echo $settings['back_description'] ?></p>
1171
+ <?php endif; ?>
1172
+ </div>
1173
+
1174
+ </div>
1175
+ </div>
1176
+ </div>
1177
+ </div>
1178
+ </div>
1179
+ <?php
1180
+ }
1181
+ }
widgets/icon-box/widget.php CHANGED
@@ -647,7 +647,9 @@ class Icon_Box extends Base {
647
  }
648
 
649
  if ( \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
650
- $this->render_edit_tools();
 
 
651
  }
652
 
653
  $tag = 'div';
647
  }
648
 
649
  if ( \Elementor\Plugin::$instance->editor->is_edit_mode() ) {
650
+ if( function_exists( 'render_edit_tools' ) ) {
651
+ $this->render_edit_tools();
652
+ }
653
  }
654
 
655
  $tag = 'div';
widgets/justified-gallery/widget.php CHANGED
@@ -29,7 +29,7 @@ class Justified_Gallery extends Base {
29
  * @return string Widget title.
30
  */
31
  public function get_title() {
32
- return __( 'Justified Gallery', 'happy-elementor-addons' );
33
  }
34
 
35
  /**
29
  * @return string Widget title.
30
  */
31
  public function get_title() {
32
+ return __( 'Justified Grid', 'happy-elementor-addons' );
33
  }
34
 
35
  /**
widgets/number/widget.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Blurb widget class
4
  *
5
  * @package Happy_Addons
6
  */
@@ -47,7 +47,7 @@ class Number extends Base {
47
  }
48
 
49
  public function get_keywords() {
50
- return [ 'info', 'blurb', 'box', 'text', 'content' ];
51
  }
52
 
53
  /**
@@ -68,81 +68,45 @@ class Number extends Base {
68
  'label' => __( 'Text', 'happy-elementor-addons' ),
69
  'label_block' => false,
70
  'type' => Controls_Manager::TEXT,
71
- 'default' => 1
72
  ]
73
  );
74
 
75
- $this->end_controls_section();
76
- }
77
-
78
- /**
79
- * Register styles related controls
80
- */
81
- protected function register_style_controls() {
82
- $this->start_controls_section(
83
- '_section_style_number',
84
- [
85
- 'label' => __( 'Text', 'happy-elementor-addons' ),
86
- 'tab' => Controls_Manager::TAB_STYLE,
87
- ]
88
- );
89
 
90
  $this->add_control(
91
- 'number_text_color',
92
  [
93
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
94
- 'type' => Controls_Manager::COLOR,
95
- 'selectors' => [
96
- '{{WRAPPER}} .ha-number-border' => 'color: {{VALUE}};',
 
 
 
 
97
  ],
98
  ]
99
  );
100
 
101
- $this->add_group_control(
102
- Group_Control_Typography::get_type(),
103
- [
104
- 'name' => 'number_text_typography',
105
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
106
- 'selector' => '{{WRAPPER}} .ha-number-border',
107
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3
108
- ]
109
- );
110
-
111
- $this->add_group_control(
112
- Group_Control_Text_Shadow::get_type(),
113
- [
114
- 'name' => 'number_text_shadow',
115
- 'label' => __( 'Text Shadow', 'happy-elementor-addons' ),
116
- 'selector' => '{{WRAPPER}} .ha-number-border span',
117
- ]
118
- );
119
-
120
- $this->add_control(
121
- 'number_text_rotate',
122
- [
123
- 'label' => __( 'Text Rotate', 'happy-elementor-addons' ),
124
- 'type' => Controls_Manager::SLIDER,
125
- 'size_units' => [ 'px' ],
126
- 'range' => [
127
- 'px' => [
128
- 'min' => 0,
129
- 'max' => 360,
130
- 'step' => 5,
131
- ],
132
-
133
- ],
134
- 'default' => [
135
- 'unit' => 'px',
136
- 'size' => 0,
137
- ],
138
- 'selectors' => [
139
- '{{WRAPPER}} .ha-number-text' => '-webkit-transform: rotate({{SIZE}}deg);-ms-transform: rotate({{SIZE}}deg);transform: rotate({{SIZE}}deg);'
140
- ],
141
- ]
142
- );
143
-
144
- $this->end_controls_section();
145
 
 
 
 
 
146
  $this->start_controls_section(
147
  'number_background_style',
148
  [
@@ -154,26 +118,17 @@ class Number extends Base {
154
  $this->add_responsive_control(
155
  'number_width_height',
156
  [
157
- 'label' => __( 'Width and Height', 'happy-elementor-addons' ),
158
  'type' => Controls_Manager::SLIDER,
159
  'size_units' => [ 'px' ],
160
  'range' => [
161
  'px' => [
162
  'min' => 0,
163
- 'max' => 1000,
164
- 'step' => 5,
165
- ],
166
- '%' => [
167
- 'min' => 0,
168
- 'max' => 100,
169
  ],
170
  ],
171
- 'default' => [
172
- 'unit' => 'px',
173
- 'size' => 50,
174
- ],
175
  'selectors' => [
176
- '{{WRAPPER}} .ha-number-border' => 'width: {{SIZE}}{{UNIT}};height: {{SIZE}}{{UNIT}};',
177
  ],
178
  ]
179
  );
@@ -185,48 +140,38 @@ class Number extends Base {
185
  'type' => Controls_Manager::DIMENSIONS,
186
  'size_units' => [ 'px', '%', 'em' ],
187
  'selectors' => [
188
- '{{WRAPPER}} .ha-number-border ' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
189
  ],
190
  ]
191
  );
192
 
 
 
 
 
 
 
 
 
 
193
  $this->add_control(
194
  'number_border_radius',
195
  [
196
  'label' => __( 'Border Radius', 'happy-elementor-addons' ),
197
  'type' => Controls_Manager::DIMENSIONS,
198
- 'size_units' => [ 'px', '%', 'em' ],
199
  'selectors' => [
200
- '{{WRAPPER}} .ha-number-border' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
201
  ],
202
  ]
203
  );
204
 
205
- $this->add_group_control(
206
- Group_Control_Border::get_type(),
207
- [
208
- 'name' => 'number_border',
209
- 'label' => __( 'Border', 'happy-elementor-addons' ),
210
- 'selector' => '{{WRAPPER}} .ha-number-border',
211
- ]
212
- );
213
-
214
- $this->add_group_control(
215
- Group_Control_Background::get_type(),
216
- [
217
- 'name' => 'number_background_color',
218
- 'label' => __( 'Background', 'happy-elementor-addons' ),
219
- 'types' => [ 'classic', 'gradient' ],
220
- 'selector' => '{{WRAPPER}} .ha-number-border',
221
- ]
222
- );
223
-
224
  $this->add_group_control(
225
  Group_Control_Box_Shadow::get_type(),
226
  [
227
  'name' => 'number_box_shadow',
228
  'label' => __( 'Box Shadow', 'happy-elementor-addons' ),
229
- 'selector' => '{{WRAPPER}} .ha-number-border',
230
  ]
231
  );
232
 
@@ -251,7 +196,7 @@ class Number extends Base {
251
  ],
252
  'toggle' => true,
253
  'selectors' => [
254
- '{{WRAPPER}} .ha-number-border' => '{{VALUE}};'
255
  ],
256
  'selectors_dictionary' => [
257
  'left' => 'float: left',
@@ -261,91 +206,155 @@ class Number extends Base {
261
  ]
262
  );
263
 
264
- $this->end_controls_section();
265
- $this->start_controls_section(
266
- 'number_background_style_overlay',
267
- [
268
- 'label' => __( 'Background Overlay', 'happy-elementor-addons' ),
269
- 'tab' => Controls_Manager::TAB_STYLE,
270
- ]
271
- );
272
 
273
- $this->add_group_control(
274
- Group_Control_Background::get_type(),
275
- [
276
- 'name' => 'number_background_overlay_color',
277
- 'label' => __( 'Background', 'happy-elementor-addons' ),
278
- 'types' => [ 'classic', 'gradient' ],
279
- 'selector' => '{{WRAPPER}} .ha-number-border .ha-number-border-overlay',
280
- ]
281
- );
282
 
 
 
 
 
 
 
 
 
283
 
284
- $this->add_control(
285
- 'number_background_overlay_blend_mode',
286
- [
287
- 'label' => __( 'Blend Mood', 'happy-elementor-addons' ),
288
- 'type' => Controls_Manager::SELECT,
289
- 'default' => 'normal',
290
- 'options' => [
291
- 'normal' => 'Normal',
292
- 'multiply' => 'Multiply',
293
- 'screen' => 'Screen',
294
- 'overlay' => 'Overlay',
295
- 'darken' => 'Darken',
296
- 'lighten' => 'Lighten',
297
- 'color-dodge' => 'Color Dodge',
298
- 'color-burn' => 'Color Burn',
299
- 'saturation' => 'Saturation',
300
- 'difference' => 'Difference',
301
- 'exclusion' => 'Exclusion',
302
- 'hue' => 'Hue',
303
- 'saturation' => 'Saturation',
304
- 'color' => 'Color',
305
- 'luminosity' => 'Luminosity',
306
- ],
307
- 'selectors' => [
308
- '{{WRAPPER}} .ha-number-border-overlay' => 'mix-blend-mode: {{VALUE}}',
309
- ],
310
- ]
311
- );
312
 
 
 
 
 
 
 
 
 
 
 
 
 
313
 
314
- $this->add_responsive_control(
315
- 'number_background_overlay_blend_mode_opacity',
316
- [
317
- 'label' => __( 'Opacity', 'happy-elementor-addons' ),
318
- 'type' => Controls_Manager::SLIDER,
319
- 'size_units' => [ 'px' ],
320
- 'range' => [
321
- 'px' => [
322
- 'min' => 0,
323
- 'max' => 1,
324
- 'step' => .1,
325
- ],
326
- ],
327
- 'default' => [
328
- 'unit' => 'px',
329
- 'size' => .5,
330
- ],
331
- 'selectors' => [
332
- '{{WRAPPER}} .ha-number-border-overlay' => 'opacity: {{SIZE}};',
333
- ],
334
- ]
335
- );
336
 
337
  $this->end_controls_section();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
338
  }
339
 
340
  protected function render() {
341
  $settings = $this->get_settings_for_display();
342
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
343
 
344
  <div class="ha-number-body">
345
- <div class="ha-number-border">
346
- <div class="ha-number-border-overlay"></div>
347
- <span class="ha-number-text"><?php echo esc_html( $settings['number_text'] ); ?></span>
348
- </div>
349
  </div>
350
 
351
  <?php
1
  <?php
2
  /**
3
+ * Number widget class
4
  *
5
  * @package Happy_Addons
6
  */
47
  }
48
 
49
  public function get_keywords() {
50
+ return [ 'number', 'animate', 'text' ];
51
  }
52
 
53
  /**
68
  'label' => __( 'Text', 'happy-elementor-addons' ),
69
  'label_block' => false,
70
  'type' => Controls_Manager::TEXT,
71
+ 'default' => 7
72
  ]
73
  );
74
 
75
+ $this->add_control(
76
+ 'animate_number',
77
+ [
78
+ 'label' => __( 'Animate', 'happy-elementor-addons' ),
79
+ 'description' => __( 'Only number is animatable' ),
80
+ 'type' => Controls_Manager::SWITCHER,
81
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
82
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
83
+ 'return_value' => 'yes',
84
+ 'separator' => 'before',
85
+ ]
86
+ );
 
 
87
 
88
  $this->add_control(
89
+ 'animate_duration',
90
  [
91
+ 'label' => __( 'Duration', 'happy-elementor-addons' ),
92
+ 'type' => Controls_Manager::NUMBER,
93
+ 'min' => 100,
94
+ 'max' => 10000,
95
+ 'step' => 10,
96
+ 'default' => 500,
97
+ 'condition' => [
98
+ 'animate_number!' => ''
99
  ],
100
  ]
101
  );
102
 
103
+ $this->end_controls_section();
104
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
105
 
106
+ /**
107
+ * Register styles related controls
108
+ */
109
+ protected function register_style_controls() {
110
  $this->start_controls_section(
111
  'number_background_style',
112
  [
118
  $this->add_responsive_control(
119
  'number_width_height',
120
  [
121
+ 'label' => __( 'Size', 'happy-elementor-addons' ),
122
  'type' => Controls_Manager::SLIDER,
123
  'size_units' => [ 'px' ],
124
  'range' => [
125
  'px' => [
126
  'min' => 0,
127
+ 'max' => 500,
 
 
 
 
 
128
  ],
129
  ],
 
 
 
 
130
  'selectors' => [
131
+ '{{WRAPPER}} .ha-number-body' => 'width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};',
132
  ],
133
  ]
134
  );
140
  'type' => Controls_Manager::DIMENSIONS,
141
  'size_units' => [ 'px', '%', 'em' ],
142
  'selectors' => [
143
+ '{{WRAPPER}} .ha-number-body ' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
144
  ],
145
  ]
146
  );
147
 
148
+ $this->add_group_control(
149
+ Group_Control_Border::get_type(),
150
+ [
151
+ 'name' => 'number_border',
152
+ 'label' => __( 'Border', 'happy-elementor-addons' ),
153
+ 'selector' => '{{WRAPPER}} .ha-number-body',
154
+ ]
155
+ );
156
+
157
  $this->add_control(
158
  'number_border_radius',
159
  [
160
  'label' => __( 'Border Radius', 'happy-elementor-addons' ),
161
  'type' => Controls_Manager::DIMENSIONS,
162
+ 'size_units' => [ 'px', '%' ],
163
  'selectors' => [
164
+ '{{WRAPPER}} .ha-number-body' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
165
  ],
166
  ]
167
  );
168
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
169
  $this->add_group_control(
170
  Group_Control_Box_Shadow::get_type(),
171
  [
172
  'name' => 'number_box_shadow',
173
  'label' => __( 'Box Shadow', 'happy-elementor-addons' ),
174
+ 'selector' => '{{WRAPPER}} .ha-number-body',
175
  ]
176
  );
177
 
196
  ],
197
  'toggle' => true,
198
  'selectors' => [
199
+ '{{WRAPPER}} .ha-number-body' => '{{VALUE}};'
200
  ],
201
  'selectors_dictionary' => [
202
  'left' => 'float: left',
206
  ]
207
  );
208
 
209
+ $this->add_control(
210
+ '_heading_bg',
211
+ [
212
+ 'label' => __( 'Background', 'happy-elementor-addons' ),
213
+ 'type' => Controls_Manager::HEADING,
214
+ 'separator' => 'before',
215
+ ]
216
+ );
217
 
218
+ $this->add_group_control(
219
+ Group_Control_Background::get_type(),
220
+ [
221
+ 'name' => 'number_background_color',
222
+ 'types' => [ 'classic', 'gradient' ],
223
+ 'selector' => '{{WRAPPER}} .ha-number-body',
224
+ ]
225
+ );
 
226
 
227
+ $this->add_control(
228
+ '_heading_bg_overlay',
229
+ [
230
+ 'label' => __( 'Background Overaly', 'happy-elementor-addons' ),
231
+ 'type' => Controls_Manager::HEADING,
232
+ 'separator' => 'before',
233
+ ]
234
+ );
235
 
236
+ $this->add_group_control(
237
+ Group_Control_Background::get_type(),
238
+ [
239
+ 'name' => 'number_background_overlay_color',
240
+ 'label' => __( 'Background', 'happy-elementor-addons' ),
241
+ 'types' => [ 'classic', 'gradient' ],
242
+ 'selector' => '{{WRAPPER}} .ha-number-overlay',
243
+ ]
244
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
245
 
246
+ $this->add_control(
247
+ 'number_background_overlay_blend_mode',
248
+ [
249
+ 'label' => __( 'Blend Mood', 'happy-elementor-addons' ),
250
+ 'type' => Controls_Manager::SELECT,
251
+ 'default' => 'normal',
252
+ 'options' => ha_get_css_blend_modes(),
253
+ 'selectors' => [
254
+ '{{WRAPPER}} .ha-number-overlay' => 'mix-blend-mode: {{VALUE}}',
255
+ ],
256
+ ]
257
+ );
258
 
259
+ $this->add_responsive_control(
260
+ 'number_background_overlay_blend_mode_opacity',
261
+ [
262
+ 'label' => __( 'Opacity', 'happy-elementor-addons' ),
263
+ 'type' => Controls_Manager::SLIDER,
264
+ 'size_units' => [ 'px' ],
265
+ 'range' => [
266
+ 'px' => [
267
+ 'min' => 0,
268
+ 'max' => 1,
269
+ 'step' => .1,
270
+ ],
271
+ ],
272
+ 'selectors' => [
273
+ '{{WRAPPER}} .ha-number-overlay' => 'opacity: {{SIZE}};',
274
+ ],
275
+ ]
276
+ );
 
 
 
 
277
 
278
  $this->end_controls_section();
279
+
280
+ $this->start_controls_section(
281
+ '_section_style_text',
282
+ [
283
+ 'label' => __( 'Text', 'happy-elementor-addons' ),
284
+ 'tab' => Controls_Manager::TAB_STYLE,
285
+ ]
286
+ );
287
+
288
+ $this->add_control(
289
+ 'number_text_color',
290
+ [
291
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
292
+ 'type' => Controls_Manager::COLOR,
293
+ 'selectors' => [
294
+ '{{WRAPPER}} .ha-number-body' => 'color: {{VALUE}};',
295
+ ],
296
+ ]
297
+ );
298
+
299
+ $this->add_group_control(
300
+ Group_Control_Typography::get_type(),
301
+ [
302
+ 'name' => 'number_text_typography',
303
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
304
+ 'selector' => '{{WRAPPER}} .ha-number-text',
305
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
306
+ ]
307
+ );
308
+
309
+ $this->add_group_control(
310
+ Group_Control_Text_Shadow::get_type(),
311
+ [
312
+ 'name' => 'number_text_shadow',
313
+ 'label' => __( 'Text Shadow', 'happy-elementor-addons' ),
314
+ 'selector' => '{{WRAPPER}} .ha-number-text',
315
+ ]
316
+ );
317
+
318
+ $this->add_control(
319
+ 'number_text_rotate',
320
+ [
321
+ 'label' => __( 'Text Rotate', 'happy-elementor-addons' ),
322
+ 'type' => Controls_Manager::SLIDER,
323
+ 'size_units' => [ 'px' ],
324
+ 'range' => [
325
+ 'px' => [
326
+ 'min' => 0,
327
+ 'max' => 360,
328
+ ],
329
+ ],
330
+ 'selectors' => [
331
+ '{{WRAPPER}} .ha-number-text' => '-webkit-transform: rotate({{SIZE}}deg);-ms-transform: rotate({{SIZE}}deg);transform: rotate({{SIZE}}deg);'
332
+ ],
333
+ ]
334
+ );
335
+
336
+ $this->end_controls_section();
337
  }
338
 
339
  protected function render() {
340
  $settings = $this->get_settings_for_display();
341
+
342
+ $this->add_render_attribute( 'number_text', 'class', 'ha-number-text' );
343
+ $number = $settings['number_text'];
344
+
345
+ if ( $settings['animate_number'] ) {
346
+ $data = [
347
+ 'toValue' => intval( $settings['number_text'] ),
348
+ 'duration' => intval( $settings['animate_duration'] ),
349
+ ];
350
+ $this->add_render_attribute( 'number_text', 'data-animation', wp_json_encode( $data ) );
351
+ $number = 0;
352
+ }
353
+ ?>
354
 
355
  <div class="ha-number-body">
356
+ <div class="ha-number-overlay"></div>
357
+ <span <?php $this->print_render_attribute_string( 'number_text' ); ?>><?php echo esc_html( $number ); ?></span>
 
 
358
  </div>
359
 
360
  <?php
widgets/pricing-table/widget.php ADDED
@@ -0,0 +1,967 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Pricing table widget class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+ namespace Happy_Addons\Elementor\Widget;
8
+
9
+ use Elementor\Group_Control_Css_Filter;
10
+ use Elementor\Group_Control_Text_Shadow;
11
+ use Elementor\Repeater;
12
+ use Elementor\Scheme_Typography;
13
+ use Elementor\Utils;
14
+ use Elementor\Control_Media;
15
+ use Elementor\Controls_Manager;
16
+ use Elementor\Group_Control_Border;
17
+ use Elementor\Group_Control_Box_Shadow;
18
+ use Elementor\Group_Control_Image_Size;
19
+ use Elementor\Group_Control_Typography;
20
+
21
+ defined( 'ABSPATH' ) || die();
22
+
23
+ class Pricing_Table extends Base {
24
+
25
+ /**
26
+ * Get widget title.
27
+ *
28
+ * @since 1.0.0
29
+ * @access public
30
+ *
31
+ * @return string Widget title.
32
+ */
33
+ public function get_title() {
34
+ return __( 'Pricing Table', 'happy-elementor-addons' );
35
+ }
36
+
37
+ /**
38
+ * Get widget icon.
39
+ *
40
+ * @since 1.0.0
41
+ * @access public
42
+ *
43
+ * @return string Widget icon.
44
+ */
45
+ public function get_icon() {
46
+ return 'hm hm-file-cabinet';
47
+ }
48
+
49
+ public function get_keywords() {
50
+ return [ 'pricing', 'table', 'package', 'product', 'plan' ];
51
+ }
52
+
53
+ protected function register_content_controls() {
54
+ $this->start_controls_section(
55
+ '_section_header',
56
+ [
57
+ 'label' => __( 'Header', 'happy-elementor-addons' ),
58
+ 'tab' => Controls_Manager::TAB_CONTENT,
59
+ ]
60
+ );
61
+
62
+ $this->add_control(
63
+ 'title',
64
+ [
65
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
66
+ 'type' => Controls_Manager::TEXT,
67
+ 'label_block' => false,
68
+ 'default' => __( 'Basic', 'happy-elementor-addons' ),
69
+ ]
70
+ );
71
+
72
+ $this->end_controls_section();
73
+
74
+ $this->start_controls_section(
75
+ '_section_pricing',
76
+ [
77
+ 'label' => __( 'Pricing', 'happy-elementor-addons' ),
78
+ 'tab' => Controls_Manager::TAB_CONTENT,
79
+ ]
80
+ );
81
+
82
+ $this->add_control(
83
+ 'currency',
84
+ [
85
+ 'label' => __( 'Currency', 'happy-elementor-addons' ),
86
+ 'type' => Controls_Manager::SELECT,
87
+ 'label_block' => false,
88
+ 'options' => [
89
+ '' => __( 'None', 'happy-elementor-addons' ),
90
+ 'baht' => '&#3647; ' . _x( 'Baht', 'Currency Symbol', 'happy-elementor-addons' ),
91
+ 'bdt' => '&#2547; ' . _x( 'BD Taka', 'Currency Symbol', 'happy-elementor-addons' ),
92
+ 'dollar' => '&#36; ' . _x( 'Dollar', 'Currency Symbol', 'happy-elementor-addons' ),
93
+ 'euro' => '&#128; ' . _x( 'Euro', 'Currency Symbol', 'happy-elementor-addons' ),
94
+ 'franc' => '&#8355; ' . _x( 'Franc', 'Currency Symbol', 'happy-elementor-addons' ),
95
+ 'guilder' => '&fnof; ' . _x( 'Guilder', 'Currency Symbol', 'happy-elementor-addons' ),
96
+ 'krona' => 'kr ' . _x( 'Krona', 'Currency Symbol', 'happy-elementor-addons' ),
97
+ 'lira' => '&#8356; ' . _x( 'Lira', 'Currency Symbol', 'happy-elementor-addons' ),
98
+ 'peseta' => '&#8359 ' . _x( 'Peseta', 'Currency Symbol', 'happy-elementor-addons' ),
99
+ 'peso' => '&#8369; ' . _x( 'Peso', 'Currency Symbol', 'happy-elementor-addons' ),
100
+ 'pound' => '&#163; ' . _x( 'Pound Sterling', 'Currency Symbol', 'happy-elementor-addons' ),
101
+ 'real' => 'R$ ' . _x( 'Real', 'Currency Symbol', 'happy-elementor-addons' ),
102
+ 'ruble' => '&#8381; ' . _x( 'Ruble', 'Currency Symbol', 'happy-elementor-addons' ),
103
+ 'rupee' => '&#8360; ' . _x( 'Rupee', 'Currency Symbol', 'happy-elementor-addons' ),
104
+ 'indian_rupee' => '&#8377; ' . _x( 'Rupee (Indian)', 'Currency Symbol', 'happy-elementor-addons' ),
105
+ 'shekel' => '&#8362; ' . _x( 'Shekel', 'Currency Symbol', 'happy-elementor-addons' ),
106
+ 'won' => '&#8361; ' . _x( 'Won', 'Currency Symbol', 'happy-elementor-addons' ),
107
+ 'yen' => '&#165; ' . _x( 'Yen/Yuan', 'Currency Symbol', 'happy-elementor-addons' ),
108
+ 'custom' => __( 'Custom', 'happy-elementor-addons' ),
109
+ ],
110
+ 'default' => 'dollar',
111
+ ]
112
+ );
113
+
114
+ $this->add_control(
115
+ 'currency_custom',
116
+ [
117
+ 'label' => __( 'Custom Symbol', 'happy-elementor-addons' ),
118
+ 'type' => Controls_Manager::TEXT,
119
+ 'condition' => [
120
+ 'currency' => 'custom',
121
+ ],
122
+ ]
123
+ );
124
+
125
+ $this->add_control(
126
+ 'price',
127
+ [
128
+ 'label' => __( 'Price', 'happy-elementor-addons' ),
129
+ 'type' => Controls_Manager::TEXT,
130
+ 'default' => '9.99',
131
+ ]
132
+ );
133
+
134
+ $this->add_control(
135
+ 'period',
136
+ [
137
+ 'label' => __( 'Period', 'happy-elementor-addons' ),
138
+ 'type' => Controls_Manager::TEXT,
139
+ 'default' => __( 'Per Month', 'happy-elementor-addons' ),
140
+ ]
141
+ );
142
+
143
+ $this->end_controls_section();
144
+
145
+ $this->start_controls_section(
146
+ '_section_features',
147
+ [
148
+ 'label' => __( 'Features', 'happy-elementor-addons' ),
149
+ ]
150
+ );
151
+
152
+ $this->add_control(
153
+ 'features_title',
154
+ [
155
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
156
+ 'type' => Controls_Manager::TEXT,
157
+ 'default' => __( 'Features', 'happy-elementor-addons' ),
158
+ 'separator' => 'after',
159
+ ]
160
+ );
161
+
162
+ $repeater = new Repeater();
163
+
164
+ $repeater->add_control(
165
+ 'text',
166
+ [
167
+ 'label' => __( 'Text', 'elementor-pro' ),
168
+ 'type' => Controls_Manager::TEXT,
169
+ 'default' => __( 'Exciting Feature', 'elementor-pro' ),
170
+ ]
171
+ );
172
+
173
+ $repeater->add_control(
174
+ 'icon',
175
+ [
176
+ 'label' => __( 'Icon', 'elementor-pro' ),
177
+ 'type' => Controls_Manager::ICON,
178
+ 'default' => 'fa fa-check',
179
+ 'include' => [
180
+ 'fa fa-check',
181
+ 'fa fa-close',
182
+ ]
183
+ ]
184
+ );
185
+
186
+ $this->add_control(
187
+ 'features_list',
188
+ [
189
+ 'type' => Controls_Manager::REPEATER,
190
+ 'fields' => $repeater->get_controls(),
191
+ 'show_label' => false,
192
+ 'default' => [
193
+ [
194
+ 'text' => __( 'Standard Feature', 'elementor-pro' ),
195
+ 'icon' => 'fa fa-check',
196
+ ],
197
+ [
198
+ 'text' => __( 'Another Great Feature', 'elementor-pro' ),
199
+ 'icon' => 'fa fa-check',
200
+ ],
201
+ [
202
+ 'text' => __( 'Obsolete Feature', 'elementor-pro' ),
203
+ 'icon' => 'fa fa-close',
204
+ ],
205
+ [
206
+ 'text' => __( 'Exciting Feature', 'elementor-pro' ),
207
+ 'icon' => 'fa fa-check',
208
+ ],
209
+ ],
210
+ 'title_field' => '{{{ text }}}',
211
+ ]
212
+ );
213
+
214
+ $this->end_controls_section();
215
+
216
+ $this->start_controls_section(
217
+ '_section_footer',
218
+ [
219
+ 'label' => __( 'Footer', 'happy-elementor-addons' ),
220
+ 'tab' => Controls_Manager::TAB_CONTENT,
221
+ ]
222
+ );
223
+
224
+ $this->add_control(
225
+ 'button_text',
226
+ [
227
+ 'label' => __( 'Button Text', 'happy-elementor-addons' ),
228
+ 'type' => Controls_Manager::TEXT,
229
+ 'default' => __( 'Subscribe', 'happy-elementor-addons' ),
230
+ 'placeholder' => __( 'Type button text here', 'happy-elementor-addons' ),
231
+ 'label_block' => false,
232
+ ]
233
+ );
234
+
235
+ $this->add_control(
236
+ 'button_link',
237
+ [
238
+ 'label' => __( 'Link', 'happy-elementor-addons' ),
239
+ 'type' => Controls_Manager::URL,
240
+ 'label_block' => true,
241
+ 'placeholder' => __( 'https://example.com/', 'happy-elementor-addons' ),
242
+ 'dynamic' => [
243
+ 'active' => true,
244
+ ],
245
+ ]
246
+ );
247
+
248
+ $this->end_controls_section();
249
+
250
+ $this->start_controls_section(
251
+ '_section_badge',
252
+ [
253
+ 'label' => __( 'Badge', 'happy-elementor-addons' ),
254
+ ]
255
+ );
256
+
257
+ $this->add_control(
258
+ 'show_badge',
259
+ [
260
+ 'label' => __( 'Show', 'happy-elementor-addons' ),
261
+ 'type' => Controls_Manager::SWITCHER,
262
+ 'label_on' => __( 'Show', 'happy-elementor-addons' ),
263
+ 'label_off' => __( 'Hide', 'happy-elementor-addons' ),
264
+ 'return_value' => 'yes',
265
+ 'default' => 'yes',
266
+ ]
267
+ );
268
+
269
+ $this->add_control(
270
+ 'badge_position',
271
+ [
272
+ 'label' => __( 'Position', 'happy-elementor-addons' ),
273
+ 'type' => Controls_Manager::CHOOSE,
274
+ 'label_block' => false,
275
+ 'options' => [
276
+ 'left' => [
277
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
278
+ 'icon' => 'eicon-h-align-left',
279
+ ],
280
+ 'right' => [
281
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
282
+ 'icon' => 'eicon-h-align-right',
283
+ ],
284
+ ],
285
+ 'toggle' => false,
286
+ 'default' => 'left',
287
+ 'condition' => [
288
+ 'show_badge' => 'yes'
289
+ ]
290
+ ]
291
+ );
292
+
293
+ $this->add_control(
294
+ 'badge_text',
295
+ [
296
+ 'label' => __( 'Badge Text', 'happy-elementor-addons' ),
297
+ 'type' => Controls_Manager::TEXT,
298
+ 'default' => __( 'Recommended', 'happy-elementor-addons' ),
299
+ 'placeholder' => __( 'Type badge text', 'happy-elementor-addons' ),
300
+ 'condition' => [
301
+ 'show_badge' => 'yes'
302
+ ]
303
+ ]
304
+ );
305
+
306
+ $this->end_controls_section();
307
+ }
308
+
309
+ protected function register_style_controls() {
310
+ $this->start_controls_section(
311
+ '_section_style_general',
312
+ [
313
+ 'label' => __( 'General', 'happy-elementor-addons' ),
314
+ 'tab' => Controls_Manager::TAB_STYLE,
315
+ ]
316
+ );
317
+
318
+ $this->add_control(
319
+ 'text_color',
320
+ [
321
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
322
+ 'type' => Controls_Manager::COLOR,
323
+ 'selectors' => [
324
+ '{{WRAPPER}} .ha-pricing-table-title,'
325
+ . '{{WRAPPER}} .ha-pricing-table-currency,'
326
+ . '{{WRAPPER}} .ha-pricing-table-period,'
327
+ . '{{WRAPPER}} .ha-pricing-table-features-title,'
328
+ . '{{WRAPPER}} .ha-pricing-table-features-list li,'
329
+ . '{{WRAPPER}} .ha-pricing-table-price-text' => 'color: {{VALUE}};',
330
+ ],
331
+ ]
332
+ );
333
+
334
+ $this->end_controls_section();
335
+
336
+ $this->start_controls_section(
337
+ '_section_style_header',
338
+ [
339
+ 'label' => __( 'Header', 'happy-elementor-addons' ),
340
+ 'tab' => Controls_Manager::TAB_STYLE,
341
+ ]
342
+ );
343
+
344
+ $this->add_responsive_control(
345
+ 'title_spacing',
346
+ [
347
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
348
+ 'type' => Controls_Manager::SLIDER,
349
+ 'size_units' => ['px'],
350
+ 'selectors' => [
351
+ '{{WRAPPER}} .ha-pricing-table-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
352
+ ],
353
+ ]
354
+ );
355
+
356
+ $this->add_control(
357
+ 'title_color',
358
+ [
359
+ 'label' => __( 'Title Color', 'happy-elementor-addons' ),
360
+ 'type' => Controls_Manager::COLOR,
361
+ 'selectors' => [
362
+ '{{WRAPPER}} .ha-pricing-table-title' => 'color: {{VALUE}};',
363
+ ],
364
+ ]
365
+ );
366
+
367
+ $this->add_group_control(
368
+ Group_Control_Typography::get_type(),
369
+ [
370
+ 'name' => 'title_typography',
371
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-title',
372
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
373
+ ]
374
+ );
375
+
376
+ $this->add_group_control(
377
+ Group_Control_Text_Shadow::get_type(),
378
+ [
379
+ 'name' => 'title_text_shadow',
380
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-title',
381
+ ]
382
+ );
383
+
384
+ $this->end_controls_section();
385
+
386
+ $this->start_controls_section(
387
+ '_section_style_pricing',
388
+ [
389
+ 'label' => __( 'Pricing', 'happy-elementor-addons' ),
390
+ 'tab' => Controls_Manager::TAB_STYLE,
391
+ ]
392
+ );
393
+
394
+ $this->add_control(
395
+ '_heading_price',
396
+ [
397
+ 'type' => Controls_Manager::HEADING,
398
+ 'label' => __( 'Price', 'happy-elementor-addons' ),
399
+ ]
400
+ );
401
+
402
+ $this->add_responsive_control(
403
+ 'price_spacing',
404
+ [
405
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
406
+ 'type' => Controls_Manager::SLIDER,
407
+ 'size_units' => ['px'],
408
+ 'selectors' => [
409
+ '{{WRAPPER}} .ha-pricing-table-price-tag' => 'margin-bottom: {{SIZE}}{{UNIT}};',
410
+ ],
411
+ ]
412
+ );
413
+
414
+ $this->add_control(
415
+ 'price_color',
416
+ [
417
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
418
+ 'type' => Controls_Manager::COLOR,
419
+ 'selectors' => [
420
+ '{{WRAPPER}} .ha-pricing-table-price-text' => 'color: {{VALUE}};',
421
+ ],
422
+ ]
423
+ );
424
+
425
+ $this->add_group_control(
426
+ Group_Control_Typography::get_type(),
427
+ [
428
+ 'name' => 'price_typography',
429
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-price-text',
430
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
431
+ ]
432
+ );
433
+
434
+ $this->add_control(
435
+ '_heading_currency',
436
+ [
437
+ 'type' => Controls_Manager::HEADING,
438
+ 'label' => __( 'Currency', 'happy-elementor-addons' ),
439
+ 'separator' => 'before',
440
+ ]
441
+ );
442
+
443
+ $this->add_responsive_control(
444
+ 'currency_spacing',
445
+ [
446
+ 'label' => __( 'Side Spacing', 'happy-elementor-addons' ),
447
+ 'type' => Controls_Manager::SLIDER,
448
+ 'size_units' => ['px'],
449
+ 'selectors' => [
450
+ '{{WRAPPER}} .ha-pricing-table-currency' => 'margin-right: {{SIZE}}{{UNIT}};',
451
+ ],
452
+ ]
453
+ );
454
+
455
+ $this->add_control(
456
+ 'currency_color',
457
+ [
458
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
459
+ 'type' => Controls_Manager::COLOR,
460
+ 'selectors' => [
461
+ '{{WRAPPER}} .ha-pricing-table-currency' => 'color: {{VALUE}};',
462
+ ],
463
+ ]
464
+ );
465
+
466
+ $this->add_group_control(
467
+ Group_Control_Typography::get_type(),
468
+ [
469
+ 'name' => 'currency_typography',
470
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-currency',
471
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
472
+ ]
473
+ );
474
+
475
+ $this->add_control(
476
+ '_heading_period',
477
+ [
478
+ 'type' => Controls_Manager::HEADING,
479
+ 'label' => __( 'Period', 'happy-elementor-addons' ),
480
+ 'separator' => 'before',
481
+ ]
482
+ );
483
+
484
+ $this->add_responsive_control(
485
+ 'period_spacing',
486
+ [
487
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
488
+ 'type' => Controls_Manager::SLIDER,
489
+ 'size_units' => ['px'],
490
+ 'selectors' => [
491
+ '{{WRAPPER}} .ha-pricing-table-price' => 'margin-bottom: {{SIZE}}{{UNIT}};',
492
+ ],
493
+ ]
494
+ );
495
+
496
+ $this->add_control(
497
+ 'period_color',
498
+ [
499
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
500
+ 'type' => Controls_Manager::COLOR,
501
+ 'selectors' => [
502
+ '{{WRAPPER}} .ha-pricing-table-period' => 'color: {{VALUE}};',
503
+ ],
504
+ ]
505
+ );
506
+
507
+ $this->add_group_control(
508
+ Group_Control_Typography::get_type(),
509
+ [
510
+ 'name' => 'period_typography',
511
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-period',
512
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
513
+ ]
514
+ );
515
+
516
+ $this->end_controls_section();
517
+
518
+ $this->start_controls_section(
519
+ '_section_style_features',
520
+ [
521
+ 'label' => __( 'Features', 'happy-elementor-addons' ),
522
+ 'tab' => Controls_Manager::TAB_STYLE,
523
+ ]
524
+ );
525
+
526
+ $this->add_responsive_control(
527
+ 'features_container_spacing',
528
+ [
529
+ 'label' => __( 'Container Bottom Spacing', 'happy-elementor-addons' ),
530
+ 'type' => Controls_Manager::SLIDER,
531
+ 'size_units' => ['px'],
532
+ 'selectors' => [
533
+ '{{WRAPPER}} .ha-pricing-table-body' => 'margin-bottom: {{SIZE}}{{UNIT}};',
534
+ ],
535
+ ]
536
+ );
537
+
538
+ $this->add_control(
539
+ '_heading_features_title',
540
+ [
541
+ 'type' => Controls_Manager::HEADING,
542
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
543
+ 'separator' => 'before',
544
+ ]
545
+ );
546
+
547
+ $this->add_responsive_control(
548
+ 'features_title_spacing',
549
+ [
550
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
551
+ 'type' => Controls_Manager::SLIDER,
552
+ 'size_units' => ['px'],
553
+ 'selectors' => [
554
+ '{{WRAPPER}} .ha-pricing-table-features-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
555
+ ],
556
+ ]
557
+ );
558
+
559
+ $this->add_control(
560
+ 'features_title_color',
561
+ [
562
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
563
+ 'type' => Controls_Manager::COLOR,
564
+ 'selectors' => [
565
+ '{{WRAPPER}} .ha-pricing-table-features-title' => 'color: {{VALUE}};',
566
+ ],
567
+ ]
568
+ );
569
+
570
+ $this->add_group_control(
571
+ Group_Control_Typography::get_type(),
572
+ [
573
+ 'name' => 'features_title_typography',
574
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-features-title',
575
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
576
+ ]
577
+ );
578
+
579
+ $this->add_control(
580
+ '_heading_features_list',
581
+ [
582
+ 'type' => Controls_Manager::HEADING,
583
+ 'label' => __( 'List', 'happy-elementor-addons' ),
584
+ 'separator' => 'before',
585
+ ]
586
+ );
587
+
588
+ $this->add_responsive_control(
589
+ 'features_list_spacing',
590
+ [
591
+ 'label' => __( 'Spacing Between', 'happy-elementor-addons' ),
592
+ 'type' => Controls_Manager::SLIDER,
593
+ 'size_units' => ['px'],
594
+ 'selectors' => [
595
+ '{{WRAPPER}} .ha-pricing-table-features-list > li' => 'margin-bottom: {{SIZE}}{{UNIT}};',
596
+ ],
597
+ ]
598
+ );
599
+
600
+ $this->add_control(
601
+ 'features_list_color',
602
+ [
603
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
604
+ 'type' => Controls_Manager::COLOR,
605
+ 'selectors' => [
606
+ '{{WRAPPER}} .ha-pricing-table-features-list > li' => 'color: {{VALUE}};',
607
+ ],
608
+ ]
609
+ );
610
+
611
+ $this->add_group_control(
612
+ Group_Control_Typography::get_type(),
613
+ [
614
+ 'name' => 'features_list_typography',
615
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-features-list > li',
616
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
617
+ ]
618
+ );
619
+
620
+ $this->end_controls_section();
621
+
622
+ $this->start_controls_section(
623
+ '_section_style_footer',
624
+ [
625
+ 'label' => __( 'Footer', 'happy-elementor-addons' ),
626
+ 'tab' => Controls_Manager::TAB_STYLE,
627
+ ]
628
+ );
629
+
630
+ $this->add_control(
631
+ '_heading_button',
632
+ [
633
+ 'type' => Controls_Manager::HEADING,
634
+ 'label' => __( 'Button', 'happy-elementor-addons' ),
635
+ ]
636
+ );
637
+
638
+ $this->add_responsive_control(
639
+ 'button_padding',
640
+ [
641
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
642
+ 'type' => Controls_Manager::DIMENSIONS,
643
+ 'size_units' => [ 'px', 'em', '%' ],
644
+ 'selectors' => [
645
+ '{{WRAPPER}} .ha-pricing-table-btn' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
646
+ ],
647
+ ]
648
+ );
649
+
650
+ $this->add_group_control(
651
+ Group_Control_Border::get_type(),
652
+ [
653
+ 'name' => 'button_border',
654
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-btn',
655
+ ]
656
+ );
657
+
658
+ $this->add_control(
659
+ 'button_border_radius',
660
+ [
661
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
662
+ 'type' => Controls_Manager::DIMENSIONS,
663
+ 'size_units' => [ 'px', '%' ],
664
+ 'selectors' => [
665
+ '{{WRAPPER}} .ha-pricing-table-btn' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
666
+ ],
667
+ ]
668
+ );
669
+
670
+ $this->add_group_control(
671
+ Group_Control_Box_Shadow::get_type(),
672
+ [
673
+ 'name' => 'button_box_shadow',
674
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-btn',
675
+ ]
676
+ );
677
+
678
+ $this->add_group_control(
679
+ Group_Control_Typography::get_type(),
680
+ [
681
+ 'name' => 'button_typography',
682
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-btn',
683
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_4,
684
+ ]
685
+ );
686
+
687
+ $this->add_control(
688
+ 'hr',
689
+ [
690
+ 'type' => Controls_Manager::DIVIDER,
691
+ 'style' => 'thick',
692
+ ]
693
+ );
694
+
695
+ $this->start_controls_tabs( '_tabs_button' );
696
+
697
+ $this->start_controls_tab(
698
+ '_tab_button_normal',
699
+ [
700
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
701
+ ]
702
+ );
703
+
704
+ $this->add_control(
705
+ 'button_color',
706
+ [
707
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
708
+ 'type' => Controls_Manager::COLOR,
709
+ 'selectors' => [
710
+ '{{WRAPPER}} .ha-pricing-table-btn' => 'color: {{VALUE}};',
711
+ ],
712
+ ]
713
+ );
714
+
715
+ $this->add_control(
716
+ 'button_bg_color',
717
+ [
718
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
719
+ 'type' => Controls_Manager::COLOR,
720
+ 'selectors' => [
721
+ '{{WRAPPER}} .ha-pricing-table-btn' => 'background-color: {{VALUE}};',
722
+ ],
723
+ ]
724
+ );
725
+
726
+ $this->end_controls_tab();
727
+
728
+ $this->start_controls_tab(
729
+ '_tab_button_hover',
730
+ [
731
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
732
+ ]
733
+ );
734
+
735
+ $this->add_control(
736
+ 'button_hover_color',
737
+ [
738
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
739
+ 'type' => Controls_Manager::COLOR,
740
+ 'selectors' => [
741
+ '{{WRAPPER}} .ha-pricing-table-btn:hover, {{WRAPPER}} .ha-pricing-table-btn:focus' => 'color: {{VALUE}};',
742
+ ],
743
+ ]
744
+ );
745
+
746
+ $this->add_control(
747
+ 'button_hover_bg_color',
748
+ [
749
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
750
+ 'type' => Controls_Manager::COLOR,
751
+ 'selectors' => [
752
+ '{{WRAPPER}} .ha-pricing-table-btn:hover, {{WRAPPER}} .ha-pricing-table-btn:focus' => 'background-color: {{VALUE}};',
753
+ ],
754
+ ]
755
+ );
756
+
757
+ $this->add_control(
758
+ 'button_hover_border_color',
759
+ [
760
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
761
+ 'type' => Controls_Manager::COLOR,
762
+ 'condition' => [
763
+ 'button_border_border!' => '',
764
+ ],
765
+ 'selectors' => [
766
+ '{{WRAPPER}} .ha-pricing-table-btn:hover, {{WRAPPER}} .ha-pricing-table-btn:focus' => 'border-color: {{VALUE}};',
767
+ ],
768
+ ]
769
+ );
770
+
771
+ $this->end_controls_tab();
772
+ $this->end_controls_tabs();
773
+ $this->end_controls_section();
774
+
775
+ $this->start_controls_section(
776
+ '_section_style_badge',
777
+ [
778
+ 'label' => __( 'Badge', 'happy-elementor-addons' ),
779
+ 'tab' => Controls_Manager::TAB_STYLE,
780
+ ]
781
+ );
782
+
783
+ $this->add_responsive_control(
784
+ 'badge_padding',
785
+ [
786
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
787
+ 'type' => Controls_Manager::DIMENSIONS,
788
+ 'size_units' => [ 'px', 'em', '%' ],
789
+ 'selectors' => [
790
+ '{{WRAPPER}} .ha-pricing-table-badge' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
791
+ ],
792
+ ]
793
+ );
794
+
795
+ $this->add_control(
796
+ 'badge_color',
797
+ [
798
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
799
+ 'type' => Controls_Manager::COLOR,
800
+ 'selectors' => [
801
+ '{{WRAPPER}} .ha-pricing-table-badge' => 'color: {{VALUE}};',
802
+ ],
803
+ ]
804
+ );
805
+
806
+ $this->add_control(
807
+ 'badge_bg_color',
808
+ [
809
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
810
+ 'type' => Controls_Manager::COLOR,
811
+ 'selectors' => [
812
+ '{{WRAPPER}} .ha-pricing-table-badge' => 'background-color: {{VALUE}};',
813
+ ],
814
+ ]
815
+ );
816
+
817
+ $this->add_group_control(
818
+ Group_Control_Border::get_type(),
819
+ [
820
+ 'name' => 'badge_border',
821
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-badge',
822
+ ]
823
+ );
824
+
825
+ $this->add_responsive_control(
826
+ 'badge_border_radius',
827
+ [
828
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
829
+ 'type' => Controls_Manager::DIMENSIONS,
830
+ 'size_units' => [ 'px', '%' ],
831
+ 'selectors' => [
832
+ '{{WRAPPER}} .ha-pricing-table-badge' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
833
+ ],
834
+ ]
835
+ );
836
+
837
+ $this->add_group_control(
838
+ Group_Control_Box_Shadow::get_type(),
839
+ [
840
+ 'name' => 'badge_box_shadow',
841
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-badge',
842
+ ]
843
+ );
844
+
845
+ $this->add_group_control(
846
+ Group_Control_Typography::get_type(),
847
+ [
848
+ 'name' => 'badge_typography',
849
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
850
+ 'selector' => '{{WRAPPER}} .ha-pricing-table-badge',
851
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
852
+ ]
853
+ );
854
+
855
+ $this->end_controls_section();
856
+ }
857
+
858
+ private static function get_currency_symbol( $symbol_name ) {
859
+ $symbols = [
860
+ 'baht' => '&#3647;',
861
+ 'bdt' => '&#2547;',
862
+ 'dollar' => '&#36;',
863
+ 'euro' => '&#128;',
864
+ 'franc' => '&#8355;',
865
+ 'guilder' => '&fnof;',
866
+ 'indian_rupee' => '&#8377;',
867
+ 'pound' => '&#163;',
868
+ 'peso' => '&#8369;',
869
+ 'peseta' => '&#8359',
870
+ 'lira' => '&#8356;',
871
+ 'ruble' => '&#8381;',
872
+ 'shekel' => '&#8362;',
873
+ 'rupee' => '&#8360;',
874
+ 'real' => 'R$',
875
+ 'krona' => 'kr',
876
+ 'won' => '&#8361;',
877
+ 'yen' => '&#165;',
878
+ ];
879
+
880
+ return isset( $symbols[ $symbol_name ] ) ? $symbols[ $symbol_name ] : '';
881
+ }
882
+
883
+ protected function render() {
884
+ $settings = $this->get_settings_for_display();
885
+
886
+ $this->add_render_attribute( 'badge_text', 'class',
887
+ [
888
+ 'ha-pricing-table-badge',
889
+ 'ha-pricing-table-badge--' . $settings['badge_position']
890
+ ]
891
+ );
892
+
893
+ $this->add_inline_editing_attributes( 'title', 'basic' );
894
+ $this->add_render_attribute( 'title', 'class', 'ha-pricing-table-title' );
895
+
896
+ $this->add_inline_editing_attributes( 'price', 'none' );
897
+ $this->add_render_attribute( 'price', 'class', 'ha-pricing-table-price-text' );
898
+
899
+ $this->add_inline_editing_attributes( 'period', 'none' );
900
+ $this->add_render_attribute( 'period', 'class', 'ha-pricing-table-period' );
901
+
902
+ $this->add_inline_editing_attributes( 'features_title', 'basic' );
903
+ $this->add_render_attribute( 'features_title', 'class', 'ha-pricing-table-features-title' );
904
+
905
+ $this->add_inline_editing_attributes( 'button_text', 'none' );
906
+ $this->add_render_attribute( 'button_text', 'class', 'ha-pricing-table-btn' );
907
+
908
+ $this->add_render_attribute( 'button_text', 'href', esc_url( $settings['button_link']['url'] ) );
909
+ if ( ! empty( $settings['button_link']['is_external'] ) ) {
910
+ $this->add_render_attribute( 'button_text', 'target', '_blank' );
911
+ }
912
+ if ( ! empty( $settings['button_link']['nofollow'] ) ) {
913
+ $this->add_render_attribute( 'button_text', 'rel', 'nofollow' );
914
+ }
915
+
916
+ if ( $settings['currency'] === 'custom' ) {
917
+ $currency = $settings['currency_custom'];
918
+ } else {
919
+ $currency = self::get_currency_symbol( $settings['currency'] );
920
+ }
921
+ ?>
922
+
923
+ <?php if ( $settings['show_badge'] ) : ?>
924
+ <span <?php $this->print_render_attribute_string( 'badge_text' ); ?>><?php echo $settings['badge_text']; ?></span>
925
+ <?php endif; ?>
926
+
927
+ <div class="ha-pricing-table-header">
928
+ <?php if ( $settings['title'] ) : ?>
929
+ <h2 <?php $this->print_render_attribute_string( 'title' ); ?>><?php echo $settings['title']; ?></h2>
930
+ <?php endif; ?>
931
+ </div>
932
+ <div class="ha-pricing-table-price">
933
+ <div class="ha-pricing-table-price-tag"><span class="ha-pricing-table-currency"><?php echo $currency; ?></span><span <?php $this->print_render_attribute_string( 'price' ); ?>><?php echo $settings['price']; ?></span></div>
934
+ <?php if ( $settings['period'] ) : ?>
935
+ <div <?php $this->print_render_attribute_string( 'period' ); ?>><?php echo $settings['period']; ?></div>
936
+ <?php endif; ?>
937
+ </div>
938
+ <div class="ha-pricing-table-body">
939
+ <?php if ( $settings['features_title'] ) : ?>
940
+ <h3 <?php $this->print_render_attribute_string( 'features_title' ); ?>><?php echo $settings['features_title']; ?></h3>
941
+ <?php endif; ?>
942
+
943
+ <?php if ( is_array( $settings['features_list'] ) ) : ?>
944
+ <ul class="ha-pricing-table-features-list">
945
+ <?php foreach ( $settings['features_list'] as $index => $feature ) :
946
+ $name_key = $this->get_repeater_setting_key( 'text', 'features_list', $index );
947
+ $this->add_inline_editing_attributes( $name_key, 'basic' );
948
+ $this->add_render_attribute( $name_key, 'class', 'ha-pricing-table-feature-text' );
949
+ ?>
950
+ <li class="<?php echo esc_attr( 'elementor-repeater-item-' . $feature['_id'] ); ?>">
951
+ <?php if ( $feature['icon'] ) : ?>
952
+ <i class="<?php echo esc_attr( $feature['icon'] ); ?>"></i>
953
+ <?php endif; ?>
954
+ <span <?php $this->print_render_attribute_string( $name_key ); ?>><?php echo $feature['text']; ?></span>
955
+ </li>
956
+ <?php endforeach; ?>
957
+ </ul>
958
+ <?php endif; ?>
959
+ </div>
960
+
961
+ <?php if ( $settings['button_text'] ) : ?>
962
+ <a <?php $this->print_render_attribute_string( 'button_text' ); ?>><?php echo $settings['button_text']; ?></a>
963
+ <?php endif; ?>
964
+
965
+ <?php
966
+ }
967
+ }
widgets/skills/widget.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
  /**
3
- * Skillsbar widget class
4
  *
5
  * @package Happy_Addons
6
  */
@@ -42,7 +42,7 @@ class Skills extends Base {
42
  }
43
 
44
  public function get_keywords() {
45
- return [ 'progress', 'skill', 'bar' ];
46
  }
47
 
48
  protected function register_content_controls() {
@@ -139,7 +139,28 @@ class Skills extends Base {
139
  'show_label' => false,
140
  'type' => Controls_Manager::REPEATER,
141
  'fields' => $repeater->get_controls(),
142
- 'title_field' => '<# print((name || level.size) ? (name || "Skill") + " - " + level.size + level.unit : "Skill - 0%") #>'
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
143
  ]
144
  );
145
 
@@ -191,7 +212,7 @@ class Skills extends Base {
191
  $this->add_control(
192
  'spacing',
193
  [
194
- 'label' => __( 'Top Spacing', 'happy-elementor-addons' ),
195
  'type' => Controls_Manager::SLIDER,
196
  'size_units' => [ 'px' ],
197
  'range' => [
@@ -303,8 +324,8 @@ class Skills extends Base {
303
  $this->add_inline_editing_attributes( $name_key, 'none' );
304
  ?>
305
  <div class="ha-skill ha-skill--<?php echo esc_attr( $settings['view'] ); ?> elementor-repeater-item-<?php echo $skill['_id']; ?>">
306
- <div class="ha-skill-level" style="width: <?php echo esc_attr( $skill['level']['size'] ); ?>%;">
307
- <div class="ha-skill-info"><span <?php echo $this->get_render_attribute_string( $name_key ); ?>><?php echo esc_html( $skill['name'] ); ?></span><span class="ha-skill-level-text"><?php echo esc_html( $skill['level']['size'] ); ?>%</span></div>
308
  </div>
309
  </div>
310
  <?php
@@ -320,8 +341,8 @@ class Skills extends Base {
320
  view.addInlineEditingAttributes( nameKey, 'none' );
321
  #>
322
  <div class="ha-skill ha-skill--{{settings.view}} elementor-repeater-item-{{skill._id}}">
323
- <div class="ha-skill-level" style="width: {{skill.level.size}}%;">
324
- <div class="ha-skill-info"><span {{{view.getRenderAttributeString( nameKey )}}}>{{skill.name}}</span><span class="ha-skill-level-text">{{skill.level.size}}%</span></div>
325
  </div>
326
  </div>
327
  <# });
1
  <?php
2
  /**
3
+ * Skills widget class
4
  *
5
  * @package Happy_Addons
6
  */
42
  }
43
 
44
  public function get_keywords() {
45
+ return [ 'progress', 'skill', 'bar', 'chart' ];
46
  }
47
 
48
  protected function register_content_controls() {
139
  'show_label' => false,
140
  'type' => Controls_Manager::REPEATER,
141
  'fields' => $repeater->get_controls(),
142
+ 'title_field' => '<# print((name || level.size) ? (name || "Skill") + " - " + level.size + level.unit : "Skill - 0%") #>',
143
+ 'default' => [
144
+ [
145
+ 'name' => 'Design',
146
+ 'level' => ['size' => 97, 'unit' => 'px']
147
+ ],
148
+ [
149
+ 'name' => 'UX',
150
+ 'level' => ['size' => 88, 'unit' => 'px']
151
+ ],
152
+ [
153
+ 'name' => 'Coding',
154
+ 'level' => ['size' => 92, 'unit' => 'px']
155
+ ],
156
+ [
157
+ 'name' => 'Speed',
158
+ ],
159
+ [
160
+ 'name' => 'Passion',
161
+ 'level' => ['size' => 100, 'unit' => 'px']
162
+ ]
163
+ ]
164
  ]
165
  );
166
 
212
  $this->add_control(
213
  'spacing',
214
  [
215
+ 'label' => __( 'Spacing Between', 'happy-elementor-addons' ),
216
  'type' => Controls_Manager::SLIDER,
217
  'size_units' => [ 'px' ],
218
  'range' => [
324
  $this->add_inline_editing_attributes( $name_key, 'none' );
325
  ?>
326
  <div class="ha-skill ha-skill--<?php echo esc_attr( $settings['view'] ); ?> elementor-repeater-item-<?php echo $skill['_id']; ?>">
327
+ <div class="ha-skill-level" data-level="<?php echo esc_attr( $skill['level']['size'] ); ?>">
328
+ <div class="ha-skill-info"><span <?php echo $this->get_render_attribute_string( $name_key ); ?>><?php echo esc_html( $skill['name'] ); ?></span><span class="ha-skill-level-text"></span></div>
329
  </div>
330
  </div>
331
  <?php
341
  view.addInlineEditingAttributes( nameKey, 'none' );
342
  #>
343
  <div class="ha-skill ha-skill--{{settings.view}} elementor-repeater-item-{{skill._id}}">
344
+ <div class="ha-skill-level" data-level="{{skill.level.size}}">
345
+ <div class="ha-skill-info"><span {{{view.getRenderAttributeString( nameKey )}}}>{{skill.name}}</span><span class="ha-skill-level-text"></span></div>
346
  </div>
347
  </div>
348
  <# });
widgets/step-flow/widget.php ADDED
@@ -0,0 +1,598 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Step Flow widget class
4
+ *
5
+ * @package Happy_Addons
6
+ */
7
+ namespace Happy_Addons\Elementor\Widget;
8
+
9
+ use Elementor\Controls_Manager;
10
+ use Elementor\Group_Control_Border;
11
+ use Elementor\Group_Control_Box_Shadow;
12
+ use Elementor\Group_Control_Typography;
13
+ use Elementor\Group_Control_Text_Shadow;
14
+ use Elementor\Scheme_Typography;
15
+
16
+ defined( 'ABSPATH' ) || die();
17
+
18
+ class Step_Flow extends Base {
19
+ /**
20
+ * Get widget title.
21
+ *
22
+ * @since 1.0.0
23
+ * @access public
24
+ *
25
+ * @return string Widget title.
26
+ */
27
+ public function get_title() {
28
+ return __( 'Step Flow', 'happy-elementor-addons' );
29
+ }
30
+
31
+ /**
32
+ * Get widget icon.
33
+ *
34
+ * @since 1.0.0
35
+ * @access public
36
+ *
37
+ * @return string Widget icon.
38
+ */
39
+ public function get_icon() {
40
+ return 'hm hm-step-flow';
41
+ }
42
+
43
+ public function get_keywords() {
44
+ return [ 'step', 'flow' ];
45
+ }
46
+
47
+ protected function register_content_controls() {
48
+ $this->start_controls_section(
49
+ '_section_step',
50
+ [
51
+ 'label' => __( 'Step Flow', 'happy-elementor-addons' ),
52
+ 'tab' => Controls_Manager::TAB_CONTENT,
53
+ ]
54
+ );
55
+
56
+ $this->add_control(
57
+ 'icon',
58
+ [
59
+ 'label' => __( 'Icon', 'happy-elementor-addons' ),
60
+ 'type' => Controls_Manager::ICON,
61
+ 'default' => 'fa fa-home',
62
+ 'options' => ha_get_happy_icons(),
63
+ ]
64
+ );
65
+
66
+ $this->add_control(
67
+ 'badge',
68
+ [
69
+ 'label' => __( 'Badge', 'happy-elementor-addons' ),
70
+ 'type' => Controls_Manager::TEXT,
71
+ 'placeholder' => __( 'Badge', 'happy-elementor-addons' ),
72
+ 'description' => __( 'Keep it blank, if you want to remove the Badge', 'happy-elementor-addons' ),
73
+ 'default' => __( '01', 'happy-elementor-addons' ),
74
+ ]
75
+ );
76
+
77
+ $this->add_control(
78
+ 'title',
79
+ [
80
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
81
+ 'type' => Controls_Manager::TEXT,
82
+ 'label_block' => true,
83
+ 'placeholder' => __( 'Title', 'happy-elementor-addons' ),
84
+ 'default' => __( 'Start Marketing', 'happy-elementor-addons' ),
85
+ 'separator' => 'before',
86
+ ]
87
+ );
88
+
89
+ $this->add_control(
90
+ 'description',
91
+ [
92
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
93
+ 'type' => Controls_Manager::TEXTAREA,
94
+ 'placeholder' => __( 'Description', 'happy-elementor-addons' ),
95
+ 'default' => __( 'consectetur adipiscing elit, sed do<br>eiusmod Lorem ipsum dolor sit amet,<br> consectetur.', 'happy-elementor-addons' ),
96
+ ]
97
+ );
98
+
99
+ $this->add_control(
100
+ 'link',
101
+ [
102
+ 'label' => __( 'Link', 'happy-elementor-addons' ),
103
+ 'type' => Controls_Manager::URL,
104
+ 'placeholder' => __( 'https://example.com', 'happy-elementor-addons' ),
105
+ ]
106
+ );
107
+
108
+ $this->add_control(
109
+ 'content_alignment',
110
+ [
111
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
112
+ 'type' => Controls_Manager::CHOOSE,
113
+ 'separator' => 'before',
114
+ 'options' => [
115
+ 'left' => [
116
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
117
+ 'icon' => 'fa fa-align-left',
118
+ ],
119
+ 'center' => [
120
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
121
+ 'icon' => 'fa fa-align-center',
122
+ ],
123
+ 'right' => [
124
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
125
+ 'icon' => 'fa fa-align-right',
126
+ ],
127
+ 'justify' => [
128
+ 'title' => __( 'Justify', 'happy-elementor-addons' ),
129
+ 'icon' => 'fa fa-align-justify',
130
+ ],
131
+ ],
132
+ 'toggle' => true,
133
+ 'selectors' => [
134
+ '{{WRAPPER}} .elementor-widget-container' => 'text-align: {{VALUE}}'
135
+ ]
136
+ ]
137
+ );
138
+
139
+ $this->add_control(
140
+ 'show_indicator',
141
+ [
142
+ 'label' => __( 'Show Direction', 'happy-elementor-addons' ),
143
+ 'type' => Controls_Manager::SWITCHER,
144
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
145
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
146
+ 'return_value' => 'yes',
147
+ 'default' => 'yes',
148
+ ]
149
+ );
150
+
151
+ $this->end_controls_section();
152
+ }
153
+
154
+ protected function register_style_controls() {
155
+ $this->start_controls_section(
156
+ '_section_icon_style',
157
+ [
158
+ 'label' => __( 'Icon', 'happy-elementor-addons' ),
159
+ 'tab' => Controls_Manager::TAB_STYLE,
160
+ ]
161
+ );
162
+
163
+ $this->add_responsive_control(
164
+ 'icon_size',
165
+ [
166
+ 'label' => __( 'Size', 'happy-elementor-addons' ),
167
+ 'type' => Controls_Manager::SLIDER,
168
+ 'size_units' => [ 'px', 'em' ],
169
+ 'range' => [
170
+ 'px' => [
171
+ 'min' => 0,
172
+ 'max' => 100,
173
+ ]
174
+ ],
175
+ 'selectors' => [
176
+ '{{WRAPPER}} .ha-steps-icon' => 'font-size: {{SIZE}}{{UNIT}};',
177
+ ],
178
+ ]
179
+ );
180
+
181
+ $this->add_responsive_control(
182
+ 'icon_padding',
183
+ [
184
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
185
+ 'type' => Controls_Manager::SLIDER,
186
+ 'size_units' => [ 'px', '%' ],
187
+ 'range' => [
188
+ 'px' => [
189
+ 'min' => 0,
190
+ 'max' => 200,
191
+ ]
192
+ ],
193
+ 'selectors' => [
194
+ '{{WRAPPER}} .ha-steps-icon' => 'padding: {{SIZE}}{{UNIT}};',
195
+ ],
196
+ ]
197
+ );
198
+
199
+ $this->add_responsive_control(
200
+ 'icon_spacing',
201
+ [
202
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
203
+ 'type' => Controls_Manager::SLIDER,
204
+ 'size_units' => [ 'px', '%' ],
205
+ 'range' => [
206
+ 'px' => [
207
+ 'min' => 0,
208
+ 'max' => 100,
209
+ ]
210
+ ],
211
+ 'selectors' => [
212
+ '{{WRAPPER}} .ha-steps-icon' => 'margin-bottom: {{SIZE}}{{UNIT}};',
213
+ ],
214
+ ]
215
+ );
216
+
217
+ $this->add_group_control(
218
+ Group_Control_Border::get_type(),
219
+ [
220
+ 'name' => 'icon_border',
221
+ 'label' => __( 'Border', 'happy-elementor-addons' ),
222
+ 'selector' => '{{WRAPPER}} .ha-steps-icon',
223
+ ]
224
+ );
225
+
226
+ $this->add_responsive_control(
227
+ 'icon_border_radius',
228
+ [
229
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
230
+ 'type' => Controls_Manager::DIMENSIONS,
231
+ 'size_units' => [ 'px', '%' ],
232
+ 'selectors' => [
233
+ '{{WRAPPER}} .ha-steps-icon' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
234
+ ],
235
+ ]
236
+ );
237
+
238
+ $this->add_group_control(
239
+ Group_Control_Box_Shadow::get_type(),
240
+ [
241
+ 'name' => 'icon_box_shadow',
242
+ 'selector' => '{{WRAPPER}} .ha-steps-icon',
243
+ ]
244
+ );
245
+
246
+ $this->add_control(
247
+ 'icon_color',
248
+ [
249
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
250
+ 'type' => Controls_Manager::COLOR,
251
+ 'selectors' => [
252
+ '{{WRAPPER}} .ha-steps-icon i' => 'color: {{VALUE}}',
253
+ ],
254
+ ]
255
+ );
256
+
257
+ $this->add_control(
258
+ 'icon_background_color',
259
+ [
260
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
261
+ 'type' => Controls_Manager::COLOR,
262
+ 'selectors' => [
263
+ '{{WRAPPER}} .ha-steps-icon' => 'background: {{VALUE}}',
264
+ ],
265
+ ]
266
+ );
267
+
268
+ $this->end_controls_section();
269
+
270
+ $this->start_controls_section(
271
+ '_section_badge_style',
272
+ [
273
+ 'label' => __('Badge', 'happy-elementor-addons'),
274
+ 'tab' => Controls_Manager::TAB_STYLE,
275
+ 'condition' => [
276
+ 'badge!' => '',
277
+ ],
278
+ ]
279
+ );
280
+
281
+ $this->add_responsive_control(
282
+ 'badge_padding',
283
+ [
284
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
285
+ 'type' => Controls_Manager::DIMENSIONS,
286
+ 'size_units' => [ 'px', '%' ],
287
+ 'condition' => [
288
+ 'badge!' => '',
289
+ ],
290
+ 'selectors' => [
291
+ '{{WRAPPER}} .ha-steps-label' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
292
+ ],
293
+ ]
294
+ );
295
+
296
+ $this->add_group_control(
297
+ Group_Control_Border::get_type(),
298
+ [
299
+ 'name' => 'badge_border',
300
+ 'label' => __( 'Border', 'happy-elementor-addons' ),
301
+ 'selector' => '{{WRAPPER}} .ha-steps-label',
302
+ 'condition' => [
303
+ 'badge!' => '',
304
+ ],
305
+ ]
306
+ );
307
+
308
+ $this->add_responsive_control(
309
+ 'badge_border_radius',
310
+ [
311
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
312
+ 'type' => Controls_Manager::DIMENSIONS,
313
+ 'size_units' => [ 'px', '%' ],
314
+ 'condition' => [
315
+ 'badge!' => '',
316
+ ],
317
+ 'selectors' => [
318
+ '{{WRAPPER}} .ha-steps-label' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
319
+ ],
320
+ ]
321
+ );
322
+
323
+ $this->add_control(
324
+ 'badge_color',
325
+ [
326
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
327
+ 'type' => Controls_Manager::COLOR,
328
+ 'condition' => [
329
+ 'badge!' => '',
330
+ ],
331
+ 'selectors' => [
332
+ '{{WRAPPER}} .ha-steps-label' => 'color: {{VALUE}}',
333
+ ],
334
+ ]
335
+ );
336
+
337
+ $this->add_control(
338
+ 'badge_background_color',
339
+ [
340
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
341
+ 'type' => Controls_Manager::COLOR,
342
+ 'condition' => [
343
+ 'badge!' => '',
344
+ ],
345
+ 'selectors' => [
346
+ '{{WRAPPER}} .ha-steps-label' => 'background: {{VALUE}}',
347
+ ],
348
+ ]
349
+ );
350
+
351
+ $this->add_group_control(
352
+ Group_Control_Typography::get_type(),
353
+ [
354
+ 'name' => 'badge_typography',
355
+ 'selector' => '{{WRAPPER}} .ha-steps-label',
356
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_4,
357
+ 'condition' => [
358
+ 'badge!' => '',
359
+ ],
360
+ ]
361
+ );
362
+
363
+ $this->end_controls_section();
364
+
365
+ $this->start_controls_section(
366
+ '_section_title_style',
367
+ [
368
+ 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
369
+ 'tab' => Controls_Manager::TAB_STYLE,
370
+ ]
371
+ );
372
+
373
+ $this->add_control(
374
+ '_heading_title',
375
+ [
376
+ 'type' => Controls_Manager::HEADING,
377
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
378
+ ]
379
+ );
380
+
381
+ $this->add_responsive_control(
382
+ 'title_spacing',
383
+ [
384
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
385
+ 'type' => Controls_Manager::SLIDER,
386
+ 'size_units' => [ 'px' ],
387
+ 'selectors' => [
388
+ '{{WRAPPER}} .ha-steps-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
389
+ ],
390
+ ]
391
+ );
392
+
393
+ $this->add_control(
394
+ 'title_color',
395
+ [
396
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
397
+ 'type' => Controls_Manager::COLOR,
398
+ 'selectors' => [
399
+ '{{WRAPPER}} .ha-steps-title' => 'color: {{VALUE}};',
400
+ ],
401
+ ]
402
+ );
403
+
404
+ $this->add_control(
405
+ 'title_link_color',
406
+ [
407
+ 'label' => __( 'Link Color', 'happy-elementor-addons' ),
408
+ 'type' => Controls_Manager::COLOR,
409
+ 'condition' => [
410
+ 'link[url]!' => ''
411
+ ],
412
+ 'selectors' => [
413
+ '{{WRAPPER}} .ha-steps-title a' => 'color: {{VALUE}};',
414
+ ],
415
+ ]
416
+ );
417
+
418
+ $this->add_control(
419
+ 'title_hover_color',
420
+ [
421
+ 'label' => __( 'Hover Color', 'happy-elementor-addons' ),
422
+ 'type' => Controls_Manager::COLOR,
423
+ 'condition' => [
424
+ 'link[url]!' => ''
425
+ ],
426
+ 'selectors' => [
427
+ '{{WRAPPER}} .ha-steps-title a:hover' => 'color: {{VALUE}};',
428
+ ],
429
+ ]
430
+ );
431
+
432
+ $this->add_group_control(
433
+ Group_Control_Text_Shadow::get_type(),
434
+ [
435
+ 'name' => 'title_shadow',
436
+ 'selector' => '{{WRAPPER}} .ha-steps-title',
437
+ ]
438
+ );
439
+
440
+ $this->add_group_control(
441
+ Group_Control_Typography::get_type(),
442
+ [
443
+ 'name' => 'title_typography',
444
+ 'selector' => '{{WRAPPER}} .ha-steps-title',
445
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
446
+ ]
447
+ );
448
+
449
+ $this->add_control(
450
+ '_heading_description',
451
+ [
452
+ 'type' => Controls_Manager::HEADING,
453
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
454
+ 'separator' => 'before',
455
+ ]
456
+ );
457
+
458
+ $this->add_control(
459
+ 'description_color',
460
+ [
461
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
462
+ 'type' => Controls_Manager::COLOR,
463
+ 'selectors' => [
464
+ '{{WRAPPER}} .ha-step-description' => 'color: {{VALUE}};',
465
+ ],
466
+ ]
467
+ );
468
+
469
+ $this->add_group_control(
470
+ Group_Control_Text_Shadow::get_type(),
471
+ [
472
+ 'name' => 'description_shadow',
473
+ 'selector' => '{{WRAPPER}} .ha-step-description',
474
+ ]
475
+ );
476
+
477
+ $this->add_group_control(
478
+ Group_Control_Typography::get_type(),
479
+ [
480
+ 'name' => 'description_typography',
481
+ 'selector' => '{{WRAPPER}} .ha-step-description',
482
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
483
+ ]
484
+ );
485
+
486
+ $this->end_controls_section();
487
+
488
+ $this->start_controls_section(
489
+ '_section_direction_style',
490
+ [
491
+ 'label' => __( 'Direction', 'happy-elementor-addons' ),
492
+ 'tab' => Controls_Manager::TAB_STYLE,
493
+ ]
494
+ );
495
+
496
+ $this->add_control(
497
+ 'direction_style',
498
+ [
499
+ 'label' => __( 'Style', 'elementor' ),
500
+ 'type' => Controls_Manager::SELECT,
501
+ 'options' => [
502
+ 'solid' => __( 'Solid', 'happy-elementor-addons' ),
503
+ 'dotted' => __( 'Dotted', 'happy-elementor-addons' ),
504
+ 'dashed' => __( 'Dashed', 'happy-elementor-addons' ),
505
+ ],
506
+ 'default' => 'dashed',
507
+ 'selectors' => [
508
+ '{{WRAPPER}} .ha-step-arrow' => 'border-top-style: {{VALUE}}',
509
+ ],
510
+ ]
511
+ );
512
+
513
+ $this->add_control(
514
+ 'direction_width',
515
+ [
516
+ 'label' => __( 'Width', 'happy-elementor-addons' ),
517
+ 'type' => Controls_Manager::SLIDER,
518
+ 'size_units' => ['px', '%'],
519
+ 'range' => [
520
+ 'px' => [
521
+ 'min' => 1,
522
+ 'max' => 150,
523
+ ],
524
+ ],
525
+ 'selectors' => [
526
+ '{{WRAPPER}} .ha-step-arrow' => 'width: {{SIZE}}{{UNIT}};',
527
+ ],
528
+ ]
529
+ );
530
+
531
+ $this->add_control(
532
+ 'direction_color',
533
+ [
534
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
535
+ 'type' => Controls_Manager::COLOR,
536
+ 'selectors' => [
537
+ '{{WRAPPER}} .ha-step-arrow' => 'border-color: {{VALUE}};',
538
+ '{{WRAPPER}} .ha-step-arrow:after' => 'color: {{VALUE}};',
539
+ ],
540
+ ]
541
+ );
542
+
543
+ $this->end_controls_section();
544
+ }
545
+
546
+ protected function render() {
547
+ $settings = $this->get_settings_for_display();
548
+
549
+ $this->add_render_attribute( 'title', 'class', 'ha-steps-title' );
550
+
551
+ $this->add_render_attribute( 'description', 'class', 'ha-step-description' );
552
+ $this->add_inline_editing_attributes( 'description', 'basic' );
553
+
554
+ $this->add_render_attribute( 'badge', 'class', 'ha-steps-label' );
555
+ $this->add_inline_editing_attributes( 'badge', 'none' );
556
+
557
+ if ( $settings['link']['url'] ) {
558
+ $this->add_inline_editing_attributes( 'link', 'basic', 'title' );
559
+ $this->add_render_attribute( 'link', 'href', esc_url( $settings['link']['url'] ) );
560
+ if ( ! empty( $settings['link']['is_external'] ) ) {
561
+ $this->add_render_attribute( 'link', 'target', '_blank' );
562
+ }
563
+ if ( ! empty( $settings['link']['nofollow'] ) ) {
564
+ $this->set_render_attribute( 'link', 'rel', 'nofollow' );
565
+ }
566
+ } else {
567
+ $this->add_inline_editing_attributes( 'title', 'basic' );
568
+ }
569
+ ?>
570
+
571
+ <div class="ha-steps-icon">
572
+ <?php if ( $settings['show_indicator'] === 'yes' ) : ?>
573
+ <div class="ha-step-arrow"></div>
574
+ <?php endif; ?>
575
+
576
+ <i class="<?php echo esc_attr( $settings['icon'] ); ?>"></i>
577
+
578
+ <?php if ( $settings['badge'] ) : ?>
579
+ <span <?php $this->print_render_attribute_string( 'badge' ); ?>><?php echo esc_html( $settings['badge'] ); ?></span>
580
+ <?php endif; ?>
581
+ </div>
582
+
583
+ <h2 <?php $this->print_render_attribute_string( 'title' ); ?>>
584
+ <?php if ( ! empty( $settings['link']['url'] ) ) : ?>
585
+ <a <?php $this->print_render_attribute_string( 'link' ); ?>><?php echo $settings['title']; ?></a>
586
+ <?php else : ?>
587
+ <?php echo $settings['title']; ?>
588
+ <?php endif; ?>
589
+ </h2>
590
+
591
+ <?php if ( $settings['description'] ) : ?>
592
+ <p <?php $this->print_render_attribute_string( 'description' ); ?>><?php echo $settings['description']; ?></p>
593
+ <?php endif; ?>
594
+
595
+ <?php
596
+ }
597
+
598
+ }