PluginProbe
UiCore Elements – Free widgets and templates for Elementor / 1.2.1
UiCore Elements – Free widgets and templates for Elementor v1.2.1
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 / utils / carousel-component.php

carousel-component.php in UiCore Elements – Free widgets and templates for Elementor 1.2.1, at includes/utils/carousel-component.php

1,827 lines 51.8 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 namespace UiCoreElements\Utils;
3
4 use Elementor\Controls_Manager;
5 use Elementor\Group_Control_Border;
6 use Elementor\Group_Control_Typography;
7 use Elementor\Group_Control_Box_Shadow;
8 use Elementor\Icons_Manager;
9 use Elementor\Plugin;
10
11 if ( ! defined( 'ABSPATH' ) ) {
12 exit; // Exit if accessed directly
13 }
14
15 /*
16 * Carousel / Slider Component Trait
17 */
18
19 trait Carousel_Trait {
20
21 /**
22 * Sets all navigation conditions in one place
23 *
24 * @param string $type Control name
25 * @param array|null $extras (Optional) Terms attributes. ['name' => 'control, 'operator' => '==', 'value' => 'yes'], [..]
26 * @param string|null $relation (Optional) Accepts 'or' & 'and' values. Default is 'and'
27 * @return array Elementor API Conditions
28 */
29 function nav_conditions($type, $extras = false, $relation = 'and')
30 {
31 if ($type == 'arrows') {
32 $options = ['arrows', 'arrows-dots', 'arrows-fraction'];
33 } elseif ($type == 'dots') {
34 $options = ['dots', 'arrows-dots'];
35 } elseif ($type == 'fraction') {
36 $options = ['fraction', 'arrows-fraction'];
37 }
38
39 $conditions['terms'][] = [
40 'name' => 'navigation',
41 'operator' => 'in',
42 'value' => $options,
43 ];
44
45 // Marquee animation style does not support navigation
46 $conditions['terms'][] = [
47 'name' => 'animation_style',
48 'operator' => '!=',
49 'value' => 'marquee',
50 ];
51
52 $conditions['relation'] = $relation;
53
54 // Check for extra conditions
55 if($extras != false){
56 foreach ($extras as $extra){
57 $conditions['terms'][] = $extra;
58 }
59 }
60
61 return $conditions;
62 }
63
64 /**
65 * Returns the Carousel/Slider widget scripts.
66 *
67 * @param bool $use_entrance If the entrance script should be enqueued or not. Default is `true`.
68 * @param array $extra_conditions Extra conditions to be added to the scripts.
69 *
70 * @return array The array of scripts for the widget.
71 */
72 function TRAIT_get_carousel_scripts($use_entrance = true, $extra_conditions = null) {
73
74 $base = [ 'carousel' ];
75
76 // Add extra conditions to carousel script if requested
77 if( isset($extra_conditions) ){
78 $base['carousel'] = ['condition' => []];
79
80 foreach ($extra_conditions as $key => $value){
81 $base['carousel']['condition'][$key] = $value;
82 }
83 }
84
85 if($use_entrance) {
86 $base['entrance'] = [
87 'condition' => [
88 'animate_items' => 'ui-e-grid-animate'
89 ],
90 ];
91 }
92
93 // Specific Slider scripts
94 if( strpos($this->get_name(), 'slide') !== false ){
95 $type = [
96 'stacked-carousel' => [
97 'condition' => [
98 'animation_style' => 'stacked',
99 ]
100 ],
101 // TODO: move out and pass as extra
102 'circular-avatar-carousel' => [
103 'condition' => [
104 'animation_style' => 'circular_avatar',
105 ]
106 ]
107 ];
108
109 // Specific Carousel scripts - if is not slider, is Carousel :)
110 } else {
111 $type = [
112 'special-effects' => [
113 'condition' => [
114 'animation_style' => ['fade_blur', 'circular']
115 ]
116 ]
117 ];
118 }
119
120 // Merge and return the scripts
121 return array_merge($base, $type);
122 }
123
124 // Navigation Controls
125 function TRAIT_register_navigation_controls()
126 {
127
128 $this->start_controls_section(
129 'section_content_navigation',
130 [
131 'label' => __('Navigation', 'uicore-elements'),
132 ]
133 );
134
135 $this->add_control(
136 'navigation',
137 [
138 'label' => __('Navigation', 'uicore-elements'),
139 'type' => Controls_Manager::SELECT,
140 'default' => 'arrows-dots',
141 'options' => [
142 'arrows' => esc_html__('Arrows', 'uicore-elements'),
143 'dots' => esc_html__('Dots', 'uicore-elements'),
144 'fraction' => esc_html__('Fractions', 'uicore-elements'),
145 'arrows-dots' => esc_html__('Arrows and Dots', 'uicore-elements'),
146 'arrows-fraction' => esc_html__('Arrows and Fraction', 'uicore-elements'),
147 'none' => esc_html__('None', 'uicore-elements'),
148 ],
149 'label_block' => true,
150 'render_type' => 'template',
151 'frontend_available' => true,
152 'condition' => [
153 'animation_style!' => 'marquee',
154 ],
155 ]
156 );
157 $this->add_control(
158 'marquee_warning',
159 [
160 'type' => Controls_Manager::RAW_HTML,
161 'raw' => esc_html__( 'Marquee animation does not support navigation.', 'uicore-elements' ),
162 'content_classes' => 'elementor-panel-alert elementor-panel-alert-warning',
163 'condition' => [
164 'animation_style' => 'marquee',
165 ],
166 ]
167 );
168 $this->add_control(
169 'hr_arrows',
170 [
171 'label' => esc_html__( 'Arrows', 'uicore-elements' ),
172 'type' => Controls_Manager::HEADING,
173 'separator' => 'before',
174 'conditions' => $this->nav_conditions('arrows'),
175 ]
176 );
177 $this->start_controls_tabs(
178 'arrows_tabs'
179 );
180
181 $this->start_controls_tab(
182 'previous_tab',
183 [
184 'label' => esc_html__( 'Previous', 'uicore-elements' ),
185 'conditions' => $this->nav_conditions('arrows'),
186 ]
187 );
188
189 $this->add_control(
190 'previous_arrow',
191 [
192 'label' => esc_html__( 'Previous Arrow Icon', 'uicore-elements' ),
193 'type' => Controls_Manager::ICONS,
194 'default' => [
195 'value' => 'fas fa-arrow-left',
196 'library' => 'fa-solid',
197 ],
198 'recommended' => [
199 'fa-solid' => [
200 'arrow-alt-circle-left',
201 'caret-square-left',
202 'angle-double-left',
203 'angle-left',
204 'arrow-alt-circle-left',
205 'arrow-left',
206 'caret-left',
207 'caret-square-left',
208 'chevron-circle-left',
209 'chevron-left',
210 'long-arrow-alt-left'
211 ]
212 ],
213 'label_block' => false,
214 'skin' => 'inline',
215 'conditions' => $this->nav_conditions('arrows'),
216 ]
217 );
218 $this->add_responsive_control(
219 'previous_arrow_h_position',
220 [
221 'label' => __('Horizontal Orientation', 'uicore-elements'),
222 'type' => Controls_Manager::CHOOSE,
223 'options' => [
224 'left: 0; right: auto;' => [
225 'title' => __('Left', 'uicore-elements'),
226 'icon' => 'eicon-h-align-left',
227 ],
228 'left: 0; right: 0; margin: auto;' => [
229 'title' => __('Center', 'uicore-elements'),
230 'icon' => 'eicon-h-align-center',
231 ],
232 'left: auto; right: 0;' => [
233 'title' => __('Right', 'uicore-elements'),
234 'icon' => 'eicon-h-align-right',
235 ],
236 ],
237 'default' => 'left: 0; right: auto;',
238 'selectors' => [
239 '{{WRAPPER}} .ui-e-previous' => '{{VALUE}};'
240 ],
241 'conditions' => $this->nav_conditions('arrows'),
242 ]
243 );
244 $this->add_responsive_control(
245 'previous_arrow_v_position',
246 [
247 'label' => __('Vertical Orientation', 'uicore-elements'),
248 'type' => Controls_Manager::CHOOSE,
249 'options' => [
250 'top: 0; bottom: auto;' => [
251 'title' => __('Top', 'uicore-elements'),
252 'icon' => 'eicon-v-align-top',
253 ],
254 'top: 0; bottom: 0; margin: auto;' => [
255 'title' => __('Center', 'uicore-elements'),
256 'icon' => 'eicon-v-align-middle',
257 ],
258 'top: auto; bottom: 0' => [
259 'title' => __('Bottom', 'uicore-elements'),
260 'icon' => 'eicon-v-align-bottom',
261 ],
262 ],
263 'selectors' => [
264 '{{WRAPPER}} .ui-e-previous' => '{{VALUE}};'
265 ],
266 'default' => 'top: 0; bottom: 0; margin: auto;',
267 'conditions' => $this->nav_conditions('arrows'),
268 ]
269 );
270 $this->add_control(
271 'previous_advanced_position',
272 [
273 'label' => esc_html__( 'Arrow Offset', 'uicore-elements' ),
274 'type' => Controls_Manager::POPOVER_TOGGLE,
275 'label_off' => esc_html__( 'Default', 'uicore-elements' ),
276 'label_on' => esc_html__( 'Custom', 'uicore-elements' ),
277 'return_value' => 'yes',
278 'conditions' => $this->nav_conditions('arrows'),
279 ]
280 );
281 $this->start_popover();
282
283 $this->add_responsive_control(
284 'prev_arrow_h_offset',
285 [
286 'label' => esc_html__( 'Horizontal Offset', 'uicore-elements' ),
287 'type' => Controls_Manager::SLIDER,
288 'size_units' => [ 'px', '%',],
289 'range' => [
290 'px' => [
291 'min' => -200,
292 'max' => 200,
293 'step' => 5,
294 ],
295 '%' => [
296 'min' => -100,
297 'max' => 100,
298 ],
299 ],
300 'selectors' => [
301 '{{WRAPPER}}' => '--ui-e-prev-arrow-h-off:{{SIZE}}{{UNIT}};',
302 ],
303 'condition' => [
304 'previous_advanced_position' => 'yes'
305 ]
306 ]
307 );
308 $this->add_responsive_control(
309 'prev_arrow_v_offset',
310 [
311 'label' => esc_html__( 'Vertical Offset', 'uicore-elements' ),
312 'type' => Controls_Manager::SLIDER,
313 'size_units' => [ 'px', '%',],
314 'range' => [
315 'px' => [
316 'min' => -200,
317 'max' => 200,
318 'step' => 5,
319 ],
320 '%' => [
321 'min' => -100,
322 'max' => 100,
323 ],
324 ],
325 'selectors' => [
326 '{{WRAPPER}}' => '--ui-e-prev-arrow-v-off:{{SIZE}}{{UNIT}};',
327 ],
328 'condition' => [
329 'previous_advanced_position' => 'yes'
330 ]
331 ]
332 );
333 $this->add_responsive_control(
334 'prev_arrow_rotate',
335 [
336 'label' => esc_html__( 'Rotation', 'uicore-elements' ),
337 'type' => Controls_Manager::SLIDER,
338 'size_units' => ['px'],
339 'range' => [
340 'px' => [
341 'min' => 0,
342 'max' => 360,
343 'step' => 5,
344 ],
345 ],
346 'selectors' => [
347 '{{WRAPPER}} .ui-e-previous > *' => 'rotate:{{SIZE}}deg;',
348 ],
349 'condition' => [
350 'previous_advanced_position' => 'yes'
351 ]
352 ]
353 );
354
355 $this->end_popover();
356
357 $this->end_controls_tab();
358
359 $this->start_controls_tab(
360 'next_tab',
361 [
362 'label' => esc_html__( 'Next', 'uicore-elements' ),
363 'conditions' => $this->nav_conditions('arrows'),
364 ]
365 );
366
367 $this->add_control(
368 'next_arrow',
369 [
370 'label' => esc_html__( 'Previous Arrow Icon', 'uicore-elements' ),
371 'type' => Controls_Manager::ICONS,
372 'default' => [
373 'value' => 'fas fa-arrow-right',
374 'library' => 'fa-solid',
375 ],
376 'recommended' => [
377 'fa-solid' => [
378 'arrow-alt-circle-right',
379 'caret-square-right',
380 'angle-double-right',
381 'angle-right',
382 'arrow-alt-circle-right',
383 'arrow-right',
384 'caret-right',
385 'caret-square-right',
386 'chevron-circle-right',
387 'chevron-right',
388 'long-arrow-alt-right'
389 ]
390 ],
391 'label_block' => false,
392 'skin' => 'inline',
393 'conditions' => $this->nav_conditions('arrows'),
394 ]
395 );
396 $this->add_responsive_control(
397 'next_arrow_h_position',
398 [
399 'label' => __('Horizontal Orientation', 'uicore-elements'),
400 'type' => Controls_Manager::CHOOSE,
401 'options' => [
402 'left: 0; right: auto;' => [
403 'title' => __('Left', 'uicore-elements'),
404 'icon' => 'eicon-h-align-left',
405 ],
406 'left: 0; right: 0; margin: auto;' => [
407 'title' => __('Center', 'uicore-elements'),
408 'icon' => 'eicon-h-align-center',
409 ],
410 'left: auto; right: 0;' => [
411 'title' => __('Right', 'uicore-elements'),
412 'icon' => 'eicon-h-align-right',
413 ],
414 ],
415 'default' => 'left: auto; right: 0;',
416 'selectors' => [
417 '{{WRAPPER}} .ui-e-next' => '{{VALUE}};'
418 ],
419 'conditions' => $this->nav_conditions('arrows'),
420 ]
421 );
422 $this->add_responsive_control(
423 'next_arrow_v_position',
424 [
425 'label' => __('Vertical Orientation', 'uicore-elements'),
426 'type' => Controls_Manager::CHOOSE,
427 'options' => [
428 'top: 0; bottom: auto;' => [
429 'title' => __('Top', 'uicore-elements'),
430 'icon' => 'eicon-v-align-top',
431 ],
432 'top: 0; bottom: 0; margin: auto;' => [
433 'title' => __('Center', 'uicore-elements'),
434 'icon' => 'eicon-v-align-middle',
435 ],
436 'top: auto; bottom: 0' => [
437 'title' => __('Bottom', 'uicore-elements'),
438 'icon' => 'eicon-v-align-bottom',
439 ],
440 ],
441 'selectors' => [
442 '{{WRAPPER}} .ui-e-next' => '{{VALUE}};'
443 ],
444 'default' => 'top: 0; bottom: 0; margin: auto;',
445 'conditions' => $this->nav_conditions('arrows'),
446 ]
447 );
448 $this->add_control(
449 'next_advanced_position',
450 [
451 'label' => esc_html__( 'Arrow Offset', 'uicore-elements' ),
452 'type' => Controls_Manager::POPOVER_TOGGLE,
453 'label_off' => esc_html__( 'Default', 'uicore-elements' ),
454 'label_on' => esc_html__( 'Custom', 'uicore-elements' ),
455 'return_value' => 'yes',
456 'conditions' => $this->nav_conditions('arrows'),
457 ]
458 );
459 $this->start_popover();
460 $this->add_responsive_control(
461 'next_arrow_h_offset',
462 [
463 'label' => esc_html__( 'Horizontal Offset', 'uicore-elements' ),
464 'type' => Controls_Manager::SLIDER,
465 'size_units' => [ 'px', '%',],
466 'range' => [
467 'px' => [
468 'min' => -200,
469 'max' => 200,
470 'step' => 5,
471 ],
472 '%' => [
473 'min' => -100,
474 'max' => 100,
475 ],
476 ],
477 'selectors' => [
478 '{{WRAPPER}}' => '--ui-e-next-arrow-h-off:{{SIZE}}{{UNIT}};',
479 ],
480 'condition' => [
481 'next_advanced_position' => 'yes'
482 ]
483 ]
484 );
485 $this->add_responsive_control(
486 'next_arrow_v_offset',
487 [
488 'label' => esc_html__( 'Vertical Offset', 'uicore-elements' ),
489 'type' => Controls_Manager::SLIDER,
490 'size_units' => [ 'px', '%',],
491 'range' => [
492 'px' => [
493 'min' => -200,
494 'max' => 200,
495 'step' => 5,
496 ],
497 '%' => [
498 'min' => -100,
499 'max' => 100,
500 ],
501 ],
502 'selectors' => [
503 '{{WRAPPER}}' => '--ui-e-next-arrow-v-off:{{SIZE}}{{UNIT}};',
504 ],
505 'condition' => [
506 'next_advanced_position' => 'yes'
507 ]
508 ]
509 );
510 $this->add_responsive_control(
511 'next_arrow_rotate',
512 [
513 'label' => esc_html__( 'Rotation', 'uicore-elements' ),
514 'type' => Controls_Manager::SLIDER,
515 'size_units' => ['px'],
516 'range' => [
517 'px' => [
518 'min' => 0,
519 'max' => 360,
520 'step' => 5,
521 ],
522 ],
523 'selectors' => [
524 '{{WRAPPER}} .ui-e-next > *' => 'rotate:{{SIZE}}deg;',
525 ],
526 'condition' => [
527 'previous_advanced_position' => 'yes'
528 ]
529 ]
530 );
531
532 $this->end_popover();
533
534 $this->end_controls_tab();
535
536 $this->end_controls_tabs();
537
538 $this->add_control(
539 'arrows_mobile',
540 [
541 'label' => esc_html__( 'Hide arrows on Mobile', 'uicore-elements' ),
542 'type' => Controls_Manager::SWITCHER,
543 'default' => 'yes',
544 'selectors' => [
545 '(mobile){{WRAPPER}} .ui-e-button' => 'display: none',
546 ],
547 'conditions' => $this->nav_conditions('arrows'),
548 ]
549 );
550
551 $this->add_control(
552 'hr_fraction',
553 [
554 'label' => esc_html__( 'Fraction', 'uicore-elements' ),
555 'type' => Controls_Manager::HEADING,
556 'separator' => 'before',
557 'conditions' => $this->nav_conditions('fraction'),
558 ]
559 );
560 $this->add_responsive_control(
561 'fraction_h_position',
562 [
563 'label' => __('Horizontal Orientation', 'uicore-elements'),
564 'type' => Controls_Manager::CHOOSE,
565 'options' => [
566 'left: 0; right: auto;' => [
567 'title' => __('Left', 'uicore-elements'),
568 'icon' => 'eicon-h-align-left',
569 ],
570 'left: 0; right: 0; margin: auto;' => [
571 'title' => __('Center', 'uicore-elements'),
572 'icon' => 'eicon-h-align-center',
573 ],
574 'left: auto; right: 0;' => [
575 'title' => __('Right', 'uicore-elements'),
576 'icon' => 'eicon-h-align-right',
577 ],
578 ],
579 'default' => 'left: 0; right: auto;',
580 'selectors' => [
581 '{{WRAPPER}} .ui-e-fraction' => '{{VALUE}};'
582 ],
583 'conditions' => $this->nav_conditions('fraction'),
584 ]
585 );
586 $this->add_responsive_control(
587 'fraction_v_position',
588 [
589 'label' => __('Vertical Orientation', 'uicore-elements'),
590 'type' => Controls_Manager::CHOOSE,
591 'options' => [
592 'top: -25px; bottom: auto;' => [
593 'title' => __('Top', 'uicore-elements'),
594 'icon' => 'eicon-v-align-top',
595 ],
596 'top: 0; bottom: 0; margin: auto;' => [
597 'title' => __('Center', 'uicore-elements'),
598 'icon' => 'eicon-v-align-middle',
599 ],
600 'top: auto; bottom: -25px;' => [
601 'title' => __('Bottom', 'uicore-elements'),
602 'icon' => 'eicon-v-align-bottom',
603 ],
604 ],
605 'selectors' => [
606 '{{WRAPPER}} .ui-e-fraction' => '{{VALUE}};'
607 ],
608 'default' => 'bottom: -25px;',
609 'conditions' => $this->nav_conditions('fraction'),
610 ]
611 );
612 $this->add_control(
613 'fraction_offset_toggle',
614 [
615 'label' => esc_html__( 'Fraction Offset', 'uicore-elements' ),
616 'type' => Controls_Manager::POPOVER_TOGGLE,
617 'label_off' => esc_html__( 'Default', 'uicore-elements' ),
618 'label_on' => esc_html__( 'Custom', 'uicore-elements' ),
619 'return_value' => 'yes',
620 'conditions' => $this->nav_conditions('fraction'),
621 ]
622 );
623 $this->start_popover();
624 $this->add_responsive_control(
625 'fraction_h_offset',
626 [
627 'label' => esc_html__( 'Horizontal Offset', 'uicore-elements' ),
628 'type' => Controls_Manager::SLIDER,
629 'size_units' => [ 'px', '%',],
630 'range' => [
631 'px' => [
632 'min' => -80,
633 'max' => 80,
634 'step' => 5,
635 ],
636 '%' => [
637 'min' => -100,
638 'max' => 100,
639 ],
640 ],
641 'selectors' => [
642 '{{WRAPPER}}' => '--ui-e-fraction-h-off:{{SIZE}}{{UNIT}};',
643 ],
644 'condition' => [
645 'fraction_offset_toggle' => 'yes'
646 ]
647 ]
648 );
649 $this->add_responsive_control(
650 'fraction_v_offset',
651 [
652 'label' => esc_html__( 'Vertical Offset', 'uicore-elements' ),
653 'type' => Controls_Manager::SLIDER,
654 'size_units' => [ 'px', '%',],
655 'range' => [
656 'px' => [
657 'min' => -80,
658 'max' => 80,
659 'step' => 5,
660 ],
661 '%' => [
662 'min' => -100,
663 'max' => 100,
664 ],
665 ],
666 'selectors' => [
667 '{{WRAPPER}}' => '--ui-e-fraction-v-off:{{SIZE}}{{UNIT}};',
668 ],
669 'condition' => [
670 'fraction_offset_toggle' => 'yes'
671 ]
672 ]
673 );
674
675 $this->end_popover();
676
677 $this->add_control(
678 'hr_dots',
679 [
680 'label' => esc_html__( 'Dots', 'uicore-elements' ),
681 'type' => Controls_Manager::HEADING,
682 'separator' => 'before',
683 'conditions' => $this->nav_conditions('dots'),
684 ]
685 );
686 $this->add_responsive_control(
687 'dots_h_position',
688 [
689 'label' => __('Horizontal Orientation', 'uicore-elements'),
690 'type' => Controls_Manager::CHOOSE,
691 'options' => [
692 'left: 0; right: auto;' => [
693 'title' => __('Left', 'uicore-elements'),
694 'icon' => 'eicon-h-align-left',
695 ],
696 'left: 0; right: 0; margin: auto;' => [
697 'title' => __('Center', 'uicore-elements'),
698 'icon' => 'eicon-h-align-center',
699 ],
700 'left: auto; right: 0;' => [
701 'title' => __('Right', 'uicore-elements'),
702 'icon' => 'eicon-h-align-right',
703 ],
704 ],
705 'default' => 'left: 0; right: 0; margin: auto;',
706 'selectors' => [
707 '{{WRAPPER}} .ui-e-dots' => '{{VALUE}};'
708 ],
709 'conditions' => $this->nav_conditions('dots'),
710 ]
711 );
712 $this->add_responsive_control(
713 'dots_v_position',
714 [
715 'label' => __('Vertical Orientation', 'uicore-elements'),
716 'type' => Controls_Manager::CHOOSE,
717 'options' => [
718 'top: 0px; bottom: auto;' => [
719 'title' => __('Top', 'uicore-elements'),
720 'icon' => 'eicon-v-align-top',
721 ],
722 'top: 0; bottom: 0; margin: auto' => [
723 'title' => __('Center', 'uicore-elements'),
724 'icon' => 'eicon-v-align-middle',
725 ],
726 'top: auto; bottom: 0px;' => [
727 'title' => __('Bottom', 'uicore-elements'),
728 'icon' => 'eicon-v-align-bottom',
729 ],
730 ],
731 'selectors' => [
732 '{{WRAPPER}} .ui-e-dots' => '{{VALUE}}'
733 ],
734 'default' => 'top: auto; bottom: 0px;',
735 'conditions' => $this->nav_conditions('dots'),
736 ]
737 );
738 $this->add_control(
739 'dots_advanced',
740 [
741 'label' => esc_html__( 'Dots Offset', 'uicore-elements' ),
742 'type' => Controls_Manager::POPOVER_TOGGLE,
743 'label_off' => esc_html__( 'Default', 'uicore-elements' ),
744 'label_on' => esc_html__( 'Custom', 'uicore-elements' ),
745 'return_value' => 'yes',
746 'conditions' => $this->nav_conditions('dots'),
747 ]
748 );
749 $this->start_popover();
750 $this->add_responsive_control(
751 'dots_h_offset',
752 [
753 'label' => esc_html__( 'Horizontal Offset', 'uicore-elements' ),
754 'type' => Controls_Manager::SLIDER,
755 'size_units' => [ 'px', '%',],
756 'range' => [
757 'px' => [
758 'min' => -100,
759 'max' => 100,
760 'step' => 5,
761 ],
762 '%' => [
763 'min' => -100,
764 'max' => 100,
765 ],
766 ],
767 'selectors' => [
768 '{{WRAPPER}}' => '--ui-e-dots-h-off:{{SIZE}}{{UNIT}};',
769 ],
770 'condition' => [
771 'dots_advanced' => 'yes'
772 ]
773 ]
774 );
775 $this->add_responsive_control(
776 'dots_v_offset',
777 [
778 'label' => esc_html__( 'Vertical Offset', 'uicore-elements' ),
779 'type' => Controls_Manager::SLIDER,
780 'size_units' => [ 'px', '%',],
781 'range' => [
782 'px' => [
783 'min' => -100,
784 'max' => 100,
785 'step' => 5,
786 ],
787 '%' => [
788 'min' => -100,
789 'max' => 100,
790 ],
791 ],
792 'selectors' => [
793 '{{WRAPPER}}' => '--ui-e-dots-v-off:{{SIZE}}{{UNIT}};',
794 ],
795 'condition' => [
796 'dots_advanced' => 'yes'
797 ]
798 ]
799 );
800 $this->add_responsive_control(
801 'dots_rotate',
802 [
803 'label' => esc_html__( 'Rotation', 'uicore-elements' ),
804 'type' => Controls_Manager::SLIDER,
805 'size_units' => [ 'px'],
806 'range' => [
807 'px' => [
808 'min' => 0,
809 'max' => 360,
810 'step' => 5,
811 ],
812 ],
813 'selectors' => [
814 '{{WRAPPER}} .ui-e-dots' => 'rotate: {{SIZE}}deg;',
815 ],
816 'condition' => [
817 'dots_advanced' => 'yes'
818 ]
819 ]
820 );
821 $this->end_popover();
822
823 $this->end_controls_section();
824 }
825 function TRAIT_register_carousel_settings_controls()
826 {
827 $this->add_control(
828 'animation_style',
829 [
830 'label' => __('Animation', 'uicore-elements'),
831 'type' => Controls_Manager::SELECT,
832 'default' => 'circular',
833 'options' => [
834 'circular' => esc_html__('Circular', 'uicore-elements'),
835 'fade_blur' => esc_html__('Fade Blur', 'uicore-elements'),
836 'marquee' => esc_html__('Marquee', 'uicore-elements'),
837 'default' => esc_html__('Default', 'uicore-elements'),
838 ],
839 'prefix_class' => 'ui-e-animation-',
840 'render_type' => 'template',
841 'frontend_available' => true,
842 ]
843 );
844 $this->add_responsive_control(
845 'slides_per_view',
846 [
847 'label' => __( 'Slides per View', 'uicore-elements' ),
848 'type' => Controls_Manager::SELECT,
849 'desktop_default' => 3,
850 'tablet_default' => 2,
851 'mobile_default' => 1,
852 'options' => [
853 1 => '1',
854 2 => '2',
855 3 => '3',
856 4 => '4',
857 5 => '5',
858 6 => '6',
859 7 => '7',
860 8 => '8',
861 ],
862 'render_type' => 'template',
863 'frontend_available' => true,
864 'condition' => [
865 'animation_style!' => ['horizontal']
866 ]
867 ]
868 );
869 $this->add_control(
870 'show_hidden',
871 [
872 'label' => esc_html__( 'Show Hidden Items', 'uicore-elements' ),
873 'type' => \Elementor\Controls_Manager::SELECT,
874 'default' => 'hidden',
875 'options' => [
876 'hidden' => esc_html__( 'Hidden', 'uicore-elements' ),
877 'left' => esc_html__( 'Show Left', 'uicore-elements' ),
878 'right' => esc_html__( 'Show Right', 'uicore-elements' ),
879 ],
880 'condition' => [
881 'animation_style' => ['fade_blur', 'circular']
882 ],
883 'frontend_available' => true,
884 ]
885 );
886 $this->add_control(
887 'center_slides',
888 [
889 'label' => esc_html__('Center Slides', 'uicore-elements'),
890 'type' => Controls_Manager::SWITCHER,
891 'return_value' => 'true',
892 'condition' => [
893 'animation_style!' => 'marquee',
894 ],
895 'frontend_available' => true,
896 ]
897 );
898 $this->add_control(
899 'marquee_speed',
900 [
901 'label' => esc_html__('Marquee Speed', 'uicore-elements'),
902 'type' => Controls_Manager::NUMBER,
903 'default' => 5000,
904 'min' => 100,
905 'max' => 10000,
906 'step' => 100,
907 'condition' => [
908 'animation_style' => 'marquee',
909 ],
910 'frontend_available' => true,
911 ]
912 );
913 $this->add_control(
914 'fade_edges',
915 [
916 'label' => __('Fade Edges', 'uicore-elements'),
917 'type' => Controls_Manager::SWITCHER,
918 'prefix_class' => 'ui-e-fade-edges-',
919 ]
920 );
921 $this->add_control(
922 'fade_edge_opacity',
923 [
924 'label' => esc_html__( 'Fade opacity', 'uicore-elements' ),
925 'type' => Controls_Manager::NUMBER,
926 'default' => 0.35,
927 'min' => 0,
928 'max' => 1,
929 'step' => 0.05,
930 'condition' => [
931 'fade_edges' => 'yes',
932 ],
933 'selectors' => [
934 '{{WRAPPER}}' => '--ui-e-fade-edge-alpha: {{VALUE}};',
935 ],
936 ]
937 );
938 $this->add_control(
939 'fade_edge_deep',
940 [
941 'label' => esc_html__( 'Fade deepening', 'uicore-elements' ),
942 'type' => Controls_Manager::NUMBER,
943 'default' => 30,
944 'min' => 0,
945 'max' => 50,
946 'step' => 5,
947 'condition' => [
948 'fade_edges' => 'yes',
949 ],
950 'selectors' => [
951 '{{WRAPPER}}' => '--ui-e-fade-edge-deep: {{VALUE}}%;',
952 ],
953 ]
954 );
955 $this->add_control(
956 'autoplay',
957 [
958 'label' => __('Autoplay', 'uicore-elements'),
959 'type' => Controls_Manager::SWITCHER,
960 'return_value' => 'yes',
961 'condition' => [
962 'animation_style!' => 'marquee',
963 ],
964 'frontend_available' => true,
965 ]
966 );
967 $this->add_control(
968 'autoplay_speed',
969 [
970 'label' => esc_html__('Autoplay Speed', 'uicore-elements'),
971 'type' => Controls_Manager::NUMBER,
972 'default' => 5000,
973 'min' => 100,
974 'max' => 10000,
975 'step' => 100,
976 'condition' => [
977 'autoplay' => 'yes',
978 'animation_style!' => 'marquee',
979 ],
980 'frontend_available' => true,
981 ]
982 );
983 $this->add_control(
984 'pause_on_hover',
985 [
986 'label' => esc_html__('Pause on Hover', 'uicore-elements'),
987 'type' => Controls_Manager::SWITCHER,
988 'return_value' => 'true',
989 'separator' => 'after',
990 'condition' => [
991 'autoplay' => 'yes',
992 'animation_style!' => 'marquee',
993 ],
994 'frontend_available' => true,
995 ]
996 );
997 $this->add_control(
998 'grab_cursor',
999 [
1000 'label' => __('Grab Cursor', 'uicore-elements'),
1001 'type' => Controls_Manager::SWITCHER,
1002 'default' => 'yes',
1003 'condition' => [
1004 'animation_style!' => 'marquee',
1005 ],
1006 'frontend_available' => true,
1007 ]
1008 );
1009 $this->add_control(
1010 'loop',
1011 [
1012 'label' => __('Loop', 'uicore-elements'),
1013 'type' => Controls_Manager::SWITCHER,
1014 'default' => 'true',
1015 'return_value' => 'true',
1016 'condition' => [
1017 'animation_style!' => 'marquee',
1018 ],
1019 'frontend_available' => true,
1020 ]
1021 );
1022 $this->add_control(
1023 'overflow_container',
1024 [
1025 'label' => esc_html__( 'Overflow Container', 'uicore-elements' ),
1026 'type' => \Elementor\Controls_Manager::HIDDEN,
1027 'default' => Plugin::$instance->experiments->is_feature_active('container') ? 'container' : 'column',
1028 'frontend_available' => true, // return on the JS the container type (flexbox or column) for overflow
1029 ]
1030 );
1031 $this->add_control(
1032 'observer',
1033 [
1034 'label' => __('Observer', 'uicore-elements'),
1035 'description' => __('Use it when the carousel is placed in a hidden place (ex: tab, accordion).', 'uicore-elements'),
1036 'type' => Controls_Manager::SWITCHER,
1037 'return_value' => 'yes',
1038 'frontend_available' => true,
1039 ]
1040 );
1041 }
1042 //Navigation Style Controls
1043 function TRAIT_register_navigation_style_controls()
1044 {
1045
1046 $this->start_controls_section(
1047 'section_style_navigation',
1048 [
1049 'label' => esc_html__('Navigation', 'uicore-elements'),
1050 'tab' => Controls_Manager::TAB_STYLE,
1051 'conditions' => [
1052 'terms' => [
1053 [
1054 'name' => 'navigation',
1055 'operator' => '!=',
1056 'value' => '',
1057 ],
1058 ],
1059 ],
1060 ]
1061 );
1062
1063 $this->add_control(
1064 'arrows_heading',
1065 [
1066 'label' => __('Arrows', 'uicore-elements'),
1067 'type' => Controls_Manager::HEADING,
1068 'conditions' => $this->nav_conditions('arrows'),
1069 ]
1070 );
1071
1072 $this->start_controls_tabs('tabs_navigation_arrows_style');
1073
1074 $this->start_controls_tab(
1075 'tabs_nav_arrows_normal',
1076 [
1077 'label' => __('Normal', 'uicore-elements'),
1078 'conditions' => $this->nav_conditions('arrows'),
1079 ]
1080 );
1081
1082 $this->add_control(
1083 'arrows_color',
1084 [
1085 'label' => __('Color', 'uicore-elements'),
1086 'type' => Controls_Manager::COLOR,
1087 'selectors' => [
1088 '{{WRAPPER}} .ui-e-button i' => 'color: {{VALUE}}',
1089 '{{WRAPPER}} .ui-e-button svg' => 'fill: {{VALUE}}',
1090 ],
1091 'conditions' => $this->nav_conditions('arrows'),
1092 ]
1093 );
1094 $this->add_control(
1095 'arrows_background',
1096 [
1097 'label' => __('Background', 'uicore-elements'),
1098 'type' => Controls_Manager::COLOR,
1099 'selectors' => [
1100 '{{WRAPPER}} .ui-e-button' => 'background-color: {{VALUE}}',
1101 ],
1102 'conditions' => $this->nav_conditions('arrows'),
1103 ]
1104 );
1105 $this->add_group_control(
1106 Group_Control_Border::get_type(),
1107 [
1108 'name' => 'nav_arrows_border',
1109 'selector' => '{{WRAPPER}} .ui-e-button',
1110 'conditions' => $this->nav_conditions('arrows'),
1111 ]
1112 );
1113 $this->add_control(
1114 'arrows_radius',
1115 [
1116 'label' => __('Border Radius', 'uicore-elements'),
1117 'type' => Controls_Manager::DIMENSIONS,
1118 'size_units' => ['px', '%'],
1119 'selectors' => [
1120 '{{WRAPPER}} .ui-e-button' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1121 ],
1122 'conditions' => $this->nav_conditions('arrows'),
1123 ]
1124 );
1125 $this->add_control(
1126 'arrows_padding',
1127 [
1128 'label' => esc_html__('Padding', 'uicore-elements'),
1129 'type' => Controls_Manager::DIMENSIONS,
1130 'size_units' => ['px', 'em', '%'],
1131 'selectors' => [
1132 '{{WRAPPER}} .ui-e-button' => 'padding: {{TOP}}{{UNIT || 0}} {{RIGHT}}{{UNIT || 0}} {{BOTTOM}}{{UNIT || 0}} {{LEFT}}{{UNIT || 0}};',
1133 ],
1134 'conditions' => $this->nav_conditions('arrows'),
1135 ]
1136 );
1137 $this->add_responsive_control(
1138 'arrows_size',
1139 [
1140 'label' => __('Size', 'uicore-elements'),
1141 'type' => Controls_Manager::SLIDER,
1142 'range' => [
1143 'px' => [
1144 'min' => 10,
1145 'max' => 100,
1146 ],
1147 ],
1148 'default' => [
1149 'size' => 16,
1150 'unit' => 'px'
1151 ],
1152 'selectors' => [
1153 '{{WRAPPER}} .ui-e-button i' => 'font-size: {{SIZE}}{{UNIT}}; width: {{SIZE}}{{UNIT}}; height: {{SIZE}}{{UNIT}};',
1154 '{{WRAPPER}} .ui-e-button svg' => 'width: {{SIZE}}{{UNIT}};height: {{SIZE}}{{UNIT}};',
1155 ],
1156 'conditions' => $this->nav_conditions('arrows'),
1157 ]
1158 );
1159 $this->add_group_control(
1160 Group_Control_Box_Shadow::get_type(),
1161 [
1162 'name' => 'arrows_box_shadow',
1163 'selector' => '{{WRAPPER}} .ui-e-button',
1164 'conditions' => $this->nav_conditions('arrows'),
1165 ]
1166 );
1167
1168 $this->end_controls_tab();
1169
1170 $this->start_controls_tab(
1171 'tabs_nav_arrows_hover',
1172 [
1173 'label' => __('Hover', 'uicore-elements'),
1174 'conditions' => $this->nav_conditions('arrows'),
1175 ]
1176 );
1177
1178 $this->add_control(
1179 'arrows_hover_color',
1180 [
1181 'label' => __('Color', 'uicore-elements'),
1182 'type' => Controls_Manager::COLOR,
1183 'selectors' => [
1184 '{{WRAPPER}} .ui-e-button:hover i' => 'color: {{VALUE}}',
1185 '{{WRAPPER}} .ui-e-button:hover svg' => 'fill: {{VALUE}}',
1186 ],
1187 'conditions' => $this->nav_conditions('arrows'),
1188 ]
1189 );
1190 $this->add_control(
1191 'arrows_hover_background',
1192 [
1193 'label' => __('Background', 'uicore-elements'),
1194 'type' => Controls_Manager::COLOR,
1195 'selectors' => [
1196 '{{WRAPPER}} .ui-e-button:hover' => 'background-color: {{VALUE}}',
1197
1198 ],
1199 'conditions' => $this->nav_conditions('arrows'),
1200 ]
1201 );
1202 $this->add_control(
1203 'nav_arrows_hover_border_color',
1204 [
1205 'label' => __('Border Color', 'uicore-elements'),
1206 'type' => Controls_Manager::COLOR,
1207 'selectors' => [
1208 '{{WRAPPER}} .ui-e-button:hover' => 'border-color: {{VALUE}};',
1209 ],
1210 'conditions' => $this->nav_conditions('arrows'),
1211 ]
1212 );
1213 $this->add_group_control(
1214 Group_Control_Box_Shadow::get_type(),
1215 [
1216 'name' => 'arrows_hover_box_shadow',
1217 'selector' => '{{WRAPPER}} .ui-e-button:hover',
1218 'conditions' => $this->nav_conditions('arrows'),
1219 ]
1220 );
1221
1222 $this->end_controls_tab();
1223
1224 $this->end_controls_tabs();
1225
1226 $this->add_control(
1227 'hr_1',
1228 [
1229 'type' => Controls_Manager::DIVIDER,
1230 'conditions' => $this->nav_conditions('dots'),
1231 ]
1232 );
1233 $this->add_control(
1234 'dots_heading',
1235 [
1236 'label' => __('Dots', 'uicore-elements'),
1237 'type' => Controls_Manager::HEADING,
1238 'conditions' => $this->nav_conditions('dots'),
1239 ]
1240 );
1241
1242 $this->start_controls_tabs('tabs_navigation_dots_style');
1243
1244 $this->start_controls_tab(
1245 'tabs_nav_dots_normal',
1246 [
1247 'label' => __('Normal', 'uicore-elements'),
1248 'conditions' => $this->nav_conditions('dots'),
1249 ]
1250 );
1251
1252 $this->add_control(
1253 'dots_color',
1254 [
1255 'label' => __('Color', 'uicore-elements'),
1256 'type' => Controls_Manager::COLOR,
1257 'selectors' => [
1258 '{{WRAPPER}} .ui-e-dots .dot' => 'background-color: {{VALUE}}',
1259 ],
1260 'conditions' => $this->nav_conditions('dots'),
1261 ]
1262 );
1263 $this->add_control(
1264 'dots_space_between',
1265 [
1266 'label' => __('Space Between Dots', 'uicore-elements'),
1267 'type' => Controls_Manager::SLIDER,
1268 'selectors' => [
1269 '{{WRAPPER}} .ui-e-dots .dot' => 'margin: 0 {{SIZE}}{{UNIT}};',
1270 ],
1271 'range' => [
1272 'px' =>[
1273 'min' => 0,
1274 'max' => 15,
1275 'step' => 1,
1276 ]
1277 ],
1278 'default' => [
1279 'unit' => 'px',
1280 'size' => 8,
1281 ],
1282 'conditions' => $this->nav_conditions('dots'),
1283 ]
1284 );
1285 $this->add_responsive_control(
1286 'dots_size',
1287 [
1288 'label' => __('Size', 'uicore-elements'),
1289 'type' => Controls_Manager::SLIDER,
1290 'range' => [
1291 'px' => [
1292 'min' => 5,
1293 'max' => 20,
1294 ],
1295 ],
1296 'default' => [
1297 'unit' => 'px',
1298 'size' => 8,
1299 ],
1300 'selectors' => [
1301 '{{WRAPPER}} .ui-e-dots .dot' => 'height: {{SIZE}}{{UNIT}}; width: {{SIZE}}{{UNIT}};',
1302 ],
1303 'conditions' => $this->nav_conditions(
1304 'dots',
1305 [
1306 [
1307 'name' => 'advanced_dots_size',
1308 'operator' => '===',
1309 'value' => '',
1310 ]
1311 ]
1312 ),
1313 ]
1314 );
1315 $this->add_control(
1316 'advanced_dots_size',
1317 [
1318 'label' => __('Advanced Size', 'uicore-elements'),
1319 'type' => Controls_Manager::SWITCHER,
1320 'conditions' => $this->nav_conditions('dots'),
1321 ]
1322 );
1323 $this->add_responsive_control(
1324 'advanced_dots_width',
1325 [
1326 'label' => __('Width', 'uicore-elements'),
1327 'type' => Controls_Manager::SLIDER,
1328 'range' => [
1329 'px' => [
1330 'min' => 1,
1331 'max' => 50,
1332 ],
1333 ],
1334 'default' => [
1335 'size' => 6,
1336 'unit' => 'px',
1337 ],
1338 'selectors' => [
1339 '{{WRAPPER}} .ui-e-dots .dot' => 'width: {{SIZE}}{{UNIT}};',
1340 ],
1341 'conditions' => $this->nav_conditions(
1342 'dots',
1343 [
1344 [
1345 'name' => 'advanced_dots_size',
1346 'operator' => '==',
1347 'value' => 'yes',
1348 ]
1349 ]
1350 ),
1351 ]
1352 );
1353 $this->add_responsive_control(
1354 'advanced_dots_height',
1355 [
1356 'label' => __('Height', 'uicore-elements'),
1357 'type' => Controls_Manager::SLIDER,
1358 'range' => [
1359 'px' => [
1360 'min' => 1,
1361 'max' => 50,
1362 ],
1363 ],
1364 'default' => [
1365 'size' => 6,
1366 'unit' => 'px',
1367 ],
1368 'selectors' => [
1369 '{{WRAPPER}} .ui-e-dots .dot' => 'height: {{SIZE}}{{UNIT}};',
1370 ],
1371 'conditions' => $this->nav_conditions(
1372 'dots',
1373 [
1374 [
1375 'name' => 'advanced_dots_size',
1376 'operator' => '==',
1377 'value' => 'yes',
1378 ]
1379 ]
1380 ),
1381 ]
1382 );
1383 $this->add_control(
1384 'advanced_dots_radius',
1385 [
1386 'label' => esc_html__('Border Radius', 'uicore-elements'),
1387 'type' => Controls_Manager::DIMENSIONS,
1388 'size_units' => ['px', '%'],
1389 'selectors' => [
1390 '{{WRAPPER}} .ui-e-dots .dot' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1391 ],
1392 'conditions' => $this->nav_conditions(
1393 'dots',
1394 [
1395 [
1396 'name' => 'advanced_dots_size',
1397 'operator' => '==',
1398 'value' => 'yes',
1399 ]
1400 ]
1401 ),
1402 ]
1403 );
1404 $this->add_group_control(
1405 Group_Control_Box_Shadow::get_type(),
1406 [
1407 'name' => 'dots_box_shadow',
1408 'selector' => '{{WRAPPER}} .ui-e-dots .dot',
1409 'conditions' => $this->nav_conditions('dots'),
1410 ]
1411 );
1412
1413 $this->end_controls_tab();
1414
1415 $this->start_controls_tab(
1416 'tabs_nav_dots_active',
1417 [
1418 'label' => __('Active', 'uicore-elements'),
1419 'conditions' => $this->nav_conditions('dots'),
1420 ]
1421 );
1422
1423 $this->add_control(
1424 'active_dot_color',
1425 [
1426 'label' => __('Color', 'uicore-elements'),
1427 'type' => Controls_Manager::COLOR,
1428 'selectors' => [
1429 '{{WRAPPER}} .ui-e-dots .dot.is-selected' => 'background-color: {{VALUE}}',
1430 ],
1431 'conditions' => $this->nav_conditions('dots'),
1432 ]
1433 );
1434 $this->add_responsive_control(
1435 'active_dots_size',
1436 [
1437 'label' => __('Size', 'uicore-elements'),
1438 'type' => Controls_Manager::SLIDER,
1439 'range' => [
1440 'px' => [
1441 'min' => 5,
1442 'max' => 20,
1443 ],
1444 ],
1445 'selectors' => [
1446 '{{WRAPPER}} .ui-e-dots .dot.is-selected' => 'height: {{SIZE}}{{UNIT}}; width: {{SIZE}}{{UNIT}};',
1447 ],
1448 'conditions' => $this->nav_conditions(
1449 'dots',
1450 [
1451 [
1452 'name' => 'advanced_dots_size',
1453 'operator' => '===',
1454 'value' => '',
1455 ]
1456 ]
1457 ),
1458 ]
1459 );
1460 $this->add_responsive_control(
1461 'active_advanced_dots_width',
1462 [
1463 'label' => __('Width', 'uicore-elements'),
1464 'type' => Controls_Manager::SLIDER,
1465 'range' => [
1466 'px' => [
1467 'min' => 1,
1468 'max' => 50,
1469 ],
1470 ],
1471 'default' => [
1472 'size' => 15,
1473 'unit' => 'px',
1474 ],
1475 'selectors' => [
1476 '{{WRAPPER}} .ui-e-dots .dot.is-selected' => 'width: {{SIZE}}{{UNIT}};',
1477 ],
1478 'conditions' => $this->nav_conditions(
1479 'dots',
1480 [
1481 [
1482 'name' => 'advanced_dots_size',
1483 'operator' => '==',
1484 'value' => 'yes',
1485 ]
1486 ]
1487 ),
1488 ]
1489 );
1490 $this->add_responsive_control(
1491 'active_advanced_dots_height',
1492 [
1493 'label' => __('Height', 'uicore-elements'),
1494 'type' => Controls_Manager::SLIDER,
1495 'range' => [
1496 'px' => [
1497 'min' => 1,
1498 'max' => 50,
1499 ],
1500 ],
1501 'default' => [
1502 'size' => 6,
1503 'unit' => 'px',
1504 ],
1505 'selectors' => [
1506 '{{WRAPPER}} .ui-e-dots .dot.is-selected' => 'height: {{SIZE}}{{UNIT}};',
1507 ],
1508 'conditions' => $this->nav_conditions(
1509 'dots',
1510 [
1511 [
1512 'name' => 'advanced_dots_size',
1513 'operator' => '==',
1514 'value' => 'yes',
1515 ]
1516 ]
1517 ),
1518 ]
1519 );
1520 $this->add_control(
1521 'active_advanced_dots_radius',
1522 [
1523 'label' => esc_html__('Border Radius', 'uicore-elements'),
1524 'type' => Controls_Manager::DIMENSIONS,
1525 'size_units' => ['px', '%'],
1526 'selectors' => [
1527 '{{WRAPPER}} .ui-e-dots .dot.is-selected' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1528 ],
1529 'conditions' => $this->nav_conditions(
1530 'dots',
1531 [
1532 [
1533 'name' => 'advanced_dots_size',
1534 'operator' => '==',
1535 'value' => 'yes',
1536 ]
1537 ]
1538 ),
1539 ]
1540 );
1541 $this->add_group_control(
1542 Group_Control_Box_Shadow::get_type(),
1543 [
1544 'name' => 'dots_active_box_shadow',
1545 'selector' => '{{WRAPPER}} .ui-e-dots .dot.is-selected',
1546 'conditions' => $this->nav_conditions('dots'),
1547 ]
1548 );
1549
1550 $this->end_controls_tab();
1551
1552 $this->end_controls_tabs();
1553
1554 $this->add_control(
1555 'hr_2',
1556 [
1557 'type' => Controls_Manager::DIVIDER,
1558 'conditions' => $this->nav_conditions('fraction'),
1559 ]
1560 );
1561 $this->add_control(
1562 'fraction_heading',
1563 [
1564 'label' => __('Fractions', 'uicore-elements'),
1565 'type' => Controls_Manager::HEADING,
1566 'conditions' => $this->nav_conditions('fraction'),
1567 ]
1568 );
1569 $this->add_control(
1570 'fraction_bg_color',
1571 [
1572 'label' => __('Background Color', 'uicore-elements'),
1573 'type' => Controls_Manager::COLOR,
1574 'selectors' => [
1575 '{{WRAPPER}} .ui-e-fraction' => 'background-color: {{VALUE}}',
1576 ],
1577 'conditions' => $this->nav_conditions('fraction'),
1578 ]
1579 );
1580 $this->add_control(
1581 'fraction_padding',
1582 [
1583 'label' => esc_html__('Padding', 'uicore-elements'),
1584 'type' => Controls_Manager::DIMENSIONS,
1585 'size_units' => ['px', 'em', '%'],
1586 'selectors' => [
1587 '{{WRAPPER}} .ui-e-fraction' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1588 ],
1589 'conditions' => $this->nav_conditions('fraction'),
1590 ]
1591 );
1592 $this->add_control(
1593 'fraction_radius',
1594 [
1595 'label' => esc_html__('Border Radius', 'uicore-elements'),
1596 'type' => Controls_Manager::DIMENSIONS,
1597 'size_units' => ['px', 'em', '%'],
1598 'selectors' => [
1599 '{{WRAPPER}} .ui-e-fraction' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1600 ],
1601 'conditions' => $this->nav_conditions('fraction'),
1602 ]
1603 );
1604 $this->add_group_control(
1605 Group_Control_Border::get_type(),
1606 [
1607 'name' => 'fraction_border',
1608 'selector' => '{{WRAPPER}} .ui-e-fraction',
1609 'conditions' => $this->nav_conditions('fraction'),
1610 ]
1611 );
1612 $this->add_control(
1613 'fraction_color',
1614 [
1615 'label' => __('Color', 'uicore-elements'),
1616 'type' => Controls_Manager::COLOR,
1617 'selectors' => [
1618 '{{WRAPPER}} .ui-e-fraction, {{WRAPPER}} .ui-e-fraction .ui-e-total' => 'color: {{VALUE}}',
1619 ],
1620 'conditions' => $this->nav_conditions('fraction'),
1621 ]
1622 );
1623 $this->add_control(
1624 'active_fraction_color',
1625 [
1626 'label' => __('Active Color', 'uicore-elements'),
1627 'type' => Controls_Manager::COLOR,
1628 'selectors' => [
1629 '{{WRAPPER}} .ui-e-fraction .swiper-pagination-current' => 'color: {{VALUE}}',
1630 ],
1631 'conditions' => $this->nav_conditions('fraction'),
1632 ]
1633 );
1634 $this->add_group_control(
1635 Group_Control_Typography::get_type(),
1636 [
1637 'name' => 'fraction_typography',
1638 'label' => esc_html__('Typography', 'uicore-elements'),
1639 'selector' => '{{WRAPPER}} .ui-e-fraction span, {{WRAPPER}} .ui-e-fraction',
1640 'conditions' => $this->nav_conditions('fraction'),
1641 ]
1642 );
1643
1644 $this->end_controls_section();
1645 }
1646 /**
1647 * Register Additional Controls that might change depending on the widget
1648 *
1649 * @param bool $is_slider - Enable specific slider control(s)
1650 */
1651 function TRAIT_register_carousel_additional_controls($is_slider = false)
1652 {
1653 $this->add_responsive_control(
1654 'carousel_gap',
1655 [
1656 'label' => __('Item Gap', 'uicore-elements'),
1657 'type' => Controls_Manager::SLIDER,
1658 'default' => [
1659 'size' => 20,
1660 ],
1661 'range' => [
1662 'px' => [
1663 'min' => 0,
1664 'max' => 100,
1665 ],
1666 ],
1667 'frontend_available' => true,
1668 ]
1669 );
1670 $this->add_control(
1671 'match_height',
1672 [
1673 'label' => __('Match Item Height', 'uicore-elements'),
1674 'type' => Controls_Manager::SWITCHER,
1675 'default' => 'yes',
1676 'prefix_class' => 'ui-e-match-height-',
1677 'selectors' => [
1678 '{{WRAPPER}} .ui-e-wrp' => 'height: auto',
1679 '{{WRAPPER}} .ui-e-animations-wrp, {{WRAPPER}} .ui-e-item' => 'height: 100%'
1680 ]
1681 ]
1682 );
1683 if($is_slider) {
1684 $this->add_control(
1685 'slider_height',
1686 [
1687 'label' => __('Slide Height', 'uicore-elements'),
1688 'type' => Controls_Manager::SLIDER,
1689 'size_units' => [ 'px', '%', 'em', 'rem' ],
1690 'range' => [
1691 'px' => [
1692 'min' => 80,
1693 'max' => 1000,
1694 ],
1695 ],
1696 'selectors' => [
1697 '{{WRAPPER}} .ui-e-wrp' => 'height: {{SIZE}}{{UNIT}}; max-height: {{SIZE}}{{UNIT}}',
1698 '{{WRAPPER}} .ui-e-item' => 'height: {{SIZE}}{{UNIT}}; max-height: {{SIZE}}{{UNIT}}',
1699 ]
1700 ]
1701 );
1702 }
1703 }
1704
1705 /**
1706 * Apply common updates Slider widgets, that inherits their respective Carousel version, needs.
1707 *
1708 * @param bool $item_animation - If the Carousel version of the widget has item animations,
1709 * set this to true to remove the animation controls
1710 *
1711 * @since 1.2.1
1712 */
1713 function TRAIT_update_slider_controls( $item_animation = true )
1714 {
1715 // Update animations
1716 $this->update_control(
1717 'animation_style',
1718 [
1719 'default' => 'fade',
1720 'options' => [
1721 'coverflow' => esc_html__('Coverflow', 'uicore-elements'),
1722 'fade' => esc_html__('Fade', 'uicore-elements'),
1723 'cards' => esc_html__('Cards', 'uicore-elements'),
1724 'flip' => esc_html__('Flip', 'uicore-elements'),
1725 //'creative' => esc_html__('Creative', 'uicore-elements'), //TODO: enable creative again after fixing arrows bug
1726 'stacked' => esc_html__('Stacked', 'uicore-elements'),
1727 'circular_avatar' => esc_html__('Circular Avatar', 'uicore-elements'),
1728 ]
1729 ]
1730 );
1731
1732 // Remove controls specifically meant for carousel, not slide type widgets
1733 $this->remove_responsive_control('slides_per_view');
1734 $this->remove_control('show_hidden');
1735 $this->remove_control('fade_edges');
1736 $this->remove_control('fade_edges_alert');
1737 $this->remove_control('match_height');
1738 $this->remove_control('carousel_gap');
1739
1740 // Remove item animation controls
1741 if($item_animation){
1742 $this->remove_control('animate_items');
1743 $this->remove_control('item_hover_animation');
1744 }
1745
1746
1747 }
1748
1749 // Navigation rendering
1750 function render_carousel_dots()
1751 {
1752 // TODO: fully replace `ui-e-dots` for `ui-e-carousel-dots`, after, at least, 3 releases from 1.2.0
1753 ?>
1754 <div class="swiper-pagination ui-e-dots ui-e-carousel-dots"></div>
1755 <?php
1756 }
1757 function render_carousel_arrows()
1758 {
1759 $settings = $this->get_settings_for_display();
1760 // TODO: fully replace `ui-e-button` for `ui-e-carousel-button`, after, at least, 3 releases from 1.2.0
1761 ?>
1762 <div class="ui-e-button ui-e-carousel-button ui-e-previous" role="button" aria-label="Previous slide">
1763 <?php Icons_Manager::render_icon( $settings['previous_arrow'], [ 'aria-hidden' => 'true' ] ); ?>
1764 </div>
1765 <div class="ui-e-button ui-e-carousel-button ui-e-next" role="button" aria-label="Next slide">
1766 <?php Icons_Manager::render_icon( $settings['next_arrow'], [ 'aria-hidden' => 'true' ] ); ?>
1767 </div>
1768 <?php
1769 }
1770 function render_carousel_fraction()
1771 {
1772 // TODO: fully replace `ui-e-fraction` for `ui-e-carousel-fraction`, after, at least, 3 releases from 1.2.0
1773 ?>
1774 <div class="ui-e-fraction ui-e-carousel-fraction">
1775 <span class="ui-e-current"></span>
1776 /
1777 <span class="ui-e-total"></span>
1778 </div>
1779 <?php
1780 }
1781 // TODO: this compatibily functions have been generating debug log errors, such as `Passing null to parameter #1 ($haystack) of type string is deprecated..`
1782 function TRAIT_render_carousel_navigations()
1783 {
1784 $navigation = $this->get_settings_for_display('navigation');
1785
1786 if( strpos($navigation, 'dots') !== false ) {
1787 $this->render_carousel_dots();
1788 }
1789 if( strpos($navigation, 'arrows') !== false ) {
1790 $this->render_carousel_arrows();
1791 }
1792 if( strpos($navigation, 'fraction') !== false ) {
1793 $this->render_carousel_fraction();
1794 }
1795 }
1796
1797 /**
1798 * Calculates how much slides should be duplicated so loop can work
1799 * TODO: move to class helper OR find a way of traits being able to use it without usin carousel trait
1800 *
1801 * @param int $total_slides
1802 *
1803 * @return int Number of slides to duplicate
1804 */
1805 function TRAIT_get_duplication_diff($total_slides){
1806 // Default carousel case
1807 return abs($total_slides - $this->get_settings('slides_per_view'));
1808 }
1809
1810 /**
1811 * Check if slides should be duplicated so loop can work
1812 * TODO: move to class helper OR find a way of traits being able to use it without usin carousel trait
1813 */
1814 function TRAIT_should_duplicate_slides( $total_slides ){
1815
1816 if( $this->get_settings('loop') !== 'true' ){
1817 return false;
1818 }
1819
1820 // Default carousel case
1821 if( $total_slides <= $this->get_settings('slides_per_view') ){
1822 return true;
1823 }
1824
1825 return false;
1826 }
1827 }