Changeset 3490270
- Timestamp:
- 03/24/2026 06:13:49 PM (4 days ago)
- Location:
- shortpixel-image-optimiser
- Files:
-
- 62 edited
- 1 copied
-
tags/6.4.4 (copied) (copied from shortpixel-image-optimiser/trunk)
-
tags/6.4.4/class/Controller/Api/AiController.php (modified) (1 diff)
-
tags/6.4.4/class/Controller/Api/ApiController.php (modified) (1 diff)
-
tags/6.4.4/class/Controller/Api/RequestManager.php (modified) (2 diffs)
-
tags/6.4.4/class/Controller/BulkController.php (modified) (2 diffs)
-
tags/6.4.4/class/Controller/Front/CDNController.php (modified) (1 diff)
-
tags/6.4.4/class/Controller/Front/PageConverter.php (modified) (2 diffs)
-
tags/6.4.4/class/Controller/Front/PictureController.php (modified) (6 diffs)
-
tags/6.4.4/class/Controller/Optimizer/OptimizeAiController.php (modified) (3 diffs)
-
tags/6.4.4/class/Controller/QueueController.php (modified) (2 diffs)
-
tags/6.4.4/class/Controller/View/BulkViewController.php (modified) (1 diff)
-
tags/6.4.4/class/Controller/View/SettingsViewController.php (modified) (2 diffs)
-
tags/6.4.4/class/Model/EnvironmentModel.php (modified) (1 diff)
-
tags/6.4.4/class/Model/File/DirectoryModel.php (modified) (2 diffs)
-
tags/6.4.4/class/Model/File/FileModel.php (modified) (7 diffs)
-
tags/6.4.4/class/Model/Image/ImageModel.php (modified) (5 diffs)
-
tags/6.4.4/class/external/cache.php (modified) (2 diffs)
-
tags/6.4.4/class/view/bulk/part-finished.php (modified) (1 diff)
-
tags/6.4.4/class/view/settings/part-ai.php (modified) (1 diff)
-
tags/6.4.4/class/view/settings/part-exclusions.php (modified) (2 diffs)
-
tags/6.4.4/class/view/settings/part-tools.php (modified) (3 diffs)
-
tags/6.4.4/class/view/snippets/media-popup.php (modified) (6 diffs)
-
tags/6.4.4/class/view/snippets/part-aitext.php (modified) (1 diff)
-
tags/6.4.4/readme.txt (modified) (2 diffs)
-
tags/6.4.4/res/css/shortpixel-settings.css (modified) (9 diffs)
-
tags/6.4.4/res/css/shortpixel-settings.css.map (modified) (1 diff)
-
tags/6.4.4/res/js/screens/screen-media.js (modified) (5 diffs)
-
tags/6.4.4/res/js/shortpixel-settings.js (modified) (7 diffs)
-
tags/6.4.4/res/js/shortpixel-worker.js (modified) (1 diff)
-
tags/6.4.4/res/scss/view/_settings-exclusions.scss (modified) (1 diff)
-
tags/6.4.4/shortpixel-plugin.php (modified) (5 diffs)
-
tags/6.4.4/wp-shortpixel.php (modified) (2 diffs)
-
trunk/class/Controller/Api/AiController.php (modified) (1 diff)
-
trunk/class/Controller/Api/ApiController.php (modified) (1 diff)
-
trunk/class/Controller/Api/RequestManager.php (modified) (2 diffs)
-
trunk/class/Controller/BulkController.php (modified) (2 diffs)
-
trunk/class/Controller/Front/CDNController.php (modified) (1 diff)
-
trunk/class/Controller/Front/PageConverter.php (modified) (2 diffs)
-
trunk/class/Controller/Front/PictureController.php (modified) (6 diffs)
-
trunk/class/Controller/Optimizer/OptimizeAiController.php (modified) (3 diffs)
-
trunk/class/Controller/QueueController.php (modified) (2 diffs)
-
trunk/class/Controller/View/BulkViewController.php (modified) (1 diff)
-
trunk/class/Controller/View/SettingsViewController.php (modified) (2 diffs)
-
trunk/class/Model/EnvironmentModel.php (modified) (1 diff)
-
trunk/class/Model/File/DirectoryModel.php (modified) (2 diffs)
-
trunk/class/Model/File/FileModel.php (modified) (7 diffs)
-
trunk/class/Model/Image/ImageModel.php (modified) (5 diffs)
-
trunk/class/external/cache.php (modified) (2 diffs)
-
trunk/class/view/bulk/part-finished.php (modified) (1 diff)
-
trunk/class/view/settings/part-ai.php (modified) (1 diff)
-
trunk/class/view/settings/part-exclusions.php (modified) (2 diffs)
-
trunk/class/view/settings/part-tools.php (modified) (3 diffs)
-
trunk/class/view/snippets/media-popup.php (modified) (6 diffs)
-
trunk/class/view/snippets/part-aitext.php (modified) (1 diff)
-
trunk/readme.txt (modified) (2 diffs)
-
trunk/res/css/shortpixel-settings.css (modified) (9 diffs)
-
trunk/res/css/shortpixel-settings.css.map (modified) (1 diff)
-
trunk/res/js/screens/screen-media.js (modified) (5 diffs)
-
trunk/res/js/shortpixel-settings.js (modified) (7 diffs)
-
trunk/res/js/shortpixel-worker.js (modified) (1 diff)
-
trunk/res/scss/view/_settings-exclusions.scss (modified) (1 diff)
-
trunk/shortpixel-plugin.php (modified) (5 diffs)
-
trunk/wp-shortpixel.php (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
shortpixel-image-optimiser/tags/6.4.4/class/Controller/Api/AiController.php
r3400007 r3490270 240 240 } 241 241 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')); ; 243 243 } 244 244 -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/Api/ApiController.php
r3423259 r3490270 360 360 // Previous check here was for Item->files[$imageName] , not sure if currently needed. 361 361 // Check if image is not already in fileData. 362 363 if (is_array($fileData)) 364 { 365 $fileData = (object) $fileData; 366 } 367 362 368 if (is_null($fileData) || false === property_exists($fileData, $imageName)) { 363 369 $imageList[$imageName] = $this->handleNewSuccess($qItem, $imageObject, $data); -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/Api/RequestManager.php
r3400007 r3490270 106 106 107 107 //only if $Blocking is true analyze the response 108 if ( $requestParameters['blocking'] )108 if ( $requestParameters['blocking'] ) 109 109 { 110 110 if ( is_object($response) && get_class($response) == 'WP_Error' ) … … 143 143 elseif ( isset($response['response']['code']) && $response['response']['code'] <> 200 ) 144 144 { 145 $errorMessage = $response['response']['code'] . " - " . $response['response']['message'];146 145 $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 } 147 157 148 158 $qItem->addResult($this->returnFailure($errorCode, $errorMessage)); -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/BulkController.php
r3449706 r3490270 237 237 protected function addLog($q) 238 238 { 239 //$data = (array) $stats;240 239 $stats = $q->getStats(); // for the log 241 240 $type = $q->getType(); 242 // $customData = $q->getCustomDataItem('');243 241 244 242 if ($stats->done == 0 && $stats->fatal_errors == 0) … … 273 271 { 274 272 $log = array_shift($logs); 275 //$log_date = $log['date'];276 //$log_type = $log['type'];277 273 if (isset($data['logfile'])) 278 274 { -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/Front/CDNController.php
r3449706 r3490270 679 679 { 680 680 $replacer = new Replacer(); 681 $content = $replacer->replaceContent($content, $urls, $new_urls );681 $content = $replacer->replaceContent($content, $urls, $new_urls, false, true); 682 682 683 683 return $content; -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/Front/PageConverter.php
r3301690 r3490270 82 82 83 83 if (isset($_GET['PageSpeed']) && 'off' === $_GET['PageSpeed']) 84 { 85 return false; 86 } 87 88 if (isset($_GET['oxygen']) && 'builder' === $_GET['oxygen']) 84 89 { 85 90 return false; … … 304 309 private function getDomain($url) 305 310 { 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 307 317 return $_domain_tld[0]; 308 318 } -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/Front/PictureController.php
r3449706 r3490270 252 252 { 253 253 // FILTER: boolean, object, string, filedir 254 255 254 // Return fileObj if you want to live. 256 255 $thisfile = $fileWebp_exists = apply_filters('shortpixel/front/webp_notfound', false, $thisfile, $image_url, $imageBase); … … 300 299 } 301 300 302 $args = array();301 $args = []; 303 302 304 303 if ($webpCount > 0) … … 317 316 { 318 317 //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 { 323 325 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); 326 336 return $content; 327 337 } … … 331 341 * @param $match Regex match for inline style 332 342 * @return String Replaced (or not) content for webp. 333 * @author Bas Schuiling334 343 */ 335 344 protected function convertInlineStyle($matches, $content) 336 345 { 337 338 346 $fs = \wpSPIO()->filesystem(); 339 347 $allowed_exts = array('jpg', 'jpeg', 'gif', 'png'); 340 348 $converted = array(); 341 349 342 for ($i = 0; $i < count($matches[0]); $i++)350 foreach($matches as $match) 343 351 { 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])) 354 363 { 355 364 continue; 356 365 } 357 $url = $match[1]; 366 // Remove any removing " ' to get the pure URL. 367 $url = str_replace(['\'', '"'],'', $url_match[1]); 358 368 $filename = basename($url); 359 369 $ext = pathinfo($url, PATHINFO_EXTENSION); … … 401 411 { 402 412 // 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]; 404 414 405 415 // 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. … … 410 420 $converted[] = $target_urldef; 411 421 // 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 . "') "; 413 425 $content = str_replace($target_urldef, $new_urldef, $content); 414 426 } 415 427 } 416 428 417 } 418 429 } // FOREACH 430 419 431 return $content; 420 432 } -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/Optimizer/OptimizeAiController.php
r3449706 r3490270 569 569 { 570 570 Log::addInfo('Running Ai Replace : ', [$aiData, $sources, $replaces]); 571 $content = $replacer2->replaceContent($content, $sources, $replaces );571 $content = $replacer2->replaceContent($content, $sources, $replaces, false, true); 572 572 $replacer2->Updater()->updatePost($post_id, $content); 573 573 } … … 754 754 } 755 755 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 */ 756 765 public function formatGenerated($generated, $current, $original, $isPreview = false) 757 766 { … … 782 791 { 783 792 // 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; 799 796 } 800 797 } -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/QueueController.php
r3449706 r3490270 79 79 { 80 80 $qItem->data()->returndatalist = $args['returndatalist']; 81 } 82 83 if (true === $args['forceExclusion']) 84 { 85 $qItem->data()->forceExclusion = $args['forceExclusion']; 81 86 } 82 87 … … 667 672 } 668 673 } 674 else // If key does not exist, still add value from media to totals. 675 { 676 $object->stats->$key = $value; 677 } 669 678 } 670 679 -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/View/BulkViewController.php
r3449706 r3490270 269 269 $kbinfo = '<span class="kbinfo"><a href="' . $kblink . '" target="_blank" ><span class="dashicons dashicons-editor-help"> </span></a></span>'; 270 270 271 272 273 271 $output .= '<div class="fatal">'; 274 272 $output .= $date . ': '; -
shortpixel-image-optimiser/tags/6.4.4/class/Controller/View/SettingsViewController.php
r3400007 r3490270 566 566 567 567 568 // Basically this whole premise is impossible.569 568 public function loadDashBoardInfo() 570 569 { … … 918 917 'exclusion-width', 919 918 'exclusion-height', 919 'exclusion-filesize-value', 920 'exclusion-filesize-denom', 921 'exclusion-filesize-operator', 920 922 'apply-select', 921 923 'screen_action', -
shortpixel-image-optimiser/tags/6.4.4/class/Model/EnvironmentModel.php
r3400007 r3490270 98 98 public function checkPHPVersion($needed) 99 99 { 100 101 100 if (version_compare(PHP_VERSION, $needed) >= 0 ) 102 101 { -
shortpixel-image-optimiser/tags/6.4.4/class/Model/File/DirectoryModel.php
r3289850 r3490270 47 47 48 48 // Test if path actually has someting, otherwise just bail. 49 if (strlen(trim($path )) == 0)49 if (strlen(trim($path ?? '')) == 0) 50 50 { 51 $this->path = ''; // prevent various PHP string-function errors 51 52 return false; 52 53 } … … 129 130 public function getModified() 130 131 { 131 return filemtime($this->path );132 return filemtime($this->path ?? ''); 132 133 } 133 134 -
shortpixel-image-optimiser/tags/6.4.4/class/Model/File/FileModel.php
r3423259 r3490270 48 48 protected $backupDirectory; 49 49 50 private $basedirs; // cache basedirs50 private static $basedirs; // cache basedirs - static so for all objects during this run. 51 51 52 52 const FILE_OK = 1; … … 67 67 { 68 68 Log::addWarn('FileModel: Loading null path! '); 69 $this->fullpath = ''; 69 70 return false; 70 71 } … … 679 680 } 680 681 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 686 686 { 687 687 return false; … … 693 693 if (false === $basedir || strlen($basedir) == 0) 694 694 { 695 $this->basedirs = false;695 self::$basedirs = false; 696 696 return false; 697 697 } … … 700 700 $basedirs = preg_split('/:|;/i', $basedir); 701 701 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 702 711 foreach($basedirs as $basedir) 703 712 { 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)) 707 718 { 708 $basedirs[] = $realdir;719 $basedirs[] = trailingslashit($realdir); 709 720 } 710 721 } 711 722 712 $this->basedirs = $basedirs;723 self::$basedirs = $basedirs; 713 724 714 725 } … … 724 735 725 736 $restricted = apply_filters('shortpixel/file/basedir_check', $restricted, $path, $basedirs); 726 727 737 $this->is_restricted = $restricted; 728 738 … … 840 850 if (strpos($path, $uploadDir->getPath()) !== false) // If upload Dir is feature in path, consider it ok. 841 851 { 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 } 851 884 } 852 885 853 886 // this is probably a bit of a sharp corner to take. 854 887 // if path starts with / remove it due to trailingslashing ABSPATH 855 $path = ltrim($path, '/');856 $fullpath = $abspath->getPath() . $path;857 888 858 889 // We can't test for file_exists here, since file_model allows non-existing files. 859 890 // Test if directory exists, perhaps. Otherwise we are in for a failure anyhow. 860 891 //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; 862 896 //else 863 897 // return $originalPath; 864 898 } 899 900 865 901 866 902 public function getPermissions() -
shortpixel-image-optimiser/tags/6.4.4/class/Model/Image/ImageModel.php
r3449706 r3490270 293 293 self::P_EXCLUDE_PATH, 294 294 self::P_EXCLUDE_SIZE, 295 self::P_EXCLUDE_FILESIZE, 295 296 ); 296 297 … … 410 411 { 411 412 if (! $this->exists()) 413 { 412 414 return false; 415 } 413 416 if ($this->is_virtual()) // if virtual, don't filecheck on image. 414 417 { … … 419 422 } 420 423 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 427 426 { 428 427 $fileinfo = finfo_open(FILEINFO_MIME_TYPE); 429 428 $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 } 431 434 //FILEINFO_MIME_TYPE 432 435 } 433 elseif( \wpSPIO()->env()->is_function_usable('mime_content_type')) {436 elseif(is_null($this->mime) && \wpSPIO()->env()->is_function_usable('mime_content_type')) { 434 437 $this->mime = mime_content_type($this->getFullPath()); 435 438 } 436 else {439 elseif(is_null($this->mime)) { 437 440 return true; // assume without check, that extension says what it is. 438 441 // @todo This should probably trigger a notice in adminNoticesController. 439 442 } 440 443 441 if (strpos($this->mime, 'image') >= 0)444 if (strpos($this->mime, 'image') !== false) 442 445 return true; 443 446 else … … 1304 1307 $bool = false; 1305 1308 // Support for operators, more characters should be first in array 1306 $operators = ['<=', '>=', '<', '>' ];1309 // $operators = ['<=', '>=', '<', '>' ]; 1307 1310 1308 1311 foreach($excludePatterns as $item) … … 1319 1322 } 1320 1323 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 } 1323 1329 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) 1325 1335 { 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; 1333 1337 } 1334 1335 $compare_bytes = (int) UtilHelper::convertExclusionFileSizeToBytes($item_value); 1336 1338 else 1339 { 1340 $compare_bytes = (int) UtilHelper::convertExclusionFileSizeToBytes($value . $bytes); 1341 } 1337 1342 // 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 } 1340 1351 1341 1352 if (true === $bool) -
shortpixel-image-optimiser/tags/6.4.4/class/external/cache.php
r3335876 r3490270 84 84 // important - first check the available cache plugins 85 85 $this->checkCaches(); 86 86 87 87 $bool = apply_filters('shortpixel/external/flush_cache', true, $post_id, $imageItem); 88 88 if (false === $bool) … … 165 165 166 166 $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); 168 170 foreach($urls as $url) 169 171 { -
shortpixel-image-optimiser/tags/6.4.4/class/view/bulk/part-finished.php
r3449706 r3490270 51 51 <?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>', '🎉'); 52 52 ?> 53 <!-- <br>54 <?php55 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'), '💪');56 ?>57 <br>58 <?php59 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>', '🙌');60 ?> -->61 53 </p> 62 54 </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"> </span>'); 58 ?> 59 </p> 60 </div> 64 61 65 62 <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 392 392 <div class='icon'><i class='shortpixel-icon chevron rotate_right'></i> </div> 393 393 <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> 395 395 <ul> 396 396 <!-- <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 234 234 <option value='path' data-example="/path/"><?php _e('Image Path', 'shortpixel-image-optimiser'); ?></option> 235 235 <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> 237 237 <option value='date' data-example="YYYY-MM-DD"><?php _e('Date', 'shortpixel-image-optimiser') ?></option> 238 238 </select> … … 296 296 </select> 297 297 <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> 300 300 </select> 301 301 -
shortpixel-image-optimiser/tags/6.4.4/class/view/settings/part-tools.php
r3400007 r3490270 118 118 119 119 120 <h3><?php _e('Settings import / export', 'shortpixel-image-optimiser'); ?></h3>120 <h3><?php _e('Settings Import / Export', 'shortpixel-image-optimiser'); ?></h3> 121 121 <settinglist class='setting-importexport'> 122 122 <setting> … … 126 126 </content> 127 127 </setting> 128 129 <div id='settings-importexport-message' class='tools-message export-message'> </div> 130 128 131 <setting> 129 132 <name><?php _e('Import settings', 'shortpixel-image-optimiser'); ?></name> … … 137 140 138 141 </setting> 139 140 <div id='settings-importexport-message' class='tools-message export-message'> </div>141 142 142 </settinglist> 143 143 -
shortpixel-image-optimiser/tags/6.4.4/class/view/snippets/media-popup.php
r3400007 r3490270 22 22 case 'remove': 23 23 $modal_title = __('AI Background Removal', 'shortpixel-image-optimiser'); 24 $suggeste FileName = $originalImage->getFileBase() . '_nobg.' . $originalImage->getExtension();24 $suggestedFileName = $originalImage->getFileBase() . '_nobg.' . $originalImage->getExtension(); 25 25 26 26 break; … … 28 28 case 'scale': 29 29 $modal_title = __('AI Image Upscale', 'shortpixel-image-optimiser'); 30 $suggeste FileName = $originalImage->getFileBase() . '_upscale.' . $originalImage->getExtension();30 $suggestedFileName = $originalImage->getFileBase() . '_upscale.' . $originalImage->getExtension(); 31 31 32 32 break; … … 55 55 ?> 56 56 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) ?>" > 58 58 <div class="title"><h3><?php echo $modal_title ?> <span data-action='close'>X</span></h3> </div> 59 59 <div class='modal-content-wrapper'> … … 61 61 <div class="image-wrapper"> 62 62 <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> 64 64 <span><?php _e('Before', 'shortpixel-image-optimiser'); ?> 65 65 </div> … … 69 69 <div class="image-preview"> 70 70 <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> 72 72 <div class='error-message shortpixel-hide'> </div> 73 73 <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> … … 132 132 <span> 133 133 <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) ?>"> 135 135 </span> 136 136 137 137 <span> 138 138 <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) ?>"> 140 140 </span> 141 141 -
shortpixel-image-optimiser/tags/6.4.4/class/view/snippets/part-aitext.php
r3449706 r3490270 60 60 <a class='button button-secondary' title="Generate image SEO data with ShortPixel AI (Beta)" href="javascript:window.ShortPixelProcessor.screen.RequestAlt(<?php echo $item_id ?>)"> 61 61 <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> 63 63 <img class="shortpixel-ai-icon shortpixel" src="<?php echo $robo_icon ?>"> 64 64 </a> -
shortpixel-image-optimiser/tags/6.4.4/readme.txt
r3449706 r3490270 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.4 7 Stable tag: 6.4. 37 Stable tag: 6.4.4 8 8 License: GPLv2 or later 9 9 License URI: http://www.gnu.org/licenses/gpl-2.0.html … … 488 488 489 489 == Changelog == 490 491 = 6.4.4 = 492 493 🌿 The Spring Update 494 495 Release 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 526 Update now for stronger security, improved compatibility, and smarter control over your optimization workflows! 🚀 490 527 491 528 = 6.4.3 = -
shortpixel-image-optimiser/tags/6.4.4/res/css/shortpixel-settings.css
r3423259 r3490270 31 31 32 32 div.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 */ 35 37 left: 0; 36 38 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 */ 42 49 } 43 50 … … 50 57 padding: 20px 16px 6px 16px; 51 58 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 */ 53 61 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 */ 56 66 position: fixed; 57 67 top: 10%; … … 135 145 } 136 146 .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; 138 148 } 139 149 .wrap.is-shortpixel-settings-page .shortpixel-settings button i.switch, .wrap.is-shortpixel-settings-page .shortpixel-settings .button-setting i.switch { … … 241 251 } 242 252 .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; 244 254 } 245 255 .wrap.is-shortpixel-settings-page .shortpixel-settings section.wrapper .setting-tab .save-buttons.saving button.save i { … … 462 472 } 463 473 .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; 465 475 } 466 476 .wrap.is-shortpixel-settings-page header .top-buttons a i.switch, .wrap.is-shortpixel-settings-page header .top-buttons button i.switch { … … 1195 1205 } 1196 1206 .wrap.is-shortpixel-settings-page #tab-overview .wrapper .dashboard-button:hover { 1197 background: rgb(50.3421052632, 215.4868421053, 228.6578947368);1207 background: #32d7e5; 1198 1208 } 1199 1209 .wrap.is-shortpixel-settings-page #tab-overview .wrapper .dashboard-button i.switch { … … 1823 1833 height: 0; 1824 1834 transition: 500ms height; 1835 margin: 0; 1836 padding: 0; 1825 1837 } 1826 1838 .wrap.is-shortpixel-settings-page #tab-exclusions .exclude-patterns-setting .new-exclusion .size-option > div { … … 2146 2158 min-height: 44px; 2147 2159 color: #1ABDCA; 2148 background-color: rgb(232.25, 232.25, 232.25);2160 background-color: #e8e8e8; 2149 2161 border-radius: 6px; 2150 2162 font-weight: 700; … … 2154 2166 } 2155 2167 .wrap.is-shortpixel-settings-page #tab-tools .button:hover { 2156 background: rgb(50.3421052632, 215.4868421053, 228.6578947368);2168 background: #32d7e5; 2157 2169 color: #fff; 2158 2170 } -
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 119 119 button.style.textDecoration = 'none'; 120 120 121 122 121 scaleButton.classList.add('button-link'); 123 122 scaleButton.style.display = 'inline'; … … 132 131 133 132 parent.append(button); 134 135 136 } 137 } 138 133 } 134 } 139 135 } 140 136 … … 449 445 } 450 446 var attachmentAlt = this.GetPageAttachmentAlt(); 447 451 448 if (null === attachmentAlt) // No attach alt around 452 449 { … … 458 455 return; 459 456 } 457 458 var wp_screen_id = this.settings.wp_screen_id; 459 460 460 461 461 if (typeof aiData !== 'undefined') … … 497 497 let captionFields = ['attachment_caption', 'attachment-details-caption', 'attachment-details-two-column-caption']; 498 498 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 } 500 506 501 507 if (typeof newCaption !== 'undefined' || newCaption < 0) -
shortpixel-image-optimiser/tags/6.4.4/res/js/shortpixel-settings.js
r3440585 r3490270 1398 1398 } 1399 1399 else { 1400 var mode = 'edit'; 1401 1400 //var mode = 'edit'; 1402 1401 let mainEl = event.target.closest('li'); 1403 1402 var id = mainEl.id; 1404 1403 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'); 1409 1405 1410 1406 var title = this.root.querySelector('.new-exclusion h3.edit-title'); 1411 //var button = this.root.querySelector('.new-exclusion .button-actions button[name="removeExclusion"]');1412 1407 var input = this.root.querySelector('.new-exclusion input[name="edit-exclusion"]') 1413 1408 … … 1422 1417 1423 1418 title.classList.remove('not-visible', 'hidden'); 1424 //button.classList.remove('not-visible', 'hidden');1425 1426 1419 } 1427 1420 … … 1500 1493 example = ''; 1501 1494 } 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) 1525 1501 { 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++) 1532 1534 { 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 } 1538 1539 1539 1540 var valueInput = this.root.querySelector('input[name="exclusion-value"]'); … … 1541 1542 valueInput.placeholder = example; 1542 1543 } 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; 1543 1561 } 1544 1562 … … 1582 1600 var applyOption = this.root.querySelector('.new-exclusion select[name="apply-select"]'); 1583 1601 var regexOption = this.root.querySelector('.new-exclusion input[name="exclusion-regex"]'); 1584 1602 1585 1603 if ('read' === mode) { 1586 1604 setting.type = typeOption.value; … … 1683 1701 1684 1702 this.NewExclusionUpdateType(typeOption) 1685 // this.NewExclusionToggleSizeOption(exactOption);1686 1703 } 1687 1704 this.NewExclusionToggleSizeOption(exactOption); 1688 1705 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"]'); 1712 console.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 } 1689 1744 } 1690 1745 else { … … 1867 1922 var input = inputs[i]; 1868 1923 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 } 1870 1933 } 1871 1934 else if (input.type == 'checkbox') { -
shortpixel-image-optimiser/tags/6.4.4/res/js/shortpixel-worker.js
r3449706 r3490270 101 101 if (response.ok) 102 102 { 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 } 105 112 } 106 113 else if(this && ! this.stopped) -
shortpixel-image-optimiser/tags/6.4.4/res/scss/view/_settings-exclusions.scss
r3198739 r3490270 250 250 height: 0; 251 251 transition: 500ms height; 252 margin: 0; 253 padding: 0; 252 254 } 253 255 -
shortpixel-image-optimiser/tags/6.4.4/shortpixel-plugin.php
r3449706 r3490270 315 315 316 316 $settings = \wpSPIO()->settings(); 317 $env = \wpSPIO()->env(); 317 318 $ajaxController = AjaxController::getInstance(); 318 319 … … 328 329 329 330 $OptimizeAiController = OptimizeAiController::getInstance(); 331 332 $args_footer_async = ['strategy' => 'async', 'in_footer' => true]; 330 333 331 334 wp_register_script('shortpixel-folderbrowser', plugins_url('/res/js/shortpixel-folderbrowser.js', SHORTPIXEL_PLUGIN_FILE), array(), SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true ); … … 371 374 wp_register_script('shortpixel-inline-help', plugins_url('res/js/shortpixel-inline-help.js', SHORTPIXEL_PLUGIN_FILE), [], SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true); 372 375 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); 374 377 375 378 // This filter is from ListMediaViewController for the media library grid display, executive script in shortpixel-media.js. … … 400 403 'bulkSecret' => $secretKey, 401 404 'isBulkPage' => (bool) $is_bulk_page, 402 'screenURL' => false,403 405 'workerURL' => plugins_url( 'res/js/shortpixel-worker.js', SHORTPIXEL_PLUGIN_FILE ), 404 406 'nonce_process' => wp_create_nonce( 'processing' ), … … 454 456 'popup_load_preview' => true, // Upon opening, load Preview or not. 455 457 'too_big_for_scale_title' => __('Image too big for scaling', 'shortpixel-image-optimiser'), 458 'wp_screen_id' => $env->screen_id, 456 459 ]; 457 460 -
shortpixel-image-optimiser/tags/6.4.4/wp-shortpixel.php
r3449706 r3490270 4 4 * Plugin URI: https://shortpixel.com/ 5 5 * 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 > ShortPixel</a> page on how to start optimizing your image library and make your website load faster. 6 * Version: 6.4. 36 * Version: 6.4.4 7 7 * Author: ShortPixel - Convert WebP/AVIF & Optimize Images 8 8 * Author URI: https://shortpixel.com … … 37 37 define('SHORTPIXEL_PLUGIN_DIR', __DIR__); 38 38 39 define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "6.4. 3");39 define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "6.4.4"); 40 40 41 41 define('SHORTPIXEL_BACKUP', 'ShortpixelBackups'); -
shortpixel-image-optimiser/trunk/class/Controller/Api/AiController.php
r3400007 r3490270 240 240 } 241 241 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')); ; 243 243 } 244 244 -
shortpixel-image-optimiser/trunk/class/Controller/Api/ApiController.php
r3423259 r3490270 360 360 // Previous check here was for Item->files[$imageName] , not sure if currently needed. 361 361 // Check if image is not already in fileData. 362 363 if (is_array($fileData)) 364 { 365 $fileData = (object) $fileData; 366 } 367 362 368 if (is_null($fileData) || false === property_exists($fileData, $imageName)) { 363 369 $imageList[$imageName] = $this->handleNewSuccess($qItem, $imageObject, $data); -
shortpixel-image-optimiser/trunk/class/Controller/Api/RequestManager.php
r3400007 r3490270 106 106 107 107 //only if $Blocking is true analyze the response 108 if ( $requestParameters['blocking'] )108 if ( $requestParameters['blocking'] ) 109 109 { 110 110 if ( is_object($response) && get_class($response) == 'WP_Error' ) … … 143 143 elseif ( isset($response['response']['code']) && $response['response']['code'] <> 200 ) 144 144 { 145 $errorMessage = $response['response']['code'] . " - " . $response['response']['message'];146 145 $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 } 147 157 148 158 $qItem->addResult($this->returnFailure($errorCode, $errorMessage)); -
shortpixel-image-optimiser/trunk/class/Controller/BulkController.php
r3449706 r3490270 237 237 protected function addLog($q) 238 238 { 239 //$data = (array) $stats;240 239 $stats = $q->getStats(); // for the log 241 240 $type = $q->getType(); 242 // $customData = $q->getCustomDataItem('');243 241 244 242 if ($stats->done == 0 && $stats->fatal_errors == 0) … … 273 271 { 274 272 $log = array_shift($logs); 275 //$log_date = $log['date'];276 //$log_type = $log['type'];277 273 if (isset($data['logfile'])) 278 274 { -
shortpixel-image-optimiser/trunk/class/Controller/Front/CDNController.php
r3449706 r3490270 679 679 { 680 680 $replacer = new Replacer(); 681 $content = $replacer->replaceContent($content, $urls, $new_urls );681 $content = $replacer->replaceContent($content, $urls, $new_urls, false, true); 682 682 683 683 return $content; -
shortpixel-image-optimiser/trunk/class/Controller/Front/PageConverter.php
r3301690 r3490270 82 82 83 83 if (isset($_GET['PageSpeed']) && 'off' === $_GET['PageSpeed']) 84 { 85 return false; 86 } 87 88 if (isset($_GET['oxygen']) && 'builder' === $_GET['oxygen']) 84 89 { 85 90 return false; … … 304 309 private function getDomain($url) 305 310 { 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 307 317 return $_domain_tld[0]; 308 318 } -
shortpixel-image-optimiser/trunk/class/Controller/Front/PictureController.php
r3449706 r3490270 252 252 { 253 253 // FILTER: boolean, object, string, filedir 254 255 254 // Return fileObj if you want to live. 256 255 $thisfile = $fileWebp_exists = apply_filters('shortpixel/front/webp_notfound', false, $thisfile, $image_url, $imageBase); … … 300 299 } 301 300 302 $args = array();301 $args = []; 303 302 304 303 if ($webpCount > 0) … … 317 316 { 318 317 //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 { 323 325 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); 326 336 return $content; 327 337 } … … 331 341 * @param $match Regex match for inline style 332 342 * @return String Replaced (or not) content for webp. 333 * @author Bas Schuiling334 343 */ 335 344 protected function convertInlineStyle($matches, $content) 336 345 { 337 338 346 $fs = \wpSPIO()->filesystem(); 339 347 $allowed_exts = array('jpg', 'jpeg', 'gif', 'png'); 340 348 $converted = array(); 341 349 342 for ($i = 0; $i < count($matches[0]); $i++)350 foreach($matches as $match) 343 351 { 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])) 354 363 { 355 364 continue; 356 365 } 357 $url = $match[1]; 366 // Remove any removing " ' to get the pure URL. 367 $url = str_replace(['\'', '"'],'', $url_match[1]); 358 368 $filename = basename($url); 359 369 $ext = pathinfo($url, PATHINFO_EXTENSION); … … 401 411 { 402 412 // 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]; 404 414 405 415 // 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. … … 410 420 $converted[] = $target_urldef; 411 421 // 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 . "') "; 413 425 $content = str_replace($target_urldef, $new_urldef, $content); 414 426 } 415 427 } 416 428 417 } 418 429 } // FOREACH 430 419 431 return $content; 420 432 } -
shortpixel-image-optimiser/trunk/class/Controller/Optimizer/OptimizeAiController.php
r3449706 r3490270 569 569 { 570 570 Log::addInfo('Running Ai Replace : ', [$aiData, $sources, $replaces]); 571 $content = $replacer2->replaceContent($content, $sources, $replaces );571 $content = $replacer2->replaceContent($content, $sources, $replaces, false, true); 572 572 $replacer2->Updater()->updatePost($post_id, $content); 573 573 } … … 754 754 } 755 755 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 */ 756 765 public function formatGenerated($generated, $current, $original, $isPreview = false) 757 766 { … … 782 791 { 783 792 // 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; 799 796 } 800 797 } -
shortpixel-image-optimiser/trunk/class/Controller/QueueController.php
r3449706 r3490270 79 79 { 80 80 $qItem->data()->returndatalist = $args['returndatalist']; 81 } 82 83 if (true === $args['forceExclusion']) 84 { 85 $qItem->data()->forceExclusion = $args['forceExclusion']; 81 86 } 82 87 … … 667 672 } 668 673 } 674 else // If key does not exist, still add value from media to totals. 675 { 676 $object->stats->$key = $value; 677 } 669 678 } 670 679 -
shortpixel-image-optimiser/trunk/class/Controller/View/BulkViewController.php
r3449706 r3490270 269 269 $kbinfo = '<span class="kbinfo"><a href="' . $kblink . '" target="_blank" ><span class="dashicons dashicons-editor-help"> </span></a></span>'; 270 270 271 272 273 271 $output .= '<div class="fatal">'; 274 272 $output .= $date . ': '; -
shortpixel-image-optimiser/trunk/class/Controller/View/SettingsViewController.php
r3400007 r3490270 566 566 567 567 568 // Basically this whole premise is impossible.569 568 public function loadDashBoardInfo() 570 569 { … … 918 917 'exclusion-width', 919 918 'exclusion-height', 919 'exclusion-filesize-value', 920 'exclusion-filesize-denom', 921 'exclusion-filesize-operator', 920 922 'apply-select', 921 923 'screen_action', -
shortpixel-image-optimiser/trunk/class/Model/EnvironmentModel.php
r3400007 r3490270 98 98 public function checkPHPVersion($needed) 99 99 { 100 101 100 if (version_compare(PHP_VERSION, $needed) >= 0 ) 102 101 { -
shortpixel-image-optimiser/trunk/class/Model/File/DirectoryModel.php
r3289850 r3490270 47 47 48 48 // Test if path actually has someting, otherwise just bail. 49 if (strlen(trim($path )) == 0)49 if (strlen(trim($path ?? '')) == 0) 50 50 { 51 $this->path = ''; // prevent various PHP string-function errors 51 52 return false; 52 53 } … … 129 130 public function getModified() 130 131 { 131 return filemtime($this->path );132 return filemtime($this->path ?? ''); 132 133 } 133 134 -
shortpixel-image-optimiser/trunk/class/Model/File/FileModel.php
r3423259 r3490270 48 48 protected $backupDirectory; 49 49 50 private $basedirs; // cache basedirs50 private static $basedirs; // cache basedirs - static so for all objects during this run. 51 51 52 52 const FILE_OK = 1; … … 67 67 { 68 68 Log::addWarn('FileModel: Loading null path! '); 69 $this->fullpath = ''; 69 70 return false; 70 71 } … … 679 680 } 680 681 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 686 686 { 687 687 return false; … … 693 693 if (false === $basedir || strlen($basedir) == 0) 694 694 { 695 $this->basedirs = false;695 self::$basedirs = false; 696 696 return false; 697 697 } … … 700 700 $basedirs = preg_split('/:|;/i', $basedir); 701 701 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 702 711 foreach($basedirs as $basedir) 703 712 { 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)) 707 718 { 708 $basedirs[] = $realdir;719 $basedirs[] = trailingslashit($realdir); 709 720 } 710 721 } 711 722 712 $this->basedirs = $basedirs;723 self::$basedirs = $basedirs; 713 724 714 725 } … … 724 735 725 736 $restricted = apply_filters('shortpixel/file/basedir_check', $restricted, $path, $basedirs); 726 727 737 $this->is_restricted = $restricted; 728 738 … … 840 850 if (strpos($path, $uploadDir->getPath()) !== false) // If upload Dir is feature in path, consider it ok. 841 851 { 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 } 851 884 } 852 885 853 886 // this is probably a bit of a sharp corner to take. 854 887 // if path starts with / remove it due to trailingslashing ABSPATH 855 $path = ltrim($path, '/');856 $fullpath = $abspath->getPath() . $path;857 888 858 889 // We can't test for file_exists here, since file_model allows non-existing files. 859 890 // Test if directory exists, perhaps. Otherwise we are in for a failure anyhow. 860 891 //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; 862 896 //else 863 897 // return $originalPath; 864 898 } 899 900 865 901 866 902 public function getPermissions() -
shortpixel-image-optimiser/trunk/class/Model/Image/ImageModel.php
r3449706 r3490270 293 293 self::P_EXCLUDE_PATH, 294 294 self::P_EXCLUDE_SIZE, 295 self::P_EXCLUDE_FILESIZE, 295 296 ); 296 297 … … 410 411 { 411 412 if (! $this->exists()) 413 { 412 414 return false; 415 } 413 416 if ($this->is_virtual()) // if virtual, don't filecheck on image. 414 417 { … … 419 422 } 420 423 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 427 426 { 428 427 $fileinfo = finfo_open(FILEINFO_MIME_TYPE); 429 428 $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 } 431 434 //FILEINFO_MIME_TYPE 432 435 } 433 elseif( \wpSPIO()->env()->is_function_usable('mime_content_type')) {436 elseif(is_null($this->mime) && \wpSPIO()->env()->is_function_usable('mime_content_type')) { 434 437 $this->mime = mime_content_type($this->getFullPath()); 435 438 } 436 else {439 elseif(is_null($this->mime)) { 437 440 return true; // assume without check, that extension says what it is. 438 441 // @todo This should probably trigger a notice in adminNoticesController. 439 442 } 440 443 441 if (strpos($this->mime, 'image') >= 0)444 if (strpos($this->mime, 'image') !== false) 442 445 return true; 443 446 else … … 1304 1307 $bool = false; 1305 1308 // Support for operators, more characters should be first in array 1306 $operators = ['<=', '>=', '<', '>' ];1309 // $operators = ['<=', '>=', '<', '>' ]; 1307 1310 1308 1311 foreach($excludePatterns as $item) … … 1319 1322 } 1320 1323 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 } 1323 1329 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) 1325 1335 { 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; 1333 1337 } 1334 1335 $compare_bytes = (int) UtilHelper::convertExclusionFileSizeToBytes($item_value); 1336 1338 else 1339 { 1340 $compare_bytes = (int) UtilHelper::convertExclusionFileSizeToBytes($value . $bytes); 1341 } 1337 1342 // 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 } 1340 1351 1341 1352 if (true === $bool) -
shortpixel-image-optimiser/trunk/class/external/cache.php
r3335876 r3490270 84 84 // important - first check the available cache plugins 85 85 $this->checkCaches(); 86 86 87 87 $bool = apply_filters('shortpixel/external/flush_cache', true, $post_id, $imageItem); 88 88 if (false === $bool) … … 165 165 166 166 $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); 168 170 foreach($urls as $url) 169 171 { -
shortpixel-image-optimiser/trunk/class/view/bulk/part-finished.php
r3449706 r3490270 51 51 <?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>', '🎉'); 52 52 ?> 53 <!-- <br>54 <?php55 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'), '💪');56 ?>57 <br>58 <?php59 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>', '🙌');60 ?> -->61 53 </p> 62 54 </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"> </span>'); 58 ?> 59 </p> 60 </div> 64 61 65 62 <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 392 392 <div class='icon'><i class='shortpixel-icon chevron rotate_right'></i> </div> 393 393 <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> 395 395 <ul> 396 396 <!-- <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 234 234 <option value='path' data-example="/path/"><?php _e('Image Path', 'shortpixel-image-optimiser'); ?></option> 235 235 <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> 237 237 <option value='date' data-example="YYYY-MM-DD"><?php _e('Date', 'shortpixel-image-optimiser') ?></option> 238 238 </select> … … 296 296 </select> 297 297 <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> 300 300 </select> 301 301 -
shortpixel-image-optimiser/trunk/class/view/settings/part-tools.php
r3400007 r3490270 118 118 119 119 120 <h3><?php _e('Settings import / export', 'shortpixel-image-optimiser'); ?></h3>120 <h3><?php _e('Settings Import / Export', 'shortpixel-image-optimiser'); ?></h3> 121 121 <settinglist class='setting-importexport'> 122 122 <setting> … … 126 126 </content> 127 127 </setting> 128 129 <div id='settings-importexport-message' class='tools-message export-message'> </div> 130 128 131 <setting> 129 132 <name><?php _e('Import settings', 'shortpixel-image-optimiser'); ?></name> … … 137 140 138 141 </setting> 139 140 <div id='settings-importexport-message' class='tools-message export-message'> </div>141 142 142 </settinglist> 143 143 -
shortpixel-image-optimiser/trunk/class/view/snippets/media-popup.php
r3400007 r3490270 22 22 case 'remove': 23 23 $modal_title = __('AI Background Removal', 'shortpixel-image-optimiser'); 24 $suggeste FileName = $originalImage->getFileBase() . '_nobg.' . $originalImage->getExtension();24 $suggestedFileName = $originalImage->getFileBase() . '_nobg.' . $originalImage->getExtension(); 25 25 26 26 break; … … 28 28 case 'scale': 29 29 $modal_title = __('AI Image Upscale', 'shortpixel-image-optimiser'); 30 $suggeste FileName = $originalImage->getFileBase() . '_upscale.' . $originalImage->getExtension();30 $suggestedFileName = $originalImage->getFileBase() . '_upscale.' . $originalImage->getExtension(); 31 31 32 32 break; … … 55 55 ?> 56 56 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) ?>" > 58 58 <div class="title"><h3><?php echo $modal_title ?> <span data-action='close'>X</span></h3> </div> 59 59 <div class='modal-content-wrapper'> … … 61 61 <div class="image-wrapper"> 62 62 <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> 64 64 <span><?php _e('Before', 'shortpixel-image-optimiser'); ?> 65 65 </div> … … 69 69 <div class="image-preview"> 70 70 <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> 72 72 <div class='error-message shortpixel-hide'> </div> 73 73 <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> … … 132 132 <span> 133 133 <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) ?>"> 135 135 </span> 136 136 137 137 <span> 138 138 <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) ?>"> 140 140 </span> 141 141 -
shortpixel-image-optimiser/trunk/class/view/snippets/part-aitext.php
r3449706 r3490270 60 60 <a class='button button-secondary' title="Generate image SEO data with ShortPixel AI (Beta)" href="javascript:window.ShortPixelProcessor.screen.RequestAlt(<?php echo $item_id ?>)"> 61 61 <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> 63 63 <img class="shortpixel-ai-icon shortpixel" src="<?php echo $robo_icon ?>"> 64 64 </a> -
shortpixel-image-optimiser/trunk/readme.txt
r3449706 r3490270 5 5 Tested up to: 6.9 6 6 Requires PHP: 7.4 7 Stable tag: 6.4. 37 Stable tag: 6.4.4 8 8 License: GPLv2 or later 9 9 License URI: http://www.gnu.org/licenses/gpl-2.0.html … … 488 488 489 489 == Changelog == 490 491 = 6.4.4 = 492 493 🌿 The Spring Update 494 495 Release 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 526 Update now for stronger security, improved compatibility, and smarter control over your optimization workflows! 🚀 490 527 491 528 = 6.4.3 = -
shortpixel-image-optimiser/trunk/res/css/shortpixel-settings.css
r3423259 r3490270 31 31 32 32 div.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 */ 35 37 left: 0; 36 38 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 */ 42 49 } 43 50 … … 50 57 padding: 20px 16px 6px 16px; 51 58 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 */ 53 61 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 */ 56 66 position: fixed; 57 67 top: 10%; … … 135 145 } 136 146 .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; 138 148 } 139 149 .wrap.is-shortpixel-settings-page .shortpixel-settings button i.switch, .wrap.is-shortpixel-settings-page .shortpixel-settings .button-setting i.switch { … … 241 251 } 242 252 .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; 244 254 } 245 255 .wrap.is-shortpixel-settings-page .shortpixel-settings section.wrapper .setting-tab .save-buttons.saving button.save i { … … 462 472 } 463 473 .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; 465 475 } 466 476 .wrap.is-shortpixel-settings-page header .top-buttons a i.switch, .wrap.is-shortpixel-settings-page header .top-buttons button i.switch { … … 1195 1205 } 1196 1206 .wrap.is-shortpixel-settings-page #tab-overview .wrapper .dashboard-button:hover { 1197 background: rgb(50.3421052632, 215.4868421053, 228.6578947368);1207 background: #32d7e5; 1198 1208 } 1199 1209 .wrap.is-shortpixel-settings-page #tab-overview .wrapper .dashboard-button i.switch { … … 1823 1833 height: 0; 1824 1834 transition: 500ms height; 1835 margin: 0; 1836 padding: 0; 1825 1837 } 1826 1838 .wrap.is-shortpixel-settings-page #tab-exclusions .exclude-patterns-setting .new-exclusion .size-option > div { … … 2146 2158 min-height: 44px; 2147 2159 color: #1ABDCA; 2148 background-color: rgb(232.25, 232.25, 232.25);2160 background-color: #e8e8e8; 2149 2161 border-radius: 6px; 2150 2162 font-weight: 700; … … 2154 2166 } 2155 2167 .wrap.is-shortpixel-settings-page #tab-tools .button:hover { 2156 background: rgb(50.3421052632, 215.4868421053, 228.6578947368);2168 background: #32d7e5; 2157 2169 color: #fff; 2158 2170 } -
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 119 119 button.style.textDecoration = 'none'; 120 120 121 122 121 scaleButton.classList.add('button-link'); 123 122 scaleButton.style.display = 'inline'; … … 132 131 133 132 parent.append(button); 134 135 136 } 137 } 138 133 } 134 } 139 135 } 140 136 … … 449 445 } 450 446 var attachmentAlt = this.GetPageAttachmentAlt(); 447 451 448 if (null === attachmentAlt) // No attach alt around 452 449 { … … 458 455 return; 459 456 } 457 458 var wp_screen_id = this.settings.wp_screen_id; 459 460 460 461 461 if (typeof aiData !== 'undefined') … … 497 497 let captionFields = ['attachment_caption', 'attachment-details-caption', 'attachment-details-two-column-caption']; 498 498 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 } 500 506 501 507 if (typeof newCaption !== 'undefined' || newCaption < 0) -
shortpixel-image-optimiser/trunk/res/js/shortpixel-settings.js
r3440585 r3490270 1398 1398 } 1399 1399 else { 1400 var mode = 'edit'; 1401 1400 //var mode = 'edit'; 1402 1401 let mainEl = event.target.closest('li'); 1403 1402 var id = mainEl.id; 1404 1403 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'); 1409 1405 1410 1406 var title = this.root.querySelector('.new-exclusion h3.edit-title'); 1411 //var button = this.root.querySelector('.new-exclusion .button-actions button[name="removeExclusion"]');1412 1407 var input = this.root.querySelector('.new-exclusion input[name="edit-exclusion"]') 1413 1408 … … 1422 1417 1423 1418 title.classList.remove('not-visible', 'hidden'); 1424 //button.classList.remove('not-visible', 'hidden');1425 1426 1419 } 1427 1420 … … 1500 1493 example = ''; 1501 1494 } 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) 1525 1501 { 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++) 1532 1534 { 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 } 1538 1539 1539 1540 var valueInput = this.root.querySelector('input[name="exclusion-value"]'); … … 1541 1542 valueInput.placeholder = example; 1542 1543 } 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; 1543 1561 } 1544 1562 … … 1582 1600 var applyOption = this.root.querySelector('.new-exclusion select[name="apply-select"]'); 1583 1601 var regexOption = this.root.querySelector('.new-exclusion input[name="exclusion-regex"]'); 1584 1602 1585 1603 if ('read' === mode) { 1586 1604 setting.type = typeOption.value; … … 1683 1701 1684 1702 this.NewExclusionUpdateType(typeOption) 1685 // this.NewExclusionToggleSizeOption(exactOption);1686 1703 } 1687 1704 this.NewExclusionToggleSizeOption(exactOption); 1688 1705 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"]'); 1712 console.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 } 1689 1744 } 1690 1745 else { … … 1867 1922 var input = inputs[i]; 1868 1923 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 } 1870 1933 } 1871 1934 else if (input.type == 'checkbox') { -
shortpixel-image-optimiser/trunk/res/js/shortpixel-worker.js
r3449706 r3490270 101 101 if (response.ok) 102 102 { 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 } 105 112 } 106 113 else if(this && ! this.stopped) -
shortpixel-image-optimiser/trunk/res/scss/view/_settings-exclusions.scss
r3198739 r3490270 250 250 height: 0; 251 251 transition: 500ms height; 252 margin: 0; 253 padding: 0; 252 254 } 253 255 -
shortpixel-image-optimiser/trunk/shortpixel-plugin.php
r3449706 r3490270 315 315 316 316 $settings = \wpSPIO()->settings(); 317 $env = \wpSPIO()->env(); 317 318 $ajaxController = AjaxController::getInstance(); 318 319 … … 328 329 329 330 $OptimizeAiController = OptimizeAiController::getInstance(); 331 332 $args_footer_async = ['strategy' => 'async', 'in_footer' => true]; 330 333 331 334 wp_register_script('shortpixel-folderbrowser', plugins_url('/res/js/shortpixel-folderbrowser.js', SHORTPIXEL_PLUGIN_FILE), array(), SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true ); … … 371 374 wp_register_script('shortpixel-inline-help', plugins_url('res/js/shortpixel-inline-help.js', SHORTPIXEL_PLUGIN_FILE), [], SHORTPIXEL_IMAGE_OPTIMISER_VERSION, true); 372 375 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); 374 377 375 378 // This filter is from ListMediaViewController for the media library grid display, executive script in shortpixel-media.js. … … 400 403 'bulkSecret' => $secretKey, 401 404 'isBulkPage' => (bool) $is_bulk_page, 402 'screenURL' => false,403 405 'workerURL' => plugins_url( 'res/js/shortpixel-worker.js', SHORTPIXEL_PLUGIN_FILE ), 404 406 'nonce_process' => wp_create_nonce( 'processing' ), … … 454 456 'popup_load_preview' => true, // Upon opening, load Preview or not. 455 457 'too_big_for_scale_title' => __('Image too big for scaling', 'shortpixel-image-optimiser'), 458 'wp_screen_id' => $env->screen_id, 456 459 ]; 457 460 -
shortpixel-image-optimiser/trunk/wp-shortpixel.php
r3449706 r3490270 4 4 * Plugin URI: https://shortpixel.com/ 5 5 * 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 > ShortPixel</a> page on how to start optimizing your image library and make your website load faster. 6 * Version: 6.4. 36 * Version: 6.4.4 7 7 * Author: ShortPixel - Convert WebP/AVIF & Optimize Images 8 8 * Author URI: https://shortpixel.com … … 37 37 define('SHORTPIXEL_PLUGIN_DIR', __DIR__); 38 38 39 define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "6.4. 3");39 define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "6.4.4"); 40 40 41 41 define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
Note: See TracChangeset
for help on using the changeset viewer.