register_title_section_controls(); $this->register_animation_section_controls(); $this->register_text_styles_section_controls(); $this->register_animated_text_effect_section_controls(); } /** * Render widget output on the frontend */ protected function render() { $settings = $this->get_settings_for_display(); $tag = $settings['marqueex_heading_tag'] ?? 'h2'; $before = $settings['marqueex_before_text'] ?? ''; $after = $settings['marqueex_after_text'] ?? ''; $texts = $settings['marqueex_animated_texts'] ?? []; $animation = $settings['marqueex_animation_type'] ?? ''; $animationSpeed = $settings['marqueex_animation_speed'] ?? ''; $isPauseOnHover = $settings['marqueex_animation_pause_on_hover'] ?? ''; $textEffectType = $settings['marqueex_animated_text_effect_type'] ?? ''; $pauseBetweenWords = $settings['marqueex_pause_between_words'] ?? ''; $pauseAfterTyped = $settings['marqueex_pause_after_typed'] ?? ''; $delayPerWord = $settings['marqueex_delay_per_word'] ?? ''; $lineType = $settings['marqueex_line_type'] ?? ''; $delayBeforeErase = $settings['marqueex_delay_before_erase'] ?? ''; // Check if MarqueeX Pro is active (single source of truth). $is_pro_active = class_exists('\\Wpxero\\Marqueex\\MarqueeX') && \Wpxero\Marqueex\MarqueeX::is_premium_active(); // Pro animation types $pro_animations = ['rotation-3d', 'construct', 'twist', 'line', 'wave', 'swing', 'tilt', 'lean']; $pro_effects = ['marqueex-gradient-text', 'marqueex-masked-text']; // Fallback to basic animation if Pro feature is used without Pro plugin if (!$is_pro_active && in_array($animation, $pro_animations)) { $animation = 'slide'; } // Fallback to basic effect if Pro feature is used without Pro plugin if (!$is_pro_active && in_array($textEffectType, $pro_effects)) { $textEffectType = 'fill'; } $slideDirection = ''; if ($animation === 'slide') { $slideDirection = $settings['marqueex_slide_vertical_direction'] ?? ''; } elseif ($animation === 'slide-horizontal') { $slideDirection = $settings['marqueex_slide_horizontal_direction'] ?? ''; } ?>