<?php

/**
 * @package SP Page Builder
 * @author JoomShaper http://www.joomshaper.com
 * @copyright Copyright (c) 2010 - 2025 JoomShaper
 * @license http://www.gnu.org/licenses/gpl-2.0.html GNU/GPLv2 or later
 */
//no direct access
defined('_JEXEC') or die('Restricted access');

use Joomla\CMS\Factory;
use Joomla\CMS\Language\Text;
use Joomla\CMS\Layout\FileLayout;
use Joomla\CMS\Uri\Uri;
use JoomShaper\SPPageBuilder\DynamicContent\Constants\FieldTypes;
use JoomShaper\SPPageBuilder\DynamicContent\Site\CollectionHelper;
use JoomShaper\SPPageBuilder\DynamicContent\Constants\CollectionIds;

class SppagebuilderAddonDynamic_content_text extends SppagebuilderAddons
{

    function autocorrect_html(string $html): string {
        if (empty($html)) {
            return '';
        }

        libxml_use_internal_errors(true);
    
        $dom = new DOMDocument();
        $dom->loadHTML('<?xml encoding="UTF-8">' . $html, LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD);
    
        libxml_clear_errors();
    
        return $dom->saveHTML();
    }

    function renderRatingStars($rating, $attribute, $settings) {
        if (empty($rating) || !is_numeric($rating)) {
            return '';
        }

        $rating = floatval($rating);
        $maxRating = !empty($settings->rating_max_length) ? intval($settings->rating_max_length) : null;
        $maxRating = $maxRating ?? ceil($rating);
        $isInteger = isset($attribute->number_format) && $attribute->number_format === 'integer';
        
        // Check if custom icon is selected
        $customIcon = isset($settings->rating_icon) && !empty($settings->rating_icon) ? $settings->rating_icon : null;
        
        $output = '<div class="sppb-rating-stars">';
        
        for ($i = 1; $i <= $maxRating; $i++) {
            $isFilled = $rating >= $i;
            $isHalfFilled = !$isInteger && $rating >= ($i - 0.5) && $rating < $i;
            
            $starClass = 'sppb-rating-star';
            if ($isFilled) {
                $starClass .= ' sppb-rating-star-filled';
            } elseif ($isHalfFilled) {
                $starClass .= ' sppb-rating-star-half';
            }
            
            if ($customIcon) {
                if ($isHalfFilled) {
                    $starClass = 'sppb-rating-star sppb-rating-custom-half';
                    $output .= '<span class="' . $starClass . '"><i class="' . $customIcon . '"></i><i class="' . $customIcon . ' half-overlay"></i></span>';
                } else {
                    $output .= '<span class="' . $starClass . '"><i class="' . $customIcon . '"></i></span>';
                }
            } else {
                $output .= '<span class="' . $starClass . '">★</span>';
            }
        }
        
        $output .= '</div>';
        
        return $output;
    }

    private function wordCount($unicode_string) {
        $unicode_string = preg_replace('/[\p{P}\p{N}]/u', '', $unicode_string);

        $unicode_string = preg_replace('/\s+/u', ' ', $unicode_string);

        $words_array = preg_split('/\s+/u', trim($unicode_string), -1, PREG_SPLIT_NO_EMPTY);

        return count($words_array);
    }

    public function render()
    {        
        $settings = $this->addon->settings;
        $selector = isset($settings->selector) ? $settings->selector : 'p';
        $isDownloadable = isset($settings->is_downloadable) ? $settings->is_downloadable : 0;
        $fileValueOverride = !empty($settings->file_value_override) ? $settings->file_value_override : null;
        $defaultContent = $settings->default_text ?? '';
        $class = $settings->class ?? '';
        $collectionId = isset($settings->dynamic_item['collection_id']) ? $settings->dynamic_item['collection_id'] : null;

        $input = Factory::getApplication()->input;
        $collectionType = $input->get('collection_type') ?? 'normal-source';

        // If the dynamic content value is not come from the parent collection addon,
        // that means this addon placed into a detail page, so we need to get the data from the detail page.
        if (empty($settings->dynamic_item) && $collectionType === 'articles') {
            $settings->dynamic_item = CollectionHelper::getDetailPageDataFromArticles();
        } else if (empty($settings->dynamic_item) && $collectionType === 'tags') {
            $settings->dynamic_item = CollectionHelper::getDetailPageDataFromTags();
        } else if (empty($settings->dynamic_item)) {
            $settings->dynamic_item = CollectionHelper::getDetailPageData();
        }

        if (is_object($settings->dynamic_item)) {
            $settings->dynamic_item = json_decode(json_encode($settings->dynamic_item), true);
        }

        if (empty($settings->dynamic_item) || empty($settings->attribute)) {
            $content = $defaultContent ? $defaultContent : Text::_('COM_SPPAGEBUILDER_DYNAMIC_CONTENT_TEXT_NO_DATA');
            return '<' . $selector . ' class="sppb-dynamic-content-text"' . '>' . $content . '</' . $selector . '>';
        }

        $linkAttributes = [
            'href' => '',
            'target' => '',
            'rel' => '',
            'has_link' => false,
        ];

        $link = $settings->link ?? null;
        $hasLink = false;

        $hasDynamicLink = isset($settings->dynamic_link_switch) && $settings->dynamic_link_switch ? true : false;
        $dynamicLink = isset($settings->dynamic_link) ? $settings->dynamic_link : null;
        $dynamicLinkUrl = CollectionHelper::getDynamicContentData($dynamicLink, $settings->dynamic_item);

        if (!empty($link)) {
            $linkOptions = [
                'url' => CollectionHelper::createDynamicContentLink(
                    $link, CollectionHelper::prepareItemForLink($settings->dynamic_item, $settings->attribute)
                ),
                'target' => $link->new_tab ? '_blank' : null,
                'nofollow' => $link->nofollow ?? null,
                'noreferrer' => $link->noreferrer ?? null,
                'noopener' => $link->noopener ?? null,
            ];
            $linkAttributes = CollectionHelper::generateLinkAttributes($linkOptions);
        }

        $content = CollectionHelper::getDynamicContentData($settings->attribute, $settings->dynamic_item) ?? '';

        if (isset($settings->dynamic_item['collection_id']) && ($settings->dynamic_item['collection_id'] === CollectionIds::ARTICLES_COLLECTION_ID || $settings->dynamic_item['collection_id'] === CollectionIds::TAGS_COLLECTION_ID)) {
            $content = $settings->dynamic_item[$settings->attribute->path];
        }

        $attributeType = $settings->attribute->type ?? 'text';

        if ($attributeType === FieldTypes::DATETIME) {
            $content = CollectionHelper::formatDate($content, $settings->attribute);
        } elseif ($attributeType === FieldTypes::RATING) {
            $content = $this->renderRatingStars($content, $settings->attribute, $settings);
        } elseif ($attributeType === FieldTypes::LINK) {
            $linkOptions = [
                'url' => $content ?? null,
                'target' => isset($settings->attribute->link) ? ($settings->attribute->link->target ?? null) : null,
                'nofollow' => isset($settings->attribute->link) ? ($settings->attribute->link->nofollow ?? null) : null,
                'noreferrer' => isset($settings->attribute->link) ? ($settings->attribute->link->noreferrer ?? null) : null,
                'noopener' => isset($settings->attribute->link) ? ($settings->attribute->link->noopener ?? null) : null,
            ];
            $linkAttributes = CollectionHelper::generateLinkAttributes($linkOptions);
            $content = (isset($settings->attribute->link) && $settings->attribute->link->text) ? $settings->attribute->link->text : $linkAttributes['href'];
        }

        if ($settings->attribute->name !== FieldTypes::LAYOUT) {
            if ($attributeType !== FieldTypes::RATING && empty(strip_tags($content))) {
                return '';
            }
        }

        $output = '';
        $hasLink = $linkAttributes['has_link'] ?? false;

        $downloadAction = $isDownloadable ? ' download="' . $content . '"' : '';

        $buttonEnabled = isset($settings->enable_button) && $settings->enable_button ? true : false;
        $buttonClass = '';
        $buttonClass .= (isset($settings->button_type) && $settings->button_type) ? ' sppb-btn-' . $settings->button_type : '';
        $buttonClass .= (isset($settings->button_size) && $settings->button_size) ? ' sppb-btn-' . $settings->button_size : '';
        $buttonClass .= (isset($settings->button_block) && $settings->button_block) ? ' ' . $settings->button_block : '';
        $buttonClass .= (isset($settings->button_shape) && $settings->button_shape) ? ' sppb-btn-' . $settings->button_shape : ' sppb-btn-rounded';
        $buttonClass .= (isset($settings->button_appearance) && $settings->button_appearance) ? ' sppb-btn-' . $settings->button_appearance : '';
        $attribs = ' id="btn-' . $this->addon->id . '"';

        if ($hasLink && !$hasDynamicLink) {
            $linkUrl = $linkAttributes['href'] ?? '/';
            $attributes = $linkAttributes['target'] ? ' target="' . $linkAttributes['target'] . '"' : '';
            $attributes .= $linkAttributes['rel'] ? ' rel="' . $linkAttributes['rel'] . '"' : '';
            $app = Factory::getApplication();
            $option = $app->input->get('option', '', 'string');
            $view = $app->input->get('view', '', 'string');
            
            if ($option === 'com_content' && ($view === 'category' || $view === 'archive' || $view === 'featured' || $view === 'article') && !empty($settings->dynamic_item['link'])) {
                $linkUrl = $settings->dynamic_item['link'];
            }
            
            
            $output .= '<a ' . $attribs . ' href="' . $linkUrl . '" class="sppb-dynamic-content-text__link ' . ($buttonEnabled ? 'sppb-btn ' . trim($buttonClass) : '') . '" data-preload-collection ' . $attributes . ' >';
        }

        if($hasDynamicLink && $dynamicLink){
            $dynamicLinkOptions = [
                'url' => $dynamicLinkUrl ?? null,
                'target' => isset($dynamicLink->link) ? ($dynamicLink->link->target ?? null) : null,
                'nofollow' => isset($dynamicLink->link) ? ($dynamicLink->link->nofollow ?? null) : null,
                'noreferrer' => isset($dynamicLink->link) ? ($dynamicLink->link->noreferrer ?? null) : null,
                'noopener' => isset($dynamicLink->link) ? ($dynamicLink->link->noopener ?? null) : null,
            ];

            $dynamicLinkAttributes = CollectionHelper::generateLinkAttributes($dynamicLinkOptions);
            $dynamicAttributes = $dynamicLinkAttributes['target'] ? ' target="' . $dynamicLinkAttributes['target'] . '"' : '';
            $dynamicAttributes .= $dynamicLinkAttributes['rel'] ? ' rel="' . $dynamicLinkAttributes['rel'] . '"' : '';
            $dynamicUrl = $dynamicLinkAttributes['href'] ?? '/';
               
            $output .= '<a href="' . $dynamicUrl . '" class="sppb-dynamic-content-text__link" data-preload-collection ' . $dynamicAttributes . ' >';
        }

        if ($isDownloadable && $attributeType === FieldTypes::FILE) {
            $linkUrl = '/' . $content;
            $attributes = '';
            $attributes .= $linkAttributes['rel'] ? ' rel="' . $linkAttributes['rel'] . '"' : '';
            $output .= '<a href="' . $linkUrl . '" class="sppb-dynamic-content-file__link" data-preload-collection ' . $attributes . $downloadAction . '" >';
        }

        $icon = $settings->icon ?? null;

        if (!empty($fileValueOverride) && $attributeType === FieldTypes::FILE) {
            $content = $fileValueOverride;
        }

        $classNames = 'sppb-dynamic-content-text';

        if ($attributeType === FieldTypes::RICH_TEXT) {
            $selector = 'div';
            $content = '<div class="sppb-dynamic-content__is-rich-text">' . $this->autocorrect_html($content) . '</div>';
        }

        if ($attributeType === FieldTypes::RATING) {
            $selector = 'div';
        }

        if (!empty($icon) && $settings->attribute->name !== FieldTypes::LAYOUT) {
            if (!empty(strip_tags($content))) {
                $iconPosition = $settings->icon_position ?? 'left';
                $iconContent = '<i class="sppb-dynamic-content-text__icon ' . $icon . '"></i>';
        
            if ($iconPosition === 'left') {
                $content = $iconContent . $content;
            } else {
                $content = $content . $iconContent;
            }
        }
    }

        $shouldTruncate = false;

        if ($settings->attribute->name !== FieldTypes::LAYOUT && $attributeType !== FieldTypes::RATING && $attributeType !== FieldTypes::FILE) {
            // Handle content truncation
            $content_truncation = (isset($settings->content_truncation) && $settings->content_truncation) ? $settings->content_truncation : 0;
            $originalContent = $content;

            $plain_text = strip_tags($content);
            $shouldTruncate = $content_truncation && $attributeType !== FieldTypes::RATING && $attributeType !== FieldTypes::FILE && !empty($settings->content_truncation_max_word) && (int) $this->wordCount($plain_text) > (int) $settings->content_truncation_max_word;

            if ($shouldTruncate) {
                $arrayString = explode(' ', $plain_text);
                $truncated_text = implode(' ', array_slice($arrayString, 0, (int) $settings->content_truncation_max_word));
                $content = $truncated_text;
                $content .= '<template class="sppb-addon-content-full-text">' . $originalContent . '</template>';
            }
        }

        if (!empty($class)) {
            $classNames .= ' ' . $class;
        }

        if (isset($settings->dynamic_item['collection_id']) && $settings->dynamic_item['collection_id'] === CollectionIds::ARTICLES_COLLECTION_ID && $settings->attribute->name === FieldTypes::LAYOUT) {
            $layout = $content;
            $layoutContent = !empty($layout->content) ? $layout->content : null;
            $layoutCss = !empty($layout->css) ? $layout->css : null;
                
            if (!empty($layoutContent)) {
                require_once JPATH_ROOT . '/components/com_sppagebuilder/parser/addon-parser.php';
                
                $decodedContent = is_string($layoutContent) ? json_decode($layoutContent) : $layoutContent;
                
                if ($decodedContent) {
                    $layoutHtml = AddonParser::viewAddons($decodedContent, 0, 'article-layout-' . ($settings->dynamic_item['id'] ?? ''));
                    
                    if (!empty($layoutCss)) {
                        $doc = Factory::getDocument();
                        $doc->addStyledeclaration($layoutCss);
                    }
                    $output .= '<div class="sppb-dynamic-content-layout">' . $layoutHtml . '</div>';
                }
            }
        } else {
            $output .= '<' . $selector . ' class="' . $classNames . '"' . '>' . $content . '</' . $selector . '>';
        }

        if ($shouldTruncate) {
            $output .= '<div class="sppb-btn-container sppb-content-truncation-show"><div role="button" class="sppb-btn-show-more">' . ($settings->content_truncation_action_text ?? 'Show More') . '</div></div>';
        }

        if ($isDownloadable && $attributeType === FieldTypes::FILE) {
            $output .= '</a>';
        }

        if ($hasLink || ($hasDynamicLink && $dynamicLink)) {
            $output .= '</a>';
        }

        return $output;
    }

    public function css()
    {
        $css = '';

        $addon_id = '#sppb-addon-' . $this->addon->id;
        $settings = $this->addon->settings;
        $cssHelper = new CSSHelper($addon_id);
        $settings->title_text_shadow = CSSHelper::parseBoxShadow($settings, 'title_text_shadow', true);

        if(isset($settings->enable_button) && $settings->enable_button){

            $layoutPath = JPATH_ROOT . '/components/com_sppagebuilder/layouts';
            $buttonLayout = new FileLayout('addon.css.button', $layoutPath);

            $options = new stdClass;
            $options->button_type = (isset($settings->button_type) && $settings->button_type) ? $settings->button_type : '';
            $options->button_appearance = (isset($settings->button_appearance) && $settings->button_appearance) ? $settings->button_appearance : '';
            $options->button_color = (isset($settings->button_color) && $settings->button_color) ? $settings->button_color : '';
            $options->button_border_width = (isset($settings->button_border_width) && $settings->button_border_width) ? $settings->button_border_width : '';
            $options->button_color_hover = (isset($settings->button_color_hover) && $settings->button_color_hover) ? $settings->button_color_hover : '';
            $options->button_background_color = (isset($settings->button_background_color) && $settings->button_background_color) ? $settings->button_background_color : '';
            $options->button_background_color_hover = (isset($settings->button_background_color_hover) && $settings->button_background_color_hover) ? $settings->button_background_color_hover : '';
            $options->button_fontstyle = (isset($settings->button_fontstyle) && $settings->button_fontstyle) ? $settings->button_fontstyle : '';
            $options->button_font_style = (isset($settings->button_font_style) && $settings->button_font_style) ? $settings->button_font_style : '';
            $options->button_padding = (isset($settings->button_padding) && $settings->button_padding) ? $settings->button_padding : '';
            $options->button_padding_original = (isset($settings->button_padding_original) && $settings->button_padding_original) ? $settings->button_padding_original : '';

            $options->fontsize = isset($settings->fontsize_original) ? $settings->fontsize_original : ($settings->fontsize ?? null);
            $options->button_size = isset($settings->size) ? $settings->size : null;
            $options->font_family = isset($settings->font_family) ? $settings->font_family : null;
            $options->button_typography = isset($settings->typography) ? $settings->typography : null;

            $options->link_button_color = (isset($settings->link_button_color) && $settings->link_button_color) ? $settings->link_button_color : '';
            $options->link_border_color = (isset($settings->link_button_border_color) && $settings->link_button_border_color) ? $settings->link_button_border_color : '';
            $options->link_button_border_width = (isset($settings->link_button_border_width) && $settings->link_button_border_width) ? $settings->link_button_border_width : '';
            $options->link_button_padding_bottom = (isset($settings->link_button_padding_bottom) && gettype($settings->link_button_padding_bottom) == 'string') ? $settings->link_button_padding_bottom : '';

            $options->link_button_hover_color = (isset($settings->link_button_hover_color) && $settings->link_button_hover_color) ? $settings->link_button_hover_color : '';
            $options->link_button_border_hover_color = (isset($settings->link_button_border_hover_color) && $settings->link_button_border_hover_color) ? $settings->link_button_border_hover_color : '';

            $options->button_letterspace = (isset($settings->letterspace) && $settings->letterspace) ? $settings->letterspace : '';
            $options->button_background_gradient = (isset($settings->background_gradient) && $settings->background_gradient) ? $settings->background_gradient : new stdClass();
            $options->button_background_gradient_hover = (isset($settings->background_gradient_hover) && $settings->background_gradient_hover) ? $settings->background_gradient_hover : new stdClass();

            $css .= $buttonLayout->render(array('addon_id' => $addon_id, 'options' => $options, 'id' => 'btn-' . $this->addon->id));

        }

        $css .= $cssHelper->generateStyle('.sppb-dynamic-content-text, .sppb-dynamic-content-text a', $settings, [
            'color'             => 'color',
            'alignment'         => 'justify-content',
            'title_margin'      => 'margin',
            'title_padding'     => 'padding',
            'title_text_shadow' => 'text-shadow',
        ], false);

        $iconWrapperStyle = $cssHelper->generateStyle('.sppb-dynamic-content-text', $settings, ['icon_gap' => 'gap'], false);
        $iconStyle = $cssHelper->generateStyle('.sppb-dynamic-content-text__icon', $settings, ['icon_color' => 'color', 'icon_size' => 'font-size'], false);

        $css .= $cssHelper->typography('.sppb-dynamic-content-text', $settings, 'typography');
        $css .= $iconWrapperStyle . $iconStyle;

        // Content truncation styles
        $contentTruncation = !empty($settings->content_truncation);
        if ($contentTruncation) {
            $contentTruncationStyle = $cssHelper->generateStyle('.sppb-content-truncation-show', $settings, ['content_truncation_action_text_color' => 'color'], false);
            $contentTruncationStyle .= $cssHelper->typography('.sppb-content-truncation-show', $settings, 'content_truncation_action_typography');
            
            $css .= $contentTruncationStyle;
        }

        if (isset($settings->attribute->type) && $settings->attribute->type === FieldTypes::RATING) {
            $css .= '
                .sppb-rating-stars {
                    display: inline-flex;
                    gap: ' . (!empty($settings->rating_gap) ? $settings->rating_gap : '2px') . ';
                    align-items: center;
                }
                .sppb-rating-star {
                    color: ' . (!empty($settings->rating_empty_color) ? $settings->rating_empty_color : '#d1d5db') . ';
                    font-size: ' . (!empty($settings->rating_size) ? $settings->rating_size : '1.2em') . ';
                    line-height: 1;
                    transition: color 0.2s ease;
                }
                .sppb-rating-star-filled {
                    color: ' . (!empty($settings->rating_color) ? $settings->rating_color : '#fbbf24') . ';
                }
                .sppb-rating-star-half {
                    color: ' . (!empty($settings->rating_empty_color) ? $settings->rating_empty_color : '#d1d5db') . ';
                    position: relative;
                }
                .sppb-rating-star-half::after {
                    content: "★";
                    position: absolute;
                    top: 0;
                    left: 0;
                    width: 50%;
                    height: 100%;
                    color: ' . (!empty($settings->rating_color) ? $settings->rating_color : '#fbbf24') . ';
                    overflow: hidden;
                }
                /* Custom icon styles */
                .sppb-rating-star i {
                    font-size: inherit;
                    color: inherit;
                }
                .sppb-rating-custom-half {
                    position: relative;
                }
                .sppb-rating-custom-half i:first-child {
                    color: ' . (!empty($settings->rating_empty_color) ? $settings->rating_empty_color : '#d1d5db') . ';
                    position: relative;
                    top: 0;
                    left: 0;
                    width: 100%;
                    height: 100%;
                    z-index: 1;
                }
                .sppb-rating-custom-half i.half-overlay {
                    color: ' . (!empty($settings->rating_color) ? $settings->rating_color : '#fbbf24') . ';
                    position: absolute;
                    top: 0;
                    left: 0;
                    width: ' . (!empty($settings->rating_size) ? ('calc(' . $settings->rating_size . ' / 2)') : '0.6em') . ';
                    height: 100%;
                    z-index: 1;
                    overflow: hidden;
                }
            ';
        }
        return $css;
    }

    /**
     * Load external scripts.
     *
     * @return 	array
     * @since 	5.0.0
     */
    public function scripts()
    {
        return [ Uri::base(true) . '/components/com_sppagebuilder/assets/js/addons/dynamic_content_text.js' ];
    }

    public static function getTemplate() {
		$lodash = new Lodash('#sppb-addon-{{ data.id }}');
		$output  = '<style type="text/css">';

		$output .= $lodash->generateTransformCss('', 'data.transform');
		$output .= $lodash->typography('.sppb-dynamic-content-text', 'data.typography');

		$output .= $lodash->color('color', '.sppb-content-truncation-show', 'data.content_truncation_action_text_color');
		$output .= $lodash->typography('.sppb-content-truncation-show', 'data.content_truncation_action_typography');


        $output .= '<# if (data.button_type == "custom") { #>';
		$output .= $lodash->color('color', '#btn-{{ data.id }}', 'data.button_color');
		$output .= $lodash->color('color', '#btn-{{ data.id }}:hover', 'data.button_color_hover');
		$output .= $lodash->color('background-color', '#btn-{{ data.id }}:hover', 'data.button_background_hover_color');
		$output .= $lodash->spacing('padding', '#btn-{{ data.id }}.sppb-btn-custom', 'data.button_padding');
		$output .= '<# if (data.appearance == "outline") { #>';
		$output .= '#btn-{{ data.id }} {background-color: transparent;}';
		$output .= $lodash->unit('border-color', '#btn-{{ data.id }}', 'data.button_border_color', '', false);
		$output .= $lodash->unit('border-color', '#btn-{{ data.id }}:hover', 'data.button_border_hover_color', '', false);
		$output .= '<# } else if (data.appearance == "gradient") { #>';
		$output .= '#btn-{{ data.id }} {border: none;}';
		$output .= $lodash->color('background-color', '#btn-{{ data.id }}', 'data.button_background_gradient');
		$output .= $lodash->color('background-color', '#btn-{{ data.id }}:hover', 'data.button_background_gradient_hover');
		$output .= '<# } else { #>';
		$output .= $lodash->color('background-color', '#btn-{{ data.id }}', 'data.button_background_color');
		$output .= $lodash->color('background-color', '#btn-{{ data.id }}:hover', 'data.button_background_color_hover');
		$output .= '<# } #>';
		$output .= '<# } #>';

		$output .= '<# if (data.button_type == "link") { #>';
		$output .= '#btn-{{ data.id }} {padding: 0; border-width: 0; text-decoration: none; border-radius: 0;}';
		$output .= $lodash->color('color', '#btn-{{ data.id }}', 'data.link_button_color');
		$output .= $lodash->unit('border-color', '#btn-{{ data.id }}', 'data.link_button_border_color', '', false);
		$output .= $lodash->unit('border-bottom-width', '#btn-{{ data.id }}', 'data.link_button_border_width', 'px');
		$output .= $lodash->unit('padding-bottom', '#btn-{{ data.id }}', 'data.link_button_padding_bottom', 'px');
		$output .= $lodash->color('color', '#btn-{{ data.id }}:hover, #btn-{{ data.id }}:focus', 'data.link_button_hover_color');
		$output .= $lodash->unit('border-color', '#btn-{{ data.id }}:hover, #btn-{{ data.id }}:focus', 'data.link_button_border_hover_color', '', false);
		$output .= '<# } #>';

		$output .= '</style>';

		return $output;
	}
}
