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

540 lines 15.9 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' => 'select',
130 'options' => $this->control_options['alignItems'],
131 'css' => array(
132 array(
133 'property' => 'align-items',
134 'selector' => '.ba-before-after-image-wrapper',
135 ),
136 array(
137 'property' => 'justify-content',
138 'selector' => '.ba-before-after-image-wrapper',
139 ),
140 ),
141 'inline' => true,
142 'default' => 'center',
143 'placeholder' => esc_html__( 'Center', 'bricksable' ),
144 'required' => array( 'show_labels', '=', true ),
145 );
146
147 $this->controls['labels_typography'] = array(
148 'tab' => 'content',
149 'group' => 'label',
150 'label' => esc_html__( 'Labels Typography', 'bricksable' ),
151 'type' => 'typography',
152 'css' => array(
153 array(
154 'property' => 'font',
155 'selector' => '.ba-before-after-image-label',
156 ),
157 ),
158 'inline' => true,
159 'small' => true,
160 'required' => array( 'show_labels', '=', true ),
161 );
162
163 $this->controls['labels_background_color'] = array(
164 'tab' => 'content',
165 'group' => 'label',
166 'label' => esc_html__( 'Labels background color', 'bricksable' ),
167 'type' => 'color',
168 'inline' => true,
169 'default' => 'rgba(0,0,0,0.33)',
170 'css' => array(
171 array(
172 'property' => 'background-color',
173 'selector' => '.ba-before-after-image-label',
174 ),
175 ),
176 'required' => array( 'show_labels', '=', true ),
177 );
178
179 $this->controls['labels_border'] = array(
180 'tab' => 'content',
181 'group' => 'label',
182 'label' => esc_html__( 'Labels border', 'bricksable' ),
183 'type' => 'border',
184 'css' => array(
185 array(
186 'property' => 'border',
187 'selector' => '.ba-before-after-image-label',
188 ),
189 ),
190 'inline' => true,
191 'small' => true,
192 'default' => array(
193 'radius' => array(
194 'top' => 3,
195 'right' => 3,
196 'bottom' => 3,
197 'left' => 3,
198 ),
199 ),
200 'required' => array( 'show_labels', '=', true ),
201 );
202
203 $this->controls['labels_BoxShadow'] = array(
204 'tab' => 'content',
205 'group' => 'label',
206 'label' => esc_html__( 'Labels box shadow', 'bricksable' ),
207 'type' => 'box-shadow',
208 'css' => array(
209 array(
210 'property' => 'box-shadow',
211 'selector' => '.ba-before-after-image-label',
212 ),
213 ),
214 'inline' => true,
215 'small' => true,
216 'required' => array( 'show_labels', '=', true ),
217 );
218
219 $this->controls['labels_Padding'] = array(
220 'tab' => 'content',
221 'group' => 'label',
222 'label' => esc_html__( 'Padding', 'bricksable' ),
223 'type' => 'dimensions',
224 'css' => array(
225 array(
226 'property' => 'padding',
227 'selector' => '.ba-before-after-image-label',
228 ),
229 ),
230 'required' => [ 'show_labels', '=', true ],
231 );
232
233 // Controls.
234 $this->controls['control_line_color'] = array(
235 'tab' => 'content',
236 'group' => 'control',
237 'label' => esc_html__( 'Control Line Color', 'bricksable' ),
238 'type' => 'color',
239 'inline' => true,
240 'default' => '#ffffff',
241 'css' => array(
242 array(
243 'property' => 'background-color',
244 'selector' => '.ba-before-after-image-control-line',
245 ),
246 array(
247 'property' => 'border-color',
248 'selector' => '.ba-before-after-image-circle',
249 ),
250 ),
251 );
252
253 $this->controls['control_arrow_color'] = array(
254 'tab' => 'content',
255 'group' => 'control',
256 'label' => esc_html__( 'Control Arrow Color', 'bricksable' ),
257 'type' => 'color',
258 'inline' => true,
259 'default' => '#ffffff',
260 'css' => array(
261 array(
262 'property' => 'border-right-color',
263 'selector' => '.ba-before-after-image-arrow-wrapper .ba-before-after-image-arrow-left',
264 ),
265 array(
266 'property' => 'border-left-color',
267 'selector' => '.ba-before-after-image-arrow-wrapper .ba-before-after-image-arrow-right',
268 ),
269 ),
270 );
271
272 $this->controls['add_circle'] = array(
273 'tab' => 'content',
274 'group' => 'control',
275 'label' => esc_html__( 'Add Circle', 'bricksable' ),
276 'type' => 'checkbox',
277 'description' => esc_html__( 'Add Circle type to the control handler.', 'bricksable' ),
278 'default' => true,
279 );
280
281 $this->controls['control_circle_background_color'] = array(
282 'tab' => 'content',
283 'group' => 'control',
284 'label' => esc_html__( 'Control Circle Background Color', 'bricksable' ),
285 'type' => 'color',
286 'inline' => true,
287 'css' => array(
288 array(
289 'property' => 'background-color',
290 'selector' => '.ba-before-after-image-circle',
291 ),
292 ),
293 'required' => array( 'add_circle', '=', true ),
294 );
295
296 $this->controls['control_circle_size'] = array(
297 'tab' => 'content',
298 'group' => 'control',
299 'label' => esc_html__( 'Circle Size', 'bricksable' ),
300 'type' => 'slider',
301 'units' => array(
302 'px' => array(
303 'min' => 1,
304 'max' => 100,
305 'step' => 1,
306 ),
307 ),
308 'css' => array(
309 array(
310 'property' => 'width',
311 'selector' => '.ba-before-after-image-circle',
312 ),
313 array(
314 'property' => 'height',
315 'selector' => '.ba-before-after-image-circle',
316 ),
317 ),
318 'default' => '50px',
319 'required' => array( 'add_circle', '=', true ),
320 );
321
322 $this->controls['control_circle_radius'] = array(
323 'tab' => 'content',
324 'group' => 'control',
325 'label' => esc_html__( 'Circle Radius', 'bricksable' ),
326 'type' => 'slider',
327 'units' => array(
328 'px' => array(
329 'min' => 1,
330 'max' => 50,
331 'step' => 1,
332 ),
333 ),
334 'css' => array(
335 array(
336 'property' => 'border-radius',
337 'selector' => '.ba-before-after-image-circle',
338 ),
339 ),
340 'default' => '50px',
341 'required' => array( 'add_circle', '=', true ),
342 );
343
344 $this->controls['control_handler_width'] = array(
345 'tab' => 'content',
346 'group' => 'control',
347 'label' => esc_html__( 'Handler width', 'bricksable' ),
348 'type' => 'slider',
349 'units' => array(
350 'px' => array(
351 'min' => 1,
352 'max' => 20,
353 'step' => 1,
354 ),
355 ),
356 'css' => array(
357 array(
358 'property' => 'width',
359 'selector' => '.ba-before-after-image-horizontal .ba-before-after-image-control-line',
360 ),
361 array(
362 'property' => 'height',
363 'selector' => '.ba-before-after-image-vertical .ba-before-after-image-control-line',
364 ),
365 array(
366 'property' => 'border-width',
367 'selector' => '.ba-before-after-image-circle',
368 ),
369 ),
370 'default' => '2px',
371 );
372
373 // Settings.
374 $this->controls['vertical_mode'] = array(
375 'tab' => 'content',
376 'group' => 'settings',
377 'label' => esc_html__( 'Vertical Mode', 'bricksable' ),
378 'type' => 'checkbox',
379 );
380
381 $this->controls['slider_move_type'] = array(
382 'tab' => 'content',
383 'group' => 'settings',
384 'label' => esc_html__( 'Slider Move Type', 'bricksable' ),
385 'type' => 'select',
386 'options' => array(
387 'mouse_click' => esc_html__( 'Move on Click', 'bricksable' ),
388 'mouse_hover' => esc_html__( 'Move on Hover', 'bricksable' ),
389 ),
390 'inline' => true,
391 'clearable' => false,
392 'pasteStyles' => false,
393 'default' => 'mouse_click',
394 );
395
396 $this->controls['starting_point'] = array(
397 'tab' => 'content',
398 'group' => 'settings',
399 'label' => esc_html__( 'Starting point', 'bricksable' ),
400 'type' => 'number',
401 'min' => 0,
402 'max' => 100,
403 'step' => '10',
404 'default' => 50,
405 'inline' => true,
406 'description' => esc_html__( 'The percentage to show of the before image.', 'bricksable' ),
407 );
408 }
409
410 public function enqueue_scripts() {
411 if ( '' === get_option( 'bricksable_combine_minify_js' ) || false === get_option( 'bricksable_combine_minify_js' ) ) {
412 wp_enqueue_script( 'ba-before-after-image' );
413 wp_localize_script(
414 'ba-before-after-image',
415 'bricksableBeforeAfterImageData',
416 array(
417 'BeforeAfterImageInstances' => array(),
418 )
419 );
420 }
421 }
422
423 public function get_before_image_settings( $settings ) {
424 if ( ! isset( $settings['before_image'] ) ) {
425 $settings['before_image'] = array(
426 'id' => 0,
427 'url' => '',
428 );
429 return $settings;
430 }
431
432 $image = $settings['before_image'];
433
434 if ( isset( $image['useDynamicData']['name'] ) ) {
435 $images = $this->render_dynamic_data_tag( $image['useDynamicData']['name'] );
436 $image['id'] = empty( $images ) ? 0 : $images[0];
437 } else {
438 $image['id'] = isset( $image['id'] ) ? $image['id'] : 0;
439 }
440
441 // Image Size.
442 $image['size'] = isset( $image['size'] ) ? $settings['image']['size'] : BRICKS_DEFAULT_IMAGE_SIZE;
443
444 // Image URL.
445 if ( ! isset( $image['url'] ) ) {
446 $image['url'] = wp_get_attachment_image_url( $image['id'], $image['size'] );
447 }
448
449 $settings['before_image'] = $image;
450
451 return $settings;
452 }
453
454 public function get_after_image_settings( $settings ) {
455 if ( ! isset( $settings['after_image'] ) ) {
456 $settings['after_image'] = array(
457 'id' => 1,
458 'url' => '',
459 );
460 return $settings;
461 }
462
463 $image = $settings['after_image'];
464
465 if ( isset( $image['useDynamicData']['name'] ) ) {
466 $images = $this->render_dynamic_data_tag( $image['useDynamicData']['name'] );
467 $image['id'] = empty( $images ) ? 0 : $images[0];
468 } else {
469 $image['id'] = isset( $image['id'] ) ? $image['id'] : 0;
470 }
471
472 // Image Size.
473 $image['size'] = isset( $image['size'] ) ? $settings['image']['size'] : BRICKS_DEFAULT_IMAGE_SIZE;
474
475 // Image URL.
476 if ( ! isset( $image['url'] ) ) {
477 $image['url'] = wp_get_attachment_image_url( $image['id'], $image['size'] );
478 }
479
480 $settings['after_image'] = $image;
481
482 return $settings;
483 }
484
485 public function render() {
486 $settings = $this->settings;
487 $before_settings = $this->get_before_image_settings( $settings );
488 $after_settings = $this->get_after_image_settings( $settings );
489 $labels_on_hover = isset( $settings['labels_onHover'] ) ? true : false;
490
491 $image_wrapper_classes = array( 'ba-before-after-image-wrapper' );
492 $image_wrapper_classes[] = true === $labels_on_hover ? 'ba-before-after-image-label-on-hover' : '';
493
494 $image_before_atts = array();
495 $image_before_atts['id'] = isset( $image_before_atts['id'] ) ? 'image-' . $settings['before_image']['id'] : '';
496 $image_after_atts = array();
497 $image_after_atts['id'] = isset( $image_after_atts['id'] ) ? 'image-' . $settings['after_image']['id'] : '';
498
499 $before_after_image_options = array(
500 'addCircle' => isset( $settings['add_circle'] ) ? true : false,
501 'verticalMode' => isset( $settings['vertical_mode'] ) ? true : false,
502 'onHover' => $labels_on_hover,
503 'hoverStart' => 'mouse_hover' === $settings['slider_move_type'] ? true : false,
504 'startingPoint' => isset( $settings['starting_point'] ) ? intval( $settings['starting_point'] ) : 50,
505 );
506
507 $this->set_attribute( 'image-wrapper', 'class', $image_wrapper_classes );
508 $this->set_attribute( 'image-wrapper', 'id', esc_attr( 'ba-before-after-image-' . $this->id ) );
509 $this->set_attribute( 'image-wrapper', 'data-ba-bricks-before-after-image-options', wp_json_encode( $before_after_image_options ) );
510
511 echo '<div ' . $this->render_attributes( 'image-wrapper' ) . '>'; //phpcs:ignore
512 // Lazy load atts set via 'wp_get_attachment_image_attributes' filter.
513 if ( isset( $settings['before_image']['id'] ) ) {
514 echo wp_get_attachment_image( $settings['before_image']['id'], $settings['before_image']['size'], false, $image_before_atts );
515 } elseif ( ! empty( $settings['before_image']['url'] ) ) {
516 echo '<img src="' . esc_url( $settings['before_image']['url'] ) . '">';
517 }
518 if ( isset( $settings['show_labels'] ) ) {
519 if ( isset( $settings['before_label'] ) ) {
520 echo '<span class="ba-before-after-image-label ba-before-after-image-label-before keep">';
521 echo esc_html( $settings['before_label'] );
522 echo '</span>';
523 }
524 if ( isset( $settings['after_label'] ) ) {
525 echo '<span class="ba-before-after-image-label ba-before-after-image-label-after keep">';
526 echo esc_html( $settings['after_label'] );
527 echo '</span>';
528 }
529 }
530
531 // Lazy load atts set via 'wp_get_attachment_image_attributes' filter.
532 if ( isset( $settings['after_image']['id'] ) ) {
533 echo wp_get_attachment_image( $settings['after_image']['id'], $settings['after_image']['size'], false, $image_after_atts );
534 } elseif ( ! empty( $settings['after_image']['url'] ) ) {
535 echo '<img src="' . esc_url( $settings['after_image']['url'] ) . '">';
536 }
537 echo '</div>';
538 }
539 }
540