Files
acrib.es/wp-content/plugins/kadence-blocks/includes/blocks/class-kadence-blocks-advanced-heading-block.php
Malin f3ff7b7186 feat: initial ACRIB WordPress deployment
- WordPress 6.9.4 (es_ES) with Kadence theme
- Homepage: Hero, La Asociación, Pilares, Beneficios, Eventos, Miembros, Hazte Miembro, Contacto
- Brand identity: #13294b navy, #a12932 burgundy, #c69c48 gold
- Fonts: Raleway (headings) + Source Sans 3 (body) + Lato (UI)
- Plugins: Kadence Blocks, Polylang, Contact Form 7
- Custom CSS with full brand styling and responsive layout
- HTTPS enforced via wp-config.php proxy detection
2026-05-19 19:25:59 +02:00

914 lines
43 KiB
PHP

<?php
/**
* Class to Build the Advanced Heading Block.
*
* @package Kadence Blocks
*/
// Exit if accessed directly.
if ( ! defined( 'ABSPATH' ) ) {
exit;
}
/**
* Class to Build the Advanced Heading Block.
*
* @category class
*/
class Kadence_Blocks_Advancedheading_Block extends Kadence_Blocks_Abstract_Block {
/**
* Instance of this class
*
* @var null
*/
private static $instance = null;
/**
* Block name within this namespace.
*
* @var string
*/
protected $block_name = 'advancedheading';
/**
* Block determines in scripts need to be loaded for block.
*
* @var string
*/
protected $has_script = false;
/**
* Allowed HTML tags for front end output.
*
* @var string[]
*/
protected $allowed_html_tags = array( 'heading', 'p', 'span', 'div' );
/**
* Instance Control
*/
public static function get_instance() {
if ( is_null( self::$instance ) ) {
self::$instance = new self();
}
return self::$instance;
}
/**
* Builds CSS for block.
*
* @param array $attributes the blocks attributes.
* @param Kadence_Blocks_CSS $css the css class for blocks.
* @param string $unique_id the blocks attr ID.
* @param string $unique_style_id the blocks alternate ID for queries.
*/
public function build_css( $attributes, $css, $unique_id, $unique_style_id ) {
$css->set_style_id( 'kb-' . $this->block_name . $unique_style_id );
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . ', .wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"]' );
// Issue with span tag.
if ( isset( $attributes['htmlTag'] ) && 'span' === $attributes['htmlTag'] ) {
$css->add_property( 'display', 'block' );
}
// Support old margins.
if ( isset( $attributes['topMargin'] ) && is_numeric( $attributes['topMargin'] ) ) {
$css->add_property( 'margin-top', $attributes['topMargin'] . ( ! isset( $attributes['marginType'] ) ? 'px' : $attributes['marginType'] ) );
// This fixes an issue where the background doesn't show over the top of the item that is above it.
if ( $attributes['topMargin'] < 0 && isset( $attributes['background'] ) && ! empty( $attributes['background'] ) ) {
$css->add_property( 'position', 'relative' );
}
}
if ( isset( $attributes['rightMargin'] ) && is_numeric( $attributes['rightMargin'] ) ) {
$css->add_property( 'margin-right', $attributes['rightMargin'] . ( ! isset( $attributes['marginType'] ) ? 'px' : $attributes['marginType'] ) );
}
if ( isset( $attributes['bottomMargin'] ) && is_numeric( $attributes['bottomMargin'] ) ) {
$css->add_property( 'margin-bottom', $attributes['bottomMargin'] . ( ! isset( $attributes['marginType'] ) ? 'px' : $attributes['marginType'] ) );
}
if ( isset( $attributes['leftMargin'] ) && is_numeric( $attributes['leftMargin'] ) ) {
$css->add_property( 'margin-left', $attributes['leftMargin'] . ( ! isset( $attributes['marginType'] ) ? 'px' : $attributes['marginType'] ) );
}
// Spacing.
$css->render_responsive_range( $attributes, 'maxWidth', 'max-width' );
if ( ! empty( $attributes['maxWidth'][0] ) && ! empty( $attributes['align'] ) && 'center' === $attributes['align'] ) {
$css->add_property( 'margin-right', 'auto' );
$css->add_property( 'margin-left', 'auto' );
}
if ( ! empty( $attributes['maxWidth'][0] ) && ! empty( $attributes['align'] ) && 'right' === $attributes['align'] ) {
$css->add_property( 'margin-right', '0px' );
$css->add_property( 'margin-left', 'auto' );
}
$css->render_measure_output( $attributes, 'padding', 'padding' );
$css->render_measure_output( $attributes, 'margin', 'margin' );
// Style.
if ( isset( $attributes['align'] ) && ! empty( $attributes['align'] ) ) {
$css->add_property( 'text-align', $attributes['align'] );
}
// Old size first.
if ( ! empty( $attributes['size'] ) ) {
$css->add_property( 'font-size', $attributes['size'] . ( ! isset( $attributes['sizeType'] ) ? 'px' : $attributes['sizeType'] ) );
} else if ( ! empty( $attributes['fontSize'][0] ) ) {
$css->add_property( 'font-size', $css->get_font_size( $attributes['fontSize'][0], ( ! isset( $attributes['sizeType'] ) ? 'px' : $attributes['sizeType'] ) ) );
}
// Old line height first.
if ( isset( $attributes['lineHeight'] ) && ! empty( $attributes['lineHeight'] ) ) {
$css->add_property( 'line-height', $attributes['lineHeight'] . ( empty( $attributes['lineType'] ) ? 'px' : $attributes['lineType'] ) );
} else if ( ! empty( $attributes['fontHeight'][0] ) ) {
$css->add_property( 'line-height', $attributes['fontHeight'][0] . ( empty( $attributes['fontHeightType'] ) ? '' : $attributes['fontHeightType'] ) );
}
if ( ! empty( $attributes['fontWeight'] ) ) {
$css->add_property( 'font-weight', $css->render_font_weight( $attributes['fontWeight'] ) );
}
if ( ! empty( $attributes['fontStyle'] ) ) {
$css->add_property( 'font-style', $attributes['fontStyle'] );
}
if ( ! empty( $attributes['typography'] ) ) {
$google = isset( $attributes['googleFont'] ) && $attributes['googleFont'] ? true : false;
$google = $google && ( isset( $attributes['loadGoogleFont'] ) && $attributes['loadGoogleFont'] || ! isset( $attributes['loadGoogleFont'] ) ) ? true : false;
$variant = ! empty( $attributes['fontVariant'] ) ? $attributes['fontVariant'] : null;
$css->add_property( 'font-family', $css->render_font_family( $attributes['typography'], $google, $variant ) );
}
if ( ! empty( $attributes['textTransform'] ) ) {
$css->add_property( 'text-transform', $attributes['textTransform'] );
}
if ( isset( $attributes['letterSpacing'] ) && is_numeric( $attributes['letterSpacing'] ) ) {
$css->add_property( 'letter-spacing', $attributes['letterSpacing'] . ( ! isset( $attributes['letterSpacingType'] ) ? 'px' : $attributes['letterSpacingType'] ) );
}
if ( isset( $attributes['tabletLetterSpacing'] ) && is_numeric( $attributes['tabletLetterSpacing'] ) ) {
$css->set_media_state('tablet');
$css->add_property( 'letter-spacing', $attributes['tabletLetterSpacing'] . ( ! isset( $attributes['letterSpacingType'] ) ? 'px' : $attributes['letterSpacingType'] ) );
$css->set_media_state('desktop');
}
if ( isset( $attributes['mobileLetterSpacing'] ) && is_numeric( $attributes['mobileLetterSpacing'] ) ) {
$css->set_media_state('mobile');
$css->add_property( 'letter-spacing', $attributes['mobileLetterSpacing'] . ( ! isset( $attributes['letterSpacingType'] ) ? 'px' : $attributes['letterSpacingType'] ) );
$css->set_media_state('desktop');
}
if ( ! empty( $attributes['color'] ) && empty( $attributes['enableTextGradient'] ) ) {
if ( class_exists( 'Kadence\Theme' ) ) {
if ( isset( $attributes['colorClass'] ) && empty( $attributes['colorClass'] ) || ! isset( $attributes['colorClass'] ) ) {
$css->add_property( 'color', $css->render_color( $attributes['color'] ) );
}
} else if ( strpos( $attributes['color'], 'palette' ) === 0 ) {
$css->add_property( 'color', $css->render_color( $attributes['color'] ) );
} else if ( isset( $attributes['colorClass'] ) && empty( $attributes['colorClass'] ) || ! isset( $attributes['colorClass'] ) ) {
$css->add_property( 'color', $css->render_color( $attributes['color'] ) );
}
}
if( !empty( $attributes['textGradient'] ) && ! empty( $attributes['enableTextGradient'] ) ) {
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . ', .wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] .kb-adv-text-inner' );
$css->add_property( 'background-image', $attributes['textGradient'] );
$css->add_property( 'background-clip', 'text' );
$css->add_property( '-webkit-box-decoration-break', 'clone' );
$css->add_property( 'box-decoration-break', 'clone' );
$css->add_property( '-webkit-background-clip', 'text' );
$css->add_property( '-webkit-text-fill-color', 'transparent' );
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . ', .wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"]' );
}
if ( ! empty( $attributes['background'] ) && empty( $attributes['enableTextGradient'] ) ) {
if ( class_exists( 'Kadence\Theme' ) ) {
if ( isset( $attributes['backgroundColorClass'] ) && empty( $attributes['backgroundColorClass'] ) || ! isset( $attributes['backgroundColorClass'] ) ) {
$css->add_property( 'background-color', $css->render_color( $attributes['background'] ) );
}
} else if ( strpos( $attributes['background'], 'palette' ) === 0 ) {
$css->add_property( 'background-color', $css->render_color( $attributes['background'] ) );
} else if ( isset( $attributes['backgroundColorClass'] ) && empty( $attributes['backgroundColorClass'] ) || ! isset( $attributes['backgroundColorClass'] ) ) {
$css->add_property( 'background-color', $css->render_color( $attributes['background'] ) );
}
}
if ((isset($attributes['enableTextShadow']) && !empty($attributes['enableTextShadow']))
|| (isset($attributes['textShadow']) && !empty($attributes['textShadow'][0]['enable']))) {
if (empty($attributes['textShadow'])) {
$attributes['textShadow'] = [
[
'hOffset' => 1,
'vOffset' => 1,
'blur' => 1,
'color' => '#000000',
'opacity' => 0.2,
],
];
}
$this->render_text_shadow( $attributes, $css ); // This should be all that is required.
$css->set_media_state('desktop');
}
if (isset($attributes['textOrientation'])) {
$this->handle_text_orientation($css, $attributes['textOrientation']);
$this->handle_max_height($css, $attributes, 0, 'textOrientation');
}
if (isset($attributes['tabletTextOrientation'])) {
$css->set_media_state('tablet');
$this->handle_text_orientation($css, $attributes['tabletTextOrientation']);
$this->handle_max_height($css, $attributes, 1, 'tabletTextOrientation');
}
if (isset($attributes['mobileTextOrientation'])) {
$css->set_media_state('mobile');
$this->handle_text_orientation($css, $attributes['mobileTextOrientation']);
$this->handle_max_height($css, $attributes, 2, 'mobileTextOrientation');
}
$css->set_media_state( 'tablet' );
// Old size first.
if ( ! empty( $attributes['tabSize'] ) ) {
$css->add_property( 'font-size', $attributes['tabSize'] . ( ! isset( $attributes['sizeType'] ) ? 'px' : $attributes['sizeType'] ) );
} else if ( ! empty( $attributes['fontSize'][1] ) ) {
$css->add_property( 'font-size', $css->get_font_size( $attributes['fontSize'][1], ( ! isset( $attributes['sizeType'] ) ? 'px' : $attributes['sizeType'] ) ) );
}
// Old line height first.
if ( ! empty( $attributes['tabLineHeight'] ) ) {
$css->add_property( 'line-height', $attributes['tabLineHeight'] . ( empty( $attributes['lineType'] ) ? 'px' : $attributes['lineType'] ) );
} else if ( ! empty( $attributes['fontHeight'][1] ) ) {
$css->add_property( 'line-height', $attributes['fontHeight'][1] . ( empty( $attributes['fontHeightType'] ) ? '' : $attributes['fontHeightType'] ) );
}
if ( ! empty( $attributes['tabletAlign'] ) ) {
$css->add_property( 'text-align', $attributes['tabletAlign'] . '!important' );
}
$css->set_media_state( 'mobile' );
// Old size first.
if ( ! empty( $attributes['mobileSize'] ) ) {
$css->add_property( 'font-size', $attributes['mobileSize'] . ( ! isset( $attributes['sizeType'] ) ? 'px' : $attributes['sizeType'] ) );
} else if ( ! empty( $attributes['fontSize'][2] ) ) {
$css->add_property( 'font-size', $css->get_font_size( $attributes['fontSize'][2], ( ! isset( $attributes['sizeType'] ) ? 'px' : $attributes['sizeType'] ) ) );
}
// Old line height first.
if ( ! empty( $attributes['mobileLineHeight'] ) ) {
$css->add_property( 'line-height', $attributes['mobileLineHeight'] . ( empty( $attributes['lineType'] ) ? 'px' : $attributes['lineType'] ) );
} else if ( ! empty( $attributes['fontHeight'][2] ) ) {
$css->add_property( 'line-height', $attributes['fontHeight'][2] . ( empty( $attributes['fontHeightType'] ) ? '' : $attributes['fontHeightType'] ) );
}
if ( ! empty( $attributes['mobileAlign'] ) ) {
$css->add_property( 'text-align', $attributes['mobileAlign'] . '!important' );
}
$css->set_media_state( 'desktop' );
$css->render_border_styles( $attributes, 'borderStyle');
$css->render_border_radius( $attributes, 'borderRadius', ( !empty( $attributes['borderRadiusUnit']) ? $attributes['borderRadiusUnit'] : 'px' ) );
$css->set_media_state('tablet');
$css->render_border_radius( $attributes, 'tabletBorderRadius', ( !empty( $attributes['borderRadiusUnit']) ? $attributes['borderRadiusUnit'] : 'px' ) );
$css->set_media_state('desktop');
$css->set_media_state('mobile');
$css->render_border_radius( $attributes, 'mobileBorderRadius', ( !empty( $attributes['borderRadiusUnit']) ? $attributes['borderRadiusUnit'] : 'px' ) );
$css->set_media_state('desktop');
// SVG.
if ( ! empty( $attributes['icon'] ) ) {
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"]' );
$css->add_property( 'display', 'flex' );
$css->add_property( 'gap', '0.25em' );
if ( isset( $attributes['align'] ) ) {
$css->add_property( 'justify-content', $attributes['align'] );
}
if ( ! empty( $attributes['tabletAlign'] ) ) {
$css->set_media_state( 'tablet' );
$css->add_property( 'justify-content', $attributes['tabletAlign'] );
$css->set_media_state( 'desktop' );
}
if ( ! empty( $attributes['mobileAlign'] ) ) {
$css->set_media_state( 'mobile' );
$css->add_property( 'justify-content', $attributes['mobileAlign'] );
$css->set_media_state( 'desktop' );
}
if ( isset( $attributes['iconVerticalAlign'] ) ) {
$css->add_property( 'align-items', $attributes['iconVerticalAlign'] );
} else {
$css->add_property( 'align-items', 'center' );
}
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] .kb-adv-heading-icon svg' );
$css->add_property( 'width', '1em');
$css->add_property( 'height', '1em');
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] .kb-adv-heading-icon' );
$css->render_color_output( $attributes, 'iconColor', 'color' );
$css->render_responsive_range( $attributes, 'iconSize', 'font-size', 'iconSizeUnit' );
$css->render_measure_output( $attributes, 'iconPadding', 'padding', array( 'unit_key' => 'iconPaddingUnit' ) );
if ( isset( $attributes['lineHeight'] ) ) {
$css->add_property( 'line-height', $attributes['lineHeight'] . ( empty( $attributes['lineType'] ) ? 'px' : $attributes['lineType'] ) );
}
if ( ! empty( $attributes['iconColorHover'] ) ) {
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"]:hover .kb-adv-heading-icon' );
$css->render_color_output( $attributes, 'iconColorHover', 'color' );
}
}
// Highlight.
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . ' mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] mark.kt-highlight' );
if ( isset( $attributes['markLetterSpacing'] ) && ! empty( $attributes['markLetterSpacing'] ) ) {
$css->add_property( 'letter-spacing', $attributes['markLetterSpacing'] . ( ! isset( $attributes['markLetterSpacingType'] ) ? 'px' : $attributes['markLetterSpacingType'] ) );
}
if ( ! empty( $attributes['markSize'][0] ) ) {
$css->add_property( 'font-size', $css->get_font_size( $attributes['markSize'][0], ( ! isset( $attributes['markSizeType'] ) ? 'px' : $attributes['markSizeType'] ) ) );
}
if ( ! empty( $attributes['markLineHeight'][0] ) ) {
$css->add_property( 'line-height', $attributes['markLineHeight'][0] . ( ! isset( $attributes['markLineType'] ) ? 'px' : $attributes['markLineType'] ) );
}
if ( ! empty( $attributes['markTypography'] ) ) {
$google = isset( $attributes['markGoogleFont'] ) && $attributes['markGoogleFont'] ? true : false;
$google = $google && ( isset( $attributes['markLoadGoogleFont'] ) && $attributes['markLoadGoogleFont'] || ! isset( $attributes['markLoadGoogleFont'] ) ) ? true : false;
$variant = ! empty( $attributes['markFontVariant'] ) ? $attributes['markFontVariant'] : null;
$css->add_property( 'font-family', $css->render_font_family( $attributes['markTypography'], $google, $variant ) );
}
if ( ! empty( $attributes['markFontWeight'] ) ) {
$css->add_property( 'font-weight', $css->render_font_weight( $attributes['markFontWeight'] ) );
}
if ( ! empty( $attributes['markFontStyle'] ) ) {
$css->add_property( 'font-style', $attributes['markFontStyle'] );
}
if( !empty( $attributes['textGradient'] ) && ! empty( $attributes['enableTextGradient'] ) ) {
$css->add_property( '-webkit-text-fill-color', 'initial !important' );
$css->add_property( '-webkit-background-clip', 'initial !important' );
$css->add_property( 'background-clip', 'initial !important' );
}
if ( ! empty( $attributes['markColor'] ) && empty( $attributes['enableMarkGradient'] ) ) {
$css->add_property( 'color', $css->render_color( $attributes['markColor'] ) );
} else if ( !empty( $attributes['markGradient'] ) && ! empty( $attributes['enableMarkGradient'] ) ) {
$css->add_property( 'background-image', $attributes['markGradient'] );
$css->add_property( '-webkit-background-clip', 'text' );
$css->add_property( 'background-clip', 'text' );
$css->add_property( '-webkit-text-fill-color', 'transparent' );
}
if ( ! empty($attributes['enableMarkBackgroundGradient']) && ! empty($attributes['markBackgroundGradient']) ) {
$css->add_property( 'background-image', $attributes['markBackgroundGradient'] );
}
if ( ! empty( $attributes['markTextTransform'] ) ) {
$css->add_property( 'text-transform', $attributes['markTextTransform'] );
}
if ( ! empty( $attributes['markBG'] ) && empty( $attributes['enableMarkGradient'] ) && empty( $attributes['enableMarkBackgroundGradient'] ) ) {
$alpha = ( isset( $attributes['markBGOpacity'] ) && ! empty( $attributes['markBGOpacity'] ) ? $attributes['markBGOpacity'] : 1 );
$css->add_property( 'background', $css->render_color( $attributes['markBG'], $alpha ) );
}
if ( ! empty( $attributes['markBorder'] ) ) {
$alpha = ( isset( $attributes['markBorderOpacity'] ) && ! empty( $attributes['markBorderOpacity'] ) ? $attributes['markBorderOpacity'] : 1 );
$css->add_property( 'border-color', $css->render_color( $attributes['markBorder'], $alpha ) );
}
if ( ! empty( $attributes['markBorderWidth'] ) ) {
$css->add_property( 'border-width', $attributes['markBorderWidth'] . 'px' );
}
if ( ! empty( $attributes['markBorderStyle'] ) && 'solid' !== $attributes['markBorderStyle'] ) {
$css->add_property( 'border-style', $attributes['markBorderStyle'] );
}
$css->render_border_styles( $attributes, 'markBorderStyles' );
$css->render_border_radius( $attributes, 'markBorderRadius', ( ! empty( $attributes['markBorderRadiusUnit'] ) ? $attributes['markBorderRadiusUnit'] : 'px' ) );
$css->add_property( '-webkit-box-decoration-break', 'clone' );
$css->add_property( 'box-decoration-break', 'clone' );
$css->set_media_state( 'tablet' );
$css->render_border_radius( $attributes, 'tabletMarkBorderRadius', ( ! empty( $attributes['markBorderRadiusUnit'] ) ? $attributes['markBorderRadiusUnit'] : 'px' ) );
$css->set_media_state( 'desktop' );
$css->set_media_state( 'mobile' );
$css->render_border_radius( $attributes, 'mobileMarkBorderRadius', ( ! empty( $attributes['markBorderRadiusUnit'] ) ? $attributes['markBorderRadiusUnit'] : 'px' ) );
$css->set_media_state( 'desktop' );
$mark_padding_args = array(
'desktop_key' => 'markPadding',
'tablet_key' => 'markTabPadding',
'mobile_key' => 'markMobilePadding',
);
$css->render_measure_output( $attributes, 'markPadding', 'padding', $mark_padding_args );
// Inline Image.
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . ' img.kb-inline-image, .wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] img.kb-inline-image' );
// Ensure default value if inlineImageWidth desktop value is not set or empty.
if ( empty( $attributes['inlineImageWidth'] ) || ! is_array( $attributes['inlineImageWidth'] ) || ! isset( $attributes['inlineImageWidth'][0] ) || ! is_numeric( $attributes['inlineImageWidth'][0] ) ) {
$css->add_property( 'width', '150px' );
$css->add_property( 'display', 'inline-block' );
}
// Render responsive range will handle desktop, tablet, and mobile if values are set.
$css->render_responsive_range( $attributes, 'inlineImageWidth', 'width' );
if ( ! empty( $attributes['inlineImageVerticalAlign'] ) ) {
$css->add_property( 'vertical-align', $attributes['inlineImageVerticalAlign'] );
}
// Add aspect-ratio if useRatio is enabled.
if ( ! empty( $attributes['useRatio'] ) && ! empty( $attributes['ratio'] ) ) {
$aspect_ratio = '';
switch ( $attributes['ratio'] ) {
case 'land43':
$aspect_ratio = '4 / 3';
break;
case 'land32':
$aspect_ratio = '3 / 2';
break;
case 'land169':
$aspect_ratio = '16 / 9';
break;
case 'land21':
$aspect_ratio = '2 / 1';
break;
case 'land31':
$aspect_ratio = '3 / 1';
break;
case 'land41':
$aspect_ratio = '4 / 1';
break;
case 'port34':
$aspect_ratio = '3 / 4';
break;
case 'port23':
$aspect_ratio = '2 / 3';
break;
case 'port916':
$aspect_ratio = '9 / 16';
break;
case 'square':
$aspect_ratio = '1 / 1';
break;
}
if ( ! empty( $aspect_ratio ) ) {
$css->add_property( 'aspect-ratio', $aspect_ratio );
$css->add_property( 'object-fit', 'cover' );
}
}
$css->render_border_styles( $attributes, 'inlineImageBorderStyles' );
$css->render_border_radius( $attributes, 'inlineImageBorderRadius', ( ! empty( $attributes['inlineImageBorderRadiusUnit'] ) ? $attributes['inlineImageBorderRadiusUnit'] : 'px' ) );
$css->set_media_state( 'tablet' );
$css->render_border_radius( $attributes, 'tabletInlineImageBorderRadius', ( ! empty( $attributes['inlineImageBorderRadiusUnit'] ) ? $attributes['inlineImageBorderRadiusUnit'] : 'px' ) );
$css->set_media_state( 'desktop' );
$css->set_media_state( 'mobile' );
$css->render_border_radius( $attributes, 'mobileInlineImageBorderRadius', ( ! empty( $attributes['inlineImageBorderRadiusUnit'] ) ? $attributes['inlineImageBorderRadiusUnit'] : 'px' ) );
$css->set_media_state( 'desktop' );
// Link.
if ( ! empty( $attributes['linkColor'] ) ) {
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] a, .kt-adv-heading-link' . $unique_id . ', .kt-adv-heading-link' . $unique_id . ' .kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"]' );
if ( ! empty( $attributes['linkColor'] ) ) {
$css->add_property( 'color', $css->render_color( $attributes['linkColor'] ) );
}
}
if ( ! empty( $attributes['linkHoverColor'] ) ) {
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] a:hover, .kt-adv-heading-link' . $unique_id . ':hover, .kt-adv-heading-link' . $unique_id . ':hover .kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"]' );
$css->add_property( 'color', $css->render_color( $attributes['linkHoverColor'] ) );
}
if ( ! empty( $attributes['linkStyle'] ) ) {
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] a, a.kb-advanced-heading-link.kt-adv-heading-link' . $unique_id );
if ( 'none' === $attributes['linkStyle'] ) {
$css->add_property( 'text-decoration', 'none' );
} else if ( $attributes['linkStyle'] === 'underline' ) {
$css->add_property( 'text-decoration', 'underline' );
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] a:hover, a.kb-advanced-heading-link.kt-adv-heading-link' . $unique_id . ':hover' );
$css->add_property( 'text-decoration', 'underline' );
} else if ( $attributes['linkStyle'] === 'hover_underline' ) {
$css->add_property( 'text-decoration', 'none' );
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] a:hover, a.kb-advanced-heading-link.kt-adv-heading-link' . $unique_id . ':hover' );
$css->add_property( 'text-decoration', 'underline' );
}
}
// Tablet.
$css->set_media_state( 'tablet' );
$css->set_selector( '.wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . ' mark.kt-highlight, .wp-block-kadence-advancedheading.kt-adv-heading' . $unique_id . '[data-kb-block="kb-adv-heading' . $unique_id . '"] mark.kt-highlight' );
if ( ! empty( $attributes['markSize'][1] ) ) {
$css->add_property( 'font-size', $css->get_font_size( $attributes['markSize'][1], ( ! isset( $attributes['markSizeType'] ) ? 'px' : $attributes['markSizeType'] ) ) );
}
if ( ! empty( $attributes['markLineHeight'][1] ) ) {
$css->add_property( 'line-height', $attributes['markLineHeight'][1] . ( ! isset( $attributes['markLineType'] ) ? 'px' : $attributes['markLineType'] ) );
}
$css->set_media_state( 'mobile' );
if ( ! empty( $attributes['markSize'][2] ) ) {
$css->add_property( 'font-size', $css->get_font_size( $attributes['markSize'][2], ( ! isset( $attributes['markSizeType'] ) ? 'px' : $attributes['markSizeType'] ) ) );
}
if ( ! empty( $attributes['markLineHeight'][2] ) ) {
$css->add_property( 'line-height', $attributes['markLineHeight'][2] . ( ! isset( $attributes['markLineType'] ) ? 'px' : $attributes['markLineType'] ) );
}
$css->set_media_state( 'desktop' );
return $css->css_output();
}
/**
* This block is conditionally dynamic. It's only rendered dynamically if the heading includes an icon.
*
* @param array $attributes The block attributes.
*
* @return string Returns the block output.
*/
public function build_html( $attributes, $unique_id, $content, $block_instance ) {
if ( strpos( $content, 'kt-typed-text') !== false ) {
$this->enqueue_script( 'kadence-blocks-' . $this->block_name );
}
if ( strpos( $content, 'kb-tooltips') !== false || ( ! empty( $attributes['icon'] ) && ! empty( $attributes['iconTooltip'] ) ) ) {
$this->enqueue_script( 'kadence-blocks-tippy' );
}
$should_wrap_content = ! empty( $attributes['icon'] ) ||
( ! empty( $attributes['enableTextGradient'] ) && strpos( $content, 'kt-typed-text' ) === false );
if ( $should_wrap_content ) {
$tag_name = $this->get_html_tag( $attributes, 'htmlTag', 'h2', $this->allowed_html_tags, 'level' );
$text_content = $this->get_inner_content( $content, $tag_name );
// Start empty.
$content = '';
$reveal_animation = ( ! empty( $attributes['kadenceAnimation'] ) && ( 'reveal-left' === $attributes['kadenceAnimation'] || 'reveal-right' === $attributes['kadenceAnimation'] || 'reveal-up' === $attributes['kadenceAnimation'] || 'reveal-down' === $attributes['kadenceAnimation'] ) ? true : false );
$wrapper = $reveal_animation ? true : false;
$icon_side = ! empty( $attributes['iconSide'] ) ? $attributes['iconSide'] : 'left';
$classes = array( 'kt-adv-heading' . $unique_id, 'wp-block-kadence-advancedheading' );
if ( ! empty( $attributes['icon'] ) ) {
$classes[] = 'kt-adv-heading-has-icon';
}
if ( ! empty( $attributes['link'] ) && ! empty( $attributes['linkStyle'] ) ) {
$classes[] = 'hls-' . $attributes['linkStyle'];
}
if ( ! empty( $attributes['className'] ) && ! $wrapper && empty( $attributes['link'] ) ) {
$classes[] = $attributes['className'];
}
if ( ! empty( $attributes['colorClass'] ) ) {
$classes[] = 'has-' . $attributes['colorClass'] . '-color';
$classes[] = 'has-text-color';
}
if ( ! empty( $attributes['backgroundColorClass'] ) ) {
$classes[] = 'has-' . $attributes['backgroundColorClass'] . '-background-color';
$classes[] = 'has-background';
}
$content_args = array(
'class' => implode( ' ', $classes ),
'data-kb-block' => 'kb-adv-heading' . $unique_id,
);
if ( ! empty( $attributes['anchor'] ) ) {
$content_args['id'] = $attributes['anchor'];
}
$content_args = kadence_apply_aos_wrapper_args( $attributes, $content_args );
$inner_content_attributes = array();
foreach ( $content_args as $key => $value ) {
$inner_content_attributes[] = $key . '="' . esc_attr( $value ) . '"';
}
$inner_content_attributes = implode( ' ', $inner_content_attributes );
$icon_left = '';
$icon_right = '';
if ( ! empty( $attributes['icon'] ) ) {
if ( 'left' === $icon_side ) {
$icon_left = $this->get_icon( $attributes );
}
if ( 'right' === $icon_side ) {
$icon_right = $this->get_icon( $attributes );
}
}
$content = sprintf( '<%1$s %2$s>%3$s<span class="kb-adv-text-inner">%4$s</span>%5$s</%1$s>', $tag_name, $inner_content_attributes, $icon_left, $text_content, $icon_right );
if ( ! empty( $attributes['link'] ) ) {
$link_classes = array( 'kb-advanced-heading-link', 'kt-adv-heading-link' . $unique_id );
if ( ! empty( $attributes['linkStyle'] ) ) {
$link_classes[] = 'hls-' . $attributes['linkStyle'];
}
if( ! $wrapper && !empty( $attributes['className'] ) ){
$link_classes[] = $attributes['className'];
}
if ( ! empty( $attributes['class'] ) && ! $wrapper ) {
$link_classes[] = $attributes['class'];
}
$link_args = array(
'class' => implode( ' ', $link_classes ),
);
$link_args['href'] = esc_url( do_shortcode( $attributes['link'] ) );
$rel_add = '';
if ( ! empty( $attributes['linkTarget'] ) && $attributes['linkTarget'] ) {
$link_args['target'] = '_blank';
$rel_add .= 'noreferrer noopener';
}
if ( isset( $attributes['linkNoFollow'] ) && $attributes['linkNoFollow'] ) {
if ( ! empty( $rel_add ) ) {
$rel_add .= ' nofollow';
} else {
$rel_add .= 'nofollow';
}
}
if ( isset( $attributes['linkSponsored'] ) && $attributes['linkSponsored'] ) {
if ( ! empty( $rel_add ) ) {
$rel_add .= ' sponsored';
} else {
$rel_add .= 'sponsored';
}
}
if ( ! empty( $rel_add ) ) {
$link_args['rel'] = $rel_add;
}
$link_attributes = array();
foreach ( $link_args as $key => $value ) {
$link_attributes[] = $key . '="' . esc_attr( $value ) . '"';
}
$link_attributes = implode( ' ', $link_attributes );
$content = sprintf( '<a %1$s>%2$s</a>', $link_attributes, $content );
}
if ( $wrapper ) {
$wrapper_classes = array( 'kb-adv-heading-wrap' . $unique_id, 'kadence-advanced-heading-wrapper' );
if ( $reveal_animation ) {
$wrapper_classes[] = 'kadence-heading-clip-animation';
}
if ( ! empty( $attributes['class'] ) && $wrapper ) {
$wrapper_classes[] = $attributes['class'];
}
$wrapper_args = array(
'class' => implode( ' ', $wrapper_classes ),
);
$wrapper_attributes = array();
foreach ( $wrapper_args as $key => $value ) {
$wrapper_attributes[] = $key . '="' . esc_attr( $value ) . '"';
}
$wrapper_attributes = implode( ' ', $wrapper_attributes );
$content = sprintf( '<div %1$s>%2$s</div>', $wrapper_attributes, $content );
}
}
return $content;
}
/**
* Registers scripts and styles.
*/
public function register_scripts() {
// Skip calling parent because this block does not have a dedicated CSS file.
// parent::register_scripts();
// If in the backend, bail out.
if ( is_admin() ) {
return;
}
if ( apply_filters( 'kadence_blocks_check_if_rest', false ) && kadence_blocks_is_rest() ) {
return;
}
wp_register_style( 'kadence-blocks-' . $this->block_name, false );
$heading_css = <<<'CSS'
.wp-block-kadence-advancedheading mark{background:transparent;border-style:solid;border-width:0}
.wp-block-kadence-advancedheading mark.kt-highlight{color:#f76a0c;}
.kb-adv-heading-icon{display: inline-flex;justify-content: center;align-items: center;}
.is-layout-constrained > .kb-advanced-heading-link {display: block;}
CSS;
// Style to prevent padding conflict with WordPress core style for headings and paragraphs.
// Reference: https://stellarwp.atlassian.net/browse/KAD-5283
$heading_css .= '.wp-block-kadence-advancedheading.has-background{padding: 0;}';
// Short term fix for an issue with heading wrapping.
if ( class_exists( '\Kadence\Theme' ) ) {
$heading_css .= <<<'CSS'
.single-content .kadence-advanced-heading-wrapper h1,
.single-content .kadence-advanced-heading-wrapper h2,
.single-content .kadence-advanced-heading-wrapper h3,
.single-content .kadence-advanced-heading-wrapper h4,
.single-content .kadence-advanced-heading-wrapper h5,
.single-content .kadence-advanced-heading-wrapper h6 {margin: 1.5em 0 .5em;}
.single-content .kadence-advanced-heading-wrapper+* { margin-top:0;}
CSS;
}
// Add screen reader text styles
$heading_css .= '.kb-screen-reader-text{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);}';
wp_add_inline_style( 'kadence-blocks-' . $this->block_name, $heading_css );
wp_register_script( 'kadence-blocks-typed-js', KADENCE_BLOCKS_URL . 'includes/assets/js/typed.min.js', array(), KADENCE_BLOCKS_VERSION, true );
wp_register_script( 'kadence-blocks-' . $this->block_name, KADENCE_BLOCKS_URL . 'includes/assets/js/kb-advanced-heading.min.js', array( 'kadence-blocks-typed-js' ), KADENCE_BLOCKS_VERSION, true );
wp_register_script( 'kadence-blocks-popper', KADENCE_BLOCKS_URL . 'includes/assets/js/popper.min.js', array(), KADENCE_BLOCKS_VERSION, true );
wp_register_script( 'kadence-blocks-tippy', KADENCE_BLOCKS_URL . 'includes/assets/js/kb-tippy.min.js', array( 'kadence-blocks-popper' ), KADENCE_BLOCKS_VERSION, true );
}
/**
* Get the text content.
*
* @param array $attributes the blocks attributes.
*/
private function get_inner_content( $string, $tagname ) {
$pattern = "#<\s*?$tagname\b[^>]*>(.*?)</$tagname\b[^>]*>#s";
preg_match( $pattern, $string, $matches );
if ( isset( $matches[1] ) ) {
return $matches[1];
}
return '';
}
/**
* Build the Icon.
*
* @param array $attributes the blocks attributes.
*/
private function get_icon( $attributes ) {
$svg_icon = '';
$icon_side = ! empty( $attributes['iconSide'] ) ? $attributes['iconSide'] : 'left';
if ( ! empty( $attributes['icon'] ) ) {
$type = substr( $attributes['icon'], 0, 2 );
$line_icon = ( ! empty( $type ) && 'fe' == $type ? true : false );
$fill = ( $line_icon ? 'none' : 'currentColor' );
$stroke_width = false;
if ( $line_icon ) {
$stroke_width = 2;
}
$title = ( ! empty ( $attributes['iconTitle'] ) ? $attributes['iconTitle'] : '' );
$hidden = ( empty( $title ) ? true : false );
$svg_icon = Kadence_Blocks_Svg_Render::render( $attributes['icon'], $fill, $stroke_width, $title, $hidden );
}
$tooltip_placement = '';
if ( ! empty( $attributes['iconTooltip'] ) && ! empty( $attributes['iconTooltipPlacement'] ) ) {
$tooltip_placement = ' data-tooltip-placement="' . esc_attr( $attributes['iconTooltipPlacement'] ) . '"';
}
if ( ! empty( $attributes['iconTooltip'] ) && isset( $attributes['iconTooltipDash'] ) && $attributes['iconTooltipDash'] ) {
$tooltip_placement = ' data-kb-tooltip-dash="border"';
}
return '<span class="kb-svg-icon-wrap kb-adv-heading-icon kb-svg-icon-' . esc_attr( $attributes['icon'] ) . ' kb-adv-heading-icon-side-' . esc_attr( $icon_side ) . '"' . ( ! empty( $attributes['iconTooltip'] ) ? ' data-kb-tooltip-content="' . esc_attr( $attributes['iconTooltip'] ) . '" tabindex="0"' . $tooltip_placement : '' ) . '>' . $svg_icon . '</span>';
}
/**
* Handles the text orientation by updating CSS properties based on the specified orientation.
*
* @param object $css The CSS processor object used to apply properties.
* @param string $textOrientation The specified text orientation. Possible values are 'horizontal', 'stacked', 'sideways-down', and 'sideways-up'.
* @return void
*/
private function handle_text_orientation($css, $textOrientation) {
switch ($textOrientation) {
case 'horizontal':
$css->add_property('writing-mode', 'horizontal-tb');
$css->add_property('text-orientation', 'mixed');
break;
case 'stacked':
$css->add_property('writing-mode', 'vertical-lr');
$css->add_property('text-orientation', 'upright');
break;
case 'sideways-down':
$css->add_property('writing-mode', 'vertical-lr');
$css->add_property('text-orientation', 'sideways');
break;
case 'sideways-up':
$css->add_property('writing-mode', 'sideways-lr');
$css->add_property('text-orientation', 'sideways');
break;
}
}
/**
* Handles the max-height property for CSS generation based on block attributes.
*
* @param object $css The CSS generator object.
* @param array $attributes The block attributes.
* @param int $deviceIndex The index representing the current device context.
* @param string $orientationKey The key that defines the orientation for the current context.
*
* @return void
*/
private function handle_max_height($css, $attributes, $deviceIndex, $orientationKey) {
if (
isset($attributes['maxHeight']) &&
is_array($attributes['maxHeight']) &&
!empty($attributes['maxHeight'][$deviceIndex]) &&
$attributes[$orientationKey] !== 'horizontal'
) {
$css->add_property(
'max-height',
$attributes['maxHeight'][$deviceIndex] .
( !isset($attributes['maxHeightType'][$deviceIndex]) ? 'px' : $attributes['maxHeightType'][$deviceIndex] )
);
}
}
/**
* Renders the text shadow styles across desktop, tablet, and mobile devices based on the provided attributes.
*
* @param array $attributes An array of attributes containing text shadow properties for different breakpoints (desktop, tablet, and mobile).
* @return void
*/
public function render_text_shadow( $attributes, $css ) {
if (!empty($attributes['textShadow']) &&
is_array($attributes['textShadow'][0]) &&
(!empty($attributes['enableTextShadow']) || !empty($attributes['textShadow'][0]['enable']))
) {
$textShadow = $attributes['textShadow'][0] ?? [];
$textShadow['hOffset'] = $textShadow['hOffset'] ?? 1;
$textShadow['vOffset'] = $textShadow['vOffset'] ?? 1;
$textShadow['blur'] = $textShadow['blur'] ?? 1;
$textShadow['color'] = $textShadow['color'] ?? null;
$textShadow['opacity'] = $textShadow['opacity'] ?? 1.0; // Default is 0.2, but if it's undefed they set it at a time when the block defaults it to 1.0
}
if (!empty($attributes['textShadowTablet']) && is_array($attributes['textShadowTablet'][0])) {
$textShadowTablet = $attributes['textShadowTablet'][0] ?? [];
$textShadowTablet['hOffset'] = $this->get_cascading_value(
null, // No mobile value is considered here for tablet logic
$textShadowTablet['hOffset'] ?? null,
$attributes['textShadow'][0]['hOffset'] ?? null,
1
);
$textShadowTablet['vOffset'] = $this->get_cascading_value(
null,
$textShadowTablet['vOffset'] ?? null,
$attributes['textShadow'][0]['vOffset'] ?? null,
1
);
$textShadowTablet['blur'] = $this->get_cascading_value(
null,
$textShadowTablet['blur'] ?? null,
$attributes['textShadow'][0]['blur'] ?? null,
1
);
$textShadowTablet['color'] = $this->get_cascading_value(
null,
$textShadowTablet['color'] ?? null,
$attributes['textShadow'][0]['color'] ?? null,
null // Default fallback value for color
);
$textShadowTablet['opacity'] = $this->get_cascading_value(
null,
$textShadowTablet['opacity'] ?? null,
$attributes['textShadow'][0]['opacity'] ?? null,
1
);
}
if (!empty($attributes['textShadowMobile']) && is_array($attributes['textShadowMobile'][0])) {
$textShadowMobile = $attributes['textShadowMobile'][0] ?? [];
$textShadowMobile['hOffset'] = $this->get_cascading_value(
$textShadowMobile['hOffset'] ?? null,
$attributes['textShadowTablet'][0]['hOffset'] ?? null,
$attributes['textShadow'][0]['hOffset'] ?? null,
1
);
$textShadowMobile['vOffset'] = $this->get_cascading_value(
$textShadowMobile['vOffset'] ?? null,
$attributes['textShadowTablet'][0]['vOffset'] ?? null,
$attributes['textShadow'][0]['vOffset'] ?? null,
1
);
$textShadowMobile['blur'] = $this->get_cascading_value(
$textShadowMobile['blur'] ?? null,
$attributes['textShadowTablet'][0]['blur'] ?? null,
$attributes['textShadow'][0]['blur'] ?? null,
1
);
$textShadowMobile['color'] = $this->get_cascading_value(
$textShadowMobile['color'] ?? null,
$attributes['textShadowTablet'][0]['color'] ?? null,
$attributes['textShadow'][0]['color'] ?? null,
null
);
$textShadowMobile['opacity'] = $this->get_cascading_value(
$textShadowMobile['opacity'] ?? null,
$attributes['textShadowTablet'][0]['opacity'] ?? null,
$attributes['textShadow'][0]['opacity'] ?? null,
1
);
}
$responsiveTextShadow = [$textShadow, $textShadowTablet ?? null, $textShadowMobile ?? null];
foreach ($responsiveTextShadow as $key => $textShadow) {
if (!empty($textShadow)) {
if ( strpos($textShadow['color'], 'rgba') !== false ) {
$shadow_string = ( ! empty( $textShadow['hOffset'] ) ? $textShadow['hOffset'] : '0' ) . 'px '
. ( ! empty( $textShadow['vOffset'] ) ? $textShadow['vOffset'] : '0' ) . 'px '
. ( ! empty( $textShadow['blur'] ) ? $textShadow['blur'] : '0' ) . 'px '
. ( ! empty( $textShadow['color'] )
? $css->render_color( $textShadow['color'] )
: $css->render_color( '#000000', $textShadow['opacity'] )
);
} else {
$shadow_string = ( ! empty( $textShadow['hOffset'] ) ? $textShadow['hOffset'] : '0' ) . 'px '
. ( ! empty( $textShadow['vOffset'] ) ? $textShadow['vOffset'] : '0' ) . 'px '
. ( ! empty( $textShadow['blur'] ) ? $textShadow['blur'] : '0' ) . 'px '
. ( ! empty( $textShadow['color'] )
? $css->render_color( $textShadow['color'], $textShadow['opacity'] )
: $css->render_color( '#000000', $textShadow['opacity'] )
);
}
switch ($key) {
case 0: $css->set_media_state('desktop'); break;
case 1: $css->set_media_state('tablet'); break;
case 2: $css->set_media_state('mobile'); break;
}
$css->add_property('text-shadow', $shadow_string);
}
}
}
/**
* Retrieve the cascading value based on device-specific settings.
*
* @param mixed $mobile The value specifically set for mobile devices.
* @param mixed $tablet The value specifically set for tablet devices.
* @param mixed $default The default value if mobile and tablet values are not provided.
* @param mixed $fallback The fallback value if none of the other values are set.
*/
public function get_cascading_value($mobile, $tablet, $default, $fallback) {
if (isset($mobile) && $mobile !== '') {
return $mobile;
} elseif (isset($tablet) && $tablet !== '') {
return $tablet;
} elseif (isset($default) && $default !== '') {
return $default;
}
return $fallback;
}
}
Kadence_Blocks_Advancedheading_Block::get_instance();