Components -> Background * */ if ( ! defined( 'ABSPATH' ) ) exit; function tbkkt_background_resolve_image_url( array $attrs ): string { $id = isset( $attrs['backgroundImageId'] ) ? (int) $attrs['backgroundImageId'] : 0; if ( $id > 0 ) : $url = wp_get_attachment_image_url( $id, 'full' ); return is_string( $url ) ? $url : ''; endif; $url = isset( $attrs['backgroundImageUrl'] ) ? trim( (string) $attrs['backgroundImageUrl'] ) : ''; return $url !== '' ? esc_url_raw( $url ) : ''; } function tbkkt_background_resolve_video_url( array $attrs ): string { $id = isset( $attrs['backgroundVideoId'] ) ? (int) $attrs['backgroundVideoId'] : 0; if ( $id > 0 ) : $url = wp_get_attachment_url( $id ); if ( ! is_string( $url ) || $url === '' ) return ''; $mime = get_post_mime_type( $id ); if ( ! is_string( $mime ) || ! str_starts_with( strtolower( $mime ), 'video/' ) ) : return ''; endif; return $url; endif; $url = isset( $attrs['backgroundVideoUrl'] ) ? trim( (string) $attrs['backgroundVideoUrl'] ) : ''; return $url !== '' ? esc_url_raw( $url ) : ''; } function tbkkt_background_resolve_video_poster_url( array $attrs ): string { $id = isset( $attrs['backgroundVideoPosterId'] ) ? (int) $attrs['backgroundVideoPosterId'] : 0; if ( $id > 0 ) : $url = wp_get_attachment_image_url( $id, 'full' ); return is_string( $url ) ? $url : ''; endif; $url = isset( $attrs['backgroundVideoPosterUrl'] ) ? trim( (string) $attrs['backgroundVideoPosterUrl'] ) : ''; return $url !== '' ? esc_url_raw( $url ) : ''; } function tbkkt_background_build_overlay_opacity_class( $opacity_value ): string { if ( ! is_numeric( $opacity_value ) ) return ''; $opacity = (float) $opacity_value; if ( $opacity < 0 ) $opacity = 0; if ( $opacity > 1 ) $opacity = 1; $percent = (int) round( ( $opacity * 100 ) / 5 ) * 5; if ( $percent <= 0 ) return ''; if ( $percent > 100 ) $percent = 100; $suffix = $percent < 10 ? '0' . $percent : (string) $percent; return 'tbkkt-opacity-' . $suffix; } function tbkkt_background_build_object_fit_class( string $value ): string { $allowed = array( 'cover', 'contain', 'fill', 'none', 'scale-down' ); $sanitized = tbkkt_block_markup_sanitize_class_slug( $value ); return in_array( $sanitized, $allowed, true ) ? 'object-fit-' . $sanitized : ''; } function tbkkt_background_build_object_position_class( string $value ): string { $allowed = array( 'top', 'bottom', 'left', 'right', 'center', 'top-left', 'top-right', 'bottom-left', 'bottom-right' ); $sanitized = tbkkt_block_markup_sanitize_class_slug( $value ); return in_array( $sanitized, $allowed, true ) ? 'object-position-' . $sanitized : ''; } function tbkkt_background_build_background_repeat_class( string $value ): string { $allowed = array( 'no-repeat', 'repeat', 'repeat-x', 'repeat-y', 'space', 'round' ); $sanitized = tbkkt_block_markup_sanitize_class_slug( $value ); return in_array( $sanitized, $allowed, true ) ? 'background-repeat-' . $sanitized : ''; } function tbkkt_background_build_background_position_class( string $value ): string { $allowed = array( 'top', 'bottom', 'left', 'right', 'center', 'top-left', 'top-right', 'bottom-left', 'bottom-right' ); $sanitized = tbkkt_block_markup_sanitize_class_slug( $value ); return in_array( $sanitized, $allowed, true ) ? 'background-position-' . $sanitized : ''; } function tbkkt_background_build_background_size_class( string $value ): string { $allowed = array( 'auto', 'cover', 'contain' ); $sanitized = tbkkt_block_markup_sanitize_class_slug( $value ); return in_array( $sanitized, $allowed, true ) ? 'background-size-' . $sanitized : ''; } function tbkkt_background_render_markup( array $args ): string { $type = isset( $args['type'] ) ? tbkkt_block_markup_sanitize_class_slug( (string) $args['type'] ) : 'none'; $image_url = isset( $args['image_url'] ) ? trim( (string) $args['image_url'] ) : ''; $video_url = isset( $args['video_url'] ) ? trim( (string) $args['video_url'] ) : ''; $video_poster_url = isset( $args['video_poster_url'] ) ? trim( (string) $args['video_poster_url'] ) : ''; $overlay_opacity = isset( $args['overlay_opacity'] ) && is_numeric( $args['overlay_opacity'] ) ? (float) $args['overlay_opacity'] : 0.0; $wrapper_class = isset( $args['wrapper_class'] ) ? trim( (string) $args['wrapper_class'] ) : 'tbkkt-background'; $background_wrapper_class_name = isset( $args['background_wrapper_class_name'] ) ? trim( (string) $args['background_wrapper_class_name'] ) : ''; if ( $background_wrapper_class_name !== '' ) : $wrapper_class = trim( $wrapper_class . ' ' . $background_wrapper_class_name ); endif; $image_class_base = isset( $args['image_class'] ) ? trim( (string) $args['image_class'] ) : 'tbkkt-background-image'; $image_object_fit_class = isset( $args['image_object_fit_class'] ) ? trim( (string) $args['image_object_fit_class'] ) : ''; $image_object_position_class = isset( $args['image_object_position_class'] ) ? trim( (string) $args['image_object_position_class'] ) : ''; $image_class = trim( $image_class_base . ( $image_object_fit_class !== '' ? ' ' . $image_object_fit_class : '' ) . ( $image_object_position_class !== '' ? ' ' . $image_object_position_class : '' ) ); $video_class = isset( $args['video_class'] ) ? trim( (string) $args['video_class'] ) : 'tbkkt-background-video'; $overlay_class = isset( $args['overlay_class'] ) ? trim( (string) $args['overlay_class'] ) : 'tbkkt-background-overlay'; $overlay_opacity_class = isset( $args['overlay_opacity_class'] ) ? trim( (string) $args['overlay_opacity_class'] ) : ''; $overlay_color_class = isset( $args['overlay_color_class'] ) ? trim( (string) $args['overlay_color_class'] ) : ''; $use_layer = isset( $args['use_layer'] ) && $args['use_layer'] === true; $layer_class_base = isset( $args['layer_class'] ) ? trim( (string) $args['layer_class'] ) : 'tbkkt-background-layer'; $layer_repeat_class = isset( $args['layer_repeat_class'] ) ? trim( (string) $args['layer_repeat_class'] ) : ''; $layer_position_class = isset( $args['layer_position_class'] ) ? trim( (string) $args['layer_position_class'] ) : ''; $layer_size_class = isset( $args['layer_size_class'] ) ? trim( (string) $args['layer_size_class'] ) : ''; $layer_size_custom = isset( $args['layer_size_custom'] ) ? trim( (string) $args['layer_size_custom'] ) : ''; $layer_size_is_custom = isset( $args['layer_size_is_custom'] ) && $args['layer_size_is_custom'] === true; $layer_class = trim( $layer_class_base . ( $layer_repeat_class !== '' ? ' ' . $layer_repeat_class : '' ) . ( $layer_position_class !== '' ? ' ' . $layer_position_class : '' ) . ( $layer_size_class !== '' ? ' ' . $layer_size_class : '' ) . ( $layer_size_is_custom ? ' background-size-custom' : '' ) ); $background_always_render = isset( $args['background_always_render'] ) && $args['background_always_render'] === true; $media_markup = ''; if ( $type === 'image' && $image_url !== '' ) : if ( $use_layer ) : $layer_style_parts = array(); $layer_image_url_esc = esc_url( $image_url ); if ( $layer_image_url_esc !== '' ) : $layer_style_parts[] = '--tbkkt--background--image:url(' . $layer_image_url_esc . ')'; endif; if ( $layer_size_custom !== '' ) : $layer_style_parts[] = '--tbkkt--background--size-custom:' . sanitize_text_field( $layer_size_custom ); endif; $layer_style_attr = count( $layer_style_parts ) > 0 ? ' style="' . esc_attr( implode( ';', $layer_style_parts ) . ';' ) . '"' : ''; $media_markup .= '
'; else : $media_markup .= ''; endif; elseif ( $type === 'video' && $video_url !== '' ) : $media_markup .= ''; endif; $overlay_markup = ''; $should_render_overlay = ( $overlay_color_class !== '' || ( $overlay_opacity > 0 && $overlay_opacity_class !== '' ) ); if ( $should_render_overlay ) : $overlay_classes_parts = array( $overlay_class ); if ( $overlay_opacity_class !== '' ) : $overlay_classes_parts[] = $overlay_opacity_class; endif; if ( $overlay_color_class !== '' ) : $overlay_classes_parts[] = $overlay_color_class; $overlay_classes_parts[] = 'has-background'; endif; $overlay_classes = implode( ' ', $overlay_classes_parts ); $overlay_markup = ''; endif; if ( $media_markup === '' && $overlay_markup === '' && ! $background_always_render ) return ''; return ''; } function tbkkt_background_render_from_attrs( array $attrs, array $markup_args_extra = array() ): string { $bg_type = isset( $attrs['backgroundType'] ) ? tbkkt_block_markup_sanitize_class_slug( (string) $attrs['backgroundType'] ) : 'none'; $overlay_raw = $attrs['backgroundOverlayOpacity'] ?? null; $overlay_opacity = is_numeric( $overlay_raw ) ? tbkkt_block_markup_clamp_unit01( (float) $overlay_raw, 0.0 ) : 0.0; $overlay_opacity_class = is_numeric( $overlay_raw ) ? tbkkt_background_build_overlay_opacity_class( $overlay_opacity ) : ''; $overlay_color_class = tbkkt_block_markup_color_slug_class( $attrs['backgroundOverlayColorSlug'] ?? '', 'background-color' ); $image_object_fit_class = ''; $image_object_position_class = ''; $use_layer = false; $layer_repeat_class = ''; $layer_position_class = ''; $layer_size_class = ''; $layer_size_custom = ''; $layer_size_is_custom = false; if ( $bg_type === 'image' ) : $use_layer = isset( $attrs['backgroundImageLayer'] ) && $attrs['backgroundImageLayer'] === true; if ( $use_layer ) : $layer_repeat_class = tbkkt_background_build_background_repeat_class( $attrs['backgroundImageLayerRepeat'] ?? '' ); $layer_position_class = tbkkt_background_build_background_position_class( $attrs['backgroundImageLayerPosition'] ?? '' ); $layer_size_value = $attrs['backgroundImageLayerSize'] ?? ''; $layer_size_is_custom = ( $layer_size_value === 'custom' ); if ( $layer_size_is_custom ) : $layer_size_custom = isset( $attrs['backgroundImageLayerSizeCustom'] ) ? trim( (string) $attrs['backgroundImageLayerSizeCustom'] ) : ''; else : $layer_size_class = tbkkt_background_build_background_size_class( $layer_size_value ); endif; else : $image_object_fit_class = tbkkt_background_build_object_fit_class( $attrs['backgroundImageObjectFit'] ?? '' ); $image_object_position_class = tbkkt_background_build_object_position_class( $attrs['backgroundImageObjectPosition'] ?? '' ); endif; endif; $args = array_merge( array( 'type' => $bg_type, 'image_url' => tbkkt_background_resolve_image_url( $attrs ), 'video_url' => tbkkt_background_resolve_video_url( $attrs ), 'video_poster_url' => tbkkt_background_resolve_video_poster_url( $attrs ), 'overlay_opacity' => $overlay_opacity, 'overlay_opacity_class' => $overlay_opacity_class, 'overlay_color_class' => $overlay_color_class, 'wrapper_class' => 'tbkkt-background', 'image_class' => 'tbkkt-background-image', 'image_object_fit_class' => $image_object_fit_class, 'image_object_position_class' => $image_object_position_class, 'video_class' => 'tbkkt-background-video', 'overlay_class' => 'tbkkt-background-overlay', 'use_layer' => $use_layer, 'layer_class' => 'tbkkt-background-layer', 'layer_repeat_class' => $layer_repeat_class, 'layer_position_class' => $layer_position_class, 'layer_size_class' => $layer_size_class, 'layer_size_custom' => $layer_size_custom, 'layer_size_is_custom' => $layer_size_is_custom, ), $markup_args_extra ); return tbkkt_background_render_markup( $args ); }