PluginProbe
Borderless – Addons and Templates for Elementor / 1.3.6
Borderless – Addons and Templates for Elementor v1.3.6
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.3.6, at modules/elementor/widgets/portfolio.php

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