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

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

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