PluginProbe
Bricksable for Bricks Builder / 1.4.2
Bricksable for Bricks Builder v1.4.2
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 / element-before-after-image.php

element-before-after-image.php in Bricksable for Bricks Builder 1.4.2, at includes/elements/element-before-after-image.php

542 lines 16.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 if ( ! defined( 'ABSPATH' ) ) {
4 exit; // Exit if accessed directly.
5 }
6
7 class Bricksable_Before_After_Image extends \Bricks\Element {
8 public $category = 'bricksable';
9 public $name = 'ba-before-after-image';
10 public $icon = 'ti-image';
11 public $css_selector = '.ba-before-after-image-wrapper';
12 public $scripts = array( 'bricksableBAImage' );
13
14 public function get_label() {
15 return esc_html__( 'Before/After Image', 'bricksable' );
16 }
17 public function set_control_groups() {
18 $this->control_groups['image'] = array(
19 'title' => esc_html__( 'Image', 'bricksable' ),
20 'tab' => 'content',
21 );
22 $this->control_groups['label'] = array(
23 'title' => esc_html__( 'Labels', 'bricksable' ),
24 'tab' => 'content',
25 );
26 $this->control_groups['control'] = array(
27 'title' => esc_html__( 'Control', 'bricksable' ),
28 'tab' => 'content',
29 );
30 $this->control_groups['settings'] = array(
31 'title' => esc_html__( 'Settings', 'bricksable' ),
32 'tab' => 'content',
33 );
34 unset( $this->control_groups['_typography'] );
35 }
36
37 public function set_controls() {
38 // Images.
39 $this->controls['before_image'] = array(
40 'tab' => 'content',
41 'group' => 'image',
42 'type' => 'image',
43 'default' => array(
44 'full' => 'https://source.unsplash.com/random/800x400?moon',
45 'url' => 'https://source.unsplash.com/random/800x400?moon',
46 ),
47 );
48
49 $this->controls['before_image_filter'] = array(
50 'tab' => 'content',
51 'group' => 'image',
52 'label' => esc_html__( 'Before Image filters', 'bricksable' ),
53 'type' => 'filters',
54 'inline' => true,
55 'css' => array(
56 array(
57 'property' => 'filter',
58 'selector' => '.ba-before-after-img-before',
59 ),
60 ),
61 );
62
63 $this->controls['after_image'] = array(
64 'tab' => 'content',
65 'group' => 'image',
66 'type' => 'image',
67 'default' => array(
68 'full' => 'https://source.unsplash.com/random/800x400?earth',
69 'url' => 'https://source.unsplash.com/random/800x400?earth',
70 ),
71 );
72
73 $this->controls['after_image_filter'] = array(
74 'tab' => 'content',
75 'group' => 'image',
76 'label' => esc_html__( 'After Image filters', 'bricksable' ),
77 'type' => 'filters',
78 'inline' => true,
79 'css' => array(
80 array(
81 'property' => 'filter',
82 'selector' => '.ba-before-after-img-after',
83 ),
84 ),
85 );
86
87 // Labels.
88 $this->controls['show_labels'] = array(
89 'tab' => 'content',
90 'group' => 'label',
91 'label' => esc_html__( 'Show Labels', 'bricksable' ),
92 'type' => 'checkbox',
93 );
94
95 $this->controls['labels_onHover'] = array(
96 'tab' => 'content',
97 'group' => 'label',
98 'label' => esc_html__( 'Show Labels On Hover', 'bricksable' ),
99 'type' => 'checkbox',
100 'required' => array( 'show_labels', '=', true ),
101 );
102
103 $this->controls['before_label'] = array(
104 'tab' => 'content',
105 'group' => 'label',
106 'label' => esc_html__( 'Before Label', 'bricksable' ),
107 'type' => 'text',
108 'inline' => true,
109 'default' => 'Before Label',
110 'hasDynamicData' => 'text',
111 'required' => array( 'show_labels', '=', true ),
112 );
113
114 $this->controls['after_label'] = array(
115 'tab' => 'content',
116 'group' => 'label',
117 'label' => esc_html__( 'After Label', 'bricksable' ),
118 'type' => 'text',
119 'inline' => true,
120 'default' => 'After Label',
121 'hasDynamicData' => 'text',
122 'required' => array( 'show_labels', '=', true ),
123 );
124
125 $this->controls['labels_alignment'] = array(
126 'tab' => 'content',
127 'group' => 'label',
128 'label' => esc_html__( 'Vertical align', 'bricksable' ),
129 'type' => 'align-items',
130 'options' => isset( $this->control_options['alignItems'] ) ? $this->control_options['alignItems'] : '',
131 'exclude' => array(
132 'stretch',
133 ),
134 'css' => array(
135 array(
136 'property' => 'align-items',
137 'selector' => '.ba-before-after-image-wrapper',
138 ),
139 array(
140 'property' => 'justify-content',
141 'selector' => '.ba-before-after-image-wrapper',
142 ),
143 ),
144 'inline' => true,
145 'default' => 'center',
146 'placeholder' => esc_html__( 'Center', 'bricksable' ),
147 'required' => array( 'show_labels', '=', true ),
148 );
149
150 $this->controls['labels_typography'] = array(
151 'tab' => 'content',
152 'group' => 'label',
153 'label' => esc_html__( 'Labels Typography', 'bricksable' ),
154 'type' => 'typography',
155 'css' => array(
156 array(
157 'property' => 'font',
158 'selector' => '.ba-before-after-image-label',
159 ),
160 ),
161 'inline' => true,
162 'small' => true,
163 'required' => array( 'show_labels', '=', true ),
164 );
165
166 $this->controls['labels_background_color'] = array(
167 'tab' => 'content',
168 'group' => 'label',
169 'label' => esc_html__( 'Labels background color', 'bricksable' ),
170 'type' => 'color',
171 'inline' => true,
172 'default' => 'rgba(0,0,0,0.33)',
173 'css' => array(
174 array(
175 'property' => 'background-color',
176 'selector' => '.ba-before-after-image-label',
177 ),
178 ),
179 'required' => array( 'show_labels', '=', true ),
180 );
181
182 $this->controls['labels_border'] = array(
183 'tab' => 'content',
184 'group' => 'label',
185 'label' => esc_html__( 'Labels border', 'bricksable' ),
186 'type' => 'border',
187 'css' => array(
188 array(
189 'property' => 'border',
190 'selector' => '.ba-before-after-image-label',
191 ),
192 ),
193 'inline' => true,
194 'small' => true,
195 'default' => array(
196 'radius' => array(
197 'top' => 3,
198 'right' => 3,
199 'bottom' => 3,
200 'left' => 3,
201 ),
202 ),
203 'required' => array( 'show_labels', '=', true ),
204 );
205
206 $this->controls['labels_BoxShadow'] = array(
207 'tab' => 'content',
208 'group' => 'label',
209 'label' => esc_html__( 'Labels box shadow', 'bricksable' ),
210 'type' => 'box-shadow',
211 'css' => array(
212 array(
213 'property' => 'box-shadow',
214 'selector' => '.ba-before-after-image-label',
215 ),
216 ),
217 'inline' => true,
218 'small' => true,
219 'required' => array( 'show_labels', '=', true ),
220 );
221
222 $this->controls['labels_Padding'] = array(
223 'tab' => 'content',
224 'group' => 'label',
225 'label' => esc_html__( 'Padding', 'bricksable' ),
226 'type' => 'dimensions',
227 'css' => array(
228 array(
229 'property' => 'padding',
230 'selector' => '.ba-before-after-image-label',
231 ),
232 ),
233 'required' => array( 'show_labels', '=', true ),
234 );
235
236 // Controls.
237 $this->controls['control_line_color'] = array(
238 'tab' => 'content',
239 'group' => 'control',
240 'label' => esc_html__( 'Control Line Color', 'bricksable' ),
241 'type' => 'color',
242 'inline' => true,
243 'default' => '#ffffff',
244 'css' => array(
245 array(
246 'property' => 'background-color',
247 'selector' => '.ba-before-after-image-control-line',
248 ),
249 array(
250 'property' => 'border-color',
251 'selector' => '.ba-before-after-image-circle',
252 ),
253 ),
254 );
255
256 $this->controls['control_arrow_color'] = array(
257 'tab' => 'content',
258 'group' => 'control',
259 'label' => esc_html__( 'Control Arrow Color', 'bricksable' ),
260 'type' => 'color',
261 'inline' => true,
262 'default' => '#ffffff',
263 'css' => array(
264 array(
265 'property' => 'border-right-color',
266 'selector' => '.ba-before-after-image-arrow-wrapper .ba-before-after-image-arrow-left',
267 ),
268 array(
269 'property' => 'border-left-color',
270 'selector' => '.ba-before-after-image-arrow-wrapper .ba-before-after-image-arrow-right',
271 ),
272 ),
273 );
274
275 $this->controls['add_circle'] = array(
276 'tab' => 'content',
277 'group' => 'control',
278 'label' => esc_html__( 'Add Circle', 'bricksable' ),
279 'type' => 'checkbox',
280 'description' => esc_html__( 'Add Circle type to the control handler.', 'bricksable' ),
281 'default' => true,
282 );
283
284 $this->controls['control_circle_background_color'] = array(
285 'tab' => 'content',
286 'group' => 'control',
287 'label' => esc_html__( 'Control Circle Background Color', 'bricksable' ),
288 'type' => 'color',
289 'inline' => true,
290 'css' => array(
291 array(
292 'property' => 'background-color',
293 'selector' => '.ba-before-after-image-circle',
294 ),
295 ),
296 'required' => array( 'add_circle', '=', true ),
297 );
298
299 $this->controls['control_circle_size'] = array(
300 'tab' => 'content',
301 'group' => 'control',
302 'label' => esc_html__( 'Circle Size', 'bricksable' ),
303 'type' => 'slider',
304 'units' => array(
305 'px' => array(
306 'min' => 1,
307 'max' => 100,
308 'step' => 1,
309 ),
310 ),
311 'css' => array(
312 array(
313 'property' => 'width',
314 'selector' => '.ba-before-after-image-circle',
315 ),
316 array(
317 'property' => 'height',
318 'selector' => '.ba-before-after-image-circle',
319 ),
320 ),
321 'default' => '50px',
322 'required' => array( 'add_circle', '=', true ),
323 );
324
325 $this->controls['control_circle_radius'] = array(
326 'tab' => 'content',
327 'group' => 'control',
328 'label' => esc_html__( 'Circle Radius', 'bricksable' ),
329 'type' => 'slider',
330 'units' => array(
331 'px' => array(
332 'min' => 1,
333 'max' => 50,
334 'step' => 1,
335 ),
336 ),
337 'css' => array(
338 array(
339 'property' => 'border-radius',
340 'selector' => '.ba-before-after-image-circle',
341 ),
342 ),
343 'default' => '50px',
344 'required' => array( 'add_circle', '=', true ),
345 );
346
347 $this->controls['control_handler_width'] = array(
348 'tab' => 'content',
349 'group' => 'control',
350 'label' => esc_html__( 'Handler width', 'bricksable' ),
351 'type' => 'slider',
352 'units' => array(
353 'px' => array(
354 'min' => 1,
355 'max' => 20,
356 'step' => 1,
357 ),
358 ),
359 'css' => array(
360 array(
361 'property' => 'width',
362 'selector' => '.ba-before-after-image-horizontal .ba-before-after-image-control-line',
363 ),
364 array(
365 'property' => 'height',
366 'selector' => '.ba-before-after-image-vertical .ba-before-after-image-control-line',
367 ),
368 array(
369 'property' => 'border-width',
370 'selector' => '.ba-before-after-image-circle',
371 ),
372 ),
373 'default' => '2px',
374 );
375
376 // Settings.
377 $this->controls['vertical_mode'] = array(
378 'tab' => 'content',
379 'group' => 'settings',
380 'label' => esc_html__( 'Vertical Mode', 'bricksable' ),
381 'type' => 'checkbox',
382 );
383
384 $this->controls['slider_move_type'] = array(
385 'tab' => 'content',
386 'group' => 'settings',
387 'label' => esc_html__( 'Slider Move Type', 'bricksable' ),
388 'type' => 'select',
389 'options' => array(
390 'mouse_click' => esc_html__( 'Move on Click', 'bricksable' ),
391 'mouse_hover' => esc_html__( 'Move on Hover', 'bricksable' ),
392 ),
393 'inline' => true,
394 'clearable' => false,
395 'pasteStyles' => false,
396 'default' => 'mouse_click',
397 );
398
399 $this->controls['starting_point'] = array(
400 'tab' => 'content',
401 'group' => 'settings',
402 'label' => esc_html__( 'Starting point', 'bricksable' ),
403 'type' => 'number',
404 'min' => 0,
405 'max' => 100,
406 'step' => '10',
407 'default' => 50,
408 'inline' => true,
409 'description' => esc_html__( 'The percentage to show of the before image.', 'bricksable' ),
410 );
411 }
412
413 public function enqueue_scripts() {
414 wp_enqueue_style( 'ba-before-after-image' );
415 wp_enqueue_script( 'ba-before-after-image' );
416 wp_localize_script(
417 'ba-before-after-image',
418 'bricksableBeforeAfterImageData',
419 array(
420 'BeforeAfterImageInstances' => array(),
421 )
422 );
423 }
424
425 public function get_before_image_settings( $settings ) {
426 if ( ! isset( $settings['before_image'] ) ) {
427 $settings['before_image'] = array(
428 'id' => 0,
429 'url' => '',
430 );
431 return $settings;
432 }
433
434 $image = $settings['before_image'];
435
436 if ( isset( $image['useDynamicData']['name'] ) ) {
437 $images = $this->render_dynamic_data_tag( $image['useDynamicData']['name'] );
438 $image['id'] = empty( $images ) ? 0 : $images[0];
439 } else {
440 $image['id'] = isset( $image['id'] ) ? $image['id'] : 0;
441 }
442
443 // Image Size.
444 $image['size'] = isset( $image['size'] ) ? $settings['image']['size'] : BRICKS_DEFAULT_IMAGE_SIZE;
445
446 // Image URL.
447 if ( ! isset( $image['url'] ) ) {
448 $image['url'] = wp_get_attachment_image_url( $image['id'], $image['size'] );
449 }
450
451 $settings['before_image'] = $image;
452
453 return $settings;
454 }
455
456 public function get_after_image_settings( $settings ) {
457 if ( ! isset( $settings['after_image'] ) ) {
458 $settings['after_image'] = array(
459 'id' => 1,
460 'url' => '',
461 );
462 return $settings;
463 }
464
465 $image = $settings['after_image'];
466
467 if ( isset( $image['useDynamicData']['name'] ) ) {
468 $images = $this->render_dynamic_data_tag( $image['useDynamicData']['name'] );
469 $image['id'] = empty( $images ) ? 0 : $images[0];
470 } else {
471 $image['id'] = isset( $image['id'] ) ? $image['id'] : 0;
472 }
473
474 // Image Size.
475 $image['size'] = isset( $image['size'] ) ? $settings['image']['size'] : BRICKS_DEFAULT_IMAGE_SIZE;
476
477 // Image URL.
478 if ( ! isset( $image['url'] ) ) {
479 $image['url'] = wp_get_attachment_image_url( $image['id'], $image['size'] );
480 }
481
482 $settings['after_image'] = $image;
483
484 return $settings;
485 }
486
487 public function render() {
488 $settings = $this->settings;
489 $before_settings = $this->get_before_image_settings( $settings );
490 $after_settings = $this->get_after_image_settings( $settings );
491 $labels_on_hover = isset( $settings['labels_onHover'] ) ? true : false;
492
493 $image_wrapper_classes = array( 'ba-before-after-image-wrapper' );
494 $image_wrapper_classes[] = true === $labels_on_hover ? 'ba-before-after-image-label-on-hover' : '';
495
496 $image_before_atts = array();
497 $image_before_atts['id'] = isset( $image_before_atts['id'] ) ? 'image-' . $settings['before_image']['id'] : '';
498 $image_after_atts = array();
499 $image_after_atts['id'] = isset( $image_after_atts['id'] ) ? 'image-' . $settings['after_image']['id'] : '';
500
501 $before_after_image_options = array(
502 'addCircle' => isset( $settings['add_circle'] ) ? true : false,
503 'verticalMode' => isset( $settings['vertical_mode'] ) ? true : false,
504 'onHover' => $labels_on_hover,
505 'hoverStart' => 'mouse_hover' === $settings['slider_move_type'] ? true : false,
506 'startingPoint' => isset( $settings['starting_point'] ) ? intval( $settings['starting_point'] ) : 50,
507 );
508
509 $this->set_attribute( 'image-wrapper', 'class', $image_wrapper_classes );
510 $this->set_attribute( 'image-wrapper', 'id', esc_attr( 'ba-before-after-image-' . $this->id ) );
511 $this->set_attribute( 'image-wrapper', 'data-ba-bricks-before-after-image-options', wp_json_encode( $before_after_image_options ) );
512
513 echo '<div ' . $this->render_attributes( 'image-wrapper' ) . '>'; //phpcs:ignore
514 // Lazy load atts set via 'wp_get_attachment_image_attributes' filter.
515 if ( isset( $settings['before_image']['id'] ) ) {
516 echo wp_get_attachment_image( $settings['before_image']['id'], $settings['before_image']['size'], false, $image_before_atts );
517 } elseif ( ! empty( $settings['before_image']['url'] ) ) {
518 echo '<img src="' . esc_url( $settings['before_image']['url'] ) . '">';
519 }
520 if ( isset( $settings['show_labels'] ) ) {
521 if ( isset( $settings['before_label'] ) ) {
522 echo '<span class="ba-before-after-image-label ba-before-after-image-label-before keep">';
523 echo esc_html( $settings['before_label'] );
524 echo '</span>';
525 }
526 if ( isset( $settings['after_label'] ) ) {
527 echo '<span class="ba-before-after-image-label ba-before-after-image-label-after keep">';
528 echo esc_html( $settings['after_label'] );
529 echo '</span>';
530 }
531 }
532
533 // Lazy load atts set via 'wp_get_attachment_image_attributes' filter.
534 if ( isset( $settings['after_image']['id'] ) ) {
535 echo wp_get_attachment_image( $settings['after_image']['id'], $settings['after_image']['size'], false, $image_after_atts );
536 } elseif ( ! empty( $settings['after_image']['url'] ) ) {
537 echo '<img src="' . esc_url( $settings['after_image']['url'] ) . '">';
538 }
539 echo '</div>';
540 }
541 }
542