PluginProbe
UiCore Elements – Free widgets and templates for Elementor / 1.3.17
UiCore Elements – Free widgets and templates for Elementor v1.3.17
1.3.17 1.3.16 trunk 1.0.0 1.0.1 1.0.10 1.0.11 1.0.12 1.0.13 1.0.14 1.0.15 1.0.16 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.2.0 1.2.1 1.2.2 1.2.3 1.2.4 All 41 releases
← All changes | includes/utils/post-component.php +996 -720 1.0.41.3.17 View file →
@@ -1,7 +1,10 @@
1 1 <?php
2 +
2 3 namespace UiCoreElements\Utils;
4 +
3 5 use Elementor\Controls_Manager;
6 +use Elementor\Icons_Manager;
4 7 use Elementor\Plugin;
5 8
6 9 use UiCoreElements\Helper;
7 10 use UiCoreElements\Controls\Query;
@@ -21,9 +24,10 @@
21 24 *
22 25 * @since 1.0.4
23 26 */
24 27
25 -trait Post_Trait {
28 +trait Post_Trait
29 +{
26 30
27 31 use Button_Trait,
28 32 Meta_Trait;
29 33
@@ -29,9 +33,9 @@
29 33
30 34 // Control Register Content functions
31 35 function TRAIT_register_post_item_controls($section = true)
32 36 {
33 - if($section) {
37 + if ($section) {
34 38 $this->start_controls_section(
35 39 'section_item_content',
36 40 [
37 41 'label' => esc_html__('Item', 'uicore-elements'),
@@ -37,114 +41,129 @@
37 41 'label' => esc_html__('Item', 'uicore-elements'),
38 42 ]
39 43 );
40 44 }
41 - $this->add_control(
42 - 'box_style',
43 - [
44 - 'label' => __('Item Style', 'uicore-elements'),
45 - 'type' => Controls_Manager::SELECT,
46 - 'default' => 'classic',
47 - 'options' => [
48 - 'classic' => __('Classic', 'uicore-elements'),
49 - 'split' => __('Split', 'uicore-elements'),
50 - 'overlay' => __('Overlay', 'uicore-elements'),
51 - ],
52 - 'render_type' => 'template',
53 - 'prefix_class' => 'ui-e-apg-',
45 + $this->add_control(
46 + 'box_style',
47 + [
48 + 'label' => __('Item Style', 'uicore-elements'),
49 + 'type' => Controls_Manager::SELECT,
50 + 'default' => 'classic',
51 + 'options' => [
52 + 'classic' => __('Classic', 'uicore-elements'),
53 + 'split' => __('Split', 'uicore-elements'),
54 + 'overlay' => __('Overlay', 'uicore-elements'),
55 + ],
56 + 'render_type' => 'template',
57 + 'prefix_class' => 'ui-e-apg-',
58 + ]
59 + );
60 + $this->add_control(
61 + 'split_mobile',
62 + [
63 + 'label' => __('Use Classic Layout on Mobile' . UICORE_ELEMENTS_NEW_OPTION, 'uicore-elements'), // TODO: remove badge, at least 2, releases after 1.3.15
64 + 'type' => Controls_Manager::SWITCHER,
65 + 'default' => 'ui-e-apg-split-not-phone',
66 + 'return_value' => 'ui-e-apg-split-not-phone',
67 + 'prefix_class' => '',
68 + 'condition' => [
69 + 'box_style' => 'split',
70 + ],
71 + ]
72 + );
73 + $this->add_control(
74 + 'image',
75 + [
76 + 'label' => __('Image', 'uicore-elements'),
77 + 'type' => Controls_Manager::SWITCHER,
78 + 'separator' => 'before',
79 + 'default' => 'yes'
80 + ]
81 + );
82 + $this->add_control(
83 + 'image_size_select',
84 + [
85 + 'label' => __('Image Size', 'uicore-elements'),
86 + 'type' => Controls_Manager::SELECT,
87 + 'default' => 'uicore-medium',
88 + 'options' => Helper::get_images_sizes(),
89 + 'separator' => 'after',
90 + 'condition' => [
91 + 'image' => 'yes',
54 92 ]
55 - );
56 - $this->add_control(
57 - 'image',
58 - [
59 - 'label' => __('Image', 'uicore-elements'),
60 - 'type' => Controls_Manager::SWITCHER,
61 - 'separator' => 'before',
62 - 'default' => 'yes'
93 + ]
94 + );
95 + $this->add_control(
96 + 'title',
97 + [
98 + 'label' => __('Title', 'uicore-elements'),
99 + 'type' => Controls_Manager::SWITCHER,
100 + 'default' => 'yes'
101 + ]
102 + );
103 + $this->add_control(
104 + 'title_tag',
105 + [
106 + 'label' => __('HTML Tag', 'uicore-elements'),
107 + 'type' => Controls_Manager::SELECT,
108 + 'default' => 'h4',
109 + 'options' => Helper::get_title_tags(),
110 + 'separator' => 'after',
111 + 'condition' => [
112 + 'title' => 'yes',
63 113 ]
64 - );
65 - $this->add_control(
66 - 'image_size_select',
67 - [
68 - 'label' => __('Image Size', 'uicore-elements'),
69 - 'type' => Controls_Manager::SELECT,
70 - 'default' => 'uicore-medium',
71 - 'options' => Helper::get_images_sizes(),
72 - 'condition' => [
73 - 'image' => 'yes',
74 - ]
114 + ]
115 + );
116 + $this->add_control(
117 + 'excerpt',
118 + [
119 + 'label' => __('Excerpt', 'uicore-elements'),
120 + 'type' => Controls_Manager::SWITCHER,
121 + 'default' => 'yes'
122 + ]
123 + );
124 + $this->add_control(
125 + 'excerpt_trim',
126 + [
127 + 'label' => __('Excerpt Length (words)', 'uicore-elements'),
128 + 'type' => Controls_Manager::NUMBER,
129 + 'min' => 5,
130 + 'max' => 100,
131 + 'step' => 1,
132 + 'default' => 55,
133 + 'separator' => 'after',
134 + 'condition' => array(
135 + 'excerpt' => 'yes',
136 + ),
137 + ]
138 + );
139 + $this->add_control(
140 + 'show_button',
141 + [
142 + 'label' => __('Read More Button', 'uicore-elements'),
143 + 'type' => Controls_Manager::SWITCHER,
144 + 'default' => 'no'
145 + ]
146 + );
147 + $this->add_control(
148 + 'global_link',
149 + [
150 + 'label' => __('Global Wrapper Link', 'uicore-elements'),
151 + 'type' => Controls_Manager::SWITCHER,
152 + 'default' => 'no',
153 + 'condition' => [
154 + 'box_style' => 'overlay'
75 155 ]
76 - );
77 - // $this->add_control('cat_type',[
78 - // 'label' => __( 'Cat Type', 'uicore-elements' ),
79 - // 'type' => Controls_Manager::SELECT,
80 - // 'default' => 'category',
81 - // 'options' => [
82 - // 'category' => __( 'Category', 'uicore-elements' ),
83 - // 'custom' => __( 'Custom Taxonomy', 'uicore-elements' ),
84 - // ],
85 - // 'condition' => array(
86 - // 'category' => 'yes',
87 - // ),
88 - // ]
89 - // );
90 - // $this->add_control('cat_type_name',[
91 - // 'label' => __( 'Taxonomy', 'uicore-elements' ),
92 - // 'type' => Controls_Manager::TEXT,
93 - // 'placeholder' => __( 'my_custom_tax', 'uicore-elements' ),
94 - // 'condition' => array(
95 - // 'cat_type' => 'custom',
96 - // ),
97 - // ]
98 - // );
99 - $this->add_control(
100 - 'title',
101 - [
102 - 'label' => __('Title', 'uicore-elements'),
103 - 'type' => Controls_Manager::SWITCHER,
104 - 'separator' => 'before',
105 - 'default' => 'yes'
106 - ]
107 - );
108 - $this->add_control(
109 - 'excerpt',
110 - [
111 - 'label' => __('Excerpt', 'uicore-elements'),
112 - 'type' => Controls_Manager::SWITCHER,
113 - 'separator' => 'before',
114 - 'default' => 'yes'
115 - ]
116 - );
117 - $this->add_control(
118 - 'excerpt_trim',
119 - [
120 - 'label' => __('Excerpt Length (words)', 'uicore-elements'),
121 - 'type' => Controls_Manager::NUMBER,
122 - 'min' => 5,
123 - 'max' => 100,
124 - 'step' => 1,
125 - 'default' => 55,
126 - 'condition' => array(
127 - 'excerpt' => 'yes',
128 - ),
129 - ]
130 - );
131 - $this->add_control(
132 - 'show_button',
133 - [
134 - 'label' => __('Read More Button', 'uicore-elements'),
135 - 'type' => Controls_Manager::SWITCHER,
136 - 'separator' => 'before',
137 - 'default' => 'no'
138 - ]
139 - );
140 - if($section) {
156 + ]
157 + );
158 +
159 + if ($section) {
141 160 $this->end_controls_section();
142 161 }
143 162 }
144 163 function TRAIT_register_post_button_controls($section = true)
145 164 {
146 - if($section){
165 + if ($section) {
147 166 $this->start_controls_section(
148 167 'section_button_content',
149 168 [
150 169 'label' => esc_html__('Button', 'uicore-elements'),
@@ -154,29 +173,35 @@
154 173 ]
155 174 );
156 175 }
157 176
158 - $this->register_button_content_controls(
159 - [
160 - 'section_condition' => [
161 - 'show_button' => 'yes'
162 - ],
163 - 'button_default_text' => 'Read More'
164 - ]
165 - );
166 - $this->remove_control('button_type');
167 - $this->remove_control('link');
168 - $this->remove_control('button_css_id');
169 - $this->remove_control('size');
170 - $this->remove_control('align');
177 + $this->register_button_content_controls(
178 + [
179 + 'section_condition' => [
180 + 'show_button' => 'yes'
181 + ],
182 + 'button_default_text' => 'Read More'
183 + ]
184 + );
185 + $this->remove_control('button_type');
186 + $this->remove_control('link');
187 + $this->remove_control('button_css_id');
188 + $this->remove_control('size');
189 + $this->remove_control('align');
171 190
172 - if($section){
191 + if ($section) {
173 192 $this->end_controls_section();
174 193 }
175 194 }
176 - function TRAIT_register_post_meta_controls($section = true)
195 + /**
196 + * Register Post Meta Controls.
197 + *
198 + * @param bool $section. Print section or not.
199 + * @param bool $product_metas. If true, will only print options that relates with products.
200 + */
201 + function TRAIT_register_post_meta_controls($section = true, $product_metas = false)
177 202 {
178 - if($section){
203 + if ($section) {
179 204 $this->start_controls_section(
180 205 'section_extra_item_content',
181 206 [
182 207 'label' => esc_html__('Meta', 'uicore-elements'),
@@ -183,79 +208,85 @@
183 208 ]
184 209 );
185 210 }
186 211
187 - $this->add_control(
188 - 'top_meta',
189 - [
190 - 'label' => esc_html__('Top Meta', 'uicore-elements'),
191 - 'type' => \Elementor\Controls_Manager::REPEATER,
192 - 'fields' => $this->get_meta_content_controls(),
193 - 'default' => [
194 - [
195 - 'type' => 'author'
196 - ],
212 + $this->add_control(
213 + 'top_meta',
214 + [
215 + 'label' => esc_html__('Top Meta', 'uicore-elements'),
216 + 'type' => \Elementor\Controls_Manager::REPEATER,
217 + 'fields' => $this->get_meta_content_controls($product_metas),
218 + 'default' => [
219 + [
220 + 'type' => $product_metas ? 'product sale' : 'category'
197 221 ],
198 - 'title_field' => '<span style="text-transform: capitalize">{{{ type }}}</span>',
199 - 'prevent_empty' => false,
200 - 'separator' => 'before'
201 - ]
202 - );
203 - $this->add_control(
204 - 'before_title_meta',
205 - [
206 - 'label' => esc_html__('Before Title Meta', 'uicore-elements'),
207 - 'type' => \Elementor\Controls_Manager::REPEATER,
208 - 'fields' => $this->get_meta_content_controls(),
209 - 'default' => [
210 - [
211 - 'type' => 'author'
212 - ],
222 + ],
223 + 'title_field' => '<span style="text-transform: capitalize">{{{ type }}}</span>',
224 + 'prevent_empty' => false,
225 + 'separator' => 'before'
226 + ]
227 + );
228 + $this->add_control(
229 + 'before_title_meta',
230 + [
231 + 'label' => esc_html__('Before Title Meta', 'uicore-elements'),
232 + 'type' => \Elementor\Controls_Manager::REPEATER,
233 + 'fields' => $this->get_meta_content_controls($product_metas),
234 + 'default' => [
235 + [
236 + 'type' => $product_metas ? 'none' : 'author'
213 237 ],
214 - 'title_field' => '<span style="text-transform: capitalize">{{{ type }}}</span>',
215 - 'prevent_empty' => false,
216 - 'separator' => 'before',
217 - ]
218 - );
219 - $this->add_control(
220 - 'after_title_meta',
221 - [
222 - 'label' => esc_html__('After Title Meta', 'uicore-elements'),
223 - 'type' => \Elementor\Controls_Manager::REPEATER,
224 - 'fields' => $this->get_meta_content_controls(),
225 - 'default' => [
226 - [
227 - 'type' => 'author'
228 - ],
238 + ],
239 + 'title_field' => '<span style="text-transform: capitalize">{{{ type }}}</span>',
240 + 'prevent_empty' => false,
241 + 'separator' => 'before',
242 + ]
243 + );
244 + $this->add_control(
245 + 'after_title_meta',
246 + [
247 + 'label' => esc_html__('After Title Meta', 'uicore-elements'),
248 + 'type' => \Elementor\Controls_Manager::REPEATER,
249 + 'fields' => $this->get_meta_content_controls($product_metas),
250 + 'default' => [
251 + [
252 + 'type' => $product_metas ? 'product price' : 'date'
229 253 ],
230 - 'title_field' => '<span style="text-transform: capitalize">{{{ type }}}</span>',
231 - 'prevent_empty' => false,
232 - 'separator' => 'before',
233 - ]
234 - );
235 - $this->add_control(
236 - 'bottom_meta',
237 - [
238 - 'label' => esc_html__('Bottom Meta', 'uicore-elements'),
239 - 'type' => \Elementor\Controls_Manager::REPEATER,
240 - 'fields' => $this->get_meta_content_controls(),
241 - 'default' => [
242 - [
243 - 'type' => 'author'
244 - ],
254 + ],
255 + 'title_field' => '<span style="text-transform: capitalize">{{{ type }}}</span>',
256 + 'prevent_empty' => false,
257 + 'separator' => 'before',
258 + ]
259 + );
260 + $this->add_control(
261 + 'bottom_meta',
262 + [
263 + 'label' => esc_html__('Bottom Meta', 'uicore-elements'),
264 + 'type' => \Elementor\Controls_Manager::REPEATER,
265 + 'fields' => $this->get_meta_content_controls($product_metas),
266 + 'default' => [
267 + [
268 + 'type' => $product_metas ? 'none' : 'none'
245 269 ],
246 - 'title_field' => '<span style="text-transform: capitalize">{{{ type }}}</span>',
247 - 'prevent_empty' => false,
248 - 'separator' => 'before',
249 - ]
250 - );
251 - if($section){
270 + ],
271 + 'title_field' => '<span style="text-transform: capitalize">{{{ type }}}</span>',
272 + 'prevent_empty' => false,
273 + 'separator' => 'before',
274 + ]
275 + );
276 + if ($section) {
252 277 $this->end_controls_section();
253 278 }
254 279 }
255 280 function TRAIT_register_post_query_controls($section = true)
256 281 {
257 - if($section){
282 +
283 + // In some contexts, such as theme-builder, our custom controls are not available
284 + if (! class_exists('UiCoreElements\Controls\Post_Filter')) {
285 + require_once UICORE_ELEMENTS_INCLUDES . '/controls/class-post-filter-control.php';
286 + }
287 +
288 + if ($section) {
258 289 $this->start_controls_section(
259 290 'section_post_grid_def',
260 291 [
261 292 'label' => esc_html__('Query', 'uicore-elements'),
@@ -262,95 +293,123 @@
262 293 ]
263 294 );
264 295 }
265 296
266 - $this->add_group_control(
267 - Post_Filter::get_type(),
268 - [
269 - 'name' => 'posts-filter',
270 - 'label' => esc_html__('Posts', 'uicore-elements'),
271 - 'description' => esc_html__('Current Query Settings > Reading', 'uicore-elements'),
272 - ]
273 - );
274 - $this->add_control(
275 - 'item_limit',
276 - [
277 - 'label' => esc_html__('Item Limit', 'uicore-elements'),
278 - 'type' => Controls_Manager::SLIDER,
279 - 'reder_type' => 'template',
280 - 'range' => [
281 - 'px' => [
282 - 'min' => -1,
283 - 'max' => 100,
284 - ],
297 + $this->add_group_control(
298 + Post_Filter::get_type(),
299 + [
300 + 'name' => 'posts-filter',
301 + 'label' => esc_html__('Posts', 'uicore-elements'),
302 + 'description' => esc_html__('Current Query Settings > Reading', 'uicore-elements'),
303 + ]
304 + );
305 + $this->add_control(
306 + 'item_order',
307 + [
308 + 'label' => esc_html__('Item Order', 'uicore-elements'),
309 + 'type' => Controls_Manager::SELECT,
310 + 'options' => [
311 + 'ASC' => esc_html__('Ascending', 'uicore-elements'),
312 + 'DESC' => esc_html__('Descending', 'uicore-elements'),
313 + ],
314 + 'default' => 'DESC',
315 + ]
316 + );
317 + $this->add_control(
318 + 'item_order_by',
319 + [
320 + 'label' => esc_html__('Item Order By', 'uicore-elements'),
321 + 'type' => Controls_Manager::SELECT,
322 + 'options' => [
323 + 'date' => esc_html__('Date', 'uicore-elements'),
324 + 'modified' => esc_html__('Modified Date', 'uicore-elements'),
325 + 'title' => esc_html__('Title', 'uicore-elements'),
326 + 'rand' => esc_html__('Random', 'uicore-elements'),
327 + 'comment_count' => esc_html__('Comments Count', 'uicore-elements'),
328 + 'menu_order' => esc_html__('Menu Order', 'uicore-elements'),
329 + ],
330 + 'default' => 'date',
331 + ]
332 + );
333 + $this->add_control(
334 + 'item_limit',
335 + [
336 + 'label' => esc_html__('Item Limit', 'uicore-elements'),
337 + 'type' => Controls_Manager::SLIDER,
338 + 'reder_type' => 'template',
339 + 'range' => [
340 + 'px' => [
341 + 'min' => -1,
342 + 'max' => 100,
285 343 ],
286 - 'default' => [
287 - 'size' => 3,
288 - ],
289 - 'condition' => array(
290 - 'posts-filter_post_type!' => 'current',
291 - ),
292 - ]
293 - );
344 + ],
345 + 'default' => [
346 + 'size' => 3,
347 + ],
348 + 'condition' => array(
349 + 'posts-filter_post_type!' => 'current',
350 + ),
351 + ]
352 + );
294 353
295 - $this->add_control(
296 - 'offset',
297 - [
298 - 'label' => esc_html__('Query Offset', 'uicore-elements'),
299 - 'type' => Controls_Manager::SLIDER,
300 - 'render_type' => 'template',
301 - 'range' => [
302 - 'px' => [
303 - 'min' => -1,
304 - 'max' => 10,
305 - ],
354 + $this->add_control(
355 + 'offset',
356 + [
357 + 'label' => esc_html__('Query Offset', 'uicore-elements'),
358 + 'type' => Controls_Manager::SLIDER,
359 + 'render_type' => 'template',
360 + 'range' => [
361 + 'px' => [
362 + 'min' => -1,
363 + 'max' => 10,
306 364 ],
307 - 'default' => [
308 - 'size' => 0,
309 - ],
310 - 'condition' => [
311 - 'pagination_type' => 'numbers',
312 - ]
365 + ],
366 + 'default' => [
367 + 'size' => 0,
368 + ],
369 + 'condition' => [
370 + 'pagination_type' => 'numbers',
313 371 ]
314 - );
372 + ]
373 + );
315 374
316 - $this->add_control(
317 - 'offset_alert',
318 - [
319 - 'type' => Controls_Manager::ALERT,
320 - 'alert_type' => 'info',
321 - 'content' => esc_html__('Offset is disabled with Load More pagination.', 'uicore-elements'),
322 - 'condition' => [
323 - 'pagination_type!' => 'numbers',
324 - ]
375 + $this->add_control(
376 + 'offset_alert',
377 + [
378 + 'type' => Controls_Manager::ALERT,
379 + 'alert_type' => 'info',
380 + 'content' => esc_html__('Offset is disabled with Load More pagination.', 'uicore-elements'),
381 + 'condition' => [
382 + 'pagination_type!' => 'numbers',
325 383 ]
326 - );
384 + ]
385 + );
327 386
328 - $this->add_control(
329 - 'sticky',
330 - [
331 - 'label' => esc_html__('Sticky Posts', 'uicore-elements'),
332 - 'type' => \Elementor\Controls_Manager::SWITCHER,
333 - 'label_on' => esc_html__('Show', 'uicore-elements'),
334 - 'label_off' => esc_html__('Hide', 'uicore-elements'),
335 - 'description' => esc_html__('Sticky posts works only on the front-end.', 'uicore-elements'),
336 - 'return_value' => 1,
337 - 'default' => 0,
338 - 'condition' => array(
339 - 'pagination!' => 'yes',
340 - ),
341 - ]
342 - );
387 + $this->add_control(
388 + 'sticky',
389 + [
390 + 'label' => esc_html__('Sticky Posts', 'uicore-elements'),
391 + 'type' => Controls_Manager::SWITCHER,
392 + 'label_on' => esc_html__('Show', 'uicore-elements'),
393 + 'label_off' => esc_html__('Hide', 'uicore-elements'),
394 + 'description' => esc_html__('Sticky posts works only on the front-end.', 'uicore-elements'),
395 + 'return_value' => 1,
396 + 'default' => 0,
397 + 'condition' => [
398 + 'pagination!' => 'yes',
399 + ],
400 + ]
401 + );
343 402
344 - if($section){
403 + if ($section) {
345 404 $this->end_controls_section();
346 405 }
347 406 }
348 407
349 - // Styles
408 + // Control Register Styles functions
350 409 function TRAIT_register_post_item_style_controls($section = true, $active_tab = false)
351 410 {
352 - if($section){
411 + if ($section) {
353 412 $this->start_controls_section(
354 413 'section_style_item',
355 414 [
356 415 'label' => __('Item Style', 'uicore-elements'),
@@ -358,101 +417,132 @@
358 417 ]
359 418 );
360 419 }
361 420
362 - $this->start_controls_tabs(
363 - 'item_border_shadow'
364 - );
421 + $this->start_controls_tabs(
422 + 'item_border_shadow'
423 + );
365 424
366 - $this->start_controls_tab(
367 - 'item_bs_normal_tab',
368 - [
369 - 'label' => esc_html__('Normal', 'plugin-name'),
370 - ]
371 - );
372 - $this->add_group_control(
373 - Group_Control_Border::get_type(),
374 - [
375 - 'name' => 'item_border',
376 - 'selector' => '{{WRAPPER}} .ui-e-item article',
377 - ]
378 - );
379 - $this->add_group_control(
380 - Group_Control_Box_Shadow::get_type(),
381 - [
382 - 'name' => 'item_shadow',
383 - 'selector' => '{{WRAPPER}} .ui-e-item article',
384 - ]
385 - );
386 - $this->end_controls_tab();
425 + $this->start_controls_tab(
426 + 'item_bs_normal_tab',
427 + [
428 + 'label' => esc_html__('Normal', 'uicore-elements'),
429 + ]
430 + );
431 + $this->add_group_control(
432 + Group_Control_Background::get_type(),
433 + [
434 + 'name' => 'content_bg',
435 + 'types' => ['classic', 'gradient'],
436 + 'selector' => '{{WRAPPER}} .ui-e-item article',
437 + ]
438 + );
439 + $this->add_group_control(
440 + Group_Control_Border::get_type(),
441 + [
442 + 'name' => 'item_border',
443 + 'selector' => '{{WRAPPER}} .ui-e-item article',
444 + ]
445 + );
446 + $this->add_group_control(
447 + Group_Control_Box_Shadow::get_type(),
448 + [
449 + 'name' => 'item_shadow',
450 + 'selector' => '{{WRAPPER}} .ui-e-item article',
451 + ]
452 + );
453 + $this->end_controls_tab();
387 454
388 - $this->start_controls_tab(
389 - 'item_bs_hover_tab',
390 - [
391 - 'label' => esc_html__('Hover', 'plugin-name'),
392 - ]
393 - );
394 - $this->add_group_control(
395 - Group_Control_Border::get_type(),
396 - [
397 - 'name' => 'item_border_hover',
398 - 'selector' => '{{WRAPPER}} .ui-e-item:hover article',
399 - ]
400 - );
401 - $this->add_group_control(
402 - Group_Control_Box_Shadow::get_type(),
403 - [
404 - 'name' => 'item_shadow_hover',
405 - 'selector' => '{{WRAPPER}} .ui-e-item:hover article',
406 - ]
407 - );
408 - $this->end_controls_tab();
455 + $this->start_controls_tab(
456 + 'item_bs_hover_tab',
457 + [
458 + 'label' => esc_html__('Hover', 'uicore-elements'),
459 + ]
460 + );
461 + $this->add_group_control(
462 + Group_Control_Background::get_type(),
463 + [
464 + 'name' => 'content_bg_hover',
465 + 'types' => ['classic', 'gradient'],
466 + 'selector' => '{{WRAPPER}} .ui-e-item:hover article',
467 + ]
468 + );
469 + $this->add_group_control(
470 + Group_Control_Border::get_type(),
471 + [
472 + 'name' => 'item_border_hover',
473 + 'selector' => '{{WRAPPER}} .ui-e-item:hover article',
474 + ]
475 + );
476 + $this->add_group_control(
477 + Group_Control_Box_Shadow::get_type(),
478 + [
479 + 'name' => 'item_shadow_hover',
480 + 'selector' => '{{WRAPPER}} .ui-e-item:hover article',
481 + ]
482 + );
483 + $this->end_controls_tab();
409 484
410 - if($active_tab){
411 - $this->start_controls_tab(
412 - 'item_bs_active_tab',
413 - [
414 - 'label' => esc_html__('Active', 'plugin-name'),
415 - ]
416 - );
417 - $this->add_group_control(
418 - Group_Control_Border::get_type(),
419 - [
420 - 'name' => 'item_border_active',
421 - 'selector' => '{{WRAPPER}} .ui-e-item.ui-e-active article',
422 - ]
423 - );
424 - $this->add_group_control(
425 - Group_Control_Box_Shadow::get_type(),
426 - [
427 - 'name' => 'item_shadow_active',
428 - 'selector' => '{{WRAPPER}} .ui-e-item.ui-e-active article',
429 - ]
430 - );
431 - $this->end_controls_tab();
432 - }
433 -
434 - $this->end_controls_tabs();
435 -
436 - $this->add_control(
437 - 'item_radius',
485 + if ($active_tab) {
486 + $this->start_controls_tab(
487 + 'item_bs_active_tab',
438 488 [
439 - 'label' => esc_html__('Border Radius', 'uicore-elements'),
440 - 'type' => Controls_Manager::DIMENSIONS,
441 - 'separator' => 'before',
442 - 'selectors' => [
443 - '{{WRAPPER}} ' => '--ui-e-border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;'
444 - ],
489 + 'label' => esc_html__('Active', 'uicore-elements'),
445 490 ]
446 491 );
492 + $this->add_group_control(
493 + Group_Control_Border::get_type(),
494 + [
495 + 'name' => 'item_border_active',
496 + 'selector' => '{{WRAPPER}} .ui-e-item.ui-e-active article',
497 + ]
498 + );
499 + $this->add_group_control(
500 + Group_Control_Box_Shadow::get_type(),
501 + [
502 + 'name' => 'item_shadow_active',
503 + 'selector' => '{{WRAPPER}} .ui-e-item.ui-e-active article',
504 + ]
505 + );
506 + $this->end_controls_tab();
507 + }
447 508
448 - if($section){
509 + $this->end_controls_tabs();
510 +
511 + $this->add_control(
512 + 'item_padding',
513 + [
514 + 'label' => esc_html__('Padding', 'uicore-elements'),
515 + 'type' => Controls_Manager::DIMENSIONS,
516 + 'size_units' => ['px', 'em', 'rem', '%'],
517 + 'separator' => 'before',
518 + 'selectors' => [
519 + '{{WRAPPER}} .ui-e-item article' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};'
520 + ],
521 + 'condition' => array(
522 + 'box_style!' => 'overlay',
523 + ),
524 + ]
525 +
526 + );
527 + $this->add_control(
528 + 'item_radius',
529 + [
530 + 'label' => esc_html__('Border Radius', 'uicore-elements'),
531 + 'type' => Controls_Manager::DIMENSIONS,
532 + 'selectors' => [
533 + '{{WRAPPER}} ' => '--ui-e-border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;'
534 + ],
535 + ]
536 + );
537 +
538 + if ($section) {
449 539 $this->end_controls_section();
450 540 }
451 541 }
452 542 function TRAIT_register_post_content_style_controls($section = true)
453 543 {
454 - if($section){
544 + if ($section) {
455 545 $this->start_controls_section(
456 546 'section_style_content',
457 547 [
458 548 'label' => __('Content Style', 'uicore-elements'),
@@ -459,230 +549,302 @@
459 549 'tab' => Controls_Manager::TAB_STYLE,
460 550 ]
461 551 );
462 552 }
463 - $this->add_control(
464 - 'image_size',
465 - [
466 - 'label' => __('Image Height (%)', 'uicore-elements'),
467 - 'type' => Controls_Manager::NUMBER,
468 - 'min' => 1,
469 - 'max' => 500,
470 - 'step' => 1,
471 - 'default' => 57,
472 - 'selectors' => [
473 - '{{WRAPPER}} .ui-e-post-top' => '--ui-e-img-size: {{VALUE}}',
553 + $this->add_responsive_control(
554 + 'image_size',
555 + [
556 + 'label' => __('Image Height (%)', 'uicore-elements'),
557 + 'type' => Controls_Manager::NUMBER,
558 + 'min' => 1,
559 + 'max' => 500,
560 + 'step' => 1,
561 + 'default' => 57,
562 + 'selectors' => [
563 + '{{WRAPPER}} .ui-e-post-top' => '--ui-e-img-size: {{VALUE}}',
564 + ],
565 + 'condition' => [
566 + 'masonry!' => 'ui-e-maso',
567 + ],
568 + ]
569 + );
570 + $this->add_responsive_control(
571 + 'image_position',
572 + [
573 + 'label' => __('Image Position', 'uicore-elements'),
574 + 'type' => Controls_Manager::SELECT,
575 + 'default' => 'center center',
576 + 'tablet_default' => '',
577 + 'mobile_default' => '',
578 + 'options' => [
579 + '' => esc_html__('Default', 'uicore-elements'),
580 + 'left top' => esc_html__('Left Top', 'uicore-elements'),
581 + 'left center' => esc_html__('Left Center', 'uicore-elements'),
582 + 'left bottom' => esc_html__('Left Bottom', 'uicore-elements'),
583 + 'center top' => esc_html__('Center Top', 'uicore-elements'),
584 + 'center center' => esc_html__('Center Center', 'uicore-elements'),
585 + 'center bottom' => esc_html__('Center Bottom', 'uicore-elements'),
586 + 'right top' => esc_html__('Right Top', 'uicore-elements'),
587 + 'right center' => esc_html__('Right Center', 'uicore-elements'),
588 + 'right bottom' => esc_html__('Right Bottom', 'uicore-elements'),
589 + ],
590 + 'selectors' => [
591 + '{{WRAPPER}} .ui-e-post-img' => 'background-position: {{VALUE}}',
592 + ],
593 + ]
594 + );
595 + $this->add_responsive_control(
596 + 'image_fit',
597 + [
598 + 'label' => __('Image Fit', 'uicore-elements'),
599 + 'type' => Controls_Manager::SELECT,
600 + 'default' => 'cover',
601 + 'tablet_default' => '',
602 + 'mobile_default' => '',
603 + 'options' => [
604 + '' => esc_html__('Default', 'uicore-elements'),
605 + 'cover' => esc_html__('Cover', 'uicore-elements'),
606 + 'contain' => esc_html__('Contain', 'uicore-elements'),
607 + 'auto' => esc_html__('Auto', 'uicore-elements'),
608 + ],
609 + 'selectors' => [
610 + '{{WRAPPER}} .ui-e-post-img' => 'background-size: {{VALUE}}',
611 + ],
612 + ]
613 + );
614 + $this->add_control(
615 + 'image_radius',
616 + [
617 + 'label' => esc_html__('Border Radius', 'uicore-elements'),
618 + 'type' => Controls_Manager::DIMENSIONS,
619 + 'size_units' => ['px', 'em', '%'],
620 + 'selectors' => [
621 + '{{WRAPPER}} .ui-e-post-top' => 'border-radius: {{TOP}}{{UNIT}} {{RIGHT}}px {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};'
622 + ],
623 + 'condition' => array(
624 + 'box_style!' => 'overlay',
625 + ),
626 + ]
627 + );
628 + $this->add_group_control(
629 + Group_Control_Box_Shadow::get_type(),
630 + [
631 + 'name' => 'image_shadow',
632 + 'label' => esc_html__('Box Shadow', 'uicore-elements'),
633 + 'selector' => '{{WRAPPER}} .ui-e-post-top',
634 + 'condition' => array(
635 + 'box_style!' => 'overlay',
636 + ),
637 + ]
638 + );
639 + $this->add_responsive_control(
640 + 'content_alignment',
641 + [
642 + 'label' => esc_html__('Content Alignment', 'uicore-elements'),
643 + 'type' => Controls_Manager::CHOOSE,
644 + 'options' => [
645 + 'start' => [
646 + 'title' => esc_html__('Left', 'uicore-elements'),
647 + 'icon' => 'eicon-text-align-left',
474 648 ],
475 - 'condition' => [
476 - 'masonry!' => 'ui-e-maso',
649 + 'center' => [
650 + 'title' => esc_html__('Center', 'uicore-elements'),
651 + 'icon' => 'eicon-text-align-center',
477 652 ],
478 - ]
479 - );
480 - $this->add_control(
481 - 'image_overflow',
482 - [
483 - 'label' => __('Independent Border Radius and Shadow', 'uicore-elements'),
484 - 'type' => Controls_Manager::SWITCHER,
485 - 'default' => 'no',
486 - 'prefix_class' => 'ui-e-post-ovf-',
487 - 'condition' => array(
488 - 'box_style!' => 'overlay',
489 - ),
490 - ]
491 - );
492 - $this->add_control(
493 - 'image_radius',
494 - [
495 - 'label' => esc_html__('Border Radius', 'uicore-elements'),
496 - 'type' => Controls_Manager::DIMENSIONS,
497 - 'selectors' => [
498 - '{{WRAPPER}} .ui-e-post-top' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;'
653 + 'end' => [
654 + 'title' => esc_html__('Right', 'uicore-elements'),
655 + 'icon' => 'eicon-text-align-right',
499 656 ],
500 - 'condition' => array(
501 - 'image_overflow' => 'yes',
502 - ),
503 - ]
504 - );
505 - $this->add_group_control(
506 - Group_Control_Box_Shadow::get_type(),
507 - [
508 - 'name' => 'image_shadow',
509 - 'label' => esc_html__('Box Shadow', 'uicore-elements'),
510 - 'selector' => '{{WRAPPER}} .ui-e-post-top',
511 - 'condition' => array(
512 - 'image_overflow' => 'yes',
513 - ),
514 - ]
515 - );
516 - $this->add_responsive_control(
517 - 'content_align',
518 - [
519 - 'label' => esc_html__('Content Alignment', 'uicore-elements'),
520 - 'type' => Controls_Manager::CHOOSE,
521 - 'options' => [
522 - 'left' => [
523 - 'title' => esc_html__('Left', 'uicore-elements'),
524 - 'icon' => 'eicon-text-align-left',
525 - ],
526 - 'center' => [
527 - 'title' => esc_html__('Center', 'uicore-elements'),
528 - 'icon' => 'eicon-text-align-center',
529 - ],
530 - 'stretch' => [
531 - 'title' => esc_html__('Justified', 'uicore-elements'),
532 - 'icon' => 'eicon-text-align-justify',
533 - ],
657 + 'stretch' => [
658 + 'title' => esc_html__('Justified', 'uicore-elements'),
659 + 'icon' => 'eicon-text-align-justify',
534 660 ],
535 - 'selectors' => [
536 - '{{WRAPPER}} .ui-e-post-content' => 'align-items: {{VALUE}}; text-align: {{VALUE}};',
661 + ],
662 + 'selectors_dictionary' => [
663 + 'left' => 'start',
664 + ],
665 + 'default' => is_rtl() ? 'end' : 'start',
666 + 'selectors' => [
667 + '{{WRAPPER}} .ui-e-post-content' => 'align-items: {{VALUE}}; text-align: {{VALUE}};',
668 + ],
669 + ]
670 + );
671 + $this->add_control(
672 + 'title_color',
673 + [
674 + 'label' => esc_html__('Title Color', 'uicore-elements'),
675 + 'type' => Controls_Manager::COLOR,
676 + 'default' => '',
677 + 'separator' => 'before',
678 + 'selectors' => [
679 + '{{WRAPPER}} .ui-e-post-title' => 'color: {{VALUE}};',
680 + ],
681 + ]
682 + );
683 + $this->add_control(
684 + 'title_hcolor',
685 + [
686 + 'label' => esc_html__('Title Hover Color', 'uicore-elements'),
687 + 'type' => Controls_Manager::COLOR,
688 + 'default' => '',
689 + 'selectors' => [
690 + '{{WRAPPER}} .ui-e-post-title:hover' => 'color: {{VALUE}};',
691 + ],
692 + ]
693 + );
694 + $this->add_group_control(
695 + Group_Control_Typography::get_type(),
696 + [
697 + 'name' => 'title_typography',
698 + 'label' => esc_html__('Title Typography', 'uicore-elements'),
699 + 'selector' => '{{WRAPPER}} .ui-e-post-title',
700 + ]
701 + );
702 + $this->add_responsive_control(
703 + 'title_gap',
704 + [
705 + 'label' => __('Title Top Space', 'uicore-elements'),
706 + 'type' => Controls_Manager::SLIDER,
707 + 'size_units' => ['em'],
708 + 'separator' => 'after',
709 + 'range' => [
710 + 'px' => [
711 + 'min' => 0,
712 + 'max' => 3,
713 + 'step' => 0.1,
537 714 ],
538 - ]
539 - );
540 - $this->add_control(
541 - 'title_color',
542 - [
543 - 'label' => esc_html__('Title Color', 'uicore-elements'),
544 - 'type' => Controls_Manager::COLOR,
545 - 'default' => '',
546 - 'separator' => 'before',
547 - 'selectors' => [
548 - '{{WRAPPER}} .ui-e-post-title' => 'color: {{VALUE}};',
715 + ],
716 + 'default' => [
717 + 'unit' => 'em',
718 + 'size' => 1.2,
719 + ],
720 + 'selectors' => [
721 + '{{WRAPPER}} .ui-e-post-title' => 'margin-top: {{SIZE}}em;',
722 + ],
723 + ]
724 + );
725 + $this->add_control(
726 + 'text_color',
727 + [
728 + 'label' => esc_html__('Excerpt Color', 'uicore-elements'),
729 + 'type' => Controls_Manager::COLOR,
730 + 'default' => '',
731 + 'selectors' => [
732 + '{{WRAPPER}} .ui-e-post-text' => 'color: {{VALUE}};',
733 + ],
734 + ]
735 + );
736 + $this->add_group_control(
737 + Group_Control_Typography::get_type(),
738 + [
739 + 'name' => 'text_typography',
740 + 'label' => esc_html__('Excerpt Typography', 'uicore-elements'),
741 + 'selector' => '{{WRAPPER}} .ui-e-post-text',
742 + ]
743 + );
744 + $this->add_responsive_control(
745 + 'text_gap',
746 + [
747 + 'label' => __('Excerpt Top Space', 'uicore-elements'),
748 + 'type' => Controls_Manager::SLIDER,
749 + 'size_units' => ['em'],
750 + 'separator' => 'after',
751 + 'range' => [
752 + 'px' => [
753 + 'min' => 0,
754 + 'max' => 3,
755 + 'step' => 0.1,
549 756 ],
550 - ]
551 - );
552 - $this->add_control(
553 - 'title_hcolor',
554 - [
555 - 'label' => esc_html__('Title Hover Color', 'uicore-elements'),
556 - 'type' => Controls_Manager::COLOR,
557 - 'default' => '',
558 - 'selectors' => [
559 - '{{WRAPPER}} .ui-e-post-title:hover' => 'color: {{VALUE}};',
757 + ],
758 + 'default' => [
759 + 'unit' => 'em',
760 + 'size' => 0.8,
761 + ],
762 + 'selectors' => [
763 + '{{WRAPPER}} .ui-e-post-text' => 'margin-top: {{SIZE}}em;',
764 + ],
765 + ]
766 + );
767 + $this->add_group_control(
768 + Group_Control_Background::get_type(),
769 + [
770 + 'name' => 'content_background',
771 + 'selector' => '{{WRAPPER}} .ui-e-post-content',
772 + ]
773 + );
774 + $this->add_group_control(
775 + Group_Control_Background::get_type(),
776 + [
777 + 'name' => 'content_background_hover',
778 + 'selector' => '{{WRAPPER}} .ui-e-item:hover .ui-e-post-content',
779 + 'fields_options' => [
780 + 'background' => [
781 + 'label' => esc_html__('Hover Background', 'uicore-elements'),
560 782 ],
783 + ],
784 + 'condition' => [
785 + 'box_style' => 'overlay',
561 786 ]
562 - );
563 - $this->add_group_control(
564 - Group_Control_Typography::get_type(),
565 - [
566 - 'name' => 'title_typography',
567 - 'label' => esc_html__('Title Typography', 'uicore-elements'),
568 - 'selector' => '{{WRAPPER}} .ui-e-post-title',
787 + ]
788 + );
789 + $this->add_responsive_control(
790 + 'content_padding',
791 + [
792 + 'label' => esc_html__('Content Padding', 'uicore-elements'),
793 + 'type' => Controls_Manager::DIMENSIONS,
794 + 'size_units' => ['px', 'em', '%'],
795 + 'selectors' => [
796 + '{{WRAPPER}} .ui-e-post-content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};'
569 797 ]
570 - );
571 - $this->add_control(
572 - 'title_gap',
573 - [
574 - 'label' => __('Title Top Space', 'uicore-elements'),
575 - 'type' => Controls_Manager::SLIDER,
576 - 'size_units' => ['em'],
577 - 'separator' => 'after',
578 - 'range' => [
579 - 'px' => [
580 - 'min' => 0,
581 - 'max' => 3,
582 - 'step' => 0.1,
583 - ],
798 + ]
799 + );
800 + $this->add_control(
801 + 'content_radius',
802 + [
803 + 'label' => esc_html__('Content Border Radius', 'uicore-elements'),
804 + 'type' => Controls_Manager::DIMENSIONS,
805 + 'selectors' => [
806 + '{{WRAPPER}} .ui-e-post-content' => 'border-radius: {{TOP}}px {{RIGHT}}px {{BOTTOM}}px {{LEFT}}px;'
807 + ],
808 + 'condition' => array(
809 + 'box_style!' => 'overlay',
810 + ),
811 + ]
812 + );
813 + $this->add_control(
814 + 'content_gap',
815 + [
816 + 'label' => __('Content Space', 'uicore-elements'),
817 + 'type' => Controls_Manager::SLIDER,
818 + 'size_units' => ['em'],
819 + 'separator' => 'after',
820 + 'range' => [
821 + 'px' => [
822 + 'min' => 0,
823 + 'max' => 3,
824 + 'step' => 0.1,
584 825 ],
585 - 'default' => [
586 - 'unit' => 'em',
587 - 'size' => 1.2,
588 - ],
589 - 'selectors' => [
590 - '{{WRAPPER}} .ui-e-post-title' => 'margin-top: {{SIZE}}em;',
591 - ],
592 - ]
593 - );
594 - $this->add_control(
595 - 'text_color',
596 - [
597 - 'label' => esc_html__('Excerpt Color', 'uicore-elements'),
598 - 'type' => Controls_Manager::COLOR,
599 - 'default' => '',
600 - 'selectors' => [
601 - '{{WRAPPER}} .ui-e-post-text' => 'color: {{VALUE}};',
602 - ],
603 - ]
604 - );
605 - $this->add_group_control(
606 - Group_Control_Typography::get_type(),
607 - [
608 - 'name' => 'text_typography',
609 - 'label' => esc_html__('Excerpt Typography', 'uicore-elements'),
610 - 'selector' => '{{WRAPPER}} .ui-e-post-text',
611 - ]
612 - );
613 - $this->add_control(
614 - 'text_gap',
615 - [
616 - 'label' => __('Excerpt Top Space', 'uicore-elements'),
617 - 'type' => Controls_Manager::SLIDER,
618 - 'size_units' => ['em'],
619 - 'separator' => 'after',
620 - 'range' => [
621 - 'px' => [
622 - 'min' => 0,
623 - 'max' => 3,
624 - 'step' => 0.1,
625 - ],
626 - ],
627 - 'default' => [
628 - 'unit' => 'em',
629 - 'size' => 0.8,
630 - ],
631 - 'selectors' => [
632 - '{{WRAPPER}} .ui-e-post-text' => 'margin-top: {{SIZE}}em;',
633 - ],
634 - ]
635 - );
636 - $this->add_responsive_control(
637 - 'content_padding',
638 - [
639 - 'label' => esc_html__('Content Padding', 'uicore-elements'),
640 - 'type' => Controls_Manager::DIMENSIONS,
641 - 'size_units' => ['px', 'em', '%'],
642 - 'selectors' => [
643 - '{{WRAPPER}} .ui-e-post-content' => 'padding: {{TOP}}{{UNIT}} {{RIGHT}}{{UNIT}} {{BOTTOM}}{{UNIT}} {{LEFT}}{{UNIT}};'
644 - ]
645 - ]
646 - );
647 - $this->add_control(
648 - 'content_gap',
649 - [
650 - 'label' => __('Content Space', 'uicore-elements'),
651 - 'type' => Controls_Manager::SLIDER,
652 - 'size_units' => ['em'],
653 - 'separator' => 'after',
654 - 'range' => [
655 - 'px' => [
656 - 'min' => 0,
657 - 'max' => 3,
658 - 'step' => 0.1,
659 - ],
660 - ],
661 - 'default' => [
662 - 'unit' => 'em',
663 - 'size' => 0,
664 - ],
665 - 'selectors' => [
666 - '{{WRAPPER}} ' => '--ui-e-content-space: {{SIZE}}em;',
667 - ],
668 - ]
669 - );
670 - $this->add_group_control(
671 - Group_Control_Background::get_type(),
672 - [
673 - 'name' => 'content_bg',
674 - 'selector' => '{{WRAPPER}} .ui-e-post-content',
675 - ]
676 - );
826 + ],
827 + 'default' => [
828 + 'unit' => 'em',
829 + 'size' => 0,
830 + ],
831 + 'selectors' => [
832 + '{{WRAPPER}} ' => '--ui-e-content-space: {{SIZE}}em;',
833 + ],
834 + 'condition' => array(
835 + 'box_style!' => 'overlay',
836 + ),
837 + ]
838 + );
677 839
678 - if($section){
840 + if ($section) {
679 841 $this->end_controls_section();
680 842 }
681 843 }
682 844 function TRAIT_register_post_button_style_controls($section = true)
683 845 {
684 - if($section){
846 + if ($section) {
685 847 $this->start_controls_section(
686 848 'section_button_style',
687 849 [
688 850 'label' => esc_html__('Button Style', 'uicore-elements'),
@@ -692,24 +854,57 @@
692 854 ),
693 855 ]
694 856 );
695 857 }
696 - $this->register_button_style_controls(
697 - [
698 - 'section_condition' => [
699 - 'show_button' => 'yes'
700 - ]
701 - ]
702 - );
703 - $this->TRAIT_register_post_specific_controls('button_gap');
858 + $this->add_responsive_control(
859 + 'button_align',
860 + [
861 + 'label' => esc_html__('Alignment', 'uicore-elements'),
862 + 'type' => Controls_Manager::CHOOSE,
863 + 'options' => [
864 + 'start' => [
865 + 'title' => esc_html__('Left', 'uicore-elements'),
866 + 'icon' => 'eicon-text-align-left',
867 + ],
868 + 'center' => [
869 + 'title' => esc_html__('Center', 'uicore-elements'),
870 + 'icon' => 'eicon-text-align-center',
871 + ],
872 + 'end' => [
873 + 'title' => esc_html__('Right', 'uicore-elements'),
874 + 'icon' => 'eicon-text-align-right',
875 + ],
876 + 'normal' => [
877 + 'title' => esc_html__('Justified', 'uicore-elements'),
878 + 'icon' => 'eicon-text-align-justify',
879 + ],
880 + ],
881 + 'default' => 'start',
882 + 'selectors' => [
883 + '{{WRAPPER}} .ui-e-readmore' => 'align-self: {{VALUE}};',
884 + ],
704 885
705 - if($section) {
886 + ]
887 + );
888 + $this->register_button_style_controls(
889 + [
890 + 'section_condition' => [
891 + 'show_button' => 'yes'
892 + ]
893 + ]
894 + );
895 + // Remove button alignment from Elementor button traits because (seens to be a bug), updating Selector CSS with update_control(), don't work as expected with responsiveness
896 + $this->remove_responsive_control('align');
897 +
898 + $this->TRAIT_register_post_specific_controls('button_gap');
899 +
900 + if ($section) {
706 901 $this->end_controls_section();
707 902 }
708 903 }
709 904 function TRAIT_register_post_meta_style_controls($section = true)
710 905 {
711 - if($section) {
906 + if ($section) {
712 907 $this->start_controls_section(
713 908 'section_style_extra_content',
714 909 [
715 910 'label' => __('Meta Style', 'uicore-elements'),
@@ -716,47 +911,47 @@
716 911 'tab' => Controls_Manager::TAB_STYLE,
717 912 ]
718 913 );
719 914 }
720 - $this->start_controls_tabs('style_extra_tabs');
721 - $this->start_controls_tab(
722 - 'style_top_tab',
723 - [
724 - 'label' => esc_html__('Top', 'uicore-elements'),
725 - ]
726 - );
727 - $this->get_meta_style_controls('top');
728 - $this->end_controls_tab();
915 + $this->start_controls_tabs('style_extra_tabs');
916 + $this->start_controls_tab(
917 + 'style_top_tab',
918 + [
919 + 'label' => esc_html__('Top', 'uicore-elements'),
920 + ]
921 + );
922 + $this->get_meta_style_controls('top');
923 + $this->end_controls_tab();
729 924
730 - $this->start_controls_tab(
731 - 'style_before_title_tab',
732 - [
733 - 'label' => esc_html__('Before Title', 'uicore-elements'),
734 - ]
735 - );
736 - $this->get_meta_style_controls('before_title');
737 - $this->end_controls_tab();
925 + $this->start_controls_tab(
926 + 'style_before_title_tab',
927 + [
928 + 'label' => esc_html__('Before Title', 'uicore-elements'),
929 + ]
930 + );
931 + $this->get_meta_style_controls('before_title');
932 + $this->end_controls_tab();
738 933
739 - $this->start_controls_tab(
740 - 'style_after_title_tab',
741 - [
742 - 'label' => esc_html__('After Title', 'uicore-elements'),
743 - ]
744 - );
745 - $this->get_meta_style_controls('after_title');
746 - $this->end_controls_tab();
934 + $this->start_controls_tab(
935 + 'style_after_title_tab',
936 + [
937 + 'label' => esc_html__('After Title', 'uicore-elements'),
938 + ]
939 + );
940 + $this->get_meta_style_controls('after_title');
941 + $this->end_controls_tab();
747 942
748 - $this->start_controls_tab(
749 - 'style_bottom_tab',
750 - [
751 - 'label' => esc_html__('Bottom', 'uicore-elements'),
752 - ]
753 - );
754 - $this->get_meta_style_controls('bottom');
755 - $this->end_controls_tab();
756 - $this->end_controls_tabs();
943 + $this->start_controls_tab(
944 + 'style_bottom_tab',
945 + [
946 + 'label' => esc_html__('Bottom', 'uicore-elements'),
947 + ]
948 + );
949 + $this->get_meta_style_controls('bottom');
950 + $this->end_controls_tab();
951 + $this->end_controls_tabs();
757 952
758 - if($section) {
953 + if ($section) {
759 954 $this->end_controls_section();
760 955 }
761 956 }
762 957 function TRAIT_register_post_animation_controls()
@@ -810,8 +1005,9 @@
810 1005 'default' => '',
811 1006 'options' => [
812 1007 '' => __('None', 'uicore-elements'),
813 1008 'ui-e-title-anim-underline' => __('Underline', 'uicore-elements'),
1009 + 'ui-e-title-anim-show' => __('Show', 'uicore-elements'),
814 1010 ],
815 1011 'prefix_class' => '',
816 1012 ]
817 1013 );
@@ -849,11 +1045,11 @@
849 1045 ],
850 1046 ]
851 1047 );
852 1048 }
853 -
854 1049 /**
855 1050 * Registers specific controls that can't be registered in blocks because of diferent use by different widgets or some other reason.
1051 + * TODO: update to the use injection control, a better approach.
856 1052 *
857 1053 * @param string $control The control to register.
858 1054 * @return void
859 1055 */
@@ -886,25 +1082,65 @@
886 1082 break;
887 1083 }
888 1084 }
889 1085
890 - // Helper functions
891 - function TRAIT_query_posts($posts_per_page, $type = null)
1086 + /**
1087 + * Returns the proper query args for a given post type.
1088 + *
1089 + * @param array $settings Elementor controls settings.
1090 + * @param object $default_query The default query object. Used to tell if is a frontend or rest api request.
1091 + *
1092 + * @return void Don't return anything, but sets the query object to $_query variable that can be accessed by the widget.
1093 + */
1094 + function TRAIT_query_posts($settings, $default_query)
892 1095 {
893 - if (!Plugin::$instance->editor->is_edit_mode() && $this->get_settings('posts-filter_post_type') === 'current' && !isset($_GET['uicore-tb'])) {
894 - global $wp_query;
895 - $this->_query = $wp_query;
896 - } elseif ($this->get_settings('posts-filter_post_type') === 'related') {
897 - $this->_query = Helper::get_related('random', $posts_per_page);
1096 + $post_type = $settings['posts-filter_post_type'];
1097 +
1098 + if ($post_type === 'related') {
1099 + $current_post_id = $settings['__current_post_id'] ?? [];
1100 + $this->_query = Helper::get_related_ajax(
1101 + Query::get_queried_page($settings),
1102 + $settings['item_limit']['size'],
1103 + $current_post_id
1104 + );
898 1105 } else {
899 - $query_args = Query::get_query_args('posts-filter', $this->get_settings(), get_the_ID());
1106 + $query_args = Query::get_query_args('posts-filter', $settings);
900 1107
901 - if ($type === 'portfolio') {
902 - $query_args['orderby'] = 'menu_order date';
1108 + if ($post_type === 'current') {
1109 +
1110 + // Makes sure widget will render some posts at editor screen
1111 + if ($this->is_edit_mode()) {
1112 + $query_args['post_type'] = 'post';
1113 + } else {
1114 + $query_args = $default_query;
1115 +
1116 + /// TODO: very likely commit `38c618c` on Elements repo make this fallback useless. Test it
1117 + // Post type fallback for APG
1118 + if (isset($default_query['post_type']) || isset($default_query['query']['post_type'])) {
1119 + $post_type = $default_query['post_type'] ?? $default_query['query']['post_type'];
1120 + } else {
1121 + $post_type = 'post';
1122 + }
1123 +
1124 + // Set pagination
1125 + $query_args['paged'] = Query::get_queried_page($settings);
1126 +
1127 +
1128 + // current bug: clicking `all` on `portfolio` archive post type brings `post` type posts
1129 +
1130 + // Set tax filters for filter component, if enabled
1131 + $queried_filters = Query::get_queried_filters($settings, $post_type, 'posts-filter');
1132 + $query_args['tax_query'] = empty($queried_filters['tax_query'])
1133 + ? []
1134 + : $queried_filters['tax_query'];
1135 + }
1136 +
1137 + // Set products per page
1138 + $query_args['posts_per_page'] = Helper::get_framework_visible_posts($post_type);
903 1139 }
904 1140
905 - if ($type === 'current') {
906 - unset($query_args['posts_per_page']);
1141 + if ($post_type === 'portfolio') {
1142 + $query_args['orderby'] = 'menu_order date';
907 1143 }
908 1144
909 1145 $this->_query = new \WP_Query($query_args);
910 1146 }
@@ -909,38 +1145,47 @@
909 1145 $this->_query = new \WP_Query($query_args);
910 1146 }
911 1147 }
912 1148
913 - // Render functions
1149 + // Render functions
914 1150 function get_post_image()
915 1151 {
1152 + if ($this->is_option('image', 'yes', '!==')) {
1153 + return;
1154 + }
916 1155
917 - if ($this->get_settings_for_display('image') === 'yes') {
918 - $pic_id = get_post_thumbnail_id();
919 - if (!$pic_id)
920 - return;
921 - $size = $this->get_settings_for_display('image_size_select') ?? 'uicore-medium';
922 - ?>
923 - <a class="ui-e-post-img-wrapp" href="<?php echo esc_url(get_permalink()); ?>" title="<?php echo esc_attr__('View Post:', 'uicore-elements') . the_title_attribute(['echo' => false]); ?>">
924 - <?php if ($this->get_settings_for_display('masonry') === 'ui-e-maso') { ?>
925 - <?php the_post_thumbnail($size, ['class' => 'ui-e-post-img']); ?>
926 - <?php } else { ?>
927 - <div class="ui-e-post-img" style="background-image:url(<?php echo wp_get_attachment_image_url($pic_id, $size) ?>)"></div>
928 - <?php } ?>
929 - </a>
930 - <?php
931 - }
1156 + $pic_id = get_post_thumbnail_id();
1157 + if (!$pic_id)
1158 + return;
1159 + $size = $this->get_settings_for_display('image_size_select') ?? 'uicore-medium';
1160 +?>
1161 + <a class="ui-e-post-img-wrapp"
1162 + href="<?php echo esc_url(get_permalink()); ?>"
1163 + title="<?php echo esc_attr__('View Post:', 'uicore-elements') . the_title_attribute(['echo' => false]); ?>">
1164 +
1165 + <?php if ($this->get_settings_for_display('masonry') === 'ui-e-maso') { ?>
1166 + <?php the_post_thumbnail($size, ['class' => 'ui-e-post-img']); ?>
1167 + <?php } else { ?>
1168 + <div class="ui-e-post-img" style="background-image:url(<?php echo esc_url(wp_get_attachment_image_url($pic_id, $size)); ?>)"></div>
1169 + <?php } ?>
1170 + </a>
1171 + <?php
1172 +
932 1173 }
933 - function get_post_title()
1174 + function get_post_title(string $tag)
934 1175 {
935 - if ($this->get_settings_for_display('title') === 'yes')
936 - ?>
937 - <a href="<?php echo esc_url( get_permalink() );?>" title="<?php echo esc_attr__('View Post:','uicore-elements') . esc_html(the_title_attribute(['echo'=>false])); ?>">
938 - <h4 class="ui-e-post-title"><span><?php echo esc_html(get_the_title()); ?></span></h4>
1176 + if ($this->is_option('title', 'yes', '!==')) {
1177 + return;
1178 + }
1179 + ?>
1180 + <a href="<?php echo esc_url(get_permalink()); ?>" title="<?php echo esc_attr__('View Post:', 'uicore-elements') . esc_html(the_title_attribute(['echo' => false])); ?>">
1181 + <<?php echo Helper::esc_tag($tag); ?> class="ui-e-post-title">
1182 + <span> <?php echo esc_html(get_the_title()); ?> </span>
1183 + </<?php echo Helper::esc_tag($tag); ?>>
939 1184 </a>
940 - <?php
1185 + <?php
941 1186 }
942 - function get_post_meta($position)
1187 + function get_post_meta($position, $product_id = null)
943 1188 {
944 1189 $meta_list = $this->get_settings_for_display($position . '_meta');
945 1190 if (!isset($meta_list[0]) || $meta_list[0]['type'] == '') {
946 1191 return;
@@ -946,161 +1191,192 @@
946 1191 return;
947 1192 }
948 1193 echo ($position == 'top') ? '<div class="ui-e-post-top-meta">' : '';
949 1194 echo ($position == 'after_title') ? '<div class="ui-e-meta-wrapp">' : '';
950 - echo '<div class="ui-e-post-meta ui-e-'.esc_attr($position).'">';
951 - foreach ($meta_list as $meta) {
952 - if($meta['type'] != 'none'){
953 - echo '<div class="ui-e-meta-item">';
954 - $this->display_meta($meta);
955 - echo '</div>';
1195 + echo '<div class="ui-e-post-meta ui-e-' . esc_attr($position) . '">';
1196 + foreach ($meta_list as $meta) {
1197 + if ($meta['type'] != 'none') {
1198 + $this->display_meta($meta, $product_id);
956 1199
957 - if( next( $meta_list ) && $this->get_settings_for_display( $position.'_meta_separator' ) ) {
958 - echo '<span class="ui-e-separator">'.esc_html($this->get_settings_for_display( $position.'_meta_separator' )).'</span>';
959 - }
1200 + if (next($meta_list) && $this->get_settings_for_display($position . '_meta_separator')) {
1201 + echo '<span class="ui-e-separator">' . esc_html($this->get_settings_for_display($position . '_meta_separator')) . '</span>';
960 1202 }
961 1203 }
1204 + }
962 1205 echo '</div>';
963 1206 echo ($position == 'top' || $position == 'after_title') ? '</div>' : '';
964 1207 }
965 - function get_button()
1208 + /**
1209 + * Render the post read more button.
1210 + *
1211 + * @param int $index The loop index.
1212 + *
1213 + * @return void
1214 + */
1215 + function TRAIT_get_button($index)
966 1216 {
967 1217 $settings = $this->get_settings_for_display();
968 1218
969 - $this->add_render_attribute('button', 'class', ['elementor-button-link', 'elementor-button', 'ui-e-readmore']);
970 - $this->add_render_attribute('button', 'role', 'button');
971 - $this->add_render_attribute('content-wrapper', 'class', 'elementor-button-content-wrapper');
1219 + // Render att slugs
1220 + $button_slug = 'button_' . $index;
1221 + $content_slug = 'content-wrapper_' . $index;
1222 + $icon_slug = 'icon-align_' . $index;
1223 + $text_slug = 'text_' . $index;
972 1224
1225 + $this->add_render_attribute($button_slug, [
1226 + 'class' => ['elementor-button-link', 'elementor-button', 'ui-e-readmore'],
1227 + 'role' => 'button',
1228 + ]);
1229 +
1230 + $this->add_render_attribute($content_slug, 'class', 'elementor-button-content-wrapper');
1231 +
973 1232 if (!empty($settings['button_css_id'])) {
974 - $this->add_render_attribute('button', 'id', $settings['button_css_id']);
1233 + $this->add_render_attribute($button_slug, 'id', $settings['button_css_id']);
975 1234 }
976 1235
977 1236 if (!empty($settings['size'])) {
978 - $this->add_render_attribute('button', 'class', 'elementor-size-' . $settings['size']);
1237 + $this->add_render_attribute($button_slug, 'class', 'elementor-size-' . $settings['size']);
979 1238 }
980 1239
981 1240 if (!empty($settings['hover_animation'])) {
982 - $this->add_render_attribute('button', 'class', 'elementor-animation-' . $settings['hover_animation']);
1241 + $this->add_render_attribute($button_slug, 'class', 'elementor-animation-' . $settings['hover_animation']);
983 1242 }
1243 +
1244 + $btn_classes = isset($settings['icon_align'])
1245 + ? ['elementor-button-icon', 'elementor-align-icon-' . $settings['icon_align']]
1246 + : 'elementor-button-icon';
1247 +
984 1248 $this->add_render_attribute([
985 - 'icon-align' => [
986 - 'class' => [
987 - 'elementor-button-icon',
988 - 'elementor-align-icon-' . $settings['icon_align'],
989 - ],
1249 + $icon_slug => [
1250 + 'class' => $btn_classes
990 1251 ],
991 - 'text' => [
1252 + $text_slug => [
992 1253 'class' => 'elementor-button-text',
993 1254 ],
994 1255 ]);
995 1256
996 - $tbn_content = '<span ' . $this->get_render_attribute_string('content-wrapper') . '>';
1257 + if (isset($settings['icon_align'])) {
1258 + $this->add_render_attribute($content_slug, 'class', 'elementor-button-content');
1259 + }
997 1260
1261 + $tbn_content = '<span ' . $this->get_render_attribute_string($content_slug) . '>';
1262 +
998 1263 if (!empty($settings['icon']) || !empty($settings['selected_icon']['value'])) {
999 - $tbn_content .= '<span ' . $this->get_render_attribute_string('icon-align') . '>';
1264 + $tbn_content .= '<span ' . $this->get_render_attribute_string($icon_slug) . '>';
1000 1265 \ob_start();
1001 - \Elementor\Icons_Manager::render_icon($settings['selected_icon'], ['aria-hidden' => 'true']);
1266 + Icons_Manager::render_icon($settings['selected_icon'], ['aria-hidden' => 'true']);
1002 1267 $tbn_content .= \ob_get_clean();
1003 1268 $tbn_content .= '</span>';
1004 1269 }
1005 1270
1006 - $tbn_content .= '<span ' . $this->get_render_attribute_string('text') . '>' . $this->get_settings_for_display('text') . '</span>';
1007 - $tbn_content .= '</span>';
1271 + $tbn_content .= '<span ' . $this->get_render_attribute_string($text_slug) . '>';
1272 + $tbn_content .= $settings['text'];
1273 + $tbn_content .= '</span> </span>';
1008 1274
1009 - if ('product' === get_post_type()) {
1010 - // WooCommerce product
1011 - global $product;
1012 -
1013 - if ($product) {
1014 - // Display WooCommerce add to cart button
1015 - echo wp_kses_post(apply_filters(
1016 - 'woocommerce_loop_add_to_cart_link', // WPCS: XSS ok.
1017 - sprintf(
1018 - '<a href="%s" data-quantity="%s" %s>%s</a>',
1019 - esc_url($product->add_to_cart_url()),
1020 - esc_attr(1),
1021 - $this->get_render_attribute_string('button'),
1022 - $tbn_content
1023 - ),
1024 - $product
1025 - ));
1026 - }
1027 - } else {
1028 -
1029 - // Default button
1030 - ?>
1031 - <a href="<?php echo esc_url(get_permalink()); ?>" <?php $this->print_render_attribute_string('button'); ?>>
1032 - <?php echo wp_kses_post($tbn_content); ?>
1033 - </a>
1275 + ?>
1276 + <a href="<?php echo esc_url(get_permalink()); ?>" <?php $this->print_render_attribute_string($button_slug); ?>>
1277 + <?php
1278 + //phpcs:ignore WordPress.Security.EscapeOutput.OutputNotEscaped
1279 + echo Helper::esc_svg($tbn_content);
1280 + ?>
1281 + </a>
1034 1282 <?php
1035 - }
1036 1283 }
1037 - function TRAIT_render_item($carousel = false, $legacy = false)
1284 +
1285 + /**
1286 + * Renders a post item with various settings and options.
1287 + * Important: any changes here should also be considered to `TRAIT_render_product()` from Product Component.
1288 + *
1289 + * @param int $index The loop index.
1290 + * @param bool $carousel Indicates if the item needs carousel classnames.
1291 + * @param bool $legacy Indicates if the item is using legacy classnames.
1292 + *
1293 + * @return void
1294 + */
1295 + function TRAIT_render_item($index, $carousel = false, $legacy = false)
1038 1296 {
1039 1297 $settings = $this->get_settings_for_display();
1040 1298 $excerpt_length = $settings['excerpt_trim'];
1041 1299
1042 1300 // Classnames but checking if we the widget is APG (legacy version)
1043 - $item_classes = $legacy ? ['ui-e-post-item', 'ui-e-item'] : ['ui-e-item'] ; // Single item lower wrap class receptor
1301 + $item_classes = $legacy ? ['ui-e-post-item', 'ui-e-item'] : ['ui-e-item']; // Single item lower wrap class receptor
1044 1302 $hover_item_class = $legacy ? 'anim_item' : 'item_hover_animation'; // item hover animation class
1045 1303
1046 1304 // If widget is not carousel type, we set animations classes directly on item selector
1047 - if(!$carousel) {
1305 + if (!$carousel) {
1048 1306 $item_classes[] = 'ui-e-animations-wrp';
1049 1307 $item_classes[] = $settings['animate_items'] === 'ui-e-grid-animate' ? 'elementor-invisible' : '';
1050 1308 $item_classes[] = $settings[$hover_item_class] !== '' ? $settings[$hover_item_class] : '';
1051 -
1052 1309 } else {
1053 - // Check for Animations
1054 - $entrance = (isset($settings['animate_items']) && $settings['animate_items'] == 'ui-e-grid-animate') ? 'elementor-invisible' : '';
1055 - $hover = isset($settings[$hover_item_class]) ? $settings[$hover_item_class] : ''; //$settings[$hover_item_class] : null;
1310 + // Get entrance and item hover animation classes
1311 + $entrance = $this->is_option('animate_items', 'ui-e-grid-animate') ? 'elementor-invisible' : '';
1312 + $hover = isset($settings[$hover_item_class]) ? $settings[$hover_item_class] : '';
1056 1313 $animations = sprintf('%s %s', $entrance, $hover);
1057 1314
1315 + // Check if entrance or hover animation are set
1316 + $has_animation = !empty($entrance) || !empty($hover)
1317 +
1058 1318 // Prints extra wrappers required by the carousel script
1059 - ?>
1319 + ?>
1060 1320 <div class="ui-e-wrp swiper-slide">
1061 - <div class="ui-e-animations-wrp <?php echo esc_attr($animations);?>">
1062 - <div class="ui-e-item-wrp">
1063 - <?php } ?>
1321 + <?php if ($has_animation) : ?>
1322 + <div class="ui-e-animations-wrp <?php echo esc_attr($animations); ?>">
1323 + <?php endif; ?>
1064 1324
1065 - <div class="<?php echo esc_attr( implode(' ', $item_classes));?>">
1066 - <article <?php post_class(); ?>>
1067 - <div class="ui-e-post-top">
1068 - <?php $this->get_post_image(); ?>
1069 - <?php $this->get_post_meta('top'); ?>
1070 - </div>
1071 - <div class="ui-e-post-content">
1072 - <?php $this->get_post_meta('before_title'); ?>
1073 - <?php
1074 - if ($this->get_settings_for_display('title') === 'yes')
1075 - $this->get_post_title();
1076 - ?>
1077 - <?php $this->get_post_meta('after_title'); ?>
1078 - <?php
1079 - if ($this->get_settings_for_display('excerpt'))
1080 - echo wp_kses_post('<div class="ui-e-post-text">' . wp_trim_words(get_the_excerpt(), $excerpt_length) . '</div>');
1081 - ?>
1082 - <?php $this->get_post_meta('bottom'); // button
1083 - ?>
1084 - <?php
1085 - if ($this->get_settings_for_display('show_button') === 'yes') {
1086 - // Add match height spacing element if carousel. May look intrusive, but is the simplest method compared
1087 - // to absolute positioning or catching last content element to apply margin.
1088 - if($carousel && $settings['match_height'] === 'yes'){
1089 - ?>
1325 + <?php } ?>
1326 +
1327 + <div class="<?php echo esc_attr(implode(' ', $item_classes)); ?>">
1328 + <article <?php post_class(); ?>>
1329 + <div class="ui-e-post-top">
1330 + <?php $this->get_post_image(); ?>
1331 + <?php $this->get_post_meta('top'); ?>
1332 + </div>
1333 +
1334 + <?php if ($this->is_option('global_link', 'yes')) : ?>
1335 + <a href="<?php echo esc_url(get_permalink()); ?>"
1336 + class="ui-e-global-link"
1337 + aria-label="<?php echo esc_attr__('View Post:', 'uicore-elements') . esc_html(the_title_attribute(['echo' => false])); ?>"
1338 + title="<?php echo esc_attr__('View Post:', 'uicore-elements') . esc_html(the_title_attribute(['echo' => false])); ?>"> </a>
1339 + <?php endif; ?>
1340 +
1341 + <div class="ui-e-post-content">
1342 +
1343 + <?php $this->get_post_meta('before_title'); ?>
1344 + <?php
1345 + if ($this->is_option('title', 'yes'))
1346 + $this->get_post_title($settings['title_tag']);
1347 + ?>
1348 + <?php $this->get_post_meta('after_title'); ?>
1349 + <?php
1350 + if ($this->get_settings_for_display('excerpt'))
1351 + echo wp_kses_post('<div class="ui-e-post-text">' . wp_trim_words(get_the_excerpt(), $excerpt_length) . '</div>');
1352 + ?>
1353 + <?php $this->get_post_meta('bottom'); // button
1354 + ?>
1355 + <?php
1356 + if ($this->is_option('show_button', 'yes')) {
1357 + // Add match height spacing element if carousel. May look intrusive, but is the simplest method compared
1358 + // to absolute positioning or catching last content element to apply margin.
1359 + if ($carousel && $this->is_option('match_height', 'yes')) {
1360 + ?>
1090 1361 <span class="ui-e-match-height"></span>
1091 - <?php
1362 + <?php
1363 + }
1364 +
1365 + if (!isset($settings['button_position']) || empty($settings['button_position'])) {
1366 + $this->TRAIT_get_button($index);
1367 + }
1092 1368 }
1093 - $this->get_button();
1094 - }
1095 - ?>
1369 + ?>
1370 + </div>
1371 + </article>
1372 + </div>
1373 +
1374 + <?php if ($carousel) { ?>
1096 1375 </div>
1097 - </article>
1376 + <?php if ($has_animation) : ?>
1098 1377 </div>
1378 + <?php endif; ?>
1099 1379
1100 - <?php if($carousel) { ?>
1101 - </div>
1102 - </div>
1103 - </div>
1104 - <?php }
1105 - }
1106 -}
1380 +<?php }
1381 + }
1382 + }