PluginProbe
UiCore Elements – Free widgets and templates for Elementor / 1.0.16
UiCore Elements – Free widgets and templates for Elementor v1.0.16
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.16, at includes/widgets/counter.php

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