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

Version Description

  • 1 June 2020 =

  • Tweak: Slide item link support for Carousel widget

  • Tweak: Slide item link support for Slider widget

  • Tweak: More html tags support for textarea/description type input

  • Tweak: Advanced button support for Team Member widget

  • Tweak: Restored default placeholder image

  • Fix: Adminbar happy icon markup issue

  • Fix: Carousel and Slider css issue

  • Fix: SVG icon sizing issues in all widgets

  • Fix: WPML support issue

  • Fix: 360 widget default style

Download this release

Release Info

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

Code changes from version 2.10.0 to 2.11.0

Files changed (43) hide show
  1. assets/admin/js/editor.js +111 -26
  2. assets/admin/js/editor.min.js +1 -1
  3. assets/css/main.css +120 -61
  4. assets/css/main.min.css +1 -1
  5. assets/css/widgets/btn.min.css +1 -1
  6. assets/css/widgets/flip-box.min.css +1 -1
  7. assets/css/widgets/fun-factor.min.css +1 -1
  8. assets/css/widgets/icon-box.min.css +1 -1
  9. assets/css/widgets/infobox.min.css +1 -1
  10. assets/css/widgets/member.min.css +1 -1
  11. assets/css/widgets/post-list.min.css +1 -1
  12. assets/css/widgets/pricing-table.min.css +1 -1
  13. assets/css/widgets/slider-carousel.min.css +1 -1
  14. assets/css/widgets/social-icons.min.css +1 -1
  15. assets/css/widgets/steps-flow.min.css +1 -1
  16. assets/css/widgets/taxonomy-list.min.css +1 -1
  17. assets/imgs/bf-img.png +0 -0
  18. assets/imgs/placeholder.jpg +0 -0
  19. base.php +3 -13
  20. changelog.txt +13 -0
  21. classes/admin-bar.php +1 -1
  22. classes/assets-manager.php +0 -7
  23. classes/widgets-manager.php +2 -1
  24. classes/wpml-manager.php +4 -0
  25. extensions/wrapper-link.php +1 -1
  26. inc/functions.php +79 -5
  27. plugin.php +2 -2
  28. readme.txt +20 -1
  29. traits/button-renderer.php +58 -0
  30. widgets/card/widget.php +1093 -1160
  31. widgets/carousel/widget.php +790 -768
  32. widgets/dual-button/widget.php +2 -2
  33. widgets/flip-box/widget.php +24 -4
  34. widgets/fun-factor/widget.php +51 -65
  35. widgets/gradient-heading/widget.php +1 -1
  36. widgets/icon-box/widget.php +4 -4
  37. widgets/infobox/widget.php +967 -1028
  38. widgets/member/widget.php +1287 -970
  39. widgets/pricing-table/widget.php +2 -2
  40. widgets/slider/widget.php +32 -8
  41. widgets/social-icons/widget.php +4 -7
  42. widgets/step-flow/widget.php +7 -3
  43. widgets/threesixty-rotation/widget.php +9 -1
assets/admin/js/editor.js CHANGED
@@ -1,5 +1,108 @@
1
  ;(function($) {
2
- 'use strict';
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
3
 
4
  elementor.on('panel:init', function() {
5
  $('#elementor-panel-elements-search-input').on('keyup', _.debounce(function() {
@@ -128,27 +231,10 @@
128
  elementor.addControlView( 'icons', WithHappyIcons );
129
  }
130
 
131
- window.ha_has_icon_library = function() {
132
- return ( elementor.helpers && elementor.helpers.renderIcon );
133
- };
134
-
135
- window.ha_get_feature_label = function( text ) {
136
- var div = document.createElement('DIV');
137
-
138
- div.innerHTML = text;
139
- text = div.textContent || div.innerText || text;
140
-
141
- return text.length > 20 ? text.substring(0, 20) + "..." : text;
142
- };
143
-
144
- function ha_translate(stringKey, templateArgs) {
145
- return elementorCommon.translate(stringKey, null, templateArgs, HappyAddonsEditor.i18n);
146
- }
147
-
148
  elementor.modules.layouts.panel.pages.menu.Menu.addItem({
149
  name: 'happyaddons-home',
150
  icon: 'hm hm-happyaddons',
151
- title: ha_translate( 'editorPanelHomeLinkTitle' ),
152
  type: 'link',
153
  link: HappyAddonsEditor.editorPanelHomeLinkURL,
154
  newTab: true
@@ -157,12 +243,12 @@
157
  elementor.modules.layouts.panel.pages.menu.Menu.addItem({
158
  name: 'happyaddons-widgets',
159
  icon: 'hm hm-cross-game',
160
- title: ha_translate( 'editorPanelWidgetsLinkTitle' ),
161
  type: 'link',
162
  link: HappyAddonsEditor.editorPanelWidgetsLinkURL,
163
  newTab: true
164
  }, 'settings');
165
-
166
  /**
167
  * Add pro widgets placeholder
168
  */
@@ -206,7 +292,7 @@
206
  defaultActive: false,
207
  items: proWidgets,
208
  }, {
209
- at: freeCategoryIndex + 1
210
  });
211
  }
212
 
@@ -234,8 +320,8 @@
234
  elementor.promotion.dialog.buttons[0].addClass('ha-btn--promotion');
235
 
236
  elementor.promotion.showDialog( {
237
- headerMessage: ha_translate( 'promotionDialogHeader', [ this.model.get( 'title' ) ] ),
238
- message: ha_translate( 'promotionDialogMessage', [ this.model.get( 'title' ) ] ),
239
  top: '-7',
240
  element: this.el,
241
  actionURL: 'https://demo.happyaddons.com/',
@@ -254,6 +340,5 @@
254
  });
255
 
256
  return regionViews;
257
- });
258
-
259
  }(jQuery));
1
  ;(function($) {
2
+ 'use strict';
3
+
4
+ window.ha = window.ha || {};
5
+
6
+ ha.hasIconLibrary = function() {
7
+ return ( elementor.helpers && elementor.helpers.renderIcon );
8
+ };
9
+
10
+ ha.getFeatureLabel = function( text ) {
11
+ var div = document.createElement('DIV');
12
+
13
+ div.innerHTML = text;
14
+ text = div.textContent || div.innerText || text;
15
+
16
+ return text.length > 20 ? text.substring(0, 20) + '...' : text;
17
+ };
18
+
19
+ ha.translate = function(stringKey, templateArgs) {
20
+ return elementorCommon.translate(stringKey, null, templateArgs, HappyAddonsEditor.i18n);
21
+ };
22
+
23
+ ha.getButtonWithIcon = function(view, args) {
24
+ var buttonMarkup = [],
25
+ settings = {},
26
+ btnIconHTML,
27
+ btnMigrated,
28
+ btnIcon,
29
+ buttonBefore,
30
+ buttonAfter;
31
+
32
+ args = args || {};
33
+ args = _.defaults( args, {
34
+ oldIcon: 'button_icon',
35
+ iconPos: 'button_icon_position',
36
+ newIcon: 'button_selected_icon',
37
+ text: 'button_text',
38
+ link: 'button_link',
39
+ class: 'ha-btn ha-btn--link',
40
+ textClass: 'ha-btn-text',
41
+ } );
42
+
43
+ if (!_.isObject(view) || _.isUndefined(view['getContainer']) ) {
44
+ return '';
45
+ }
46
+
47
+ settings = view.getContainer().settings.toJSON();
48
+
49
+ if ( ha.hasIconLibrary() ) {
50
+ btnIconHTML = elementor.helpers.renderIcon( view, settings[args.newIcon], { 'aria-hidden': true, 'class': 'ha-btn-icon' }, 'i' , 'object' ),
51
+ btnMigrated = elementor.helpers.isIconMigrated( settings, args.newIcon );
52
+ }
53
+
54
+ view.addInlineEditingAttributes( args.text, 'none' );
55
+ view.addRenderAttribute( args.text, 'class', args.textClass );
56
+
57
+ view.addRenderAttribute( 'button', 'class', args.class );
58
+ view.addRenderAttribute( 'button', 'href', settings[args.link].url );
59
+
60
+ if ( ( settings[args.newIcon] && settings[args.newIcon].value ) || settings[args.oldIcon] ) {
61
+ if ( ha.hasIconLibrary() && btnIconHTML && btnIconHTML.rendered && ( ! settings[args.oldIcon] || btnMigrated ) ) {
62
+ if ( settings[args.newIcon].library === 'svg' ) {
63
+ btnIcon = '<span class="ha-btn-icon ha-btn-icon--svg">' + btnIconHTML.value + '</span>';
64
+ } else {
65
+ btnIcon = btnIconHTML.value;
66
+ }
67
+ } else if ( settings[args.oldIcon] ) {
68
+ btnIcon = '<i class="ha-btn-icon ' + args.oldIcon + '" aria-hidden="true"></i>';
69
+ }
70
+ }
71
+
72
+ if ( settings[args.text] && ( ! settings[args.newIcon] && ! settings[args.oldIcon] ) ) {
73
+ buttonMarkup = [
74
+ '<a ' + view.getRenderAttributeString( 'button' ) + '>',
75
+ '<span ' + view.getRenderAttributeString( args.text ) + '>',
76
+ settings[args.text],
77
+ '</span>',
78
+ '</a>',
79
+ ];
80
+ } else if ( ! settings[args.text] && ( settings[args.newIcon] || settings[args.oldIcon] ) ) {
81
+ buttonMarkup = [
82
+ '<a ' + view.getRenderAttributeString( 'button' ) + '>',
83
+ btnIcon,
84
+ '</a>',
85
+ ];
86
+ } else if ( settings[args.text] && ( settings[args.newIcon] || settings[args.oldIcon] ) ) {
87
+ if ( settings[args.iconPos] === 'before' ) {
88
+ view.addRenderAttribute( 'button', 'class', 'ha-btn--icon-before' );
89
+ buttonBefore = btnIcon;
90
+ buttonAfter = '<span ' + view.getRenderAttributeString( args.text ) + '>' + settings[args.text] + '</span>';
91
+ } else {
92
+ view.addRenderAttribute( 'button', 'class', 'ha-btn--icon-after' );
93
+ buttonAfter = btnIcon;
94
+ buttonBefore = '<span ' + view.getRenderAttributeString( args.text ) + '>' + settings[args.text] + '</span>';
95
+ }
96
+ buttonMarkup = [
97
+ '<a ' + view.getRenderAttributeString( 'button' ) + '>',
98
+ buttonBefore,
99
+ buttonAfter,
100
+ '</a>',
101
+ ];
102
+ }
103
+
104
+ return buttonMarkup.join('');
105
+ }
106
 
107
  elementor.on('panel:init', function() {
108
  $('#elementor-panel-elements-search-input').on('keyup', _.debounce(function() {
231
  elementor.addControlView( 'icons', WithHappyIcons );
232
  }
233
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
234
  elementor.modules.layouts.panel.pages.menu.Menu.addItem({
235
  name: 'happyaddons-home',
236
  icon: 'hm hm-happyaddons',
237
+ title: ha.translate( 'editorPanelHomeLinkTitle' ),
238
  type: 'link',
239
  link: HappyAddonsEditor.editorPanelHomeLinkURL,
240
  newTab: true
243
  elementor.modules.layouts.panel.pages.menu.Menu.addItem({
244
  name: 'happyaddons-widgets',
245
  icon: 'hm hm-cross-game',
246
+ title: ha.translate( 'editorPanelWidgetsLinkTitle' ),
247
  type: 'link',
248
  link: HappyAddonsEditor.editorPanelWidgetsLinkURL,
249
  newTab: true
250
  }, 'settings');
251
+
252
  /**
253
  * Add pro widgets placeholder
254
  */
292
  defaultActive: false,
293
  items: proWidgets,
294
  }, {
295
+ at: freeCategoryIndex + 1
296
  });
297
  }
298
 
320
  elementor.promotion.dialog.buttons[0].addClass('ha-btn--promotion');
321
 
322
  elementor.promotion.showDialog( {
323
+ headerMessage: ha.translate( 'promotionDialogHeader', [ this.model.get( 'title' ) ] ),
324
+ message: ha.translate( 'promotionDialogMessage', [ this.model.get( 'title' ) ] ),
325
  top: '-7',
326
  element: this.el,
327
  actionURL: 'https://demo.happyaddons.com/',
340
  });
341
 
342
  return regionViews;
343
+ });
 
344
  }(jQuery));
assets/admin/js/editor.min.js CHANGED
@@ -1 +1 @@
1
- !function(e){"use strict";function t(){return{translate:["x","y","x_tablet","y_tablet","x_mobile","y_mobile"],skew:["x","y","x_tablet","y_tablet","x_mobile","y_mobile"],scale:["x","y","x_tablet","y_tablet","x_mobile","y_mobile"],rotate:["x","y","z","x_tablet","y_tablet","z_tablet","x_mobile","y_mobile","z_mobile"]}}function n(e,t,n){e="ha_transform_fx_"+e,t="ha_transform_fx_"+t,n.on("change:"+e,function(e,o){if(!o){var i=elementor.getPanelView().getCurrentPageView().children.find(function(e){return e.model.get("name")===t});n.set(t,_.extend({},n.defaults[t])),i&&i.render()}})}function o(e){var o=elementorFrontend.config.elements.data[e.cid];_.each(t(),function(e,t){_.each(e,function(e){n(t+"_toggle",t+"_"+e,o)})}),elementor.getPanelView().getCurrentPageView().model.on("editor:close",function(){_.each(t(),function(e,t){o.off("change:ha_transform_fx_"+t+"_toggle")})})}function i(e,t){return elementorCommon.translate(e,null,t,HappyAddonsEditor.i18n)}if(elementor.on("panel:init",function(){if(e("#elementor-panel-elements-search-input").on("keyup",_.debounce(function(){e("#elementor-panel-elements").find(".hm").parents(".elementor-element").addClass("is-ha-widget")},100)),"undefined"!=typeof $e||null!==$e){var t={callback:function(){var e=elementor.settings.page.model.attributes.ha_grid;""===e?elementor.settings.page.model.setExternalChange("ha_grid","yes"):"yes"===e&&elementor.settings.page.model.setExternalChange("ha_grid","")}};$e.shortcuts.register("ctrl+shift+g",t),$e.shortcuts.register("cmd+shift+g",t)}}),elementor.hooks.addAction("panel/open_editor/widget",function(e,t){o(t)}),elementor.modules.controls.Icons){var a=elementor.modules.controls.Icons.extend({getControlValue:function(){var e=this.constructor.__super__.getControlValue.call(this),t=this.model,n=this.getValueToMigrate(),o={value:"",library:"happy-icons"},i=this.container&&this.container.settings||this.elementSettingsModel;if(_.isObject(e)&&!_.isEmpty(e)&&"svg"!==e.library&&0===e.value.indexOf("fashm"))return o.value=e.value.substr(e.value.indexOf("hm hm-")),i.set(t.get("name"),o),o;if(!_.isObject(e)&&n&&0===n.indexOf("hm hm-"))return o.value=n,i.set(t.get("name"),o),o;if(!this.isMigrationAllowed())return n;if(!n)return e;var a=i.get(this.dataKeys.migratedKey),r=t.get("name");return this.cache.migratedFlag[r]?this.cache.migratedFlag[r]:a&&a[r]?e:this.migrateFa4toFa5(n)}});elementor.addControlView("icons",a)}window.ha_has_icon_library=function(){return elementor.helpers&&elementor.helpers.renderIcon},window.ha_get_feature_label=function(e){var t=document.createElement("DIV");return t.innerHTML=e,e=t.textContent||t.innerText||e,e.length>20?e.substring(0,20)+"...":e},elementor.modules.layouts.panel.pages.menu.Menu.addItem({name:"happyaddons-home",icon:"hm hm-happyaddons",title:i("editorPanelHomeLinkTitle"),type:"link",link:HappyAddonsEditor.editorPanelHomeLinkURL,newTab:!0},"settings"),elementor.modules.layouts.panel.pages.menu.Menu.addItem({name:"happyaddons-widgets",icon:"hm hm-cross-game",title:i("editorPanelWidgetsLinkTitle"),type:"link",link:HappyAddonsEditor.editorPanelWidgetsLinkURL,newTab:!0},"settings"),elementor.hooks.addFilter("panel/elements/regionViews",function(e){if(HappyAddonsEditor.hasPro||_.isEmpty(HappyAddonsEditor.proWidgets))return e;var t,n,o=e.elements.view,a=e.categories.view,r=e.elements.options.collection,l=e.categories.options.collection,s=[];return _.each(HappyAddonsEditor.proWidgets,function(e,t){r.add({name:"ha-"+t,title:e.title,icon:e.icon,categories:["happy_addons_pro"],editable:!1})}),r.each(function(e){"happy_addons_pro"===e.get("categories")[0]&&s.push(e)}),n=l.findIndex({name:"happy_addons_category"}),n&&l.add({name:"happy_addons_pro_category",title:"Happy Addons Pro",icon:"hm hm-happyaddons",defaultActive:!1,items:s},{at:n+1}),t={className:function(){var e=this.constructor.__super__.className.call(this);return!this.isEditable()&&this.isHappyWidget()&&(e+=" ha-element--promotion"),e},isHappyWidget:function(){return 0===this.model.get("name").indexOf("ha-")},onMouseDown:function(){if(!this.isHappyWidget())return elementor.promotion.dialog.buttons[0].removeClass("ha-btn--promotion"),void this.constructor.__super__.onMouseDown.call(this);elementor.promotion.dialog.buttons[0].addClass("ha-btn--promotion"),elementor.promotion.showDialog({headerMessage:i("promotionDialogHeader",[this.model.get("title")]),message:i("promotionDialogMessage",[this.model.get("title")]),top:"-7",element:this.el,actionURL:"https://demo.happyaddons.com/"})}},e.elements.view=o.extend({childView:o.prototype.childView.extend(t)}),e.categories.view=a.extend({childView:a.prototype.childView.extend({childView:a.prototype.childView.prototype.childView.extend(t)})}),e})}(jQuery);
1
+ !function(e){"use strict";function t(){return{translate:["x","y","x_tablet","y_tablet","x_mobile","y_mobile"],skew:["x","y","x_tablet","y_tablet","x_mobile","y_mobile"],scale:["x","y","x_tablet","y_tablet","x_mobile","y_mobile"],rotate:["x","y","z","x_tablet","y_tablet","z_tablet","x_mobile","y_mobile","z_mobile"]}}function n(e,t,n){e="ha_transform_fx_"+e,t="ha_transform_fx_"+t,n.on("change:"+e,function(e,o){if(!o){var i=elementor.getPanelView().getCurrentPageView().children.find(function(e){return e.model.get("name")===t});n.set(t,_.extend({},n.defaults[t])),i&&i.render()}})}function o(e){var o=elementorFrontend.config.elements.data[e.cid];_.each(t(),function(e,t){_.each(e,function(e){n(t+"_toggle",t+"_"+e,o)})}),elementor.getPanelView().getCurrentPageView().model.on("editor:close",function(){_.each(t(),function(e,t){o.off("change:ha_transform_fx_"+t+"_toggle")})})}if(window.ha=window.ha||{},ha.hasIconLibrary=function(){return elementor.helpers&&elementor.helpers.renderIcon},ha.getFeatureLabel=function(e){var t=document.createElement("DIV");return t.innerHTML=e,e=t.textContent||t.innerText||e,e.length>20?e.substring(0,20)+"...":e},ha.translate=function(e,t){return elementorCommon.translate(e,null,t,HappyAddonsEditor.i18n)},ha.getButtonWithIcon=function(e,t){var n,o,i,a,r,s=[],l={};return t=t||{},t=_.defaults(t,{oldIcon:"button_icon",iconPos:"button_icon_position",newIcon:"button_selected_icon",text:"button_text",link:"button_link",class:"ha-btn ha-btn--link",textClass:"ha-btn-text"}),!_.isObject(e)||_.isUndefined(e.getContainer)?"":(l=e.getContainer().settings.toJSON(),ha.hasIconLibrary()&&(n=elementor.helpers.renderIcon(e,l[t.newIcon],{"aria-hidden":!0,class:"ha-btn-icon"},"i","object"),o=elementor.helpers.isIconMigrated(l,t.newIcon)),e.addInlineEditingAttributes(t.text,"none"),e.addRenderAttribute(t.text,"class",t.textClass),e.addRenderAttribute("button","class",t.class),e.addRenderAttribute("button","href",l[t.link].url),(l[t.newIcon]&&l[t.newIcon].value||l[t.oldIcon])&&(ha.hasIconLibrary()&&n&&n.rendered&&(!l[t.oldIcon]||o)?i="svg"===l[t.newIcon].library?'<span class="ha-btn-icon ha-btn-icon--svg">'+n.value+"</span>":n.value:l[t.oldIcon]&&(i='<i class="ha-btn-icon '+t.oldIcon+'" aria-hidden="true"></i>')),!l[t.text]||l[t.newIcon]||l[t.oldIcon]?l[t.text]||!l[t.newIcon]&&!l[t.oldIcon]?l[t.text]&&(l[t.newIcon]||l[t.oldIcon])&&("before"===l[t.iconPos]?(e.addRenderAttribute("button","class","ha-btn--icon-before"),a=i,r="<span "+e.getRenderAttributeString(t.text)+">"+l[t.text]+"</span>"):(e.addRenderAttribute("button","class","ha-btn--icon-after"),r=i,a="<span "+e.getRenderAttributeString(t.text)+">"+l[t.text]+"</span>"),s=["<a "+e.getRenderAttributeString("button")+">",a,r,"</a>"]):s=["<a "+e.getRenderAttributeString("button")+">",i,"</a>"]:s=["<a "+e.getRenderAttributeString("button")+">","<span "+e.getRenderAttributeString(t.text)+">",l[t.text],"</span>","</a>"],s.join(""))},elementor.on("panel:init",function(){if(e("#elementor-panel-elements-search-input").on("keyup",_.debounce(function(){e("#elementor-panel-elements").find(".hm").parents(".elementor-element").addClass("is-ha-widget")},100)),"undefined"!=typeof $e||null!==$e){var t={callback:function(){var e=elementor.settings.page.model.attributes.ha_grid;""===e?elementor.settings.page.model.setExternalChange("ha_grid","yes"):"yes"===e&&elementor.settings.page.model.setExternalChange("ha_grid","")}};$e.shortcuts.register("ctrl+shift+g",t),$e.shortcuts.register("cmd+shift+g",t)}}),elementor.hooks.addAction("panel/open_editor/widget",function(e,t){o(t)}),elementor.modules.controls.Icons){var i=elementor.modules.controls.Icons.extend({getControlValue:function(){var e=this.constructor.__super__.getControlValue.call(this),t=this.model,n=this.getValueToMigrate(),o={value:"",library:"happy-icons"},i=this.container&&this.container.settings||this.elementSettingsModel;if(_.isObject(e)&&!_.isEmpty(e)&&"svg"!==e.library&&0===e.value.indexOf("fashm"))return o.value=e.value.substr(e.value.indexOf("hm hm-")),i.set(t.get("name"),o),o;if(!_.isObject(e)&&n&&0===n.indexOf("hm hm-"))return o.value=n,i.set(t.get("name"),o),o;if(!this.isMigrationAllowed())return n;if(!n)return e;var a=i.get(this.dataKeys.migratedKey),r=t.get("name");return this.cache.migratedFlag[r]?this.cache.migratedFlag[r]:a&&a[r]?e:this.migrateFa4toFa5(n)}});elementor.addControlView("icons",i)}elementor.modules.layouts.panel.pages.menu.Menu.addItem({name:"happyaddons-home",icon:"hm hm-happyaddons",title:ha.translate("editorPanelHomeLinkTitle"),type:"link",link:HappyAddonsEditor.editorPanelHomeLinkURL,newTab:!0},"settings"),elementor.modules.layouts.panel.pages.menu.Menu.addItem({name:"happyaddons-widgets",icon:"hm hm-cross-game",title:ha.translate("editorPanelWidgetsLinkTitle"),type:"link",link:HappyAddonsEditor.editorPanelWidgetsLinkURL,newTab:!0},"settings"),elementor.hooks.addFilter("panel/elements/regionViews",function(e){if(HappyAddonsEditor.hasPro||_.isEmpty(HappyAddonsEditor.proWidgets))return e;var t,n,o=e.elements.view,i=e.categories.view,a=e.elements.options.collection,r=e.categories.options.collection,s=[];return _.each(HappyAddonsEditor.proWidgets,function(e,t){a.add({name:"ha-"+t,title:e.title,icon:e.icon,categories:["happy_addons_pro"],editable:!1})}),a.each(function(e){"happy_addons_pro"===e.get("categories")[0]&&s.push(e)}),n=r.findIndex({name:"happy_addons_category"}),n&&r.add({name:"happy_addons_pro_category",title:"Happy Addons Pro",icon:"hm hm-happyaddons",defaultActive:!1,items:s},{at:n+1}),t={className:function(){var e=this.constructor.__super__.className.call(this);return!this.isEditable()&&this.isHappyWidget()&&(e+=" ha-element--promotion"),e},isHappyWidget:function(){return 0===this.model.get("name").indexOf("ha-")},onMouseDown:function(){if(!this.isHappyWidget())return elementor.promotion.dialog.buttons[0].removeClass("ha-btn--promotion"),void this.constructor.__super__.onMouseDown.call(this);elementor.promotion.dialog.buttons[0].addClass("ha-btn--promotion"),elementor.promotion.showDialog({headerMessage:ha.translate("promotionDialogHeader",[this.model.get("title")]),message:ha.translate("promotionDialogMessage",[this.model.get("title")]),top:"-7",element:this.el,actionURL:"https://demo.happyaddons.com/"})}},e.elements.view=o.extend({childView:o.prototype.childView.extend(t)}),e.categories.view=i.extend({childView:i.prototype.childView.extend({childView:i.prototype.childView.prototype.childView.extend(t)})}),e})}(jQuery);
assets/css/main.css CHANGED
@@ -150,6 +150,13 @@
150
  .ha-btn-text + .ha-btn-icon {
151
  margin-left: 5px;
152
  }
 
 
 
 
 
 
 
153
 
154
  .ha-badge {
155
  padding: .475rem 1.1rem;
@@ -359,16 +366,18 @@
359
  margin: 0 0 1.5rem !important;
360
  }
361
  .ha-infobox-figure--icon {
362
- text-align: center;
363
  font-size: 3rem;
 
364
  }
365
- .ha-infobox-figure > i {
 
366
  position: relative;
367
  display: block;
368
  width: 1em;
369
  height: 1em;
370
  }
371
- .ha-infobox-figure > i:before {
372
  position: absolute;
373
  left: 50%;
374
  -webkit-transform: translateX(-50%);
@@ -381,15 +390,15 @@
381
  vertical-align: bottom;
382
  }
383
 
384
- .ha-infobox-text + .ha-btn--link {
385
- margin-top: 1rem;
386
- }
387
-
388
- .ha-infobox-text > p {
389
  margin-top: 0;
390
  margin-bottom: 0;
391
  }
392
 
 
 
 
 
393
  .ha-card > .elementor-widget-container,
394
  .ha-infobox > .elementor-widget-container,
395
  .ha-icon-box > .elementor-widget-container,
@@ -433,17 +442,20 @@
433
  transition: transform .3s, border .3s, background .3s, color .3s;
434
  transition: transform .3s, border .3s, background .3s, color .3s, -webkit-transform .3s;
435
  }
436
- .ha-icon-box-icon > i {
 
437
  position: relative;
438
  display: block;
439
  width: 1em;
440
  height: 1em;
 
 
441
  -webkit-transition: -webkit-transform .3s;
442
  transition: -webkit-transform .3s;
443
  transition: transform .3s;
444
  transition: transform .3s, -webkit-transform .3s;
445
  }
446
- .ha-icon-box-icon > i:before {
447
  position: absolute;
448
  left: 50%;
449
  -webkit-transform: translateX(-50%);
@@ -535,6 +547,15 @@
535
  margin-right: .3rem;
536
  }
537
 
 
 
 
 
 
 
 
 
 
538
  .ha-card > .elementor-widget-container,
539
  .ha-infobox > .elementor-widget-container,
540
  .ha-icon-box > .elementor-widget-container,
@@ -902,7 +923,8 @@
902
  .ha-carousel .slick-prev:focus,
903
  .ha-carousel .slick-next:hover,
904
  .ha-carousel .slick-next:focus {
905
- background-color: white;
 
906
  }
907
  .ha-slider .slick-prev:before,
908
  .ha-slider .slick-next:before,
@@ -981,7 +1003,8 @@
981
 
982
  .ha-slick-item {
983
  position: relative;
984
- overflow: hidden;
 
985
  vertical-align: bottom;
986
  }
987
 
@@ -2203,6 +2226,7 @@
2203
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-inner-wrapper {
2204
  position: relative;
2205
  -webkit-transform: translateZ(0);
 
2206
 
2207
  -webkit-perspective: 1000px;
2208
  perspective: 1000px;
@@ -2290,16 +2314,19 @@
2290
  color: #242424;
2291
  }
2292
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon {
2293
- display: inline-block;
2294
  margin-bottom: 20px;
2295
  text-align: center;
 
2296
  }
2297
- .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i {
2298
- position: relative;
2299
  display: block;
2300
  width: 1em;
2301
  height: 1em;
2302
- font-size: 28px;
 
 
2303
  }
2304
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i:before {
2305
  position: absolute;
@@ -2328,17 +2355,20 @@
2328
  font-size: 18px;
2329
  }
2330
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon {
2331
- display: inline-block;
2332
  margin-bottom: 20px;
2333
  text-align: center;
 
2334
  }
2335
- .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i {
2336
- position: relative;
2337
  display: block;
2338
  width: 1em;
2339
  height: 1em;
 
 
 
2340
  color: #fff;
2341
- font-size: 20px;
2342
  }
2343
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i:before {
2344
  position: absolute;
@@ -2501,11 +2531,16 @@
2501
  margin-bottom: 1rem;
2502
  font-size: 16px;
2503
  }
2504
- .ha-pricing-table-features-list i {
 
2505
  margin-right: .5rem;
2506
  min-width: 15px;
2507
  font-size: .8em;
2508
  }
 
 
 
 
2509
 
2510
  .ha-pricing-table-feature-text {
2511
  display: inline-block;
@@ -2587,7 +2622,8 @@
2587
  text-align: center;
2588
  font-size: 46px;
2589
  }
2590
- .ha-steps-icon i {
 
2591
  position: relative;
2592
  display: block;
2593
  width: 1em;
@@ -2703,55 +2739,79 @@
2703
  color: #e04c8a;
2704
  }
2705
 
2706
- .ha-fun-factor-icon {
2707
- font-size: 3em;
2708
- }
2709
-
2710
- .ha-fun-factor-content .ha-fun-factor-content-number,
2711
- .ha-fun-factor-content .ha-fun-factor-content-text {
2712
  margin-top: 0;
2713
  margin-bottom: 15px;
2714
  font-size: 24px;
2715
  }
2716
 
2717
- .ha-ff-icon--left .ha-fun-factor-content {
2718
  padding-left: 20px;
2719
  }
2720
 
2721
- .ha-ff-icon--right .ha-fun-factor-content {
2722
  padding-right: 20px;
2723
  }
2724
 
2725
- .ha-fun-factor-divider {
2726
  display: block;
2727
  margin-bottom: 15px;
2728
  height: 1px;
2729
  background-color: #ccc;
2730
  }
2731
 
2732
- .ha-ff-icon--top .ha-fun-factor-icon-section,
2733
- .ha-ff-icon--top .ha-fun-factor-image-section {
2734
  display: inline-block;
2735
  margin-top: 10px;
2736
- margin-bottom: 10px;
2737
- width: auto;
2738
- height: auto;
2739
  }
2740
 
2741
- .ha-fun-factor-image-section img {
2742
  width: 200px;
2743
- height: 100px;
2744
  }
2745
 
2746
- .ha-ff-container {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2747
  padding: 10px;
2748
  word-wrap: break-word;
2749
 
2750
  overflow-wrap: break-word;
2751
  }
2752
 
2753
- .ha-ff-icon--right > .elementor-widget-container .ha-ff-container,
2754
- .ha-ff-icon--left > .elementor-widget-container .ha-ff-container {
2755
  display: -webkit-box;
2756
  display: -webkit-flex;
2757
  display: -ms-flexbox;
@@ -2767,7 +2827,7 @@
2767
  flex-direction: row;
2768
  }
2769
 
2770
- .ha-ff-icon--right > .elementor-widget-container .ha-ff-container {
2771
  -webkit-box-orient: horizontal;
2772
  -webkit-box-direction: reverse;
2773
  -webkit-flex-direction: row-reverse;
@@ -2776,31 +2836,31 @@
2776
  text-align: right;
2777
  }
2778
 
2779
- .ha-ff-icon--right > .elementor-widget-container .ha-ff-container .ha-fun-factor-divider,
2780
- .ha-ff-icon--left > .elementor-widget-container .ha-ff-container .ha-fun-factor-divider,
2781
- .ha-ff-icon--top > .elementor-widget-container .ha-ff-container .ha-fun-factor-divider {
2782
  display: block;
2783
  margin-right: auto;
2784
  margin-left: auto;
2785
  width: 100px;
2786
  }
2787
 
2788
- .ha-ff-icon--right > .elementor-widget-container .ha-ff-container .ha-fun-factor-divider,
2789
- .ha-ff-icon--left > .elementor-widget-container .ha-ff-container .ha-fun-factor-divider {
2790
  width: 100% !important;
2791
  }
2792
 
2793
- .ha-fun-factor-divider-align-left {
2794
  margin-left: 0 !important;
2795
  text-align: left;
2796
  }
2797
 
2798
- .ha-fun-factor-divider-align-right {
2799
  margin-right: 0 !important;
2800
  text-align: right;
2801
  }
2802
 
2803
- .ha-fun-factor-divider-align-center {
2804
  margin-right: auto !important;
2805
  margin-left: auto !important;
2806
  text-align: center;
@@ -2853,18 +2913,9 @@ a.ha-social-icon:after {
2853
  margin-right: 2px;
2854
  }
2855
 
2856
- .ha-social-icon i,
2857
- .ha-social-icon svg {
2858
  position: relative;
2859
  display: initial;
2860
- }
2861
-
2862
- .ha-social-icon svg {
2863
- width: 100%;
2864
- height: 100%;
2865
- }
2866
-
2867
- .ha-social-icon i {
2868
  width: 1em;
2869
  height: 1em;
2870
  }
@@ -2875,7 +2926,6 @@ a.ha-social-icon:after {
2875
  width: 100%;
2876
  height: 100%;
2877
  font-size: 18px;
2878
- font-family: Roboto, sans-serif;
2879
  line-height: 1;
2880
  }
2881
 
@@ -3228,6 +3278,10 @@ span.ha-post-list-icon {
3228
  color: #242424;
3229
  font-size: 14px;
3230
  }
 
 
 
 
3231
 
3232
  .ha-post-list-meta-wrap {
3233
  display: -webkit-box;
@@ -3566,6 +3620,11 @@ span.ha-post-list-icon {
3566
  color: #242424;
3567
  font-size: 14px;
3568
  }
 
 
 
 
 
3569
 
3570
  .ha-taxonomy-list span.ha-taxonomy-list-image {
3571
  margin-right: 15px;
150
  .ha-btn-text + .ha-btn-icon {
151
  margin-left: 5px;
152
  }
153
+ .ha-btn-icon--svg {
154
+ display: inline-block;
155
+ }
156
+ .ha-btn-icon--svg svg {
157
+ width: auto;
158
+ height: 1em;
159
+ }
160
 
161
  .ha-badge {
162
  padding: .475rem 1.1rem;
366
  margin: 0 0 1.5rem !important;
367
  }
368
  .ha-infobox-figure--icon {
369
+ text-align: center;
370
  font-size: 3rem;
371
+ line-height: 1;
372
  }
373
+ .ha-infobox-figure i,
374
+ .ha-infobox-figure svg {
375
  position: relative;
376
  display: block;
377
  width: 1em;
378
  height: 1em;
379
  }
380
+ .ha-infobox-figure i:before {
381
  position: absolute;
382
  left: 50%;
383
  -webkit-transform: translateX(-50%);
390
  vertical-align: bottom;
391
  }
392
 
393
+ .ha-infobox-text p {
 
 
 
 
394
  margin-top: 0;
395
  margin-bottom: 0;
396
  }
397
 
398
+ .ha-infobox-text + .ha-btn--link {
399
+ margin-top: 1rem;
400
+ }
401
+
402
  .ha-card > .elementor-widget-container,
403
  .ha-infobox > .elementor-widget-container,
404
  .ha-icon-box > .elementor-widget-container,
442
  transition: transform .3s, border .3s, background .3s, color .3s;
443
  transition: transform .3s, border .3s, background .3s, color .3s, -webkit-transform .3s;
444
  }
445
+ .ha-icon-box-icon i,
446
+ .ha-icon-box-icon svg {
447
  position: relative;
448
  display: block;
449
  width: 1em;
450
  height: 1em;
451
+ }
452
+ .ha-icon-box-icon i {
453
  -webkit-transition: -webkit-transform .3s;
454
  transition: -webkit-transform .3s;
455
  transition: transform .3s;
456
  transition: transform .3s, -webkit-transform .3s;
457
  }
458
+ .ha-icon-box-icon i:before {
459
  position: absolute;
460
  left: 50%;
461
  -webkit-transform: translateX(-50%);
547
  margin-right: .3rem;
548
  }
549
 
550
+ .ha-member .ha-btn {
551
+ margin-bottom: 10px;
552
+ }
553
+
554
+ .ha-member-links + .ha-btn {
555
+ margin-top: 10px;
556
+ margin-bottom: 0;
557
+ }
558
+
559
  .ha-card > .elementor-widget-container,
560
  .ha-infobox > .elementor-widget-container,
561
  .ha-icon-box > .elementor-widget-container,
923
  .ha-carousel .slick-prev:focus,
924
  .ha-carousel .slick-next:hover,
925
  .ha-carousel .slick-next:focus {
926
+ background-color: white;
927
+ color: #8c8c8c;
928
  }
929
  .ha-slider .slick-prev:before,
930
  .ha-slider .slick-next:before,
1003
 
1004
  .ha-slick-item {
1005
  position: relative;
1006
+ display: inline-block;
1007
+ overflow: hidden;
1008
  vertical-align: bottom;
1009
  }
1010
 
2226
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-inner-wrapper {
2227
  position: relative;
2228
  -webkit-transform: translateZ(0);
2229
+ transform: translateZ(0);
2230
 
2231
  -webkit-perspective: 1000px;
2232
  perspective: 1000px;
2314
  color: #242424;
2315
  }
2316
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon {
2317
+ display: inline-block;
2318
  margin-bottom: 20px;
2319
  text-align: center;
2320
+ font-size: 28px;
2321
  }
2322
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i,
2323
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon svg {
2324
  display: block;
2325
  width: 1em;
2326
  height: 1em;
2327
+ }
2328
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i {
2329
+ position: relative;
2330
  }
2331
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i:before {
2332
  position: absolute;
2355
  font-size: 18px;
2356
  }
2357
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon {
2358
+ display: inline-block;
2359
  margin-bottom: 20px;
2360
  text-align: center;
2361
+ font-size: 20px;
2362
  }
2363
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i,
2364
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon svg {
2365
  display: block;
2366
  width: 1em;
2367
  height: 1em;
2368
+ }
2369
+ .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i {
2370
+ position: relative;
2371
  color: #fff;
 
2372
  }
2373
  .ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i:before {
2374
  position: absolute;
2531
  margin-bottom: 1rem;
2532
  font-size: 16px;
2533
  }
2534
+ .ha-pricing-table-features-list i,
2535
+ .ha-pricing-table-features-list svg {
2536
  margin-right: .5rem;
2537
  min-width: 15px;
2538
  font-size: .8em;
2539
  }
2540
+ .ha-pricing-table-features-list svg {
2541
+ width: auto;
2542
+ height: 1em;
2543
+ }
2544
 
2545
  .ha-pricing-table-feature-text {
2546
  display: inline-block;
2622
  text-align: center;
2623
  font-size: 46px;
2624
  }
2625
+ .ha-steps-icon i,
2626
+ .ha-steps-icon svg {
2627
  position: relative;
2628
  display: block;
2629
  width: 1em;
2739
  color: #e04c8a;
2740
  }
2741
 
2742
+ .ha-fun-factor__content .ha-fun-factor__content-number,
2743
+ .ha-fun-factor__content .ha-fun-factor__content-text {
 
 
 
 
2744
  margin-top: 0;
2745
  margin-bottom: 15px;
2746
  font-size: 24px;
2747
  }
2748
 
2749
+ .ha-ff-icon--left .ha-fun-factor__content {
2750
  padding-left: 20px;
2751
  }
2752
 
2753
+ .ha-ff-icon--right .ha-fun-factor__content {
2754
  padding-right: 20px;
2755
  }
2756
 
2757
+ .ha-fun-factor__divider {
2758
  display: block;
2759
  margin-bottom: 15px;
2760
  height: 1px;
2761
  background-color: #ccc;
2762
  }
2763
 
2764
+ .ha-ff-icon--top .ha-fun-factor__media {
 
2765
  display: inline-block;
2766
  margin-top: 10px;
2767
+ margin-bottom: 10px;
 
 
2768
  }
2769
 
2770
+ .ha-ff-icon--top .ha-fun-factor__media--image {
2771
  width: 200px;
 
2772
  }
2773
 
2774
+ :not(.ha-ff-icon--top) .ha-fun-factor__media--image {
2775
+ -webkit-box-flex: 0;
2776
+ -webkit-flex: 0 0 200px;
2777
+ -ms-flex: 0 0 200px;
2778
+ flex: 0 0 200px;
2779
+ max-width: 200px;
2780
+ }
2781
+
2782
+ .ha-fun-factor__media--image img {
2783
+ width: 100%;
2784
+ height: 100%;
2785
+ vertical-align: bottom;
2786
+ }
2787
+
2788
+ .ha-fun-factor__media--icon {
2789
+ font-size: 3rem;
2790
+ }
2791
+ .ha-fun-factor__media--icon i,
2792
+ .ha-fun-factor__media--icon svg {
2793
+ position: relative;
2794
+ display: block;
2795
+ width: 1em;
2796
+ height: 1em;
2797
+ }
2798
+ .ha-fun-factor__media--icon i:before {
2799
+ position: absolute;
2800
+ left: 50%;
2801
+ -webkit-transform: translateX(-50%);
2802
+ -ms-transform: translateX(-50%);
2803
+ transform: translateX(-50%);
2804
+ }
2805
+
2806
+ .ha-fun-factor__wrap {
2807
  padding: 10px;
2808
  word-wrap: break-word;
2809
 
2810
  overflow-wrap: break-word;
2811
  }
2812
 
2813
+ .ha-ff-icon--right > .elementor-widget-container .ha-fun-factor__wrap,
2814
+ .ha-ff-icon--left > .elementor-widget-container .ha-fun-factor__wrap {
2815
  display: -webkit-box;
2816
  display: -webkit-flex;
2817
  display: -ms-flexbox;
2827
  flex-direction: row;
2828
  }
2829
 
2830
+ .ha-ff-icon--right > .elementor-widget-container .ha-fun-factor__wrap {
2831
  -webkit-box-orient: horizontal;
2832
  -webkit-box-direction: reverse;
2833
  -webkit-flex-direction: row-reverse;
2836
  text-align: right;
2837
  }
2838
 
2839
+ .ha-ff-icon--right > .elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider,
2840
+ .ha-ff-icon--left > .elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider,
2841
+ .ha-ff-icon--top > .elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider {
2842
  display: block;
2843
  margin-right: auto;
2844
  margin-left: auto;
2845
  width: 100px;
2846
  }
2847
 
2848
+ .ha-ff-icon--right > .elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider,
2849
+ .ha-ff-icon--left > .elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider {
2850
  width: 100% !important;
2851
  }
2852
 
2853
+ .ha-fun-factor__divider-align-left {
2854
  margin-left: 0 !important;
2855
  text-align: left;
2856
  }
2857
 
2858
+ .ha-fun-factor__divider-align-right {
2859
  margin-right: 0 !important;
2860
  text-align: right;
2861
  }
2862
 
2863
+ .ha-fun-factor__divider-align-center {
2864
  margin-right: auto !important;
2865
  margin-left: auto !important;
2866
  text-align: center;
2913
  margin-right: 2px;
2914
  }
2915
 
2916
+ .ha-social-icon i {
 
2917
  position: relative;
2918
  display: initial;
 
 
 
 
 
 
 
 
2919
  width: 1em;
2920
  height: 1em;
2921
  }
2926
  width: 100%;
2927
  height: 100%;
2928
  font-size: 18px;
 
2929
  line-height: 1;
2930
  }
2931
 
3278
  color: #242424;
3279
  font-size: 14px;
3280
  }
3281
+ span.ha-post-list-icon svg {
3282
+ width: auto;
3283
+ height: 1em;
3284
+ }
3285
 
3286
  .ha-post-list-meta-wrap {
3287
  display: -webkit-box;
3620
  color: #242424;
3621
  font-size: 14px;
3622
  }
3623
+ .ha-taxonomy-list span.ha-taxonomy-list-icon svg {
3624
+ display: block;
3625
+ width: auto;
3626
+ height: 1em;
3627
+ }
3628
 
3629
  .ha-taxonomy-list span.ha-taxonomy-list-image {
3630
  margin-right: 15px;
assets/css/main.min.css CHANGED
@@ -1 +1 @@
1
- .happy-addon>.elementor-widget-container{word-wrap:break-word;overflow-wrap:break-word;box-sizing:border-box}.happy-addon>.elementor-widget-container *{box-sizing:border-box}.happy-addon img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.happy-addon p:empty{display:none}.ha-screen-reader-text{position:absolute;overflow:hidden;clip:rect(1px,1px,1px,1px);margin:-1px;padding:0;width:1px;height:1px;border:0;word-wrap:normal!important;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.ha-has-background-overlay>.elementor-widget-container{position:relative;z-index:1}.ha-has-background-overlay>.elementor-widget-container:before{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;content:""}.ha-popup--is-enabled .ha-js-popup,.ha-popup--is-enabled .ha-js-popup img{cursor:-webkit-zoom-in!important;cursor:zoom-in!important}.mfp-wrap .mfp-arrow,.mfp-wrap .mfp-close{background-color:transparent}.mfp-wrap .mfp-arrow:focus,.mfp-wrap .mfp-close:focus{outline-width:thin}.ha-btn{display:inline-block;max-width:100%;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-badge{padding:.475rem 1.1rem;max-width:100%;border-radius:50px;background-color:#fff;font-size:12px}.ha-badge--top-left{top:1rem;left:1rem}.ha-badge--top-center{top:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--top-right{top:1rem;right:1rem}.ha-badge--middle-left{top:50%;left:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--middle-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ha-badge--middle-right{top:50%;right:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--bottom-left{bottom:1rem;left:1rem}.ha-badge--bottom-center{bottom:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--bottom-right{right:1rem;bottom:1rem}.ha-card-figure{position:relative;height:250px}.ha-card-figure img{border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.ha-card-body{padding:1.5rem}.ha-card-title{margin-top:0;margin-bottom:.75rem;color:#151515;font-weight:700;font-size:22px}.ha-card-text{margin-bottom:2rem;color:#616161;font-size:16px;line-height:1.7}.ha-card-text>p,.ha-infobox-text>p{margin-top:0;margin-bottom:0}.ha-card--top .ha-card-figure{display:inline-block;width:100%}.ha-card--left>.elementor-widget-container,.ha-card--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-card--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-card--left .ha-card-body,.ha-card--left .ha-card-figure,.ha-card--right .ha-card-body,.ha-card--right .ha-card-figure{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ha-card--left .ha-card-body,.ha-card--right .ha-card-body{padding:2.5rem}.ha-card--left .ha-card-figure img{border-radius:calc(.5rem - 1px) 0 0 calc(.5rem - 1px)}.ha-card--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;text-align:right}.ha-card--right .ha-card-figure img{border-radius:0 calc(.5rem - 1px) calc(.5rem - 1px) 0}.ha-card .ha-badge{position:absolute}.ha-infobox>.elementor-widget-container{padding:1.5rem}.ha-infobox-title{margin-top:0;margin-bottom:1rem;color:#151515;font-size:24px}.ha-infobox-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-infobox-figure--icon{text-align:center;font-size:3rem}.ha-icon-box-icon>i,.ha-infobox-figure>i{position:relative;display:block;width:1em;height:1em}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i:before,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i:before,.ha-icon-box-icon>i:before,.ha-infobox-figure>i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-card-figure img,.ha-infobox-figure img,.ha-member-figure img{width:100%;height:100%;vertical-align:bottom}.ha-infobox-text+.ha-btn--link{margin-top:1rem}.ha-icon-box>.elementor-widget-container{position:relative;padding:1.25rem}.ha-icon-box-title{margin-top:0;margin-bottom:0;color:#151515;font-size:24px;-webkit-transition:color .3s;transition:color .3s}.ha-icon-box-icon{display:inline-block;margin-bottom:1rem;color:#151515;text-align:center;font-size:3rem;-webkit-transition:border .3s,background .3s,color .3s,-webkit-transform .3s;transition:transform .3s,border .3s,background .3s,color .3s;transition:transform .3s,border .3s,background .3s,color .3s,-webkit-transform .3s}.ha-icon-box-icon>i{-webkit-transition:-webkit-transform .3s;transition:transform .3s;transition:transform .3s,-webkit-transform .3s}.ha-icon-box-link{display:block;color:transparent;text-decoration:none}.ha-icon-box .ha-badge{position:absolute;z-index:9999;background-color:#e2498a;color:#fff}.ha-member>.elementor-widget-container{padding:1.25rem}.ha-member-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-member-name{margin-top:0;margin-bottom:.5rem;color:#151515;font-size:18px}.ha-member-position{margin-bottom:1.5rem;color:#7f7f7f;font-size:14px}.ha-member-bio{margin-bottom:1.5rem;font-size:14px;line-height:1.6}.ha-member-links>a{display:inline-block;color:#9895ad;text-align:center;line-height:1;-webkit-transition:all .2s;transition:all .2s}.ha-member-links>a:focus,.ha-member-links>a:hover{color:#222}.ha-member-links>a>i{width:1em;height:1em}.ha-member-links>a:not(:last-child){margin-right:.3rem}.ha-review-header{margin-top:1.5rem}.ha-review-desc p,.ha-review-figure{margin:0}.ha-review-figure img{width:100%;height:100%;border-radius:50%;vertical-align:bottom}.ha-review-reviewer{margin-top:0;margin-bottom:.3rem;color:#151515;font-size:18px}.ha-review-position{margin-bottom:.5rem;color:#7f7f7f;font-size:15px}.ha-review-ratting{display:inline-block;font-size:12px;line-height:1}.ha-review-ratting--num{padding:.25em .66em;border-radius:2.5em;background-color:#562dd4;color:#fff}.ha-review-ratting--star{color:#ffbf36}.ha-review-desc{margin-top:1.5rem;font-size:16px;line-height:1.6}.ha-review--top>.elementor-widget-container{padding:2rem}.ha-review--top .ha-review-figure{display:inline-block;max-width:70px;height:70px}.ha-review--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-review--left>.elementor-widget-container,.ha-review--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding-left:2rem}.ha-review--left .ha-review-figure,.ha-review--right .ha-review-figure{-webkit-box-flex:0;-webkit-flex:0 0 150px;-ms-flex:0 0 150px;flex:0 0 150px;max-width:150px;height:150px}.ha-review--left .ha-review-body,.ha-review--right .ha-review-body{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 150px);-ms-flex:0 0 calc(100% - 150px);flex:0 0 calc(100% - 150px);padding:2rem;max-width:calc(100% - 150px)}.ha-review--left .ha-review-body>:first-child,.ha-review--right .ha-review-body>:first-child{margin-top:0}.ha-review--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:2rem;padding-left:0;text-align:right}.ha-image-compare .twentytwenty-container,.ha-image-compare .twentytwenty-wrapper,a.ha-social-icon:after,a.ha-social-icon:before{border-radius:inherit}.ha-gallery-filter{margin:0 10px 2rem;padding:0;list-style:none}.ha-gallery-filter>li{display:inline-block;margin-bottom:10px;max-width:100%}.ha-gallery-filter>li:not(:last-child){margin-right:10px}.ha-gallery-filter>li>button{display:block;overflow:hidden;padding:10px 25px;max-width:100%;border:2px solid #562dd4;border-radius:.25rem;background-color:transparent;color:#562dd4;text-transform:uppercase;text-overflow:ellipsis;font-size:14px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ha-gallery-filter>li>button:focus,.ha-gallery-filter>li>button:hover{outline:0;background-color:#562dd4;color:#fff}.ha-gallery-filter>.ha-filter-active>button{background-color:#562dd4;color:#fff}.ha-image-grid-item{float:left}.ha-image-grid-inner{position:relative;display:block;overflow:hidden;margin:10px;text-decoration:none}.ha-image-grid-inner img{display:block;width:100%;-webkit-transition:all .25s;transition:all .25s}.ha-image-grid--layout-even .ha-image-grid-inner{height:250px}.ha-image-grid--layout-even .ha-image-grid-inner img{height:100%}.ha-justified-gallery-item,.ha-justified-gallery-item>img{border-radius:6px}.ha-justified-gallery .justified-gallery>.ha-justified-gallery-item>.caption{bottom:-100px!important;padding:10px;-webkit-transition:all .25s!important;transition:all .25s!important;-webkit-animation:haSmoothReveal .3s forwards;animation:haSmoothReveal .3s forwards}.ha-justified-gallery .justified-gallery>.ha-justified-gallery-item>.caption.caption-visible{bottom:0!important}.ha-justified-gallery .justified-gallery>.entry-visible>a>img,.ha-justified-gallery .justified-gallery>.entry-visible>img{-webkit-transition:all 300ms,opacity 500ms ease-in;transition:all 300ms,opacity 500ms ease-in}@-webkit-keyframes haSmoothReveal{0%{-webkit-transform:translateY(100px);transform:translateY(100px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes haSmoothReveal{0%{-webkit-transform:translateY(100px);transform:translateY(100px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}.ha-carousel .slick-vertical .slick-slide,.ha-slider .slick-vertical .slick-slide{border:0}.ha-carousel .slick-next,.ha-carousel .slick-prev,.ha-slider .slick-next,.ha-slider .slick-prev{z-index:999;padding:0;border:1px solid rgba(255,255,255,.8);border-radius:50%;background-color:rgba(255,255,255,.8);color:#8c8c8c;text-align:center;font-size:12px;opacity:1}.ha-carousel .slick-next:focus,.ha-carousel .slick-next:hover,.ha-carousel .slick-prev:focus,.ha-carousel .slick-prev:hover,.ha-slider .slick-next:focus,.ha-slider .slick-next:hover,.ha-slider .slick-prev:focus,.ha-slider .slick-prev:hover{background-color:#fff}.ha-carousel .slick-next:before,.ha-carousel .slick-prev:before,.ha-slider .slick-next:before,.ha-slider .slick-prev:before{content:""}.ha-carousel .slick-disabled,.ha-slider .slick-disabled{opacity:.7}.ha-carousel .slick-prev,.ha-slider .slick-prev{left:25px}.ha-carousel .slick-next,.ha-slider .slick-next{right:25px}.ha-carousel .slick-dots,.ha-slider .slick-dots{bottom:-40px}.ha-carousel .slick-dots li,.ha-slider .slick-dots li{margin-right:2px;margin-left:2px}.ha-carousel .slick-dots li button:focus,.ha-carousel .slick-dots li button:hover,.ha-slider .slick-dots li button:focus,.ha-slider .slick-dots li button:hover{background-color:transparent}.ha-carousel .slick-dots li button:before,.ha-slider .slick-dots li button:before{color:#1b1b1b;opacity:1}.ha-carousel .slick-dots .slick-active button:before,.ha-carousel .slick-dots li button:hover:before,.ha-slider .slick-dots .slick-active button:before,.ha-slider .slick-dots li button:hover:before{-webkit-transform:scale(1.5);-ms-transform:scale(1.5);transform:scale(1.5)}.ha-carousel .slick-next,.ha-carousel .slick-prev{width:40px;height:40px;line-height:40px}.ha-slider .slick-next,.ha-slider .slick-prev{width:50px;height:50px;line-height:50px}.ha-carousel .slick-slider:not(.slick-vertical) .slick-slide{padding-right:5px;padding-left:5px}.ha-carousel .slick-slider.slick-vertical .slick-slide{padding-top:5px;padding-bottom:5px}.ha-slick-item{position:relative;overflow:hidden;vertical-align:bottom}.ha-slick-content{position:absolute;bottom:0;padding:1.5rem;width:100%;background:-webkit-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.3));background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.3))}.ha-slick-title{margin-top:0;margin-bottom:.2rem;color:#fff;font-size:20px}.ha-slick-subtitle{margin:0;color:#fff}.ha-skills>.elementor-widget-container{padding-top:1px}.ha-skill{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-radius:15px;background-color:#e9ecef;font-size:.75rem}.ha-skill--inside .ha-skill-info,.ha-skill--outside .ha-skill-info{text-align:left;font-size:14px;line-height:1}.ha-skill--inside .ha-skill-level-text,.ha-skill--outside .ha-skill-level-text{float:right}.ha-skill--outside{height:2px}.ha-skill--outside .ha-skill-level{position:relative}.ha-skill--outside .ha-skill-info{position:absolute;top:-25px;width:100%;color:#242424}.ha-skill--inside{height:30px}.ha-skill--inside .ha-skill-info{padding-right:1rem;padding-left:1rem;color:#fff}.ha-skill-level{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;width:10%;border-radius:inherit;background-color:#562dd4;color:#fff;text-align:center;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.ha-skill--outside{margin-top:40px}.ha-skill--inside:not(:first-child){margin-top:20px}.ha-skill-name{display:inline-block;overflow:hidden;max-width:70%;text-overflow:ellipsis}.ha-gradient-heading{margin-top:0;margin-bottom:0}.ha-gradient-heading>a{color:inherit;text-decoration:none}.ha-logo-grid-item{float:left;overflow:hidden;height:180px;border-color:#e7e7e7}.ha-logo-grid-figure{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0;padding:30px;width:100%;height:100%}.ha-logo-grid-img{max-height:100%}@media (min-width:1025px){.ha-logo-grid--col-2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col-3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col-4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col-5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col-6 .ha-logo-grid-item{width:calc(100%/6)}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--col--tablet2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col--tablet3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col--tablet4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col--tablet5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col--tablet6 .ha-logo-grid-item{width:calc(100%/6)}}@media (max-width:767px){.ha-logo-grid--col--mobile2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col--mobile3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col--mobile4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col--mobile5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col--mobile6 .ha-logo-grid-item{width:calc(100%/6)}}.ha-logo-grid--tictactoe .ha-logo-grid-item{border-width:2px 2px 0 0;border-style:solid}@media (min-width:1025px){.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}@media (max-width:767px){.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}.ha-logo-grid--border .ha-logo-grid-item{border-width:0 2px 2px 0;border-style:solid}.ha-logo-grid--border .ha-logo-grid-item:first-child{border-top-left-radius:10px}.ha-logo-grid--border .ha-logo-grid-item:last-child{border-bottom-right-radius:10px}@media (min-width:1025px){.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}}@media (max-width:767px){.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}}.ha-logo-grid--box .ha-logo-grid-wrapper{margin:-.5rem}.ha-logo-grid--box .ha-logo-grid-item{margin:.5rem;border-width:2px;border-style:solid;border-radius:.5rem}@media (min-width:1025px){.ha-logo-grid--box.ha-logo-grid--col-2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--box.ha-logo-grid--col--tablet2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}}@media (max-width:767px){.ha-logo-grid--box.ha-logo-grid--col--mobile2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}}.ha-dual-btn,.ha-dual-btn-connector{display:inline-block}.ha-dual-btn-wrapper{position:relative;text-align:center;font-weight:400}.ha-dual-btn{padding:1.2rem 3rem;max-width:100%;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab;color:#fff}.ha-dual-btn--right{background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e;color:#fff}.ha-dual-btn-connector{position:absolute!important;z-index:9;overflow:hidden;width:30px;height:30px;border-radius:100%;background-color:#fff;box-shadow:0 0 0 5px rgba(255,255,255,.3);color:#27374c;text-transform:uppercase;font-size:12px;line-height:30px;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%)}.ha-dual-btn-icon>svg{width:1em;height:auto}.ha-dual-btn-icon>i{font-size:1em}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}.ha-dual-button>.elementor-widget-container,.ha-news-ticker-wrapper ul.ha-news-ticker-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-button--mobile-layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--mobile-layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--mobile-layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--mobile-layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--mobile-layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-center>.elementor-widget-container,.ha-testimonial__reviewer{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--mobile-layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--mobile-layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--mobile-layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--mobile-layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--mobile-layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}@media (min-width:768px){.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-center>.elementor-widget-container{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--tablet-layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--tablet-layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--tablet-layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--tablet-layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--tablet-layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--tablet-layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--tablet-layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--tablet-layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--tablet-layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--tablet-layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}}@media (min-width:1025px){.ha-dual-button--layout-stack.ha-dual-button--align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--layout-stack.ha-dual-button--align-center>.elementor-widget-container{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--layout-stack.ha-dual-button--align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--layout-queue.ha-dual-button--align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--layout-queue.ha-dual-button--align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--layout-queue.ha-dual-button--align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}}.ha-testimonial--basic>.elementor-widget-container{padding:2rem;border:1px solid #ececec;border-radius:.5rem}.ha-testimonial--basic .ha-testimonial__content{margin-bottom:2.5em}.ha-testimonial--bubble .ha-testimonial__content{position:relative;margin-bottom:1.5rem;padding:2rem;border-radius:6px;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);line-height:1.6rem}.ha-testimonial--bubble .ha-testimonial__content:after{position:absolute;bottom:-14px;color:#fff;content:"\e911";font-style:normal;font-size:36px;font-family:"Happy Icons";-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.ha-testimonial--left.ha-testimonial--bubble .ha-testimonial__content:after{left:15px}.ha-testimonial--center.ha-testimonial--bubble .ha-testimonial__content:after{left:50%;-webkit-transform:translateX(-50%) rotate(-180deg);-ms-transform:translateX(-50%) rotate(-180deg);transform:translateX(-50%) rotate(-180deg)}.ha-testimonial--right.ha-testimonial--bubble .ha-testimonial__content:after{right:15px}.ha-testimonial__reviewer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{-webkit-box-flex:0;-webkit-flex:0 0 65px;-ms-flex:0 0 65px;flex:0 0 65px;max-width:65px;height:65px}.ha-testimonial__reviewer-thumb img{width:100%;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover}.ha-testimonial__reviewer-name{margin-bottom:.3rem;color:#562dd4;font-weight:700;font-size:18px}.ha-testimonial__reviewer-title{color:#8c8c8c;font-size:16px}.ha-testimonial--left .ha-testimonial__reviewer-meta{padding-left:1em}.ha-testimonial--center .ha-testimonial__reviewer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-testimonial--center .ha-testimonial__reviewer-meta{padding-top:1em;max-width:100%}.ha-testimonial--left .ha-testimonial__reviewer-meta,.ha-testimonial--right .ha-testimonial__reviewer-meta{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 65px);-ms-flex:0 0 calc(100% - 65px);flex:0 0 calc(100% - 65px);max-width:calc(100% - 65px)}.ha-testimonial--right .ha-testimonial__reviewer{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-testimonial--right .ha-testimonial__reviewer-meta{padding-right:1em}.ha-testimonial--left{text-align:left}.ha-testimonial--right{text-align:right}.ha-number-body,.ha-testimonial--center{text-align:center}.ha-number-body{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding:6px;width:50px;height:50px;border-radius:100%;background-color:#562dd4;color:#fff;font-size:20px}.ha-number-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ha-number-text{position:relative;z-index:1;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-flip-box-container:after{display:block;visibility:hidden;clear:both;height:0;content:" ";font-size:0}.ha-flip-box-container .ha-flip-box-inner{position:relative;z-index:1;margin:0;padding:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-back{z-index:1}.ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-front{z-index:-1}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-inner-wrapper{position:relative;-webkit-transform:translateZ(0);-webkit-perspective:1000px;perspective:1000px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front{top:0;right:0;left:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;height:250px;background-position:center;background-clip:padding-box;background-size:cover;background-repeat:no-repeat;text-align:center;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-perspective:1000px;perspective:1000px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front{background-color:transparent;position:relative;bottom:0;z-index:10;padding:30px;border:1px solid #ddd;border-radius:.3rem}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back:before,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front:before{position:absolute;top:0;left:0;z-index:-9;width:100%;height:100%;background-color:transparent;content:""}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back{position:absolute;z-index:-1;padding:46px;border-radius:.3rem;background-color:#562dd4;color:#fff}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;width:100%}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-text,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-text{text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-text p,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-text p{margin-top:10px;margin-bottom:0}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon.icon{padding:20px;border-radius:50%;background-color:#f1f4f8;color:#242424}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon{display:inline-block;margin-bottom:20px;text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i{position:relative;display:block;width:1em;height:1em;font-size:28px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon img,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon img{width:60px;height:60px;vertical-align:middle}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-box-heading{margin:0;font-weight:700;font-size:20px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner p{margin-bottom:0;font-size:16px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-box-heading-back{margin:0;color:#fff;font-size:18px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon{display:inline-block;margin-bottom:20px;text-align:center}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i{position:relative;display:block;width:1em;height:1em;color:#fff;font-size:20px}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-back{-webkit-transform:rotateY(0);transform:rotateY(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-back{-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-front{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-back{-webkit-transform:rotateX(0);transform:rotateX(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-back{-webkit-transform:rotateX(-180deg);transform:rotateX(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-front{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-back,.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-front{-webkit-transition:-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275),-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275)}.ha-logo-grid-wrapper:after{display:block;clear:both;content:""}.ha-pricing-table>.elementor-widget-container{position:relative;overflow:hidden;padding:3em 4em}.ha-pricing-table-badge{position:absolute;top:-1px;padding:.8rem 1rem;background-color:#e2498a;color:#fff;line-height:1}.ha-pricing-table-badge--left{left:0;-webkit-transform:rotate(-90deg) translateX(-100%);-ms-transform:rotate(-90deg) translateX(-100%);transform:rotate(-90deg) translateX(-100%);-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.ha-pricing-table-badge--right{right:0;-webkit-transform:rotate(-90deg) translateY(-100%);-ms-transform:rotate(-90deg) translateY(-100%);transform:rotate(-90deg) translateY(-100%);-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top}.ha-pricing-table-title{margin-top:0;margin-bottom:.5rem;color:#242424;font-weight:400;font-size:24px}.ha-pricing-table-price{margin-bottom:3rem}.ha-pricing-table-price-tag{margin-bottom:.5rem;color:#242424;font-weight:700;font-size:60px;line-height:normal}.ha-pricing-table-currency{font-size:24px}.ha-pricing-table-period{color:#8c8c8c;font-size:16px}.ha-pricing-table-body{margin-bottom:3rem}.ha-pricing-table-features-title{margin-top:0;margin-bottom:1rem;font-weight:700;font-size:16px}.ha-pricing-table-features-list{margin:0;padding:0;list-style:none}.ha-pricing-table-features-list li{margin-bottom:1rem;font-size:16px}.ha-pricing-table-features-list i{margin-right:.5rem;min-width:15px;font-size:.8em}.ha-pricing-table-feature-text{display:inline-block}.ha-pricing-table-btn{display:inline-block;padding:.8rem 2rem;border-radius:40px;background-color:#e2498a;color:#fff;text-decoration:none;text-transform:uppercase;font-size:12px;-webkit-transition:all .3s;transition:all .3s}.ha-pricing-table-btn:hover{background-color:#562dd4;color:#fff}.ha-card>.elementor-widget-container,.ha-icon-box>.elementor-widget-container,.ha-image-compare>.elementor-widget-container,.ha-infobox>.elementor-widget-container,.ha-member>.elementor-widget-container,.ha-pricing-table>.elementor-widget-container,.ha-review>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1)}.ha-step-flow>.elementor-widget-container{padding:30px;text-align:center}.ha-step-arrow,.ha-step-arrow:after{position:absolute;display:inline-block;border-top:1px solid #ddd}.ha-step-arrow{left:calc(100% + 20px);top:49%;width:100px}.ha-step-arrow:after{top:-2px;right:5px;width:12px;height:12px;border-right:1px solid #ddd;color:#ddd;content:"";-webkit-transform:rotate(45deg) translateY(-50%);-ms-transform:rotate(45deg) translateY(-50%);transform:rotate(45deg) translateY(-50%)}.ha-steps-icon{position:relative;display:inline-block;margin-bottom:2rem;padding:40px;border-radius:50%;background-color:#e9ecf0;box-shadow:0 2px 6px -2px #989898;color:#8056ee;text-align:center;font-size:46px}.ha-steps-icon i{position:relative;display:block;width:1em;height:1em}.ha-steps-icon i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-steps-icon .ha-steps-label{position:absolute;top:5px;right:0;overflow:hidden;padding:12px 8px;max-width:200%;border:3px solid #fff;border-radius:20px;background-color:#8056ee;color:#fff;text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1}.ha-steps-title{margin-top:0;margin-bottom:30px;font-weight:700;font-size:16px}.ha-steps-title a{display:block;color:#562dd4}.ha-news-ticker-wrapper li.ha-news-ticker-item a,.ha-steps-title a:hover{color:#242424}.ha-step-description{margin:0;color:#616161;font-weight:400;font-size:16px;line-height:1.5}.ha-news-ticker-wrapper{position:relative;overflow:hidden;padding:20px 0;border:1px solid #d2d2d2;border-radius:5px}.ha-news-ticker-wrapper ul.ha-news-ticker-container{margin:0;padding:0;list-style:none}.ha-news-ticker-wrapper ul.ha-news-ticker-container:focus,.ha-news-ticker-wrapper ul.ha-news-ticker-container:hover{-webkit-animation-play-state:paused!important;animation-play-state:paused!important}.ha-news-ticker-wrapper span.ha-news-ticker-sticky-title{position:absolute;top:50%;left:auto;z-index:1;padding:20px;background:#333;color:#fff;font-size:1rem;line-height:1;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-news-ticker-wrapper li.ha-news-ticker-item{margin-right:20px;white-space:nowrap}.ha-news-ticker-wrapper li.ha-news-ticker-item:last-child,.ha-post-list-meta-wrap span:last-child{margin-right:0}.ha-news-ticker-wrapper .ha-news-ticker-title{margin:0;font-size:1rem;line-height:1}.ha-news-ticker-wrapper li.ha-news-ticker-item a:hover{color:#e04c8a}.ha-fun-factor-icon{font-size:3em}.ha-fun-factor-content .ha-fun-factor-content-number,.ha-fun-factor-content .ha-fun-factor-content-text{margin-top:0;margin-bottom:15px;font-size:24px}.ha-ff-icon--left .ha-fun-factor-content{padding-left:20px}.ha-ff-icon--right .ha-fun-factor-content{padding-right:20px}.ha-fun-factor-divider{display:block;margin-bottom:15px;height:1px;background-color:#ccc}.ha-ff-icon--top .ha-fun-factor-icon-section,.ha-ff-icon--top .ha-fun-factor-image-section{display:inline-block;margin-top:10px;margin-bottom:10px;width:auto;height:auto}.ha-fun-factor-image-section img{width:200px;height:100px}.ha-ff-container{padding:10px;word-wrap:break-word;overflow-wrap:break-word}.ha-ff-icon--left>.elementor-widget-container .ha-ff-container,.ha-ff-icon--right>.elementor-widget-container .ha-ff-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-ff-icon--left>.elementor-widget-container .ha-ff-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-ff-icon--right>.elementor-widget-container .ha-ff-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-ff-icon--left>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider,.ha-ff-icon--right>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider{display:block;margin-right:auto;margin-left:auto}.ha-ff-icon--top>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider{display:block;margin-right:auto;margin-left:auto;width:100px}.ha-ff-icon--left>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider,.ha-ff-icon--right>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider{width:100%!important}.ha-fun-factor-divider-align-left{margin-left:0!important;text-align:left}.ha-fun-factor-divider-align-right{margin-right:0!important;text-align:right}.ha-fun-factor-divider-align-center{margin-right:auto!important;margin-left:auto!important;text-align:center}.ha-social-icons-wrapper,.ha-social-icons-wrapper a{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-social-icons-wrapper a{padding:15px;border-radius:4px;color:#fff;font-size:30px;-webkit-transition:all .3s;transition:all .3s}a.ha-social-icon:hover{position:relative;z-index:1;background:#e2498a}.ha-social-icons-wrapper a.elementor-social-icon-label{color:#d30c5c}.ha-social-icon:not(:last-child){margin-right:2px}.ha-social-icon i,.ha-social-icon svg{position:relative;display:initial}.ha-social-icon svg,.ha-social-icon-label{width:100%;height:100%}.ha-social-icon i{width:1em;height:1em}.ha-social-icon-label{margin:0 0 0 10px;font-size:18px;font-family:Roboto,sans-serif;line-height:1}.elementor-social-icon-label .ha-social-icon-label{margin-left:0}.elementor-element-edit-mode .ha-social-icon-sticky{z-index:9999}.ha-social-icons:not(.elementor-element-edit-mode) .ha-social-icon-sticky{position:fixed}.ha-social-icon-separator{margin-right:10px}.ha-separator--stroke .ha-social-icon-separator{width:1px;height:1em;background:#d30c5c}.ha-separator--custom .ha-social-icon-separator{color:#d30c5c;font-size:24px}.ha-social-icon-separator:last-child{display:none}.ha-twitter-feed .ha-tweeter-feed-icon i{position:absolute;top:15px;right:15px;color:#1da1f2;font-size:22px}.ha-twitter-feed .ha-tweet-items{display:-ms-grid;display:grid;grid-gap:30px}.ha-twitter-feed .ha-tweet-item{position:relative;z-index:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-shadow:1px 1px 8px 1px rgba(0,0,0,.1)}.ha-twitter-feed .ha-tweet-content:before,.ha-twitter-feed .ha-tweet-item:before{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;content:""}.ha-twitter-feed .ha-tweet-inner-wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:30px 10px}.ha-twitter-feed .ha-tweet-author,.ha-twitter-feed .ha-tweet-inner-wrapper,.ha-twitter-feed .ha-tweet-user{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-twitter-feed .ha-tweet-author{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-bottom:10px}.ha-twitter-feed .ha-tweet-avatar{width:45px;border-radius:50%}.ha-twitter-feed .ha-tweet-user{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-twitter-feed .ha-tweet-author-name,.ha-twitter-feed .ha-tweet-content p a:hover{color:#e2498a}.ha-twitter-feed .ha-tweet-author-name:hover,.ha-twitter-feed .ha-tweet-content p a{color:#562dd4}.ha-twitter-feed .ha-tweet-username{color:#a7a7a7}.ha-twitter-feed .ha-tweet-username:hover{color:#818181}.ha-twitter-feed .ha-tweet-content{position:relative;color:#222}.ha-twitter-feed .ha-tweet-content p{margin-bottom:5px}.ha-twitter-feed .ha-tweet-footer{position:absolute;bottom:15px;left:0;padding:0 15px;width:100%;text-align:right}.ha-twitter-feed .ha-tweet-date{color:#a7a7a7}.ha-twitter-feed .ha-tweet-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around;padding:15px}.ha-twitter-feed .ha-tweet-favorite,.ha-twitter-feed .ha-tweet-retweet{display:inline-block;color:#a7a7a7}.ha-twitter-feed .ha-tweet-favorite{margin-right:12px}.ha-twitter-feed .ha-twitter-load-more-wrapper{margin-top:30px;text-align:center}.ha-twitter-feed .ha-twitter-load-more{display:inline-block;padding:10px 25px;outline:none;border:none;border-radius:50px;background-color:#302a8c;color:#fff;text-align:center;font-weight:400;font-size:16px;-webkit-transition:all .3s;transition:all .3s}.ha-twitter-feed .ha-twitter-load-more:hover{background-color:#e2498a}.ha-twitter-feed .ha-tweet-error-message{padding:20px;border-left:4px solid #ff7726;background-color:#fff9f5}.ha-post-list-item a img,.ha-twitter-feed.ha-twitter-left .ha-tweet-avatar{margin-right:15px}.ha-twitter-feed.ha-twitter-left .ha-tweet-content{text-align:left}.ha-twitter-feed.ha-twitter-center .ha-tweet-author{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-twitter-feed.ha-twitter-center .ha-tweet-content{text-align:center}.ha-twitter-feed.ha-twitter-right .ha-tweeter-feed-icon i{right:auto;left:5px;-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.ha-twitter-feed.ha-twitter-right .ha-tweet-author{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-twitter-feed.ha-twitter-right .ha-tweet-content{text-align:right}.ha-twitter-feed.ha-twitter-user-bottom .ha-tweet-inner-wrapper{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-twitter-feed.ha-twitter-user-bottom .ha-tweet-author{margin-top:10px;margin-bottom:0}.ha-twitter-feed.ha-tweet-glassy-yes .ha-tweet-content:before{background-color:rgba(255,255,255,.4);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.ha-post-list{margin:0;padding:0;list-style:none}.ha-post-list .ha-post-list-item,.ha-post-list.ha-post-list-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-post-list.ha-post-list-inline{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-post-list .ha-post-list-item{margin:0 0 10px;padding:0}.ha-post-list.ha-post-list-inline .ha-post-list-item{margin-right:21px}.ha-post-list .ha-post-list-item:last-child,.ha-post-list.ha-post-list-inline .ha-post-list-item:last-child{margin-right:0;margin-bottom:0}.ha-post-list .ha-post-list-item a{width:100%}.ha-post-list-title{display:block;margin-top:0;margin-bottom:0;color:#242424;font-size:1rem;-webkit-transition:all .4s;transition:all .4s}.ha-post-list .ha-post-list-item a:hover .ha-post-list-title,.ha-taxonomy-list .ha-taxonomy-list-item a:hover .ha-taxonomy-list-title{color:#e04d8b}span.ha-post-list-icon{margin-right:8px;color:#242424;font-size:14px}.ha-post-list .ha-post-list-item a,.ha-post-list-meta-wrap,.ha-post-tab span.ha-post-tab-loading{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-post-list-meta-wrap{margin-top:3px}.ha-post-list-meta-wrap span{margin-right:10px;color:#8c8c8c;font-size:13px}.ha-post-list-meta-wrap span i{margin-right:3px}.ha-post-tab .ha-post-tab-filter{padding:0;border-bottom:1px solid #ddd;list-style:none}.ha-post-tab .ha-post-tab-filter li{display:inline-block;margin:0 5px 0 0;padding:15px 25px;background:#fff;color:#333;text-decoration:none;-webkit-transition:all .3s;transition:all .3s}.ha-post-tab .ha-post-tab-filter li.active,.ha-post-tab .ha-post-tab-filter li:hover,.ha-post-tab.ha-post-tab-left .ha-post-tab-filter li.active,.ha-post-tab.ha-post-tab-left .ha-post-tab-filter li:hover{background:#6d39ef;color:#fff}.ha-post-tab .ha-post-tab-item-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;visibility:hidden;overflow:hidden;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;height:0;opacity:0}.ha-post-tab span.ha-post-tab-loading{-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;width:100%;height:100%;text-align:center;font-size:60px;opacity:.5}.ha-post-tab .ha-post-tab-item-wrapper.active{visibility:visible;height:auto;opacity:1}.ha-post-tab .ha-post-tab-item{margin-bottom:30px;padding-right:15px;padding-left:15px}.ha-post-tab .ha-post-tab-item-inner{box-sizing:border-box;padding:20px;height:100%;border-radius:5px;background:#fff;box-shadow:0 1px 20px rgba(0,0,0,.09)}.ha-post-tab .ha-post-tab-item-inner .ha-post-tab-thumb{position:relative;display:block;overflow:hidden;margin-bottom:15px;padding-right:0;padding-left:0}.ha-post-tab .ha-post-tab-item-inner .ha-post-tab-thumb img{max-width:100%;height:auto}.ha-post-tab .ha-post-tab-item-inner .ha-post-tab-title{margin-top:0;margin-bottom:10px;font-size:16px}.ha-post-tab .ha-post-tab-item-inner .ha-post-tab-title a,.ha-post-tab .ha-post-tab-meta span a{color:#333;text-decoration:none;-webkit-transition:all .4s;transition:all .4s}.ha-post-tab .ha-post-tab-meta span a:hover,.ha-post-tab .ha-post-tab-title a:hover{color:#6d39ef}.ha-post-tab .ha-post-tab-meta{font-size:14px}.ha-post-tab .ha-post-tab-meta span{display:inline-block;margin-top:10px;margin-right:15px;color:#9b9b9b;-webkit-transition:all .4s;transition:all .4s}.ha-post-tab .ha-post-tab-meta span i{padding-right:5px}.ha-post-tab .ha-post-tab-meta span a{color:#9b9b9b}.ha-post-tab .ha-post-tab-excerpt p{margin:0}.ha-post-tab.ha-post-tab-left,.ha-post-tab.ha-post-tab-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-post-tab.ha-post-tab-left .ha-post-tab-filter{-webkit-box-flex:0;-webkit-flex:0 0 200px;-ms-flex:0 0 200px;flex:0 0 200px;min-width:200px;border-right:1px solid #f1f1f1;border-bottom:none}.ha-post-tab.ha-post-tab-left .ha-post-tab-filter li,.ha-post-tab.ha-post-tab-right .ha-post-tab-filter li{text-align:left;display:block;margin:0;text-decoration:none;-webkit-transition:all .3s;transition:all .3s}.ha-post-tab.ha-post-tab-right .ha-post-tab-filter li{text-align:right}.ha-post-tab.ha-post-tab-left .ha-post-tab-content{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 200px);-ms-flex:0 0 calc(100% - 200px);flex:0 0 calc(100% - 200px);min-width:calc(100% - 200px);min-height:100%}.ha-post-tab.ha-post-tab-right{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-post-tab.ha-post-tab-right .ha-post-tab-filter{-webkit-box-flex:0;-webkit-flex:0 0 200px;-ms-flex:0 0 200px;flex:0 0 200px;min-width:200px;border-bottom:none;border-left:1px solid #f1f1f1}.ha-post-tab.ha-post-tab-right .ha-post-tab-content{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 200px);-ms-flex:0 0 calc(100% - 200px);flex:0 0 calc(100% - 200px);min-width:calc(100% - 200px);min-height:100%}@media (max-width:767px){.ha-post-tab.ha-post-tab-right{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-post-tab.ha-post-tab-left .ha-post-tab-filter,.ha-post-tab.ha-post-tab-right .ha-post-tab-filter{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;min-width:100%;border-right:0;border-bottom:1px solid #f1f1f1;border-left:0}.ha-post-tab.ha-post-tab-left .ha-post-tab-content,.ha-post-tab.ha-post-tab-right .ha-post-tab-content{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;min-width:100%;min-height:100%}.ha-post-tab.ha-post-tab-left .ha-post-tab-filter li,.ha-post-tab.ha-post-tab-right .ha-post-tab-filter li{display:inline-block}}.ha-taxonomy-list{margin:0;padding:0;list-style:none}.ha-taxonomy-list.ha-taxonomy-list-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-taxonomy-list .ha-taxonomy-list-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 10px;padding:0}.ha-taxonomy-list.ha-taxonomy-list-inline .ha-taxonomy-list-item{margin-right:21px}.ha-taxonomy-list .ha-taxonomy-list-item:last-child,.ha-taxonomy-list.ha-taxonomy-list-inline .ha-taxonomy-list-item:last-child{margin-right:0;margin-bottom:0}.ha-taxonomy-list .ha-taxonomy-list-item a{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;width:100%}.ha-taxonomy-list-title{display:block;margin-top:0;margin-bottom:0;color:#242424;font-size:1rem;-webkit-transition:all .4s;transition:all .4s}.ha-taxonomy-list span.ha-taxonomy-list-icon{margin-right:8px;color:#242424;font-size:14px}.ha-taxonomy-list span.ha-taxonomy-list-image{margin-right:15px;line-height:1}.ha-taxonomy-list span.ha-taxonomy-list-image img{width:50px}.ha-threesixty-rotation-inner{overflow:hidden;background:#0c5460}.ha-threesixty-rotation-inner img{cursor:move}.ha-img-magnifier-glass{position:absolute;width:200px;height:200px;border:3px solid #000;border-radius:50%;cursor:none}span.ha-threesixty-rotation-magnify{position:absolute;top:15px;right:15px;display:inline-block;font-size:22px;line-height:1}.ha-threesixty-rotation-autoplay{display:none}.ha-threesixty-rotation-autoplay-button button{display:inline-block;padding:.4rem 2rem;outline:none;border-radius:40px;background-color:#e2498a;color:#fff;text-decoration:none;text-transform:uppercase;font-size:24px;-webkit-transition:all .3s;transition:all .3s}.ha-threesixty-rotation-autoplay-button button:focus{outline:none}.ha-threesixty-rotation-autoplay-button button:hover{outline:none;background-color:#562dd4;color:#fff}.ha-threesixty-rotation-360img{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;margin:auto;width:100px;height:100px;border-radius:50%;background-color:rgba(38,39,39,.5);background-position:50% 50%;background-size:contain;background-repeat:no-repeat;box-shadow:rgba(255,255,255,.5) 0 0 4px;color:#505050;text-align:center;line-height:100px;-webkit-transition:all .5s ease 0s;transition:all .5s ease 0s}
1
+ .happy-addon>.elementor-widget-container{word-wrap:break-word;overflow-wrap:break-word;box-sizing:border-box}.happy-addon>.elementor-widget-container *{box-sizing:border-box}.happy-addon img{max-width:100%;height:auto;-o-object-fit:cover;object-fit:cover}.happy-addon p:empty{display:none}.ha-screen-reader-text{position:absolute;overflow:hidden;clip:rect(1px,1px,1px,1px);margin:-1px;padding:0;width:1px;height:1px;border:0;word-wrap:normal!important;-webkit-clip-path:inset(50%);clip-path:inset(50%)}.ha-has-background-overlay>.elementor-widget-container{position:relative;z-index:1}.ha-has-background-overlay>.elementor-widget-container:before{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;content:""}.ha-popup--is-enabled .ha-js-popup,.ha-popup--is-enabled .ha-js-popup img{cursor:-webkit-zoom-in!important;cursor:zoom-in!important}.mfp-wrap .mfp-arrow,.mfp-wrap .mfp-close{background-color:transparent}.mfp-wrap .mfp-arrow:focus,.mfp-wrap .mfp-close:focus{outline-width:thin}.ha-btn{display:inline-block;max-width:100%;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-btn-icon--svg,.ha-member-links>a{display:inline-block}.ha-btn-icon--svg svg{width:auto;height:1em}.ha-badge{padding:.475rem 1.1rem;max-width:100%;border-radius:50px;background-color:#fff;font-size:12px}.ha-badge--top-left{top:1rem;left:1rem}.ha-badge--top-center{top:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--top-right{top:1rem;right:1rem}.ha-badge--middle-left{top:50%;left:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--middle-center{top:50%;left:50%;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}.ha-badge--middle-right{top:50%;right:1rem;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-badge--bottom-left{bottom:1rem;left:1rem}.ha-badge--bottom-center{bottom:1rem;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-badge--bottom-right{right:1rem;bottom:1rem}.ha-card-figure{position:relative;height:250px}.ha-card-figure img{border-top-left-radius:calc(.5rem - 1px);border-top-right-radius:calc(.5rem - 1px)}.ha-card-body{padding:1.5rem}.ha-card-title{margin-top:0;margin-bottom:.75rem;color:#151515;font-weight:700;font-size:22px}.ha-card-text{margin-bottom:2rem;color:#616161;font-size:16px;line-height:1.7}.ha-card-text>p,.ha-infobox-text p{margin-top:0;margin-bottom:0}.ha-card--top .ha-card-figure{display:inline-block;width:100%}.ha-card--left>.elementor-widget-container,.ha-card--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-card--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-card--left .ha-card-body,.ha-card--left .ha-card-figure,.ha-card--right .ha-card-body,.ha-card--right .ha-card-figure{-webkit-box-flex:0;-webkit-flex:0 0 50%;-ms-flex:0 0 50%;flex:0 0 50%;max-width:50%}.ha-card--left .ha-card-body,.ha-card--right .ha-card-body{padding:2.5rem}.ha-card--left .ha-card-figure img{border-radius:calc(.5rem - 1px) 0 0 calc(.5rem - 1px)}.ha-card--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;text-align:right}.ha-card--right .ha-card-figure img{border-radius:0 calc(.5rem - 1px) calc(.5rem - 1px) 0}.ha-card .ha-badge{position:absolute}.ha-infobox>.elementor-widget-container{padding:1.5rem}.ha-infobox-title{margin-top:0;margin-bottom:1rem;color:#151515;font-size:24px}.ha-infobox-figure{display:inline-block;margin:0 0 1.5rem!important}.ha-infobox-figure--icon{text-align:center;font-size:3rem;line-height:1}.ha-icon-box-icon i,.ha-icon-box-icon svg,.ha-infobox-figure i,.ha-infobox-figure svg{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{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-member .ha-btn{margin-bottom:10px}.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,.ha-member-links+.ha-btn{margin-top:10px;margin-bottom:0}.ha-review-header{margin-top:1.5rem}.ha-review-desc p,.ha-review-figure{margin:0}.ha-review-figure img{width:100%;height:100%;border-radius:50%;vertical-align:bottom}.ha-review-reviewer{margin-top:0;margin-bottom:.3rem;color:#151515;font-size:18px}.ha-review-position{margin-bottom:.5rem;color:#7f7f7f;font-size:15px}.ha-review-ratting{display:inline-block;font-size:12px;line-height:1}.ha-review-ratting--num{padding:.25em .66em;border-radius:2.5em;background-color:#562dd4;color:#fff}.ha-review-ratting--star{color:#ffbf36}.ha-review-desc{margin-top:1.5rem;font-size:16px;line-height:1.6}.ha-review--top>.elementor-widget-container{padding:2rem}.ha-review--top .ha-review-figure{display:inline-block;max-width:70px;height:70px}.ha-review--left>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-review--left>.elementor-widget-container,.ha-review--right>.elementor-widget-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding-left:2rem}.ha-review--left .ha-review-figure,.ha-review--right .ha-review-figure{-webkit-box-flex:0;-webkit-flex:0 0 150px;-ms-flex:0 0 150px;flex:0 0 150px;max-width:150px;height:150px}.ha-review--left .ha-review-body,.ha-review--right .ha-review-body{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 150px);-ms-flex:0 0 calc(100% - 150px);flex:0 0 calc(100% - 150px);padding:2rem;max-width:calc(100% - 150px)}.ha-review--left .ha-review-body>:first-child,.ha-review--right .ha-review-body>:first-child{margin-top:0}.ha-review--right>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse;padding-right:2rem;padding-left:0;text-align:right}.ha-image-compare .twentytwenty-container,.ha-image-compare .twentytwenty-wrapper,a.ha-social-icon:after,a.ha-social-icon:before{border-radius:inherit}.ha-gallery-filter{margin:0 10px 2rem;padding:0;list-style:none}.ha-gallery-filter>li{display:inline-block;margin-bottom:10px;max-width:100%}.ha-gallery-filter>li:not(:last-child){margin-right:10px}.ha-gallery-filter>li>button{display:block;overflow:hidden;padding:10px 25px;max-width:100%;border:2px solid #562dd4;border-radius:.25rem;background-color:transparent;color:#562dd4;text-transform:uppercase;text-overflow:ellipsis;font-size:14px;cursor:pointer;-webkit-transition:all .3s;transition:all .3s}.ha-gallery-filter>li>button:focus,.ha-gallery-filter>li>button:hover{outline:0;background-color:#562dd4;color:#fff}.ha-gallery-filter>.ha-filter-active>button{background-color:#562dd4;color:#fff}.ha-image-grid-item{float:left}.ha-image-grid-inner{position:relative;display:block;overflow:hidden;margin:10px;text-decoration:none}.ha-image-grid-inner img{display:block;width:100%;-webkit-transition:all .25s;transition:all .25s}.ha-image-grid--layout-even .ha-image-grid-inner{height:250px}.ha-image-grid--layout-even .ha-image-grid-inner img{height:100%}.ha-justified-gallery-item,.ha-justified-gallery-item>img{border-radius:6px}.ha-justified-gallery .justified-gallery>.ha-justified-gallery-item>.caption{bottom:-100px!important;padding:10px;-webkit-transition:all .25s!important;transition:all .25s!important;-webkit-animation:haSmoothReveal .3s forwards;animation:haSmoothReveal .3s forwards}.ha-justified-gallery .justified-gallery>.ha-justified-gallery-item>.caption.caption-visible{bottom:0!important}.ha-justified-gallery .justified-gallery>.entry-visible>a>img,.ha-justified-gallery .justified-gallery>.entry-visible>img{-webkit-transition:all 300ms,opacity 500ms ease-in;transition:all 300ms,opacity 500ms ease-in}@-webkit-keyframes haSmoothReveal{0%{-webkit-transform:translateY(100px);transform:translateY(100px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}@keyframes haSmoothReveal{0%{-webkit-transform:translateY(100px);transform:translateY(100px)}to{-webkit-transform:translateY(0);transform:translateY(0)}}.ha-carousel .slick-vertical .slick-slide,.ha-slider .slick-vertical .slick-slide{border:0}.ha-carousel .slick-next,.ha-carousel .slick-prev,.ha-slider .slick-next,.ha-slider .slick-prev{z-index:999;padding:0;border:1px solid rgba(255,255,255,.8);border-radius:50%;background-color:rgba(255,255,255,.8);color:#8c8c8c;text-align:center;font-size:12px;opacity:1}.ha-carousel .slick-next:focus,.ha-carousel .slick-next:hover,.ha-carousel .slick-prev:focus,.ha-carousel .slick-prev:hover,.ha-slider .slick-next:focus,.ha-slider .slick-next:hover,.ha-slider .slick-prev:focus,.ha-slider .slick-prev:hover{background-color:#fff;color:#8c8c8c}.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;display:inline-block;overflow:hidden;vertical-align:bottom}.ha-slick-content{position:absolute;bottom:0;padding:1.5rem;width:100%;background:-webkit-linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.3));background:linear-gradient(rgba(0,0,0,0),rgba(0,0,0,.3))}.ha-slick-title{margin-top:0;margin-bottom:.2rem;color:#fff;font-size:20px}.ha-slick-subtitle{margin:0;color:#fff}.ha-skills>.elementor-widget-container{padding-top:1px}.ha-skill{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;border-radius:15px;background-color:#e9ecef;font-size:.75rem}.ha-skill--inside .ha-skill-info,.ha-skill--outside .ha-skill-info{text-align:left;font-size:14px;line-height:1}.ha-skill--inside .ha-skill-level-text,.ha-skill--outside .ha-skill-level-text{float:right}.ha-skill--outside{height:2px}.ha-skill--outside .ha-skill-level{position:relative}.ha-skill--outside .ha-skill-info{position:absolute;top:-25px;width:100%;color:#242424}.ha-skill--inside{height:30px}.ha-skill--inside .ha-skill-info{padding-right:1rem;padding-left:1rem;color:#fff}.ha-skill-level{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;width:10%;border-radius:inherit;background-color:#562dd4;color:#fff;text-align:center;white-space:nowrap;-webkit-transition:width .6s ease;transition:width .6s ease}.ha-skill--outside{margin-top:40px}.ha-skill--inside:not(:first-child){margin-top:20px}.ha-skill-name{display:inline-block;overflow:hidden;max-width:70%;text-overflow:ellipsis}.ha-gradient-heading{margin-top:0;margin-bottom:0}.ha-gradient-heading>a{color:inherit;text-decoration:none}.ha-logo-grid-item{float:left;overflow:hidden;height:180px;border-color:#e7e7e7}.ha-logo-grid-figure{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center;margin:0;padding:30px;width:100%;height:100%}.ha-logo-grid-img{max-height:100%}@media (min-width:1025px){.ha-logo-grid--col-2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col-3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col-4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col-5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col-6 .ha-logo-grid-item{width:calc(100%/6)}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--col--tablet2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col--tablet3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col--tablet4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col--tablet5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col--tablet6 .ha-logo-grid-item{width:calc(100%/6)}}@media (max-width:767px){.ha-logo-grid--col--mobile2 .ha-logo-grid-item{width:calc(100%/2)}.ha-logo-grid--col--mobile3 .ha-logo-grid-item{width:calc(100%/3)}.ha-logo-grid--col--mobile4 .ha-logo-grid-item{width:calc(100%/4)}.ha-logo-grid--col--mobile5 .ha-logo-grid-item{width:calc(100%/5)}.ha-logo-grid--col--mobile6 .ha-logo-grid-item{width:calc(100%/6)}}.ha-logo-grid--tictactoe .ha-logo-grid-item{border-width:2px 2px 0 0;border-style:solid}@media (min-width:1025px){.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}@media (max-width:767px){.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n){border-right-width:0!important}.ha-logo-grid--tictactoe.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:0!important}}.ha-logo-grid--border .ha-logo-grid-item{border-width:0 2px 2px 0;border-style:solid}.ha-logo-grid--border .ha-logo-grid-item:first-child{border-top-left-radius:10px}.ha-logo-grid--border .ha-logo-grid-item:last-child{border-bottom-right-radius:10px}@media (min-width:1025px){.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col-6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--tablet6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}}@media (max-width:767px){.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(-n+2){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-child(2){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile2 .ha-logo-grid-item:nth-last-child(2){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(-n+3){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-child(3){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile3 .ha-logo-grid-item:nth-last-child(3){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(-n+4){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-child(4){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile4 .ha-logo-grid-item:nth-last-child(4){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(-n+5){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-child(5){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile5 .ha-logo-grid-item:nth-last-child(5){border-bottom-left-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(-n+6){border-top-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6n+1){border-left-width:2px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-child(6){border-top-right-radius:10px}.ha-logo-grid--border.ha-logo-grid--col--mobile6 .ha-logo-grid-item:nth-last-child(6){border-bottom-left-radius:10px}}.ha-logo-grid--box .ha-logo-grid-wrapper{margin:-.5rem}.ha-logo-grid--box .ha-logo-grid-item{margin:.5rem;border-width:2px;border-style:solid;border-radius:.5rem}@media (min-width:1025px){.ha-logo-grid--box.ha-logo-grid--col-2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col-6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}}@media (max-width:1024px) and (min-width:768px){.ha-logo-grid--box.ha-logo-grid--col--tablet2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--tablet6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}}@media (max-width:767px){.ha-logo-grid--box.ha-logo-grid--col--mobile2 .ha-logo-grid-item{width:calc((100%/2) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile3 .ha-logo-grid-item{width:calc((100%/3) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile4 .ha-logo-grid-item{width:calc((100%/4) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile5 .ha-logo-grid-item{width:calc((100%/5) - 1rem)}.ha-logo-grid--box.ha-logo-grid--col--mobile6 .ha-logo-grid-item{width:calc((100%/6) - 1rem)}}.ha-dual-btn,.ha-dual-btn-connector{display:inline-block}.ha-dual-btn-wrapper{position:relative;text-align:center;font-weight:400}.ha-dual-btn{padding:1.2rem 3rem;max-width:100%;color:#fff;text-decoration:none;font-size:14px}.ha-dual-btn--left{background-color:#562dd4}.ha-dual-btn--left:focus,.ha-dual-btn--left:hover{background-color:#4423ab;color:#fff}.ha-dual-btn--right{background-color:#e2498a}.ha-dual-btn--right:focus,.ha-dual-btn--right:hover{background-color:#d6226e;color:#fff}.ha-dual-btn-connector{position:absolute!important;z-index:9;overflow:hidden;width:30px;height:30px;border-radius:100%;background-color:#fff;box-shadow:0 0 0 5px rgba(255,255,255,.3);color:#27374c;text-transform:uppercase;font-size:12px;line-height:30px;-webkit-transform:translate(50%,-50%);-ms-transform:translate(50%,-50%);transform:translate(50%,-50%)}.ha-dual-btn-icon>svg{width:1em;height:auto}.ha-dual-btn-icon>i{font-size:1em}.ha-dual-btn-icon--before{margin-right:5px}.ha-dual-btn-icon--after{margin-left:5px}.ha-dual-button>.elementor-widget-container,.ha-news-ticker-wrapper ul.ha-news-ticker-container{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-dual-button--mobile-layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--mobile-layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--mobile-layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--mobile-layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--mobile-layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-center>.elementor-widget-container,.ha-testimonial__reviewer{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--mobile-layout-stack.ha-dual-button--mobile-align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--mobile-layout-queue.ha-dual-button--mobile-align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--mobile-layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--mobile-layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--mobile-layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--mobile-layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--mobile-layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}@media (min-width:768px){.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-center>.elementor-widget-container{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--tablet-layout-stack.ha-dual-button--tablet-align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--tablet-layout-queue.ha-dual-button--tablet-align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--tablet-layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--tablet-layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--tablet-layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--tablet-layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--tablet-layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--tablet-layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--tablet-layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--tablet-layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--tablet-layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--tablet-layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}}@media (min-width:1025px){.ha-dual-button--layout-stack.ha-dual-button--align-left>.elementor-widget-container{-webkit-box-align:start;-webkit-align-items:flex-start;align-items:flex-start;-ms-flex-align:start}.ha-dual-button--layout-stack.ha-dual-button--align-center>.elementor-widget-container{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-dual-button--layout-stack.ha-dual-button--align-right>.elementor-widget-container{-webkit-box-align:end;-webkit-align-items:flex-end;align-items:flex-end;-ms-flex-align:end}.ha-dual-button--layout-queue.ha-dual-button--align-left>.elementor-widget-container{-webkit-box-pack:start;-ms-flex-pack:start;-webkit-justify-content:flex-start;justify-content:flex-start}.ha-dual-button--layout-queue.ha-dual-button--align-center>.elementor-widget-container{-webkit-box-pack:center;-ms-flex-pack:center;-webkit-justify-content:center;justify-content:center}.ha-dual-button--layout-queue.ha-dual-button--align-right>.elementor-widget-container{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-dual-button--layout-stack>.elementor-widget-container{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-dual-button--layout-stack .ha-dual-btn-wrapper{max-width:100%}.ha-dual-button--layout-stack .ha-dual-btn-connector{top:100%;right:50%}.ha-dual-button--layout-stack .ha-dual-btn--left{border-radius:30px 30px 0 0}.ha-dual-button--layout-stack .ha-dual-btn--right{border-radius:0 0 30px 30px}.ha-dual-button--layout-queue>.elementor-widget-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-dual-button--layout-queue .ha-dual-btn-wrapper{max-width:50%}.ha-dual-button--layout-queue .ha-dual-btn-connector{top:50%;right:0}.ha-dual-button--layout-queue .ha-dual-btn--left{border-radius:50px 0 0 50px}.ha-dual-button--layout-queue .ha-dual-btn--right{border-radius:0 50px 50px 0}}.ha-testimonial--basic>.elementor-widget-container{padding:2rem;border:1px solid #ececec;border-radius:.5rem}.ha-testimonial--basic .ha-testimonial__content{margin-bottom:2.5em}.ha-testimonial--bubble .ha-testimonial__content{position:relative;margin-bottom:1.5rem;padding:2rem;border-radius:6px;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);line-height:1.6rem}.ha-testimonial--bubble .ha-testimonial__content:after{position:absolute;bottom:-14px;color:#fff;content:"\e911";font-style:normal;font-size:36px;font-family:"Happy Icons";-webkit-transform:rotate(-180deg);-ms-transform:rotate(-180deg);transform:rotate(-180deg)}.ha-testimonial--left.ha-testimonial--bubble .ha-testimonial__content:after{left:15px}.ha-testimonial--center.ha-testimonial--bubble .ha-testimonial__content:after{left:50%;-webkit-transform:translateX(-50%) rotate(-180deg);-ms-transform:translateX(-50%) rotate(-180deg);transform:translateX(-50%) rotate(-180deg)}.ha-testimonial--right.ha-testimonial--bubble .ha-testimonial__content:after{right:15px}.ha-testimonial__reviewer{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-testimonial__reviewer-thumb{-webkit-box-flex:0;-webkit-flex:0 0 65px;-ms-flex:0 0 65px;flex:0 0 65px;max-width:65px;height:65px}.ha-testimonial__reviewer-thumb img{width:100%;height:100%;border-radius:50%;-o-object-fit:cover;object-fit:cover}.ha-testimonial__reviewer-name{margin-bottom:.3rem;color:#562dd4;font-weight:700;font-size:18px}.ha-testimonial__reviewer-title{color:#8c8c8c;font-size:16px}.ha-testimonial--left .ha-testimonial__reviewer-meta{padding-left:1em}.ha-testimonial--center .ha-testimonial__reviewer{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-testimonial--center .ha-testimonial__reviewer-meta{padding-top:1em;max-width:100%}.ha-testimonial--left .ha-testimonial__reviewer-meta,.ha-testimonial--right .ha-testimonial__reviewer-meta{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 65px);-ms-flex:0 0 calc(100% - 65px);flex:0 0 calc(100% - 65px);max-width:calc(100% - 65px)}.ha-testimonial--right .ha-testimonial__reviewer{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-testimonial--right .ha-testimonial__reviewer-meta{padding-right:1em}.ha-testimonial--left{text-align:left}.ha-testimonial--right{text-align:right}.ha-number-body,.ha-testimonial--center{text-align:center}.ha-number-body{position:relative;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;overflow:hidden;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;padding:6px;width:50px;height:50px;border-radius:100%;background-color:#562dd4;color:#fff;font-size:20px}.ha-number-overlay{position:absolute;top:0;left:0;width:100%;height:100%}.ha-number-text{position:relative;z-index:1;-webkit-box-flex:1;-webkit-flex:1;-ms-flex:1;flex:1}.ha-flip-box-container:after{display:block;visibility:hidden;clear:both;height:0;content:" ";font-size:0}.ha-flip-box-container .ha-flip-box-inner{position:relative;z-index:1;margin:0;padding:0;-webkit-backface-visibility:hidden;backface-visibility:hidden}.ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-back{z-index:1}.ha-flip-box-container .ha-flip-box-inner:hover .ha-flip-box-front{z-index:-1}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-inner-wrapper{position:relative;-webkit-transform:translateZ(0);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-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;font-size:28px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon svg{display:block;width:1em;height:1em}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i{position:relative}.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;font-size:20px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon svg{display:block;width:1em;height:1em}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i{position:relative;color:#fff}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-back{-webkit-transform:rotateY(0);transform:rotateY(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-back{-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-front{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-back{-webkit-transform:rotateX(0);transform:rotateX(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-back{-webkit-transform:rotateX(-180deg);transform:rotateX(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-front{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-back,.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-front{-webkit-transition:-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275),-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275)}.ha-logo-grid-wrapper:after{display:block;clear:both;content:""}.ha-pricing-table>.elementor-widget-container{position:relative;overflow:hidden;padding:3em 4em}.ha-pricing-table-badge{position:absolute;top:-1px;padding:.8rem 1rem;background-color:#e2498a;color:#fff;line-height:1}.ha-pricing-table-badge--left{left:0;-webkit-transform:rotate(-90deg) translateX(-100%);-ms-transform:rotate(-90deg) translateX(-100%);transform:rotate(-90deg) translateX(-100%);-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.ha-pricing-table-badge--right{right:0;-webkit-transform:rotate(-90deg) translateY(-100%);-ms-transform:rotate(-90deg) translateY(-100%);transform:rotate(-90deg) translateY(-100%);-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top}.ha-pricing-table-title{margin-top:0;margin-bottom:.5rem;color:#242424;font-weight:400;font-size:24px}.ha-pricing-table-price{margin-bottom:3rem}.ha-pricing-table-price-tag{margin-bottom:.5rem;color:#242424;font-weight:700;font-size:60px;line-height:normal}.ha-pricing-table-currency{font-size:24px}.ha-pricing-table-period{color:#8c8c8c;font-size:16px}.ha-pricing-table-body{margin-bottom:3rem}.ha-pricing-table-features-title{margin-top:0;margin-bottom:1rem;font-weight:700;font-size:16px}.ha-pricing-table-features-list{margin:0;padding:0;list-style:none}.ha-pricing-table-features-list li{margin-bottom:1rem;font-size:16px}.ha-pricing-table-features-list i,.ha-pricing-table-features-list svg{margin-right:.5rem;min-width:15px;font-size:.8em}.ha-pricing-table-features-list svg,span.ha-post-list-icon svg{width:auto;height:1em}.ha-pricing-table-feature-text{display:inline-block}.ha-pricing-table-btn{display:inline-block;padding:.8rem 2rem;border-radius:40px;background-color:#e2498a;color:#fff;text-decoration:none;text-transform:uppercase;font-size:12px;-webkit-transition:all .3s;transition:all .3s}.ha-pricing-table-btn:hover{background-color:#562dd4;color:#fff}.ha-card>.elementor-widget-container,.ha-icon-box>.elementor-widget-container,.ha-image-compare>.elementor-widget-container,.ha-infobox>.elementor-widget-container,.ha-member>.elementor-widget-container,.ha-pricing-table>.elementor-widget-container,.ha-review>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1)}.ha-step-flow>.elementor-widget-container{padding:30px;text-align:center}.ha-step-arrow,.ha-step-arrow:after{position:absolute;display:inline-block;border-top:1px solid #ddd}.ha-step-arrow{left:calc(100% + 20px);top:49%;width:100px}.ha-step-arrow:after{top:-2px;right:5px;width:12px;height:12px;border-right:1px solid #ddd;color:#ddd;content:"";-webkit-transform:rotate(45deg) translateY(-50%);-ms-transform:rotate(45deg) translateY(-50%);transform:rotate(45deg) translateY(-50%)}.ha-steps-icon{position:relative;display:inline-block;margin-bottom:2rem;padding:40px;border-radius:50%;background-color:#e9ecf0;box-shadow:0 2px 6px -2px #989898;color:#8056ee;text-align:center;font-size:46px}.ha-fun-factor__media--icon i,.ha-fun-factor__media--icon svg,.ha-steps-icon i,.ha-steps-icon svg{position:relative;display:block;width:1em;height:1em}.ha-fun-factor__media--icon i:before,.ha-steps-icon i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-steps-icon .ha-steps-label{position:absolute;top:5px;right:0;overflow:hidden;padding:12px 8px;max-width:200%;border:3px solid #fff;border-radius:20px;background-color:#8056ee;color:#fff;text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1}.ha-steps-title{margin-top:0;margin-bottom:30px;font-weight:700;font-size:16px}.ha-steps-title a{display:block;color:#562dd4}.ha-news-ticker-wrapper li.ha-news-ticker-item a,.ha-steps-title a:hover{color:#242424}.ha-step-description{margin:0;color:#616161;font-weight:400;font-size:16px;line-height:1.5}.ha-news-ticker-wrapper{position:relative;overflow:hidden;padding:20px 0;border:1px solid #d2d2d2;border-radius:5px}.ha-news-ticker-wrapper ul.ha-news-ticker-container{margin:0;padding:0;list-style:none}.ha-news-ticker-wrapper ul.ha-news-ticker-container:focus,.ha-news-ticker-wrapper ul.ha-news-ticker-container:hover{-webkit-animation-play-state:paused!important;animation-play-state:paused!important}.ha-news-ticker-wrapper span.ha-news-ticker-sticky-title{position:absolute;top:50%;left:auto;z-index:1;padding:20px;background:#333;color:#fff;font-size:1rem;line-height:1;-webkit-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}.ha-news-ticker-wrapper li.ha-news-ticker-item{margin-right:20px;white-space:nowrap}.ha-news-ticker-wrapper li.ha-news-ticker-item:last-child,.ha-post-list-meta-wrap span:last-child{margin-right:0}.ha-news-ticker-wrapper .ha-news-ticker-title{margin:0;font-size:1rem;line-height:1}.ha-news-ticker-wrapper li.ha-news-ticker-item a:hover{color:#e04c8a}.ha-fun-factor__content .ha-fun-factor__content-number,.ha-fun-factor__content .ha-fun-factor__content-text{margin-top:0;margin-bottom:15px;font-size:24px}.ha-ff-icon--left .ha-fun-factor__content{padding-left:20px}.ha-ff-icon--right .ha-fun-factor__content{padding-right:20px}.ha-fun-factor__divider{display:block;margin-bottom:15px;height:1px;background-color:#ccc}.ha-ff-icon--top .ha-fun-factor__media{display:inline-block;margin-top:10px;margin-bottom:10px}.ha-ff-icon--top .ha-fun-factor__media--image{width:200px}:not(.ha-ff-icon--top) .ha-fun-factor__media--image{-webkit-box-flex:0;-webkit-flex:0 0 200px;-ms-flex:0 0 200px;flex:0 0 200px;max-width:200px}.ha-fun-factor__media--image img{width:100%;height:100%;vertical-align:bottom}.ha-fun-factor__media--icon{font-size:3rem}.ha-fun-factor__wrap{padding:10px;word-wrap:break-word;overflow-wrap:break-word}.ha-ff-icon--left>.elementor-widget-container .ha-fun-factor__wrap,.ha-ff-icon--right>.elementor-widget-container .ha-fun-factor__wrap{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-ff-icon--left>.elementor-widget-container .ha-fun-factor__wrap{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-ff-icon--right>.elementor-widget-container .ha-fun-factor__wrap{-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-ff-icon--left>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider,.ha-ff-icon--right>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider{display:block;margin-right:auto;margin-left:auto}.ha-ff-icon--top>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider{display:block;margin-right:auto;margin-left:auto;width:100px}.ha-ff-icon--left>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider,.ha-ff-icon--right>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider{width:100%!important}.ha-fun-factor__divider-align-left{margin-left:0!important;text-align:left}.ha-fun-factor__divider-align-right{margin-right:0!important;text-align:right}.ha-fun-factor__divider-align-center{margin-right:auto!important;margin-left:auto!important;text-align:center}.ha-social-icons-wrapper,.ha-social-icons-wrapper a{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-social-icons-wrapper a{padding:15px;border-radius:4px;color:#fff;font-size:30px;-webkit-transition:all .3s;transition:all .3s}a.ha-social-icon:hover{position:relative;z-index:1;background:#e2498a}.ha-social-icons-wrapper a.elementor-social-icon-label{color:#d30c5c}.ha-social-icon:not(:last-child){margin-right:2px}.ha-social-icon i{position:relative;display:initial;width:1em;height:1em}.ha-social-icon-label{margin:0 0 0 10px;width:100%;height:100%;font-size:18px;line-height:1}.elementor-social-icon-label .ha-social-icon-label{margin-left:0}.elementor-element-edit-mode .ha-social-icon-sticky{z-index:9999}.ha-social-icons:not(.elementor-element-edit-mode) .ha-social-icon-sticky{position:fixed}.ha-social-icon-separator{margin-right:10px}.ha-separator--stroke .ha-social-icon-separator{width:1px;height:1em;background:#d30c5c}.ha-separator--custom .ha-social-icon-separator{color:#d30c5c;font-size:24px}.ha-social-icon-separator:last-child{display:none}.ha-twitter-feed .ha-tweeter-feed-icon i{position:absolute;top:15px;right:15px;color:#1da1f2;font-size:22px}.ha-twitter-feed .ha-tweet-items{display:-ms-grid;display:grid;grid-gap:30px}.ha-twitter-feed .ha-tweet-item{position:relative;z-index:0;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;box-shadow:1px 1px 8px 1px rgba(0,0,0,.1)}.ha-twitter-feed .ha-tweet-content:before,.ha-twitter-feed .ha-tweet-item:before{position:absolute;top:0;left:0;z-index:-1;width:100%;height:100%;content:""}.ha-twitter-feed .ha-tweet-inner-wrapper{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column;padding:30px 10px}.ha-twitter-feed .ha-tweet-author,.ha-twitter-feed .ha-tweet-inner-wrapper,.ha-twitter-feed .ha-tweet-user{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-twitter-feed .ha-tweet-author{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row;margin-bottom:10px}.ha-twitter-feed .ha-tweet-avatar{width:45px;border-radius:50%}.ha-twitter-feed .ha-tweet-user{-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-twitter-feed .ha-tweet-author-name,.ha-twitter-feed .ha-tweet-content p a:hover{color:#e2498a}.ha-twitter-feed .ha-tweet-author-name:hover,.ha-twitter-feed .ha-tweet-content p a{color:#562dd4}.ha-twitter-feed .ha-tweet-username{color:#a7a7a7}.ha-twitter-feed .ha-tweet-username:hover{color:#818181}.ha-twitter-feed .ha-tweet-content{position:relative;color:#222}.ha-twitter-feed .ha-tweet-content p{margin-bottom:5px}.ha-twitter-feed .ha-tweet-footer{position:absolute;bottom:15px;left:0;padding:0 15px;width:100%;text-align:right}.ha-twitter-feed .ha-tweet-date{color:#a7a7a7}.ha-twitter-feed .ha-tweet-meta{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-ms-flex-pack:distribute;-webkit-justify-content:space-around;justify-content:space-around;padding:15px}.ha-twitter-feed .ha-tweet-favorite,.ha-twitter-feed .ha-tweet-retweet{display:inline-block;color:#a7a7a7}.ha-twitter-feed .ha-tweet-favorite{margin-right:12px}.ha-twitter-feed .ha-twitter-load-more-wrapper{margin-top:30px;text-align:center}.ha-twitter-feed .ha-twitter-load-more{display:inline-block;padding:10px 25px;outline:none;border:none;border-radius:50px;background-color:#302a8c;color:#fff;text-align:center;font-weight:400;font-size:16px;-webkit-transition:all .3s;transition:all .3s}.ha-twitter-feed .ha-twitter-load-more:hover{background-color:#e2498a}.ha-twitter-feed .ha-tweet-error-message{padding:20px;border-left:4px solid #ff7726;background-color:#fff9f5}.ha-post-list-item a img,.ha-twitter-feed.ha-twitter-left .ha-tweet-avatar{margin-right:15px}.ha-twitter-feed.ha-twitter-left .ha-tweet-content{text-align:left}.ha-twitter-feed.ha-twitter-center .ha-tweet-author{-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-ms-flex-direction:column;flex-direction:column}.ha-twitter-feed.ha-twitter-center .ha-tweet-content{text-align:center}.ha-twitter-feed.ha-twitter-right .ha-tweeter-feed-icon i{right:auto;left:5px;-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.ha-twitter-feed.ha-twitter-right .ha-tweet-author{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-twitter-feed.ha-twitter-right .ha-tweet-content{text-align:right}.ha-twitter-feed.ha-twitter-user-bottom .ha-tweet-inner-wrapper{-webkit-box-pack:end;-ms-flex-pack:end;-webkit-justify-content:flex-end;justify-content:flex-end}.ha-twitter-feed.ha-twitter-user-bottom .ha-tweet-author{margin-top:10px;margin-bottom:0}.ha-twitter-feed.ha-tweet-glassy-yes .ha-tweet-content:before{background-color:rgba(255,255,255,.4);-webkit-backdrop-filter:blur(10px);backdrop-filter:blur(10px)}.ha-post-list{margin:0;padding:0;list-style:none}.ha-post-list .ha-post-list-item,.ha-post-list.ha-post-list-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-post-list.ha-post-list-inline{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-post-list .ha-post-list-item{margin:0 0 10px;padding:0}.ha-post-list.ha-post-list-inline .ha-post-list-item{margin-right:21px}.ha-post-list .ha-post-list-item:last-child,.ha-post-list.ha-post-list-inline .ha-post-list-item:last-child{margin-right:0;margin-bottom:0}.ha-post-list .ha-post-list-item a{width:100%}.ha-post-list-title{display:block;margin-top:0;margin-bottom:0;color:#242424;font-size:1rem;-webkit-transition:all .4s;transition:all .4s}.ha-post-list .ha-post-list-item a:hover .ha-post-list-title,.ha-taxonomy-list .ha-taxonomy-list-item a:hover .ha-taxonomy-list-title{color:#e04d8b}span.ha-post-list-icon{margin-right:8px;color:#242424;font-size:14px}.ha-post-list .ha-post-list-item a,.ha-post-list-meta-wrap,.ha-post-tab span.ha-post-tab-loading{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-post-list-meta-wrap{margin-top:3px}.ha-post-list-meta-wrap span{margin-right:10px;color:#8c8c8c;font-size:13px}.ha-post-list-meta-wrap span i{margin-right:3px}.ha-post-tab .ha-post-tab-filter{padding:0;border-bottom:1px solid #ddd;list-style:none}.ha-post-tab .ha-post-tab-filter li{display:inline-block;margin:0 5px 0 0;padding:15px 25px;background:#fff;color:#333;text-decoration:none;-webkit-transition:all .3s;transition:all .3s}.ha-post-tab .ha-post-tab-filter li.active,.ha-post-tab .ha-post-tab-filter li:hover,.ha-post-tab.ha-post-tab-left .ha-post-tab-filter li.active,.ha-post-tab.ha-post-tab-left .ha-post-tab-filter li:hover{background:#6d39ef;color:#fff}.ha-post-tab .ha-post-tab-item-wrapper{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;visibility:hidden;overflow:hidden;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap;height:0;opacity:0}.ha-post-tab span.ha-post-tab-loading{-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;width:100%;height:100%;text-align:center;font-size:60px;opacity:.5}.ha-post-tab .ha-post-tab-item-wrapper.active{visibility:visible;height:auto;opacity:1}.ha-post-tab .ha-post-tab-item{margin-bottom:30px;padding-right:15px;padding-left:15px}.ha-post-tab .ha-post-tab-item-inner{box-sizing:border-box;padding:20px;height:100%;border-radius:5px;background:#fff;box-shadow:0 1px 20px rgba(0,0,0,.09)}.ha-post-tab .ha-post-tab-item-inner .ha-post-tab-thumb{position:relative;display:block;overflow:hidden;margin-bottom:15px;padding-right:0;padding-left:0}.ha-post-tab .ha-post-tab-item-inner .ha-post-tab-thumb img{max-width:100%;height:auto}.ha-post-tab .ha-post-tab-item-inner .ha-post-tab-title{margin-top:0;margin-bottom:10px;font-size:16px}.ha-post-tab .ha-post-tab-item-inner .ha-post-tab-title a,.ha-post-tab .ha-post-tab-meta span a{color:#333;text-decoration:none;-webkit-transition:all .4s;transition:all .4s}.ha-post-tab .ha-post-tab-meta span a:hover,.ha-post-tab .ha-post-tab-title a:hover{color:#6d39ef}.ha-post-tab .ha-post-tab-meta{font-size:14px}.ha-post-tab .ha-post-tab-meta span{display:inline-block;margin-top:10px;margin-right:15px;color:#9b9b9b;-webkit-transition:all .4s;transition:all .4s}.ha-post-tab .ha-post-tab-meta span i{padding-right:5px}.ha-post-tab .ha-post-tab-meta span a{color:#9b9b9b}.ha-post-tab .ha-post-tab-excerpt p{margin:0}.ha-post-tab.ha-post-tab-left,.ha-post-tab.ha-post-tab-right{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-post-tab.ha-post-tab-left .ha-post-tab-filter{-webkit-box-flex:0;-webkit-flex:0 0 200px;-ms-flex:0 0 200px;flex:0 0 200px;min-width:200px;border-right:1px solid #f1f1f1;border-bottom:none}.ha-post-tab.ha-post-tab-left .ha-post-tab-filter li,.ha-post-tab.ha-post-tab-right .ha-post-tab-filter li{text-align:left;display:block;margin:0;text-decoration:none;-webkit-transition:all .3s;transition:all .3s}.ha-post-tab.ha-post-tab-right .ha-post-tab-filter li{text-align:right}.ha-post-tab.ha-post-tab-left .ha-post-tab-content{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 200px);-ms-flex:0 0 calc(100% - 200px);flex:0 0 calc(100% - 200px);min-width:calc(100% - 200px);min-height:100%}.ha-post-tab.ha-post-tab-right{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-post-tab.ha-post-tab-right .ha-post-tab-filter{-webkit-box-flex:0;-webkit-flex:0 0 200px;-ms-flex:0 0 200px;flex:0 0 200px;min-width:200px;border-bottom:none;border-left:1px solid #f1f1f1}.ha-post-tab.ha-post-tab-right .ha-post-tab-content{-webkit-box-flex:0;-webkit-flex:0 0 calc(100% - 200px);-ms-flex:0 0 calc(100% - 200px);flex:0 0 calc(100% - 200px);min-width:calc(100% - 200px);min-height:100%}@media (max-width:767px){.ha-post-tab.ha-post-tab-right{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-webkit-flex-direction:row-reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.ha-post-tab.ha-post-tab-left .ha-post-tab-filter,.ha-post-tab.ha-post-tab-right .ha-post-tab-filter{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;min-width:100%;border-right:0;border-bottom:1px solid #f1f1f1;border-left:0}.ha-post-tab.ha-post-tab-left .ha-post-tab-content,.ha-post-tab.ha-post-tab-right .ha-post-tab-content{-webkit-box-flex:0;-webkit-flex:0 0 100%;-ms-flex:0 0 100%;flex:0 0 100%;min-width:100%;min-height:100%}.ha-post-tab.ha-post-tab-left .ha-post-tab-filter li,.ha-post-tab.ha-post-tab-right .ha-post-tab-filter li{display:inline-block}}.ha-taxonomy-list{margin:0;padding:0;list-style:none}.ha-taxonomy-list.ha-taxonomy-list-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-taxonomy-list .ha-taxonomy-list-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 10px;padding:0}.ha-taxonomy-list.ha-taxonomy-list-inline .ha-taxonomy-list-item{margin-right:21px}.ha-taxonomy-list .ha-taxonomy-list-item:last-child,.ha-taxonomy-list.ha-taxonomy-list-inline .ha-taxonomy-list-item:last-child{margin-right:0;margin-bottom:0}.ha-taxonomy-list .ha-taxonomy-list-item a{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;width:100%}.ha-taxonomy-list-title{display:block;margin-top:0;margin-bottom:0;color:#242424;font-size:1rem;-webkit-transition:all .4s;transition:all .4s}.ha-taxonomy-list span.ha-taxonomy-list-icon{margin-right:8px;color:#242424;font-size:14px}.ha-taxonomy-list span.ha-taxonomy-list-icon svg{display:block;width:auto;height:1em}.ha-taxonomy-list span.ha-taxonomy-list-image{margin-right:15px;line-height:1}.ha-taxonomy-list span.ha-taxonomy-list-image img{width:50px}.ha-threesixty-rotation-inner{overflow:hidden;background:#0c5460}.ha-threesixty-rotation-inner img{cursor:move}.ha-img-magnifier-glass{position:absolute;width:200px;height:200px;border:3px solid #000;border-radius:50%;cursor:none}span.ha-threesixty-rotation-magnify{position:absolute;top:15px;right:15px;display:inline-block;font-size:22px;line-height:1}.ha-threesixty-rotation-autoplay{display:none}.ha-threesixty-rotation-autoplay-button button{display:inline-block;padding:.4rem 2rem;outline:none;border-radius:40px;background-color:#e2498a;color:#fff;text-decoration:none;text-transform:uppercase;font-size:24px;-webkit-transition:all .3s;transition:all .3s}.ha-threesixty-rotation-autoplay-button button:focus{outline:none}.ha-threesixty-rotation-autoplay-button button:hover{outline:none;background-color:#562dd4;color:#fff}.ha-threesixty-rotation-360img{position:absolute;top:0;right:0;bottom:0;left:0;z-index:2;margin:auto;width:100px;height:100px;border-radius:50%;background-color:rgba(38,39,39,.5);background-position:50% 50%;background-size:contain;background-repeat:no-repeat;box-shadow:rgba(255,255,255,.5) 0 0 4px;color:#505050;text-align:center;line-height:100px;-webkit-transition:all .5s ease 0s;transition:all .5s ease 0s}
assets/css/widgets/btn.min.css CHANGED
@@ -1 +1 @@
1
- .ha-btn{display:inline-block;max-width:100%;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}
1
+ .ha-btn{display:inline-block;max-width:100%;vertical-align:middle;text-align:center;text-decoration:none;font-size:14px;line-height:1;-webkit-transition:all .3s;transition:all .3s}.ha-btn:not(.ha-btn--link){padding:15px 25px;border-radius:.25rem;background-color:#562dd4;color:#fff}.ha-btn:not(.ha-btn--link):focus,.ha-btn:not(.ha-btn--link):hover{background-color:#e2498a}.ha-btn.ha-btn--link{color:#562dd4}.ha-btn.ha-btn--link:focus,.ha-btn.ha-btn--link:hover{color:#e2498a}.ha-btn-icon+.ha-btn-text,.ha-btn-text+.ha-btn-icon{margin-left:5px}.ha-btn-icon--svg{display:inline-block}.ha-btn-icon--svg svg{width:auto;height:1em}
assets/css/widgets/flip-box.min.css CHANGED
@@ -1 +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-inner.ha-flip-right .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-back{-webkit-transform:rotateY(0);transform:rotateY(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-back{-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-front{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-back{-webkit-transform:rotateX(0);transform:rotateX(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-back{-webkit-transform:rotateX(-180deg);transform:rotateX(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-front{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-back,.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-front{-webkit-transition:-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275),-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275)}
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);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;font-size:28px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon svg{display:block;width:1em;height:1em}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-front-inner .ha-flip-icon i{position:relative}.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;font-size:20px}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i,.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon svg{display:block;width:1em;height:1em}.ha-flip-box-container .ha-flip-box-inner .ha-flip-box-back-inner .ha-flip-icon i{position:relative;color:#fff}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-back{-webkit-transform:rotateY(0);transform:rotateY(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right .ha-flip-box-back{-webkit-transform:rotateY(-180deg);transform:rotateY(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-right:hover .ha-flip-box-front{-webkit-transform:rotateY(180deg);transform:rotateY(180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-front,.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-back{-webkit-transform:rotateX(0);transform:rotateX(0)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up .ha-flip-box-back{-webkit-transform:rotateX(-180deg);transform:rotateX(-180deg)}.ha-flip-box-container .ha-flip-box-inner.ha-flip-up:hover .ha-flip-box-front{-webkit-transform:rotateX(180deg);transform:rotateX(180deg)}.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-back,.ha-flip-box-container.ha-flip-effect-classic .ha-flip-box-front{-webkit-transition:-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275);transition:transform .6s cubic-bezier(.2,.85,.4,1.275),-webkit-transform .6s cubic-bezier(.2,.85,.4,1.275)}
assets/css/widgets/fun-factor.min.css CHANGED
@@ -1 +1 @@
1
- .ha-fun-factor-icon{font-size:3em}.ha-fun-factor-content .ha-fun-factor-content-number,.ha-fun-factor-content .ha-fun-factor-content-text{margin-top:0;margin-bottom:15px;font-size:24px}.ha-ff-icon--left .ha-fun-factor-content{padding-left:20px}.ha-ff-icon--right .ha-fun-factor-content{padding-right:20px}.ha-fun-factor-divider{display:block;margin-bottom:15px;height:1px;background-color:#ccc}.ha-ff-icon--top .ha-fun-factor-icon-section,.ha-ff-icon--top .ha-fun-factor-image-section{display:inline-block;margin-top:10px;margin-bottom:10px;width:auto;height:auto}.ha-fun-factor-image-section img{width:200px;height:100px}.ha-ff-container{padding:10px;word-wrap:break-word;overflow-wrap:break-word}.ha-ff-icon--left>.elementor-widget-container .ha-ff-container,.ha-ff-icon--right>.elementor-widget-container .ha-ff-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-ff-icon--left>.elementor-widget-container .ha-ff-container{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-ff-icon--right>.elementor-widget-container .ha-ff-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-ff-icon--left>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider,.ha-ff-icon--right>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider{display:block;margin-right:auto;margin-left:auto}.ha-ff-icon--top>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider{display:block;margin-right:auto;margin-left:auto;width:100px}.ha-ff-icon--left>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider,.ha-ff-icon--right>.elementor-widget-container .ha-ff-container .ha-fun-factor-divider{width:100%!important}.ha-fun-factor-divider-align-left{margin-left:0!important;text-align:left}.ha-fun-factor-divider-align-right{margin-right:0!important;text-align:right}.ha-fun-factor-divider-align-center{margin-right:auto!important;margin-left:auto!important;text-align:center}
1
+ .ha-fun-factor__content .ha-fun-factor__content-number,.ha-fun-factor__content .ha-fun-factor__content-text{margin-top:0;margin-bottom:15px;font-size:24px}.ha-ff-icon--left .ha-fun-factor__content{padding-left:20px}.ha-ff-icon--right .ha-fun-factor__content{padding-right:20px}.ha-fun-factor__divider{display:block;margin-bottom:15px;height:1px;background-color:#ccc}.ha-ff-icon--top .ha-fun-factor__media{display:inline-block;margin-top:10px;margin-bottom:10px}.ha-ff-icon--top .ha-fun-factor__media--image{width:200px}:not(.ha-ff-icon--top) .ha-fun-factor__media--image{-webkit-box-flex:0;-webkit-flex:0 0 200px;-ms-flex:0 0 200px;flex:0 0 200px;max-width:200px}.ha-fun-factor__media--image img{width:100%;height:100%;vertical-align:bottom}.ha-fun-factor__media--icon{font-size:3rem}.ha-fun-factor__media--icon i,.ha-fun-factor__media--icon svg{position:relative;display:block;width:1em;height:1em}.ha-fun-factor__media--icon i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-fun-factor__wrap{padding:10px;word-wrap:break-word;overflow-wrap:break-word}.ha-ff-icon--left>.elementor-widget-container .ha-fun-factor__wrap,.ha-ff-icon--right>.elementor-widget-container .ha-fun-factor__wrap{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-ff-icon--left>.elementor-widget-container .ha-fun-factor__wrap{-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-direction:row;-ms-flex-direction:row;flex-direction:row}.ha-ff-icon--right>.elementor-widget-container .ha-fun-factor__wrap{-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-ff-icon--left>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider,.ha-ff-icon--right>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider{display:block;margin-right:auto;margin-left:auto}.ha-ff-icon--top>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider{display:block;margin-right:auto;margin-left:auto;width:100px}.ha-ff-icon--left>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider,.ha-ff-icon--right>.elementor-widget-container .ha-fun-factor__wrap .ha-fun-factor__divider{width:100%!important}.ha-fun-factor__divider-align-left{margin-left:0!important;text-align:left}.ha-fun-factor__divider-align-right{margin-right:0!important;text-align:right}.ha-fun-factor__divider-align-center{margin-right:auto!important;margin-left:auto!important;text-align:center}
assets/css/widgets/icon-box.min.css CHANGED
@@ -1 +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);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}
1
+ .ha-icon-box>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);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,.ha-icon-box-icon svg{position:relative;display:block;width:1em;height:1em}.ha-icon-box-icon i{-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/infobox.min.css CHANGED
@@ -1 +1 @@
1
- .ha-infobox>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);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}
1
+ .ha-infobox>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);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;line-height:1}.ha-infobox-figure i,.ha-infobox-figure svg{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 p{margin-top:0;margin-bottom:0}.ha-infobox-text+.ha-btn--link{margin-top:1rem}
assets/css/widgets/member.min.css CHANGED
@@ -1 +1 @@
1
- .ha-member>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);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}
1
+ .ha-member>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);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}.ha-member .ha-btn{margin-bottom:10px}.ha-member-links+.ha-btn{margin-top:10px;margin-bottom:0}
assets/css/widgets/post-list.min.css CHANGED
@@ -1 +1 @@
1
- .ha-post-list{margin:0;padding:0;list-style:none}.ha-post-list .ha-post-list-item,.ha-post-list.ha-post-list-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-post-list.ha-post-list-inline{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-post-list .ha-post-list-item{margin:0 0 10px;padding:0}.ha-post-list.ha-post-list-inline .ha-post-list-item{margin-right:21px}.ha-post-list .ha-post-list-item:last-child,.ha-post-list.ha-post-list-inline .ha-post-list-item:last-child{margin-right:0;margin-bottom:0}.ha-post-list .ha-post-list-item a,.ha-post-list-meta-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-post-list .ha-post-list-item a{width:100%}.ha-post-list-title{display:block;margin-top:0;margin-bottom:0;color:#242424;font-size:1rem;-webkit-transition:all .4s;transition:all .4s}.ha-post-list .ha-post-list-item a:hover .ha-post-list-title{color:#e04d8b}.ha-post-list-item a img{margin-right:15px}span.ha-post-list-icon{margin-right:8px;color:#242424;font-size:14px}.ha-post-list-meta-wrap{margin-top:3px}.ha-post-list-meta-wrap span{margin-right:10px;color:#8c8c8c;font-size:13px}.ha-post-list-meta-wrap span:last-child{margin-right:0}.ha-post-list-meta-wrap span i{margin-right:3px}
1
+ .ha-post-list{margin:0;padding:0;list-style:none}.ha-post-list .ha-post-list-item,.ha-post-list.ha-post-list-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-post-list.ha-post-list-inline{-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-post-list .ha-post-list-item{margin:0 0 10px;padding:0}.ha-post-list.ha-post-list-inline .ha-post-list-item{margin-right:21px}.ha-post-list .ha-post-list-item:last-child,.ha-post-list.ha-post-list-inline .ha-post-list-item:last-child{margin-right:0;margin-bottom:0}.ha-post-list .ha-post-list-item a,.ha-post-list-meta-wrap{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex}.ha-post-list .ha-post-list-item a{width:100%}.ha-post-list-title{display:block;margin-top:0;margin-bottom:0;color:#242424;font-size:1rem;-webkit-transition:all .4s;transition:all .4s}.ha-post-list .ha-post-list-item a:hover .ha-post-list-title{color:#e04d8b}.ha-post-list-item a img{margin-right:15px}span.ha-post-list-icon{margin-right:8px;color:#242424;font-size:14px}span.ha-post-list-icon svg{width:auto;height:1em}.ha-post-list-meta-wrap{margin-top:3px}.ha-post-list-meta-wrap span{margin-right:10px;color:#8c8c8c;font-size:13px}.ha-post-list-meta-wrap span:last-child{margin-right:0}.ha-post-list-meta-wrap span i{margin-right:3px}
assets/css/widgets/pricing-table.min.css CHANGED
@@ -1 +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);position:relative;overflow:hidden;padding:3em 4em}.ha-pricing-table-badge{position:absolute;top:-1px;padding:.8rem 1rem;background-color:#e2498a;color:#fff;line-height:1}.ha-pricing-table-badge--left{left:0;-webkit-transform:rotate(-90deg) translateX(-100%);-ms-transform:rotate(-90deg) translateX(-100%);transform:rotate(-90deg) translateX(-100%);-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.ha-pricing-table-badge--right{right:0;-webkit-transform:rotate(-90deg) translateY(-100%);-ms-transform:rotate(-90deg) translateY(-100%);transform:rotate(-90deg) translateY(-100%);-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top}.ha-pricing-table-title{margin-top:0;margin-bottom:.5rem;color:#242424;font-weight:400;font-size:24px}.ha-pricing-table-price{margin-bottom:3rem}.ha-pricing-table-price-tag{margin-bottom:.5rem;color:#242424;font-weight:700;font-size:60px;line-height:normal}.ha-pricing-table-currency{font-size:24px}.ha-pricing-table-period{color:#8c8c8c;font-size:16px}.ha-pricing-table-body{margin-bottom:3rem}.ha-pricing-table-features-title{margin-top:0;margin-bottom:1rem;font-weight:700;font-size:16px}.ha-pricing-table-features-list{margin:0;padding:0;list-style:none}.ha-pricing-table-features-list li{margin-bottom:1rem;font-size:16px}.ha-pricing-table-features-list i{margin-right:.5rem;min-width:15px;font-size:.8em}.ha-pricing-table-feature-text{display:inline-block}.ha-pricing-table-btn{display:inline-block;padding:.8rem 2rem;border-radius:40px;background-color:#e2498a;color:#fff;text-decoration:none;text-transform:uppercase;font-size:12px;-webkit-transition:all .3s;transition:all .3s}.ha-pricing-table-btn:hover{background-color:#562dd4;color:#fff}
1
+ .ha-pricing-table>.elementor-widget-container{border-radius:.5rem;background-color:#fff;box-shadow:0 .2rem 2.8rem rgba(36,36,36,.1);position:relative;overflow:hidden;padding:3em 4em}.ha-pricing-table-badge{position:absolute;top:-1px;padding:.8rem 1rem;background-color:#e2498a;color:#fff;line-height:1}.ha-pricing-table-badge--left{left:0;-webkit-transform:rotate(-90deg) translateX(-100%);-ms-transform:rotate(-90deg) translateX(-100%);transform:rotate(-90deg) translateX(-100%);-webkit-transform-origin:left top;-ms-transform-origin:left top;transform-origin:left top}.ha-pricing-table-badge--right{right:0;-webkit-transform:rotate(-90deg) translateY(-100%);-ms-transform:rotate(-90deg) translateY(-100%);transform:rotate(-90deg) translateY(-100%);-webkit-transform-origin:right top;-ms-transform-origin:right top;transform-origin:right top}.ha-pricing-table-title{margin-top:0;margin-bottom:.5rem;color:#242424;font-weight:400;font-size:24px}.ha-pricing-table-price{margin-bottom:3rem}.ha-pricing-table-price-tag{margin-bottom:.5rem;color:#242424;font-weight:700;font-size:60px;line-height:normal}.ha-pricing-table-currency{font-size:24px}.ha-pricing-table-period{color:#8c8c8c;font-size:16px}.ha-pricing-table-body{margin-bottom:3rem}.ha-pricing-table-features-title{margin-top:0;margin-bottom:1rem;font-weight:700;font-size:16px}.ha-pricing-table-features-list{margin:0;padding:0;list-style:none}.ha-pricing-table-features-list li{margin-bottom:1rem;font-size:16px}.ha-pricing-table-features-list i,.ha-pricing-table-features-list svg{margin-right:.5rem;min-width:15px;font-size:.8em}.ha-pricing-table-features-list svg{width:auto;height:1em}.ha-pricing-table-feature-text{display:inline-block}.ha-pricing-table-btn{display:inline-block;padding:.8rem 2rem;border-radius:40px;background-color:#e2498a;color:#fff;text-decoration:none;text-transform:uppercase;font-size:12px;-webkit-transition:all .3s;transition:all .3s}.ha-pricing-table-btn:hover{background-color:#562dd4;color:#fff}
assets/css/widgets/slider-carousel.min.css CHANGED
@@ -1 +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}
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;color:#8c8c8c}.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;display:inline-block;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/social-icons.min.css CHANGED
@@ -1 +1 @@
1
- .ha-social-icons-wrapper,.ha-social-icons-wrapper a{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-social-icons-wrapper a{padding:15px;border-radius:4px;color:#fff;font-size:30px;-webkit-transition:all .3s;transition:all .3s}a.ha-social-icon:hover{position:relative;z-index:1;background:#e2498a}a.ha-social-icon:after,a.ha-social-icon:before{border-radius:inherit}.ha-social-icons-wrapper a.elementor-social-icon-label{color:#d30c5c}.ha-social-icon:not(:last-child){margin-right:2px}.ha-social-icon i,.ha-social-icon svg{position:relative;display:initial}.ha-social-icon svg,.ha-social-icon-label{width:100%;height:100%}.ha-social-icon i{width:1em;height:1em}.ha-social-icon-label{margin:0 0 0 10px;font-size:18px;font-family:Roboto,sans-serif;line-height:1}.elementor-social-icon-label .ha-social-icon-label{margin-left:0}.elementor-element-edit-mode .ha-social-icon-sticky{z-index:9999}.ha-social-icons:not(.elementor-element-edit-mode) .ha-social-icon-sticky{position:fixed}.ha-social-icon-separator{margin-right:10px}.ha-separator--stroke .ha-social-icon-separator{width:1px;height:1em;background:#d30c5c}.ha-separator--custom .ha-social-icon-separator{color:#d30c5c;font-size:24px}.ha-social-icon-separator:last-child{display:none}
1
+ .ha-social-icons-wrapper,.ha-social-icons-wrapper a{display:-webkit-inline-box;display:-webkit-inline-flex;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-webkit-align-items:center;align-items:center;-ms-flex-align:center}.ha-social-icons-wrapper a{padding:15px;border-radius:4px;color:#fff;font-size:30px;-webkit-transition:all .3s;transition:all .3s}a.ha-social-icon:hover{position:relative;z-index:1;background:#e2498a}a.ha-social-icon:after,a.ha-social-icon:before{border-radius:inherit}.ha-social-icons-wrapper a.elementor-social-icon-label{color:#d30c5c}.ha-social-icon:not(:last-child){margin-right:2px}.ha-social-icon i{position:relative;display:initial;width:1em;height:1em}.ha-social-icon-label{margin:0 0 0 10px;width:100%;height:100%;font-size:18px;line-height:1}.elementor-social-icon-label .ha-social-icon-label{margin-left:0}.elementor-element-edit-mode .ha-social-icon-sticky{z-index:9999}.ha-social-icons:not(.elementor-element-edit-mode) .ha-social-icon-sticky{position:fixed}.ha-social-icon-separator{margin-right:10px}.ha-separator--stroke .ha-social-icon-separator{width:1px;height:1em;background:#d30c5c}.ha-separator--custom .ha-social-icon-separator{color:#d30c5c;font-size:24px}.ha-social-icon-separator:last-child{display:none}
assets/css/widgets/steps-flow.min.css CHANGED
@@ -1 +1 @@
1
- .ha-step-flow>.elementor-widget-container{padding:30px;text-align:center}.ha-step-arrow,.ha-step-arrow:after{position:absolute;display:inline-block;border-top:1px solid #ddd}.ha-step-arrow{left:calc(100% + 20px);top:49%;width:100px}.ha-step-arrow:after{top:-2px;right:5px;width:12px;height:12px;border-right:1px solid #ddd;color:#ddd;content:"";-webkit-transform:rotate(45deg) translateY(-50%);-ms-transform:rotate(45deg) translateY(-50%);transform:rotate(45deg) translateY(-50%)}.ha-steps-icon{position:relative;display:inline-block;margin-bottom:2rem;padding:40px;border-radius:50%;background-color:#e9ecf0;box-shadow:0 2px 6px -2px #989898;color:#8056ee;text-align:center;font-size:46px}.ha-steps-icon i{position:relative;display:block;width:1em;height:1em}.ha-steps-icon i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-steps-icon .ha-steps-label{position:absolute;top:5px;right:0;overflow:hidden;padding:12px 8px;max-width:200%;border:3px solid #fff;border-radius:20px;background-color:#8056ee;color:#fff;text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1}.ha-steps-title{margin-top:0;margin-bottom:30px;font-weight:700;font-size:16px}.ha-steps-title a{display:block;color:#562dd4}.ha-steps-title a:hover{color:#242424}.ha-step-description{margin:0;color:#616161;font-weight:400;font-size:16px;line-height:1.5}
1
+ .ha-step-flow>.elementor-widget-container{padding:30px;text-align:center}.ha-step-arrow,.ha-step-arrow:after{position:absolute;display:inline-block;border-top:1px solid #ddd}.ha-step-arrow{left:calc(100% + 20px);top:49%;width:100px}.ha-step-arrow:after{top:-2px;right:5px;width:12px;height:12px;border-right:1px solid #ddd;color:#ddd;content:"";-webkit-transform:rotate(45deg) translateY(-50%);-ms-transform:rotate(45deg) translateY(-50%);transform:rotate(45deg) translateY(-50%)}.ha-steps-icon{position:relative;display:inline-block;margin-bottom:2rem;padding:40px;border-radius:50%;background-color:#e9ecf0;box-shadow:0 2px 6px -2px #989898;color:#8056ee;text-align:center;font-size:46px}.ha-steps-icon i,.ha-steps-icon svg{position:relative;display:block;width:1em;height:1em}.ha-steps-icon i:before{position:absolute;left:50%;-webkit-transform:translateX(-50%);-ms-transform:translateX(-50%);transform:translateX(-50%)}.ha-steps-icon .ha-steps-label{position:absolute;top:5px;right:0;overflow:hidden;padding:12px 8px;max-width:200%;border:3px solid #fff;border-radius:20px;background-color:#8056ee;color:#fff;text-overflow:ellipsis;white-space:nowrap;font-size:12px;line-height:1}.ha-steps-title{margin-top:0;margin-bottom:30px;font-weight:700;font-size:16px}.ha-steps-title a{display:block;color:#562dd4}.ha-steps-title a:hover{color:#242424}.ha-step-description{margin:0;color:#616161;font-weight:400;font-size:16px;line-height:1.5}
assets/css/widgets/taxonomy-list.min.css CHANGED
@@ -1 +1 @@
1
- .ha-taxonomy-list{margin:0;padding:0;list-style:none}.ha-taxonomy-list.ha-taxonomy-list-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-taxonomy-list .ha-taxonomy-list-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 10px;padding:0}.ha-taxonomy-list.ha-taxonomy-list-inline .ha-taxonomy-list-item{margin-right:21px}.ha-taxonomy-list .ha-taxonomy-list-item:last-child,.ha-taxonomy-list.ha-taxonomy-list-inline .ha-taxonomy-list-item:last-child{margin-right:0;margin-bottom:0}.ha-taxonomy-list .ha-taxonomy-list-item a{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;width:100%}.ha-taxonomy-list-title{display:block;margin-top:0;margin-bottom:0;color:#242424;font-size:1rem;-webkit-transition:all .4s;transition:all .4s}.ha-taxonomy-list .ha-taxonomy-list-item a:hover .ha-taxonomy-list-title{color:#e04d8b}.ha-taxonomy-list span.ha-taxonomy-list-icon{margin-right:8px;color:#242424;font-size:14px}.ha-taxonomy-list span.ha-taxonomy-list-image{margin-right:15px;line-height:1}.ha-taxonomy-list span.ha-taxonomy-list-image img{width:50px}
1
+ .ha-taxonomy-list{margin:0;padding:0;list-style:none}.ha-taxonomy-list.ha-taxonomy-list-inline{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-flex-wrap:wrap;-ms-flex-wrap:wrap;flex-wrap:wrap}.ha-taxonomy-list .ha-taxonomy-list-item{display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;margin:0 0 10px;padding:0}.ha-taxonomy-list.ha-taxonomy-list-inline .ha-taxonomy-list-item{margin-right:21px}.ha-taxonomy-list .ha-taxonomy-list-item:last-child,.ha-taxonomy-list.ha-taxonomy-list-inline .ha-taxonomy-list-item:last-child{margin-right:0;margin-bottom:0}.ha-taxonomy-list .ha-taxonomy-list-item a{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;width:100%}.ha-taxonomy-list-title{display:block;margin-top:0;margin-bottom:0;color:#242424;font-size:1rem;-webkit-transition:all .4s;transition:all .4s}.ha-taxonomy-list .ha-taxonomy-list-item a:hover .ha-taxonomy-list-title{color:#e04d8b}.ha-taxonomy-list span.ha-taxonomy-list-icon{margin-right:8px;color:#242424;font-size:14px}.ha-taxonomy-list span.ha-taxonomy-list-icon svg{display:block;width:auto;height:1em}.ha-taxonomy-list span.ha-taxonomy-list-image{margin-right:15px;line-height:1}.ha-taxonomy-list span.ha-taxonomy-list-image img{width:50px}
assets/imgs/bf-img.png DELETED
Binary file
assets/imgs/placeholder.jpg DELETED
Binary file
base.php CHANGED
@@ -46,14 +46,13 @@ class Base {
46
  // Register finder category
47
  add_action( 'elementor/finder/categories/init', [ $this, 'register_finder' ] );
48
 
49
- add_action( 'wpml_loaded', [ $this, 'add_wpml_support' ] );
50
-
51
  Widgets_Manager::init();
52
  Assets_Manager::init();
53
  Cache_Manager::init();
54
  Icons_Manager::init();
55
  Extensions_Manager::init();
56
  Select2_Handler::init();
 
57
 
58
  $this->init_appsero_tracking();
59
 
@@ -67,7 +66,7 @@ class Base {
67
  Attention_Seeker::init();
68
  }
69
 
70
- do_action( 'happyaddons_loaded' );
71
  }
72
 
73
  /**
@@ -107,6 +106,7 @@ class Base {
107
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/assets-cache.php' );
108
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/extensions-manager.php' );
109
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/select2-handler.php' );
 
110
 
111
  if ( is_admin() ) {
112
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/updater.php' );
@@ -162,14 +162,4 @@ class Base {
162
  $categories_manager->add_category( Finder::SLUG, new Finder() );
163
  $categories_manager->add_category( Finder_Edit::SLUG, new Finder_Edit() );
164
  }
165
-
166
- /**
167
- * Add wpml support
168
- *
169
- * @return void
170
- */
171
- public function add_wpml_support() {
172
- include_once( HAPPY_ADDONS_DIR_PATH . 'classes/wpml-manager.php' );
173
- WPML_Manager::init();
174
- }
175
  }
46
  // Register finder category
47
  add_action( 'elementor/finder/categories/init', [ $this, 'register_finder' ] );
48
 
 
 
49
  Widgets_Manager::init();
50
  Assets_Manager::init();
51
  Cache_Manager::init();
52
  Icons_Manager::init();
53
  Extensions_Manager::init();
54
  Select2_Handler::init();
55
+ WPML_Manager::init();
56
 
57
  $this->init_appsero_tracking();
58
 
66
  Attention_Seeker::init();
67
  }
68
 
69
+ do_action( 'happyaddons_loaded' );
70
  }
71
 
72
  /**
106
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/assets-cache.php' );
107
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/extensions-manager.php' );
108
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/select2-handler.php' );
109
+ include_once( HAPPY_ADDONS_DIR_PATH . 'classes/wpml-manager.php' );
110
 
111
  if ( is_admin() ) {
112
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/updater.php' );
162
  $categories_manager->add_category( Finder::SLUG, new Finder() );
163
  $categories_manager->add_category( Finder_Edit::SLUG, new Finder_Edit() );
164
  }
 
 
 
 
 
 
 
 
 
 
165
  }
changelog.txt CHANGED
@@ -1,3 +1,16 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  = 2.10.0 - 18 May 2020 =
2
 
3
  - New: 360° Rotation widget
1
+ = 2.11.0 - 1 June 2020 =
2
+
3
+ - Tweak: Slide item link support for Carousel widget
4
+ - Tweak: Slide item link support for Slider widget
5
+ - Tweak: More html tags support for textarea/description type input
6
+ - Tweak: Advanced button support for Team Member widget
7
+ - Tweak: Restored default placeholder image
8
+ - Fix: Adminbar happy icon markup issue
9
+ - Fix: Carousel and Slider css issue
10
+ - Fix: SVG icon sizing issues in all widgets
11
+ - Fix: WPML support issue
12
+ - Fix: 360° widget default style
13
+
14
  = 2.10.0 - 18 May 2020 =
15
 
16
  - New: 360° Rotation widget
classes/admin-bar.php CHANGED
@@ -72,7 +72,7 @@ class Admin_Bar {
72
 
73
  $admin_bar->add_menu( array(
74
  'id' => 'happy-addons',
75
- 'title' => '<img src="'.ha_get_b64_icon().'"">',
76
  'href' => ha_get_dashboard_link(),
77
  'meta' => [
78
  'title' => __( 'Happy Elementor Addons', 'happy-elementor-addons' ),
72
 
73
  $admin_bar->add_menu( array(
74
  'id' => 'happy-addons',
75
+ 'title' => sprintf( '<img src="%s">', ha_get_b64_icon() ),
76
  'href' => ha_get_dashboard_link(),
77
  'meta' => [
78
  'title' => __( 'Happy Elementor Addons', 'happy-elementor-addons' ),
classes/assets-manager.php CHANGED
@@ -22,9 +22,6 @@ class Assets_Manager {
22
  // Enqueue editor scripts
23
  add_action( 'elementor/editor/after_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
  // Paragraph toolbar registration
29
  add_filter( 'elementor/editor/localize_settings', [ __CLASS__, 'add_inline_editing_intermediate_toolbar' ] );
30
  }
@@ -60,10 +57,6 @@ class Assets_Manager {
60
  return $config;
61
  }
62
 
63
- public static function set_placeholder_image() {
64
- return HAPPY_ADDONS_ASSETS . 'imgs/placeholder.jpg';
65
- }
66
-
67
  public static function frontend_register() {
68
  $suffix = ha_is_script_debug_enabled() ? '.' : '.min.';
69
 
22
  // Enqueue editor scripts
23
  add_action( 'elementor/editor/after_enqueue_scripts', [ __CLASS__, 'enqueue_editor_scripts' ] );
24
 
 
 
 
25
  // Paragraph toolbar registration
26
  add_filter( 'elementor/editor/localize_settings', [ __CLASS__, 'add_inline_editing_intermediate_toolbar' ] );
27
  }
57
  return $config;
58
  }
59
 
 
 
 
 
60
  public static function frontend_register() {
61
  $suffix = ha_is_script_debug_enabled() ? '.' : '.min.';
62
 
classes/widgets-manager.php CHANGED
@@ -566,7 +566,8 @@ class Widgets_Manager {
566
  * @access public
567
  */
568
  public static function register() {
569
- include_once( HAPPY_ADDONS_DIR_PATH . 'base/widget-base.php' );
 
570
 
571
  $inactive_widgets = self::get_inactive_widgets();
572
 
566
  * @access public
567
  */
568
  public static function register() {
569
+ include_once( HAPPY_ADDONS_DIR_PATH . 'base/widget-base.php' );
570
+ include_once( HAPPY_ADDONS_DIR_PATH . 'traits/button-renderer.php' );
571
 
572
  $inactive_widgets = self::get_inactive_widgets();
573
 
classes/wpml-manager.php CHANGED
@@ -10,7 +10,9 @@ class WPML_Manager {
10
 
11
  public static function init() {
12
  add_filter( 'wpml_elementor_widgets_to_translate', [ __CLASS__, 'add_widgets_to_translate' ] );
 
13
 
 
14
  include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/bar-chart.php' );
15
  include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/carousel.php' );
16
  include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/image-grid.php' );
@@ -23,6 +25,8 @@ class WPML_Manager {
23
  }
24
 
25
  public static function add_widgets_to_translate( $widgets ) {
 
 
26
  $widgets_map = [
27
  /**
28
  * Bar Chart
10
 
11
  public static function init() {
12
  add_filter( 'wpml_elementor_widgets_to_translate', [ __CLASS__, 'add_widgets_to_translate' ] );
13
+ }
14
 
15
+ public static function load_integration_files() {
16
  include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/bar-chart.php' );
17
  include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/carousel.php' );
18
  include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/image-grid.php' );
25
  }
26
 
27
  public static function add_widgets_to_translate( $widgets ) {
28
+ self::load_integration_files();
29
+
30
  $widgets_map = [
31
  /**
32
  * Bar Chart
extensions/wrapper-link.php CHANGED
@@ -39,7 +39,7 @@ class Wrapper_Link {
39
  'dynamic' => [
40
  'active' => true,
41
  ],
42
- 'placeholder' => __( 'https://your-link.com', 'happy-elementor-addons' ),
43
  ]
44
  );
45
 
39
  'dynamic' => [
40
  'active' => true,
41
  ],
42
+ 'placeholder' => 'https://example.com',
43
  ]
44
  );
45
 
inc/functions.php CHANGED
@@ -228,12 +228,47 @@ function ha_get_allowed_html_tags( $level = 'basic' ) {
228
  ];
229
 
230
  if ( $level === 'intermediate' ) {
231
- $allowed_html['a'] = [
232
- 'href' => [],
233
- 'title' => [],
234
- 'class' => [],
235
- 'id' => [],
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
236
  ];
 
 
237
  }
238
 
239
  return $allowed_html;
@@ -602,3 +637,42 @@ if ( ! function_exists( 'ha_get_section_icon' ) ) {
602
  return '<i style="float: right" class="hm hm-happyaddons"></i>';
603
  }
604
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
228
  ];
229
 
230
  if ( $level === 'intermediate' ) {
231
+ $tags = [
232
+ 'a' => [
233
+ 'href' => [],
234
+ 'title' => [],
235
+ 'class' => [],
236
+ 'id' => [],
237
+ ],
238
+ 'q' => [
239
+ 'cite' => [],
240
+ ],
241
+ 'img' => [
242
+ 'src' => [],
243
+ 'alt' => [],
244
+ 'height' => [],
245
+ 'width' => [],
246
+ ],
247
+ 'dfn' => [
248
+ 'title' => [],
249
+ ],
250
+ 'time' => [
251
+ 'datetime' => [],
252
+ ],
253
+ 'cite' => [
254
+ 'title' => [],
255
+ ],
256
+ 'acronym' => [
257
+ 'title' => [],
258
+ ],
259
+ 'strike' => [],
260
+ 'small' => [],
261
+ 'code' => [],
262
+ 'mark' => [],
263
+ 'del' => [],
264
+ 'ins' => [],
265
+ 'sub' => [],
266
+ 'sup' => [],
267
+ 'hr' => [],
268
+ 's' => [],
269
  ];
270
+
271
+ $allowed_html = array_merge( $allowed_html, $tags );
272
  }
273
 
274
  return $allowed_html;
637
  return '<i style="float: right" class="hm hm-happyaddons"></i>';
638
  }
639
  }
640
+
641
+ /**
642
+ * Render icon html with backward compatibility
643
+ *
644
+ * @param array $settings
645
+ * @param string $old_icon_id
646
+ * @param string $new_icon_id
647
+ * @param array $attributes
648
+ */
649
+ function ha_render_button_icon( $settings = [], $old_icon_id = 'icon', $new_icon_id = 'selected_icon', $attributes = [] ) {
650
+ // Check if its already migrated
651
+ $migrated = isset( $settings['__fa4_migrated'][ $new_icon_id ] );
652
+ // Check if its a new widget without previously selected icon using the old Icon control
653
+ $is_new = empty( $settings[ $old_icon_id ] );
654
+
655
+ $attributes['aria-hidden'] = 'true';
656
+ $is_svg = ( isset( $settings[ $new_icon_id ], $settings[ $new_icon_id ]['library'] ) && $settings[ $new_icon_id ]['library'] === 'svg' );
657
+
658
+ if ( ha_is_elementor_version( '>=', '2.6.0' ) && ( $is_new || $migrated ) ) {
659
+ if ( $is_svg ) {
660
+ echo '<span class="ha-btn-icon ha-btn-icon--svg">';
661
+ }
662
+ \Elementor\Icons_Manager::render_icon( $settings[ $new_icon_id ], $attributes );
663
+ if ( $is_svg ) {
664
+ echo '</span>';
665
+ }
666
+ } else {
667
+ if ( empty( $attributes['class'] ) ) {
668
+ $attributes['class'] = $settings[ $old_icon_id ];
669
+ } else {
670
+ if ( is_array( $attributes['class'] ) ) {
671
+ $attributes['class'][] = $settings[ $old_icon_id ];
672
+ } else {
673
+ $attributes['class'] .= ' ' . $settings[ $old_icon_id ];
674
+ }
675
+ }
676
+ printf( '<i %s></i>', \Elementor\Utils::render_html_attributes( $attributes ) );
677
+ }
678
+ }
plugin.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: Happy Elementor Addons
4
  * Plugin URI: https://happyaddons.com/
5
  * Description: <a href="https://happyaddons.com/">HappyAddons</a> is a collection of slick, powerful widgets that works seamlessly with Elementor page builder. It’s trendy look with detail customization features allows to create extraordinary designs instantly. <a href="https://happyaddons.com/">HappyAddons</a> is free, rapidly growing and comes with great support.
6
- * Version: 2.10.0
7
  * Author: weDevs
8
  * Author URI: https://happyaddons.com/
9
  * License: GPLv2
@@ -34,7 +34,7 @@ Copyright 2019 HappyMonster <http://happymonster.me>
34
 
35
  defined( 'ABSPATH' ) || die();
36
 
37
- define( 'HAPPY_ADDONS_VERSION', '2.10.0' );
38
  define( 'HAPPY_ADDONS__FILE__', __FILE__ );
39
  define( 'HAPPY_ADDONS_DIR_PATH', plugin_dir_path( HAPPY_ADDONS__FILE__ ) );
40
  define( 'HAPPY_ADDONS_DIR_URL', plugin_dir_url( HAPPY_ADDONS__FILE__ ) );
3
  * Plugin Name: Happy Elementor Addons
4
  * Plugin URI: https://happyaddons.com/
5
  * Description: <a href="https://happyaddons.com/">HappyAddons</a> is a collection of slick, powerful widgets that works seamlessly with Elementor page builder. It’s trendy look with detail customization features allows to create extraordinary designs instantly. <a href="https://happyaddons.com/">HappyAddons</a> is free, rapidly growing and comes with great support.
6
+ * Version: 2.11.0
7
  * Author: weDevs
8
  * Author URI: https://happyaddons.com/
9
  * License: GPLv2
34
 
35
  defined( 'ABSPATH' ) || die();
36
 
37
+ define( 'HAPPY_ADDONS_VERSION', '2.11.0' );
38
  define( 'HAPPY_ADDONS__FILE__', __FILE__ );
39
  define( 'HAPPY_ADDONS_DIR_PATH', plugin_dir_path( HAPPY_ADDONS__FILE__ ) );
40
  define( 'HAPPY_ADDONS_DIR_URL', plugin_dir_url( HAPPY_ADDONS__FILE__ ) );
readme.txt CHANGED
@@ -1,6 +1,6 @@
1
  === Happy Addons for Elementor ===
2
  Plugin Name: Happy Addons for Elementor
3
- Version: 2.10.0
4
  Author: weDevs
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, mosaddek73, tareq1988, sourav926, wedevs, iqbalrony, mrokon, obiplabon
@@ -253,6 +253,19 @@ For a more detailed explanation check out the following documentation
253
 
254
  == Changelog ==
255
 
 
 
 
 
 
 
 
 
 
 
 
 
 
256
  = 2.10.0 - 18 May 2020 =
257
 
258
  - New: 360° Rotation widget
@@ -420,3 +433,9 @@ For a more detailed explanation check out the following documentation
420
  - Fix: Missing style issue while copy-pasting widget style
421
  - Fix: Happy Icons cache issue
422
  - Fix: Admin bar menu spacing issue
 
 
 
 
 
 
1
  === Happy Addons for Elementor ===
2
  Plugin Name: Happy Addons for Elementor
3
+ Version: 2.11.0
4
  Author: weDevs
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, mosaddek73, tareq1988, sourav926, wedevs, iqbalrony, mrokon, obiplabon
253
 
254
  == Changelog ==
255
 
256
+ = 2.11.0 - 1 June 2020 =
257
+
258
+ - Tweak: Slide item link support for Carousel widget
259
+ - Tweak: Slide item link support for Slider widget
260
+ - Tweak: More html tags support for textarea/description type input
261
+ - Tweak: Advanced button support for Team Member widget
262
+ - Tweak: Restored default placeholder image
263
+ - Fix: Adminbar happy icon markup issue
264
+ - Fix: Carousel and Slider css issue
265
+ - Fix: SVG icon sizing issues in all widgets
266
+ - Fix: WPML support issue
267
+ - Fix: 360° widget default style
268
+
269
  = 2.10.0 - 18 May 2020 =
270
 
271
  - New: 360° Rotation widget
433
  - Fix: Missing style issue while copy-pasting widget style
434
  - Fix: Happy Icons cache issue
435
  - Fix: Admin bar menu spacing issue
436
+
437
+
438
+ == Upgrade Notice ==
439
+
440
+ = 2.11.0 =
441
+ Added link support to Carousel and Slider widget. Fixed SVG issues and WMPL compatibility issue and more.
traits/button-renderer.php ADDED
@@ -0,0 +1,58 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Button renderer trait
4
+ */
5
+ namespace Happy_Addons\Elementor\Traits;
6
+
7
+ defined( 'ABSPATH' ) || exit;
8
+
9
+ trait Button_Renderer {
10
+
11
+ /**
12
+ * Render button with icon
13
+ *
14
+ * @param array $args { old_icon, icon_pos, new_icon, text, link, class, text_class }
15
+ * @return void
16
+ */
17
+ public function render_icon_button( $args = [] ) {
18
+ $args = wp_parse_args( $args, [
19
+ 'old_icon' => 'button_icon',
20
+ 'icon_pos' => 'button_icon_position',
21
+ 'new_icon' => 'button_selected_icon',
22
+ 'text' => 'button_text',
23
+ 'link' => 'button_link',
24
+ 'class' => 'ha-btn ha-btn--link',
25
+ 'text_class' => 'ha-btn-text',
26
+ ] );
27
+
28
+ $settings = $this->get_settings_for_display();
29
+ $this->add_inline_editing_attributes( $args['text'], 'none' );
30
+ $this->add_render_attribute( $args['text'], 'class', $args['text_class'] );
31
+
32
+ $this->add_render_attribute( 'button', 'class', $args['class'] );
33
+ $this->add_link_attributes( 'button', $settings[ $args['link'] ] );
34
+
35
+ if ( $settings[ $args['text'] ] && ( empty( $settings[ $args['new_icon'] ] ) && empty( $settings[ $args['old_icon'] ] ) ) ) :
36
+ printf( '<a %1$s>%2$s</a>',
37
+ $this->get_render_attribute_string( 'button' ),
38
+ sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( $args['text'] ), esc_html( $settings[ $args['text'] ] ) )
39
+ );
40
+ elseif ( empty( $settings[ $args['text'] ] ) && ( ! empty( $settings[ $args['old_icon'] ] ) || ! empty( $settings[ $args['new_icon'] ] ) ) ) : ?>
41
+ <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php ha_render_button_icon( $settings, $args['old_icon'], $args['new_icon'] ); ?></a>
42
+ <?php elseif ( $settings[ $args['text'] ] && ( ! empty( $settings[ $args['old_icon'] ] ) || ! empty( $settings[ $args['new_icon'] ] ) ) ) :
43
+ if ( $settings[ $args['icon_pos'] ] === 'before' ) :
44
+ $this->add_render_attribute( 'button', 'class', 'ha-btn--icon-before' );
45
+ $button_text = sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( $args['text'] ), esc_html( $settings[ $args['text'] ] ) );
46
+ ?>
47
+ <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php ha_render_button_icon( $settings, $args['old_icon'], $args['new_icon'], ['class' => 'ha-btn-icon'] ); ?> <?php echo $button_text; ?></a>
48
+ <?php
49
+ else :
50
+ $this->add_render_attribute( 'button', 'class', 'ha-btn--icon-after' );
51
+ $button_text = sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( $args['text'] ), esc_html( $settings[ $args['text'] ] ) );
52
+ ?>
53
+ <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php echo $button_text; ?> <?php ha_render_button_icon( $settings, $args['old_icon'], $args['new_icon'], ['class' => 'ha-btn-icon'] ); ?></a>
54
+ <?php
55
+ endif;
56
+ endif;
57
+ }
58
+ }
widgets/card/widget.php CHANGED
@@ -15,42 +15,45 @@ use Elementor\Group_Control_Border;
15
  use Elementor\Group_Control_Box_Shadow;
16
  use Elementor\Group_Control_Image_Size;
17
  use Elementor\Group_Control_Typography;
 
18
 
19
  defined( 'ABSPATH' ) || die();
20
 
21
  class Card extends Base {
22
 
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 __( 'Card', 'happy-elementor-addons' );
33
- }
34
-
35
- public function get_custom_help_url() {
36
- return 'https://happyaddons.com/docs/happy-addons-for-elementor/widgets/card/';
37
- }
38
-
39
- /**
40
- * Get widget icon.
41
- *
42
- * @since 1.0.0
43
- * @access public
44
- *
45
- * @return string Widget icon.
46
- */
47
- public function get_icon() {
48
- return 'hm hm-card';
49
- }
50
-
51
- public function get_keywords() {
52
- return [ 'card', 'blurb', 'infobox', 'content', 'block', 'box' ];
53
- }
 
 
54
 
55
  protected function register_content_controls() {
56
  $this->start_controls_section(
@@ -61,1135 +64,1065 @@ class Card extends Base {
61
  ]
62
  );
63
 
64
- $this->add_control(
65
- 'image',
66
- [
67
- 'label' => __( 'Image', 'happy-elementor-addons' ),
68
- 'type' => Controls_Manager::MEDIA,
69
- 'default' => [
70
- 'url' => Utils::get_placeholder_image_src(),
71
- ],
72
- 'dynamic' => [
73
- 'active' => true,
74
- ]
75
- ]
76
- );
77
-
78
- $this->add_group_control(
79
- Group_Control_Image_Size::get_type(),
80
- [
81
- 'name' => 'thumbnail',
82
- 'default' => 'large',
83
- 'separator' => 'none',
84
- ]
85
- );
86
-
87
- $this->add_control(
88
- 'image_position',
89
- [
90
- 'label' => __( 'Image Position', 'happy-elementor-addons' ),
91
- 'type' => Controls_Manager::CHOOSE,
92
- 'label_block' => false,
93
- 'options' => [
94
- 'left' => [
95
- 'title' => __( 'Left', 'happy-elementor-addons' ),
96
- 'icon' => 'eicon-h-align-left',
97
- ],
98
- 'top' => [
99
- 'title' => __( 'Top', 'happy-elementor-addons' ),
100
- 'icon' => 'eicon-v-align-top',
101
- ],
102
- 'right' => [
103
- 'title' => __( 'Right', 'happy-elementor-addons' ),
104
- 'icon' => 'eicon-h-align-right',
105
- ],
106
- ],
107
- 'toggle' => false,
108
- 'default' => 'top',
109
- 'prefix_class' => 'ha-card--',
110
- 'style_transfer' => true,
111
- ]
112
- );
113
-
114
- $this->add_control(
115
- 'badge_text',
116
- [
117
- 'label' => __( 'Badge Text', 'happy-elementor-addons' ),
118
- 'type' => Controls_Manager::TEXT,
119
- 'label_block' => true,
120
- 'default' => __( 'Badget Text', 'happy-elementor-addons' ),
121
- 'placeholder' => __( 'Type badge text', 'happy-elementor-addons' ),
122
- 'separator' => 'before',
123
- 'description' => __( 'Set badget position and control all the style settings from Style tab', 'happy-elementor-addons' ),
124
- 'dynamic' => [
125
- 'active' => true,
126
- ]
127
- ]
128
- );
129
-
130
- $this->end_controls_section();
131
-
132
- $this->start_controls_section(
133
- '_section_title',
134
- [
135
- 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
136
- 'tab' => Controls_Manager::TAB_CONTENT,
137
- ]
138
- );
139
-
140
- $this->add_control(
141
- 'title',
142
- [
143
- 'label' => __( 'Title', 'happy-elementor-addons' ),
144
- 'label_block' => true,
145
- 'type' => Controls_Manager::TEXT,
146
- 'default' => __( 'Happy Card Title', 'happy-elementor-addons' ),
147
- 'placeholder' => __( 'Type Card Title', 'happy-elementor-addons' ),
148
- 'dynamic' => [
149
- 'active' => true,
150
- ]
151
- ]
152
- );
153
-
154
- $this->add_control(
155
- 'description',
156
- [
157
- 'label' => __( 'Description', 'happy-elementor-addons' ),
158
- 'description' => ha_get_allowed_html_desc( 'intermediate' ),
159
- 'type' => Controls_Manager::TEXTAREA,
160
- 'default' => __( 'Happy card description goes here', 'happy-elementor-addons' ),
161
- 'placeholder' => __( 'Type card description', 'happy-elementor-addons' ),
162
- 'rows' => 5,
163
- 'dynamic' => [
164
- 'active' => true,
165
- ]
166
- ]
167
- );
168
-
169
- $this->add_control(
170
- 'title_tag',
171
- [
172
- 'label' => __( 'Title HTML Tag', 'happy-elementor-addons' ),
173
- 'type' => Controls_Manager::CHOOSE,
174
- 'options' => [
175
- 'h1' => [
176
- 'title' => __( 'H1', 'happy-elementor-addons' ),
177
- 'icon' => 'eicon-editor-h1'
178
- ],
179
- 'h2' => [
180
- 'title' => __( 'H2', 'happy-elementor-addons' ),
181
- 'icon' => 'eicon-editor-h2'
182
- ],
183
- 'h3' => [
184
- 'title' => __( 'H3', 'happy-elementor-addons' ),
185
- 'icon' => 'eicon-editor-h3'
186
- ],
187
- 'h4' => [
188
- 'title' => __( 'H4', 'happy-elementor-addons' ),
189
- 'icon' => 'eicon-editor-h4'
190
- ],
191
- 'h5' => [
192
- 'title' => __( 'H5', 'happy-elementor-addons' ),
193
- 'icon' => 'eicon-editor-h5'
194
- ],
195
- 'h6' => [
196
- 'title' => __( 'H6', 'happy-elementor-addons' ),
197
- 'icon' => 'eicon-editor-h6'
198
- ]
199
- ],
200
- 'default' => 'h2',
201
- 'toggle' => false,
202
- ]
203
- );
204
-
205
- $this->add_responsive_control(
206
- 'align',
207
- [
208
- 'label' => __( 'Alignment', 'happy-elementor-addons' ),
209
- 'type' => Controls_Manager::CHOOSE,
210
- 'options' => [
211
- 'left' => [
212
- 'title' => __( 'Left', 'happy-elementor-addons' ),
213
- 'icon' => 'fa fa-align-left',
214
- ],
215
- 'center' => [
216
- 'title' => __( 'Center', 'happy-elementor-addons' ),
217
- 'icon' => 'fa fa-align-center',
218
- ],
219
- 'right' => [
220
- 'title' => __( 'Right', 'happy-elementor-addons' ),
221
- 'icon' => 'fa fa-align-right',
222
- ],
223
- ],
224
- 'toggle' => true,
225
- 'selectors' => [
226
- '{{WRAPPER}} .elementor-widget-container' => 'text-align: {{VALUE}};'
227
- ]
228
- ]
229
- );
230
-
231
- $this->end_controls_section();
232
-
233
- $this->start_controls_section(
234
- '_section_button',
235
- [
236
- 'label' => __( 'Button', 'happy-elementor-addons' ),
237
- 'tab' => Controls_Manager::TAB_CONTENT,
238
- ]
239
- );
240
-
241
- $this->add_control(
242
- 'button_text',
243
- [
244
- 'label' => __( 'Text', 'happy-elementor-addons' ),
245
- 'type' => Controls_Manager::TEXT,
246
- 'default' => 'Button Text',
247
- 'placeholder' => __( 'Type button text here', 'happy-elementor-addons' ),
248
- 'label_block' => true,
249
- 'dynamic' => [
250
- 'active' => true,
251
- ]
252
- ]
253
- );
254
-
255
- $this->add_control(
256
- 'button_link',
257
- [
258
- 'label' => __( 'Link', 'happy-elementor-addons' ),
259
- 'type' => Controls_Manager::URL,
260
- 'placeholder' => 'https://happyaddons.com/',
261
- 'dynamic' => [
262
- 'active' => true,
263
- ]
264
- ]
265
- );
266
-
267
- if ( ha_is_elementor_version( '<', '2.6.0' ) ) {
268
- $this->add_control(
269
- 'button_icon',
270
- [
271
- 'label' => __( 'Icon', 'happy-elementor-addons' ),
272
- 'label_block' => true,
273
- 'type' => Controls_Manager::ICON,
274
- 'options' => ha_get_happy_icons(),
275
- 'default' => 'fa fa-angle-right',
276
- ]
277
- );
278
-
279
- $condition = ['button_icon!' => ''];
280
- } else {
281
- $this->add_control(
282
- 'button_selected_icon',
283
- [
284
- 'type' => Controls_Manager::ICONS,
285
- 'fa4compatibility' => 'button_icon',
286
- 'label_block' => true,
287
- ]
288
- );
289
- $condition = ['button_selected_icon[value]!' => ''];
290
- }
291
-
292
- $this->add_control(
293
- 'button_icon_position',
294
- [
295
- 'label' => __( 'Icon Position', 'happy-elementor-addons' ),
296
- 'type' => Controls_Manager::CHOOSE,
297
- 'label_block' => false,
298
- 'options' => [
299
- 'before' => [
300
- 'title' => __( 'Before', 'happy-elementor-addons' ),
301
- 'icon' => 'eicon-h-align-left',
302
- ],
303
- 'after' => [
304
- 'title' => __( 'After', 'happy-elementor-addons' ),
305
- 'icon' => 'eicon-h-align-right',
306
- ],
307
- ],
308
- 'default' => 'before',
309
- 'toggle' => false,
310
- 'condition' => $condition,
311
- 'style_transfer' => true,
312
- ]
313
- );
314
-
315
- $this->add_control(
316
- 'button_icon_spacing',
317
- [
318
- 'label' => __( 'Icon Spacing', 'happy-elementor-addons' ),
319
- 'type' => Controls_Manager::SLIDER,
320
- 'condition' => $condition,
321
- 'selectors' => [
322
- '{{WRAPPER}} .ha-btn--icon-before .ha-btn-icon' => 'margin-right: {{SIZE}}{{UNIT}};',
323
- '{{WRAPPER}} .ha-btn--icon-after .ha-btn-icon' => 'margin-left: {{SIZE}}{{UNIT}};',
324
- ],
325
- ]
326
- );
327
-
328
- $this->end_controls_section();
329
- }
330
-
331
- protected function register_style_controls() {
332
- $this->start_controls_section(
333
- '_section_style_image',
334
- [
335
- 'label' => __( 'Image', 'happy-elementor-addons' ),
336
- 'tab' => Controls_Manager::TAB_STYLE,
337
- ]
338
- );
339
-
340
- $this->add_responsive_control(
341
- 'image_width',
342
- [
343
- 'label' => __( 'Width', 'happy-elementor-addons' ),
344
- 'type' => Controls_Manager::SLIDER,
345
- 'size_units' => [ '%', 'px' ],
346
- 'desktop_default' => [
347
- 'unit' => '%',
348
- ],
349
- 'tablet_default' => [
350
- 'unit' => '%',
351
- ],
352
- 'mobile_default' => [
353
- 'unit' => '%',
354
- ],
355
- 'range' => [
356
- '%' => [
357
- 'min' => 1,
358
- 'max' => 100,
359
- ],
360
- 'px' => [
361
- 'min' => 50,
362
- 'max' => 1000,
363
- ],
364
- ],
365
- 'selectors' => [
366
- '{{WRAPPER}} .ha-card-figure' => 'flex: 0 0 {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}};',
367
- '{{WRAPPER}}.ha-card--right .ha-card-body, {{WRAPPER}}.ha-card--left .ha-card-body' => 'flex: 0 0 calc(100% - {{SIZE || 50}}{{UNIT}}); max-width: calc(100% - {{SIZE || 50}}{{UNIT}});',
368
- ],
369
- ]
370
- );
371
-
372
- $this->add_responsive_control(
373
- 'image_height',
374
- [
375
- 'label' => __( 'Height', 'happy-elementor-addons' ),
376
- 'type' => Controls_Manager::SLIDER,
377
- 'size_units' => [ 'px' ],
378
- 'range' => [
379
- 'px' => [
380
- 'min' => 50,
381
- 'max' => 1000,
382
- ],
383
- ],
384
- 'selectors' => [
385
- '{{WRAPPER}} .ha-card-figure' => 'height: {{SIZE}}{{UNIT}};',
386
- ],
387
- ]
388
- );
389
-
390
- $this->add_control(
391
- 'offset_toggle',
392
- [
393
- 'label' => __( 'Offset', 'happy-elementor-addons' ),
394
- 'type' => Controls_Manager::POPOVER_TOGGLE,
395
- 'label_off' => __( 'None', 'happy-elementor-addons' ),
396
- 'label_on' => __( 'Custom', 'happy-elementor-addons' ),
397
- 'return_value' => 'yes',
398
- ]
399
- );
400
-
401
- $this->start_popover();
402
-
403
- $this->add_responsive_control(
404
- 'image_offset_x',
405
- [
406
- 'label' => __( 'Offset Left', 'happy-elementor-addons' ),
407
- 'type' => Controls_Manager::SLIDER,
408
- 'size_units' => ['px'],
409
- 'condition' => [
410
- 'offset_toggle' => 'yes'
411
- ],
412
- 'range' => [
413
- 'px' => [
414
- 'min' => -1000,
415
- 'max' => 1000,
416
- ],
417
- ],
418
- 'render_type' => 'ui'
419
- ]
420
- );
421
-
422
- $this->add_responsive_control(
423
- 'image_offset_y',
424
- [
425
- 'label' => __( 'Offset Top', 'happy-elementor-addons' ),
426
- 'type' => Controls_Manager::SLIDER,
427
- 'size_units' => ['px'],
428
- 'condition' => [
429
- 'offset_toggle' => 'yes'
430
- ],
431
- 'range' => [
432
- 'px' => [
433
- 'min' => -1000,
434
- 'max' => 1000,
435
- ],
436
- ],
437
- 'selectors' => [
438
- // Left image position styles
439
- '(desktop){{WRAPPER}}.ha-card--left .ha-card-body' => 'margin-left: {{image_offset_x.SIZE || 0}}{{UNIT}}; flex: 0 0 calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + (-1 * {{image_offset_x.SIZE || 0}}{{UNIT}})); max-width: calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + (-1 * {{image_offset_x.SIZE || 0}}{{UNIT}}));',
440
- '(tablet){{WRAPPER}}.ha-card--left .ha-card-body' => 'margin-left: {{image_offset_x_tablet.SIZE || 0}}{{UNIT}}; flex: 0 0 calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + (-1 * {{image_offset_x_tablet.SIZE || 0}}{{UNIT}})); max-width: calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + (-1 * {{image_offset_x_tablet.SIZE || 0}}{{UNIT}}));',
441
- '(mobile){{WRAPPER}}.ha-card--left .ha-card-body' => 'margin-left: {{image_offset_x_mobile.SIZE || 0}}{{UNIT}}; flex: 0 0 calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + (-1 * {{image_offset_x_mobile.SIZE || 0}}{{UNIT}})); max-width: calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + (-1 * {{image_offset_x_mobile.SIZE || 0}}{{UNIT}}));',
442
- // Image right position styles
443
- '(desktop){{WRAPPER}}.ha-card--right .ha-card-body' => 'margin-right: calc(-1 * {{image_offset_x.SIZE || 0}}{{UNIT}}); flex: 0 0 calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + {{image_offset_x.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + {{image_offset_x.SIZE || 0}}{{UNIT}});',
444
- '(tablet){{WRAPPER}}.ha-card--right .ha-card-body' => 'margin-right: calc(-1 * {{image_offset_x_tablet.SIZE || 0}}{{UNIT}}); flex: 0 0 calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + {{image_offset_x_tablet.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + {{image_offset_x_tablet.SIZE || 0}}{{UNIT}});',
445
- '(mobile){{WRAPPER}}.ha-card--right .ha-card-body' => 'margin-right: calc(-1 * {{image_offset_x_mobile.SIZE || 0}}{{UNIT}}); flex: 0 0 calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + {{image_offset_x_mobile.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + {{image_offset_x_mobile.SIZE || 0}}{{UNIT}});',
446
- // Image translate styles
447
- '(desktop){{WRAPPER}} .ha-card-figure' => '-ms-transform: translate({{image_offset_x.SIZE || 0}}{{UNIT}}, {{image_offset_y.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{image_offset_x.SIZE || 0}}{{UNIT}}, {{image_offset_y.SIZE || 0}}{{UNIT}}); transform: translate({{image_offset_x.SIZE || 0}}{{UNIT}}, {{image_offset_y.SIZE || 0}}{{UNIT}});',
448
- '(tablet){{WRAPPER}} .ha-card-figure' => '-ms-transform: translate({{image_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{image_offset_y_tablet.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{image_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{image_offset_y_tablet.SIZE || 0}}{{UNIT}}); transform: translate({{image_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{image_offset_y_tablet.SIZE || 0}}{{UNIT}});',
449
- '(mobile){{WRAPPER}} .ha-card-figure' => '-ms-transform: translate({{image_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{image_offset_y_mobile.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{image_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{image_offset_y_mobile.SIZE || 0}}{{UNIT}}); transform: translate({{image_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{image_offset_y_mobile.SIZE || 0}}{{UNIT}});',
450
- // Card body styles
451
- '{{WRAPPER}}.ha-card--top .ha-card-body' => 'margin-top: {{SIZE}}{{UNIT}};',
452
- ],
453
- ]
454
- );
455
- $this->end_popover();
456
-
457
- $this->add_responsive_control(
458
- 'image_padding',
459
- [
460
- 'label' => __( 'Padding', 'happy-elementor-addons' ),
461
- 'type' => Controls_Manager::DIMENSIONS,
462
- 'size_units' => [ 'px', 'em', '%' ],
463
- 'selectors' => [
464
- '{{WRAPPER}} .ha-card-figure img' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
465
- ],
466
- ]
467
- );
468
-
469
- $this->add_group_control(
470
- Group_Control_Border::get_type(),
471
- [
472
- 'name' => 'image_border',
473
- 'selector' => '{{WRAPPER}} .ha-card-figure img',
474
- ]
475
- );
476
-
477
- $this->add_responsive_control(
478
- 'image_border_radius',
479
- [
480
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
481
- 'type' => Controls_Manager::DIMENSIONS,
482
- 'size_units' => [ 'px', '%' ],
483
- 'selectors' => [
484
- '{{WRAPPER}} .ha-card-figure img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
485
- ],
486
- ]
487
- );
488
-
489
- $this->add_group_control(
490
- Group_Control_Box_Shadow::get_type(),
491
- [
492
- 'name' => 'image_box_shadow',
493
- 'exclude' => [
494
- 'box_shadow_position',
495
- ],
496
- 'selector' => '{{WRAPPER}} .ha-card-figure img',
497
- 'separator' => 'after'
498
- ]
499
- );
500
-
501
- $this->start_controls_tabs(
502
- '_tabs_image_effects',
503
- [
504
- 'separator' => 'before'
505
- ]
506
- );
507
-
508
- $this->start_controls_tab(
509
- '_tab_image_effects_normal',
510
- [
511
- 'label' => __( 'Normal', 'happy-elementor-addons' ),
512
- ]
513
- );
514
-
515
- $this->add_control(
516
- 'image_opacity',
517
- [
518
- 'label' => __( 'Opacity', 'happy-elementor-addons' ),
519
- 'type' => Controls_Manager::SLIDER,
520
- 'range' => [
521
- 'px' => [
522
- 'max' => 1,
523
- 'min' => 0.10,
524
- 'step' => 0.01,
525
- ],
526
- ],
527
- 'selectors' => [
528
- '{{WRAPPER}} .ha-card-figure img' => 'opacity: {{SIZE}};',
529
- ],
530
- ]
531
- );
532
-
533
- $this->add_group_control(
534
- Group_Control_Css_Filter::get_type(),
535
- [
536
- 'name' => 'image_css_filters',
537
- 'selector' => '{{WRAPPER}} .ha-card-figure img',
538
- ]
539
- );
540
-
541
- $this->end_controls_tab();
542
-
543
- $this->start_controls_tab( 'hover',
544
- [
545
- 'label' => __( 'Hover', 'happy-elementor-addons' ),
546
- ]
547
- );
548
-
549
- $this->add_control(
550
- 'image_opacity_hover',
551
- [
552
- 'label' => __( 'Opacity', 'happy-elementor-addons' ),
553
- 'type' => Controls_Manager::SLIDER,
554
- 'range' => [
555
- 'px' => [
556
- 'max' => 1,
557
- 'min' => 0.10,
558
- 'step' => 0.01,
559
- ],
560
- ],
561
- 'selectors' => [
562
- '{{WRAPPER}} .ha-card-figure:hover img' => 'opacity: {{SIZE}};',
563
- ],
564
- ]
565
- );
566
-
567
- $this->add_group_control(
568
- Group_Control_Css_Filter::get_type(),
569
- [
570
- 'name' => 'image_css_filters_hover',
571
- 'selector' => '{{WRAPPER}} .ha-card-figure:hover img',
572
- ]
573
- );
574
-
575
- $this->add_control(
576
- 'image_background_hover_transition',
577
- [
578
- 'label' => __( 'Transition Duration', 'happy-elementor-addons' ),
579
- 'type' => Controls_Manager::SLIDER,
580
- 'range' => [
581
- 'px' => [
582
- 'max' => 3,
583
- 'step' => 0.1,
584
- ],
585
- ],
586
- 'selectors' => [
587
- '{{WRAPPER}} .ha-card-figure img' => 'transition-duration: {{SIZE}}s;',
588
- ],
589
- ]
590
- );
591
-
592
- $this->add_control(
593
- 'hover_animation',
594
- [
595
- 'label' => __( 'Hover Animation', 'happy-elementor-addons' ),
596
- 'type' => Controls_Manager::HOVER_ANIMATION,
597
- 'label_block' => true,
598
- ]
599
- );
600
-
601
- $this->end_controls_tab();
602
- $this->end_controls_tabs();
603
-
604
- $this->end_controls_section();
605
-
606
- $this->start_controls_section(
607
- '_section_style_badge',
608
- [
609
- 'label' => __( 'Badge', 'happy-elementor-addons' ),
610
- 'tab' => Controls_Manager::TAB_STYLE,
611
- ]
612
- );
613
-
614
- $this->add_control(
615
- 'badge_position',
616
- [
617
- 'label' => __( 'Position', 'happy-elementor-addons' ),
618
- 'type' => Controls_Manager::SELECT,
619
- 'options' => [
620
- 'top-left' => __( 'Top Left', 'happy-elementor-addons' ),
621
- 'top-center' => __( 'Top Center', 'happy-elementor-addons' ),
622
- 'top-right' => __( 'Top Right', 'happy-elementor-addons' ),
623
- 'middle-left' => __( 'Middle Left', 'happy-elementor-addons' ),
624
- 'middle-center' => __( 'Middle Center', 'happy-elementor-addons' ),
625
- 'middle-right' => __( 'Middle Right', 'happy-elementor-addons' ),
626
- 'bottom-left' => __( 'Bottom Left', 'happy-elementor-addons' ),
627
- 'bottom-center' => __( 'Bottom Center', 'happy-elementor-addons' ),
628
- 'bottom-right' => __( 'Bottom Right', 'happy-elementor-addons' ),
629
- ],
630
- 'default' => 'top-right',
631
- ]
632
- );
633
-
634
- $this->add_control(
635
- 'badge_offset_toggle',
636
- [
637
- 'label' => __( 'Offset', 'happy-elementor-addons' ),
638
- 'type' => Controls_Manager::POPOVER_TOGGLE,
639
- 'label_off' => __( 'None', 'happy-elementor-addons' ),
640
- 'label_on' => __( 'Custom', 'happy-elementor-addons' ),
641
- 'return_value' => 'yes',
642
- ]
643
- );
644
-
645
- $this->start_popover();
646
-
647
- $this->add_responsive_control(
648
- 'badge_offset_x',
649
- [
650
- 'label' => __( 'Offset Left', 'happy-elementor-addons' ),
651
- 'type' => Controls_Manager::SLIDER,
652
- 'size_units' => ['px'],
653
- 'condition' => [
654
- 'badge_offset_toggle' => 'yes'
655
- ],
656
- 'range' => [
657
- 'px' => [
658
- 'min' => -1000,
659
- 'max' => 1000,
660
- ],
661
- ],
662
- 'render_type' => 'ui'
663
- ]
664
- );
665
-
666
- $this->add_responsive_control(
667
- 'badge_offset_y',
668
- [
669
- 'label' => __( 'Offset Top', 'happy-elementor-addons' ),
670
- 'type' => Controls_Manager::SLIDER,
671
- 'size_units' => ['px'],
672
- 'condition' => [
673
- 'badge_offset_toggle' => 'yes'
674
- ],
675
- 'range' => [
676
- 'px' => [
677
- 'min' => -1000,
678
- 'max' => 1000,
679
- ],
680
- ],
681
- 'selectors' => [
682
- '(desktop){{WRAPPER}} .ha-badge' => '-ms-transform: translate({{badge_offset_x.SIZE || 0}}{{UNIT}}, {{badge_offset_y.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{badge_offset_x.SIZE || 0}}{{UNIT}}, {{badge_offset_y.SIZE || 0}}{{UNIT}}); transform: translate({{badge_offset_x.SIZE || 0}}{{UNIT}}, {{badge_offset_y.SIZE || 0}}{{UNIT}});',
683
- '(tablet){{WRAPPER}} .ha-badge' => '-ms-transform: translate({{badge_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{badge_offset_y_tablet.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{badge_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{badge_offset_y_tablet.SIZE || 0}}{{UNIT}}); transform: translate({{badge_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{badge_offset_y_tablet.SIZE || 0}}{{UNIT}});',
684
- '(mobile){{WRAPPER}} .ha-badge' => '-ms-transform: translate({{badge_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{badge_offset_y_mobile.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{badge_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{badge_offset_y_mobile.SIZE || 0}}{{UNIT}}); transform: translate({{badge_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{badge_offset_y_mobile.SIZE || 0}}{{UNIT}});',
685
- ],
686
- ]
687
- );
688
- $this->end_popover();
689
-
690
- $this->add_responsive_control(
691
- 'badge_padding',
692
- [
693
- 'label' => __( 'Padding', 'happy-elementor-addons' ),
694
- 'type' => Controls_Manager::DIMENSIONS,
695
- 'size_units' => [ 'px', 'em', '%' ],
696
- 'selectors' => [
697
- '{{WRAPPER}} .ha-badge' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
698
- ],
699
- ]
700
- );
701
-
702
- $this->add_control(
703
- 'badge_color',
704
- [
705
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
706
- 'type' => Controls_Manager::COLOR,
707
- 'selectors' => [
708
- '{{WRAPPER}} .ha-badge' => 'color: {{VALUE}};',
709
- ],
710
- ]
711
- );
712
-
713
- $this->add_control(
714
- 'badge_bg_color',
715
- [
716
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
717
- 'type' => Controls_Manager::COLOR,
718
- 'selectors' => [
719
- '{{WRAPPER}} .ha-badge' => 'background-color: {{VALUE}};',
720
- ],
721
- ]
722
- );
723
-
724
- $this->add_group_control(
725
- Group_Control_Border::get_type(),
726
- [
727
- 'name' => 'badge_border',
728
- 'selector' => '{{WRAPPER}} .ha-badge',
729
- ]
730
- );
731
-
732
- $this->add_responsive_control(
733
- 'badge_border_radius',
734
- [
735
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
736
- 'type' => Controls_Manager::DIMENSIONS,
737
- 'size_units' => [ 'px', '%' ],
738
- 'selectors' => [
739
- '{{WRAPPER}} .ha-badge' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
740
- ],
741
- ]
742
- );
743
-
744
- $this->add_group_control(
745
- Group_Control_Box_Shadow::get_type(),
746
- [
747
- 'name' => 'badge_box_shadow',
748
- 'exclude' => [
749
- 'box_shadow_position',
750
- ],
751
- 'selector' => '{{WRAPPER}} .ha-badge',
752
- ]
753
- );
754
-
755
- $this->add_group_control(
756
- Group_Control_Typography::get_type(),
757
- [
758
- 'name' => 'badge_typography',
759
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
760
- 'exclude' => [
761
- 'line_height'
762
- ],
763
- 'default' => [
764
- 'font_size' => ['']
765
- ],
766
- 'selector' => '{{WRAPPER}} .ha-badge',
767
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
768
- ]
769
- );
770
-
771
- $this->end_controls_section();
772
-
773
- $this->start_controls_section(
774
- '_section_style_content',
775
- [
776
- 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
777
- 'tab' => Controls_Manager::TAB_STYLE,
778
- ]
779
- );
780
-
781
- $this->add_responsive_control(
782
- 'content_padding',
783
- [
784
- 'label' => __( 'Content Padding', 'happy-elementor-addons' ),
785
- 'type' => Controls_Manager::DIMENSIONS,
786
- 'size_units' => [ 'px', 'em', '%' ],
787
- 'selectors' => [
788
- '{{WRAPPER}} .ha-card-body' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
789
- ],
790
- ]
791
- );
792
-
793
- $this->add_control(
794
- '_heading_title',
795
- [
796
- 'type' => Controls_Manager::HEADING,
797
- 'label' => __( 'Title', 'happy-elementor-addons' ),
798
- 'separator' => 'before'
799
- ]
800
- );
801
-
802
- $this->add_responsive_control(
803
- 'title_spacing',
804
- [
805
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
806
- 'type' => Controls_Manager::SLIDER,
807
- 'size_units' => ['px'],
808
- 'selectors' => [
809
- '{{WRAPPER}} .ha-card-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
810
- ],
811
- ]
812
- );
813
-
814
- $this->add_control(
815
- 'title_color',
816
- [
817
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
818
- 'type' => Controls_Manager::COLOR,
819
- 'selectors' => [
820
- '{{WRAPPER}} .ha-card-title' => 'color: {{VALUE}}',
821
- ],
822
- ]
823
- );
824
-
825
- $this->add_group_control(
826
- Group_Control_Typography::get_type(),
827
- [
828
- 'name' => 'title_typography',
829
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
830
- 'selector' => '{{WRAPPER}} .ha-card-title',
831
- 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
832
- ]
833
- );
834
-
835
- $this->add_control(
836
- '_heading_description',
837
- [
838
- 'type' => Controls_Manager::HEADING,
839
- 'label' => __( 'Description', 'happy-elementor-addons' ),
840
- 'separator' => 'before'
841
- ]
842
- );
843
-
844
- $this->add_responsive_control(
845
- 'description_spacing',
846
- [
847
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
848
- 'type' => Controls_Manager::SLIDER,
849
- 'size_units' => ['px'],
850
- 'selectors' => [
851
- '{{WRAPPER}} .ha-card-text' => 'margin-bottom: {{SIZE}}{{UNIT}};',
852
- ],
853
- ]
854
- );
855
-
856
- $this->add_control(
857
- 'description_color',
858
- [
859
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
860
- 'type' => Controls_Manager::COLOR,
861
- 'selectors' => [
862
- '{{WRAPPER}} .ha-card-text' => 'color: {{VALUE}};',
863
- ],
864
- ]
865
- );
866
-
867
- $this->add_group_control(
868
- Group_Control_Typography::get_type(),
869
- [
870
- 'name' => 'description_typography',
871
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
872
- 'selector' => '{{WRAPPER}} .ha-card-text',
873
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
874
- ]
875
- );
876
-
877
- $this->end_controls_section();
878
-
879
- $this->start_controls_section(
880
- '_section_style_button',
881
- [
882
- 'label' => __( 'Button', 'happy-elementor-addons' ),
883
- 'tab' => Controls_Manager::TAB_STYLE,
884
- ]
885
- );
886
-
887
- $this->add_responsive_control(
888
- 'button_padding',
889
- [
890
- 'label' => __( 'Padding', 'happy-elementor-addons' ),
891
- 'type' => Controls_Manager::DIMENSIONS,
892
- 'size_units' => [ 'px', 'em', '%' ],
893
- 'selectors' => [
894
- '{{WRAPPER}} .ha-btn' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
895
- ],
896
- ]
897
- );
898
-
899
- $this->add_group_control(
900
- Group_Control_Typography::get_type(),
901
- [
902
- 'name' => 'button_typography',
903
- 'selector' => '{{WRAPPER}} .ha-btn',
904
- 'scheme' => Scheme_Typography::TYPOGRAPHY_4,
905
- ]
906
- );
907
-
908
- $this->add_group_control(
909
- Group_Control_Border::get_type(),
910
- [
911
- 'name' => 'button_border',
912
- 'selector' => '{{WRAPPER}} .ha-btn',
913
- ]
914
- );
915
-
916
- $this->add_control(
917
- 'button_border_radius',
918
- [
919
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
920
- 'type' => Controls_Manager::DIMENSIONS,
921
- 'size_units' => [ 'px', '%' ],
922
- 'selectors' => [
923
- '{{WRAPPER}} .ha-btn' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
924
- ],
925
- ]
926
- );
927
-
928
- $this->add_group_control(
929
- Group_Control_Box_Shadow::get_type(),
930
- [
931
- 'name' => 'button_box_shadow',
932
- 'selector' => '{{WRAPPER}} .ha-btn',
933
- ]
934
- );
935
-
936
- $this->add_control(
937
- 'hr',
938
- [
939
- 'type' => Controls_Manager::DIVIDER,
940
- 'style' => 'thick',
941
- ]
942
- );
943
-
944
- $this->start_controls_tabs( '_tabs_button' );
945
-
946
- $this->start_controls_tab(
947
- '_tab_button_normal',
948
- [
949
- 'label' => __( 'Normal', 'happy-elementor-addons' ),
950
- ]
951
- );
952
-
953
- $this->add_control(
954
- 'button_color',
955
- [
956
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
957
- 'type' => Controls_Manager::COLOR,
958
- 'default' => '',
959
- 'selectors' => [
960
- '{{WRAPPER}} .ha-btn' => 'color: {{VALUE}};',
961
- ],
962
- ]
963
- );
964
-
965
- $this->add_control(
966
- 'button_bg_color',
967
- [
968
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
969
- 'type' => Controls_Manager::COLOR,
970
- 'selectors' => [
971
- '{{WRAPPER}} .ha-btn' => 'background-color: {{VALUE}};',
972
- ],
973
- ]
974
- );
975
-
976
- $this->end_controls_tab();
977
-
978
- $this->start_controls_tab(
979
- '_tab_button_hover',
980
- [
981
- 'label' => __( 'Hover', 'happy-elementor-addons' ),
982
- ]
983
- );
984
-
985
- $this->add_control(
986
- 'button_hover_color',
987
- [
988
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
989
- 'type' => Controls_Manager::COLOR,
990
- 'selectors' => [
991
- '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'color: {{VALUE}};',
992
- ],
993
- ]
994
- );
995
-
996
- $this->add_control(
997
- 'button_hover_bg_color',
998
- [
999
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
1000
- 'type' => Controls_Manager::COLOR,
1001
- 'selectors' => [
1002
- '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'background-color: {{VALUE}};',
1003
- ],
1004
- ]
1005
- );
1006
-
1007
- $this->add_control(
1008
- 'button_hover_border_color',
1009
- [
1010
- 'label' => __( 'Border Color', 'happy-elementor-addons' ),
1011
- 'type' => Controls_Manager::COLOR,
1012
- 'condition' => [
1013
- 'button_border_border!' => '',
1014
- ],
1015
- 'selectors' => [
1016
- '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'border-color: {{VALUE}};',
1017
- ],
1018
- ]
1019
- );
1020
-
1021
- $this->end_controls_tab();
1022
- $this->end_controls_tabs();
1023
-
1024
- $this->end_controls_section();
1025
- }
1026
 
1027
  protected function render() {
1028
- $settings = $this->get_settings_for_display();
1029
-
1030
- $this->add_inline_editing_attributes( 'badge_text', 'none' );
1031
- $this->add_render_attribute(
1032
- 'badge_text',
1033
- 'class',
1034
- ['ha-badge', sprintf( 'ha-badge--%s', esc_attr( $settings['badge_position'] ) )]
1035
- );
1036
-
1037
- $this->add_inline_editing_attributes( 'title', 'basic' );
1038
- $this->add_render_attribute( 'title', 'class', 'ha-card-title' );
1039
-
1040
- $this->add_inline_editing_attributes( 'description', 'intermediate' );
1041
- $this->add_render_attribute( 'description', 'class', 'ha-card-text' );
1042
-
1043
- $this->add_inline_editing_attributes( 'button_text', 'none' );
1044
- $this->add_render_attribute( 'button_text', 'class', 'ha-btn-text' );
1045
-
1046
- $this->add_render_attribute( 'button', 'class', 'ha-btn' );
1047
-
1048
- $this->add_link_attributes( 'button', $settings['button_link'] );
1049
- ?>
1050
-
1051
- <?php if ( $settings['image']['url'] || $settings['image']['id'] ) :
1052
- $this->add_render_attribute( 'image', 'src', $settings['image']['url'] );
1053
- $this->add_render_attribute( 'image', 'alt', Control_Media::get_image_alt( $settings['image'] ) );
1054
- $this->add_render_attribute( 'image', 'title', Control_Media::get_image_title( $settings['image'] ) );
1055
- ?>
1056
- <figure class="ha-card-figure">
1057
- <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
1058
- <?php if ( $settings['badge_text'] ) : ?>
1059
- <div <?php echo $this->get_render_attribute_string( 'badge_text' ); ?>><?php echo esc_html( $settings['badge_text'] ); ?></div>
1060
- <?php endif; ?>
1061
- </figure>
1062
- <?php endif; ?>
1063
-
1064
- <div class="ha-card-body">
1065
-
1066
- <?php
1067
- if ( $settings['title' ] ) :
1068
- printf( '<%1$s %2$s>%3$s</%1$s>',
1069
- tag_escape( $settings['title_tag'] ),
1070
- $this->get_render_attribute_string( 'title' ),
1071
- ha_kses_basic( $settings['title' ] )
1072
- );
1073
- endif;
1074
- ?>
1075
-
1076
- <?php if ( $settings['description'] ) : ?>
1077
- <div <?php echo $this->get_render_attribute_string( 'description' ); ?>>
1078
- <p><?php echo ha_kses_intermediate( $settings['description'] ); ?></p>
1079
- </div>
1080
- <?php endif; ?>
1081
-
1082
- <?php
1083
- if ( $settings['button_text'] && ( ( empty( $settings['button_selected_icon'] ) || empty( $settings['button_selected_icon']['value'] ) ) && empty( $settings['button_icon'] ) ) ) :
1084
- printf( '<a %1$s>%2$s</a>',
1085
- $this->get_render_attribute_string( 'button' ),
1086
- sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( 'button_text' ), esc_html( $settings['button_text'] ) )
1087
- );
1088
- elseif ( empty( $settings['button_text'] ) && ( ! ( empty( $settings['button_selected_icon'] ) || empty( $settings['button_selected_icon']['value'] ) ) || ! empty( $settings['button_icon'] ) ) ) : ?>
1089
- <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php ha_render_icon( $settings, 'button_icon', 'button_selected_icon' ); ?></a>
1090
- <?php elseif ( $settings['button_text'] && ( ! ( empty( $settings['button_selected_icon'] ) || empty( $settings['button_selected_icon']['value'] ) ) || ! empty( $settings['button_icon'] ) ) ) :
1091
- if ( $settings['button_icon_position'] === 'before' ) :
1092
- $this->add_render_attribute( 'button', 'class', 'ha-btn--icon-before' );
1093
- $button_text = sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( 'button_text' ), esc_html( $settings['button_text'] ) );
1094
- ?>
1095
- <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php ha_render_icon( $settings, 'button_icon', 'button_selected_icon', ['class' => 'ha-btn-icon'] ); ?> <?php echo $button_text; ?></a>
1096
- <?php
1097
- else :
1098
- $this->add_render_attribute( 'button', 'class', 'ha-btn--icon-after' );
1099
- $button_text = sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( 'button_text' ), esc_html( $settings['button_text'] ) );
1100
- ?>
1101
- <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php echo $button_text; ?> <?php ha_render_icon( $settings, 'button_icon', 'button_selected_icon', ['class' => 'ha-btn-icon'] ); ?></a>
1102
- <?php
1103
- endif;
1104
- endif;
1105
- ?>
1106
- </div>
1107
- <?php
1108
- }
1109
-
1110
- public function _content_template() {
1111
- ?>
1112
- <#
1113
- var btnIconHTML = btnMigrated = btnIcon = '';
1114
-
1115
- if ( ha_has_icon_library() ) {
1116
- btnIconHTML = elementor.helpers.renderIcon( view, settings.button_selected_icon, { 'aria-hidden': true, 'class': 'ha-btn-icon' }, 'i' , 'object' ),
1117
- btnMigrated = elementor.helpers.isIconMigrated( settings, 'button_selected_icon' );
1118
- }
1119
-
1120
- view.addInlineEditingAttributes( 'badge_text', 'none' );
1121
- view.addRenderAttribute(
1122
- 'badge_text',
1123
- 'class',
1124
- ['ha-badge', 'ha-badge--' + settings.badge_position]
1125
- );
1126
-
1127
- view.addInlineEditingAttributes( 'title', 'basic' );
1128
- view.addRenderAttribute( 'title', 'class', 'ha-card-title' );
1129
-
1130
- view.addInlineEditingAttributes( 'description', 'intermediate' );
1131
- view.addRenderAttribute( 'description', 'class', 'ha-card-text' );
1132
-
1133
- view.addInlineEditingAttributes( 'button_text', 'none' );
1134
- view.addRenderAttribute( 'button_text', 'class', 'ha-btn-text' );
1135
-
1136
- view.addRenderAttribute( 'button', 'class', 'ha-btn' );
1137
- view.addRenderAttribute( 'button', 'href', settings.button_link.url );
1138
-
1139
- if ( settings.image.url || settings.image.id ) {
1140
- var image = {
1141
- id: settings.image.id,
1142
- url: settings.image.url,
1143
- size: settings.thumbnail_size,
1144
- dimension: settings.thumbnail_custom_dimension,
1145
- model: view.getEditModel()
1146
- };
1147
-
1148
- var image_url = elementor.imagesManager.getImageUrl( image ); #>
1149
- <figure class="ha-card-figure">
1150
- <img class="elementor-animation-{{settings.hover_animation}}" src="{{ image_url }}">
1151
- <# if (settings.badge_text) { #>
1152
- <div {{{ view.getRenderAttributeString( 'badge_text' ) }}}>{{ settings.badge_text }}</div>
1153
- <# } #>
1154
- </figure>
1155
- <# } #>
1156
-
1157
- <div class="ha-card-body">
1158
- <# if (settings.title) { #>
1159
- <{{ settings.title_tag }} {{{ view.getRenderAttributeString( 'title' ) }}}>{{{ settings.title }}}</{{ settings.title_tag }}>
1160
- <# } #>
1161
-
1162
- <# if (settings.description) { #>
1163
- <div {{{ view.getRenderAttributeString( 'description' ) }}}>
1164
- <p>{{{ settings.description }}}</p>
1165
- </div>
1166
- <# } #>
1167
-
1168
- <# if ( ( settings.button_selected_icon && settings.button_selected_icon.value ) || settings.button_icon ) {
1169
- if ( ha_has_icon_library() && btnIconHTML && btnIconHTML.rendered && ( ! settings.button_icon || btnMigrated ) ) {
1170
- btnIcon = btnIconHTML.value;
1171
- } else if ( settings.button_icon ) {
1172
- btnIcon = '<i class="ha-btn-icon ' + settings.button_icon + '" aria-hidden="true"></i>';
1173
- }
1174
- } #>
1175
-
1176
- <# if ( settings.button_text && ( ! ( settings.button_selected_icon && settings.button_selected_icon.value ) && ! settings.button_icon ) ) { #>
1177
- <a {{{ view.getRenderAttributeString( 'button' ) }}}><span {{{ view.getRenderAttributeString( 'button_text' ) }}}>{{ settings.button_text }}</span></a>
1178
- <# } else if ( ! settings.button_text && ( ( settings.button_selected_icon && settings.button_selected_icon.value ) || settings.button_icon ) ) { #>
1179
- <a {{{ view.getRenderAttributeString( 'button' ) }}}>{{{ btnIcon }}}</a>
1180
- <# } else if ( settings.button_text && ( ( settings.button_selected_icon && settings.button_selected_icon.value ) || settings.button_icon ) ) {
1181
- if ( settings.button_icon_position === 'before' ) {
1182
- view.addRenderAttribute( 'button', 'class', 'ha-btn--icon-before' );
1183
- button_before = btnIcon;
1184
- button_after = '<span ' + view.getRenderAttributeString( 'button_text' ) + '>' + settings.button_text + '</span>';
1185
- } else {
1186
- view.addRenderAttribute( 'button', 'class', 'ha-btn--icon-after' );
1187
- button_after = btnIcon;
1188
- button_before = '<span ' + view.getRenderAttributeString( 'button_text' ) + '>' + settings.button_text + '</span>';
1189
- } #>
1190
- <a {{{ view.getRenderAttributeString( 'button' ) }}}>{{{ button_before }}} {{{ button_after }}}</a>
1191
- <# } #>
1192
- </div>
1193
- <?php
1194
- }
1195
  }
15
  use Elementor\Group_Control_Box_Shadow;
16
  use Elementor\Group_Control_Image_Size;
17
  use Elementor\Group_Control_Typography;
18
+ use Happy_Addons\Elementor\Traits\Button_Renderer;
19
 
20
  defined( 'ABSPATH' ) || die();
21
 
22
  class Card extends Base {
23
 
24
+ use Button_Renderer;
25
+
26
+ /**
27
+ * Get widget title.
28
+ *
29
+ * @since 1.0.0
30
+ * @access public
31
+ *
32
+ * @return string Widget title.
33
+ */
34
+ public function get_title() {
35
+ return __( 'Card', 'happy-elementor-addons' );
36
+ }
37
+
38
+ public function get_custom_help_url() {
39
+ return 'https://happyaddons.com/docs/happy-addons-for-elementor/widgets/card/';
40
+ }
41
+
42
+ /**
43
+ * Get widget icon.
44
+ *
45
+ * @since 1.0.0
46
+ * @access public
47
+ *
48
+ * @return string Widget icon.
49
+ */
50
+ public function get_icon() {
51
+ return 'hm hm-card';
52
+ }
53
+
54
+ public function get_keywords() {
55
+ return [ 'card', 'blurb', 'infobox', 'content', 'block', 'box' ];
56
+ }
57
 
58
  protected function register_content_controls() {
59
  $this->start_controls_section(
64
  ]
65
  );
66
 
67
+ $this->add_control(
68
+ 'image',
69
+ [
70
+ 'label' => __( 'Image', 'happy-elementor-addons' ),
71
+ 'type' => Controls_Manager::MEDIA,
72
+ 'default' => [
73
+ 'url' => Utils::get_placeholder_image_src(),
74
+ ],
75
+ 'dynamic' => [
76
+ 'active' => true,
77
+ ]
78
+ ]
79
+ );
80
+
81
+ $this->add_group_control(
82
+ Group_Control_Image_Size::get_type(),
83
+ [
84
+ 'name' => 'thumbnail',
85
+ 'default' => 'large',
86
+ 'separator' => 'none',
87
+ ]
88
+ );
89
+
90
+ $this->add_control(
91
+ 'image_position',
92
+ [
93
+ 'label' => __( 'Image Position', 'happy-elementor-addons' ),
94
+ 'type' => Controls_Manager::CHOOSE,
95
+ 'label_block' => false,
96
+ 'options' => [
97
+ 'left' => [
98
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
99
+ 'icon' => 'eicon-h-align-left',
100
+ ],
101
+ 'top' => [
102
+ 'title' => __( 'Top', 'happy-elementor-addons' ),
103
+ 'icon' => 'eicon-v-align-top',
104
+ ],
105
+ 'right' => [
106
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
107
+ 'icon' => 'eicon-h-align-right',
108
+ ],
109
+ ],
110
+ 'toggle' => false,
111
+ 'default' => 'top',
112
+ 'prefix_class' => 'ha-card--',
113
+ 'style_transfer' => true,
114
+ ]
115
+ );
116
+
117
+ $this->add_control(
118
+ 'badge_text',
119
+ [
120
+ 'label' => __( 'Badge Text', 'happy-elementor-addons' ),
121
+ 'type' => Controls_Manager::TEXT,
122
+ 'label_block' => true,
123
+ 'default' => __( 'Badget Text', 'happy-elementor-addons' ),
124
+ 'placeholder' => __( 'Type badge text', 'happy-elementor-addons' ),
125
+ 'separator' => 'before',
126
+ 'description' => __( 'Set badget position and control all the style settings from Style tab', 'happy-elementor-addons' ),
127
+ 'dynamic' => [
128
+ 'active' => true,
129
+ ]
130
+ ]
131
+ );
132
+
133
+ $this->end_controls_section();
134
+
135
+ $this->start_controls_section(
136
+ '_section_title',
137
+ [
138
+ 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
139
+ 'tab' => Controls_Manager::TAB_CONTENT,
140
+ ]
141
+ );
142
+
143
+ $this->add_control(
144
+ 'title',
145
+ [
146
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
147
+ 'label_block' => true,
148
+ 'type' => Controls_Manager::TEXT,
149
+ 'default' => __( 'Happy Card Title', 'happy-elementor-addons' ),
150
+ 'placeholder' => __( 'Type Card Title', 'happy-elementor-addons' ),
151
+ 'dynamic' => [
152
+ 'active' => true,
153
+ ]
154
+ ]
155
+ );
156
+
157
+ $this->add_control(
158
+ 'description',
159
+ [
160
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
161
+ 'description' => ha_get_allowed_html_desc( 'intermediate' ),
162
+ 'type' => Controls_Manager::TEXTAREA,
163
+ 'default' => __( 'Happy card description goes here', 'happy-elementor-addons' ),
164
+ 'placeholder' => __( 'Type card description', 'happy-elementor-addons' ),
165
+ 'rows' => 5,
166
+ 'dynamic' => [
167
+ 'active' => true,
168
+ ]
169
+ ]
170
+ );
171
+
172
+ $this->add_control(
173
+ 'title_tag',
174
+ [
175
+ 'label' => __( 'Title HTML Tag', 'happy-elementor-addons' ),
176
+ 'type' => Controls_Manager::CHOOSE,
177
+ 'options' => [
178
+ 'h1' => [
179
+ 'title' => __( 'H1', 'happy-elementor-addons' ),
180
+ 'icon' => 'eicon-editor-h1'
181
+ ],
182
+ 'h2' => [
183
+ 'title' => __( 'H2', 'happy-elementor-addons' ),
184
+ 'icon' => 'eicon-editor-h2'
185
+ ],
186
+ 'h3' => [
187
+ 'title' => __( 'H3', 'happy-elementor-addons' ),
188
+ 'icon' => 'eicon-editor-h3'
189
+ ],
190
+ 'h4' => [
191
+ 'title' => __( 'H4', 'happy-elementor-addons' ),
192
+ 'icon' => 'eicon-editor-h4'
193
+ ],
194
+ 'h5' => [
195
+ 'title' => __( 'H5', 'happy-elementor-addons' ),
196
+ 'icon' => 'eicon-editor-h5'
197
+ ],
198
+ 'h6' => [
199
+ 'title' => __( 'H6', 'happy-elementor-addons' ),
200
+ 'icon' => 'eicon-editor-h6'
201
+ ]
202
+ ],
203
+ 'default' => 'h2',
204
+ 'toggle' => false,
205
+ ]
206
+ );
207
+
208
+ $this->add_responsive_control(
209
+ 'align',
210
+ [
211
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
212
+ 'type' => Controls_Manager::CHOOSE,
213
+ 'options' => [
214
+ 'left' => [
215
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
216
+ 'icon' => 'fa fa-align-left',
217
+ ],
218
+ 'center' => [
219
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
220
+ 'icon' => 'fa fa-align-center',
221
+ ],
222
+ 'right' => [
223
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
224
+ 'icon' => 'fa fa-align-right',
225
+ ],
226
+ ],
227
+ 'toggle' => true,
228
+ 'selectors' => [
229
+ '{{WRAPPER}} .elementor-widget-container' => 'text-align: {{VALUE}};'
230
+ ]
231
+ ]
232
+ );
233
+
234
+ $this->end_controls_section();
235
+
236
+ $this->start_controls_section(
237
+ '_section_button',
238
+ [
239
+ 'label' => __( 'Button', 'happy-elementor-addons' ),
240
+ 'tab' => Controls_Manager::TAB_CONTENT,
241
+ ]
242
+ );
243
+
244
+ $this->add_control(
245
+ 'button_text',
246
+ [
247
+ 'label' => __( 'Text', 'happy-elementor-addons' ),
248
+ 'type' => Controls_Manager::TEXT,
249
+ 'default' => 'Button Text',
250
+ 'placeholder' => __( 'Type button text here', 'happy-elementor-addons' ),
251
+ 'label_block' => true,
252
+ 'dynamic' => [
253
+ 'active' => true,
254
+ ]
255
+ ]
256
+ );
257
+
258
+ $this->add_control(
259
+ 'button_link',
260
+ [
261
+ 'label' => __( 'Link', 'happy-elementor-addons' ),
262
+ 'type' => Controls_Manager::URL,
263
+ 'placeholder' => 'https://example.com',
264
+ 'dynamic' => [
265
+ 'active' => true,
266
+ ]
267
+ ]
268
+ );
269
+
270
+ if ( ha_is_elementor_version( '<', '2.6.0' ) ) {
271
+ $this->add_control(
272
+ 'button_icon',
273
+ [
274
+ 'label' => __( 'Icon', 'happy-elementor-addons' ),
275
+ 'label_block' => true,
276
+ 'type' => Controls_Manager::ICON,
277
+ 'options' => ha_get_happy_icons(),
278
+ 'default' => 'fa fa-angle-right',
279
+ ]
280
+ );
281
+
282
+ $condition = ['button_icon!' => ''];
283
+ } else {
284
+ $this->add_control(
285
+ 'button_selected_icon',
286
+ [
287
+ 'type' => Controls_Manager::ICONS,
288
+ 'fa4compatibility' => 'button_icon',
289
+ 'label_block' => true,
290
+ ]
291
+ );
292
+ $condition = ['button_selected_icon[value]!' => ''];
293
+ }
294
+
295
+ $this->add_control(
296
+ 'button_icon_position',
297
+ [
298
+ 'label' => __( 'Icon Position', 'happy-elementor-addons' ),
299
+ 'type' => Controls_Manager::CHOOSE,
300
+ 'label_block' => false,
301
+ 'options' => [
302
+ 'before' => [
303
+ 'title' => __( 'Before', 'happy-elementor-addons' ),
304
+ 'icon' => 'eicon-h-align-left',
305
+ ],
306
+ 'after' => [
307
+ 'title' => __( 'After', 'happy-elementor-addons' ),
308
+ 'icon' => 'eicon-h-align-right',
309
+ ],
310
+ ],
311
+ 'default' => 'before',
312
+ 'toggle' => false,
313
+ 'condition' => $condition,
314
+ 'style_transfer' => true,
315
+ ]
316
+ );
317
+
318
+ $this->add_control(
319
+ 'button_icon_spacing',
320
+ [
321
+ 'label' => __( 'Icon Spacing', 'happy-elementor-addons' ),
322
+ 'type' => Controls_Manager::SLIDER,
323
+ 'condition' => $condition,
324
+ 'selectors' => [
325
+ '{{WRAPPER}} .ha-btn--icon-before .ha-btn-icon' => 'margin-right: {{SIZE}}{{UNIT}};',
326
+ '{{WRAPPER}} .ha-btn--icon-after .ha-btn-icon' => 'margin-left: {{SIZE}}{{UNIT}};',
327
+ ],
328
+ ]
329
+ );
330
+
331
+ $this->end_controls_section();
332
+ }
333
+
334
+ protected function register_style_controls() {
335
+ $this->start_controls_section(
336
+ '_section_style_image',
337
+ [
338
+ 'label' => __( 'Image', 'happy-elementor-addons' ),
339
+ 'tab' => Controls_Manager::TAB_STYLE,
340
+ ]
341
+ );
342
+
343
+ $this->add_responsive_control(
344
+ 'image_width',
345
+ [
346
+ 'label' => __( 'Width', 'happy-elementor-addons' ),
347
+ 'type' => Controls_Manager::SLIDER,
348
+ 'size_units' => [ '%', 'px' ],
349
+ 'desktop_default' => [
350
+ 'unit' => '%',
351
+ ],
352
+ 'tablet_default' => [
353
+ 'unit' => '%',
354
+ ],
355
+ 'mobile_default' => [
356
+ 'unit' => '%',
357
+ ],
358
+ 'range' => [
359
+ '%' => [
360
+ 'min' => 1,
361
+ 'max' => 100,
362
+ ],
363
+ 'px' => [
364
+ 'min' => 50,
365
+ 'max' => 1000,
366
+ ],
367
+ ],
368
+ 'selectors' => [
369
+ '{{WRAPPER}} .ha-card-figure' => 'flex: 0 0 {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}};',
370
+ '{{WRAPPER}}.ha-card--right .ha-card-body, {{WRAPPER}}.ha-card--left .ha-card-body' => 'flex: 0 0 calc(100% - {{SIZE || 50}}{{UNIT}}); max-width: calc(100% - {{SIZE || 50}}{{UNIT}});',
371
+ ],
372
+ ]
373
+ );
374
+
375
+ $this->add_responsive_control(
376
+ 'image_height',
377
+ [
378
+ 'label' => __( 'Height', 'happy-elementor-addons' ),
379
+ 'type' => Controls_Manager::SLIDER,
380
+ 'size_units' => [ 'px' ],
381
+ 'range' => [
382
+ 'px' => [
383
+ 'min' => 50,
384
+ 'max' => 1000,
385
+ ],
386
+ ],
387
+ 'selectors' => [
388
+ '{{WRAPPER}} .ha-card-figure' => 'height: {{SIZE}}{{UNIT}};',
389
+ ],
390
+ ]
391
+ );
392
+
393
+ $this->add_control(
394
+ 'offset_toggle',
395
+ [
396
+ 'label' => __( 'Offset', 'happy-elementor-addons' ),
397
+ 'type' => Controls_Manager::POPOVER_TOGGLE,
398
+ 'label_off' => __( 'None', 'happy-elementor-addons' ),
399
+ 'label_on' => __( 'Custom', 'happy-elementor-addons' ),
400
+ 'return_value' => 'yes',
401
+ ]
402
+ );
403
+
404
+ $this->start_popover();
405
+
406
+ $this->add_responsive_control(
407
+ 'image_offset_x',
408
+ [
409
+ 'label' => __( 'Offset Left', 'happy-elementor-addons' ),
410
+ 'type' => Controls_Manager::SLIDER,
411
+ 'size_units' => ['px'],
412
+ 'condition' => [
413
+ 'offset_toggle' => 'yes'
414
+ ],
415
+ 'range' => [
416
+ 'px' => [
417
+ 'min' => -1000,
418
+ 'max' => 1000,
419
+ ],
420
+ ],
421
+ 'render_type' => 'ui'
422
+ ]
423
+ );
424
+
425
+ $this->add_responsive_control(
426
+ 'image_offset_y',
427
+ [
428
+ 'label' => __( 'Offset Top', 'happy-elementor-addons' ),
429
+ 'type' => Controls_Manager::SLIDER,
430
+ 'size_units' => ['px'],
431
+ 'condition' => [
432
+ 'offset_toggle' => 'yes'
433
+ ],
434
+ 'range' => [
435
+ 'px' => [
436
+ 'min' => -1000,
437
+ 'max' => 1000,
438
+ ],
439
+ ],
440
+ 'selectors' => [
441
+ // Left image position styles
442
+ '(desktop){{WRAPPER}}.ha-card--left .ha-card-body' => 'margin-left: {{image_offset_x.SIZE || 0}}{{UNIT}}; flex: 0 0 calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + (-1 * {{image_offset_x.SIZE || 0}}{{UNIT}})); max-width: calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + (-1 * {{image_offset_x.SIZE || 0}}{{UNIT}}));',
443
+ '(tablet){{WRAPPER}}.ha-card--left .ha-card-body' => 'margin-left: {{image_offset_x_tablet.SIZE || 0}}{{UNIT}}; flex: 0 0 calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + (-1 * {{image_offset_x_tablet.SIZE || 0}}{{UNIT}})); max-width: calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + (-1 * {{image_offset_x_tablet.SIZE || 0}}{{UNIT}}));',
444
+ '(mobile){{WRAPPER}}.ha-card--left .ha-card-body' => 'margin-left: {{image_offset_x_mobile.SIZE || 0}}{{UNIT}}; flex: 0 0 calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + (-1 * {{image_offset_x_mobile.SIZE || 0}}{{UNIT}})); max-width: calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + (-1 * {{image_offset_x_mobile.SIZE || 0}}{{UNIT}}));',
445
+ // Image right position styles
446
+ '(desktop){{WRAPPER}}.ha-card--right .ha-card-body' => 'margin-right: calc(-1 * {{image_offset_x.SIZE || 0}}{{UNIT}}); flex: 0 0 calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + {{image_offset_x.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + {{image_offset_x.SIZE || 0}}{{UNIT}});',
447
+ '(tablet){{WRAPPER}}.ha-card--right .ha-card-body' => 'margin-right: calc(-1 * {{image_offset_x_tablet.SIZE || 0}}{{UNIT}}); flex: 0 0 calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + {{image_offset_x_tablet.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + {{image_offset_x_tablet.SIZE || 0}}{{UNIT}});',
448
+ '(mobile){{WRAPPER}}.ha-card--right .ha-card-body' => 'margin-right: calc(-1 * {{image_offset_x_mobile.SIZE || 0}}{{UNIT}}); flex: 0 0 calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + {{image_offset_x_mobile.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + {{image_offset_x_mobile.SIZE || 0}}{{UNIT}});',
449
+ // Image translate styles
450
+ '(desktop){{WRAPPER}} .ha-card-figure' => '-ms-transform: translate({{image_offset_x.SIZE || 0}}{{UNIT}}, {{image_offset_y.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{image_offset_x.SIZE || 0}}{{UNIT}}, {{image_offset_y.SIZE || 0}}{{UNIT}}); transform: translate({{image_offset_x.SIZE || 0}}{{UNIT}}, {{image_offset_y.SIZE || 0}}{{UNIT}});',
451
+ '(tablet){{WRAPPER}} .ha-card-figure' => '-ms-transform: translate({{image_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{image_offset_y_tablet.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{image_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{image_offset_y_tablet.SIZE || 0}}{{UNIT}}); transform: translate({{image_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{image_offset_y_tablet.SIZE || 0}}{{UNIT}});',
452
+ '(mobile){{WRAPPER}} .ha-card-figure' => '-ms-transform: translate({{image_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{image_offset_y_mobile.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{image_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{image_offset_y_mobile.SIZE || 0}}{{UNIT}}); transform: translate({{image_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{image_offset_y_mobile.SIZE || 0}}{{UNIT}});',
453
+ // Card body styles
454
+ '{{WRAPPER}}.ha-card--top .ha-card-body' => 'margin-top: {{SIZE}}{{UNIT}};',
455
+ ],
456
+ ]
457
+ );
458
+ $this->end_popover();
459
+
460
+ $this->add_responsive_control(
461
+ 'image_padding',
462
+ [
463
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
464
+ 'type' => Controls_Manager::DIMENSIONS,
465
+ 'size_units' => [ 'px', 'em', '%' ],
466
+ 'selectors' => [
467
+ '{{WRAPPER}} .ha-card-figure img' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
468
+ ],
469
+ ]
470
+ );
471
+
472
+ $this->add_group_control(
473
+ Group_Control_Border::get_type(),
474
+ [
475
+ 'name' => 'image_border',
476
+ 'selector' => '{{WRAPPER}} .ha-card-figure img',
477
+ ]
478
+ );
479
+
480
+ $this->add_responsive_control(
481
+ 'image_border_radius',
482
+ [
483
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
484
+ 'type' => Controls_Manager::DIMENSIONS,
485
+ 'size_units' => [ 'px', '%' ],
486
+ 'selectors' => [
487
+ '{{WRAPPER}} .ha-card-figure img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
488
+ ],
489
+ ]
490
+ );
491
+
492
+ $this->add_group_control(
493
+ Group_Control_Box_Shadow::get_type(),
494
+ [
495
+ 'name' => 'image_box_shadow',
496
+ 'exclude' => [
497
+ 'box_shadow_position',
498
+ ],
499
+ 'selector' => '{{WRAPPER}} .ha-card-figure img',
500
+ 'separator' => 'after'
501
+ ]
502
+ );
503
+
504
+ $this->start_controls_tabs(
505
+ '_tabs_image_effects',
506
+ [
507
+ 'separator' => 'before'
508
+ ]
509
+ );
510
+
511
+ $this->start_controls_tab(
512
+ '_tab_image_effects_normal',
513
+ [
514
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
515
+ ]
516
+ );
517
+
518
+ $this->add_control(
519
+ 'image_opacity',
520
+ [
521
+ 'label' => __( 'Opacity', 'happy-elementor-addons' ),
522
+ 'type' => Controls_Manager::SLIDER,
523
+ 'range' => [
524
+ 'px' => [
525
+ 'max' => 1,
526
+ 'min' => 0.10,
527
+ 'step' => 0.01,
528
+ ],
529
+ ],
530
+ 'selectors' => [
531
+ '{{WRAPPER}} .ha-card-figure img' => 'opacity: {{SIZE}};',
532
+ ],
533
+ ]
534
+ );
535
+
536
+ $this->add_group_control(
537
+ Group_Control_Css_Filter::get_type(),
538
+ [
539
+ 'name' => 'image_css_filters',
540
+ 'selector' => '{{WRAPPER}} .ha-card-figure img',
541
+ ]
542
+ );
543
+
544
+ $this->end_controls_tab();
545
+
546
+ $this->start_controls_tab( 'hover',
547
+ [
548
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
549
+ ]
550
+ );
551
+
552
+ $this->add_control(
553
+ 'image_opacity_hover',
554
+ [
555
+ 'label' => __( 'Opacity', 'happy-elementor-addons' ),
556
+ 'type' => Controls_Manager::SLIDER,
557
+ 'range' => [
558
+ 'px' => [
559
+ 'max' => 1,
560
+ 'min' => 0.10,
561
+ 'step' => 0.01,
562
+ ],
563
+ ],
564
+ 'selectors' => [
565
+ '{{WRAPPER}} .ha-card-figure:hover img' => 'opacity: {{SIZE}};',
566
+ ],
567
+ ]
568
+ );
569
+
570
+ $this->add_group_control(
571
+ Group_Control_Css_Filter::get_type(),
572
+ [
573
+ 'name' => 'image_css_filters_hover',
574
+ 'selector' => '{{WRAPPER}} .ha-card-figure:hover img',
575
+ ]
576
+ );
577
+
578
+ $this->add_control(
579
+ 'image_background_hover_transition',
580
+ [
581
+ 'label' => __( 'Transition Duration', 'happy-elementor-addons' ),
582
+ 'type' => Controls_Manager::SLIDER,
583
+ 'range' => [
584
+ 'px' => [
585
+ 'max' => 3,
586
+ 'step' => 0.1,
587
+ ],
588
+ ],
589
+ 'selectors' => [
590
+ '{{WRAPPER}} .ha-card-figure img' => 'transition-duration: {{SIZE}}s;',
591
+ ],
592
+ ]
593
+ );
594
+
595
+ $this->add_control(
596
+ 'hover_animation',
597
+ [
598
+ 'label' => __( 'Hover Animation', 'happy-elementor-addons' ),
599
+ 'type' => Controls_Manager::HOVER_ANIMATION,
600
+ 'label_block' => true,
601
+ ]
602
+ );
603
+
604
+ $this->end_controls_tab();
605
+ $this->end_controls_tabs();
606
+
607
+ $this->end_controls_section();
608
+
609
+ $this->start_controls_section(
610
+ '_section_style_badge',
611
+ [
612
+ 'label' => __( 'Badge', 'happy-elementor-addons' ),
613
+ 'tab' => Controls_Manager::TAB_STYLE,
614
+ ]
615
+ );
616
+
617
+ $this->add_control(
618
+ 'badge_position',
619
+ [
620
+ 'label' => __( 'Position', 'happy-elementor-addons' ),
621
+ 'type' => Controls_Manager::SELECT,
622
+ 'options' => [
623
+ 'top-left' => __( 'Top Left', 'happy-elementor-addons' ),
624
+ 'top-center' => __( 'Top Center', 'happy-elementor-addons' ),
625
+ 'top-right' => __( 'Top Right', 'happy-elementor-addons' ),
626
+ 'middle-left' => __( 'Middle Left', 'happy-elementor-addons' ),
627
+ 'middle-center' => __( 'Middle Center', 'happy-elementor-addons' ),
628
+ 'middle-right' => __( 'Middle Right', 'happy-elementor-addons' ),
629
+ 'bottom-left' => __( 'Bottom Left', 'happy-elementor-addons' ),
630
+ 'bottom-center' => __( 'Bottom Center', 'happy-elementor-addons' ),
631
+ 'bottom-right' => __( 'Bottom Right', 'happy-elementor-addons' ),
632
+ ],
633
+ 'default' => 'top-right',
634
+ ]
635
+ );
636
+
637
+ $this->add_control(
638
+ 'badge_offset_toggle',
639
+ [
640
+ 'label' => __( 'Offset', 'happy-elementor-addons' ),
641
+ 'type' => Controls_Manager::POPOVER_TOGGLE,
642
+ 'label_off' => __( 'None', 'happy-elementor-addons' ),
643
+ 'label_on' => __( 'Custom', 'happy-elementor-addons' ),
644
+ 'return_value' => 'yes',
645
+ ]
646
+ );
647
+
648
+ $this->start_popover();
649
+
650
+ $this->add_responsive_control(
651
+ 'badge_offset_x',
652
+ [
653
+ 'label' => __( 'Offset Left', 'happy-elementor-addons' ),
654
+ 'type' => Controls_Manager::SLIDER,
655
+ 'size_units' => ['px'],
656
+ 'condition' => [
657
+ 'badge_offset_toggle' => 'yes'
658
+ ],
659
+ 'range' => [
660
+ 'px' => [
661
+ 'min' => -1000,
662
+ 'max' => 1000,
663
+ ],
664
+ ],
665
+ 'render_type' => 'ui'
666
+ ]
667
+ );
668
+
669
+ $this->add_responsive_control(
670
+ 'badge_offset_y',
671
+ [
672
+ 'label' => __( 'Offset Top', 'happy-elementor-addons' ),
673
+ 'type' => Controls_Manager::SLIDER,
674
+ 'size_units' => ['px'],
675
+ 'condition' => [
676
+ 'badge_offset_toggle' => 'yes'
677
+ ],
678
+ 'range' => [
679
+ 'px' => [
680
+ 'min' => -1000,
681
+ 'max' => 1000,
682
+ ],
683
+ ],
684
+ 'selectors' => [
685
+ '(desktop){{WRAPPER}} .ha-badge' => '-ms-transform: translate({{badge_offset_x.SIZE || 0}}{{UNIT}}, {{badge_offset_y.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{badge_offset_x.SIZE || 0}}{{UNIT}}, {{badge_offset_y.SIZE || 0}}{{UNIT}}); transform: translate({{badge_offset_x.SIZE || 0}}{{UNIT}}, {{badge_offset_y.SIZE || 0}}{{UNIT}});',
686
+ '(tablet){{WRAPPER}} .ha-badge' => '-ms-transform: translate({{badge_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{badge_offset_y_tablet.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{badge_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{badge_offset_y_tablet.SIZE || 0}}{{UNIT}}); transform: translate({{badge_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{badge_offset_y_tablet.SIZE || 0}}{{UNIT}});',
687
+ '(mobile){{WRAPPER}} .ha-badge' => '-ms-transform: translate({{badge_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{badge_offset_y_mobile.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{badge_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{badge_offset_y_mobile.SIZE || 0}}{{UNIT}}); transform: translate({{badge_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{badge_offset_y_mobile.SIZE || 0}}{{UNIT}});',
688
+ ],
689
+ ]
690
+ );
691
+ $this->end_popover();
692
+
693
+ $this->add_responsive_control(
694
+ 'badge_padding',
695
+ [
696
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
697
+ 'type' => Controls_Manager::DIMENSIONS,
698
+ 'size_units' => [ 'px', 'em', '%' ],
699
+ 'selectors' => [
700
+ '{{WRAPPER}} .ha-badge' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
701
+ ],
702
+ ]
703
+ );
704
+
705
+ $this->add_control(
706
+ 'badge_color',
707
+ [
708
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
709
+ 'type' => Controls_Manager::COLOR,
710
+ 'selectors' => [
711
+ '{{WRAPPER}} .ha-badge' => 'color: {{VALUE}};',
712
+ ],
713
+ ]
714
+ );
715
+
716
+ $this->add_control(
717
+ 'badge_bg_color',
718
+ [
719
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
720
+ 'type' => Controls_Manager::COLOR,
721
+ 'selectors' => [
722
+ '{{WRAPPER}} .ha-badge' => 'background-color: {{VALUE}};',
723
+ ],
724
+ ]
725
+ );
726
+
727
+ $this->add_group_control(
728
+ Group_Control_Border::get_type(),
729
+ [
730
+ 'name' => 'badge_border',
731
+ 'selector' => '{{WRAPPER}} .ha-badge',
732
+ ]
733
+ );
734
+
735
+ $this->add_responsive_control(
736
+ 'badge_border_radius',
737
+ [
738
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
739
+ 'type' => Controls_Manager::DIMENSIONS,
740
+ 'size_units' => [ 'px', '%' ],
741
+ 'selectors' => [
742
+ '{{WRAPPER}} .ha-badge' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
743
+ ],
744
+ ]
745
+ );
746
+
747
+ $this->add_group_control(
748
+ Group_Control_Box_Shadow::get_type(),
749
+ [
750
+ 'name' => 'badge_box_shadow',
751
+ 'exclude' => [
752
+ 'box_shadow_position',
753
+ ],
754
+ 'selector' => '{{WRAPPER}} .ha-badge',
755
+ ]
756
+ );
757
+
758
+ $this->add_group_control(
759
+ Group_Control_Typography::get_type(),
760
+ [
761
+ 'name' => 'badge_typography',
762
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
763
+ 'exclude' => [
764
+ 'line_height'
765
+ ],
766
+ 'default' => [
767
+ 'font_size' => ['']
768
+ ],
769
+ 'selector' => '{{WRAPPER}} .ha-badge',
770
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
771
+ ]
772
+ );
773
+
774
+ $this->end_controls_section();
775
+
776
+ $this->start_controls_section(
777
+ '_section_style_content',
778
+ [
779
+ 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
780
+ 'tab' => Controls_Manager::TAB_STYLE,
781
+ ]
782
+ );
783
+
784
+ $this->add_responsive_control(
785
+ 'content_padding',
786
+ [
787
+ 'label' => __( 'Content Padding', 'happy-elementor-addons' ),
788
+ 'type' => Controls_Manager::DIMENSIONS,
789
+ 'size_units' => [ 'px', 'em', '%' ],
790
+ 'selectors' => [
791
+ '{{WRAPPER}} .ha-card-body' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
792
+ ],
793
+ ]
794
+ );
795
+
796
+ $this->add_control(
797
+ '_heading_title',
798
+ [
799
+ 'type' => Controls_Manager::HEADING,
800
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
801
+ 'separator' => 'before'
802
+ ]
803
+ );
804
+
805
+ $this->add_responsive_control(
806
+ 'title_spacing',
807
+ [
808
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
809
+ 'type' => Controls_Manager::SLIDER,
810
+ 'size_units' => ['px'],
811
+ 'selectors' => [
812
+ '{{WRAPPER}} .ha-card-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
813
+ ],
814
+ ]
815
+ );
816
+
817
+ $this->add_control(
818
+ 'title_color',
819
+ [
820
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
821
+ 'type' => Controls_Manager::COLOR,
822
+ 'selectors' => [
823
+ '{{WRAPPER}} .ha-card-title' => 'color: {{VALUE}}',
824
+ ],
825
+ ]
826
+ );
827
+
828
+ $this->add_group_control(
829
+ Group_Control_Typography::get_type(),
830
+ [
831
+ 'name' => 'title_typography',
832
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
833
+ 'selector' => '{{WRAPPER}} .ha-card-title',
834
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
835
+ ]
836
+ );
837
+
838
+ $this->add_control(
839
+ '_heading_description',
840
+ [
841
+ 'type' => Controls_Manager::HEADING,
842
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
843
+ 'separator' => 'before'
844
+ ]
845
+ );
846
+
847
+ $this->add_responsive_control(
848
+ 'description_spacing',
849
+ [
850
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
851
+ 'type' => Controls_Manager::SLIDER,
852
+ 'size_units' => ['px'],
853
+ 'selectors' => [
854
+ '{{WRAPPER}} .ha-card-text' => 'margin-bottom: {{SIZE}}{{UNIT}};',
855
+ ],
856
+ ]
857
+ );
858
+
859
+ $this->add_control(
860
+ 'description_color',
861
+ [
862
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
863
+ 'type' => Controls_Manager::COLOR,
864
+ 'selectors' => [
865
+ '{{WRAPPER}} .ha-card-text' => 'color: {{VALUE}};',
866
+ ],
867
+ ]
868
+ );
869
+
870
+ $this->add_group_control(
871
+ Group_Control_Typography::get_type(),
872
+ [
873
+ 'name' => 'description_typography',
874
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
875
+ 'selector' => '{{WRAPPER}} .ha-card-text',
876
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
877
+ ]
878
+ );
879
+
880
+ $this->end_controls_section();
881
+
882
+ $this->start_controls_section(
883
+ '_section_style_button',
884
+ [
885
+ 'label' => __( 'Button', 'happy-elementor-addons' ),
886
+ 'tab' => Controls_Manager::TAB_STYLE,
887
+ ]
888
+ );
889
+
890
+ $this->add_responsive_control(
891
+ 'button_padding',
892
+ [
893
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
894
+ 'type' => Controls_Manager::DIMENSIONS,
895
+ 'size_units' => [ 'px', 'em', '%' ],
896
+ 'selectors' => [
897
+ '{{WRAPPER}} .ha-btn' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
898
+ ],
899
+ ]
900
+ );
901
+
902
+ $this->add_group_control(
903
+ Group_Control_Typography::get_type(),
904
+ [
905
+ 'name' => 'button_typography',
906
+ 'selector' => '{{WRAPPER}} .ha-btn',
907
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_4,
908
+ ]
909
+ );
910
+
911
+ $this->add_group_control(
912
+ Group_Control_Border::get_type(),
913
+ [
914
+ 'name' => 'button_border',
915
+ 'selector' => '{{WRAPPER}} .ha-btn',
916
+ ]
917
+ );
918
+
919
+ $this->add_control(
920
+ 'button_border_radius',
921
+ [
922
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
923
+ 'type' => Controls_Manager::DIMENSIONS,
924
+ 'size_units' => [ 'px', '%' ],
925
+ 'selectors' => [
926
+ '{{WRAPPER}} .ha-btn' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
927
+ ],
928
+ ]
929
+ );
930
+
931
+ $this->add_group_control(
932
+ Group_Control_Box_Shadow::get_type(),
933
+ [
934
+ 'name' => 'button_box_shadow',
935
+ 'selector' => '{{WRAPPER}} .ha-btn',
936
+ ]
937
+ );
938
+
939
+ $this->add_control(
940
+ 'hr',
941
+ [
942
+ 'type' => Controls_Manager::DIVIDER,
943
+ 'style' => 'thick',
944
+ ]
945
+ );
946
+
947
+ $this->start_controls_tabs( '_tabs_button' );
948
+
949
+ $this->start_controls_tab(
950
+ '_tab_button_normal',
951
+ [
952
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
953
+ ]
954
+ );
955
+
956
+ $this->add_control(
957
+ 'button_color',
958
+ [
959
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
960
+ 'type' => Controls_Manager::COLOR,
961
+ 'default' => '',
962
+ 'selectors' => [
963
+ '{{WRAPPER}} .ha-btn' => 'color: {{VALUE}};',
964
+ ],
965
+ ]
966
+ );
967
+
968
+ $this->add_control(
969
+ 'button_bg_color',
970
+ [
971
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
972
+ 'type' => Controls_Manager::COLOR,
973
+ 'selectors' => [
974
+ '{{WRAPPER}} .ha-btn' => 'background-color: {{VALUE}};',
975
+ ],
976
+ ]
977
+ );
978
+
979
+ $this->end_controls_tab();
980
+
981
+ $this->start_controls_tab(
982
+ '_tab_button_hover',
983
+ [
984
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
985
+ ]
986
+ );
987
+
988
+ $this->add_control(
989
+ 'button_hover_color',
990
+ [
991
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
992
+ 'type' => Controls_Manager::COLOR,
993
+ 'selectors' => [
994
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'color: {{VALUE}};',
995
+ ],
996
+ ]
997
+ );
998
+
999
+ $this->add_control(
1000
+ 'button_hover_bg_color',
1001
+ [
1002
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
1003
+ 'type' => Controls_Manager::COLOR,
1004
+ 'selectors' => [
1005
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'background-color: {{VALUE}};',
1006
+ ],
1007
+ ]
1008
+ );
1009
+
1010
+ $this->add_control(
1011
+ 'button_hover_border_color',
1012
+ [
1013
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
1014
+ 'type' => Controls_Manager::COLOR,
1015
+ 'condition' => [
1016
+ 'button_border_border!' => '',
1017
+ ],
1018
+ 'selectors' => [
1019
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'border-color: {{VALUE}};',
1020
+ ],
1021
+ ]
1022
+ );
1023
+
1024
+ $this->end_controls_tab();
1025
+ $this->end_controls_tabs();
1026
+
1027
+ $this->end_controls_section();
1028
+ }
1029
 
1030
  protected function render() {
1031
+ $settings = $this->get_settings_for_display();
1032
+
1033
+ $this->add_inline_editing_attributes( 'badge_text', 'none' );
1034
+ $this->add_render_attribute(
1035
+ 'badge_text',
1036
+ 'class',
1037
+ ['ha-badge', sprintf( 'ha-badge--%s', esc_attr( $settings['badge_position'] ) )]
1038
+ );
1039
+
1040
+ $this->add_inline_editing_attributes( 'title', 'basic' );
1041
+ $this->add_render_attribute( 'title', 'class', 'ha-card-title' );
1042
+
1043
+ $this->add_inline_editing_attributes( 'description', 'intermediate' );
1044
+ $this->add_render_attribute( 'description', 'class', 'ha-card-text' );
1045
+ ?>
1046
+
1047
+ <?php if ( $settings['image']['url'] || $settings['image']['id'] ) : ?>
1048
+ <figure class="ha-card-figure">
1049
+ <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
1050
+ <?php if ( $settings['badge_text'] ) : ?>
1051
+ <div <?php echo $this->get_render_attribute_string( 'badge_text' ); ?>><?php echo esc_html( $settings['badge_text'] ); ?></div>
1052
+ <?php endif; ?>
1053
+ </figure>
1054
+ <?php endif; ?>
1055
+
1056
+ <div class="ha-card-body">
1057
+
1058
+ <?php
1059
+ if ( $settings['title' ] ) :
1060
+ printf( '<%1$s %2$s>%3$s</%1$s>',
1061
+ tag_escape( $settings['title_tag'] ),
1062
+ $this->get_render_attribute_string( 'title' ),
1063
+ ha_kses_basic( $settings['title' ] )
1064
+ );
1065
+ endif;
1066
+ ?>
1067
+
1068
+ <?php if ( $settings['description'] ) : ?>
1069
+ <div <?php echo $this->get_render_attribute_string( 'description' ); ?>>
1070
+ <p><?php echo ha_kses_intermediate( $settings['description'] ); ?></p>
1071
+ </div>
1072
+ <?php endif; ?>
1073
+
1074
+ <?php $this->render_icon_button( [ 'class' => 'ha-btn' ] ); ?>
1075
+ </div>
1076
+ <?php
1077
+ }
1078
+
1079
+ public function _content_template() {
1080
+ ?>
1081
+ <#
1082
+ view.addInlineEditingAttributes( 'badge_text', 'none' );
1083
+ view.addRenderAttribute(
1084
+ 'badge_text',
1085
+ 'class',
1086
+ ['ha-badge', 'ha-badge--' + settings.badge_position]
1087
+ );
1088
+
1089
+ view.addInlineEditingAttributes( 'title', 'basic' );
1090
+ view.addRenderAttribute( 'title', 'class', 'ha-card-title' );
1091
+
1092
+ view.addInlineEditingAttributes( 'description', 'intermediate' );
1093
+ view.addRenderAttribute( 'description', 'class', 'ha-card-text' );
1094
+
1095
+ if ( settings.image.url || settings.image.id ) {
1096
+ var image = {
1097
+ id: settings.image.id,
1098
+ url: settings.image.url,
1099
+ size: settings.thumbnail_size,
1100
+ dimension: settings.thumbnail_custom_dimension,
1101
+ model: view.getEditModel()
1102
+ };
1103
+
1104
+ var image_url = elementor.imagesManager.getImageUrl( image ); #>
1105
+ <figure class="ha-card-figure">
1106
+ <img class="elementor-animation-{{settings.hover_animation}}" src="{{ image_url }}">
1107
+ <# if (settings.badge_text) { #>
1108
+ <div {{{ view.getRenderAttributeString( 'badge_text' ) }}}>{{ settings.badge_text }}</div>
1109
+ <# } #>
1110
+ </figure>
1111
+ <# } #>
1112
+
1113
+ <div class="ha-card-body">
1114
+ <# if (settings.title) { #>
1115
+ <{{ settings.title_tag }} {{{ view.getRenderAttributeString( 'title' ) }}}>{{{ settings.title }}}</{{ settings.title_tag }}>
1116
+ <# } #>
1117
+
1118
+ <# if (settings.description) { #>
1119
+ <div {{{ view.getRenderAttributeString( 'description' ) }}}>
1120
+ <p>{{{ settings.description }}}</p>
1121
+ </div>
1122
+ <# } #>
1123
+
1124
+ <# print( ha.getButtonWithIcon( view, { class: 'ha-btn' } ) ) #>
1125
+ </div>
1126
+ <?php
1127
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1128
  }
widgets/carousel/widget.php CHANGED
@@ -8,10 +8,8 @@ namespace Happy_Addons\Elementor\Widget;
8
 
9
  use Elementor\Group_Control_Background;
10
  use Elementor\Repeater;
11
- use Elementor\Control_Media;
12
  use Elementor\Controls_Manager;
13
  use Elementor\Group_Control_Border;
14
- use Elementor\Group_Control_Box_Shadow;
15
  use Elementor\Group_Control_Image_Size;
16
  use Elementor\Group_Control_Typography;
17
  use Elementor\Scheme_Typography;
@@ -21,774 +19,798 @@ defined( 'ABSPATH' ) || die();
21
 
22
  class Carousel extends Base {
23
 
24
- /**
25
- * Get widget title.
26
- *
27
- * @since 1.0.0
28
- * @access public
29
- *
30
- * @return string Widget title.
31
- */
32
- public function get_title() {
33
- return __( 'Carousel', 'happy-elementor-addons' );
34
- }
35
-
36
- public function get_custom_help_url() {
37
- return 'https://happyaddons.com/docs/happy-addons-for-elementor/widgets/carousel/';
38
- }
39
-
40
- /**
41
- * Get widget icon.
42
- *
43
- * @since 1.0.0
44
- * @access public
45
- *
46
- * @return string Widget icon.
47
- */
48
- public function get_icon() {
49
- return 'hm hm-carousal';
50
- }
51
-
52
- public function get_keywords() {
53
- return [ 'slider', 'image', 'gallery', 'carousel' ];
54
- }
55
 
56
  protected function register_content_controls() {
57
- $this->start_controls_section(
58
- '_section_slides',
59
- [
60
- 'label' => __( 'Slides', 'happy-elementor-addons' ),
61
- 'tab' => Controls_Manager::TAB_CONTENT,
62
- ]
63
- );
64
-
65
- $repeater = new Repeater();
66
-
67
- $repeater->add_control(
68
- 'image',
69
- [
70
- 'type' => Controls_Manager::MEDIA,
71
- 'label' => __( 'Image', 'happy-elementor-addons' ),
72
- 'default' => [
73
- 'url' => Utils::get_placeholder_image_src(),
74
- ],
75
- 'dynamic' => [
76
- 'active' => true,
77
- ]
78
- ]
79
- );
80
-
81
- $repeater->add_control(
82
- 'title',
83
- [
84
- 'type' => Controls_Manager::TEXT,
85
- 'label_block' => true,
86
- 'label' => __( 'Title & Subtitle', 'happy-elementor-addons' ),
87
- 'placeholder' => __( 'Type title here', 'happy-elementor-addons' ),
88
- 'dynamic' => [
89
- 'active' => true,
90
- ]
91
- ]
92
- );
93
-
94
- $repeater->add_control(
95
- 'subtitle',
96
- [
97
- 'type' => Controls_Manager::TEXTAREA,
98
- 'label_block' => true,
99
- 'show_label' => false,
100
- 'placeholder' => __( 'Type subtitle here', 'happy-elementor-addons' ),
101
- 'dynamic' => [
102
- 'active' => true,
103
- ]
104
- ]
105
- );
106
-
107
- $this->add_control(
108
- 'slides',
109
- [
110
- 'show_label' => false,
111
- 'type' => Controls_Manager::REPEATER,
112
- 'fields' => $repeater->get_controls(),
113
- 'title_field' => '<# print(title || "Carousel Item"); #>',
114
- 'default' => [
115
- [
116
- 'image' => [
117
- 'url' => Utils::get_placeholder_image_src(),
118
- ],
119
- ],
120
- [
121
- 'image' => [
122
- 'url' => Utils::get_placeholder_image_src(),
123
- ],
124
- ],
125
- [
126
- 'image' => [
127
- 'url' => Utils::get_placeholder_image_src(),
128
- ],
129
- ],
130
- [
131
- 'image' => [
132
- 'url' => Utils::get_placeholder_image_src(),
133
- ],
134
- ],
135
- [
136
- 'image' => [
137
- 'url' => Utils::get_placeholder_image_src(),
138
- ],
139
- ],
140
- [
141
- 'image' => [
142
- 'url' => Utils::get_placeholder_image_src(),
143
- ],
144
- ],
145
- [
146
- 'image' => [
147
- 'url' => Utils::get_placeholder_image_src(),
148
- ],
149
- ]
150
- ]
151
- ]
152
- );
153
-
154
- $this->add_group_control(
155
- Group_Control_Image_Size::get_type(),
156
- [
157
- 'name' => 'thumbnail',
158
- 'default' => 'medium_large',
159
- 'separator' => 'before',
160
- 'exclude' => [
161
- 'custom'
162
- ]
163
- ]
164
- );
165
-
166
- $this->end_controls_section();
167
-
168
- $this->start_controls_section(
169
- '_section_settings',
170
- [
171
- 'label' => __( 'Settings', 'happy-elementor-addons' ),
172
- 'tab' => Controls_Manager::TAB_CONTENT,
173
- ]
174
- );
175
-
176
- $this->add_control(
177
- 'animation_speed',
178
- [
179
- 'label' => __( 'Animation Speed', 'happy-elementor-addons' ),
180
- 'type' => Controls_Manager::NUMBER,
181
- 'min' => 100,
182
- 'step' => 10,
183
- 'max' => 10000,
184
- 'default' => 300,
185
- 'description' => __( 'Slide speed in milliseconds', 'happy-elementor-addons' ),
186
- 'frontend_available' => true,
187
- ]
188
- );
189
-
190
- $this->add_control(
191
- 'autoplay',
192
- [
193
- 'label' => __( 'Autoplay?', 'happy-elementor-addons' ),
194
- 'type' => Controls_Manager::SWITCHER,
195
- 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
196
- 'label_off' => __( 'No', 'happy-elementor-addons' ),
197
- 'return_value' => 'yes',
198
- 'default' => 'yes',
199
- 'frontend_available' => true,
200
- ]
201
- );
202
-
203
- $this->add_control(
204
- 'autoplay_speed',
205
- [
206
- 'label' => __( 'Autoplay Speed', 'happy-elementor-addons' ),
207
- 'type' => Controls_Manager::NUMBER,
208
- 'min' => 100,
209
- 'step' => 100,
210
- 'max' => 10000,
211
- 'default' => 3000,
212
- 'description' => __( 'Autoplay speed in milliseconds', 'happy-elementor-addons' ),
213
- 'condition' => [
214
- 'autoplay' => 'yes'
215
- ],
216
- 'frontend_available' => true,
217
- ]
218
- );
219
-
220
- $this->add_control(
221
- 'loop',
222
- [
223
- 'label' => __( 'Infinite Loop?', 'happy-elementor-addons' ),
224
- 'type' => Controls_Manager::SWITCHER,
225
- 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
226
- 'label_off' => __( 'No', 'happy-elementor-addons' ),
227
- 'return_value' => 'yes',
228
- 'default' => 'yes',
229
- 'frontend_available' => true,
230
- ]
231
- );
232
-
233
- $this->add_control(
234
- 'center',
235
- [
236
- 'label' => __( 'Center Mode?', 'happy-elementor-addons' ),
237
- 'type' => Controls_Manager::SWITCHER,
238
- 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
239
- 'label_off' => __( 'No', 'happy-elementor-addons' ),
240
- 'return_value' => 'yes',
241
- 'description' => __( 'Best works with odd number of slides (Slides To Show) and loop (Infinite Loop)', 'happy-elementor-addons' ),
242
- 'frontend_available' => true,
243
- 'style_transfer' => true,
244
- ]
245
- );
246
-
247
- $this->add_control(
248
- 'vertical',
249
- [
250
- 'label' => __( 'Vertical Mode?', 'happy-elementor-addons' ),
251
- 'type' => Controls_Manager::SWITCHER,
252
- 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
253
- 'label_off' => __( 'No', 'happy-elementor-addons' ),
254
- 'return_value' => 'yes',
255
- 'frontend_available' => true,
256
- 'style_transfer' => true,
257
- ]
258
- );
259
-
260
- $this->add_control(
261
- 'navigation',
262
- [
263
- 'label' => __( 'Navigation', 'happy-elementor-addons' ),
264
- 'type' => Controls_Manager::SELECT,
265
- 'options' => [
266
- 'none' => __( 'None', 'happy-elementor-addons' ),
267
- 'arrow' => __( 'Arrow', 'happy-elementor-addons' ),
268
- 'dots' => __( 'Dots', 'happy-elementor-addons' ),
269
- 'both' => __( 'Arrow & Dots', 'happy-elementor-addons' ),
270
- ],
271
- 'default' => 'arrow',
272
- 'frontend_available' => true,
273
- 'style_transfer' => true,
274
- ]
275
- );
276
-
277
- $this->add_responsive_control(
278
- 'slides_to_show',
279
- [
280
- 'label' => __( 'Slides To Show', 'happy-elementor-addons' ),
281
- 'type' => Controls_Manager::SELECT,
282
- 'options' => [
283
- 1 => __( '1 Slide', 'happy-elementor-addons' ),
284
- 2 => __( '2 Slides', 'happy-elementor-addons' ),
285
- 3 => __( '3 Slides', 'happy-elementor-addons' ),
286
- 4 => __( '4 Slides', 'happy-elementor-addons' ),
287
- 5 => __( '5 Slides', 'happy-elementor-addons' ),
288
- 6 => __( '6 Slides', 'happy-elementor-addons' ),
289
- ],
290
- 'desktop_default' => 4,
291
- 'tablet_default' => 3,
292
- 'mobile_default' => 2,
293
- 'frontend_available' => true,
294
- 'style_transfer' => true,
295
- ]
296
- );
297
-
298
- $this->end_controls_section();
299
- }
300
-
301
- protected function register_style_controls() {
302
- $this->start_controls_section(
303
- '_section_style_item',
304
- [
305
- 'label' => __( 'Carousel Item', 'happy-elementor-addons' ),
306
- 'tab' => Controls_Manager::TAB_STYLE,
307
- ]
308
- );
309
-
310
- $this->add_responsive_control(
311
- 'item_spacing',
312
- [
313
- 'label' => __( 'Slide Spacing (px)', 'happy-elementor-addons' ),
314
- 'type' => Controls_Manager::SLIDER,
315
- 'size_units' => ['px'],
316
- 'selectors' => [
317
- '{{WRAPPER}} .slick-slider:not(.slick-vertical) .slick-slide' => 'padding-right: {{SIZE}}{{UNIT}}; padding-left: {{SIZE}}{{UNIT}};',
318
- '{{WRAPPER}} .slick-slider.slick-vertical .slick-slide' => 'padding-top: {{SIZE}}{{UNIT}}; padding-bottom: {{SIZE}}{{UNIT}};',
319
- ],
320
- ]
321
- );
322
-
323
- $this->add_responsive_control(
324
- 'item_border_radius',
325
- [
326
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
327
- 'type' => Controls_Manager::DIMENSIONS,
328
- 'size_units' => [ 'px', '%' ],
329
- 'selectors' => [
330
- '{{WRAPPER}} .ha-slick-item' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}; overflow: hidden;',
331
- ],
332
- ]
333
- );
334
-
335
- $this->end_controls_section();
336
-
337
- $this->start_controls_section(
338
- '_section_style_content',
339
- [
340
- 'label' => __( 'Slide Content', 'happy-elementor-addons' ),
341
- 'tab' => Controls_Manager::TAB_STYLE,
342
- ]
343
- );
344
-
345
- $this->add_responsive_control(
346
- 'content_padding',
347
- [
348
- 'label' => __( 'Content Padding', 'happy-elementor-addons' ),
349
- 'type' => Controls_Manager::DIMENSIONS,
350
- 'size_units' => [ 'px', 'em', '%' ],
351
- 'selectors' => [
352
- '{{WRAPPER}} .ha-slick-content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
353
- ],
354
- ]
355
- );
356
-
357
- $this->add_group_control(
358
- Group_Control_Background::get_type(),
359
- [
360
- 'name' => 'content_background',
361
- 'selector' => '{{WRAPPER}} .ha-slick-content',
362
- 'exclude' => [
363
- 'image'
364
- ]
365
- ]
366
- );
367
-
368
- $this->add_control(
369
- '_heading_title',
370
- [
371
- 'type' => Controls_Manager::HEADING,
372
- 'label' => __( 'Title', 'happy-elementor-addons' ),
373
- 'separator' => 'before'
374
- ]
375
- );
376
-
377
- $this->add_responsive_control(
378
- 'title_spacing',
379
- [
380
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
381
- 'type' => Controls_Manager::SLIDER,
382
- 'size_units' => ['px'],
383
- 'selectors' => [
384
- '{{WRAPPER}} .ha-slick-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
385
- ],
386
- ]
387
- );
388
-
389
- $this->add_control(
390
- 'title_color',
391
- [
392
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
393
- 'type' => Controls_Manager::COLOR,
394
- 'selectors' => [
395
- '{{WRAPPER}} .ha-slick-title' => 'color: {{VALUE}}',
396
- ],
397
- ]
398
- );
399
-
400
- $this->add_group_control(
401
- Group_Control_Typography::get_type(),
402
- [
403
- 'name' => 'title',
404
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
405
- 'selector' => '{{WRAPPER}} .ha-slick-title',
406
- 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
407
- ]
408
- );
409
-
410
- $this->add_control(
411
- '_heading_subtitle',
412
- [
413
- 'type' => Controls_Manager::HEADING,
414
- 'label' => __( 'Subtitle', 'happy-elementor-addons' ),
415
- 'separator' => 'before'
416
- ]
417
- );
418
-
419
- $this->add_responsive_control(
420
- 'subtitle_spacing',
421
- [
422
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
423
- 'type' => Controls_Manager::SLIDER,
424
- 'size_units' => ['px'],
425
- 'selectors' => [
426
- '{{WRAPPER}} .ha-slick-subtitle' => 'margin-bottom: {{SIZE}}{{UNIT}};',
427
- ],
428
- ]
429
- );
430
-
431
- $this->add_control(
432
- 'subtitle_color',
433
- [
434
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
435
- 'type' => Controls_Manager::COLOR,
436
- 'selectors' => [
437
- '{{WRAPPER}} .ha-slick-subtitle' => 'color: {{VALUE}}',
438
- ],
439
- ]
440
- );
441
-
442
- $this->add_group_control(
443
- Group_Control_Typography::get_type(),
444
- [
445
- 'name' => 'subtitle',
446
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
447
- 'selector' => '{{WRAPPER}} .ha-slick-subtitle',
448
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
449
- ]
450
- );
451
-
452
- $this->end_controls_section();
453
-
454
- $this->start_controls_section(
455
- '_section_style_arrow',
456
- [
457
- 'label' => __( 'Navigation - Arrow', 'happy-elementor-addons' ),
458
- 'tab' => Controls_Manager::TAB_STYLE,
459
- ]
460
- );
461
-
462
- $this->add_control(
463
- 'arrow_position_toggle',
464
- [
465
- 'label' => __( 'Position', 'happy-elementor-addons' ),
466
- 'type' => Controls_Manager::POPOVER_TOGGLE,
467
- 'label_off' => __( 'None', 'happy-elementor-addons' ),
468
- 'label_on' => __( 'Custom', 'happy-elementor-addons' ),
469
- 'return_value' => 'yes',
470
- ]
471
- );
472
-
473
- $this->start_popover();
474
-
475
- $this->add_responsive_control(
476
- 'arrow_position_y',
477
- [
478
- 'label' => __( 'Vertical', 'happy-elementor-addons' ),
479
- 'type' => Controls_Manager::SLIDER,
480
- 'size_units' => ['px'],
481
- 'condition' => [
482
- 'arrow_position_toggle' => 'yes'
483
- ],
484
- 'range' => [
485
- 'px' => [
486
- 'min' => 0,
487
- 'max' => 500,
488
- ],
489
- ],
490
- 'selectors' => [
491
- '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next' => 'top: {{SIZE}}{{UNIT}};',
492
- ],
493
- ]
494
- );
495
-
496
- $this->add_responsive_control(
497
- 'arrow_position_x',
498
- [
499
- 'label' => __( 'Horizontal', 'happy-elementor-addons' ),
500
- 'type' => Controls_Manager::SLIDER,
501
- 'size_units' => ['px'],
502
- 'condition' => [
503
- 'arrow_position_toggle' => 'yes'
504
- ],
505
- 'range' => [
506
- 'px' => [
507
- 'min' => -100,
508
- 'max' => 250,
509
- ],
510
- ],
511
- 'selectors' => [
512
- '{{WRAPPER}} .slick-prev' => 'left: {{SIZE}}{{UNIT}};',
513
- '{{WRAPPER}} .slick-next' => 'right: {{SIZE}}{{UNIT}};',
514
- ],
515
- ]
516
- );
517
-
518
- $this->end_popover();
519
-
520
- $this->add_group_control(
521
- Group_Control_Border::get_type(),
522
- [
523
- 'name' => 'arrow_border',
524
- 'selector' => '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next',
525
- ]
526
- );
527
-
528
- $this->add_responsive_control(
529
- 'arrow_border_radius',
530
- [
531
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
532
- 'type' => Controls_Manager::DIMENSIONS,
533
- 'size_units' => [ 'px', '%' ],
534
- 'selectors' => [
535
- '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}; overflow: hidden;',
536
- ],
537
- ]
538
- );
539
-
540
- $this->start_controls_tabs( '_tabs_arrow' );
541
-
542
- $this->start_controls_tab(
543
- '_tab_arrow_normal',
544
- [
545
- 'label' => __( 'Normal', 'happy-elementor-addons' ),
546
- ]
547
- );
548
-
549
- $this->add_control(
550
- 'arrow_color',
551
- [
552
- 'label' => __( 'Color', 'happy-elementor-addons' ),
553
- 'type' => Controls_Manager::COLOR,
554
- 'default' => '',
555
- 'selectors' => [
556
- '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next' => 'color: {{VALUE}};',
557
- ],
558
- ]
559
- );
560
-
561
- $this->add_control(
562
- 'arrow_bg_color',
563
- [
564
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
565
- 'type' => Controls_Manager::COLOR,
566
- 'selectors' => [
567
- '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next' => 'background-color: {{VALUE}};',
568
- ],
569
- ]
570
- );
571
-
572
- $this->end_controls_tab();
573
-
574
- $this->start_controls_tab(
575
- '_tab_arrow_hover',
576
- [
577
- 'label' => __( 'Hover', 'happy-elementor-addons' ),
578
- ]
579
- );
580
-
581
- $this->add_control(
582
- 'arrow_hover_color',
583
- [
584
- 'label' => __( 'Color', 'happy-elementor-addons' ),
585
- 'type' => Controls_Manager::COLOR,
586
- 'selectors' => [
587
- '{{WRAPPER}} .slick-prev:hover, {{WRAPPER}} .slick-next:hover' => 'color: {{VALUE}};',
588
- ],
589
- ]
590
- );
591
-
592
- $this->add_control(
593
- 'arrow_hover_bg_color',
594
- [
595
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
596
- 'type' => Controls_Manager::COLOR,
597
- 'selectors' => [
598
- '{{WRAPPER}} .slick-prev:hover, {{WRAPPER}} .slick-next:hover' => 'background-color: {{VALUE}};',
599
- ],
600
- ]
601
- );
602
-
603
- $this->add_control(
604
- 'arrow_hover_border_color',
605
- [
606
- 'label' => __( 'Border Color', 'happy-elementor-addons' ),
607
- 'type' => Controls_Manager::COLOR,
608
- 'condition' => [
609
- 'arrow_border_border!' => '',
610
- ],
611
- 'selectors' => [
612
- '{{WRAPPER}} .slick-prev:hover, {{WRAPPER}} .slick-next:hover' => 'border-color: {{VALUE}};',
613
- ],
614
- ]
615
- );
616
-
617
- $this->end_controls_tab();
618
- $this->end_controls_tabs();
619
-
620
- $this->end_controls_section();
621
-
622
- $this->start_controls_section(
623
- '_section_style_dots',
624
- [
625
- 'label' => __( 'Navigation - Dots', 'happy-elementor-addons' ),
626
- 'tab' => Controls_Manager::TAB_STYLE,
627
- ]
628
- );
629
-
630
- $this->add_responsive_control(
631
- 'dots_nav_position_y',
632
- [
633
- 'label' => __( 'Vertical Position', 'happy-elementor-addons' ),
634
- 'type' => Controls_Manager::SLIDER,
635
- 'size_units' => ['px'],
636
- 'range' => [
637
- 'px' => [
638
- 'min' => -100,
639
- 'max' => 500,
640
- ],
641
- ],
642
- 'selectors' => [
643
- '{{WRAPPER}} .slick-dots' => 'bottom: {{SIZE}}{{UNIT}};',
644
- ],
645
- ]
646
- );
647
-
648
- $this->add_responsive_control(
649
- 'dots_nav_spacing',
650
- [
651
- 'label' => __( 'Spacing', 'happy-elementor-addons' ),
652
- 'type' => Controls_Manager::SLIDER,
653
- 'size_units' => ['px'],
654
- 'selectors' => [
655
- '{{WRAPPER}} .slick-dots li' => 'margin-right: calc({{SIZE}}{{UNIT}} / 2); margin-left: calc({{SIZE}}{{UNIT}} / 2);',
656
- ],
657
- ]
658
- );
659
-
660
- $this->add_responsive_control(
661
- 'dots_nav_align',
662
- [
663
- 'label' => __( 'Alignment', 'happy-elementor-addons' ),
664
- 'type' => Controls_Manager::CHOOSE,
665
- 'label_block' => false,
666
- 'options' => [
667
- 'left' => [
668
- 'title' => __( 'Left', 'happy-elementor-addons' ),
669
- 'icon' => 'eicon-h-align-left',
670
- ],
671
- 'center' => [
672
- 'title' => __( 'Center', 'happy-elementor-addons' ),
673
- 'icon' => 'eicon-h-align-center',
674
- ],
675
- 'right' => [
676
- 'title' => __( 'Right', 'happy-elementor-addons' ),
677
- 'icon' => 'eicon-h-align-right',
678
- ],
679
- ],
680
- 'toggle' => true,
681
- 'selectors' => [
682
- '{{WRAPPER}} .slick-dots' => 'text-align: {{VALUE}}'
683
- ]
684
- ]
685
- );
686
-
687
- $this->start_controls_tabs( '_tabs_dots' );
688
- $this->start_controls_tab(
689
- '_tab_dots_normal',
690
- [
691
- 'label' => __( 'Normal', 'happy-elementor-addons' ),
692
- ]
693
- );
694
-
695
- $this->add_control(
696
- 'dots_nav_color',
697
- [
698
- 'label' => __( 'Color', 'happy-elementor-addons' ),
699
- 'type' => Controls_Manager::COLOR,
700
- 'selectors' => [
701
- '{{WRAPPER}} .slick-dots li button:before' => 'color: {{VALUE}};',
702
- ],
703
- ]
704
- );
705
-
706
- $this->end_controls_tab();
707
-
708
- $this->start_controls_tab(
709
- '_tab_dots_hover',
710
- [
711
- 'label' => __( 'Hover', 'happy-elementor-addons' ),
712
- ]
713
- );
714
-
715
- $this->add_control(
716
- 'dots_nav_hover_color',
717
- [
718
- 'label' => __( 'Color', 'happy-elementor-addons' ),
719
- 'type' => Controls_Manager::COLOR,
720
- 'selectors' => [
721
- '{{WRAPPER}} .slick-dots li button:hover:before' => 'color: {{VALUE}};',
722
- ],
723
- ]
724
- );
725
-
726
- $this->end_controls_tab();
727
-
728
- $this->start_controls_tab(
729
- '_tab_dots_active',
730
- [
731
- 'label' => __( 'Active', 'happy-elementor-addons' ),
732
- ]
733
- );
734
-
735
- $this->add_control(
736
- 'dots_nav_active_color',
737
- [
738
- 'label' => __( 'Color', 'happy-elementor-addons' ),
739
- 'type' => Controls_Manager::COLOR,
740
- 'selectors' => [
741
- '{{WRAPPER}} .slick-dots .slick-active button:before' => 'color: {{VALUE}};',
742
- ],
743
- ]
744
- );
745
-
746
- $this->end_controls_tab();
747
- $this->end_controls_tabs();
748
-
749
- $this->end_controls_section();
750
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
751
 
752
  protected function render() {
753
- $settings = $this->get_settings_for_display();
754
-
755
- if ( empty( $settings['slides'] ) ) {
756
- return;
757
- }
758
- ?>
759
-
760
- <div class="hajs-slick ha-slick ha-slick--carousel">
761
-
762
- <?php foreach ( $settings['slides'] as $slide ) :
763
- $image = wp_get_attachment_image_url( $slide['image']['id'], $settings['thumbnail_size'] );
764
- if ( ! $image ) {
765
- $image = $slide['image']['url'];
766
- }
767
- ?>
768
-
769
- <div class="ha-slick-slide">
770
- <div class="ha-slick-item">
771
- <?php if ( $image ) : ?>
772
- <img class="ha-slick-img" src="<?php echo esc_url( $image ); ?>" alt="<?php echo esc_attr( $slide['title'] ); ?>">
773
- <?php endif; ?>
774
-
775
- <?php if ( $slide['title'] || $slide['subtitle'] ) : ?>
776
- <div class="ha-slick-content">
777
- <?php if ( $slide['title'] ) : ?>
778
- <h2 class="ha-slick-title"><?php echo ha_kses_basic( $slide['title'] ); ?></h2>
779
- <?php endif; ?>
780
- <?php if ( $slide['subtitle'] ) : ?>
781
- <p class="ha-slick-subtitle"><?php echo ha_kses_basic( $slide['subtitle'] ); ?></p>
782
- <?php endif; ?>
783
- </div>
784
- <?php endif; ?>
785
- </div>
786
- </div>
787
-
788
- <?php endforeach; ?>
789
-
790
- </div>
791
-
792
- <?php
793
- }
 
 
 
 
 
 
 
 
 
 
 
794
  }
8
 
9
  use Elementor\Group_Control_Background;
10
  use Elementor\Repeater;
 
11
  use Elementor\Controls_Manager;
12
  use Elementor\Group_Control_Border;
 
13
  use Elementor\Group_Control_Image_Size;
14
  use Elementor\Group_Control_Typography;
15
  use Elementor\Scheme_Typography;
19
 
20
  class Carousel extends Base {
21
 
22
+ /**
23
+ * Get widget title.
24
+ *
25
+ * @since 1.0.0
26
+ * @access public
27
+ *
28
+ * @return string Widget title.
29
+ */
30
+ public function get_title() {
31
+ return __( 'Carousel', 'happy-elementor-addons' );
32
+ }
33
+
34
+ public function get_custom_help_url() {
35
+ return 'https://happyaddons.com/docs/happy-addons-for-elementor/widgets/carousel/';
36
+ }
37
+
38
+ /**
39
+ * Get widget icon.
40
+ *
41
+ * @since 1.0.0
42
+ * @access public
43
+ *
44
+ * @return string Widget icon.
45
+ */
46
+ public function get_icon() {
47
+ return 'hm hm-carousal';
48
+ }
49
+
50
+ public function get_keywords() {
51
+ return [ 'slider', 'image', 'gallery', 'carousel' ];
52
+ }
53
 
54
  protected function register_content_controls() {
55
+ $this->start_controls_section(
56
+ '_section_slides',
57
+ [
58
+ 'label' => __( 'Slides', 'happy-elementor-addons' ),
59
+ 'tab' => Controls_Manager::TAB_CONTENT,
60
+ ]
61
+ );
62
+
63
+ $repeater = new Repeater();
64
+
65
+ $repeater->add_control(
66
+ 'image',
67
+ [
68
+ 'type' => Controls_Manager::MEDIA,
69
+ 'label' => __( 'Image', 'happy-elementor-addons' ),
70
+ 'default' => [
71
+ 'url' => Utils::get_placeholder_image_src(),
72
+ ],
73
+ 'dynamic' => [
74
+ 'active' => true,
75
+ ]
76
+ ]
77
+ );
78
+
79
+ $repeater->add_control(
80
+ 'title',
81
+ [
82
+ 'type' => Controls_Manager::TEXT,
83
+ 'label_block' => true,
84
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
85
+ 'placeholder' => __( 'Type title here', 'happy-elementor-addons' ),
86
+ 'dynamic' => [
87
+ 'active' => true,
88
+ ]
89
+ ]
90
+ );
91
+
92
+ $repeater->add_control(
93
+ 'subtitle',
94
+ [
95
+ 'label' => __( 'Subtitle', 'happy-elementor-addons' ),
96
+ 'type' => Controls_Manager::TEXTAREA,
97
+ 'label_block' => true,
98
+ 'placeholder' => __( 'Type subtitle here', 'happy-elementor-addons' ),
99
+ 'dynamic' => [
100
+ 'active' => true,
101
+ ]
102
+ ]
103
+ );
104
+
105
+ $repeater->add_control(
106
+ 'link',
107
+ [
108
+ 'label' => __( 'Link', 'happy-elementor-addons' ),
109
+ 'type' => Controls_Manager::URL,
110
+ 'label_block' => true,
111
+ 'placeholder' => 'https://example.com',
112
+ 'dynamic' => [
113
+ 'active' => true,
114
+ ]
115
+ ]
116
+ );
117
+
118
+ $this->add_control(
119
+ 'slides',
120
+ [
121
+ 'show_label' => false,
122
+ 'type' => Controls_Manager::REPEATER,
123
+ 'fields' => $repeater->get_controls(),
124
+ 'title_field' => '<# print(title || "Carousel Item"); #>',
125
+ 'default' => [
126
+ [
127
+ 'image' => [
128
+ 'url' => Utils::get_placeholder_image_src(),
129
+ ],
130
+ ],
131
+ [
132
+ 'image' => [
133
+ 'url' => Utils::get_placeholder_image_src(),
134
+ ],
135
+ ],
136
+ [
137
+ 'image' => [
138
+ 'url' => Utils::get_placeholder_image_src(),
139
+ ],
140
+ ],
141
+ [
142
+ 'image' => [
143
+ 'url' => Utils::get_placeholder_image_src(),
144
+ ],
145
+ ],
146
+ [
147
+ 'image' => [
148
+ 'url' => Utils::get_placeholder_image_src(),
149
+ ],
150
+ ],
151
+ [
152
+ 'image' => [
153
+ 'url' => Utils::get_placeholder_image_src(),
154
+ ],
155
+ ],
156
+ [
157
+ 'image' => [
158
+ 'url' => Utils::get_placeholder_image_src(),
159
+ ],
160
+ ]
161
+ ]
162
+ ]
163
+ );
164
+
165
+ $this->add_group_control(
166
+ Group_Control_Image_Size::get_type(),
167
+ [
168
+ 'name' => 'thumbnail',
169
+ 'default' => 'medium_large',
170
+ 'separator' => 'before',
171
+ 'exclude' => [
172
+ 'custom'
173
+ ]
174
+ ]
175
+ );
176
+
177
+ $this->end_controls_section();
178
+
179
+ $this->start_controls_section(
180
+ '_section_settings',
181
+ [
182
+ 'label' => __( 'Settings', 'happy-elementor-addons' ),
183
+ 'tab' => Controls_Manager::TAB_CONTENT,
184
+ ]
185
+ );
186
+
187
+ $this->add_control(
188
+ 'animation_speed',
189
+ [
190
+ 'label' => __( 'Animation Speed', 'happy-elementor-addons' ),
191
+ 'type' => Controls_Manager::NUMBER,
192
+ 'min' => 100,
193
+ 'step' => 10,
194
+ 'max' => 10000,
195
+ 'default' => 300,
196
+ 'description' => __( 'Slide speed in milliseconds', 'happy-elementor-addons' ),
197
+ 'frontend_available' => true,
198
+ ]
199
+ );
200
+
201
+ $this->add_control(
202
+ 'autoplay',
203
+ [
204
+ 'label' => __( 'Autoplay?', 'happy-elementor-addons' ),
205
+ 'type' => Controls_Manager::SWITCHER,
206
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
207
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
208
+ 'return_value' => 'yes',
209
+ 'default' => 'yes',
210
+ 'frontend_available' => true,
211
+ ]
212
+ );
213
+
214
+ $this->add_control(
215
+ 'autoplay_speed',
216
+ [
217
+ 'label' => __( 'Autoplay Speed', 'happy-elementor-addons' ),
218
+ 'type' => Controls_Manager::NUMBER,
219
+ 'min' => 100,
220
+ 'step' => 100,
221
+ 'max' => 10000,
222
+ 'default' => 3000,
223
+ 'description' => __( 'Autoplay speed in milliseconds', 'happy-elementor-addons' ),
224
+ 'condition' => [
225
+ 'autoplay' => 'yes'
226
+ ],
227
+ 'frontend_available' => true,
228
+ ]
229
+ );
230
+
231
+ $this->add_control(
232
+ 'loop',
233
+ [
234
+ 'label' => __( 'Infinite Loop?', 'happy-elementor-addons' ),
235
+ 'type' => Controls_Manager::SWITCHER,
236
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
237
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
238
+ 'return_value' => 'yes',
239
+ 'default' => 'yes',
240
+ 'frontend_available' => true,
241
+ ]
242
+ );
243
+
244
+ $this->add_control(
245
+ 'center',
246
+ [
247
+ 'label' => __( 'Center Mode?', 'happy-elementor-addons' ),
248
+ 'type' => Controls_Manager::SWITCHER,
249
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
250
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
251
+ 'return_value' => 'yes',
252
+ 'description' => __( 'Best works with odd number of slides (Slides To Show) and loop (Infinite Loop)', 'happy-elementor-addons' ),
253
+ 'frontend_available' => true,
254
+ 'style_transfer' => true,
255
+ ]
256
+ );
257
+
258
+ $this->add_control(
259
+ 'vertical',
260
+ [
261
+ 'label' => __( 'Vertical Mode?', 'happy-elementor-addons' ),
262
+ 'type' => Controls_Manager::SWITCHER,
263
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
264
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
265
+ 'return_value' => 'yes',
266
+ 'frontend_available' => true,
267
+ 'style_transfer' => true,
268
+ ]
269
+ );
270
+
271
+ $this->add_control(
272
+ 'navigation',
273
+ [
274
+ 'label' => __( 'Navigation', 'happy-elementor-addons' ),
275
+ 'type' => Controls_Manager::SELECT,
276
+ 'options' => [
277
+ 'none' => __( 'None', 'happy-elementor-addons' ),
278
+ 'arrow' => __( 'Arrow', 'happy-elementor-addons' ),
279
+ 'dots' => __( 'Dots', 'happy-elementor-addons' ),
280
+ 'both' => __( 'Arrow & Dots', 'happy-elementor-addons' ),
281
+ ],
282
+ 'default' => 'arrow',
283
+ 'frontend_available' => true,
284
+ 'style_transfer' => true,
285
+ ]
286
+ );
287
+
288
+ $this->add_responsive_control(
289
+ 'slides_to_show',
290
+ [
291
+ 'label' => __( 'Slides To Show', 'happy-elementor-addons' ),
292
+ 'type' => Controls_Manager::SELECT,
293
+ 'options' => [
294
+ 1 => __( '1 Slide', 'happy-elementor-addons' ),
295
+ 2 => __( '2 Slides', 'happy-elementor-addons' ),
296
+ 3 => __( '3 Slides', 'happy-elementor-addons' ),
297
+ 4 => __( '4 Slides', 'happy-elementor-addons' ),
298
+ 5 => __( '5 Slides', 'happy-elementor-addons' ),
299
+ 6 => __( '6 Slides', 'happy-elementor-addons' ),
300
+ ],
301
+ 'desktop_default' => 4,
302
+ 'tablet_default' => 3,
303
+ 'mobile_default' => 2,
304
+ 'frontend_available' => true,
305
+ 'style_transfer' => true,
306
+ ]
307
+ );
308
+
309
+ $this->end_controls_section();
310
+ }
311
+
312
+ protected function register_style_controls() {
313
+ $this->start_controls_section(
314
+ '_section_style_item',
315
+ [
316
+ 'label' => __( 'Carousel Item', 'happy-elementor-addons' ),
317
+ 'tab' => Controls_Manager::TAB_STYLE,
318
+ ]
319
+ );
320
+
321
+ $this->add_responsive_control(
322
+ 'item_spacing',
323
+ [
324
+ 'label' => __( 'Slide Spacing (px)', 'happy-elementor-addons' ),
325
+ 'type' => Controls_Manager::SLIDER,
326
+ 'size_units' => ['px'],
327
+ 'selectors' => [
328
+ '{{WRAPPER}} .slick-slider:not(.slick-vertical) .slick-slide' => 'padding-right: {{SIZE}}{{UNIT}}; padding-left: {{SIZE}}{{UNIT}};',
329
+ '{{WRAPPER}} .slick-slider.slick-vertical .slick-slide' => 'padding-top: {{SIZE}}{{UNIT}}; padding-bottom: {{SIZE}}{{UNIT}};',
330
+ ],
331
+ ]
332
+ );
333
+
334
+ $this->add_responsive_control(
335
+ 'item_border_radius',
336
+ [
337
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
338
+ 'type' => Controls_Manager::DIMENSIONS,
339
+ 'size_units' => [ 'px', '%' ],
340
+ 'selectors' => [
341
+ '{{WRAPPER}} .ha-slick-item' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}; overflow: hidden;',
342
+ ],
343
+ ]
344
+ );
345
+
346
+ $this->end_controls_section();
347
+
348
+ $this->start_controls_section(
349
+ '_section_style_content',
350
+ [
351
+ 'label' => __( 'Slide Content', 'happy-elementor-addons' ),
352
+ 'tab' => Controls_Manager::TAB_STYLE,
353
+ ]
354
+ );
355
+
356
+ $this->add_responsive_control(
357
+ 'content_padding',
358
+ [
359
+ 'label' => __( 'Content Padding', 'happy-elementor-addons' ),
360
+ 'type' => Controls_Manager::DIMENSIONS,
361
+ 'size_units' => [ 'px', 'em', '%' ],
362
+ 'selectors' => [
363
+ '{{WRAPPER}} .ha-slick-content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
364
+ ],
365
+ ]
366
+ );
367
+
368
+ $this->add_group_control(
369
+ Group_Control_Background::get_type(),
370
+ [
371
+ 'name' => 'content_background',
372
+ 'selector' => '{{WRAPPER}} .ha-slick-content',
373
+ 'exclude' => [
374
+ 'image'
375
+ ]
376
+ ]
377
+ );
378
+
379
+ $this->add_control(
380
+ '_heading_title',
381
+ [
382
+ 'type' => Controls_Manager::HEADING,
383
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
384
+ 'separator' => 'before'
385
+ ]
386
+ );
387
+
388
+ $this->add_responsive_control(
389
+ 'title_spacing',
390
+ [
391
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
392
+ 'type' => Controls_Manager::SLIDER,
393
+ 'size_units' => ['px'],
394
+ 'selectors' => [
395
+ '{{WRAPPER}} .ha-slick-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
396
+ ],
397
+ ]
398
+ );
399
+
400
+ $this->add_control(
401
+ 'title_color',
402
+ [
403
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
404
+ 'type' => Controls_Manager::COLOR,
405
+ 'selectors' => [
406
+ '{{WRAPPER}} .ha-slick-title' => 'color: {{VALUE}}',
407
+ ],
408
+ ]
409
+ );
410
+
411
+ $this->add_group_control(
412
+ Group_Control_Typography::get_type(),
413
+ [
414
+ 'name' => 'title',
415
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
416
+ 'selector' => '{{WRAPPER}} .ha-slick-title',
417
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
418
+ ]
419
+ );
420
+
421
+ $this->add_control(
422
+ '_heading_subtitle',
423
+ [
424
+ 'type' => Controls_Manager::HEADING,
425
+ 'label' => __( 'Subtitle', 'happy-elementor-addons' ),
426
+ 'separator' => 'before'
427
+ ]
428
+ );
429
+
430
+ $this->add_responsive_control(
431
+ 'subtitle_spacing',
432
+ [
433
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
434
+ 'type' => Controls_Manager::SLIDER,
435
+ 'size_units' => ['px'],
436
+ 'selectors' => [
437
+ '{{WRAPPER}} .ha-slick-subtitle' => 'margin-bottom: {{SIZE}}{{UNIT}};',
438
+ ],
439
+ ]
440
+ );
441
+
442
+ $this->add_control(
443
+ 'subtitle_color',
444
+ [
445
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
446
+ 'type' => Controls_Manager::COLOR,
447
+ 'selectors' => [
448
+ '{{WRAPPER}} .ha-slick-subtitle' => 'color: {{VALUE}}',
449
+ ],
450
+ ]
451
+ );
452
+
453
+ $this->add_group_control(
454
+ Group_Control_Typography::get_type(),
455
+ [
456
+ 'name' => 'subtitle',
457
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
458
+ 'selector' => '{{WRAPPER}} .ha-slick-subtitle',
459
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
460
+ ]
461
+ );
462
+
463
+ $this->end_controls_section();
464
+
465
+ $this->start_controls_section(
466
+ '_section_style_arrow',
467
+ [
468
+ 'label' => __( 'Navigation - Arrow', 'happy-elementor-addons' ),
469
+ 'tab' => Controls_Manager::TAB_STYLE,
470
+ ]
471
+ );
472
+
473
+ $this->add_control(
474
+ 'arrow_position_toggle',
475
+ [
476
+ 'label' => __( 'Position', 'happy-elementor-addons' ),
477
+ 'type' => Controls_Manager::POPOVER_TOGGLE,
478
+ 'label_off' => __( 'None', 'happy-elementor-addons' ),
479
+ 'label_on' => __( 'Custom', 'happy-elementor-addons' ),
480
+ 'return_value' => 'yes',
481
+ ]
482
+ );
483
+
484
+ $this->start_popover();
485
+
486
+ $this->add_responsive_control(
487
+ 'arrow_position_y',
488
+ [
489
+ 'label' => __( 'Vertical', 'happy-elementor-addons' ),
490
+ 'type' => Controls_Manager::SLIDER,
491
+ 'size_units' => ['px'],
492
+ 'condition' => [
493
+ 'arrow_position_toggle' => 'yes'
494
+ ],
495
+ 'range' => [
496
+ 'px' => [
497
+ 'min' => 0,
498
+ 'max' => 500,
499
+ ],
500
+ ],
501
+ 'selectors' => [
502
+ '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next' => 'top: {{SIZE}}{{UNIT}};',
503
+ ],
504
+ ]
505
+ );
506
+
507
+ $this->add_responsive_control(
508
+ 'arrow_position_x',
509
+ [
510
+ 'label' => __( 'Horizontal', 'happy-elementor-addons' ),
511
+ 'type' => Controls_Manager::SLIDER,
512
+ 'size_units' => ['px'],
513
+ 'condition' => [
514
+ 'arrow_position_toggle' => 'yes'
515
+ ],
516
+ 'range' => [
517
+ 'px' => [
518
+ 'min' => -100,
519
+ 'max' => 250,
520
+ ],
521
+ ],
522
+ 'selectors' => [
523
+ '{{WRAPPER}} .slick-prev' => 'left: {{SIZE}}{{UNIT}};',
524
+ '{{WRAPPER}} .slick-next' => 'right: {{SIZE}}{{UNIT}};',
525
+ ],
526
+ ]
527
+ );
528
+
529
+ $this->end_popover();
530
+
531
+ $this->add_group_control(
532
+ Group_Control_Border::get_type(),
533
+ [
534
+ 'name' => 'arrow_border',
535
+ 'selector' => '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next',
536
+ ]
537
+ );
538
+
539
+ $this->add_responsive_control(
540
+ 'arrow_border_radius',
541
+ [
542
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
543
+ 'type' => Controls_Manager::DIMENSIONS,
544
+ 'size_units' => [ 'px', '%' ],
545
+ 'selectors' => [
546
+ '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}}; overflow: hidden;',
547
+ ],
548
+ ]
549
+ );
550
+
551
+ $this->start_controls_tabs( '_tabs_arrow' );
552
+
553
+ $this->start_controls_tab(
554
+ '_tab_arrow_normal',
555
+ [
556
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
557
+ ]
558
+ );
559
+
560
+ $this->add_control(
561
+ 'arrow_color',
562
+ [
563
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
564
+ 'type' => Controls_Manager::COLOR,
565
+ 'default' => '',
566
+ 'selectors' => [
567
+ '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next' => 'color: {{VALUE}};',
568
+ ],
569
+ ]
570
+ );
571
+
572
+ $this->add_control(
573
+ 'arrow_bg_color',
574
+ [
575
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
576
+ 'type' => Controls_Manager::COLOR,
577
+ 'selectors' => [
578
+ '{{WRAPPER}} .slick-prev, {{WRAPPER}} .slick-next' => 'background-color: {{VALUE}};',
579
+ ],
580
+ ]
581
+ );
582
+
583
+ $this->end_controls_tab();
584
+
585
+ $this->start_controls_tab(
586
+ '_tab_arrow_hover',
587
+ [
588
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
589
+ ]
590
+ );
591
+
592
+ $this->add_control(
593
+ 'arrow_hover_color',
594
+ [
595
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
596
+ 'type' => Controls_Manager::COLOR,
597
+ 'selectors' => [
598
+ '{{WRAPPER}} .slick-prev:hover, {{WRAPPER}} .slick-next:hover' => 'color: {{VALUE}};',
599
+ ],
600
+ ]
601
+ );
602
+
603
+ $this->add_control(
604
+ 'arrow_hover_bg_color',
605
+ [
606
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
607
+ 'type' => Controls_Manager::COLOR,
608
+ 'selectors' => [
609
+ '{{WRAPPER}} .slick-prev:hover, {{WRAPPER}} .slick-next:hover' => 'background-color: {{VALUE}};',
610
+ ],
611
+ ]
612
+ );
613
+
614
+ $this->add_control(
615
+ 'arrow_hover_border_color',
616
+ [
617
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
618
+ 'type' => Controls_Manager::COLOR,
619
+ 'condition' => [
620
+ 'arrow_border_border!' => '',
621
+ ],
622
+ 'selectors' => [
623
+ '{{WRAPPER}} .slick-prev:hover, {{WRAPPER}} .slick-next:hover' => 'border-color: {{VALUE}};',
624
+ ],
625
+ ]
626
+ );
627
+
628
+ $this->end_controls_tab();
629
+ $this->end_controls_tabs();
630
+
631
+ $this->end_controls_section();
632
+
633
+ $this->start_controls_section(
634
+ '_section_style_dots',
635
+ [
636
+ 'label' => __( 'Navigation - Dots', 'happy-elementor-addons' ),
637
+ 'tab' => Controls_Manager::TAB_STYLE,
638
+ ]
639
+ );
640
+
641
+ $this->add_responsive_control(
642
+ 'dots_nav_position_y',
643
+ [
644
+ 'label' => __( 'Vertical Position', 'happy-elementor-addons' ),
645
+ 'type' => Controls_Manager::SLIDER,
646
+ 'size_units' => ['px'],
647
+ 'range' => [
648
+ 'px' => [
649
+ 'min' => -100,
650
+ 'max' => 500,
651
+ ],
652
+ ],
653
+ 'selectors' => [
654
+ '{{WRAPPER}} .slick-dots' => 'bottom: {{SIZE}}{{UNIT}};',
655
+ ],
656
+ ]
657
+ );
658
+
659
+ $this->add_responsive_control(
660
+ 'dots_nav_spacing',
661
+ [
662
+ 'label' => __( 'Spacing', 'happy-elementor-addons' ),
663
+ 'type' => Controls_Manager::SLIDER,
664
+ 'size_units' => ['px'],
665
+ 'selectors' => [
666
+ '{{WRAPPER}} .slick-dots li' => 'margin-right: calc({{SIZE}}{{UNIT}} / 2); margin-left: calc({{SIZE}}{{UNIT}} / 2);',
667
+ ],
668
+ ]
669
+ );
670
+
671
+ $this->add_responsive_control(
672
+ 'dots_nav_align',
673
+ [
674
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
675
+ 'type' => Controls_Manager::CHOOSE,
676
+ 'label_block' => false,
677
+ 'options' => [
678
+ 'left' => [
679
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
680
+ 'icon' => 'eicon-h-align-left',
681
+ ],
682
+ 'center' => [
683
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
684
+ 'icon' => 'eicon-h-align-center',
685
+ ],
686
+ 'right' => [
687
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
688
+ 'icon' => 'eicon-h-align-right',
689
+ ],
690
+ ],
691
+ 'toggle' => true,
692
+ 'selectors' => [
693
+ '{{WRAPPER}} .slick-dots' => 'text-align: {{VALUE}}'
694
+ ]
695
+ ]
696
+ );
697
+
698
+ $this->start_controls_tabs( '_tabs_dots' );
699
+ $this->start_controls_tab(
700
+ '_tab_dots_normal',
701
+ [
702
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
703
+ ]
704
+ );
705
+
706
+ $this->add_control(
707
+ 'dots_nav_color',
708
+ [
709
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
710
+ 'type' => Controls_Manager::COLOR,
711
+ 'selectors' => [
712
+ '{{WRAPPER}} .slick-dots li button:before' => 'color: {{VALUE}};',
713
+ ],
714
+ ]
715
+ );
716
+
717
+ $this->end_controls_tab();
718
+
719
+ $this->start_controls_tab(
720
+ '_tab_dots_hover',
721
+ [
722
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
723
+ ]
724
+ );
725
+
726
+ $this->add_control(
727
+ 'dots_nav_hover_color',
728
+ [
729
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
730
+ 'type' => Controls_Manager::COLOR,
731
+ 'selectors' => [
732
+ '{{WRAPPER}} .slick-dots li button:hover:before' => 'color: {{VALUE}};',
733
+ ],
734
+ ]
735
+ );
736
+
737
+ $this->end_controls_tab();
738
+
739
+ $this->start_controls_tab(
740
+ '_tab_dots_active',
741
+ [
742
+ 'label' => __( 'Active', 'happy-elementor-addons' ),
743
+ ]
744
+ );
745
+
746
+ $this->add_control(
747
+ 'dots_nav_active_color',
748
+ [
749
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
750
+ 'type' => Controls_Manager::COLOR,
751
+ 'selectors' => [
752
+ '{{WRAPPER}} .slick-dots .slick-active button:before' => 'color: {{VALUE}};',
753
+ ],
754
+ ]
755
+ );
756
+
757
+ $this->end_controls_tab();
758
+ $this->end_controls_tabs();
759
+
760
+ $this->end_controls_section();
761
+ }
762
 
763
  protected function render() {
764
+ $settings = $this->get_settings_for_display();
765
+
766
+ if ( empty( $settings['slides'] ) ) {
767
+ return;
768
+ }
769
+ ?>
770
+
771
+ <div class="hajs-slick ha-slick ha-slick--carousel">
772
+
773
+ <?php foreach ( $settings['slides'] as $slide ) :
774
+ $image = wp_get_attachment_image_url( $slide['image']['id'], $settings['thumbnail_size'] );
775
+
776
+ if ( ! $image ) {
777
+ $image = $slide['image']['url'];
778
+ }
779
+
780
+ $item_tag = 'div';
781
+ $id = 'ha-slick-item-' . $slide['_id'];
782
+
783
+ $this->add_render_attribute( $id, 'class', 'ha-slick-item' );
784
+
785
+ if ( isset( $slide['link'] ) && ! empty( $slide['link']['url'] ) ) {
786
+ $item_tag = 'a';
787
+ $this->add_link_attributes( $id, $slide['link'] );
788
+ }
789
+ ?>
790
+
791
+ <div class="ha-slick-slide">
792
+ <<?php echo $item_tag; ?> <?php $this->print_render_attribute_string( $id ); ?>>
793
+ <?php if ( $image ) : ?>
794
+ <img class="ha-slick-img" src="<?php echo esc_url( $image ); ?>" alt="<?php echo esc_attr( $slide['title'] ); ?>">
795
+ <?php endif; ?>
796
+
797
+ <?php if ( $slide['title'] || $slide['subtitle'] ) : ?>
798
+ <div class="ha-slick-content">
799
+ <?php if ( $slide['title'] ) : ?>
800
+ <h2 class="ha-slick-title"><?php echo ha_kses_basic( $slide['title'] ); ?></h2>
801
+ <?php endif; ?>
802
+ <?php if ( $slide['subtitle'] ) : ?>
803
+ <p class="ha-slick-subtitle"><?php echo ha_kses_basic( $slide['subtitle'] ); ?></p>
804
+ <?php endif; ?>
805
+ </div>
806
+ <?php endif; ?>
807
+ </<?php echo $item_tag; ?>>
808
+ </div>
809
+
810
+ <?php endforeach; ?>
811
+
812
+ </div>
813
+
814
+ <?php
815
+ }
816
  }
widgets/dual-button/widget.php CHANGED
@@ -84,7 +84,7 @@ class Dual_Button extends Base {
84
  [
85
  'label' => __( 'Link', 'happy-elementor-addons' ),
86
  'type' => Controls_Manager::URL,
87
- 'placeholder' => 'https://happyaddons.com/',
88
  'dynamic' => [
89
  'active' => true,
90
  ]
@@ -270,7 +270,7 @@ class Dual_Button extends Base {
270
  [
271
  'label' => __( 'Link', 'happy-elementor-addons' ),
272
  'type' => Controls_Manager::URL,
273
- 'placeholder' => 'https://happyaddons.com/',
274
  'dynamic' => [
275
  'active' => true,
276
  ]
84
  [
85
  'label' => __( 'Link', 'happy-elementor-addons' ),
86
  'type' => Controls_Manager::URL,
87
+ 'placeholder' => 'https://example.com',
88
  'dynamic' => [
89
  'active' => true,
90
  ]
270
  [
271
  'label' => __( 'Link', 'happy-elementor-addons' ),
272
  'type' => Controls_Manager::URL,
273
+ 'placeholder' => 'https://example.com',
274
  'dynamic' => [
275
  'active' => true,
276
  ]
widgets/flip-box/widget.php CHANGED
@@ -587,12 +587,22 @@ class Flip_Box extends Base {
587
  [
588
  'label' => __( 'Icon Size', 'happy-elementor-addons' ),
589
  'type' => Controls_Manager::SLIDER,
590
- 'size_units' => ['px', 'em'],
 
 
 
 
 
 
 
 
 
 
591
  'condition' => [
592
  'front_icon_type' => 'icon'
593
  ],
594
  'selectors' => [
595
- '{{WRAPPER}} .ha-flip-box-front-inner .ha-flip-icon i' => 'font-size: {{SIZE}}{{UNIT}};',
596
  ],
597
  ]
598
  );
@@ -940,12 +950,22 @@ class Flip_Box extends Base {
940
  [
941
  'label' => __( 'Icon Size', 'happy-elementor-addons' ),
942
  'type' => Controls_Manager::SLIDER,
943
- 'size_units' => ['px', 'em'],
 
 
 
 
 
 
 
 
 
 
944
  'condition' => [
945
  'back_icon_type' => 'icon'
946
  ],
947
  'selectors' => [
948
- '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-icon i' => 'font-size: {{SIZE}}{{UNIT}};',
949
  ],
950
  ]
951
  );
587
  [
588
  'label' => __( 'Icon Size', 'happy-elementor-addons' ),
589
  'type' => Controls_Manager::SLIDER,
590
+ 'size_units' => ['px', 'em'],
591
+ 'range' => [
592
+ 'px' => [
593
+ 'min' => 6,
594
+ 'max' => 300
595
+ ],
596
+ 'em' => [
597
+ 'min' => 6,
598
+ 'max' => 300
599
+ ]
600
+ ],
601
  'condition' => [
602
  'front_icon_type' => 'icon'
603
  ],
604
  'selectors' => [
605
+ '{{WRAPPER}} .ha-flip-box-front-inner .ha-flip-icon' => 'font-size: {{SIZE}}{{UNIT}};',
606
  ],
607
  ]
608
  );
950
  [
951
  'label' => __( 'Icon Size', 'happy-elementor-addons' ),
952
  'type' => Controls_Manager::SLIDER,
953
+ 'size_units' => ['px', 'em'],
954
+ 'range' => [
955
+ 'px' => [
956
+ 'min' => 6,
957
+ 'max' => 300
958
+ ],
959
+ 'em' => [
960
+ 'min' => 6,
961
+ 'max' => 300
962
+ ]
963
+ ],
964
  'condition' => [
965
  'back_icon_type' => 'icon'
966
  ],
967
  'selectors' => [
968
+ '{{WRAPPER}} .ha-flip-box-back-inner .ha-flip-icon' => 'font-size: {{SIZE}}{{UNIT}};',
969
  ],
970
  ]
971
  );
widgets/fun-factor/widget.php CHANGED
@@ -291,7 +291,7 @@ class Fun_Factor extends Base {
291
  ],
292
  'toggle' => true,
293
  'selectors' => [
294
- '{{WRAPPER}} .ha-ff-container, {{WRAPPER}} .ha-fun-factor-image-section' => 'text-align: {{VALUE}};',
295
  ],
296
  'default' => 'center',
297
  'render_type' => 'template',
@@ -331,7 +331,7 @@ class Fun_Factor extends Base {
331
  'range' => [
332
  'px' => [
333
  'min' => 150,
334
- 'max' => 1024,
335
  ],
336
  '%' => [
337
  'min' => 30,
@@ -342,8 +342,8 @@ class Fun_Factor extends Base {
342
  'unit' => 'px',
343
  ],
344
  'selectors' => [
345
- '{{WRAPPER}} .ha-fun-factor-image-section img' => 'width: {{SIZE}}{{UNIT}};',
346
- '{{WRAPPER}} .ha-fun-factor-image-section, {{WRAPPER}} .ha-fun-factor-icon-section' => 'flex: 0 0 {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}};',
347
  ],
348
  'condition' => [
349
  'media_type' => 'image',
@@ -371,7 +371,7 @@ class Fun_Factor extends Base {
371
  'unit' => 'px',
372
  ],
373
  'selectors' => [
374
- '{{WRAPPER}} .ha-fun-factor-image-section img' => 'height: {{SIZE}}{{UNIT}};',
375
  ],
376
  'condition' => [
377
  'media_type' => 'image',
@@ -382,31 +382,17 @@ class Fun_Factor extends Base {
382
  $this->add_responsive_control(
383
  'icon_size',
384
  [
385
- 'label' => __('Size (em)', 'happy-elementor-addons'),
386
  'type' => Controls_Manager::SLIDER,
387
- 'size_units' => ['em'],
388
  'range' => [
389
- 'em' => [
390
- 'min' => 1,
391
- 'max' => 10,
392
- 'step' => 1,
393
  ],
394
  ],
395
- 'devices' => ['desktop', 'tablet', 'mobile'],
396
- 'desktop_default' => [
397
- 'unit' => 'em',
398
- 'size' => 3,
399
- ],
400
- 'tablet_default' => [
401
- 'unit' => 'em',
402
- 'size' => 2,
403
- ],
404
- 'mobile_default' => [
405
- 'unit' => 'em',
406
- 'size' => 2,
407
- ],
408
  'selectors' => [
409
- '{{WRAPPER}} .ha-fun-factor-icon' => 'font-size: {{SIZE}}{{UNIT}};',
410
  ],
411
  'condition' => [
412
  'media_type' => 'icon',
@@ -421,7 +407,7 @@ class Fun_Factor extends Base {
421
  'label' => __('Icon Color', 'happy-elementor-addons'),
422
  'type' => Controls_Manager::COLOR,
423
  'selectors' => [
424
- '{{WRAPPER}} .ha-fun-factor-icon' => 'color: {{VALUE}};',
425
  ],
426
  'condition' => [
427
  'media_type' => 'icon',
@@ -436,7 +422,7 @@ class Fun_Factor extends Base {
436
  'type' => Controls_Manager::DIMENSIONS,
437
  'size_units' => ['px'],
438
  'selectors' => [
439
- '{{WRAPPER}} .ha-fun-factor-image-section img, {{WRAPPER}} .ha-fun-factor-icon-section' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
440
  ],
441
  ]
442
  );
@@ -445,7 +431,7 @@ class Fun_Factor extends Base {
445
  Group_Control_Border::get_type(),
446
  [
447
  'name' => 'media_border',
448
- 'selector' => '{{WRAPPER}} .ha-fun-factor-image-section img, {{WRAPPER}} .ha-fun-factor-icon-section',
449
  'separator' => 'before'
450
  ]
451
  );
@@ -457,7 +443,7 @@ class Fun_Factor extends Base {
457
  'type' => Controls_Manager::DIMENSIONS,
458
  'size_units' => ['px', '%'],
459
  'selectors' => [
460
- '{{WRAPPER}} .ha-fun-factor-image-section img, {{WRAPPER}} .ha-fun-factor-icon-section' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
461
  ],
462
  ]
463
  );
@@ -466,7 +452,7 @@ class Fun_Factor extends Base {
466
  Group_Control_Box_Shadow::get_type(),
467
  [
468
  'name' => 'media_box_shadow',
469
- 'selector' => '{{WRAPPER}} .ha-fun-factor-image-section img, {{WRAPPER}} .ha-fun-factor-icon-section',
470
  ]
471
  );
472
 
@@ -476,7 +462,7 @@ class Fun_Factor extends Base {
476
  'label' => __('Bottom Spacing', 'happy-elementor-addons'),
477
  'type' => Controls_Manager::SLIDER,
478
  'selectors' => [
479
- '{{WRAPPER}} .ha-fun-factor-icon-section, {{WRAPPER}} .ha-fun-factor-image-section' => 'margin-bottom: {{SIZE}}{{UNIT}};',
480
  ],
481
  ]
482
  );
@@ -487,7 +473,7 @@ class Fun_Factor extends Base {
487
  'label' => __('Background Color', 'happy-elementor-addons'),
488
  'type' => Controls_Manager::COLOR,
489
  'selectors' => [
490
- '{{WRAPPER}} .ha-fun-factor-icon-section, {{WRAPPER}} .ha-fun-factor-image-section' => 'background-color: {{VALUE}};',
491
  ],
492
  'condition' => [
493
  'media_type' => 'icon'
@@ -544,19 +530,19 @@ class Fun_Factor extends Base {
544
 
545
  'selectors' => [
546
  // Left image position styles
547
- '(desktop){{WRAPPER}}.ha-ff-icon--left .ha-fun-factor-content' => 'margin-left: {{media_offset_x.SIZE || 0}}{{UNIT}}; max-width: calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + (-1 * {{media_offset_x.SIZE || 0}}{{UNIT}}));',
548
- '(tablet){{WRAPPER}}.ha-ff-icon--left .ha-fun-factor-content' => 'margin-left: {{media_offset_x_tablet.SIZE || 0}}{{UNIT}}; max-width: calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + (-1 * {{media_offset_x_tablet.SIZE || 0}}{{UNIT}}));',
549
- '(mobile){{WRAPPER}}.ha-ff-icon--left .ha-fun-factor-content' => 'margin-left: {{media_offset_x_mobile.SIZE || 0}}{{UNIT}}; max-width: calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + (-1 * {{media_offset_x_mobile.SIZE || 0}}{{UNIT}}));',
550
  // Image right position styles
551
- '(desktop){{WRAPPER}}.ha-ff-icon--right .ha-fun-factor-content' => 'margin-right: calc(-1 * {{media_offset_x.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + {{media_offset_x.SIZE || 0}}{{UNIT}});',
552
- '(tablet){{WRAPPER}}.ha-ff-icon--right .ha-fun-factor-content' => 'margin-right: calc(-1 * {{media_offset_x_tablet.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + {{media_offset_x_tablet.SIZE || 0}}{{UNIT}});',
553
- '(mobile){{WRAPPER}}.ha-ff-icon--right .ha-fun-factor-content' => 'margin-right: calc(-1 * {{media_offset_x_mobile.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + {{media_offset_x_mobile.SIZE || 0}}{{UNIT}});',
554
  // Image translate styles
555
- '(desktop){{WRAPPER}} .ha-fun-factor-icon-section, {{WRAPPER}} .ha-fun-factor-image-section' => '-ms-transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}});',
556
- '(tablet){{WRAPPER}} .ha-fun-factor-icon-section, {WRAPPER}} .ha-fun-factor-image-section' => '-ms-transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}});',
557
- '(mobile){{WRAPPER}} .ha-fun-factor-icon-section, {{WRAPPER}} .ha-fun-factor-image-section' => '-ms-transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}});',
558
  // Fun Factor body styles
559
- '{{WRAPPER}}.ha-ff-icon--top .ha-fun-factor-content' => 'margin-top: {{SIZE}}{{UNIT}};',
560
  ],
561
  ]
562
  );
@@ -582,7 +568,7 @@ class Fun_Factor extends Base {
582
  'label' => __('Padding', 'happy-elementor-addons'),
583
  'type' => Controls_Manager::DIMENSIONS,
584
  'selectors' => [
585
- '{{WRAPPER}} .ha-fun-factor-content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
586
  ]
587
  ]
588
  );
@@ -602,7 +588,7 @@ class Fun_Factor extends Base {
602
  'type' => Controls_Manager::SLIDER,
603
  'size_units' => ['px', '%', 'em'],
604
  'selectors' => [
605
- '{{WRAPPER}} .ha-fun-factor-content-number' => 'margin-bottom: {{SIZE}}{{UNIT}};'
606
  ]
607
  ]
608
  );
@@ -613,7 +599,7 @@ class Fun_Factor extends Base {
613
  'label' => __('Color', 'happy-elementor-addons'),
614
  'type' => Controls_Manager::COLOR,
615
  'selectors' => [
616
- '{{WRAPPER}} .ha-fun-factor-content-number' => 'color: {{VALUE}} !important;',
617
  ],
618
  ]
619
  );
@@ -624,7 +610,7 @@ class Fun_Factor extends Base {
624
  'name' => 'number_typography',
625
  'label' => __('Typography', 'happy-elementor-addons'),
626
  'scheme' => Scheme_Typography::TYPOGRAPHY_3,
627
- 'selector' => '{{WRAPPER}} .ha-fun-factor-content-number',
628
  ]
629
  );
630
 
@@ -633,7 +619,7 @@ class Fun_Factor extends Base {
633
  [
634
  'name' => 'fun_factor_number_shadow',
635
  'label' => __('Text Shadow', 'happy-elementor-addons'),
636
- 'selector' => '{{WRAPPER}} .ha-fun-factor-content-number',
637
  ]
638
  );
639
 
@@ -657,7 +643,7 @@ class Fun_Factor extends Base {
657
  'type' => Controls_Manager::SLIDER,
658
  'size_units' => ['px'],
659
  'selectors' => [
660
- '{{WRAPPER}} .ha-fun-factor-content-text' => 'margin-bottom: {{SIZE}}{{UNIT}};'
661
  ]
662
  ]
663
  );
@@ -668,7 +654,7 @@ class Fun_Factor extends Base {
668
  'label' => __('Color', 'happy-elementor-addons'),
669
  'type' => Controls_Manager::COLOR,
670
  'selectors' => [
671
- '{{WRAPPER}} .ha-fun-factor-content-text' => 'color: {{VALUE}};',
672
  ],
673
  ]
674
  );
@@ -679,7 +665,7 @@ class Fun_Factor extends Base {
679
  'name' => 'content_typography',
680
  'label' => __('Typography', 'happy-elementor-addons'),
681
  'scheme' => Scheme_Typography::TYPOGRAPHY_3,
682
- 'selector' => '{{WRAPPER}} .ha-fun-factor-content-text',
683
  ]
684
  );
685
 
@@ -688,7 +674,7 @@ class Fun_Factor extends Base {
688
  [
689
  'name' => 'fun_factor_content_shadow',
690
  'label' => __('Text Shadow', 'happy-elementor-addons'),
691
- 'selector' => '{{WRAPPER}} .ha-fun-factor-content-text',
692
  ]
693
  );
694
 
@@ -724,7 +710,7 @@ class Fun_Factor extends Base {
724
  'unit' => '%'
725
  ],
726
  'selectors' => [
727
- '{{WRAPPER}} .ha-fun-factor-divider' => 'width: {{SIZE}}{{UNIT}} !important;',
728
  ],
729
  ]
730
  );
@@ -739,7 +725,7 @@ class Fun_Factor extends Base {
739
  'px' => 1
740
  ],
741
  'selectors' => [
742
- '{{WRAPPER}} .ha-fun-factor-divider' => 'height: {{SIZE}}{{UNIT}} !important;',
743
  ],
744
  ]
745
  );
@@ -750,7 +736,7 @@ class Fun_Factor extends Base {
750
  'label' => __('Border Radius', 'happy-elementor-addons'),
751
  'type' => Controls_Manager::DIMENSIONS,
752
  'selectors' => [
753
- '{{WRAPPER}} .ha-fun-factor-divider' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
754
  ],
755
  ]
756
  );
@@ -761,7 +747,7 @@ class Fun_Factor extends Base {
761
  'label' => __('Color', 'happy-elementor-addons'),
762
  'type' => Controls_Manager::COLOR,
763
  'selectors' => [
764
- '{{WRAPPER}} .ha-fun-factor-divider' => 'background-color: {{VALUE}} !important;',
765
  ],
766
  ]
767
  );
@@ -773,7 +759,7 @@ class Fun_Factor extends Base {
773
  'type' => Controls_Manager::SLIDER,
774
  'size_units' => ['px'],
775
  'selectors' => [
776
- '{{WRAPPER}} .ha-fun-factor-divider' => 'margin-bottom: {{SIZE}}{{UNIT}};',
777
  ],
778
  ]
779
  );
@@ -784,7 +770,7 @@ class Fun_Factor extends Base {
784
  protected function render() {
785
  $settings = $this->get_settings_for_display();
786
 
787
- $this->add_render_attribute('fun_factor_number', 'class', 'ha-fun-factor-content-number');
788
  $number = $settings['fun_factor_number'];
789
  $fun_factor_title = $settings['fun_factor_title'];
790
 
@@ -798,25 +784,25 @@ class Fun_Factor extends Base {
798
  }
799
  ?>
800
 
801
- <div class="ha-ff-container">
802
  <?php if (!empty($settings['icons']['value'])) : ?>
803
- <div class="ha-fun-factor-icon-section">
804
- <?php Icons_Manager::render_icon( $settings['icons'], ['aria-hidden' => 'true', 'class' => 'ha-fun-factor-icon'] ); ?>
805
  </div>
806
  <?php elseif ( $settings['image']['url'] || $settings['image']['id'] ) : ?>
807
- <div class="ha-fun-factor-image-section">
808
  <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
809
  </div>
810
  <?php endif; ?>
811
 
812
- <div class="ha-fun-factor-content">
813
  <p <?php $this->print_render_attribute_string( 'fun_factor_number' ); ?> ><?php echo esc_html( $number ); ?></p>
814
  <?php if ( 'yes' === $settings['divider_show_hide'] ) : ?>
815
- <span class="ha-fun-factor-divider ha-fun-factor-divider-align-<?php echo esc_attr( $settings['text_align'] ); ?>"></span>
816
  <?php endif; ?>
817
- <?php printf( '<%1$s class="ha-fun-factor-content-text">%2$s</%1$s>',
818
  tag_escape( $settings['title_tag'] ),
819
- esc_html( $fun_factor_title )
820
  ); ?>
821
  </div>
822
  </div>
291
  ],
292
  'toggle' => true,
293
  'selectors' => [
294
+ '{{WRAPPER}} .ha-fun-factor__wrap, {{WRAPPER}} .ha-fun-factor__media--image' => 'text-align: {{VALUE}};',
295
  ],
296
  'default' => 'center',
297
  'render_type' => 'template',
331
  'range' => [
332
  'px' => [
333
  'min' => 150,
334
+ 'max' => 500,
335
  ],
336
  '%' => [
337
  'min' => 30,
342
  'unit' => 'px',
343
  ],
344
  'selectors' => [
345
+ '{{WRAPPER}}.ha-ff-icon--top .ha-fun-factor__media--image' => 'width: {{SIZE}}{{UNIT}};',
346
+ '{{WRAPPER}}:not(.ha-ff-icon--top) .ha-fun-factor__media--image' => 'flex: 0 0 {{SIZE}}{{UNIT}}; max-width: {{SIZE}}{{UNIT}};',
347
  ],
348
  'condition' => [
349
  'media_type' => 'image',
371
  'unit' => 'px',
372
  ],
373
  'selectors' => [
374
+ '{{WRAPPER}} .ha-fun-factor__media--image' => 'height: {{SIZE}}{{UNIT}};',
375
  ],
376
  'condition' => [
377
  'media_type' => 'image',
382
  $this->add_responsive_control(
383
  'icon_size',
384
  [
385
+ 'label' => __('Size', 'happy-elementor-addons'),
386
  'type' => Controls_Manager::SLIDER,
387
+ 'size_units' => ['px'],
388
  'range' => [
389
+ 'px' => [
390
+ 'min' => 6,
391
+ 'max' => 300,
 
392
  ],
393
  ],
 
 
 
 
 
 
 
 
 
 
 
 
 
394
  'selectors' => [
395
+ '{{WRAPPER}} .ha-fun-factor__media--icon' => 'font-size: {{SIZE}}{{UNIT}};',
396
  ],
397
  'condition' => [
398
  'media_type' => 'icon',
407
  'label' => __('Icon Color', 'happy-elementor-addons'),
408
  'type' => Controls_Manager::COLOR,
409
  'selectors' => [
410
+ '{{WRAPPER}} .ha-fun-factor__media--icon' => 'color: {{VALUE}};',
411
  ],
412
  'condition' => [
413
  'media_type' => 'icon',
422
  'type' => Controls_Manager::DIMENSIONS,
423
  'size_units' => ['px'],
424
  'selectors' => [
425
+ '{{WRAPPER}} .ha-fun-factor__media--image img, {{WRAPPER}} .ha-fun-factor__media--icon' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
426
  ],
427
  ]
428
  );
431
  Group_Control_Border::get_type(),
432
  [
433
  'name' => 'media_border',
434
+ 'selector' => '{{WRAPPER}} .ha-fun-factor__media--image img, {{WRAPPER}} .ha-fun-factor__media--icon',
435
  'separator' => 'before'
436
  ]
437
  );
443
  'type' => Controls_Manager::DIMENSIONS,
444
  'size_units' => ['px', '%'],
445
  'selectors' => [
446
+ '{{WRAPPER}} .ha-fun-factor__media--image img, {{WRAPPER}} .ha-fun-factor__media--icon' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
447
  ],
448
  ]
449
  );
452
  Group_Control_Box_Shadow::get_type(),
453
  [
454
  'name' => 'media_box_shadow',
455
+ 'selector' => '{{WRAPPER}} .ha-fun-factor__media--image img, {{WRAPPER}} .ha-fun-factor__media--icon',
456
  ]
457
  );
458
 
462
  'label' => __('Bottom Spacing', 'happy-elementor-addons'),
463
  'type' => Controls_Manager::SLIDER,
464
  'selectors' => [
465
+ '{{WRAPPER}} .ha-fun-factor__media--icon, {{WRAPPER}} .ha-fun-factor__media--image' => 'margin-bottom: {{SIZE}}{{UNIT}};',
466
  ],
467
  ]
468
  );
473
  'label' => __('Background Color', 'happy-elementor-addons'),
474
  'type' => Controls_Manager::COLOR,
475
  'selectors' => [
476
+ '{{WRAPPER}} .ha-fun-factor__media--icon, {{WRAPPER}} .ha-fun-factor__media--image' => 'background-color: {{VALUE}};',
477
  ],
478
  'condition' => [
479
  'media_type' => 'icon'
530
 
531
  'selectors' => [
532
  // Left image position styles
533
+ '(desktop){{WRAPPER}}.ha-ff-icon--left .ha-fun-factor__content' => 'margin-left: {{media_offset_x.SIZE || 0}}{{UNIT}}; max-width: calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + (-1 * {{media_offset_x.SIZE || 0}}{{UNIT}}));',
534
+ '(tablet){{WRAPPER}}.ha-ff-icon--left .ha-fun-factor__content' => 'margin-left: {{media_offset_x_tablet.SIZE || 0}}{{UNIT}}; max-width: calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + (-1 * {{media_offset_x_tablet.SIZE || 0}}{{UNIT}}));',
535
+ '(mobile){{WRAPPER}}.ha-ff-icon--left .ha-fun-factor__content' => 'margin-left: {{media_offset_x_mobile.SIZE || 0}}{{UNIT}}; max-width: calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + (-1 * {{media_offset_x_mobile.SIZE || 0}}{{UNIT}}));',
536
  // Image right position styles
537
+ '(desktop){{WRAPPER}}.ha-ff-icon--right .ha-fun-factor__content' => 'margin-right: calc(-1 * {{media_offset_x.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width.SIZE || 50}}{{image_width.UNIT}}) + {{media_offset_x.SIZE || 0}}{{UNIT}});',
538
+ '(tablet){{WRAPPER}}.ha-ff-icon--right .ha-fun-factor__content' => 'margin-right: calc(-1 * {{media_offset_x_tablet.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width_tablet.SIZE || 50}}{{image_width_tablet.UNIT}}) + {{media_offset_x_tablet.SIZE || 0}}{{UNIT}});',
539
+ '(mobile){{WRAPPER}}.ha-ff-icon--right .ha-fun-factor__content' => 'margin-right: calc(-1 * {{media_offset_x_mobile.SIZE || 0}}{{UNIT}}); max-width: calc((100% - {{image_width_mobile.SIZE || 50}}{{image_width_mobile.UNIT}}) + {{media_offset_x_mobile.SIZE || 0}}{{UNIT}});',
540
  // Image translate styles
541
+ '(desktop){{WRAPPER}} .ha-fun-factor__media--icon, {{WRAPPER}} .ha-fun-factor__media--image' => '-ms-transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}});',
542
+ '(tablet){{WRAPPER}} .ha-fun-factor__media--icon, {WRAPPER}} .ha-fun-factor__media--image' => '-ms-transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}});',
543
+ '(mobile){{WRAPPER}} .ha-fun-factor__media--icon, {{WRAPPER}} .ha-fun-factor__media--image' => '-ms-transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}});',
544
  // Fun Factor body styles
545
+ '{{WRAPPER}}.ha-ff-icon--top .ha-fun-factor__content' => 'margin-top: {{SIZE}}{{UNIT}};',
546
  ],
547
  ]
548
  );
568
  'label' => __('Padding', 'happy-elementor-addons'),
569
  'type' => Controls_Manager::DIMENSIONS,
570
  'selectors' => [
571
+ '{{WRAPPER}} .ha-fun-factor__content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
572
  ]
573
  ]
574
  );
588
  'type' => Controls_Manager::SLIDER,
589
  'size_units' => ['px', '%', 'em'],
590
  'selectors' => [
591
+ '{{WRAPPER}} .ha-fun-factor__content-number' => 'margin-bottom: {{SIZE}}{{UNIT}};'
592
  ]
593
  ]
594
  );
599
  'label' => __('Color', 'happy-elementor-addons'),
600
  'type' => Controls_Manager::COLOR,
601
  'selectors' => [
602
+ '{{WRAPPER}} .ha-fun-factor__content-number' => 'color: {{VALUE}} !important;',
603
  ],
604
  ]
605
  );
610
  'name' => 'number_typography',
611
  'label' => __('Typography', 'happy-elementor-addons'),
612
  'scheme' => Scheme_Typography::TYPOGRAPHY_3,
613
+ 'selector' => '{{WRAPPER}} .ha-fun-factor__content-number',
614
  ]
615
  );
616
 
619
  [
620
  'name' => 'fun_factor_number_shadow',
621
  'label' => __('Text Shadow', 'happy-elementor-addons'),
622
+ 'selector' => '{{WRAPPER}} .ha-fun-factor__content-number',
623
  ]
624
  );
625
 
643
  'type' => Controls_Manager::SLIDER,
644
  'size_units' => ['px'],
645
  'selectors' => [
646
+ '{{WRAPPER}} .ha-fun-factor__content-text' => 'margin-bottom: {{SIZE}}{{UNIT}};'
647
  ]
648
  ]
649
  );
654
  'label' => __('Color', 'happy-elementor-addons'),
655
  'type' => Controls_Manager::COLOR,
656
  'selectors' => [
657
+ '{{WRAPPER}} .ha-fun-factor__content-text' => 'color: {{VALUE}};',
658
  ],
659
  ]
660
  );
665
  'name' => 'content_typography',
666
  'label' => __('Typography', 'happy-elementor-addons'),
667
  'scheme' => Scheme_Typography::TYPOGRAPHY_3,
668
+ 'selector' => '{{WRAPPER}} .ha-fun-factor__content-text',
669
  ]
670
  );
671
 
674
  [
675
  'name' => 'fun_factor_content_shadow',
676
  'label' => __('Text Shadow', 'happy-elementor-addons'),
677
+ 'selector' => '{{WRAPPER}} .ha-fun-factor__content-text',
678
  ]
679
  );
680
 
710
  'unit' => '%'
711
  ],
712
  'selectors' => [
713
+ '{{WRAPPER}} .ha-fun-factor__divider' => 'width: {{SIZE}}{{UNIT}} !important;',
714
  ],
715
  ]
716
  );
725
  'px' => 1
726
  ],
727
  'selectors' => [
728
+ '{{WRAPPER}} .ha-fun-factor__divider' => 'height: {{SIZE}}{{UNIT}} !important;',
729
  ],
730
  ]
731
  );
736
  'label' => __('Border Radius', 'happy-elementor-addons'),
737
  'type' => Controls_Manager::DIMENSIONS,
738
  'selectors' => [
739
+ '{{WRAPPER}} .ha-fun-factor__divider' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
740
  ],
741
  ]
742
  );
747
  'label' => __('Color', 'happy-elementor-addons'),
748
  'type' => Controls_Manager::COLOR,
749
  'selectors' => [
750
+ '{{WRAPPER}} .ha-fun-factor__divider' => 'background-color: {{VALUE}} !important;',
751
  ],
752
  ]
753
  );
759
  'type' => Controls_Manager::SLIDER,
760
  'size_units' => ['px'],
761
  'selectors' => [
762
+ '{{WRAPPER}} .ha-fun-factor__divider' => 'margin-bottom: {{SIZE}}{{UNIT}};',
763
  ],
764
  ]
765
  );
770
  protected function render() {
771
  $settings = $this->get_settings_for_display();
772
 
773
+ $this->add_render_attribute('fun_factor_number', 'class', 'ha-fun-factor__content-number');
774
  $number = $settings['fun_factor_number'];
775
  $fun_factor_title = $settings['fun_factor_title'];
776
 
784
  }
785
  ?>
786
 
787
+ <div class="ha-fun-factor__wrap">
788
  <?php if (!empty($settings['icons']['value'])) : ?>
789
+ <div class="ha-fun-factor__media ha-fun-factor__media--icon">
790
+ <?php Icons_Manager::render_icon( $settings['icons'], ['aria-hidden' => 'true'] ); ?>
791
  </div>
792
  <?php elseif ( $settings['image']['url'] || $settings['image']['id'] ) : ?>
793
+ <div class="ha-fun-factor__media ha-fun-factor__media--image">
794
  <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
795
  </div>
796
  <?php endif; ?>
797
 
798
+ <div class="ha-fun-factor__content">
799
  <p <?php $this->print_render_attribute_string( 'fun_factor_number' ); ?> ><?php echo esc_html( $number ); ?></p>
800
  <?php if ( 'yes' === $settings['divider_show_hide'] ) : ?>
801
+ <span class="ha-fun-factor__divider ha-fun-factor__divider-align-<?php echo esc_attr( $settings['text_align'] ); ?>"></span>
802
  <?php endif; ?>
803
+ <?php printf( '<%1$s class="ha-fun-factor__content-text">%2$s</%1$s>',
804
  tag_escape( $settings['title_tag'] ),
805
+ ha_kses_basic( $fun_factor_title )
806
  ); ?>
807
  </div>
808
  </div>
widgets/gradient-heading/widget.php CHANGED
@@ -76,7 +76,7 @@ class Gradient_Heading extends Base {
76
  'label' => __( 'Link', 'happy-elementor-addons' ),
77
  'type' => Controls_Manager::URL,
78
  'separator' => 'before',
79
- 'placeholder' => 'https://happyaddons.com/',
80
  'dynamic' => [
81
  'active' => true,
82
  ]
76
  'label' => __( 'Link', 'happy-elementor-addons' ),
77
  'type' => Controls_Manager::URL,
78
  'separator' => 'before',
79
+ 'placeholder' => 'https://example.com',
80
  'dynamic' => [
81
  'active' => true,
82
  ]
widgets/icon-box/widget.php CHANGED
@@ -119,7 +119,7 @@ class Icon_Box extends Base {
119
  'label' => __( 'Box Link', 'happy-elementor-addons' ),
120
  'separator' => 'before',
121
  'type' => Controls_Manager::URL,
122
- 'placeholder' => 'https://happyaddons.com/',
123
  'dynamic' => [
124
  'active' => true,
125
  ]
@@ -210,7 +210,7 @@ class Icon_Box extends Base {
210
  'size_units' => [ 'px' ],
211
  'range' => [
212
  'px' => [
213
- 'min' => 10,
214
  'max' => 300,
215
  ],
216
  ],
@@ -750,7 +750,7 @@ class Icon_Box extends Base {
750
  <#
751
  var iconHTML = migrated = '';
752
 
753
- if ( ha_has_icon_library() ) {
754
  iconHTML = elementor.helpers.renderIcon( view, settings.selected_icon, { 'aria-hidden': true }, 'i' , 'object' ),
755
  migrated = elementor.helpers.isIconMigrated( settings, 'selected_icon' );
756
  }
@@ -773,7 +773,7 @@ class Icon_Box extends Base {
773
 
774
  <# if ( settings.icon || settings.selected_icon.value ) { #>
775
  <span class="ha-icon-box-icon">
776
- <# if ( ha_has_icon_library() && iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
777
  {{{ iconHTML.value }}}
778
  <# } else { #>
779
  <i class="{{ settings.icon }}" aria-hidden="true"></i>
119
  'label' => __( 'Box Link', 'happy-elementor-addons' ),
120
  'separator' => 'before',
121
  'type' => Controls_Manager::URL,
122
+ 'placeholder' => 'https://example.com',
123
  'dynamic' => [
124
  'active' => true,
125
  ]
210
  'size_units' => [ 'px' ],
211
  'range' => [
212
  'px' => [
213
+ 'min' => 6,
214
  'max' => 300,
215
  ],
216
  ],
750
  <#
751
  var iconHTML = migrated = '';
752
 
753
+ if ( ha.hasIconLibrary() ) {
754
  iconHTML = elementor.helpers.renderIcon( view, settings.selected_icon, { 'aria-hidden': true }, 'i' , 'object' ),
755
  migrated = elementor.helpers.isIconMigrated( settings, 'selected_icon' );
756
  }
773
 
774
  <# if ( settings.icon || settings.selected_icon.value ) { #>
775
  <span class="ha-icon-box-icon">
776
+ <# if ( ha.hasIconLibrary() && iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
777
  {{{ iconHTML.value }}}
778
  <# } else { #>
779
  <i class="{{ settings.icon }}" aria-hidden="true"></i>
widgets/infobox/widget.php CHANGED
@@ -14,46 +14,49 @@ use Elementor\Group_Control_Border;
14
  use Elementor\Group_Control_Box_Shadow;
15
  use Elementor\Group_Control_Image_Size;
16
  use Elementor\Group_Control_Typography;
 
17
 
18
  defined( 'ABSPATH' ) || die();
19
 
20
  class InfoBox extends Base {
21
 
22
- /**
23
- * Get widget title.
24
- *
25
- * @since 1.0.0
26
- * @access public
27
- *
28
- * @return string Widget title.
29
- */
30
- public function get_title() {
31
- return __( 'Info Box', 'happy-elementor-addons' );
32
- }
 
 
33
 
34
  public function get_custom_help_url() {
35
  return 'https://happyaddons.com/docs/happy-addons-for-elementor/widgets/info-box/';
36
  }
37
 
38
- /**
39
- * Get widget icon.
40
- *
41
- * @since 1.0.0
42
- * @access public
43
- *
44
- * @return string Widget icon.
45
- */
46
- public function get_icon() {
47
- return 'hm hm-blog-content';
48
- }
49
-
50
- public function get_keywords() {
51
- return [ 'info', 'blurb', 'box', 'text', 'content' ];
52
- }
53
-
54
- /**
55
- * Register content related controls
56
- */
57
  protected function register_content_controls() {
58
  $this->start_controls_section(
59
  '_section_media',
@@ -63,1006 +66,942 @@ class InfoBox extends Base {
63
  ]
64
  );
65
 
66
- $this->add_control(
67
- 'type',
68
- [
69
- 'label' => __( 'Media Type', 'happy-elementor-addons' ),
70
- 'type' => Controls_Manager::CHOOSE,
71
- 'label_block' => false,
72
- 'options' => [
73
- 'icon' => [
74
- 'title' => __( 'Icon', 'happy-elementor-addons' ),
75
- 'icon' => 'fa fa-smile-o',
76
- ],
77
- 'image' => [
78
- 'title' => __( 'Image', 'happy-elementor-addons' ),
79
- 'icon' => 'fa fa-image',
80
- ],
81
- ],
82
  'default' => 'icon',
83
  'toggle' => false,
84
- 'style_transfer' => true,
85
- ]
86
- );
87
-
88
- $this->add_control(
89
- 'image',
90
- [
91
- 'label' => __( 'Image', 'happy-elementor-addons' ),
92
- 'type' => Controls_Manager::MEDIA,
93
- 'default' => [
94
- 'url' => Utils::get_placeholder_image_src(),
95
- ],
96
- 'condition' => [
97
- 'type' => 'image'
98
- ],
99
- 'dynamic' => [
100
- 'active' => true,
101
- ]
102
- ]
103
- );
104
-
105
- $this->add_group_control(
106
- Group_Control_Image_Size::get_type(),
107
- [
108
- 'name' => 'thumbnail',
109
- 'default' => 'medium_large',
110
- 'separator' => 'none',
111
- 'exclude' => [
112
- 'full',
113
- 'custom',
114
- 'large',
115
- 'shop_catalog',
116
- 'shop_single',
117
- 'shop_thumbnail'
118
- ],
119
- 'condition' => [
120
- 'type' => 'image'
121
- ]
122
- ]
123
- );
124
-
125
- if ( ha_is_elementor_version( '<', '2.6.0' ) ) {
126
- $this->add_control(
127
- 'icon',
128
- [
129
- 'label' => __( 'Icon', 'happy-elementor-addons' ),
130
- 'label_block' => true,
131
- 'type' => Controls_Manager::ICON,
132
- 'options' => ha_get_happy_icons(),
133
- 'default' => 'fa fa-smile-o',
134
- 'condition' => [
135
- 'type' => 'icon'
136
- ]
137
- ]
138
- );
139
- } else {
140
- $this->add_control(
141
- 'selected_icon',
142
- [
143
- 'type' => Controls_Manager::ICONS,
144
- 'fa4compatibility' => 'icon',
145
- 'label_block' => true,
146
- 'default' => [
147
- 'value' => 'fas fa-smile-wink',
148
- 'library' => 'fa-solid',
149
- ],
150
- 'condition' => [
151
- 'type' => 'icon'
152
- ]
153
- ]
154
- );
155
- }
156
-
157
- $this->end_controls_section();
158
-
159
- $this->start_controls_section(
160
- '_section_title',
161
- [
162
- 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
163
- 'tab' => Controls_Manager::TAB_CONTENT,
164
- ]
165
- );
166
-
167
- $this->add_control(
168
- 'title',
169
- [
170
- 'label' => __( 'Title', 'happy-elementor-addons' ),
171
- 'label_block' => true,
172
- 'type' => Controls_Manager::TEXT,
173
- 'default' => __( 'Happy Info Box Title', 'happy-elementor-addons' ),
174
- 'placeholder' => __( 'Type Info Box Title', 'happy-elementor-addons' ),
175
- 'dynamic' => [
176
- 'active' => true,
177
- ]
178
- ]
179
- );
180
-
181
- $this->add_control(
182
- 'description',
183
- [
184
- 'label' => __( 'Description', 'happy-elementor-addons' ),
185
- 'description' => ha_get_allowed_html_desc( 'intermediate' ),
186
- 'type' => Controls_Manager::TEXTAREA,
187
- 'default' => __( 'Happy info box description goes here', 'happy-elementor-addons' ),
188
- 'placeholder' => __( 'Type info box description', 'happy-elementor-addons' ),
189
- 'rows' => 5,
190
- 'dynamic' => [
191
- 'active' => true,
192
- ]
193
- ]
194
- );
195
-
196
- $this->add_control(
197
- 'title_tag',
198
- [
199
- 'label' => __( 'Title HTML Tag', 'happy-elementor-addons' ),
200
- 'type' => Controls_Manager::CHOOSE,
201
- 'options' => [
202
- 'h1' => [
203
- 'title' => __( 'H1', 'happy-elementor-addons' ),
204
- 'icon' => 'eicon-editor-h1'
205
- ],
206
- 'h2' => [
207
- 'title' => __( 'H2', 'happy-elementor-addons' ),
208
- 'icon' => 'eicon-editor-h2'
209
- ],
210
- 'h3' => [
211
- 'title' => __( 'H3', 'happy-elementor-addons' ),
212
- 'icon' => 'eicon-editor-h3'
213
- ],
214
- 'h4' => [
215
- 'title' => __( 'H4', 'happy-elementor-addons' ),
216
- 'icon' => 'eicon-editor-h4'
217
- ],
218
- 'h5' => [
219
- 'title' => __( 'H5', 'happy-elementor-addons' ),
220
- 'icon' => 'eicon-editor-h5'
221
- ],
222
- 'h6' => [
223
- 'title' => __( 'H6', 'happy-elementor-addons' ),
224
- 'icon' => 'eicon-editor-h6'
225
- ]
226
- ],
227
- 'default' => 'h2',
228
- 'toggle' => false,
229
- ]
230
- );
231
-
232
- $this->add_responsive_control(
233
- 'align',
234
- [
235
- 'label' => __( 'Alignment', 'happy-elementor-addons' ),
236
- 'type' => Controls_Manager::CHOOSE,
237
- 'options' => [
238
- 'left' => [
239
- 'title' => __( 'Left', 'happy-elementor-addons' ),
240
- 'icon' => 'fa fa-align-left',
241
- ],
242
- 'center' => [
243
- 'title' => __( 'Center', 'happy-elementor-addons' ),
244
- 'icon' => 'fa fa-align-center',
245
- ],
246
- 'right' => [
247
- 'title' => __( 'Right', 'happy-elementor-addons' ),
248
- 'icon' => 'fa fa-align-right',
249
- ],
250
- ],
251
- 'toggle' => true,
252
- 'selectors' => [
253
- '{{WRAPPER}}' => 'text-align: {{VALUE}};'
254
- ]
255
- ]
256
- );
257
-
258
- $this->end_controls_section();
259
-
260
- $this->start_controls_section(
261
- '_section_button',
262
- [
263
- 'label' => __( 'Button', 'happy-elementor-addons' ),
264
- 'tab' => Controls_Manager::TAB_CONTENT,
265
- ]
266
- );
267
-
268
- $this->add_control(
269
- 'button_text',
270
- [
271
- 'label' => __( 'Text', 'happy-elementor-addons' ),
272
- 'type' => Controls_Manager::TEXT,
273
- 'default' => __( 'Button Text', 'happy-elementor-addons' ),
274
- 'placeholder' => __( 'Type button text here', 'happy-elementor-addons' ),
275
- 'label_block' => true,
276
- 'dynamic' => [
277
- 'active' => true,
278
- ]
279
- ]
280
- );
281
-
282
- $this->add_control(
283
- 'button_link',
284
- [
285
- 'label' => __( 'Link', 'happy-elementor-addons' ),
286
- 'type' => Controls_Manager::URL,
287
- 'placeholder' => __( 'https://happyaddons.com/', 'happy-elementor-addons' ),
288
- 'dynamic' => [
289
- 'active' => true,
290
- ]
291
- ]
292
- );
293
-
294
- if ( ha_is_elementor_version( '<', '2.6.0' ) ) {
295
- $this->add_control(
296
- 'button_icon',
297
- [
298
- 'label' => __( 'Icon', 'happy-elementor-addons' ),
299
- 'label_block' => true,
300
- 'type' => Controls_Manager::ICON,
301
- 'options' => ha_get_happy_icons(),
302
- 'default' => 'fa fa-angle-right',
303
- ]
304
- );
305
-
306
- $condition = ['button_icon!' => ''];
307
- } else {
308
- $this->add_control(
309
- 'button_selected_icon',
310
- [
311
- 'type' => Controls_Manager::ICONS,
312
- 'fa4compatibility' => 'button_icon',
313
- 'label_block' => true,
314
- ]
315
- );
316
- $condition = ['button_selected_icon[value]!' => ''];
317
- }
318
-
319
- $this->add_control(
320
- 'button_icon_position',
321
- [
322
- 'label' => __( 'Icon Position', 'happy-elementor-addons' ),
323
- 'type' => Controls_Manager::CHOOSE,
324
- 'label_block' => false,
325
- 'options' => [
326
- 'before' => [
327
- 'title' => __( 'Before', 'happy-elementor-addons' ),
328
- 'icon' => 'eicon-h-align-left',
329
- ],
330
- 'after' => [
331
- 'title' => __( 'After', 'happy-elementor-addons' ),
332
- 'icon' => 'eicon-h-align-right',
333
- ],
334
- ],
335
- 'default' => 'after',
336
- 'toggle' => false,
337
- 'condition' => $condition,
338
- 'style_transfer' => true,
339
- ]
340
- );
341
-
342
- $this->add_control(
343
- 'button_icon_spacing',
344
- [
345
- 'label' => __( 'Icon Spacing', 'happy-elementor-addons' ),
346
- 'type' => Controls_Manager::SLIDER,
347
- 'default' => [
348
- 'size' => 10
349
- ],
350
- 'condition' => $condition,
351
- 'selectors' => [
352
- '{{WRAPPER}} .ha-btn--icon-before .ha-btn-icon' => 'margin-right: {{SIZE}}{{UNIT}};',
353
- '{{WRAPPER}} .ha-btn--icon-after .ha-btn-icon' => 'margin-left: {{SIZE}}{{UNIT}};',
354
- ],
355
- ]
356
- );
357
-
358
- $this->end_controls_section();
359
- }
360
-
361
- /**
362
- * Register styles related controls
363
- */
364
- protected function register_style_controls() {
365
- $this->start_controls_section(
366
- '_section_media_style',
367
- [
368
- 'label' => __( 'Icon / Image', 'happy-elementor-addons' ),
369
- 'tab' => Controls_Manager::TAB_STYLE,
370
- ]
371
- );
372
-
373
- $this->add_responsive_control(
374
- 'icon_size',
375
- [
376
- 'label' => __( 'Size', 'happy-elementor-addons' ),
377
- 'type' => Controls_Manager::SLIDER,
378
- 'size_units' => [ 'px' ],
379
- 'range' => [
380
- 'px' => [
381
- 'min' => 10,
382
- 'max' => 300,
383
- ],
384
- ],
385
- 'selectors' => [
386
- '{{WRAPPER}} .ha-infobox-figure--icon' => 'font-size: {{SIZE}}{{UNIT}};',
387
- ],
388
- 'condition' => [
389
- 'type' => 'icon'
390
- ]
391
- ]
392
- );
393
-
394
- $this->add_responsive_control(
395
- 'image_width',
396
- [
397
- 'label' => __( 'Width', 'happy-elementor-addons' ),
398
- 'type' => Controls_Manager::SLIDER,
399
- 'size_units' => [ 'px', '%' ],
400
- 'range' => [
401
- 'px' => [
402
- 'min' => 1,
403
- 'max' => 400,
404
- ],
405
- '%' => [
406
- 'min' => 1,
407
- 'max' => 100,
408
- ],
409
- ],
410
- 'selectors' => [
411
- '{{WRAPPER}} .ha-infobox-figure--image' => 'width: {{SIZE}}{{UNIT}};',
412
- ],
413
- 'condition' => [
414
- 'type' => 'image'
415
- ]
416
- ]
417
- );
418
-
419
- $this->add_responsive_control(
420
- 'image_height',
421
- [
422
- 'label' => __( 'Height', 'happy-elementor-addons' ),
423
- 'type' => Controls_Manager::SLIDER,
424
- 'size_units' => [ 'px' ],
425
- 'range' => [
426
- 'px' => [
427
- 'min' => 1,
428
- 'max' => 400,
429
- ],
430
- ],
431
- 'selectors' => [
432
- '{{WRAPPER}} .ha-infobox-figure--image' => 'height: {{SIZE}}{{UNIT}};',
433
- ],
434
- 'condition' => [
435
- 'type' => 'image'
436
- ]
437
- ]
438
- );
439
-
440
- $this->add_control(
441
- 'offset_toggle',
442
- [
443
- 'label' => __( 'Offset', 'happy-elementor-addons' ),
444
- 'type' => Controls_Manager::POPOVER_TOGGLE,
445
- 'label_off' => __( 'None', 'happy-elementor-addons' ),
446
- 'label_on' => __( 'Custom', 'happy-elementor-addons' ),
447
- 'return_value' => 'yes',
448
- ]
449
- );
450
-
451
- $this->start_popover();
452
-
453
- $this->add_responsive_control(
454
- 'media_offset_x',
455
- [
456
- 'label' => __( 'Offset Left', 'happy-elementor-addons' ),
457
- 'type' => Controls_Manager::SLIDER,
458
- 'size_units' => ['px'],
459
- 'condition' => [
460
- 'offset_toggle' => 'yes'
461
- ],
462
- 'range' => [
463
- 'px' => [
464
- 'min' => -1000,
465
- 'max' => 1000,
466
- ],
467
- ],
468
- 'render_type' => 'ui',
469
- ]
470
- );
471
-
472
- $this->add_responsive_control(
473
- 'media_offset_y',
474
- [
475
- 'label' => __( 'Offset Top', 'happy-elementor-addons' ),
476
- 'type' => Controls_Manager::SLIDER,
477
- 'size_units' => ['px'],
478
- 'condition' => [
479
- 'offset_toggle' => 'yes'
480
- ],
481
- 'range' => [
482
- 'px' => [
483
- 'min' => -1000,
484
- 'max' => 1000,
485
- ],
486
- ],
487
- 'selectors' => [
488
- // Media translate styles
489
- '(desktop){{WRAPPER}} .ha-infobox-figure' => '-ms-transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}});',
490
- '(tablet){{WRAPPER}} .ha-infobox-figure' => '-ms-transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}});',
491
- '(mobile){{WRAPPER}} .ha-infobox-figure' => '-ms-transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}});',
492
- // Body text styles
493
- '{{WRAPPER}} .ha-infobox-body' => 'margin-top: {{SIZE}}{{UNIT}};',
494
- ],
495
- ]
496
- );
497
- $this->end_popover();
498
-
499
- $this->add_responsive_control(
500
- 'media_spacing',
501
- [
502
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
503
- 'type' => Controls_Manager::SLIDER,
504
- 'size_units' => ['px'],
505
- 'selectors' => [
506
- '{{WRAPPER}} .ha-infobox-figure' => 'margin-bottom: {{SIZE}}{{UNIT}} !important;',
507
- ],
508
- ]
509
- );
510
-
511
- $this->add_responsive_control(
512
- 'media_padding',
513
- [
514
- 'label' => __( 'Padding', 'happy-elementor-addons' ),
515
- 'type' => Controls_Manager::SLIDER,
516
- 'size_units' => ['px'],
517
- 'selectors' => [
518
- '{{WRAPPER}} .ha-infobox-figure--image img, {{WRAPPER}} .ha-infobox-figure--icon' => 'padding: {{SIZE}}{{UNIT}};',
519
- ],
520
- ]
521
- );
522
-
523
- $this->add_group_control(
524
- Group_Control_Border::get_type(),
525
- [
526
- 'name' => 'media_border',
527
- 'selector' => '{{WRAPPER}} .ha-infobox-figure--image img, {{WRAPPER}} .ha-infobox-figure--icon',
528
- ]
529
- );
530
-
531
- $this->add_responsive_control(
532
- 'media_border_radius',
533
- [
534
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
535
- 'type' => Controls_Manager::DIMENSIONS,
536
- 'size_units' => [ 'px', '%' ],
537
- 'selectors' => [
538
- '{{WRAPPER}} .ha-infobox-figure--image img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
539
- '{{WRAPPER}} .ha-infobox-figure--icon' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
540
- ],
541
- ]
542
- );
543
-
544
- $this->add_group_control(
545
- Group_Control_Box_Shadow::get_type(),
546
- [
547
- 'name' => 'media_box_shadow',
548
- 'exclude' => [
549
- 'box_shadow_position',
550
- ],
551
- 'selector' => '{{WRAPPER}} .ha-infobox-figure--image img, {{WRAPPER}} .ha-infobox-figure--icon'
552
- ]
553
- );
554
-
555
- $this->add_control(
556
- 'icon_color',
557
- [
558
- 'label' => __( 'Color', 'happy-elementor-addons' ),
559
- 'type' => Controls_Manager::COLOR,
560
- 'selectors' => [
561
- '{{WRAPPER}} .ha-infobox-figure--icon' => 'color: {{VALUE}}',
562
- ],
563
- 'condition' => [
564
- 'type' => 'icon'
565
- ]
566
- ]
567
- );
568
-
569
- $this->add_control(
570
- 'icon_bg_color',
571
- [
572
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
573
- 'type' => Controls_Manager::COLOR,
574
- 'selectors' => [
575
- '{{WRAPPER}} .ha-infobox-figure--icon' => 'background-color: {{VALUE}};',
576
- ],
577
- 'condition' => [
578
- 'type' => 'icon'
579
- ]
580
- ]
581
- );
582
-
583
- $this->add_control(
584
- 'icon_bg_rotate',
585
- [
586
- 'label' => __( 'Background Rotate', 'happy-elementor-addons' ),
587
- 'type' => Controls_Manager::SLIDER,
588
- 'size_units' => [ 'deg' ],
589
- 'default' => [
590
- 'unit' => 'deg',
591
- ],
592
- 'range' => [
593
- 'deg' => [
594
- 'min' => 0,
595
- 'max' => 360,
596
- ],
597
- ],
598
- 'selectors' => [
599
- // Icon rotate styles
600
- '{{WRAPPER}} .ha-infobox-figure--icon > i' => '-ms-transform: rotate(-{{SIZE}}{{UNIT}}); -webkit-transform: rotate(-{{SIZE}}{{UNIT}}); transform: rotate(-{{SIZE}}{{UNIT}});',
601
- // Icon box transform styles
602
- '(desktop){{WRAPPER}} .ha-infobox-figure--icon' => '-ms-transform: translate({{media_offset_x.SIZE || 0}}px, {{media_offset_y.SIZE || 0}}px) rotate({{SIZE}}deg); -webkit-transform: translate({{media_offset_x.SIZE || 0}}px, {{media_offset_y.SIZE || 0}}px) rotate({{SIZE}}deg); transform: translate({{media_offset_x.SIZE || 0}}px, {{media_offset_y.SIZE || 0}}px) rotate({{SIZE}}deg);',
603
- '(tablet){{WRAPPER}} .ha-infobox-figure--icon' => '-ms-transform: translate({{media_offset_x_tablet.SIZE || 0}}px, {{media_offset_y_tablet.SIZE || 0}}px) rotate({{SIZE}}deg); -webkit-transform: translate({{media_offset_x_tablet.SIZE || 0}}px, {{media_offset_y_tablet.SIZE || 0}}px) rotate({{SIZE}}deg); transform: translate({{media_offset_x_tablet.SIZE || 0}}px, {{media_offset_y_tablet.SIZE || 0}}px) rotate({{SIZE}}deg);',
604
- '(mobile){{WRAPPER}} .ha-infobox-figure--icon' => '-ms-transform: translate({{media_offset_x_mobile.SIZE || 0}}px, {{media_offset_y_mobile.SIZE || 0}}px) rotate({{SIZE}}deg); -webkit-transform: translate({{media_offset_x_mobile.SIZE || 0}}px, {{media_offset_y_mobile.SIZE || 0}}px) rotate({{SIZE}}deg); transform: translate({{media_offset_x_mobile.SIZE || 0}}px, {{media_offset_y_mobile.SIZE || 0}}px) rotate({{SIZE}}deg);',
605
- ],
606
- ]
607
- );
608
-
609
- $this->end_controls_section();
610
-
611
- $this->start_controls_section(
612
- '_section_title_style',
613
- [
614
- 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
615
- 'tab' => Controls_Manager::TAB_STYLE,
616
- ]
617
- );
618
-
619
- $this->add_responsive_control(
620
- 'content_padding',
621
- [
622
- 'label' => __( 'Content Box Padding', 'happy-elementor-addons' ),
623
- 'type' => Controls_Manager::DIMENSIONS,
624
- 'size_units' => [ 'px', 'em', '%' ],
625
- 'selectors' => [
626
- '{{WRAPPER}} .ha-infobox-body' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
627
- ],
628
- ]
629
- );
630
-
631
- $this->add_control(
632
- 'title_heading',
633
- [
634
- 'type' => Controls_Manager::HEADING,
635
- 'label' => __( 'Title', 'happy-elementor-addons' ),
636
- 'separator' => 'before'
637
- ]
638
- );
639
-
640
- $this->add_responsive_control(
641
- 'title_spacing',
642
- [
643
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
644
- 'type' => Controls_Manager::SLIDER,
645
- 'size_units' => ['px'],
646
- 'selectors' => [
647
- '{{WRAPPER}} .ha-infobox-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
648
- ],
649
- ]
650
- );
651
-
652
- $this->add_control(
653
- 'title_color',
654
- [
655
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
656
- 'type' => Controls_Manager::COLOR,
657
- 'selectors' => [
658
- '{{WRAPPER}} .ha-infobox-title' => 'color: {{VALUE}};',
659
- ],
660
- ]
661
- );
662
-
663
- $this->add_group_control(
664
- Group_Control_Typography::get_type(),
665
- [
666
- 'name' => 'title_typography',
667
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
668
- 'selector' => '{{WRAPPER}} .ha-infobox-title',
669
- 'scheme' => Scheme_Typography::TYPOGRAPHY_2
670
- ]
671
- );
672
-
673
- $this->add_control(
674
- 'description_heading',
675
- [
676
- 'type' => Controls_Manager::HEADING,
677
- 'label' => __( 'Description', 'happy-elementor-addons' ),
678
- 'separator' => 'before'
679
- ]
680
- );
681
-
682
- $this->add_responsive_control(
683
- 'description_spacing',
684
- [
685
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
686
- 'type' => Controls_Manager::SLIDER,
687
- 'size_units' => ['px'],
688
- 'selectors' => [
689
- '{{WRAPPER}} .ha-infobox-text' => 'margin-bottom: {{SIZE}}{{UNIT}};',
690
- ],
691
- ]
692
- );
693
-
694
- $this->add_control(
695
- 'description_color',
696
- [
697
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
698
- 'type' => Controls_Manager::COLOR,
699
- 'selectors' => [
700
- '{{WRAPPER}} .ha-infobox-text' => 'color: {{VALUE}};',
701
- ],
702
- ]
703
- );
704
-
705
- $this->add_group_control(
706
- Group_Control_Typography::get_type(),
707
- [
708
- 'name' => 'description_typography',
709
- 'label' => __( 'Typography', 'happy-elementor-addons' ),
710
- 'selector' => '{{WRAPPER}} .ha-infobox-text',
711
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
712
- ]
713
- );
714
-
715
- $this->end_controls_section();
716
-
717
- $this->start_controls_section(
718
- '_section_style_button',
719
- [
720
- 'label' => __( 'Button', 'happy-elementor-addons' ),
721
- 'tab' => Controls_Manager::TAB_STYLE,
722
- ]
723
- );
724
-
725
- $this->add_responsive_control(
726
- 'link_padding',
727
- [
728
- 'label' => __( 'Padding', 'happy-elementor-addons' ),
729
- 'type' => Controls_Manager::DIMENSIONS,
730
- 'size_units' => [ 'px', 'em', '%' ],
731
- 'selectors' => [
732
- '{{WRAPPER}} .ha-btn' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
733
- ],
734
- ]
735
- );
736
-
737
- $this->add_group_control(
738
- Group_Control_Typography::get_type(),
739
- [
740
- 'name' => 'btn_typography',
741
- 'selector' => '{{WRAPPER}} .ha-btn',
742
- 'scheme' => Scheme_Typography::TYPOGRAPHY_4,
743
- ]
744
- );
745
-
746
- $this->add_group_control(
747
- Group_Control_Border::get_type(),
748
- [
749
- 'name' => 'button_border',
750
- 'selector' => '{{WRAPPER}} .ha-btn',
751
- ]
752
- );
753
-
754
- $this->add_control(
755
- 'button_border_radius',
756
- [
757
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
758
- 'type' => Controls_Manager::DIMENSIONS,
759
- 'size_units' => [ 'px', '%' ],
760
- 'selectors' => [
761
- '{{WRAPPER}} .ha-btn' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
762
- ],
763
- ]
764
- );
765
-
766
- $this->add_group_control(
767
- Group_Control_Box_Shadow::get_type(),
768
- [
769
- 'name' => 'button_box_shadow',
770
- 'selector' => '{{WRAPPER}} .ha-btn',
771
- ]
772
- );
773
-
774
- $this->add_control(
775
- 'hr',
776
- [
777
- 'type' => Controls_Manager::DIVIDER,
778
- 'style' => 'thick',
779
- ]
780
- );
781
-
782
- $this->start_controls_tabs( '_tabs_button' );
783
-
784
- $this->start_controls_tab(
785
- '_tab_button_normal',
786
- [
787
- 'label' => __( 'Normal', 'happy-elementor-addons' ),
788
- ]
789
- );
790
-
791
- $this->add_control(
792
- 'link_color',
793
- [
794
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
795
- 'type' => Controls_Manager::COLOR,
796
- 'default' => '',
797
- 'selectors' => [
798
- '{{WRAPPER}} .ha-btn' => 'color: {{VALUE}};',
799
- ],
800
- ]
801
- );
802
-
803
- $this->add_control(
804
- 'button_bg_color',
805
- [
806
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
807
- 'type' => Controls_Manager::COLOR,
808
- 'selectors' => [
809
- '{{WRAPPER}} .ha-btn' => 'background-color: {{VALUE}};',
810
- ],
811
- ]
812
- );
813
-
814
- $this->add_control(
815
- 'button_icon_translate',
816
- [
817
- 'label' => __( 'Icon Translate X', 'happy-elementor-addons' ),
818
- 'type' => Controls_Manager::SLIDER,
819
- 'range' => [
820
- 'px' => [
821
- 'min' => -100,
822
- 'max' => 100,
823
- ],
824
- ],
825
- 'selectors' => [
826
- '{{WRAPPER}} .ha-btn--icon-before .ha-btn-icon' => '-webkit-transform: translateX(calc(-1 * {{SIZE}}{{UNIT}})); transform: translateX(calc(-1 * {{SIZE}}{{UNIT}}));',
827
- '{{WRAPPER}} .ha-btn--icon-after .ha-btn-icon' => '-webkit-transform: translateX({{SIZE}}{{UNIT}}); transform: translateX({{SIZE}}{{UNIT}});',
828
- ],
829
- ]
830
- );
831
-
832
- $this->end_controls_tab();
833
-
834
- $this->start_controls_tab(
835
- '_tab_button_hover',
836
- [
837
- 'label' => __( 'Hover', 'happy-elementor-addons' ),
838
- ]
839
- );
840
-
841
- $this->add_control(
842
- 'link_hover_color',
843
- [
844
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
845
- 'type' => Controls_Manager::COLOR,
846
- 'selectors' => [
847
- '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'color: {{VALUE}};',
848
- ],
849
- ]
850
- );
851
-
852
- $this->add_control(
853
- 'button_hover_bg_color',
854
- [
855
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
856
- 'type' => Controls_Manager::COLOR,
857
- 'selectors' => [
858
- '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'background-color: {{VALUE}};',
859
- ],
860
- ]
861
- );
862
-
863
- $this->add_control(
864
- 'button_hover_border_color',
865
- [
866
- 'label' => __( 'Border Color', 'happy-elementor-addons' ),
867
- 'type' => Controls_Manager::COLOR,
868
- 'condition' => [
869
- 'button_border_border!' => '',
870
- ],
871
- 'selectors' => [
872
- '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'border-color: {{VALUE}};',
873
- ],
874
- ]
875
- );
876
-
877
- $this->add_control(
878
- 'button_hover_icon_translate',
879
- [
880
- 'label' => __( 'Icon Translate X', 'happy-elementor-addons' ),
881
- 'type' => Controls_Manager::SLIDER,
882
- 'default' => [
883
- 'size' => 10
884
- ],
885
- 'range' => [
886
- 'px' => [
887
- 'min' => -100,
888
- 'max' => 100,
889
- ],
890
- ],
891
- 'selectors' => [
892
- '{{WRAPPER}} .ha-btn.ha-btn--icon-before:hover .ha-btn-icon' => '-webkit-transform: translateX(calc(-1 * {{SIZE}}{{UNIT}})); transform: translateX(calc(-1 * {{SIZE}}{{UNIT}}));',
893
- '{{WRAPPER}} .ha-btn.ha-btn--icon-after:hover .ha-btn-icon' => '-webkit-transform: translateX({{SIZE}}{{UNIT}}); transform: translateX({{SIZE}}{{UNIT}});',
894
- ],
895
- ]
896
- );
897
-
898
- $this->end_controls_tab();
899
- $this->end_controls_tabs();
900
-
901
- $this->end_controls_section();
902
- }
903
 
904
  protected function render() {
905
- $settings = $this->get_settings_for_display();
906
-
907
- $this->add_inline_editing_attributes( 'title', 'basic' );
908
- $this->add_render_attribute( 'title', 'class', 'ha-infobox-title' );
909
-
910
- $this->add_inline_editing_attributes( 'description', 'intermediate' );
911
- $this->add_render_attribute( 'description', 'class', 'ha-infobox-text' );
912
-
913
- $this->add_inline_editing_attributes( 'button_text', 'none' );
914
- $this->add_render_attribute( 'button_text', 'class', 'ha-btn-text' );
915
-
916
- $this->add_render_attribute( 'button', 'class', 'ha-btn ha-btn--link' );
917
- $this->add_link_attributes( 'button', $settings['button_link'] );
918
- ?>
919
-
920
- <?php if ( $settings['type'] === 'image' && ( $settings['image']['url'] || $settings['image']['id'] ) ) :
921
- $this->add_render_attribute( 'image', 'src', $settings['image']['url'] );
922
- $this->add_render_attribute( 'image', 'alt', Control_Media::get_image_alt( $settings['image'] ) );
923
- $this->add_render_attribute( 'image', 'title', Control_Media::get_image_title( $settings['image'] ) );
924
- $settings['hover_animation'] = 'disable-animation'; // hack to prevent image hover animation
925
- ?>
926
- <figure class="ha-infobox-figure ha-infobox-figure--image">
927
- <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
928
- </figure>
929
- <?php elseif ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon']['value'] ) ) : ?>
930
- <figure class="ha-infobox-figure ha-infobox-figure--icon">
931
- <?php ha_render_icon( $settings, 'icon', 'selected_icon' ); ?>
932
- </figure>
933
- <?php endif; ?>
934
-
935
- <div class="ha-infobox-body">
936
- <?php
937
- if ( $settings['title' ] ) :
938
- printf( '<%1$s %2$s>%3$s</%1$s>',
939
- tag_escape( $settings['title_tag'] ),
940
- $this->get_render_attribute_string( 'title' ),
941
- ha_kses_basic( $settings['title' ] )
942
- );
943
- endif;
944
- ?>
945
-
946
- <?php if ( $settings['description'] ) : ?>
947
- <div <?php $this->print_render_attribute_string( 'description' ); ?>>
948
- <p><?php echo ha_kses_intermediate( $settings['description'] ); ?></p>
949
- </div>
950
- <?php endif; ?>
951
-
952
- <?php
953
- if ( $settings['button_text'] && ( empty( $settings['button_selected_icon'] ) && empty( $settings['button_icon'] ) ) ) :
954
- printf( '<a %1$s>%2$s</a>',
955
- $this->get_render_attribute_string( 'button' ),
956
- sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( 'button_text' ), esc_html( $settings['button_text'] ) )
957
- );
958
- elseif ( empty( $settings['button_text'] ) && ( ! empty( $settings['button_icon'] ) || ! empty( $settings['button_selected_icon'] ) ) ) : ?>
959
- <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php ha_render_icon( $settings, 'button_icon', 'button_selected_icon' ); ?></a>
960
- <?php elseif ( $settings['button_text'] && ( ! empty( $settings['button_icon'] ) || ! empty( $settings['button_selected_icon'] ) ) ) :
961
- if ( $settings['button_icon_position'] === 'before' ) :
962
- $this->add_render_attribute( 'button', 'class', 'ha-btn--icon-before' );
963
- $button_text = sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( 'button_text' ), esc_html( $settings['button_text'] ) );
964
- ?>
965
- <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php ha_render_icon( $settings, 'button_icon', 'button_selected_icon', ['class' => 'ha-btn-icon'] ); ?> <?php echo $button_text; ?></a>
966
- <?php
967
- else :
968
- $this->add_render_attribute( 'button', 'class', 'ha-btn--icon-after' );
969
- $button_text = sprintf( '<span %1$s>%2$s</span>', $this->get_render_attribute_string( 'button_text' ), esc_html( $settings['button_text'] ) );
970
- ?>
971
- <a <?php $this->print_render_attribute_string( 'button' ); ?>><?php echo $button_text; ?> <?php ha_render_icon( $settings, 'button_icon', 'button_selected_icon', ['class' => 'ha-btn-icon'] ); ?></a>
972
- <?php
973
- endif;
974
- endif;
975
- ?>
976
- </div>
977
- <?php
978
- }
979
-
980
- public function _content_template() {
981
- ?>
982
- <#
983
- var iconHTML = migrated = btnIconHTML = btnMigrated = btnIcon = '';
984
-
985
- if ( ha_has_icon_library() ) {
986
- iconHTML = elementor.helpers.renderIcon( view, settings.selected_icon, { 'aria-hidden': true }, 'i' , 'object' ),
987
- migrated = elementor.helpers.isIconMigrated( settings, 'selected_icon' );
988
- btnIconHTML = elementor.helpers.renderIcon( view, settings.button_selected_icon, { 'aria-hidden': true, 'class': 'ha-btn-icon' }, 'i' , 'object' ),
989
- btnMigrated = elementor.helpers.isIconMigrated( settings, 'button_selected_icon' );
990
- }
991
-
992
- view.addInlineEditingAttributes( 'title', 'basic' );
993
- view.addRenderAttribute( 'title', 'class', 'ha-infobox-title' );
994
-
995
- view.addInlineEditingAttributes( 'description', 'intermediate' );
996
- view.addRenderAttribute( 'description', 'class', 'ha-infobox-text' );
997
-
998
- view.addInlineEditingAttributes( 'button_text', 'none' );
999
- view.addRenderAttribute( 'button_text', 'class', 'ha-btn-text' );
1000
-
1001
- view.addRenderAttribute( 'button', 'class', 'ha-btn ha-btn--link' );
1002
- view.addRenderAttribute( 'button', 'href', settings.button_link.url );
1003
-
1004
- if ( settings.type === 'image' ) {
1005
- if ( settings.image.url ) {
1006
- var image = {
1007
- id: settings.image.id,
1008
- url: settings.image.url,
1009
- size: settings.thumbnail_size,
1010
- model: view.getEditModel()
1011
- };
1012
-
1013
- var image_url = elementor.imagesManager.getImageUrl( image );
1014
- #>
1015
- <figure class="ha-infobox-figure ha-infobox-figure--image">
1016
- <img src="{{ image_url }}">
1017
- </figure>
1018
- <# }
1019
- } else if ( settings.icon || settings.selected_icon.value ) { #>
1020
- <figure class="ha-infobox-figure ha-infobox-figure--icon">
1021
- <# if ( ha_has_icon_library() && iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
1022
- {{{ iconHTML.value }}}
1023
- <# } else { #>
1024
- <i class="{{ settings.icon }}" aria-hidden="true"></i>
1025
- <# } #>
1026
- </figure>
1027
- <# } #>
1028
-
1029
- <div class="ha-infobox-body">
1030
- <# if (settings.title) { #>
1031
- <{{ settings.title_tag }} {{{ view.getRenderAttributeString( 'title' ) }}}>{{ settings.title }}</{{ settings.title_tag }}>
1032
- <# } #>
1033
-
1034
- <# if (settings.description) { #>
1035
- <div {{{ view.getRenderAttributeString( 'description' ) }}}>
1036
- <p>{{{ settings.description }}}</p>
1037
- </div>
1038
- <# } #>
1039
-
1040
- <# if ( settings.button_selected_icon || settings.button_icon ) {
1041
- if ( ha_has_icon_library() && btnIconHTML && btnIconHTML.rendered && ( ! settings.button_icon || btnMigrated ) ) {
1042
- btnIcon = btnIconHTML.value;
1043
- } else if ( settings.button_icon ) {
1044
- btnIcon = '<i class="ha-btn-icon ' + settings.button_icon + '" aria-hidden="true"></i>';
1045
- }
1046
- } #>
1047
-
1048
- <# if ( settings.button_text && ( ! settings.button_selected_icon && ! settings.button_icon ) ) { #>
1049
- <a {{{ view.getRenderAttributeString( 'button' ) }}}><span {{{ view.getRenderAttributeString( 'button_text' ) }}}>{{ settings.button_text }}</span></a>
1050
- <# } else if ( ! settings.button_text && ( settings.button_selected_icon || settings.button_icon ) ) { #>
1051
- <a {{{ view.getRenderAttributeString( 'button' ) }}}>{{{ btnIcon }}}</a>
1052
- <# } else if ( settings.button_text && ( settings.button_selected_icon || settings.button_icon ) ) {
1053
- var button_before = button_after = '';
1054
- if ( settings.button_icon_position === 'before' ) {
1055
- view.addRenderAttribute( 'button', 'class', 'ha-btn--icon-before' );
1056
- button_before = btnIcon;
1057
- button_after = '<span ' + view.getRenderAttributeString( 'button_text' ) + '>' + settings.button_text + '</span>';
1058
- } else {
1059
- view.addRenderAttribute( 'button', 'class', 'ha-btn--icon-after' );
1060
- button_after = btnIcon;
1061
- button_before = '<span ' + view.getRenderAttributeString( 'button_text' ) + '>' + settings.button_text + '</span>';
1062
- } #>
1063
- <a {{{ view.getRenderAttributeString( 'button' ) }}}>{{{ button_before }}} {{{ button_after }}}</a>
1064
- <# } #>
1065
- </div>
1066
- <?php
1067
- }
1068
  }
14
  use Elementor\Group_Control_Box_Shadow;
15
  use Elementor\Group_Control_Image_Size;
16
  use Elementor\Group_Control_Typography;
17
+ use Happy_Addons\Elementor\Traits\Button_Renderer;
18
 
19
  defined( 'ABSPATH' ) || die();
20
 
21
  class InfoBox extends Base {
22
 
23
+ use Button_Renderer;
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 __( 'Info Box', 'happy-elementor-addons' );
35
+ }
36
 
37
  public function get_custom_help_url() {
38
  return 'https://happyaddons.com/docs/happy-addons-for-elementor/widgets/info-box/';
39
  }
40
 
41
+ /**
42
+ * Get widget icon.
43
+ *
44
+ * @since 1.0.0
45
+ * @access public
46
+ *
47
+ * @return string Widget icon.
48
+ */
49
+ public function get_icon() {
50
+ return 'hm hm-blog-content';
51
+ }
52
+
53
+ public function get_keywords() {
54
+ return [ 'info', 'blurb', 'box', 'text', 'content' ];
55
+ }
56
+
57
+ /**
58
+ * Register content related controls
59
+ */
60
  protected function register_content_controls() {
61
  $this->start_controls_section(
62
  '_section_media',
66
  ]
67
  );
68
 
69
+ $this->add_control(
70
+ 'type',
71
+ [
72
+ 'label' => __( 'Media Type', 'happy-elementor-addons' ),
73
+ 'type' => Controls_Manager::CHOOSE,
74
+ 'label_block' => false,
75
+ 'options' => [
76
+ 'icon' => [
77
+ 'title' => __( 'Icon', 'happy-elementor-addons' ),
78
+ 'icon' => 'fa fa-smile-o',
79
+ ],
80
+ 'image' => [
81
+ 'title' => __( 'Image', 'happy-elementor-addons' ),
82
+ 'icon' => 'fa fa-image',
83
+ ],
84
+ ],
85
  'default' => 'icon',
86
  'toggle' => false,
87
+ 'style_transfer' => true,
88
+ ]
89
+ );
90
+
91
+ $this->add_control(
92
+ 'image',
93
+ [
94
+ 'label' => __( 'Image', 'happy-elementor-addons' ),
95
+ 'type' => Controls_Manager::MEDIA,
96
+ 'default' => [
97
+ 'url' => Utils::get_placeholder_image_src(),
98
+ ],
99
+ 'condition' => [
100
+ 'type' => 'image'
101
+ ],
102
+ 'dynamic' => [
103
+ 'active' => true,
104
+ ]
105
+ ]
106
+ );
107
+
108
+ $this->add_group_control(
109
+ Group_Control_Image_Size::get_type(),
110
+ [
111
+ 'name' => 'thumbnail',
112
+ 'default' => 'medium_large',
113
+ 'separator' => 'none',
114
+ 'exclude' => [
115
+ 'full',
116
+ 'custom',
117
+ 'large',
118
+ 'shop_catalog',
119
+ 'shop_single',
120
+ 'shop_thumbnail'
121
+ ],
122
+ 'condition' => [
123
+ 'type' => 'image'
124
+ ]
125
+ ]
126
+ );
127
+
128
+ if ( ha_is_elementor_version( '<', '2.6.0' ) ) {
129
+ $this->add_control(
130
+ 'icon',
131
+ [
132
+ 'label' => __( 'Icon', 'happy-elementor-addons' ),
133
+ 'label_block' => true,
134
+ 'type' => Controls_Manager::ICON,
135
+ 'options' => ha_get_happy_icons(),
136
+ 'default' => 'fa fa-smile-o',
137
+ 'condition' => [
138
+ 'type' => 'icon'
139
+ ]
140
+ ]
141
+ );
142
+ } else {
143
+ $this->add_control(
144
+ 'selected_icon',
145
+ [
146
+ 'type' => Controls_Manager::ICONS,
147
+ 'fa4compatibility' => 'icon',
148
+ 'label_block' => true,
149
+ 'default' => [
150
+ 'value' => 'fas fa-smile-wink',
151
+ 'library' => 'fa-solid',
152
+ ],
153
+ 'condition' => [
154
+ 'type' => 'icon'
155
+ ]
156
+ ]
157
+ );
158
+ }
159
+
160
+ $this->end_controls_section();
161
+
162
+ $this->start_controls_section(
163
+ '_section_title',
164
+ [
165
+ 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
166
+ 'tab' => Controls_Manager::TAB_CONTENT,
167
+ ]
168
+ );
169
+
170
+ $this->add_control(
171
+ 'title',
172
+ [
173
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
174
+ 'label_block' => true,
175
+ 'type' => Controls_Manager::TEXT,
176
+ 'default' => __( 'Happy Info Box Title', 'happy-elementor-addons' ),
177
+ 'placeholder' => __( 'Type Info Box Title', 'happy-elementor-addons' ),
178
+ 'dynamic' => [
179
+ 'active' => true,
180
+ ]
181
+ ]
182
+ );
183
+
184
+ $this->add_control(
185
+ 'description',
186
+ [
187
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
188
+ 'description' => ha_get_allowed_html_desc( 'intermediate' ),
189
+ 'type' => Controls_Manager::TEXTAREA,
190
+ 'default' => __( 'Happy info box description goes here', 'happy-elementor-addons' ),
191
+ 'placeholder' => __( 'Type info box description', 'happy-elementor-addons' ),
192
+ 'rows' => 5,
193
+ 'dynamic' => [
194
+ 'active' => true,
195
+ ]
196
+ ]
197
+ );
198
+
199
+ $this->add_control(
200
+ 'title_tag',
201
+ [
202
+ 'label' => __( 'Title HTML Tag', 'happy-elementor-addons' ),
203
+ 'type' => Controls_Manager::CHOOSE,
204
+ 'options' => [
205
+ 'h1' => [
206
+ 'title' => __( 'H1', 'happy-elementor-addons' ),
207
+ 'icon' => 'eicon-editor-h1'
208
+ ],
209
+ 'h2' => [
210
+ 'title' => __( 'H2', 'happy-elementor-addons' ),
211
+ 'icon' => 'eicon-editor-h2'
212
+ ],
213
+ 'h3' => [
214
+ 'title' => __( 'H3', 'happy-elementor-addons' ),
215
+ 'icon' => 'eicon-editor-h3'
216
+ ],
217
+ 'h4' => [
218
+ 'title' => __( 'H4', 'happy-elementor-addons' ),
219
+ 'icon' => 'eicon-editor-h4'
220
+ ],
221
+ 'h5' => [
222
+ 'title' => __( 'H5', 'happy-elementor-addons' ),
223
+ 'icon' => 'eicon-editor-h5'
224
+ ],
225
+ 'h6' => [
226
+ 'title' => __( 'H6', 'happy-elementor-addons' ),
227
+ 'icon' => 'eicon-editor-h6'
228
+ ]
229
+ ],
230
+ 'default' => 'h2',
231
+ 'toggle' => false,
232
+ ]
233
+ );
234
+
235
+ $this->add_responsive_control(
236
+ 'align',
237
+ [
238
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
239
+ 'type' => Controls_Manager::CHOOSE,
240
+ 'options' => [
241
+ 'left' => [
242
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
243
+ 'icon' => 'fa fa-align-left',
244
+ ],
245
+ 'center' => [
246
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
247
+ 'icon' => 'fa fa-align-center',
248
+ ],
249
+ 'right' => [
250
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
251
+ 'icon' => 'fa fa-align-right',
252
+ ],
253
+ ],
254
+ 'toggle' => true,
255
+ 'selectors' => [
256
+ '{{WRAPPER}}' => 'text-align: {{VALUE}};'
257
+ ]
258
+ ]
259
+ );
260
+
261
+ $this->end_controls_section();
262
+
263
+ $this->start_controls_section(
264
+ '_section_button',
265
+ [
266
+ 'label' => __( 'Button', 'happy-elementor-addons' ),
267
+ 'tab' => Controls_Manager::TAB_CONTENT,
268
+ ]
269
+ );
270
+
271
+ $this->add_control(
272
+ 'button_text',
273
+ [
274
+ 'label' => __( 'Text', 'happy-elementor-addons' ),
275
+ 'type' => Controls_Manager::TEXT,
276
+ 'default' => __( 'Button Text', 'happy-elementor-addons' ),
277
+ 'placeholder' => __( 'Type button text here', 'happy-elementor-addons' ),
278
+ 'label_block' => true,
279
+ 'dynamic' => [
280
+ 'active' => true,
281
+ ]
282
+ ]
283
+ );
284
+
285
+ $this->add_control(
286
+ 'button_link',
287
+ [
288
+ 'label' => __( 'Link', 'happy-elementor-addons' ),
289
+ 'type' => Controls_Manager::URL,
290
+ 'placeholder' => 'https://example.com',
291
+ 'dynamic' => [
292
+ 'active' => true,
293
+ ]
294
+ ]
295
+ );
296
+
297
+ if ( ha_is_elementor_version( '<', '2.6.0' ) ) {
298
+ $this->add_control(
299
+ 'button_icon',
300
+ [
301
+ 'label' => __( 'Icon', 'happy-elementor-addons' ),
302
+ 'label_block' => true,
303
+ 'type' => Controls_Manager::ICON,
304
+ 'options' => ha_get_happy_icons(),
305
+ 'default' => 'fa fa-angle-right',
306
+ ]
307
+ );
308
+
309
+ $condition = ['button_icon!' => ''];
310
+ } else {
311
+ $this->add_control(
312
+ 'button_selected_icon',
313
+ [
314
+ 'type' => Controls_Manager::ICONS,
315
+ 'fa4compatibility' => 'button_icon',
316
+ 'label_block' => true,
317
+ ]
318
+ );
319
+ $condition = ['button_selected_icon[value]!' => ''];
320
+ }
321
+
322
+ $this->add_control(
323
+ 'button_icon_position',
324
+ [
325
+ 'label' => __( 'Icon Position', 'happy-elementor-addons' ),
326
+ 'type' => Controls_Manager::CHOOSE,
327
+ 'label_block' => false,
328
+ 'options' => [
329
+ 'before' => [
330
+ 'title' => __( 'Before', 'happy-elementor-addons' ),
331
+ 'icon' => 'eicon-h-align-left',
332
+ ],
333
+ 'after' => [
334
+ 'title' => __( 'After', 'happy-elementor-addons' ),
335
+ 'icon' => 'eicon-h-align-right',
336
+ ],
337
+ ],
338
+ 'default' => 'after',
339
+ 'toggle' => false,
340
+ 'condition' => $condition,
341
+ 'style_transfer' => true,
342
+ ]
343
+ );
344
+
345
+ $this->add_control(
346
+ 'button_icon_spacing',
347
+ [
348
+ 'label' => __( 'Icon Spacing', 'happy-elementor-addons' ),
349
+ 'type' => Controls_Manager::SLIDER,
350
+ 'default' => [
351
+ 'size' => 10
352
+ ],
353
+ 'condition' => $condition,
354
+ 'selectors' => [
355
+ '{{WRAPPER}} .ha-btn--icon-before .ha-btn-icon' => 'margin-right: {{SIZE}}{{UNIT}};',
356
+ '{{WRAPPER}} .ha-btn--icon-after .ha-btn-icon' => 'margin-left: {{SIZE}}{{UNIT}};',
357
+ ],
358
+ ]
359
+ );
360
+
361
+ $this->end_controls_section();
362
+ }
363
+
364
+ /**
365
+ * Register styles related controls
366
+ */
367
+ protected function register_style_controls() {
368
+ $this->start_controls_section(
369
+ '_section_media_style',
370
+ [
371
+ 'label' => __( 'Icon / Image', 'happy-elementor-addons' ),
372
+ 'tab' => Controls_Manager::TAB_STYLE,
373
+ ]
374
+ );
375
+
376
+ $this->add_responsive_control(
377
+ 'icon_size',
378
+ [
379
+ 'label' => __( 'Size', 'happy-elementor-addons' ),
380
+ 'type' => Controls_Manager::SLIDER,
381
+ 'size_units' => [ 'px' ],
382
+ 'range' => [
383
+ 'px' => [
384
+ 'min' => 6,
385
+ 'max' => 300,
386
+ ],
387
+ ],
388
+ 'selectors' => [
389
+ '{{WRAPPER}} .ha-infobox-figure--icon' => 'font-size: {{SIZE}}{{UNIT}};',
390
+ ],
391
+ 'condition' => [
392
+ 'type' => 'icon'
393
+ ]
394
+ ]
395
+ );
396
+
397
+ $this->add_responsive_control(
398
+ 'image_width',
399
+ [
400
+ 'label' => __( 'Width', 'happy-elementor-addons' ),
401
+ 'type' => Controls_Manager::SLIDER,
402
+ 'size_units' => [ 'px', '%' ],
403
+ 'range' => [
404
+ 'px' => [
405
+ 'min' => 1,
406
+ 'max' => 400,
407
+ ],
408
+ '%' => [
409
+ 'min' => 1,
410
+ 'max' => 100,
411
+ ],
412
+ ],
413
+ 'selectors' => [
414
+ '{{WRAPPER}} .ha-infobox-figure--image' => 'width: {{SIZE}}{{UNIT}};',
415
+ ],
416
+ 'condition' => [
417
+ 'type' => 'image'
418
+ ]
419
+ ]
420
+ );
421
+
422
+ $this->add_responsive_control(
423
+ 'image_height',
424
+ [
425
+ 'label' => __( 'Height', 'happy-elementor-addons' ),
426
+ 'type' => Controls_Manager::SLIDER,
427
+ 'size_units' => [ 'px' ],
428
+ 'range' => [
429
+ 'px' => [
430
+ 'min' => 1,
431
+ 'max' => 400,
432
+ ],
433
+ ],
434
+ 'selectors' => [
435
+ '{{WRAPPER}} .ha-infobox-figure--image' => 'height: {{SIZE}}{{UNIT}};',
436
+ ],
437
+ 'condition' => [
438
+ 'type' => 'image'
439
+ ]
440
+ ]
441
+ );
442
+
443
+ $this->add_control(
444
+ 'offset_toggle',
445
+ [
446
+ 'label' => __( 'Offset', 'happy-elementor-addons' ),
447
+ 'type' => Controls_Manager::POPOVER_TOGGLE,
448
+ 'label_off' => __( 'None', 'happy-elementor-addons' ),
449
+ 'label_on' => __( 'Custom', 'happy-elementor-addons' ),
450
+ 'return_value' => 'yes',
451
+ ]
452
+ );
453
+
454
+ $this->start_popover();
455
+
456
+ $this->add_responsive_control(
457
+ 'media_offset_x',
458
+ [
459
+ 'label' => __( 'Offset Left', 'happy-elementor-addons' ),
460
+ 'type' => Controls_Manager::SLIDER,
461
+ 'size_units' => ['px'],
462
+ 'condition' => [
463
+ 'offset_toggle' => 'yes'
464
+ ],
465
+ 'range' => [
466
+ 'px' => [
467
+ 'min' => -1000,
468
+ 'max' => 1000,
469
+ ],
470
+ ],
471
+ 'render_type' => 'ui',
472
+ ]
473
+ );
474
+
475
+ $this->add_responsive_control(
476
+ 'media_offset_y',
477
+ [
478
+ 'label' => __( 'Offset Top', 'happy-elementor-addons' ),
479
+ 'type' => Controls_Manager::SLIDER,
480
+ 'size_units' => ['px'],
481
+ 'condition' => [
482
+ 'offset_toggle' => 'yes'
483
+ ],
484
+ 'range' => [
485
+ 'px' => [
486
+ 'min' => -1000,
487
+ 'max' => 1000,
488
+ ],
489
+ ],
490
+ 'selectors' => [
491
+ // Media translate styles
492
+ '(desktop){{WRAPPER}} .ha-infobox-figure' => '-ms-transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x.SIZE || 0}}{{UNIT}}, {{media_offset_y.SIZE || 0}}{{UNIT}});',
493
+ '(tablet){{WRAPPER}} .ha-infobox-figure' => '-ms-transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x_tablet.SIZE || 0}}{{UNIT}}, {{media_offset_y_tablet.SIZE || 0}}{{UNIT}});',
494
+ '(mobile){{WRAPPER}} .ha-infobox-figure' => '-ms-transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}}); -webkit-transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}}); transform: translate({{media_offset_x_mobile.SIZE || 0}}{{UNIT}}, {{media_offset_y_mobile.SIZE || 0}}{{UNIT}});',
495
+ // Body text styles
496
+ '{{WRAPPER}} .ha-infobox-body' => 'margin-top: {{SIZE}}{{UNIT}};',
497
+ ],
498
+ ]
499
+ );
500
+ $this->end_popover();
501
+
502
+ $this->add_responsive_control(
503
+ 'media_spacing',
504
+ [
505
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
506
+ 'type' => Controls_Manager::SLIDER,
507
+ 'size_units' => ['px'],
508
+ 'selectors' => [
509
+ '{{WRAPPER}} .ha-infobox-figure' => 'margin-bottom: {{SIZE}}{{UNIT}} !important;',
510
+ ],
511
+ ]
512
+ );
513
+
514
+ $this->add_responsive_control(
515
+ 'media_padding',
516
+ [
517
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
518
+ 'type' => Controls_Manager::SLIDER,
519
+ 'size_units' => ['px'],
520
+ 'selectors' => [
521
+ '{{WRAPPER}} .ha-infobox-figure--image img, {{WRAPPER}} .ha-infobox-figure--icon' => 'padding: {{SIZE}}{{UNIT}};',
522
+ ],
523
+ ]
524
+ );
525
+
526
+ $this->add_group_control(
527
+ Group_Control_Border::get_type(),
528
+ [
529
+ 'name' => 'media_border',
530
+ 'selector' => '{{WRAPPER}} .ha-infobox-figure--image img, {{WRAPPER}} .ha-infobox-figure--icon',
531
+ ]
532
+ );
533
+
534
+ $this->add_responsive_control(
535
+ 'media_border_radius',
536
+ [
537
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
538
+ 'type' => Controls_Manager::DIMENSIONS,
539
+ 'size_units' => [ 'px', '%' ],
540
+ 'selectors' => [
541
+ '{{WRAPPER}} .ha-infobox-figure--image img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
542
+ '{{WRAPPER}} .ha-infobox-figure--icon' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
543
+ ],
544
+ ]
545
+ );
546
+
547
+ $this->add_group_control(
548
+ Group_Control_Box_Shadow::get_type(),
549
+ [
550
+ 'name' => 'media_box_shadow',
551
+ 'exclude' => [
552
+ 'box_shadow_position',
553
+ ],
554
+ 'selector' => '{{WRAPPER}} .ha-infobox-figure--image img, {{WRAPPER}} .ha-infobox-figure--icon'
555
+ ]
556
+ );
557
+
558
+ $this->add_control(
559
+ 'icon_color',
560
+ [
561
+ 'label' => __( 'Color', 'happy-elementor-addons' ),
562
+ 'type' => Controls_Manager::COLOR,
563
+ 'selectors' => [
564
+ '{{WRAPPER}} .ha-infobox-figure--icon' => 'color: {{VALUE}}',
565
+ ],
566
+ 'condition' => [
567
+ 'type' => 'icon'
568
+ ]
569
+ ]
570
+ );
571
+
572
+ $this->add_control(
573
+ 'icon_bg_color',
574
+ [
575
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
576
+ 'type' => Controls_Manager::COLOR,
577
+ 'selectors' => [
578
+ '{{WRAPPER}} .ha-infobox-figure--icon' => 'background-color: {{VALUE}};',
579
+ ],
580
+ 'condition' => [
581
+ 'type' => 'icon'
582
+ ]
583
+ ]
584
+ );
585
+
586
+ $this->add_control(
587
+ 'icon_bg_rotate',
588
+ [
589
+ 'label' => __( 'Background Rotate', 'happy-elementor-addons' ),
590
+ 'type' => Controls_Manager::SLIDER,
591
+ 'size_units' => [ 'deg' ],
592
+ 'default' => [
593
+ 'unit' => 'deg',
594
+ ],
595
+ 'range' => [
596
+ 'deg' => [
597
+ 'min' => 0,
598
+ 'max' => 360,
599
+ ],
600
+ ],
601
+ 'selectors' => [
602
+ // Icon rotate styles
603
+ '{{WRAPPER}} .ha-infobox-figure--icon i, {{WRAPPER}} .ha-infobox-figure--icon svg' => '-ms-transform: rotate(-{{SIZE}}{{UNIT}}); -webkit-transform: rotate(-{{SIZE}}{{UNIT}}); transform: rotate(-{{SIZE}}{{UNIT}});',
604
+ // Icon box transform styles
605
+ '(desktop){{WRAPPER}} .ha-infobox-figure--icon' => '-ms-transform: translate({{media_offset_x.SIZE || 0}}px, {{media_offset_y.SIZE || 0}}px) rotate({{SIZE}}deg); -webkit-transform: translate({{media_offset_x.SIZE || 0}}px, {{media_offset_y.SIZE || 0}}px) rotate({{SIZE}}deg); transform: translate({{media_offset_x.SIZE || 0}}px, {{media_offset_y.SIZE || 0}}px) rotate({{SIZE}}deg);',
606
+ '(tablet){{WRAPPER}} .ha-infobox-figure--icon' => '-ms-transform: translate({{media_offset_x_tablet.SIZE || 0}}px, {{media_offset_y_tablet.SIZE || 0}}px) rotate({{SIZE}}deg); -webkit-transform: translate({{media_offset_x_tablet.SIZE || 0}}px, {{media_offset_y_tablet.SIZE || 0}}px) rotate({{SIZE}}deg); transform: translate({{media_offset_x_tablet.SIZE || 0}}px, {{media_offset_y_tablet.SIZE || 0}}px) rotate({{SIZE}}deg);',
607
+ '(mobile){{WRAPPER}} .ha-infobox-figure--icon' => '-ms-transform: translate({{media_offset_x_mobile.SIZE || 0}}px, {{media_offset_y_mobile.SIZE || 0}}px) rotate({{SIZE}}deg); -webkit-transform: translate({{media_offset_x_mobile.SIZE || 0}}px, {{media_offset_y_mobile.SIZE || 0}}px) rotate({{SIZE}}deg); transform: translate({{media_offset_x_mobile.SIZE || 0}}px, {{media_offset_y_mobile.SIZE || 0}}px) rotate({{SIZE}}deg);',
608
+ ],
609
+ ]
610
+ );
611
+
612
+ $this->end_controls_section();
613
+
614
+ $this->start_controls_section(
615
+ '_section_title_style',
616
+ [
617
+ 'label' => __( 'Title & Description', 'happy-elementor-addons' ),
618
+ 'tab' => Controls_Manager::TAB_STYLE,
619
+ ]
620
+ );
621
+
622
+ $this->add_responsive_control(
623
+ 'content_padding',
624
+ [
625
+ 'label' => __( 'Content Box Padding', 'happy-elementor-addons' ),
626
+ 'type' => Controls_Manager::DIMENSIONS,
627
+ 'size_units' => [ 'px', 'em', '%' ],
628
+ 'selectors' => [
629
+ '{{WRAPPER}} .ha-infobox-body' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
630
+ ],
631
+ ]
632
+ );
633
+
634
+ $this->add_control(
635
+ 'title_heading',
636
+ [
637
+ 'type' => Controls_Manager::HEADING,
638
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
639
+ 'separator' => 'before'
640
+ ]
641
+ );
642
+
643
+ $this->add_responsive_control(
644
+ 'title_spacing',
645
+ [
646
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
647
+ 'type' => Controls_Manager::SLIDER,
648
+ 'size_units' => ['px'],
649
+ 'selectors' => [
650
+ '{{WRAPPER}} .ha-infobox-title' => 'margin-bottom: {{SIZE}}{{UNIT}};',
651
+ ],
652
+ ]
653
+ );
654
+
655
+ $this->add_control(
656
+ 'title_color',
657
+ [
658
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
659
+ 'type' => Controls_Manager::COLOR,
660
+ 'selectors' => [
661
+ '{{WRAPPER}} .ha-infobox-title' => 'color: {{VALUE}};',
662
+ ],
663
+ ]
664
+ );
665
+
666
+ $this->add_group_control(
667
+ Group_Control_Typography::get_type(),
668
+ [
669
+ 'name' => 'title_typography',
670
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
671
+ 'selector' => '{{WRAPPER}} .ha-infobox-title',
672
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2
673
+ ]
674
+ );
675
+
676
+ $this->add_control(
677
+ 'description_heading',
678
+ [
679
+ 'type' => Controls_Manager::HEADING,
680
+ 'label' => __( 'Description', 'happy-elementor-addons' ),
681
+ 'separator' => 'before'
682
+ ]
683
+ );
684
+
685
+ $this->add_responsive_control(
686
+ 'description_spacing',
687
+ [
688
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
689
+ 'type' => Controls_Manager::SLIDER,
690
+ 'size_units' => ['px'],
691
+ 'selectors' => [
692
+ '{{WRAPPER}} .ha-infobox-text' => 'margin-bottom: {{SIZE}}{{UNIT}};',
693
+ ],
694
+ ]
695
+ );
696
+
697
+ $this->add_control(
698
+ 'description_color',
699
+ [
700
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
701
+ 'type' => Controls_Manager::COLOR,
702
+ 'selectors' => [
703
+ '{{WRAPPER}} .ha-infobox-text' => 'color: {{VALUE}};',
704
+ ],
705
+ ]
706
+ );
707
+
708
+ $this->add_group_control(
709
+ Group_Control_Typography::get_type(),
710
+ [
711
+ 'name' => 'description_typography',
712
+ 'label' => __( 'Typography', 'happy-elementor-addons' ),
713
+ 'selector' => '{{WRAPPER}} .ha-infobox-text',
714
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
715
+ ]
716
+ );
717
+
718
+ $this->end_controls_section();
719
+
720
+ $this->start_controls_section(
721
+ '_section_style_button',
722
+ [
723
+ 'label' => __( 'Button', 'happy-elementor-addons' ),
724
+ 'tab' => Controls_Manager::TAB_STYLE,
725
+ ]
726
+ );
727
+
728
+ $this->add_responsive_control(
729
+ 'link_padding',
730
+ [
731
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
732
+ 'type' => Controls_Manager::DIMENSIONS,
733
+ 'size_units' => [ 'px', 'em', '%' ],
734
+ 'selectors' => [
735
+ '{{WRAPPER}} .ha-btn' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
736
+ ],
737
+ ]
738
+ );
739
+
740
+ $this->add_group_control(
741
+ Group_Control_Typography::get_type(),
742
+ [
743
+ 'name' => 'btn_typography',
744
+ 'selector' => '{{WRAPPER}} .ha-btn',
745
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_4,
746
+ ]
747
+ );
748
+
749
+ $this->add_group_control(
750
+ Group_Control_Border::get_type(),
751
+ [
752
+ 'name' => 'button_border',
753
+ 'selector' => '{{WRAPPER}} .ha-btn',
754
+ ]
755
+ );
756
+
757
+ $this->add_control(
758
+ 'button_border_radius',
759
+ [
760
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
761
+ 'type' => Controls_Manager::DIMENSIONS,
762
+ 'size_units' => [ 'px', '%' ],
763
+ 'selectors' => [
764
+ '{{WRAPPER}} .ha-btn' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
765
+ ],
766
+ ]
767
+ );
768
+
769
+ $this->add_group_control(
770
+ Group_Control_Box_Shadow::get_type(),
771
+ [
772
+ 'name' => 'button_box_shadow',
773
+ 'selector' => '{{WRAPPER}} .ha-btn',
774
+ ]
775
+ );
776
+
777
+ $this->add_control(
778
+ 'hr',
779
+ [
780
+ 'type' => Controls_Manager::DIVIDER,
781
+ 'style' => 'thick',
782
+ ]
783
+ );
784
+
785
+ $this->start_controls_tabs( '_tabs_button' );
786
+
787
+ $this->start_controls_tab(
788
+ '_tab_button_normal',
789
+ [
790
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
791
+ ]
792
+ );
793
+
794
+ $this->add_control(
795
+ 'link_color',
796
+ [
797
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
798
+ 'type' => Controls_Manager::COLOR,
799
+ 'default' => '',
800
+ 'selectors' => [
801
+ '{{WRAPPER}} .ha-btn' => 'color: {{VALUE}};',
802
+ ],
803
+ ]
804
+ );
805
+
806
+ $this->add_control(
807
+ 'button_bg_color',
808
+ [
809
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
810
+ 'type' => Controls_Manager::COLOR,
811
+ 'selectors' => [
812
+ '{{WRAPPER}} .ha-btn' => 'background-color: {{VALUE}};',
813
+ ],
814
+ ]
815
+ );
816
+
817
+ $this->add_control(
818
+ 'button_icon_translate',
819
+ [
820
+ 'label' => __( 'Icon Translate X', 'happy-elementor-addons' ),
821
+ 'type' => Controls_Manager::SLIDER,
822
+ 'range' => [
823
+ 'px' => [
824
+ 'min' => -100,
825
+ 'max' => 100,
826
+ ],
827
+ ],
828
+ 'selectors' => [
829
+ '{{WRAPPER}} .ha-btn--icon-before .ha-btn-icon' => '-webkit-transform: translateX(calc(-1 * {{SIZE}}{{UNIT}})); transform: translateX(calc(-1 * {{SIZE}}{{UNIT}}));',
830
+ '{{WRAPPER}} .ha-btn--icon-after .ha-btn-icon' => '-webkit-transform: translateX({{SIZE}}{{UNIT}}); transform: translateX({{SIZE}}{{UNIT}});',
831
+ ],
832
+ ]
833
+ );
834
+
835
+ $this->end_controls_tab();
836
+
837
+ $this->start_controls_tab(
838
+ '_tab_button_hover',
839
+ [
840
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
841
+ ]
842
+ );
843
+
844
+ $this->add_control(
845
+ 'link_hover_color',
846
+ [
847
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
848
+ 'type' => Controls_Manager::COLOR,
849
+ 'selectors' => [
850
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'color: {{VALUE}};',
851
+ ],
852
+ ]
853
+ );
854
+
855
+ $this->add_control(
856
+ 'button_hover_bg_color',
857
+ [
858
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
859
+ 'type' => Controls_Manager::COLOR,
860
+ 'selectors' => [
861
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'background-color: {{VALUE}};',
862
+ ],
863
+ ]
864
+ );
865
+
866
+ $this->add_control(
867
+ 'button_hover_border_color',
868
+ [
869
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
870
+ 'type' => Controls_Manager::COLOR,
871
+ 'condition' => [
872
+ 'button_border_border!' => '',
873
+ ],
874
+ 'selectors' => [
875
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'border-color: {{VALUE}};',
876
+ ],
877
+ ]
878
+ );
879
+
880
+ $this->add_control(
881
+ 'button_hover_icon_translate',
882
+ [
883
+ 'label' => __( 'Icon Translate X', 'happy-elementor-addons' ),
884
+ 'type' => Controls_Manager::SLIDER,
885
+ 'default' => [
886
+ 'size' => 10
887
+ ],
888
+ 'range' => [
889
+ 'px' => [
890
+ 'min' => -100,
891
+ 'max' => 100,
892
+ ],
893
+ ],
894
+ 'selectors' => [
895
+ '{{WRAPPER}} .ha-btn.ha-btn--icon-before:hover .ha-btn-icon' => '-webkit-transform: translateX(calc(-1 * {{SIZE}}{{UNIT}})); transform: translateX(calc(-1 * {{SIZE}}{{UNIT}}));',
896
+ '{{WRAPPER}} .ha-btn.ha-btn--icon-after:hover .ha-btn-icon' => '-webkit-transform: translateX({{SIZE}}{{UNIT}}); transform: translateX({{SIZE}}{{UNIT}});',
897
+ ],
898
+ ]
899
+ );
900
+
901
+ $this->end_controls_tab();
902
+ $this->end_controls_tabs();
903
+
904
+ $this->end_controls_section();
905
+ }
906
 
907
  protected function render() {
908
+ $settings = $this->get_settings_for_display();
909
+
910
+ $this->add_inline_editing_attributes( 'title', 'basic' );
911
+ $this->add_render_attribute( 'title', 'class', 'ha-infobox-title' );
912
+
913
+ $this->add_inline_editing_attributes( 'description', 'intermediate' );
914
+ $this->add_render_attribute( 'description', 'class', 'ha-infobox-text' );
915
+ ?>
916
+
917
+ <?php if ( $settings['type'] === 'image' && ( $settings['image']['url'] || $settings['image']['id'] ) ) :
918
+ $settings['hover_animation'] = 'disable-animation'; // hack to prevent image hover animation
919
+ ?>
920
+ <figure class="ha-infobox-figure ha-infobox-figure--image">
921
+ <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
922
+ </figure>
923
+ <?php elseif ( ! empty( $settings['icon'] ) || ! empty( $settings['selected_icon']['value'] ) ) : ?>
924
+ <figure class="ha-infobox-figure ha-infobox-figure--icon">
925
+ <?php ha_render_icon( $settings, 'icon', 'selected_icon' ); ?>
926
+ </figure>
927
+ <?php endif; ?>
928
+
929
+ <div class="ha-infobox-body">
930
+ <?php
931
+ if ( $settings['title' ] ) :
932
+ printf( '<%1$s %2$s>%3$s</%1$s>',
933
+ tag_escape( $settings['title_tag'] ),
934
+ $this->get_render_attribute_string( 'title' ),
935
+ ha_kses_basic( $settings['title' ] )
936
+ );
937
+ endif;
938
+ ?>
939
+
940
+ <?php if ( $settings['description'] ) : ?>
941
+ <div <?php $this->print_render_attribute_string( 'description' ); ?>>
942
+ <p><?php echo ha_kses_intermediate( $settings['description'] ); ?></p>
943
+ </div>
944
+ <?php endif; ?>
945
+
946
+ <?php $this->render_icon_button(); ?>
947
+ </div>
948
+ <?php
949
+ }
950
+
951
+ public function _content_template() {
952
+ ?>
953
+ <#
954
+ var iconHTML, migrated;
955
+
956
+ if ( ha.hasIconLibrary() ) {
957
+ iconHTML = elementor.helpers.renderIcon( view, settings.selected_icon, { 'aria-hidden': true }, 'i' , 'object' ),
958
+ migrated = elementor.helpers.isIconMigrated( settings, 'selected_icon' );
959
+ }
960
+
961
+ view.addInlineEditingAttributes( 'title', 'basic' );
962
+ view.addRenderAttribute( 'title', 'class', 'ha-infobox-title' );
963
+
964
+ view.addInlineEditingAttributes( 'description', 'intermediate' );
965
+ view.addRenderAttribute( 'description', 'class', 'ha-infobox-text' );
966
+
967
+ if ( settings.type === 'image' ) {
968
+ if ( settings.image.url ) {
969
+ var image = {
970
+ id: settings.image.id,
971
+ url: settings.image.url,
972
+ size: settings.thumbnail_size,
973
+ model: view.getEditModel()
974
+ };
975
+
976
+ var image_url = elementor.imagesManager.getImageUrl( image );
977
+ #>
978
+ <figure class="ha-infobox-figure ha-infobox-figure--image">
979
+ <img src="{{ image_url }}">
980
+ </figure>
981
+ <# }
982
+ } else if ( settings.icon || settings.selected_icon.value ) { #>
983
+ <figure class="ha-infobox-figure ha-infobox-figure--icon">
984
+ <# if ( ha.hasIconLibrary() && iconHTML && iconHTML.rendered && ( ! settings.icon || migrated ) ) { #>
985
+ {{{ iconHTML.value }}}
986
+ <# } else { #>
987
+ <i class="{{ settings.icon }}" aria-hidden="true"></i>
988
+ <# } #>
989
+ </figure>
990
+ <# } #>
991
+
992
+ <div class="ha-infobox-body">
993
+ <# if (settings.title) { #>
994
+ <{{ settings.title_tag }} {{{ view.getRenderAttributeString( 'title' ) }}}>{{ settings.title }}</{{ settings.title_tag }}>
995
+ <# } #>
996
+
997
+ <# if (settings.description) { #>
998
+ <div {{{ view.getRenderAttributeString( 'description' ) }}}>
999
+ <p>{{{ settings.description }}}</p>
1000
+ </div>
1001
+ <# } #>
1002
+
1003
+ <# print( ha.getButtonWithIcon(view) ); #>
1004
+ </div>
1005
+ <?php
1006
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1007
  }
widgets/member/widget.php CHANGED
@@ -16,90 +16,93 @@ use Elementor\Group_Control_Border;
16
  use Elementor\Group_Control_Box_Shadow;
17
  use Elementor\Group_Control_Image_Size;
18
  use Elementor\Group_Control_Typography;
 
19
 
20
  defined( 'ABSPATH' ) || die();
21
 
22
  class Member extends Base {
23
 
24
- /**
25
- * Get widget title.
26
- *
27
- * @since 1.0.0
28
- * @access public
29
- *
30
- * @return string Widget title.
31
- */
32
- public function get_title() {
33
- return __( 'Team Member', 'happy-elementor-addons' );
34
- }
35
-
36
- public function get_custom_help_url() {
37
- return 'https://happyaddons.com/docs/happy-addons-for-elementor/widgets/team-member/';
38
- }
39
-
40
- /**
41
- * Get widget icon.
42
- *
43
- * @since 1.0.0
44
- * @access public
45
- *
46
- * @return string Widget icon.
47
- */
48
- public function get_icon() {
49
- return 'hm hm-team-member';
50
- }
51
-
52
- public function get_keywords() {
53
- return [ 'team', 'member', 'crew', 'staff', 'person' ];
54
- }
55
-
56
- protected static function get_profile_names() {
57
- return [
58
- '500px' => __( '500px', 'happy-elementor-addons' ),
59
- 'apple' => __( 'Apple', 'happy-elementor-addons' ),
60
- 'behance' => __( 'Behance', 'happy-elementor-addons' ),
61
- 'bitbucket' => __( 'BitBucket', 'happy-elementor-addons' ),
62
- 'codepen' => __( 'CodePen', 'happy-elementor-addons' ),
63
- 'delicious' => __( 'Delicious', 'happy-elementor-addons' ),
64
- 'deviantart' => __( 'DeviantArt', 'happy-elementor-addons' ),
65
- 'digg' => __( 'Digg', 'happy-elementor-addons' ),
66
- 'dribbble' => __( 'Dribbble', 'happy-elementor-addons' ),
67
- 'email' => __( 'Email', 'happy-elementor-addons' ),
68
- 'facebook' => __( 'Facebook', 'happy-elementor-addons' ),
69
- 'flickr' => __( 'Flicker', 'happy-elementor-addons' ),
70
- 'foursquare' => __( 'FourSquare', 'happy-elementor-addons' ),
71
- 'github' => __( 'Github', 'happy-elementor-addons' ),
72
- 'houzz' => __( 'Houzz', 'happy-elementor-addons' ),
73
- 'instagram' => __( 'Instagram', 'happy-elementor-addons' ),
74
- 'jsfiddle' => __( 'JS Fiddle', 'happy-elementor-addons' ),
75
- 'linkedin' => __( 'LinkedIn', 'happy-elementor-addons' ),
76
- 'medium' => __( 'Medium', 'happy-elementor-addons' ),
77
- 'pinterest' => __( 'Pinterest', 'happy-elementor-addons' ),
78
- 'product-hunt' => __( 'Product Hunt', 'happy-elementor-addons' ),
79
- 'reddit' => __( 'Reddit', 'happy-elementor-addons' ),
80
- 'slideshare' => __( 'Slide Share', 'happy-elementor-addons' ),
81
- 'snapchat' => __( 'Snapchat', 'happy-elementor-addons' ),
82
- 'soundcloud' => __( 'SoundCloud', 'happy-elementor-addons' ),
83
- 'spotify' => __( 'Spotify', 'happy-elementor-addons' ),
84
- 'stack-overflow' => __( 'StackOverflow', 'happy-elementor-addons' ),
85
- 'tripadvisor' => __( 'TripAdvisor', 'happy-elementor-addons' ),
86
- 'tumblr' => __( 'Tumblr', 'happy-elementor-addons' ),
87
- 'twitch' => __( 'Twitch', 'happy-elementor-addons' ),
88
- 'twitter' => __( 'Twitter', 'happy-elementor-addons' ),
89
- 'vimeo' => __( 'Vimeo', 'happy-elementor-addons' ),
90
- 'vk' => __( 'VK', 'happy-elementor-addons' ),
91
- 'website' => __( 'Website', 'happy-elementor-addons' ),
92
- 'whatsapp' => __( 'WhatsApp', 'happy-elementor-addons' ),
93
- 'wordpress' => __( 'WordPress', 'happy-elementor-addons' ),
94
- 'xing' => __( 'Xing', 'happy-elementor-addons' ),
95
- 'yelp' => __( 'Yelp', 'happy-elementor-addons' ),
96
- 'youtube' => __( 'YouTube', 'happy-elementor-addons' ),
97
- ];
98
- }
99
-
100
- /**
101
- * Register content related controls
102
- */
 
 
103
  protected function register_content_controls() {
104
  $this->start_controls_section(
105
  '_section_info',
@@ -109,897 +112,1211 @@ class Member extends Base {
109
  ]
110
  );
111
 
112
- $this->add_control(
113
- 'image',
114
- [
115
- 'label' => __( 'Photo', 'happy-elementor-addons' ),
116
- 'type' => Controls_Manager::MEDIA,
117
- 'default' => [
118
- 'url' => Utils::get_placeholder_image_src(),
119
- ],
120
- 'dynamic' => [
121
- 'active' => true,
122
- ]
123
- ]
124
- );
125
-
126
- $this->add_group_control(
127
- Group_Control_Image_Size::get_type(),
128
- [
129
- 'name' => 'thumbnail',
130
- 'default' => 'large',
131
- 'separator' => 'none',
132
- ]
133
- );
134
-
135
- $this->add_control(
136
- 'title',
137
- [
138
- 'label' => __( 'Name', 'happy-elementor-addons' ),
139
- 'label_block' => true,
140
- 'type' => Controls_Manager::TEXT,
141
- 'default' => 'Happy Member Name',
142
- 'placeholder' => __( 'Type Member Name', 'happy-elementor-addons' ),
143
- 'separator' => 'before',
144
- 'dynamic' => [
145
- 'active' => true,
146
- ]
147
- ]
148
- );
149
-
150
- $this->add_control(
151
- 'job_title',
152
- [
153
- 'label' => __( 'Job Title', 'happy-elementor-addons' ),
154
- 'label_block' => true,
155
- 'type' => Controls_Manager::TEXT,
156
- 'default' => __( 'Happy Officer', 'happy-elementor-addons' ),
157
- 'placeholder' => __( 'Type Member Job Title', 'happy-elementor-addons' ),
158
- 'dynamic' => [
159
- 'active' => true,
160
- ]
161
- ]
162
- );
163
-
164
- $this->add_control(
165
- 'bio',
166
- [
167
- 'label' => __( 'Short Bio', 'happy-elementor-addons' ),
168
- 'description' => ha_get_allowed_html_desc( 'intermediate' ),
169
- 'type' => Controls_Manager::TEXTAREA,
170
- 'placeholder' => __( 'Write something amazing about the happy member', 'happy-elementor-addons' ),
171
- 'rows' => 5,
172
- 'dynamic' => [
173
- 'active' => true,
174
- ]
175
- ]
176
- );
177
-
178
- $this->add_control(
179
- 'title_tag',
180
- [
181
- 'label' => __( 'Title HTML Tag', 'happy-elementor-addons' ),
182
- 'type' => Controls_Manager::CHOOSE,
183
- 'options' => [
184
- 'h1' => [
185
- 'title' => __( 'H1', 'happy-elementor-addons' ),
186
- 'icon' => 'eicon-editor-h1'
187
- ],
188
- 'h2' => [
189
- 'title' => __( 'H2', 'happy-elementor-addons' ),
190
- 'icon' => 'eicon-editor-h2'
191
- ],
192
- 'h3' => [
193
- 'title' => __( 'H3', 'happy-elementor-addons' ),
194
- 'icon' => 'eicon-editor-h3'
195
- ],
196
- 'h4' => [
197
- 'title' => __( 'H4', 'happy-elementor-addons' ),
198
- 'icon' => 'eicon-editor-h4'
199
- ],
200
- 'h5' => [
201
- 'title' => __( 'H5', 'happy-elementor-addons' ),
202
- 'icon' => 'eicon-editor-h5'
203
- ],
204
- 'h6' => [
205
- 'title' => __( 'H6', 'happy-elementor-addons' ),
206
- 'icon' => 'eicon-editor-h6'
207
- ]
208
- ],
209
- 'default' => 'h2',
210
- 'toggle' => false,
211
- 'separator' => 'before',
212
- ]
213
- );
214
-
215
- $this->add_responsive_control(
216
- 'align',
217
- [
218
- 'label' => __( 'Alignment', 'happy-elementor-addons' ),
219
- 'type' => Controls_Manager::CHOOSE,
220
- 'options' => [
221
- 'left' => [
222
- 'title' => __( 'Left', 'happy-elementor-addons' ),
223
- 'icon' => 'fa fa-align-left',
224
- ],
225
- 'center' => [
226
- 'title' => __( 'Center', 'happy-elementor-addons' ),
227
- 'icon' => 'fa fa-align-center',
228
- ],
229
- 'right' => [
230
- 'title' => __( 'Right', 'happy-elementor-addons' ),
231
- 'icon' => 'fa fa-align-right',
232
- ],
233
- ],
234
- 'toggle' => true,
235
- 'selectors' => [
236
- '{{WRAPPER}}' => 'text-align: {{VALUE}};'
237
- ]
238
- ]
239
- );
240
-
241
- $this->end_controls_section();
242
-
243
- $this->start_controls_section(
244
- '_section_social',
245
- [
246
- 'label' => __( 'Social Profiles', 'happy-elementor-addons' ),
247
- 'tab' => Controls_Manager::TAB_CONTENT,
248
- ]
249
- );
250
-
251
- $repeater = new Repeater();
252
-
253
- $repeater->add_control(
254
- 'name',
255
- [
256
- 'label' => __( 'Profile Name', 'happy-elementor-addons' ),
257
- 'type' => Controls_Manager::SELECT2,
258
- 'label_block' => true,
259
- 'select2options' => [
260
- 'allowClear' => false,
261
- ],
262
- 'options' => self::get_profile_names()
263
- ]
264
- );
265
-
266
- $repeater->add_control(
267
- 'link', [
268
- 'label' => __( 'Profile Link', 'happy-elementor-addons' ),
269
- 'placeholder' => __( 'Add your profile link', 'happy-elementor-addons' ),
270
- 'type' => Controls_Manager::URL,
271
- 'label_block' => true,
272
- 'autocomplete' => false,
273
- 'show_external' => false,
274
- 'condition' => [
275
- 'name!' => 'email'
276
- ],
277
- 'dynamic' => [
278
- 'active' => true,
279
- ]
280
- ]
281
- );
282
-
283
- $repeater->add_control(
284
- 'email', [
285
- 'label' => __( 'Email Address', 'happy-elementor-addons' ),
286
- 'placeholder' => __( 'Add your email address', 'happy-elementor-addons' ),
287
- 'type' => Controls_Manager::TEXT,
288
- 'label_block' => false,
289
- 'input_type' => 'email',
290
- 'condition' => [
291
- 'name' => 'email'
292
- ],
293
- 'dynamic' => [
294
- 'active' => true,
295
- ]
296
- ]
297
- );
298
-
299
- $repeater->add_control(
300
- 'customize',
301
- [
302
- 'label' => __( 'Want To Customize?', 'happy-elementor-addons' ),
303
- 'type' => Controls_Manager::SWITCHER,
304
- 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
305
- 'label_off' => __( 'No', 'happy-elementor-addons' ),
306
- 'return_value' => 'yes',
307
- 'style_transfer' => true,
308
- ]
309
- );
310
-
311
- $repeater->start_controls_tabs(
312
- '_tab_icon_colors',
313
- [
314
- 'condition' => ['customize' => 'yes']
315
- ]
316
- );
317
- $repeater->start_controls_tab(
318
- '_tab_icon_normal',
319
- [
320
- 'label' => __( 'Normal', 'happy-elementor-addons' ),
321
- ]
322
- );
323
-
324
- $repeater->add_control(
325
- 'color',
326
- [
327
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
328
- 'type' => Controls_Manager::COLOR,
329
- 'selectors' => [
330
- '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}' => 'color: {{VALUE}}',
331
- ],
332
- 'condition' => ['customize' => 'yes'],
333
- 'style_transfer' => true,
334
- ]
335
- );
336
-
337
- $repeater->add_control(
338
- 'bg_color',
339
- [
340
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
341
- 'type' => Controls_Manager::COLOR,
342
- 'selectors' => [
343
- '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}' => 'background-color: {{VALUE}}',
344
- ],
345
- 'condition' => ['customize' => 'yes'],
346
- 'style_transfer' => true,
347
- ]
348
- );
349
-
350
- $repeater->end_controls_tab();
351
- $repeater->start_controls_tab(
352
- '_tab_icon_hover',
353
- [
354
- 'label' => __( 'Hover', 'happy-elementor-addons' ),
355
- ]
356
- );
357
-
358
- $repeater->add_control(
359
- 'hover_color',
360
- [
361
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
362
- 'type' => Controls_Manager::COLOR,
363
- 'selectors' => [
364
- '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:hover, {{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:focus' => 'color: {{VALUE}}',
365
- ],
366
- 'condition' => ['customize' => 'yes'],
367
- 'style_transfer' => true,
368
- ]
369
- );
370
-
371
- $repeater->add_control(
372
- 'hover_bg_color',
373
- [
374
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
375
- 'type' => Controls_Manager::COLOR,
376
- 'selectors' => [
377
- '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:hover, {{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:focus' => 'background-color: {{VALUE}}',
378
- ],
379
- 'condition' => ['customize' => 'yes'],
380
- 'style_transfer' => true,
381
- ]
382
- );
383
-
384
- $repeater->add_control(
385
- 'hover_border_color',
386
- [
387
- 'label' => __( 'Border Color', 'happy-elementor-addons' ),
388
- 'type' => Controls_Manager::COLOR,
389
- 'selectors' => [
390
- '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:hover, {{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:focus' => 'border-color: {{VALUE}}',
391
- ],
392
- 'condition' => ['customize' => 'yes'],
393
- 'style_transfer' => true,
394
- ]
395
- );
396
-
397
- $repeater->end_controls_tab();
398
- $repeater->end_controls_tabs();
399
-
400
- $this->add_control(
401
- 'profiles',
402
- [
403
- 'show_label' => false,
404
- 'type' => Controls_Manager::REPEATER,
405
- 'fields' => $repeater->get_controls(),
406
- 'title_field' => '<# print(name.slice(0,1).toUpperCase() + name.slice(1)) #>',
407
- 'default' => [
408
- [
409
- 'link' => ['url' => 'https://facebook.com/'],
410
- 'name' => 'facebook'
411
- ],
412
- [
413
- 'link' => ['url' => 'https://twitter.com/'],
414
- 'name' => 'twitter'
415
- ],
416
- [
417
- 'link' => ['url' => 'https://linkedin.com/'],
418
- 'name' => 'linkedin'
419
- ]
420
- ],
421
- ]
422
- );
423
-
424
- $this->add_control(
425
- 'show_profiles',
426
- [
427
- 'label' => __( 'Show Profiles', 'happy-elementor-addons' ),
428
- 'type' => Controls_Manager::SWITCHER,
429
- 'label_on' => __( 'Show', 'happy-elementor-addons' ),
430
- 'label_off' => __( 'Hide', 'happy-elementor-addons' ),
431
- 'return_value' => 'yes',
432
- 'default' => 'yes',
433
- 'separator' => 'before',
434
- 'style_transfer' => true,
435
- ]
436
- );
437
-
438
- $this->end_controls_section();
439
- }
440
-
441
- /**
442
- * Register styles related controls
443
- */
444
- protected function register_style_controls() {
445
- $this->start_controls_section(
446
- '_section_style_image',
447
- [
448
- 'label' => __( 'Photo', 'happy-elementor-addons' ),
449
- 'tab' => Controls_Manager::TAB_STYLE,
450
- ]
451
- );
452
-
453
- $this->add_responsive_control(
454
- 'image_width',
455
- [
456
- 'label' => __( 'Width', 'happy-elementor-addons' ),
457
- 'type' => Controls_Manager::SLIDER,
458
- 'size_units' => [ 'px', '%'],
459
- 'range' => [
460
- '%' => [
461
- 'min' => 20,
462
- 'max' => 100,
463
- ],
464
- 'px' => [
465
- 'min' => 100,
466
- 'max' => 700,
467
- ],
468
- ],
469
- 'selectors' => [
470
- '{{WRAPPER}} .ha-member-figure' => 'width: {{SIZE}}{{UNIT}};',
471
- ],
472
- ]
473
- );
474
-
475
- $this->add_responsive_control(
476
- 'image_height',
477
- [
478
- 'label' => __( 'Height', 'happy-elementor-addons' ),
479
- 'type' => Controls_Manager::SLIDER,
480
- 'size_units' => [ 'px' ],
481
- 'range' => [
482
- 'px' => [
483
- 'min' => 100,
484
- 'max' => 700,
485
- ],
486
- ],
487
- 'selectors' => [
488
- '{{WRAPPER}} .ha-member-figure' => 'height: {{SIZE}}{{UNIT}};',
489
- ],
490
- ]
491
- );
492
-
493
- $this->add_responsive_control(
494
- 'image_spacing',
495
- [
496
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
497
- 'type' => Controls_Manager::SLIDER,
498
- 'size_units' => ['px'],
499
- 'selectors' => [
500
- '{{WRAPPER}} .ha-member-figure' => 'margin-bottom: {{SIZE}}{{UNIT}} !important;',
501
- ],
502
- ]
503
- );
504
-
505
- $this->add_responsive_control(
506
- 'image_padding',
507
- [
508
- 'label' => __( 'Padding', 'happy-elementor-addons' ),
509
- 'type' => Controls_Manager::DIMENSIONS,
510
- 'size_units' => [ 'px', 'em', '%' ],
511
- 'selectors' => [
512
- '{{WRAPPER}} .ha-member-figure img' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
513
- ],
514
- ]
515
- );
516
-
517
- $this->add_group_control(
518
- Group_Control_Border::get_type(),
519
- [
520
- 'name' => 'image_border',
521
- 'selector' => '{{WRAPPER}} .ha-member-figure img'
522
- ]
523
- );
524
-
525
- $this->add_responsive_control(
526
- 'image_border_radius',
527
- [
528
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
529
- 'type' => Controls_Manager::DIMENSIONS,
530
- 'size_units' => [ 'px', '%' ],
531
- 'selectors' => [
532
- '{{WRAPPER}} .ha-member-figure img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
533
- ],
534
- ]
535
- );
536
-
537
- $this->add_group_control(
538
- Group_Control_Box_Shadow::get_type(),
539
- [
540
- 'name' => 'image_box_shadow',
541
- 'exclude' => [
542
- 'box_shadow_position',
543
- ],
544
- 'selector' => '{{WRAPPER}} .ha-member-figure img'
545
- ]
546
- );
547
-
548
- $this->add_control(
549
- 'image_bg_color',
550
- [
551
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
552
- 'type' => Controls_Manager::COLOR,
553
- 'selectors' => [
554
- '{{WRAPPER}} .ha-member-figure img' => 'background-color: {{VALUE}};',
555
- ],
556
- ]
557
- );
558
-
559
- $this->end_controls_section();
560
-
561
- $this->start_controls_section(
562
- '_section_style_content',
563
- [
564
- 'label' => __( 'Name, Job Title & Bio', 'happy-elementor-addons' ),
565
- 'tab' => Controls_Manager::TAB_STYLE,
566
- ]
567
- );
568
-
569
- $this->add_responsive_control(
570
- 'content_padding',
571
- [
572
- 'label' => __( 'Content Padding', 'happy-elementor-addons' ),
573
- 'type' => Controls_Manager::DIMENSIONS,
574
- 'size_units' => [ 'px', 'em', '%' ],
575
- 'selectors' => [
576
- '{{WRAPPER}} .ha-member-body' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
577
- ],
578
- ]
579
- );
580
-
581
- $this->add_control(
582
- '_heading_title',
583
- [
584
- 'type' => Controls_Manager::HEADING,
585
- 'label' => __( 'Name', 'happy-elementor-addons' ),
586
- 'separator' => 'before',
587
- ]
588
- );
589
-
590
- $this->add_responsive_control(
591
- 'title_spacing',
592
- [
593
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
594
- 'type' => Controls_Manager::SLIDER,
595
- 'size_units' => ['px'],
596
- 'selectors' => [
597
- '{{WRAPPER}} .ha-member-name' => 'margin-bottom: {{SIZE}}{{UNIT}};',
598
- ],
599
- ]
600
- );
601
-
602
- $this->add_control(
603
- 'title_color',
604
- [
605
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
606
- 'type' => Controls_Manager::COLOR,
607
- 'selectors' => [
608
- '{{WRAPPER}} .ha-member-name' => 'color: {{VALUE}}',
609
- ],
610
- ]
611
- );
612
-
613
- $this->add_group_control(
614
- Group_Control_Typography::get_type(),
615
- [
616
- 'name' => 'title_typography',
617
- 'selector' => '{{WRAPPER}} .ha-member-name',
618
- 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
619
- ]
620
- );
621
-
622
- $this->add_group_control(
623
- Group_Control_Text_Shadow::get_type(),
624
- [
625
- 'name' => 'title_text_shadow',
626
- 'selector' => '{{WRAPPER}} .ha-member-name',
627
- ]
628
- );
629
-
630
- $this->add_control(
631
- '_heading_job_title',
632
- [
633
- 'type' => Controls_Manager::HEADING,
634
- 'label' => __( 'Job Title', 'happy-elementor-addons' ),
635
- 'separator' => 'before'
636
- ]
637
- );
638
-
639
- $this->add_responsive_control(
640
- 'job_title_spacing',
641
- [
642
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
643
- 'type' => Controls_Manager::SLIDER,
644
- 'size_units' => ['px'],
645
- 'selectors' => [
646
- '{{WRAPPER}} .ha-member-position' => 'margin-bottom: {{SIZE}}{{UNIT}};',
647
- ],
648
- ]
649
- );
650
-
651
- $this->add_control(
652
- 'job_title_color',
653
- [
654
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
655
- 'type' => Controls_Manager::COLOR,
656
- 'selectors' => [
657
- '{{WRAPPER}} .ha-member-position' => 'color: {{VALUE}}',
658
- ],
659
- ]
660
- );
661
-
662
- $this->add_group_control(
663
- Group_Control_Typography::get_type(),
664
- [
665
- 'name' => 'job_title_typography',
666
- 'selector' => '{{WRAPPER}} .ha-member-position',
667
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
668
- ]
669
- );
670
-
671
- $this->add_group_control(
672
- Group_Control_Text_Shadow::get_type(),
673
- [
674
- 'name' => 'job_title_text_shadow',
675
- 'selector' => '{{WRAPPER}} .ha-member-position',
676
- ]
677
- );
678
-
679
- $this->add_control(
680
- '_heading_bio',
681
- [
682
- 'type' => Controls_Manager::HEADING,
683
- 'label' => __( 'Short Bio', 'happy-elementor-addons' ),
684
- 'separator' => 'before'
685
- ]
686
- );
687
-
688
- $this->add_responsive_control(
689
- 'bio_spacing',
690
- [
691
- 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
692
- 'type' => Controls_Manager::SLIDER,
693
- 'size_units' => ['px'],
694
- 'selectors' => [
695
- '{{WRAPPER}} .ha-member-bio' => 'margin-bottom: {{SIZE}}{{UNIT}};',
696
- ],
697
- ]
698
- );
699
-
700
- $this->add_control(
701
- 'bio_color',
702
- [
703
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
704
- 'type' => Controls_Manager::COLOR,
705
- 'selectors' => [
706
- '{{WRAPPER}} .ha-member-bio' => 'color: {{VALUE}};',
707
- ],
708
- ]
709
- );
710
-
711
- $this->add_group_control(
712
- Group_Control_Typography::get_type(),
713
- [
714
- 'name' => 'bio_typography',
715
- 'selector' => '{{WRAPPER}} .ha-member-bio',
716
- 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
717
- ]
718
- );
719
-
720
- $this->add_group_control(
721
- Group_Control_Text_Shadow::get_type(),
722
- [
723
- 'name' => 'bio_text_shadow',
724
- 'selector' => '{{WRAPPER}} .ha-member-bio',
725
- ]
726
- );
727
-
728
- $this->end_controls_section();
729
-
730
- $this->start_controls_section(
731
- '_section_style_social',
732
- [
733
- 'label' => __( 'Social Icons', 'happy-elementor-addons' ),
734
- 'tab' => Controls_Manager::TAB_STYLE,
735
- ]
736
- );
737
-
738
- $this->add_responsive_control(
739
- 'links_spacing',
740
- [
741
- 'label' => __( 'Right Spacing', 'happy-elementor-addons' ),
742
- 'type' => Controls_Manager::SLIDER,
743
- 'size_units' => ['px'],
744
- 'selectors' => [
745
- '{{WRAPPER}} .ha-member-links > a:not(:last-child)' => 'margin-right: {{SIZE}}{{UNIT}};',
746
- ],
747
- ]
748
- );
749
-
750
- $this->add_responsive_control(
751
- 'links_padding',
752
- [
753
- 'label' => __( 'Padding', 'happy-elementor-addons' ),
754
- 'type' => Controls_Manager::SLIDER,
755
- 'size_units' => ['px'],
756
- 'selectors' => [
757
- '{{WRAPPER}} .ha-member-links > a' => 'padding: {{SIZE}}{{UNIT}};',
758
- ],
759
- ]
760
- );
761
-
762
- $this->add_responsive_control(
763
- 'links_icon_size',
764
- [
765
- 'label' => __( 'Icon Size', 'happy-elementor-addons' ),
766
- 'type' => Controls_Manager::SLIDER,
767
- 'size_units' => ['px'],
768
- 'selectors' => [
769
- '{{WRAPPER}} .ha-member-links > a' => 'font-size: {{SIZE}}{{UNIT}};',
770
- ],
771
- ]
772
- );
773
-
774
- $this->add_group_control(
775
- Group_Control_Border::get_type(),
776
- [
777
- 'name' => 'links_border',
778
- 'selector' => '{{WRAPPER}} .ha-member-links > a'
779
- ]
780
- );
781
-
782
- $this->add_responsive_control(
783
- 'links_border_radius',
784
- [
785
- 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
786
- 'type' => Controls_Manager::DIMENSIONS,
787
- 'size_units' => [ 'px', '%' ],
788
- 'selectors' => [
789
- '{{WRAPPER}} .ha-member-links > a' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
790
- ],
791
- ]
792
- );
793
-
794
- $this->start_controls_tabs( '_tab_links_colors' );
795
- $this->start_controls_tab(
796
- '_tab_links_normal',
797
- [
798
- 'label' => __( 'Normal', 'happy-elementor-addons' ),
799
- ]
800
- );
801
-
802
- $this->add_control(
803
- 'links_color',
804
- [
805
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
806
- 'type' => Controls_Manager::COLOR,
807
- 'selectors' => [
808
- '{{WRAPPER}} .ha-member-links > a' => 'color: {{VALUE}};',
809
- ],
810
- ]
811
- );
812
-
813
- $this->add_control(
814
- 'links_bg_color',
815
- [
816
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
817
- 'type' => Controls_Manager::COLOR,
818
- 'selectors' => [
819
- '{{WRAPPER}} .ha-member-links > a' => 'background-color: {{VALUE}};',
820
- ],
821
- ]
822
- );
823
-
824
- $this->end_controls_tab();
825
- $this->start_controls_tab(
826
- '_tab_links_hover',
827
- [
828
- 'label' => __( 'Hover', 'happy-elementor-addons' ),
829
- ]
830
- );
831
-
832
- $this->add_control(
833
- 'links_hover_color',
834
- [
835
- 'label' => __( 'Text Color', 'happy-elementor-addons' ),
836
- 'type' => Controls_Manager::COLOR,
837
- 'selectors' => [
838
- '{{WRAPPER}} .ha-member-links > a:hover, {{WRAPPER}} .ha-member-links > a:focus' => 'color: {{VALUE}}',
839
- ],
840
- ]
841
- );
842
-
843
- $this->add_control(
844
- 'links_hover_bg_color',
845
- [
846
- 'label' => __( 'Background Color', 'happy-elementor-addons' ),
847
- 'type' => Controls_Manager::COLOR,
848
- 'selectors' => [
849
- '{{WRAPPER}} .ha-member-links > a:hover, {{WRAPPER}} .ha-member-links > a:focus' => 'background-color: {{VALUE}}',
850
- ],
851
- ]
852
- );
853
-
854
- $this->add_control(
855
- 'links_hover_border_color',
856
- [
857
- 'label' => __( 'Border Color', 'happy-elementor-addons' ),
858
- 'type' => Controls_Manager::COLOR,
859
- 'selectors' => [
860
- '{{WRAPPER}} .ha-member-links > a:hover, {{WRAPPER}} .ha-member-links > a:focus' => 'border-color: {{VALUE}};',
861
- ],
862
- 'condition' => [
863
- 'links_border_border!' => '',
864
- ]
865
- ]
866
- );
867
-
868
- $this->end_controls_tab();
869
- $this->end_controls_tabs();
870
-
871
- $this->end_controls_section();
872
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
873
 
874
  protected function render() {
875
- $settings = $this->get_settings_for_display();
876
-
877
- $this->add_inline_editing_attributes( 'title', 'basic' );
878
- $this->add_render_attribute( 'title', 'class', 'ha-member-name' );
879
-
880
- $this->add_inline_editing_attributes( 'job_title', 'basic' );
881
- $this->add_render_attribute( 'job_title', 'class', 'ha-member-position' );
882
-
883
- $this->add_inline_editing_attributes( 'bio', 'intermediate' );
884
- $this->add_render_attribute( 'bio', 'class', 'ha-member-bio' );
885
- ?>
886
-
887
- <?php if ( $settings['image']['url'] || $settings['image']['id'] ) :
888
- $this->add_render_attribute( 'image', 'src', $settings['image']['url'] );
889
- $this->add_render_attribute( 'image', 'alt', Control_Media::get_image_alt( $settings['image'] ) );
890
- $this->add_render_attribute( 'image', 'title', Control_Media::get_image_title( $settings['image'] ) );
891
- $settings['hover_animation'] = 'disable-animation'; // hack to prevent image hover animation
892
- ?>
893
- <figure class="ha-member-figure">
894
- <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
895
- </figure>
896
- <?php endif; ?>
897
-
898
- <div class="ha-member-body">
899
- <?php if ( $settings['title'] ) :
900
- printf( '<%1$s %2$s>%3$s</%1$s>',
901
- tag_escape( $settings['title_tag'] ),
902
- $this->get_render_attribute_string( 'title' ),
903
- ha_kses_basic( $settings['title'] )
904
- );
905
- endif; ?>
906
-
907
- <?php if ( $settings['job_title' ] ) : ?>
908
- <div <?php $this->print_render_attribute_string( 'job_title' ); ?>><?php echo ha_kses_basic( $settings['job_title' ] ); ?></div>
909
- <?php endif; ?>
910
-
911
- <?php if ( $settings['bio'] ) : ?>
912
- <div <?php $this->print_render_attribute_string( 'bio' ); ?>>
913
- <p><?php echo ha_kses_intermediate( $settings['bio'] ); ?></p>
914
- </div>
915
- <?php endif; ?>
916
-
917
- <?php if ( $settings['show_profiles' ] && is_array( $settings['profiles' ] ) ) : ?>
918
- <div class="ha-member-links">
919
- <?php
920
- foreach ( $settings['profiles'] as $profile ) :
921
- $icon = $profile['name'];
922
- $url = $profile['link']['url'];
923
-
924
- if ($profile['name'] === 'website') {
925
- $icon = 'globe';
926
- } elseif ($profile['name'] === 'email') {
927
- $icon = 'envelope';
928
- $url = 'mailto:' . antispambot( $profile['email'] );
929
- }
930
-
931
- printf( '<a target="_blank" rel="noopener" data-tooltip="hello" href="%s" class="elementor-repeater-item-%s"><i class="fa fa-%s" aria-hidden="true"></i></a>',
932
- $url,
933
- esc_attr( $profile['_id'] ),
934
- esc_attr( $icon )
935
- );
936
- endforeach; ?>
937
- </div>
938
- <?php endif; ?>
939
- </div>
940
- <?php
941
- }
942
-
943
- public function _content_template() {
944
- ?>
945
- <#
946
- view.addInlineEditingAttributes( 'title', 'basic' );
947
- view.addRenderAttribute( 'title', 'class', 'ha-member-name' );
948
-
949
- view.addInlineEditingAttributes( 'job_title', 'basic' );
950
- view.addRenderAttribute( 'job_title', 'class', 'ha-member-position' );
951
-
952
- view.addInlineEditingAttributes( 'bio', 'intermediate' );
953
- view.addRenderAttribute( 'bio', 'class', 'ha-member-bio' );
954
-
955
- if ( settings.image.url || settings.image.id ) {
956
- var image = {
957
- id: settings.image.id,
958
- url: settings.image.url,
959
- size: settings.thumbnail_size,
960
- dimension: settings.thumbnail_custom_dimension,
961
- model: view.getEditModel()
962
- };
963
-
964
- var image_url = elementor.imagesManager.getImageUrl( image );
965
- #>
966
- <figure class="ha-member-figure">
967
- <img src="{{ image_url }}">
968
- </figure>
969
- <# } #>
970
- <div class="ha-member-body">
971
- <# if (settings.title) { #>
972
- <{{ settings.title_tag }} {{{ view.getRenderAttributeString( 'title' ) }}}>{{ settings.title }}</{{ settings.title_tag }}>
973
- <# } #>
974
- <# if (settings.job_title) { #>
975
- <div {{{ view.getRenderAttributeString( 'job_title' ) }}}>{{ settings.job_title }}</div>
976
- <# } #>
977
- <# if (settings.bio) { #>
978
- <div {{{ view.getRenderAttributeString( 'bio' ) }}}>
979
- <p>{{{ settings.bio }}}</p>
980
- </div>
981
- <# } #>
982
- <# if (settings.show_profiles && _.isArray(settings.profiles)) { #>
983
- <div class="ha-member-links">
984
- <# _.each(settings.profiles, function(profile, index) {
985
- var icon = profile.name,
986
- url = profile.link.url,
987
- linkKey = view.getRepeaterSettingKey( 'profile', 'profiles', index);
988
-
989
- if (profile.name === 'website') {
990
- icon = 'globe';
991
- } else if (profile.name === 'email') {
992
- icon = 'envelope'
993
- url = 'mailto:' + profile.email;
994
- }
995
-
996
- view.addRenderAttribute( linkKey, 'class', 'elementor-repeater-item-' + profile._id );
997
- view.addRenderAttribute( linkKey, 'href', url ); #>
998
- <a {{{view.getRenderAttributeString( linkKey )}}}><i class="fa fa-{{{icon}}}"></i></a>
999
- <# }); #>
1000
- </div>
1001
- <# } #>
1002
- </div>
1003
- <?php
1004
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1005
  }
16
  use Elementor\Group_Control_Box_Shadow;
17
  use Elementor\Group_Control_Image_Size;
18
  use Elementor\Group_Control_Typography;
19
+ use Happy_Addons\Elementor\Traits\Button_Renderer;
20
 
21
  defined( 'ABSPATH' ) || die();
22
 
23
  class Member extends Base {
24
 
25
+ use Button_Renderer;
26
+
27
+ /**
28
+ * Get widget title.
29
+ *
30
+ * @since 1.0.0
31
+ * @access public
32
+ *
33
+ * @return string Widget title.
34
+ */
35
+ public function get_title() {
36
+ return __( 'Team Member', 'happy-elementor-addons' );
37
+ }
38
+
39
+ public function get_custom_help_url() {
40
+ return 'https://happyaddons.com/docs/happy-addons-for-elementor/widgets/team-member/';
41
+ }
42
+
43
+ /**
44
+ * Get widget icon.
45
+ *
46
+ * @since 1.0.0
47
+ * @access public
48
+ *
49
+ * @return string Widget icon.
50
+ */
51
+ public function get_icon() {
52
+ return 'hm hm-team-member';
53
+ }
54
+
55
+ public function get_keywords() {
56
+ return [ 'team', 'member', 'crew', 'staff', 'person' ];
57
+ }
58
+
59
+ protected static function get_profile_names() {
60
+ return [
61
+ '500px' => __( '500px', 'happy-elementor-addons' ),
62
+ 'apple' => __( 'Apple', 'happy-elementor-addons' ),
63
+ 'behance' => __( 'Behance', 'happy-elementor-addons' ),
64
+ 'bitbucket' => __( 'BitBucket', 'happy-elementor-addons' ),
65
+ 'codepen' => __( 'CodePen', 'happy-elementor-addons' ),
66
+ 'delicious' => __( 'Delicious', 'happy-elementor-addons' ),
67
+ 'deviantart' => __( 'DeviantArt', 'happy-elementor-addons' ),
68
+ 'digg' => __( 'Digg', 'happy-elementor-addons' ),
69
+ 'dribbble' => __( 'Dribbble', 'happy-elementor-addons' ),
70
+ 'email' => __( 'Email', 'happy-elementor-addons' ),
71
+ 'facebook' => __( 'Facebook', 'happy-elementor-addons' ),
72
+ 'flickr' => __( 'Flicker', 'happy-elementor-addons' ),
73
+ 'foursquare' => __( 'FourSquare', 'happy-elementor-addons' ),
74
+ 'github' => __( 'Github', 'happy-elementor-addons' ),
75
+ 'houzz' => __( 'Houzz', 'happy-elementor-addons' ),
76
+ 'instagram' => __( 'Instagram', 'happy-elementor-addons' ),
77
+ 'jsfiddle' => __( 'JS Fiddle', 'happy-elementor-addons' ),
78
+ 'linkedin' => __( 'LinkedIn', 'happy-elementor-addons' ),
79
+ 'medium' => __( 'Medium', 'happy-elementor-addons' ),
80
+ 'pinterest' => __( 'Pinterest', 'happy-elementor-addons' ),
81
+ 'product-hunt' => __( 'Product Hunt', 'happy-elementor-addons' ),
82
+ 'reddit' => __( 'Reddit', 'happy-elementor-addons' ),
83
+ 'slideshare' => __( 'Slide Share', 'happy-elementor-addons' ),
84
+ 'snapchat' => __( 'Snapchat', 'happy-elementor-addons' ),
85
+ 'soundcloud' => __( 'SoundCloud', 'happy-elementor-addons' ),
86
+ 'spotify' => __( 'Spotify', 'happy-elementor-addons' ),
87
+ 'stack-overflow' => __( 'StackOverflow', 'happy-elementor-addons' ),
88
+ 'tripadvisor' => __( 'TripAdvisor', 'happy-elementor-addons' ),
89
+ 'tumblr' => __( 'Tumblr', 'happy-elementor-addons' ),
90
+ 'twitch' => __( 'Twitch', 'happy-elementor-addons' ),
91
+ 'twitter' => __( 'Twitter', 'happy-elementor-addons' ),
92
+ 'vimeo' => __( 'Vimeo', 'happy-elementor-addons' ),
93
+ 'vk' => __( 'VK', 'happy-elementor-addons' ),
94
+ 'website' => __( 'Website', 'happy-elementor-addons' ),
95
+ 'whatsapp' => __( 'WhatsApp', 'happy-elementor-addons' ),
96
+ 'wordpress' => __( 'WordPress', 'happy-elementor-addons' ),
97
+ 'xing' => __( 'Xing', 'happy-elementor-addons' ),
98
+ 'yelp' => __( 'Yelp', 'happy-elementor-addons' ),
99
+ 'youtube' => __( 'YouTube', 'happy-elementor-addons' ),
100
+ ];
101
+ }
102
+
103
+ /**
104
+ * Register content related controls
105
+ */
106
  protected function register_content_controls() {
107
  $this->start_controls_section(
108
  '_section_info',
112
  ]
113
  );
114
 
115
+ $this->add_control(
116
+ 'image',
117
+ [
118
+ 'label' => __( 'Photo', 'happy-elementor-addons' ),
119
+ 'type' => Controls_Manager::MEDIA,
120
+ 'default' => [
121
+ 'url' => Utils::get_placeholder_image_src(),
122
+ ],
123
+ 'dynamic' => [
124
+ 'active' => true,
125
+ ]
126
+ ]
127
+ );
128
+
129
+ $this->add_group_control(
130
+ Group_Control_Image_Size::get_type(),
131
+ [
132
+ 'name' => 'thumbnail',
133
+ 'default' => 'large',
134
+ 'separator' => 'none',
135
+ ]
136
+ );
137
+
138
+ $this->add_control(
139
+ 'title',
140
+ [
141
+ 'label' => __( 'Name', 'happy-elementor-addons' ),
142
+ 'label_block' => true,
143
+ 'type' => Controls_Manager::TEXT,
144
+ 'default' => 'Happy Member Name',
145
+ 'placeholder' => __( 'Type Member Name', 'happy-elementor-addons' ),
146
+ 'separator' => 'before',
147
+ 'dynamic' => [
148
+ 'active' => true,
149
+ ]
150
+ ]
151
+ );
152
+
153
+ $this->add_control(
154
+ 'job_title',
155
+ [
156
+ 'label' => __( 'Job Title', 'happy-elementor-addons' ),
157
+ 'label_block' => true,
158
+ 'type' => Controls_Manager::TEXT,
159
+ 'default' => __( 'Happy Officer', 'happy-elementor-addons' ),
160
+ 'placeholder' => __( 'Type Member Job Title', 'happy-elementor-addons' ),
161
+ 'dynamic' => [
162
+ 'active' => true,
163
+ ]
164
+ ]
165
+ );
166
+
167
+ $this->add_control(
168
+ 'bio',
169
+ [
170
+ 'label' => __( 'Short Bio', 'happy-elementor-addons' ),
171
+ 'description' => ha_get_allowed_html_desc( 'intermediate' ),
172
+ 'type' => Controls_Manager::TEXTAREA,
173
+ 'placeholder' => __( 'Write something amazing about the happy member', 'happy-elementor-addons' ),
174
+ 'rows' => 5,
175
+ 'dynamic' => [
176
+ 'active' => true,
177
+ ]
178
+ ]
179
+ );
180
+
181
+ $this->add_control(
182
+ 'title_tag',
183
+ [
184
+ 'label' => __( 'Title HTML Tag', 'happy-elementor-addons' ),
185
+ 'type' => Controls_Manager::CHOOSE,
186
+ 'options' => [
187
+ 'h1' => [
188
+ 'title' => __( 'H1', 'happy-elementor-addons' ),
189
+ 'icon' => 'eicon-editor-h1'
190
+ ],
191
+ 'h2' => [
192
+ 'title' => __( 'H2', 'happy-elementor-addons' ),
193
+ 'icon' => 'eicon-editor-h2'
194
+ ],
195
+ 'h3' => [
196
+ 'title' => __( 'H3', 'happy-elementor-addons' ),
197
+ 'icon' => 'eicon-editor-h3'
198
+ ],
199
+ 'h4' => [
200
+ 'title' => __( 'H4', 'happy-elementor-addons' ),
201
+ 'icon' => 'eicon-editor-h4'
202
+ ],
203
+ 'h5' => [
204
+ 'title' => __( 'H5', 'happy-elementor-addons' ),
205
+ 'icon' => 'eicon-editor-h5'
206
+ ],
207
+ 'h6' => [
208
+ 'title' => __( 'H6', 'happy-elementor-addons' ),
209
+ 'icon' => 'eicon-editor-h6'
210
+ ]
211
+ ],
212
+ 'default' => 'h2',
213
+ 'toggle' => false,
214
+ 'separator' => 'before',
215
+ ]
216
+ );
217
+
218
+ $this->add_responsive_control(
219
+ 'align',
220
+ [
221
+ 'label' => __( 'Alignment', 'happy-elementor-addons' ),
222
+ 'type' => Controls_Manager::CHOOSE,
223
+ 'options' => [
224
+ 'left' => [
225
+ 'title' => __( 'Left', 'happy-elementor-addons' ),
226
+ 'icon' => 'fa fa-align-left',
227
+ ],
228
+ 'center' => [
229
+ 'title' => __( 'Center', 'happy-elementor-addons' ),
230
+ 'icon' => 'fa fa-align-center',
231
+ ],
232
+ 'right' => [
233
+ 'title' => __( 'Right', 'happy-elementor-addons' ),
234
+ 'icon' => 'fa fa-align-right',
235
+ ],
236
+ ],
237
+ 'toggle' => true,
238
+ 'selectors' => [
239
+ '{{WRAPPER}}' => 'text-align: {{VALUE}};'
240
+ ]
241
+ ]
242
+ );
243
+
244
+ $this->end_controls_section();
245
+
246
+ $this->start_controls_section(
247
+ '_section_social',
248
+ [
249
+ 'label' => __( 'Social Profiles', 'happy-elementor-addons' ),
250
+ 'tab' => Controls_Manager::TAB_CONTENT,
251
+ ]
252
+ );
253
+
254
+ $repeater = new Repeater();
255
+
256
+ $repeater->add_control(
257
+ 'name',
258
+ [
259
+ 'label' => __( 'Profile Name', 'happy-elementor-addons' ),
260
+ 'type' => Controls_Manager::SELECT2,
261
+ 'label_block' => true,
262
+ 'select2options' => [
263
+ 'allowClear' => false,
264
+ ],
265
+ 'options' => self::get_profile_names()
266
+ ]
267
+ );
268
+
269
+ $repeater->add_control(
270
+ 'link', [
271
+ 'label' => __( 'Profile Link', 'happy-elementor-addons' ),
272
+ 'placeholder' => __( 'Add your profile link', 'happy-elementor-addons' ),
273
+ 'type' => Controls_Manager::URL,
274
+ 'label_block' => true,
275
+ 'autocomplete' => false,
276
+ 'show_external' => false,
277
+ 'condition' => [
278
+ 'name!' => 'email'
279
+ ],
280
+ 'dynamic' => [
281
+ 'active' => true,
282
+ ]
283
+ ]
284
+ );
285
+
286
+ $repeater->add_control(
287
+ 'email', [
288
+ 'label' => __( 'Email Address', 'happy-elementor-addons' ),
289
+ 'placeholder' => __( 'Add your email address', 'happy-elementor-addons' ),
290
+ 'type' => Controls_Manager::TEXT,
291
+ 'label_block' => false,
292
+ 'input_type' => 'email',
293
+ 'condition' => [
294
+ 'name' => 'email'
295
+ ],
296
+ 'dynamic' => [
297
+ 'active' => true,
298
+ ]
299
+ ]
300
+ );
301
+
302
+ $repeater->add_control(
303
+ 'customize',
304
+ [
305
+ 'label' => __( 'Want To Customize?', 'happy-elementor-addons' ),
306
+ 'type' => Controls_Manager::SWITCHER,
307
+ 'label_on' => __( 'Yes', 'happy-elementor-addons' ),
308
+ 'label_off' => __( 'No', 'happy-elementor-addons' ),
309
+ 'return_value' => 'yes',
310
+ 'style_transfer' => true,
311
+ ]
312
+ );
313
+
314
+ $repeater->start_controls_tabs(
315
+ '_tab_icon_colors',
316
+ [
317
+ 'condition' => ['customize' => 'yes']
318
+ ]
319
+ );
320
+ $repeater->start_controls_tab(
321
+ '_tab_icon_normal',
322
+ [
323
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
324
+ ]
325
+ );
326
+
327
+ $repeater->add_control(
328
+ 'color',
329
+ [
330
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
331
+ 'type' => Controls_Manager::COLOR,
332
+ 'selectors' => [
333
+ '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}' => 'color: {{VALUE}}',
334
+ ],
335
+ 'condition' => ['customize' => 'yes'],
336
+ 'style_transfer' => true,
337
+ ]
338
+ );
339
+
340
+ $repeater->add_control(
341
+ 'bg_color',
342
+ [
343
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
344
+ 'type' => Controls_Manager::COLOR,
345
+ 'selectors' => [
346
+ '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}' => 'background-color: {{VALUE}}',
347
+ ],
348
+ 'condition' => ['customize' => 'yes'],
349
+ 'style_transfer' => true,
350
+ ]
351
+ );
352
+
353
+ $repeater->end_controls_tab();
354
+ $repeater->start_controls_tab(
355
+ '_tab_icon_hover',
356
+ [
357
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
358
+ ]
359
+ );
360
+
361
+ $repeater->add_control(
362
+ 'hover_color',
363
+ [
364
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
365
+ 'type' => Controls_Manager::COLOR,
366
+ 'selectors' => [
367
+ '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:hover, {{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:focus' => 'color: {{VALUE}}',
368
+ ],
369
+ 'condition' => ['customize' => 'yes'],
370
+ 'style_transfer' => true,
371
+ ]
372
+ );
373
+
374
+ $repeater->add_control(
375
+ 'hover_bg_color',
376
+ [
377
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
378
+ 'type' => Controls_Manager::COLOR,
379
+ 'selectors' => [
380
+ '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:hover, {{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:focus' => 'background-color: {{VALUE}}',
381
+ ],
382
+ 'condition' => ['customize' => 'yes'],
383
+ 'style_transfer' => true,
384
+ ]
385
+ );
386
+
387
+ $repeater->add_control(
388
+ 'hover_border_color',
389
+ [
390
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
391
+ 'type' => Controls_Manager::COLOR,
392
+ 'selectors' => [
393
+ '{{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:hover, {{WRAPPER}} .ha-member-links > {{CURRENT_ITEM}}:focus' => 'border-color: {{VALUE}}',
394
+ ],
395
+ 'condition' => ['customize' => 'yes'],
396
+ 'style_transfer' => true,
397
+ ]
398
+ );
399
+
400
+ $repeater->end_controls_tab();
401
+ $repeater->end_controls_tabs();
402
+
403
+ $this->add_control(
404
+ 'profiles',
405
+ [
406
+ 'show_label' => false,
407
+ 'type' => Controls_Manager::REPEATER,
408
+ 'fields' => $repeater->get_controls(),
409
+ 'title_field' => '<# print(name.slice(0,1).toUpperCase() + name.slice(1)) #>',
410
+ 'default' => [
411
+ [
412
+ 'link' => ['url' => 'https://facebook.com/'],
413
+ 'name' => 'facebook'
414
+ ],
415
+ [
416
+ 'link' => ['url' => 'https://twitter.com/'],
417
+ 'name' => 'twitter'
418
+ ],
419
+ [
420
+ 'link' => ['url' => 'https://linkedin.com/'],
421
+ 'name' => 'linkedin'
422
+ ]
423
+ ],
424
+ ]
425
+ );
426
+
427
+ $this->add_control(
428
+ 'show_profiles',
429
+ [
430
+ 'label' => __( 'Show Profiles', 'happy-elementor-addons' ),
431
+ 'type' => Controls_Manager::SWITCHER,
432
+ 'label_on' => __( 'Show', 'happy-elementor-addons' ),
433
+ 'label_off' => __( 'Hide', 'happy-elementor-addons' ),
434
+ 'return_value' => 'yes',
435
+ 'default' => 'yes',
436
+ 'separator' => 'before',
437
+ 'style_transfer' => true,
438
+ ]
439
+ );
440
+
441
+ $this->end_controls_section();
442
+
443
+ $this->start_controls_section(
444
+ '_section_button',
445
+ [
446
+ 'label' => __( 'Details Button', 'happy-elementor-addons' ),
447
+ 'tab' => Controls_Manager::TAB_CONTENT,
448
+ ]
449
+ );
450
+
451
+ $this->add_control(
452
+ 'show_details_button',
453
+ [
454
+ 'label' => __( 'Show Button', 'happy-elementor-addons' ),
455
+ 'type' => Controls_Manager::SWITCHER,
456
+ 'label_on' => __( 'Show', 'happy-elementor-addons' ),
457
+ 'label_off' => __( 'Hide', 'happy-elementor-addons' ),
458
+ 'return_value' => 'yes',
459
+ 'default' => '',
460
+ 'style_transfer' => true,
461
+ ]
462
+ );
463
+
464
+ $this->add_control(
465
+ 'button_position',
466
+ [
467
+ 'label' => __( 'Position', 'happy-elementor-addons' ),
468
+ 'type' => Controls_Manager::SELECT,
469
+ 'default' => 'after',
470
+ 'style_transfer' => true,
471
+ 'options' => [
472
+ 'before' => __( 'Before Social Icons', 'happy-elementor-addons' ),
473
+ 'after' => __( 'After Social Icons', 'happy-elementor-addons' ),
474
+ ],
475
+ 'condition' => [
476
+ 'show_details_button' => 'yes',
477
+ ]
478
+ ]
479
+ );
480
+
481
+ $this->add_control(
482
+ 'button_text',
483
+ [
484
+ 'label' => __( 'Text', 'happy-elementor-addons' ),
485
+ 'type' => Controls_Manager::TEXT,
486
+ 'default' => __( 'Show Details', 'happy-elementor-addons' ),
487
+ 'placeholder' => __( 'Type button text here', 'happy-elementor-addons' ),
488
+ 'label_block' => true,
489
+ 'dynamic' => [
490
+ 'active' => true,
491
+ ],
492
+ 'condition' => [
493
+ 'show_details_button' => 'yes',
494
+ ]
495
+ ]
496
+ );
497
+
498
+ $this->add_control(
499
+ 'button_link',
500
+ [
501
+ 'label' => __( 'Link', 'happy-elementor-addons' ),
502
+ 'type' => Controls_Manager::URL,
503
+ 'placeholder' => 'https://example.com',
504
+ 'dynamic' => [
505
+ 'active' => true,
506
+ ],
507
+ 'condition' => [
508
+ 'show_details_button' => 'yes',
509
+ ]
510
+ ]
511
+ );
512
+
513
+ $this->add_control(
514
+ 'button_icon',
515
+ [
516
+ 'type' => Controls_Manager::ICONS,
517
+ 'label_block' => true,
518
+ 'show_label' => false,
519
+ 'condition' => [
520
+ 'show_details_button' => 'yes',
521
+ ]
522
+ ]
523
+ );
524
+
525
+ $this->add_control(
526
+ 'button_icon_position',
527
+ [
528
+ 'label' => __( 'Icon Position', 'happy-elementor-addons' ),
529
+ 'type' => Controls_Manager::CHOOSE,
530
+ 'label_block' => false,
531
+ 'options' => [
532
+ 'before' => [
533
+ 'title' => __( 'Before', 'happy-elementor-addons' ),
534
+ 'icon' => 'eicon-h-align-left',
535
+ ],
536
+ 'after' => [
537
+ 'title' => __( 'After', 'happy-elementor-addons' ),
538
+ 'icon' => 'eicon-h-align-right',
539
+ ],
540
+ ],
541
+ 'default' => 'after',
542
+ 'toggle' => false,
543
+ 'style_transfer' => true,
544
+ 'condition' => [
545
+ 'show_details_button' => 'yes',
546
+ 'button_icon[value]!' => ''
547
+ ]
548
+ ]
549
+ );
550
+
551
+ $this->add_control(
552
+ 'button_icon_spacing',
553
+ [
554
+ 'label' => __( 'Icon Spacing', 'happy-elementor-addons' ),
555
+ 'type' => Controls_Manager::SLIDER,
556
+ 'default' => [
557
+ 'size' => 10
558
+ ],
559
+ 'condition' => [
560
+ 'show_details_button' => 'yes',
561
+ 'button_icon[value]!' => ''
562
+ ],
563
+ 'selectors' => [
564
+ '{{WRAPPER}} .ha-btn--icon-before .ha-btn-icon' => 'margin-right: {{SIZE}}{{UNIT}};',
565
+ '{{WRAPPER}} .ha-btn--icon-after .ha-btn-icon' => 'margin-left: {{SIZE}}{{UNIT}};',
566
+ ],
567
+ ]
568
+ );
569
+
570
+ $this->end_controls_section();
571
+ }
572
+
573
+ /**
574
+ * Register styles related controls
575
+ */
576
+ protected function register_style_controls() {
577
+ $this->start_controls_section(
578
+ '_section_style_image',
579
+ [
580
+ 'label' => __( 'Photo', 'happy-elementor-addons' ),
581
+ 'tab' => Controls_Manager::TAB_STYLE,
582
+ ]
583
+ );
584
+
585
+ $this->add_responsive_control(
586
+ 'image_width',
587
+ [
588
+ 'label' => __( 'Width', 'happy-elementor-addons' ),
589
+ 'type' => Controls_Manager::SLIDER,
590
+ 'size_units' => [ 'px', '%'],
591
+ 'range' => [
592
+ '%' => [
593
+ 'min' => 20,
594
+ 'max' => 100,
595
+ ],
596
+ 'px' => [
597
+ 'min' => 100,
598
+ 'max' => 700,
599
+ ],
600
+ ],
601
+ 'selectors' => [
602
+ '{{WRAPPER}} .ha-member-figure' => 'width: {{SIZE}}{{UNIT}};',
603
+ ],
604
+ ]
605
+ );
606
+
607
+ $this->add_responsive_control(
608
+ 'image_height',
609
+ [
610
+ 'label' => __( 'Height', 'happy-elementor-addons' ),
611
+ 'type' => Controls_Manager::SLIDER,
612
+ 'size_units' => [ 'px' ],
613
+ 'range' => [
614
+ 'px' => [
615
+ 'min' => 100,
616
+ 'max' => 700,
617
+ ],
618
+ ],
619
+ 'selectors' => [
620
+ '{{WRAPPER}} .ha-member-figure' => 'height: {{SIZE}}{{UNIT}};',
621
+ ],
622
+ ]
623
+ );
624
+
625
+ $this->add_responsive_control(
626
+ 'image_spacing',
627
+ [
628
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
629
+ 'type' => Controls_Manager::SLIDER,
630
+ 'size_units' => ['px'],
631
+ 'selectors' => [
632
+ '{{WRAPPER}} .ha-member-figure' => 'margin-bottom: {{SIZE}}{{UNIT}} !important;',
633
+ ],
634
+ ]
635
+ );
636
+
637
+ $this->add_responsive_control(
638
+ 'image_padding',
639
+ [
640
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
641
+ 'type' => Controls_Manager::DIMENSIONS,
642
+ 'size_units' => [ 'px', 'em', '%' ],
643
+ 'selectors' => [
644
+ '{{WRAPPER}} .ha-member-figure img' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
645
+ ],
646
+ ]
647
+ );
648
+
649
+ $this->add_group_control(
650
+ Group_Control_Border::get_type(),
651
+ [
652
+ 'name' => 'image_border',
653
+ 'selector' => '{{WRAPPER}} .ha-member-figure img'
654
+ ]
655
+ );
656
+
657
+ $this->add_responsive_control(
658
+ 'image_border_radius',
659
+ [
660
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
661
+ 'type' => Controls_Manager::DIMENSIONS,
662
+ 'size_units' => [ 'px', '%' ],
663
+ 'selectors' => [
664
+ '{{WRAPPER}} .ha-member-figure img' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
665
+ ],
666
+ ]
667
+ );
668
+
669
+ $this->add_group_control(
670
+ Group_Control_Box_Shadow::get_type(),
671
+ [
672
+ 'name' => 'image_box_shadow',
673
+ 'exclude' => [
674
+ 'box_shadow_position',
675
+ ],
676
+ 'selector' => '{{WRAPPER}} .ha-member-figure img'
677
+ ]
678
+ );
679
+
680
+ $this->add_control(
681
+ 'image_bg_color',
682
+ [
683
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
684
+ 'type' => Controls_Manager::COLOR,
685
+ 'selectors' => [
686
+ '{{WRAPPER}} .ha-member-figure img' => 'background-color: {{VALUE}};',
687
+ ],
688
+ ]
689
+ );
690
+
691
+ $this->end_controls_section();
692
+
693
+ $this->start_controls_section(
694
+ '_section_style_content',
695
+ [
696
+ 'label' => __( 'Name, Job Title & Bio', 'happy-elementor-addons' ),
697
+ 'tab' => Controls_Manager::TAB_STYLE,
698
+ ]
699
+ );
700
+
701
+ $this->add_responsive_control(
702
+ 'content_padding',
703
+ [
704
+ 'label' => __( 'Content Padding', 'happy-elementor-addons' ),
705
+ 'type' => Controls_Manager::DIMENSIONS,
706
+ 'size_units' => [ 'px', 'em', '%' ],
707
+ 'selectors' => [
708
+ '{{WRAPPER}} .ha-member-body' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
709
+ ],
710
+ ]
711
+ );
712
+
713
+ $this->add_control(
714
+ '_heading_title',
715
+ [
716
+ 'type' => Controls_Manager::HEADING,
717
+ 'label' => __( 'Name', 'happy-elementor-addons' ),
718
+ 'separator' => 'before',
719
+ ]
720
+ );
721
+
722
+ $this->add_responsive_control(
723
+ 'title_spacing',
724
+ [
725
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
726
+ 'type' => Controls_Manager::SLIDER,
727
+ 'size_units' => ['px'],
728
+ 'selectors' => [
729
+ '{{WRAPPER}} .ha-member-name' => 'margin-bottom: {{SIZE}}{{UNIT}};',
730
+ ],
731
+ ]
732
+ );
733
+
734
+ $this->add_control(
735
+ 'title_color',
736
+ [
737
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
738
+ 'type' => Controls_Manager::COLOR,
739
+ 'selectors' => [
740
+ '{{WRAPPER}} .ha-member-name' => 'color: {{VALUE}}',
741
+ ],
742
+ ]
743
+ );
744
+
745
+ $this->add_group_control(
746
+ Group_Control_Typography::get_type(),
747
+ [
748
+ 'name' => 'title_typography',
749
+ 'selector' => '{{WRAPPER}} .ha-member-name',
750
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_2,
751
+ ]
752
+ );
753
+
754
+ $this->add_group_control(
755
+ Group_Control_Text_Shadow::get_type(),
756
+ [
757
+ 'name' => 'title_text_shadow',
758
+ 'selector' => '{{WRAPPER}} .ha-member-name',
759
+ ]
760
+ );
761
+
762
+ $this->add_control(
763
+ '_heading_job_title',
764
+ [
765
+ 'type' => Controls_Manager::HEADING,
766
+ 'label' => __( 'Job Title', 'happy-elementor-addons' ),
767
+ 'separator' => 'before'
768
+ ]
769
+ );
770
+
771
+ $this->add_responsive_control(
772
+ 'job_title_spacing',
773
+ [
774
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
775
+ 'type' => Controls_Manager::SLIDER,
776
+ 'size_units' => ['px'],
777
+ 'selectors' => [
778
+ '{{WRAPPER}} .ha-member-position' => 'margin-bottom: {{SIZE}}{{UNIT}};',
779
+ ],
780
+ ]
781
+ );
782
+
783
+ $this->add_control(
784
+ 'job_title_color',
785
+ [
786
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
787
+ 'type' => Controls_Manager::COLOR,
788
+ 'selectors' => [
789
+ '{{WRAPPER}} .ha-member-position' => 'color: {{VALUE}}',
790
+ ],
791
+ ]
792
+ );
793
+
794
+ $this->add_group_control(
795
+ Group_Control_Typography::get_type(),
796
+ [
797
+ 'name' => 'job_title_typography',
798
+ 'selector' => '{{WRAPPER}} .ha-member-position',
799
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
800
+ ]
801
+ );
802
+
803
+ $this->add_group_control(
804
+ Group_Control_Text_Shadow::get_type(),
805
+ [
806
+ 'name' => 'job_title_text_shadow',
807
+ 'selector' => '{{WRAPPER}} .ha-member-position',
808
+ ]
809
+ );
810
+
811
+ $this->add_control(
812
+ '_heading_bio',
813
+ [
814
+ 'type' => Controls_Manager::HEADING,
815
+ 'label' => __( 'Short Bio', 'happy-elementor-addons' ),
816
+ 'separator' => 'before'
817
+ ]
818
+ );
819
+
820
+ $this->add_responsive_control(
821
+ 'bio_spacing',
822
+ [
823
+ 'label' => __( 'Bottom Spacing', 'happy-elementor-addons' ),
824
+ 'type' => Controls_Manager::SLIDER,
825
+ 'size_units' => ['px'],
826
+ 'selectors' => [
827
+ '{{WRAPPER}} .ha-member-bio' => 'margin-bottom: {{SIZE}}{{UNIT}};',
828
+ ],
829
+ ]
830
+ );
831
+
832
+ $this->add_control(
833
+ 'bio_color',
834
+ [
835
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
836
+ 'type' => Controls_Manager::COLOR,
837
+ 'selectors' => [
838
+ '{{WRAPPER}} .ha-member-bio' => 'color: {{VALUE}};',
839
+ ],
840
+ ]
841
+ );
842
+
843
+ $this->add_group_control(
844
+ Group_Control_Typography::get_type(),
845
+ [
846
+ 'name' => 'bio_typography',
847
+ 'selector' => '{{WRAPPER}} .ha-member-bio',
848
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_3,
849
+ ]
850
+ );
851
+
852
+ $this->add_group_control(
853
+ Group_Control_Text_Shadow::get_type(),
854
+ [
855
+ 'name' => 'bio_text_shadow',
856
+ 'selector' => '{{WRAPPER}} .ha-member-bio',
857
+ ]
858
+ );
859
+
860
+ $this->end_controls_section();
861
+
862
+ $this->start_controls_section(
863
+ '_section_style_social',
864
+ [
865
+ 'label' => __( 'Social Icons', 'happy-elementor-addons' ),
866
+ 'tab' => Controls_Manager::TAB_STYLE,
867
+ ]
868
+ );
869
+
870
+ $this->add_responsive_control(
871
+ 'links_spacing',
872
+ [
873
+ 'label' => __( 'Right Spacing', 'happy-elementor-addons' ),
874
+ 'type' => Controls_Manager::SLIDER,
875
+ 'size_units' => ['px'],
876
+ 'selectors' => [
877
+ '{{WRAPPER}} .ha-member-links > a:not(:last-child)' => 'margin-right: {{SIZE}}{{UNIT}};',
878
+ ],
879
+ ]
880
+ );
881
+
882
+ $this->add_responsive_control(
883
+ 'links_padding',
884
+ [
885
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
886
+ 'type' => Controls_Manager::SLIDER,
887
+ 'size_units' => ['px'],
888
+ 'selectors' => [
889
+ '{{WRAPPER}} .ha-member-links > a' => 'padding: {{SIZE}}{{UNIT}};',
890
+ ],
891
+ ]
892
+ );
893
+
894
+ $this->add_responsive_control(
895
+ 'links_icon_size',
896
+ [
897
+ 'label' => __( 'Icon Size', 'happy-elementor-addons' ),
898
+ 'type' => Controls_Manager::SLIDER,
899
+ 'size_units' => ['px'],
900
+ 'selectors' => [
901
+ '{{WRAPPER}} .ha-member-links > a' => 'font-size: {{SIZE}}{{UNIT}};',
902
+ ],
903
+ ]
904
+ );
905
+
906
+ $this->add_group_control(
907
+ Group_Control_Border::get_type(),
908
+ [
909
+ 'name' => 'links_border',
910
+ 'selector' => '{{WRAPPER}} .ha-member-links > a'
911
+ ]
912
+ );
913
+
914
+ $this->add_responsive_control(
915
+ 'links_border_radius',
916
+ [
917
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
918
+ 'type' => Controls_Manager::DIMENSIONS,
919
+ 'size_units' => [ 'px', '%' ],
920
+ 'selectors' => [
921
+ '{{WRAPPER}} .ha-member-links > a' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
922
+ ],
923
+ ]
924
+ );
925
+
926
+ $this->start_controls_tabs( '_tab_links_colors' );
927
+ $this->start_controls_tab(
928
+ '_tab_links_normal',
929
+ [
930
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
931
+ ]
932
+ );
933
+
934
+ $this->add_control(
935
+ 'links_color',
936
+ [
937
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
938
+ 'type' => Controls_Manager::COLOR,
939
+ 'selectors' => [
940
+ '{{WRAPPER}} .ha-member-links > a' => 'color: {{VALUE}};',
941
+ ],
942
+ ]
943
+ );
944
+
945
+ $this->add_control(
946
+ 'links_bg_color',
947
+ [
948
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
949
+ 'type' => Controls_Manager::COLOR,
950
+ 'selectors' => [
951
+ '{{WRAPPER}} .ha-member-links > a' => 'background-color: {{VALUE}};',
952
+ ],
953
+ ]
954
+ );
955
+
956
+ $this->end_controls_tab();
957
+ $this->start_controls_tab(
958
+ '_tab_links_hover',
959
+ [
960
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
961
+ ]
962
+ );
963
+
964
+ $this->add_control(
965
+ 'links_hover_color',
966
+ [
967
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
968
+ 'type' => Controls_Manager::COLOR,
969
+ 'selectors' => [
970
+ '{{WRAPPER}} .ha-member-links > a:hover, {{WRAPPER}} .ha-member-links > a:focus' => 'color: {{VALUE}}',
971
+ ],
972
+ ]
973
+ );
974
+
975
+ $this->add_control(
976
+ 'links_hover_bg_color',
977
+ [
978
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
979
+ 'type' => Controls_Manager::COLOR,
980
+ 'selectors' => [
981
+ '{{WRAPPER}} .ha-member-links > a:hover, {{WRAPPER}} .ha-member-links > a:focus' => 'background-color: {{VALUE}}',
982
+ ],
983
+ ]
984
+ );
985
+
986
+ $this->add_control(
987
+ 'links_hover_border_color',
988
+ [
989
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
990
+ 'type' => Controls_Manager::COLOR,
991
+ 'selectors' => [
992
+ '{{WRAPPER}} .ha-member-links > a:hover, {{WRAPPER}} .ha-member-links > a:focus' => 'border-color: {{VALUE}};',
993
+ ],
994
+ 'condition' => [
995
+ 'links_border_border!' => '',
996
+ ]
997
+ ]
998
+ );
999
+
1000
+ $this->end_controls_tab();
1001
+ $this->end_controls_tabs();
1002
+
1003
+ $this->end_controls_section();
1004
+
1005
+ $this->start_controls_section(
1006
+ '_section_style_button',
1007
+ [
1008
+ 'label' => __( 'Details Button', 'happy-elementor-addons' ),
1009
+ 'tab' => Controls_Manager::TAB_STYLE,
1010
+ ]
1011
+ );
1012
+
1013
+ $this->add_responsive_control(
1014
+ 'button_margin',
1015
+ [
1016
+ 'label' => __( 'Margin', 'happy-elementor-addons' ),
1017
+ 'type' => Controls_Manager::DIMENSIONS,
1018
+ 'size_units' => [ 'px', '%' ],
1019
+ 'selectors' => [
1020
+ '{{WRAPPER}} .ha-btn' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1021
+ ],
1022
+ ]
1023
+ );
1024
+
1025
+ $this->add_responsive_control(
1026
+ 'button_padding',
1027
+ [
1028
+ 'label' => __( 'Padding', 'happy-elementor-addons' ),
1029
+ 'type' => Controls_Manager::DIMENSIONS,
1030
+ 'size_units' => [ 'px', 'em', '%' ],
1031
+ 'selectors' => [
1032
+ '{{WRAPPER}} .ha-btn' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1033
+ ],
1034
+ ]
1035
+ );
1036
+
1037
+ $this->add_group_control(
1038
+ Group_Control_Typography::get_type(),
1039
+ [
1040
+ 'name' => 'button_typography',
1041
+ 'selector' => '{{WRAPPER}} .ha-btn',
1042
+ 'scheme' => Scheme_Typography::TYPOGRAPHY_4,
1043
+ ]
1044
+ );
1045
+
1046
+ $this->add_group_control(
1047
+ Group_Control_Border::get_type(),
1048
+ [
1049
+ 'name' => 'button_border',
1050
+ 'selector' => '{{WRAPPER}} .ha-btn',
1051
+ ]
1052
+ );
1053
+
1054
+ $this->add_control(
1055
+ 'button_border_radius',
1056
+ [
1057
+ 'label' => __( 'Border Radius', 'happy-elementor-addons' ),
1058
+ 'type' => Controls_Manager::DIMENSIONS,
1059
+ 'size_units' => [ 'px', '%' ],
1060
+ 'selectors' => [
1061
+ '{{WRAPPER}} .ha-btn' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1062
+ ],
1063
+ ]
1064
+ );
1065
+
1066
+ $this->add_group_control(
1067
+ Group_Control_Box_Shadow::get_type(),
1068
+ [
1069
+ 'name' => 'button_box_shadow',
1070
+ 'selector' => '{{WRAPPER}} .ha-btn',
1071
+ ]
1072
+ );
1073
+
1074
+ $this->add_control(
1075
+ 'hr',
1076
+ [
1077
+ 'type' => Controls_Manager::DIVIDER,
1078
+ 'style' => 'thick',
1079
+ ]
1080
+ );
1081
+
1082
+ $this->start_controls_tabs( '_tabs_button' );
1083
+
1084
+ $this->start_controls_tab(
1085
+ '_tab_button_normal',
1086
+ [
1087
+ 'label' => __( 'Normal', 'happy-elementor-addons' ),
1088
+ ]
1089
+ );
1090
+
1091
+ $this->add_control(
1092
+ 'button_color',
1093
+ [
1094
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
1095
+ 'type' => Controls_Manager::COLOR,
1096
+ 'default' => '',
1097
+ 'selectors' => [
1098
+ '{{WRAPPER}} .ha-btn' => 'color: {{VALUE}};',
1099
+ ],
1100
+ ]
1101
+ );
1102
+
1103
+ $this->add_control(
1104
+ 'button_bg_color',
1105
+ [
1106
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
1107
+ 'type' => Controls_Manager::COLOR,
1108
+ 'selectors' => [
1109
+ '{{WRAPPER}} .ha-btn' => 'background-color: {{VALUE}};',
1110
+ ],
1111
+ ]
1112
+ );
1113
+
1114
+ $this->end_controls_tab();
1115
+
1116
+ $this->start_controls_tab(
1117
+ '_tab_button_hover',
1118
+ [
1119
+ 'label' => __( 'Hover', 'happy-elementor-addons' ),
1120
+ ]
1121
+ );
1122
+
1123
+ $this->add_control(
1124
+ 'button_hover_color',
1125
+ [
1126
+ 'label' => __( 'Text Color', 'happy-elementor-addons' ),
1127
+ 'type' => Controls_Manager::COLOR,
1128
+ 'selectors' => [
1129
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'color: {{VALUE}};',
1130
+ ],
1131
+ ]
1132
+ );
1133
+
1134
+ $this->add_control(
1135
+ 'button_hover_bg_color',
1136
+ [
1137
+ 'label' => __( 'Background Color', 'happy-elementor-addons' ),
1138
+ 'type' => Controls_Manager::COLOR,
1139
+ 'selectors' => [
1140
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'background-color: {{VALUE}};',
1141
+ ],
1142
+ ]
1143
+ );
1144
+
1145
+ $this->add_control(
1146
+ 'button_hover_border_color',
1147
+ [
1148
+ 'label' => __( 'Border Color', 'happy-elementor-addons' ),
1149
+ 'type' => Controls_Manager::COLOR,
1150
+ 'condition' => [
1151
+ 'button_border_border!' => '',
1152
+ ],
1153
+ 'selectors' => [
1154
+ '{{WRAPPER}} .ha-btn:hover, {{WRAPPER}} .ha-btn:focus' => 'border-color: {{VALUE}};',
1155
+ ],
1156
+ ]
1157
+ );
1158
+
1159
+ $this->end_controls_tab();
1160
+ $this->end_controls_tabs();
1161
+
1162
+ $this->end_controls_section();
1163
+ }
1164
 
1165
  protected function render() {
1166
+ $settings = $this->get_settings_for_display();
1167
+
1168
+ $button_position = ! empty( $settings['button_position'] ) ? $settings['button_position'] : 'after';
1169
+
1170
+ $show_button = false;
1171
+ if ( ! empty( $settings['show_details_button'] ) && $settings['show_details_button'] === 'yes' ) {
1172
+ $show_button = true;
1173
+ }
1174
+
1175
+ $this->add_inline_editing_attributes( 'title', 'basic' );
1176
+ $this->add_render_attribute( 'title', 'class', 'ha-member-name' );
1177
+
1178
+ $this->add_inline_editing_attributes( 'job_title', 'basic' );
1179
+ $this->add_render_attribute( 'job_title', 'class', 'ha-member-position' );
1180
+
1181
+ $this->add_inline_editing_attributes( 'bio', 'intermediate' );
1182
+ $this->add_render_attribute( 'bio', 'class', 'ha-member-bio' );
1183
+ ?>
1184
+
1185
+ <?php if ( $settings['image']['url'] || $settings['image']['id'] ) :
1186
+ $settings['hover_animation'] = 'disable-animation'; // hack to prevent image hover animation
1187
+ ?>
1188
+ <figure class="ha-member-figure">
1189
+ <?php echo Group_Control_Image_Size::get_attachment_image_html( $settings, 'thumbnail', 'image' ); ?>
1190
+ </figure>
1191
+ <?php endif; ?>
1192
+
1193
+ <div class="ha-member-body">
1194
+ <?php if ( $settings['title'] ) :
1195
+ printf( '<%1$s %2$s>%3$s</%1$s>',
1196
+ tag_escape( $settings['title_tag'] ),
1197
+ $this->get_render_attribute_string( 'title' ),
1198
+ ha_kses_basic( $settings['title'] )
1199
+ );
1200
+ endif; ?>
1201
+
1202
+ <?php if ( $settings['job_title' ] ) : ?>
1203
+ <div <?php $this->print_render_attribute_string( 'job_title' ); ?>><?php echo ha_kses_basic( $settings['job_title' ] ); ?></div>
1204
+ <?php endif; ?>
1205
+
1206
+ <?php if ( $settings['bio'] ) : ?>
1207
+ <div <?php $this->print_render_attribute_string( 'bio' ); ?>>
1208
+ <p><?php echo ha_kses_intermediate( $settings['bio'] ); ?></p>
1209
+ </div>
1210
+ <?php endif; ?>
1211
+
1212
+ <?php
1213
+ if ( $show_button && $button_position === 'before' ) {
1214
+ $this->render_icon_button( [ 'new_icon' => 'button_icon', 'old_icon' => '' ] );
1215
+ }
1216
+ ?>
1217
+
1218
+ <?php if ( $settings['show_profiles' ] && is_array( $settings['profiles' ] ) ) : ?>
1219
+ <div class="ha-member-links">
1220
+ <?php
1221
+ foreach ( $settings['profiles'] as $profile ) :
1222
+ $icon = $profile['name'];
1223
+ $url = $profile['link']['url'];
1224
+
1225
+ if ($profile['name'] === 'website') {
1226
+ $icon = 'globe';
1227
+ } elseif ($profile['name'] === 'email') {
1228
+ $icon = 'envelope';
1229
+ $url = 'mailto:' . antispambot( $profile['email'] );
1230
+ }
1231
+
1232
+ printf( '<a target="_blank" rel="noopener" href="%s" class="elementor-repeater-item-%s"><i class="fa fa-%s" aria-hidden="true"></i></a>',
1233
+ $url,
1234
+ esc_attr( $profile['_id'] ),
1235
+ esc_attr( $icon )
1236
+ );
1237
+ endforeach; ?>
1238
+ </div>
1239
+ <?php endif; ?>
1240
+
1241
+ <?php
1242
+ if ( $show_button && $button_position === 'after' ) {
1243
+ $this->render_icon_button( [ 'new_icon' => 'button_icon', 'old_icon' => '' ] );
1244
+ }
1245
+ ?>
1246
+ </div>
1247
+ <?php
1248
+ }
1249
+
1250
+ public function _content_template() {
1251
+ return '';
1252
+ ?>
1253
+ <#
1254
+ view.addInlineEditingAttributes( 'title', 'basic' );
1255
+ view.addRenderAttribute( 'title', 'class', 'ha-member-name' );
1256
+
1257
+ view.addInlineEditingAttributes( 'job_title', 'basic' );
1258
+ view.addRenderAttribute( 'job_title', 'class', 'ha-member-position' );
1259
+
1260
+ view.addInlineEditingAttributes( 'bio', 'intermediate' );
1261
+ view.addRenderAttribute( 'bio', 'class', 'ha-member-bio' );
1262
+
1263
+ if ( settings.image.url || settings.image.id ) {
1264
+ var image = {
1265
+ id: settings.image.id,
1266
+ url: settings.image.url,
1267
+ size: settings.thumbnail_size,
1268
+ dimension: settings.thumbnail_custom_dimension,
1269
+ model: view.getEditModel()
1270
+ };
1271
+
1272
+ var image_url = elementor.imagesManager.getImageUrl( image );
1273
+ #>
1274
+ <figure class="ha-member-figure">
1275
+ <img src="{{ image_url }}">
1276
+ </figure>
1277
+ <# } #>
1278
+ <div class="ha-member-body">
1279
+ <# if (settings.title) { #>
1280
+ <{{ settings.title_tag }} {{{ view.getRenderAttributeString( 'title' ) }}}>{{ settings.title }}</{{ settings.title_tag }}>
1281
+ <# } #>
1282
+ <# if (settings.job_title) { #>
1283
+ <div {{{ view.getRenderAttributeString( 'job_title' ) }}}>{{ settings.job_title }}</div>
1284
+ <# } #>
1285
+ <# if (settings.bio) { #>
1286
+ <div {{{ view.getRenderAttributeString( 'bio' ) }}}>
1287
+ <p>{{{ settings.bio }}}</p>
1288
+ </div>
1289
+ <# } #>
1290
+
1291
+ <# if ( !_.isUndefined( settings['button_position'] ) && settings['button_position'] === 'before' ) {
1292
+ print( ha.getButtonWithIcon( view, {newIcon: 'button_icon', oldIcon: ''} ) );
1293
+ } #>
1294
+
1295
+ <# if (settings.show_profiles && _.isArray(settings.profiles)) { #>
1296
+ <div class="ha-member-links">
1297
+ <# _.each(settings.profiles, function(profile, index) {
1298
+ var icon = profile.name,
1299
+ url = profile.link.url,
1300
+ linkKey = view.getRepeaterSettingKey( 'profile', 'profiles', index);
1301
+
1302
+ if (profile.name === 'website') {
1303
+ icon = 'globe';
1304
+ } else if (profile.name === 'email') {
1305
+ icon = 'envelope'
1306
+ url = 'mailto:' + profile.email;
1307
+ }
1308
+
1309
+ view.addRenderAttribute( linkKey, 'class', 'elementor-repeater-item-' + profile._id );
1310
+ view.addRenderAttribute( linkKey, 'href', url ); #>
1311
+ <a {{{view.getRenderAttributeString( linkKey )}}}><i class="fa fa-{{{icon}}}"></i></a>
1312
+ <# }); #>
1313
+ </div>
1314
+ <# } #>
1315
+
1316
+ <# if ( !_.isUndefined( settings['button_position'] ) && settings['button_position'] === 'after' ) {
1317
+ print( ha.getButtonWithIcon( view, {newIcon: 'button_icon', oldIcon: ''} ) );
1318
+ } #>
1319
+ </div>
1320
+ <?php
1321
+ }
1322
  }
widgets/pricing-table/widget.php CHANGED
@@ -252,7 +252,7 @@ class Pricing_Table extends Base {
252
  'icon' => 'fa fa-check',
253
  ],
254
  ],
255
- 'title_field' => '<# print(ha_get_feature_label(text)); #>',
256
  ]
257
  );
258
 
@@ -286,7 +286,7 @@ class Pricing_Table extends Base {
286
  'label' => __( 'Link', 'happy-elementor-addons' ),
287
  'type' => Controls_Manager::URL,
288
  'label_block' => true,
289
- 'placeholder' => 'https://happyaddons.com/',
290
  'dynamic' => [
291
  'active' => true,
292
  ],
252
  'icon' => 'fa fa-check',
253
  ],
254
  ],
255
+ 'title_field' => '<# print(ha.getFeatureLabel(text)); #>',
256
  ]
257
  );
258
 
286
  'label' => __( 'Link', 'happy-elementor-addons' ),
287
  'type' => Controls_Manager::URL,
288
  'label_block' => true,
289
+ 'placeholder' => 'https://example.com',
290
  'dynamic' => [
291
  'active' => true,
292
  ],
widgets/slider/widget.php CHANGED
@@ -81,7 +81,7 @@ class Slider extends Base {
81
  [
82
  'type' => Controls_Manager::TEXT,
83
  'label_block' => true,
84
- 'label' => __( 'Title & Subtitle', 'happy-elementor-addons' ),
85
  'placeholder' => __( 'Type title here', 'happy-elementor-addons' ),
86
  'dynamic' => [
87
  'active' => true,
@@ -94,13 +94,26 @@ class Slider extends Base {
94
  [
95
  'type' => Controls_Manager::TEXTAREA,
96
  'label_block' => true,
97
- 'show_label' => false,
98
  'placeholder' => __( 'Type subtitle here', 'happy-elementor-addons' ),
99
  'dynamic' => [
100
  'active' => true,
101
  ]
102
  ]
103
- );
 
 
 
 
 
 
 
 
 
 
 
 
 
104
 
105
  $this->add_control(
106
  'slides',
@@ -707,13 +720,24 @@ class Slider extends Base {
707
 
708
  <?php foreach ( $settings['slides'] as $slide ) :
709
  $image = wp_get_attachment_image_url( $slide['image']['id'], $settings['thumbnail_size'] );
710
- if ( ! $image ) {
711
- $image = $slide['image']['url'];
712
- }
 
 
 
 
 
 
 
 
 
 
 
713
  ?>
714
 
715
  <div class="ha-slick-slide">
716
- <div class="ha-slick-item">
717
  <?php if ( $image ) : ?>
718
  <img class="ha-slick-img" src="<?php echo esc_url( $image ); ?>" alt="<?php echo esc_attr( $slide['title'] ); ?>">
719
  <?php endif; ?>
@@ -728,7 +752,7 @@ class Slider extends Base {
728
  <?php endif; ?>
729
  </div>
730
  <?php endif; ?>
731
- </div>
732
  </div>
733
 
734
  <?php endforeach; ?>
81
  [
82
  'type' => Controls_Manager::TEXT,
83
  'label_block' => true,
84
+ 'label' => __( 'Title', 'happy-elementor-addons' ),
85
  'placeholder' => __( 'Type title here', 'happy-elementor-addons' ),
86
  'dynamic' => [
87
  'active' => true,
94
  [
95
  'type' => Controls_Manager::TEXTAREA,
96
  'label_block' => true,
97
+ 'label' => __( 'Subtitle', 'happy-elementor-addons' ),
98
  'placeholder' => __( 'Type subtitle here', 'happy-elementor-addons' ),
99
  'dynamic' => [
100
  'active' => true,
101
  ]
102
  ]
103
+ );
104
+
105
+ $repeater->add_control(
106
+ 'link',
107
+ [
108
+ 'label' => __( 'Link', 'happy-elementor-addons' ),
109
+ 'type' => Controls_Manager::URL,
110
+ 'label_block' => true,
111
+ 'placeholder' => 'https://example.com',
112
+ 'dynamic' => [
113
+ 'active' => true,
114
+ ]
115
+ ]
116
+ );
117
 
118
  $this->add_control(
119
  'slides',
720
 
721
  <?php foreach ( $settings['slides'] as $slide ) :
722
  $image = wp_get_attachment_image_url( $slide['image']['id'], $settings['thumbnail_size'] );
723
+
724
+ if ( ! $image ) {
725
+ $image = $slide['image']['url'];
726
+ }
727
+
728
+ $item_tag = 'div';
729
+ $id = 'ha-slick-item-' . $slide['_id'];
730
+
731
+ $this->add_render_attribute( $id, 'class', 'ha-slick-item' );
732
+
733
+ if ( isset( $slide['link'] ) && ! empty( $slide['link']['url'] ) ) {
734
+ $item_tag = 'a';
735
+ $this->add_link_attributes( $id, $slide['link'] );
736
+ }
737
  ?>
738
 
739
  <div class="ha-slick-slide">
740
+ <<?php echo $item_tag; ?> <?php $this->print_render_attribute_string( $id ); ?>>
741
  <?php if ( $image ) : ?>
742
  <img class="ha-slick-img" src="<?php echo esc_url( $image ); ?>" alt="<?php echo esc_attr( $slide['title'] ); ?>">
743
  <?php endif; ?>
752
  <?php endif; ?>
753
  </div>
754
  <?php endif; ?>
755
+ </<?php echo $item_tag; ?>>
756
  </div>
757
 
758
  <?php endforeach; ?>
widgets/social-icons/widget.php CHANGED
@@ -62,11 +62,13 @@ class Social_Icons extends Base {
62
  [
63
  'label' => __('Icon', 'happy-elementor-addons'),
64
  'type' => Controls_Manager::ICONS,
65
- 'label_block' => true,
66
  'default' => [
67
  'value' => 'fab fa-wordpress',
68
  'library' => 'fa-brands',
69
  ],
 
 
70
  'recommended' => [
71
  'fa-brands' => [
72
  'android',
@@ -204,8 +206,7 @@ class Social_Icons extends Base {
204
  'type' => Controls_Manager::COLOR,
205
 
206
  'selectors' => [
207
- '{{WRAPPER}} .ha-social-icons-wrapper > {{CURRENT_ITEM}}.ha-social-icon' => 'color: {{VALUE}};',
208
- '{{WRAPPER}} .ha-social-icons-wrapper > {{CURRENT_ITEM}}.ha-social-icon > svg' => 'fill: {{VALUE}};',
209
  ],
210
  'condition' => ['customize' => 'yes'],
211
  'style_transfer' => true,
@@ -253,7 +254,6 @@ class Social_Icons extends Base {
253
  'type' => Controls_Manager::COLOR,
254
  'selectors' => [
255
  '{{WRAPPER}} .ha-social-icons-wrapper > {{CURRENT_ITEM}}.ha-social-icon:hover' => 'color: {{VALUE}};',
256
- '{{WRAPPER}} .ha-social-icons-wrapper > {{CURRENT_ITEM}}.ha-social-icon:hover svg' => 'fill: {{VALUE}};',
257
  ],
258
  'condition' => ['customize' => 'yes'],
259
  'style_transfer' => true,
@@ -462,7 +462,6 @@ class Social_Icons extends Base {
462
  '{{WRAPPER}} .ha-social-icons-wrapper > .ha-social-icon' => 'color: {{VALUE}};',
463
  '{{WRAPPER}}.ha-separator--stroke .ha-social-icon-separator' => 'background: {{VALUE}};',
464
  '{{WRAPPER}}.ha-separator--custom .ha-social-icon-separator' => 'color: {{VALUE}};',
465
- '{{WRAPPER}} .ha-social-icons-wrapper > .ha-social-icon > svg' => 'fill: {{VALUE}};',
466
  ],
467
  'style_transfer' => true,
468
  ]
@@ -508,7 +507,6 @@ class Social_Icons extends Base {
508
  '{{WRAPPER}} .ha-social-icons-wrapper > .ha-social-icon:hover' => 'color: {{VALUE}};',
509
  '{{WRAPPER}}.ha-separator--stroke .ha-social-icon-separator' => 'background: {{VALUE}};',
510
  '{{WRAPPER}}.ha-separator--custom .ha-social-icon-separator' => 'color: {{VALUE}};',
511
- '{{WRAPPER}} .ha-social-icons-wrapper > .ha-social-icon:hover svg' => 'fill: {{VALUE}};',
512
  ],
513
  'style_transfer' => true,
514
  ]
@@ -642,7 +640,6 @@ class Social_Icons extends Base {
642
  ],
643
  'selectors' => [
644
  '{{WRAPPER}} .ha-social-icon.ha-social-icon--network i' => 'font-size: {{SIZE}}{{UNIT}};',
645
- '{{WRAPPER}} .ha-social-icon.ha-social-icon--network svg' => 'font-size: {{SIZE}}{{UNIT}};',
646
  ],
647
  ]
648
  );
62
  [
63
  'label' => __('Icon', 'happy-elementor-addons'),
64
  'type' => Controls_Manager::ICONS,
65
+ 'label_block' => false,
66
  'default' => [
67
  'value' => 'fab fa-wordpress',
68
  'library' => 'fa-brands',
69
  ],
70
+ 'skin' => 'inline',
71
+ 'exclude_inline_options' => ['svg'],
72
  'recommended' => [
73
  'fa-brands' => [
74
  'android',
206
  'type' => Controls_Manager::COLOR,
207
 
208
  'selectors' => [
209
+ '{{WRAPPER}} .ha-social-icons-wrapper > {{CURRENT_ITEM}}.ha-social-icon' => 'color: {{VALUE}};',
 
210
  ],
211
  'condition' => ['customize' => 'yes'],
212
  'style_transfer' => true,
254
  'type' => Controls_Manager::COLOR,
255
  'selectors' => [
256
  '{{WRAPPER}} .ha-social-icons-wrapper > {{CURRENT_ITEM}}.ha-social-icon:hover' => 'color: {{VALUE}};',
 
257
  ],
258
  'condition' => ['customize' => 'yes'],
259
  'style_transfer' => true,
462
  '{{WRAPPER}} .ha-social-icons-wrapper > .ha-social-icon' => 'color: {{VALUE}};',
463
  '{{WRAPPER}}.ha-separator--stroke .ha-social-icon-separator' => 'background: {{VALUE}};',
464
  '{{WRAPPER}}.ha-separator--custom .ha-social-icon-separator' => 'color: {{VALUE}};',
 
465
  ],
466
  'style_transfer' => true,
467
  ]
507
  '{{WRAPPER}} .ha-social-icons-wrapper > .ha-social-icon:hover' => 'color: {{VALUE}};',
508
  '{{WRAPPER}}.ha-separator--stroke .ha-social-icon-separator' => 'background: {{VALUE}};',
509
  '{{WRAPPER}}.ha-separator--custom .ha-social-icon-separator' => 'color: {{VALUE}};',
 
510
  ],
511
  'style_transfer' => true,
512
  ]
640
  ],
641
  'selectors' => [
642
  '{{WRAPPER}} .ha-social-icon.ha-social-icon--network i' => 'font-size: {{SIZE}}{{UNIT}};',
 
643
  ],
644
  ]
645
  );
widgets/step-flow/widget.php CHANGED
@@ -132,7 +132,7 @@ class Step_Flow extends Base {
132
  [
133
  'label' => __( 'Link', 'happy-elementor-addons' ),
134
  'type' => Controls_Manager::URL,
135
- 'placeholder' => 'https://happyaddons.com/',
136
  'dynamic' => [
137
  'active' => true,
138
  ]
@@ -235,8 +235,12 @@ class Step_Flow extends Base {
235
  'size_units' => [ 'px', 'em' ],
236
  'range' => [
237
  'px' => [
238
- 'min' => 0,
239
- 'max' => 100,
 
 
 
 
240
  ]
241
  ],
242
  'selectors' => [
132
  [
133
  'label' => __( 'Link', 'happy-elementor-addons' ),
134
  'type' => Controls_Manager::URL,
135
+ 'placeholder' => 'https://example.com',
136
  'dynamic' => [
137
  'active' => true,
138
  ]
235
  'size_units' => [ 'px', 'em' ],
236
  'range' => [
237
  'px' => [
238
+ 'min' => 6,
239
+ 'max' => 300,
240
+ ],
241
+ 'em' => [
242
+ 'min' => 6,
243
+ 'max' => 300,
244
  ]
245
  ],
246
  'selectors' => [
widgets/threesixty-rotation/widget.php CHANGED
@@ -66,6 +66,11 @@ class Threesixty_Rotation extends Base {
66
  [
67
  'label' => __('Gallery', 'happy-elementor-addons'),
68
  'type' => Controls_Manager::GALLERY,
 
 
 
 
 
69
  'dynamic' => [
70
  'active' => true,
71
  ]
@@ -528,6 +533,9 @@ class Threesixty_Rotation extends Base {
528
  protected function render() {
529
 
530
  $settings = $this->get_settings_for_display();
 
 
 
531
  $this->add_render_attribute('wrapper', 'class', 'ha-threesixty-rotation-wrapper');
532
  $this->add_render_attribute(
533
  'rotation',
@@ -549,7 +557,7 @@ class Threesixty_Rotation extends Base {
549
  ]
550
  );
551
  }
552
- $svg_url = HAPPY_ADDONS_ASSETS . 'imgs/360_view.svg'
553
  ?>
554
 
555
  <div <?php $this->print_render_attribute_string('wrapper'); ?>>
66
  [
67
  'label' => __('Gallery', 'happy-elementor-addons'),
68
  'type' => Controls_Manager::GALLERY,
69
+ 'default' => [
70
+ [
71
+ 'url' => Utils::get_placeholder_image_src(),
72
+ ]
73
+ ],
74
  'dynamic' => [
75
  'active' => true,
76
  ]
533
  protected function render() {
534
 
535
  $settings = $this->get_settings_for_display();
536
+ if ( empty( $settings['images'] ) ) {
537
+ return;
538
+ }
539
  $this->add_render_attribute('wrapper', 'class', 'ha-threesixty-rotation-wrapper');
540
  $this->add_render_attribute(
541
  'rotation',
557
  ]
558
  );
559
  }
560
+ $svg_url = HAPPY_ADDONS_ASSETS . 'imgs/360_view.svg';
561
  ?>
562
 
563
  <div <?php $this->print_render_attribute_string('wrapper'); ?>>