Plugin Directory

Changeset 3490270


Ignore:
Timestamp:
03/24/2026 06:13:49 PM (4 days ago)
Author:
petredobrescu
Message:

Version 6.4.4

🌿 The Spring Update

Release Date: March 24, 2026

✨ New Feature

  • Exclusions by Filesize: You can now exclude images from optimization based on their file size, giving you even more precise control over what gets processed.

🛠️ Fixes

  • Bulk Operation Messaging: When running bulk actions other than optimization, the correct descriptive text is now displayed.
  • PICTURE Tag Fixes:
    • Fixed issues with certain background images not being handled correctly.
    • Multiple improvements to ensure correct paths and compatibility with Bedrock setups.
  • Long Domain Handling: Fixed cases where very long domains caused CDN URL replacement to fail.
  • Invalid API Key Feedback: A proper message is now shown in the AI settings preview when an invalid API key is used.
  • AI Disabled Notice Scope: "AI generation disabled" message now appears only in the settings preview to avoid conflicts (especially with the Classic Editor).
  • Async Chatbot Loading: The chatbot now loads asynchronously in settings to prevent slowdowns when CDN responses are delayed.
  • JS Worker Stability: The JavaScript worker no longer stops if invalid JSON is received from the backend.
  • LS Cache Compatibility: Fixed incompatibilities with LiteSpeed Cache and certain custom media folder setups.
  • Custom Media Errors: Resolved errors occurring during optimization of specific custom media folders.
  • open_basedir Improvements: Additional safeguards to prevent warnings with strict open_basedir configurations.
  • PHP 8.4 Deprecation Fix: Fixed a rare deprecation warning on PHP 8.4.

🛡️ Security Fixes

  • PHP Object Injection: Patched a potential vulnerability related to AI-generated SEO data (reported by PatchStack).
  • Stored XSS (Author+): Fixed an authenticated stored XSS vulnerability when using AI features (reported by WordFence).

✨ Tweaks & Improvements

  • Wording & Layout Updates: Small improvements to texts and settings layout for a cleaner and clearer experience.

Update now for stronger security, improved compatibility, and smarter control over your optimization workflows! 🚀

Location:
shortpixel-image-optimiser
Files:
62 edited
1 copied

Legend:

Unmodified
Added
Removed
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/Api/AiController.php

    r3400007 r3490270  
    240240      }
    241241     
    242       return $this->returnSuccess(['aiData' => $aiData], RequestManager::STATUS_SUCCESS, __('Retrieved AI image SEO data', 'shortpixel-image-optimiser')); ;
     242      return $this->returnSuccess(['aiData' => $aiData], RequestManager::STATUS_SUCCESS, __('Retrieved AI Image SEO data', 'shortpixel-image-optimiser')); ;
    243243    }
    244244
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/Api/ApiController.php

    r3423259 r3490270  
    360360                // Previous check here was for Item->files[$imageName] , not sure if currently needed.
    361361                // Check if image is not already in fileData.
     362
     363                if (is_array($fileData))
     364                {
     365                     $fileData = (object) $fileData;
     366                }
     367
    362368                if (is_null($fileData) || false === property_exists($fileData, $imageName)) {
    363369                    $imageList[$imageName] = $this->handleNewSuccess($qItem, $imageObject, $data);
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/Api/RequestManager.php

    r3400007 r3490270  
    106106
    107107        //only if $Blocking is true analyze the response
    108         if ( $requestParameters['blocking'] )
     108        if ( $requestParameters['blocking'] )
    109109        {
    110110                if ( is_object($response) && get_class($response) == 'WP_Error' )
     
    143143                elseif ( isset($response['response']['code']) && $response['response']['code'] <> 200 )
    144144                {
    145                         $errorMessage = $response['response']['code'] . " - " . $response['response']['message'];
    146145                        $errorCode = $response['response']['code'];
     146
     147            // try to extract a more useful error message from JSON body (if any)
     148                    // (like the one sent from ApiGpt via commons),
     149            // still there is fallback to the generic "code - Message" string :)
     150            $errorMessage = $response['response']['code'] . " - " . $response['response']['message'];
     151            if (isset($response['body']) && is_string($response['body']) && $response['body'] !== '') {
     152                $body = json_decode($response['body'], true);
     153                if (is_array($body) && isset($body['error']) && is_string($body['error']) && $body['error'] !== '') {
     154                    $errorMessage = $body['error'];
     155                }
     156            }
    147157
    148158            $qItem->addResult($this->returnFailure($errorCode, $errorMessage));
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/BulkController.php

    r3449706 r3490270  
    237237   protected function addLog($q)
    238238   {
    239         //$data = (array) $stats;
    240239                $stats = $q->getStats(); // for the log
    241240                $type = $q->getType();
    242             //  $customData = $q->getCustomDataItem('');
    243241
    244242        if ($stats->done == 0 && $stats->fatal_errors == 0)
     
    273271        {
    274272          $log = array_shift($logs);
    275           //$log_date = $log['date'];
    276                     //$log_type = $log['type'];
    277273                    if (isset($data['logfile']))
    278274                    {
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/Front/CDNController.php

    r3449706 r3490270  
    679679    {
    680680        $replacer = new Replacer();
    681         $content = $replacer->replaceContent($content, $urls, $new_urls);
     681        $content = $replacer->replaceContent($content, $urls, $new_urls, false, true);
    682682
    683683        return $content;
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/Front/PageConverter.php

    r3301690 r3490270  
    8282
    8383    if (isset($_GET['PageSpeed']) && 'off' === $_GET['PageSpeed'])
     84    {
     85       return false;
     86    }
     87
     88    if (isset($_GET['oxygen']) && 'builder' === $_GET['oxygen'])
    8489    {
    8590       return false;
     
    304309private function getDomain($url)
    305310{
    306     preg_match("/[a-z0-9\-]{1,63}\.[a-z\.]{2,6}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
     311    $matches = preg_match("/[a-z0-9\-]{1,63}\.[a-z\.]{2,63}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
     312    if (false === $matches || 0 === $matches) // If pattern fails.
     313    {
     314       return parse_url($url, PHP_URL_HOST);
     315    }   
     316
    307317    return $_domain_tld[0];
    308318}
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/Front/PictureController.php

    r3449706 r3490270  
    252252                {
    253253                  // FILTER: boolean, object, string, filedir
    254 
    255254                                 // Return fileObj if you want to live.
    256255                  $thisfile = $fileWebp_exists = apply_filters('shortpixel/front/webp_notfound', false, $thisfile, $image_url, $imageBase);
     
    300299      }
    301300
    302       $args = array();
     301      $args = [];
    303302
    304303      if ($webpCount > 0)
     
    317316  {
    318317    //preg_match_all('/background.*[^:](url\(.*\))[;]/isU', $content, $matches);
    319     // Pattern : Find the URL() from CSS, save any extra background information ( position, repeat etc ) in second group and terminal at ; or " (hopefully end of line)
    320     preg_match_all('/url\(.*\)(.*)(?:;|\"|\')/isU', $content, $matches);
    321 
    322     if (count($matches) == 0)
     318    // Pattern : Find the URL() from CSS, save any extra background information ( position, repeat etc ) in second group and terminate at ; or " (hopefully end of line)
     319    // Old pattern - /url\(.*\)(.*)(?:;|\"|\')/isU
     320    $pattern = '/(url\(.*?\))(.*?)(?:;|\"|\')/is';
     321    preg_match_all($pattern, $content, $matches);
     322
     323    if (count($matches) == 0 || count($matches[1]) == 0)
     324    {
    323325      return $content;
    324 
    325     $content = $this->convertInlineStyle($matches, $content);
     326    }
     327
     328    $filtered = [];
     329    // Create a name array to make code clearer. First match (item) is url(xx).  Imagedata is shorthand properties that might follow but before end of background declararation.
     330    for ($i = 0; $i < count($matches[1]); $i++)
     331    {
     332      $filtered[] = ['item' => $matches[1][$i], 'imagedata' => $matches[2][$i]];
     333    }
     334
     335    $content = $this->convertInlineStyle($filtered, $content);
    326336    return $content;
    327337  }
     
    331341  * @param $match Regex match for inline style
    332342  * @return String Replaced (or not) content for webp.
    333   * @author Bas Schuiling
    334343  */
    335344  protected function convertInlineStyle($matches, $content)
    336345  {
    337 
    338346    $fs = \wpSPIO()->filesystem();
    339347    $allowed_exts = array('jpg', 'jpeg', 'gif', 'png');
    340348    $converted = array();
    341349
    342     for($i = 0; $i < count($matches[0]); $i++)
     350    foreach($matches as $match)
    343351    {
    344       $item = $matches[0][$i];
    345 
    346       $image_data = '';
    347       if (isset($matches[1][$i]) && strlen(trim($matches[1][$i])) > 0)
    348       {
    349           $image_data = trim($matches[1][$i]);
    350       }
    351 
    352       preg_match('/url\(\'(.*)\'\)/imU', $item, $match);
    353       if (! isset($match[1]))
     352       $item = $match['item'];
     353       $image_data = '';
     354       if (isset($match['imagedata']) && strlen(trim($match['imagedata'])) > 0)
     355       {
     356         $image_data = $match['imagedata'];
     357       }
     358
     359      //preg_match('/url\(\'(.*)\'\)/imU', $item, $url_match);
     360      // Fix: backgrounds might not have ' ' in URL area.
     361      preg_match('/url\((.*)\)/imU', $item, $url_match);
     362      if (! isset($url_match[1]))
    354363      {
    355364        continue;
    356365      }
    357       $url = $match[1];
     366      // Remove any removing " ' to get the pure URL.
     367      $url = str_replace(['\'', '"'],'', $url_match[1]);
    358368      $filename = basename($url);
    359369      $ext = pathinfo($url, PATHINFO_EXTENSION);
     
    401411      {
    402412          // if webp, then add another URL() def after the targeted one.  (str_replace old full URL def, with new one on main match?
    403           $target_urldef = $matches[0][$i];
     413          $target_urldef = $item; //$match[0][$i];
    404414         
    405415          // The target_urldef should remain original to be picked up by str_replace, but the original_definitions are what goes back of the original stuff and should be filtered.
     
    410420            $converted[] = $target_urldef;
    411421            // Fix: The originals are not being put anymore because this would lead to double images and that's not a good thing.
    412             $new_urldef = "url('" . $checkedFile . "') $image_data ;";
     422            //            $new_urldef = "url('" . $checkedFile . "') $image_data ;";
     423            // Fix2 :: The image_data should not be matched anymore via main match, perhaps it works in all cases to leave it alone?
     424            $new_urldef = "url('" . $checkedFile . "') ";
    413425            $content = str_replace($target_urldef, $new_urldef, $content);
    414426          }
    415427      }
    416428
    417     }
    418 
     429    } // FOREACH
     430 
    419431    return $content;
    420432  }
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/Optimizer/OptimizeAiController.php

    r3449706 r3490270  
    569569            {
    570570                Log::addInfo('Running Ai Replace : ', [$aiData, $sources, $replaces]);
    571                 $content = $replacer2->replaceContent($content, $sources, $replaces);
     571                $content = $replacer2->replaceContent($content, $sources, $replaces, false, true);
    572572                $replacer2->Updater()->updatePost($post_id, $content);
    573573            }
     
    754754}
    755755
     756/**
     757 * Generate the AI Data so that it can be shown public-facing.
     758 *
     759 * @param mixed $generated
     760 * @param mixed $current
     761 * @param mixed $original
     762 * @param bool $isPreview
     763 * @return (string[]|mixed)[]
     764 */
    756765public function formatGenerated($generated, $current, $original, $isPreview = false)
    757766{
     
    782791       {
    783792         // If preview don't fall back on other stuff, just leave it empty.
    784           $value = __('AI generation disabled', 'shortpixel-image-optimiser');
    785 
    786           /*if (true === $isPreview)
    787           {
    788              $value = '';
    789           }
    790           elseif (isset($current[$name]))
    791           {
    792                $value = $current[$name];
    793           }
    794           elseif(isset($original[$name]))
    795           {
    796                $value = $original[$name];
    797           } */
    798           $generated[$name] = $value;
     793         
     794         $value = '';
     795         $generated[$name] = $value;
    799796       }
    800797  }
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/QueueController.php

    r3449706 r3490270  
    7979      {
    8080         $qItem->data()->returndatalist = $args['returndatalist'];
     81      }
     82
     83      if (true === $args['forceExclusion'])
     84      {
     85         $qItem->data()->forceExclusion = $args['forceExclusion'];
    8186      }
    8287
     
    667672             }
    668673          }
     674          else // If key does not exist, still add value from media to totals.
     675          {
     676            $object->stats->$key = $value;
     677          }
    669678      }
    670679
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/View/BulkViewController.php

    r3449706 r3490270  
    269269                $kbinfo = '<span class="kbinfo"><a href="' . $kblink . '" target="_blank" ><span class="dashicons dashicons-editor-help">&nbsp;</span></a></span>';
    270270
    271 
    272 
    273271                $output .= '<div class="fatal">';
    274272                $output .= $date . ': ';
  • shortpixel-image-optimiser/tags/6.4.4/class/Controller/View/SettingsViewController.php

    r3400007 r3490270  
    566566
    567567
    568 // Basically this whole premise is impossible.
    569568      public function loadDashBoardInfo()
    570569      {
     
    918917                            'exclusion-width',
    919918                            'exclusion-height',
     919              'exclusion-filesize-value',
     920              'exclusion-filesize-denom',
     921              'exclusion-filesize-operator',
    920922                            'apply-select',
    921923                            'screen_action',
  • shortpixel-image-optimiser/tags/6.4.4/class/Model/EnvironmentModel.php

    r3400007 r3490270  
    9898    public function checkPHPVersion($needed)
    9999    {
    100 
    101100         if (version_compare(PHP_VERSION, $needed) >= 0 )
    102101         {
  • shortpixel-image-optimiser/tags/6.4.4/class/Model/File/DirectoryModel.php

    r3289850 r3490270  
    4747
    4848      // Test if path actually has someting, otherwise just bail.
    49       if (strlen(trim($path)) == 0)
     49      if (strlen(trim($path ?? '')) == 0)
    5050      {
     51        $this->path = ''; // prevent various PHP string-function errors
    5152         return false;
    5253      }
     
    129130  public function getModified()
    130131  {
    131     return filemtime($this->path);
     132    return filemtime($this->path ?? '');
    132133  }
    133134
  • shortpixel-image-optimiser/tags/6.4.4/class/Model/File/FileModel.php

    r3423259 r3490270  
    4848  protected $backupDirectory;
    4949
    50   private $basedirs; // cache basedirs
     50  private static $basedirs; // cache basedirs - static so for all objects during this run.
    5151
    5252  const FILE_OK = 1;
     
    6767        {
    6868             Log::addWarn('FileModel: Loading null path! ');
     69       $this->fullpath = '';
    6970             return false;
    7071        }
     
    679680    }
    680681
    681 
    682       if (! is_null($this->basedirs))
    683       {
    684          $basedirs = $this->basedirs;
    685          if (false === $basedirs) // if no restrictions are set, return false.
     682      if (! is_null(self::$basedirs) && false === self::$basedirs)
     683      {
     684         $basedirs = self::$basedirs;
     685         if (false === $basedirs) // if no restrictions are set, return false. otherwise use set basedirs for check.s
    686686         {
    687687            return false;
     
    693693        if (false === $basedir || strlen($basedir) == 0)
    694694        {
    695             $this->basedirs = false;
     695            self::$basedirs = false;
    696696            return false;
    697697        }
     
    700700        $basedirs = preg_split('/:|;/i', $basedir);
    701701
     702        // Remove blanket dirs like / from here since that could cause false positives on the strpos check on the path
     703        $basedirs = array_diff($basedirs, ['/', '//', '.', '..']);
     704
     705        // If the only openbasedir is broad, then restricted is false
     706        if (0 === count($basedirs))
     707        {
     708           $restricted = false;
     709        }
     710
    702711        foreach($basedirs as $basedir)
    703712        {
    704            // check realpath for symlinked shared hosts and this kind of fun, to prevent false positives
    705            $realdir = trailingslashit(realpath($basedir));
    706            if (! in_array($realdir, $basedirs))
     713           // check realpath for symlinked shared hosts and this kind of fun, to prevent false positives\
     714           // Fixes - Don't trailingslashit because it adds all paths if basedir has a config with last slashes
     715           // Fixes - Check for false on realpath.
     716           $realdir = realpath($basedir);
     717           if ($realdir !== false && false === in_array($realdir, $basedirs))
    707718           {
    708              $basedirs[] = $realdir;
     719             $basedirs[] = trailingslashit($realdir);
    709720           }
    710721        }
    711722
    712         $this->basedirs = $basedirs;
     723        self::$basedirs = $basedirs;
    713724
    714725      }
     
    724735
    725736     $restricted = apply_filters('shortpixel/file/basedir_check', $restricted, $path, $basedirs);
    726 
    727737     $this->is_restricted = $restricted;
    728738
     
    840850      if (strpos($path, $uploadDir->getPath()) !== false) // If upload Dir is feature in path, consider it ok.
    841851      {
    842         return $path;
    843       }
    844       elseif (file_exists($abspath->getPath() . $path)) // If upload dir is abspath plus return path. Exceptions.
    845       {
    846         return $abspath->getPath() . $path;
    847       }
    848       elseif(file_exists($uploadDir->getPath() . $path)) // This happens when upload_dir is not properly prepended in get_attachment_file due to WP errors
    849       {
    850           return $uploadDir->getPath() . $path;
     852        $fullpath = $path;
     853      }
     854      elseif (file_exists($abspath->getPath() . ltrim($path, '/')) ) // If upload dir is abspath plus return path. Exceptions.
     855      {
     856        $fullpath = $abspath->getPath() . ltrim($path, '/');
     857      }
     858      elseif(file_exists($uploadDir->getPath() . ltrim($path, '/')) ) // This happens when upload_dir is not properly prepended in get_attachment_file due to WP errors
     859      {
     860        $fullpath = $uploadDir->getPath() . ltrim($path, '/');
     861      }
     862      else  // Default if nothing else.
     863      {
     864        /* Check if the last part of abspath and first part of path are overlapping.  This can happen at sites where the
     865        app path is relative to root, but also included in the abspath ( ie /app/etc ) on bedrock installs. Try to remove the overlap */
     866        $overlap = null;
     867        $maxOverlap = min(strlen($abspath), strlen($path));
     868        for ($i = $maxOverlap; $i > 0; $i--) {
     869            if (substr($abspath, -$i) === substr($path, 0, $i)) {
     870                $overlap = $i;
     871                break;
     872            }
     873        }
     874        // Combine paths, removing the overlap
     875        if ($overlap !== null && is_int($overlap))
     876        {
     877          $fullpath = rtrim($abspath) . substr($path, $overlap);
     878        }
     879        else  // just glue then.
     880        {
     881          $path = ltrim($path, '/');
     882          $fullpath = $abspath->getPath() . $path;
     883        }
    851884      }
    852885
    853886      // this is probably a bit of a sharp corner to take.
    854887      // if path starts with / remove it due to trailingslashing ABSPATH
    855       $path = ltrim($path, '/');
    856       $fullpath = $abspath->getPath() . $path;
    857888
    858889      // We can't test for file_exists here, since file_model allows non-existing files.
    859890      // Test if directory exists, perhaps. Otherwise we are in for a failure anyhow.
    860891      //if (is_dir(dirname($fullpath)))
    861           return $fullpath;
     892
     893      // File is restricted is cached, otherwise leading to double check on relativepath.
     894      $this->is_restricted = false;
     895      return $fullpath;
    862896      //else
    863897      //    return $originalPath;
    864898  }
     899
     900
    865901
    866902    public function getPermissions()
  • shortpixel-image-optimiser/tags/6.4.4/class/Model/Image/ImageModel.php

    r3449706 r3490270  
    293293            self::P_EXCLUDE_PATH,
    294294            self::P_EXCLUDE_SIZE,
     295            self::P_EXCLUDE_FILESIZE,
    295296        );
    296297
     
    410411    {
    411412        if (! $this->exists())
     413        {
    412414          return false;
     415        }
    413416        if ($this->is_virtual()) // if virtual, don't filecheck on image.
    414417        {
     
    419422        }
    420423
    421                 if (! is_null($this->mime))
    422                 {
    423                     return true;
    424                 }
    425 
    426                 if (\wpSPIO()->env()->is_function_usable('finfo_open')) // Faster function for getting mime types
     424
     425                if (is_null($this->mime) && \wpSPIO()->env()->is_function_usable('finfo_open')) // Faster function for getting mime types
    427426                     {
    428427                         $fileinfo = finfo_open(FILEINFO_MIME_TYPE);
    429428                         $this->mime = finfo_file($fileinfo, $this->getFullPath());
    430                          finfo_close($fileinfo);
     429             // Deprecated from version 8.5
     430             if (false === \wpSPIO()->env()->checkPHPversion('8.5') )
     431             {
     432                          finfo_close($fileinfo);
     433             }
    431434                         //FILEINFO_MIME_TYPE
    432435                    }
    433                     elseif(\wpSPIO()->env()->is_function_usable('mime_content_type')) {
     436                    elseif(is_null($this->mime) && \wpSPIO()->env()->is_function_usable('mime_content_type')) {
    434437                        $this->mime = mime_content_type($this->getFullPath());
    435438                    }
    436                     else {
     439                    elseif(is_null($this->mime)) {
    437440                        return true; // assume without check, that extension says what it is.
    438441                        // @todo This should probably trigger a notice in adminNoticesController.
    439442                    }
    440443
    441             if (strpos($this->mime, 'image') >= 0)
     444            if (strpos($this->mime, 'image') !== false)
    442445               return true;
    443446            else
     
    13041307        $bool = false;
    13051308        // Support for operators, more characters should be first in array
    1306         $operators = ['<=', '>=', '<', '>' ];
     1309       // $operators = ['<=', '>=', '<', '>' ];
    13071310       
    13081311        foreach($excludePatterns as $item)
     
    13191322               }
    13201323
    1321                $item_value = $item['value'];
    1322                $operator = ">";
     1324               $item_value = explode(' ', $item['value']);
     1325               if (! is_array($item_value) && count($item_value) <> 3)
     1326               {
     1327                 return false;
     1328               }
    13231329               
    1324                foreach($operators as $this_operator)
     1330               $operator = $item_value[0];
     1331               $value = $item_value[1];
     1332               $bytes = $item_value[2];
     1333             
     1334               if ('B' == $bytes)
    13251335               {
    1326                   if (strpos($item_value, $this_operator) !== false)
    1327                   {
    1328                      // Allow this operator.
    1329                      $operator = $this_operator;
    1330                      // Remove it from string
    1331                      $item_value = str_replace($this_operator, '', $item_value);
    1332                   }
     1336                 $compare_bytes = $value;
    13331337               }
    1334 
    1335                $compare_bytes = (int) UtilHelper::convertExclusionFileSizeToBytes($item_value);         
    1336                
     1338               else
     1339               {
     1340                $compare_bytes = (int) UtilHelper::convertExclusionFileSizeToBytes($value . $bytes);         
     1341               }
    13371342               // About version_compare for this
    1338               $bool = version_compare($compare_bytes, $filesize, $operator);
    1339               //$bool2 =
     1343              if ('>' == $operator &&  $filesize > $compare_bytes)
     1344              {
     1345                 $bool = true;
     1346              }
     1347              elseif ('<' == $operator &&  $filesize < $compare_bytes)
     1348              {
     1349                 $bool = true;
     1350              }
    13401351             
    13411352              if (true === $bool)
  • shortpixel-image-optimiser/tags/6.4.4/class/external/cache.php

    r3335876 r3490270  
    8484        // important - first check the available cache plugins
    8585        $this->checkCaches();
    86 
     86       
    8787        $bool = apply_filters('shortpixel/external/flush_cache', true, $post_id, $imageItem);
    8888        if (false === $bool)
     
    165165
    166166            $urls = $imageItem->getAllUrls();
    167       $urls = array_values($urls['urls']);
     167     
     168      // The URLS part doesn't return in the customImageModel, use the whole array instead.
     169      $urls = array_values($urls['urls'] ?? $urls);
    168170            foreach($urls as $url)
    169171            {
  • shortpixel-image-optimiser/tags/6.4.4/class/view/bulk/part-finished.php

    r3449706 r3490270  
    5151            <?php printf(__('Congratulations, ShortPixel has optimized %s %s images and thumbs %s for your website! Yay to faster loading websites! %s', 'shortpixel-image-optimiser'), '<b>', '<span data-stats-total="total"></span>','</b>', '&#x1F389;');
    5252            ?>
    53 <!--            <br>
    54             <?php
    55             printf(__('ShortPixel plugins are installed on hundreds of thousands of websites and we save our users over 500 GB by optimizing over 15 million images. Each and every day! %s', 'shortpixel-image-optimiser'), '&#x1F4AA;');
    56             ?>
    57             <br>
    58         <?php
    59             printf(__('We have been working on improving ShortPixel every day for over 7 years. It is very motivating for us when customers take a minute to leave us a %sreview%s. We thank you for that! %s', 'shortpixel-image-optimiser'), '<a href="https://wordpress.org/support/plugin/shortpixel-image-optimiser/reviews/?filter=5" target="_blank">','</a>', '&#x1F64C;');
    60         ?> -->
    6153        </p>
    6254    </div>
    63  
     55  <div class='bulk-summary' data-check-visibility="true" data-control='data-check-total-customOperation'>
     56        <p class='finished-paragraph'>
     57            <?php printf(__('ShortPixel has completed the %s task', 'shortpixel-image-optimiser'), '<span data-stats-total="customOperation">&nbsp;</span>');
     58            ?>
     59        </p>
     60    </div>
    6461
    6562    <div class='bulk-summary' data-check-visibility data-control="data-check-media-total">
  • shortpixel-image-optimiser/tags/6.4.4/class/view/settings/part-ai.php

    r3449706 r3490270  
    392392      <div class='icon'><i class='shortpixel-icon chevron rotate_right'></i>&nbsp;</div>
    393393      <div class='result result_info'>
    394         <h3><?php _e('Generated AI image SEO data', 'shortpixel-image-optimiser'); ?></h3>
     394        <h3><?php _e('Generated AI Image SEO data', 'shortpixel-image-optimiser'); ?></h3>
    395395        <ul>
    396396<!--          <li><label><?php _e('Image filemame', 'shortpixel-image-optimiser'); ?>:</label> <span class='filename'></span>
  • shortpixel-image-optimiser/tags/6.4.4/class/view/settings/part-exclusions.php

    r3449706 r3490270  
    234234                               <option value='path' data-example="/path/"><?php _e('Image Path', 'shortpixel-image-optimiser'); ?></option>
    235235                               <option value='size' data-example="widthXheight-widthXheight"><?php _e('Image Size', 'shortpixel-image-optimiser'); ?></option>
    236                           <!--     <option value='filesize' data-example="500KB / 1MB"><?php _e('Image Filesize', 'shortpixel-image-optimiser'); ?></option> -->
     236                               <option value='filesize' data-example="500KB / 1MB"><?php _e('Image Filesize', 'shortpixel-image-optimiser'); ?></option>
    237237                               <option value='date' data-example="YYYY-MM-DD"><?php _e('Date', 'shortpixel-image-optimiser') ?></option>
    238238                           </select>
     
    296296                          </select>
    297297                          <select name='exclusion-filesize-operator'>
    298                               <option value='lower'><?php _e('Exclude smaller than given filesize', 'shortpixel-image-optimiser'); ?></option>
    299                               <option value='higher' selected><?php _e('Exclude higher than given filesize', 'shortpixel-image-optimiser'); ?></option>
     298                              <option value='<'><?php _e('Exclude smaller than given filesize', 'shortpixel-image-optimiser'); ?></option>
     299                              <option value='>' selected><?php _e('Exclude higher than given filesize', 'shortpixel-image-optimiser'); ?></option>
    300300                          </select>
    301301
  • shortpixel-image-optimiser/tags/6.4.4/class/view/settings/part-tools.php

    r3400007 r3490270  
    118118
    119119
    120     <h3><?php _e('Settings import / export', 'shortpixel-image-optimiser'); ?></h3>
     120    <h3><?php _e('Settings Import / Export', 'shortpixel-image-optimiser'); ?></h3>
    121121    <settinglist class='setting-importexport'>
    122122      <setting>
     
    126126        </content>
    127127      </setting>
     128
     129      <div id='settings-importexport-message' class='tools-message export-message'>&nbsp;</div>
     130
    128131      <setting>
    129132        <name><?php _e('Import settings', 'shortpixel-image-optimiser'); ?></name>
     
    137140     
    138141      </setting>
    139 
    140       <div id='settings-importexport-message' class='tools-message export-message'>&nbsp;</div>
    141 
    142142    </settinglist>
    143143
  • shortpixel-image-optimiser/tags/6.4.4/class/view/snippets/media-popup.php

    r3400007 r3490270  
    2222    case 'remove':
    2323        $modal_title = __('AI Background Removal', 'shortpixel-image-optimiser');
    24         $suggesteFileName = $originalImage->getFileBase() . '_nobg.' . $originalImage->getExtension();
     24        $suggestedFileName = $originalImage->getFileBase() . '_nobg.' . $originalImage->getExtension();
    2525
    2626    break;
     
    2828    case 'scale':
    2929        $modal_title = __('AI Image Upscale', 'shortpixel-image-optimiser');
    30         $suggesteFileName = $originalImage->getFileBase() . '_upscale.' . $originalImage->getExtension();
     30        $suggestedFileName = $originalImage->getFileBase() . '_upscale.' . $originalImage->getExtension();
    3131
    3232    break;
     
    5555?>
    5656
    57 <div class="modal-wrapper" id="media-modal" data-item-id="<?php echo $this->data['item_id'] ?>" data-action-name="<?php echo $action_name ?>" >
     57<div class="modal-wrapper" id="media-modal" data-item-id="<?php echo intval($this->data['item_id']) ?>" data-action-name="<?php echo esc_attr($action_name) ?>" >
    5858    <div class="title"><h3><?php echo $modal_title ?> <span data-action='close'>X</span></h3> </div>
    5959    <div class='modal-content-wrapper'>
     
    6161    <div class="image-wrapper">
    6262            <div class="image-original">
    63                 <i style="background-image: url('<?php echo $previewImage->getURL(); ?>');"></i>
     63                <i style="background-image: url('<?php echo esc_url($previewImage->getURL()); ?>');"></i>
    6464                <span><?php _e('Before', 'shortpixel-image-optimiser'); ?>
    6565            </div>
     
    6969            <div class="image-preview">
    7070                <span><?php _e('After', 'shortpixel-image-optimiser'); ?></span>
    71                 <i data-placeholder="<?php echo $placeholderImage ?>" style="background-image: url('<?php echo $placeholderImage ?>');" ></i>
     71                <i data-placeholder="<?php echo esc_url($placeholderImage) ?>" style="background-image: url('<?php echo esc_url($placeholderImage) ?>');" ></i>
    7272                <div class='error-message shortpixel-hide'>&nbsp;</div>
    7373                <div class='load-preview-spinner shortpixel-hide'><img class='loadspinner' src="<?php echo esc_url(\wpSPIO()->plugin_url('res/img/bulk/loading-hourglass.svg')); ?>" /></div>
     
    132132            <span>
    133133                <p><?php _e('New File Name', 'shortpixel-image-optimiser'); ?></p>
    134                 <input type="text" name="new_filename" value="<?php echo $suggesteFileName ?>">
     134                <input type="text" name="new_filename" value="<?php echo esc_attr($suggestedFileName) ?>">
    135135            </span>
    136136
    137137            <span>
    138138                <p><?php _e('New Image Title', 'shortpixel-image-optimiser'); ?></p>
    139                 <input type="text" name="new_posttitle" value="<?php echo $post_title ?>">
     139                <input type="text" name="new_posttitle" value="<?php echo esc_attr($post_title) ?>">
    140140            </span>
    141141
  • shortpixel-image-optimiser/tags/6.4.4/class/view/snippets/part-aitext.php

    r3449706 r3490270  
    6060        <a class='button button-secondary' title="Generate image SEO data with ShortPixel AI (Beta)" href="javascript:window.ShortPixelProcessor.screen.RequestAlt(<?php echo $item_id ?>)">
    6161            <img class="shortpixel-ai-icon ai" src="<?php echo $ai_icon ?>">   
    62             <span><?php printf(__('AI image SEO by ShortPixel %s', 'shortpixel-image-optimiser'), $dataItems) ?></span>
     62            <span><?php printf(__('AI Image SEO by ShortPixel %s', 'shortpixel-image-optimiser'), $dataItems) ?></span>
    6363            <img class="shortpixel-ai-icon shortpixel" src="<?php echo $robo_icon ?>">
    6464        </a>
  • shortpixel-image-optimiser/tags/6.4.4/readme.txt

    r3449706 r3490270  
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 6.4.3
     7Stable tag: 6.4.4
    88License: GPLv2 or later
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    488488
    489489== Changelog ==
     490
     491= 6.4.4 =
     492
     493🌿 The Spring Update
     494
     495Release Date: March 24, 2026
     496
     497✨ New Feature
     498
     499* Exclusions by Filesize: You can now exclude images from optimization based on their file size, giving you even more precise control over what gets processed.
     500
     501🛠️ Fixes
     502
     503* Bulk Operation Messaging: When running bulk actions other than optimization, the correct descriptive text is now displayed.
     504* PICTURE Tag Fixes:
     505  - Fixed issues with certain background images not being handled correctly.
     506  - Multiple improvements to ensure correct paths and compatibility with Bedrock setups.
     507* Long Domain Handling: Fixed cases where very long domains caused CDN URL replacement to fail.
     508* Invalid API Key Feedback: A proper message is now shown in the AI settings preview when an invalid API key is used.
     509* AI Disabled Notice Scope: "AI generation disabled" message now appears only in the settings preview to avoid conflicts (especially with the Classic Editor).
     510* Async Chatbot Loading: The chatbot now loads asynchronously in settings to prevent slowdowns when CDN responses are delayed.
     511* JS Worker Stability: The JavaScript worker no longer stops if invalid JSON is received from the backend.
     512* LS Cache Compatibility: Fixed incompatibilities with LiteSpeed Cache and certain custom media folder setups.
     513* Custom Media Errors: Resolved errors occurring during optimization of specific custom media folders.
     514* open_basedir Improvements: Additional safeguards to prevent warnings with strict open_basedir configurations.
     515* PHP 8.4 Deprecation Fix: Fixed a rare deprecation warning on PHP 8.4.
     516
     517🛡️ Security Fixes
     518
     519* PHP Object Injection: Patched a potential vulnerability related to AI-generated SEO data (reported by PatchStack).
     520* Stored XSS (Author+): Fixed an authenticated stored XSS vulnerability when using AI features (reported by WordFence).
     521
     522✨ Tweaks & Improvements
     523
     524* Wording & Layout Updates: Small improvements to texts and settings layout for a cleaner and clearer experience.
     525
     526Update now for stronger security, improved compatibility, and smarter control over your optimization workflows! 🚀
    490527
    491528= 6.4.3 =
  • shortpixel-image-optimiser/tags/6.4.4/res/css/shortpixel-settings.css

    r3423259 r3490270  
    3131
    3232div.spio-modal-shade {
    33   position: fixed; /* Stay in place */
    34   z-index: 10; /* Sit on top - zindex wars  */
     33  position: fixed;
     34  /* Stay in place */
     35  z-index: 10;
     36  /* Sit on top - zindex wars  */
    3537  left: 0;
    3638  top: 0;
    37   width: 100%; /* Full width */
    38   height: 100%; /* Full height */
    39   overflow: auto; /* Enable scroll if needed */
    40   background-color: rgb(0, 0, 0); /* Fallback color */
    41   background-color: rgba(0, 0, 0, 0.4); /* Black w/ opacity */
     39  width: 100%;
     40  /* Full width */
     41  height: 100%;
     42  /* Full height */
     43  overflow: auto;
     44  /* Enable scroll if needed */
     45  background-color: black;
     46  /* Fallback color */
     47  background-color: rgba(0, 0, 0, 0.4);
     48  /* Black w/ opacity */
    4249}
    4350
     
    5057  padding: 20px 16px 6px 16px;
    5158  border: 1px solid #888;
    52   width: 40%; /* Could be more or less, depending on screen size */
     59  width: 40%;
     60  /* Could be more or less, depending on screen size */
    5361  max-width: 100%;
    54   min-width: 300px; /* Could be more or less, depending on screen size */
    55   z-index: 100; /* Proper z-index */
     62  min-width: 300px;
     63  /* Could be more or less, depending on screen size */
     64  z-index: 100;
     65  /* Proper z-index */
    5666  position: fixed;
    5767  top: 10%;
     
    135145}
    136146.wrap.is-shortpixel-settings-page .shortpixel-settings button:hover, .wrap.is-shortpixel-settings-page .shortpixel-settings .button-setting:hover {
    137   background: rgb(50.3421052632, 215.4868421053, 228.6578947368);
     147  background: #32d7e5;
    138148}
    139149.wrap.is-shortpixel-settings-page .shortpixel-settings button i.switch, .wrap.is-shortpixel-settings-page .shortpixel-settings .button-setting i.switch {
     
    241251}
    242252.wrap.is-shortpixel-settings-page .shortpixel-settings section.wrapper .setting-tab .save-buttons.saving button.save {
    243   background-color: rgb(14.3684210526, 104.4473684211, 111.6315789474);
     253  background-color: #0e6870;
    244254}
    245255.wrap.is-shortpixel-settings-page .shortpixel-settings section.wrapper .setting-tab .save-buttons.saving button.save i {
     
    462472}
    463473.wrap.is-shortpixel-settings-page header .top-buttons a:hover, .wrap.is-shortpixel-settings-page header .top-buttons button:hover {
    464   background: rgb(50.3421052632, 215.4868421053, 228.6578947368);
     474  background: #32d7e5;
    465475}
    466476.wrap.is-shortpixel-settings-page header .top-buttons a i.switch, .wrap.is-shortpixel-settings-page header .top-buttons button i.switch {
     
    11951205}
    11961206.wrap.is-shortpixel-settings-page #tab-overview .wrapper .dashboard-button:hover {
    1197   background: rgb(50.3421052632, 215.4868421053, 228.6578947368);
     1207  background: #32d7e5;
    11981208}
    11991209.wrap.is-shortpixel-settings-page #tab-overview .wrapper .dashboard-button i.switch {
     
    18231833  height: 0;
    18241834  transition: 500ms height;
     1835  margin: 0;
     1836  padding: 0;
    18251837}
    18261838.wrap.is-shortpixel-settings-page #tab-exclusions .exclude-patterns-setting .new-exclusion .size-option > div {
     
    21462158  min-height: 44px;
    21472159  color: #1ABDCA;
    2148   background-color: rgb(232.25, 232.25, 232.25);
     2160  background-color: #e8e8e8;
    21492161  border-radius: 6px;
    21502162  font-weight: 700;
     
    21542166}
    21552167.wrap.is-shortpixel-settings-page #tab-tools .button:hover {
    2156   background: rgb(50.3421052632, 215.4868421053, 228.6578947368);
     2168  background: #32d7e5;
    21572169  color: #fff;
    21582170}
  • shortpixel-image-optimiser/tags/6.4.4/res/css/shortpixel-settings.css.map

    r3423259 r3490270  
    1 {"version":3,"sourceRoot":"","sources":["../scss/elements/_fonts.scss","../scss/view/_inline-help.scss","../scss/shortpixel-settings.scss","../scss/view/_settings.scss","../scss/view/_settings-advanced.scss","../scss/view/_settings-onboarding.scss","../scss/view/_settings-structure.scss","../scss/elements/_mixins.scss","../scss/elements/_colors.scss","../scss/elements/_animation.scss","../scss/elements/_breakpoints.scss","../scss/elements/_header.scss","../scss/elements/_icons.scss","../scss/view/_settings-optimisation.scss","../scss/view/_settings-overview.scss","../scss/view/_settings-ai.scss","../scss/view/_settings-exclusions.scss","../scss/view/_settings-integrations.scss","../scss/view/_settings-tools.scss","../scss/elements/_setting.scss"],"names":[],"mappings":"AAEA;EAEI;EACA;EACA;EACA;;AAGJ;EAGI;EACA;EACA;EACA;;ACfJ;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;;AAIJ;EAEE;EACA;;;AAIF;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEJ;EACI;AACA;EACF;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AACA;EACI;EACA;EACA;;AAEN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACI;;;AAEJ;EAAa;;;ACrEb;ACgBC;AA8WC;ACtYF;ACoJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AClJG;EAEE;;AAEF;EAA6B;;AAK7B;EAA2B;;AAK3B;EAAO;;AACP;EAAuC;;AAG1C;EAGG;EACD;EACA;EACA;EACA;EACA;;AAIA;EC9BA;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;ADUF;EAEE;;AACA;EAAQ;;AAGV;EACE;EACA;EACA;;AAEA;EACE;EACA;EACE,cExCO;EFyCT;;AACD;EAEC;EACA;;AAEC;EACC;EAEA;EACA;EACA,OErDK;EFsDL;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;;AAED;EAEI,OEpEG;;AFyEP;EACC,OE1EM;EF2EN;;AAOL;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cEvFW;;AF0Fb;EAEE;EAGA;;AAEA;EAEC;EACA;EACA;;AACA;EACE;EACA;;AAKD;EACC;EACA;EACA;EACA;EACA;EACA,OE7HS;;AF+HV;EACG;EACD;EACA;;AAGF;EAEE;;AAGH;EACC;EACA;EAEA;;AAGC;EACA;EACA;EACA;;AAEC;EACA;;AAKD;EAEC;;AACA;EG9JN;EACI;EACA;EACA;EACA;EH4JE;EACA;;AG3JP;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;ACXpC;EJ6JG;IACC;;EACA;IAEC;IACA;IACA;;;AAOP;EAEE;;AAGF;EACE;;AAGC;EAEC;;AAIF;EAEE;;AAGJ;EAEE;;AACA;EAEC;;AACA;EACC;;AAIF;EAEE;EACD;;AAED;EAEC;EACA;;AAED;EAEA;EAEA;;AIvNA;EJgOF;IACE;;EAGC;IAEE;;EAGH;IACC;IACA;;;AI3OD;EJmPF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EACA;IAEC;IACA;IACA;;EAED;IACC;;EACA;IACC;;EAED;IACC;;EAKJ;IACE;;EAEF;AAmCE;AAAA;AAAA;;EAjCA;IACC;IACA;IACA;IACA;IAuBA;IACA;;EAvBA;IACC;IACA;;EAIC;IACC;;EAID;IACC;;EAED;IACC;IACA;IACD;IACA;;EAOH;IACC;;EAKD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAED;IAEC;;EAGH;IACC;;EAED;IACC;;EACA;IACC;;;AK1VJ;EAEI;EACA;EACA;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACH;;AAEM;EJ5BL;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;AIOM;EACE,QHTG;EGUH;EACA;EACP;EACA;;AC5BL;EAEE;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;;AACA;EACG;;AAOH;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AAIJ;EAGE;EACA;EACA;EACA;EACA;;AAEA;EAEI;EACA;EACA;;AAGJ;EACE;EACA;EACA;;ACnDF;EACC;;AAKE;EACC;EACA;EACA;;AAEF;EACC;EACA;EACA;;AAID;EAEE;;AAEF;EACC;;AAEF;EACE;EACA;EAEA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA,kBLlCQ;EKmCR;;AAEF;EACE;;AACA;EACE,kBLvCI;;AK+CX;EAEC;EACA;EACA;;AAED;EAEC;;AAED;EAEE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAK;EAAe;;AAEpB;EACC;;AAED;EAAwB;EAAiB;;AAI3C;EAEE;EACA;EACA;EACA;;AAIF;EAEE;;AAOA;EACE;EACD;EACA;EACA;EACA;EACA;;AAED;EACE;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKH;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AHtHF;EG+GF;IAWI;;;AH1HF;EG+GF;IAeK;;;AAGL;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;;AAEF;EACE;EACA;;AHnJA;EGwJA;IACC;;EAED;IACC;IACA;IACA;;EAEF;IACC;;;AV7KH;EACC,OKFc;;ALSf;EACC;EACC;EACA;;AAGF;EAIC;;AAWA;EAEC,kBK/BU;ELgCV,cKjCa;;ALuCf;EACE;;AAID;EAGC;EACA;EACA;EACA;EACA,kBKvCe;;ALyCf;EACC;EACA;EACA;;AAGA;EACD;;AAGC;EACD;EACA;EACA,OKzDU;;AL4DV;EAEC;EACA;EACA;EACA;EACA;EACA;EACA,OKpES;;ALuET;EACC;EACA;EACA;EACA;;AAGA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;AAEA;EACC;;AAKF;EACC;EACA;EACA;;AO/FC;EP+BF;IAqEC;IACA;IACA;;;AAMD;EACG;;AAGJ;EAEE;EACA;;AAKA;EACC;;AAIH;EAEI;EACA;;AAGJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;;AAGF;EAEC;EACA;EACA;;AAGI;EAEJ;EACA;EACA;;AAII;EAEF;EACA;EACA;EACA;EACA;EACF;;AAED;EAEC;EACC;EACA,OKnLc;;ALqLhB;EACC;EACA;EACA,OK/LU;;ALsMV;EAEE;;AAID;EAEE;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAEC;EAEA;;AAQH;EAEA;;AAKD;EACC;EACA;EACA;;AO5OE;EPyOH;IAME;IACA;IACA;IACA;;;AAOF;EACC;EACA;EACA;;AO5PE;EPyPH;IAME;IACA;IACA;IACA;;;AAGF;EACC;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;;AAED;EACC;;AAKA;EAAK;;AACF;EACE;;AAEF;EACG;EACA;;AACA;EACI;EACA;;AAGP;EAEG;;AACA;EACI;;AACA;EACE;EACT;;AAEO;EAAgB;;AAKpB;EAEG;EACA;;AAKT;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMA;EACE;;AAIF;EACA;EACD;;AACC;EAAI;EACJ;EACA;EACA;;AAEA;EACC;;AAGF;EAAO;;AAGN;EACG;;AAEA;EACH;EACA;;AAIA;EAEE;EACH;;AACG;EACG;EACA;EACA;EACA;EACA;EACA;EACA;;AAQR;EAGE;EACA;EAEA;;AACA;EACE;;AAIJ;EACC;EACA;;AAEC;EAEE;;AAIJ;EAEE;;AAGH;EACE;EACA;;AACA;EACC;;AAED;EACC,QKvaS;ELwaT;EACA;;AAED;EAEC;EACA;EACA;EACA;EACA;;AAOC;EAEA,YK/aa;ELgbb;EACA;EAEA;;AOlbD;EP4aC;IAWC;;;AAGA;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;;AACA;EACE;;AAGF;EAAI;;AACJ;EAEE;;AO9cN;EP0bE;IAuBE;IACA;IACA;IACA;IACA;IACA;;;AWpeR;AA4cM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1cF;EACG;;AAEA;EAEK;EACA;EACA;EACA;;AAGL;EPXL;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;AOXM;EAEE;;AAML;EAEG;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACG;EACA;EACA;;AAOT;EAEG;;AACA;EAEG;EACA;EACA;EACA;EA2EA;;AA1ED;EACE;EACA;EACA;;AACP;EACE;;AAEF;EAAK;;AAGH;EACE;;AAEF;EACE;;AAKH;EACE;;AAEF;EACE;;AAEF;EAAa;;AAGT;EACE;EACA;EACA;EACA;EACA,ONvFC;;AM0FH;EACE;EACA;EACA;EACA;;AAEF;EACI;EACA;;AAEJ;EACE;EACA;EACA,ONtGD;EMuGC;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAGD;EAEE;;AAKF;EACX;EACA;EACA;;AJzHE;EI2CM;IAmFM;IACA;;EACA;IAAa;;;AAGnB;EAMI;EACA;EACA;;AACA;EACE;;AJ7IZ;EImIM;IAeM;;;AAKJ;EAEG;EACA;;AACA;EACG;;AAKR;EAIG;EACA;;AACA;EACE;EACA;;AACA;EACE;;AAGJ;EAEG;;AJhLZ;EIwCG;IA+IM;;EACA;IAEG;IACA;;;AAQT;EAEG;;AAIA;EACE;EAEA;EACA;EACA;;AAEA;EAEG;;AAEH;EACE;EACA;EACA,QN5MC;;AMiNA;EACG,QNpNF;;AMwNF;EACG,QNxNH;;AM6NF;EAEG;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA,QNvOH;EMwOG;;AJxPd;EIuMG;IAuDO;;EACA;IACG;IACA;IACA;;;AJ9Pb;EImMG;IAgEO;;EACA;IAEG;IACA;IACA;IACA;IACA;IACA;;EACA;IACG;IACA;IACA;;;AAKb;EACE,YNtRS;EMuRT;;AAKP;EACE,YN7Rc;EM8Rd;EACA;EACA;EACA;EACA;EACA;;AJlSA;EI2RF;IAUK;;EACA;IACG;IACA;;EACA;IACI;IACA;;;AAMR;EACM;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAGN;EAEE;EACA,ON9TQ;EM+TR;;AAGF;EACE;EACA;EACA;EACP;;AAGK;EACE;EACA;EACA;EACA;;AJhVN;EIiTE;IAmCK;;EACA;IACG;;;AASR;EACE;EACA;EACA;EACA,ONhXQ;EMiXR;EACA;EACA;EACA;EACA;EACA;;AAQF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EAEA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AACP;EACE;EACA;;AAIG;EACE;EACA;EAEA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIF;AAAA;EAEE;EACA;EACA;;AAIF;AAAA;EAEE;EACA;;AAIF;EACE;;AVtcD;EACH;EACW;;AAId;EAEE;EACA;;AACA;EACE;EACD;;AWXA;EAEI;EACA;;AAIJ;EACI;;AAGJ;EAEI;EACA;EACA;;AAGJ;EACI,kBPXO;EOYP;EACA;;AAIJ;EAEI;EACA;EACA;;AAII;EAEI;EACA;;AAEJ;EACI,QPhBD;;AOsBH;EAEI;;AACA;EACI;;AAEJ;EACI;;AAEJ;EACI;EACA;;AAGR;EACI,YP1DI;;AO6DR;EACI,YPtDE;EOuDF;;AAGJ;EACI;EACA;EACA;;AACA;EAEI;EACA;;AAMhB;EAEI;;AAEJ;EACH;;ACnFG;EAGE;EACA;EACA;EACA;;AACA;EACG;EACA;EACA;EAEA;EACA,ORTI;;AQUJ;EAAQ;;ANNb;EMRA;IAoBK;;;AAKP;EACK;;AACA;EACQ;EACA;EACA;;AAGb;EAEI;EACA;EACA;;AACF;EACG;EACA;EACA;EACA;EACA;EACA,ORxCM;;AQyCN;EAAQ;;AASR;EAEE;EACA;;AAKF;EACJ;;AAGC;EAGE;EACA;EAEA;EACA;EACA;EACA,ORtES;;AQwEX;EACG;EACA,OR3EM;;AQ6ET;EAqDK;;AAnDA;EAGG;EACA;EACP,ORpFQ;EQ2FD;EACA;EACA;EACP;EACO;EACA;EACA;EACA;;AAbV;EACC;;AAaS;EACG;;AAEH;EAEG;;AAEH;EACE;;AAGF;EAGE;;AAMA;EACE;;AAGX;EAEF;EACA;;AAKM;EACG;;AAIR;EAEI;EACP;EACO;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;EACA;;AAGF;EACI;EACA;EACA;;AAEJ;EAEG;;AAEH;EAEG;;AAEA;EAEG;;AAIL;EAEE;EACA;EACP,ORjLS;;AQkLF;EAEG;EACA;EACP,ORtLM;;AQwLT;EACF;EACA;;AAEE;EACF;EACA;;AAIY;EACE;EACA;;AAEF;EACG;;AAGN;EAEG;EACA;EACA;;AAEH;EAEE;EACA;;AACA;EACE;EACA;;AAEF;EAEG;EACA;EACA;EACA;EACA;EACA;;AAEH;EAEE;;AAEH;EAEG;;AAKP;EAEG;EACA;EACA;;AAKA;EACG;;AAEH;EAEG;EACP,OR3PM;;AQ8PL;EACG;EACA;;AACA;EACG;;AAUZ;EAEG;EACA;;AXvRJ;EACC;EACA;EACA;;AAED;EACC;;AACA;EACC;;AAGF;EAEC;EACA;;AAEA;EAEC,kBGPe;EHQf;EACA;EACA;EACA;EACA;;AACO;EACN;;AAED;EACC;;AAGU;EACT;EACA;;AACC;EACA;EACA;;AACA;EACC;EACA;EACA;;AAIH;EACC;;AAED;EACC;EACA;EACA,OG1CQ;;AH4CT;EACC;EACA;;AAED;EACC;EACA;;AAED;EACC;EACA,OGtDQ;;AHyDV;EACC,YGvDc;;AHwDd;EACC;EACA,OG7DQ;EH8DR;EACA;;AAGA;EACC;EACA;;AKpEF;ELGH;IAwEE;;;AKvEC;ELDH;IA2EE;;;AAID;EACC;;AAGF;EACC;EACA;;AACA;EACC;;AACA;EACC;EAEA;EACA;EACA;;AI1EH;EACC;IACE;IACA,aACE;;EAEJ;IACE;IACA,aACE;;EAEJ;IACE,aACE;;EAEJ;IACE,aACE;;;AJ4DH;EACC;EACA;;AAGF;EACC;;AACA;EACC;;AKvGA;ELdJ;IA0HE;;EACA;IACC;;EAED;IACC;IACA;;EACA;IACC;;EAED;IACC;IACA;;EAGF;IACC;;;AAiBH;EAEI;EACA;;AAKF;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAKD;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGK;EACE;EACP;;AAGA;EAEG;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAED;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAID;EAKG;;AAHA;EACG;;AAGH;EAEG;;AAGN;EAEG;EACA;EACA;;AAGA;EAEG;EACA;;AAMT;EAEI;;AACA;EAAc;;AACd;EAEG;EACA;EACA;EACA,YG/PG;EHgQH;EACA;EACA;EACA;;AACA;EACG,YGlQE;;AHqQR;EACK;;AAEL;EACK;;AAEL;EACL;;AAEK;EACL;EACA;EACA;;AAEK;EAEG;EACA;;AAEH;EAAQ;;AAGZ;EACC;;AY/RC;EACG;EACA;EACA;EACA;;ACPP;EAAU;EACT,OVKa;EUJb;EAEA;EACA;EAEA;EACA;EACA;;AAEA;EACC;EACA;;AAEF;EACE;EAEA;;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;;AACA;EAEE;EACA;EAED;EACA;;AACA;EACC;;AAQJ;EAEC;EACA;EACA;;AAQF;EAEC;EACA;;AAKH;EACC;EACA;EACA;;AAED;EAAM;;AAKP;EAEC;EACG;EACH;EACA;EACA;;AACA;EAEC;EACA;;AAOA;EACC;EACA;EACA;EACA;;AAED;EAEA;;AC7GH;EAEE;EACA,kBXQgB;EWPhB;EACA;EACA;EACA;EACA;EACA;EACA;AAQA;AAAA;AAAA;AAAA;;AAKA;EACE;;AAIF;EAGE;EACA;EACA;EACA;EACA;EACA,OX5BS;;AWgCX;EACE;EACA;EACA;EACA;;AACA;EACG;;AAGH;EACE;;AAIF;EACE;EACA;EACA;;AAGF;EACG;EACA;EACA;EACA;;AACA;EAEE;;AAOP;EACE;EACA;EACA;EACA;;AACA;EACG;EACA;;AAIL;AAAA;EAEE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;;AAIJ;EACE;;AAIA;EACE;;AAKJ;EACE;EACA;EACA;;AAKC;EACE","file":"shortpixel-settings.css"}
     1{"version":3,"sourceRoot":"","sources":["../scss/elements/_fonts.scss","../scss/view/_inline-help.scss","../scss/shortpixel-settings.scss","../scss/view/_settings.scss","../scss/view/_settings-advanced.scss","../scss/view/_settings-onboarding.scss","../scss/view/_settings-structure.scss","../scss/elements/_mixins.scss","../scss/elements/_colors.scss","../scss/elements/_animation.scss","../scss/elements/_breakpoints.scss","../scss/elements/_header.scss","../scss/elements/_icons.scss","../scss/view/_settings-optimisation.scss","../scss/view/_settings-overview.scss","../scss/view/_settings-ai.scss","../scss/view/_settings-exclusions.scss","../scss/view/_settings-integrations.scss","../scss/view/_settings-tools.scss","../scss/elements/_setting.scss"],"names":[],"mappings":"AAEA;EAEI;EACA;EACA;EACA;;AAGJ;EAGI;EACA;EACA;EACA;;ACfJ;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;;AAIJ;EAEE;EACA;;;AAIF;EAEI;AAAiB;EACjB;AAAa;EACb;EACA;EACA;AAAa;EACb;AAAc;EACd;AAAgB;EAChB;AAA8B;EAC9B;AAAmC;;;AAEvC;EACI;AACA;EACF;EACE;EACA;EAEA;EACA;EACA;AAAY;EACZ;EACA;AAAkB;EAClB;AAAc;EACd;EACA;EACA;EACA;EACA;EAEA;;AACA;EACI;EACA;EACA;;AAEN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACI;;;AAEJ;EAAa;;;ACrEb;ACgBC;AA8WC;ACtYF;ACoJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AClJG;EAEE;;AAEF;EAA6B;;AAK7B;EAA2B;;AAK3B;EAAO;;AACP;EAAuC;;AAG1C;EAGG;EACD;EACA;EACA;EACA;EACA;;AAIA;EC9BA;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;ADUF;EAEE;;AACA;EAAQ;;AAGV;EACE;EACA;EACA;;AAEA;EACE;EACA;EACE,cExCO;EFyCT;;AACD;EAEC;EACA;;AAEC;EACC;EAEA;EACA;EACA,OErDK;EFsDL;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;;AAED;EAEI,OEpEG;;AFyEP;EACC,OE1EM;EF2EN;;AAOL;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cEvFW;;AF0Fb;EAEE;EAGA;;AAEA;EAEC;EACA;EACA;;AACA;EACE;EACA;;AAKD;EACC;EACA;EACA;EACA;EACA;EACA,OE7HS;;AF+HV;EACG;EACD;EACA;;AAGF;EAEE;;AAGH;EACC;EACA;EAEA;;AAGC;EACA;EACA;EACA;;AAEC;EACA;;AAKD;EAEC;;AACA;EG9JN;EACI;EACA;EACA;EACA;EH4JE;EACA;;AG3JP;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;ACXpC;EJ6JG;IACC;;EACA;IAEC;IACA;IACA;;;AAOP;EAEE;;AAGF;EACE;;AAGC;EAEC;;AAIF;EAEE;;AAGJ;EAEE;;AACA;EAEC;;AACA;EACC;;AAIF;EAEE;EACD;;AAED;EAEC;EACA;;AAED;EAEA;EAEA;;AIvNA;EJgOF;IACE;;EAGC;IAEE;;EAGH;IACC;IACA;;;AI3OD;EJmPF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EACA;IAEC;IACA;IACA;;EAED;IACC;;EACA;IACC;;EAED;IACC;;EAKJ;IACE;;EAEF;AAmCE;AAAA;AAAA;;EAjCA;IACC;IACA;IACA;IACA;IAuBA;IACA;;EAvBA;IACC;IACA;;EAIC;IACC;;EAID;IACC;;EAED;IACC;IACA;IACD;IACA;;EAOH;IACC;;EAKD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAED;IAEC;;EAGH;IACC;;EAED;IACC;;EACA;IACC;;;AK1VJ;EAEI;EACA;EACA;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACH;;AAEM;EJ5BL;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;AIOM;EACE,QHTG;EGUH;EACA;EACP;EACA;;AC5BL;EAEE;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;;AACA;EACG;;AAOH;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AAIJ;EAGE;EACA;EACA;EACA;EACA;;AAEA;EAEI;EACA;EACA;;AAGJ;EACE;EACA;EACA;;ACnDF;EACC;;AAKE;EACC;EACA;EACA;;AAEF;EACC;EACA;EACA;;AAID;EAEE;;AAEF;EACC;;AAEF;EACE;EACA;EAEA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA,kBLlCQ;EKmCR;;AAEF;EACE;;AACA;EACE,kBLvCI;;AK+CX;EAEC;EACA;EACA;;AAED;EAEC;;AAED;EAEE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAK;EAAe;;AAEpB;EACC;;AAED;EAAwB;EAAiB;;AAI3C;EAEE;EACA;EACA;EACA;;AAIF;EAEE;;AAOA;EACE;EACD;EACA;EACA;EACA;EACA;;AAED;EACE;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKH;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AHtHF;EG+GF;IAWI;;;AH1HF;EG+GF;IAeK;;;AAGL;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;;AAEF;EACE;EACA;;AHnJA;EGwJA;IACC;;EAED;IACC;IACA;IACA;;EAEF;IACC;;;AV7KH;EACC,OKFc;;ALSf;EACC;EACC;EACA;;AAGF;EAIC;;AAWA;EAEC,kBK/BU;ELgCV,cKjCa;;ALuCf;EACE;;AAID;EAGC;EACA;EACA;EACA;EACA,kBKvCe;;ALyCf;EACC;EACA;EACA;;AAGA;EACD;;AAGC;EACD;EACA;EACA,OKzDU;;AL4DV;EAEC;EACA;EACA;EACA;EACA;EACA;EACA,OKpES;;ALuET;EACC;EACA;EACA;EACA;;AAGA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;AAEA;EACC;;AAKF;EACC;EACA;EACA;;AO/FC;EP+BF;IAqEC;IACA;IACA;;;AAMD;EACG;;AAGJ;EAEE;EACA;;AAKA;EACC;;AAIH;EAEI;EACA;;AAGJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;;AAGF;EAEC;EACA;EACA;;AAGI;EAEJ;EACA;EACA;;AAII;EAEF;EACA;EACA;EACA;EACA;EACF;;AAED;EAEC;EACC;EACA,OKnLc;;ALqLhB;EACC;EACA;EACA,OK/LU;;ALsMV;EAEE;;AAID;EAEE;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAEC;EAEA;;AAQH;EAEA;;AAKD;EACC;EACA;EACA;;AO5OE;EPyOH;IAME;IACA;IACA;IACA;;;AAOF;EACC;EACA;EACA;;AO5PE;EPyPH;IAME;IACA;IACA;IACA;;;AAGF;EACC;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;;AAED;EACC;;AAKA;EAAK;;AACF;EACE;;AAEF;EACG;EACA;;AACA;EACI;EACA;;AAGP;EAEG;;AACA;EACI;;AACA;EACE;EACT;;AAEO;EAAgB;;AAKpB;EAEG;EACA;;AAKT;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMA;EACE;;AAIF;EACA;EACD;;AACC;EAAI;EACJ;EACA;EACA;;AAEA;EACC;;AAGF;EAAO;;AAGN;EACG;;AAEA;EACH;EACA;;AAIA;EAEE;EACH;;AACG;EACG;EACA;EACA;EACA;EACA;EACA;EACA;;AAQR;EAGE;EACA;EAEA;;AACA;EACE;;AAIJ;EACC;EACA;;AAEC;EAEE;;AAIJ;EAEE;;AAGH;EACE;EACA;;AACA;EACC;;AAED;EACC,QKvaS;ELwaT;EACA;;AAED;EAEC;EACA;EACA;EACA;EACA;;AAOC;EAEA,YK/aa;ELgbb;EACA;EAEA;;AOlbD;EP4aC;IAWC;;;AAGA;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;;AACA;EACE;;AAGF;EAAI;;AACJ;EAEE;;AO9cN;EP0bE;IAuBE;IACA;IACA;IACA;IACA;IACA;;;AWpeR;AA4cM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1cF;EACG;;AAEA;EAEK;EACA;EACA;EACA;;AAGL;EPXL;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;AOXM;EAEE;;AAML;EAEG;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACG;EACA;EACA;;AAOT;EAEG;;AACA;EAEG;EACA;EACA;EACA;EA2EA;;AA1ED;EACE;EACA;EACA;;AACP;EACE;;AAEF;EAAK;;AAGH;EACE;;AAEF;EACE;;AAKH;EACE;;AAEF;EACE;;AAEF;EAAa;;AAGT;EACE;EACA;EACA;EACA;EACA,ONvFC;;AM0FH;EACE;EACA;EACA;EACA;;AAEF;EACI;EACA;;AAEJ;EACE;EACA;EACA,ONtGD;EMuGC;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAGD;EAEE;;AAKF;EACX;EACA;EACA;;AJzHE;EI2CM;IAmFM;IACA;;EACA;IAAa;;;AAGnB;EAMI;EACA;EACA;;AACA;EACE;;AJ7IZ;EImIM;IAeM;;;AAKJ;EAEG;EACA;;AACA;EACG;;AAKR;EAIG;EACA;;AACA;EACE;EACA;;AACA;EACE;;AAGJ;EAEG;;AJhLZ;EIwCG;IA+IM;;EACA;IAEG;IACA;;;AAQT;EAEG;;AAIA;EACE;EAEA;EACA;EACA;;AAEA;EAEG;;AAEH;EACE;EACA;EACA,QN5MC;;AMiNA;EACG,QNpNF;;AMwNF;EACG,QNxNH;;AM6NF;EAEG;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA,QNvOH;EMwOG;;AJxPd;EIuMG;IAuDO;;EACA;IACG;IACA;IACA;;;AJ9Pb;EImMG;IAgEO;;EACA;IAEG;IACA;IACA;IACA;IACA;IACA;;EACA;IACG;IACA;IACA;;;AAKb;EACE,YNtRS;EMuRT;;AAKP;EACE,YN7Rc;EM8Rd;EACA;EACA;EACA;EACA;EACA;;AJlSA;EI2RF;IAUK;;EACA;IACG;IACA;;EACA;IACI;IACA;;;AAMR;EACM;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAGN;EAEE;EACA,ON9TQ;EM+TR;;AAGF;EACE;EACA;EACA;EACP;;AAGK;EACE;EACA;EACA;EACA;;AJhVN;EIiTE;IAmCK;;EACA;IACG;;;AASR;EACE;EACA;EACA;EACA,ONhXQ;EMiXR;EACA;EACA;EACA;EACA;EACA;;AAQF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EAEA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AACP;EACE;EACA;;AAIG;EACE;EACA;EAEA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIF;AAAA;EAEE;EACA;EACA;;AAIF;AAAA;EAEE;EACA;;AAIF;EACE;;AVtcD;EACH;EACW;;AAId;EAEE;EACA;;AACA;EACE;EACD;;AWXA;EAEI;EACA;;AAIJ;EACI;;AAGJ;EAEI;EACA;EACA;;AAGJ;EACI,kBPXO;EOYP;EACA;;AAIJ;EAEI;EACA;EACA;;AAII;EAEI;EACA;;AAEJ;EACI,QPhBD;;AOsBH;EAEI;;AACA;EACI;;AAEJ;EACI;;AAEJ;EACI;EACA;;AAGR;EACI,YP1DI;;AO6DR;EACI,YPtDE;EOuDF;;AAGJ;EACI;EACA;EACA;;AACA;EAEI;EACA;;AAMhB;EAEI;;AAEJ;EACH;;ACnFG;EAGE;EACA;EACA;EACA;;AACA;EACG;EACA;EACA;EAEA;EACA,ORTI;;AQUJ;EAAQ;;ANNb;EMRA;IAoBK;;;AAKP;EACK;;AACA;EACQ;EACA;EACA;;AAGb;EAEI;EACA;EACA;;AACF;EACG;EACA;EACA;EACA;EACA;EACA,ORxCM;;AQyCN;EAAQ;;AASR;EAEE;EACA;;AAKF;EACJ;;AAGC;EAGE;EACA;EAEA;EACA;EACA;EACA,ORtES;;AQwEX;EACG;EACA,OR3EM;;AQ6ET;EAqDK;;AAnDA;EAGG;EACA;EACP,ORpFQ;EQ2FD;EACA;EACA;EACP;EACO;EACA;EACA;EACA;;AAbV;EACC;;AAaS;EACG;;AAEH;EAEG;;AAEH;EACE;;AAGF;EAGE;;AAMA;EACE;;AAGX;EAEF;EACA;;AAKM;EACG;;AAIR;EAEI;EACP;EACO;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;EACA;;AAGF;EACI;EACA;EACA;;AAEJ;EAEG;;AAEH;EAEG;;AAEA;EAEG;;AAIL;EAEE;EACA;EACP,ORjLS;;AQkLF;EAEG;EACA;EACP,ORtLM;;AQwLT;EACF;EACA;;AAEE;EACF;EACA;;AAIY;EACE;EACA;;AAEF;EACG;;AAGN;EAEG;EACA;EACA;;AAEH;EAEE;EACA;;AACA;EACE;EACA;;AAEF;EAEG;EACA;EACA;EACA;EACA;EACA;;AAEH;EAEE;;AAEH;EAEG;;AAKP;EAEG;EACA;EACA;EACA;EACA;;AAKA;EACG;;AAEH;EAEG;EACP,OR7PM;;AQgQL;EACG;EACA;;AACA;EACG;;AAUZ;EAEG;EACA;;AXzRJ;EACC;EACA;EACA;;AAED;EACC;;AACA;EACC;;AAGF;EAEC;EACA;;AAEA;EAEC,kBGPe;EHQf;EACA;EACA;EACA;EACA;;AACO;EACN;;AAED;EACC;;AAGU;EACT;EACA;;AACC;EACA;EACA;;AACA;EACC;EACA;EACA;;AAIH;EACC;;AAED;EACC;EACA;EACA,OG1CQ;;AH4CT;EACC;EACA;;AAED;EACC;EACA;;AAED;EACC;EACA,OGtDQ;;AHyDV;EACC,YGvDc;;AHwDd;EACC;EACA,OG7DQ;EH8DR;EACA;;AAGA;EACC;EACA;;AKpEF;ELGH;IAwEE;;;AKvEC;ELDH;IA2EE;;;AAID;EACC;;AAGF;EACC;EACA;;AACA;EACC;;AACA;EACC;EAEA;EACA;EACA;;AI1EH;EACC;IACE;IACA,aACE;;EAEJ;IACE;IACA,aACE;;EAEJ;IACE,aACE;;EAEJ;IACE,aACE;;;AJ4DH;EACC;EACA;;AAGF;EACC;;AACA;EACC;;AKvGA;ELdJ;IA0HE;;EACA;IACC;;EAED;IACC;IACA;;EACA;IACC;;EAED;IACC;IACA;;EAGF;IACC;;;AAiBH;EAEI;EACA;;AAKF;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAKD;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGK;EACE;EACP;;AAGA;EAEG;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAED;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAID;EAKG;;AAHA;EACG;;AAGH;EAEG;;AAGN;EAEG;EACA;EACA;;AAGA;EAEG;EACA;;AAMT;EAEI;;AACA;EAAc;;AACd;EAEG;EACA;EACA;EACA,YG/PG;EHgQH;EACA;EACA;EACA;;AACA;EACG,YGlQE;;AHqQR;EACK;;AAEL;EACK;;AAEL;EACL;;AAEK;EACL;EACA;EACA;;AAEK;EAEG;EACA;;AAEH;EAAQ;;AAGZ;EACC;;AY/RC;EACG;EACA;EACA;EACA;;ACPP;EAAU;EACT,OVKa;EUJb;EAEA;EACA;EAEA;EACA;EACA;;AAEA;EACC;EACA;;AAEF;EACE;EAEA;;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;;AACA;EAEE;EACA;EAED;EACA;;AACA;EACC;;AAQJ;EAEC;EACA;EACA;;AAQF;EAEC;EACA;;AAKH;EACC;EACA;EACA;;AAED;EAAM;;AAKP;EAEC;EACG;EACH;EACA;EACA;;AACA;EAEC;EACA;;AAOA;EACC;EACA;EACA;EACA;;AAED;EAEA;;AC7GH;EAEE;EACA,kBXQgB;EWPhB;EACA;EACA;EACA;EACA;EACA;EACA;AAQA;AAAA;AAAA;AAAA;;AAKA;EACE;;AAIF;EAGE;EACA;EACA;EACA;EACA;EACA,OX5BS;;AWgCX;EACE;EACA;EACA;EACA;;AACA;EACG;;AAGH;EACE;;AAIF;EACE;EACA;EACA;;AAGF;EACG;EACA;EACA;EACA;;AACA;EAEE;;AAOP;EACE;EACA;EACA;EACA;;AACA;EACG;EACA;;AAIL;AAAA;EAEE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;;AAIJ;EACE;;AAIA;EACE;;AAKJ;EACE;EACA;EACA;;AAKC;EACE","file":"shortpixel-settings.css"}
  • shortpixel-image-optimiser/tags/6.4.4/res/js/screens/screen-media.js

    r3400007 r3490270  
    119119                button.style.textDecoration = 'none';
    120120               
    121                
    122121                scaleButton.classList.add('button-link');
    123122                scaleButton.style.display = 'inline';
     
    132131
    133132                parent.append(button);
    134 
    135 
    136             }
    137         }
    138        
     133            }
     134        }
    139135    }
    140136
     
    449445        }
    450446        var attachmentAlt = this.GetPageAttachmentAlt();
     447
    451448        if (null === attachmentAlt) // No attach alt around
    452449        {
     
    458455            return;
    459456        }
     457
     458        var wp_screen_id = this.settings.wp_screen_id;
     459
    460460
    461461        if (typeof aiData !== 'undefined')
     
    497497         let captionFields = ['attachment_caption', 'attachment-details-caption', 'attachment-details-two-column-caption'];
    498498         let descriptionFields = ['attachment_content', 'attachment-details-description', 'attachment-details-two-column-description'];
    499          let postTitleFields = ['title', 'attachment-details-title', 'attachment-details-two-column-title'];
     499       
     500         let postTitleFields = ['attachment-details-title', 'attachment-details-two-column-title'];
     501         // This check: the edit-post screen also has a name title field, but this is for the post, not attachment. only replace in attachment screen
     502         if ('attachment' == wp_screen_id)
     503         { 
     504            postTitleFields.push('title');
     505         }
    500506         
    501507         if (typeof newCaption !== 'undefined' || newCaption < 0)
  • shortpixel-image-optimiser/tags/6.4.4/res/js/shortpixel-settings.js

    r3440585 r3490270  
    13981398        }
    13991399        else {
    1400             var mode = 'edit';
    1401 
     1400            //var mode = 'edit';
    14021401            let mainEl = event.target.closest('li');
    14031402            var id = mainEl.id;
    14041403
    1405 
    1406             var exclusionModal = this.root.querySelector('.new-exclusion');
    1407             //  event.target.closest('li').after(exclusionModal);
    1408             //exclusionModal.parentElement = event.target.closest('li').after(exclusionModal);
     1404            //var exclusionModal = this.root.querySelector('.new-exclusion');
    14091405
    14101406            var title = this.root.querySelector('.new-exclusion h3.edit-title');
    1411             //var button = this.root.querySelector('.new-exclusion .button-actions button[name="removeExclusion"]');
    14121407            var input = this.root.querySelector('.new-exclusion input[name="edit-exclusion"]')
    14131408
     
    14221417
    14231418        title.classList.remove('not-visible', 'hidden');
    1424         //button.classList.remove('not-visible', 'hidden');
    1425 
    14261419    }
    14271420
     
    15001493            example = '';
    15011494        }
    1502 
    1503         var valueOption = this.root.querySelector('.new-exclusion .value-option');
    1504         var sizeOption = this.root.querySelector('.new-exclusion .size-option');
    1505         var dateOption = this.root.querySelector('.new-exclusion .date-option');
    1506         var regexOption = this.root.querySelector('.regex-option');
    1507         var switchExactOption = this.root.querySelector('.exact-option');
    1508         var applyOption = this.root.querySelector('.new-exclusion select[name="apply-select"]');
    1509 
    1510 
    1511         if (value == 'size') {
    1512             valueOption.classList.add('not-visible');
    1513             sizeOption.classList.remove('not-visible');
    1514             switchExactOption.classList.remove('not-visible');
    1515             regexOption.classList.add('not-visible');
    1516         }
    1517         else {
    1518             valueOption.classList.remove('not-visible');
    1519             sizeOption.classList.add('not-visible');
    1520             switchExactOption.classList.add('not-visible');
    1521             regexOption.classList.remove('not-visible');
    1522         }
    1523 
    1524         if ('date' === value)
     1495       
     1496        var options = this.GetAllExclusionOptions();
     1497       
     1498        var show = [];
     1499
     1500        switch(value)
    15251501        {
    1526             dateOption.classList.remove('not-visible');
    1527             regexOption.classList.add('not-visible');
    1528             applyOption.value = 'all';
    1529             applyOption.disabled = true;
    1530         }
    1531         else
     1502             case 'size':
     1503                show =  ['sizeOption', 'switchExactOption', 'applyOption'];
     1504             break;
     1505             case 'date':
     1506                show = ['dateOption', 'valueOption'];
     1507             break;
     1508             case 'filesize':
     1509                show = ['applyOption', 'operatorOption'];
     1510             break;
     1511             default:
     1512                show = ['valueOption', 'applyOption', 'regexOption'];
     1513             
     1514        }
     1515
     1516        for (const optKey in options)
     1517            {
     1518                console.log(optKey, options[optKey]);
     1519                if (show.indexOf(optKey) >= 0)
     1520                {
     1521                    if (options[optKey].classList.contains('not-visible'))
     1522                    {
     1523                        options[optKey].classList.remove('not-visible');
     1524                    }
     1525                }   
     1526                else if (false === options[optKey].classList.contains('not-visible'))
     1527                {
     1528                     options[optKey].classList.add('not-visible');
     1529                }
     1530                       
     1531            }
     1532
     1533        for (let i = 0; i < options.length; i++)
    15321534        {
    1533             dateOption.classList.add('not-visible');
    1534             regexOption.classList.remove('not-visible');
    1535             applyOption.disabled = false;
    1536         }
    1537        
     1535
     1536
     1537             options[show[i]].classList.remove('not-visible');
     1538        }       
    15381539
    15391540        var valueInput = this.root.querySelector('input[name="exclusion-value"]');
     
    15411542            valueInput.placeholder = example;
    15421543        }
     1544    }
     1545
     1546    /* Get all options for exclusions */
     1547    GetAllExclusionOptions()
     1548    {
     1549        var options = {
     1550            'valueOption' : this.root.querySelector('.new-exclusion .value-option'),
     1551            'sizeOption'  : this.root.querySelector('.new-exclusion .size-option'),
     1552            'dateOption'  :this.root.querySelector('.new-exclusion .date-option'),
     1553            'regexOption' : this.root.querySelector('.new-exclusion .regex-option'),
     1554            'switchExactOption' : this.root.querySelector('.new-exclusion .exact-option'),
     1555            'applyOption' : this.root.querySelector('.new-exclusion .applyto-option'),
     1556            'operatorOption' : this.root.querySelector('.new-exclusion .operator-option '),
     1557
     1558        };
     1559
     1560        return options;
    15431561    }
    15441562
     
    15821600        var applyOption = this.root.querySelector('.new-exclusion select[name="apply-select"]');
    15831601        var regexOption = this.root.querySelector('.new-exclusion input[name="exclusion-regex"]');
    1584 
     1602       
    15851603        if ('read' === mode) {
    15861604            setting.type = typeOption.value;
     
    16831701
    16841702                this.NewExclusionUpdateType(typeOption)
    1685                 //      this.NewExclusionToggleSizeOption(exactOption);
    16861703            }
    16871704            this.NewExclusionToggleSizeOption(exactOption);
    16881705
     1706        } // Size Option
     1707        else if ('filesize' === setting.type)
     1708        {
     1709            var the_value = this.root.querySelector('.new-exclusion input[name="exclusion-filesize-value"]');
     1710            var denom = this.root.querySelector('.new-exclusion select[name="exclusion-filesize-denom"]');
     1711            var operator = this.root.querySelector('.new-exclusion select[name="exclusion-filesize-operator"]');
     1712console.log(demon.selectedIndex);
     1713            if ('read' === mode)
     1714            {
     1715                setting.value = operator.options[operator.selectedIndex].value.trim() + " " + the_value.value.trim() + " " + denom.options[denom.selectedIndex].value.trim();
     1716                validateInput.push(the_value);
     1717
     1718            }
     1719            else if ('write' === mode)
     1720            {
     1721                var split = setting.value.split(" ");
     1722                operator.value = split[0];
     1723                the_value.value = split[1];
     1724                denom.value = split[2];
     1725
     1726                for(let i = 0; i < operator.options; i++)
     1727                {
     1728                    if(operator.options[i].value == split[0])
     1729                    {
     1730                        operator.selectedIndex = i;
     1731                    }
     1732                }
     1733                for(let i = 0; i < denom.options; i++)
     1734                    {
     1735                        if(denom.options[i].value == split[2])
     1736                        {
     1737                            denom.selectedIndex = i;
     1738                        }
     1739                    }
     1740
     1741                this.NewExclusionUpdateType(typeOption);
     1742
     1743            }
    16891744        }
    16901745        else {
     
    18671922            var input = inputs[i];
    18681923            if (input.tagName == 'SELECT') {
    1869                 input.selectedIndex = 0;
     1924                input.selectedIndex = 0; // First reset blindly
     1925                for (var j = 0; j < input.options.length; j++)
     1926                {
     1927                     if (true === input.options[j].defaultSelected)
     1928                     {
     1929                        input.selectedIndex = j;
     1930                        break;
     1931                     }
     1932                }
    18701933            }
    18711934            else if (input.type == 'checkbox') {
  • shortpixel-image-optimiser/tags/6.4.4/res/js/shortpixel-worker.js

    r3449706 r3490270  
    101101      if (response.ok)
    102102      {
    103           var json = await response.json();
    104           postMessage({'status' : true, response: json});
     103         // Try / Catch, returned data might not be valid JSON
     104          try {
     105            var json = await response.json();
     106            postMessage({'status' : true, response: json});
     107          }
     108          catch (error)
     109          {
     110             postMessage({'status' : false, response: error});
     111          }
    105112      }
    106113      else if(this && ! this.stopped)
  • shortpixel-image-optimiser/tags/6.4.4/res/scss/view/_settings-exclusions.scss

    r3198739 r3490270  
    250250           height: 0;
    251251           transition: 500ms height;
     252           margin: 0;
     253           padding: 0;
    252254        }
    253255
  • shortpixel-image-optimiser/tags/6.4.4/shortpixel-plugin.php

    r3449706 r3490270  
    315315
    316316        $settings       = \wpSPIO()->settings();
     317        $env = \wpSPIO()->env();
    317318        $ajaxController = AjaxController::getInstance();
    318319
     
    328329
    329330        $OptimizeAiController = OptimizeAiController::getInstance();
     331
     332        $args_footer_async = ['strategy' => 'async', 'in_footer' => true];
    330333
    331334     wp_register_script('shortpixel-folderbrowser', plugins_url('/res/js/shortpixel-folderbrowser.js', SHORTPIXEL_PLUGIN_FILE), array(), SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true );
     
    371374        wp_register_script('shortpixel-inline-help', plugins_url('res/js/shortpixel-inline-help.js',  SHORTPIXEL_PLUGIN_FILE), [], SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true);
    372375        wp_register_script('shortpixel-chatbot',
    373             apply_filters('shortpixel/plugin/nohelp', 'https://spcdn.shortpixel.ai/assets/js/ext/ai-chat-agent.js'), [], SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true);
     376            apply_filters('shortpixel/plugin/nohelp', 'https://spcdn.shortpixel.ai/assets/js/ext/ai-chat-agent.js'), [], SHORTPIXEL_IMAGE_OPTIMISER_VERSION, $args_footer_async);
    374377
    375378        // This filter is from ListMediaViewController for the media library grid display, executive script in shortpixel-media.js.
     
    400403                'bulkSecret'        => $secretKey,
    401404                'isBulkPage'        => (bool) $is_bulk_page,
    402                 'screenURL'         => false,
    403405                'workerURL'         => plugins_url( 'res/js/shortpixel-worker.js', SHORTPIXEL_PLUGIN_FILE ),
    404406                'nonce_process'     => wp_create_nonce( 'processing' ),
     
    454456            'popup_load_preview' => true, // Upon opening, load Preview or not.
    455457            'too_big_for_scale_title'  => __('Image too big for scaling', 'shortpixel-image-optimiser'),
     458            'wp_screen_id' => $env->screen_id,
    456459     ];
    457460
  • shortpixel-image-optimiser/tags/6.4.4/wp-shortpixel.php

    r3449706 r3490270  
    44 * Plugin URI: https://shortpixel.com/
    55 * Description: ShortPixel optimizes images automatically, while guarding the quality of your images. Check your <a href="https://plugins.trac.wordpress.org/wp-admin/options-general.php?page=wp-shortpixel-settings" target="_blank">Settings &gt; ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
    6  * Version: 6.4.3
     6 * Version: 6.4.4
    77 * Author: ShortPixel - Convert WebP/AVIF & Optimize Images
    88 * Author URI: https://shortpixel.com
     
    3737define('SHORTPIXEL_PLUGIN_DIR', __DIR__);
    3838
    39 define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "6.4.3");
     39define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "6.4.4");
    4040
    4141define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
  • shortpixel-image-optimiser/trunk/class/Controller/Api/AiController.php

    r3400007 r3490270  
    240240      }
    241241     
    242       return $this->returnSuccess(['aiData' => $aiData], RequestManager::STATUS_SUCCESS, __('Retrieved AI image SEO data', 'shortpixel-image-optimiser')); ;
     242      return $this->returnSuccess(['aiData' => $aiData], RequestManager::STATUS_SUCCESS, __('Retrieved AI Image SEO data', 'shortpixel-image-optimiser')); ;
    243243    }
    244244
  • shortpixel-image-optimiser/trunk/class/Controller/Api/ApiController.php

    r3423259 r3490270  
    360360                // Previous check here was for Item->files[$imageName] , not sure if currently needed.
    361361                // Check if image is not already in fileData.
     362
     363                if (is_array($fileData))
     364                {
     365                     $fileData = (object) $fileData;
     366                }
     367
    362368                if (is_null($fileData) || false === property_exists($fileData, $imageName)) {
    363369                    $imageList[$imageName] = $this->handleNewSuccess($qItem, $imageObject, $data);
  • shortpixel-image-optimiser/trunk/class/Controller/Api/RequestManager.php

    r3400007 r3490270  
    106106
    107107        //only if $Blocking is true analyze the response
    108         if ( $requestParameters['blocking'] )
     108        if ( $requestParameters['blocking'] )
    109109        {
    110110                if ( is_object($response) && get_class($response) == 'WP_Error' )
     
    143143                elseif ( isset($response['response']['code']) && $response['response']['code'] <> 200 )
    144144                {
    145                         $errorMessage = $response['response']['code'] . " - " . $response['response']['message'];
    146145                        $errorCode = $response['response']['code'];
     146
     147            // try to extract a more useful error message from JSON body (if any)
     148                    // (like the one sent from ApiGpt via commons),
     149            // still there is fallback to the generic "code - Message" string :)
     150            $errorMessage = $response['response']['code'] . " - " . $response['response']['message'];
     151            if (isset($response['body']) && is_string($response['body']) && $response['body'] !== '') {
     152                $body = json_decode($response['body'], true);
     153                if (is_array($body) && isset($body['error']) && is_string($body['error']) && $body['error'] !== '') {
     154                    $errorMessage = $body['error'];
     155                }
     156            }
    147157
    148158            $qItem->addResult($this->returnFailure($errorCode, $errorMessage));
  • shortpixel-image-optimiser/trunk/class/Controller/BulkController.php

    r3449706 r3490270  
    237237   protected function addLog($q)
    238238   {
    239         //$data = (array) $stats;
    240239                $stats = $q->getStats(); // for the log
    241240                $type = $q->getType();
    242             //  $customData = $q->getCustomDataItem('');
    243241
    244242        if ($stats->done == 0 && $stats->fatal_errors == 0)
     
    273271        {
    274272          $log = array_shift($logs);
    275           //$log_date = $log['date'];
    276                     //$log_type = $log['type'];
    277273                    if (isset($data['logfile']))
    278274                    {
  • shortpixel-image-optimiser/trunk/class/Controller/Front/CDNController.php

    r3449706 r3490270  
    679679    {
    680680        $replacer = new Replacer();
    681         $content = $replacer->replaceContent($content, $urls, $new_urls);
     681        $content = $replacer->replaceContent($content, $urls, $new_urls, false, true);
    682682
    683683        return $content;
  • shortpixel-image-optimiser/trunk/class/Controller/Front/PageConverter.php

    r3301690 r3490270  
    8282
    8383    if (isset($_GET['PageSpeed']) && 'off' === $_GET['PageSpeed'])
     84    {
     85       return false;
     86    }
     87
     88    if (isset($_GET['oxygen']) && 'builder' === $_GET['oxygen'])
    8489    {
    8590       return false;
     
    304309private function getDomain($url)
    305310{
    306     preg_match("/[a-z0-9\-]{1,63}\.[a-z\.]{2,6}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
     311    $matches = preg_match("/[a-z0-9\-]{1,63}\.[a-z\.]{2,63}$/", parse_url($url, PHP_URL_HOST), $_domain_tld);
     312    if (false === $matches || 0 === $matches) // If pattern fails.
     313    {
     314       return parse_url($url, PHP_URL_HOST);
     315    }   
     316
    307317    return $_domain_tld[0];
    308318}
  • shortpixel-image-optimiser/trunk/class/Controller/Front/PictureController.php

    r3449706 r3490270  
    252252                {
    253253                  // FILTER: boolean, object, string, filedir
    254 
    255254                                 // Return fileObj if you want to live.
    256255                  $thisfile = $fileWebp_exists = apply_filters('shortpixel/front/webp_notfound', false, $thisfile, $image_url, $imageBase);
     
    300299      }
    301300
    302       $args = array();
     301      $args = [];
    303302
    304303      if ($webpCount > 0)
     
    317316  {
    318317    //preg_match_all('/background.*[^:](url\(.*\))[;]/isU', $content, $matches);
    319     // Pattern : Find the URL() from CSS, save any extra background information ( position, repeat etc ) in second group and terminal at ; or " (hopefully end of line)
    320     preg_match_all('/url\(.*\)(.*)(?:;|\"|\')/isU', $content, $matches);
    321 
    322     if (count($matches) == 0)
     318    // Pattern : Find the URL() from CSS, save any extra background information ( position, repeat etc ) in second group and terminate at ; or " (hopefully end of line)
     319    // Old pattern - /url\(.*\)(.*)(?:;|\"|\')/isU
     320    $pattern = '/(url\(.*?\))(.*?)(?:;|\"|\')/is';
     321    preg_match_all($pattern, $content, $matches);
     322
     323    if (count($matches) == 0 || count($matches[1]) == 0)
     324    {
    323325      return $content;
    324 
    325     $content = $this->convertInlineStyle($matches, $content);
     326    }
     327
     328    $filtered = [];
     329    // Create a name array to make code clearer. First match (item) is url(xx).  Imagedata is shorthand properties that might follow but before end of background declararation.
     330    for ($i = 0; $i < count($matches[1]); $i++)
     331    {
     332      $filtered[] = ['item' => $matches[1][$i], 'imagedata' => $matches[2][$i]];
     333    }
     334
     335    $content = $this->convertInlineStyle($filtered, $content);
    326336    return $content;
    327337  }
     
    331341  * @param $match Regex match for inline style
    332342  * @return String Replaced (or not) content for webp.
    333   * @author Bas Schuiling
    334343  */
    335344  protected function convertInlineStyle($matches, $content)
    336345  {
    337 
    338346    $fs = \wpSPIO()->filesystem();
    339347    $allowed_exts = array('jpg', 'jpeg', 'gif', 'png');
    340348    $converted = array();
    341349
    342     for($i = 0; $i < count($matches[0]); $i++)
     350    foreach($matches as $match)
    343351    {
    344       $item = $matches[0][$i];
    345 
    346       $image_data = '';
    347       if (isset($matches[1][$i]) && strlen(trim($matches[1][$i])) > 0)
    348       {
    349           $image_data = trim($matches[1][$i]);
    350       }
    351 
    352       preg_match('/url\(\'(.*)\'\)/imU', $item, $match);
    353       if (! isset($match[1]))
     352       $item = $match['item'];
     353       $image_data = '';
     354       if (isset($match['imagedata']) && strlen(trim($match['imagedata'])) > 0)
     355       {
     356         $image_data = $match['imagedata'];
     357       }
     358
     359      //preg_match('/url\(\'(.*)\'\)/imU', $item, $url_match);
     360      // Fix: backgrounds might not have ' ' in URL area.
     361      preg_match('/url\((.*)\)/imU', $item, $url_match);
     362      if (! isset($url_match[1]))
    354363      {
    355364        continue;
    356365      }
    357       $url = $match[1];
     366      // Remove any removing " ' to get the pure URL.
     367      $url = str_replace(['\'', '"'],'', $url_match[1]);
    358368      $filename = basename($url);
    359369      $ext = pathinfo($url, PATHINFO_EXTENSION);
     
    401411      {
    402412          // if webp, then add another URL() def after the targeted one.  (str_replace old full URL def, with new one on main match?
    403           $target_urldef = $matches[0][$i];
     413          $target_urldef = $item; //$match[0][$i];
    404414         
    405415          // The target_urldef should remain original to be picked up by str_replace, but the original_definitions are what goes back of the original stuff and should be filtered.
     
    410420            $converted[] = $target_urldef;
    411421            // Fix: The originals are not being put anymore because this would lead to double images and that's not a good thing.
    412             $new_urldef = "url('" . $checkedFile . "') $image_data ;";
     422            //            $new_urldef = "url('" . $checkedFile . "') $image_data ;";
     423            // Fix2 :: The image_data should not be matched anymore via main match, perhaps it works in all cases to leave it alone?
     424            $new_urldef = "url('" . $checkedFile . "') ";
    413425            $content = str_replace($target_urldef, $new_urldef, $content);
    414426          }
    415427      }
    416428
    417     }
    418 
     429    } // FOREACH
     430 
    419431    return $content;
    420432  }
  • shortpixel-image-optimiser/trunk/class/Controller/Optimizer/OptimizeAiController.php

    r3449706 r3490270  
    569569            {
    570570                Log::addInfo('Running Ai Replace : ', [$aiData, $sources, $replaces]);
    571                 $content = $replacer2->replaceContent($content, $sources, $replaces);
     571                $content = $replacer2->replaceContent($content, $sources, $replaces, false, true);
    572572                $replacer2->Updater()->updatePost($post_id, $content);
    573573            }
     
    754754}
    755755
     756/**
     757 * Generate the AI Data so that it can be shown public-facing.
     758 *
     759 * @param mixed $generated
     760 * @param mixed $current
     761 * @param mixed $original
     762 * @param bool $isPreview
     763 * @return (string[]|mixed)[]
     764 */
    756765public function formatGenerated($generated, $current, $original, $isPreview = false)
    757766{
     
    782791       {
    783792         // If preview don't fall back on other stuff, just leave it empty.
    784           $value = __('AI generation disabled', 'shortpixel-image-optimiser');
    785 
    786           /*if (true === $isPreview)
    787           {
    788              $value = '';
    789           }
    790           elseif (isset($current[$name]))
    791           {
    792                $value = $current[$name];
    793           }
    794           elseif(isset($original[$name]))
    795           {
    796                $value = $original[$name];
    797           } */
    798           $generated[$name] = $value;
     793         
     794         $value = '';
     795         $generated[$name] = $value;
    799796       }
    800797  }
  • shortpixel-image-optimiser/trunk/class/Controller/QueueController.php

    r3449706 r3490270  
    7979      {
    8080         $qItem->data()->returndatalist = $args['returndatalist'];
     81      }
     82
     83      if (true === $args['forceExclusion'])
     84      {
     85         $qItem->data()->forceExclusion = $args['forceExclusion'];
    8186      }
    8287
     
    667672             }
    668673          }
     674          else // If key does not exist, still add value from media to totals.
     675          {
     676            $object->stats->$key = $value;
     677          }
    669678      }
    670679
  • shortpixel-image-optimiser/trunk/class/Controller/View/BulkViewController.php

    r3449706 r3490270  
    269269                $kbinfo = '<span class="kbinfo"><a href="' . $kblink . '" target="_blank" ><span class="dashicons dashicons-editor-help">&nbsp;</span></a></span>';
    270270
    271 
    272 
    273271                $output .= '<div class="fatal">';
    274272                $output .= $date . ': ';
  • shortpixel-image-optimiser/trunk/class/Controller/View/SettingsViewController.php

    r3400007 r3490270  
    566566
    567567
    568 // Basically this whole premise is impossible.
    569568      public function loadDashBoardInfo()
    570569      {
     
    918917                            'exclusion-width',
    919918                            'exclusion-height',
     919              'exclusion-filesize-value',
     920              'exclusion-filesize-denom',
     921              'exclusion-filesize-operator',
    920922                            'apply-select',
    921923                            'screen_action',
  • shortpixel-image-optimiser/trunk/class/Model/EnvironmentModel.php

    r3400007 r3490270  
    9898    public function checkPHPVersion($needed)
    9999    {
    100 
    101100         if (version_compare(PHP_VERSION, $needed) >= 0 )
    102101         {
  • shortpixel-image-optimiser/trunk/class/Model/File/DirectoryModel.php

    r3289850 r3490270  
    4747
    4848      // Test if path actually has someting, otherwise just bail.
    49       if (strlen(trim($path)) == 0)
     49      if (strlen(trim($path ?? '')) == 0)
    5050      {
     51        $this->path = ''; // prevent various PHP string-function errors
    5152         return false;
    5253      }
     
    129130  public function getModified()
    130131  {
    131     return filemtime($this->path);
     132    return filemtime($this->path ?? '');
    132133  }
    133134
  • shortpixel-image-optimiser/trunk/class/Model/File/FileModel.php

    r3423259 r3490270  
    4848  protected $backupDirectory;
    4949
    50   private $basedirs; // cache basedirs
     50  private static $basedirs; // cache basedirs - static so for all objects during this run.
    5151
    5252  const FILE_OK = 1;
     
    6767        {
    6868             Log::addWarn('FileModel: Loading null path! ');
     69       $this->fullpath = '';
    6970             return false;
    7071        }
     
    679680    }
    680681
    681 
    682       if (! is_null($this->basedirs))
    683       {
    684          $basedirs = $this->basedirs;
    685          if (false === $basedirs) // if no restrictions are set, return false.
     682      if (! is_null(self::$basedirs) && false === self::$basedirs)
     683      {
     684         $basedirs = self::$basedirs;
     685         if (false === $basedirs) // if no restrictions are set, return false. otherwise use set basedirs for check.s
    686686         {
    687687            return false;
     
    693693        if (false === $basedir || strlen($basedir) == 0)
    694694        {
    695             $this->basedirs = false;
     695            self::$basedirs = false;
    696696            return false;
    697697        }
     
    700700        $basedirs = preg_split('/:|;/i', $basedir);
    701701
     702        // Remove blanket dirs like / from here since that could cause false positives on the strpos check on the path
     703        $basedirs = array_diff($basedirs, ['/', '//', '.', '..']);
     704
     705        // If the only openbasedir is broad, then restricted is false
     706        if (0 === count($basedirs))
     707        {
     708           $restricted = false;
     709        }
     710
    702711        foreach($basedirs as $basedir)
    703712        {
    704            // check realpath for symlinked shared hosts and this kind of fun, to prevent false positives
    705            $realdir = trailingslashit(realpath($basedir));
    706            if (! in_array($realdir, $basedirs))
     713           // check realpath for symlinked shared hosts and this kind of fun, to prevent false positives\
     714           // Fixes - Don't trailingslashit because it adds all paths if basedir has a config with last slashes
     715           // Fixes - Check for false on realpath.
     716           $realdir = realpath($basedir);
     717           if ($realdir !== false && false === in_array($realdir, $basedirs))
    707718           {
    708              $basedirs[] = $realdir;
     719             $basedirs[] = trailingslashit($realdir);
    709720           }
    710721        }
    711722
    712         $this->basedirs = $basedirs;
     723        self::$basedirs = $basedirs;
    713724
    714725      }
     
    724735
    725736     $restricted = apply_filters('shortpixel/file/basedir_check', $restricted, $path, $basedirs);
    726 
    727737     $this->is_restricted = $restricted;
    728738
     
    840850      if (strpos($path, $uploadDir->getPath()) !== false) // If upload Dir is feature in path, consider it ok.
    841851      {
    842         return $path;
    843       }
    844       elseif (file_exists($abspath->getPath() . $path)) // If upload dir is abspath plus return path. Exceptions.
    845       {
    846         return $abspath->getPath() . $path;
    847       }
    848       elseif(file_exists($uploadDir->getPath() . $path)) // This happens when upload_dir is not properly prepended in get_attachment_file due to WP errors
    849       {
    850           return $uploadDir->getPath() . $path;
     852        $fullpath = $path;
     853      }
     854      elseif (file_exists($abspath->getPath() . ltrim($path, '/')) ) // If upload dir is abspath plus return path. Exceptions.
     855      {
     856        $fullpath = $abspath->getPath() . ltrim($path, '/');
     857      }
     858      elseif(file_exists($uploadDir->getPath() . ltrim($path, '/')) ) // This happens when upload_dir is not properly prepended in get_attachment_file due to WP errors
     859      {
     860        $fullpath = $uploadDir->getPath() . ltrim($path, '/');
     861      }
     862      else  // Default if nothing else.
     863      {
     864        /* Check if the last part of abspath and first part of path are overlapping.  This can happen at sites where the
     865        app path is relative to root, but also included in the abspath ( ie /app/etc ) on bedrock installs. Try to remove the overlap */
     866        $overlap = null;
     867        $maxOverlap = min(strlen($abspath), strlen($path));
     868        for ($i = $maxOverlap; $i > 0; $i--) {
     869            if (substr($abspath, -$i) === substr($path, 0, $i)) {
     870                $overlap = $i;
     871                break;
     872            }
     873        }
     874        // Combine paths, removing the overlap
     875        if ($overlap !== null && is_int($overlap))
     876        {
     877          $fullpath = rtrim($abspath) . substr($path, $overlap);
     878        }
     879        else  // just glue then.
     880        {
     881          $path = ltrim($path, '/');
     882          $fullpath = $abspath->getPath() . $path;
     883        }
    851884      }
    852885
    853886      // this is probably a bit of a sharp corner to take.
    854887      // if path starts with / remove it due to trailingslashing ABSPATH
    855       $path = ltrim($path, '/');
    856       $fullpath = $abspath->getPath() . $path;
    857888
    858889      // We can't test for file_exists here, since file_model allows non-existing files.
    859890      // Test if directory exists, perhaps. Otherwise we are in for a failure anyhow.
    860891      //if (is_dir(dirname($fullpath)))
    861           return $fullpath;
     892
     893      // File is restricted is cached, otherwise leading to double check on relativepath.
     894      $this->is_restricted = false;
     895      return $fullpath;
    862896      //else
    863897      //    return $originalPath;
    864898  }
     899
     900
    865901
    866902    public function getPermissions()
  • shortpixel-image-optimiser/trunk/class/Model/Image/ImageModel.php

    r3449706 r3490270  
    293293            self::P_EXCLUDE_PATH,
    294294            self::P_EXCLUDE_SIZE,
     295            self::P_EXCLUDE_FILESIZE,
    295296        );
    296297
     
    410411    {
    411412        if (! $this->exists())
     413        {
    412414          return false;
     415        }
    413416        if ($this->is_virtual()) // if virtual, don't filecheck on image.
    414417        {
     
    419422        }
    420423
    421                 if (! is_null($this->mime))
    422                 {
    423                     return true;
    424                 }
    425 
    426                 if (\wpSPIO()->env()->is_function_usable('finfo_open')) // Faster function for getting mime types
     424
     425                if (is_null($this->mime) && \wpSPIO()->env()->is_function_usable('finfo_open')) // Faster function for getting mime types
    427426                     {
    428427                         $fileinfo = finfo_open(FILEINFO_MIME_TYPE);
    429428                         $this->mime = finfo_file($fileinfo, $this->getFullPath());
    430                          finfo_close($fileinfo);
     429             // Deprecated from version 8.5
     430             if (false === \wpSPIO()->env()->checkPHPversion('8.5') )
     431             {
     432                          finfo_close($fileinfo);
     433             }
    431434                         //FILEINFO_MIME_TYPE
    432435                    }
    433                     elseif(\wpSPIO()->env()->is_function_usable('mime_content_type')) {
     436                    elseif(is_null($this->mime) && \wpSPIO()->env()->is_function_usable('mime_content_type')) {
    434437                        $this->mime = mime_content_type($this->getFullPath());
    435438                    }
    436                     else {
     439                    elseif(is_null($this->mime)) {
    437440                        return true; // assume without check, that extension says what it is.
    438441                        // @todo This should probably trigger a notice in adminNoticesController.
    439442                    }
    440443
    441             if (strpos($this->mime, 'image') >= 0)
     444            if (strpos($this->mime, 'image') !== false)
    442445               return true;
    443446            else
     
    13041307        $bool = false;
    13051308        // Support for operators, more characters should be first in array
    1306         $operators = ['<=', '>=', '<', '>' ];
     1309       // $operators = ['<=', '>=', '<', '>' ];
    13071310       
    13081311        foreach($excludePatterns as $item)
     
    13191322               }
    13201323
    1321                $item_value = $item['value'];
    1322                $operator = ">";
     1324               $item_value = explode(' ', $item['value']);
     1325               if (! is_array($item_value) && count($item_value) <> 3)
     1326               {
     1327                 return false;
     1328               }
    13231329               
    1324                foreach($operators as $this_operator)
     1330               $operator = $item_value[0];
     1331               $value = $item_value[1];
     1332               $bytes = $item_value[2];
     1333             
     1334               if ('B' == $bytes)
    13251335               {
    1326                   if (strpos($item_value, $this_operator) !== false)
    1327                   {
    1328                      // Allow this operator.
    1329                      $operator = $this_operator;
    1330                      // Remove it from string
    1331                      $item_value = str_replace($this_operator, '', $item_value);
    1332                   }
     1336                 $compare_bytes = $value;
    13331337               }
    1334 
    1335                $compare_bytes = (int) UtilHelper::convertExclusionFileSizeToBytes($item_value);         
    1336                
     1338               else
     1339               {
     1340                $compare_bytes = (int) UtilHelper::convertExclusionFileSizeToBytes($value . $bytes);         
     1341               }
    13371342               // About version_compare for this
    1338               $bool = version_compare($compare_bytes, $filesize, $operator);
    1339               //$bool2 =
     1343              if ('>' == $operator &&  $filesize > $compare_bytes)
     1344              {
     1345                 $bool = true;
     1346              }
     1347              elseif ('<' == $operator &&  $filesize < $compare_bytes)
     1348              {
     1349                 $bool = true;
     1350              }
    13401351             
    13411352              if (true === $bool)
  • shortpixel-image-optimiser/trunk/class/external/cache.php

    r3335876 r3490270  
    8484        // important - first check the available cache plugins
    8585        $this->checkCaches();
    86 
     86       
    8787        $bool = apply_filters('shortpixel/external/flush_cache', true, $post_id, $imageItem);
    8888        if (false === $bool)
     
    165165
    166166            $urls = $imageItem->getAllUrls();
    167       $urls = array_values($urls['urls']);
     167     
     168      // The URLS part doesn't return in the customImageModel, use the whole array instead.
     169      $urls = array_values($urls['urls'] ?? $urls);
    168170            foreach($urls as $url)
    169171            {
  • shortpixel-image-optimiser/trunk/class/view/bulk/part-finished.php

    r3449706 r3490270  
    5151            <?php printf(__('Congratulations, ShortPixel has optimized %s %s images and thumbs %s for your website! Yay to faster loading websites! %s', 'shortpixel-image-optimiser'), '<b>', '<span data-stats-total="total"></span>','</b>', '&#x1F389;');
    5252            ?>
    53 <!--            <br>
    54             <?php
    55             printf(__('ShortPixel plugins are installed on hundreds of thousands of websites and we save our users over 500 GB by optimizing over 15 million images. Each and every day! %s', 'shortpixel-image-optimiser'), '&#x1F4AA;');
    56             ?>
    57             <br>
    58         <?php
    59             printf(__('We have been working on improving ShortPixel every day for over 7 years. It is very motivating for us when customers take a minute to leave us a %sreview%s. We thank you for that! %s', 'shortpixel-image-optimiser'), '<a href="https://wordpress.org/support/plugin/shortpixel-image-optimiser/reviews/?filter=5" target="_blank">','</a>', '&#x1F64C;');
    60         ?> -->
    6153        </p>
    6254    </div>
    63  
     55  <div class='bulk-summary' data-check-visibility="true" data-control='data-check-total-customOperation'>
     56        <p class='finished-paragraph'>
     57            <?php printf(__('ShortPixel has completed the %s task', 'shortpixel-image-optimiser'), '<span data-stats-total="customOperation">&nbsp;</span>');
     58            ?>
     59        </p>
     60    </div>
    6461
    6562    <div class='bulk-summary' data-check-visibility data-control="data-check-media-total">
  • shortpixel-image-optimiser/trunk/class/view/settings/part-ai.php

    r3449706 r3490270  
    392392      <div class='icon'><i class='shortpixel-icon chevron rotate_right'></i>&nbsp;</div>
    393393      <div class='result result_info'>
    394         <h3><?php _e('Generated AI image SEO data', 'shortpixel-image-optimiser'); ?></h3>
     394        <h3><?php _e('Generated AI Image SEO data', 'shortpixel-image-optimiser'); ?></h3>
    395395        <ul>
    396396<!--          <li><label><?php _e('Image filemame', 'shortpixel-image-optimiser'); ?>:</label> <span class='filename'></span>
  • shortpixel-image-optimiser/trunk/class/view/settings/part-exclusions.php

    r3449706 r3490270  
    234234                               <option value='path' data-example="/path/"><?php _e('Image Path', 'shortpixel-image-optimiser'); ?></option>
    235235                               <option value='size' data-example="widthXheight-widthXheight"><?php _e('Image Size', 'shortpixel-image-optimiser'); ?></option>
    236                           <!--     <option value='filesize' data-example="500KB / 1MB"><?php _e('Image Filesize', 'shortpixel-image-optimiser'); ?></option> -->
     236                               <option value='filesize' data-example="500KB / 1MB"><?php _e('Image Filesize', 'shortpixel-image-optimiser'); ?></option>
    237237                               <option value='date' data-example="YYYY-MM-DD"><?php _e('Date', 'shortpixel-image-optimiser') ?></option>
    238238                           </select>
     
    296296                          </select>
    297297                          <select name='exclusion-filesize-operator'>
    298                               <option value='lower'><?php _e('Exclude smaller than given filesize', 'shortpixel-image-optimiser'); ?></option>
    299                               <option value='higher' selected><?php _e('Exclude higher than given filesize', 'shortpixel-image-optimiser'); ?></option>
     298                              <option value='<'><?php _e('Exclude smaller than given filesize', 'shortpixel-image-optimiser'); ?></option>
     299                              <option value='>' selected><?php _e('Exclude higher than given filesize', 'shortpixel-image-optimiser'); ?></option>
    300300                          </select>
    301301
  • shortpixel-image-optimiser/trunk/class/view/settings/part-tools.php

    r3400007 r3490270  
    118118
    119119
    120     <h3><?php _e('Settings import / export', 'shortpixel-image-optimiser'); ?></h3>
     120    <h3><?php _e('Settings Import / Export', 'shortpixel-image-optimiser'); ?></h3>
    121121    <settinglist class='setting-importexport'>
    122122      <setting>
     
    126126        </content>
    127127      </setting>
     128
     129      <div id='settings-importexport-message' class='tools-message export-message'>&nbsp;</div>
     130
    128131      <setting>
    129132        <name><?php _e('Import settings', 'shortpixel-image-optimiser'); ?></name>
     
    137140     
    138141      </setting>
    139 
    140       <div id='settings-importexport-message' class='tools-message export-message'>&nbsp;</div>
    141 
    142142    </settinglist>
    143143
  • shortpixel-image-optimiser/trunk/class/view/snippets/media-popup.php

    r3400007 r3490270  
    2222    case 'remove':
    2323        $modal_title = __('AI Background Removal', 'shortpixel-image-optimiser');
    24         $suggesteFileName = $originalImage->getFileBase() . '_nobg.' . $originalImage->getExtension();
     24        $suggestedFileName = $originalImage->getFileBase() . '_nobg.' . $originalImage->getExtension();
    2525
    2626    break;
     
    2828    case 'scale':
    2929        $modal_title = __('AI Image Upscale', 'shortpixel-image-optimiser');
    30         $suggesteFileName = $originalImage->getFileBase() . '_upscale.' . $originalImage->getExtension();
     30        $suggestedFileName = $originalImage->getFileBase() . '_upscale.' . $originalImage->getExtension();
    3131
    3232    break;
     
    5555?>
    5656
    57 <div class="modal-wrapper" id="media-modal" data-item-id="<?php echo $this->data['item_id'] ?>" data-action-name="<?php echo $action_name ?>" >
     57<div class="modal-wrapper" id="media-modal" data-item-id="<?php echo intval($this->data['item_id']) ?>" data-action-name="<?php echo esc_attr($action_name) ?>" >
    5858    <div class="title"><h3><?php echo $modal_title ?> <span data-action='close'>X</span></h3> </div>
    5959    <div class='modal-content-wrapper'>
     
    6161    <div class="image-wrapper">
    6262            <div class="image-original">
    63                 <i style="background-image: url('<?php echo $previewImage->getURL(); ?>');"></i>
     63                <i style="background-image: url('<?php echo esc_url($previewImage->getURL()); ?>');"></i>
    6464                <span><?php _e('Before', 'shortpixel-image-optimiser'); ?>
    6565            </div>
     
    6969            <div class="image-preview">
    7070                <span><?php _e('After', 'shortpixel-image-optimiser'); ?></span>
    71                 <i data-placeholder="<?php echo $placeholderImage ?>" style="background-image: url('<?php echo $placeholderImage ?>');" ></i>
     71                <i data-placeholder="<?php echo esc_url($placeholderImage) ?>" style="background-image: url('<?php echo esc_url($placeholderImage) ?>');" ></i>
    7272                <div class='error-message shortpixel-hide'>&nbsp;</div>
    7373                <div class='load-preview-spinner shortpixel-hide'><img class='loadspinner' src="<?php echo esc_url(\wpSPIO()->plugin_url('res/img/bulk/loading-hourglass.svg')); ?>" /></div>
     
    132132            <span>
    133133                <p><?php _e('New File Name', 'shortpixel-image-optimiser'); ?></p>
    134                 <input type="text" name="new_filename" value="<?php echo $suggesteFileName ?>">
     134                <input type="text" name="new_filename" value="<?php echo esc_attr($suggestedFileName) ?>">
    135135            </span>
    136136
    137137            <span>
    138138                <p><?php _e('New Image Title', 'shortpixel-image-optimiser'); ?></p>
    139                 <input type="text" name="new_posttitle" value="<?php echo $post_title ?>">
     139                <input type="text" name="new_posttitle" value="<?php echo esc_attr($post_title) ?>">
    140140            </span>
    141141
  • shortpixel-image-optimiser/trunk/class/view/snippets/part-aitext.php

    r3449706 r3490270  
    6060        <a class='button button-secondary' title="Generate image SEO data with ShortPixel AI (Beta)" href="javascript:window.ShortPixelProcessor.screen.RequestAlt(<?php echo $item_id ?>)">
    6161            <img class="shortpixel-ai-icon ai" src="<?php echo $ai_icon ?>">   
    62             <span><?php printf(__('AI image SEO by ShortPixel %s', 'shortpixel-image-optimiser'), $dataItems) ?></span>
     62            <span><?php printf(__('AI Image SEO by ShortPixel %s', 'shortpixel-image-optimiser'), $dataItems) ?></span>
    6363            <img class="shortpixel-ai-icon shortpixel" src="<?php echo $robo_icon ?>">
    6464        </a>
  • shortpixel-image-optimiser/trunk/readme.txt

    r3449706 r3490270  
    55Tested up to: 6.9
    66Requires PHP: 7.4
    7 Stable tag: 6.4.3
     7Stable tag: 6.4.4
    88License: GPLv2 or later
    99License URI: http://www.gnu.org/licenses/gpl-2.0.html
     
    488488
    489489== Changelog ==
     490
     491= 6.4.4 =
     492
     493🌿 The Spring Update
     494
     495Release Date: March 24, 2026
     496
     497✨ New Feature
     498
     499* Exclusions by Filesize: You can now exclude images from optimization based on their file size, giving you even more precise control over what gets processed.
     500
     501🛠️ Fixes
     502
     503* Bulk Operation Messaging: When running bulk actions other than optimization, the correct descriptive text is now displayed.
     504* PICTURE Tag Fixes:
     505  - Fixed issues with certain background images not being handled correctly.
     506  - Multiple improvements to ensure correct paths and compatibility with Bedrock setups.
     507* Long Domain Handling: Fixed cases where very long domains caused CDN URL replacement to fail.
     508* Invalid API Key Feedback: A proper message is now shown in the AI settings preview when an invalid API key is used.
     509* AI Disabled Notice Scope: "AI generation disabled" message now appears only in the settings preview to avoid conflicts (especially with the Classic Editor).
     510* Async Chatbot Loading: The chatbot now loads asynchronously in settings to prevent slowdowns when CDN responses are delayed.
     511* JS Worker Stability: The JavaScript worker no longer stops if invalid JSON is received from the backend.
     512* LS Cache Compatibility: Fixed incompatibilities with LiteSpeed Cache and certain custom media folder setups.
     513* Custom Media Errors: Resolved errors occurring during optimization of specific custom media folders.
     514* open_basedir Improvements: Additional safeguards to prevent warnings with strict open_basedir configurations.
     515* PHP 8.4 Deprecation Fix: Fixed a rare deprecation warning on PHP 8.4.
     516
     517🛡️ Security Fixes
     518
     519* PHP Object Injection: Patched a potential vulnerability related to AI-generated SEO data (reported by PatchStack).
     520* Stored XSS (Author+): Fixed an authenticated stored XSS vulnerability when using AI features (reported by WordFence).
     521
     522✨ Tweaks & Improvements
     523
     524* Wording & Layout Updates: Small improvements to texts and settings layout for a cleaner and clearer experience.
     525
     526Update now for stronger security, improved compatibility, and smarter control over your optimization workflows! 🚀
    490527
    491528= 6.4.3 =
  • shortpixel-image-optimiser/trunk/res/css/shortpixel-settings.css

    r3423259 r3490270  
    3131
    3232div.spio-modal-shade {
    33   position: fixed; /* Stay in place */
    34   z-index: 10; /* Sit on top - zindex wars  */
     33  position: fixed;
     34  /* Stay in place */
     35  z-index: 10;
     36  /* Sit on top - zindex wars  */
    3537  left: 0;
    3638  top: 0;
    37   width: 100%; /* Full width */
    38   height: 100%; /* Full height */
    39   overflow: auto; /* Enable scroll if needed */
    40   background-color: rgb(0, 0, 0); /* Fallback color */
    41   background-color: rgba(0, 0, 0, 0.4); /* Black w/ opacity */
     39  width: 100%;
     40  /* Full width */
     41  height: 100%;
     42  /* Full height */
     43  overflow: auto;
     44  /* Enable scroll if needed */
     45  background-color: black;
     46  /* Fallback color */
     47  background-color: rgba(0, 0, 0, 0.4);
     48  /* Black w/ opacity */
    4249}
    4350
     
    5057  padding: 20px 16px 6px 16px;
    5158  border: 1px solid #888;
    52   width: 40%; /* Could be more or less, depending on screen size */
     59  width: 40%;
     60  /* Could be more or less, depending on screen size */
    5361  max-width: 100%;
    54   min-width: 300px; /* Could be more or less, depending on screen size */
    55   z-index: 100; /* Proper z-index */
     62  min-width: 300px;
     63  /* Could be more or less, depending on screen size */
     64  z-index: 100;
     65  /* Proper z-index */
    5666  position: fixed;
    5767  top: 10%;
     
    135145}
    136146.wrap.is-shortpixel-settings-page .shortpixel-settings button:hover, .wrap.is-shortpixel-settings-page .shortpixel-settings .button-setting:hover {
    137   background: rgb(50.3421052632, 215.4868421053, 228.6578947368);
     147  background: #32d7e5;
    138148}
    139149.wrap.is-shortpixel-settings-page .shortpixel-settings button i.switch, .wrap.is-shortpixel-settings-page .shortpixel-settings .button-setting i.switch {
     
    241251}
    242252.wrap.is-shortpixel-settings-page .shortpixel-settings section.wrapper .setting-tab .save-buttons.saving button.save {
    243   background-color: rgb(14.3684210526, 104.4473684211, 111.6315789474);
     253  background-color: #0e6870;
    244254}
    245255.wrap.is-shortpixel-settings-page .shortpixel-settings section.wrapper .setting-tab .save-buttons.saving button.save i {
     
    462472}
    463473.wrap.is-shortpixel-settings-page header .top-buttons a:hover, .wrap.is-shortpixel-settings-page header .top-buttons button:hover {
    464   background: rgb(50.3421052632, 215.4868421053, 228.6578947368);
     474  background: #32d7e5;
    465475}
    466476.wrap.is-shortpixel-settings-page header .top-buttons a i.switch, .wrap.is-shortpixel-settings-page header .top-buttons button i.switch {
     
    11951205}
    11961206.wrap.is-shortpixel-settings-page #tab-overview .wrapper .dashboard-button:hover {
    1197   background: rgb(50.3421052632, 215.4868421053, 228.6578947368);
     1207  background: #32d7e5;
    11981208}
    11991209.wrap.is-shortpixel-settings-page #tab-overview .wrapper .dashboard-button i.switch {
     
    18231833  height: 0;
    18241834  transition: 500ms height;
     1835  margin: 0;
     1836  padding: 0;
    18251837}
    18261838.wrap.is-shortpixel-settings-page #tab-exclusions .exclude-patterns-setting .new-exclusion .size-option > div {
     
    21462158  min-height: 44px;
    21472159  color: #1ABDCA;
    2148   background-color: rgb(232.25, 232.25, 232.25);
     2160  background-color: #e8e8e8;
    21492161  border-radius: 6px;
    21502162  font-weight: 700;
     
    21542166}
    21552167.wrap.is-shortpixel-settings-page #tab-tools .button:hover {
    2156   background: rgb(50.3421052632, 215.4868421053, 228.6578947368);
     2168  background: #32d7e5;
    21572169  color: #fff;
    21582170}
  • shortpixel-image-optimiser/trunk/res/css/shortpixel-settings.css.map

    r3423259 r3490270  
    1 {"version":3,"sourceRoot":"","sources":["../scss/elements/_fonts.scss","../scss/view/_inline-help.scss","../scss/shortpixel-settings.scss","../scss/view/_settings.scss","../scss/view/_settings-advanced.scss","../scss/view/_settings-onboarding.scss","../scss/view/_settings-structure.scss","../scss/elements/_mixins.scss","../scss/elements/_colors.scss","../scss/elements/_animation.scss","../scss/elements/_breakpoints.scss","../scss/elements/_header.scss","../scss/elements/_icons.scss","../scss/view/_settings-optimisation.scss","../scss/view/_settings-overview.scss","../scss/view/_settings-ai.scss","../scss/view/_settings-exclusions.scss","../scss/view/_settings-integrations.scss","../scss/view/_settings-tools.scss","../scss/elements/_setting.scss"],"names":[],"mappings":"AAEA;EAEI;EACA;EACA;EACA;;AAGJ;EAGI;EACA;EACA;EACA;;ACfJ;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;;AAIJ;EAEE;EACA;;;AAIF;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAEJ;EACI;AACA;EACF;EACE;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;;AACA;EACI;EACA;EACA;;AAEN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACI;;;AAEJ;EAAa;;;ACrEb;ACgBC;AA8WC;ACtYF;ACoJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AClJG;EAEE;;AAEF;EAA6B;;AAK7B;EAA2B;;AAK3B;EAAO;;AACP;EAAuC;;AAG1C;EAGG;EACD;EACA;EACA;EACA;EACA;;AAIA;EC9BA;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;ADUF;EAEE;;AACA;EAAQ;;AAGV;EACE;EACA;EACA;;AAEA;EACE;EACA;EACE,cExCO;EFyCT;;AACD;EAEC;EACA;;AAEC;EACC;EAEA;EACA;EACA,OErDK;EFsDL;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;;AAED;EAEI,OEpEG;;AFyEP;EACC,OE1EM;EF2EN;;AAOL;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cEvFW;;AF0Fb;EAEE;EAGA;;AAEA;EAEC;EACA;EACA;;AACA;EACE;EACA;;AAKD;EACC;EACA;EACA;EACA;EACA;EACA,OE7HS;;AF+HV;EACG;EACD;EACA;;AAGF;EAEE;;AAGH;EACC;EACA;EAEA;;AAGC;EACA;EACA;EACA;;AAEC;EACA;;AAKD;EAEC;;AACA;EG9JN;EACI;EACA;EACA;EACA;EH4JE;EACA;;AG3JP;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;ACXpC;EJ6JG;IACC;;EACA;IAEC;IACA;IACA;;;AAOP;EAEE;;AAGF;EACE;;AAGC;EAEC;;AAIF;EAEE;;AAGJ;EAEE;;AACA;EAEC;;AACA;EACC;;AAIF;EAEE;EACD;;AAED;EAEC;EACA;;AAED;EAEA;EAEA;;AIvNA;EJgOF;IACE;;EAGC;IAEE;;EAGH;IACC;IACA;;;AI3OD;EJmPF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EACA;IAEC;IACA;IACA;;EAED;IACC;;EACA;IACC;;EAED;IACC;;EAKJ;IACE;;EAEF;AAmCE;AAAA;AAAA;;EAjCA;IACC;IACA;IACA;IACA;IAuBA;IACA;;EAvBA;IACC;IACA;;EAIC;IACC;;EAID;IACC;;EAED;IACC;IACA;IACD;IACA;;EAOH;IACC;;EAKD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAED;IAEC;;EAGH;IACC;;EAED;IACC;;EACA;IACC;;;AK1VJ;EAEI;EACA;EACA;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACH;;AAEM;EJ5BL;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;AIOM;EACE,QHTG;EGUH;EACA;EACP;EACA;;AC5BL;EAEE;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;;AACA;EACG;;AAOH;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AAIJ;EAGE;EACA;EACA;EACA;EACA;;AAEA;EAEI;EACA;EACA;;AAGJ;EACE;EACA;EACA;;ACnDF;EACC;;AAKE;EACC;EACA;EACA;;AAEF;EACC;EACA;EACA;;AAID;EAEE;;AAEF;EACC;;AAEF;EACE;EACA;EAEA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA,kBLlCQ;EKmCR;;AAEF;EACE;;AACA;EACE,kBLvCI;;AK+CX;EAEC;EACA;EACA;;AAED;EAEC;;AAED;EAEE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAK;EAAe;;AAEpB;EACC;;AAED;EAAwB;EAAiB;;AAI3C;EAEE;EACA;EACA;EACA;;AAIF;EAEE;;AAOA;EACE;EACD;EACA;EACA;EACA;EACA;;AAED;EACE;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKH;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AHtHF;EG+GF;IAWI;;;AH1HF;EG+GF;IAeK;;;AAGL;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;;AAEF;EACE;EACA;;AHnJA;EGwJA;IACC;;EAED;IACC;IACA;IACA;;EAEF;IACC;;;AV7KH;EACC,OKFc;;ALSf;EACC;EACC;EACA;;AAGF;EAIC;;AAWA;EAEC,kBK/BU;ELgCV,cKjCa;;ALuCf;EACE;;AAID;EAGC;EACA;EACA;EACA;EACA,kBKvCe;;ALyCf;EACC;EACA;EACA;;AAGA;EACD;;AAGC;EACD;EACA;EACA,OKzDU;;AL4DV;EAEC;EACA;EACA;EACA;EACA;EACA;EACA,OKpES;;ALuET;EACC;EACA;EACA;EACA;;AAGA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;AAEA;EACC;;AAKF;EACC;EACA;EACA;;AO/FC;EP+BF;IAqEC;IACA;IACA;;;AAMD;EACG;;AAGJ;EAEE;EACA;;AAKA;EACC;;AAIH;EAEI;EACA;;AAGJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;;AAGF;EAEC;EACA;EACA;;AAGI;EAEJ;EACA;EACA;;AAII;EAEF;EACA;EACA;EACA;EACA;EACF;;AAED;EAEC;EACC;EACA,OKnLc;;ALqLhB;EACC;EACA;EACA,OK/LU;;ALsMV;EAEE;;AAID;EAEE;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAEC;EAEA;;AAQH;EAEA;;AAKD;EACC;EACA;EACA;;AO5OE;EPyOH;IAME;IACA;IACA;IACA;;;AAOF;EACC;EACA;EACA;;AO5PE;EPyPH;IAME;IACA;IACA;IACA;;;AAGF;EACC;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;;AAED;EACC;;AAKA;EAAK;;AACF;EACE;;AAEF;EACG;EACA;;AACA;EACI;EACA;;AAGP;EAEG;;AACA;EACI;;AACA;EACE;EACT;;AAEO;EAAgB;;AAKpB;EAEG;EACA;;AAKT;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMA;EACE;;AAIF;EACA;EACD;;AACC;EAAI;EACJ;EACA;EACA;;AAEA;EACC;;AAGF;EAAO;;AAGN;EACG;;AAEA;EACH;EACA;;AAIA;EAEE;EACH;;AACG;EACG;EACA;EACA;EACA;EACA;EACA;EACA;;AAQR;EAGE;EACA;EAEA;;AACA;EACE;;AAIJ;EACC;EACA;;AAEC;EAEE;;AAIJ;EAEE;;AAGH;EACE;EACA;;AACA;EACC;;AAED;EACC,QKvaS;ELwaT;EACA;;AAED;EAEC;EACA;EACA;EACA;EACA;;AAOC;EAEA,YK/aa;ELgbb;EACA;EAEA;;AOlbD;EP4aC;IAWC;;;AAGA;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;;AACA;EACE;;AAGF;EAAI;;AACJ;EAEE;;AO9cN;EP0bE;IAuBE;IACA;IACA;IACA;IACA;IACA;;;AWpeR;AA4cM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1cF;EACG;;AAEA;EAEK;EACA;EACA;EACA;;AAGL;EPXL;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;AOXM;EAEE;;AAML;EAEG;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACG;EACA;EACA;;AAOT;EAEG;;AACA;EAEG;EACA;EACA;EACA;EA2EA;;AA1ED;EACE;EACA;EACA;;AACP;EACE;;AAEF;EAAK;;AAGH;EACE;;AAEF;EACE;;AAKH;EACE;;AAEF;EACE;;AAEF;EAAa;;AAGT;EACE;EACA;EACA;EACA;EACA,ONvFC;;AM0FH;EACE;EACA;EACA;EACA;;AAEF;EACI;EACA;;AAEJ;EACE;EACA;EACA,ONtGD;EMuGC;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAGD;EAEE;;AAKF;EACX;EACA;EACA;;AJzHE;EI2CM;IAmFM;IACA;;EACA;IAAa;;;AAGnB;EAMI;EACA;EACA;;AACA;EACE;;AJ7IZ;EImIM;IAeM;;;AAKJ;EAEG;EACA;;AACA;EACG;;AAKR;EAIG;EACA;;AACA;EACE;EACA;;AACA;EACE;;AAGJ;EAEG;;AJhLZ;EIwCG;IA+IM;;EACA;IAEG;IACA;;;AAQT;EAEG;;AAIA;EACE;EAEA;EACA;EACA;;AAEA;EAEG;;AAEH;EACE;EACA;EACA,QN5MC;;AMiNA;EACG,QNpNF;;AMwNF;EACG,QNxNH;;AM6NF;EAEG;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA,QNvOH;EMwOG;;AJxPd;EIuMG;IAuDO;;EACA;IACG;IACA;IACA;;;AJ9Pb;EImMG;IAgEO;;EACA;IAEG;IACA;IACA;IACA;IACA;IACA;;EACA;IACG;IACA;IACA;;;AAKb;EACE,YNtRS;EMuRT;;AAKP;EACE,YN7Rc;EM8Rd;EACA;EACA;EACA;EACA;EACA;;AJlSA;EI2RF;IAUK;;EACA;IACG;IACA;;EACA;IACI;IACA;;;AAMR;EACM;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAGN;EAEE;EACA,ON9TQ;EM+TR;;AAGF;EACE;EACA;EACA;EACP;;AAGK;EACE;EACA;EACA;EACA;;AJhVN;EIiTE;IAmCK;;EACA;IACG;;;AASR;EACE;EACA;EACA;EACA,ONhXQ;EMiXR;EACA;EACA;EACA;EACA;EACA;;AAQF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EAEA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AACP;EACE;EACA;;AAIG;EACE;EACA;EAEA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIF;AAAA;EAEE;EACA;EACA;;AAIF;AAAA;EAEE;EACA;;AAIF;EACE;;AVtcD;EACH;EACW;;AAId;EAEE;EACA;;AACA;EACE;EACD;;AWXA;EAEI;EACA;;AAIJ;EACI;;AAGJ;EAEI;EACA;EACA;;AAGJ;EACI,kBPXO;EOYP;EACA;;AAIJ;EAEI;EACA;EACA;;AAII;EAEI;EACA;;AAEJ;EACI,QPhBD;;AOsBH;EAEI;;AACA;EACI;;AAEJ;EACI;;AAEJ;EACI;EACA;;AAGR;EACI,YP1DI;;AO6DR;EACI,YPtDE;EOuDF;;AAGJ;EACI;EACA;EACA;;AACA;EAEI;EACA;;AAMhB;EAEI;;AAEJ;EACH;;ACnFG;EAGE;EACA;EACA;EACA;;AACA;EACG;EACA;EACA;EAEA;EACA,ORTI;;AQUJ;EAAQ;;ANNb;EMRA;IAoBK;;;AAKP;EACK;;AACA;EACQ;EACA;EACA;;AAGb;EAEI;EACA;EACA;;AACF;EACG;EACA;EACA;EACA;EACA;EACA,ORxCM;;AQyCN;EAAQ;;AASR;EAEE;EACA;;AAKF;EACJ;;AAGC;EAGE;EACA;EAEA;EACA;EACA;EACA,ORtES;;AQwEX;EACG;EACA,OR3EM;;AQ6ET;EAqDK;;AAnDA;EAGG;EACA;EACP,ORpFQ;EQ2FD;EACA;EACA;EACP;EACO;EACA;EACA;EACA;;AAbV;EACC;;AAaS;EACG;;AAEH;EAEG;;AAEH;EACE;;AAGF;EAGE;;AAMA;EACE;;AAGX;EAEF;EACA;;AAKM;EACG;;AAIR;EAEI;EACP;EACO;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;EACA;;AAGF;EACI;EACA;EACA;;AAEJ;EAEG;;AAEH;EAEG;;AAEA;EAEG;;AAIL;EAEE;EACA;EACP,ORjLS;;AQkLF;EAEG;EACA;EACP,ORtLM;;AQwLT;EACF;EACA;;AAEE;EACF;EACA;;AAIY;EACE;EACA;;AAEF;EACG;;AAGN;EAEG;EACA;EACA;;AAEH;EAEE;EACA;;AACA;EACE;EACA;;AAEF;EAEG;EACA;EACA;EACA;EACA;EACA;;AAEH;EAEE;;AAEH;EAEG;;AAKP;EAEG;EACA;EACA;;AAKA;EACG;;AAEH;EAEG;EACP,OR3PM;;AQ8PL;EACG;EACA;;AACA;EACG;;AAUZ;EAEG;EACA;;AXvRJ;EACC;EACA;EACA;;AAED;EACC;;AACA;EACC;;AAGF;EAEC;EACA;;AAEA;EAEC,kBGPe;EHQf;EACA;EACA;EACA;EACA;;AACO;EACN;;AAED;EACC;;AAGU;EACT;EACA;;AACC;EACA;EACA;;AACA;EACC;EACA;EACA;;AAIH;EACC;;AAED;EACC;EACA;EACA,OG1CQ;;AH4CT;EACC;EACA;;AAED;EACC;EACA;;AAED;EACC;EACA,OGtDQ;;AHyDV;EACC,YGvDc;;AHwDd;EACC;EACA,OG7DQ;EH8DR;EACA;;AAGA;EACC;EACA;;AKpEF;ELGH;IAwEE;;;AKvEC;ELDH;IA2EE;;;AAID;EACC;;AAGF;EACC;EACA;;AACA;EACC;;AACA;EACC;EAEA;EACA;EACA;;AI1EH;EACC;IACE;IACA,aACE;;EAEJ;IACE;IACA,aACE;;EAEJ;IACE,aACE;;EAEJ;IACE,aACE;;;AJ4DH;EACC;EACA;;AAGF;EACC;;AACA;EACC;;AKvGA;ELdJ;IA0HE;;EACA;IACC;;EAED;IACC;IACA;;EACA;IACC;;EAED;IACC;IACA;;EAGF;IACC;;;AAiBH;EAEI;EACA;;AAKF;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAKD;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGK;EACE;EACP;;AAGA;EAEG;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAED;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAID;EAKG;;AAHA;EACG;;AAGH;EAEG;;AAGN;EAEG;EACA;EACA;;AAGA;EAEG;EACA;;AAMT;EAEI;;AACA;EAAc;;AACd;EAEG;EACA;EACA;EACA,YG/PG;EHgQH;EACA;EACA;EACA;;AACA;EACG,YGlQE;;AHqQR;EACK;;AAEL;EACK;;AAEL;EACL;;AAEK;EACL;EACA;EACA;;AAEK;EAEG;EACA;;AAEH;EAAQ;;AAGZ;EACC;;AY/RC;EACG;EACA;EACA;EACA;;ACPP;EAAU;EACT,OVKa;EUJb;EAEA;EACA;EAEA;EACA;EACA;;AAEA;EACC;EACA;;AAEF;EACE;EAEA;;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;;AACA;EAEE;EACA;EAED;EACA;;AACA;EACC;;AAQJ;EAEC;EACA;EACA;;AAQF;EAEC;EACA;;AAKH;EACC;EACA;EACA;;AAED;EAAM;;AAKP;EAEC;EACG;EACH;EACA;EACA;;AACA;EAEC;EACA;;AAOA;EACC;EACA;EACA;EACA;;AAED;EAEA;;AC7GH;EAEE;EACA,kBXQgB;EWPhB;EACA;EACA;EACA;EACA;EACA;EACA;AAQA;AAAA;AAAA;AAAA;;AAKA;EACE;;AAIF;EAGE;EACA;EACA;EACA;EACA;EACA,OX5BS;;AWgCX;EACE;EACA;EACA;EACA;;AACA;EACG;;AAGH;EACE;;AAIF;EACE;EACA;EACA;;AAGF;EACG;EACA;EACA;EACA;;AACA;EAEE;;AAOP;EACE;EACA;EACA;EACA;;AACA;EACG;EACA;;AAIL;AAAA;EAEE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;;AAIJ;EACE;;AAIA;EACE;;AAKJ;EACE;EACA;EACA;;AAKC;EACE","file":"shortpixel-settings.css"}
     1{"version":3,"sourceRoot":"","sources":["../scss/elements/_fonts.scss","../scss/view/_inline-help.scss","../scss/shortpixel-settings.scss","../scss/view/_settings.scss","../scss/view/_settings-advanced.scss","../scss/view/_settings-onboarding.scss","../scss/view/_settings-structure.scss","../scss/elements/_mixins.scss","../scss/elements/_colors.scss","../scss/elements/_animation.scss","../scss/elements/_breakpoints.scss","../scss/elements/_header.scss","../scss/elements/_icons.scss","../scss/view/_settings-optimisation.scss","../scss/view/_settings-overview.scss","../scss/view/_settings-ai.scss","../scss/view/_settings-exclusions.scss","../scss/view/_settings-integrations.scss","../scss/view/_settings-tools.scss","../scss/elements/_setting.scss"],"names":[],"mappings":"AAEA;EAEI;EACA;EACA;EACA;;AAGJ;EAGI;EACA;EACA;EACA;;ACfJ;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;;;AAIJ;EAEE;EACA;;;AAIF;EAEI;AAAiB;EACjB;AAAa;EACb;EACA;EACA;AAAa;EACb;AAAc;EACd;AAAgB;EAChB;AAA8B;EAC9B;AAAmC;;;AAEvC;EACI;AACA;EACF;EACE;EACA;EAEA;EACA;EACA;AAAY;EACZ;EACA;AAAkB;EAClB;AAAc;EACd;EACA;EACA;EACA;EACA;EAEA;;AACA;EACI;EACA;EACA;;AAEN;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACI;;;AAEJ;EAAa;;;ACrEb;ACgBC;AA8WC;ACtYF;ACoJA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AClJG;EAEE;;AAEF;EAA6B;;AAK7B;EAA2B;;AAK3B;EAAO;;AACP;EAAuC;;AAG1C;EAGG;EACD;EACA;EACA;EACA;EACA;;AAIA;EC9BA;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;ADUF;EAEE;;AACA;EAAQ;;AAGV;EACE;EACA;EACA;;AAEA;EACE;EACA;EACE,cExCO;EFyCT;;AACD;EAEC;EACA;;AAEC;EACC;EAEA;EACA;EACA,OErDK;EFsDL;EACA;EACA;;AAGA;EACC;EACA;EACA;EACA;;AAED;EAEI,OEpEG;;AFyEP;EACC,OE1EM;EF2EN;;AAOL;EACA;EACA;EACA;EACA;EACA;EACA;EACA,cEvFW;;AF0Fb;EAEE;EAGA;;AAEA;EAEC;EACA;EACA;;AACA;EACE;EACA;;AAKD;EACC;EACA;EACA;EACA;EACA;EACA,OE7HS;;AF+HV;EACG;EACD;EACA;;AAGF;EAEE;;AAGH;EACC;EACA;EAEA;;AAGC;EACA;EACA;EACA;;AAEC;EACA;;AAKD;EAEC;;AACA;EG9JN;EACI;EACA;EACA;EACA;EH4JE;EACA;;AG3JP;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;ACXpC;EJ6JG;IACC;;EACA;IAEC;IACA;IACA;;;AAOP;EAEE;;AAGF;EACE;;AAGC;EAEC;;AAIF;EAEE;;AAGJ;EAEE;;AACA;EAEC;;AACA;EACC;;AAIF;EAEE;EACD;;AAED;EAEC;EACA;;AAED;EAEA;EAEA;;AIvNA;EJgOF;IACE;;EAGC;IAEE;;EAGH;IACC;IACA;;;AI3OD;EJmPF;IACE;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EACA;IAEC;IACA;IACA;;EAED;IACC;;EACA;IACC;;EAED;IACC;;EAKJ;IACE;;EAEF;AAmCE;AAAA;AAAA;;EAjCA;IACC;IACA;IACA;IACA;IAuBA;IACA;;EAvBA;IACC;IACA;;EAIC;IACC;;EAID;IACC;;EAED;IACC;IACA;IACD;IACA;;EAOH;IACC;;EAKD;IACC;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;IACA;;EAED;IAEC;;EAGH;IACC;;EAED;IACC;;EACA;IACC;;;AK1VJ;EAEI;EACA;EACA;EACA;EACA;EAEA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;;AAEF;EACE;EACA;EACA;EACA;;AAEF;EACH;;AAEM;EJ5BL;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;AIOM;EACE,QHTG;EGUH;EACA;EACP;EACA;;AC5BL;EAEE;EACA;EACA;EACA;EACA;EAGA;EACA;EACA;;AACA;EACG;;AAOH;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AADF;EACE;;AAIJ;EAGE;EACA;EACA;EACA;EACA;;AAEA;EAEI;EACA;EACA;;AAGJ;EACE;EACA;EACA;;ACnDF;EACC;;AAKE;EACC;EACA;EACA;;AAEF;EACC;EACA;EACA;;AAID;EAEE;;AAEF;EACC;;AAEF;EACE;EACA;EAEA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;EACA,kBLlCQ;EKmCR;;AAEF;EACE;;AACA;EACE,kBLvCI;;AK+CX;EAEC;EACA;EACA;;AAED;EAEC;;AAED;EAEE;EACA;EACA;EACA;EACA;EACA;;AAEA;EAAK;EAAe;;AAEpB;EACC;;AAED;EAAwB;EAAiB;;AAI3C;EAEE;EACA;EACA;EACA;;AAIF;EAEE;;AAOA;EACE;EACD;EACA;EACA;EACA;EACA;;AAED;EACE;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAKH;EACE;EACA;EACA;EACA;EACA;;AACA;EACE;;AHtHF;EG+GF;IAWI;;;AH1HF;EG+GF;IAeK;;;AAGL;EACE;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AAGJ;EACE;EACA;;AAEF;EACE;EACA;;AHnJA;EGwJA;IACC;;EAED;IACC;IACA;IACA;;EAEF;IACC;;;AV7KH;EACC,OKFc;;ALSf;EACC;EACC;EACA;;AAGF;EAIC;;AAWA;EAEC,kBK/BU;ELgCV,cKjCa;;ALuCf;EACE;;AAID;EAGC;EACA;EACA;EACA;EACA,kBKvCe;;ALyCf;EACC;EACA;EACA;;AAGA;EACD;;AAGC;EACD;EACA;EACA,OKzDU;;AL4DV;EAEC;EACA;EACA;EACA;EACA;EACA;EACA,OKpES;;ALuET;EACC;EACA;EACA;EACA;;AAGA;EACF;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;AAEA;EACC;;AAKF;EACC;EACA;EACA;;AO/FC;EP+BF;IAqEC;IACA;IACA;;;AAMD;EACG;;AAGJ;EAEE;EACA;;AAKA;EACC;;AAIH;EAEI;EACA;;AAGJ;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;;AAGF;EAEC;EACA;EACA;;AAGI;EAEJ;EACA;EACA;;AAII;EAEF;EACA;EACA;EACA;EACA;EACF;;AAED;EAEC;EACC;EACA,OKnLc;;ALqLhB;EACC;EACA;EACA,OK/LU;;ALsMV;EAEE;;AAID;EAEE;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAEC;EAEA;;AAQH;EAEA;;AAKD;EACC;EACA;EACA;;AO5OE;EPyOH;IAME;IACA;IACA;IACA;;;AAOF;EACC;EACA;EACA;;AO5PE;EPyPH;IAME;IACA;IACA;IACA;;;AAGF;EACC;EACA;EACA;EACA;EACA;;AAED;EACC;EACA;EACA;EACA;;AAED;EACC;;AAKA;EAAK;;AACF;EACE;;AAEF;EACG;EACA;;AACA;EACI;EACA;;AAGP;EAEG;;AACA;EACI;;AACA;EACE;EACT;;AAEO;EAAgB;;AAKpB;EAEG;EACA;;AAKT;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMA;EACE;;AAIF;EACA;EACD;;AACC;EAAI;EACJ;EACA;EACA;;AAEA;EACC;;AAGF;EAAO;;AAGN;EACG;;AAEA;EACH;EACA;;AAIA;EAEE;EACH;;AACG;EACG;EACA;EACA;EACA;EACA;EACA;EACA;;AAQR;EAGE;EACA;EAEA;;AACA;EACE;;AAIJ;EACC;EACA;;AAEC;EAEE;;AAIJ;EAEE;;AAGH;EACE;EACA;;AACA;EACC;;AAED;EACC,QKvaS;ELwaT;EACA;;AAED;EAEC;EACA;EACA;EACA;EACA;;AAOC;EAEA,YK/aa;ELgbb;EACA;EAEA;;AOlbD;EP4aC;IAWC;;;AAGA;EAEE;EACA;EACA;EACA;EAEA;EACA;EACA;EAEA;EACA;;AACA;EACE;;AAGF;EAAI;;AACJ;EAEE;;AO9cN;EP0bE;IAuBE;IACA;IACA;IACA;IACA;IACA;;;AWpeR;AA4cM;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;AA1cF;EACG;;AAEA;EAEK;EACA;EACA;EACA;;AAGL;EPXL;EACA,YCMa;EDLb;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;;AAKD;EACE;EACA;;AAEF;EAEE;EACA;EACA;;AOXM;EAEE;;AAML;EAEG;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACG;EACA;EACA;;AAOT;EAEG;;AACA;EAEG;EACA;EACA;EACA;EA2EA;;AA1ED;EACE;EACA;EACA;;AACP;EACE;;AAEF;EAAK;;AAGH;EACE;;AAEF;EACE;;AAKH;EACE;;AAEF;EACE;;AAEF;EAAa;;AAGT;EACE;EACA;EACA;EACA;EACA,ONvFC;;AM0FH;EACE;EACA;EACA;EACA;;AAEF;EACI;EACA;;AAEJ;EACE;EACA;EACA,ONtGD;EMuGC;;AAIF;EACE;EACA;EACA;EACA;EACA;;AAGD;EAEE;;AAKF;EACX;EACA;EACA;;AJzHE;EI2CM;IAmFM;IACA;;EACA;IAAa;;;AAGnB;EAMI;EACA;EACA;;AACA;EACE;;AJ7IZ;EImIM;IAeM;;;AAKJ;EAEG;EACA;;AACA;EACG;;AAKR;EAIG;EACA;;AACA;EACE;EACA;;AACA;EACE;;AAGJ;EAEG;;AJhLZ;EIwCG;IA+IM;;EACA;IAEG;IACA;;;AAQT;EAEG;;AAIA;EACE;EAEA;EACA;EACA;;AAEA;EAEG;;AAEH;EACE;EACA;EACA,QN5MC;;AMiNA;EACG,QNpNF;;AMwNF;EACG,QNxNH;;AM6NF;EAEG;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA,QNvOH;EMwOG;;AJxPd;EIuMG;IAuDO;;EACA;IACG;IACA;IACA;;;AJ9Pb;EImMG;IAgEO;;EACA;IAEG;IACA;IACA;IACA;IACA;IACA;;EACA;IACG;IACA;IACA;;;AAKb;EACE,YNtRS;EMuRT;;AAKP;EACE,YN7Rc;EM8Rd;EACA;EACA;EACA;EACA;EACA;;AJlSA;EI2RF;IAUK;;EACA;IACG;IACA;;EACA;IACI;IACA;;;AAMR;EACM;EACA;EACA;EACA;EACA;;AAGA;EACE;EACA;;AAGN;EAEE;EACA,ON9TQ;EM+TR;;AAGF;EACE;EACA;EACA;EACP;;AAGK;EACE;EACA;EACA;EACA;;AJhVN;EIiTE;IAmCK;;EACA;IACG;;;AASR;EACE;EACA;EACA;EACA,ONhXQ;EMiXR;EACA;EACA;EACA;EACA;EACA;;AAQF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EAEA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;;AACP;EACE;EACA;;AAIG;EACE;EACA;EAEA;;AAGF;EACE;;AAGF;EACE;;AAGF;EACE;EACA;EACA;EACA;EACA;;AAIF;AAAA;EAEE;EACA;EACA;;AAIF;AAAA;EAEE;EACA;;AAIF;EACE;;AVtcD;EACH;EACW;;AAId;EAEE;EACA;;AACA;EACE;EACD;;AWXA;EAEI;EACA;;AAIJ;EACI;;AAGJ;EAEI;EACA;EACA;;AAGJ;EACI,kBPXO;EOYP;EACA;;AAIJ;EAEI;EACA;EACA;;AAII;EAEI;EACA;;AAEJ;EACI,QPhBD;;AOsBH;EAEI;;AACA;EACI;;AAEJ;EACI;;AAEJ;EACI;EACA;;AAGR;EACI,YP1DI;;AO6DR;EACI,YPtDE;EOuDF;;AAGJ;EACI;EACA;EACA;;AACA;EAEI;EACA;;AAMhB;EAEI;;AAEJ;EACH;;ACnFG;EAGE;EACA;EACA;EACA;;AACA;EACG;EACA;EACA;EAEA;EACA,ORTI;;AQUJ;EAAQ;;ANNb;EMRA;IAoBK;;;AAKP;EACK;;AACA;EACQ;EACA;EACA;;AAGb;EAEI;EACA;EACA;;AACF;EACG;EACA;EACA;EACA;EACA;EACA,ORxCM;;AQyCN;EAAQ;;AASR;EAEE;EACA;;AAKF;EACJ;;AAGC;EAGE;EACA;EAEA;EACA;EACA;EACA,ORtES;;AQwEX;EACG;EACA,OR3EM;;AQ6ET;EAqDK;;AAnDA;EAGG;EACA;EACP,ORpFQ;EQ2FD;EACA;EACA;EACP;EACO;EACA;EACA;EACA;;AAbV;EACC;;AAaS;EACG;;AAEH;EAEG;;AAEH;EACE;;AAGF;EAGE;;AAMA;EACE;;AAGX;EAEF;EACA;;AAKM;EACG;;AAIR;EAEI;EACP;EACO;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;EACA;EACA;;AAGF;EACI;EACA;EACA;;AAEJ;EAEG;;AAEH;EAEG;;AAEA;EAEG;;AAIL;EAEE;EACA;EACP,ORjLS;;AQkLF;EAEG;EACA;EACP,ORtLM;;AQwLT;EACF;EACA;;AAEE;EACF;EACA;;AAIY;EACE;EACA;;AAEF;EACG;;AAGN;EAEG;EACA;EACA;;AAEH;EAEE;EACA;;AACA;EACE;EACA;;AAEF;EAEG;EACA;EACA;EACA;EACA;EACA;;AAEH;EAEE;;AAEH;EAEG;;AAKP;EAEG;EACA;EACA;EACA;EACA;;AAKA;EACG;;AAEH;EAEG;EACP,OR7PM;;AQgQL;EACG;EACA;;AACA;EACG;;AAUZ;EAEG;EACA;;AXzRJ;EACC;EACA;EACA;;AAED;EACC;;AACA;EACC;;AAGF;EAEC;EACA;;AAEA;EAEC,kBGPe;EHQf;EACA;EACA;EACA;EACA;;AACO;EACN;;AAED;EACC;;AAGU;EACT;EACA;;AACC;EACA;EACA;;AACA;EACC;EACA;EACA;;AAIH;EACC;;AAED;EACC;EACA;EACA,OG1CQ;;AH4CT;EACC;EACA;;AAED;EACC;EACA;;AAED;EACC;EACA,OGtDQ;;AHyDV;EACC,YGvDc;;AHwDd;EACC;EACA,OG7DQ;EH8DR;EACA;;AAGA;EACC;EACA;;AKpEF;ELGH;IAwEE;;;AKvEC;ELDH;IA2EE;;;AAID;EACC;;AAGF;EACC;EACA;;AACA;EACC;;AACA;EACC;EAEA;EACA;EACA;;AI1EH;EACC;IACE;IACA,aACE;;EAEJ;IACE;IACA,aACE;;EAEJ;IACE,aACE;;EAEJ;IACE,aACE;;;AJ4DH;EACC;EACA;;AAGF;EACC;;AACA;EACC;;AKvGA;ELdJ;IA0HE;;EACA;IACC;;EAED;IACC;IACA;;EACA;IACC;;EAED;IACC;IACA;;EAGF;IACC;;;AAiBH;EAEI;EACA;;AAKF;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAHC;EACM;EACP;EACA;;AAKD;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGK;EACE;EACP;;AAGA;EAEG;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;;AAED;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAID;EAKG;;AAHA;EACG;;AAGH;EAEG;;AAGN;EAEG;EACA;EACA;;AAGA;EAEG;EACA;;AAMT;EAEI;;AACA;EAAc;;AACd;EAEG;EACA;EACA;EACA,YG/PG;EHgQH;EACA;EACA;EACA;;AACA;EACG,YGlQE;;AHqQR;EACK;;AAEL;EACK;;AAEL;EACL;;AAEK;EACL;EACA;EACA;;AAEK;EAEG;EACA;;AAEH;EAAQ;;AAGZ;EACC;;AY/RC;EACG;EACA;EACA;EACA;;ACPP;EAAU;EACT,OVKa;EUJb;EAEA;EACA;EAEA;EACA;EACA;;AAEA;EACC;EACA;;AAEF;EACE;EAEA;;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAGA;EACE;EACA;EACA;EACA;EACA;;AACA;EAEE;EACA;EAED;EACA;;AACA;EACC;;AAQJ;EAEC;EACA;EACA;;AAQF;EAEC;EACA;;AAKH;EACC;EACA;EACA;;AAED;EAAM;;AAKP;EAEC;EACG;EACH;EACA;EACA;;AACA;EAEC;EACA;;AAOA;EACC;EACA;EACA;EACA;;AAED;EAEA;;AC7GH;EAEE;EACA,kBXQgB;EWPhB;EACA;EACA;EACA;EACA;EACA;EACA;AAQA;AAAA;AAAA;AAAA;;AAKA;EACE;;AAIF;EAGE;EACA;EACA;EACA;EACA;EACA,OX5BS;;AWgCX;EACE;EACA;EACA;EACA;;AACA;EACG;;AAGH;EACE;;AAIF;EACE;EACA;EACA;;AAGF;EACG;EACA;EACA;EACA;;AACA;EAEE;;AAOP;EACE;EACA;EACA;EACA;;AACA;EACG;EACA;;AAIL;AAAA;EAEE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAIA;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;;AAGF;AAAA;EACE;EACA;;AAIJ;EACE;;AAIA;EACE;;AAKJ;EACE;EACA;EACA;;AAKC;EACE","file":"shortpixel-settings.css"}
  • shortpixel-image-optimiser/trunk/res/js/screens/screen-media.js

    r3400007 r3490270  
    119119                button.style.textDecoration = 'none';
    120120               
    121                
    122121                scaleButton.classList.add('button-link');
    123122                scaleButton.style.display = 'inline';
     
    132131
    133132                parent.append(button);
    134 
    135 
    136             }
    137         }
    138        
     133            }
     134        }
    139135    }
    140136
     
    449445        }
    450446        var attachmentAlt = this.GetPageAttachmentAlt();
     447
    451448        if (null === attachmentAlt) // No attach alt around
    452449        {
     
    458455            return;
    459456        }
     457
     458        var wp_screen_id = this.settings.wp_screen_id;
     459
    460460
    461461        if (typeof aiData !== 'undefined')
     
    497497         let captionFields = ['attachment_caption', 'attachment-details-caption', 'attachment-details-two-column-caption'];
    498498         let descriptionFields = ['attachment_content', 'attachment-details-description', 'attachment-details-two-column-description'];
    499          let postTitleFields = ['title', 'attachment-details-title', 'attachment-details-two-column-title'];
     499       
     500         let postTitleFields = ['attachment-details-title', 'attachment-details-two-column-title'];
     501         // This check: the edit-post screen also has a name title field, but this is for the post, not attachment. only replace in attachment screen
     502         if ('attachment' == wp_screen_id)
     503         { 
     504            postTitleFields.push('title');
     505         }
    500506         
    501507         if (typeof newCaption !== 'undefined' || newCaption < 0)
  • shortpixel-image-optimiser/trunk/res/js/shortpixel-settings.js

    r3440585 r3490270  
    13981398        }
    13991399        else {
    1400             var mode = 'edit';
    1401 
     1400            //var mode = 'edit';
    14021401            let mainEl = event.target.closest('li');
    14031402            var id = mainEl.id;
    14041403
    1405 
    1406             var exclusionModal = this.root.querySelector('.new-exclusion');
    1407             //  event.target.closest('li').after(exclusionModal);
    1408             //exclusionModal.parentElement = event.target.closest('li').after(exclusionModal);
     1404            //var exclusionModal = this.root.querySelector('.new-exclusion');
    14091405
    14101406            var title = this.root.querySelector('.new-exclusion h3.edit-title');
    1411             //var button = this.root.querySelector('.new-exclusion .button-actions button[name="removeExclusion"]');
    14121407            var input = this.root.querySelector('.new-exclusion input[name="edit-exclusion"]')
    14131408
     
    14221417
    14231418        title.classList.remove('not-visible', 'hidden');
    1424         //button.classList.remove('not-visible', 'hidden');
    1425 
    14261419    }
    14271420
     
    15001493            example = '';
    15011494        }
    1502 
    1503         var valueOption = this.root.querySelector('.new-exclusion .value-option');
    1504         var sizeOption = this.root.querySelector('.new-exclusion .size-option');
    1505         var dateOption = this.root.querySelector('.new-exclusion .date-option');
    1506         var regexOption = this.root.querySelector('.regex-option');
    1507         var switchExactOption = this.root.querySelector('.exact-option');
    1508         var applyOption = this.root.querySelector('.new-exclusion select[name="apply-select"]');
    1509 
    1510 
    1511         if (value == 'size') {
    1512             valueOption.classList.add('not-visible');
    1513             sizeOption.classList.remove('not-visible');
    1514             switchExactOption.classList.remove('not-visible');
    1515             regexOption.classList.add('not-visible');
    1516         }
    1517         else {
    1518             valueOption.classList.remove('not-visible');
    1519             sizeOption.classList.add('not-visible');
    1520             switchExactOption.classList.add('not-visible');
    1521             regexOption.classList.remove('not-visible');
    1522         }
    1523 
    1524         if ('date' === value)
     1495       
     1496        var options = this.GetAllExclusionOptions();
     1497       
     1498        var show = [];
     1499
     1500        switch(value)
    15251501        {
    1526             dateOption.classList.remove('not-visible');
    1527             regexOption.classList.add('not-visible');
    1528             applyOption.value = 'all';
    1529             applyOption.disabled = true;
    1530         }
    1531         else
     1502             case 'size':
     1503                show =  ['sizeOption', 'switchExactOption', 'applyOption'];
     1504             break;
     1505             case 'date':
     1506                show = ['dateOption', 'valueOption'];
     1507             break;
     1508             case 'filesize':
     1509                show = ['applyOption', 'operatorOption'];
     1510             break;
     1511             default:
     1512                show = ['valueOption', 'applyOption', 'regexOption'];
     1513             
     1514        }
     1515
     1516        for (const optKey in options)
     1517            {
     1518                console.log(optKey, options[optKey]);
     1519                if (show.indexOf(optKey) >= 0)
     1520                {
     1521                    if (options[optKey].classList.contains('not-visible'))
     1522                    {
     1523                        options[optKey].classList.remove('not-visible');
     1524                    }
     1525                }   
     1526                else if (false === options[optKey].classList.contains('not-visible'))
     1527                {
     1528                     options[optKey].classList.add('not-visible');
     1529                }
     1530                       
     1531            }
     1532
     1533        for (let i = 0; i < options.length; i++)
    15321534        {
    1533             dateOption.classList.add('not-visible');
    1534             regexOption.classList.remove('not-visible');
    1535             applyOption.disabled = false;
    1536         }
    1537        
     1535
     1536
     1537             options[show[i]].classList.remove('not-visible');
     1538        }       
    15381539
    15391540        var valueInput = this.root.querySelector('input[name="exclusion-value"]');
     
    15411542            valueInput.placeholder = example;
    15421543        }
     1544    }
     1545
     1546    /* Get all options for exclusions */
     1547    GetAllExclusionOptions()
     1548    {
     1549        var options = {
     1550            'valueOption' : this.root.querySelector('.new-exclusion .value-option'),
     1551            'sizeOption'  : this.root.querySelector('.new-exclusion .size-option'),
     1552            'dateOption'  :this.root.querySelector('.new-exclusion .date-option'),
     1553            'regexOption' : this.root.querySelector('.new-exclusion .regex-option'),
     1554            'switchExactOption' : this.root.querySelector('.new-exclusion .exact-option'),
     1555            'applyOption' : this.root.querySelector('.new-exclusion .applyto-option'),
     1556            'operatorOption' : this.root.querySelector('.new-exclusion .operator-option '),
     1557
     1558        };
     1559
     1560        return options;
    15431561    }
    15441562
     
    15821600        var applyOption = this.root.querySelector('.new-exclusion select[name="apply-select"]');
    15831601        var regexOption = this.root.querySelector('.new-exclusion input[name="exclusion-regex"]');
    1584 
     1602       
    15851603        if ('read' === mode) {
    15861604            setting.type = typeOption.value;
     
    16831701
    16841702                this.NewExclusionUpdateType(typeOption)
    1685                 //      this.NewExclusionToggleSizeOption(exactOption);
    16861703            }
    16871704            this.NewExclusionToggleSizeOption(exactOption);
    16881705
     1706        } // Size Option
     1707        else if ('filesize' === setting.type)
     1708        {
     1709            var the_value = this.root.querySelector('.new-exclusion input[name="exclusion-filesize-value"]');
     1710            var denom = this.root.querySelector('.new-exclusion select[name="exclusion-filesize-denom"]');
     1711            var operator = this.root.querySelector('.new-exclusion select[name="exclusion-filesize-operator"]');
     1712console.log(demon.selectedIndex);
     1713            if ('read' === mode)
     1714            {
     1715                setting.value = operator.options[operator.selectedIndex].value.trim() + " " + the_value.value.trim() + " " + denom.options[denom.selectedIndex].value.trim();
     1716                validateInput.push(the_value);
     1717
     1718            }
     1719            else if ('write' === mode)
     1720            {
     1721                var split = setting.value.split(" ");
     1722                operator.value = split[0];
     1723                the_value.value = split[1];
     1724                denom.value = split[2];
     1725
     1726                for(let i = 0; i < operator.options; i++)
     1727                {
     1728                    if(operator.options[i].value == split[0])
     1729                    {
     1730                        operator.selectedIndex = i;
     1731                    }
     1732                }
     1733                for(let i = 0; i < denom.options; i++)
     1734                    {
     1735                        if(denom.options[i].value == split[2])
     1736                        {
     1737                            denom.selectedIndex = i;
     1738                        }
     1739                    }
     1740
     1741                this.NewExclusionUpdateType(typeOption);
     1742
     1743            }
    16891744        }
    16901745        else {
     
    18671922            var input = inputs[i];
    18681923            if (input.tagName == 'SELECT') {
    1869                 input.selectedIndex = 0;
     1924                input.selectedIndex = 0; // First reset blindly
     1925                for (var j = 0; j < input.options.length; j++)
     1926                {
     1927                     if (true === input.options[j].defaultSelected)
     1928                     {
     1929                        input.selectedIndex = j;
     1930                        break;
     1931                     }
     1932                }
    18701933            }
    18711934            else if (input.type == 'checkbox') {
  • shortpixel-image-optimiser/trunk/res/js/shortpixel-worker.js

    r3449706 r3490270  
    101101      if (response.ok)
    102102      {
    103           var json = await response.json();
    104           postMessage({'status' : true, response: json});
     103         // Try / Catch, returned data might not be valid JSON
     104          try {
     105            var json = await response.json();
     106            postMessage({'status' : true, response: json});
     107          }
     108          catch (error)
     109          {
     110             postMessage({'status' : false, response: error});
     111          }
    105112      }
    106113      else if(this && ! this.stopped)
  • shortpixel-image-optimiser/trunk/res/scss/view/_settings-exclusions.scss

    r3198739 r3490270  
    250250           height: 0;
    251251           transition: 500ms height;
     252           margin: 0;
     253           padding: 0;
    252254        }
    253255
  • shortpixel-image-optimiser/trunk/shortpixel-plugin.php

    r3449706 r3490270  
    315315
    316316        $settings       = \wpSPIO()->settings();
     317        $env = \wpSPIO()->env();
    317318        $ajaxController = AjaxController::getInstance();
    318319
     
    328329
    329330        $OptimizeAiController = OptimizeAiController::getInstance();
     331
     332        $args_footer_async = ['strategy' => 'async', 'in_footer' => true];
    330333
    331334     wp_register_script('shortpixel-folderbrowser', plugins_url('/res/js/shortpixel-folderbrowser.js', SHORTPIXEL_PLUGIN_FILE), array(), SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true );
     
    371374        wp_register_script('shortpixel-inline-help', plugins_url('res/js/shortpixel-inline-help.js',  SHORTPIXEL_PLUGIN_FILE), [], SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true);
    372375        wp_register_script('shortpixel-chatbot',
    373             apply_filters('shortpixel/plugin/nohelp', 'https://spcdn.shortpixel.ai/assets/js/ext/ai-chat-agent.js'), [], SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true);
     376            apply_filters('shortpixel/plugin/nohelp', 'https://spcdn.shortpixel.ai/assets/js/ext/ai-chat-agent.js'), [], SHORTPIXEL_IMAGE_OPTIMISER_VERSION, $args_footer_async);
    374377
    375378        // This filter is from ListMediaViewController for the media library grid display, executive script in shortpixel-media.js.
     
    400403                'bulkSecret'        => $secretKey,
    401404                'isBulkPage'        => (bool) $is_bulk_page,
    402                 'screenURL'         => false,
    403405                'workerURL'         => plugins_url( 'res/js/shortpixel-worker.js', SHORTPIXEL_PLUGIN_FILE ),
    404406                'nonce_process'     => wp_create_nonce( 'processing' ),
     
    454456            'popup_load_preview' => true, // Upon opening, load Preview or not.
    455457            'too_big_for_scale_title'  => __('Image too big for scaling', 'shortpixel-image-optimiser'),
     458            'wp_screen_id' => $env->screen_id,
    456459     ];
    457460
  • shortpixel-image-optimiser/trunk/wp-shortpixel.php

    r3449706 r3490270  
    44 * Plugin URI: https://shortpixel.com/
    55 * Description: ShortPixel optimizes images automatically, while guarding the quality of your images. Check your <a href="https://plugins.trac.wordpress.org/wp-admin/options-general.php?page=wp-shortpixel-settings" target="_blank">Settings &gt; ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
    6  * Version: 6.4.3
     6 * Version: 6.4.4
    77 * Author: ShortPixel - Convert WebP/AVIF & Optimize Images
    88 * Author URI: https://shortpixel.com
     
    3737define('SHORTPIXEL_PLUGIN_DIR', __DIR__);
    3838
    39 define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "6.4.3");
     39define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "6.4.4");
    4040
    4141define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
Note: See TracChangeset for help on using the changeset viewer.