' . __('Settings') . ''; array_unshift( $links, $settings_link ); return $links; } function plugin_menu_link(){ add_submenu_page( 'options-general.php', __( 'Smooth Scroll', 'wpmss' ), __( 'Smooth Scroll', 'wpmss' ), 'manage_options', basename( __FILE__ ), [ $this, 'admin_options_page' ] ); add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), [ $this, 'filter_plugin_actions' ], 10, 2 ); } function plugin_init(){ $this->settings = get_option( 'wpmss_settings', [] ); if( ! isset( $this->settings['general']['timestamp'] ) ){ $this->settings['js_library'] = 'darkroomengineering'; $this->settings['general']['timestamp'] = time(); $this->settings['general']['pulseAlgorithm'] = 1; $this->settings['general']['keyboardSupport'] = 1; update_option( 'wpmss_settings', $this->settings ); }else{ if( ! isset( $this->settings['js_library'] ) ){ $this->settings['js_library'] = 'gblazex'; } } $this->uploads = wp_get_upload_dir(); $this->process_settings(); add_action( 'wp_enqueue_scripts', [ $this, 'plugin_scripts_load' ] ); } function process_settings(){ $unsanitized_settings = $this->settings; $this->settings = [ 'js_library' => '', 'general' => [], 'lenis' => [], ]; if( empty( $unsanitized_settings['js_library'] ) ){ $this->settings['js_library'] = 'darkroomengineering'; }else{ $this->settings['js_library'] = in_array( $unsanitized_settings['js_library'], [ 'gblazex', 'darkroomengineering' ] ) ? $unsanitized_settings['js_library'] : 'darkroomengineering'; } $this->settings['general']['timestamp'] = empty( $unsanitized_settings['general']['timestamp'] ) ? time() : intval( $unsanitized_settings['general']['timestamp'] ); $this->settings['lenis']['lerp'] = empty( $unsanitized_settings['lenis']['lerp'] ) ? 0.1 : floatval( $unsanitized_settings['lenis']['lerp'] ); $this->settings['lenis']['duration'] = empty( $unsanitized_settings['lenis']['duration'] ) ? 1.2 : floatval( $unsanitized_settings['lenis']['duration'] ); $this->settings['lenis']['wheelMultiplier'] = empty( $unsanitized_settings['lenis']['wheelMultiplier'] ) ? 1 : floatval( $unsanitized_settings['lenis']['wheelMultiplier'] ); $this->settings['lenis']['easing'] = empty( $unsanitized_settings['lenis']['easing'] ) ? 'Math.min(1,1.001-Math.pow(2,-10*x))' : sanitize_text_field( $unsanitized_settings['lenis']['easing'] ); $this->settings['general']['frameRate'] = empty( $unsanitized_settings['general']['frameRate'] ) ? 150 : intval( $unsanitized_settings['general']['frameRate'] ); $this->settings['general']['animationTime'] = empty( $unsanitized_settings['general']['animationTime'] ) ? 1000 : intval( $unsanitized_settings['general']['animationTime'] ); $this->settings['general']['stepSize'] = empty( $unsanitized_settings['general']['stepSize'] ) ? 100 : intval( $unsanitized_settings['general']['stepSize'] ); $this->settings['general']['pulseAlgorithm'] = empty( $unsanitized_settings['general']['pulseAlgorithm'] ) ? 0 : intval( $unsanitized_settings['general']['pulseAlgorithm'] ); $this->settings['general']['pulseScale'] = empty( $unsanitized_settings['general']['pulseScale'] ) ? 4 : intval( $unsanitized_settings['general']['pulseScale'] ); $this->settings['general']['pulseNormalize'] = empty( $unsanitized_settings['general']['pulseNormalize'] ) ? 1 : intval( $unsanitized_settings['general']['pulseNormalize'] ); $this->settings['general']['accelerationDelta'] = empty( $unsanitized_settings['general']['accelerationDelta'] ) ? 50 : intval( $unsanitized_settings['general']['accelerationDelta'] ); $this->settings['general']['accelerationMax'] = empty( $unsanitized_settings['general']['accelerationMax'] ) ? 3 : intval( $unsanitized_settings['general']['accelerationMax'] ); $this->settings['general']['keyboardSupport'] = empty( $unsanitized_settings['general']['keyboardSupport'] ) ? 0 : intval( $unsanitized_settings['general']['keyboardSupport'] ); $this->settings['general']['arrowScroll'] = empty( $unsanitized_settings['general']['arrowScroll'] ) ? 50 : intval( $unsanitized_settings['general']['arrowScroll'] ); $this->settings['general']['allowedBrowsers'] = empty( $unsanitized_settings['general']['allowedBrowsers'] ) ? [ 'IEWin7', 'Chrome', 'Safari' ] : array_intersect( [ 'Mobile', 'IEWin7', 'Edge', 'Chrome', 'Safari', 'Firefox', 'other' ], $unsanitized_settings['general']['allowedBrowsers'] ); if( ( $this->settings['js_library'] == 'gblazex' && ! file_exists( $this->uploads['basedir'] . '/wpmss/wpmss.min.js' ) ) || ( $this->settings['js_library'] == 'darkroomengineering' && ! file_exists( $this->uploads['basedir'] . '/wpmss/lenis-init.min.js' ) ) ){ $this->save_js_config(); } } function plugin_scripts_load(){ if( ! empty( $_GET['ct_builder'] ) ) return; // skip for oxygen editor switch( $this->settings['js_library'] ){ case 'darkroomengineering': wp_enqueue_script( 'lenis', plugins_url( 'js/lenis.min.js', __FILE__ ), [], '1.1.19', 1 ); wp_enqueue_script( 'lenis-init', $this->uploads['baseurl'] . '/wpmss/lenis-init.min.js', ['lenis'], $this->settings['general']['timestamp'], 1 ); break; case 'gblazex': wp_enqueue_script( 'wpmssab', $this->uploads['baseurl'] . '/wpmss/wpmssab.min.js', [], $this->settings['general']['timestamp'], 1 ); wp_enqueue_script( 'SmoothScroll', plugins_url( 'js/SmoothScroll.min.js', __FILE__ ), ['wpmssab'], '1.5.1', 1 ); wp_enqueue_script( 'wpmss', $this->uploads['baseurl'] . '/wpmss/wpmss.min.js', ['SmoothScroll'], $this->settings['general']['timestamp'], 1 ); break; } } function plugin_admin_tabs( $current = 'general' ){ $tabs = [ 'general' => __('General'), 'info' => __('Help') ]; ?>
uploads['basedir'] . '/wpmss' ) ){ mkdir( $this->uploads['basedir'] . '/wpmss', 0777, true ); } if( $this->settings['js_library'] == 'darkroomengineering' ){ $content = sprintf( 'window.lenisInstance=new Lenis({' . 'autoRaf:true,' . 'lerp:%s,' . 'duration:%s,' . 'wheelMultiplier:%s,' . 'easing:x=>%s' . '})', floatval( $this->settings['lenis']['lerp'] ), floatval( $this->settings['lenis']['duration'] ), floatval( $this->settings['lenis']['wheelMultiplier'] ), esc_html( $this->settings['lenis']['easing'] ), ); file_put_contents( $this->uploads['basedir'] . '/wpmss/lenis-init.min.js', $content ); } if( $this->settings['js_library'] == 'gblazex' ){ $allowedBrowsers = sprintf( 'var allowedBrowsers=["%s"];', implode( '","', $this->settings['general']['allowedBrowsers'] ) ); file_put_contents( $this->uploads['basedir'] . '/wpmss/wpmssab.min.js', $allowedBrowsers ); $content = sprintf( 'SmoothScroll({'. 'frameRate:%d,'. 'animationTime:%d,'. 'stepSize:%d,'. 'pulseAlgorithm:%d,'. 'pulseScale:%d,'. 'pulseNormalize:%d,'. 'accelerationDelta:%d,'. 'accelerationMax:%d,'. 'keyboardSupport:%d,'. 'arrowScroll:%d,'. '})', intval( $this->settings['general']['frameRate'] ), intval( $this->settings['general']['animationTime'] ), intval( $this->settings['general']['stepSize'] ), intval( $this->settings['general']['pulseAlgorithm'] ), intval( $this->settings['general']['pulseScale'] ), intval( $this->settings['general']['pulseNormalize'] ), intval( $this->settings['general']['accelerationDelta'] ), intval( $this->settings['general']['accelerationMax'] ), intval( $this->settings['general']['keyboardSupport'] ), intval( $this->settings['general']['arrowScroll'] ) ); file_put_contents( $this->uploads['basedir'] . '/wpmss/wpmss.min.js', $content ); } } function admin_options_page(){ $tab = isset( $_GET['tab'] ) ? $_GET['tab'] : 'general'; if( ! empty( $_POST['wpmss_nonce'] ) && check_admin_referer( 'wpmss_data', 'wpmss_nonce' ) ){ $this->settings = $_POST; $this->process_settings(); update_option( 'wpmss_settings', $this->settings ); $this->save_js_config(); } ?>

' . __('Settings saved.') . '

' ?>
plugin_admin_tabs( $tab ); switch( $tab ): case 'general': $this->plugin_general_options(); break; case 'info': $this->plugin_info_options(); break; endswitch; ?>

', '' ) ?>
0.1
s   1.2
1
Math.min(1,1.001-Math.pow(2,-10*x))

[Hz]  150
[ms]  1000
[px]  100

ratio of "tail" to "acceleration"', 'wpmss' ) ?>

settings['general']['pulseAlgorithm'] ? 'checked="checked"' : '' ?> id="q_field_35">   on
4
1

50
3

settings['general']['keyboardSupport'] ? 'checked="checked"' : '' ?> id="q_field_75">   on
[px]  50

IEWin7, Chrome, Safari