PluginProbe
Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits / 3.1.2
Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits v3.1.2
3.2.2 3.2.3 3.2.1 3.2.0 3.1.9 3.1.8 3.1.7 3.1.6 3.1.5 3.1.4 3.1.3 3.1.2 3.1.1 3.1.0 3.0.9 trunk 1.0.6 1.0.7 1.0.8 1.0.9 1.1.0 1.1.1 1.1.3 1.1.4 1.1.5 All 174 releases
master-addons / inc / modules / utilities / reading-progress-bar / reading-progress-bar.php

reading-progress-bar.php in Master Addons for Elementor – Elementor Addons, Widgets, Mega Menu Builder, Popup Builder, Widget Builder & Template Kits 3.1.2, at inc/modules/utilities/reading-progress-bar/reading-progress-bar.php

340 lines 11.5 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2
3 namespace MasterAddons\Modules\Utilities;
4
5 // Elementor Classes
6 use \Elementor\Plugin;
7 use \Elementor\Controls_Manager;
8
9 use MasterAddons\Inc\Classes\Helper;
10
11 /**
12 * Author Name: Liton Arefin
13 * Author URL: https://jeweltheme.com
14 * Date: 10/12/19
15 */
16
17 // Exit if accessed directly.
18 if (!defined('ABSPATH')) {
19 exit;
20 }
21
22 /**
23 * Master Addons: Content Reading Progress bar & Scroll Indicator
24 */
25 if (!class_exists('MasterAddons\Modules\Utilities\ReadingProgressBar')) {
26 class ReadingProgressBar
27 {
28
29 private static $_instance = null;
30
31 public function __construct()
32 {
33 add_action('elementor/documents/register_controls', [$this, 'jltma_rpb_register_controls'], 10);
34 add_action('wp_footer', [$this, 'jltma_reading_progress_bar_render']);
35 }
36
37 public function jltma_rpb_register_controls($element)
38 {
39 // Skip for popup post types — reading progress bar is irrelevant for popups
40 if (method_exists($element, 'get_name') && $element->get_name() === 'jltma_popup') {
41 return;
42 }
43
44 // Use the document's actual settings tab (Post uses 'content', Library\Page uses 'settings')
45 $tabs = $element->get_tabs_controls();
46 $tab = isset($tabs[Controls_Manager::TAB_SETTINGS])
47 ? Controls_Manager::TAB_SETTINGS
48 : array_keys($tabs)[0];
49
50 $element->start_controls_section(
51 'jltma_reading_progress_bar_section',
52 [
53 'tab' => $tab,
54 'label' => esc_html__('Reading Progress Bar ', 'master-addons' ) . JLTMA_EXTENSION_BADGE
55 ]
56 );
57
58 $element->add_control(
59 'jltma_enable_reading_progress_bar',
60 [
61 'type' => Controls_Manager::SWITCHER,
62 'label' => esc_html__('Enable Reading Progress Bar', 'master-addons' ),
63 'default' => '',
64 'label_on' => esc_html__('Yes', 'master-addons' ),
65 'label_off' => esc_html__('No', 'master-addons' ),
66 'return_value' => 'yes'
67 ]
68 );
69
70
71 $element->add_control(
72 'jltma_reading_progress_bar_position',
73 [
74 'label' => esc_html__('Position', 'master-addons' ),
75 'type' => Controls_Manager::SELECT,
76 'default' => 'top',
77 'label_block' => false,
78 'options' => [
79 'top' => esc_html__('Top', 'master-addons' ),
80 'bottom' => esc_html__('Bottom', 'master-addons' ),
81 ],
82 'condition' => [
83 'jltma_enable_reading_progress_bar' => 'yes',
84 ],
85
86 'selectors' => [
87 '.ma-el-page-scroll-indicator.bottom' => 'top:inherit !important; bottom:0;',
88 '.ma-el-page-scroll-indicator.top' => 'top:0px;',
89 '.logged-in.admin-bar .ma-el-page-scroll-indicator.top' => 'top:32px;',
90 ],
91
92 ]
93 );
94
95
96 $element->add_control(
97 'jltma_reading_progress_bar_height',
98 [
99 'label' => esc_html__('Height', 'master-addons' ),
100 'type' => Controls_Manager::SLIDER,
101 'size_units' => ['px'],
102 'range' => [
103 'px' => [
104 'min' => 0,
105 'max' => 100,
106 'step' => 1,
107 ],
108 ],
109 'default' => [
110 'unit' => 'px',
111 'size' => 5,
112 ],
113 'selectors' => [
114 '.ma-el-page-scroll-indicator, .ma-el-scroll-indicator' => 'height: {{SIZE}}{{UNIT}}',
115 ],
116 'condition' => [
117 'jltma_enable_reading_progress_bar' => 'yes',
118 ],
119 ]
120 );
121
122 $element->add_control(
123 'jltma_reading_progress_bar_bg_color',
124 [
125 'label' => esc_html__('Background Color', 'master-addons' ),
126 'type' => Controls_Manager::COLOR,
127 'default' => '#fff',
128 'selectors' => [
129 '.ma-el-page-scroll-indicator' => 'background: {{VALUE}}',
130 ],
131 'condition' => [
132 'jltma_enable_reading_progress_bar' => 'yes',
133 ],
134 ]
135 );
136
137 $element->add_control(
138 'jltma_reading_progress_bar_fill_color',
139 [
140 'label' => esc_html__('Fill Color', 'master-addons' ),
141 'type' => Controls_Manager::COLOR,
142 'default' => '#007bff',
143 'selectors' => [
144 '.ma-el-scroll-indicator' => 'background: {{VALUE}}',
145 ],
146 'condition' => [
147 'jltma_enable_reading_progress_bar' => 'yes',
148 ],
149 ]
150 );
151
152 $element->add_control(
153 'jltma_reading_progress_bar_animation_speed',
154 [
155 'label' => esc_html__('Animation Speed', 'master-addons' ),
156 'type' => Controls_Manager::SLIDER,
157 'size_units' => ['px'],
158 'range' => [
159 'px' => [
160 'min' => 0,
161 'max' => 1000,
162 'step' => 1,
163 ],
164 ],
165 'default' => [
166 'unit' => 'px',
167 'size' => 50,
168 ],
169 'selectors' => [
170 '.ma-el-scroll-indicator' => 'transition: width {{SIZE}}ms ease;',
171 ],
172 'condition' => [
173 'jltma_enable_reading_progress_bar' => 'yes',
174 ],
175 ]
176 );
177
178 $element->end_controls_section();
179 }
180
181
182 public function jltma_reading_progress_bar_styles()
183 {
184 if (did_action('elementor/loaded')) {
185
186 $page_settings_manager = \Elementor\Core\Settings\Manager::get_settings_managers('page');
187 $page_settings_model = $page_settings_manager->get_model(get_the_ID());
188
189 $jltma_r_p_b_height = $page_settings_model->get_settings('jltma_reading_progress_bar_height');
190 $jltma_r_p_b_bg_color = $page_settings_model->get_settings('jltma_reading_progress_bar_bg_color');
191 $jltma_r_p_b_fill_color = $page_settings_model->get_settings('jltma_reading_progress_bar_fill_color');
192 $jltma_r_p_b_animation_speed = $page_settings_model->get_settings('jltma_reading_progress_bar_animation_speed');
193 $jltma_rbp_position = $page_settings_model->get_settings('jltma_reading_progress_bar_position');
194
195 // $jltma_r_p_b_custom_css = "";
196
197 $jltma_r_p_b_custom_css = ".ma-el-page-scroll-indicator{ position: sticky;}";
198 if ($jltma_r_p_b_fill_color != "") {
199 if(!$jltma_r_p_b_bg_color) $jltma_r_p_b_bg_color = 'transparent';
200 $jltma_r_p_b_custom_css .= ".ma-el-page-scroll-indicator{ background: {$jltma_r_p_b_bg_color};}
201 .ma-el-scroll-indicator{ background: {$jltma_r_p_b_fill_color};}
202 .ma-el-page-scroll-indicator, .ma-el-scroll-indicator{ height: {$jltma_r_p_b_height['size']}px;}";
203 }
204
205 if (isset($jltma_rbp_position) && $jltma_rbp_position != "") {
206 if ($jltma_rbp_position == "top") {
207 $jltma_r_p_b_custom_css .= '.ma-el-page-scroll-indicator{top:0px;}';
208 } else {
209 $jltma_r_p_b_custom_css .= '.ma-el-page-scroll-indicator{top:inherit !important; bottom:0;}';
210 }
211 }
212
213 if (Helper::jltma_elementor()->editor->is_edit_mode() || Helper::jltma_elementor()->preview->is_preview_mode()) {
214 if ($jltma_rbp_position == "top") {
215 $jltma_r_p_b_custom_css .= '.ma-el-page-scroll-indicator{top:0px;}';
216 } else {
217 $jltma_r_p_b_custom_css .= '.ma-el-page-scroll-indicator{top:inherit !important; bottom:0;}';
218 }
219 }
220 // Inline CSS through the enqueue API (late-printed in the footer) instead of a hardcoded <style> tag.
221 wp_register_style('jltma-reading-progress-bar', false, array(), JLTMA_VER);
222 wp_enqueue_style('jltma-reading-progress-bar');
223 wp_add_inline_style('jltma-reading-progress-bar', wp_strip_all_tags($jltma_r_p_b_custom_css));
224 }
225 }
226
227
228 public function jltma_reading_progress_bar_render()
229 {
230
231 $document = Helper::jltma_elementor()->documents->get(get_the_ID());
232
233 if (!$document) return;
234
235 $reading_progress_bar = $document->get_settings('jltma_enable_reading_progress_bar');
236
237 if (empty($reading_progress_bar)) return;
238
239 if (did_action('elementor/loaded')) {
240
241 $page_settings_manager = \Elementor\Core\Settings\Manager::get_settings_managers('page');
242 $page_settings_model = $page_settings_manager->get_model(get_the_ID());
243
244 $scrollbar_position = $page_settings_model->get_settings('jltma_reading_progress_bar_position');
245 $jltma_scroll_pos = ($scrollbar_position) ? esc_attr($scrollbar_position) : "";
246
247 if ($page_settings_model->get_settings('jltma_enable_reading_progress_bar') == 'yes') {
248
249 $jltma_rpb_js = '
250 (function() {
251 "use strict";
252 function initProgressBar() {
253 // Remove any existing progress bar
254 var existing = document.querySelector(".ma-el-page-scroll-indicator");
255 if (existing) existing.remove();
256
257 // Create progress bar directly as child of body
258 var progressBar = document.createElement("div");
259 progressBar.className = "ma-el-page-scroll-indicator ' . esc_attr($jltma_scroll_pos) . '";
260 progressBar.innerHTML = \'<div class="ma-el-scroll-indicator"></div>\';
261 document.body.appendChild(progressBar);
262
263 window.onscroll = function () { scrollProgress() };
264 scrollProgress(); // Initial call
265
266 function scrollProgress() {
267 var indicator = document.querySelector(".ma-el-page-scroll-indicator > .ma-el-scroll-indicator");
268 if (!indicator) return;
269 var currentState = document.body.scrollTop || document.documentElement.scrollTop;
270 var pageHeight = document.documentElement.scrollHeight - document.documentElement.clientHeight;
271 var scrollStatePercentage = pageHeight > 0 ? (currentState / pageHeight) * 100 : 0;
272 indicator.style.width = scrollStatePercentage + "%";
273 }
274 }
275
276 // Run after DOM is ready
277 if (document.readyState === "loading") {
278 document.addEventListener("DOMContentLoaded", initProgressBar);
279 } else {
280 initProgressBar();
281 }
282 })();
283 ';
284 // Output through the enqueue API (footer) instead of a hardcoded <script> tag.
285 wp_register_script('jltma-reading-progress-bar', false, array(), JLTMA_VER, true);
286 wp_enqueue_script('jltma-reading-progress-bar');
287 wp_add_inline_script('jltma-reading-progress-bar', $jltma_rpb_js);
288 } // Enable Progress Bar
289
290
291 $jltma_r_p_b_height_setting = $page_settings_model->get_settings('jltma_reading_progress_bar_height');
292 $jltma_r_p_b_height = esc_attr($jltma_r_p_b_height_setting['size'] ?? 4);
293 $jltma_r_p_b_bg_color = esc_attr($page_settings_model->get_settings('jltma_reading_progress_bar_bg_color'));
294 $jltma_r_p_b_fill_color = esc_attr($page_settings_model->get_settings('jltma_reading_progress_bar_fill_color'));
295 $jltma_r_p_b_animation_speed = $page_settings_model->get_settings('jltma_reading_progress_bar_animation_speed');
296 $jltma_rbp_position = sanitize_text_field($page_settings_model->get_settings('jltma_reading_progress_bar_position'));
297
298 $jltma_r_p_b_custom_css = "";
299 // Base styles matching Happy Addons' proven approach - high z-index and explicit positioning
300 $jltma_r_p_b_custom_css .= ".ma-el-page-scroll-indicator{ position: fixed; left: 0; top: 0; width: 100%; z-index: 999999; opacity: 1 !important; visibility: visible !important;}";
301 $jltma_r_p_b_custom_css .= ".ma-el-scroll-indicator{ width: 0%; }";
302 if ( $jltma_r_p_b_fill_color != "") {
303 if(!$jltma_r_p_b_bg_color) $jltma_r_p_b_bg_color = 'transparent';
304 $jltma_r_p_b_custom_css .= ".ma-el-page-scroll-indicator{ background: {$jltma_r_p_b_bg_color};}
305 .ma-el-scroll-indicator{ background: {$jltma_r_p_b_fill_color};}
306 .ma-el-page-scroll-indicator, .ma-el-scroll-indicator{ height: {$jltma_r_p_b_height}px;}";
307 }
308
309 // Position: bottom overrides the default top: 0
310 if ($jltma_rbp_position === "bottom") {
311 $jltma_r_p_b_custom_css .= '.ma-el-page-scroll-indicator{top:auto; bottom:0;}';
312 }
313
314 // Admin bar offset for logged-in users (frontend and editor)
315 if ($jltma_rbp_position !== "bottom") {
316 $jltma_r_p_b_custom_css .= '.logged-in.admin-bar .ma-el-page-scroll-indicator{top:32px;}';
317 }
318
319 // Inline CSS through the enqueue API (late-printed in the footer) instead of a hardcoded <style> tag.
320 wp_register_style('jltma-reading-progress-bar', false, array(), JLTMA_VER);
321 wp_enqueue_style('jltma-reading-progress-bar');
322 wp_add_inline_style('jltma-reading-progress-bar', wp_strip_all_tags($jltma_r_p_b_custom_css));
323 }
324 }
325
326
327 public static function instance()
328 {
329 if (is_null(self::$_instance)) {
330 self::$_instance = new self();
331 }
332 return self::$_instance;
333 }
334 }
335 }
336
337 if (class_exists('MasterAddons\Modules\Utilities\ReadingProgressBar')) {
338 ReadingProgressBar::instance();
339 }
340