PluginProbe
Bricksable for Bricks Builder / 1.4.32
Bricksable for Bricks Builder v1.4.32
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-tilt-image.php

element-tilt-image.php in Bricksable for Bricks Builder 1.4.32, at includes/elements/element-tilt-image.php

755 lines 25.1 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_Tilt_Image extends \Bricks\Element {
8 public $category = 'bricksable';
9 public $name = 'ba-tilt-image';
10 public $icon = 'ti-image';
11 public $css_selector = '.ba-tilt-image-wrapper img';
12 public $scripts = array( 'bricksableTiltImage' );
13
14 public function get_label() {
15 return esc_html__( 'Tilt 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['tilt_settings'] = array(
23 'title' => esc_html__( 'Tilt Settings', 'bricksable' ),
24 'tab' => 'content',
25 );
26 $this->control_groups['tilt_alignment'] = array(
27 'title' => esc_html__( 'Alignment', 'bricksable' ),
28 'tab' => 'style',
29 );
30 $this->control_groups['overlay'] = array(
31 'title' => esc_html__( 'Overlay Content', 'bricksable' ),
32 'tab' => 'content',
33 );
34 $this->control_groups['overlay_style'] = array(
35 'title' => esc_html__( 'Overlay', 'bricksable' ),
36 'tab' => 'style',
37 );
38 unset( $this->control_groups['_typography'] );
39 }
40
41 public function set_controls() {
42 $this->controls['_gradient']['css'][0]['selector'] = '.ba-tilt-image-wrapper';
43 $this->controls['_border']['css'][] =
44 array(
45 'property' => 'border',
46 'selector' => '.ba-tilt-image-wrapper:before',
47 );
48 array(
49 'property' => 'border',
50 'selector' => '.ba-tilt-image-wrapper img',
51 );
52
53 $this->controls['image'] = array(
54 'tab' => 'content',
55 'group' => 'image',
56 'type' => 'image',
57 );
58 // Link To.
59 $this->controls['linkToSeparator'] = array(
60 'tab' => 'content',
61 'group' => 'image',
62 'type' => 'separator',
63 'label' => esc_html__( 'Link To', 'bricksable' ),
64 );
65
66 $this->controls['link'] = array(
67 'tab' => 'content',
68 'group' => 'image',
69 'type' => 'select',
70 'options' => array(
71 'lightbox' => esc_html__( 'Lightbox', 'bricksable' ),
72 'attachment' => esc_html__( 'Attachment Page', 'bricksable' ),
73 'media' => esc_html__( 'Media File', 'bricksable' ),
74 'url' => esc_html__( 'Other (URL)', 'bricksable' ),
75 ),
76 'placeholder' => esc_html__( 'None', 'bricksable' ),
77 );
78
79 $this->controls['url'] = array(
80 'tab' => 'content',
81 'group' => 'image',
82 'label' => esc_html__( 'Link type', 'bricksable' ),
83 'type' => 'link',
84 'required' => array( 'link', '=', 'url' ),
85 );
86
87 // Alignment.
88 $this->controls['tilt_textAlign'] = array(
89 'tab' => 'style',
90 'group' => 'tilt_alignment',
91 'label' => esc_html__( 'Text align', 'bricksable' ),
92 'type' => 'text-align',
93 'css' => array(
94 array(
95 'property' => 'text-align',
96 'selector' => '.ba-tilt-image-wrapper .image-overlay-content',
97 ),
98 array(
99 'property' => 'text-align',
100 'selector' => '.ba-tilt-image-wrapper .ba-tilt-image-overlay-caption',
101 ),
102 ),
103 'default' => 'center',
104 'placeholder' => esc_html__( 'Center', 'bricksable' ),
105 'inline' => true,
106 );
107
108 $this->controls['tilt_verticalAlign'] = array(
109 'tab' => 'style',
110 'group' => 'tilt_alignment',
111 'label' => esc_html__( 'Vertical align', 'bricksable' ),
112 'type' => 'align-items',
113 'exclude' => array(
114 'stretch',
115 ),
116 'css' => array(
117 array(
118 'property' => 'align-items',
119 'selector' => '.ba-tilt-image-wrapper .image-overlay-wrapper',
120 ),
121 ),
122 'inline' => true,
123 'default' => 'center',
124 'placeholder' => esc_html__( 'Center', 'bricksable' ),
125 );
126
127 // Overlay.
128 $this->controls['imageOverlayShowHover'] = array(
129 'tab' => 'content',
130 'group' => 'overlay',
131 'label' => esc_html__( 'Only show overlay on hover', 'bricksable' ),
132 'type' => 'checkbox',
133 'inline' => true,
134 'description' => esc_html__( 'Set your overlay in the style tab (Gradient/Overlay).', 'bricksable' ),
135 );
136
137 // Title & Caption.
138
139 $this->controls['title_caption_separator'] = array(
140 'tab' => 'content',
141 'group' => 'overlay',
142 'type' => 'separator',
143 'label' => esc_html__( 'Title & Caption', 'bricksable' ),
144 );
145
146 $this->controls['overlay_title'] = array(
147 'tab' => 'content',
148 'group' => 'overlay',
149 'label' => esc_html__( 'Title Type', 'bricksable' ),
150 'type' => 'select',
151 'options' => array(
152 'none' => esc_html__( 'No title', 'bricksable' ),
153 'attachment' => esc_html__( 'Attachment', 'bricksable' ),
154 'custom' => esc_html__( 'Custom', 'bricksable' ),
155 ),
156 'inline' => true,
157 'placeholder' => esc_html__( 'No title', 'bricksable' ),
158 );
159
160 $this->controls['overlay_title_custom'] = array(
161 'tab' => 'content',
162 'group' => 'overlay',
163 'label' => esc_html__( 'Overlay Title', 'bricksable' ),
164 'type' => 'text',
165 'spellcheck' => true,
166 'inlineEditing' => true,
167 'hasDynamicData' => 'text',
168 'required' => array( 'overlay_title', '=', 'custom' ),
169 );
170
171 $this->controls['overlay_title_tag'] = array(
172 'tab' => 'content',
173 'group' => 'overlay',
174 'label' => esc_html__( 'Title Tag', 'bricksable' ),
175 'type' => 'select',
176 'options' => array(
177 'h1' => esc_html__( 'Heading 1 (h1)', 'bricksable' ),
178 'h2' => esc_html__( 'Heading 2 (h2)', 'bricksable' ),
179 'h3' => esc_html__( 'Heading 3 (h3)', 'bricksable' ),
180 'h4' => esc_html__( 'Heading 4 (h4)', 'bricksable' ),
181 'h5' => esc_html__( 'Heading 5 (h5)', 'bricksable' ),
182 'h6' => esc_html__( 'Heading 6 (h6)', 'bricksable' ),
183 ),
184 'clearable' => false,
185 'pasteStyles' => false,
186 'default' => 'h3',
187 'inline' => true,
188 'required' => array( 'overlay_title', '!=', 'none' ),
189 );
190
191 $this->controls['overlay_caption'] = array(
192 'tab' => 'content',
193 'group' => 'overlay',
194 'label' => esc_html__( 'Caption Type', 'bricksable' ),
195 'type' => 'select',
196 'options' => array(
197 'none' => esc_html__( 'No caption', 'bricksable' ),
198 'attachment' => esc_html__( 'Attachment', 'bricksable' ),
199 'custom' => esc_html__( 'Custom', 'bricksable' ),
200 ),
201 'inline' => true,
202 'placeholder' => esc_html__( 'No caption', 'bricksable' ),
203 );
204
205 $this->controls['overlay_caption_custom'] = array(
206 'tab' => 'content',
207 'group' => 'overlay',
208 'label' => esc_html__( 'Custom caption', 'bricksable' ),
209 'type' => 'text',
210 'placeholder' => esc_html__( 'Here goes your caption ...', 'bricksable' ),
211 'required' => array( 'overlay_caption', '=', 'custom' ),
212 );
213
214 $this->controls['overlayShowHover'] = array(
215 'tab' => 'content',
216 'group' => 'overlay',
217 'label' => esc_html__( 'Only show on hover', 'bricksable' ),
218 'type' => 'checkbox',
219 'inline' => true,
220 );
221
222 $this->controls['overlay_icon_separator'] = array(
223 'tab' => 'content',
224 'group' => 'overlay',
225 'label' => esc_html__( 'Icon', 'bricksable' ),
226 'type' => 'separator',
227 'inline' => true,
228 'small' => true,
229 );
230
231 $this->controls['overlay_icon'] = array(
232 'tab' => 'content',
233 'group' => 'overlay',
234 'label' => esc_html__( 'Icon', 'bricksable' ),
235 'type' => 'icon',
236 'inline' => true,
237 'small' => true,
238 );
239
240 $this->controls['overlay_translatez'] = array(
241 'tab' => 'style',
242 'group' => 'overlay_style',
243 'label' => esc_html__( 'Overlay Content Distance', 'bricksable' ),
244 'type' => 'slider',
245 'css' => array(
246 array(
247 'property' => 'transform:translateZ',
248 'selector' => '.image-overlay-wrapper',
249 ),
250 ),
251 'units' => array(
252 'px' => array(
253 'min' => 1,
254 'max' => 200,
255 'step' => 1,
256 ),
257 ),
258 'default' => '50px',
259 'description' => esc_html__( 'Adjust the distance between the image and the overlay content.', 'bricksable' ),
260 );
261
262 $this->controls['overlay_title_typography'] = array(
263 'tab' => 'style',
264 'group' => 'overlay_style',
265 'label' => esc_html__( 'Title Typography', 'bricksable' ),
266 'type' => 'typography',
267 'css' => array(
268 array(
269 'property' => 'font',
270 'selector' => '.ba-tilt-image-overlay-title',
271 ),
272 ),
273 'inline' => true,
274 'small' => true,
275 'required' => array( 'overlay_title', '!=', '' ),
276 );
277
278 $this->controls['overlay_caption_typography'] = array(
279 'tab' => 'style',
280 'group' => 'overlay_style',
281 'label' => esc_html__( 'Caption Typography', 'bricksable' ),
282 'type' => 'typography',
283 'css' => array(
284 array(
285 'property' => 'font',
286 'selector' => '.ba-tilt-image-caption',
287 ),
288 ),
289 'inline' => true,
290 'small' => true,
291 'required' => array( 'overlay_title', '!=', '' ),
292 );
293
294 $this->controls['overlay_style_icon_separator'] = array(
295 'tab' => 'style',
296 'group' => 'overlay_style',
297 'label' => esc_html__( 'Icon', 'bricksable' ),
298 'type' => 'separator',
299 'inline' => true,
300 'small' => true,
301 );
302
303 $this->controls['overlay_icon_border'] = array(
304 'tab' => 'style',
305 'group' => 'overlay_style',
306 'label' => esc_html__( 'Icon border', 'bricksable' ),
307 'type' => 'border',
308 'css' => array(
309 array(
310 'property' => 'border',
311 'selector' => '.image-overlay-wrapper .overlay-icon',
312 ),
313 ),
314 'inline' => true,
315 'small' => true,
316 'required' => array( 'overlay_icon', '!=', '' ),
317 );
318
319 $this->controls['overlay_icon_boxshadow'] = array(
320 'tab' => 'style',
321 'group' => 'overlay_style',
322 'label' => esc_html__( 'Icon box shadow', 'bricksable' ),
323 'type' => 'box-shadow',
324 'css' => array(
325 array(
326 'property' => 'box-shadow',
327 'selector' => '.image-overlay-wrapper .overlay-icon',
328 ),
329 ),
330 'inline' => true,
331 'small' => true,
332 'required' => array( 'overlay_icon', '!=', '' ),
333 );
334
335 $this->controls['overlay_icon_height'] = array(
336 'tab' => 'style',
337 'group' => 'overlay_style',
338 'label' => esc_html__( 'Icon height', 'bricksable' ),
339 'type' => 'number',
340 'unit' => 'px',
341 'css' => array(
342 array(
343 'property' => 'line-height',
344 'selector' => '.image-overlay-wrapper .overlay-icon',
345 ),
346 ),
347 'inline' => true,
348 'small' => true,
349 'required' => array( 'overlay_icon', '!=', '' ),
350 );
351
352 $this->controls['overlay_icon_width'] = array(
353 'tab' => 'style',
354 'group' => 'overlay_style',
355 'label' => esc_html__( 'Icon width', 'bricksable' ),
356 'type' => 'number',
357 'unit' => 'px',
358 'css' => array(
359 array(
360 'property' => 'width',
361 'selector' => '.image-overlay-wrapper .overlay-icon',
362 ),
363 ),
364 'inline' => true,
365 'small' => true,
366 'required' => array( 'overlay_icon', '!=', '' ),
367 );
368
369 $this->controls['overlay_icon_typography'] = array(
370 'tab' => 'style',
371 'group' => 'overlay_style',
372 'label' => esc_html__( 'Icon typography', 'bricksable' ),
373 'type' => 'typography',
374 'exclude' => array(
375 'font-family',
376 'font-weight',
377 'text-align',
378 'text-transform',
379 'line-height',
380 'letter-spacing',
381 ),
382 'css' => array(
383 array(
384 'property' => 'font',
385 'selector' => '.image-overlay-wrapper .overlay-icon',
386 ),
387 ),
388 'inline' => true,
389 'small' => true,
390 'required' => array( 'overlay_icon', '!=', '' ),
391 );
392
393 // Tilt Settings.
394 $this->controls['tilt_reverse'] = array(
395 'tab' => 'content',
396 'group' => 'tilt_settings',
397 'label' => esc_html__( 'Reverse', 'bricksable' ),
398 'type' => 'checkbox',
399 'inline' => true,
400 'description' => esc_html__( 'Reverse the tilt direction.', 'bricksable' ),
401 );
402 $this->controls['tilt_max'] = array(
403 'tab' => 'content',
404 'group' => 'tilt_settings',
405 'label' => esc_html__( 'Tilt rotation', 'bricksable' ),
406 'type' => 'slider',
407 'unitless' => true,
408 'min' => 10,
409 'max' => 100,
410 'step' => '1',
411 'default' => 40,
412 );
413
414 $this->controls['tilt_speed'] = array(
415 'tab' => 'content',
416 'group' => 'tilt_settings',
417 'label' => esc_html__( 'Tilt Speed', 'bricksable' ),
418 'type' => 'slider',
419 'unitless' => true,
420 'min' => 200,
421 'max' => 2000,
422 'step' => '100',
423 'default' => 1000,
424 );
425
426 $this->controls['tilt_perspective'] = array(
427 'tab' => 'content',
428 'group' => 'tilt_settings',
429 'label' => esc_html__( 'Tilt Perspective', 'bricksable' ),
430 'type' => 'slider',
431 'unitless' => true,
432 'min' => 200,
433 'max' => 1200,
434 'step' => '100',
435 'default' => 1000,
436 );
437
438 $this->controls['tilt_scale'] = array(
439 'tab' => 'content',
440 'group' => 'tilt_settings',
441 'label' => esc_html__( 'Tilt Scale', 'bricksable' ),
442 'type' => 'number',
443 'unitless' => true,
444 'min' => 1,
445 'max' => 2,
446 'step' => '0.1',
447 'default' => 1,
448 );
449
450 $this->controls['tilt_glare'] = array(
451 'tab' => 'content',
452 'group' => 'tilt_settings',
453 'label' => esc_html__( 'Use glare', 'bricksable' ),
454 'type' => 'checkbox',
455 'inline' => true,
456 'description' => esc_html__( 'Setting this option will enable a glare effect.', 'bricksable' ),
457 );
458
459 $this->controls['tilt_max_glare'] = array(
460 'tab' => 'content',
461 'group' => 'tilt_settings',
462 'label' => esc_html__( 'Max Glare', 'bricksable' ),
463 'type' => 'number',
464 'unitless' => true,
465 'min' => 0.1,
466 'max' => 1,
467 'step' => '0.1',
468 'default' => 0.8,
469 'required' => array( 'tilt_glare', '=', true ),
470 );
471 }
472
473 public function enqueue_scripts() {
474 wp_enqueue_style( 'ba-tilt-image' );
475 wp_enqueue_script( 'ba-tilt-image' );
476 wp_localize_script(
477 'ba-tilt-image',
478 'bricksableTiltImageData',
479 array(
480 'tiltImageInstances' => array(),
481 )
482 );
483 }
484
485 public function get_normalized_image_settings( $settings ) {
486 if ( ! isset( $settings['image'] ) ) {
487 $settings['image'] = array(
488 'id' => 0,
489 'url' => '',
490 );
491 return $settings;
492 }
493
494 $image = $settings['image'];
495
496 if ( isset( $image['useDynamicData']['name'] ) ) {
497 $images = $this->render_dynamic_data_tag( $image['useDynamicData']['name'] );
498 $image['id'] = empty( $images ) ? 0 : $images[0];
499 } else {
500 $image['id'] = isset( $image['id'] ) ? $image['id'] : 0;
501 }
502
503 // Image Size.
504 $image['size'] = isset( $image['size'] ) ? $settings['image']['size'] : BRICKS_DEFAULT_IMAGE_SIZE;
505
506 // Image URL.
507 if ( ! isset( $image['url'] ) ) {
508 $image['url'] = wp_get_attachment_image_url( $image['id'], $image['size'] );
509 }
510
511 $settings['image'] = $image;
512
513 return $settings;
514 }
515
516 public function render() {
517 $settings = $this->settings;
518 $settings = $this->get_normalized_image_settings( $settings );
519
520 $tilt_max = isset( $settings['tilt_max'] ) ? intval( $settings['tilt_max'] ) : 40;
521 $tilt_speed = isset( $settings['tilt_speed'] ) ? intval( $settings['tilt_speed'] ) : 1000;
522 $tilt_perspective = isset( $settings['tilt_perspective'] ) ? intval( $settings['tilt_perspective'] ) : 1000;
523 $tilt_scale = isset( $settings['tilt_scale'] ) ? round( $settings['tilt_scale'], 1 ) : 1;
524 $tilt_glare = isset( $settings['tilt_glare'] ) ? true : false;
525 $tilt_maxglare = isset( $settings['tilt_max_glare'] ) ? round( $settings['tilt_max_glare'], 1 ) : 1;
526 $tilt_reverse = isset( $settings['tilt_reverse'] ) ? true : false;
527
528 $tilt_options = array(
529 'max' => $tilt_max,
530 'speed' => $tilt_speed,
531 'perspective' => $tilt_perspective,
532 'scale' => $tilt_scale,
533 'glare' => $tilt_glare,
534 'max-glare' => $tilt_maxglare,
535 'reverse' => $tilt_reverse,
536 );
537
538 // Dynamic Data is empty.
539 if ( isset( $settings['image']['useDynamicData']['name'] ) ) {
540
541 if ( empty( $settings['image']['id'] ) ) {
542
543 if ( 'ACF' === $settings['image']['useDynamicData']['group'] && ! class_exists( 'ACF' ) ) {
544 $message = esc_html__( 'Can\'t render element, as the selected ACF field is not available. Please activate ACF or edit the element to select different data.', 'bricksable' );
545 } elseif ( '{featured_image}' === $settings['image']['useDynamicData']['name'] ) {
546 $message = esc_html__( 'No featured image set.', 'bricksable' );
547 } else {
548 /* translators: 1: Data 2: Dynamic Value */
549 $message = esc_html__( 'Dynamic Data %1$s (%2$s) is empty.', 'bricksable' );
550 }
551
552 $this->set_attribute( 'ba-no-image-wrapper', 'class', 'ba-tilt-image-wrapper' );
553 $this->set_attribute( 'ba-no-image-wrapper', 'id', esc_attr( 'ba-tilt-image-' . $this->id ) );
554 $this->set_attribute( 'ba-no-image-wrapper', 'data-ba-bricks-tilt-image-options', wp_json_encode( $tilt_options ) );
555
556 echo '<div ' . $this->render_attributes( 'ba-no-image-wrapper' ) . '>'; //phpcs:ignore
557
558 return $this->render_element_placeholder(
559 array(
560 'icon-class' => 'ti-image',
561 'text' => sprintf(
562 $message,
563 $settings['image']['useDynamicData']['label'],
564 $settings['image']['useDynamicData']['group']
565 ),
566 )
567 );
568 //phpcs:ignore
569 echo '</div>';
570
571 }
572 } else {
573 // Image id is empty or doesn't exist.
574 // No image.
575 if ( empty( $settings['image']['id'] ) ) {
576 $this->set_attribute( 'ba-no-image-wrapper', 'class', 'ba-tilt-image-wrapper' );
577 $this->set_attribute( 'ba-no-image-wrapper', 'id', esc_attr( 'ba-tilt-image-' . $this->id ) );
578 $this->set_attribute( 'ba-no-image-wrapper', 'data-ba-bricks-tilt-image-options', wp_json_encode( $tilt_options ) );
579
580 echo '<div ' . $this->render_attributes( 'ba-no-image-wrapper' ) . '>'; //phpcs:ignore
581
582 return $this->render_element_placeholder(
583 array(
584 'icon-class' => 'ti-image',
585 'text' => esc_html__( 'No image selected.', 'bricksable' ),
586 )
587 );
588 //phpcs:ignore
589 echo '</div>';
590 }
591
592 // Return if image ID does not exist.
593 if ( ! wp_get_attachment_image_src( $settings['image']['id'] ) ) {
594 return $this->render_element_placeholder(
595 array(
596 'icon-class' => 'ti-image',
597 /* translators: 1: Image ID */
598 'text' => sprintf( esc_html__( 'Image ID (%s) no longer exist. Please select another image.', 'bricksable' ), $settings['image']['id'] ),
599 )
600 );
601 }
602 }
603
604 // Render.
605 $image_atts = array();
606 $image_atts['id'] = 'image-' . $settings['image']['id'];
607
608 $image_wrapper_classes = array( 'ba-tilt-image-wrapper' );
609 $img_classes = array( 'post-thumbnail', 'css-filter' );
610
611 if ( isset( $settings['overlayShowHover'] ) ) {
612 $image_wrapper_classes[] = 'ba-tilt-image-show-hover';
613 }
614
615 if ( isset( $settings['imageOverlayShowHover'] ) ) {
616 $image_wrapper_classes[] = 'ba-tilt-image-overlay-hover';
617 }
618
619 if ( isset( $settings['link'] ) && 'lightbox' === $settings['link'] ) {
620 $image_wrapper_classes[] = 'bricks-lightbox';
621
622 $image_src = $settings['image']['id'] ? wp_get_attachment_image_src( $settings['image']['id'], 'full' ) : array(
623 \Bricks\Builder::get_template_placeholder_image(),
624 800,
625 600,
626 );
627 $this->set_attribute( 'image-wrapper', 'data-bricks-lightbox-source="' . $image_src[0] . '"' );
628 $this->set_attribute( 'image-wrapper', 'data-bricks-lightbox-width="' . $image_src[1] . '"' );
629 $this->set_attribute( 'image-wrapper', 'data-bricks-lightbox-height="' . $image_src[2] . '"' );
630 }
631
632 $img_classes[] = 'size-' . $settings['image']['size'];
633 $image_atts['class'] = join( ' ', $img_classes );
634
635 // Title.
636 $show_title = isset( $settings['overlay_title'] ) ? $settings['overlay_title'] : 'none';
637
638 if ( 'none' === $show_title ) {
639 $image_title = false;
640 } elseif ( 'custom' === $show_title && isset( $settings['overlay_title_custom'] ) ) {
641 $image_title = trim( $settings['overlay_title_custom'] );
642 } else {
643 $image_data = get_post( $settings['image']['id'] );
644 $image_title = $image_data ? $image_data->post_title : '';
645 }
646
647 // Caption.
648 $show_caption = isset( $settings['overlay_caption'] ) ? $settings['overlay_caption'] : 'none';
649
650 if ( 'none' === $show_caption ) {
651 $image_caption = false;
652 } elseif ( 'custom' === $show_caption && isset( $settings['overlay_caption_custom'] ) ) {
653 $image_caption = trim( $settings['overlay_caption_custom'] );
654 } else {
655 $image_data = get_post( $settings['image']['id'] );
656 $image_caption = $image_data ? $image_data->post_excerpt : '';
657 }
658
659 if ( substr( BRICKS_VERSION, 0, 3 ) > '1.3' ) {
660 //phpcs:ignore
661 echo "<div {$this->render_attributes( '_root' )}>";
662 }
663
664 $this->set_attribute( 'image-wrapper', 'data-ba-bricks-tilt-image-options', wp_json_encode( $tilt_options ) );
665
666 $this->set_attribute( 'image-wrapper', 'class', $image_wrapper_classes );
667 $this->set_attribute( 'image-wrapper', 'id', esc_attr( 'ba-tilt-image-' . $this->id ) );
668 $this->set_attribute( 'image-wrapper', 'data-tilt' );
669 $this->set_attribute( 'image-wrapper', 'data-tilt-max="' . $tilt_max . '"' );
670 $this->set_attribute( 'image-wrapper', 'data-tilt-speed="' . $tilt_speed . '"' );
671 $this->set_attribute( 'image-wrapper', 'data-tilt-perspective="' . $tilt_perspective . '"' );
672 $this->set_attribute( 'image-wrapper', 'data-tilt-scale="' . $tilt_scale . '"' );
673 $this->set_attribute( 'image-wrapper', true === $tilt_glare ? ' data-tilt-glare' : '' );
674 $this->set_attribute( 'image-wrapper', 'data-tilt-max-glare="' . $tilt_maxglare . '"' );
675 $this->set_attribute( 'image-wrapper', 'data-tilt-reverse="' . $tilt_reverse . '"' );
676
677 echo '<figure ' . $this->render_attributes( 'image-wrapper' ) . '>'; //phpcs:ignore
678
679 $close_a_tag = false;
680
681 if ( isset( $settings['link'] ) && 'media' === $settings['link'] ) {
682 $close_a_tag = true;
683
684 echo '<a href="' . esc_url( wp_get_attachment_url( $settings['image']['id'] ) ) . '" target="_blank">';
685 }
686
687 if ( isset( $settings['link'] ) && 'attachment' === $settings['link'] ) {
688 echo '<a href="' . esc_url( get_permalink( $settings['image']['id'] ) ) . '" target="_blank">';
689 }
690
691 if ( isset( $settings['link'] ) && 'url' === $settings['link'] && isset( $settings['url'] ) ) {
692 $close_a_tag = true;
693
694 // Link.
695 $this->set_link_attributes( 'a', $settings['url'] );
696
697 echo '<a ' . $this->render_attributes( 'a' ) . '>'; //phpcs:ignore
698 }
699
700 // Lazy load atts set via 'wp_get_attachment_image_attributes' filter.
701 if ( isset( $settings['image']['id'] ) ) {
702 echo wp_get_attachment_image( $settings['image']['id'], $settings['image']['size'], false, $image_atts );
703 } elseif ( ! empty( $settings['image']['url'] ) ) {
704 echo '<img src="' . esc_url( $settings['image']['url'] ) . '">';
705 }
706
707 if ( 'none' !== $show_title || 'none' !== $show_caption || isset( $settings['overlay_icon']['icon'] ) ) {
708 $overlay_title_tag = isset( $settings['overlay_title_tag'] ) ? esc_html( $settings['overlay_title_tag'] ) : 'h3';
709 $overlay_title_classes = array(
710 'ba-tilt-image-overlay-title',
711 'bricks-heading',
712 'bricks-heading-' . $overlay_title_tag,
713 );
714 $this->set_attribute( 'overlay_title', $overlay_title_tag );
715 $this->set_attribute( 'overlay_title', 'class', $overlay_title_classes );
716 if ( isset( $settings['overlay_icon']['icon'] ) ) {
717 $icon_classes = array( 'overlay-icon', $settings['overlay_icon']['icon'], 'icon' );
718 $this->set_attribute( 'overlay-icon-wrapper', 'class', 'overlay-icon-wrapper' );
719 $this->set_attribute( 'overlay-icon', 'class', $icon_classes );
720 }
721
722 $overlay_title_output = '<' . $this->render_attributes( 'overlay_title' ) . '>' . esc_html( $image_title ) . '</' . $overlay_title_tag . '>';
723
724 $this->set_attribute( 'image-overlay-wrapper', 'class', 'image-overlay-wrapper' );
725 $this->set_attribute( 'image-overlay-content', 'class', 'image-overlay-content' );
726
727 echo '<div ' . $this->render_attributes( 'image-overlay-wrapper' ) . '>'; //phpcs:ignore
728 echo '<div ' . $this->render_attributes( 'image-overlay-content' ) . '>'; //phpcs:ignore
729 if ( isset( $settings['overlay_icon']['icon'] ) ) {
730 echo '<div ' . $this->render_attributes( 'overlay-icon-wrapper' ) . '>'; //phpcs:ignore
731 echo '<i ' . $this->render_attributes( 'overlay-icon' ) . '></i>'; //phpcs:ignore
732 echo '</div>';
733 }
734 if ( $image_title ) {
735 //phpcs:ignore
736 echo $overlay_title_output;
737 }
738 if ( $image_caption ) {
739 echo '<figcaption class="ba-tilt-image-overlay-caption">' . esc_html( $image_caption ) . '</figcaption>';
740 }
741 echo '</div>';
742 echo '</div>';
743 }
744
745 if ( $close_a_tag ) {
746 echo '</a>';
747 }
748
749 echo '</figure>';
750 if ( substr( BRICKS_VERSION, 0, 3 ) > '1.3' ) {
751 echo '</div>';
752 }
753 }
754 }
755