Changeset 3057884
- Timestamp:
- 03/24/2024 09:57:57 PM (2 years ago)
- Location:
- safety-exit
- Files:
-
- 58 added
- 6 deleted
- 20 edited
- 1 copied
-
tags/1.7.0 (copied) (copied from safety-exit/trunk)
-
tags/1.7.0/assets/css/admin.css (modified) (1 diff)
-
tags/1.7.0/assets/css/frontend.css (modified) (1 diff)
-
tags/1.7.0/assets/js/admin.js (modified) (1 diff)
-
tags/1.7.0/assets/js/fontawesome-iconpicker.min.js (deleted)
-
tags/1.7.0/assets/js/frontend.js (modified) (1 diff)
-
tags/1.7.0/assets/js/vanilla-picker.min.js (deleted)
-
tags/1.7.0/assets/vendor (added)
-
tags/1.7.0/assets/vendor/fontawesome-iconpicker.min.js (added)
-
tags/1.7.0/assets/vendor/vanilla-picker.min.js (added)
-
tags/1.7.0/composer.json (added)
-
tags/1.7.0/composer.lock (added)
-
tags/1.7.0/lib/Safety_Exit_Admin.php (modified) (2 diffs)
-
tags/1.7.0/lib/Safety_Exit_Frontend.php (modified) (3 diffs)
-
tags/1.7.0/lib/views/frontend-button.php (deleted)
-
tags/1.7.0/phpunit.xml (added)
-
tags/1.7.0/postcss.config.js (modified) (1 diff)
-
tags/1.7.0/readme.txt (modified) (4 diffs)
-
tags/1.7.0/safety-exit.php (modified) (3 diffs)
-
tags/1.7.0/src/css/frontend.css (modified) (4 diffs)
-
tags/1.7.0/src/js (added)
-
tags/1.7.0/src/js/admin.js (added)
-
tags/1.7.0/src/js/frontend.js (added)
-
tags/1.7.0/tests (added)
-
tags/1.7.0/tests/Pest.php (added)
-
tags/1.7.0/tests/TestCase.php (added)
-
tags/1.7.0/tests/Unit (added)
-
tags/1.7.0/tests/Unit/FrontendTest.php (added)
-
tags/1.7.0/vendor (added)
-
tags/1.7.0/vendor/autoload.php (added)
-
tags/1.7.0/vendor/composer (added)
-
tags/1.7.0/vendor/composer/ClassLoader.php (added)
-
tags/1.7.0/vendor/composer/InstalledVersions.php (added)
-
tags/1.7.0/vendor/composer/LICENSE (added)
-
tags/1.7.0/vendor/composer/autoload_classmap.php (added)
-
tags/1.7.0/vendor/composer/autoload_namespaces.php (added)
-
tags/1.7.0/vendor/composer/autoload_psr4.php (added)
-
tags/1.7.0/vendor/composer/autoload_real.php (added)
-
tags/1.7.0/vendor/composer/autoload_static.php (added)
-
tags/1.7.0/vendor/composer/installed.json (added)
-
tags/1.7.0/vendor/composer/installed.php (added)
-
tags/1.7.0/vendor/composer/platform_check.php (added)
-
tags/1.7.0/vite.config.js (added)
-
trunk/assets/css/admin.css (modified) (1 diff)
-
trunk/assets/css/frontend.css (modified) (1 diff)
-
trunk/assets/js/admin.js (modified) (1 diff)
-
trunk/assets/js/fontawesome-iconpicker.min.js (deleted)
-
trunk/assets/js/frontend.js (modified) (1 diff)
-
trunk/assets/js/vanilla-picker.min.js (deleted)
-
trunk/assets/vendor (added)
-
trunk/assets/vendor/fontawesome-iconpicker.min.js (added)
-
trunk/assets/vendor/vanilla-picker.min.js (added)
-
trunk/composer.json (added)
-
trunk/composer.lock (added)
-
trunk/lib/Safety_Exit_Admin.php (modified) (2 diffs)
-
trunk/lib/Safety_Exit_Frontend.php (modified) (3 diffs)
-
trunk/lib/views/frontend-button.php (deleted)
-
trunk/phpunit.xml (added)
-
trunk/postcss.config.js (modified) (1 diff)
-
trunk/readme.txt (modified) (4 diffs)
-
trunk/safety-exit.php (modified) (3 diffs)
-
trunk/src/css/frontend.css (modified) (4 diffs)
-
trunk/src/js (added)
-
trunk/src/js/admin.js (added)
-
trunk/src/js/frontend.js (added)
-
trunk/tests (added)
-
trunk/tests/Pest.php (added)
-
trunk/tests/TestCase.php (added)
-
trunk/tests/Unit (added)
-
trunk/tests/Unit/FrontendTest.php (added)
-
trunk/vendor (added)
-
trunk/vendor/autoload.php (added)
-
trunk/vendor/composer (added)
-
trunk/vendor/composer/ClassLoader.php (added)
-
trunk/vendor/composer/InstalledVersions.php (added)
-
trunk/vendor/composer/LICENSE (added)
-
trunk/vendor/composer/autoload_classmap.php (added)
-
trunk/vendor/composer/autoload_namespaces.php (added)
-
trunk/vendor/composer/autoload_psr4.php (added)
-
trunk/vendor/composer/autoload_real.php (added)
-
trunk/vendor/composer/autoload_static.php (added)
-
trunk/vendor/composer/installed.json (added)
-
trunk/vendor/composer/installed.php (added)
-
trunk/vendor/composer/platform_check.php (added)
-
trunk/vite.config.js (added)
Legend:
- Unmodified
- Added
- Removed
-
safety-exit/tags/1.7.0/assets/css/admin.css
r2934107 r3057884 1 #sftExt_color_picker_btn_bg_color,#sftExt_color_picker_btn_font_color{padding:10px 20px;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);display:inline-block;color:#333;text-align:center;cursor:pointer}.sftExt_alert{color:#000000;background:#FFCCCC}.sftExt_alert th{padding-left:10px}1 #sftExt_color_picker_btn_bg_color,#sftExt_color_picker_btn_font_color{padding:10px 20px;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px #00000012;display:inline-block;color:#333;text-align:center;cursor:pointer}.sftExt_alert{color:#000;background:#FFCCCC}.sftExt_alert th{padding-left:10px} -
safety-exit/tags/1.7.0/assets/css/frontend.css
r2934107 r3057884 1 #sftExt-frontend-button{ position:fixed;border:none;display:inline-block;cursor:pointer;z-index:9999;left:20px;top:20px;padding:10px 20px;font-family:inherit;width:25px;height:25px}@media screen,speech{#sftExt-frontend-button .sr-only{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}}#sftExt-frontend-button.round{border-radius:50%;padding:10px;text-align:center;width:45px;height:45px}#sftExt-frontend-button.round>i{position:relative;display:block;font-size:25px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}#sftExt-frontend-button.square{border-radius:0;padding:10px;text-align:center;width:45px;height:45px}#sftExt-frontend-button.square>i{position:relative;display:block;font-size:25px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}#sftExt-frontend-button.rectangle{padding:10px 20px;height:auto;width:auto;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-box;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;flex-direction:column}#sftExt-frontend-button.rectangle:before,#sftExt-frontend-button.rectangle:after{content:'';-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1}#sftExt-frontend-button.rectangle .sftExt-inner{position:relative;text-align:center}#sftExt-frontend-button.rectangle .sftExt-inner>i{margin-right:10px}#sftExt-frontend-button.rectangle .sftExt-inner:before{position:absolute;left:0;top:0;height:20px;width:20px}#sftExt-frontend-button.bottom{top:auto;bottom:20px}#sftExt-frontend-button.top{top:20px}#sftExt-frontend-button.right{left:auto;right:20px}#sftExt-frontend-button.left{left:20px}1 #sftExt-frontend-button{background-color:var(--sftExt_bgColor);color:var(--sftExt_textColor);display:var(--sftExt_active);position:fixed;border:none;cursor:pointer;z-index:9999;left:20px;top:20px;padding:10px 20px;font-family:inherit;width:25px;height:25px}@media print{#sftExt-frontend-button{display:none!important}}@media screen,speech{#sftExt-frontend-button .sr-only{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}}@media (max-width:600px){#sftExt-frontend-button{display:var(--sftExt_activeMobile)}}#sftExt-frontend-button.round{border-radius:50%;padding:10px;text-align:center;width:45px;height:45px}#sftExt-frontend-button.round>i{position:relative;display:block;font-size:25px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}#sftExt-frontend-button.square{border-radius:0;padding:10px;text-align:center;width:45px;height:45px}#sftExt-frontend-button.square>i{position:relative;display:block;font-size:25px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}#sftExt-frontend-button.rectangle{font-size:var(--sftExt_rectangle_fontSize);letter-spacing:var(--sftExt_rectangle_letterSpacing);border-radius:var(--sftExt_rectangle_borderRadius);padding:10px 20px;height:auto;width:auto;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-box;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;flex-direction:column}#sftExt-frontend-button.rectangle:before,#sftExt-frontend-button.rectangle:after{content:"";-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1}#sftExt-frontend-button.rectangle .sftExt-inner{position:relative;text-align:center}#sftExt-frontend-button.rectangle .sftExt-inner>i{margin-right:10px}#sftExt-frontend-button.rectangle .sftExt-inner:before{position:absolute;left:0;top:0;height:20px;width:20px}#sftExt-frontend-button.bottom{top:auto;bottom:20px}#sftExt-frontend-button.top{top:20px}#sftExt-frontend-button.right{left:auto;right:20px}#sftExt-frontend-button.left{left:20px} -
safety-exit/tags/1.7.0/assets/js/admin.js
r2934107 r3057884 1 function calculateContrastRatio(color1, color2) { 2 function parseColor(colorString) { 3 const colorArray = colorString.match(/\d+/g); 4 return colorArray.map(Number); 5 } 6 7 function getLuminance(color) { 8 const normalizedColor = color.map(value => { 9 value /= 255; 10 if (value <= 0.03928) { 11 return value / 12.92; 12 } else { 13 return Math.pow((value + 0.055) / 1.055, 2.4); 14 } 15 }); 16 17 return 0.2126 * normalizedColor[0] + 0.7152 * normalizedColor[1] + 0.0722 * normalizedColor[2]; 18 } 19 20 const colorArray1 = parseColor(color1); 21 const colorArray2 = parseColor(color2); 22 23 const luminance1 = getLuminance(colorArray1); 24 const luminance2 = getLuminance(colorArray2); 25 26 const ratio = (Math.max(luminance1, luminance2) + 0.05) / (Math.min(luminance1, luminance2) + 0.05); 27 28 const aaThreshold = 4.5; 29 const aaaThreshold = 7; 30 31 const passesAA = ratio >= aaThreshold; 32 const passesAAA = ratio >= aaaThreshold; 33 34 return { passesAA, passesAAA }; 35 } 36 37 38 function calcContrastError(color1, color2) { 39 const targetElement = document.querySelector('.sftExt_type'); 40 41 // Insert the new row before the target element 42 let accessibilityResults = calculateContrastRatio(color1, color2); 43 if (accessibilityResults.passesAA && accessibilityResults.passesAAA) { 44 if (document.querySelector('.sftExt_alert')) document.querySelector('.sftExt_alert').remove(); 45 return; 46 } 47 48 // Create a new table row element 49 const newRow = document.createElement('tr'); 50 newRow.classList.add('sftExt_alert'); 51 newRow.innerHTML = `<th>Warning:</th><td>The contrast ratio between the background color and text color does not meet the accessibility standards.<br/>AA: ${accessibilityResults.passesAA ? 'Passing' : 'Failing'}<br/>AAA: ${accessibilityResults.passesAAA ? 'Passing' : 'Failing'}`; 52 53 54 if (targetElement && targetElement.parentNode) { 55 if (document.querySelector('.sftExt_alert')) document.querySelector('.sftExt_alert').remove(); 56 targetElement.parentNode.insertBefore(newRow, targetElement); 57 } 58 } 59 60 61 jQuery(function($){ 62 63 $('#sftExt_type').on('change', function(e){ 64 if($(this).val() == 'rectangle') { 65 $('.rectangle-only').removeClass('hidden') 66 }else{ 67 $('.rectangle-only').addClass('hidden') 68 } 69 if($(this).val() == 'round') { 70 $('.round-only').removeClass('hidden') 71 }else{ 72 $('.round-only').addClass('hidden') 73 } 74 }); 75 // $('.sftExt_show_all').on('change', function(e){ 76 // console.log($(this).val()); 77 // if($(this).val() == 'no') { 78 // $('.sftExt_front_page').show() 79 // $('.sftExt_pages').show() 80 // }else{ 81 // $('.sftExt_front_page').hide() 82 // $('.sftExt_pages').hide() 83 // } 84 // }); 85 $('#sftExt_rectangle_font_size_units').on('change', function(e){ 86 $('.sftExt_units').text($(this).val()); 87 }); 88 89 $('#sftExt_fontawesome_icon_classes_btn').on('click' , function(e){ 90 e.preventDefault(); 91 }); 92 // TODO add button that says "Change Icon" 93 $('#sftExt_fontawesome_icon_classes').iconpicker({ 94 hideOnSelect: false, 95 placement: 'inline', 96 }); 97 $('#sftExt_fontawesome_icon_classes').on('iconpickerSelected', function(e){ 98 $('#sftExt_icon_display i').attr('class', 'fa-3x ' + 99 e.iconpickerInstance.options.fullClassFormatter(e.iconpickerValue)); 100 // $('#sftExt_fontawesome_icon_classes').val() = e.iconpickerInstance.options.fullClassFormatter(e.iconpickerValue); 101 }) 102 var $bgParent = document.querySelector('#sftExt_color_picker_btn_bg_color'); 103 var $fontParent = document.querySelector('#sftExt_color_picker_btn_font_color'); 104 var bg_color_picker = new Picker({ 105 parent: $bgParent, 106 color:$('#sftExt_bg_color').val() 107 }); 108 109 110 var font_color_picker = new Picker({ 111 parent: $fontParent, 112 color:$('#sftExt_font_color').val() 113 }); 114 bg_color_picker.onChange = function(color) { 115 $('#sftExt_bg_color').val(color.rgbaString); 116 calcContrastError(color.rgbaString, font_color_picker.color.rgbaString); 117 $('#sftExt_color_picker_btn_bg_color').css({ 118 'background-color': color.rgbaString 119 }); 120 }; 121 font_color_picker.onChange = function(color) { 122 $('#sftExt_font_color').val(color.rgbaString); 123 calcContrastError(bg_color_picker.color.rgbaString, color.rgbaString); 124 $('#sftExt_color_picker_btn_font_color').css({ 125 'background-color': color.rgbaString 126 }); 127 }; 128 calcContrastError(bg_color_picker.color.rgbaString, font_color_picker.color.rgbaString); 129 }) 130 // sftExt_icon_display 131 132 // sftExt_rectangle_text 1 jQuery(function(n){n("#sftExt_type").on("change",function(t){n(this).val()=="rectangle"?n(".rectangle-only").removeClass("hidden"):n(".rectangle-only").addClass("hidden"),n(this).val()=="round"?n(".round-only").removeClass("hidden"):n(".round-only").addClass("hidden")}),n("#sftExt_rectangle_font_size_units").on("change",function(t){n(".sftExt_units").text(n(this).val())}),n("#sftExt_fontawesome_icon_classes_btn").on("click",function(t){t.preventDefault()}),n("#sftExt_fontawesome_icon_classes").iconpicker({hideOnSelect:!1,placement:"inline"}),n("#sftExt_fontawesome_icon_classes").on("iconpickerSelected",function(t){n("#sftExt_icon_display i").attr("class","fa-3x "+t.iconpickerInstance.options.fullClassFormatter(t.iconpickerValue))});var o=document.querySelector("#sftExt_color_picker_btn_bg_color"),e=document.querySelector("#sftExt_color_picker_btn_font_color"),c=new Picker({parent:o,color:n("#sftExt_bg_color").val()}),r=new Picker({parent:e,color:n("#sftExt_font_color").val()});c.onChange=function(t){n("#sftExt_bg_color").val(t.rgbaString),n("#sftExt_color_picker_btn_bg_color").css({"background-color":t.rgbaString})},r.onChange=function(t){n("#sftExt_font_color").val(t.rgbaString),n("#sftExt_color_picker_btn_font_color").css({"background-color":t.rgbaString})}}); -
safety-exit/tags/1.7.0/assets/js/frontend.js
r2837777 r3057884 1 jQuery(function($){ 2 $('#sftExt-frontend-button').on('click', function(e){ 3 var newTabUrl = $(this).data('new-tab'); 4 var thisTabUrl = $(this).data('url'); 5 6 var win = window.open(newTabUrl, '_blank'); 7 win.focus(); 8 window.location.replace(thisTabUrl); 9 10 }) 11 }) 1 document.addEventListener("DOMContentLoaded",function(){var t=document.getElementById("sftExt-frontend-button");if(window.sftExtBtn.shouldShow)if(t)t.addEventListener("click",function(i){var n=t.dataset.newTab,o=t.dataset.url,a=window.open(n,"_blank");a.focus(),window.location.replace(o)});else{var t=document.createElement("button");t.id="sftExt-frontend-button",t.className=window.sftExtBtn.classes||"",t.setAttribute("data-new-tab",window.sftExtBtn.newTabUrl),t.setAttribute("data-url",window.sftExtBtn.currentTabUrl);var e=document.createElement("div");e.className="sftExt-inner",e.innerHTML=window.sftExtBtn.icon;let n=document.createElement("span");window.sftExtBtn.btnType!="round"&&window.sftExtBtn.btnType!="square"?n.textContent=window.sftExtBtn.text:(n.className="sr-only",n.textContent="Safety Exit"),e.appendChild(n),t.appendChild(e),t.addEventListener("click",function(o){var a=t.dataset.newTab,d=t.dataset.url,s=window.open(a,"_blank");s.focus(),window.location.replace(d)}),document.body.appendChild(t)}}); -
safety-exit/tags/1.7.0/lib/Safety_Exit_Admin.php
r2837777 r3057884 1 1 <?php 2 /** 3 * Creates the submenu item for the plugin. 4 * 5 * @package Custom_Admin_Settings 6 */ 2 namespace SafetyExit; 7 3 8 4 /** … … 73 69 wp_enqueue_style('sftExt-admin-icon-picker', $this->root . 'assets/css/fontawesome-iconpicker.css'); 74 70 wp_enqueue_style('sftExt-admin-admin', $this->root . 'assets/css/admin.css'); 75 wp_enqueue_script('sftExt-admin-color-picker', $this->root . 'assets/ js/vanilla-picker.min.js');76 wp_enqueue_script('sftExt-admin-icon-picker-js', $this->root . 'assets/ js/fontawesome-iconpicker.min.js');71 wp_enqueue_script('sftExt-admin-color-picker', $this->root . 'assets/vendor/vanilla-picker.min.js'); 72 wp_enqueue_script('sftExt-admin-icon-picker-js', $this->root . 'assets/vendor/fontawesome-iconpicker.min.js'); 77 73 wp_register_script('sftExt-admin-js', $this->root . 'assets/js/admin.js', array('jquery', 'sftExt-admin-icon-picker-js', 'sftExt-admin-color-picker')); 78 74 wp_enqueue_script( 'sftExt-admin-js'); -
safety-exit/tags/1.7.0/lib/Safety_Exit_Frontend.php
r2838741 r3057884 1 1 <?php 2 3 namespace SafetyExit; 2 4 /** 3 5 * Handle all frontend stuff … … 13 15 class Safety_Exit_Frontend { 14 16 15 private $pluginRoot;16 17 17 private $buttonInitialized = false; 18 18 19 public function __construct($file) { 20 $this->pluginRoot = $file; 19 private $defaultSettings; 20 21 private $classes = ''; 22 private $displayButton = true; 23 private $icon = ''; 24 private $hideOnMobile = false; 25 26 public function __construct() { 27 28 $this->defaultSettings = wp_parse_args(get_option('sftExt_settings'), array( 29 'sftExt_position' => 'bottom right', 30 'sftExt_fontawesome_icon_classes' => 'fas fa-times', 31 'sftExt_type' => 'rectangle', 32 'sftExt_current_tab_url' => 'https://google.com', 33 'sftExt_new_tab_url' => 'https://google.com', 34 'sftExt_rectangle_text' => 'Safety Exit', 35 'sftExt_rectangle_icon_onOff' => 'yes', 36 'sftExt_rectangle_font_size_units' => 'rem', 37 'sftExt_rectangle_font_size' => '1', 38 'sftExt_bg_color' => 'rgba(58, 194, 208, 1)', 39 'sftExt_font_color' => 'rgba(255, 255, 255, 1)', 40 'sftExt_letter_spacing' => 'inherit', 41 'sftExt_border_radius' => '100', 42 'sftExt_hide_mobile' => '', 43 'sftExt_show_all' => 'yes', 44 'sftExt_front_page' => 'yes', 45 'sftExt_pages' => array() 46 )); 47 48 21 49 } 22 50 public function init() { 23 51 add_action('wp_enqueue_scripts', array($this, 'sftExt_enqueue')); 24 52 do_action( 'qm/debug', 'wp_enqueue_scripts fired' ); 25 add_action( 'wp_body_open', array($this, 'safety_exit_inject'), 100 ); 53 add_action('wp_head', array($this, 'echo_safety_exit_custom_styling')); 54 add_action( 'wp_body_open', array($this, 'echo_safety_exit_html'), 100 ); 26 55 do_action( 'qm/debug', 'wp_body_open fired' ); 27 56 } 57 public function run_setup() { 58 59 if($this->defaultSettings['sftExt_show_all'] == 'no'){ 60 if( !in_array(get_the_ID(), $this->defaultSettings['sftExt_pages'])){ 61 $this->displayButton = false; 62 } else { 63 $this->displayButton = true; 64 } 65 } 66 67 if($this->defaultSettings['sftExt_front_page'] == 'yes' && is_front_page()){ 68 $this->displayButton = true; 69 } else if ($this->defaultSettings['sftExt_front_page'] == 'no' && is_front_page()) { 70 $this->displayButton = false; 71 } 72 73 if($this->defaultSettings['sftExt_hide_mobile'] == 'yes') { 74 $this->hideOnMobile = true; 75 } 76 $this->classes = $this->defaultSettings['sftExt_position'] . ' ' . $this->defaultSettings['sftExt_type']; 77 78 if($this->defaultSettings['sftExt_rectangle_icon_onOff'] == 'yes' && $this->defaultSettings['sftExt_type'] == 'rectangle') { 79 $this->icon = '<i class="' . $this->defaultSettings['sftExt_fontawesome_icon_classes'] . '"></i>'; 80 }else if($this->defaultSettings['sftExt_type'] == 'round' || $this->defaultSettings['sftExt_type'] == 'square'){ 81 $this->icon = '<i class="' . $this->defaultSettings['sftExt_fontawesome_icon_classes'] . '"></i>'; 82 } 83 } 28 84 public function sftExt_enqueue() { 29 wp_enqueue_style('frontendCSS', plugins_url() . '/safety-exit/assets/css/frontend.css'); 30 wp_enqueue_script( 'frontendJs', plugins_url() . '/safety-exit/assets/js/frontend.js', array('jquery') ); 85 if ($this->displayButton) { 86 wp_enqueue_style('frontendCSS', plugins_url() . '/safety-exit/assets/css/frontend.css'); 87 wp_enqueue_script( 'frontendJs', plugins_url() . '/safety-exit/assets/js/frontend.js', array('jquery') ); 88 } 31 89 32 90 $args = wp_parse_args(get_option('sftExt_settings'), array( … … 38 96 } 39 97 } 40 public function safety_exit_inject() { 41 do_action( 'qm/debug', 'frontend-button.php before include' ); 42 include( 'views/frontend-button.php' ); 43 do_action( 'qm/debug', 'frontend-button.php included' ); 98 public function echo_safety_exit_custom_styling() { 99 $this->run_setup(); 100 echo $this->generate_js(); 101 echo $this->generate_css(); 102 } 103 public function echo_safety_exit_html() { 104 $this->run_setup(); 105 if ($this->displayButton) { 106 echo $this->generate_html(); 107 } 108 } 109 public function generate_js() { 110 do_action( 'qm/debug', 'generating JS' ); 111 $js = '<script>'; 112 $js .= 'window.sftExtBtn={};'; 113 $js .= 'window.sftExtBtn.classes=\'' . $this->classes . '\';'; 114 $js .= 'window.sftExtBtn.icon=\'' . $this->icon . '\';'; 115 $js .= 'window.sftExtBtn.newTabUrl=\'' . $this->defaultSettings['sftExt_new_tab_url'] . '\';'; 116 $js .= 'window.sftExtBtn.currentTabUrl=\'' . $this->defaultSettings['sftExt_current_tab_url'] . '\';'; 117 $js .= 'window.sftExtBtn.btnType=\'' . $this->defaultSettings['sftExt_type'] . '\';'; 118 $js .= 'window.sftExtBtn.text=\'' . $this->defaultSettings['sftExt_rectangle_text'] . '\';'; 119 $js .= 'window.sftExtBtn.shouldShow=' . ($this->displayButton ? 'true' : 'false') . ';'; 120 $js .= '</script>'; 121 return $js; 122 } 123 124 125 126 public function generate_css() { 127 do_action( 'qm/debug', 'generating custom CSS' ); 128 $css = '<style>:root{'; 129 $css .= '--sftExt_bgColor:' . $this->defaultSettings['sftExt_bg_color'] . ';'; 130 $css .= '--sftExt_textColor:' . $this->defaultSettings['sftExt_font_color'] . ';'; 131 $css .= '--sftExt_active:' . (!$this->displayButton ? 'none !important' : 'inline-block') . ';'; 132 $css .= '--sftExt_activeMobile:' . ($this->hideOnMobile ? 'none !important' : 'inline-block') . ';'; 133 $css .= '--sftExt_mobileBreakPoint:600px;'; 134 $css .= '--sftExt_rectangle_fontSize:' . $this->defaultSettings['sftExt_rectangle_font_size'] . $this->defaultSettings['sftExt_rectangle_font_size_units'] .';'; 135 $css .= '--sftExt_rectangle_letterSpacing:' . $this->defaultSettings['sftExt_letter_spacing'] . ';'; 136 $css .= '--sftExt_rectangle_borderRadius:' . $this->defaultSettings['sftExt_border_radius'] . 'px;'; 137 $css .= '}</style>'; 138 return $css; 139 } 140 141 public function generate_html() { 142 $html = '<button id="sftExt-frontend-button" class="' . $this->classes . '" data-new-tab="' . $this->defaultSettings['sftExt_new_tab_url'] . '" data-url="' . $this->defaultSettings['sftExt_current_tab_url'] . '">'; 143 $html .= '<div class="sftExt-inner">'; 144 $html .= $this->icon ?? ''; 145 $html .= '<span'; 146 if ($this->defaultSettings['sftExt_type'] !== 'rectangle') { 147 $html .= ' class="sr-only"'; 148 } 149 $html .= '>'. $this->defaultSettings['sftExt_rectangle_text'] .'</span>'; 150 $html .= '</div>'; 151 $html .= '</button>'; 152 return $html; 44 153 } 45 154 -
safety-exit/tags/1.7.0/postcss.config.js
r2934107 r3057884 1 1 const postcssPresetEnv = require('postcss-preset-env'); 2 2 const postcssMinify = require('postcss-minify'); 3 const autoprefixer = require('autoprefixer'); 3 4 4 5 -
safety-exit/tags/1.7.0/readme.txt
r2934107 r3057884 4 4 Donate link: https://tomascordero.com 5 5 Requires at least: 5.2.0 6 Tested up to: 6. 2.27 Requires PHP: 5. 2.48 Stable tag: 1. 6.56 Tested up to: 6.4.3 7 Requires PHP: 5.6.0 8 Stable tag: 1.7.0 9 9 License: GPL-2.0+ 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 48 48 49 49 == Changelog == 50 1.7.0: 51 - Refactor: Completely reworked how the button is rendered. It will try to render via HTML first. If it cant it will render with JS. This should finally fix all theme related problems. 52 - Improved: Got some unit testing in place. When the plugin's admin UI gets refactored this will help ensuring nothing breaks on the front end. 53 - Removed: I removed the contrast checker. It was large, annoying and didn't work very well. I will be replacing it with something better in V2. 54 - Fix: Button will no longer appear on the print view. 55 - Tweak: Bumped up the minimum PHP version required from 5.2 to 5.6. Really you shouldn't be on anything less than 7.4. 50 56 1.6.5: 51 57 - Refactor: Build pipeline … … 72 78 - Fixed: Updated CSS for round and square buttons to center icon. 73 79 - Fixed: Removed random options file that was hanging up server cron jobs. 74 - Improved: Added some needed security to protect agains attacks.80 - Improved: Added some needed security to protect against attacks. 75 81 1.4.1: 76 82 - Fixed: Hot fix for the page selection tool … … 85 91 - New: Added option for square button 86 92 - Tweak: Moved the settings link to the main menu and out from under the settings tab. This should make it easier to find. 87 - Fixed: The round button had a bug where it wouldn t display the icon correctly. That is fixed and should display correctly93 - Fixed: The round button had a bug where it wouldn't display the icon correctly. That is fixed and should display correctly 88 94 1.1.3: 89 - Tweak: Made it so you aren t forced to have all uppercase text. Now to control the font capitalization you just type the word with the capitalization you want to be displayed95 - Tweak: Made it so you aren't forced to have all uppercase text. Now to control the font capitalization you just type the word with the capitalization you want to be displayed 90 96 1.0.3: 91 97 - Fixed: 404s on frontend -
safety-exit/tags/1.7.0/safety-exit.php
r2934107 r3057884 12 12 * Plugin URI: 13 13 * Description: This plugin will inject a button on your website that will allow a website user to quickly navigate away from your website. 14 * Version: 1. 6.514 * Version: 1.7.0 15 15 * Author: Tomas Cordero 16 16 * Author URI: https://tomascordero.com … … 19 19 * Text Domain: safety-exit 20 20 */ 21 require plugin_dir_path( __FILE__ ) . '/vendor/autoload.php'; 22 23 use SafetyExit\Safety_Exit_Frontend; 24 use SafetyExit\Safety_Exit_Admin; 21 25 22 26 $path = realpath(dirname(__FILE__) . '/../../../')."/wp-includes/pluggable.php"; … … 50 54 die; 51 55 } 52 foreach ( glob( plugin_dir_path( __FILE__ ) . 'lib/*.php' ) as $file ) { 53 include_once $file; 54 } 56 55 57 if( !$errors ) { 56 58 $url_path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ); -
safety-exit/tags/1.7.0/src/css/frontend.css
r2934107 r3057884 1 1 2 #sftExt-frontend-button { 3 @media print { 4 display: none !important; 5 } 2 6 @media screen, speech { 3 7 .sr-only { … … 9 13 } 10 14 } 15 background-color: var(--sftExt_bgColor); 16 color: var(--sftExt_textColor); 17 display: var(--sftExt_active); 11 18 position: fixed; 12 19 border: none; 13 display: inline-block;14 20 cursor: pointer; 15 21 z-index: 9999; … … 20 26 width: 25px; 21 27 height: 25px; 28 29 @media (max-width: 600px) { 30 display: var(--sftExt_activeMobile); 31 } 22 32 23 33 &.round { … … 54 64 } 55 65 &.rectangle { 66 font-size: var(--sftExt_rectangle_fontSize); 67 letter-spacing: var(--sftExt_rectangle_letterSpacing); 68 border-radius: var(--sftExt_rectangle_borderRadius); 56 69 padding: 10px 20px; 57 70 height: auto; -
safety-exit/trunk/assets/css/admin.css
r2934107 r3057884 1 #sftExt_color_picker_btn_bg_color,#sftExt_color_picker_btn_font_color{padding:10px 20px;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px rgba(0,0,0,.07);display:inline-block;color:#333;text-align:center;cursor:pointer}.sftExt_alert{color:#000000;background:#FFCCCC}.sftExt_alert th{padding-left:10px}1 #sftExt_color_picker_btn_bg_color,#sftExt_color_picker_btn_font_color{padding:10px 20px;border:1px solid #ddd;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.07);box-shadow:inset 0 1px 2px #00000012;display:inline-block;color:#333;text-align:center;cursor:pointer}.sftExt_alert{color:#000;background:#FFCCCC}.sftExt_alert th{padding-left:10px} -
safety-exit/trunk/assets/css/frontend.css
r2934107 r3057884 1 #sftExt-frontend-button{ position:fixed;border:none;display:inline-block;cursor:pointer;z-index:9999;left:20px;top:20px;padding:10px 20px;font-family:inherit;width:25px;height:25px}@media screen,speech{#sftExt-frontend-button .sr-only{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}}#sftExt-frontend-button.round{border-radius:50%;padding:10px;text-align:center;width:45px;height:45px}#sftExt-frontend-button.round>i{position:relative;display:block;font-size:25px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}#sftExt-frontend-button.square{border-radius:0;padding:10px;text-align:center;width:45px;height:45px}#sftExt-frontend-button.square>i{position:relative;display:block;font-size:25px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);-o-transform:translateY(-50%);transform:translateY(-50%)}#sftExt-frontend-button.rectangle{padding:10px 20px;height:auto;width:auto;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-box;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;flex-direction:column}#sftExt-frontend-button.rectangle:before,#sftExt-frontend-button.rectangle:after{content:'';-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1}#sftExt-frontend-button.rectangle .sftExt-inner{position:relative;text-align:center}#sftExt-frontend-button.rectangle .sftExt-inner>i{margin-right:10px}#sftExt-frontend-button.rectangle .sftExt-inner:before{position:absolute;left:0;top:0;height:20px;width:20px}#sftExt-frontend-button.bottom{top:auto;bottom:20px}#sftExt-frontend-button.top{top:20px}#sftExt-frontend-button.right{left:auto;right:20px}#sftExt-frontend-button.left{left:20px}1 #sftExt-frontend-button{background-color:var(--sftExt_bgColor);color:var(--sftExt_textColor);display:var(--sftExt_active);position:fixed;border:none;cursor:pointer;z-index:9999;left:20px;top:20px;padding:10px 20px;font-family:inherit;width:25px;height:25px}@media print{#sftExt-frontend-button{display:none!important}}@media screen,speech{#sftExt-frontend-button .sr-only{position:absolute;left:-9999px;width:1px;height:1px;overflow:hidden}}@media (max-width:600px){#sftExt-frontend-button{display:var(--sftExt_activeMobile)}}#sftExt-frontend-button.round{border-radius:50%;padding:10px;text-align:center;width:45px;height:45px}#sftExt-frontend-button.round>i{position:relative;display:block;font-size:25px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}#sftExt-frontend-button.square{border-radius:0;padding:10px;text-align:center;width:45px;height:45px}#sftExt-frontend-button.square>i{position:relative;display:block;font-size:25px;top:50%;-webkit-transform:translateY(-50%);-moz-transform:translateY(-50%);-ms-transform:translateY(-50%);transform:translateY(-50%)}#sftExt-frontend-button.rectangle{font-size:var(--sftExt_rectangle_fontSize);letter-spacing:var(--sftExt_rectangle_letterSpacing);border-radius:var(--sftExt_rectangle_borderRadius);padding:10px 20px;height:auto;width:auto;display:-webkit-inline-box;display:-webkit-inline-flex;display:-moz-inline-box;display:inline-flex;-webkit-box-orient:vertical;-webkit-box-direction:normal;-webkit-flex-direction:column;-moz-box-orient:vertical;-moz-box-direction:normal;flex-direction:column}#sftExt-frontend-button.rectangle:before,#sftExt-frontend-button.rectangle:after{content:"";-webkit-box-flex:1;-webkit-flex:1;-moz-box-flex:1;flex:1}#sftExt-frontend-button.rectangle .sftExt-inner{position:relative;text-align:center}#sftExt-frontend-button.rectangle .sftExt-inner>i{margin-right:10px}#sftExt-frontend-button.rectangle .sftExt-inner:before{position:absolute;left:0;top:0;height:20px;width:20px}#sftExt-frontend-button.bottom{top:auto;bottom:20px}#sftExt-frontend-button.top{top:20px}#sftExt-frontend-button.right{left:auto;right:20px}#sftExt-frontend-button.left{left:20px} -
safety-exit/trunk/assets/js/admin.js
r2934107 r3057884 1 function calculateContrastRatio(color1, color2) { 2 function parseColor(colorString) { 3 const colorArray = colorString.match(/\d+/g); 4 return colorArray.map(Number); 5 } 6 7 function getLuminance(color) { 8 const normalizedColor = color.map(value => { 9 value /= 255; 10 if (value <= 0.03928) { 11 return value / 12.92; 12 } else { 13 return Math.pow((value + 0.055) / 1.055, 2.4); 14 } 15 }); 16 17 return 0.2126 * normalizedColor[0] + 0.7152 * normalizedColor[1] + 0.0722 * normalizedColor[2]; 18 } 19 20 const colorArray1 = parseColor(color1); 21 const colorArray2 = parseColor(color2); 22 23 const luminance1 = getLuminance(colorArray1); 24 const luminance2 = getLuminance(colorArray2); 25 26 const ratio = (Math.max(luminance1, luminance2) + 0.05) / (Math.min(luminance1, luminance2) + 0.05); 27 28 const aaThreshold = 4.5; 29 const aaaThreshold = 7; 30 31 const passesAA = ratio >= aaThreshold; 32 const passesAAA = ratio >= aaaThreshold; 33 34 return { passesAA, passesAAA }; 35 } 36 37 38 function calcContrastError(color1, color2) { 39 const targetElement = document.querySelector('.sftExt_type'); 40 41 // Insert the new row before the target element 42 let accessibilityResults = calculateContrastRatio(color1, color2); 43 if (accessibilityResults.passesAA && accessibilityResults.passesAAA) { 44 if (document.querySelector('.sftExt_alert')) document.querySelector('.sftExt_alert').remove(); 45 return; 46 } 47 48 // Create a new table row element 49 const newRow = document.createElement('tr'); 50 newRow.classList.add('sftExt_alert'); 51 newRow.innerHTML = `<th>Warning:</th><td>The contrast ratio between the background color and text color does not meet the accessibility standards.<br/>AA: ${accessibilityResults.passesAA ? 'Passing' : 'Failing'}<br/>AAA: ${accessibilityResults.passesAAA ? 'Passing' : 'Failing'}`; 52 53 54 if (targetElement && targetElement.parentNode) { 55 if (document.querySelector('.sftExt_alert')) document.querySelector('.sftExt_alert').remove(); 56 targetElement.parentNode.insertBefore(newRow, targetElement); 57 } 58 } 59 60 61 jQuery(function($){ 62 63 $('#sftExt_type').on('change', function(e){ 64 if($(this).val() == 'rectangle') { 65 $('.rectangle-only').removeClass('hidden') 66 }else{ 67 $('.rectangle-only').addClass('hidden') 68 } 69 if($(this).val() == 'round') { 70 $('.round-only').removeClass('hidden') 71 }else{ 72 $('.round-only').addClass('hidden') 73 } 74 }); 75 // $('.sftExt_show_all').on('change', function(e){ 76 // console.log($(this).val()); 77 // if($(this).val() == 'no') { 78 // $('.sftExt_front_page').show() 79 // $('.sftExt_pages').show() 80 // }else{ 81 // $('.sftExt_front_page').hide() 82 // $('.sftExt_pages').hide() 83 // } 84 // }); 85 $('#sftExt_rectangle_font_size_units').on('change', function(e){ 86 $('.sftExt_units').text($(this).val()); 87 }); 88 89 $('#sftExt_fontawesome_icon_classes_btn').on('click' , function(e){ 90 e.preventDefault(); 91 }); 92 // TODO add button that says "Change Icon" 93 $('#sftExt_fontawesome_icon_classes').iconpicker({ 94 hideOnSelect: false, 95 placement: 'inline', 96 }); 97 $('#sftExt_fontawesome_icon_classes').on('iconpickerSelected', function(e){ 98 $('#sftExt_icon_display i').attr('class', 'fa-3x ' + 99 e.iconpickerInstance.options.fullClassFormatter(e.iconpickerValue)); 100 // $('#sftExt_fontawesome_icon_classes').val() = e.iconpickerInstance.options.fullClassFormatter(e.iconpickerValue); 101 }) 102 var $bgParent = document.querySelector('#sftExt_color_picker_btn_bg_color'); 103 var $fontParent = document.querySelector('#sftExt_color_picker_btn_font_color'); 104 var bg_color_picker = new Picker({ 105 parent: $bgParent, 106 color:$('#sftExt_bg_color').val() 107 }); 108 109 110 var font_color_picker = new Picker({ 111 parent: $fontParent, 112 color:$('#sftExt_font_color').val() 113 }); 114 bg_color_picker.onChange = function(color) { 115 $('#sftExt_bg_color').val(color.rgbaString); 116 calcContrastError(color.rgbaString, font_color_picker.color.rgbaString); 117 $('#sftExt_color_picker_btn_bg_color').css({ 118 'background-color': color.rgbaString 119 }); 120 }; 121 font_color_picker.onChange = function(color) { 122 $('#sftExt_font_color').val(color.rgbaString); 123 calcContrastError(bg_color_picker.color.rgbaString, color.rgbaString); 124 $('#sftExt_color_picker_btn_font_color').css({ 125 'background-color': color.rgbaString 126 }); 127 }; 128 calcContrastError(bg_color_picker.color.rgbaString, font_color_picker.color.rgbaString); 129 }) 130 // sftExt_icon_display 131 132 // sftExt_rectangle_text 1 jQuery(function(n){n("#sftExt_type").on("change",function(t){n(this).val()=="rectangle"?n(".rectangle-only").removeClass("hidden"):n(".rectangle-only").addClass("hidden"),n(this).val()=="round"?n(".round-only").removeClass("hidden"):n(".round-only").addClass("hidden")}),n("#sftExt_rectangle_font_size_units").on("change",function(t){n(".sftExt_units").text(n(this).val())}),n("#sftExt_fontawesome_icon_classes_btn").on("click",function(t){t.preventDefault()}),n("#sftExt_fontawesome_icon_classes").iconpicker({hideOnSelect:!1,placement:"inline"}),n("#sftExt_fontawesome_icon_classes").on("iconpickerSelected",function(t){n("#sftExt_icon_display i").attr("class","fa-3x "+t.iconpickerInstance.options.fullClassFormatter(t.iconpickerValue))});var o=document.querySelector("#sftExt_color_picker_btn_bg_color"),e=document.querySelector("#sftExt_color_picker_btn_font_color"),c=new Picker({parent:o,color:n("#sftExt_bg_color").val()}),r=new Picker({parent:e,color:n("#sftExt_font_color").val()});c.onChange=function(t){n("#sftExt_bg_color").val(t.rgbaString),n("#sftExt_color_picker_btn_bg_color").css({"background-color":t.rgbaString})},r.onChange=function(t){n("#sftExt_font_color").val(t.rgbaString),n("#sftExt_color_picker_btn_font_color").css({"background-color":t.rgbaString})}}); -
safety-exit/trunk/assets/js/frontend.js
r2837777 r3057884 1 jQuery(function($){ 2 $('#sftExt-frontend-button').on('click', function(e){ 3 var newTabUrl = $(this).data('new-tab'); 4 var thisTabUrl = $(this).data('url'); 5 6 var win = window.open(newTabUrl, '_blank'); 7 win.focus(); 8 window.location.replace(thisTabUrl); 9 10 }) 11 }) 1 document.addEventListener("DOMContentLoaded",function(){var t=document.getElementById("sftExt-frontend-button");if(window.sftExtBtn.shouldShow)if(t)t.addEventListener("click",function(i){var n=t.dataset.newTab,o=t.dataset.url,a=window.open(n,"_blank");a.focus(),window.location.replace(o)});else{var t=document.createElement("button");t.id="sftExt-frontend-button",t.className=window.sftExtBtn.classes||"",t.setAttribute("data-new-tab",window.sftExtBtn.newTabUrl),t.setAttribute("data-url",window.sftExtBtn.currentTabUrl);var e=document.createElement("div");e.className="sftExt-inner",e.innerHTML=window.sftExtBtn.icon;let n=document.createElement("span");window.sftExtBtn.btnType!="round"&&window.sftExtBtn.btnType!="square"?n.textContent=window.sftExtBtn.text:(n.className="sr-only",n.textContent="Safety Exit"),e.appendChild(n),t.appendChild(e),t.addEventListener("click",function(o){var a=t.dataset.newTab,d=t.dataset.url,s=window.open(a,"_blank");s.focus(),window.location.replace(d)}),document.body.appendChild(t)}}); -
safety-exit/trunk/lib/Safety_Exit_Admin.php
r2837777 r3057884 1 1 <?php 2 /** 3 * Creates the submenu item for the plugin. 4 * 5 * @package Custom_Admin_Settings 6 */ 2 namespace SafetyExit; 7 3 8 4 /** … … 73 69 wp_enqueue_style('sftExt-admin-icon-picker', $this->root . 'assets/css/fontawesome-iconpicker.css'); 74 70 wp_enqueue_style('sftExt-admin-admin', $this->root . 'assets/css/admin.css'); 75 wp_enqueue_script('sftExt-admin-color-picker', $this->root . 'assets/ js/vanilla-picker.min.js');76 wp_enqueue_script('sftExt-admin-icon-picker-js', $this->root . 'assets/ js/fontawesome-iconpicker.min.js');71 wp_enqueue_script('sftExt-admin-color-picker', $this->root . 'assets/vendor/vanilla-picker.min.js'); 72 wp_enqueue_script('sftExt-admin-icon-picker-js', $this->root . 'assets/vendor/fontawesome-iconpicker.min.js'); 77 73 wp_register_script('sftExt-admin-js', $this->root . 'assets/js/admin.js', array('jquery', 'sftExt-admin-icon-picker-js', 'sftExt-admin-color-picker')); 78 74 wp_enqueue_script( 'sftExt-admin-js'); -
safety-exit/trunk/lib/Safety_Exit_Frontend.php
r2838741 r3057884 1 1 <?php 2 3 namespace SafetyExit; 2 4 /** 3 5 * Handle all frontend stuff … … 13 15 class Safety_Exit_Frontend { 14 16 15 private $pluginRoot;16 17 17 private $buttonInitialized = false; 18 18 19 public function __construct($file) { 20 $this->pluginRoot = $file; 19 private $defaultSettings; 20 21 private $classes = ''; 22 private $displayButton = true; 23 private $icon = ''; 24 private $hideOnMobile = false; 25 26 public function __construct() { 27 28 $this->defaultSettings = wp_parse_args(get_option('sftExt_settings'), array( 29 'sftExt_position' => 'bottom right', 30 'sftExt_fontawesome_icon_classes' => 'fas fa-times', 31 'sftExt_type' => 'rectangle', 32 'sftExt_current_tab_url' => 'https://google.com', 33 'sftExt_new_tab_url' => 'https://google.com', 34 'sftExt_rectangle_text' => 'Safety Exit', 35 'sftExt_rectangle_icon_onOff' => 'yes', 36 'sftExt_rectangle_font_size_units' => 'rem', 37 'sftExt_rectangle_font_size' => '1', 38 'sftExt_bg_color' => 'rgba(58, 194, 208, 1)', 39 'sftExt_font_color' => 'rgba(255, 255, 255, 1)', 40 'sftExt_letter_spacing' => 'inherit', 41 'sftExt_border_radius' => '100', 42 'sftExt_hide_mobile' => '', 43 'sftExt_show_all' => 'yes', 44 'sftExt_front_page' => 'yes', 45 'sftExt_pages' => array() 46 )); 47 48 21 49 } 22 50 public function init() { 23 51 add_action('wp_enqueue_scripts', array($this, 'sftExt_enqueue')); 24 52 do_action( 'qm/debug', 'wp_enqueue_scripts fired' ); 25 add_action( 'wp_body_open', array($this, 'safety_exit_inject'), 100 ); 53 add_action('wp_head', array($this, 'echo_safety_exit_custom_styling')); 54 add_action( 'wp_body_open', array($this, 'echo_safety_exit_html'), 100 ); 26 55 do_action( 'qm/debug', 'wp_body_open fired' ); 27 56 } 57 public function run_setup() { 58 59 if($this->defaultSettings['sftExt_show_all'] == 'no'){ 60 if( !in_array(get_the_ID(), $this->defaultSettings['sftExt_pages'])){ 61 $this->displayButton = false; 62 } else { 63 $this->displayButton = true; 64 } 65 } 66 67 if($this->defaultSettings['sftExt_front_page'] == 'yes' && is_front_page()){ 68 $this->displayButton = true; 69 } else if ($this->defaultSettings['sftExt_front_page'] == 'no' && is_front_page()) { 70 $this->displayButton = false; 71 } 72 73 if($this->defaultSettings['sftExt_hide_mobile'] == 'yes') { 74 $this->hideOnMobile = true; 75 } 76 $this->classes = $this->defaultSettings['sftExt_position'] . ' ' . $this->defaultSettings['sftExt_type']; 77 78 if($this->defaultSettings['sftExt_rectangle_icon_onOff'] == 'yes' && $this->defaultSettings['sftExt_type'] == 'rectangle') { 79 $this->icon = '<i class="' . $this->defaultSettings['sftExt_fontawesome_icon_classes'] . '"></i>'; 80 }else if($this->defaultSettings['sftExt_type'] == 'round' || $this->defaultSettings['sftExt_type'] == 'square'){ 81 $this->icon = '<i class="' . $this->defaultSettings['sftExt_fontawesome_icon_classes'] . '"></i>'; 82 } 83 } 28 84 public function sftExt_enqueue() { 29 wp_enqueue_style('frontendCSS', plugins_url() . '/safety-exit/assets/css/frontend.css'); 30 wp_enqueue_script( 'frontendJs', plugins_url() . '/safety-exit/assets/js/frontend.js', array('jquery') ); 85 if ($this->displayButton) { 86 wp_enqueue_style('frontendCSS', plugins_url() . '/safety-exit/assets/css/frontend.css'); 87 wp_enqueue_script( 'frontendJs', plugins_url() . '/safety-exit/assets/js/frontend.js', array('jquery') ); 88 } 31 89 32 90 $args = wp_parse_args(get_option('sftExt_settings'), array( … … 38 96 } 39 97 } 40 public function safety_exit_inject() { 41 do_action( 'qm/debug', 'frontend-button.php before include' ); 42 include( 'views/frontend-button.php' ); 43 do_action( 'qm/debug', 'frontend-button.php included' ); 98 public function echo_safety_exit_custom_styling() { 99 $this->run_setup(); 100 echo $this->generate_js(); 101 echo $this->generate_css(); 102 } 103 public function echo_safety_exit_html() { 104 $this->run_setup(); 105 if ($this->displayButton) { 106 echo $this->generate_html(); 107 } 108 } 109 public function generate_js() { 110 do_action( 'qm/debug', 'generating JS' ); 111 $js = '<script>'; 112 $js .= 'window.sftExtBtn={};'; 113 $js .= 'window.sftExtBtn.classes=\'' . $this->classes . '\';'; 114 $js .= 'window.sftExtBtn.icon=\'' . $this->icon . '\';'; 115 $js .= 'window.sftExtBtn.newTabUrl=\'' . $this->defaultSettings['sftExt_new_tab_url'] . '\';'; 116 $js .= 'window.sftExtBtn.currentTabUrl=\'' . $this->defaultSettings['sftExt_current_tab_url'] . '\';'; 117 $js .= 'window.sftExtBtn.btnType=\'' . $this->defaultSettings['sftExt_type'] . '\';'; 118 $js .= 'window.sftExtBtn.text=\'' . $this->defaultSettings['sftExt_rectangle_text'] . '\';'; 119 $js .= 'window.sftExtBtn.shouldShow=' . ($this->displayButton ? 'true' : 'false') . ';'; 120 $js .= '</script>'; 121 return $js; 122 } 123 124 125 126 public function generate_css() { 127 do_action( 'qm/debug', 'generating custom CSS' ); 128 $css = '<style>:root{'; 129 $css .= '--sftExt_bgColor:' . $this->defaultSettings['sftExt_bg_color'] . ';'; 130 $css .= '--sftExt_textColor:' . $this->defaultSettings['sftExt_font_color'] . ';'; 131 $css .= '--sftExt_active:' . (!$this->displayButton ? 'none !important' : 'inline-block') . ';'; 132 $css .= '--sftExt_activeMobile:' . ($this->hideOnMobile ? 'none !important' : 'inline-block') . ';'; 133 $css .= '--sftExt_mobileBreakPoint:600px;'; 134 $css .= '--sftExt_rectangle_fontSize:' . $this->defaultSettings['sftExt_rectangle_font_size'] . $this->defaultSettings['sftExt_rectangle_font_size_units'] .';'; 135 $css .= '--sftExt_rectangle_letterSpacing:' . $this->defaultSettings['sftExt_letter_spacing'] . ';'; 136 $css .= '--sftExt_rectangle_borderRadius:' . $this->defaultSettings['sftExt_border_radius'] . 'px;'; 137 $css .= '}</style>'; 138 return $css; 139 } 140 141 public function generate_html() { 142 $html = '<button id="sftExt-frontend-button" class="' . $this->classes . '" data-new-tab="' . $this->defaultSettings['sftExt_new_tab_url'] . '" data-url="' . $this->defaultSettings['sftExt_current_tab_url'] . '">'; 143 $html .= '<div class="sftExt-inner">'; 144 $html .= $this->icon ?? ''; 145 $html .= '<span'; 146 if ($this->defaultSettings['sftExt_type'] !== 'rectangle') { 147 $html .= ' class="sr-only"'; 148 } 149 $html .= '>'. $this->defaultSettings['sftExt_rectangle_text'] .'</span>'; 150 $html .= '</div>'; 151 $html .= '</button>'; 152 return $html; 44 153 } 45 154 -
safety-exit/trunk/postcss.config.js
r2934107 r3057884 1 1 const postcssPresetEnv = require('postcss-preset-env'); 2 2 const postcssMinify = require('postcss-minify'); 3 const autoprefixer = require('autoprefixer'); 3 4 4 5 -
safety-exit/trunk/readme.txt
r2934107 r3057884 4 4 Donate link: https://tomascordero.com 5 5 Requires at least: 5.2.0 6 Tested up to: 6. 2.27 Requires PHP: 5. 2.48 Stable tag: 1. 6.56 Tested up to: 6.4.3 7 Requires PHP: 5.6.0 8 Stable tag: 1.7.0 9 9 License: GPL-2.0+ 10 10 License URI: https://www.gnu.org/licenses/gpl-2.0.html … … 48 48 49 49 == Changelog == 50 1.7.0: 51 - Refactor: Completely reworked how the button is rendered. It will try to render via HTML first. If it cant it will render with JS. This should finally fix all theme related problems. 52 - Improved: Got some unit testing in place. When the plugin's admin UI gets refactored this will help ensuring nothing breaks on the front end. 53 - Removed: I removed the contrast checker. It was large, annoying and didn't work very well. I will be replacing it with something better in V2. 54 - Fix: Button will no longer appear on the print view. 55 - Tweak: Bumped up the minimum PHP version required from 5.2 to 5.6. Really you shouldn't be on anything less than 7.4. 50 56 1.6.5: 51 57 - Refactor: Build pipeline … … 72 78 - Fixed: Updated CSS for round and square buttons to center icon. 73 79 - Fixed: Removed random options file that was hanging up server cron jobs. 74 - Improved: Added some needed security to protect agains attacks.80 - Improved: Added some needed security to protect against attacks. 75 81 1.4.1: 76 82 - Fixed: Hot fix for the page selection tool … … 85 91 - New: Added option for square button 86 92 - Tweak: Moved the settings link to the main menu and out from under the settings tab. This should make it easier to find. 87 - Fixed: The round button had a bug where it wouldn t display the icon correctly. That is fixed and should display correctly93 - Fixed: The round button had a bug where it wouldn't display the icon correctly. That is fixed and should display correctly 88 94 1.1.3: 89 - Tweak: Made it so you aren t forced to have all uppercase text. Now to control the font capitalization you just type the word with the capitalization you want to be displayed95 - Tweak: Made it so you aren't forced to have all uppercase text. Now to control the font capitalization you just type the word with the capitalization you want to be displayed 90 96 1.0.3: 91 97 - Fixed: 404s on frontend -
safety-exit/trunk/safety-exit.php
r2934107 r3057884 12 12 * Plugin URI: 13 13 * Description: This plugin will inject a button on your website that will allow a website user to quickly navigate away from your website. 14 * Version: 1. 6.514 * Version: 1.7.0 15 15 * Author: Tomas Cordero 16 16 * Author URI: https://tomascordero.com … … 19 19 * Text Domain: safety-exit 20 20 */ 21 require plugin_dir_path( __FILE__ ) . '/vendor/autoload.php'; 22 23 use SafetyExit\Safety_Exit_Frontend; 24 use SafetyExit\Safety_Exit_Admin; 21 25 22 26 $path = realpath(dirname(__FILE__) . '/../../../')."/wp-includes/pluggable.php"; … … 50 54 die; 51 55 } 52 foreach ( glob( plugin_dir_path( __FILE__ ) . 'lib/*.php' ) as $file ) { 53 include_once $file; 54 } 56 55 57 if( !$errors ) { 56 58 $url_path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH ); -
safety-exit/trunk/src/css/frontend.css
r2934107 r3057884 1 1 2 #sftExt-frontend-button { 3 @media print { 4 display: none !important; 5 } 2 6 @media screen, speech { 3 7 .sr-only { … … 9 13 } 10 14 } 15 background-color: var(--sftExt_bgColor); 16 color: var(--sftExt_textColor); 17 display: var(--sftExt_active); 11 18 position: fixed; 12 19 border: none; 13 display: inline-block;14 20 cursor: pointer; 15 21 z-index: 9999; … … 20 26 width: 25px; 21 27 height: 25px; 28 29 @media (max-width: 600px) { 30 display: var(--sftExt_activeMobile); 31 } 22 32 23 33 &.round { … … 54 64 } 55 65 &.rectangle { 66 font-size: var(--sftExt_rectangle_fontSize); 67 letter-spacing: var(--sftExt_rectangle_letterSpacing); 68 border-radius: var(--sftExt_rectangle_borderRadius); 56 69 padding: 10px 20px; 57 70 height: auto;
Note: See TracChangeset
for help on using the changeset viewer.