PluginProbe
Bricksable for Bricks Builder / 1.5.6
Bricksable for Bricks Builder v1.5.6
1.2.9 1.3.0 1.3.2 1.3.3 1.3.4 1.3.5 1.3.6 1.3.7 1.3.8 1.3.9 1.4.0 1.4.1 1.4.2 1.4.3 1.4.31 1.4.32 1.5.0 1.5.1 1.5.2 1.5.3 1.5.4 1.5.5 1.5.6 1.5.7 1.5.8 All 132 releases
bricksable / includes / elements / content-toggle / element-content-toggle.php

element-content-toggle.php in Bricksable for Bricks Builder 1.5.6, at includes/elements/content-toggle/element-content-toggle.php

565 lines 19.3 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 use Bricksable\Classes\Bricksable_Helpers;
3
4 if ( ! defined( 'ABSPATH' ) ) {
5 exit; // Exit if accessed directly.
6 }
7
8 class Bricksable_Content_Toggle extends \Bricks\Element {
9 public $category = 'bricksable';
10 public $name = 'ba-content-toggle';
11 public $icon = 'ti-layout-menu-separated';
12 public $scripts = array( 'bricksableContentToggle' );
13
14 public function get_label() {
15 return esc_html__( 'Content Toggle', 'bricksable' );
16 }
17
18 public function set_control_groups() {
19 $this->control_groups['content'] = array(
20 'title' => esc_html__( 'Tab Content', 'bricksable' ),
21 'tab' => 'content',
22 );
23
24 $this->control_groups['switcher_settings'] = array(
25 'title' => esc_html__( 'Switcher Settings', 'bricksable' ),
26 'tab' => 'content',
27 );
28
29 $this->control_groups['label_settings'] = array(
30 'title' => esc_html__( 'Label Settings', 'bricksable' ),
31 'tab' => 'content',
32 );
33
34 $this->control_groups['content_settings'] = array(
35 'title' => esc_html__( 'Content Settings', 'bricksable' ),
36 'tab' => 'content',
37 );
38 }
39 public function set_controls() {
40 // Delete control '_typography'.
41 unset( $this->controls['_typography'] );
42
43 $this->controls['content_toggle_item'] = array(
44 'tab' => 'content',
45 'group' => 'content',
46 'label' => esc_html__( 'Content Toggle', 'bricksable' ),
47 'type' => 'repeater',
48 'titleProperty' => 'label',
49 'placeholder' => esc_html__( 'Tab Content', 'bricksable' ),
50 'fields' => array(
51 'label' => array(
52 'type' => 'text',
53 'hasDynamicData' => 'text',
54 ),
55 'content_type' => array(
56 'label' => esc_html__( 'Content Type', 'bricksable' ),
57 'type' => 'select',
58 'options' => array(
59 'content' => esc_html__( 'Content', 'bricksable' ),
60 'templates' => esc_html__( 'Templates', 'bricksable' ),
61 ),
62 'clearable' => false,
63 'pasteStyles' => false,
64 'placeholder' => esc_html__( 'Content', 'bricksable' ),
65 ),
66 'content_template' => array(
67 'label' => esc_html__( 'Template', 'bricksable' ),
68 'type' => 'select',
69 'options' => bricks_is_builder() ? Bricksable_Helpers::get_templates_list( get_the_ID() ) : array(),
70 'searchable' => true,
71 'placeholder' => esc_html__( 'Select template', 'bricksable' ),
72 'required' => array( 'content_type', '=', 'templates' ),
73 'description' => esc_html__( 'Note: A reload is required in order to get the styles of the template.', 'bricksable' ),
74 ),
75 'content' => array(
76 'label' => esc_html__( 'Content', 'bricksable' ),
77 'type' => 'textarea',
78 'hasDynamicData' => 'text',
79 'required' => array( 'content_type', '=', 'content' ),
80 ),
81 ),
82 'default' => array(
83 array(
84 'label' => esc_html__( 'Monthly', 'bricksable' ),
85 'content_type' => 'content',
86 'content' => 'Lorem ipsum dolor ist amte. Consectetuer adipiscing eilt. Aenean commodo ligula egget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.',
87 ),
88 array(
89 'label' => esc_html__( 'Yearly', 'bricksable' ),
90 'content_type' => 'content',
91 'content' => 'Lorem ipsum dolor ist amte. Consectetuer adipiscing eilt. Aenean commodo ligula egget dolor. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus.',
92 ),
93 ),
94 );
95
96 $this->controls['toggle_style'] = array(
97 'tab' => 'content',
98 'group' => 'content',
99 'label' => esc_html__( 'Toggle Style', 'bricksable' ),
100 'type' => 'select',
101 'options' => array(
102 'animated' => esc_html__( 'Animated Tab Style', 'bricksable' ),
103 'tab' => esc_html__( 'Normal Tab Style', 'bricksable' ),
104 ),
105 'inline' => true,
106 'reset' => true,
107 'default' => 'animated',
108 'placeholder' => esc_html__( 'Animated Tab Style', 'bricksable' ),
109 );
110
111 // Switcher.
112 $this->controls['switcher_text_align'] = array(
113 'tab' => 'content',
114 'group' => 'switcher_settings',
115 'label' => esc_html__( 'Text align', 'bricksable' ),
116 'type' => 'text-align',
117 'css' => array(
118 array(
119 'property' => 'text-align',
120 'selector' => '.ba-content-toggle-wrapper',
121 ),
122 ),
123 'default' => 'center',
124 'inline' => true,
125 'placeholder' => esc_html__( 'Center', 'bricksable' ),
126 );
127
128 $this->controls['switcher_background_color'] = array(
129 'tab' => 'content',
130 'group' => 'switcher_settings',
131 'label' => esc_html__( 'Switcher Background Color', 'bricksable' ),
132 'type' => 'color',
133 'inline' => true,
134 'small' => true,
135 'css' => array(
136 array(
137 'property' => 'background-color',
138 'selector' => '.ba-content-toggle-switcher',
139 ),
140 ),
141 'default' => array(
142 'hex' => '#f7f7fb',
143 ),
144 'pasteStyles' => false,
145 'description' => esc_html__( 'Define the switcher background color.', 'bricksable' ),
146 );
147
148 $this->controls['switcher_bottom_gap'] = array(
149 'tab' => 'content',
150 'group' => 'switcher_settings',
151 'label' => esc_html__( 'Bottom Gap', 'bricksable' ),
152 'type' => 'number',
153 'css' => array(
154 array(
155 'property' => 'margin-bottom',
156 'selector' => '.ba-content-toggle-switcher',
157 ),
158 ),
159 'units' => array(
160 'px' => array(
161 'min' => 1,
162 'max' => 150,
163 'step' => 1,
164 ),
165 ),
166 'default' => '15px',
167 'description' => esc_html__( 'Set the bottom gap distance between the switcher and content container.', 'bricksable' ),
168 );
169
170 $this->controls['switcher_border'] = array(
171 'tab' => 'content',
172 'group' => 'switcher_settings',
173 'label' => esc_html__( 'Border', 'bricksable' ),
174 'type' => 'border',
175 'css' => array(
176 array(
177 'property' => 'border',
178 'selector' => '.ba-content-toggle-switcher',
179 ),
180 ),
181 'default' => array(
182 'width' => array(
183 'top' => 1,
184 'right' => 1,
185 'bottom' => 1,
186 'left' => 1,
187 ),
188 'style' => 'solid',
189 'color' => array(
190 'hex' => '#e5e5e5',
191 ),
192 'radius' => array(
193 'top' => 50,
194 'right' => 50,
195 'bottom' => 50,
196 'left' => 50,
197 ),
198 ),
199 'inline' => true,
200 'small' => true,
201 );
202 $this->controls['switcher_box_shadow'] = array(
203 'tab' => 'content',
204 'group' => 'switcher_settings',
205 'label' => esc_html__( 'Box Shadow', 'bricksable' ),
206 'type' => 'box-shadow',
207 'css' => array(
208 array(
209 'property' => 'box-shadow',
210 'selector' => '.ba-content-toggle-switcher',
211 ),
212 ),
213 );
214 $this->controls['switcher_padding'] = array(
215 'tab' => 'content',
216 'group' => 'switcher_settings',
217 'label' => esc_html__( 'Padding', 'bricksable' ),
218 'type' => 'dimensions',
219 'css' => array(
220 array(
221 'property' => 'padding',
222 'selector' => '.ba-content-toggle-switcher',
223 ),
224 ),
225 'default' => array(
226 'top' => 5,
227 'right' => 5,
228 'bottom' => 5,
229 'left' => 5,
230 ),
231 );
232
233 // Label.
234 $this->controls['label_active_background'] = array(
235 'tab' => 'content',
236 'group' => 'label_settings',
237 'label' => esc_html__( 'Label Active Background', 'bricksable' ),
238 'type' => 'background',
239 'css' => array(
240 array(
241 'property' => 'background',
242 'selector' => '.ba-content-toggle-slider, .ba-content-toggle-style-tab .ba-content-toggle-item.active',
243 ),
244 ),
245 'exclude' => array(
246 'parallax',
247 'attachment',
248 'videoUrl',
249 'videoScale',
250 ),
251 'inline' => true,
252 'small' => true,
253 'default' => array(
254 'color' => array(
255 'hex' => '#29b5a8',
256 ),
257 ),
258 );
259 $this->controls['label_active_typography'] = array(
260 'tab' => 'content',
261 'group' => 'label_settings',
262 'label' => esc_html__( 'Label Active Typography', 'bricksable' ),
263 'type' => 'typography',
264 'css' => array(
265 array(
266 'property' => 'typography',
267 'selector' => '.ba-content-toggle-item.active .ba-content-label-title',
268 ),
269 ),
270 'default' => array(
271 'color' => array(
272 'hex' => '#ffffff',
273 ),
274 ),
275 'rerender' => true,
276 'inline' => true,
277 );
278 $this->controls['label_typography'] = array(
279 'tab' => 'content',
280 'group' => 'label_settings',
281 'label' => esc_html__( 'Label Typography', 'bricksable' ),
282 'type' => 'typography',
283 'css' => array(
284 array(
285 'property' => 'typography',
286 'selector' => '.ba-content-toggle-item .ba-content-label-title',
287 ),
288 ),
289 'inline' => true,
290 'rerender' => true,
291 );
292 $this->controls['label_padding'] = array(
293 'tab' => 'content',
294 'group' => 'label_settings',
295 'label' => esc_html__( 'Label Padding', 'bricksable' ),
296 'type' => 'dimensions',
297 'css' => array(
298 array(
299 'property' => 'padding',
300 'selector' => '.ba-content-toggle-item',
301 ),
302 ),
303 'default' => array(
304 'top' => 7,
305 'right' => 15,
306 'bottom' => 7,
307 'left' => 15,
308 ),
309 );
310
311 // Content Settings.
312 $this->controls['content_animationSeparator'] = array(
313 'type' => 'separator',
314 'tab' => 'content',
315 'group' => 'content_settings',
316 'label' => esc_html__( 'Animation', 'bricksable' ),
317 );
318
319 $this->controls['content_animation'] = array(
320 'tab' => 'content',
321 'group' => 'content_settings',
322 'label' => esc_html__( 'Entry animation', 'bricksable' ),
323 'type' => 'select',
324 'searchable' => true,
325 'options' => array(
326 'bounce' => esc_html__( 'bounce', 'bricksable' ),
327 'flash' => esc_html__( 'flash', 'bricksable' ),
328 'pulse' => esc_html__( 'pulse', 'bricksable' ),
329 'rubberBand' => esc_html__( 'rubberBand', 'bricksable' ),
330 'shake' => esc_html__( 'shake', 'bricksable' ),
331 'swing' => esc_html__( 'swing', 'bricksable' ),
332 'tada' => esc_html__( 'tada', 'bricksable' ),
333 'wobble' => esc_html__( 'wobble', 'bricksable' ),
334 'jello' => esc_html__( 'jello', 'bricksable' ),
335 'bounceIn' => esc_html__( 'bounceIn', 'bricksable' ),
336 'bounceInDown' => esc_html__( 'bounceInDown', 'bricksable' ),
337 'bounceInLeft' => esc_html__( 'bounceInLeft', 'bricksable' ),
338 'bounceInRight' => esc_html__( 'bounceInRight', 'bricksable' ),
339 'bounceInUp' => esc_html__( 'bounceInUp', 'bricksable' ),
340 'fadeIn' => esc_html__( 'fadeIn', 'bricksable' ),
341 'fadeInDown' => esc_html__( 'fadeInDown', 'bricksable' ),
342 'fadeInDownBig' => esc_html__( 'fadeInDownBig', 'bricksable' ),
343 'fadeInLeft' => esc_html__( 'fadeInLeft', 'bricksable' ),
344 'fadeInLeftBig' => esc_html__( 'fadeInLeftBig', 'bricksable' ),
345 'fadeInRight' => esc_html__( 'fadeInRight', 'bricksable' ),
346 'fadeInRightBig' => esc_html__( 'fadeInRightBig', 'bricksable' ),
347 'fadeInUp' => esc_html__( 'fadeInUp', 'bricksable' ),
348 'fadeInUpBig' => esc_html__( 'fadeInUpBig', 'bricksable' ),
349 'flip' => esc_html__( 'flip', 'bricksable' ),
350 'flipInX' => esc_html__( 'flipInX', 'bricksable' ),
351 'flipInY' => esc_html__( 'flipInY', 'bricksable' ),
352 'lightSpeedIn' => esc_html__( 'lightSpeedIn', 'bricksable' ),
353 'rotateIn' => esc_html__( 'rotateIn', 'bricksable' ),
354 'rotateInDownLeft' => esc_html__( 'rotateInDownLeft', 'bricksable' ),
355 'rotateInDownRight' => esc_html__( 'rotateInDownRight', 'bricksable' ),
356 'rotateInUpLeft' => esc_html__( 'rotateInUpLeft', 'bricksable' ),
357 'rotateInUpRight' => esc_html__( 'rotateInUpRight', 'bricksable' ),
358 'slideInUp' => esc_html__( 'slideInUp', 'bricksable' ),
359 'slideInDown' => esc_html__( 'slideInDown', 'bricksable' ),
360 'slideInLeft' => esc_html__( 'slideInLeft', 'bricksable' ),
361 'slideInRight' => esc_html__( 'slideInRight', 'bricksable' ),
362 'zoomIn' => esc_html__( 'zoomIn', 'bricksable' ),
363 'zoomInDown' => esc_html__( 'zoomInDown', 'bricksable' ),
364 'zoomInLeft' => esc_html__( 'zoomInLeft', 'bricksable' ),
365 'zoomInRight' => esc_html__( 'zoomInRight', 'bricksable' ),
366 'zoomInUp' => esc_html__( 'zoomInUp', 'bricksable' ),
367 'jackInTheBox' => esc_html__( 'jackInTheBox', 'bricksable' ),
368 'rollIn' => esc_html__( 'rollIn', 'bricksable' ),
369 ),
370 'inline' => true,
371 'default' => 'fadeIn',
372 'placeholder' => esc_html__( 'fadeIn', 'bricksable' ),
373 );
374
375 $this->controls['content_animationDuration'] = array(
376 'tab' => 'content',
377 'group' => 'content_settings',
378 'label' => esc_html__( 'Animation duration', 'bricksable' ),
379 'type' => 'select',
380 'searchable' => true,
381 'options' => array(
382 'very-slow' => esc_html__( 'Very slow', 'bricksable' ),
383 'slow' => esc_html__( 'Slow', 'bricksable' ),
384 'normal' => esc_html__( 'Normal', 'bricksable' ),
385 'fast' => esc_html__( 'Fast', 'bricksable' ),
386 'very-fast' => esc_html__( 'Very fast', 'bricksable' ),
387 'custom' => esc_html__( 'Custom', 'bricksable' ),
388 ),
389 'inline' => true,
390 'placeholder' => esc_html__( 'Normal', 'bricksable' ) . ' (1s)',
391 'required' => array( 'content_animation', '!=', '' ),
392 );
393
394 $this->controls['content_animationDurationCustom'] = array(
395 'tab' => 'content',
396 'group' => 'content_settings',
397 'label' => esc_html__( 'Animation duration', 'bricksable' ) . ' (' . esc_html__( 'Custom', 'bricksable' ) . ')',
398 'type' => 'text',
399 'css' => array(
400 array(
401 'property' => 'animation-duration',
402 'selector' => '.ba-content-toggle-tab-item',
403 ),
404 ),
405 'description' => esc_html__( 'For example: "1s" or "500ms"', 'bricksable' ),
406 'inline' => true,
407 'required' => array( 'content_animationDuration', '=', 'custom' ),
408 );
409
410 $this->controls['content_animationDelay'] = array(
411 'tab' => 'content',
412 'group' => 'content_settings',
413 'label' => esc_html__( 'Animation delay', 'bricksable' ),
414 'type' => 'text',
415 'css' => array(
416 array(
417 'property' => 'animation-delay',
418 'selector' => '.ba-content-toggle-tab-item',
419 ),
420 ),
421 'inline' => true,
422 'description' => esc_html__( 'For example: "1s" or "500ms" or "-2.5s"', 'bricksable' ),
423 'placeholder' => '0s',
424 'required' => array( 'content_animation', '!=', '' ),
425 );
426 }
427
428 public function enqueue_scripts() {
429 wp_enqueue_style( 'bricks-animate' );
430 wp_enqueue_style( 'ba-content-toggle' );
431 wp_enqueue_script( 'ba-content-toggle' );
432 }
433
434 public function render() {
435 $settings = $this->settings;
436
437 $wrapper_classes = array(
438 'ba-content-toggle-wrapper',
439 );
440
441 $this->set_attribute( 'wrapper', 'div' );
442 $this->set_attribute( 'wrapper', 'class', $wrapper_classes );
443
444 // Render.
445 $output = '';
446
447 if ( substr( BRICKS_VERSION, 0, 3 ) > '1.3' ) {
448 $output .= "<div {$this->render_attributes( '_root' )}>";
449 }
450
451 //phpcs:ignore
452 $output .= '<' . $this->render_attributes( 'wrapper' ) . '>';
453
454 $toggle_style = isset( $settings['toggle_style'] ) ? $settings['toggle_style'] : 'animated';
455
456 $label_classes = array(
457 'ba-content-toggle-switcher',
458 'ba-content-toggle-style-' . $settings['toggle_style'],
459 );
460
461 $this->set_attribute( 'label-wrapper', 'div' );
462 $this->set_attribute( 'label-wrapper', 'class', $label_classes );
463
464 $output .= '<' . $this->render_attributes( 'label-wrapper' ) . '>';
465
466 foreach ( $settings['content_toggle_item'] as $index => $item ) {
467 $content_toggle_item_classes = array(
468 'ba-content-toggle-item',
469 );
470 if ( 0 === $index ) {
471 $content_toggle_item_classes[] = 'active';
472 $content_toggle_item_aria = 'true';
473 } else {
474 $content_toggle_item_aria = 'false';
475 }
476
477 $this->set_attribute( "content-toggle-item-$index", 'div' );
478 $this->set_attribute( "content-toggle-item-$index", 'aria-hidden', $content_toggle_item_aria );
479 $this->set_attribute( "content-toggle-item-$index", 'class', $content_toggle_item_classes );
480
481 $content_toggle_label_title_classes = array(
482 'ba-content-label-title',
483 );
484
485 $this->set_attribute( "content-toggle-label-title-$index", 'span' );
486 $this->set_attribute( "content-toggle-label-title-$index", 'class', $content_toggle_label_title_classes );
487
488 // Label.
489 if ( isset( $item['label'] ) ) {
490 $output .= '<' . $this->render_attributes( "content-toggle-item-$index" ) . '><' . $this->render_attributes( "content-toggle-label-title-$index" ) . '>' . $item['label'] . '</span></div>';
491 }
492 }
493 // Slider.
494 if ( 'animated' === $settings['toggle_style'] ) {
495 $output .= '<div class="ba-content-toggle-slider"></div>';
496 }
497
498 $output .= '</div>';
499 $output .= '</div>';
500
501 // Content.
502 $content_wrapper_classes = array(
503 'ba-content-toggle-tab',
504 );
505
506 $this->set_attribute( 'content-wrapper', 'div' );
507 $this->set_attribute( 'content-wrapper', 'class', $content_wrapper_classes );
508
509 $output .= '<' . $this->render_attributes( 'content-wrapper' ) . '>';
510 foreach ( $settings['content_toggle_item'] as $index => $item ) {
511 $content_toggle_tab_classes = array(
512 'ba-content-toggle-tab-item',
513 isset( $settings['content_animationDuration'] ) && '' !== $settings['content_animationDuration'] ? 'animation-duration-' . $settings['content_animationDuration'] : '',
514 );
515
516 if ( 0 === $index ) {
517 $content_toggle_tab_classes[] = 'show-content';
518 $content_toggle_tab_aria = 'true';
519 } else {
520 $content_toggle_tab_aria = 'false';
521 }
522
523 $this->set_attribute( "content-toggle-tab-$index", 'div' );
524 $this->set_attribute( "content-toggle-tab-$index", 'class', $content_toggle_tab_classes );
525 $this->set_attribute( "content-toggle-tab-$index", 'aria-hidden', $content_toggle_tab_aria );
526 if ( isset( $settings['content_animation'] ) && '' !== $settings['content_animation'] ) {
527 $this->set_attribute( "content-toggle-tab-$index", 'data-animation', 'brx-animate-' . $settings['content_animation'] );
528 }
529
530 $output .= '<' . $this->render_attributes( "content-toggle-tab-$index" ) . '>';
531
532 // Template.
533 if ( isset( $item['content_type'] ) && 'templates' === $item['content_type'] ) {
534
535 $template_id = ! empty( $item['content_template'] ) ? intval( $item['content_template'] ) : false;
536 if ( ! $template_id ) {
537 return $this->render_element_placeholder(
538 array(
539 'title' => esc_html__( 'No template selected.', 'bricksable' ),
540 )
541 );
542 }
543
544 $output .= do_shortcode( '[bricks_template id="' . $template_id . '" ]' );
545 } else {
546 if ( isset( $item['content'] ) ) {
547 $output .= $item['content'];
548 }
549 }
550
551 $output .= '</div>';
552 }
553
554 $output .= '</div>';
555
556 if ( substr( BRICKS_VERSION, 0, 3 ) > '1.3' ) {
557 $output .= '</div>';
558 }
559
560 //phpcs:ignore
561 echo $output;
562
563 }
564 }
565