id = $model['id'];
//gets the actual page id if we are displaying the posts page
$this -> queried_id = $queried_id = $this -> czr_fn_get_real_id();
$this -> allow_resp_images = 1 == esc_attr( czr_fn_opt('tc_resp_thumbs_img') );
$slider_name_id = czr_fn_get_current_slider( $queried_id );
$layout = $this -> czr_fn_get__slider_layout( $queried_id, $slider_name_id );
$img_size = apply_filters( 'czr_slider_img_size' , ( 'boxed' == $layout ) ? 'slider' : 'slider-full');
$slides = $this -> czr_fn_get_slides( $slider_name_id, $img_size );
//We need a way to silently fail when the model "decides" it doesn't have to be instantiated
if ( empty( $slides ) ){
$model['id'] = FALSE;
return $model;
}
$element_class = $this -> czr_fn_get_slider_element_class( $queried_id, $slider_name_id, $layout );
$inner_class = $this -> czr_fn_get_slider_inner_class( $queried_id );
//set-up inner attrs
$inner_attrs = $this -> czr_fn_get_slider_inner_attrs();
//set-up controls
if ( apply_filters( 'czr_show_slider_controls' , count( $slides ) > 1 ) ) {
$left_control_class = ! is_rtl() ? 'control-left' : 'control-right';
$right_control_class = ! is_rtl() ? 'control-right' : 'control-left';
$has_controls = true;
} else {
$left_control_class = '';
$right_control_class = '';
$has_controls = false;
}
//set-up loader
if ( $this -> czr_fn_is_slider_loader_active( $slider_name_id ) ) {
$has_loader = true;
if ( ! apply_filters( 'czr_slider_loader_gif_only', false ) )
$pure_css_loader = sprintf( '
%2$s
',
implode( ' ', apply_filters( 'czr_pure_css_loader_add_classes', array( 'czr-mr-loader') ) ),
apply_filters( 'czr_pure_css_loader_inner', '')
);
} else {
$has_loader = false;
$pure_css_loader = false;
}
//slider edit link and text
return array_merge( $model, compact(
'slider_name_id',
'element_class',
'slides',
'inner_class',
'inner_attrs',
//'img_size',
'has_controls',
'layout',
'left_control_class',
'right_control_class',
'pure_css_loader',
'has_loader'
) );
}
protected function czr_fn_get_slides( $slider_name_id, $img_size ) {
//returns the default slider if requested
if ( 'demo' == $slider_name_id )
return apply_filters( 'tc_default_slides', $this -> czr_fn_get_default_slides() );
else {
//If we allow responsive images make sure the slider resp image is added to the srcset
//this is especially needed for the full width slider layout as the generated small thumb
//basically will never have the same aspect ratio of the slider-full img size
if ( $this -> allow_resp_images )
add_filter( 'wp_calculate_image_srcset', array( $this, 'czr_maybe_add_resp_slide_img_size_to_the_srcset' ), 10, 5 );
$the_slides = $this -> czr_fn_get_the_slides( $slider_name_id, $img_size );
//remove the filter
if ( $this -> allow_resp_images )
remove_filter( 'wp_calculate_image_srcset', array( $this, 'czr_maybe_add_resp_slide_img_size_to_the_srcset' ), 10 );
return $the_slides;
}
}
/**
* Helper
* Return an array of the slide models from option or default
* Returns and array of slides with data
*
* @package Customizr
* @since Customizr 3.0.15
*
*/
protected function czr_fn_get_the_slides( $slider_name_id, $img_size ) {
//if not demo or tc_posts_slider, we get slides from options
$all_sliders = czr_fn_opt( 'tc_sliders');
$saved_slides = ( isset($all_sliders[$slider_name_id]) ) ? $all_sliders[$slider_name_id] : false;
//if the slider not longer exists or exists but is empty, return false
if ( ! $this -> czr_fn_slider_exists( $saved_slides) )
return;
//inititalize the slides array
$slides = array();
//init slide active state index
$_loop_index = 0;
//GENERATE SLIDES ARRAY
foreach ( $saved_slides as $s ) {
$slide_object = get_post($s);
//next loop if attachment does not exist anymore (has been deleted for example)
if ( ! isset( $slide_object) )
continue;
$id = $slide_object -> ID;
$slide_model = $this -> czr_fn_get_single_slide_model( $slider_name_id, $_loop_index, $id, $img_size );
if ( ! $slide_model )
continue;
$slides[$id] = $slide_model;
$_loop_index++;
}//end of slides loop
//returns the slides or false if nothing
return apply_filters('czr_the_slides', ! empty($slides) ? $slides : false );
}
/**
* Return a single slide model
* Returns and array of slides with data
*
* @package Customizr
* @since Customizr 3.0.15
*
*/
protected function czr_fn_get_single_slide_model( $slider_name_id, $_loop_index , $id , $img_size = 'slider-full' ) {
//check if slider enabled for this attachment and go to next slide if not
$slider_checked = esc_attr(get_post_meta( $id, $key = 'slider_check_key' , $single = true ));
if ( ! isset( $slider_checked) || $slider_checked != 1 )
return;
//title
$title = esc_attr(get_post_meta( $id, $key = 'slide_title_key' , $single = true ));
$default_title_length = apply_filters( 'czr_slide_title_length', 80 );
$title = czr_fn_text_truncate( $title, $default_title_length, '...' );
//lead text
$text = get_post_meta( $id, $key = 'slide_text_key' , $single = true );
$default_text_length = apply_filters( 'czr_slide_text_length', 250 );
$text = czr_fn_text_truncate( $text, $default_text_length, '...' );
//button text
$button_text = esc_attr(get_post_meta( $id, $key = 'slide_button_key' , $single = true ));
$default_button_length = apply_filters( 'czr_slide_button_length', 80 );
$button_text = czr_fn_text_truncate( $button_text, $default_button_length, '...' );
//link post id
$link_id = apply_filters( 'czr_slide_link_id', esc_attr(get_post_meta( $id, $key = 'slide_link_key' , $single = true )), $id, $slider_name_id );
//link
$link_url = esc_url( get_post_meta( $id, $key = 'slide_custom_link_key', $single = true ) );
if ( ! $link_url )
$link_url = $link_id ? get_permalink( $link_id ) : $link_url;
$link_url = apply_filters( 'czr_slide_link_url', $link_url, $id, $slider_name_id );
//link target
$link_target_bool = esc_attr(get_post_meta( $id, $key= 'slide_link_target_key', $single = true ));
$link_target = apply_filters( 'czr_slide_link_target', $link_target_bool ? '_blank' : '_self', $id, $slider_name_id );
//link the whole slide?
$link_whole_slide = apply_filters( 'czr_slide_link_whole_slide', esc_attr(get_post_meta( $id, $key= 'slide_link_whole_slide_key', $single = true )), $id, $slider_name_id );
//checks if $text_color is set and create an html style attribute
$text_color = esc_attr(get_post_meta( $id, $key = 'slide_color_key' , $single = true ));
$color_style = ( $text_color != null) ? 'style="color:'.$text_color.'"' : '';
//attachment image
$alt = apply_filters( 'czr_slide_background_alt' , trim(strip_tags(get_post_meta( $id, '_wp_attachment_image_alt' , true))) );
$slide_background_attr = array_filter( array_merge( array( 'class' => 'slide' , 'alt' => $alt ), $this -> czr_fn_set_wp_responsive_slide_img_attr() ) );
$slide_background = wp_get_attachment_image( $id, $img_size, false, $slide_background_attr );
//Parse img for smartload
//Should normally be done with apply_filters( 'czr_thumb_html', $html ), but this filter is added later ( on 'wp_head' ) for plugin compatibility.
//=> that's why we invoke czr_fn_parse_imgs() directly here
//@see czr_fn_wp_filters
if ( czr_fn_is_checked( 'tc_slider_img_smart_load' ) ) {
$slide_background = czr_fn_parse_imgs( $slide_background ); //<- to prepare the img smartload
}
//adds all values to the slide array only if the content exists (=> handle the case when an attachment has been deleted for example). Otherwise go to next slide.
if ( !isset($slide_background) || empty($slide_background) )
return;
$edit_suffix = "#slider_sectionid";
return array(
'title' => $title,
'text' => $text,
'button_text' => $button_text,
'link_id' => $link_id,
'link_url' => $link_url,
'link_target' => $link_target,
'link_whole_slide' => $link_whole_slide,
'color_style' => $color_style,
'slide_background' => $slide_background,
'edit_suffix' => $edit_suffix
);
}
/*
* By default we don't want the slider images to be responsive as wp intends as our slider isnot completely responsive (has fixed heights for different viewports)
*
* return array()
*/
protected function czr_fn_set_wp_responsive_slide_img_attr() {
//allow responsive images?
if ( version_compare( $GLOBALS['wp_version'], '4.4', '>=' ) )
if ( !$this->allow_resp_images ) {
//trick, => will produce an empty attr srcset as in wp-includes/media.php the srcset is calculated and added
//only when the passed srcset attr is not empty. This will avoid us to:
//a) add a filter to get rid of already computed srcset
// or
//b) use preg_replace to get rid of srcset and sizes attributes from the generated html
//Side effect:
//we'll see an empty ( or " " depending on the browser ) srcset attribute in the html
//to avoid this we filter the attributes getting rid of the srcset if any.
//Basically this trick, even if ugly, will avoid the srcset attr computation
add_filter( 'wp_get_attachment_image_attributes', 'czr_fn_remove_srcset_attr' );
return array( 'srcset' => ' ');
}
return array();
}
//@hook: 'wp_calculate_image_srcset'
//this hook is defined in wp-includes/media.php::wp_calculate_image_srcset()
function czr_maybe_add_resp_slide_img_size_to_the_srcset( $sources, $size_array, $image_src, $image_meta, $attachment_id ) {
if ( is_array( $sources ) && count( $sources ) ) {
/**
* if the first image in $sources is not our $image_src, do nothing, as this means that wp_calculate_image_srcset()
* has found no matches, hence it will return no srcset whatever image sizes we add to the $sources
* as matter of fact, just after the wp_calculate_image_srcset filter hook it makes this check:
* // Only return a 'srcset' value if there is more than one source.
* if ( ! $src_matched || count( $sources ) < 2 ) {
* return false;
* }
*/
$first_image_size_src = reset( $sources );
if ( ! is_array( $first_image_size_src ) || ! array_key_exists( 'url', $first_image_size_src ) || $image_src !== $first_image_size_src[ 'url' ] ) {
return $sources;
}
if ( is_array( $size_array) && ! empty( $image_meta['sizes'] ) ){
// Retrieve the uploads sub-directory from the full size image.
$dirname = _wp_get_attachment_relative_path( $image_meta['file'] );
if ( $dirname ) {
$dirname = trailingslashit( $dirname );
}
$upload_dir = wp_get_upload_dir();
$image_baseurl = trailingslashit( $upload_dir['baseurl'] ) . $dirname;
if ( is_ssl() && 'https' !== substr( $image_baseurl, 0, 5 ) && parse_url( $image_baseurl, PHP_URL_HOST ) === $_SERVER['HTTP_HOST'] ) {
$image_baseurl = set_url_scheme( $image_baseurl, 'https' );
}
/*
* Images that have been edited in WordPress after being uploaded will
* contain a unique hash. Look for that hash and use it later to filter
* out images that are leftovers from previous versions.
*/
$image_edited = preg_match( '/-e[0-9]{13}/', wp_basename( $image_src ), $image_edit_hash );
//always use the tc-slider-small if available and not corrupted
//and that is not from previous edits
$small_slider_thumb = ! empty( $image_meta['sizes']['tc-slider-small'] ) ? $image_meta['sizes']['tc-slider-small'] : null;
if ( $small_slider_thumb && ! ( $image_edited && ! strpos( $small_slider_thumb['file'], $image_edit_hash[0] ) ) ) {
//if available use the slider small size
$sources[ $small_slider_thumb['width'] ] = array(
'url' => $image_baseurl . $small_slider_thumb['file'],
'descriptor' => 'w',
'value' => $small_slider_thumb['width'],
);
}
else {
//flag to avoid several checks on whether the image sizes we're about to add to the sources
//is not the original src already added by wp-includes/media.php::wp_calculate_image_srcset()
$original_src_matched = false;
//Grab all the available scaled images
//The cons of this method is that you can have images that are really far by the "desired" aspect ratio
foreach ( $image_meta[ 'sizes' ] as $img_size => $image ) {
// If the file name is part of the `src`, we're parsing the src itself
// this has already been added by wp-includes/media.php::wp_calculate_image_srcset()
if ( ! $original_src_matched && false !== strpos( $image_src, $dirname . $image['file'] ) ) {
//src attr matched, set $original_src_matched flag so that we don't make the above check again
$original_src_matched = true;
continue;
}
// Filter out images that are from previous edits.
if ( $image_edited && ! strpos( $image['file'], $image_edit_hash[0] ) ) {
continue;
}
$source = array(
'url' => $image_baseurl . $image['file'],
'descriptor' => 'w',
'value' => $image['width'],
);
// If not already part of the $sources array, add this image size
if( ! isset( $sources[ $image['width'] ] ) ){
$sources[ $image['width'] ] = $source;
}
}
}//else
}
}
return $sources;
}
/*
* Fired just after the view is rendered
* @hook: post_rendering_view_{$this -> id}, 9999
*/
function czr_fn_reset_late_properties() {
reset( $this -> slides );
}
function czr_fn_get_the_slide( $autoadvance = true ) {
$slide = current( $this -> slides );
if ( empty( $slide ) )
return false;
$slide_id = key( $this -> slides );
if ( $autoadvance )
next( $this -> slides );
return compact('slide', 'slide_id');
}
/**
* @override
* parse this model properties for rendering
*/
function czr_fn_sanitize_model_properties( $model ) {
parent::czr_fn_sanitize_model_properties( $model );
$model -> inner_class = $this -> czr_fn_stringify_model_property( 'inner_class' );
}
/******************************
* HELPERS / SETTERS / CALLBACKS
*******************************/
/*
* Default slides: demo slider
* Not a class property as they're really used very rarely, no need to reserve space
* for them
*/
protected function czr_fn_get_default_slides() {
//Default slides content
$demo_slides = CZR___::$instance -> default_slides;
if ( current_user_can('edit_theme_options') ) {
$demo_slides[1] = array_merge( $demo_slides[1], array(
'title' => __( 'Discover how to replace or remove this demo slider.', 'customizr' ),
'link_url' => implode('/', array('http:/','docs.presscustomizr.com' , 'article', '102-customizr-theme-options-front-page/#front-page-slider' ) ), //do we need an anchor in the doc?
'button_text' => __( 'Check the front page slider doc »' , 'customizr')
)
);
$demo_slides[2] = array_merge( $demo_slides[2], array(
'title' => __( 'Easily create sliders and add them in any posts or pages.', 'customizr' ),
'link_url' => implode('/', array('http:/','docs.presscustomizr.com' , 'article', '3-creating-a-slider-with-customizr-wordpress-theme' ) ),
'button_text' => __( 'Check the slider doc now »' , 'customizr')
) );
}
return $demo_slides;///end of slides array
}
/**
* @return array of css classes
*
* @package Customizr
* @since Customizr 3.3+
*/
function czr_fn_get_slider_inner_class( $queried_id ) {
$class = array( 'carousel-inner' );
$class[] = (bool) esc_attr( czr_fn_opt( 'tc_center_slider_img') ) ? 'center-slides-enabled' : 'center-slides-disabled';
if ( (bool) esc_attr( czr_fn_opt( 'tc_slider_parallax') ) )
$class[] = 'czr-parallax-slider';
//Is the overlay checked for this slider ?
//gets slider options if any
$overlay_value = czr_fn_is_real_home() ? czr_fn_opt( 'tc_home_slider_overlay' ) : esc_attr( get_post_meta( $queried_id, $key = 'slider_overlay_key' , $single = true ) );
$overlay_value = apply_filters( 'czr_slider_overlay', $overlay_value, $queried_id );
//if the option is unchecked OR has never been set
if ( 'off' == $overlay_value ) {
$class[] = 'czr-has-no-dark-overlay';
}
return apply_filters( 'czr_carousel_inner_classes', $class );
}
/*
* getter
* Get current slider layout class
* @param $queried_id the current page/post id
* @param $slider_name_id the current slider name id
*
* @return array()
*/
protected function czr_fn_get_slider_element_class( $queried_id, $slider_name_id, $layout ) {
$class = array( 'czr-carousel', $slider_name_id );
switch ( $layout ) {
case 'boxed':
$layout_class = array( 'container', 'boxed'); break;
case 'full-width':
$layout_class = array( 'full-width' ); break;
default:
$layout_class = array( 'full-page' );
}
//layout
$layout_class = apply_filters( 'czr_slider_layout_class', $layout_class );
$class = array_merge( $class, $layout_class );
//custom height
if ( ! in_array( 'full-page', $class ) && 500 != esc_attr( czr_fn_opt( 'tc_slider_default_height') ) )
$class[] = 'custom-slider-height';
if ( (bool) esc_attr( czr_fn_opt( 'tc_slider_parallax') ) )
$class[] = 'parallax-wrapper';
//add fittext utility class
$class[] = 'fittext-p';
return array_filter( $class );
}
/*
* getter
* Get carousel inner attrs, eg. the parallax speed
*
* @return string
*/
protected function czr_fn_get_slider_inner_attrs() {
$atts = array();
if ( (bool) esc_attr( czr_fn_opt( 'tc_slider_parallax') ) ) {
$atts[] = sprintf( 'data-parallax-ratio="%s"',
apply_filters('tc_parallax_ratio', 0.55 )
);
}
$atts[] = sprintf( 'data-slider-delay="%s"',
czr_fn_is_real_home() ? czr_fn_opt( 'tc_slider_delay' ) : get_post_meta( czr_fn_get_id() , $key = 'slider_delay_key' , $single = true )
);
$has_dots = czr_fn_is_real_home() ? czr_fn_opt( 'tc_home_slider_dots' ) : get_post_meta( czr_fn_get_id() , $key = 'slider_dots_key' , $single = true );
//for users who set up a slider in singular before introducing this option the post meta has never been saved
$has_dots = 'off' != $has_dots;
$atts[] = sprintf( 'data-has-dots="%s"', $has_dots );
return czr_fn_stringify_array( $atts );
}
/*
* getter
* Get current slider layout
* @param $queried_id the current page/post id
* @param $slider_name_id the current slider name id
*
* @return bool
*/
protected function czr_fn_get__slider_layout( $queried_id, $slider_name_id ) {
//gets slider options if any
$layout_value = czr_fn_is_real_home() ? czr_fn_opt( 'tc_slider_width' ) : esc_attr( get_post_meta( $queried_id, $key = 'slider_layout_key' , $single = true ) );
$layout_value = apply_filters( 'czr_slider_layout', $layout_value, $queried_id );
/* For backward compatibility this can be:
* 0, boxed : boxed
* 1, fw : full width
* * : full page (default)
*/
switch ( (string) $layout_value ) {
case '0':
case '':
case 'boxed': $layout = 'boxed'; break;
case '1':
case 'fw': $layout = 'full-width'; break;
default: $layout = 'full-page';
}
return $layout;
}
/**
* helper
* returns whether or not display the edit slider link
* @return bool
*
*/
function czr_fn_get_has_slider_edit_link() {
if ( 'demo' == $this -> slider_name_id )
return false;
$show_slider_edit_link = false;
//We have to show the slider edit link to
//a) users who can edit theme options for the slider in home -> deep link in the customizer
//b) users who can edit the post/page where the slider is displayed for users who can edit the post/page -> deep link in the post/page slider section
if ( czr_fn_is_real_home() )
$show_slider_edit_link = current_user_can('edit_theme_options') ? true : false;
else if ( is_singular() ) // we have a snippet to display sliders in categories, we don't want the slider edit link displayed there
$show_slider_edit_link = ( current_user_can('edit_pages') || current_user_can( 'edit_posts' ) ) ? true : false;
return apply_filters( 'czr_show_slider_edit_link' , $show_slider_edit_link, $this -> slider_name_id );
}
/**
* helper
* returns the slider edit link
* @return string
*
*/
function czr_fn_get_slider_edit_link() {
if ( czr_fn_is_real_home() )
$slider_edit_link = czr_fn_get_customizer_url( array( 'control' => 'tc_front_slider', 'section' => 'frontpage_sec') );
elseif ( is_singular() ) {
global $post;
$slider_edit_link = get_edit_post_link( $post -> ID ) . '#slider_sectionid';
}
return $slider_edit_link;
}
/**
* helper
* returns the slider edit text
* @return string
*
*/
function czr_fn_get_slider_edit_link_text() {
return __( 'Customize or remove this slider', 'customizr' );
}
/**
* helper
* returns the actual page id if we are displaying the posts page
* @return number
*
*/
protected function czr_fn_get_real_id() {
return apply_filters( 'czr_slider_get_real_id', czr_fn_get_real_id(), $this );
}
/**
* helper
* @return boolean
*
* @package Customizr
* @since Customizr 3.4.9
*/
function czr_fn_slider_exists( $slider ){
//if the slider not longer exists or exists but is empty, return false
return ! ( !isset($slider) || !is_array($slider) || empty($slider) );
}
/**
* helper
* returns whether or not the slider loading icon must be displayed
* @return boolean
*
*/
private function czr_fn_is_slider_loader_active( $slider_name_id ) {
//The slider loader must be printed when
//a) we have to render the demo slider
//b) filter doesn't disable it
return ( 'demo' == $slider_name_id
|| apply_filters( 'czr_display_slider_loader', true , $slider_name_id, $this -> id )
);
}
/**
* hook : tc_slider_height, fired in czr_fn_user_options_style
* @return number height value
*
* @package Customizr
* @since Customizr 3.3+
*/
function czr_fn_set_demo_slider_height( $_h ) {
//this custom demo height is applied when :
//1) current slider is demo
if ( 'demo' != czr_fn_get_current_slider( $this -> czr_fn_get_real_id() ) )
return $_h;
//2) height option has not been changed by user yet
//the possible customization context must be taken into account here
if ( czr_fn_is_customizing() ) {
if ( 500 != esc_attr( czr_fn_opt( 'tc_slider_default_height') ) )
return $_h;
} else {
if ( false !== (bool) esc_attr( czr_fn_opt( 'tc_slider_default_height', CZR_THEME_OPTIONS, $use_default = false ) ) )
return $_h;
}
return apply_filters( 'czr_set_demo_slider_height' , 750 );
}
/**
* helper
* returns the slider icon/pure css loader css
* @return string
*
*/
function czr_fn_get_slider_loader_css( $slider_name_id ) {
$slider_name_id = $slider_name_id ? $slider_name_id : czr_fn_get_current_slider( $this -> czr_fn_get_real_id() );
$_css = '';
//custom css for the slider loader
if ( $this -> czr_fn_is_slider_loader_active( $slider_name_id ) ) {
$_slider_loader_src = apply_filters( 'czr_slider_loader_src' , sprintf( '%1$s%2$s' , CZR_FRONT_ASSETS_URL, 'img/slider-loader.gif') );
//we can load only the gif, or use it as fallback for old browsers (.no-csstransforms3d)
if ( ! apply_filters( 'czr_slider_loader_gif_only', false ) ) {
$_slider_loader_gif_class = '.no-csstransforms3d';
}else {
$_slider_loader_gif_class = '';
}
$_slider_loader_gif_css = $_slider_loader_src ? sprintf('
%1$s .czr-slider-loader-wrapper .czr-img-gif-loader {
background: url(\'%2$s\') no-repeat center center;
}',
$_slider_loader_gif_class,
$_slider_loader_src
) : '';
$_css = $_slider_loader_gif_css;
}//end custom css for the slider loader
return $_css;
}
/**
* helper
* returns the custom height slider css
* @return string
*
*/
function czr_fn_get_slider_custom_height_css( $slider_name_id ) {
//no custom height for full-page layouts
if ( 'full-page' == $this -> layout )
return '';
$slider_name_id = $slider_name_id ? $slider_name_id : czr_fn_get_current_slider( $this -> czr_fn_get_real_id() );
// 1) Do we have a custom height ?
// 2) check if the setting must be applied to all context
$_custom_height = esc_attr( czr_fn_opt( 'tc_slider_default_height') );
$_custom_height = ( !czr_fn_is_real_home() && 0 == esc_attr( czr_fn_opt( 'tc_slider_default_height_apply_all') ) ) ? 500 : $_custom_height;
$_custom_height = apply_filters( 'czr_slider_height' , 'demo' != $slider_name_id ? $_custom_height : $this -> czr_fn_set_demo_slider_height( $_custom_height ) );
$_slider_inline_css = "";
$_resp_shrink_ratios = CZR()->slider_resp_shrink_ratio;
//this slider element id;
$slider_html_element_id = "#customizr-slider-{$this->id}";
$_slider_inline_css = "
$slider_html_element_id.czr-carousel {
height:{$_custom_height}px;
}
$slider_html_element_id .czr-slider-loader-wrapper {
line-height: {$_custom_height}px;
height:{$_custom_height}px;
}";
foreach ( $_resp_shrink_ratios as $_w => $_ratio) {
if ( ! is_numeric($_ratio) )
continue;
$_dyn_height = $_custom_height * $_ratio;
$_slider_inline_css .= "
@media (max-width: {$_w}px) {
$slider_html_element_id.czr-carousel {
height:{$_dyn_height}px;
}
$slider_html_element_id .czr-slider-loader-wrapper {
line-height: {$_dyn_height}px;
height:{$_dyn_height}px;
}
}";
}//end foreach
return $_slider_inline_css;
}
/*
* Custom CSS
* @return css string
*
* @package Customizr
* @since Customizr 3.2.6
*/
function czr_fn_user_options_style_cb( $_css ) {
$slider_name_id = czr_fn_get_current_slider( $this -> czr_fn_get_real_id() ) ;
return sprintf("%s\n%s\n%s",
$_css,
$this -> czr_fn_get_slider_loader_css( $slider_name_id ),
$this -> czr_fn_get_slider_custom_height_css( $slider_name_id )
);
}
}//end class