PluginProbe
Borderless – Addons and Templates for Elementor / 1.6.1
Borderless – Addons and Templates for Elementor v1.6.1
trunk 1.0.0 1.0.1 1.0.2 1.0.3 1.0.4 1.0.5 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.2 1.1.3 1.1.4 1.1.5 1.1.6 1.1.7 1.1.8 1.1.9 1.2.0 1.2.1 1.2.2 1.2.3 All 78 releases
borderless / modules / elementor / widgets / portfolio.php

portfolio.php in Borderless – Addons and Templates for Elementor 1.6.1, at modules/elementor/widgets/portfolio.php

1,353 lines 41.9 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace Borderless\Widgets;
4
5 if ( ! defined( 'ABSPATH' ) ) exit; // Exit if accessed directly
6
7 use Elementor\Widget_Base;
8 use Elementor\Controls_Manager;
9 use Elementor\Group_Control_Border;
10 use Elementor\Group_Control_Box_Shadow;
11 use Elementor\Group_Control_Image_Size;
12 use \Elementor\Group_Control_Typography;
13 use \Elementor\Core\Kits\Documents\Tabs\Global_Typography;
14 use \Elementor\Group_Control_Background;
15 use \Elementor\Group_Control_Css_Filter;
16 use \Elementor\Repeater;
17 use Elementor\Utils;
18
19 class Portfolio extends Widget_Base {
20
21 public function get_name() {
22 return 'borderless-elementor-portfolio';
23 }
24
25 public function get_title() {
26 return esc_html__('Portfolio', 'borderless');
27 }
28
29 public function get_icon() {
30 return 'borderless-icon-portfolio';
31 }
32
33 public function get_categories() {
34 return [ 'borderless' ];
35 }
36
37 public function get_keywords()
38 {
39 return [
40 'portfolio',
41 'portfolio gallery',
42 'borderless portfolio',
43 'borderless portfolio gallery',
44 'borderless'
45 ];
46 }
47
48 public function get_style_depends() {
49 return [ 'elementor-widget-portfolio' ];
50 }
51
52 public function get_script_depends() {
53 return [ 'borderless-elementor-isotope-script' ];
54 }
55
56 protected function _register_controls() {
57
58 /*-----------------------------------------------------------------------------------*/
59 /* *. Portfolio/Source - Content
60 /*-----------------------------------------------------------------------------------*/
61
62 $this->start_controls_section(
63 'borderless_elementor_section_portfolio',
64 [
65 'label' => esc_html__( 'Content Source', 'borderless' ),
66 'tab' => Controls_Manager::TAB_CONTENT,
67 ]
68 );
69
70 $this->add_control(
71 'borderless_elementor_portfolio_content_source',
72 [
73 'label' => __( 'Content Source', 'borderless' ),
74 'description' => __( 'Choose Query to Use Post Types or Static to Create Each Item.', 'borderless' ),
75 'type' => \Elementor\Controls_Manager::SELECT,
76 'default' => 'static',
77 'options' => [
78 'static' => __( 'Static', 'borderless' ),
79 'query' => __( 'Query', 'borderless' ),
80 ],
81 ]
82 );
83
84 $this->end_controls_section();
85
86
87 /*-----------------------------------------------------------------------------------*/
88 /* *. Portfolio/Items - Content
89 /*-----------------------------------------------------------------------------------*/
90
91 $this->start_controls_section(
92 'borderless_elementor_section_portfolio_items',
93 [
94 'label' => esc_html__( 'Items', 'borderless' ),
95 'tab' => Controls_Manager::TAB_CONTENT,
96 'condition' => array(
97 'borderless_elementor_portfolio_content_source' => 'static',
98 ),
99 ]
100 );
101
102 $repeater = new Repeater();
103
104 $repeater->add_control(
105 'borderless_elementor_portfolio_item_title',
106 [
107 'label' => esc_html__( 'Title', 'borderless'),
108 'type' => Controls_Manager::TEXT,
109 'label_block' => true,
110 'dynamic' => [ 'active' => true ]
111 ]
112 );
113
114 $repeater->add_control(
115 'borderless_elementor_portfolio_item_description',
116 [
117 'label' => esc_html__( 'Description', 'borderless'),
118 'type' => Controls_Manager::TEXTAREA,
119 'dynamic' => [ 'active' => true ]
120 ]
121 );
122
123 $repeater->add_control(
124 'borderless_elementor_portfolio_item_image',
125 [
126 'label' => __( 'Image', 'borderless' ),
127 'type' => Controls_Manager::MEDIA,
128 'default' => [
129 'url' => Utils::get_placeholder_image_src(),
130 ],
131 'dynamic' => [ 'active' => true ],
132 'separator' => 'before',
133 ]
134 );
135
136 $repeater->add_group_control(
137 Group_Control_Image_Size::get_type(),
138 [
139 'name' => 'borderless_elementor_portfolio_item_image',
140 'default' => 'large',
141 'separator' => 'none',
142 ]
143 );
144
145 $repeater->add_control(
146 'borderless_elementor_portfolio_item_image_link',
147 [
148 'label' => __( 'Image Link', 'borderless' ),
149 'type' => \Elementor\Controls_Manager::SELECT,
150 'default' => 'static',
151 'options' => [
152 'none' => __( 'None', 'borderless' ),
153 'lightbox' => __( 'Lightbox', 'borderless' ),
154 'external' => __( 'External', 'borderless' ),
155 ],
156 ]
157 );
158
159 $repeater->add_control(
160 'borderless_elementor_portfolio_item_button_text',
161 [
162 'label' => esc_html__( 'Button Text', 'borderless'),
163 'type' => Controls_Manager::TEXT,
164 'default' => esc_html__( 'View More', 'borderless' ),
165 'dynamic' => [ 'active' => true ],
166 'separator' => 'before',
167 ]
168 );
169
170 $repeater->add_control(
171 'borderless_elementor_portfolio_item_button_link',
172 array(
173 'label' => esc_html__( 'Button Link', 'borderless' ),
174 'type' => Controls_Manager::URL,
175 'placeholder' => 'https://your-link.com',
176 'default' => array(
177 'url' => '',
178 ),
179 'dynamic' => array( 'active' => true ),
180 )
181 );
182
183 $repeater->add_control(
184 'borderless_elementor_portfolio_item_filter',
185 [
186 'label' => esc_html__( 'Filter', 'borderless'),
187 'description' => esc_html__( 'Enter Filter items separated by commas.', 'borderless'),
188 'type' => Controls_Manager::TEXTAREA,
189 'rows' => 2,
190 'separator' => 'before',
191 ]
192 );
193
194 $repeater->add_control(
195 'borderless_elementor_portfolio_item_sort',
196 [
197 'label' => esc_html__( 'Sort', 'borderless'),
198 'description' => esc_html__( 'Enter Sort items separated by commas.', 'borderless'),
199 'type' => Controls_Manager::TEXTAREA,
200 'rows' => 2,
201 ]
202 );
203
204 $this->add_control(
205 'borderless_elementor_portfolio_item_strings',
206 [
207 'type' => Controls_Manager::REPEATER,
208 'show_label' => true,
209 'fields' => $repeater->get_controls(),
210 'title_field' => '{{ borderless_elementor_portfolio_item_title }}',
211 'default' => [
212 [
213 'borderless_elementor_portfolio_item_title',
214 ],
215 [
216 'borderless_elementor_portfolio_item_title',
217 ],
218 [
219 'borderless_elementor_portfolio_item_title',
220 ],
221 [
222 'borderless_elementor_portfolio_item_title',
223 ],
224 [
225 'borderless_elementor_portfolio_item_title',
226 ],
227 [
228 'borderless_elementor_portfolio_item_title',
229 ],
230 ],
231 ]
232 );
233
234 $this->end_controls_section();
235
236
237 /*-----------------------------------------------------------------------------------*/
238 /* *. Portfolio/Data Source - Content
239 /*-----------------------------------------------------------------------------------*/
240
241 $this->start_controls_section(
242 'borderless_elementor_section_portfolio_data_source',
243 [
244 'label' => esc_html__( 'Data Source', 'borderless' ),
245 'tab' => Controls_Manager::TAB_CONTENT,
246 'condition' => array(
247 'borderless_elementor_portfolio_content_source' => 'query',
248 ),
249 ]
250 );
251
252 $this->end_controls_section();
253
254
255 /*-----------------------------------------------------------------------------------*/
256 /* *. Portfolio/Settings - Content
257 /*-----------------------------------------------------------------------------------*/
258
259 $this->start_controls_section(
260 'borderless_elementor_section_portfolio_settings',
261 [
262 'label' => esc_html__( 'Settings', 'borderless' ),
263 'tab' => Controls_Manager::TAB_CONTENT,
264 ]
265 );
266
267 $this->add_control(
268 'borderless_elementor_portfolio_item_columns',
269 [
270 'label' => __( 'Columns', 'borderless' ),
271 'type' => \Elementor\Controls_Manager::SELECT,
272 'default' => 'borderless-cell-4@md',
273 'options' => [
274 'borderless-cell-12@md' => __( '1 Column', 'borderless' ),
275 'borderless-cell-6@md' => __( '2 Columns', 'borderless' ),
276 'borderless-cell-4@md' => __( '3 Columns', 'borderless' ),
277 'borderless-cell-3@md' => __( '4 Columns', 'borderless' ),
278 'borderless-cell-2@md' => __( '6 Columns', 'borderless' ),
279 ],
280 ]
281 );
282
283 $this->add_control(
284 'borderless_elementor_portfolio_default_filter_label',
285 [
286 'label' => esc_html__( 'Default Filter Label', 'borderless'),
287 'type' => Controls_Manager::TEXT,
288 'default' => 'All',
289 'dynamic' => [ 'active' => true ]
290 ]
291 );
292
293 $this->end_controls_section();
294
295
296 /*-----------------------------------------------------------------------------------*/
297 /* *. Portfolio/Item - Style
298 /*-----------------------------------------------------------------------------------*/
299
300 $this->start_controls_section(
301 'borderless_elementor_section_item_style',
302 [
303 'label' => esc_html__( 'Portfolio Item', 'borderless'),
304 'tab' => Controls_Manager::TAB_STYLE
305 ]
306 );
307 /*
308 $this->add_control(
309 'borderless_elementor_portfolio_item_layout',
310 [
311 'label' => __( 'Layout', 'borderless' ),
312 'type' => \Elementor\Controls_Manager::SELECT,
313 'default' => '1',
314 'options' => [
315 '1' => __( 'Masonry', 'borderless' ),
316 '2' => __( 'Masonry Horizontal', 'borderless' ),
317 '3' => __( 'Fit Columns', 'borderless' ),
318 '4' => __( 'Fit Rows', 'borderless' ),
319 '5' => __( 'Cells By Column', 'borderless' ),
320 '6' => __( 'Cells By Row', 'borderless' ),
321 '7' => __( 'Horizontal', 'borderless' ),
322 '8' => __( 'Vertical', 'borderless' ),
323 '9' => __( 'Packery', 'borderless' ),
324 ],
325 ]
326 );
327 */
328 $this->add_responsive_control(
329 'borderless_elementor_portfolio_item_gap',
330 [
331 'label' => __( 'Gap', 'borderless' ),
332 'type' => Controls_Manager::SLIDER,
333 'size_units' => [ 'px' ],
334 'range' => [
335 'px' => [
336 'min' => 1,
337 'max' => 1000,
338 'step' => 1,
339 ],
340 ],
341 'default' => [
342 'unit' => 'px',
343 'size' => 10,
344 ],
345 'selectors' => [
346 '{{WRAPPER}} .borderless-elementor-portfolio-item-inner' => 'margin: {{SIZE}}{{UNIT}};',
347 '{{WRAPPER}} .borderless-elementor-portfolio-items' => 'margin: -{{SIZE}}{{UNIT}};',
348 ],
349 ]
350 );
351
352 $this->add_responsive_control(
353 'borderless_elementor_portfolio_item_padding',
354 [
355 'label' => esc_html__( 'Padding', 'borderless'),
356 'type' => Controls_Manager::DIMENSIONS,
357 'size_units' => [ 'px', 'em', '%', 'rem' ],
358 'selectors' => [
359 '{{WRAPPER}} .borderless-elementor-portfolio-item-inner' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
360 ],
361 ]
362 );
363
364 $this->add_group_control(
365 Group_Control_Border::get_type(),
366 [
367 'name' => 'borderless_elementor_portfolio_item_border',
368 'label' => esc_html__( 'Border', 'borderless'),
369 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-inner',
370 ]
371 );
372
373 $this->add_responsive_control(
374 'borderless_elementor_portfolio_item_border_radius',
375 [
376 'label' => esc_html__( 'Border Radius', 'borderless'),
377 'type' => Controls_Manager::DIMENSIONS,
378 'selectors' => [
379 '{{WRAPPER}} .borderless-elementor-portfolio-item' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
380 ],
381 ]
382 );
383
384 $this->add_group_control(
385 Group_Control_Box_Shadow::get_type(),
386 [
387 'name' => 'borderless_elementor_portfolio_item_border_box_shadow',
388 'exclude' => [
389 'box_shadow_position',
390 ],
391 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item',
392 ]
393 );
394
395 $this->end_controls_section();
396
397 /*-----------------------------------------------------------------------------------*/
398 /* *. Portfolio/Item Content - Style
399 /*-----------------------------------------------------------------------------------*/
400
401 $this->start_controls_section(
402 'borderless_elementor_section_item_content_style',
403 [
404 'label' => esc_html__( 'Portfolio Item Content', 'borderless'),
405 'tab' => Controls_Manager::TAB_STYLE
406 ]
407 );
408
409 $this->add_control(
410 'borderless_elementor_item_content_container',
411 [
412 'label' => __( 'Container', 'borderless' ),
413 'type' => \Elementor\Controls_Manager::HEADING,
414 ]
415 );
416
417 $this->add_group_control(
418 Group_Control_Background::get_type(),
419 [
420 'name' => 'borderless_elementor_item_content_background',
421 'label' => __( 'Background', 'borderless' ),
422 'types' => [ 'classic', 'gradient' ],
423 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-content',
424 ]
425 );
426
427 $this->add_responsive_control(
428 'borderless_elementor_item_content_padding',
429 [
430 'label' => esc_html__( 'Padding', 'borderless'),
431 'type' => Controls_Manager::DIMENSIONS,
432 'size_units' => [ 'px', 'em', '%', 'rem' ],
433 'selectors' => [
434 '{{WRAPPER}} .borderless-elementor-portfolio-item-content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
435 ],
436 ]
437 );
438
439 $this->add_responsive_control(
440 'borderless_elementor_item_content_margin',
441 [
442 'label' => esc_html__( 'Margin', 'borderless'),
443 'type' => Controls_Manager::DIMENSIONS,
444 'size_units' => [ 'px', 'em', '%', 'rem' ],
445 'selectors' => [
446 '{{WRAPPER}} .borderless-elementor-portfolio-item-content' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
447 ],
448 ]
449 );
450
451 $this->add_group_control(
452 Group_Control_Border::get_type(),
453 [
454 'name' => 'borderless_elementor_item_content_border',
455 'label' => esc_html__( 'Border', 'borderless'),
456 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-content',
457 ]
458 );
459
460 $this->add_responsive_control(
461 'borderless_elementor_item_content_radius',
462 [
463 'label' => esc_html__( 'Border Radius', 'borderless'),
464 'type' => Controls_Manager::DIMENSIONS,
465 'selectors' => [
466 '{{WRAPPER}} .borderless-elementor-portfolio-item-content' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
467 ],
468 ]
469 );
470
471 $this->add_group_control(
472 Group_Control_Box_Shadow::get_type(),
473 [
474 'name' => 'borderless_elementor_item_content_box_shadow',
475 'exclude' => [
476 'box_shadow_position',
477 ],
478 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-content',
479 ]
480 );
481
482 $this->add_control(
483 'borderless_elementor_item_content_image',
484 [
485 'label' => __( 'Image', 'borderless' ),
486 'type' => \Elementor\Controls_Manager::HEADING,
487 'separator' => 'before',
488 ]
489 );
490
491 $this->add_group_control(
492 Group_Control_Css_Filter::get_type(),
493 [
494 'name' => 'borderless_elementor_item_content_image_css_filters',
495 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-inner img',
496 ]
497 );
498
499 $this->add_control(
500 'borderless_elementor_item_content_image_opacity',
501 [
502 'label' => __( 'Opacity', 'borderless' ),
503 'type' => Controls_Manager::SLIDER,
504 'range' => [
505 'px' => [
506 'max' => 1,
507 'min' => 0.10,
508 'step' => 0.01,
509 ],
510 ],
511 'selectors' => [
512 '{{WRAPPER}} .borderless-elementor-portfolio-item-inner img' => 'opacity: {{SIZE}};',
513 ],
514 ]
515 );
516
517 $this->add_group_control(
518 Group_Control_Border::get_type(),
519 [
520 'name' => 'borderless_elementor_item_content_image_border',
521 'label' => esc_html__( 'Border', 'borderless'),
522 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-inner img',
523 ]
524 );
525
526 $this->add_responsive_control(
527 'borderless_elementor_item_content_image_radius',
528 [
529 'label' => esc_html__( 'Border Radius', 'borderless'),
530 'type' => Controls_Manager::DIMENSIONS,
531 'selectors' => [
532 '{{WRAPPER}} .borderless-elementor-portfolio-item-inner img' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
533 ],
534 ]
535 );
536
537 $this->add_group_control(
538 Group_Control_Box_Shadow::get_type(),
539 [
540 'name' => 'borderless_elementor_item_content_image_box_shadow',
541 'exclude' => [
542 'box_shadow_position',
543 ],
544 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-inner img',
545 ]
546 );
547
548 $this->add_control(
549 'borderless_elementor_item_content_title',
550 [
551 'label' => __( 'Title', 'borderless' ),
552 'type' => \Elementor\Controls_Manager::HEADING,
553 'separator' => 'before',
554 ]
555 );
556
557 $this->add_responsive_control(
558 'borderless_elementor_item_content_title_align',
559 [
560 'label' => __( 'Alignment', 'borderless' ),
561 'type' => Controls_Manager::CHOOSE,
562 'options' => [
563 'left' => [
564 'title' => __( 'Left', 'borderless' ),
565 'icon' => 'eicon-text-align-left',
566 ],
567 'center' => [
568 'title' => __( 'Center', 'borderless' ),
569 'icon' => 'eicon-text-align-center',
570 ],
571 'right' => [
572 'title' => __( 'Right', 'borderless' ),
573 'icon' => 'eicon-text-align-right',
574 ],
575 ],
576 'prefix_class' => 'e-grid-align-',
577 'default' => 'center',
578 'selectors' => [
579 '{{WRAPPER}} .borderless-elementor-portfolio-item-title' => 'text-align: {{VALUE}}',
580 ],
581 ]
582 );
583
584 $this->add_control(
585 'borderless_elementor_item_content_title_color',
586 [
587 'label' => __( 'Color', 'borderless' ),
588 'type' => Controls_Manager::COLOR,
589 'selectors' => [
590 '{{WRAPPER}} .borderless-elementor-portfolio-item-title' => 'color: {{VALUE}};',
591 ],
592 ]
593 );
594
595 $this->add_group_control(
596 Group_Control_Typography::get_type(),
597 [
598 'name' => 'borderless_elementor_item_content_title_typography',
599 'label' => __('Typography', 'borderless'),
600 'global' => [
601 'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
602 ],
603 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-title',
604 ]
605 );
606
607 $this->add_responsive_control(
608 'borderless_elementor_item_content_title_padding',
609 [
610 'label' => esc_html__( 'Padding', 'borderless'),
611 'type' => Controls_Manager::DIMENSIONS,
612 'size_units' => [ 'px', 'em', '%', 'rem' ],
613 'selectors' => [
614 '{{WRAPPER}} .borderless-elementor-portfolio-item-title' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
615 ],
616 ]
617 );
618
619 $this->add_responsive_control(
620 'borderless_elementor_item_content_title_margin',
621 [
622 'label' => esc_html__( 'Margin', 'borderless'),
623 'type' => Controls_Manager::DIMENSIONS,
624 'size_units' => [ 'px', 'em', '%', 'rem' ],
625 'selectors' => [
626 '{{WRAPPER}} .borderless-elementor-portfolio-item-title' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
627 ],
628 ]
629 );
630
631 $this->add_control(
632 'borderless_elementor_item_content_description',
633 [
634 'label' => __( 'Description', 'borderless' ),
635 'type' => \Elementor\Controls_Manager::HEADING,
636 'separator' => 'before',
637 ]
638 );
639
640 $this->add_responsive_control(
641 'borderless_elementor_item_content_description_align',
642 [
643 'label' => __( 'Alignment', 'borderless' ),
644 'type' => Controls_Manager::CHOOSE,
645 'options' => [
646 'left' => [
647 'title' => __( 'Left', 'borderless' ),
648 'icon' => 'eicon-text-align-left',
649 ],
650 'center' => [
651 'title' => __( 'Center', 'borderless' ),
652 'icon' => 'eicon-text-align-center',
653 ],
654 'right' => [
655 'title' => __( 'Right', 'borderless' ),
656 'icon' => 'eicon-text-align-right',
657 ],
658 ],
659 'prefix_class' => 'e-grid-align-',
660 'default' => 'center',
661 'selectors' => [
662 '{{WRAPPER}} .borderless-elementor-portfolio-item-description' => 'text-align: {{VALUE}}',
663 ],
664 ]
665 );
666
667 $this->add_control(
668 'borderless_elementor_item_content_description_color',
669 [
670 'label' => __( 'Color', 'borderless' ),
671 'type' => Controls_Manager::COLOR,
672 'selectors' => [
673 '{{WRAPPER}} .borderless-elementor-portfolio-item-description' => 'color: {{VALUE}};',
674 ],
675 ]
676 );
677
678 $this->add_group_control(
679 Group_Control_Typography::get_type(),
680 [
681 'name' => 'borderless_elementor_item_content_description_typography',
682 'label' => __('Typography', 'borderless'),
683 'global' => [
684 'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
685 ],
686 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-description',
687 ]
688 );
689
690 $this->add_responsive_control(
691 'borderless_elementor_item_content_description_padding',
692 [
693 'label' => esc_html__( 'Padding', 'borderless'),
694 'type' => Controls_Manager::DIMENSIONS,
695 'size_units' => [ 'px', 'em', '%', 'rem' ],
696 'selectors' => [
697 '{{WRAPPER}} .borderless-elementor-portfolio-item-description' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
698 ],
699 ]
700 );
701
702 $this->add_responsive_control(
703 'borderless_elementor_item_content_description_margin',
704 [
705 'label' => esc_html__( 'Margin', 'borderless'),
706 'type' => Controls_Manager::DIMENSIONS,
707 'size_units' => [ 'px', 'em', '%', 'rem' ],
708 'selectors' => [
709 '{{WRAPPER}} .borderless-elementor-portfolio-item-description' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
710 ],
711 ]
712 );
713
714 $this->add_control(
715 'borderless_elementor_item_content_button',
716 [
717 'label' => __( 'Button', 'borderless' ),
718 'type' => \Elementor\Controls_Manager::HEADING,
719 'separator' => 'before',
720 ]
721 );
722
723 $this->add_responsive_control(
724 'borderless_elementor_item_content_button_alignment',
725 [
726 'label' => __( 'Alignment', 'borderless' ),
727 'type' => Controls_Manager::CHOOSE,
728 'options' => [
729 'left' => [
730 'title' => __( 'Left', 'borderless' ),
731 'icon' => 'eicon-text-align-left',
732 ],
733 'center' => [
734 'title' => __( 'Center', 'borderless' ),
735 'icon' => 'eicon-text-align-center',
736 ],
737 'right' => [
738 'title' => __( 'Right', 'borderless' ),
739 'icon' => 'eicon-text-align-right',
740 ],
741 ],
742 'prefix_class' => 'e-grid-align-',
743 'default' => 'center',
744 'selectors' => [
745 '{{WRAPPER}} .borderless-elementor-portfolio-item-button-container' => 'text-align: {{VALUE}}',
746 ],
747 ]
748 );
749
750 $this->add_responsive_control(
751 'borderless_elementor_item_content_button_padding',
752 [
753 'label' => esc_html__( 'Padding', 'borderless'),
754 'type' => Controls_Manager::DIMENSIONS,
755 'size_units' => [ 'px', 'em', '%', 'rem' ],
756 'selectors' => [
757 '{{WRAPPER}} .borderless-elementor-portfolio-item-button' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
758 ],
759 ]
760 );
761
762 $this->add_responsive_control(
763 'borderless_elementor_item_content_button_margin',
764 [
765 'label' => esc_html__( 'Margin', 'borderless'),
766 'type' => Controls_Manager::DIMENSIONS,
767 'size_units' => [ 'px', 'em', '%', 'rem' ],
768 'selectors' => [
769 '{{WRAPPER}} .borderless-elementor-portfolio-item-button' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
770 ],
771 ]
772 );
773
774 $this->start_controls_tabs( 'borderless_elementor_item_content_button_tabs' );
775
776 $this->start_controls_tab( 'borderless_elementor_item_content_button_tab_normal',
777 [
778 'label' => __( 'Normal', 'borderless' ),
779 ]
780 );
781
782 $this->add_control(
783 'borderless_elementor_item_content_button_color',
784 [
785 'label' => __( 'Text Color', 'borderless' ),
786 'type' => Controls_Manager::COLOR,
787 'selectors' => [
788 '{{WRAPPER}} .borderless-elementor-portfolio-item-button' => 'color: {{VALUE}};',
789 ],
790 ]
791 );
792
793 $this->add_group_control(
794 Group_Control_Background::get_type(),
795 [
796 'name' => 'borderless_elementor_item_content_button_background',
797 'label' => __( 'Background', 'borderless' ),
798 'types' => [ 'classic', 'gradient' ],
799 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-button',
800 ]
801 );
802
803 $this->add_group_control(
804 Group_Control_Typography::get_type(),
805 [
806 'name' => 'borderless_elementor_item_content_button_typography',
807 'label' => __('Typography', 'borderless'),
808 'global' => [
809 'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
810 ],
811 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-button',
812 ]
813 );
814
815 $this->add_group_control(
816 Group_Control_Border::get_type(),
817 [
818 'name' => 'borderless_elementor_item_content_button_border',
819 'label' => esc_html__( 'Border', 'borderless'),
820 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-button',
821 ]
822 );
823
824 $this->add_responsive_control(
825 'borderless_elementor_item_content_button_radius',
826 [
827 'label' => esc_html__( 'Border Radius', 'borderless'),
828 'type' => Controls_Manager::DIMENSIONS,
829 'selectors' => [
830 '{{WRAPPER}} .borderless-elementor-portfolio-item-button' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
831 ],
832 ]
833 );
834
835 $this->add_group_control(
836 Group_Control_Box_Shadow::get_type(),
837 [
838 'name' => 'borderless_elementor_item_content_button_box_shadow',
839 'exclude' => [
840 'box_shadow_position',
841 ],
842 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-button',
843 ]
844 );
845
846 $this->end_controls_tab();
847
848 $this->start_controls_tab( 'borderless_elementor_item_content_button_tab_hover',
849 [
850 'label' => __( 'Hover', 'borderless' ),
851 ]
852 );
853
854 $this->add_control(
855 'borderless_elementor_item_content_button_color_hover',
856 [
857 'label' => __( 'Text Color', 'borderless' ),
858 'type' => Controls_Manager::COLOR,
859 'selectors' => [
860 '{{WRAPPER}} .borderless-elementor-portfolio-item-button:hover' => 'color: {{VALUE}};',
861 ],
862 ]
863 );
864
865 $this->add_group_control(
866 Group_Control_Background::get_type(),
867 [
868 'name' => 'borderless_elementor_item_content_button_background_hover',
869 'label' => __( 'Background', 'borderless' ),
870 'types' => [ 'classic', 'gradient' ],
871 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-button:hover',
872 ]
873 );
874
875 $this->add_group_control(
876 Group_Control_Typography::get_type(),
877 [
878 'name' => 'borderless_elementor_item_content_button_typography_hover',
879 'label' => __('Typography', 'borderless'),
880 'global' => [
881 'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
882 ],
883 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-button:hover',
884 ]
885 );
886
887 $this->add_group_control(
888 Group_Control_Border::get_type(),
889 [
890 'name' => 'borderless_elementor_item_content_button_border_hover',
891 'label' => esc_html__( 'Border', 'borderless'),
892 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-button:hover',
893 ]
894 );
895
896 $this->add_responsive_control(
897 'borderless_elementor_item_content_button_radius_hover',
898 [
899 'label' => esc_html__( 'Border Radius', 'borderless'),
900 'type' => Controls_Manager::DIMENSIONS,
901 'selectors' => [
902 '{{WRAPPER}} .borderless-elementor-portfolio-item-button:hover' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
903 ],
904 ]
905 );
906
907 $this->add_group_control(
908 Group_Control_Box_Shadow::get_type(),
909 [
910 'name' => 'borderless_elementor_item_content_button_box_shadow_hover',
911 'exclude' => [
912 'box_shadow_position',
913 ],
914 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-item-button:hover',
915 ]
916 );
917
918 $this->end_controls_tab();
919
920 $this->end_controls_tabs();
921
922 $this->end_controls_section();
923
924 /*-----------------------------------------------------------------------------------*/
925 /* *. Portfolio/Filter - Style
926 /*-----------------------------------------------------------------------------------*/
927
928 $this->start_controls_section(
929 'borderless_elementor_section_filter_style',
930 [
931 'label' => esc_html__( 'Filter', 'borderless'),
932 'tab' => Controls_Manager::TAB_STYLE
933 ]
934 );
935
936 $this->add_group_control(
937 Group_Control_Background::get_type(),
938 [
939 'name' => 'borderless_elementor_filter_background',
940 'label' => __( 'Background', 'borderless' ),
941 'types' => [ 'classic', 'gradient' ],
942 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filters',
943 ]
944 );
945
946 $this->add_responsive_control(
947 'borderless_elementor_filter_padding',
948 [
949 'label' => esc_html__( 'Padding', 'borderless'),
950 'type' => Controls_Manager::DIMENSIONS,
951 'size_units' => [ 'px', 'em', '%', 'rem' ],
952 'selectors' => [
953 '{{WRAPPER}} .borderless-elementor-portfolio-filters' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
954 ],
955 ]
956 );
957
958 $this->add_responsive_control(
959 'borderless_elementor_filter_margin',
960 [
961 'label' => esc_html__( 'Margin', 'borderless'),
962 'type' => Controls_Manager::DIMENSIONS,
963 'size_units' => [ 'px', 'em', '%', 'rem' ],
964 'default' => [
965 'top' => '0',
966 'right' => '0',
967 'bottom' => '30',
968 'left' => '0',
969 'unit' => 'px',
970 'isLinked' => false,
971 ],
972 'selectors' => [
973 '{{WRAPPER}} .borderless-elementor-portfolio-filters' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
974 ],
975 ]
976 );
977
978 $this->add_group_control(
979 Group_Control_Border::get_type(),
980 [
981 'name' => 'borderless_elementor_filter_border',
982 'label' => esc_html__( 'Border', 'borderless'),
983 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filters',
984 ]
985 );
986
987 $this->add_responsive_control(
988 'borderless_elementor_filter_radius',
989 [
990 'label' => esc_html__( 'Border Radius', 'borderless'),
991 'type' => Controls_Manager::DIMENSIONS,
992 'selectors' => [
993 '{{WRAPPER}} .borderless-elementor-portfolio-filters' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
994 ],
995 ]
996 );
997
998 $this->add_group_control(
999 Group_Control_Box_Shadow::get_type(),
1000 [
1001 'name' => 'borderless_elementor_filter_box_shadow',
1002 'exclude' => [
1003 'box_shadow_position',
1004 ],
1005 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filters',
1006 ]
1007 );
1008
1009 $this->end_controls_section();
1010
1011 /*-----------------------------------------------------------------------------------*/
1012 /* *. Portfolio/Filter Item - Style
1013 /*-----------------------------------------------------------------------------------*/
1014
1015 $this->start_controls_section(
1016 'borderless_elementor_section_filter_item_style',
1017 [
1018 'label' => esc_html__( 'Filter Item', 'borderless'),
1019 'tab' => Controls_Manager::TAB_STYLE
1020 ]
1021 );
1022
1023 $this->add_responsive_control(
1024 'borderless_elementor_filter_item_padding',
1025 [
1026 'label' => esc_html__( 'Padding', 'borderless'),
1027 'type' => Controls_Manager::DIMENSIONS,
1028 'size_units' => [ 'px', 'em', '%', 'rem' ],
1029 'selectors' => [
1030 '{{WRAPPER}} .borderless-elementor-portfolio-filter-item' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1031 ],
1032 ]
1033 );
1034
1035 $this->add_responsive_control(
1036 'borderless_elementor_filter_item_margin',
1037 [
1038 'label' => esc_html__( 'Margin', 'borderless'),
1039 'type' => Controls_Manager::DIMENSIONS,
1040 'size_units' => [ 'px', 'em', '%', 'rem' ],
1041 'selectors' => [
1042 '{{WRAPPER}} .borderless-elementor-portfolio-filter-item' => 'margin: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};',
1043 ],
1044 ]
1045 );
1046
1047 $this->start_controls_tabs( 'borderless_elementor_portfolio_filter_item_tabs' );
1048
1049 $this->start_controls_tab( 'borderless_elementor_portfolio_filter_item_tab_normal',
1050 [
1051 'label' => __( 'Normal', 'borderless' ),
1052 ]
1053 );
1054
1055 $this->add_control(
1056 'borderless_elementor_filter_item_color',
1057 [
1058 'label' => __( 'Color', 'borderless' ),
1059 'type' => Controls_Manager::COLOR,
1060 'selectors' => [
1061 '{{WRAPPER}} .borderless-elementor-portfolio-filter-item' => 'color: {{VALUE}};',
1062 ],
1063 ]
1064 );
1065
1066 $this->add_group_control(
1067 Group_Control_Typography::get_type(),
1068 [
1069 'name' => 'borderless_elementor_filter_item_typography',
1070 'label' => __('Typography', 'borderless'),
1071 'global' => [
1072 'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
1073 ],
1074 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item',
1075 ]
1076 );
1077
1078 $this->add_group_control(
1079 Group_Control_Background::get_type(),
1080 [
1081 'name' => 'borderless_elementor_filter_item_background',
1082 'label' => __( 'Background', 'borderless' ),
1083 'types' => [ 'classic', 'gradient' ],
1084 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item',
1085 ]
1086 );
1087
1088 $this->add_group_control(
1089 Group_Control_Border::get_type(),
1090 [
1091 'name' => 'borderless_elementor_filter_item_border',
1092 'label' => esc_html__( 'Border', 'borderless'),
1093 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item',
1094 ]
1095 );
1096
1097 $this->add_responsive_control(
1098 'borderless_elementor_filter_item_radius',
1099 [
1100 'label' => esc_html__( 'Border Radius', 'borderless'),
1101 'type' => Controls_Manager::DIMENSIONS,
1102 'selectors' => [
1103 '{{WRAPPER}} .borderless-elementor-portfolio-filter-item' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
1104 ],
1105 ]
1106 );
1107
1108 $this->add_group_control(
1109 Group_Control_Box_Shadow::get_type(),
1110 [
1111 'name' => 'borderless_elementor_filter_item_box_shadow',
1112 'exclude' => [
1113 'box_shadow_position',
1114 ],
1115 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item',
1116 ]
1117 );
1118
1119 $this->end_controls_tab();
1120
1121 $this->start_controls_tab( 'borderless_elementor_portfolio_filter_item_tab_hover',
1122 [
1123 'label' => __( 'Hover', 'borderless' ),
1124 ]
1125 );
1126
1127 $this->add_control(
1128 'borderless_elementor_filter_item_color_hover',
1129 [
1130 'label' => __( 'Color', 'borderless' ),
1131 'type' => Controls_Manager::COLOR,
1132 'selectors' => [
1133 '{{WRAPPER}} .borderless-elementor-portfolio-filter-item:hover' => 'color: {{VALUE}};',
1134 ],
1135 ]
1136 );
1137
1138 $this->add_group_control(
1139 Group_Control_Typography::get_type(),
1140 [
1141 'name' => 'borderless_elementor_filter_item_typography_hover',
1142 'label' => __('Typography', 'borderless'),
1143 'global' => [
1144 'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
1145 ],
1146 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item:hover',
1147 ]
1148 );
1149
1150 $this->add_group_control(
1151 Group_Control_Background::get_type(),
1152 [
1153 'name' => 'borderless_elementor_filter_item_background_hover',
1154 'label' => __( 'Background', 'borderless' ),
1155 'types' => [ 'classic', 'gradient' ],
1156 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item:hover',
1157 ]
1158 );
1159
1160 $this->add_group_control(
1161 Group_Control_Border::get_type(),
1162 [
1163 'name' => 'borderless_elementor_filter_item_border_hover',
1164 'label' => esc_html__( 'Border', 'borderless'),
1165 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item:hover',
1166 ]
1167 );
1168
1169 $this->add_responsive_control(
1170 'borderless_elementor_filter_item_radius_hover',
1171 [
1172 'label' => esc_html__( 'Border Radius', 'borderless'),
1173 'type' => Controls_Manager::DIMENSIONS,
1174 'selectors' => [
1175 '{{WRAPPER}} .borderless-elementor-portfolio-filter-item:hover' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
1176 ],
1177 ]
1178 );
1179
1180 $this->add_group_control(
1181 Group_Control_Box_Shadow::get_type(),
1182 [
1183 'name' => 'borderless_elementor_filter_item_box_shadow_hover',
1184 'exclude' => [
1185 'box_shadow_position',
1186 ],
1187 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item:hover',
1188 ]
1189 );
1190
1191 $this->end_controls_tab();
1192
1193 $this->start_controls_tab( 'borderless_elementor_portfolio_filter_item_tab_active',
1194 [
1195 'label' => __( 'Active', 'borderless' ),
1196 ]
1197 );
1198
1199 $this->add_control(
1200 'borderless_elementor_filter_item_color_active',
1201 [
1202 'label' => __( 'Color', 'borderless' ),
1203 'type' => Controls_Manager::COLOR,
1204 'selectors' => [
1205 '{{WRAPPER}} .borderless-elementor-portfolio-filter-item.is-checked' => 'color: {{VALUE}};',
1206 ],
1207 ]
1208 );
1209
1210 $this->add_group_control(
1211 Group_Control_Typography::get_type(),
1212 [
1213 'name' => 'borderless_elementor_filter_item_typography_active',
1214 'label' => __('Typography', 'borderless'),
1215 'global' => [
1216 'default' => Global_Typography::TYPOGRAPHY_PRIMARY,
1217 ],
1218 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item.is-checked',
1219 ]
1220 );
1221
1222 $this->add_group_control(
1223 Group_Control_Background::get_type(),
1224 [
1225 'name' => 'borderless_elementor_filter_item_background_active',
1226 'label' => __( 'Background', 'borderless' ),
1227 'types' => [ 'classic', 'gradient' ],
1228 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item.is-checked',
1229 ]
1230 );
1231
1232 $this->add_group_control(
1233 Group_Control_Border::get_type(),
1234 [
1235 'name' => 'borderless_elementor_filter_item_border_active',
1236 'label' => esc_html__( 'Border', 'borderless'),
1237 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item.is-checked',
1238 ]
1239 );
1240
1241 $this->add_responsive_control(
1242 'borderless_elementor_filter_item_radius_active',
1243 [
1244 'label' => esc_html__( 'Border Radius', 'borderless'),
1245 'type' => Controls_Manager::DIMENSIONS,
1246 'selectors' => [
1247 '{{WRAPPER}} .borderless-elementor-portfolio-filter-item.is-checked' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;',
1248 ],
1249 ]
1250 );
1251
1252 $this->add_group_control(
1253 Group_Control_Box_Shadow::get_type(),
1254 [
1255 'name' => 'borderless_elementor_filter_item_box_shadow_active',
1256 'exclude' => [
1257 'box_shadow_position',
1258 ],
1259 'selector' => '{{WRAPPER}} .borderless-elementor-portfolio-filter-item.is-checked',
1260 ]
1261 );
1262
1263 $this->end_controls_tab();
1264
1265 $this->end_controls_tabs();
1266
1267 $this->end_controls_section();
1268
1269 }
1270
1271 /*-----------------------------------------------------------------------------------*/
1272 /* *. Render
1273 /*-----------------------------------------------------------------------------------*/
1274
1275 protected function render() {
1276
1277 $settings = $this->get_settings_for_display();
1278
1279 $target = $settings['borderless_elementor_portfolio_item_button_link']['is_external'] ? ' target="_blank"' : '';
1280 $nofollow = $settings['borderless_elementor_portfolio_item_button_link']['nofollow'] ? ' rel="nofollow"' : '';
1281
1282
1283 if ( $settings['borderless_elementor_portfolio_item_strings'] ) {
1284 foreach ( $settings['borderless_elementor_portfolio_item_strings'] as $portfolio_string ) {
1285 $borderless_elementor_portfolio_item_strings = $portfolio_string['borderless_elementor_portfolio_item_filter'];
1286
1287 $filters = explode(',', $borderless_elementor_portfolio_item_strings);
1288 $filters = array_map('trim', $filters);
1289
1290 foreach ( $filters as $filter_title ) { $filter_title_items[] = $filter_title; }
1291 foreach ( $filters as $filter_classe ) { $filter_classe_items[] = strtolower( str_replace(' ', '', $filter_classe) ); }
1292
1293 }
1294 $filter_title_items = array_unique($filter_title_items);
1295 $filter_classe_items = array_unique($filter_classe_items);
1296 }
1297
1298 ?>
1299
1300 <div class="borderless-elementor-portfolio-widget">
1301 <div class="borderless-elementor-portfolio borderless-container" data-portfolio-gutter="<?php echo wp_kses( ( $settings['borderless_elementor_portfolio_item_gap']['size'] ), true ); ?>">
1302 <div class="borderless-elementor-portfolio-filters">
1303 <div class="borderless-elementor-portfolio-filter" data-portfolio-filter-group="filter">
1304 <div class="borderless-elementor-portfolio-filter-item is-checked" data-portfolio-filter=""><span><?php echo wp_kses( ( $settings['borderless_elementor_portfolio_default_filter_label'] ), true ); ?></span></div>
1305 <?php
1306 if ( $settings['borderless_elementor_portfolio_item_strings'] ) {
1307 foreach (array_combine($filter_title_items, $filter_classe_items) as $filter_title_item => $filter_classe_item) {
1308 echo '<div class="borderless-elementor-portfolio-filter-item" data-portfolio-filter=".'.$filter_classe_item.'">
1309 <span class="borderless-elementor-portfolio-filter-item-title">'.$filter_title_item.'</span>
1310 </div>';
1311 }
1312 }
1313 ?>
1314 </div>
1315 </div>
1316 <div class="borderless-elementor-portfolio-items borderless-grid">
1317 <?php
1318 if ( $settings['borderless_elementor_portfolio_item_strings'] ) {
1319 foreach ( $settings['borderless_elementor_portfolio_item_strings'] as $portfolio_string ) {
1320 $filter = $portfolio_string['borderless_elementor_portfolio_item_filter'];
1321 $filter = strtolower( str_replace(' ', '', $filter) );
1322 $filter = strtolower( str_replace(',', ' ', $filter) );
1323 echo '<div class="borderless-elementor-portfolio-item ' . wp_kses( ( $settings['borderless_elementor_portfolio_item_columns'] ), true ) . ' '.$filter.'">';
1324 echo '<div class="borderless-elementor-portfolio-item-inner">';
1325 echo '<img src="' . wp_kses( ( $portfolio_string['borderless_elementor_portfolio_item_image']['url'] ), true ) . '">';
1326 echo '<div class="borderless-elementor-portfolio-item-content">';
1327 echo '<div class="borderless-elementor-portfolio-item-content-inner">';
1328 echo '<h2 class="borderless-elementor-portfolio-item-title">'.wp_kses( ( $portfolio_string['borderless_elementor_portfolio_item_title'] ), true ).'</h2>';
1329 echo '<span class="borderless-elementor-portfolio-item-description">'.wp_kses( ( $portfolio_string['borderless_elementor_portfolio_item_description'] ), true ).'</span>';
1330 echo '<div class="borderless-elementor-portfolio-item-button-container">';
1331 echo '<a class="borderless-elementor-portfolio-item-button borderless-btn borderless-btn--primary" href="' . wp_kses( ( $portfolio_string['borderless_elementor_portfolio_item_button_link']['url'] ), true ) . '"' . $target . $nofollow . '>'.wp_kses( ( $portfolio_string['borderless_elementor_portfolio_item_button_text'] ), true ).'</a>';
1332 echo '</div>';
1333 echo '</div>';
1334 echo '</div>';
1335 echo '</div>';
1336 echo '</div>';
1337 }
1338 }
1339 ?>
1340 </div>
1341 </div>
1342 </div>
1343
1344 <?php
1345
1346 }
1347
1348 protected function _content_template() {
1349
1350 }
1351
1352
1353 }