PluginProbe
Bricksable for Bricks Builder / 1.4.1
Bricksable for Bricks Builder v1.4.1
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.1, at includes/elements/element-before-after-image.php

541 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_script( 'ba-before-after-image' );
415 wp_localize_script(
416 'ba-before-after-image',
417 'bricksableBeforeAfterImageData',
418 array(
419 'BeforeAfterImageInstances' => array(),
420 )
421 );
422 }
423
424 public function get_before_image_settings( $settings ) {
425 if ( ! isset( $settings['before_image'] ) ) {
426 $settings['before_image'] = array(
427 'id' => 0,
428 'url' => '',
429 );
430 return $settings;
431 }
432
433 $image = $settings['before_image'];
434
435 if ( isset( $image['useDynamicData']['name'] ) ) {
436 $images = $this->render_dynamic_data_tag( $image['useDynamicData']['name'] );
437 $image['id'] = empty( $images ) ? 0 : $images[0];
438 } else {
439 $image['id'] = isset( $image['id'] ) ? $image['id'] : 0;
440 }
441
442 // Image Size.
443 $image['size'] = isset( $image['size'] ) ? $settings['image']['size'] : BRICKS_DEFAULT_IMAGE_SIZE;
444
445 // Image URL.
446 if ( ! isset( $image['url'] ) ) {
447 $image['url'] = wp_get_attachment_image_url( $image['id'], $image['size'] );
448 }
449
450 $settings['before_image'] = $image;
451
452 return $settings;
453 }
454
455 public function get_after_image_settings( $settings ) {
456 if ( ! isset( $settings['after_image'] ) ) {
457 $settings['after_image'] = array(
458 'id' => 1,
459 'url' => '',
460 );
461 return $settings;
462 }
463
464 $image = $settings['after_image'];
465
466 if ( isset( $image['useDynamicData']['name'] ) ) {
467 $images = $this->render_dynamic_data_tag( $image['useDynamicData']['name'] );
468 $image['id'] = empty( $images ) ? 0 : $images[0];
469 } else {
470 $image['id'] = isset( $image['id'] ) ? $image['id'] : 0;
471 }
472
473 // Image Size.
474 $image['size'] = isset( $image['size'] ) ? $settings['image']['size'] : BRICKS_DEFAULT_IMAGE_SIZE;
475
476 // Image URL.
477 if ( ! isset( $image['url'] ) ) {
478 $image['url'] = wp_get_attachment_image_url( $image['id'], $image['size'] );
479 }
480
481 $settings['after_image'] = $image;
482
483 return $settings;
484 }
485
486 public function render() {
487 $settings = $this->settings;
488 $before_settings = $this->get_before_image_settings( $settings );
489 $after_settings = $this->get_after_image_settings( $settings );
490 $labels_on_hover = isset( $settings['labels_onHover'] ) ? true : false;
491
492 $image_wrapper_classes = array( 'ba-before-after-image-wrapper' );
493 $image_wrapper_classes[] = true === $labels_on_hover ? 'ba-before-after-image-label-on-hover' : '';
494
495 $image_before_atts = array();
496 $image_before_atts['id'] = isset( $image_before_atts['id'] ) ? 'image-' . $settings['before_image']['id'] : '';
497 $image_after_atts = array();
498 $image_after_atts['id'] = isset( $image_after_atts['id'] ) ? 'image-' . $settings['after_image']['id'] : '';
499
500 $before_after_image_options = array(
501 'addCircle' => isset( $settings['add_circle'] ) ? true : false,
502 'verticalMode' => isset( $settings['vertical_mode'] ) ? true : false,
503 'onHover' => $labels_on_hover,
504 'hoverStart' => 'mouse_hover' === $settings['slider_move_type'] ? true : false,
505 'startingPoint' => isset( $settings['starting_point'] ) ? intval( $settings['starting_point'] ) : 50,
506 );
507
508 $this->set_attribute( 'image-wrapper', 'class', $image_wrapper_classes );
509 $this->set_attribute( 'image-wrapper', 'id', esc_attr( 'ba-before-after-image-' . $this->id ) );
510 $this->set_attribute( 'image-wrapper', 'data-ba-bricks-before-after-image-options', wp_json_encode( $before_after_image_options ) );
511
512 echo '<div ' . $this->render_attributes( 'image-wrapper' ) . '>'; //phpcs:ignore
513 // Lazy load atts set via 'wp_get_attachment_image_attributes' filter.
514 if ( isset( $settings['before_image']['id'] ) ) {
515 echo wp_get_attachment_image( $settings['before_image']['id'], $settings['before_image']['size'], false, $image_before_atts );
516 } elseif ( ! empty( $settings['before_image']['url'] ) ) {
517 echo '<img src="' . esc_url( $settings['before_image']['url'] ) . '">';
518 }
519 if ( isset( $settings['show_labels'] ) ) {
520 if ( isset( $settings['before_label'] ) ) {
521 echo '<span class="ba-before-after-image-label ba-before-after-image-label-before keep">';
522 echo esc_html( $settings['before_label'] );
523 echo '</span>';
524 }
525 if ( isset( $settings['after_label'] ) ) {
526 echo '<span class="ba-before-after-image-label ba-before-after-image-label-after keep">';
527 echo esc_html( $settings['after_label'] );
528 echo '</span>';
529 }
530 }
531
532 // Lazy load atts set via 'wp_get_attachment_image_attributes' filter.
533 if ( isset( $settings['after_image']['id'] ) ) {
534 echo wp_get_attachment_image( $settings['after_image']['id'], $settings['after_image']['size'], false, $image_after_atts );
535 } elseif ( ! empty( $settings['after_image']['url'] ) ) {
536 echo '<img src="' . esc_url( $settings['after_image']['url'] ) . '">';
537 }
538 echo '</div>';
539 }
540 }
541