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

Version Description

  • 29 April 2020 =

  • New: WPML support for all widgets Documentation

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

Code changes from version 2.8.1 to 2.9.0

base.php CHANGED
@@ -44,14 +44,16 @@ class Base {
44
  add_action( 'elementor/controls/controls_registered', [ $this, 'register_controls' ] );
45
 
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
 
56
  $this->init_appsero_tracking();
57
 
@@ -66,7 +68,7 @@ class Base {
66
  }
67
 
68
  do_action( 'happyaddons_loaded' );
69
- }
70
 
71
  /**
72
  * Initialize the tracker
@@ -104,7 +106,7 @@ class Base {
104
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/widgets-cache.php' );
105
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/assets-cache.php' );
106
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/extensions-manager.php' );
107
- include_once( HAPPY_ADDONS_DIR_PATH . 'classes/select2-handler.php' );
108
 
109
  if ( is_admin() ) {
110
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/updater.php' );
@@ -115,7 +117,7 @@ class Base {
115
  if ( is_user_logged_in() ) {
116
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/admin-bar.php' );
117
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/clone-handler.php' );
118
- }
119
  }
120
 
121
  /**
@@ -159,5 +161,15 @@ class Base {
159
  // Add the category
160
  $categories_manager->add_category( Finder::SLUG, new Finder() );
161
  $categories_manager->add_category( Finder_Edit::SLUG, new Finder_Edit() );
162
- }
 
 
 
 
 
 
 
 
 
 
163
  }
44
  add_action( 'elementor/controls/controls_registered', [ $this, 'register_controls' ] );
45
 
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
 
68
  }
69
 
70
  do_action( 'happyaddons_loaded' );
71
+ }
72
 
73
  /**
74
  * Initialize the tracker
106
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/widgets-cache.php' );
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' );
117
  if ( is_user_logged_in() ) {
118
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/admin-bar.php' );
119
  include_once( HAPPY_ADDONS_DIR_PATH . 'classes/clone-handler.php' );
120
+ }
121
  }
122
 
123
  /**
161
  // Add the category
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
  }
base/widget-base.php CHANGED
@@ -78,7 +78,7 @@ abstract class Base extends Widget_Base {
78
  $this->register_style_controls();
79
 
80
  do_action( 'happyaddons_end_register_controls', $this );
81
- }
82
 
83
  /**
84
  * Register content controls
78
  $this->register_style_controls();
79
 
80
  do_action( 'happyaddons_end_register_controls', $this );
81
+ }
82
 
83
  /**
84
  * Register content controls
changelog.txt CHANGED
@@ -1,3 +1,7 @@
 
 
 
 
1
  = 2.8.1 - 5 April 2020 =
2
 
3
  - Tweak: Adminbar actions terms updated to more meaningful terms
1
+ = 2.9.0 - 29 April 2020 =
2
+
3
+ - New: WPML support for all widgets [Documentation](https://happyaddons.com/docs/happy-addons-for-elementor/happy-features/wpml-support-for-happyaddons-free/)
4
+
5
  = 2.8.1 - 5 April 2020 =
6
 
7
  - Tweak: Adminbar actions terms updated to more meaningful terms
classes/wpml-manager.php ADDED
@@ -0,0 +1,513 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * WPML integration and compatibility manager
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
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' );
17
+ include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/justified-gallery.php' );
18
+ include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/logo-grid.php' );
19
+ include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/pricing-table.php' );
20
+ include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/skills.php' );
21
+ include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/slider.php' );
22
+ include_once( HAPPY_ADDONS_DIR_PATH . 'wpml/social-icons.php' );
23
+ }
24
+
25
+ public static function add_widgets_to_translate( $widgets ) {
26
+ $widgets_map = [
27
+ /**
28
+ * Bar Chart
29
+ */
30
+ 'bar-chart' => [
31
+ 'fields' => [
32
+ [
33
+ 'field' => 'labels',
34
+ 'type' => __( 'Bar Chart: Labels', 'happy-elementor-addons' ),
35
+ 'editor_type' => 'LINE',
36
+ ],
37
+ [
38
+ 'field' => 'chart_title',
39
+ 'type' => __( 'Bar Chart: Title', 'happy-elementor-addons' ),
40
+ 'editor_type' => 'LINE',
41
+ ],
42
+ ],
43
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Bar_Chart',
44
+ ],
45
+
46
+ /**
47
+ * Card
48
+ */
49
+ 'card' => [
50
+ 'fields' => [
51
+ [
52
+ 'field' => 'badge_text',
53
+ 'type' => __( 'Card: Badge Text', 'happy-elementor-addons' ),
54
+ 'editor_type' => 'LINE',
55
+ ],
56
+ [
57
+ 'field' => 'title',
58
+ 'type' => __( 'Card: Title', 'happy-elementor-addons' ),
59
+ 'editor_type' => 'LINE',
60
+ ],
61
+ [
62
+ 'field' => 'description',
63
+ 'type' => __( 'Card: Description', 'happy-elementor-addons' ),
64
+ 'editor_type' => 'AREA'
65
+ ],
66
+ [
67
+ 'field' => 'button_text',
68
+ 'type' => __( 'Card: Button Text', 'happy-elementor-addons' ),
69
+ 'editor_type' => 'LINE',
70
+ ],
71
+ [
72
+ 'field' => 'button_link',
73
+ 'type' => __( 'Card: Button Link', 'happy-elementor-addons' ),
74
+ 'editor_type' => 'LINK',
75
+ ],
76
+ ],
77
+ ],
78
+
79
+ /**
80
+ * Carousel
81
+ */
82
+ 'carousel' => [
83
+ 'fields' => [],
84
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Carousel',
85
+ ],
86
+
87
+ /**
88
+ * Dual Button
89
+ */
90
+ 'dual-button' => [
91
+ 'fields' => [
92
+ [
93
+ 'field' => 'left_button_text',
94
+ 'type' => __( 'Dual Button: Primary Button Text', 'happy-elementor-addons' ),
95
+ 'editor_type' => 'LINE',
96
+ ],
97
+ [
98
+ 'field' => 'left_button_link',
99
+ 'type' => __( 'Dual Button: Primary Button Link', 'happy-elementor-addons' ),
100
+ 'editor_type' => 'LINK',
101
+ ],
102
+ [
103
+ 'field' => 'button_connector_text',
104
+ 'type' => __( 'Dual Button: Connector Text', 'happy-elementor-addons' ),
105
+ 'editor_type' => 'LINE',
106
+ ],
107
+ [
108
+ 'field' => 'right_button_text',
109
+ 'type' => __( 'Dual Button: Secondary Button Text', 'happy-elementor-addons' ),
110
+ 'editor_type' => 'LINE',
111
+ ],
112
+ [
113
+ 'field' => 'right_button_link',
114
+ 'type' => __( 'Dual Button: Secondary Button Link', 'happy-elementor-addons' ),
115
+ 'editor_type' => 'LINK',
116
+ ],
117
+ ],
118
+ ],
119
+
120
+ /**
121
+ * Flip Box
122
+ */
123
+ 'flip-box' => [
124
+ 'fields' => [
125
+ [
126
+ 'field' => 'front_title',
127
+ 'type' => __( 'Flip Box: Front Title', 'happy-elementor-addons' ),
128
+ 'editor_type' => 'LINE',
129
+ ],
130
+ [
131
+ 'field' => 'front_description',
132
+ 'type' => __( 'Flip Box: Front Description', 'happy-elementor-addons' ),
133
+ 'editor_type' => 'AREA',
134
+ ],
135
+ [
136
+ 'field' => 'back_title',
137
+ 'type' => __( 'Flip Box: Back Title', 'happy-elementor-addons' ),
138
+ 'editor_type' => 'LINE',
139
+ ],
140
+ [
141
+ 'field' => 'back_description',
142
+ 'type' => __( 'Flip Box: Back Description', 'happy-elementor-addons' ),
143
+ 'editor_type' => 'AREA',
144
+ ],
145
+ ],
146
+ ],
147
+
148
+ /**
149
+ * Fun Factor
150
+ */
151
+ 'fun-factor' => [
152
+ 'fields' => [
153
+ [
154
+ 'field' => 'fun_factor_title',
155
+ 'type' => __( 'Fun Factor: Title', 'happy-elementor-addons' ),
156
+ 'editor_type' => 'LINE',
157
+ ],
158
+ ],
159
+ ],
160
+
161
+ /**
162
+ * Gradient Heading
163
+ */
164
+ 'gradient-heading' => [
165
+ 'fields' => [
166
+ [
167
+ 'field' => 'title',
168
+ 'type' => __( 'Gradient_Heading: Title', 'happy-elementor-addons' ),
169
+ 'editor_type' => 'AREA',
170
+ ],
171
+ [
172
+ 'field' => 'link',
173
+ 'type' => __( 'Gradient_Heading: Link', 'happy-elementor-addons' ),
174
+ 'editor_type' => 'LINK',
175
+ ],
176
+ ],
177
+ ],
178
+
179
+ /**
180
+ * Icon Box
181
+ */
182
+ 'icon-box' => [
183
+ 'fields' => [
184
+ [
185
+ 'field' => 'title',
186
+ 'type' => __( 'Icon Box: Title', 'happy-elementor-addons' ),
187
+ 'editor_type' => 'LINE',
188
+ ],
189
+ [
190
+ 'field' => 'badge_text',
191
+ 'type' => __( 'Icon Box: Badge Text', 'happy-elementor-addons' ),
192
+ 'editor_type' => 'LINE',
193
+ ],
194
+ [
195
+ 'field' => 'link',
196
+ 'type' => __( 'Icon Box: Link', 'happy-elementor-addons' ),
197
+ 'editor_type' => 'LINK',
198
+ ],
199
+ ],
200
+ ],
201
+
202
+ /**
203
+ * Image Compare
204
+ */
205
+ 'image-compare' => [
206
+ 'fields' => [
207
+ [
208
+ 'field' => 'before_label',
209
+ 'type' => __( 'Image Compare: Before Label', 'happy-elementor-addons' ),
210
+ 'editor_type' => 'LINE',
211
+ ],
212
+ [
213
+ 'field' => 'after_label',
214
+ 'type' => __( 'Image Compare: After Label', 'happy-elementor-addons' ),
215
+ 'editor_type' => 'LINE',
216
+ ],
217
+ ],
218
+ ],
219
+
220
+ /**
221
+ * Image Grid
222
+ */
223
+ 'image-grid' => [
224
+ 'fields' => [
225
+ [
226
+ 'field' => 'all_filter_label',
227
+ 'type' => __( 'Image Grid: All Filter Label', 'happy-elementor-addons' ),
228
+ 'editor_type' => 'LINE',
229
+ ],
230
+ ],
231
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Image_Grid',
232
+ ],
233
+
234
+ /**
235
+ * Info Box
236
+ */
237
+ 'infobox' => [
238
+ 'fields' => [
239
+ [
240
+ 'field' => 'title',
241
+ 'type' => __( 'Info Box: Title', 'happy-elementor-addons' ),
242
+ 'editor_type' => 'LINE',
243
+ ],
244
+ [
245
+ 'field' => 'description',
246
+ 'type' => __( 'Info Box: Description', 'happy-elementor-addons' ),
247
+ 'editor_type' => 'AREA',
248
+ ],
249
+ [
250
+ 'field' => 'button_text',
251
+ 'type' => __( 'Info Box: Button Text', 'happy-elementor-addons' ),
252
+ 'editor_type' => 'LINE',
253
+ ],
254
+ [
255
+ 'field' => 'button_link',
256
+ 'type' => __( 'Info Box: Button Link', 'happy-elementor-addons' ),
257
+ 'editor_type' => 'LINK',
258
+ ],
259
+ ],
260
+ ],
261
+
262
+ /**
263
+ * Justified Gallery
264
+ */
265
+ 'justified-gallery' => [
266
+ 'fields' => [
267
+ [
268
+ 'field' => 'all_filter_label',
269
+ 'type' => __( 'Justified Grid: All Filter Label', 'happy-elementor-addons' ),
270
+ 'editor_type' => 'LINE',
271
+ ],
272
+ ],
273
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Justified_Gallery',
274
+ ],
275
+
276
+ /**
277
+ * Logo Grid
278
+ */
279
+ 'logo-grid' => [
280
+ 'fields' => [],
281
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Logo_Grid',
282
+ ],
283
+
284
+ /**
285
+ * Team Member
286
+ */
287
+ 'member' => [
288
+ 'fields' => [
289
+ [
290
+ 'field' => 'title',
291
+ 'type' => __( 'Team Member: Name', 'happy-elementor-addons' ),
292
+ 'editor_type' => 'LINE',
293
+ ],
294
+ [
295
+ 'field' => 'job_title',
296
+ 'type' => __( 'Team Member: Job Title', 'happy-elementor-addons' ),
297
+ 'editor_type' => 'LINE',
298
+ ],
299
+ [
300
+ 'field' => 'bio',
301
+ 'type' => __( 'Team Member: Short Bio', 'happy-elementor-addons' ),
302
+ 'editor_type' => 'AREA',
303
+ ],
304
+ ],
305
+ ],
306
+
307
+ /**
308
+ * News Ticker
309
+ */
310
+ 'news-ticker' => [
311
+ 'fields' => [
312
+ [
313
+ 'field' => 'sticky_title',
314
+ 'type' => __( 'News Ticker: Sticky Title', 'happy-elementor-addons' ),
315
+ 'editor_type' => 'LINE',
316
+ ],
317
+ ],
318
+ ],
319
+
320
+ /**
321
+ * Number
322
+ */
323
+ 'number' => [
324
+ 'fields' => [
325
+ [
326
+ 'field' => 'number_text',
327
+ 'type' => __( 'Number: Text', 'happy-elementor-addons' ),
328
+ 'editor_type' => 'LINE',
329
+ ],
330
+ ],
331
+ ],
332
+
333
+ /**
334
+ * Pricing Table
335
+ */
336
+ 'pricing-table' => [
337
+ 'fields' => [
338
+ [
339
+ 'field' => 'title',
340
+ 'type' => __( 'Pricing Table: Title', 'happy-elementor-addons' ),
341
+ 'editor_type' => 'LINE',
342
+ ],
343
+ [
344
+ 'field' => 'price',
345
+ 'type' => __( 'Pricing Table: Price', 'happy-elementor-addons' ),
346
+ 'editor_type' => 'LINE',
347
+ ],
348
+ [
349
+ 'field' => 'period',
350
+ 'type' => __( 'Pricing Table: Period', 'happy-elementor-addons' ),
351
+ 'editor_type' => 'LINE',
352
+ ],
353
+ [
354
+ 'field' => 'features_title',
355
+ 'type' => __( 'Pricing Table: Features Title', 'happy-elementor-addons' ),
356
+ 'editor_type' => 'LINE',
357
+ ],
358
+ [
359
+ 'field' => 'button_text',
360
+ 'type' => __( 'Pricing Table: Button Text', 'happy-elementor-addons' ),
361
+ 'editor_type' => 'LINE',
362
+ ],
363
+ [
364
+ 'field' => 'button_link',
365
+ 'type' => __( 'Pricing Table: Button Link', 'happy-elementor-addons' ),
366
+ 'editor_type' => 'LINK',
367
+ ],
368
+ [
369
+ 'field' => 'badge_text',
370
+ 'type' => __( 'Pricing Table: Badge Text', 'happy-elementor-addons' ),
371
+ 'editor_type' => 'LINE',
372
+ ],
373
+ ],
374
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Pricing_Table',
375
+ ],
376
+
377
+ /**
378
+ * Review
379
+ */
380
+ 'review' => [
381
+ 'fields' => [
382
+ [
383
+ 'field' => 'review',
384
+ 'type' => __( 'Review: Review Text', 'happy-elementor-addons' ),
385
+ 'editor_type' => 'AREA',
386
+ ],
387
+ [
388
+ 'field' => 'title',
389
+ 'type' => __( 'Review: Reviewer Name', 'happy-elementor-addons' ),
390
+ 'editor_type' => 'LINE',
391
+ ],
392
+ [
393
+ 'field' => 'job_title',
394
+ 'type' => __( 'Review: Job Title', 'happy-elementor-addons' ),
395
+ 'editor_type' => 'LINE',
396
+ ],
397
+ ],
398
+ ],
399
+
400
+ /**
401
+ * Skills
402
+ */
403
+ 'skills' => [
404
+ 'fields' => [],
405
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Skills',
406
+ ],
407
+
408
+ /**
409
+ * Slider
410
+ */
411
+ 'slider' => [
412
+ 'fields' => [],
413
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Slider',
414
+ ],
415
+
416
+ /**
417
+ * Social Icons
418
+ */
419
+ 'social-icons' => [
420
+ 'fields' => [],
421
+ 'integration-class' => __NAMESPACE__ . '\\WPML_Social_Icons',
422
+ ],
423
+
424
+ /**
425
+ * Step Flow
426
+ */
427
+ 'step-flow' => [
428
+ 'fields' => [
429
+ [
430
+ 'field' => 'badge',
431
+ 'type' => __( 'Step Flow: Badge Text', 'happy-elementor-addons' ),
432
+ 'editor_type' => 'LINE',
433
+ ],
434
+ [
435
+ 'field' => 'title',
436
+ 'type' => __( 'Step Flow: Title', 'happy-elementor-addons' ),
437
+ 'editor_type' => 'LINE',
438
+ ],
439
+ [
440
+ 'field' => 'description',
441
+ 'type' => __( 'Step Flow: Description', 'happy-elementor-addons' ),
442
+ 'editor_type' => 'AREA',
443
+ ],
444
+ [
445
+ 'field' => 'link',
446
+ 'type' => __( 'Step Flow: Link', 'happy-elementor-addons' ),
447
+ 'editor_type' => 'LINK',
448
+ ],
449
+ ],
450
+ ],
451
+
452
+ /**
453
+ * Testimonial
454
+ */
455
+ 'testimonial' => [
456
+ 'fields' => [
457
+ [
458
+ 'field' => 'testimonial',
459
+ 'type' => __( 'Testimonial: Testimonial Text', 'happy-elementor-addons' ),
460
+ 'editor_type' => 'AREA',
461
+ ],
462
+ [
463
+ 'field' => 'name',
464
+ 'type' => __( 'Testimonial: Reviewer Name', 'happy-elementor-addons' ),
465
+ 'editor_type' => 'LINE',
466
+ ],
467
+ [
468
+ 'field' => 'title',
469
+ 'type' => __( 'Testimonial: Job Title', 'happy-elementor-addons' ),
470
+ 'editor_type' => 'LINE',
471
+ ],
472
+ ],
473
+ ],
474
+
475
+ /**
476
+ * Twitter Feed
477
+ */
478
+ 'twitter-feed' => [
479
+ 'fields' => [
480
+ [
481
+ 'field' => 'read_more_text',
482
+ 'type' => __( 'Twitter Feed: Read More Text', 'happy-elementor-addons' ),
483
+ 'editor_type' => 'AREA',
484
+ ],
485
+ [
486
+ 'field' => 'load_more_text',
487
+ 'type' => __( 'Twitter Feed: Load More Text', 'happy-elementor-addons' ),
488
+ 'editor_type' => 'LINE',
489
+ ],
490
+ ],
491
+ ],
492
+ ];
493
+
494
+ foreach ( $widgets_map as $key => $data ) {
495
+ $widget_name = 'ha-'.$key;
496
+
497
+ $entry = [
498
+ 'conditions' => [
499
+ 'widgetType' => $widget_name,
500
+ ],
501
+ 'fields' => $data['fields'],
502
+ ];
503
+
504
+ if ( isset( $data['integration-class'] ) ) {
505
+ $entry['integration-class'] = $data['integration-class'];
506
+ }
507
+
508
+ $widgets[ $widget_name ] = $entry;
509
+ }
510
+
511
+ return $widgets;
512
+ }
513
+ }
extensions/background-overlay.php CHANGED
@@ -41,7 +41,7 @@ class Background_Overlay {
41
  $element->start_controls_section(
42
  '_ha_section_background_overlay',
43
  [
44
- 'label' => ha_get_icon_for_label() . __( 'Background Overlay', 'happy-elementor-addons' ),
45
  'tab' => Controls_Manager::TAB_ADVANCED,
46
  'condition' => [
47
  '_background_background' => [ 'classic', 'gradient' ],
41
  $element->start_controls_section(
42
  '_ha_section_background_overlay',
43
  [
44
+ 'label' => __( 'Background Overlay', 'happy-elementor-addons' ) . ha_get_section_icon(),
45
  'tab' => Controls_Manager::TAB_ADVANCED,
46
  'condition' => [
47
  '_background_background' => [ 'classic', 'gradient' ],
extensions/column-extended.php CHANGED
@@ -21,7 +21,7 @@ class Column_Extended {
21
  $element->add_responsive_control(
22
  '_ha_column_width',
23
  [
24
- 'label' => ha_get_icon_for_label() . __( 'Custom Column Width', 'happy-elementor-addons' ),
25
  'type' => Controls_Manager::TEXT,
26
  'separator' => 'before',
27
  'label_block' => true,
@@ -35,7 +35,7 @@ class Column_Extended {
35
  $element->add_responsive_control(
36
  '_ha_column_order',
37
  [
38
- 'label' => ha_get_icon_for_label() . __( 'Column Order', 'happy-elementor-addons' ),
39
  'type' => Controls_Manager::NUMBER,
40
  'style_transfer' => true,
41
  'selectors' => [
@@ -43,7 +43,7 @@ class Column_Extended {
43
  ],
44
  'description' => sprintf(
45
  __( 'Column ordering is a great addition for responsive design. You can learn more about CSS order property from %sMDN%s.', 'happy-elementor-addons' ),
46
- '<a
47
  href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Ordering_Flex_Items#The_order_property" target="_blank">',
48
  '</a>'
49
  ),
21
  $element->add_responsive_control(
22
  '_ha_column_width',
23
  [
24
+ 'label' => __( 'Custom Column Width', 'happy-elementor-addons' ),
25
  'type' => Controls_Manager::TEXT,
26
  'separator' => 'before',
27
  'label_block' => true,
35
  $element->add_responsive_control(
36
  '_ha_column_order',
37
  [
38
+ 'label' => __( 'Column Order', 'happy-elementor-addons' ),
39
  'type' => Controls_Manager::NUMBER,
40
  'style_transfer' => true,
41
  'selectors' => [
43
  ],
44
  'description' => sprintf(
45
  __( 'Column ordering is a great addition for responsive design. You can learn more about CSS order property from %sMDN%s.', 'happy-elementor-addons' ),
46
+ '<a
47
  href="https://developer.mozilla.org/en-US/docs/Web/CSS/CSS_Flexible_Box_Layout/Ordering_Flex_Items#The_order_property" target="_blank">',
48
  '</a>'
49
  ),
extensions/happy-effects.php CHANGED
@@ -9,14 +9,14 @@ defined( 'ABSPATH' ) || die();
9
  class Happy_Effects {
10
 
11
  public static function init() {
12
- add_action( 'elementor/element/common/_section_style/after_section_end', [__CLASS__, 'add_controls_section'] );
13
  }
14
 
15
  public static function add_controls_section( Element_Base $element ) {
16
  $element->start_controls_section(
17
  '_section_happy_effects',
18
  [
19
- 'label' => ha_get_icon_for_label() . __( 'Happy Effects', 'happy-elementor-addons' ),
20
  'tab' => Controls_Manager::TAB_ADVANCED,
21
  ]
22
  );
9
  class Happy_Effects {
10
 
11
  public static function init() {
12
+ add_action( 'elementor/element/common/_section_style/after_section_end', [ __CLASS__, 'add_controls_section' ], 1 );
13
  }
14
 
15
  public static function add_controls_section( Element_Base $element ) {
16
  $element->start_controls_section(
17
  '_section_happy_effects',
18
  [
19
+ 'label' => __( 'Happy Effects', 'happy-elementor-addons' ) . ha_get_section_icon(),
20
  'tab' => Controls_Manager::TAB_ADVANCED,
21
  ]
22
  );
extensions/happy-grid.php CHANGED
@@ -17,7 +17,7 @@ class Happy_Grid {
17
  $element->start_controls_section(
18
  '_section_happy_grid_layer',
19
  [
20
- 'label' => ha_get_icon_for_label() . __( 'Grid Layer', 'happy-elementor-addons' ),
21
  'tab' => Controls_Manager::TAB_SETTINGS,
22
  ]
23
  );
@@ -250,11 +250,10 @@ class Happy_Grid {
250
  }
251
 
252
  public static function get_default_grid_value( $value = '' ) {
253
-
254
  $default = [
255
- 'desktop' => get_option('elementor_container_width') ? get_option('elementor_container_width') : '1140',
256
- 'tablet' => get_option('elementor_viewport_lg') ? get_option('elementor_viewport_lg') : '1025',
257
- 'mobile' => get_option('elementor_viewport_md') ? get_option('elementor_viewport_md') : '768',
258
  ];
259
 
260
  return $default[$value];
17
  $element->start_controls_section(
18
  '_section_happy_grid_layer',
19
  [
20
+ 'label' => __( 'Grid Layer', 'happy-elementor-addons' ) . ha_get_section_icon(),
21
  'tab' => Controls_Manager::TAB_SETTINGS,
22
  ]
23
  );
250
  }
251
 
252
  public static function get_default_grid_value( $value = '' ) {
 
253
  $default = [
254
+ 'desktop' => get_option( 'elementor_container_width', 1140 ),
255
+ 'tablet' => get_option( 'elementor_viewport_lg', 1025 ),
256
+ 'mobile' => get_option( 'elementor_viewport_md', 768 ),
257
  ];
258
 
259
  return $default[$value];
extensions/widgets-extended.php CHANGED
@@ -21,7 +21,7 @@ class Widgets_Extended {
21
  $widget->add_control(
22
  'ha_fixed_size_toggle',
23
  [
24
- 'label' => ha_get_icon_for_label() . __( 'Fixed Size', 'happy-elementor-addons' ),
25
  'type' => Controls_Manager::POPOVER_TOGGLE,
26
  'return_value' => 'yes',
27
  ]
21
  $widget->add_control(
22
  'ha_fixed_size_toggle',
23
  [
24
+ 'label' => __( 'Fixed Size', 'happy-elementor-addons' ),
25
  'type' => Controls_Manager::POPOVER_TOGGLE,
26
  'return_value' => 'yes',
27
  ]
extensions/wrapper-link.php CHANGED
@@ -26,7 +26,7 @@ class Wrapper_Link {
26
  $element->start_controls_section(
27
  '_section_ha_wrapper_link',
28
  [
29
- 'label' => ha_get_icon_for_label() . __( 'Wrapper Link', 'happy-elementor-addons' ),
30
  'tab' => $tabs,
31
  ]
32
  );
26
  $element->start_controls_section(
27
  '_section_ha_wrapper_link',
28
  [
29
+ 'label' => __( 'Wrapper Link', 'happy-elementor-addons' ) . ha_get_section_icon(),
30
  'tab' => $tabs,
31
  ]
32
  );
inc/functions.php CHANGED
@@ -18,11 +18,11 @@ defined( 'ABSPATH' ) || die();
18
  * @return string|bool False on failure, the result of the shortcode on success.
19
  */
20
  function ha_do_shortcode( $tag, array $atts = array(), $content = null ) {
21
- global $shortcode_tags;
22
- if ( ! isset( $shortcode_tags[ $tag ] ) ) {
23
- return false;
24
- }
25
- return call_user_func( $shortcode_tags[ $tag ], $atts, $content, $tag );
26
  }
27
 
28
  /**
@@ -32,109 +32,109 @@ function ha_do_shortcode( $tag, array $atts = array(), $content = null ) {
32
  * @return string
33
  */
34
  function ha_sanitize_html_class_param( $class ) {
35
- $classes = ! empty( $class ) ? explode( ' ', $class ) : [];
36
- $sanitized = [];
37
- if ( ! empty( $classes ) ) {
38
- $sanitized = array_map( function( $cls ) {
39
- return sanitize_html_class( $cls );
40
- }, $classes );
41
- }
42
- return implode( ' ', $sanitized );
43
  }
44
 
45
  function ha_is_script_debug_enabled() {
46
- return ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG );
47
  }
48
 
49
  function ha_prepare_data_prop_settings( &$settings, $field_map = [] ) {
50
- $data = [];
51
- foreach ( $field_map as $key => $data_key ) {
52
- $setting_value = ha_get_setting_value( $settings, $key );
53
- list( $data_field_key, $data_field_type ) = explode( '.', $data_key );
54
- $validator = $data_field_type . 'val';
55
-
56
- if ( is_callable( $validator ) ) {
57
- $val = call_user_func( $validator, $setting_value );
58
- } else {
59
- $val = $setting_value;
60
- }
61
- $data[ $data_field_key ] = $val;
62
- }
63
- return wp_json_encode( $data );
64
  }
65
 
66
  function ha_get_setting_value( &$settings, $keys ) {
67
- if ( ! is_array( $keys ) ) {
68
- $keys = explode( '.', $keys );
69
- }
70
- if ( is_array( $settings[ $keys[0] ] ) ) {
71
- return ha_get_setting_value( $settings[ $keys[0] ], array_slice( $keys, 1 ) );
72
- }
73
- return $settings[ $keys[0] ];
74
  }
75
 
76
  function ha_is_localhost() {
77
- return isset( $_SERVER['REMOTE_ADDR'] ) && in_array( $_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'] );
78
  }
79
 
80
  function ha_get_css_cursors() {
81
- return [
82
- 'default' => __( 'Default', 'happy-elementor-addons' ),
83
- 'alias' => __( 'Alias', 'happy-elementor-addons' ),
84
- 'all-scroll' => __( 'All scroll', 'happy-elementor-addons' ),
85
- 'auto' => __( 'Auto', 'happy-elementor-addons' ),
86
- 'cell' => __( 'Cell', 'happy-elementor-addons' ),
87
- 'context-menu' => __( 'Context menu', 'happy-elementor-addons' ),
88
- 'col-resize' => __( 'Col-resize', 'happy-elementor-addons' ),
89
- 'copy' => __( 'Copy', 'happy-elementor-addons' ),
90
- 'crosshair' => __( 'Crosshair', 'happy-elementor-addons' ),
91
- 'e-resize' => __( 'E-resize', 'happy-elementor-addons' ),
92
- 'ew-resize' => __( 'EW-resize', 'happy-elementor-addons' ),
93
- 'grab' => __( 'Grab', 'happy-elementor-addons' ),
94
- 'grabbing' => __( 'Grabbing', 'happy-elementor-addons' ),
95
- 'help' => __( 'Help', 'happy-elementor-addons' ),
96
- 'move' => __( 'Move', 'happy-elementor-addons' ),
97
- 'n-resize' => __( 'N-resize', 'happy-elementor-addons' ),
98
- 'ne-resize' => __( 'NE-resize', 'happy-elementor-addons' ),
99
- 'nesw-resize' => __( 'NESW-resize', 'happy-elementor-addons' ),
100
- 'ns-resize' => __( 'NS-resize', 'happy-elementor-addons' ),
101
- 'nw-resize' => __( 'NW-resize', 'happy-elementor-addons' ),
102
- 'nwse-resize' => __( 'NWSE-resize', 'happy-elementor-addons' ),
103
- 'no-drop' => __( 'No-drop', 'happy-elementor-addons' ),
104
- 'not-allowed' => __( 'Not-allowed', 'happy-elementor-addons' ),
105
- 'pointer' => __( 'Pointer', 'happy-elementor-addons' ),
106
- 'progress' => __( 'Progress', 'happy-elementor-addons' ),
107
- 'row-resize' => __( 'Row-resize', 'happy-elementor-addons' ),
108
- 's-resize' => __( 'S-resize', 'happy-elementor-addons' ),
109
- 'se-resize' => __( 'SE-resize', 'happy-elementor-addons' ),
110
- 'sw-resize' => __( 'SW-resize', 'happy-elementor-addons' ),
111
- 'text' => __( 'Text', 'happy-elementor-addons' ),
112
- 'url' => __( 'URL', 'happy-elementor-addons' ),
113
- 'w-resize' => __( 'W-resize', 'happy-elementor-addons' ),
114
- 'wait' => __( 'Wait', 'happy-elementor-addons' ),
115
- 'zoom-in' => __( 'Zoom-in', 'happy-elementor-addons' ),
116
- 'zoom-out' => __( 'Zoom-out', 'happy-elementor-addons' ),
117
- 'none' => __( 'None', 'happy-elementor-addons' ),
118
- ];
119
  }
120
 
121
  function ha_get_css_blend_modes() {
122
- return [
123
- 'normal' => __( 'Normal', 'happy-elementor-addons' ),
124
- 'multiply' => __( 'Multiply', 'happy-elementor-addons' ),
125
- 'screen' => __( 'Screen', 'happy-elementor-addons' ),
126
- 'overlay' => __( 'Overlay', 'happy-elementor-addons' ),
127
- 'darken' => __( 'Darken', 'happy-elementor-addons' ),
128
- 'lighten' => __( 'Lighten', 'happy-elementor-addons' ),
129
- 'color-dodge' => __( 'Color Dodge', 'happy-elementor-addons' ),
130
- 'color-burn' => __( 'Color Burn', 'happy-elementor-addons' ),
131
- 'saturation' => __( 'Saturation', 'happy-elementor-addons' ),
132
- 'difference' => __( 'Difference', 'happy-elementor-addons' ),
133
- 'exclusion' => __( 'Exclusion', 'happy-elementor-addons' ),
134
- 'hue' => __( 'Hue', 'happy-elementor-addons' ),
135
- 'color' => __( 'Color', 'happy-elementor-addons' ),
136
- 'luminosity' => __( 'Luminosity', 'happy-elementor-addons' ),
137
- ];
138
  }
139
 
140
  /**
@@ -145,7 +145,7 @@ function ha_get_css_blend_modes() {
145
  * @return bool
146
  */
147
  function ha_is_elementor_version( $operator = '<', $version = '2.6.0' ) {
148
- return defined( 'ELEMENTOR_VERSION' ) && version_compare( ELEMENTOR_VERSION, $version, $operator );
149
  }
150
 
151
  /**
@@ -157,27 +157,27 @@ function ha_is_elementor_version( $operator = '<', $version = '2.6.0' ) {
157
  * @param array $attributes
158
  */
159
  function ha_render_icon( $settings = [], $old_icon_id = 'icon', $new_icon_id = 'selected_icon', $attributes = [] ) {
160
- // Check if its already migrated
161
- $migrated = isset( $settings['__fa4_migrated'][ $new_icon_id ] );
162
- // Check if its a new widget without previously selected icon using the old Icon control
163
- $is_new = empty( $settings[ $old_icon_id ] );
164
-
165
- $attributes['aria-hidden'] = 'true';
166
-
167
- if ( ha_is_elementor_version( '>=', '2.6.0' ) && ( $is_new || $migrated ) ) {
168
- \Elementor\Icons_Manager::render_icon( $settings[ $new_icon_id ], $attributes );
169
- } else {
170
- if ( empty( $attributes['class'] ) ) {
171
- $attributes['class'] = $settings[ $old_icon_id ];
172
- } else {
173
- if ( is_array( $attributes['class'] ) ) {
174
- $attributes['class'][] = $settings[ $old_icon_id ];
175
- } else {
176
- $attributes['class'] .= ' ' . $settings[ $old_icon_id ];
177
- }
178
- }
179
- printf( '<i %s></i>', \Elementor\Utils::render_html_attributes( $attributes ) );
180
- }
181
  }
182
 
183
  /**
@@ -186,14 +186,14 @@ function ha_render_icon( $settings = [], $old_icon_id = 'icon', $new_icon_id = '
186
  * @return array
187
  */
188
  function ha_get_happy_icons() {
189
- return \Happy_Addons\Elementor\Icons_Manager::get_happy_icons();
190
  }
191
 
192
  /**
193
  * @return bool
194
  */
195
  function ha_is_happy_mode_enabled() {
196
- return apply_filters( 'happyaddons_is_happy_mode_enabled', true );
197
  }
198
 
199
  /**
@@ -202,7 +202,7 @@ function ha_is_happy_mode_enabled() {
202
  * @return \Elementor\Plugin
203
  */
204
  function ha_elementor() {
205
- return \Elementor\Plugin::instance();
206
  }
207
 
208
  /**
@@ -212,31 +212,31 @@ function ha_elementor() {
212
  * @return array
213
  */
214
  function ha_get_allowed_html_tags( $level = 'basic' ) {
215
- $allowed_html = [
216
- 'b' => [],
217
- 'i' => [],
218
- 'u' => [],
219
- 'em' => [],
220
- 'br' => [],
221
- 'abbr' => [
222
- 'title' => [],
223
- ],
224
- 'span' => [
225
- 'class' => [],
226
- ],
227
- 'strong' => [],
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;
240
  }
241
 
242
  /**
@@ -248,7 +248,7 @@ function ha_get_allowed_html_tags( $level = 'basic' ) {
248
  * @return string
249
  */
250
  function ha_kses_intermediate( $string = '' ) {
251
- return wp_kses( $string, ha_get_allowed_html_tags( 'intermediate' ) );
252
  }
253
 
254
  /**
@@ -260,7 +260,7 @@ function ha_kses_intermediate( $string = '' ) {
260
  * @return string
261
  */
262
  function ha_kses_basic( $string = '' ) {
263
- return wp_kses( $string, ha_get_allowed_html_tags( 'basic' ) );
264
  }
265
 
266
  /**
@@ -270,33 +270,33 @@ function ha_kses_basic( $string = '' ) {
270
  * @return string
271
  */
272
  function ha_get_allowed_html_desc( $level = 'basic' ) {
273
- if ( ! in_array( $level, [ 'basic', 'intermediate' ] ) ) {
274
- $level = 'basic';
275
- }
276
 
277
- $tags_str = '<' . implode( '>,<', array_keys( ha_get_allowed_html_tags( $level ) ) ) . '>';
278
- return sprintf( __( 'This input field has support for the following HTML tags: %1$s', 'happy-elementor-addons' ), '<code>' . esc_html( $tags_str ) . '</code>' );
279
  }
280
 
281
  function ha_has_pro() {
282
- return defined( 'HAPPY_ADDONS_PRO_VERSION' );
283
  }
284
 
285
  function ha_get_b64_icon() {
286
- return 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PGcgZmlsbD0iI0ZGRiI+PHBhdGggZD0iTTI4LjYgNy44aC44Yy41IDAgLjktLjUuOC0xIDAtLjUtLjUtLjktMS0uOC0zLjUuMy02LjgtMS45LTcuOC01LjMtLjEtLjUtLjYtLjctMS4xLS42cy0uNy42LS42IDEuMWMxLjIgMy45IDQuOSA2LjYgOC45IDYuNnoiLz48cGF0aCBkPSJNMzAgMTEuMWMtLjMtLjYtLjktMS0xLjYtMS0uOSAwLTEuOSAwLTIuOC0uMi00LS44LTctMy42LTguNC03LjEtLjMtLjYtLjktMS4xLTEuNi0xQzguMyAxLjkgMS44IDcuNC45IDE1LjEuMSAyMi4yIDQuNSAyOSAxMS4zIDMxLjIgMjAgMzQuMSAyOSAyOC43IDMwLjggMTkuOWMuNy0zLjEuMy02LjEtLjgtOC44em0tMTEuNiAxLjFjLjEtLjUuNi0uOCAxLjEtLjdsMy43LjhjLjUuMS44LjYuNyAxLjFzLS42LjgtMS4xLjdsLTMuNy0uOGMtLjQtLjEtLjgtLjYtLjctMS4xek0xMC4xIDExYy4yLTEuMSAxLjQtMS45IDIuNS0xLjYgMS4xLjIgMS45IDEuNCAxLjYgMi41LS4yIDEuMS0xLjQgMS45LTIuNSAxLjYtMS0uMi0xLjgtMS4zLTEuNi0yLjV6bTE0LjYgMTAuNkMyMi44IDI2IDE3LjggMjguNSAxMyAyN2MtMy42LTEuMi02LjItNC41LTYuNS04LjItLjEtMSAuOC0xLjcgMS43LTEuNmwxNS40IDIuNWMuOSAwIDEuNCAxIDEuMSAxLjl6Ii8+PHBhdGggZD0iTTE3LjEgMjIuOGMtMS45LS40LTMuNy4zLTQuNyAxLjctLjIuMy0uMS43LjIuOS42LjMgMS4yLjUgMS45LjcgMS44LjQgMy43LjEgNS4xLS43LjMtLjIuNC0uNi4yLS45LS43LS45LTEuNi0xLjUtMi43LTEuN3oiLz48L2c+PC9zdmc+';
287
  }
288
 
289
  function ha_get_dashboard_link( $suffix = '#home' ) {
290
- return add_query_arg( [ 'page' => 'happy-addons' . $suffix ], admin_url( 'admin.php' ) );
291
  }
292
 
293
  function ha_get_current_user_display_name() {
294
- $user = wp_get_current_user();
295
- $name = 'user';
296
- if ( $user->exists() && $user->display_name ) {
297
- $name = $user->display_name;
298
- }
299
- return $name;
300
  }
301
 
302
  /**
@@ -472,10 +472,6 @@ function ha_twitter_feed_ajax() {
472
  add_action( 'wp_ajax_ha_twitter_feed_action', 'ha_twitter_feed_ajax' );
473
  add_action( 'wp_ajax_nopriv_ha_twitter_feed_action', 'ha_twitter_feed_ajax' );
474
 
475
- function ha_get_icon_for_label() {
476
- return '<i style="position: relative; top: 1px" class="hm hm-happyaddons"></i> ';
477
- }
478
-
479
  /**
480
  * Get All Post Types
481
  * @param array $args
@@ -563,18 +559,18 @@ function ha_post_tab () {
563
  <a href="<?php echo esc_url( get_the_permalink( $post->ID ) ); ?>"> <?php echo esc_html( $post->post_title ); ?></a>
564
  </h2>
565
  <div class="ha-post-tab-meta">
566
- <span class="ha-post-tab-meta-author">
567
- <i class="fa fa-user-o"></i>
568
- <a href="<?php echo esc_url( get_author_posts_url( $post->post_author ) ); ?>"><?php echo esc_html( get_the_author_meta( 'display_name', $post->post_author ) ); ?></a>
569
- </span>
570
  <?php
571
  $archive_year = get_the_time( 'Y', $post->ID );
572
  $archive_month = get_the_time( 'm', $post->ID );
573
  $archive_day = get_the_time( 'd', $post->ID );
574
  ?>
575
  <span class="ha-post-tab-meta-date">
576
- <i class="fa fa-calendar-o"></i>
577
- <a href="<?php echo esc_url( get_day_link( $archive_year, $archive_month, $archive_day ) ); ?>"><?php echo get_the_date( "M d, Y", $post->ID ); ?></a>
578
  </span>
579
  </div>
580
  <?php if( 'yes' === $excerpt && !empty($post->post_excerpt) ): ?>
@@ -596,3 +592,13 @@ function ha_post_tab () {
596
  add_action( 'wp_ajax_ha_post_tab_action', 'ha_post_tab' );
597
  add_action( 'wp_ajax_nopriv_ha_post_tab_action', 'ha_post_tab' );
598
 
 
 
 
 
 
 
 
 
 
 
18
  * @return string|bool False on failure, the result of the shortcode on success.
19
  */
20
  function ha_do_shortcode( $tag, array $atts = array(), $content = null ) {
21
+ global $shortcode_tags;
22
+ if ( ! isset( $shortcode_tags[ $tag ] ) ) {
23
+ return false;
24
+ }
25
+ return call_user_func( $shortcode_tags[ $tag ], $atts, $content, $tag );
26
  }
27
 
28
  /**
32
  * @return string
33
  */
34
  function ha_sanitize_html_class_param( $class ) {
35
+ $classes = ! empty( $class ) ? explode( ' ', $class ) : [];
36
+ $sanitized = [];
37
+ if ( ! empty( $classes ) ) {
38
+ $sanitized = array_map( function( $cls ) {
39
+ return sanitize_html_class( $cls );
40
+ }, $classes );
41
+ }
42
+ return implode( ' ', $sanitized );
43
  }
44
 
45
  function ha_is_script_debug_enabled() {
46
+ return ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG );
47
  }
48
 
49
  function ha_prepare_data_prop_settings( &$settings, $field_map = [] ) {
50
+ $data = [];
51
+ foreach ( $field_map as $key => $data_key ) {
52
+ $setting_value = ha_get_setting_value( $settings, $key );
53
+ list( $data_field_key, $data_field_type ) = explode( '.', $data_key );
54
+ $validator = $data_field_type . 'val';
55
+
56
+ if ( is_callable( $validator ) ) {
57
+ $val = call_user_func( $validator, $setting_value );
58
+ } else {
59
+ $val = $setting_value;
60
+ }
61
+ $data[ $data_field_key ] = $val;
62
+ }
63
+ return wp_json_encode( $data );
64
  }
65
 
66
  function ha_get_setting_value( &$settings, $keys ) {
67
+ if ( ! is_array( $keys ) ) {
68
+ $keys = explode( '.', $keys );
69
+ }
70
+ if ( is_array( $settings[ $keys[0] ] ) ) {
71
+ return ha_get_setting_value( $settings[ $keys[0] ], array_slice( $keys, 1 ) );
72
+ }
73
+ return $settings[ $keys[0] ];
74
  }
75
 
76
  function ha_is_localhost() {
77
+ return isset( $_SERVER['REMOTE_ADDR'] ) && in_array( $_SERVER['REMOTE_ADDR'], ['127.0.0.1', '::1'] );
78
  }
79
 
80
  function ha_get_css_cursors() {
81
+ return [
82
+ 'default' => __( 'Default', 'happy-elementor-addons' ),
83
+ 'alias' => __( 'Alias', 'happy-elementor-addons' ),
84
+ 'all-scroll' => __( 'All scroll', 'happy-elementor-addons' ),
85
+ 'auto' => __( 'Auto', 'happy-elementor-addons' ),
86
+ 'cell' => __( 'Cell', 'happy-elementor-addons' ),
87
+ 'context-menu' => __( 'Context menu', 'happy-elementor-addons' ),
88
+ 'col-resize' => __( 'Col-resize', 'happy-elementor-addons' ),
89
+ 'copy' => __( 'Copy', 'happy-elementor-addons' ),
90
+ 'crosshair' => __( 'Crosshair', 'happy-elementor-addons' ),
91
+ 'e-resize' => __( 'E-resize', 'happy-elementor-addons' ),
92
+ 'ew-resize' => __( 'EW-resize', 'happy-elementor-addons' ),
93
+ 'grab' => __( 'Grab', 'happy-elementor-addons' ),
94
+ 'grabbing' => __( 'Grabbing', 'happy-elementor-addons' ),
95
+ 'help' => __( 'Help', 'happy-elementor-addons' ),
96
+ 'move' => __( 'Move', 'happy-elementor-addons' ),
97
+ 'n-resize' => __( 'N-resize', 'happy-elementor-addons' ),
98
+ 'ne-resize' => __( 'NE-resize', 'happy-elementor-addons' ),
99
+ 'nesw-resize' => __( 'NESW-resize', 'happy-elementor-addons' ),
100
+ 'ns-resize' => __( 'NS-resize', 'happy-elementor-addons' ),
101
+ 'nw-resize' => __( 'NW-resize', 'happy-elementor-addons' ),
102
+ 'nwse-resize' => __( 'NWSE-resize', 'happy-elementor-addons' ),
103
+ 'no-drop' => __( 'No-drop', 'happy-elementor-addons' ),
104
+ 'not-allowed' => __( 'Not-allowed', 'happy-elementor-addons' ),
105
+ 'pointer' => __( 'Pointer', 'happy-elementor-addons' ),
106
+ 'progress' => __( 'Progress', 'happy-elementor-addons' ),
107
+ 'row-resize' => __( 'Row-resize', 'happy-elementor-addons' ),
108
+ 's-resize' => __( 'S-resize', 'happy-elementor-addons' ),
109
+ 'se-resize' => __( 'SE-resize', 'happy-elementor-addons' ),
110
+ 'sw-resize' => __( 'SW-resize', 'happy-elementor-addons' ),
111
+ 'text' => __( 'Text', 'happy-elementor-addons' ),
112
+ 'url' => __( 'URL', 'happy-elementor-addons' ),
113
+ 'w-resize' => __( 'W-resize', 'happy-elementor-addons' ),
114
+ 'wait' => __( 'Wait', 'happy-elementor-addons' ),
115
+ 'zoom-in' => __( 'Zoom-in', 'happy-elementor-addons' ),
116
+ 'zoom-out' => __( 'Zoom-out', 'happy-elementor-addons' ),
117
+ 'none' => __( 'None', 'happy-elementor-addons' ),
118
+ ];
119
  }
120
 
121
  function ha_get_css_blend_modes() {
122
+ return [
123
+ 'normal' => __( 'Normal', 'happy-elementor-addons' ),
124
+ 'multiply' => __( 'Multiply', 'happy-elementor-addons' ),
125
+ 'screen' => __( 'Screen', 'happy-elementor-addons' ),
126
+ 'overlay' => __( 'Overlay', 'happy-elementor-addons' ),
127
+ 'darken' => __( 'Darken', 'happy-elementor-addons' ),
128
+ 'lighten' => __( 'Lighten', 'happy-elementor-addons' ),
129
+ 'color-dodge' => __( 'Color Dodge', 'happy-elementor-addons' ),
130
+ 'color-burn' => __( 'Color Burn', 'happy-elementor-addons' ),
131
+ 'saturation' => __( 'Saturation', 'happy-elementor-addons' ),
132
+ 'difference' => __( 'Difference', 'happy-elementor-addons' ),
133
+ 'exclusion' => __( 'Exclusion', 'happy-elementor-addons' ),
134
+ 'hue' => __( 'Hue', 'happy-elementor-addons' ),
135
+ 'color' => __( 'Color', 'happy-elementor-addons' ),
136
+ 'luminosity' => __( 'Luminosity', 'happy-elementor-addons' ),
137
+ ];
138
  }
139
 
140
  /**
145
  * @return bool
146
  */
147
  function ha_is_elementor_version( $operator = '<', $version = '2.6.0' ) {
148
+ return defined( 'ELEMENTOR_VERSION' ) && version_compare( ELEMENTOR_VERSION, $version, $operator );
149
  }
150
 
151
  /**
157
  * @param array $attributes
158
  */
159
  function ha_render_icon( $settings = [], $old_icon_id = 'icon', $new_icon_id = 'selected_icon', $attributes = [] ) {
160
+ // Check if its already migrated
161
+ $migrated = isset( $settings['__fa4_migrated'][ $new_icon_id ] );
162
+ // Check if its a new widget without previously selected icon using the old Icon control
163
+ $is_new = empty( $settings[ $old_icon_id ] );
164
+
165
+ $attributes['aria-hidden'] = 'true';
166
+
167
+ if ( ha_is_elementor_version( '>=', '2.6.0' ) && ( $is_new || $migrated ) ) {
168
+ \Elementor\Icons_Manager::render_icon( $settings[ $new_icon_id ], $attributes );
169
+ } else {
170
+ if ( empty( $attributes['class'] ) ) {
171
+ $attributes['class'] = $settings[ $old_icon_id ];
172
+ } else {
173
+ if ( is_array( $attributes['class'] ) ) {
174
+ $attributes['class'][] = $settings[ $old_icon_id ];
175
+ } else {
176
+ $attributes['class'] .= ' ' . $settings[ $old_icon_id ];
177
+ }
178
+ }
179
+ printf( '<i %s></i>', \Elementor\Utils::render_html_attributes( $attributes ) );
180
+ }
181
  }
182
 
183
  /**
186
  * @return array
187
  */
188
  function ha_get_happy_icons() {
189
+ return \Happy_Addons\Elementor\Icons_Manager::get_happy_icons();
190
  }
191
 
192
  /**
193
  * @return bool
194
  */
195
  function ha_is_happy_mode_enabled() {
196
+ return apply_filters( 'happyaddons_is_happy_mode_enabled', true );
197
  }
198
 
199
  /**
202
  * @return \Elementor\Plugin
203
  */
204
  function ha_elementor() {
205
+ return \Elementor\Plugin::instance();
206
  }
207
 
208
  /**
212
  * @return array
213
  */
214
  function ha_get_allowed_html_tags( $level = 'basic' ) {
215
+ $allowed_html = [
216
+ 'b' => [],
217
+ 'i' => [],
218
+ 'u' => [],
219
+ 'em' => [],
220
+ 'br' => [],
221
+ 'abbr' => [
222
+ 'title' => [],
223
+ ],
224
+ 'span' => [
225
+ 'class' => [],
226
+ ],
227
+ 'strong' => [],
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;
240
  }
241
 
242
  /**
248
  * @return string
249
  */
250
  function ha_kses_intermediate( $string = '' ) {
251
+ return wp_kses( $string, ha_get_allowed_html_tags( 'intermediate' ) );
252
  }
253
 
254
  /**
260
  * @return string
261
  */
262
  function ha_kses_basic( $string = '' ) {
263
+ return wp_kses( $string, ha_get_allowed_html_tags( 'basic' ) );
264
  }
265
 
266
  /**
270
  * @return string
271
  */
272
  function ha_get_allowed_html_desc( $level = 'basic' ) {
273
+ if ( ! in_array( $level, [ 'basic', 'intermediate' ] ) ) {
274
+ $level = 'basic';
275
+ }
276
 
277
+ $tags_str = '<' . implode( '>,<', array_keys( ha_get_allowed_html_tags( $level ) ) ) . '>';
278
+ return sprintf( __( 'This input field has support for the following HTML tags: %1$s', 'happy-elementor-addons' ), '<code>' . esc_html( $tags_str ) . '</code>' );
279
  }
280
 
281
  function ha_has_pro() {
282
+ return defined( 'HAPPY_ADDONS_PRO_VERSION' );
283
  }
284
 
285
  function ha_get_b64_icon() {
286
+ return 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHZpZXdCb3g9IjAgMCAzMiAzMiI+PGcgZmlsbD0iI0ZGRiI+PHBhdGggZD0iTTI4LjYgNy44aC44Yy41IDAgLjktLjUuOC0xIDAtLjUtLjUtLjktMS0uOC0zLjUuMy02LjgtMS45LTcuOC01LjMtLjEtLjUtLjYtLjctMS4xLS42cy0uNy42LS42IDEuMWMxLjIgMy45IDQuOSA2LjYgOC45IDYuNnoiLz48cGF0aCBkPSJNMzAgMTEuMWMtLjMtLjYtLjktMS0xLjYtMS0uOSAwLTEuOSAwLTIuOC0uMi00LS44LTctMy42LTguNC03LjEtLjMtLjYtLjktMS4xLTEuNi0xQzguMyAxLjkgMS44IDcuNC45IDE1LjEuMSAyMi4yIDQuNSAyOSAxMS4zIDMxLjIgMjAgMzQuMSAyOSAyOC43IDMwLjggMTkuOWMuNy0zLjEuMy02LjEtLjgtOC44em0tMTEuNiAxLjFjLjEtLjUuNi0uOCAxLjEtLjdsMy43LjhjLjUuMS44LjYuNyAxLjFzLS42LjgtMS4xLjdsLTMuNy0uOGMtLjQtLjEtLjgtLjYtLjctMS4xek0xMC4xIDExYy4yLTEuMSAxLjQtMS45IDIuNS0xLjYgMS4xLjIgMS45IDEuNCAxLjYgMi41LS4yIDEuMS0xLjQgMS45LTIuNSAxLjYtMS0uMi0xLjgtMS4zLTEuNi0yLjV6bTE0LjYgMTAuNkMyMi44IDI2IDE3LjggMjguNSAxMyAyN2MtMy42LTEuMi02LjItNC41LTYuNS04LjItLjEtMSAuOC0xLjcgMS43LTEuNmwxNS40IDIuNWMuOSAwIDEuNCAxIDEuMSAxLjl6Ii8+PHBhdGggZD0iTTE3LjEgMjIuOGMtMS45LS40LTMuNy4zLTQuNyAxLjctLjIuMy0uMS43LjIuOS42LjMgMS4yLjUgMS45LjcgMS44LjQgMy43LjEgNS4xLS43LjMtLjIuNC0uNi4yLS45LS43LS45LTEuNi0xLjUtMi43LTEuN3oiLz48L2c+PC9zdmc+';
287
  }
288
 
289
  function ha_get_dashboard_link( $suffix = '#home' ) {
290
+ return add_query_arg( [ 'page' => 'happy-addons' . $suffix ], admin_url( 'admin.php' ) );
291
  }
292
 
293
  function ha_get_current_user_display_name() {
294
+ $user = wp_get_current_user();
295
+ $name = 'user';
296
+ if ( $user->exists() && $user->display_name ) {
297
+ $name = $user->display_name;
298
+ }
299
+ return $name;
300
  }
301
 
302
  /**
472
  add_action( 'wp_ajax_ha_twitter_feed_action', 'ha_twitter_feed_ajax' );
473
  add_action( 'wp_ajax_nopriv_ha_twitter_feed_action', 'ha_twitter_feed_ajax' );
474
 
 
 
 
 
475
  /**
476
  * Get All Post Types
477
  * @param array $args
559
  <a href="<?php echo esc_url( get_the_permalink( $post->ID ) ); ?>"> <?php echo esc_html( $post->post_title ); ?></a>
560
  </h2>
561
  <div class="ha-post-tab-meta">
562
+ <span class="ha-post-tab-meta-author">
563
+ <i class="fa fa-user-o"></i>
564
+ <a href="<?php echo esc_url( get_author_posts_url( $post->post_author ) ); ?>"><?php echo esc_html( get_the_author_meta( 'display_name', $post->post_author ) ); ?></a>
565
+ </span>
566
  <?php
567
  $archive_year = get_the_time( 'Y', $post->ID );
568
  $archive_month = get_the_time( 'm', $post->ID );
569
  $archive_day = get_the_time( 'd', $post->ID );
570
  ?>
571
  <span class="ha-post-tab-meta-date">
572
+ <i class="fa fa-calendar-o"></i>
573
+ <a href="<?php echo esc_url( get_day_link( $archive_year, $archive_month, $archive_day ) ); ?>"><?php echo get_the_date( "M d, Y", $post->ID ); ?></a>
574
  </span>
575
  </div>
576
  <?php if( 'yes' === $excerpt && !empty($post->post_excerpt) ): ?>
592
  add_action( 'wp_ajax_ha_post_tab_action', 'ha_post_tab' );
593
  add_action( 'wp_ajax_nopriv_ha_post_tab_action', 'ha_post_tab' );
594
 
595
+ if ( ! function_exists( 'ha_get_section_icon' ) ) {
596
+ /**
597
+ * Get happy addons icon for panel section heading
598
+ *
599
+ * @return string
600
+ */
601
+ function ha_get_section_icon() {
602
+ return '<i style="float: right" class="hm hm-happyaddons"></i>';
603
+ }
604
+ }
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.8.1
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.8.1' );
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.9.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.9.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,122 +1,141 @@
1
- === Happy Elementor Addons ===
2
- Plugin Name: Happy Elementor Addons
3
- Version: 2.8.1
4
  Author: weDevs
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, mosaddek73, tareq1988, sourav926, wedevs, iqbalrony, mrokon, obiplabon
7
- Tags: elementor, elementor addon, elementor widget, essential widget, elements
8
  Requires at least: 4.7
9
- Tested up to: 5.3.2
10
  Stable tag: trunk
11
  Requires PHP: 5.4
12
  License: GPLv2
13
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
14
 
15
- [Happy Elementor Addons](https://happyaddons.com/) is the ultimate freemium (free+premium) widgets library for Elementor to take your website design to the next level. The nifty plugin, not just aims to the trendy and sophisticated WordPress website design philosophy but also effortlessly aligns with any Elementor powered WordPress website design requirements.
16
 
17
- == Description ==
18
 
19
- [Happy Elementor Addons](https://happyaddons.com/) is the ultimate freemium (free+premium) widgets library for Elementor to take your website design to the next level. The nifty plugin, not just aims to the trendy and sophisticated WordPress website design philosophy but also effortlessly aligns with any Elementor powered WordPress website design requirements.
20
 
21
- Despite being the newest addition to the product line up of [weDevs](https://wedevs.com/), it has already managed to win the heart of its users with a staggering 5-star rating. The plugin doesn’t require any coding knowhow and it is completely cross-browser compatible with mobile responsive feature.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
22
 
23
  https://www.youtube.com/watch?v=XpWm7zdvUoM
24
 
25
- _HappyAddons is a unique Elementor Addon. It might be the best addon package for Elementor._
26
-
27
- _— **Adam Preiser, Founder of WP Crafter**_
28
-
29
-
30
- ### INCLUDED 32 FREE WIDGETS
31
-
32
- Unlike other Elementor addons, the Happy Elementor Addons comes with a host of free yet powerful widgets. The magical widgets will impress you so much that you will be confused whether they are premium or free:
33
-
34
- 1. **[Card](https://demo.happyaddons.com/elementor-card-widget-demo/)** – Incredibly powerful widget to demonstrate your products, articles, news, creative posts using a beautiful combination of texts, links, badge, and image. Using built-in positioning and offset feature you can create eye-candy designs in a twist. [Check demo](https://demo.happyaddons.com/elementor-card-widget-demo/)
35
- 2. **[Gradient Heading](https://demo.happyaddons.com/elementor-gradient-heading-widget-demo/)** – Another gem to create eye candy headings for your websites. You can apply different gradient styles, angles, opacity, and positions to make them look even better across different device screens. [Check demo](https://demo.happyaddons.com/elementor-gradient-heading-widget-demo/)
36
- 3. **[Info Box](https://demo.happyaddons.com/elementor-info-box-widget-demo/)** – Create beautiful information boxes using icons, links, and texts, and make them slick using the built-in positioning features. [Check demo](https://demo.happyaddons.com/elementor-info-box-widget-demo/)
37
- 4. **[Icon Box](https://demo.happyaddons.com/elementor-icon-box-widget-demo/)** – A simplified version of Infobox but comes with powerful display features. Perfect for showcasing interesting information to your users in various styles. [Check demo](https://demo.happyaddons.com/elementor-icon-box-widget-demo/)
38
- 5. **[Image Compare](https://demo.happyaddons.com/elementor-image-compare-widget-demo/)** – Are you a photo-editor, agency or product designer who often needs to showcase their beautiful works in a form of before and after slider? This widget is perfect for this job. And built-in styling options, vertical and horizontal orientation features can help you design these before-after sections with more creativity. [Check demo](https://demo.happyaddons.com/elementor-image-compare-widget-demo/)
39
- 6. **[Team Member](https://demo.happyaddons.com/elementor-team-member-widget-demo/)** – A perfect widget to showcase your beautiful team in various styles using texts, images, and social links. And just like our other widgets, you will find powerful styling options to make them stand out quite easily. [Check demo](https://demo.happyaddons.com/elementor-team-member-widget-demo/)
40
- 7. **[Review](https://demo.happyaddons.com/elementor-review-widget-demo/)** – Showcase your user feedback, reviews, and rating easily than ever using our review widget. Display user photos, texts and star ratings. Make them stand out using built-in offsets and positioning features. [Check demo](https://demo.happyaddons.com/elementor-review-widget-demo/)
41
- 8. **[Skill Bars](https://demo.happyaddons.com/elementor-skill-bars-widget-demo/)** – An essential building block to showcase user skills, task percentage, required tools, and other progressive information in different ways. It comes with incredible customizing options to suit your needs. [Check demo](https://demo.happyaddons.com/elementor-skill-bars-widget-demo/)
42
- 9. **[Contact Form 7](https://demo.happyaddons.com/elementor-contact-form-7-widget-demo/)** – This utility widget helps you to integrate existing forms built using CF7 plugin across your web pages without spending too much time. [Check demo](https://demo.happyaddons.com/elementor-contact-form-7-widget-demo/)
43
- 10. **[Caldera Forms](https://demo.happyaddons.com/elementor-caldera-forms-widget-demo/)** – This widget can help you to display your caldera forms to display on your web pages designed with Elementor. [Check demo](https://demo.happyaddons.com/elementor-caldera-forms-widget-demo/)
44
- 11. **[weForms](https://demo.happyaddons.com/elementor-we-forms-widget-demo/)** – Designed forms using weForms plugin and looking for a way to display those on your Elementor powered pages? This is the answer to that. [Check demo](https://demo.happyaddons.com/elementor-we-forms-widget-demo/)
45
- 12. **[Ninja Forms](https://demo.happyaddons.com/elementor-ninja-form-widget-demo/)** – Use this widget to embed forms created using Ninja Forms to display seamlessly on your web pages. Various styling options will help you to look at them even better. [Check demo](https://demo.happyaddons.com/elementor-ninja-form-widget-demo/)
46
- 13. **[WPForms](https://demo.happyaddons.com/elementor-wpform-widget-demo/)** – Use this widget to embed forms created using WPForms to display seamlessly on your web pages. Various styling options will help you to look at them even better. [Check demo](https://demo.happyaddons.com/elementor-wpform-widget-demo/)
47
- 14. **[Dual Button](https://demo.happyaddons.com/elementor-dual-button-widget-demo/)** – DualButton widget allows you to add two flexible and trendy action buttons in your sections, in different styles. [Check demo](https://demo.happyaddons.com/elementor-dual-button-widget-demo/)
48
- 15. **[Testimonial](https://demo.happyaddons.com/elementor-testimonial-widget-demo/)** – Create beautiful testimonial sections with different look-n-feels using HappyAddons Testimonial widget. [Check demo](https://demo.happyaddons.com/elementor-testimonial-widget-demo/)
49
- 16. **[Justified Grid](https://demo.happyaddons.com/elementor-justified-grid-widget-demo/)** – Another pro-grade widget that can help you to create the beautiful justified grid. It comes packed with tons of options to make it stand out from the crowd. [Check demo](https://demo.happyaddons.com/elementor-justified-grid-widget-demo/)
50
- 17. **[Number](https://demo.happyaddons.com/elementor-number-widget-demo/)** – Simply beautiful, this widget can help you create stunning number blocks with various styles, look-n-feels that’s literally going to blow your mind. [Check demo](https://demo.happyaddons.com/elementor-number-widget-demo/)
51
- 18. **[Logo Grid](https://demo.happyaddons.com/elementor-logo-grid-widget-demo)** – Showcase your clients or products using our logo grid widget, and display these items with styles. [Check demo](https://demo.happyaddons.com/elementor-logo-grid-widget-demo)
52
- 19. **[Carousel](https://demo.happyaddons.com/elementor-carousel-widget-demo/)** – Create interesting image and text carousels using our carousel widget which comes with a lot of options. [Check demo](https://demo.happyaddons.com/elementor-carousel-widget-demo/)
53
- 20. **[Slider](https://demo.happyaddons.com/elementor-slider-widget-demo/)** – Now you can create sliders with beautiful animations and effects using our Slider widget. And just like our other widgets, there are lots of customization options for you. [Check demo](https://demo.happyaddons.com/elementor-slider-widget-demo/)
54
- 21. **[Step Flow](https://demo.happyaddons.com/elementor-step-flow-widget-demo/)** – Create an excellent step by step visual diagram and instructions using this smart widget. Change directions, counters and make them look amazing with icons, texts, and colors. [Check demo](https://demo.happyaddons.com/elementor-step-flow-widget-demo/)
55
- 22. **[Calendly](https://demo.happyaddons.com/elementor-calendly-widget-demo/)** – Schedule meetings without the back-and-forth emails through Calendly. We are happy to integrate this important application in our HappyAddons. [Check demo](https://demo.happyaddons.com/elementor-calendly-widget-demo/)
56
- 23. **[Flip Box](https://demo.happyaddons.com/elementor-flip-box-widget-demo/)** – FlipBox helps you to deliver messages in a beautiful way with before and after-effects. [Check demo](https://demo.happyaddons.com/elementor-flip-box-widget-demo/)
57
- 24. **[Pricing Table](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)** – Create beautiful pricing tables with lots of customizations and sleek look-n-feel using this widget. [Check demo](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)
58
- 25. **[Image Grid](https://demo.happyaddons.com/elementor-image-grid-widget-demo/)** – Simply beautiful, this widget can help you create stunning number blocks with various styles, look-n-feels that’s literally going to blow your mind. [Check demo](https://demo.happyaddons.com/elementor-image-grid-widget-demo/)
59
- 26. **[Gravity Forms](https://demo.happyaddons.com/elementor-gravity-form-widget-demo/)** - While using Gravity forms, you may want to change the appearance of the form fields. With the Happy Addons, you can spruce up your Gravity forms like a pro. [Check demo](https://happyaddons.com/docs/happy-addons-for-elementor/widgets/gravity-forms/)
60
- 27. **[News Ticker](https://demo.happyaddons.com/elementor-news-ticker-widget-demo/)** - Want to show updates, popular content or messages on your website? With the Happy Elementor Addons Content Ticker widget, you can do this at your disposal with great customizability.
61
- 28. **[Twitter Feed](https://demo.happyaddons.com/elementor-twitter-feed-widget-demo/)**
62
- 29. **[Bar Chart](https://demo.happyaddons.com/elementor-bar-chart-widget-demo/)**
63
- 30. **[Social Icons](https://demo.happyaddons.com/elementor-social-icon-widget-demo/)**
64
- 31. **[Post Tab](https://demo.happyaddons.com/elementor-post-tab-widget-demo/)**
65
- 32. **[Post List](https://demo.happyaddons.com/elementor-post-list-widget-demo/)**
66
-
67
-
68
- ### Free Built-in Extensions to Give You an Awesome Experience
69
-
70
- **Happy Extensions contain free extensions augmenting the features of the Elementor page builder to add additional customizations. These effects are unique and exclusive that is only available in Happy Addons.**
71
-
72
- **🔆 Background Overlay –** This extension will allow you to add images, colors, and icons behind a widget. You can add background overlay to any widget.
73
-
74
- **🔆 Happy Icons –** This will help you embellish your web page with an army of free happy icons. To do so, you have to
75
- choose a widget that supports happy icons. Currently, the custom fonts library contains 500+ icons.
76
 
77
- **🔆 Managing Column Order on Mobile Responsive Mood -** Your designed web page may contain some columns that may require to reorder in the mobile device view. By using the Happy Elementor Addons, you can rearrange the order of the column.
78
 
79
- **🔆 Manage Column Width by Adding Pixels -** You can control the column width of your widgets with percentage parameters in Elementor. However, sometimes, you need to adjust the column width to meet your design aesthetics. The Happy Addons will let you do so with ease.
80
 
81
- **🔆 Happy Clone -** While designing with Elementor, you may need to duplicate page or posts from the finder of
82
- Elementor Page Builder by using the buttons (CMD/CTRL + E). Surprisingly, you can copy pages and posts lighting fast from the Elementor finder using the Happy clone feature.
83
 
84
- **🔆 Fixed Size Controls in Elementor Button Widget -** Some times, you may need to make perfectly circular shaped
85
- buttons in Elementor. With this free feature, you can do that by just setting a fixed size, that is, by specifying an equal height and width of the Elementor Button widget.
86
 
87
- **🔆 Grid Layer **
 
 
 
 
 
 
 
88
 
89
- **🔆 Wrapper Link **
90
-
91
-
92
- **Happy Effects**
93
 
94
  As mentioned, the happy Elementor Addons caters you with these two effects that are dying to make you happy:
95
 
96
- 👉 **[Floating Effects](https://demo.happyaddons.com/elementor-floating-effect-demo/)** – Now you can create stunning animations for any Elementor widget using Floating Effects. Translate, Rotate or Scale – Imagination is the limit!
 
 
97
 
98
- 👉 **[CSS Transform](https://demo.happyaddons.com/elementor-css-transform-demo/)** Another missing piece, a great enhancement over core Elementor that works seamlessly with every widget. You can now apply various CSS transforms like translate, rotate, scale and skew without any limitations.
99
 
100
  https://www.youtube.com/watch?v=LmtacsLcFPU
101
 
102
- **Space Effects Using Floating Effects**
103
 
104
  https://www.youtube.com/watch?v=F33g3zqkeog
105
 
 
106
 
107
- ### Presenting the Mighty Happy Elementor Add Ons Pro
108
-
109
- The Happy Elementor Addons ships not only with some unique premium features but also with premium widgets. The premium features are 100% unique and exclusive and the premium widgets are there to give you professional assistance to craft any design.
110
 
111
  https://www.youtube.com/watch?v=QwJrFMtfO2U
112
 
 
 
 
 
 
113
 
114
- ## Premium (Pro) Features of the Happy Elementor Addons
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
115
 
116
- The premium features of happy addons make it stand out from all the other Elementor add-ons. You will get the following three premium features from the Happy Addons:
117
 
 
118
 
119
- ### Cross-Domain Copy-Paste: Apply the Same Design to Multiple Domains with a Single Click
120
 
121
  If you are creating different web pages with WordPress, you will often try to use the same elements of a web page to other pages over and over again.
122
 
@@ -126,10 +145,7 @@ This is where the goodness of the Happy Addons comes to the rescue! With this to
126
 
127
  [Watch Demo](https://demo.happyaddons.com/cross-domain-copy-paste/)
128
 
129
- https://www.youtube.com/watch?v=s1WlUYweJl0
130
-
131
-
132
- ### Preset: Save Your Time and Effort by Using the Preset Feature
133
 
134
  If you try to create your website from scratch and give it a professional appearance, then it will take up a huge amount of time and effort.
135
 
@@ -137,10 +153,7 @@ To tackle this hassle, the Preset option of the Happy Addons comes into play! Mu
137
 
138
  [Watch Demo](https://demo.happyaddons.com/presets-demo/)
139
 
140
- https://www.youtube.com/watch?v=fEEvoc6HRBA
141
-
142
-
143
- ### Unlimited Section Nesting: Use Unlimited Section Nesting to Go Beyond the Limit
144
 
145
  With Elementor, you can create sections to make room for elements. We feel happy to say that by integrating the Happy Elementor add-ons, you can create infinite sections within a single section.
146
 
@@ -148,77 +161,41 @@ And as usual, you can insert as many widgets as you want into those sections.
148
 
149
  [Watch demo](https://demo.happyaddons.com/unlimited-section-nesting/)
150
 
151
- https://www.youtube.com/watch?v=Vr0-msIB3jc
152
-
153
-
154
- ### Live Copy: Copy Designs from Demo Site to Get It Done Right Away!
155
 
156
  Sometimes you may wish to simulate exactly the same design that you see on our demo page. Amazingly, with the Live Copy option, you can do it at your disposal.
157
 
158
  This is a go-to way that lets you copy the code of the demo design from the demo site and allows you to use it directly on your Elementor edit panel.
159
 
160
- Unlike a theme template, using the demo designs wont put any pressure on your media server which is a must-have to load the page faster.
161
 
162
  [Watch Demo](https://demo.happyaddons.com/live-copy/)
163
 
164
- https://www.youtube.com/watch?v=339WNqlDFAA
165
-
166
-
167
- ## Premium Widgets of Happy Elementor Addons
168
-
169
- If you are not contented with the free widgets, then the following premium widgets are there to quench your thirst. The best part is that you can copy and paste the design source code and so you won’t have to make any design from scratch:
170
-
171
-
172
- 1. **[Pricing Table](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)** - This one of a kind widget
173
- will allow you to create any kind of pricing table under the sun. As a surprise, you can use gradient background, oval-shaped button, font awesome icons, background fill color, different heights, dark mood and so on. [Check demo](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/)
174
- 2. **[Flip Box](https://demo.happyaddons.com/elementor-flip-box-widget-demo-2/)** - This exquisite widget will help
175
- you show different messages or texts at the time before and after a user hover on a certain element. Just like the other widgets, you can customize this with background image, gutter and circular arrow navigation on both sides. [Check demo](https://demo.happyaddons.com/elementor-flip-box-widget-demo-2/)
176
- 3. **[Advanced Heading](https://demo.happyaddons.com/elementor-advanced-heading-widget-demo/)** - With this useful widget you can create beautiful heading design for your text. Like the other widgets, you will get a bunch of free customization options for different sections of the texts. [Check demo](https://demo.happyaddons.com/elementor-advanced-heading-widget-demo/)
177
- 4. **[Animated Text](https://demo.happyaddons.com/elementor-animated-text-widget-demo/)** - This widget is pretty useful
178
- to make your text stand apart from the crowd applying smart animations. You can customize the cool animation effects with a variety of flexible styles. [Check demo](https://demo.happyaddons.com/elementor-animated-text-widget-demo/)
179
- 5. **[Scrolling Image](https://demo.happyaddons.com/elementor-scrolling-image-widget-demo/)** - Using this widget, you can show your products or services in a way that slides horizontally or vertically. You can also create a stunning photo gallery with this awesome widget. [Check demo](v)
180
- 6. **[Image Hover Box](https://demo.happyaddons.com/elementor-image-hover-box-widget-demo/)** - Give boring images lives by adding dynamic animated texts with this nifty little tool. You can display texts with this tool right after a user hovers an image. [Check demo](https://demo.happyaddons.com/elementor-image-hover-box-widget-demo/)
181
- 7. **[Team Carousel](https://demo.happyaddons.com/elementor-team-carousel-widget-demo/)** - Present your team members with beautiful carousels that include social profile buttons, arrow icons, and great customizability. [Check demo](https://demo.happyaddons.com/elementor-team-carousel-widget-demo/)
182
- 8. **[Timeline](https://demo.happyaddons.com/elementor-timeline-widget-demo/)** - Tell your story in the precise and the smartest way using this gorgeous tool. Your visitors will get to know everything about the history of your product or company through a bird’s eye view. [Check demo](https://demo.happyaddons.com/elementor-timeline-widget-demo/)
183
- 9. **[Advanced Tab](https://demo.happyaddons.com/elementor-advanced-tab-widget-demo/)** - This elementor widget will enable you to show your content by creating advanced tabbed content sections using full-controlled customizations. You can also use other widgets inside the tab. [Check demo](https://demo.happyaddons.com/elementor-advanced-tab-widget-demo/)
184
- 10. **[Advanced Accordion](https://demo.happyaddons.com/elementor-advanced-accordion-widget-demo/)** - Just like the Advanced Tab widget, if you want to provide your user with extra information using a collapsing effect in different directions, then this is the widget to you should go for. [Check demo](https://demo.happyaddons.com/elementor-advanced-accordion-widget-demo/)
185
- 11. **[Testimonial Carousel](https://demo.happyaddons.com/elementor-testimonial-carousel-widget-demo/)** - This widget will provide you with a great way to showcase the recommendations of your customers. You can also control the carousel’s movement using various flexible styles. [Check demo](https://demo.happyaddons.com/elementor-testimonial-carousel-widget-demo/)
186
- 12. **[Logo Carousel](https://demo.happyaddons.com/elementor-logo-carousel-widget-demo/)** - Unleash your design creativity with this beautiful logo carousel widget and showcase your partners and products using vertical or horizontal motion. [Check demo](https://demo.happyaddons.com/elementor-logo-carousel-widget-demo/)
187
- 13. **[Countdown](https://demo.happyaddons.com/elementor-countdown-widget-demo/)** - This eye-catching widget will let you set a countdown clock which you can use to show the launch time of your website or prod the customers to take a particular action showing remaining time. [Check demo](https://demo.happyaddons.com/elementor-countdown-widget-demo/)
188
- 14. **[Business Hour](https://demo.happyaddons.com/elementor-business-hour-widget-demo/)** - This widget will help you show the business hours in a tabular form. Your customers will get to know when your business is open or closed. [Check demo](https://demo.happyaddons.com/elementor-business-hour-widget-demo/)
189
- 15. **[Instagram Feed](https://demo.happyaddons.com/elementor-instagram-feed-widget-demo/)** - This widget will pave you the way to dynamically show you your beautiful Instagram photos seamlessly on your website page. Users can interact with your photos and leave a comment. [Check demo](https://demo.happyaddons.com/elementor-instagram-feed-widget-demo/)
190
- 16. **[Advanced Toggle](https://demo.happyaddons.com/elementor-advanced-toggle-widget-demo/)** - Similar to the Accordion widget, this will allow you to create a collapsible container area that will enable the user to show and hide items provided that the user clicks on it. [Check demo](https://demo.happyaddons.com/elementor-advanced-toggle-widget-demo/)
191
- 17. **[List Group](https://demo.happyaddons.com/elementor-list-group-widget-demo/)** - With this incredibly handy widget, you can craft beautiful lists. You can also apply advanced styles to give the appearance of the items just like the way you want. [Check demo](https://demo.happyaddons.com/elementor-list-group-widget-demo/)
192
- 18. **[Feature List](https://demo.happyaddons.com/elementor-feature-list-widget-demo/)** - You can display your product features using different styles using this widget. As a bonus, you can also customize each and every predefined design. [Check demo](https://demo.happyaddons.com/elementor-feature-list-widget-demo/)
193
- 19. **[Source Code](https://demo.happyaddons.com/elementor-source-code-widget-demo/)** - While writing docs or tutorial posts, you can use this widget to skillfully show codes to your visitors so that they can copy and paste them anywhere on the page at their disposal. [Check demo](https://demo.happyaddons.com/elementor-source-code-widget-demo/)
194
 
 
195
 
196
- ### Enjoy Extra Benefits from the Happy Addons!
197
 
198
- Our code doesn’t stink and we don’t leave you blindfolded when you need support from us. Apart from the freemium widgets, the plugin will pamper you with a fleet of professional quality features.
199
 
200
- For example, it’s compatible with almost every WordPress theme; it’s lightweight and fast; comes up with motion effects, and empowers you with enormous customizability options. In addition, the plugin also works cohesively with the stock Elementor widgets.
201
 
202
- If you don’t understand a feature or fail to give it the desired look which was already demonstrated in a demo, or it’s not working as expected – we got your back. Just drop us a line and we will do our best to help you figure a way out.
203
 
 
204
 
205
- ### BUGS, TECHNICAL HINTS OR CONTRIBUTE
206
 
207
- Please give us feedback, contribute and file technical bugs on [GitHub Repo](https://github.com/weDevsOfficial/happy-elementor-addons/issues).
208
 
209
- **Connect with the Happy Community**
210
 
211
- In case you want to share any ideas on Happy Addons with other users or if you are in any trouble, don’t feel stranded. Stay connected with [the Happy addons community](https://www.facebook.com/groups/HappyAddonsCommunity/).
212
-
213
-
214
- ## Privacy Policy
215
- **Happy Elementor Addons** uses [Appsero](https://appsero.com) SDK to collect some telemetry data upon user's confirmation. This helps us to troubleshoot problems faster & make product improvements.
216
-
217
- Appsero SDK **does not gather any data by default.** The SDK only starts gathering basic telemetry data **when a user allows it via the admin notice**. We collect the data to ensure great user experience for all our users.
218
 
219
  Integrating Appsero SDK **DOES NOT IMMEDIATELY** start gathering data, **without confirmation from users in any case.**
220
 
221
- Learn more how [Appsero collects and uses this data](https://appsero.com/privacy-policy/). Additionally, read weDevs [privacy policy](https://wedevs.com/privacy-policy/) for more.
222
 
223
 
224
  == Frequently Asked Questions ==
@@ -244,6 +221,19 @@ Yes, undoubtedly.
244
  No, It won't break your site or any page where you used Happy Elementor Addons. We put our best effort to make you happy.
245
 
246
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
  == Screenshots ==
248
 
249
  1. Review widget with image offset
@@ -260,23 +250,12 @@ No, It won't break your site or any page where you used Happy Elementor Addons.
260
  12. Card widget with Happy Effects (Floating Effects)
261
  13. Card widget - capsule design
262
 
263
- == Installation ==
264
-
265
- It's really easy and super simple to install **Happy Elementor Addons** plugin but before installing **Happy Elementor Addons** make sure you've installed [Elementor](https://wordpress.org/plugins/elementor/ "Install Elementor"). **Elementor** is the only dependency.
266
-
267
- = Automatic Installation =
268
- 1. Go to `Plugins > Add New` screen in WordPress.
269
- 2. Search for `Happy Addons For Elementor`.
270
- 3. Install and activate the plugin, that's it.
271
 
272
- = Manual Installation =
273
- 1. Download [Happy Elementor Addons](https://downloads.wordpress.org/plugin/happy-elementor-addons.zip "Download Happy Elementor Addons").
274
- 2. Extract the `happy-elementor-addons.zip` file. You'll get plugin files inside `happy-elementor-addons` directory.
275
- 3. Upload the plugin files to the `/wp-content/plugins/happy-elementor-addons` directory.
276
- 4. Activate the plugin through the 'Plugins' screen in WordPress.
277
 
 
278
 
279
- == Changelog ==
280
 
281
  = 2.8.1 - 5 April 2020 =
282
 
1
+ === Happy Addons for Elementor ===
2
+ Plugin Name: Happy Addons for Elementor
3
+ Version: 2.9.0
4
  Author: weDevs
5
  Author URI: https://happyaddons.com/
6
  Contributors: thehappymonster, happyaddons, hasinhayder, mosaddek73, tareq1988, sourav926, wedevs, iqbalrony, mrokon, obiplabon
7
+ Tags: Elementor Page Builder, Elementor addons, Elementor Widgets, Elementor Editor, Web Page Builder
8
  Requires at least: 4.7
9
+ Tested up to: 5.4.1
10
  Stable tag: trunk
11
  Requires PHP: 5.4
12
  License: GPLv2
13
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
14
 
15
+ [Happy Addons for Elementor page builder](https://happyaddons.com/) promises to enhance and take your WordPress webpage editing & designing capabilities to a whole new level.
16
 
17
+ This Elementor based plugin is the latest addition in the list of [weDevs](https://wedevs.com/) premium product library. Enjoy this freemium (free+premium) page builder for Elementor that consists of cutting-edge widgets that are surely set to take your page building experience with Elementor editor to the next level.
18
 
19
+ == Description ==
20
 
21
+ [Happy Addons for Elementor page builder](https://happyaddons.com/) promises to enhance and take your WordPress webpage editing & designing capabilities to a whole new level.
22
+
23
+ This Elementor based plugin is the latest addition in the list of [weDevs](https://wedevs.com/) premium product library. Enjoy this freemium (free+premium) page builder for Elementor that consists of cutting-edge widgets that are surely set to take your page building experience with Elementor editor to the next level.
24
+
25
+ ### **32+ FREE PREMIUM-LIKE WIDGETS AND MORE ON ITS WAY**
26
+
27
+ Unlike most other Elementor addons, Happy Addons offers itself with many robust free widgets. These free yet important widgets would surely give you a feel of premium widgets making you wonder how come these widgets are free. Let's explore all the magical free widgets of Happy Addons:
28
+
29
+ - [**Card**](https://demo.happyaddons.com/elementor-card-widget-demo/) – Incredibly powerful widget to demonstrate your products, articles, news, creative posts using a beautiful combination of texts, links, badge, and image. Using built-in positioning and offset feature you can create eye-candy designs in a twist.
30
+ - [**Gradient Heading**](https://demo.happyaddons.com/elementor-gradient-heading-widget-demo/) – Another gem to create eye candy headings for your websites. You can apply different gradient styles, angles, opacity, and positions to make them look even better across different device screens.
31
+ - [**Info Box**](https://demo.happyaddons.com/elementor-info-box-widget-demo/) – Create beautiful information boxes using icons, links, and texts, and make them slick using the built-in positioning features.
32
+ - [**Icon Box**](https://demo.happyaddons.com/elementor-icon-box-widget-demo/) – A simplified version of Infobox but comes with powerful display features. Perfect for showcasing interesting information to your users in various styles.
33
+ - [**Image Compare**](https://demo.happyaddons.com/elementor-image-compare-widget-demo/) – Are you a photo-editor, agency or product designer who often needs to showcase their beautiful works in a form of before and after slider? This widget is perfect for this job. And built-in styling options, vertical and horizontal orientation features can help you design these before-after sections with more creativity.
34
+ - [**Team Member**](https://demo.happyaddons.com/elementor-team-member-widget-demo/) – A perfect widget to showcase your beautiful team in various styles using texts, images, and social links. And just like our other widgets, you will find powerful styling options to make them stand out quite easily.
35
+ - [**Review**](https://demo.happyaddons.com/elementor-review-widget-demo/) – Showcase your user feedback, reviews, and rating easily than ever using our review widget. Display user photos, texts and star ratings. Make them stand out using built-in offsets and positioning features.
36
+ - [**Skill Bars**](https://demo.happyaddons.com/elementor-skill-bars-widget-demo/) – An essential building block to showcase user skills, task percentage, required tools, and other progressive information in different ways. It comes with incredible customizing options to suit your needs.
37
+ - [**Contact Form 7**](https://demo.happyaddons.com/elementor-contact-form-7-widget-demo/) – This utility widget helps you to integrate existing forms built using CF7 plugin across your web pages without spending too much time.
38
+ - [**Caldera Forms**](https://demo.happyaddons.com/elementor-caldera-forms-widget-demo/) – This widget can help you to display your caldera forms to display on your web pages designed with Elementor.
39
+ - [**weForms**](https://demo.happyaddons.com/elementor-we-forms-widget-demo/) – Designed forms using weForms plugin and looking for a way to display those on your Elementor powered pages? This is the answer to that.
40
+ - [**Ninja Forms**](https://demo.happyaddons.com/elementor-ninja-form-widget-demo/) – Use this widget to embed forms created using Ninja Forms to display seamlessly on your web pages. Various styling options will help you to look at them even better.
41
+ - [**WPForms**](https://demo.happyaddons.com/elementor-wpform-widget-demo/) – Use this widget to embed forms created using WPForms to display seamlessly on your web pages. Various styling options will help you to look at them even better.
42
+ - [**Dual Button**](https://demo.happyaddons.com/elementor-dual-button-widget-demo/) – DualButton widget allows you to add two flexible and trendy action buttons in your sections, in different styles.
43
+ - [**Testimonial**](https://demo.happyaddons.com/elementor-testimonial-widget-demo/) – Create beautiful testimonial sections with different look-n-feels using HappyAddons Testimonial widget.
44
+ - [**Justified Grid**](https://demo.happyaddons.com/elementor-justified-grid-widget-demo/) – Another pro-grade widget that can help you to create the beautiful justified grid. It comes packed with tons of options to make it stand out from the crowd.
45
+ - [**Number**](https://demo.happyaddons.com/elementor-number-widget-demo/) – Simply beautiful, this widget can help you create stunning number blocks with various styles, look-n-feels that's literally going to blow your mind.
46
+ - [**Logo Grid**](https://demo.happyaddons.com/elementor-logo-grid-widget-demo) – Showcase your clients or products using our logo grid widget, and display these items with styles.
47
+ - [**Carousel**](https://demo.happyaddons.com/elementor-carousel-widget-demo/) – Create interesting image and text carousels using our carousel widget which comes with a lot of options.
48
+ - [**Slider**](https://demo.happyaddons.com/elementor-slider-widget-demo/) – Now you can create sliders with beautiful animations and effects using our Slider widget. And just like our other widgets, there are lots of customization options for you.
49
+ - [**Step Flow**](https://demo.happyaddons.com/elementor-step-flow-widget-demo/) – Create an excellent step by step visual diagram and instructions using this smart widget. Change directions, counters and make them look amazing with icons, texts, and colors.
50
+ - [**Calendly**](https://demo.happyaddons.com/elementor-calendly-widget-demo/) – Schedule meetings without the back-and-forth emails through Calendly. We are happy to integrate this important application in our HappyAddons.
51
+ - [**Flip Box**](https://demo.happyaddons.com/elementor-flip-box-widget-demo/) – FlipBox helps you to deliver messages in a beautiful way with before and after-effects.
52
+ - [**Pricing Table**](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/) – Create beautiful pricing tables with lots of customizations and sleek look-n-feel using this widget.
53
+ - [**Image Grid**](https://demo.happyaddons.com/elementor-image-grid-widget-demo/) – Simply beautiful, this widget can help you create stunning number blocks with various styles, look-n-feels that's literally going to blow your mind.
54
+ - [**Gravity Forms**](https://demo.happyaddons.com/elementor-gravity-form-widget-demo/) – While using Gravity forms, you may want to change the appearance of the form fields. With the Happy Addons, you can spruce up your Gravity forms like a pro.
55
+ - [**News Ticker**](https://demo.happyaddons.com/elementor-news-ticker-widget-demo/) – Want to show updates, popular content or messages on your website? With the Happy Elementor Addons Content Ticker widget, you can do this at your disposal with great customizability.
56
+ - **[Twitter Fee](https://demo.happyaddons.com/elementor-twitter-feed-widget-demo/)d** – Showcase your awesome team decorating in the Twitter feed mode applying various styles, texts, images, and social links.
57
+ - **[Bar Chart](https://demo.happyaddons.com/elementor-bar-chart-widget-demo/)**– Display charts in an animated and customizable bar form essentially in case of imaging different data and other relevant statistical visualizations.
58
+ - **[Social Icon](https://demo.happyaddons.com/elementor-social-icon-widget-demo/)s** – Beautifully insert and display your social links onto your webpage using this widget to easily connect with your site visitor.
59
+ - **[Post Tab](https://demo.happyaddons.com/elementor-post-tab-widget-demo/)**– Enable users to present your post in multiple workable tabs ideally useful for grouped and related content.
60
+ - **[Post List](https://demo.happyaddons.com/elementor-post-list-widget-demo/)**– List any post elegantly using this widget displaying them in a creative and innovative manner with multiple options to play with.
61
+
62
+ New free widgets or features are added every month. With all these awesome free widgets, this nifty plugin, not just aims to the trendy and sophisticated WordPress website design philosophy but also effortlessly aligns with any Elementor powered WordPress website design requirements.
63
+
64
+ Now have a look at the Happy Addons feature and widget demo explained by our well-wisher, **Adam Preiser, Founder of WP Crafter**
65
 
66
  https://www.youtube.com/watch?v=XpWm7zdvUoM
67
 
68
+ He also acknowledged Happy Addons saying:-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
69
 
70
+ > HappyAddons is a unique Elementor Addon. It might be the best addon package for Elementor.
71
 
 
72
 
73
+ ### **FREE BUILT-IN EXTENSIONS FOR AN UNPRECEDENTED WEB-PAGE DESIGNING EXPERIENCE**
 
74
 
75
+ _Happy Addons Extensions comprise with free extensions augmenting the features of the Elementor page builder to add additional customizations. These effects are novel and exclusive that is only available in Happy Addons._
 
76
 
77
+ - **Background Overlay –** This extension will allow you to add images, colors, and icons behind a widget. You can add background overlay to any widget.
78
+ - **Happy Icons –** This will help you embellish your web page with an army of free happy icons. To do so, you have to choose a widget that supports happy icons. Currently, the custom fonts library contains 500+ icons.
79
+ - **Managing Column Order on Mobile Responsive Mood –** Your designed web page may contain some columns that may require to reorder in the mobile device view. By using the Happy Elementor Addons, you can rearrange the order of the column.
80
+ - **Manage Column Width by Adding Pixels –** You can control the column width of your widgets with percentage parameters in Elementor. However, sometimes, you need to adjust the column width to meet your design aesthetics. The Happy Addons will let you do so with ease.
81
+ - **Happy Clone –** While designing with Elementor, you may need to duplicate page or posts from the finder of Elementor Page Builder by using the buttons (CMD/CTRL + E). Surprisingly, you can copy pages and posts lighting fast from the Elementor finder using the Happy clone feature.
82
+ - **Fixed Size Controls in Elementor Button Widget –** Some times, you may need to make perfectly circular shaped buttons in Elementor. With this free feature, you can do that by just setting a fixed size, that is, by specifying an equal height and width of the Elementor Button widget.
83
+ - **Grid Layer:** Maintain proper alignment of your page's elements. Enjoy full flexibility while setting your grid color, width, and position of your grid layout.
84
+ - **Wrapper Link:** No limitation on adding links to specific areas. Use the Wrapper Link feature to insert links to any column, section or any other place you want.
85
 
86
+ ### **Happy Addons Exclusive: Happy Effects**
 
 
 
87
 
88
  As mentioned, the happy Elementor Addons caters you with these two effects that are dying to make you happy:
89
 
90
+ [**Floating Effects**](https://demo.happyaddons.com/elementor-floating-effect-demo/) – Now you can create stunning animations for any Elementor widget using Floating Effects. Translate, Rotate or Scale – Imagination is the limit!
91
+
92
+ [**CSS Transform**](https://demo.happyaddons.com/elementor-css-transform-demo/) – Another missing piece, a great enhancement over core Elementor that works seamlessly with every widget. You can now apply various CSS transforms like translate, rotate, scale and skew without any limitations.
93
 
94
+ **Floating Effects & CSS Transformations demo:**
95
 
96
  https://www.youtube.com/watch?v=LmtacsLcFPU
97
 
98
+ **Floating Effects used for Space effect illustration**
99
 
100
  https://www.youtube.com/watch?v=F33g3zqkeog
101
 
102
+ ### **PRESENTING THE ALL-EXCLUSIVE HAPPY ADDONS FOR ELEMENTOR PRO**
103
 
104
+ The Happy Elementor Addons ships not only with some unique premium features but also with premium widgets. The premium features are 100% unique and exclusive and the premium widgets are there to give you professional assistance to craft any design of your webpage.
 
 
105
 
106
  https://www.youtube.com/watch?v=QwJrFMtfO2U
107
 
108
+ _INTRODUCING HAPPY ADDONS PRO_
109
+
110
+ ### **PREMIUM ELEMENTOR WIDGETS OF HAPPY ADDONS (PRO)**
111
+
112
+ If you are still craving for more widgets, then the following premium widgets are there to quench your thirst. The best part is that you can copy and paste the design source code so you won't have to make any design from scratch. Let's explore the world of Happy Addons Pro Widgets:
113
 
114
+ - [**Pricing Table**](https://demo.happyaddons.com/elementor-pricing-table-widget-demo/) This one of a kind widget will allow you to create any kind of pricing table under the sun. As a surprise, you can use gradient background, oval-shaped button, font awesome icons, background fill color, different heights, dark mood and so on.
115
+ - [**Flip Box**](https://demo.happyaddons.com/elementor-flip-box-widget-demo-2/) – This exquisite widget will help you show different messages or texts at the time before and after a user hover on a certain element. Just like the other widgets, you can customize this with background image, gutter and circular arrow navigation on both sides.
116
+ - [**Advanced Heading**](https://demo.happyaddons.com/elementor-advanced-heading-widget-demo/) – With this useful widget you can create beautiful heading design for your text. Like the other widgets, you will get a bunch of free customization options for different sections of the texts.
117
+ - [**Animated Text**](https://demo.happyaddons.com/elementor-animated-text-widget-demo/) – This widget is pretty useful to make your text stand apart from the crowd applying smart animations. You can customize the cool animation effects with a variety of flexible styles.
118
+ - [**Scrolling Image**](https://demo.happyaddons.com/elementor-scrolling-image-widget-demo/) – Using this widget, you can show your products or services in a way that slides horizontally or vertically. You can also create a stunning photo gallery with this awesome widget.
119
+ - [**Image Hover Box**](https://demo.happyaddons.com/elementor-image-hover-box-widget-demo/) – Give boring images lives by adding dynamic animated texts with this nifty little tool. You can display texts with this tool right after a user hovers an image.
120
+ - [**Team Carousel**](https://demo.happyaddons.com/elementor-team-carousel-widget-demo/) – Present your team members with beautiful carousels that include social profile buttons, arrow icons, and great customizability.
121
+ - [**Timeline**](https://demo.happyaddons.com/elementor-timeline-widget-demo/) – Tell your story in the precise and the smartest way using this gorgeous tool. Your visitors will get to know everything about the history of your product or company through a bird's eye view.
122
+ - [**Advanced Tab**](https://demo.happyaddons.com/elementor-advanced-tab-widget-demo/) – This Elementor widget will enable you to show your content by creating advanced tabbed content sections using full-controlled customizations. You can also use other widgets inside the tab.
123
+ - [**Advanced Accordion**](https://demo.happyaddons.com/elementor-advanced-accordion-widget-demo/) – Just like the Advanced Tab widget, if you want to provide your user with extra information using a collapsing effect in different directions, then this is the widget to you should go for.
124
+ - [**Testimonial Carousel**](https://demo.happyaddons.com/elementor-testimonial-carousel-widget-demo/) – This widget will provide you with a great way to showcase the recommendations of your customers. You can also control the carousel's movement using various flexible styles.
125
+ - [**Logo Carousel**](https://demo.happyaddons.com/elementor-logo-carousel-widget-demo/) – Unleash your design creativity with this beautiful logo carousel widget and showcase your partners and products using vertical or horizontal motion.
126
+ - [**Countdown**](https://demo.happyaddons.com/elementor-countdown-widget-demo/) – This eye-catching widget will let you set a countdown clock which you can use to show the launch time of your website or prod the customers to take a particular action showing remaining time.
127
+ - [**Business Hour**](https://demo.happyaddons.com/elementor-business-hour-widget-demo/) – This widget will help you show the business hours in a tabular form. Your customers will get to know when your business is open or closed.
128
+ - [**Instagram Feed**](https://demo.happyaddons.com/elementor-instagram-feed-widget-demo/) – This widget will pave you the way to dynamically show you your beautiful Instagram photos seamlessly on your website page. Users can interact with your photos and leave a comment.
129
+ - [**Advanced Toggle**](https://demo.happyaddons.com/elementor-advanced-toggle-widget-demo/) – Similar to the Accordion widget, this will allow you to create a collapsible container area that will enable the user to show and hide items provided that the user clicks on it.
130
+ - [**List Group**](https://demo.happyaddons.com/elementor-list-group-widget-demo/) – With this incredibly handy widget, you can craft beautiful lists. You can also apply advanced styles to give the appearance of the items just like the way you want it.
131
+ - [**Feature List**](https://demo.happyaddons.com/elementor-feature-list-widget-demo/) – You can display your product features using different styles using this widget. As a bonus, you can also customize each and every predefined design.
132
+ - [**Source Code**](https://demo.happyaddons.com/elementor-source-code-widget-demo/) – While writing docs or tutorial posts, you can use this widget to skillfully show codes to your visitors so that they can copy and paste them anywhere on the page at their disposal.
133
 
134
+ ### **UNIQUE PRO FEATURES OF HAPPY ADDONS TO WATCH OUT FOR**
135
 
136
+ The premium (PRO) features of Happy Addons truly make it stand out from all the other Elementor add-ons out there right now. You will get the below mentioned much talked about standout premium features in the PRO version of Happy Addons:
137
 
138
+ ### **CROSS-DOMAIN COPY-PASTE: APPLY THE SAME DESIGN TO MULTIPLE DOMAINS WITH A SINGLE CLICK**
139
 
140
  If you are creating different web pages with WordPress, you will often try to use the same elements of a web page to other pages over and over again.
141
 
145
 
146
  [Watch Demo](https://demo.happyaddons.com/cross-domain-copy-paste/)
147
 
148
+ ### **PRESET: SAVE YOUR TIME AND EFFORT BY USING THE PRESET FEATURE**
 
 
 
149
 
150
  If you try to create your website from scratch and give it a professional appearance, then it will take up a huge amount of time and effort.
151
 
153
 
154
  [Watch Demo](https://demo.happyaddons.com/presets-demo/)
155
 
156
+ ### **UNLIMITED SECTION NESTING: USE UNLIMITED SECTION NESTING TO GO BEYOND THE LIMIT**
 
 
 
157
 
158
  With Elementor, you can create sections to make room for elements. We feel happy to say that by integrating the Happy Elementor add-ons, you can create infinite sections within a single section.
159
 
161
 
162
  [Watch demo](https://demo.happyaddons.com/unlimited-section-nesting/)
163
 
164
+ ### **LIVE COPY: COPY DESIGNS FROM DEMO SITE TO GET IT DONE RIGHT AWAY!**
 
 
 
165
 
166
  Sometimes you may wish to simulate exactly the same design that you see on our demo page. Amazingly, with the Live Copy option, you can do it at your disposal.
167
 
168
  This is a go-to way that lets you copy the code of the demo design from the demo site and allows you to use it directly on your Elementor edit panel.
169
 
170
+ Unlike a theme template, using the demo designs won't put any pressure on your media server which is a must-have to help load the page faster.
171
 
172
  [Watch Demo](https://demo.happyaddons.com/live-copy/)
173
 
174
+ ### **ENJOY EXTRA BENEFITS FROM HAPPY ADDONS!**
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
175
 
176
+ Our code doesn't stink and we don't leave you blindfolded when you need support from us. Apart from the freemium widgets, the plugin will pamper you with a fleet of professional quality features.
177
 
178
+ For example, it's compatible with almost every WordPress theme; it's lightweight and fast; comes up with motion effects, and empowers you with enormous customizability options. In addition, the plugin also works cohesively with the stock Elementor widgets.
179
 
180
+ If you don't understand a feature or fail to give it the desired look which was already demonstrated in a demo, or it's not working as expected – we got your back. Just drop us a line and we will do our best to help you figure a way out.
181
 
182
+ ### **BUGS, TECHNICAL HINTS OR CONTRIBUTE**
183
 
184
+ Please provide us with constructive feedback, contribute and file any technical bugs on [GitHub Repository](https://github.com/weDevsOfficial/happy-elementor-addons/issues).
185
 
186
+ **Stay connected with the Happy Community**
187
 
188
+ In case you want to share any ideas on Happy Addons with other users or if you are in any trouble, don't feel stranded. Stay connected with [the Happy addons community](https://www.facebook.com/groups/HappyAddonsCommunity/).
189
 
190
+ ### **PRIVACY POLICY**
191
 
192
+ **Happy Addons for Elementor** uses [Appsero](https://appsero.com/) SDK to collect some telemetry data upon the user's confirmation. This helps us to troubleshoot problems faster & make product improvements.
193
 
194
+ Appsero SDK **does not gather any data by default.** The SDK only starts gathering basic telemetry data **when a user allows it via the admin notice**. We collect the data to ensure a great user experience for all our users.
 
 
 
 
 
 
195
 
196
  Integrating Appsero SDK **DOES NOT IMMEDIATELY** start gathering data, **without confirmation from users in any case.**
197
 
198
+ Learn more about how [Appsero collects and uses this data](https://appsero.com/privacy-policy/). Additionally, read weDevs [privacy policy](https://wedevs.com/privacy-policy/) for better knowledge on it.
199
 
200
 
201
  == Frequently Asked Questions ==
221
  No, It won't break your site or any page where you used Happy Elementor Addons. We put our best effort to make you happy.
222
 
223
 
224
+ == Installation ==
225
+
226
+ **Step 1:** Upload the plugin file to install by navigating through Plugins➔Add New➔Upload Plugin➔Choose File to Install from your WordPress dashboard or you can simply search for the Happy Addons plugin from the plugin directory by going to Plugins➔Add New and search for the plugin in the search tab to install it on your WordPress site.
227
+
228
+ **Step 2:** After successful installation, you have to click the "activate" button to activate the happy addons for Elementor.
229
+
230
+ **Step 3:** When you activate Happy Addons for Elementor you will be redirected to our HappyAddons Dashboard Home Tab.
231
+
232
+ For a more detailed explanation check out the following documentation
233
+
234
+ ☞ [**How to Install Happy Addons For Elementor**](https://happyaddons.com/docs/happy-addons-for-elementor/getting-started-with-happy-elementor-addons/installation/)
235
+
236
+
237
  == Screenshots ==
238
 
239
  1. Review widget with image offset
250
  12. Card widget with Happy Effects (Floating Effects)
251
  13. Card widget - capsule design
252
 
 
 
 
 
 
 
 
 
253
 
254
+ == Changelog ==
 
 
 
 
255
 
256
+ = 2.9.0 - 29 April 2020 =
257
 
258
+ - New: WPML support for all widgets [Documentation](https://happyaddons.com/docs/happy-addons-for-elementor/happy-features/wpml-support-for-happyaddons-free/)
259
 
260
  = 2.8.1 - 5 April 2020 =
261
 
wpml/bar-chart.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Bar Chart integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Bar_Chart extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'chart_data';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['label'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'label':
33
+ return __( 'Bar Chart: Label Text', 'happy-elementor-addons' );
34
+ default:
35
+ return '';
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param string $field
41
+ *
42
+ * @return string
43
+ */
44
+ protected function get_editor_type( $field ) {
45
+ switch ( $field ) {
46
+ case 'label':
47
+ return 'LINE';
48
+ default:
49
+ return '';
50
+ }
51
+ }
52
+ }
wpml/carousel.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Carousel integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Carousel extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'slides';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['title', 'subtitle'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'title':
33
+ return __( 'Carousel: Title', 'happy-elementor-addons' );
34
+ case 'subtitle':
35
+ return __( 'Carousel: Subtitle', 'happy-elementor-addons' );
36
+ default:
37
+ return '';
38
+ }
39
+ }
40
+
41
+ /**
42
+ * @param string $field
43
+ *
44
+ * @return string
45
+ */
46
+ protected function get_editor_type( $field ) {
47
+ switch ( $field ) {
48
+ case 'title':
49
+ return 'LINE';
50
+ case 'subtitle':
51
+ return 'AREA';
52
+ default:
53
+ return '';
54
+ }
55
+ }
56
+ }
wpml/image-grid.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Image Grid integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Image_Grid extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'gallery';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['filter'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'filter':
33
+ return __( 'Image Grid: Filter Name', 'happy-elementor-addons' );
34
+ default:
35
+ return '';
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param string $field
41
+ *
42
+ * @return string
43
+ */
44
+ protected function get_editor_type( $field ) {
45
+ switch ( $field ) {
46
+ case 'filter':
47
+ return 'LINE';
48
+ default:
49
+ return '';
50
+ }
51
+ }
52
+ }
wpml/justified-gallery.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Justified Gallery integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Justified_Gallery extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'gallery';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['filter'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'filter':
33
+ return __( 'Justified Grid: Filter Name', 'happy-elementor-addons' );
34
+ default:
35
+ return '';
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param string $field
41
+ *
42
+ * @return string
43
+ */
44
+ protected function get_editor_type( $field ) {
45
+ switch ( $field ) {
46
+ case 'filter':
47
+ return 'LINE';
48
+ default:
49
+ return '';
50
+ }
51
+ }
52
+ }
wpml/logo-grid.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Logo Grid integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Logo_Grid extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'logo_list';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['name'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'name':
33
+ return __( 'Logo Grid: Brand Name', 'happy-elementor-addons' );
34
+ default:
35
+ return '';
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param string $field
41
+ *
42
+ * @return string
43
+ */
44
+ protected function get_editor_type( $field ) {
45
+ switch ( $field ) {
46
+ case 'name':
47
+ return 'LINE';
48
+ default:
49
+ return '';
50
+ }
51
+ }
52
+ }
wpml/pricing-table.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Pricing Table integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Pricing_Table extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'features_list';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['text'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'text':
33
+ return __( 'Pricing Table: Feature Text', 'happy-elementor-addons' );
34
+ default:
35
+ return '';
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param string $field
41
+ *
42
+ * @return string
43
+ */
44
+ protected function get_editor_type( $field ) {
45
+ switch ( $field ) {
46
+ case 'text':
47
+ return 'AREA';
48
+ default:
49
+ return '';
50
+ }
51
+ }
52
+ }
wpml/skills.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Skills integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Skills extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'skills';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['name'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'name':
33
+ return __( 'Skills: Skill Name', 'happy-elementor-addons' );
34
+ default:
35
+ return '';
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param string $field
41
+ *
42
+ * @return string
43
+ */
44
+ protected function get_editor_type( $field ) {
45
+ switch ( $field ) {
46
+ case 'name':
47
+ return 'LINE';
48
+ default:
49
+ return '';
50
+ }
51
+ }
52
+ }
wpml/slider.php ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Slider integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Slider extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'slides';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['title', 'subtitle'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'title':
33
+ return __( 'Slider: Title', 'happy-elementor-addons' );
34
+ case 'subtitle':
35
+ return __( 'Slider: Subtitle', 'happy-elementor-addons' );
36
+ default:
37
+ return '';
38
+ }
39
+ }
40
+
41
+ /**
42
+ * @param string $field
43
+ *
44
+ * @return string
45
+ */
46
+ protected function get_editor_type( $field ) {
47
+ switch ( $field ) {
48
+ case 'title':
49
+ return 'LINE';
50
+ case 'subtitle':
51
+ return 'AREA';
52
+ default:
53
+ return '';
54
+ }
55
+ }
56
+ }
wpml/social-icons.php ADDED
@@ -0,0 +1,52 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /**
3
+ * Social Icons integration
4
+ */
5
+ namespace Happy_Addons\Elementor;
6
+
7
+ defined( 'ABSPATH' ) || die();
8
+
9
+ class WPML_Social_Icons extends \WPML_Elementor_Module_With_Items {
10
+
11
+ /**
12
+ * @return string
13
+ */
14
+ public function get_items_field() {
15
+ return 'ha_social_icon_list';
16
+ }
17
+
18
+ /**
19
+ * @return array
20
+ */
21
+ public function get_fields() {
22
+ return ['ha_social_icon_title'];
23
+ }
24
+
25
+ /**
26
+ * @param string $field
27
+ *
28
+ * @return string
29
+ */
30
+ protected function get_title( $field ) {
31
+ switch ( $field ) {
32
+ case 'ha_social_icon_title':
33
+ return __( 'Social Icons: Title', 'happy-elementor-addons' );
34
+ default:
35
+ return '';
36
+ }
37
+ }
38
+
39
+ /**
40
+ * @param string $field
41
+ *
42
+ * @return string
43
+ */
44
+ protected function get_editor_type( $field ) {
45
+ switch ( $field ) {
46
+ case 'ha_social_icon_title':
47
+ return 'LINE';
48
+ default:
49
+ return '';
50
+ }
51
+ }
52
+ }