PluginProbe
UiCore Elements – Free widgets and templates for Elementor / 1.0.14
UiCore Elements – Free widgets and templates for Elementor v1.0.14
1.3.17 1.3.16 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.2.0 1.2.1 1.2.2 1.2.3 1.2.4 All 41 releases
uicore-elements / includes / widgets / counter.php

counter.php in UiCore Elements – Free widgets and templates for Elementor 1.0.14, at includes/widgets/counter.php

1,420 lines 51.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace UiCoreElements;
3
4 use Elementor\Controls_Manager;
5 use Elementor\Icons_Manager;
6 use Elementor\Group_Control_Border;
7 use Elementor\Group_Control_Box_Shadow;
8 use Elementor\Group_Control_Typography;
9 use Elementor\Group_Control_Background;
10 use UiCoreElements\UiCoreWidget;
11
12
13 defined('ABSPATH') || exit();
14
15 /**
16 * Counter
17 *
18 * @author Lucas Marini Falbo <lucas@uicore.co>
19 * @since 1.0.0
20 */
21
22 class Counter extends UiCoreWidget
23 {
24
25 public function get_name()
26 {
27 return 'uicore-counter';
28 }
29 public function get_title()
30 {
31 return __( 'Counter', 'uicore-elements' );
32 }
33 public function get_icon()
34 {
35 return 'eicon-counter ui-e-widget';
36 }
37 public function get_keywords()
38 {
39 return ['counter', 'count', 'number'];
40 }
41 public function get_categories()
42 {
43 return [ 'uicore' ];
44 }
45 public function get_styles()
46 {
47 return [ 'counter' ];
48 }
49 public function get_scripts()
50 {
51 return [
52 'counter',
53 'odometer' => [
54 'condition' => [
55 'counter_animation' => 'odometer',
56 ],
57 ]
58 ];
59 }
60 protected function register_controls()
61 {
62
63 $this->start_controls_section(
64 'content_section',
65 [
66 'label' => __( 'Counter', 'uicore-elements' ),
67 'tab' => Controls_Manager::TAB_CONTENT,
68 ]
69 );
70
71 $this->add_control(
72 'show_icon',
73 [
74 'label' => esc_html__( 'Show Icon', 'uicore-elements' ),
75 'type' => Controls_Manager::SWITCHER,
76 'label_on' => esc_html__( 'Show', 'uicore-elements' ),
77 'label_off' => esc_html__( 'Hide', 'uicore-elements' ),
78 'return_value' => 'true',
79 'prefix_class' => 'ui-e-counter-media-',
80 'render_type' => 'template',
81 ]
82 );
83
84 $this->add_control(
85 'icon_type',
86 [
87 'label' => esc_html__( 'Icon Type', 'uicore-elements' ),
88 'type' => Controls_Manager::CHOOSE,
89 'options' => [
90 'icon' => [
91 'title' => esc_html__( 'Icon', 'uicore-elements' ),
92 'icon' => 'eicon-star',
93 ],
94 'image' => [
95 'title' => esc_html__( 'Image', 'uicore-elements' ),
96 'icon' => 'eicon-image-bold',
97 ],
98
99 ],
100 'default' => 'icon',
101 'toggle' => false,
102 'condition' => [
103 'show_icon' => 'true',
104 ],
105 ]
106 );
107
108 $this->add_control(
109 'selected_icon',
110 [
111 'label' => esc_html__( 'Choose icon', 'uicore-elements' ),
112 'type' => Controls_Manager::ICONS,
113 'condition' => [
114 'show_icon' => 'true',
115 'icon_type' => 'icon',
116 ],
117 ]
118 );
119
120 $this->add_control(
121 'image',
122 [
123 'label' => esc_html__( 'Choose Image', 'uicore-elements' ),
124 'type' => Controls_Manager::MEDIA,
125 'condition' => [
126 'show_icon' => 'true',
127 'icon_type' => 'image',
128 ],
129 'dynamic' => [
130 'active' => true,
131 ],
132 ]
133 );
134
135 $this->add_control(
136 'count_start',
137 [
138 'label' => esc_html__( 'Starting number', 'uicore-elements' ),
139 'type' => Controls_Manager::NUMBER,
140 'step' => 1,
141 'default' => 10,
142 'frontend_available' => true,
143 'dynamic' => [
144 'active' => true,
145 ],
146 'condition' =>[
147 'counter_animation!' => ['motion'],
148 ],
149 ]
150 );
151
152 $this->add_control(
153 'count_end',
154 [
155 'label' => esc_html__( 'Ending number', 'uicore-elements' ),
156 'type' => Controls_Manager::NUMBER,
157 'step' => 1,
158 'default' => 120,
159 'frontend_available' => true,
160 'dynamic' => [
161 'active' => true,
162 ],
163 'condition' =>[
164 'counter_animation!' => ['motion'],
165 ],
166 ]
167 );
168
169 $this->add_control(
170 'count_number',
171 [
172 'label' => esc_html__( 'Number', 'uicore-elements' ),
173 'type' => Controls_Manager::TEXT,
174 'default' => '120,00',
175 'frontend_available' => true,
176 'label_block' => true,
177 'dynamic' => [
178 'active' => true,
179 ],
180 'condition' =>[
181 'counter_animation' => ['motion'],
182 ],
183 ]
184 );
185
186 $this->add_control(
187 'counter_html_tag',
188 [
189 'label' => esc_html__( 'Number HTML class', 'uicore-elements' ),
190 'type' => Controls_Manager::SELECT,
191 'default' => 'h1',
192 'options' => [
193 'h1' => esc_html__( 'H1', 'uicore-elements' ),
194 'h2' => esc_html__( 'H2', 'uicore-elements' ),
195 'h3' => esc_html__( 'H3', 'uicore-elements' ),
196 'h4' => esc_html__( 'H4', 'uicore-elements' ),
197 'h5' => esc_html__( 'H5', 'uicore-elements' ),
198 'h6' => esc_html__( 'H6', 'uicore-elements' ),
199 'p' => esc_html__( 'p', 'uicore-elements' ),
200 'span' => esc_html__( 'span', 'uicore-elements' ),
201 ],
202 ]
203 );
204
205 $this->add_control(
206 'content_text',
207 [
208 'label' => esc_html__( 'Title', 'uicore-elements' ),
209 'type' => Controls_Manager::TEXT,
210 'default' => esc_html__( 'Awesome number', 'uicore-elements' ),
211 'placeholder' => esc_html__( 'Type your title here', 'uicore-elements' ),
212 'separator' => 'before',
213 'label_block' => true,
214 'dynamic' => [
215 'active' => true,
216 ],
217 ]
218 );
219
220 $this->add_control(
221 'content_html_tag',
222 [
223 'label' => esc_html__( 'Title HTML tag', 'uicore-elements' ),
224 'type' => Controls_Manager::SELECT,
225 'default' => 'p',
226 'options' => [
227 'H1' => esc_html__( 'H1', 'uicore-elements' ),
228 'H2' => esc_html__( 'H2', 'uicore-elements' ),
229 'H3' => esc_html__( 'H3', 'uicore-elements' ),
230 'H4' => esc_html__( 'H4', 'uicore-elements' ),
231 'H5' => esc_html__( 'H5', 'uicore-elements' ),
232 'H6' => esc_html__( 'H6', 'uicore-elements' ),
233 'p' => esc_html__( 'p', 'uicore-elements' ),
234 'span' => esc_html__( 'span', 'uicore-elements' ),
235 ],
236 ]
237 );
238
239 $this->add_control(
240 'counter_text_inline',
241 [
242 'label' => esc_html__( 'Text inline', 'uicore-elements' ),
243 'type' => Controls_Manager::SWITCHER,
244 'label_on' => esc_html__( 'True', 'uicore-elements' ),
245 'label_off' => esc_html__( 'False', 'uicore-elements' ),
246 'return_value' => 'true',
247 'prefix_class' => 'ui-e-inline-',
248 'render_type' => 'template',
249 'default' => false,
250 ]
251 );
252
253 $this->add_control(
254 'icon_position',
255 [
256 'label' => esc_html__( 'Icon position', 'uicore-elements' ),
257 'type' => Controls_Manager::CHOOSE,
258 'options' => [
259 'left' => [
260 'title' => esc_html__( 'Left', 'uicore-elements' ),
261 'icon' => 'eicon-h-align-left',
262 ],
263 'top' => [
264 'title' => esc_html__( 'Top', 'uicore-elements' ),
265 'icon' => 'eicon-v-align-top',
266 ],
267 'right' => [
268 'title' => esc_html__( 'Right', 'uicore-elements' ),
269 'icon' => 'eicon-h-align-right',
270 ],
271 ],
272 'default' => 'top',
273 'toggle' => false,
274 'condition' =>[
275 'show_icon' => 'true',
276 'counter_text_inline!' => 'true',
277 ],
278 'prefix_class' => 'ui-e-',
279 'render_type' => 'template',
280 ]
281 );
282
283 $this->add_control(
284 'icon_position_inline',
285 [
286 'label' => esc_html__( 'Icon position', 'uicore-elements' ),
287 'type' => Controls_Manager::CHOOSE,
288 'options' => [
289 'left' => [
290 'title' => esc_html__( 'Left', 'uicore-elements' ),
291 'icon' => 'eicon-h-align-left',
292 ],
293 'right' => [
294 'title' => esc_html__( 'Right', 'uicore-elements' ),
295 'icon' => 'eicon-h-align-right',
296 ],
297 ],
298 'default' => 'left',
299 'toggle' => false,
300 'condition' =>[
301 'show_icon' => 'true',
302 'counter_text_inline' => 'true',
303 ],
304 'prefix_class' => 'ui-e-',
305 'render_type' => 'template',
306 ]
307 );
308
309 $this->add_control(
310 'vertical_align',
311 [
312 'label' => esc_html__( 'Vertical position', 'uicore-elements' ),
313 'type' => Controls_Manager::CHOOSE,
314 'options' => [
315 'start' => [
316 'title' => esc_html__( 'Top', 'uicore-elements' ),
317 'icon' => 'eicon-v-align-top',
318 ],
319 'center' => [
320 'title' => esc_html__( 'Center', 'uicore-elements' ),
321 'icon' => 'eicon-v-align-middle',
322 ],
323 'end' => [
324 'title' => esc_html__( 'Bottom', 'uicore-elements' ),
325 'icon' => 'eicon-v-align-bottom',
326 ],
327 ],
328 'default' => 'center',
329 'toggle' => false,
330 'selectors' => [
331 '{{WRAPPER}} > div' => 'align-items: {{VALUE}};',
332 ],
333 'condition' => [
334 'icon_position!' => ['top'],
335 'counter_text_inline!' => ['true'],
336 ],
337 ]
338 );
339
340 $this->add_control(
341 'vertical_align_inline',
342 [
343 'label' => esc_html__( 'Vertical position', 'uicore-elements' ),
344 'type' => Controls_Manager::CHOOSE,
345 'options' => [
346 'start' => [
347 'title' => esc_html__( 'Top', 'uicore-elements' ),
348 'icon' => 'eicon-v-align-top',
349 ],
350 'center' => [
351 'title' => esc_html__( 'Center', 'uicore-elements' ),
352 'icon' => 'eicon-v-align-middle',
353 ],
354 'end' => [
355 'title' => esc_html__( 'Bottom', 'uicore-elements' ),
356 'icon' => 'eicon-v-align-bottom',
357 ],
358 ],
359 'default' => 'center',
360 'toggle' => false,
361 'selectors' => [
362 '{{WRAPPER}} > div' => 'align-items: {{VALUE}};',
363 ],
364 'condition' => [
365 'counter_text_inline' => ['true'],
366 ],
367 ]
368 );
369
370 $this->add_control(
371 'text_align',
372 [
373 'label' => esc_html__( 'Text Align', 'uicore-elements' ),
374 'type' => Controls_Manager::CHOOSE,
375 'options' => [
376 'left' => [
377 'title' => esc_html__( 'Left', 'uicore-elements' ),
378 'icon' => 'eicon-text-align-left',
379 ],
380 'center' => [
381 'title' => esc_html__( 'Center', 'uicore-elements' ),
382 'icon' => 'eicon-text-align-center',
383 ],
384 'right' => [
385 'title' => esc_html__( 'Right', 'uicore-elements' ),
386 'icon' => 'eicon-text-align-right',
387 ],
388 ],
389 'toggle' => false,
390 'default' => 'center',
391 'prefix_class' => 'ui-e-align-',
392 'selectors' => [
393 '{{WRAPPER}} .ui-e-title' => 'text-align: {{VALUE}};',
394 '{{WRAPPER}} .ui-e-ico' => 'text-align: {{VALUE}};',
395 ],
396
397 ]
398 );
399
400 $this->add_control(
401 'icon_offset_toggle',
402 [
403 'label' => esc_html__( 'Icon Offset', 'uicore-elements' ),
404 'type' => Controls_Manager::POPOVER_TOGGLE,
405 'label_off' => esc_html__( 'Default', 'uicore-elements' ),
406 'label_on' => esc_html__( 'Custom', 'uicore-elements' ),
407 'return_value' => 'yes',
408 'condition' => [
409 'show_icon' => 'true',
410 'counter_text_inline!' => 'true',
411 ],
412 ]
413 );
414
415 $this->start_popover();
416
417 $this->add_responsive_control(
418 'icon_vertical_offset',
419 [
420 'label' => esc_html__( 'Vertical offset', 'uicore-elements' ),
421 'type' => Controls_Manager::SLIDER,
422 'size_units' => ['px'],
423 'range' => [
424 'px' => [
425 'min' => -100,
426 'max' => 100,
427 'step' => 1,
428 ],
429 ],
430 'default' => [
431 'unit' => 'px',
432 'size' => 0,
433 ],
434 'condition' => [
435 'counter_text_inline!' => 'true',
436 'icon_offset_toggle' => 'yes',
437 ],
438 'selectors' => [
439 '{{WRAPPER}}' => '--ui-e-ico-vertical-off: {{SIZE}}{{UNIT}};',
440 ],
441 ]
442 );
443
444 $this->add_responsive_control(
445 'icon_horizontal_offset',
446 [
447 'label' => esc_html__( 'Horizontal offset', 'uicore-elements' ),
448 'type' => Controls_Manager::SLIDER,
449 'size_units' => ['px'],
450 'range' => [
451 'px' => [
452 'min' => -100,
453 'max' => 100,
454 'step' => 1,
455 ],
456 ],
457 'default' => [
458 'unit' => 'px',
459 'size' => 0,
460 ],
461 'condition' => [
462 'counter_text_inline!' => 'true',
463 'icon_offset_toggle' => 'yes',
464 ],
465 'selectors' => [
466 '{{WRAPPER}}' => '--ui-e-ico-horizontal-off: {{SIZE}}{{UNIT}};',
467 ],
468 ]
469 );
470
471 $this->end_popover();
472
473 $this->end_controls_section();
474
475 $this->start_controls_section(
476 'add_op_section',
477 [
478 'label' => __( 'Additional Options', 'uicore-elements' ),
479 'tab' => Controls_Manager::TAB_CONTENT,
480 ]
481 );
482
483 $this->add_control(
484 'use_grouping',
485 [
486 'label' => esc_html__( 'Use Grouping', 'uicore-elements' ),
487 'type' => Controls_Manager::SWITCHER,
488 'label_on' => esc_html__( 'True', 'uicore-elements' ),
489 'label_off' => esc_html__( 'False', 'uicore-elements' ),
490 'return_value' => 'true',
491 'default' => 'true',
492 'frontend_available' => true,
493 'condition' =>[
494 'counter_animation!' => ['motion'],
495 ],
496 ]
497 );
498
499 $this->add_control(
500 'counter_separator',
501 [
502 'label' => esc_html__( 'Thousand symbol', 'uicore-elements' ),
503 'type' => Controls_Manager::TEXT,
504 'default' => esc_html__( ',', 'uicore-elements' ),
505 'condition' =>[
506 'use_grouping' => 'true',
507 'counter_animation!' => ['motion'],
508 ],
509 'ai' => [
510 'active' => false,
511 ],
512 'frontend_available' => true,
513 ]
514 );
515
516 $this->add_control(
517 'decimal_places',
518 [
519 'label' => esc_html__( 'Decimal Places', 'uicore-elements' ),
520 'type' => Controls_Manager::NUMBER,
521 'min' => 0,
522 'max' => 4,
523 'step' => 1,
524 'default' => 0,
525 'ai' => [
526 'active' => false,
527 ],
528 'frontend_available' => true,
529 'condition' => [
530 'counter_animation!' => ['motion'],
531 ],
532 ]
533 );
534
535 $this->add_control(
536 'decimal_symbol',
537 [
538 'label' => esc_html__( 'Decimal Symbol', 'uicore-elements' ),
539 'type' => Controls_Manager::TEXT,
540 'default' => esc_html__( '.', 'uicore-elements' ),
541 'condition' =>[
542 'counter_animation!' => ['motion'],
543 ],
544 'ai' => [
545 'active' => false,
546 ],
547 'frontend_available' => true,
548 ]
549 );
550
551 $this->add_control(
552 'counter_prefix',
553 [
554 'label' => esc_html__( 'Counter Prefix', 'uicore-elements' ),
555 'type' => Controls_Manager::TEXT,
556 'default' => esc_html__( '', 'uicore-elements' ),
557 'placeholder' => esc_html__( '$', 'uicore-elements' ),
558 'ai' => [
559 'active' => false,
560 ],
561 ]
562 );
563
564 $this->add_control(
565 'counter_suffix',
566 [
567 'label' => esc_html__( 'Counter Suffix', 'uicore-elements' ),
568 'type' => Controls_Manager::TEXT,
569 'default' => esc_html__( '', 'uicore-elements' ),
570 'placeholder' => esc_html__( '+', 'uicore-elements' ),
571 'ai' => [
572 'active' => false,
573 ],
574 'frontend_available' => true,
575 ]
576 );
577
578 $this->end_controls_section();
579
580 $this->start_controls_section(
581 'icon_image_section',
582 [
583 'label' => __( 'Icon/Image', 'uicore-elements' ),
584 'tab' => Controls_Manager::TAB_STYLE,
585 'condition' => [
586 'show_icon' => 'true',
587 ],
588 ]
589 );
590
591 $this->start_controls_tabs(
592 'style_tabs'
593 );
594
595 $this->start_controls_tab(
596 'icon_colors',
597 [
598 'label' => esc_html__( 'Normal', 'uicore-elements' ),
599 ]
600 );
601
602 $this->add_control(
603 'icon_color',
604 [
605 'label' => esc_html__( 'Icon color', 'uicore-elements' ),
606 'type' => Controls_Manager::COLOR,
607 'condition' => [
608 'icon_type!' => 'image',
609 ],
610 'selectors' => [
611 '{{WRAPPER}} .ui-e-offset > svg' => 'fill:{{VALUE}};',
612 '{{WRAPPER}} .ui-e-offset > i' => 'color: {{VALUE}};',
613 ],
614
615 ]
616 );
617
618 $this->add_group_control(
619 Group_Control_Background::get_type(),
620 [
621 'name' => 'icon_background',
622 'types' => [ 'classic', 'gradient', 'video' ],
623 'selector' => '{{WRAPPER}} .ui-e-ico .ui-e-offset',
624 ]
625 );
626
627 $this->end_controls_tab();
628
629 $this->start_controls_tab(
630 'icon_colors_hover',
631 [
632 'label' => esc_html__( 'Hover', 'uicore-elements' ),
633 ]
634 );
635
636 $this->add_control(
637 'icon_color_hover',
638 [
639 'label' => esc_html__( 'Icon color', 'uicore-elements' ),
640 'type' => Controls_Manager::COLOR,
641 'condition' => [
642 'icon_type!' => 'image',
643 ],
644 'selectors' => [
645 '{{WRAPPER}} > div:hover .ui-e-offset > svg' => 'fill:{{VALUE}};',
646 '{{WRAPPER}} > div:hover .ui-e-offset > i' => 'color: {{VALUE}};',
647 ],
648
649 ]
650 );
651
652 $this->add_group_control(
653 Group_Control_Background::get_type(),
654 [
655 'name' => 'icon_background_hover',
656 'types' => [ 'classic', 'gradient', 'video' ],
657 'selector' => '{{WRAPPER}} > div:hover .ui-e-offset',
658
659 ]
660 );
661
662 $this->add_control(
663 'border_color_hover',
664 [
665 'label' => esc_html__( 'Border Color', 'uicore-elements' ),
666 'type' => Controls_Manager::COLOR,
667 'selectors' => [
668 '{{WRAPPER}} > div:hover .ui-e-offset' => 'border-color: {{VALUE}}',
669 ],
670 ]
671 );
672
673 $this->end_controls_tab();
674
675 $this->end_controls_tabs();
676
677 $this->add_control(
678 'hr',
679 [
680 'type' => Controls_Manager::DIVIDER,
681 ]
682 );
683
684 $this->add_responsive_control(
685 'icon_padding',
686 [
687 'label' => esc_html__( 'Padding', 'uicore-elements' ),
688 'type' => Controls_Manager::DIMENSIONS,
689 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
690 'range' => [
691 'px' => [
692 'min' => 0,
693 'max' => 10,
694 'step' => 1,
695 ],
696 '%' => [
697 'min' => 0,
698 'max' => 20,
699 ],
700 ],
701 'default' => [
702 'unit' => 'px',
703 'size' => 25,
704 ],
705 'selectors' => [
706 '{{WRAPPER}} .ui-e-offset' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
707 ],
708
709 ]
710 );
711
712 $this->add_group_control(
713 Group_Control_Border::get_type(),
714 [
715 'name' => 'icon_border',
716 'selector' => '{{WRAPPER}} .ui-e-offset',
717
718 ]
719 );
720
721 $this->add_responsive_control(
722 'icon_radius',
723 [
724 'label' => esc_html__( 'Border Radius', 'uicore-elements' ),
725 'type' => Controls_Manager::DIMENSIONS,
726 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
727 'default' => [
728 'unit' => 'px',
729 'size' => 100,
730 ],
731 'selectors' => [
732 '{{WRAPPER}} .ui-e-offset' => 'border-top-left-radius: {{TOP}}{{UNIT}}; border-top-right-radius:{{RIGHT}}{{UNIT}}; border-bottom-right-radius:{{BOTTOM}}{{UNIT}}; border-bottom-left-radius:{{LEFT}}{{UNIT}};',
733 ],
734
735 ]
736 );
737
738 $this->add_group_control(
739 Group_Control_Box_Shadow::get_type(),
740 [
741 'name' => 'icon_shadow',
742 'selector' => '{{WRAPPER}} .ui-e-offset',
743
744 ]
745 );
746
747 $this->add_responsive_control(
748 'icon_space',
749 [
750 'label' => esc_html__( 'Icon Space', 'uicore-elements' ),
751 'type' => Controls_Manager::SLIDER,
752 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
753 'range' => [
754 'px' => [
755 'min' => 0,
756 'max' => 60,
757 'step' => 1,
758 ],
759 '%' => [
760 'min' => 0,
761 'max' => 20,
762 ],
763 ],
764 'default' => [
765 'unit' => 'px',
766 'size' => 8,
767 ],
768 'selectors' => [
769 '{{WRAPPER}}' => '--ui-e-ico-spacing: {{SIZE}}{{UNIT}}',
770 ],
771
772 ]
773 );
774
775 $this->add_control(
776 'image_fullwidth',
777 [
778 'label' => esc_html__( 'Image fullwidth', 'uicore-elements' ),
779 'type' => Controls_Manager::SWITCHER,
780 'label_on' => esc_html__( 'True', 'uicore-elements' ),
781 'label_off' => esc_html__( 'False', 'uicore-elements' ),
782 'return_value' => 'true',
783 'default' => 'false',
784 'condition' => [
785 'icon_type' => 'image',
786 ],
787 'selectors' => [
788 '{{WRAPPER}} .ui-e-offset > *' => 'width: 100%;',
789
790 ],
791 ]
792 );
793
794 $this->add_responsive_control(
795 'image_size',
796 [
797 'label' => esc_html__( 'Image Size', 'uicore-elements' ),
798 'type' => Controls_Manager::SLIDER,
799 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
800 'range' => [
801 'px' => [
802 'min' => 0,
803 'max' => 991,
804 'step' => 1,
805 ],
806 '%' => [
807 'min' => 0,
808 'max' => 100,
809 ],
810 ],
811 'default' => [
812 'unit' => 'px',
813 'size' => 120,
814 ],
815 'condition' => [
816 'icon_type' => 'image',
817 'image_fullwidth!' => 'true',
818 ],
819 'selectors' => [
820 '{{WRAPPER}} .ui-e-offset > *' => 'width: {{SIZE}}{{UNIT}};',
821
822 ],
823 ]
824 );
825
826 $this->add_responsive_control(
827 'icon_size',
828 [
829 'label' => esc_html__( 'Icon Size', 'uicore-elements' ),
830 'type' => Controls_Manager::SLIDER,
831 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
832 'range' => [
833 'px' => [
834 'min' => 8,
835 'max' => 160,
836 'step' => 1,
837 ],
838 '%' => [
839 'min' => 0,
840 'max' => 100,
841 ],
842 ],
843 'default' => [
844 'unit' => 'px',
845 'size' => 40,
846 ],
847 'condition' => [
848 'icon_type' => 'icon',
849 ],
850 'selectors' => [
851 '{{WRAPPER}}' => '--ui-e-icon-size:{{SIZE}}{{UNIT}}',
852 ],
853 ]
854 );
855
856 $this->end_controls_section();
857
858 $this->start_controls_section(
859 'counter_number_section',
860 [
861 'label' => __( 'Number', 'uicore-elements' ),
862 'tab' => Controls_Manager::TAB_STYLE,
863 ]
864 );
865
866 $this->add_responsive_control(
867 'counter_number_space',
868 [
869 'label' => esc_html__( 'Number space', 'uicore-elements' ),
870 'type' => Controls_Manager::SLIDER,
871 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
872 'range' => [
873 'px' => [
874 'min' => 0,
875 'max' => 100,
876 'step' => 1,
877 ],
878 '%' => [
879 'min' => 0,
880 'max' => 100,
881 ],
882 ],
883 'default' => [
884 'unit' => 'px',
885 'size' => 0,
886 ],
887 'selectors' => [
888 '{{WRAPPER}}' => '--ui-e-num-spacing: {{SIZE}}{{UNIT}};',
889 ],
890
891 ]
892 );
893
894 $this->start_controls_tabs(
895 'counter_tabs'
896 );
897
898 $this->start_controls_tab(
899 'counter_color_normal',
900 [
901 'label' => esc_html__( 'Normal', 'uicore-elements' ),
902 ]
903 );
904
905 $this->add_control(
906 'counter_number_color',
907 [
908 'label' => esc_html__( 'Number Color', 'uicore-elements' ),
909 'type' => Controls_Manager::COLOR,
910 'selectors' => [
911 '{{WRAPPER}} .ui-e-num' => 'color: {{VALUE}}',
912 '{{WRAPPER}}' => '--ui-e-num-color: {{VALUE}}',
913 ],
914 ]
915 );
916
917 $this->end_controls_tab();
918
919 $this->start_controls_tab(
920 'counter_color_hover',
921 [
922 'label' => esc_html__( 'Hover', 'uicore-elements' ),
923 ]
924 );
925
926 $this->add_control(
927 'counter_number_color_hover',
928 [
929 'label' => esc_html__( 'Number Color', 'uicore-elements' ),
930 'type' => Controls_Manager::COLOR,
931 'selectors' => [
932 '{{WRAPPER}} > div:hover .ui-e-num' => 'color: {{VALUE}}',
933 ],
934 ]
935 );
936
937 $this->end_controls_tab();
938
939 $this->end_controls_tabs();
940
941 $this->add_group_control(
942 Group_Control_Typography::get_type(),
943 [
944 'name' => 'counter_number_typography',
945 'selector' => '{{WRAPPER}} .ui-e-num',
946 ]
947 );
948
949 $this->end_controls_section();
950
951 $this->start_controls_section(
952 'suffix_prefix_section',
953 [
954 'label' => __( 'Suffix/Prefix', 'uicore-elements' ),
955 'tab' => Controls_Manager::TAB_STYLE,
956 ]
957 );
958
959 $this->add_control(
960 'suffix_prefix_color',
961 [
962 'label' => esc_html__( 'Color', 'uicore-elements' ),
963 'type' => Controls_Manager::COLOR,
964 'selectors' => [
965 '{{WRAPPER}} .ui-e-prefix, {{WRAPPER}} .ui-e-suffix' => 'color: {{VALUE}}',
966 ],
967 ]
968 );
969 $this->add_group_control(
970 Group_Control_Typography::get_type(),
971 [
972 'name' => 'suffix_prefix_typography',
973 'selector' => '{{WRAPPER}} .ui-e-prefix, {{WRAPPER}} .ui-e-suffix',
974 ]
975 );
976
977 $this->start_controls_tabs(
978 'prefix_suffix_tabs'
979 );
980
981 $this->start_controls_tab(
982 'prefix_tab',
983 [
984 'label' => esc_html__( 'Prefix', 'uicore-elements' ),
985 ]
986 );
987
988 $this->add_responsive_control(
989 'prefix_h_offset',
990 [
991 'label' => esc_html__( 'Horizontal Offset', 'uicore-elements' ),
992 'type' => Controls_Manager::SLIDER,
993 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
994 'range' => [
995 'px' => [
996 'min' => -200,
997 'max' => 200,
998 'step' => 1,
999 ],
1000 '%' => [
1001 'min' => -100,
1002 'max' => 100,
1003 ],
1004 ],
1005 'default' => [
1006 'unit' => 'px',
1007 'size' => 0,
1008 ],
1009 ]
1010 );
1011 $this->add_responsive_control(
1012 'prefix_v_offset',
1013 [
1014 'label' => esc_html__( 'Vertical Offset', 'uicore-elements' ),
1015 'type' => Controls_Manager::SLIDER,
1016 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
1017 'range' => [
1018 'px' => [
1019 'min' => -80,
1020 'max' => 80,
1021 'step' => 1,
1022 ],
1023 '%' => [
1024 'min' => -100,
1025 'max' => 100,
1026 ],
1027 ],
1028 'default' => [
1029 'unit' => 'px',
1030 'size' => 0,
1031 ],
1032 'selectors' => [
1033 '{{WRAPPER}} .ui-e-prefix' => 'transform: translate3d( {{prefix_h_offset.SIZE}}{{prefix_h_offset.UNIT}}, {{SIZE}}{{UNIT}}, 0);',
1034 ],
1035 ]
1036 );
1037
1038 $this->end_controls_tab();
1039
1040 $this->start_controls_tab(
1041 'suffix_tab',
1042 [
1043 'label' => esc_html__( 'Suffix', 'uicore-elements' ),
1044 ]
1045 );
1046
1047 $this->add_responsive_control(
1048 'suffix_h_offset',
1049 [
1050 'label' => esc_html__( 'Horizontal Offset', 'uicore-elements' ),
1051 'type' => Controls_Manager::SLIDER,
1052 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
1053 'range' => [
1054 'px' => [
1055 'min' => -200,
1056 'max' => 200,
1057 'step' => 1,
1058 ],
1059 '%' => [
1060 'min' => -100,
1061 'max' => 100,
1062 ],
1063 ],
1064 'default' => [
1065 'unit' => 'px',
1066 'size' => 0,
1067 ],
1068 ]
1069 );
1070 $this->add_responsive_control(
1071 'suffix_v_offset',
1072 [
1073 'label' => esc_html__( 'Vertical Offset', 'uicore-elements' ),
1074 'type' => Controls_Manager::SLIDER,
1075 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
1076 'range' => [
1077 'px' => [
1078 'min' => -80,
1079 'max' => 80,
1080 'step' => 1,
1081 ],
1082 '%' => [
1083 'min' => -100,
1084 'max' => 100,
1085 ],
1086 ],
1087 'default' => [
1088 'unit' => 'px',
1089 'size' => 0,
1090 ],
1091 'selectors' => [
1092 '{{WRAPPER}} .ui-e-suffix' => 'transform: translate3d( {{suffix_h_offset.SIZE}}{{suffix_h_offset.UNIT}}, {{SIZE}}{{UNIT}}, 0);',
1093 ],
1094 ]
1095 );
1096
1097 $this->end_controls_tab();
1098
1099 $this->end_controls_tabs();
1100
1101 $this->end_controls_section();
1102
1103 $this->start_controls_section(
1104 'content_text_section',
1105 [
1106 'label' => __( 'Text', 'uicore-elements' ),
1107 'tab' => Controls_Manager::TAB_STYLE,
1108 ]
1109 );
1110
1111 $this->start_controls_tabs(
1112 'content_text_tabs'
1113 );
1114
1115 $this->start_controls_tab(
1116 'content_text_normal',
1117 [
1118 'label' => esc_html__( 'Normal', 'uicore-elements' ),
1119 ]
1120 );
1121
1122 $this->add_control(
1123 'content_text_color',
1124 [
1125 'label' => esc_html__( 'Text Color', 'uicore-elements' ),
1126 'type' => Controls_Manager::COLOR,
1127 'selectors' => [
1128 '{{WRAPPER}} .ui-e-title' => 'color: {{VALUE}}',
1129 ],
1130 ]
1131 );
1132
1133 $this->end_controls_tab();
1134
1135 $this->start_controls_tab(
1136 'content_text_hover',
1137 [
1138 'label' => esc_html__( 'Hover', 'uicore-elements' ),
1139 ]
1140 );
1141
1142 $this->add_control(
1143 'content_text_color_hover',
1144 [
1145 'label' => esc_html__( 'Text Color', 'uicore-elements' ),
1146 'type' => Controls_Manager::COLOR,
1147 'selectors' => [
1148 '{{WRAPPER}} > div:hover .ui-e-title' => 'color: {{VALUE}}',
1149 ],
1150 ]
1151 );
1152
1153 $this->end_controls_tab();
1154
1155 $this->end_controls_tabs();
1156
1157 $this->add_group_control(
1158 Group_Control_Typography::get_type(),
1159 [
1160 'name' => 'content_text_typography',
1161 'selector' => '{{WRAPPER}} .ui-e-title',
1162 ]
1163 );
1164
1165 $this->end_controls_section();
1166
1167 $this->start_controls_section(
1168 'additional_section',
1169 [
1170 'label' => __( 'Additional', 'uicore-elements' ),
1171 'tab' => Controls_Manager::TAB_STYLE,
1172 ]
1173 );
1174
1175 $this->add_responsive_control(
1176 'content_padding',
1177 [
1178 'label' => esc_html__( 'Content Padding', 'uicore-elements' ),
1179 'type' => Controls_Manager::DIMENSIONS,
1180 'size_units' => [ 'px', '%', 'em', 'rem', 'custom' ],
1181 'range' => [
1182 'px' => [
1183 'min' => 0,
1184 'max' => 80,
1185 'step' => 5,
1186 ],
1187 '%' => [
1188 'min' => 0,
1189 'max' => 100,
1190 ],
1191 ],
1192 'default' => [
1193 'unit' => 'px',
1194 'size' => 15,
1195 ],
1196 'selectors' => [
1197 '{{WRAPPER}} > div' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1198 ],
1199 ]
1200 );
1201
1202 $this->end_controls_section();
1203
1204 $this->start_controls_section(
1205 'animation_section',
1206 [
1207 'label' => __( 'Animations', 'uicore-elements' ),
1208 'tab' => Controls_Manager::TAB_STYLE,
1209 ]
1210 );
1211
1212 $this->add_control(
1213 'counter_animation',
1214 [
1215 'label' => esc_html__( 'Number animation', 'uicore-elements' ),
1216 'type' => Controls_Manager::SELECT,
1217 'default' => 'simple',
1218 'options' => [
1219 'simple' => esc_html__( 'Simple', 'uicore-elements' ),
1220 'odometer' => esc_html__( 'Odometer', 'uicore-elements' ),
1221 'motion' => esc_html__( 'Motion Blur', 'uicore-elements' ),
1222 ],
1223 'frontend_available' => true,
1224 'prefix_class' => 'ui-e-counter-',
1225 'render_type' => 'template',
1226 ]
1227 );
1228 $this->add_control(
1229 'duration',
1230 [
1231 'label' => esc_html__( 'Duration (in seconds)', 'uicore-elements' ),
1232 'type' => Controls_Manager::NUMBER,
1233 'min' => 0.1,
1234 'max' => 8.0,
1235 'step' => 0.1,
1236 'default' => 2.5,
1237 'condition' => [
1238 'counter_animation!' => 'motion',
1239 ],
1240 'frontend_available' => true,
1241 ]
1242 );
1243 $this->add_control(
1244 'motion_heading',
1245 [
1246 'label' => esc_html__( 'Motion Durations (in ms)', 'textdomain' ),
1247 'type' => Controls_Manager::HEADING,
1248 'condition' => [
1249 'counter_animation' => 'motion',
1250 ],
1251 'separator' => 'before',
1252 ]
1253 );
1254 $this->add_control(
1255 'motion_translate_duration',
1256 [
1257 'label' => esc_html__( 'Numbers translate', 'uicore-elements' ),
1258 'type' => Controls_Manager::NUMBER,
1259 'min' => 0.1,
1260 'max' => 8.0,
1261 'step' => 0.1,
1262 'default' => 0.32,
1263 'condition' => [
1264 'counter_animation' => 'motion',
1265 ],
1266 'selectors' => [
1267 '{{WRAPPER}}' => '--ui-e-motion-translate: {{VALUE}}s;',
1268 ],
1269 ]
1270 );
1271 $this->add_control(
1272 'motion_opacity_duration',
1273 [
1274 'label' => esc_html__( 'Numbers opacity', 'uicore-elements' ),
1275 'type' => Controls_Manager::NUMBER,
1276 'min' => 0.1,
1277 'max' => 8.0,
1278 'step' => 0.1,
1279 'default' => 0.2,
1280 'condition' => [
1281 'counter_animation' => 'motion',
1282 ],
1283 'selectors' => [
1284 '{{WRAPPER}}' => '--ui-e-motion-opacity: {{VALUE}}s;',
1285 ],
1286 ]
1287 );
1288 $this->add_control(
1289 'motion_blur_duration',
1290 [
1291 'label' => esc_html__( 'Blur effect', 'uicore-elements' ),
1292 'type' => Controls_Manager::NUMBER,
1293 'min' => 0.1,
1294 'max' => 8.0,
1295 'step' => 0.1,
1296 'default' => 0.36,
1297 'condition' => [
1298 'counter_animation' => 'motion',
1299 ],
1300 'selectors' => [
1301 '{{WRAPPER}}' => '--ui-e-motion-blur: {{VALUE}}s;',
1302 ],
1303 ]
1304 );
1305 $this->add_control(
1306 'motion_delay',
1307 [
1308 'label' => esc_html__( 'Delay between numbers', 'uicore-elements' ),
1309 'type' => Controls_Manager::NUMBER,
1310 'min' => 0.1,
1311 'max' => 8.0,
1312 'step' => 0.1,
1313 'default' => 0.2,
1314 'condition' => [
1315 'counter_animation' => 'motion',
1316 ],
1317 'selectors' => [
1318 '{{WRAPPER}}' => '--ui-e-motion-delay: {{VALUE}}s;',
1319 ],
1320 ]
1321 );
1322 $this->add_control(
1323 'animate_suffix',
1324 [
1325 'label' => esc_html__( 'Animate suffix', 'uicore-elements' ),
1326 'type' => Controls_Manager::SWITCHER,
1327 'label_on' => esc_html__( 'True', 'uicore-elements' ),
1328 'label_off' => esc_html__( 'False', 'uicore-elements' ),
1329 'return_value' => 'true',
1330 'frontend_available' => true,
1331 'description' => esc_html__('Add the suffix to the Odometer animation, but removes any suffix custom styling.', 'uicore-elements' ),
1332 'condition' =>[
1333 'counter_animation' => ['odometer'],
1334 ],
1335 ]
1336 );
1337
1338 $this->end_controls_section();
1339 }
1340 protected function render()
1341 {
1342
1343 $settings = $this->get_settings_for_display();
1344
1345 $icon_type = $settings['icon_type'];
1346 $num_tag = $settings['counter_html_tag'];
1347 $txt_tag = $settings['content_html_tag'];
1348 $prefix = $settings['counter_prefix'];
1349 $suffix = $settings['counter_suffix'];
1350 $media = $settings['show_icon'] ? true : false; // Check if media is enabled,
1351
1352 if ($media) {
1353 switch($icon_type){
1354 case 'icon' : $icon = $settings['selected_icon']; break;
1355 case 'image' : $icon = $settings['image']; break;
1356 }
1357 $icon_width = ($icon_type == 'image' && $settings['image_fullwidth'] == 'true') ? esc_attr('large') : esc_attr('thumbnail');
1358 }
1359
1360 $stack = $settings['counter_text_inline'] ? false : true; // If text inline, no stack wrapper between elements is needed
1361 $title = !empty($settings['content_text']) ?
1362 '<' . esc_html($txt_tag) . ' class="ui-e-title">' . wp_kses_data($settings['content_text']) . '</' . esc_html($txt_tag) . '>' :
1363 "<!-- no title -->";
1364 $html = '<' . esc_html($num_tag) . ' class="ui-e-num">';
1365
1366 // Motion animation markup
1367 if ($settings['counter_animation'] == 'motion'){
1368 $value = $settings['count_number'];
1369 $numbers = str_split($value);
1370
1371 foreach ($numbers as $n => $value) {
1372 $index = 'style="--index:' . $n . '"';
1373
1374 // prefix
1375 if ( $n === 0 && !empty($prefix) ) {
1376 $html .= '<span class="ui-e-prefix" ' . $index . '>' . esc_html($prefix) . '</span>';
1377 }
1378
1379 // number
1380 $html .= '<span ' . $index . '>' . esc_html($value). ' </span>';
1381
1382 // suffix
1383 if ($n === count($numbers) - 1 && !empty($suffix)) {
1384 $html .= '<span class="ui-e-suffix" ' . $index . '>' . esc_html($suffix) . '</span>';
1385 }
1386 }
1387
1388 // Default markup
1389 }else{
1390 $html .= '<span class="ui-e-prefix">' . $prefix . '</span>';
1391 $html .= '<span class="value"> 0 </span>';
1392 $html .= $settings['animate_suffix'] == 'true' ? '' : '<span class="ui-e-suffix">' . $suffix . '</span>'; // Suffix might be animated by Odometer animation
1393 }
1394
1395 $html .= '</' . esc_html($num_tag) . '>';
1396
1397 // Build the widget HTML
1398 if($media) : ?>
1399 <div class="ui-e-ico">
1400 <div class="ui-e-offset">
1401 <?php if($icon_type == 'icon') {
1402 Icons_Manager::render_icon( $icon, [ 'aria-hidden' => 'true' ] );
1403 } else {
1404 echo wp_get_attachment_image( $icon['id'], $icon_width );
1405 } ?>
1406 </div>
1407 </div>
1408 <?php endif;
1409
1410 if($stack) {
1411 ?> <div class="ui-e-wrp"> <?php
1412 }
1413 echo wp_kses_post($html . $title);
1414 if($stack) {
1415 ?> </div> <?php
1416 }
1417 }
1418
1419 }
1420 \Elementor\Plugin::instance()->widgets_manager->register(new Counter());