set_style_id( 'kb-' . $this->block_name . $unique_style_id ); $css->set_selector( '.kb-search' . $unique_id ); /* * Margin */ $css->render_measure_output( $attributes, 'margin', 'margin' ); /* * Padding */ $css->render_measure_output( $attributes, 'padding', 'padding' ); // Modal Background $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-modal' ); if( $attributes['modalBackgroundType'] === 'gradient') { $css->add_property( '--kb-search-modal-background', $attributes['modalGradientActive'] ); } else { $css->add_property( '--kb-search-modal-background', $css->render_color( $attributes['modalBackgroundColor'] ) ); } // Input Styles. $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-input[type="text"]' ); $css->render_typography( $attributes, 'inputTypography' ); $css->render_measure_range( $attributes, 'inputBorderRadius', 'border-radius', $attributes['inputBorderRadiusUnit'] ); $css->render_measure_output( $attributes, 'inputPadding', 'padding' ); $css->render_border_styles( $attributes, 'inputBorderStyles' ); $css->add_property('color', $css->render_color( $attributes['inputColor'] ) ); if ( $attributes['inputBackgroundType'] === 'gradient' ) { $css->add_property( 'background', $attributes['inputGradient'] ); } else { $css->add_property( 'background', $css->render_color( $attributes['inputBackgroundColor'] ) ); } $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-input[type="text"]::placeholder' ); $css->add_property('color', $css->render_color( $attributes['inputPlaceholderColor'] ) ); $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-input-wrapper' ); $css->render_measure_output( $attributes, 'inputMargin', 'margin' ); // SVG colors. $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-icon svg' ); if ( !empty( $attributes['inputIcon'] ) && 'fe' === substr( $attributes['inputIcon'], 0, 2 ) ) { $css->add_property( 'stroke', $css->render_color( $attributes['inputIconColor'] ) ); $css->add_property( 'fill', 'none' ); } else { $css->add_property( 'fill', $css->render_color( $attributes['inputIconColor'] ) ); $css->add_property( 'stroke', 'none' ); } if( !empty($attributes['displayStyle'] ) && $attributes['displayStyle'] === 'modal' ) { $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-input-wrapper:hover .kb-search-icon svg' ); } else { $css->set_selector( '.kb-search' . $unique_id . ':hover .kb-search-icon svg' ); } if ( !empty( $attributes['inputIcon'] ) && 'fe' === substr( $attributes['inputIcon'], 0, 2 ) ) { $css->add_property( 'stroke', $css->render_color( $attributes['inputIconHoverColor'] ) ); $css->add_property( 'fill', 'none' ); } else { $css->add_property( 'fill', $css->render_color( $attributes['inputIconHoverColor'] ) ); $css->add_property( 'stroke', 'none' ); } $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-close-btn svg' ); if ( !empty( $attributes['closeIcon'] ) && 'fe' === substr( $attributes['closeIcon'], 0, 2 ) ) { $css->add_property( 'stroke', $css->render_color( $attributes['closeIconColor'] ) ); $css->add_property( 'fill', 'none' ); } else { $css->add_property( 'fill', $css->render_color( $attributes['closeIconColor'] ) ); $css->add_property( 'stroke', 'none' ); } // The closeIconSize is a range control, so we need to render it as a range. $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-close-btn' ); if( !empty( $attributes['closeIconSize'][0] )) { $css->add_property( 'font-size', $attributes['closeIconSize'][0]. 'px' ); } if( !empty( $attributes['closeIconSize'][1] )) { $css->set_media_state('tablet'); $css->add_property( 'font-size', $attributes['closeIconSize'][1]. 'px' ); $css->set_media_state('desktop'); } if( !empty( $attributes['closeIconSize'][2] )) { $css->set_media_state('mobile'); $css->add_property( 'font-size', $attributes['closeIconSize'][2]. 'px' ); $css->set_media_state('desktop'); } $css->set_selector( '.kb-search' . $unique_id . ' .kb-search-close-btn:hover svg' ); if ( !empty( $attributes['closeIcon'] ) && 'fe' === substr( $attributes['closeIcon'], 0, 2 ) ) { $css->add_property( 'stroke', $css->render_color( $attributes['closeIconHoverColor'] ) ); $css->add_property( 'fill', 'none' ); } else { $css->add_property( 'fill', $css->render_color( $attributes['closeIconHoverColor'] ) ); $css->add_property( 'stroke', 'none' ); } $css->set_selector( '.kb-search.kb-search' . $unique_id . ' form, .kb-search.kb-search' . $unique_id . ' .kb-search-modal-content form form' ); $css->render_responsive_range( $attributes, 'inputMaxWidth', 'max-width', 'inputMaxWidthType' ); $css->render_responsive_range( $attributes, 'inputMinWidth', 'min-width', 'inputMinWidthType' ); return $css->css_output(); } /** * Return dynamically generated HTML for block * * @param array $attributes The block attributes. * @param string $unique_id The unique ID for the block. * @param string $content The block inner content. * @param WP_Block $block_instance The instance of the WP_Block class that represents the block being rendered. * * @return string */ public function build_html( $attributes, $unique_id, $content, $block_instance ) { $outer_classes = array( 'kb-search', 'kb-search' . $unique_id ); if ( 'modal' === $attributes['displayStyle'] ) { $outer_classes[] = 'kb-search-modal-container'; } $wrapper_attributes = get_block_wrapper_attributes( array( 'class' => implode( ' ', $outer_classes ) ) ); $search_form = $this->build_search_form( $attributes, $unique_id, $content ); return sprintf( '
%2$s
', $wrapper_attributes, $search_form ); } /** * Build the search form HTML. * * @param array $attributes The block attributes. * @param string $unique_id The unique ID for the block. * @param string $content The block inner content. * * @return string */ private function build_search_form( $attributes, $unique_id, $content ) { $is_modal = 'modal' === $attributes['displayStyle']; $form_action = esc_url( home_url( '/' ) ); $search_form = $is_modal ? $content : ''; if ( $is_modal ) { $search_form .= $this->build_modal_content( $attributes, $unique_id ); } else { if( empty( $attributes['showButton'] ) ) { $content = ''; } $search_form .= sprintf( '', $form_action, $this->build_input( $attributes ), $content ); } return $search_form; } /** * Build the modal content HTML. * * @param array $attributes The block attributes. * @param string $unique_id The unique ID for the block. * * @return string */ private function build_modal_content( $attributes, $unique_id ) { $form_action = esc_url( home_url( '/' ) ); $close_icon = ''; if( !empty( $attributes['closeIcon'] ) ) { $icon = $attributes['closeIcon']; $type = substr( $icon, 0, 2 ); $line_icon = ( ! empty( $type ) && 'fe' == $type ? true : false ); $fill = ( $line_icon ? 'none' : 'currentColor' ); $stroke_width = false; if ( $line_icon ) { $stroke_width = ( ! empty( $attributes['closeIconLineWidth'] ) ? $attributes['closeIconLineWidth'] : 2 ); } $close_icon = Kadence_Blocks_Svg_Render::render( $icon, $fill, $stroke_width, '', false ); } $modal_content = sprintf( '
', esc_attr__( 'Close search', 'kadence-blocks' ), $close_icon, $form_action, $this->build_input( $attributes ) ); return $modal_content; } /** * Build the search input HTML. * * @param array $attributes The block attributes. * * @return string */ private function build_input( $attributes ) { $input = '
'; $placeholder = ! empty( $attributes['inputPlaceholder'] ) ? $attributes['inputPlaceholder'] : ''; $aria_label = !empty($attributes['label']) ? sprintf( 'aria-label="%s"', esc_attr( $attributes['label'] ) ) : 'aria-label="' . esc_html__( 'Search', 'kadence-blocks' ) . '"'; $input .= sprintf( '', esc_attr( $placeholder ), $aria_label ); if( !empty( $attributes['inputIcon'] ) ) { $icon = $attributes['inputIcon']; $type = substr( $icon, 0, 2 ); $line_icon = ( ! empty( $type ) && 'fe' == $type ? true : false ); $fill = ( $line_icon ? 'none' : 'currentColor' ); $stroke_width = false; if ( $line_icon ) { $stroke_width = ( ! empty( $attributes['inputIconLineWidth'] ) ? $attributes['inputIconLineWidth'] : 2 ); } $input_icon = Kadence_Blocks_Svg_Render::render( $icon, $fill, $stroke_width, '', false ); // If not showing a submit button, make the icon a submit button. if ( empty( $attributes['showButton'] ) || ( !empty( $attributes['displayStyle'] ) && 'modal' === $attributes['displayStyle'] ) ) { $input .= sprintf( '', esc_attr__( 'Search', 'kadence-blocks' ), $input_icon ); } else { $input .= sprintf( '%s', $input_icon ); } } if ( ! empty( $attributes['searchProductsOnly'] ) ) { $input .= ''; } $input .= '
'; return $input; } /** * Registers scripts and styles. */ public function register_scripts() { 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_script( 'kadence-blocks-search', KADENCE_BLOCKS_URL . 'includes/assets/js/kb-search.min.js', array(), KADENCE_BLOCKS_VERSION, true ); } } Kadence_Blocks_Search_Block::get_instance();