Plugin Directory

Changeset 3057884


Ignore:
Timestamp:
03/24/2024 09:57:57 PM (2 years ago)
Author:
tcordero
Message:

Update to version 1.7.0 from GitHub

Location:
safety-exit
Files:
58 added
6 deleted
20 edited
1 copied

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
     1jQuery(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 })
     1document.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  
    11<?php
    2 /**
    3  * Creates the submenu item for the plugin.
    4  *
    5  * @package Custom_Admin_Settings
    6  */
     2namespace SafetyExit;
    73
    84/**
     
    7369            wp_enqueue_style('sftExt-admin-icon-picker', $this->root . 'assets/css/fontawesome-iconpicker.css');
    7470            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');
    7773            wp_register_script('sftExt-admin-js', $this->root . 'assets/js/admin.js', array('jquery', 'sftExt-admin-icon-picker-js', 'sftExt-admin-color-picker'));
    7874            wp_enqueue_script( 'sftExt-admin-js');
  • safety-exit/tags/1.7.0/lib/Safety_Exit_Frontend.php

    r2838741 r3057884  
    11<?php
     2
     3namespace SafetyExit;
    24/**
    35 * Handle all frontend stuff
     
    1315class Safety_Exit_Frontend {
    1416
    15     private $pluginRoot;
    16 
    1717    private $buttonInitialized = false;
    1818
    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
    2149    }
    2250    public function init() {
    2351        add_action('wp_enqueue_scripts', array($this, 'sftExt_enqueue'));
    2452        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 );
    2655        do_action( 'qm/debug', 'wp_body_open fired' );
    2756    }
     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    }
    2884    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        }
    3189
    3290        $args = wp_parse_args(get_option('sftExt_settings'), array(
     
    3896        }
    3997    }
    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;
    44153    }
    45154
  • safety-exit/tags/1.7.0/postcss.config.js

    r2934107 r3057884  
    11const postcssPresetEnv = require('postcss-preset-env');
    22const postcssMinify = require('postcss-minify');
     3const autoprefixer = require('autoprefixer');
    34
    45
  • safety-exit/tags/1.7.0/readme.txt

    r2934107 r3057884  
    44Donate link: https://tomascordero.com
    55Requires at least: 5.2.0
    6 Tested up to: 6.2.2
    7 Requires PHP: 5.2.4
    8 Stable tag: 1.6.5
     6Tested up to: 6.4.3
     7Requires PHP: 5.6.0
     8Stable tag: 1.7.0
    99License: GPL-2.0+
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    4848
    4949== Changelog ==
     501.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.
    50561.6.5:
    5157    - Refactor: Build pipeline
     
    7278    - Fixed: Updated CSS for round and square buttons to center icon.
    7379    - 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.
    75811.4.1:
    7682    - Fixed: Hot fix for the page selection tool
     
    8591    - New: Added option for square button
    8692    - 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 wouldnt display the icon correctly. That is fixed and should display correctly
     93    - Fixed: The round button had a bug where it wouldn't display the icon correctly. That is fixed and should display correctly
    88941.1.3:
    89     - Tweak: Made it so you arent 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
     95    - 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
    90961.0.3:
    9197    - Fixed: 404s on frontend
  • safety-exit/tags/1.7.0/safety-exit.php

    r2934107 r3057884  
    1212 * Plugin URI:
    1313 * 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.5
     14 * Version:     1.7.0
    1515 * Author:      Tomas Cordero
    1616 * Author URI:  https://tomascordero.com
     
    1919 * Text Domain: safety-exit
    2020 */
     21require plugin_dir_path( __FILE__ ) . '/vendor/autoload.php';
     22
     23use SafetyExit\Safety_Exit_Frontend;
     24use SafetyExit\Safety_Exit_Admin;
    2125
    2226$path = realpath(dirname(__FILE__) . '/../../../')."/wp-includes/pluggable.php";
     
    5054    die;
    5155}
    52 foreach ( glob( plugin_dir_path( __FILE__ ) . 'lib/*.php' ) as $file ) {
    53     include_once $file;
    54 }
     56
    5557if( !$errors ) {
    5658    $url_path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
  • safety-exit/tags/1.7.0/src/css/frontend.css

    r2934107 r3057884  
     1
    12#sftExt-frontend-button {
     3    @media print {
     4        display: none !important;
     5    }
    26    @media screen, speech {
    37        .sr-only {
     
    913        }
    1014    }
     15    background-color: var(--sftExt_bgColor);
     16    color: var(--sftExt_textColor);
     17    display: var(--sftExt_active);
    1118    position: fixed;
    1219    border: none;
    13     display: inline-block;
    1420    cursor: pointer;
    1521    z-index: 9999;
     
    2026    width: 25px;
    2127    height: 25px;
     28
     29    @media (max-width: 600px) {
     30        display: var(--sftExt_activeMobile);
     31    }
    2232
    2333    &.round {
     
    5464    }
    5565    &.rectangle {
     66        font-size: var(--sftExt_rectangle_fontSize);
     67        letter-spacing: var(--sftExt_rectangle_letterSpacing);
     68        border-radius: var(--sftExt_rectangle_borderRadius);
    5669        padding: 10px 20px;
    5770        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
     1jQuery(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 })
     1document.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  
    11<?php
    2 /**
    3  * Creates the submenu item for the plugin.
    4  *
    5  * @package Custom_Admin_Settings
    6  */
     2namespace SafetyExit;
    73
    84/**
     
    7369            wp_enqueue_style('sftExt-admin-icon-picker', $this->root . 'assets/css/fontawesome-iconpicker.css');
    7470            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');
    7773            wp_register_script('sftExt-admin-js', $this->root . 'assets/js/admin.js', array('jquery', 'sftExt-admin-icon-picker-js', 'sftExt-admin-color-picker'));
    7874            wp_enqueue_script( 'sftExt-admin-js');
  • safety-exit/trunk/lib/Safety_Exit_Frontend.php

    r2838741 r3057884  
    11<?php
     2
     3namespace SafetyExit;
    24/**
    35 * Handle all frontend stuff
     
    1315class Safety_Exit_Frontend {
    1416
    15     private $pluginRoot;
    16 
    1717    private $buttonInitialized = false;
    1818
    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
    2149    }
    2250    public function init() {
    2351        add_action('wp_enqueue_scripts', array($this, 'sftExt_enqueue'));
    2452        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 );
    2655        do_action( 'qm/debug', 'wp_body_open fired' );
    2756    }
     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    }
    2884    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        }
    3189
    3290        $args = wp_parse_args(get_option('sftExt_settings'), array(
     
    3896        }
    3997    }
    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;
    44153    }
    45154
  • safety-exit/trunk/postcss.config.js

    r2934107 r3057884  
    11const postcssPresetEnv = require('postcss-preset-env');
    22const postcssMinify = require('postcss-minify');
     3const autoprefixer = require('autoprefixer');
    34
    45
  • safety-exit/trunk/readme.txt

    r2934107 r3057884  
    44Donate link: https://tomascordero.com
    55Requires at least: 5.2.0
    6 Tested up to: 6.2.2
    7 Requires PHP: 5.2.4
    8 Stable tag: 1.6.5
     6Tested up to: 6.4.3
     7Requires PHP: 5.6.0
     8Stable tag: 1.7.0
    99License: GPL-2.0+
    1010License URI: https://www.gnu.org/licenses/gpl-2.0.html
     
    4848
    4949== Changelog ==
     501.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.
    50561.6.5:
    5157    - Refactor: Build pipeline
     
    7278    - Fixed: Updated CSS for round and square buttons to center icon.
    7379    - 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.
    75811.4.1:
    7682    - Fixed: Hot fix for the page selection tool
     
    8591    - New: Added option for square button
    8692    - 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 wouldnt display the icon correctly. That is fixed and should display correctly
     93    - Fixed: The round button had a bug where it wouldn't display the icon correctly. That is fixed and should display correctly
    88941.1.3:
    89     - Tweak: Made it so you arent 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
     95    - 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
    90961.0.3:
    9197    - Fixed: 404s on frontend
  • safety-exit/trunk/safety-exit.php

    r2934107 r3057884  
    1212 * Plugin URI:
    1313 * 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.5
     14 * Version:     1.7.0
    1515 * Author:      Tomas Cordero
    1616 * Author URI:  https://tomascordero.com
     
    1919 * Text Domain: safety-exit
    2020 */
     21require plugin_dir_path( __FILE__ ) . '/vendor/autoload.php';
     22
     23use SafetyExit\Safety_Exit_Frontend;
     24use SafetyExit\Safety_Exit_Admin;
    2125
    2226$path = realpath(dirname(__FILE__) . '/../../../')."/wp-includes/pluggable.php";
     
    5054    die;
    5155}
    52 foreach ( glob( plugin_dir_path( __FILE__ ) . 'lib/*.php' ) as $file ) {
    53     include_once $file;
    54 }
     56
    5557if( !$errors ) {
    5658    $url_path = parse_url( $_SERVER['REQUEST_URI'], PHP_URL_PATH );
  • safety-exit/trunk/src/css/frontend.css

    r2934107 r3057884  
     1
    12#sftExt-frontend-button {
     3    @media print {
     4        display: none !important;
     5    }
    26    @media screen, speech {
    37        .sr-only {
     
    913        }
    1014    }
     15    background-color: var(--sftExt_bgColor);
     16    color: var(--sftExt_textColor);
     17    display: var(--sftExt_active);
    1118    position: fixed;
    1219    border: none;
    13     display: inline-block;
    1420    cursor: pointer;
    1521    z-index: 9999;
     
    2026    width: 25px;
    2127    height: 25px;
     28
     29    @media (max-width: 600px) {
     30        display: var(--sftExt_activeMobile);
     31    }
    2232
    2333    &.round {
     
    5464    }
    5565    &.rectangle {
     66        font-size: var(--sftExt_rectangle_fontSize);
     67        letter-spacing: var(--sftExt_rectangle_letterSpacing);
     68        border-radius: var(--sftExt_rectangle_borderRadius);
    5669        padding: 10px 20px;
    5770        height: auto;
Note: See TracChangeset for help on using the changeset viewer.