ShortPixel Image Optimizer - Version 5.1.2

Version Description

Release date November 7, 2022 * Fix: when converting PNG to JPG, the PNG path was saved in the post editor, which could result in broken images; * Fix: the bulk restore of Custom Media was performed without saving it to the previous bulks history; * Fix: various wording updates and fixes throughout the plugin code; * Fix: PNG to JPG conversion failed under certain Windows environments due to wrong path construction; * Fix: the plugin now works with thumbs that have a numeric name (e.g. 0); * Fix: on certain hosting restrictions, requesting a new API key caused a fatal error; * Fix: the original image was not processed when thumbnail processing was turned off; * Compat: added compatibility with the Uncode theme's adaptive images feature; * Tweak: minor updates to the settings and Media Library layout for new plans that will be introduced soon; * Tweak: added filter/constant that can be used by affiliates; * Tweak: reworked plugin notification system to make it more robust and reliable; * Language: 44 new strings added, 2 updated, 0 fuzzed, and 39 deprecated.

Download this release

Release Info

Developer petredobrescu
Plugin Icon 128x128 ShortPixel Image Optimizer
Version 5.1.2
Comparing to
See all releases

Code changes from version 5.1.1 to 5.1.2

Files changed (78) hide show
  1. build/shortpixel/notices/src/NoticeModel.php +57 -3
  2. class/BuildAutoLoader.php +2 -35
  3. class/Controller/AdminController.php +7 -0
  4. class/Controller/AdminNoticesController.php +312 -751
  5. class/Controller/FileSystemController.php +5 -1
  6. class/Controller/FrontController.php +4 -3
  7. class/Controller/QuotaController.php +5 -2
  8. class/Controller/SettingsController.php +58 -84
  9. class/Controller/View/BulkViewController.php +14 -1
  10. class/Controller/View/EditMediaViewController.php +4 -4
  11. class/Controller/View/OtherMediaViewController.php +1 -1
  12. class/Helper/InstallHelper.php +4 -3
  13. class/Helper/UiHelper.php +20 -0
  14. class/Helper/UtilHelper.php +124 -0
  15. class/Model/AccessModel.php +25 -0
  16. class/Model/AdminNoticeModel.php +141 -0
  17. class/Model/AdminNotices/ApiNotice.php +40 -0
  18. class/Model/AdminNotices/ApiNoticeRepeat.php +51 -0
  19. class/Model/AdminNotices/ApiNoticeRepeatLong.php +57 -0
  20. class/Model/AdminNotices/AvifNotice.php +97 -0
  21. class/Model/AdminNotices/CompatNotice.php +191 -0
  22. class/Model/AdminNotices/LegacyNotice.php +30 -0
  23. class/Model/AdminNotices/ListviewNotice.php +60 -0
  24. class/Model/AdminNotices/NextgenNotice.php +34 -0
  25. class/Model/AdminNotices/QuotaNoticeMonth.php +99 -0
  26. class/Model/AdminNotices/QuotaNoticeReached.php +106 -0
  27. class/Model/AdminNotices/SmartcropNotice.php +49 -0
  28. class/Model/AdminNotices/UnlistedNotice.php +39 -0
  29. class/Model/EnvironmentModel.php +0 -2
  30. class/Model/File/DirectoryModel.php +1 -1
  31. class/Model/File/FileModel.php +4 -2
  32. class/Model/Image/CustomImageModel.php +16 -6
  33. class/Model/Image/ImageModel.php +7 -7
  34. class/Model/Image/MediaLibraryModel.php +88 -67
  35. class/Model/Image/MediaLibraryThumbnailModel.php +2 -1
  36. class/Model/StatsModel.php +0 -5
  37. class/Tools.php +0 -376
  38. class/ViewController.php +8 -1
  39. class/external/uncode.php +44 -0
  40. class/plugin.json +1 -1
  41. class/view/bulk/part-dashboard.php +1 -1
  42. class/view/bulk/part-selection.php +16 -2
  43. class/view/bulk/part-summary.php +16 -14
  44. class/view/settings/part-advanced.php +32 -25
  45. class/view/settings/part-debug.php +37 -8
  46. class/view/settings/part-general.php +6 -10
  47. class/view/settings/part-optpie.php +22 -24
  48. class/view/view-settings.php +23 -15
  49. class/wp-shortpixel-settings.php +3 -70
  50. readme.txt +16 -1
  51. res/css/short-pixel-bar.min.css +1 -1
  52. res/css/short-pixel.css +3 -2
  53. res/css/shortpixel-admin.css +219 -320
  54. res/css/shortpixel-admin.css.map +1 -1
  55. res/css/shortpixel-bulk.css +787 -985
  56. res/css/shortpixel-bulk.css.map +7 -1
  57. res/css/shortpixel-nextgen.css +16 -21
  58. res/css/shortpixel-nextgen.css.map +7 -1
  59. res/css/shortpixel-notices.css +47 -70
  60. res/css/shortpixel-notices.css.map +7 -1
  61. res/css/shortpixel-othermedia.css +124 -171
  62. res/css/shortpixel-othermedia.css.map +7 -1
  63. res/css/shortpixel-settings.css +338 -431
  64. res/css/shortpixel-settings.css.map +7 -1
  65. res/css/shortpixel-toolbar.css +128 -160
  66. res/css/shortpixel-toolbar.css.map +7 -1
  67. res/css/sp-file-tree.min.css +1 -1
  68. res/img/bulk/dashboard-background.svg +1 -1
  69. res/js/jquery.knob.js +2 -2
  70. res/js/jquery.knob.min.js +1 -1
  71. res/js/screens/screen-bulk.js +5 -4
  72. res/scss/elements/_colors.scss +1 -1
  73. res/scss/shortpixel-admin.scss +2 -2
  74. res/scss/shortpixel-bulk.scss +8 -2
  75. res/scss/shortpixel-notices.scss +1 -4
  76. res/scss/view/_list-item.scss +11 -11
  77. res/scss/view/_settings.scss +49 -34
  78. wp-shortpixel.php +3 -2
build/shortpixel/notices/src/NoticeModel.php CHANGED
@@ -13,6 +13,8 @@ class NoticeModel //extends ShortPixelModel
13
  protected $is_dismissed = false; // for persistent notices,
14
  protected $suppress_until = null;
15
  protected $suppress_period = -1;
 
 
16
  public $is_removable = true; // if removable, display a notice dialog with red X or so.
17
  public $messageType = self::NOTICE_NORMAL;
18
 
@@ -33,7 +35,6 @@ class NoticeModel //extends ShortPixelModel
33
  {
34
  $this->message = $message;
35
  $this->messageType = $messageType;
36
-
37
  }
38
 
39
  public function isDone()
@@ -43,9 +44,7 @@ class NoticeModel //extends ShortPixelModel
43
  {
44
  if (time() >= $this->suppress_until)
45
  {
46
- //Log::addDebug('')
47
  $this->is_persistent = false; // unpersist, so it will be cleaned and dropped.
48
-
49
  }
50
  }
51
 
@@ -98,6 +97,53 @@ class NoticeModel //extends ShortPixelModel
98
  $this->details[] = $detail;
99
  }
100
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
 
102
 
103
  /** Set a notice persistent. Meaning it shows every page load until dismissed.
@@ -136,6 +182,14 @@ class NoticeModel //extends ShortPixelModel
136
  self::$icons[$type] = $icon;
137
  }
138
 
 
 
 
 
 
 
 
 
139
  private function checkIncomplete($var)
140
  {
141
  return ($var instanceof \__PHP_Incomplete_Class);
13
  protected $is_dismissed = false; // for persistent notices,
14
  protected $suppress_until = null;
15
  protected $suppress_period = -1;
16
+ protected $include_screens = array();
17
+ protected $exclude_screens = array();
18
  public $is_removable = true; // if removable, display a notice dialog with red X or so.
19
  public $messageType = self::NOTICE_NORMAL;
20
 
35
  {
36
  $this->message = $message;
37
  $this->messageType = $messageType;
 
38
  }
39
 
40
  public function isDone()
44
  {
45
  if (time() >= $this->suppress_until)
46
  {
 
47
  $this->is_persistent = false; // unpersist, so it will be cleaned and dropped.
 
48
  }
49
  }
50
 
97
  $this->details[] = $detail;
98
  }
99
 
100
+ /**
101
+ * @param $method String Include or Exclude
102
+ * @param $includes String|Array Screen Names to Include / Exclude either string, or array
103
+ */
104
+ public function limitScreens($method, $screens)
105
+ {
106
+ if ($method == 'exclude')
107
+ {
108
+ $var = 'exclude_screens';
109
+ }
110
+ else {
111
+ $var = 'include_screens';
112
+ }
113
+
114
+ if (is_array($screens))
115
+ {
116
+ $this->$var = array_merge($this->$var, $screens);
117
+ }
118
+ else {
119
+ $this->{$var}[] = $screens; // strange syntax is PHP 5.6 compat.
120
+ }
121
+ }
122
+
123
+ /* Checks if Notice is allowed on this screen
124
+ * @param @screen_id String The screen Id to check ( most likely current one, via EnvironmentModel)
125
+ */
126
+ public function checkScreen($screen_id)
127
+ {
128
+ if (in_array($screen_id, $this->exclude_screens))
129
+ {
130
+ return false;
131
+ }
132
+ if (in_array($screen_id, $this->include_screens))
133
+ {
134
+ return true;
135
+ }
136
+
137
+ // if include is set, don't show if not screen included.
138
+ if (count($this->include_screens) == 0)
139
+ {
140
+ return true;
141
+ }
142
+ else {
143
+ return false;
144
+ }
145
+ }
146
+
147
 
148
 
149
  /** Set a notice persistent. Meaning it shows every page load until dismissed.
182
  self::$icons[$type] = $icon;
183
  }
184
 
185
+ public function _debug_getvar($var)
186
+ {
187
+ if (property_exists($this, $var))
188
+ {
189
+ return $this->$var;
190
+ }
191
+ }
192
+
193
  private function checkIncomplete($var)
194
  {
195
  return ($var instanceof \__PHP_Incomplete_Class);
class/BuildAutoLoader.php CHANGED
@@ -37,20 +37,8 @@ class BuildAutoLoader
37
  );
38
 
39
  $models = array(
40
- // 'class/Model/shortpixel-entity.php',
41
- // 'class/Model/shortpixel-meta.php',
42
- // 'class/Model/shortpixel-folder.php',
43
  );
44
 
45
- /* $db = array(
46
- // 'class/db/shortpixel-db.php',
47
- // 'class/db/wp-shortpixel-db.php',
48
- 'class/db/shortpixel-custom-meta-dao.php',
49
- 'class/db/wp-shortpixel-media-library-adapter.php',
50
- 'class/db/shortpixel-meta-facade.php'
51
- ); */
52
-
53
-
54
  $externals = array(
55
  'class/external/cloudflare.php',
56
  'class/external/flywheel.php',
@@ -69,7 +57,8 @@ class BuildAutoLoader
69
  'class/external/custom-suffixes.php',
70
  'class/external/pantheon.php',
71
  'class/external/spai.php',
72
- 'class/external/cache.php',
 
73
  );
74
 
75
  echo "Build Plugin.JSON ";
@@ -77,25 +66,3 @@ class BuildAutoLoader
77
  }
78
 
79
  }
80
-
81
- /*require_once('shortpixel_api.php');
82
-
83
- //entities
84
- require_once('class/model/shortpixel-entity.php');
85
- require_once('class/model/shortpixel-meta.php');
86
- require_once('class/model/shortpixel-folder.php');
87
- //exceptions
88
- //database access
89
- require_once('class/db/shortpixel-db.php');
90
- require_once('class/db/wp-shortpixel-db.php');
91
- require_once('class/db/shortpixel-custom-meta-dao.php');
92
-
93
- require_once('class/db/wp-shortpixel-media-library-adapter.php');
94
- require_once('class/db/shortpixel-meta-facade.php');
95
- //view
96
- require_once('class/view/shortpixel_view.php');
97
- */
98
-
99
-
100
- //require_once( ABSPATH . 'wp-admin/includes/image.php' );
101
- //include_once( ABSPATH . 'wp-admin/includes/plugin.php' );
37
  );
38
 
39
  $models = array(
 
 
 
40
  );
41
 
 
 
 
 
 
 
 
 
 
42
  $externals = array(
43
  'class/external/cloudflare.php',
44
  'class/external/flywheel.php',
57
  'class/external/custom-suffixes.php',
58
  'class/external/pantheon.php',
59
  'class/external/spai.php',
60
+ 'class/external/cache.php',
61
+ 'class/external/uncode.php',
62
  );
63
 
64
  echo "Build Plugin.JSON ";
66
  }
67
 
68
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/Controller/AdminController.php CHANGED
@@ -67,6 +67,13 @@ class AdminController extends \ShortPixel\Controller
67
 
68
  if ($mediaItem->isProcessable())
69
  {
 
 
 
 
 
 
 
70
  $control = new OptimizeController();
71
  $control->addItemToQueue($mediaItem);
72
  }
67
 
68
  if ($mediaItem->isProcessable())
69
  {
70
+ if ($mediaItem->get('do_png2jpg') === true)
71
+ {
72
+ $mediaItem->convertPNG();
73
+ $fs->flushImageCache(); // Flush it to reflect new status.
74
+ $mediaItem = $fs->getImage($id, 'media');
75
+ $meta = wp_get_attachment_metadata($id); // reset the metadata because we are on the hook.
76
+ }
77
  $control = new OptimizeController();
78
  $control->addItemToQueue($mediaItem);
79
  }
class/Controller/AdminNoticesController.php CHANGED
@@ -20,646 +20,248 @@ class AdminNoticesController extends \ShortPixel\Controller
20
  {
21
  protected static $instance;
22
 
23
- const MSG_COMPAT = 'Error100'; // Plugin Compatility, warn for the ones that disturb functions.
24
- const MSG_FILEPERMS = 'Error101'; // File Permission check, if Queue is file-based.
25
- const MSG_UNLISTED_FOUND = 'Error102'; // SPIO found unlisted images, but this setting is not on
26
- const MSG_AVIF_ERROR = 'Error103'; // Detected unexpected or wrong AVIF headers when avif is on.
27
-
28
- //const MSG_NO_
29
- const MSG_QUOTA_REACHED = 'QuotaReached100';
30
- const MSG_UPGRADE_MONTH = 'UpgradeNotice200'; // When processing more than the subscription allows on average..
31
- // @todo This one has been removed for now. Cleanup later on the line
32
- const MSG_UPGRADE_BULK = 'UpgradeNotice201'; // when there is no enough for a bulk run.
33
-
34
- const MSG_NO_APIKEY = 'ApiNotice300'; // API Key not found
35
- const MSG_NO_APIKEY_REPEAT = 'ApiNotice301'; // First Repeat.
36
- const MSG_NO_APIKEY_REPEAT_LONG = 'ApiNotice302'; // Last Repeat.
37
-
38
- const MSG_INTEGRATION_NGGALLERY = 'IntNotice400';
39
- const MSG_FEATURE_SMARTCROP = 'FeaNotice100';
40
-
41
- const MSG_CONVERT_LEGACY = 'LegNotice100';
42
-
43
- const MSG_LISTVIEW_ACTIVE = 'UxNotice100';
44
 
45
  private $remote_message_endpoint = 'https://api.shortpixel.com/v2/notices.php';
46
  private $remote_readme_endpoint = 'https://plugins.svn.wordpress.org/shortpixel-image-optimiser/trunk/readme.txt';
47
 
48
-
49
  public function __construct()
50
  {
51
- add_action('admin_notices', array($this, 'displayNotices'), 50); // notices occured before page load
52
  add_action('admin_footer', array($this, 'displayNotices')); // called in views.
53
 
54
- add_action('in_plugin_update_message-' . plugin_basename(SHORTPIXEL_PLUGIN_FILE), array($this, 'pluginUpdateMessage') , 50, 2 );
55
 
56
- // no persistent notifications with this flag set.
57
- if (defined('SHORTPIXEL_SILENT_MODE') && SHORTPIXEL_SILENT_MODE === true)
58
- return;
59
 
60
- add_action('admin_notices', array($this, 'check_admin_notices'), 5); // run before the plugin admin notices
61
 
 
62
  }
63
 
64
  public static function getInstance()
65
  {
66
- if (is_null(self::$instance))
67
  self::$instance = new AdminNoticesController();
68
 
69
- return self::$instance;
70
  }
71
 
72
  public static function resetAllNotices()
73
  {
74
- Notices::resetNotices();
75
  }
76
 
77
  /** Triggered when plugin is activated */
78
  public static function resetCompatNotice()
79
  {
80
- Notices::removeNoticeByID(self::MSG_COMPAT);
81
  }
82
 
83
  public static function resetAPINotices()
84
  {
85
- Notices::removeNoticeByID(self::MSG_NO_APIKEY);
86
- Notices::removeNoticeByID(self::MSG_NO_APIKEY_REPEAT);
87
- Notices::removeNoticeByID(self::MSG_NO_APIKEY_REPEAT_LONG);
88
  }
89
 
90
  public static function resetQuotaNotices()
91
  {
92
- Notices::removeNoticeByID(self::MSG_UPGRADE_MONTH);
93
- Notices::removeNoticeByID(self::MSG_UPGRADE_BULK);
94
- Notices::removeNoticeBYID(self::MSG_QUOTA_REACHED);
95
  }
96
 
97
  public static function resetIntegrationNotices()
98
  {
99
- Notices::removeNoticeByID(self::MSG_INTEGRATION_NGGALLERY);
100
  }
101
 
102
- public static function resetLegacyNotice()
103
- {
104
- Notices::removeNoticeByID(self::MSG_CONVERT_LEGACY);
105
- }
106
-
107
- /** ReInstates A Persistent Notice manually */
108
- public static function reInstateQuotaExceeded()
109
  {
110
- //$noticeControl = Notices::getInstance();
111
- //$notice = $noticeControl->getNoticeByID(self::MSG_QUOTA_REACHED);
112
- Notices::removeNoticeByID(self::MSG_QUOTA_REACHED);
113
- //$notice->unDismiss();
114
- //$noticeControl->update();
115
  }
116
 
117
  public function displayNotices()
118
  {
119
- if (! \wpSPIO()->env()->is_screen_to_use)
120
- {
121
- if(get_current_screen()->base !== 'dashboard') // ugly exception for dashboard.
122
- return; // suppress all when not our screen.
123
- }
124
-
125
- $access = AccessModel::getInstance();
126
- $screen = get_current_screen();
127
-
128
- $noticeControl = Notices::getInstance();
129
- $noticeControl->loadIcons(array(
130
- 'normal' => '<img class="short-pixel-notice-icon" src="' . plugins_url('res/img/slider.png', SHORTPIXEL_PLUGIN_FILE) . '">',
131
- 'success' => '<img class="short-pixel-notice-icon" src="' . plugins_url('res/img/robo-cool.png', SHORTPIXEL_PLUGIN_FILE) . '">',
132
- 'warning' => '<img class="short-pixel-notice-icon" src="' . plugins_url('res/img/robo-scared.png', SHORTPIXEL_PLUGIN_FILE) . '">',
133
- 'error' => '<img class="short-pixel-notice-icon" src="' . plugins_url('res/img/robo-scared.png', SHORTPIXEL_PLUGIN_FILE) . '">',
134
- ));
135
-
136
- if ($noticeControl->countNotices() > 0)
137
- {
138
- $notices = $noticeControl->getNoticesForDisplay();
139
-
140
- if (count($notices) > 0)
141
  {
142
- \wpSPIO()->load_style('shortpixel-notices');
143
-
144
- foreach($notices as $notice)
145
- {
146
- // Ugly exception for listView Notice. If happens more, notices should extended to include screen check.
147
- if ($notice->getID() == AdminNoticesController::MSG_LISTVIEW_ACTIVE && \wpSPIO()->env()->screen_id !== 'upload' )
148
- {
149
- continue;
150
- }
151
- elseif ($access->noticeIsAllowed($notice))
152
- {
153
- echo $notice->getForDisplay();
154
- }
155
- else
156
- {
157
- continue;
158
- }
159
-
160
- if ($notice->getID() == AdminNoticesController::MSG_QUOTA_REACHED || $notice->getID() == AdminNoticesController::MSG_UPGRADE_MONTH
161
- || $notice->getID() == AdminNoticesController::MSG_UPGRADE_BULK)
162
- {
163
- wp_enqueue_script('jquery.knob.min.js');
164
- //wp_enqueue_script('jquery.tooltip.min.js');
165
- wp_enqueue_script('shortpixel');
166
- // \wpSPIO()->load_style('shortpixel-modal');
167
- }
168
- }
169
  }
170
- }
171
- $noticeControl->update(); // puts views, and updates
172
- }
173
-
174
- /* General function to check on Hook for admin notices if there is something to show globally */
175
- public function check_admin_notices()
176
- {
177
- if (! \wpSPIO()->env()->is_screen_to_use)
178
- {
179
- if(get_current_screen()->base !== 'dashboard') // ugly exception for dashboard.
180
- return; // suppress all when not our screen.
181
- }
182
-
183
- $this->doAPINotices();
184
- $this->doCompatNotices();
185
- $this->doUnlistedNotices();
186
- $this->doQuotaNotices();
187
- $this->doIntegrationNotices();
188
- $this->doRemoteNotices();
189
-
190
- $this->doListViewNotice();
191
- }
192
 
 
 
 
193
 
194
- protected function doIntegrationNotices()
195
- {
196
- $settings= \wpSPIO()->settings();
197
- $noticeController = Notices::getInstance();
 
 
 
198
 
199
- if (! \wpSPIO()->settings()->verifiedKey)
200
  {
201
- return; // no key, no integrations.
202
- }
203
 
204
- if (\wpSPIO()->env()->has_nextgen && ! $settings->includeNextGen)
205
- {
206
- $url = esc_url(admin_url('options-general.php?page=wp-shortpixel-settings&part=adv-settings'));
207
- $message = sprintf(__('It seems you are using NextGen Gallery. You can optimize your galleries with ShortPixel, but this is currently not enabled. To enable, %sgo to settings and enable%s it!', 'shortpixel_image_optimiser'), '<a href="' . $url . '">', '</a>');
208
- $notice = Notices::addNormal($message);
209
- Notices::makePersistent($notice, self::MSG_INTEGRATION_NGGALLERY, YEAR_IN_SECONDS);
210
- }
211
 
212
- $smartcropNotice = $noticeController->getNoticeByID(self::MSG_FEATURE_SMARTCROP);
213
- if ($smartcropNotice === false || $smartcropNotice->isDismissed() === false)
214
- {
215
- $link = 'https://shortpixel.com/knowledge-base/article/182-what-is-smart-cropping';
216
- $link2 = 'https://shortpixel.com/blog/how-to-smart-crop-wordpress-images/#how-to-crop-wordpress-images-automatically-smart-solution';
217
- $link3 = esc_url(admin_url('options-general.php?page=wp-shortpixel-settings'));
218
-
219
- $message = sprintf(__('%s With ShortPixel you can now %ssmartly crop%s the thumbnails on your website. This is especially useful for eCommerce websites %s(read more)%s. %s %s Activate the option in the %sShortPixel Settings%s page. %s', 'shortpixel-image-optimiser'),
220
- '<p>' ,
221
- '<a href="' . $link . '" target="_blank">', '</a>',
222
- '<a href="' . $link2 . '" target="_blank">', '</a>',
223
- '</p>', '<p>',
224
- '<a href="' . $link3 . '" >', '</a>',
225
- '</p>'
226
- );
227
- $notice = Notices::addNormal($message);
228
- Notices::makePersistent($notice, self::MSG_FEATURE_SMARTCROP, YEAR_IN_SECONDS);
229
- }
230
 
 
 
 
 
 
 
 
 
 
 
 
 
231
 
 
 
 
 
 
 
 
 
 
 
232
  }
233
 
234
- /** Load the various messages about the lack of API-keys in the plugin */
235
- protected function doAPINotices()
236
  {
237
- if (\wpSPIO()->settings()->verifiedKey)
238
  {
239
- return; // all fine.
 
240
  }
241
 
242
- $activationDate = \wpSPIO()->settings()->activationDate;
243
- $noticeController = Notices::getInstance();
244
- $now = time();
245
 
246
- if (! $activationDate)
 
 
247
  {
248
- $activationDate = $now;
249
- \wpSPIO()->settings()->activationDate = $activationDate;
 
250
  }
 
251
 
252
- $notice = $noticeController->getNoticeByID(self::MSG_NO_APIKEY);
253
- $notice_repeat = $noticeController->getNoticeByID(self::MSG_NO_APIKEY_REPEAT);
254
- $notice_long = $noticeController->getNoticeByID(self::MSG_NO_APIKEY_REPEAT_LONG);
255
-
256
- $notice_dismissed = ($notice && $notice->isDismissed()) ? true : false;
257
- $notice_dismissed_repeat = ($notice_repeat && $notice_repeat->isDismissed()) ? true : false;
258
- $notice_dismissed_long = ($notice_long && $notice_long->isDismissed()) ? true : false;
259
-
260
- if (! $notice)
261
- {
262
- // If no key is activated, load the general one.
263
- $message = $this->getActivationNotice();
264
- $notice = Notices::addNormal($message);
265
- Notices::makePersistent($notice, self::MSG_NO_APIKEY, YEAR_IN_SECONDS);
266
- }
267
 
268
- // The trick is that after X amount of time, the first message is replaced by one of those.
269
- if ($notice_dismissed && ! $notice_dismissed_repeat && $now > $activationDate + (6 * HOUR_IN_SECONDS)) // after 6 hours.
 
270
  {
271
- //$notice->messageType = Notices::NOTICE_WARNING;
272
- // $notice->
273
- //Notices::removeNoticeByID(self::MSG_NO_APIKEY); // remove the previous one.
274
- $message = __("Action needed. Please <a href='https://shortpixel.com/wp-apikey' target='_blank'>get your API key</a> to activate your ShortPixel plugin.",'shortpixel-image-optimiser');
275
-
276
- $notice = Notices::addWarning($message);
277
- Notices::makePersistent($notice, self::MSG_NO_APIKEY_REPEAT, YEAR_IN_SECONDS);
278
  }
279
- elseif ($notice_dismissed_repeat && $notice_dismissed && ! $notice_dismissed_long && $now > $activationDate + (3 * DAY_IN_SECONDS) ) // after 3 days
280
- {
281
- // Notices::removeNoticeByID(self::MSG_NO_APIKEY); // remove the previous one.
282
- $message = __("Your image gallery is not optimized. It takes 2 minutes to <a href='https://shortpixel.com/wp-apikey' target='_blank'>get your API key</a> and activate your ShortPixel plugin.",'shortpixel-image-optimiser') . "<BR><BR>";
283
-
284
- $notice = Notices::addWarning($message);
285
- Notices::makePersistent($notice, self::MSG_NO_APIKEY_REPEAT_LONG, YEAR_IN_SECONDS);
286
-
287
  }
288
-
289
  }
290
 
291
- protected function doCompatNotices()
292
  {
293
- $noticeController = Notices::getInstance();
294
-
295
- $notice = $noticeController->getNoticeByID(self::MSG_COMPAT);
296
- $conflictPlugins = \ShortPixelTools::getConflictingPlugins();
297
-
298
- if ($notice)
299
- {
300
- if (count($conflictPlugins) == 0)
301
- Notices::removeNoticeByID(self::MSG_COMPAT); // remove when not actual anymore.
302
- if ($notice->isDismissed() )
303
- return; // notice not wanted, don't bother.
304
- }
305
-
306
- // If this notice is not already out there, and there are conflicting plugins, go for display.
307
- if (count($conflictPlugins) > 0)
308
- {
309
- $notice = Notices::addWarning($this->getConflictMessage($conflictPlugins));
310
- Notices::makePersistent($notice, self::MSG_COMPAT, YEAR_IN_SECONDS);
311
- }
312
  }
313
 
314
- // Called by MediaLibraryModel
315
- public function invokeLegacyNotice()
316
- {
317
- $noticeController = Notices::getInstance();
318
-
319
- $notice = $noticeController->getNoticeByID(self::MSG_CONVERT_LEGACY);
320
- // If already in system, don't bother doing it again.
321
- if ($notice !== false)
322
- return;
323
-
324
- $message = '<p><strong>' . __('ShortPixel found items in media library with a legacy optimization format!', 'shortpixel-image-optimiser') . '</strong></p>';
325
-
326
- $message .= '<p>' . __('Prior to version 5.0, a different format was used to store ShortPixel optimization information. ShortPixel automatically migrates the media library items to the new format when they are opened. %s Please check if your images contain the optimization information after the migration. %s Read more %s', 'shortpixel-image-optimiser') . '</p>';
327
-
328
- $message .= '<p>' . __('It is recommended to migrate all items to the modern format by clicking on the button below.', 'shortpixel-image-optimser') . '</p>';
329
- $message .= '<p><a href="%s" class="button button-primary">%s</a></p>';
330
-
331
- $read_link = esc_url('https://shortpixel.com/knowledge-base/article/539-spio-5-tells-me-to-convert-legacy-data-what-is-this');
332
- $action_link = esc_url(admin_url('upload.php?page=wp-short-pixel-bulk&panel=bulk-migrate'));
333
- $action_name = __('Migrate legacy data', 'shortpixel-image-optimiser');
334
-
335
- $message = sprintf($message, '<br>', '<a href="' . $read_link . '" target="_blank">', '</a>', $action_link, $action_name);
336
-
337
- $notice = Notices::addNormal($message);
338
- Notices::makePersistent($notice, self::MSG_CONVERT_LEGACY, YEAR_IN_SECONDS);
339
 
340
- }
341
-
342
- protected function doUnlistedNotices()
343
- {
344
- $settings = \wpSPIO()->settings();
345
- if ($settings->optimizeUnlisted)
346
- return;
347
-
348
- if(isset($settings->currentStats['foundUnlistedThumbs']) && is_array($settings->currentStats['foundUnlistedThumbs'])) {
349
- $notice = Notices::addNormal($this->getUnlistedMessage($settings->currentStats['foundUnlistedThumbs']));
350
- Notices::makePersistent($notice, self::MSG_UNLISTED_FOUND, YEAR_IN_SECONDS);
351
- }
352
- }
353
-
354
- protected function doQuotaNotices()
355
  {
356
- $settings = \wpSPIO()->settings();
357
-
358
- $quotaController = QuotaController::getInstance();
359
- $noticeController = Notices::getInstance();
360
- $statsControl = StatsController::getInstance(); // @todo Implement this. (Figure out what this was )
361
-
362
- $callback = array(AdminNoticesController::getInstance(), 'proposeUpgradePopup');
363
-
364
- if (! \wpSPIO()->settings()->verifiedKey)
365
- {
366
- return; // no key, no quota.
367
- }
368
-
369
- // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form
370
- if(isset($_GET['checkquota'])) {
371
- //$shortpixel->getQuotaInformation();
372
- $quota = $quotaController->getQuota();
373
- }
374
-
375
-
376
- /** Comment for historical reasons, this seems strange in the original, excluding.
377
- * isset($this->_settings->currentStats['optimizePdfs'])
378
- * && $this->_settings->currentStats['optimizePdfs'] == $this->_settings->optimizePdfs )
379
- */
380
- if($quotaController->hasQuota() === true)
381
- {
382
- $env = \wpSPIO()->env();
383
-
384
- $quotaController = QuotaController::getInstance();
385
- $quotaData = $quotaController->getQuota();
386
-
387
- $month_notice = $noticeController->getNoticeByID(self::MSG_UPGRADE_MONTH);
388
-
389
- //consider the monthly plus 1/6 of the available one-time credits.
390
- if( $this->monthlyUpgradeNeeded($quotaData)) {
391
-
392
- if ($month_notice === false)
393
- {
394
- //looks like the user hasn't got enough credits to process the monthly images, display a notice telling this
395
- $message = $this->getMonthlyUpgradeMessage(array('monthAvg' => $this->getMonthAvg(), 'monthlyQuota' => $quotaData->monthly->total, 'onetimeTotal' => $quotaData->onetime->remaining ));
396
- $notice = Notices::addNormal($message);
397
- Notices::makePersistent($notice, self::MSG_UPGRADE_MONTH, YEAR_IN_SECONDS, $callback);
398
- }
399
- }
400
- }
401
- elseif ($quotaController->hasQuota() === false)
402
- {
403
-
404
- $notice = $noticeController->getNoticeByID(self::MSG_QUOTA_REACHED);
405
- if ($notice === false)
406
- {
407
- $message = $this->getQuotaExceededMessage();
408
- $notice = Notices::addError($message);
409
- Notices::makePersistent($notice, self::MSG_QUOTA_REACHED, WEEK_IN_SECONDS, $callback);
410
- }
411
-
412
- Notices::removeNoticeByID(self::MSG_UPGRADE_MONTH); // get rid of doubles. reset
413
- Notices::removeNoticeByID(self::MSG_UPGRADE_BULK);
414
- }
415
 
416
  }
417
 
418
 
419
  protected function doRemoteNotices()
420
  {
421
- $notices = $this->get_remote_notices();
422
 
423
- if ($notices == false)
424
- return;
425
 
426
- foreach($notices as $remoteNotice)
427
- {
428
- if (! isset($remoteNotice->id) && ! isset($remoteNotice->message))
429
- return;
430
 
431
- if (! isset($remoteNotice->type))
432
- $remoteNotice->type = 'notice';
433
 
434
- $message = esc_html($remoteNotice->message);
435
- $id = sanitize_text_field($remoteNotice->id);
436
 
437
- $noticeController = Notices::getInstance();
438
- $noticeObj = $noticeController->getNoticeByID($id);
439
 
440
- // not added to system yet
441
  if ($noticeObj === false)
442
  {
443
- switch ($remoteNotice->type)
444
- {
445
- case 'warning':
446
- $new_notice = Notices::addWarning($message);
447
- break;
448
- case 'error':
449
- $new_notice = Notices::addError($message);
450
- break;
451
- case 'notice':
452
- default:
453
- $new_notice = Notices::addNormal($message);
454
- break;
455
- }
456
-
457
- Notices::makePersistent($new_notice, $id, MONTH_IN_SECONDS);
458
- }
459
-
460
-
461
- }
462
-
463
- }
464
-
465
- protected function doListViewNotice()
466
- {
467
- $screen_id = \wpSPIO()->env()->screen_id;
468
- if ($screen_id !== 'upload')
469
- {
470
- return;
471
- }
472
-
473
- $noticeController = Notices::getInstance();
474
-
475
- if ( function_exists('wp_get_current_user') ) {
476
- $current_user = wp_get_current_user();
477
- $currentUserID = $current_user->ID;
478
- $viewMode = get_user_meta($currentUserID, "wp_media_library_mode", true);
479
-
480
- if ($viewMode === "" || strlen($viewMode) == 0)
481
- {
482
- // If nothing is set, set it for them.
483
- update_user_meta($currentUserID, 'wp_media_library_mode', 'list');
484
- }
485
- elseif ($viewMode !== "list")
486
- {
487
- // @todo The notice is user-dependent but the notice is dismissed installation-wide.
488
-
489
- $message = sprintf(__('You can see ShortPixel Image Optimiser actions and data only via the list view. Switch to the list view to use the plugin via the media library. Click to %s switch to the list view %s now. ', 'shortpixel-image-optimiser'), '<a href="' . admin_url('upload.php?mode=list') . '">','</a>');
490
- $new_notice = Notices::addNormal($message);
491
- Notices::makePersistent($new_notice, self::MSG_LISTVIEW_ACTIVE, YEAR_IN_SECONDS);
492
- }
493
- else
494
- {
495
- $noticeObj = $noticeController->getNoticeByID(self::MSG_LISTVIEW_ACTIVE);
496
- if ($noticeObj !== false)
497
- {
498
- Notices::removeNoticeByID(self::MSG_LISTVIEW_ACTIVE);
499
- }
500
- }
501
 
502
- }
503
- }
504
 
505
- // Callback to check if we are on the correct page.
506
- public function upgradeBulkCallback($notice)
507
- {
508
- if (! \wpSPIO()->env()->is_bulk_page)
509
- {
510
- return false;
511
- }
512
- }
513
 
514
- /* protected function getPluginUpdateMessage($new_version)
515
- {
516
- $message = false;
517
- if (version_compare(SHORTPIXEL_IMAGE_OPTIMISER_VERSION, $new_version, '>=') ) // already installed 'new version'
518
- {
519
- return false;
520
- }
521
- elseif (version_compare($new_version, '5.0', '>=') && version_compare(SHORTPIXEL_IMAGE_OPTIMISER_VERSION, '5.0','<'))
522
- {
523
- $message = __('<h4>Version 5.0</h4> Warning, Version 5 is a major update. It\'s strongly recommend to backup your site and proceed with caution. Please report issues via our support channels', 'shortpixel-image-optimiser');
524
  }
525
 
526
- return $message;
527
- } */
528
-
529
- public function getActivationNotice()
530
- {
531
- $message = "<p>" . __('In order to start the optimization process, you need to validate your API Key in the '
532
- . '<a href="options-general.php?page=wp-shortpixel-settings">ShortPixel Settings</a> page in your WordPress Admin.','shortpixel-image-optimiser') . "
533
- </p>
534
- <p>" . __('If you don’t have an API Key, just fill out the form and a key will be created.','shortpixel-image-optimiser') . "</p>";
535
-
536
- return $message;
537
- }
538
-
539
- protected function getConflictMessage($conflicts)
540
- {
541
- $message = __("The following plugins are not compatible with ShortPixel and may lead to unexpected results: ",'shortpixel-image-optimiser');
542
- $message .= '<ul class="sp-conflict-plugins">';
543
- foreach($conflicts as $plugin) {
544
- //ShortPixelVDD($plugin);
545
- $action = $plugin['action'];
546
- $link = ( $action == 'Deactivate' )
547
- ? wp_nonce_url( admin_url( 'admin-post.php?action=shortpixel_deactivate_conflict_plugin&plugin=' . urlencode( $plugin['path'] ) ), 'sp_deactivate_plugin_nonce' )
548
- : $plugin['href'];
549
- $message .= '<li class="sp-conflict-plugins-list"><strong>' . $plugin['name'] . '</strong>';
550
- $message .= '<a href="' . $link . '" class="button button-primary">' . $action . '</a>';
551
-
552
- if($plugin['details']) $message .= '<br>';
553
- if($plugin['details']) $message .= '<span>' . $plugin['details'] . '</span>';
554
- }
555
- $message .= "</ul>";
556
-
557
- return $message;
558
- }
559
-
560
- protected function getUnlistedMessage($unlisted)
561
- {
562
- $message = __("<p>ShortPixel found thumbnails which are not registered in the metadata but present alongside the other thumbnails. These thumbnails could be created and needed by some plugin or by the theme. Let ShortPixel optimize them as well?</p>", 'shortpixel-image-optimiser');
563
- $message .= '<p>' . __("For example, the image", 'shortpixel-image-optimiser') . '
564
- <a href="post.php?post=' . $unlisted->id . '&action=edit" target="_blank">
565
- ' . $unlisted->name . '
566
- </a> has also these thumbs not listed in metadata: ' . (implode(', ', $unlisted->unlisted)) . '
567
- </p>';
568
-
569
- return $message;
570
- }
571
-
572
- /* Seems unused @todo Remove in a few versions
573
- protected function getBulkUpgradeMessage($extra)
574
- {
575
- $message = '<p>' . sprintf(__("You currently have <strong>%d images and thumbnails to optimize</strong> but you only have <strong>%d images</strong> available in your current plan."
576
- . " You might need to upgrade your plan in order to have all your images optimized.", 'shortpixel-image-optimiser'), $extra['filesTodo'], $extra['quotaAvailable']) . '</p>';
577
- $message .= '<p><button class="button button-primary" id="shortpixel-upgrade-advice" onclick="ShortPixel.proposeUpgrade()" style="margin-right:10px;"><strong>' . __('Show me the best available options', 'shortpixel-image-optimiser') . '</strong></button></p>';
578
- $this->proposeUpgradePopup();
579
- return $message;
580
- }
581
- */
582
- protected function getMonthlyUpgradeMessage($extra)
583
- {
584
- $message = '<p>' . sprintf(__("You are adding an average of <strong>%d images and thumbnails every month</strong> to your Media Library and you have <strong>a plan of %d images/month (and %d one-time images)</strong>.%s"
585
- . " You might need to upgrade your plan in order to have all your images optimized.", 'shortpixel-image-optimiser'), $extra['monthAvg'], $extra['monthlyQuota'], $extra['onetimeTotal'], '<br>') . '</p>';
586
- $message .= ' <button class="button button-primary" id="shortpixel-upgrade-advice" onclick="ShortPixel.proposeUpgrade()" style="margin-right:10px;"><strong>' . __('Show me the best available options', 'shortpixel-image-optimiser') . '</strong></button>';
587
- return $message;
588
- }
589
-
590
- protected function getQuotaExceededMessage()
591
- {
592
- $statsControl = StatsController::getInstance();
593
- $averageCompression = $statsControl->getAverageCompression();
594
- $quotaController = QuotaController::getInstance();
595
-
596
- $keyControl = ApiKeyController::getInstance();
597
-
598
- //$keyModel->loadKey();
599
-
600
- $login_url = 'https://shortpixel.com/login/';
601
- $friend_url = $login_url;
602
-
603
- if ($keyControl->getKeyForDisplay())
604
- {
605
- $login_url .= $keyControl->getKeyForDisplay() . '/';
606
- $friend_url = $login_url . 'tell-a-friend';
607
- }
608
-
609
- $message = '<div class="sp-quota-exceeded-alert" id="short-pixel-notice-exceed">';
610
-
611
- if($averageCompression) {
612
-
613
- $message .= '<div style="float:right;">
614
- <div class="bulk-progress-indicator" style="height: 110px">
615
- <div style="margin-bottom:5px">' . __('Average image<br>reduction so far:','shortpixel-image-optimiser') . '</div>
616
- <div id="sp-avg-optimization"><input type="text" id="sp-avg-optimization-dial" value="' . round($averageCompression) . '" class="dial percentDial" data-dialsize="60"></div>
617
- <script>
618
- jQuery(function() {
619
- if (ShortPixel)
620
- {
621
- ShortPixel.percentDial("#sp-avg-optimization-dial", 60);
622
- }
623
- });
624
- </script>
625
- </div>
626
- </div>';
627
-
628
- }
629
-
630
- $message .= '<h3>' . __('Quota Exceeded','shortpixel-image-optimiser') . '</h3>';
631
-
632
- $quota = $quotaController->getQuota();
633
-
634
- $creditsUsed = number_format($quota->monthly->consumed + $quota->onetime->consumed);
635
- $totalOptimized = $statsControl->find('total', 'images');
636
- $totalImagesToOptimize = number_format($statsControl->totalImagesToOptimize());
637
-
638
- $message .= '<p>' . sprintf(__('The plugin has optimized <strong>%s images</strong> and stopped because it reached the available quota limit.','shortpixel-image-optimiser'),
639
- $creditsUsed);
640
-
641
- if($totalImagesToOptimize > 0) {
642
-
643
- $message .= sprintf(__('<strong> %s images and thumbnails</strong> are not yet optimized by ShortPixel.','shortpixel-image-optimiser'), $totalImagesToOptimize );
644
- }
645
-
646
- $message .= '</p>
647
- <div>
648
- <button class="button button-primary" type="button" id="shortpixel-upgrade-advice" onclick="ShortPixel.proposeUpgrade()" style="margin-right:10px;"><strong>' . __('Show me the best available options', 'shortpixel-image-optimiser') . '</strong></button>
649
- <a class="button button-primary" href="' . $login_url . '"
650
- title="' . __('Go to my account and select a plan','shortpixel-image-optimiser') . '" target="_blank" style="margin-right:10px;">
651
- <strong>' . __('Upgrade','shortpixel-image-optimiser') . '</strong>
652
- </a>
653
- <button type="button" name="checkQuota" class="button" onclick="ShortPixel.checkQuota()">'. __('Confirm New Credits','shortpixel-image-optimiser') . '</button>
654
- </div>';
655
-
656
- $message .= '</div>'; /// closing div
657
- return $message;
658
  }
659
 
660
  public function proposeUpgradePopup() {
661
- $view = new ViewController();
662
- $view->loadView('snippets/part-upgrade-options');
663
  }
664
 
665
  public function proposeUpgradeRemote()
@@ -669,8 +271,8 @@ class AdminNoticesController extends \ShortPixel\Controller
669
  $apiKeyController = ApiKeyController::getInstance();
670
  $settings = \wpSPIO()->settings();
671
 
672
- $webpActive = ($settings->createWebp) ? true : false;
673
- $avifActive = ($settings->createAvif) ? true : false;
674
 
675
  $args = array(
676
  'method' => 'POST',
@@ -688,12 +290,12 @@ class AdminNoticesController extends \ShortPixel\Controller
688
  'm4' => $statsController->find('period', 'months', '4'),
689
  'filesTodo' => $statsController->totalImagesToOptimize(),
690
  'estimated' => $settings->optimizeUnlisted || $settings->optimizeRetina ? 'true' : 'false',
691
- 'webp' => $webpActive,
692
- 'avif' => $avifActive,
693
  /* */
694
  'iconsUrl' => base64_encode(wpSPIO()->plugin_url('res/img'))
695
- ))),
696
- 'cookies' => array()
697
 
698
  );
699
 
@@ -707,13 +309,13 @@ class AdminNoticesController extends \ShortPixel\Controller
707
 
708
  }
709
 
710
- private function get_remote_notices()
711
- {
712
  $transient_name = 'shortpixel_remote_notice';
713
  $transient_duration = DAY_IN_SECONDS;
714
 
715
  if (\wpSPIO()->env()->is_debug)
716
- $transient_duration = 30;
717
 
718
  $keyControl = new apiKeyController();
719
  //$keyControl->loadKey();
@@ -721,255 +323,214 @@ class AdminNoticesController extends \ShortPixel\Controller
721
  $notices = get_transient($transient_name);
722
  $url = $this->remote_message_endpoint;
723
  $url = add_query_arg(array( // has url
724
- 'key' => $keyControl->forceGetApiKey(),
725
- 'version' => SHORTPIXEL_IMAGE_OPTIMISER_VERSION,
726
- 'target' => 3,
727
  ), $url);
728
 
729
 
730
  if ( $notices === false ) {
731
- $notices_response = wp_safe_remote_request( $url );
732
- $content = false;
733
- if (! is_wp_error( $notices_response ) )
734
- {
735
- $notices = json_decode($notices_response['body']);
736
 
737
- if (! is_array($notices))
738
- $notices = false;
739
 
740
- // Save transient anywhere to prevent over-asking when nothing good is there.
741
- set_transient( $transient_name, $notices, $transient_duration );
742
- }
743
- else
744
- {
745
- set_transient( $transient_name, false, $transient_duration );
746
- }
747
  }
748
 
749
  return $notices;
750
- }
751
-
752
- protected function monthlyUpgradeNeeded($quotaData)
753
- {
754
- if (isset($quotaData->monthly->total))
755
- {
756
- $monthAvg = $this->getMonthAvg($quotaData);
757
- // +20 I suspect to not trigger on very low values of monthly use(?)
758
- $threshold = $quotaData->monthly->total + ($quotaData->onetime->remaining / 6 ) +20;
759
-
760
- if ($monthAvg > $threshold)
761
- {
762
- return true;
763
- }
764
- }
765
- return false;
766
- }
767
-
768
- protected function bulkUpgradeNeeded() {
769
-
770
- $quotaController = QuotaController::getInstance(); //$stats;
771
- $stats = StatsController::getInstance();
772
-
773
- $to_process = $stats->totalImagesToOptimize(); // $stats->find('total', 'imagesTotal') - $stats->find('total', 'images');
774
-
775
- return $to_process > $quotaController->getAvailableQuota();
776
-
777
- //return $to_process > $quotaData->monthly->total + + $quotaData['APICallsQuotaOneTimeNumeric'] - $quotaData['APICallsMadeNumeric'] - $quotaData['APICallsMadeOneTimeNumeric'];
778
  }
779
 
780
- protected function getMonthAvg() {
781
- $stats = StatsController::getInstance();
782
 
783
- // Count how many months have some optimized images.
784
- for($i = 4, $count = 0; $i>=1; $i--) {
785
- if($count == 0 && $stats->find('period', 'months', $i) == 0)
786
- {
787
- continue;
788
- }
789
- $count++;
790
 
791
- }
792
- // Sum last 4 months, and divide by number of active months to get number of avg per active month.
793
- return ($stats->find('period', 'months', 1) + $stats->find('period', 'months', 2) + $stats->find('period', 'months', 3) + $stats->find('period', 'months', 4) / max(1,$count));
794
- }
795
 
796
 
797
  public function pluginUpdateMessage($data, $response)
798
  {
799
- // $message = $this->getPluginUpdateMessage($plugin['new_version']);
800
 
801
- $message = $this->get_update_notice($data, $response);
802
 
803
- if( $message !== false && strlen(trim($message)) > 0) {
804
- $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
805
- printf(
806
- '<tr class="plugin-update-tr active"><td colspan="%s" class="plugin-update colspanchange"><div class="notice inline notice-warning notice-alt">%s</div></td></tr>',
807
- $wp_list_table->get_column_count(),
808
- wpautop( $message )
809
- );
810
- }
811
 
812
  }
813
 
814
  /**
815
  * Stolen from SPAI, Thanks.
816
- */
817
  private function get_update_notice($data, $response) {
818
- $transient_name = 'shortpixel_update_notice_' . $response->new_version;
819
 
820
- $transient_duration = DAY_IN_SECONDS;
821
 
822
- if (\wpSPIO()->env()->is_debug)
823
- $transient_duration = 30;
824
 
825
- $update_notice = get_transient( $transient_name );
826
- $url = $this->remote_readme_endpoint;
827
 
828
- if ( $update_notice === false || strlen( $update_notice ) == 0 ) {
829
- $readme_response = wp_safe_remote_request( $url );
830
- $content = false;
831
- if (! is_wp_error( $readme_response ) )
832
- {
833
- $content = $readme_response['body'];
834
- }
835
 
836
 
837
- if ( !empty( $readme_response ) ) {
838
- $update_notice = $this->parse_update_notice( $content, $response );
839
- set_transient( $transient_name, $update_notice, $transient_duration );
840
- }
841
  }
 
842
 
843
- return $update_notice;
844
  }
845
 
846
 
847
 
848
  /**
849
- * Parse update notice from readme file.
850
- *
851
- * @param string $content ShortPixel AI readme file content
852
- * @param object $response WordPress response
853
- *
854
- * @return string
855
- */
856
- private function parse_update_notice( $content, $response ) {
857
 
858
- $new_version = $response->new_version;
859
 
860
- $update_notice = '';
861
 
862
- // foreach ( $check_for_notices as $id => $check_version ) {
863
 
864
- if ( version_compare( SHORTPIXEL_IMAGE_OPTIMISER_VERSION, $new_version, '>' ) ) {
865
- return '';
866
- }
867
 
868
- $result = $this->parse_readme_content( $content, $new_version, $response );
869
 
870
- if ( !empty( $result ) ) {
871
- $update_notice = $result;
872
- }
873
- // }
874
 
875
- return wp_kses_post( $update_notice );
876
- }
877
 
878
 
879
- /*
880
- *
881
- * Parses readme file's content to find notice related to passed version
882
- *
883
- * @param string $content Readme file content
884
- * @param string $version Checked version
885
- * @param object $response WordPress response
886
- *
887
- * @return string
888
- */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
889
 
890
- private function parse_readme_content( $content, $new_version, $response ) {
891
-
892
- $notices_pattern = '/==.*Upgrade Notice.*==(.*)$|==/Uis';
893
-
894
- $notice = '';
895
- $matches = null;
896
-
897
- if ( preg_match( $notices_pattern, $content, $matches ) ) {
898
-
899
- if (! isset($matches[1]))
900
- return ''; // no update texts.
901
-
902
- $match = str_replace('\n', '', $matches[1]);
903
- $lines = str_split(trim($match));
904
-
905
- $versions = array();
906
- $inv = false;
907
- foreach($lines as $char)
908
- {
909
- //if (count($versions) == 0)
910
- if ($char == '=' && ! $inv) // = and not recording version, start one.
911
- {
912
- $curver = '';
913
- $inv = true;
914
- }
915
- elseif ($char == ' ' && $inv) // don't record spaces in version
916
- continue;
917
- elseif ($char == '=' && $inv) // end of version line
918
- { $versions[trim($curver)] = '';
919
- $inv = false;
920
- }
921
- elseif($inv) // record the version string
922
- {
923
- $curver .= $char;
924
- }
925
- elseif(! $inv) // record the message
926
- {
927
- $versions[trim($curver)] .= $char;
928
- }
929
-
930
-
931
- }
932
-
933
- foreach($versions as $version => $line)
934
- {
935
- if (version_compare(SHORTPIXEL_IMAGE_OPTIMISER_VERSION, $version, '<') && version_compare($version, $new_version, '<='))
936
- {
937
- $notice .= '<span>';
938
- $notice .= $this->markdown2html( $line );
939
- $notice .= '</span>';
940
-
941
- }
942
- }
943
-
944
- }
945
-
946
- return $notice;
947
- }
948
-
949
- /*private function replace_readme_constants( $content, $response ) {
950
- $constants = [ '{{ NEW VERSION }}', '{{ CURRENT VERSION }}', '{{ PHP VERSION }}', '{{ REQUIRED PHP VERSION }}' ];
951
- $replacements = [ $response->new_version, SHORTPIXEL_IMAGE_OPTIMISER_VERSION, PHP_VERSION, $response->requires_php ];
952
-
953
- return str_replace( $constants, $replacements, $content );
954
- } */
955
-
956
- private function markdown2html( $content ) {
957
- $patterns = [
958
- '/\*\*(.+)\*\*/U', // bold
959
- '/__(.+)__/U', // italic
960
- '/\[([^\]]*)\]\(([^\)]*)\)/U', // link
961
- ];
962
-
963
- $replacements = [
964
- '<strong>${1}</strong>',
965
- '<em>${1}</em>',
966
- '<a href="${2}" target="_blank">${1}</a>',
967
- ];
968
-
969
- $prepared_content = preg_replace( $patterns, $replacements, $content );
970
-
971
- return isset( $prepared_content ) ? $prepared_content : $content;
972
  }
973
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
974
 
975
  } // class
20
  {
21
  protected static $instance;
22
 
23
+ protected $definedNotices = array( // NoticeModels by Class. This is not optimal but until solution found, workable.
24
+ 'CompatNotice',
25
+ 'UnlistedNotice',
26
+ 'AvifNotice',
27
+ 'QuotaNoticeMonth',
28
+ 'QuotaNoticeReached',
29
+ 'ApiNotice',
30
+ 'ApiNoticeRepeat',
31
+ 'ApiNoticeRepeatLong',
32
+ 'NextgenNotice',
33
+ 'SmartcropNotice',
34
+ 'LegacyNotice',
35
+ 'ListviewNotice'
36
+ );
37
+ protected $adminNotices; // Models
 
 
 
 
 
 
38
 
39
  private $remote_message_endpoint = 'https://api.shortpixel.com/v2/notices.php';
40
  private $remote_readme_endpoint = 'https://plugins.svn.wordpress.org/shortpixel-image-optimiser/trunk/readme.txt';
41
 
 
42
  public function __construct()
43
  {
44
+ add_action('admin_notices', array($this, 'displayNotices'), 50); // notices occured before page load
45
  add_action('admin_footer', array($this, 'displayNotices')); // called in views.
46
 
47
+ add_action('in_plugin_update_message-' . plugin_basename(SHORTPIXEL_PLUGIN_FILE), array($this, 'pluginUpdateMessage') , 50, 2 );
48
 
49
+ // no persistent notifications with this flag set.
50
+ if (defined('SHORTPIXEL_SILENT_MODE') && SHORTPIXEL_SILENT_MODE === true)
51
+ return;
52
 
53
+ add_action('admin_notices', array($this, 'check_admin_notices'), 5); // run before the plugin admin notices
54
 
55
+ $this->initNotices();
56
  }
57
 
58
  public static function getInstance()
59
  {
60
+ if (is_null(self::$instance))
61
  self::$instance = new AdminNoticesController();
62
 
63
+ return self::$instance;
64
  }
65
 
66
  public static function resetAllNotices()
67
  {
68
+ Notices::resetNotices();
69
  }
70
 
71
  /** Triggered when plugin is activated */
72
  public static function resetCompatNotice()
73
  {
74
+ Notices::removeNoticeByID('MSG_COMPAT');
75
  }
76
 
77
  public static function resetAPINotices()
78
  {
79
+ Notices::removeNoticeByID('MSG_NO_APIKEY');
80
+ Notices::removeNoticeByID('MSG_NO_APIKEY_REPEAT');
81
+ Notices::removeNoticeByID('MSG_NO_APIKEY_REPEAT_LONG');
82
  }
83
 
84
  public static function resetQuotaNotices()
85
  {
86
+ Notices::removeNoticeByID('MSG_UPGRADE_MONTH');
87
+ Notices::removeNoticeByID('MSG_UPGRADE_BULK');
88
+ Notices::removeNoticeBYID('MSG_QUOTA_REACHED');
89
  }
90
 
91
  public static function resetIntegrationNotices()
92
  {
93
+ Notices::removeNoticeByID('MSG_INTEGRATION_NGGALLERY');
94
  }
95
 
96
+ public static function resetLegacyNotice()
 
 
 
 
 
 
97
  {
98
+ Notices::removeNoticeByID('MSG_CONVERT_LEGACY');
 
 
 
 
99
  }
100
 
101
  public function displayNotices()
102
  {
103
+ if (! \wpSPIO()->env()->is_screen_to_use)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
104
  {
105
+ if(get_current_screen()->base !== 'dashboard') // ugly exception for dashboard.
106
+ return; // suppress all when not our screen.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
107
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
108
 
109
+ $access = AccessModel::getInstance();
110
+ $screen = get_current_screen();
111
+ $screen_id = \wpSPIO()->env()->screen_id;
112
 
113
+ $noticeControl = Notices::getInstance();
114
+ $noticeControl->loadIcons(array(
115
+ 'normal' => '<img class="short-pixel-notice-icon" src="' . plugins_url('res/img/slider.png', SHORTPIXEL_PLUGIN_FILE) . '">',
116
+ 'success' => '<img class="short-pixel-notice-icon" src="' . plugins_url('res/img/robo-cool.png', SHORTPIXEL_PLUGIN_FILE) . '">',
117
+ 'warning' => '<img class="short-pixel-notice-icon" src="' . plugins_url('res/img/robo-scared.png', SHORTPIXEL_PLUGIN_FILE) . '">',
118
+ 'error' => '<img class="short-pixel-notice-icon" src="' . plugins_url('res/img/robo-scared.png', SHORTPIXEL_PLUGIN_FILE) . '">',
119
+ ));
120
 
121
+ if ($noticeControl->countNotices() > 0)
122
  {
123
+ $notices = $noticeControl->getNoticesForDisplay();
 
124
 
125
+ if (count($notices) > 0)
126
+ {
127
+ \wpSPIO()->load_style('shortpixel-notices');
 
 
 
 
128
 
129
+ foreach($notices as $notice)
130
+ {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
131
 
132
+ if ($notice->checkScreen($screen_id) === false)
133
+ {
134
+ continue;
135
+ }
136
+ elseif ($access->noticeIsAllowed($notice))
137
+ {
138
+ echo $notice->getForDisplay();
139
+ }
140
+ else
141
+ {
142
+ continue;
143
+ }
144
 
145
+ // Todo change this to new keys
146
+ if ($notice->getID() == 'MSG_QUOTA_REACHED' || $notice->getID() == 'MSG_UPGRADE_MONTH') //|| $notice->getID() == AdminNoticesController::MSG_UPGRADE_BULK
147
+ {
148
+ wp_enqueue_script('jquery.knob.min.js');
149
+ wp_enqueue_script('shortpixel');
150
+ }
151
+ }
152
+ }
153
+ }
154
+ $noticeControl->update(); // puts views, and updates
155
  }
156
 
157
+ /* General function to check on Hook for admin notices if there is something to show globally */
158
+ public function check_admin_notices()
159
  {
160
+ if (! \wpSPIO()->env()->is_screen_to_use)
161
  {
162
+ if(get_current_screen()->base !== 'dashboard') // ugly exception for dashboard.
163
+ return; // suppress all when not our screen.
164
  }
165
 
166
+ $this->loadNotices();
167
+ }
 
168
 
169
+ protected function initNotices()
170
+ {
171
+ foreach($this->definedNotices as $className)
172
  {
173
+ $ns = '\ShortPixel\Model\AdminNotices\\' . $className;
174
+ $class = new $ns();
175
+ $this->adminNotices[$class->getKey()] = $class;
176
  }
177
+ }
178
 
179
+ protected function loadNotices()
180
+ {
181
+ foreach($this->adminNotices as $key => $class)
182
+ {
183
+ $class->load();
184
+ }
185
+ }
 
 
 
 
 
 
 
 
186
 
187
+ public function getNoticeByKey($key)
188
+ {
189
+ if (isset($this->adminNotices[$key]))
190
  {
191
+ return $this->adminNotices[$key];
 
 
 
 
 
 
192
  }
193
+ else {
194
+ return false;
 
 
 
 
 
 
195
  }
 
196
  }
197
 
198
+ public function getAllNotices()
199
  {
200
+ return $this->adminNotices;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
201
  }
202
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
203
 
204
+ // Called by MediaLibraryModel
205
+ public function invokeLegacyNotice()
 
 
 
 
 
 
 
 
 
 
 
 
 
206
  {
207
+ $noticeModel = $this->getNoticeByKey('MSG_CONVERT_LEGACY');
208
+ if (! $noticeModel->isDismissed())
209
+ {
210
+ $noticeModel->addManual();
211
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
212
 
213
  }
214
 
215
 
216
  protected function doRemoteNotices()
217
  {
218
+ $notices = $this->get_remote_notices();
219
 
220
+ if ($notices == false)
221
+ return;
222
 
223
+ foreach($notices as $remoteNotice)
224
+ {
225
+ if (! isset($remoteNotice->id) && ! isset($remoteNotice->message))
226
+ return;
227
 
228
+ if (! isset($remoteNotice->type))
229
+ $remoteNotice->type = 'notice';
230
 
231
+ $message = esc_html($remoteNotice->message);
232
+ $id = sanitize_text_field($remoteNotice->id);
233
 
234
+ $noticeController = Notices::getInstance();
235
+ $noticeObj = $noticeController->getNoticeByID($id);
236
 
237
+ // not added to system yet
238
  if ($noticeObj === false)
239
  {
240
+ switch ($remoteNotice->type)
241
+ {
242
+ case 'warning':
243
+ $new_notice = Notices::addWarning($message);
244
+ break;
245
+ case 'error':
246
+ $new_notice = Notices::addError($message);
247
+ break;
248
+ case 'notice':
249
+ default:
250
+ $new_notice = Notices::addNormal($message);
251
+ break;
252
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
253
 
254
+ Notices::makePersistent($new_notice, $id, MONTH_IN_SECONDS);
255
+ }
256
 
 
 
 
 
 
 
 
 
257
 
 
 
 
 
 
 
 
 
 
 
258
  }
259
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
260
  }
261
 
262
  public function proposeUpgradePopup() {
263
+ $view = new ViewController();
264
+ $view->loadView('snippets/part-upgrade-options');
265
  }
266
 
267
  public function proposeUpgradeRemote()
271
  $apiKeyController = ApiKeyController::getInstance();
272
  $settings = \wpSPIO()->settings();
273
 
274
+ $webpActive = ($settings->createWebp) ? true : false;
275
+ $avifActive = ($settings->createAvif) ? true : false;
276
 
277
  $args = array(
278
  'method' => 'POST',
290
  'm4' => $statsController->find('period', 'months', '4'),
291
  'filesTodo' => $statsController->totalImagesToOptimize(),
292
  'estimated' => $settings->optimizeUnlisted || $settings->optimizeRetina ? 'true' : 'false',
293
+ 'webp' => $webpActive,
294
+ 'avif' => $avifActive,
295
  /* */
296
  'iconsUrl' => base64_encode(wpSPIO()->plugin_url('res/img'))
297
+ ))),
298
+ 'cookies' => array()
299
 
300
  );
301
 
309
 
310
  }
311
 
312
+ private function get_remote_notices()
313
+ {
314
  $transient_name = 'shortpixel_remote_notice';
315
  $transient_duration = DAY_IN_SECONDS;
316
 
317
  if (\wpSPIO()->env()->is_debug)
318
+ $transient_duration = 30;
319
 
320
  $keyControl = new apiKeyController();
321
  //$keyControl->loadKey();
323
  $notices = get_transient($transient_name);
324
  $url = $this->remote_message_endpoint;
325
  $url = add_query_arg(array( // has url
326
+ 'key' => $keyControl->forceGetApiKey(),
327
+ 'version' => SHORTPIXEL_IMAGE_OPTIMISER_VERSION,
328
+ 'target' => 3,
329
  ), $url);
330
 
331
 
332
  if ( $notices === false ) {
333
+ $notices_response = wp_safe_remote_request( $url );
334
+ $content = false;
335
+ if (! is_wp_error( $notices_response ) )
336
+ {
337
+ $notices = json_decode($notices_response['body']);
338
 
339
+ if (! is_array($notices))
340
+ $notices = false;
341
 
342
+ // Save transient anywhere to prevent over-asking when nothing good is there.
343
+ set_transient( $transient_name, $notices, $transient_duration );
344
+ }
345
+ else
346
+ {
347
+ set_transient( $transient_name, false, $transient_duration );
348
+ }
349
  }
350
 
351
  return $notices;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
352
  }
353
 
 
 
354
 
 
 
 
 
 
 
 
355
 
 
 
 
 
356
 
357
 
358
  public function pluginUpdateMessage($data, $response)
359
  {
360
+ // $message = $this->getPluginUpdateMessage($plugin['new_version']);
361
 
362
+ $message = $this->get_update_notice($data, $response);
363
 
364
+ if( $message !== false && strlen(trim($message)) > 0) {
365
+ $wp_list_table = _get_list_table( 'WP_Plugins_List_Table' );
366
+ printf(
367
+ '<tr class="plugin-update-tr active"><td colspan="%s" class="plugin-update colspanchange"><div class="notice inline notice-warning notice-alt">%s</div></td></tr>',
368
+ $wp_list_table->get_column_count(),
369
+ wpautop( $message )
370
+ );
371
+ }
372
 
373
  }
374
 
375
  /**
376
  * Stolen from SPAI, Thanks.
377
+ */
378
  private function get_update_notice($data, $response) {
379
+ $transient_name = 'shortpixel_update_notice_' . $response->new_version;
380
 
381
+ $transient_duration = DAY_IN_SECONDS;
382
 
383
+ if (\wpSPIO()->env()->is_debug)
384
+ $transient_duration = 30;
385
 
386
+ $update_notice = get_transient( $transient_name );
387
+ $url = $this->remote_readme_endpoint;
388
 
389
+ if ( $update_notice === false || strlen( $update_notice ) == 0 ) {
390
+ $readme_response = wp_safe_remote_request( $url );
391
+ $content = false;
392
+ if (! is_wp_error( $readme_response ) )
393
+ {
394
+ $content = $readme_response['body'];
395
+ }
396
 
397
 
398
+ if ( !empty( $readme_response ) ) {
399
+ $update_notice = $this->parse_update_notice( $content, $response );
400
+ set_transient( $transient_name, $update_notice, $transient_duration );
 
401
  }
402
+ }
403
 
404
+ return $update_notice;
405
  }
406
 
407
 
408
 
409
  /**
410
+ * Parse update notice from readme file.
411
+ *
412
+ * @param string $content ShortPixel AI readme file content
413
+ * @param object $response WordPress response
414
+ *
415
+ * @return string
416
+ */
417
+ private function parse_update_notice( $content, $response ) {
418
 
419
+ $new_version = $response->new_version;
420
 
421
+ $update_notice = '';
422
 
423
+ // foreach ( $check_for_notices as $id => $check_version ) {
424
 
425
+ if ( version_compare( SHORTPIXEL_IMAGE_OPTIMISER_VERSION, $new_version, '>' ) ) {
426
+ return '';
427
+ }
428
 
429
+ $result = $this->parse_readme_content( $content, $new_version, $response );
430
 
431
+ if ( !empty( $result ) ) {
432
+ $update_notice = $result;
433
+ }
434
+ // }
435
 
436
+ return wp_kses_post( $update_notice );
437
+ }
438
 
439
 
440
+ /*
441
+ *
442
+ * Parses readme file's content to find notice related to passed version
443
+ *
444
+ * @param string $content Readme file content
445
+ * @param string $version Checked version
446
+ * @param object $response WordPress response
447
+ *
448
+ * @return string
449
+ */
450
+
451
+ private function parse_readme_content( $content, $new_version, $response ) {
452
+
453
+ $notices_pattern = '/==.*Upgrade Notice.*==(.*)$|==/Uis';
454
+
455
+ $notice = '';
456
+ $matches = null;
457
+
458
+ if ( preg_match( $notices_pattern, $content, $matches ) ) {
459
+
460
+ if (! isset($matches[1]))
461
+ return ''; // no update texts.
462
+
463
+ $match = str_replace('\n', '', $matches[1]);
464
+ $lines = str_split(trim($match));
465
+
466
+ $versions = array();
467
+ $inv = false;
468
+ foreach($lines as $char)
469
+ {
470
+ //if (count($versions) == 0)
471
+ if ($char == '=' && ! $inv) // = and not recording version, start one.
472
+ {
473
+ $curver = '';
474
+ $inv = true;
475
+ }
476
+ elseif ($char == ' ' && $inv) // don't record spaces in version
477
+ continue;
478
+ elseif ($char == '=' && $inv) // end of version line
479
+ { $versions[trim($curver)] = '';
480
+ $inv = false;
481
+ }
482
+ elseif($inv) // record the version string
483
+ {
484
+ $curver .= $char;
485
+ }
486
+ elseif(! $inv) // record the message
487
+ {
488
+ $versions[trim($curver)] .= $char;
489
+ }
490
+
491
+
492
+ }
493
+
494
+ foreach($versions as $version => $line)
495
+ {
496
+ if (version_compare(SHORTPIXEL_IMAGE_OPTIMISER_VERSION, $version, '<') && version_compare($version, $new_version, '<='))
497
+ {
498
+ $notice .= '<span>';
499
+ $notice .= $this->markdown2html( $line );
500
+ $notice .= '</span>';
501
+
502
+ }
503
+ }
504
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
505
  }
506
 
507
+ return $notice;
508
+ }
509
+
510
+ /*private function replace_readme_constants( $content, $response ) {
511
+ $constants = [ '{{ NEW VERSION }}', '{{ CURRENT VERSION }}', '{{ PHP VERSION }}', '{{ REQUIRED PHP VERSION }}' ];
512
+ $replacements = [ $response->new_version, SHORTPIXEL_IMAGE_OPTIMISER_VERSION, PHP_VERSION, $response->requires_php ];
513
+
514
+ return str_replace( $constants, $replacements, $content );
515
+ } */
516
+
517
+ private function markdown2html( $content ) {
518
+ $patterns = [
519
+ '/\*\*(.+)\*\*/U', // bold
520
+ '/__(.+)__/U', // italic
521
+ '/\[([^\]]*)\]\(([^\)]*)\)/U', // link
522
+ ];
523
+
524
+ $replacements = [
525
+ '<strong>${1}</strong>',
526
+ '<em>${1}</em>',
527
+ '<a href="${2}" target="_blank">${1}</a>',
528
+ ];
529
+
530
+ $prepared_content = preg_replace( $patterns, $replacements, $content );
531
+
532
+ return isset( $prepared_content ) ? $prepared_content : $content;
533
+ }
534
+
535
 
536
  } // class
class/Controller/FileSystemController.php CHANGED
@@ -236,11 +236,15 @@ Class FileSystemController extends \ShortPixel\Controller
236
  if (defined('UPLOADS')) // if this is set, lead.
237
  $abspath = trailingslashit(ABSPATH) . UPLOADS;
238
 
 
239
  $abspath = apply_filters('shortpixel/filesystem/abspath', $abspath );
240
 
 
241
  return $this->getDirectory($abspath);
242
  }
243
 
 
 
244
  /** Not in use yet, do not use. Future replacement. */
245
  public function checkBackUpFolder($folder = SHORTPIXEL_BACKUP_FOLDER)
246
  {
@@ -304,7 +308,7 @@ Class FileSystemController extends \ShortPixel\Controller
304
  // (2) ** Also a real life fix when a path is /wwwroot/assets/sites/2/ etc, in get site url, the home URL is the site URL, without appending the sites stuff. Fails on original image.
305
  if ($is_multi_site && ! $is_main_site)
306
  {
307
- $wp_home_path = wp_normalize_path(trailingslashit($uploads['basedir']));
308
  $home_url = trailingslashit($uploads['baseurl']);
309
  }
310
  else
236
  if (defined('UPLOADS')) // if this is set, lead.
237
  $abspath = trailingslashit(ABSPATH) . UPLOADS;
238
 
239
+ // $abspath = wp_normalize_path($abspath);
240
  $abspath = apply_filters('shortpixel/filesystem/abspath', $abspath );
241
 
242
+
243
  return $this->getDirectory($abspath);
244
  }
245
 
246
+
247
+
248
  /** Not in use yet, do not use. Future replacement. */
249
  public function checkBackUpFolder($folder = SHORTPIXEL_BACKUP_FOLDER)
250
  {
308
  // (2) ** Also a real life fix when a path is /wwwroot/assets/sites/2/ etc, in get site url, the home URL is the site URL, without appending the sites stuff. Fails on original image.
309
  if ($is_multi_site && ! $is_main_site)
310
  {
311
+ $wp_home_path = trailingslashit($uploads['basedir']);
312
  $home_url = trailingslashit($uploads['baseurl']);
313
  }
314
  else
class/Controller/FrontController.php CHANGED
@@ -2,6 +2,7 @@
2
  namespace ShortPixel\Controller;
3
  use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
4
  use ShortPixel\Notices\NoticeController as Notices;
 
5
 
6
  use ShortPixel\ShortPixelImgToPictureWebp as ShortPixelImgToPictureWebp;
7
 
@@ -29,13 +30,13 @@ class FrontController extends \ShortPixel\Controller
29
  $webp_option = \wpSPIO()->settings()->deliverWebp;
30
 
31
  if ( $webp_option ) { // @tood Replace this function with the one in ENV.
32
- if(\ShortPixelTools::shortPixelIsPluginActive('shortpixel-adaptive-images/short-pixel-ai.php')) {
33
  Notices::addWarning(__('Please deactivate the ShortPixel Image Optimizer\'s
34
  <a href="options-general.php?page=wp-shortpixel-settings&part=adv-settings">Deliver the next generation versions of the images in the front-end</a>
35
  option when the ShortPixel Adaptive Images plugin is active.','shortpixel-image-optimiser'), true);
36
  }
37
  elseif( $webp_option == self::WEBP_GLOBAL ){
38
- //add_action( 'wp_head', array($this, 'addPictureJs') ); // adds polyfill JS to the header || Removed. Browsers without picture support?
39
  add_action( 'init', array($this, 'startOutputBuffer'), 1 ); // start output buffer to capture content
40
  } elseif ($webp_option == self::WEBP_WP){
41
  add_filter( 'the_content', array($this, 'convertImgToPictureAddWebp'), 10000 ); // priority big, so it will be executed last
@@ -57,7 +58,7 @@ class FrontController extends \ShortPixel\Controller
57
  // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form
58
  return $content . (isset($_GET['SHORTPIXEL_DEBUG']) ? '<!-- SPDBG is AMP -->' : '');
59
  }
60
- require_once(\ShortPixelTools::getPluginPath() . 'class/front/img-to-picture-webp.php');
61
 
62
  $webpObj = new ShortPixelImgToPictureWebp();
63
  return $webpObj->convert($content);
2
  namespace ShortPixel\Controller;
3
  use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
4
  use ShortPixel\Notices\NoticeController as Notices;
5
+ use ShortPixel\Helper\UtilHelper as UtilHelper;
6
 
7
  use ShortPixel\ShortPixelImgToPictureWebp as ShortPixelImgToPictureWebp;
8
 
30
  $webp_option = \wpSPIO()->settings()->deliverWebp;
31
 
32
  if ( $webp_option ) { // @tood Replace this function with the one in ENV.
33
+ if(UtilHelper::shortPixelIsPluginActive('shortpixel-adaptive-images/short-pixel-ai.php')) {
34
  Notices::addWarning(__('Please deactivate the ShortPixel Image Optimizer\'s
35
  <a href="options-general.php?page=wp-shortpixel-settings&part=adv-settings">Deliver the next generation versions of the images in the front-end</a>
36
  option when the ShortPixel Adaptive Images plugin is active.','shortpixel-image-optimiser'), true);
37
  }
38
  elseif( $webp_option == self::WEBP_GLOBAL ){
39
+ //add_action( 'wp_head', array($this, 'addPictureJs') ); // adds polyfill JS to the header || Removed. Browsers without picture support?
40
  add_action( 'init', array($this, 'startOutputBuffer'), 1 ); // start output buffer to capture content
41
  } elseif ($webp_option == self::WEBP_WP){
42
  add_filter( 'the_content', array($this, 'convertImgToPictureAddWebp'), 10000 ); // priority big, so it will be executed last
58
  // phpcs:ignore WordPress.Security.NonceVerification.Recommended -- This is not a form
59
  return $content . (isset($_GET['SHORTPIXEL_DEBUG']) ? '<!-- SPDBG is AMP -->' : '');
60
  }
61
+ require_once(\wpSPIO()->plugin_path('class/front/img-to-picture-webp.php'));
62
 
63
  $webpObj = new ShortPixelImgToPictureWebp();
64
  return $webpObj->convert($content);
class/Controller/QuotaController.php CHANGED
@@ -67,7 +67,7 @@ class QuotaController
67
 
68
  public function getQuota()
69
  {
70
- /*'quotaAvailable' => max(0, $quotaData['APICallsQuotaNumeric'] + $quotaData['APICallsQuotaOneTimeNumeric'] - $quotaData['APICallsMadeNumeric'] - $quotaData['APICallsMadeOneTimeNumeric']))); */
71
  $quotaData = $this->getQuotaData();
72
  $DateNow = time();
73
 
@@ -75,6 +75,7 @@ class QuotaController
75
  $DaysToReset = 30 - ( (int) ( ( $DateNow - $DateSubscription) / 84600) % 30);
76
 
77
  $quota = (object) [
 
78
  'monthly' => (object) [
79
  'text' => sprintf(__('%s/month', 'shortpixel-image-optimiser'), $quotaData['APICallsQuota']),
80
  'total' => $quotaData['APICallsQuotaNumeric'],
@@ -307,6 +308,8 @@ class QuotaController
307
  "APICallsMadeOneTimeNumeric" => (int) max($data->APICallsMadeOneTime, 0),
308
  "APICallsQuotaOneTimeNumeric" => (int) max($data->APICallsQuotaOneTime, 0),
309
 
 
 
310
  "APILastRenewalDate" => $data->DateSubscription,
311
  "DomainCheck" => (isset($data->DomainCheck) ? $data->DomainCheck : null)
312
  );
@@ -315,7 +318,7 @@ class QuotaController
315
 
316
  //reset quota exceeded flag -> user is allowed to process more images.
317
 
318
- if ( $dataArray['APICallsRemaining'] > 0)
319
  {
320
  $this->resetQuotaExceeded();
321
  }
67
 
68
  public function getQuota()
69
  {
70
+
71
  $quotaData = $this->getQuotaData();
72
  $DateNow = time();
73
 
75
  $DaysToReset = 30 - ( (int) ( ( $DateNow - $DateSubscription) / 84600) % 30);
76
 
77
  $quota = (object) [
78
+ 'unlimited' => isset($quotaData['Unlimited']) ? $quotaData['Unlimited'] : false,
79
  'monthly' => (object) [
80
  'text' => sprintf(__('%s/month', 'shortpixel-image-optimiser'), $quotaData['APICallsQuota']),
81
  'total' => $quotaData['APICallsQuotaNumeric'],
308
  "APICallsMadeOneTimeNumeric" => (int) max($data->APICallsMadeOneTime, 0),
309
  "APICallsQuotaOneTimeNumeric" => (int) max($data->APICallsQuotaOneTime, 0),
310
 
311
+ "Unlimited" => ($data->Unlimited == 'true') ? true : false,
312
+
313
  "APILastRenewalDate" => $data->DateSubscription,
314
  "DomainCheck" => (isset($data->DomainCheck) ? $data->DomainCheck : null)
315
  );
318
 
319
  //reset quota exceeded flag -> user is allowed to process more images.
320
 
321
+ if ( $dataArray['APICallsRemaining'] > 0 || $dataArray['Unlimited'])
322
  {
323
  $this->resetQuotaExceeded();
324
  }
class/Controller/SettingsController.php CHANGED
@@ -3,14 +3,14 @@ namespace ShortPixel\Controller;
3
  use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
4
  use ShortPixel\Notices\NoticeController as Notice;
5
  use ShortPixel\Helper\UiHelper as UiHelper;
 
6
  use ShortPixel\Helper\InstallHelper as InstallHelper;
7
 
8
  use ShortPixel\Model\ApiKeyModel as ApiKeyModel;
9
-
10
 
11
  use ShortPixel\NextGenController as NextGenController;
12
 
13
-
14
  class SettingsController extends \ShortPixel\ViewController
15
  {
16
 
@@ -55,7 +55,6 @@ class SettingsController extends \ShortPixel\ViewController
55
  parent::__construct();
56
  }
57
 
58
-
59
  // default action of controller
60
  public function load()
61
  {
@@ -73,6 +72,7 @@ class SettingsController extends \ShortPixel\ViewController
73
  $this->load_settings();
74
  }
75
 
 
76
  // this is the nokey form, submitting api key
77
  public function action_addkey()
78
  {
@@ -116,6 +116,22 @@ class SettingsController extends \ShortPixel\ViewController
116
  $this->load(); // already verified?
117
  return;
118
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
119
  $params = array(
120
  'method' => 'POST',
121
  'timeout' => 10,
@@ -124,11 +140,7 @@ class SettingsController extends \ShortPixel\ViewController
124
  'blocking' => true,
125
  'sslverify' => false,
126
  'headers' => array(),
127
- 'body' => array(
128
- 'plugin_version' => SHORTPIXEL_IMAGE_OPTIMISER_VERSION,
129
- 'email' => $email,
130
- 'ip' => isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? sanitize_text_field($_SERVER["HTTP_X_FORWARDED_FOR"]) : sanitize_text_field($_SERVER['REMOTE_ADDR']),
131
- )
132
  );
133
 
134
  $newKeyResponse = wp_remote_post("https://shortpixel.com/free-sign-up-plugin", $params);
@@ -138,10 +150,12 @@ class SettingsController extends \ShortPixel\ViewController
138
  if ( is_object($newKeyResponse) && get_class($newKeyResponse) == 'WP_Error' ) {
139
  //die(json_encode((object)array('Status' => 'fail', 'Details' => '503')));
140
  Notice::addError($errorText . $newKeyResponse->get_error_message() );
 
141
  }
142
  elseif ( isset($newKeyResponse['response']['code']) && $newKeyResponse['response']['code'] <> 200 ) {
143
  //die(json_encode((object)array('Status' => 'fail', 'Details' =>
144
  Notice::addError($errorText . $newKeyResponse['response']['code']);
 
145
  }
146
  $body = $newKeyResponse['body'];
147
  $body = json_decode($body);
@@ -251,6 +265,34 @@ class SettingsController extends \ShortPixel\ViewController
251
  $this->load();
252
  }
253
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
  public function action_debug_resetQueue()
255
  {
256
  $queue = isset($_REQUEST['queue']) ? sanitize_text_field($_REQUEST['queue']) : null;
@@ -309,6 +351,7 @@ class SettingsController extends \ShortPixel\ViewController
309
  }
310
 
311
 
 
312
  public function processSave()
313
  {
314
  // Split this in the several screens. I.e. settings, advanced, Key Request IF etc.
@@ -357,7 +400,7 @@ class SettingsController extends \ShortPixel\ViewController
357
  if ($this->do_redirect)
358
  $this->doRedirect('bulk');
359
  else {
360
-
361
  $noticeController = Notice::getInstance();
362
  $notice = Notice::addSuccess(__('Settings Saved', 'shortpixel-image-optimiser'));
363
  $notice->is_removable = false;
@@ -381,11 +424,9 @@ class SettingsController extends \ShortPixel\ViewController
381
 
382
  $this->view->data->apiKey = $keyController->getKeyForDisplay();
383
 
384
-
385
  $this->loadStatistics();
386
  $this->checkCloudFlare();
387
 
388
-
389
  $statsControl = StatsController::getInstance();
390
 
391
  $this->view->minSizes = $this->getMaxIntermediateImageSize();
@@ -408,80 +449,13 @@ class SettingsController extends \ShortPixel\ViewController
408
  $this->loadView('view-settings');
409
  }
410
 
411
- protected function avifServerCheck()
412
  {
413
- $cache = new CacheController();
414
- if (apply_filters('shortpixel/avifcheck/override', false) === true)
415
- { return; }
416
-
417
- if ($cache->getItem('avif_server_check')->exists() === false)
418
- {
419
- $url = \WPSPIO()->plugin_url('res/img/test.avif');
420
- $headers = get_headers($url);
421
- $is_error = true;
422
-
423
- // Defaults.
424
- $error_message = __('Avif server test failed. Your server might not be configured to display AVIF files properly. Serving Avif might cause your images to not load. Check your images, disable the AVIF option or update your web server configuration.', 'shortpixel-image-optimiser');
425
- $error_detail = __('The request did not return valid HTTP Headers. Check if the plugin is allowed to get ' . $url, 'shortpixel-image-optimiser');
426
 
427
- $contentType = null;
428
- $response = $headers[0];
429
 
430
- if (is_array($headers) )
431
- {
432
- foreach($headers as $index => $header)
433
- {
434
- if ( strpos(strtolower($header), 'content-type') !== false )
435
- {
436
- // This is another header that can interrupt.
437
- if (strpos(strtolower($header), 'x-content-type-options') === false)
438
- {
439
- $contentType = $header;
440
- }
441
- }
442
- }
443
-
444
- // http not ok, redirect etc. Shouldn't happen.
445
- if (is_null($response) || strpos($response, '200') === false)
446
- {
447
- $error_detail = sprintf(__('The AVIF check could not be completed, because the plugin couldn\'t fetch %s %s %s. %s Please check the security/firewall settings and try again', 'shortpixel-image-optimiser'), '<a href="' . $url . '">', $url, '</a>', '<br>');
448
- }
449
- elseif(is_null($contentType) || strpos($contentType, 'avif') === false)
450
- {
451
- $error_detail = sprintf(__('The necessary Content-type header for AVIF files wasn\'t found, please check this with your Hosting and/or CDN provider. For more details about how to fix this, %s check this article %s', 'shortpixel_image_optimiser'), '<a href="https://shortpixel.com/blog/avif-mime-type-delivery-apache-nginx/" target="_blank"> ', '</a>');
452
-
453
- }
454
- else
455
- {
456
- $is_error = false;
457
- }
458
- }
459
-
460
- if ($is_error)
461
- {
462
- $noticeController = Notice::getInstance();
463
- $notice = $noticeController->getNoticeByID(AdminNoticesController::MSG_AVIF_ERROR);
464
- if ($notice && $notice->isDismissed() === true)
465
- {
466
- // Do Nothing
467
- }
468
- else
469
- {
470
- $notice = Notice::addError('<h4>' . $error_message . '</h4><p>' . $error_detail . '</p><p class="small">' . __('Returned Headers for :<br>', 'shortpixel-image-optimiser') . print_r($headers, true) . '</p>');
471
- Notice::makePersistent($notice, AdminNoticesController::MSG_AVIF_ERROR, MONTH_IN_SECONDS);
472
- }
473
-
474
- }
475
- else
476
- {
477
- Notice::removeNoticeByID(AdminNoticesController::MSG_AVIF_ERROR);
478
-
479
- $item = $cache->getItem('avif_server_check');
480
- $item->setValue(time());
481
- $item->setExpires(WEEK_IN_SECONDS);
482
- $cache->storeItemObject($item );
483
- }
484
- }
485
  }
486
 
487
  protected function loadStatistics()
@@ -749,7 +723,7 @@ class SettingsController extends \ShortPixel\ViewController
749
  {
750
  $deliverwebp = 0;
751
  if (! $this->is_nginx)
752
- \ShortPixelTools::alterHtaccess(false, false); // always remove the statements.
753
 
754
  $webpOn = isset($post['createWebp']) && $post['createWebp'] == 1;
755
  $avifOn = isset($post['createAvif']) && $post['createAvif'] == 1;
@@ -780,7 +754,7 @@ class SettingsController extends \ShortPixel\ViewController
780
 
781
  if (! $this->is_nginx && $deliverwebp == 3) // deliver webp/avif via htaccess, write rules
782
  {
783
- \ShortPixelTools::alterHtaccess(true, true);
784
  }
785
 
786
  $post['deliverWebp'] = $deliverwebp;
3
  use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
4
  use ShortPixel\Notices\NoticeController as Notice;
5
  use ShortPixel\Helper\UiHelper as UiHelper;
6
+ use ShortPixel\Helper\UtilHelper as UtilHelper;
7
  use ShortPixel\Helper\InstallHelper as InstallHelper;
8
 
9
  use ShortPixel\Model\ApiKeyModel as ApiKeyModel;
10
+ use ShortPixel\Model\AccessModel as AccessModel;
11
 
12
  use ShortPixel\NextGenController as NextGenController;
13
 
 
14
  class SettingsController extends \ShortPixel\ViewController
15
  {
16
 
55
  parent::__construct();
56
  }
57
 
 
58
  // default action of controller
59
  public function load()
60
  {
72
  $this->load_settings();
73
  }
74
 
75
+
76
  // this is the nokey form, submitting api key
77
  public function action_addkey()
78
  {
116
  $this->load(); // already verified?
117
  return;
118
  }
119
+
120
+ $bodyArgs = array(
121
+ 'plugin_version' => SHORTPIXEL_IMAGE_OPTIMISER_VERSION,
122
+ 'email' => $email,
123
+ 'ip' => isset($_SERVER["HTTP_X_FORWARDED_FOR"]) ? sanitize_text_field($_SERVER["HTTP_X_FORWARDED_FOR"]) : sanitize_text_field($_SERVER['REMOTE_ADDR']),
124
+ );
125
+
126
+ $affl_id = false;
127
+ $affl_id = (defined('SHORTPIXEL_AFFILIATE_ID')) ? SHORTPIXEL_AFFILIATE_ID : false;
128
+ $affl_id = apply_filters('shortpixel/settings/affiliate', $affl_id); // /af/bla35
129
+
130
+ if ($affl_id !== false)
131
+ {
132
+ $bodyArgs['affiliate'] = $affl_id;
133
+ }
134
+
135
  $params = array(
136
  'method' => 'POST',
137
  'timeout' => 10,
140
  'blocking' => true,
141
  'sslverify' => false,
142
  'headers' => array(),
143
+ 'body' => $bodyArgs,
 
 
 
 
144
  );
145
 
146
  $newKeyResponse = wp_remote_post("https://shortpixel.com/free-sign-up-plugin", $params);
150
  if ( is_object($newKeyResponse) && get_class($newKeyResponse) == 'WP_Error' ) {
151
  //die(json_encode((object)array('Status' => 'fail', 'Details' => '503')));
152
  Notice::addError($errorText . $newKeyResponse->get_error_message() );
153
+ $this->doRedirect(); // directly redirect because other data / array is not set.
154
  }
155
  elseif ( isset($newKeyResponse['response']['code']) && $newKeyResponse['response']['code'] <> 200 ) {
156
  //die(json_encode((object)array('Status' => 'fail', 'Details' =>
157
  Notice::addError($errorText . $newKeyResponse['response']['code']);
158
+ $this->doRedirect(); // strange http status, redirect with error.
159
  }
160
  $body = $newKeyResponse['body'];
161
  $body = json_decode($body);
265
  $this->load();
266
  }
267
 
268
+ public function action_debug_triggerNotice()
269
+ {
270
+ $key = isset($_REQUEST['notice_constant']) ? sanitize_text_field($_REQUEST['notice_constant']) : false;
271
+
272
+ if ($key !== false)
273
+ {
274
+ $adminNoticesController = AdminNoticesController::getInstance();
275
+
276
+ if ($key == 'trigger-all')
277
+ {
278
+ $notices = $adminNoticesController->getAllNotices();
279
+ foreach($notices as $noticeObj)
280
+ {
281
+ $noticeObj->addManual();
282
+ }
283
+ }
284
+ else
285
+ {
286
+ $model = $adminNoticesController->getNoticeByKey($key);
287
+ if ($model)
288
+ $model->addManual();
289
+ }
290
+ }
291
+ $this->load();
292
+
293
+ }
294
+
295
+
296
  public function action_debug_resetQueue()
297
  {
298
  $queue = isset($_REQUEST['queue']) ? sanitize_text_field($_REQUEST['queue']) : null;
351
  }
352
 
353
 
354
+
355
  public function processSave()
356
  {
357
  // Split this in the several screens. I.e. settings, advanced, Key Request IF etc.
400
  if ($this->do_redirect)
401
  $this->doRedirect('bulk');
402
  else {
403
+
404
  $noticeController = Notice::getInstance();
405
  $notice = Notice::addSuccess(__('Settings Saved', 'shortpixel-image-optimiser'));
406
  $notice->is_removable = false;
424
 
425
  $this->view->data->apiKey = $keyController->getKeyForDisplay();
426
 
 
427
  $this->loadStatistics();
428
  $this->checkCloudFlare();
429
 
 
430
  $statsControl = StatsController::getInstance();
431
 
432
  $this->view->minSizes = $this->getMaxIntermediateImageSize();
449
  $this->loadView('view-settings');
450
  }
451
 
452
+ protected function avifServerCheck()
453
  {
454
+ $noticeControl = AdminNoticesController::getInstance();
455
+ $notice = $noticeControl->getNoticeByKey('MSG_AVIF_ERROR');
 
 
 
 
 
 
 
 
 
 
 
456
 
457
+ $notice->check();
 
458
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
459
  }
460
 
461
  protected function loadStatistics()
723
  {
724
  $deliverwebp = 0;
725
  if (! $this->is_nginx)
726
+ UtilHelper::alterHtaccess(false, false); // always remove the statements.
727
 
728
  $webpOn = isset($post['createWebp']) && $post['createWebp'] == 1;
729
  $avifOn = isset($post['createAvif']) && $post['createAvif'] == 1;
754
 
755
  if (! $this->is_nginx && $deliverwebp == 3) // deliver webp/avif via htaccess, write rules
756
  {
757
+ UtilHelper::alterHtaccess(true, true);
758
  }
759
 
760
  $post['deliverWebp'] = $deliverwebp;
class/Controller/View/BulkViewController.php CHANGED
@@ -12,6 +12,9 @@ use ShortPixel\Controller\StatsController as StatsController;
12
  use ShortPixel\Controller\OtherMediaController as OtherMediaController;
13
  use ShortPixel\Helper\UiHelper as UiHelper;
14
 
 
 
 
15
  class BulkViewController extends \ShortPixel\ViewController
16
  {
17
 
@@ -46,7 +49,7 @@ class BulkViewController extends \ShortPixel\ViewController
46
 
47
  $this->view->error = true;
48
  $this->view->errorTitle = __('Missing API Key', 'shortpixel_image_optimiser');
49
- $this->view->errorContent = $adminNoticesController->getActivationNotice();
50
  $this->view->showError = 'key';
51
  }
52
  elseif ( ! $quota->hasQuota())
@@ -70,6 +73,16 @@ class BulkViewController extends \ShortPixel\ViewController
70
 
71
  }
72
 
 
 
 
 
 
 
 
 
 
 
73
  protected function getApproxData()
74
  {
75
  $otherMediaController = OtherMediaController::getInstance();
12
  use ShortPixel\Controller\OtherMediaController as OtherMediaController;
13
  use ShortPixel\Helper\UiHelper as UiHelper;
14
 
15
+ use ShortPixel\Model\AccessModel as AccessModel;
16
+
17
+
18
  class BulkViewController extends \ShortPixel\ViewController
19
  {
20
 
49
 
50
  $this->view->error = true;
51
  $this->view->errorTitle = __('Missing API Key', 'shortpixel_image_optimiser');
52
+ $this->view->errorContent = $this->getActivationNotice();
53
  $this->view->showError = 'key';
54
  }
55
  elseif ( ! $quota->hasQuota())
73
 
74
  }
75
 
76
+ // Double with ApiNotice . @todo Fix.
77
+ protected function getActivationNotice()
78
+ {
79
+ $message = "<p>" . __('In order to start the optimization process, you need to validate your API Key in the '
80
+ . '<a href="options-general.php?page=wp-shortpixel-settings">ShortPixel Settings</a> page in your WordPress Admin.','shortpixel-image-optimiser') . "
81
+ </p>
82
+ <p>" . __('If you don’t have an API Key, just fill out the form and a key will be created.','shortpixel-image-optimiser') . "</p>";
83
+ return $message;
84
+ }
85
+
86
  protected function getApproxData()
87
  {
88
  $otherMediaController = OtherMediaController::getInstance();
class/Controller/View/EditMediaViewController.php CHANGED
@@ -140,7 +140,7 @@ class EditMediaViewController extends \ShortPixel\ViewController
140
  $stats[] = array( sprintf(__('%s %s Read more about theses stats %s ', 'shortpixel-image-optimiser'), '
141
  <p><img alt=' . esc_html('Info Icon', 'shortpixel-image-optimiser') . ' src=' . esc_url( wpSPIO()->plugin_url('res/img/info-icon.png' )) . ' style="margin-bottom: -4px;"/>', '<a href="https://shortpixel.com/knowledge-base/article/553-the-stats-from-the-shortpixel-column-in-the-media-library-explained" target="_blank">', '</a></p>'), '');
142
  }
143
-
144
  return $stats;
145
  }
146
 
@@ -220,7 +220,7 @@ class EditMediaViewController extends \ShortPixel\ViewController
220
  {
221
  $backupFile = $imageObj->getBackupFile();
222
  $debugInfo[] = array(__('Backup Folder'), (string) $backupFile->getFileDir() );
223
- $debugInfo[] = array(__('Backup File'), (string) $backupFile . '(' . \ShortPixelTools::formatBytes($backupFile->getFileSize()) . ')' );
224
  }
225
  else {
226
  $debugInfo[] = array(__("No Main File Backup Available"), '');
@@ -229,10 +229,10 @@ class EditMediaViewController extends \ShortPixel\ViewController
229
  if ($or = $imageObj->hasOriginal())
230
  {
231
  $original = $imageObj->getOriginalFile();
232
- $debugInfo[] = array(__('Has Original File: '), $original->getFullPath() . '(' . \ShortPixelTools::formatBytes($original->getFileSize()) . ')');
233
  $orbackup = $original->getBackupFile();
234
  if ($orbackup)
235
- $debugInfo[] = array(__('Has Backup Original Image'), $orbackup->getFullPath() . '(' . \ShortPixelTools::formatBytes($orbackup->getFileSize()) . ')');
236
  $debugInfo[] = array('', '<hr>');
237
 
238
  }
140
  $stats[] = array( sprintf(__('%s %s Read more about theses stats %s ', 'shortpixel-image-optimiser'), '
141
  <p><img alt=' . esc_html('Info Icon', 'shortpixel-image-optimiser') . ' src=' . esc_url( wpSPIO()->plugin_url('res/img/info-icon.png' )) . ' style="margin-bottom: -4px;"/>', '<a href="https://shortpixel.com/knowledge-base/article/553-the-stats-from-the-shortpixel-column-in-the-media-library-explained" target="_blank">', '</a></p>'), '');
142
  }
143
+
144
  return $stats;
145
  }
146
 
220
  {
221
  $backupFile = $imageObj->getBackupFile();
222
  $debugInfo[] = array(__('Backup Folder'), (string) $backupFile->getFileDir() );
223
+ $debugInfo[] = array(__('Backup File'), (string) $backupFile . '(' . UiHelper::formatBytes($backupFile->getFileSize()) . ')' );
224
  }
225
  else {
226
  $debugInfo[] = array(__("No Main File Backup Available"), '');
229
  if ($or = $imageObj->hasOriginal())
230
  {
231
  $original = $imageObj->getOriginalFile();
232
+ $debugInfo[] = array(__('Has Original File: '), $original->getFullPath() . '(' . UiHelper::formatBytes($original->getFileSize()) . ')');
233
  $orbackup = $original->getBackupFile();
234
  if ($orbackup)
235
+ $debugInfo[] = array(__('Has Backup Original Image'), $orbackup->getFullPath() . '(' . UiHelper::formatBytes($orbackup->getFileSize()) . ')');
236
  $debugInfo[] = array('', '<hr>');
237
 
238
  }
class/Controller/View/OtherMediaViewController.php CHANGED
@@ -516,7 +516,7 @@ class OtherMediaViewController extends \ShortPixel\ViewController
516
  $date = new \DateTime();
517
  $date->setTimestamp($timestamp);
518
 
519
- $display_date = \ShortPixelTools::format_nice_date($date);
520
 
521
  return $display_date;
522
  }
516
  $date = new \DateTime();
517
  $date->setTimestamp($timestamp);
518
 
519
+ $display_date = UiHelper::formatDate($date);
520
 
521
  return $display_date;
522
  }
class/Helper/InstallHelper.php CHANGED
@@ -8,6 +8,8 @@ use ShortPixel\Controller\FileSystemController as FileSystemController;
8
  use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
9
  use ShortPixel\Controller\StatsController as StatsController;
10
  use ShortPixel\Controller\ApiKeyController as ApiKeyController;
 
 
11
 
12
  class InstallHelper
13
  {
@@ -21,7 +23,7 @@ class InstallHelper
21
  $env = wpSPIO()->env();
22
 
23
  if(\WPShortPixelSettings::getOpt('deliverWebp') == 3 && ! $env->is_nginx) {
24
- \ShortPixelTools::alterHtaccess(true,true); //add the htaccess lines
25
  }
26
 
27
  self::checkTables();
@@ -42,7 +44,7 @@ class InstallHelper
42
 
43
  if (! $env->is_nginx)
44
  {
45
- \ShortPixelTools::alterHtaccess(false, false);
46
  }
47
 
48
  // save remove.
@@ -112,7 +114,6 @@ class InstallHelper
112
  }
113
 
114
  $referrer_url = wp_get_referer();
115
- $conflict = \ShortPixelTools::getConflictingPlugins();
116
  $url = wp_get_referer();
117
  $plugin = (isset($_GET['plugin'])) ? sanitize_text_field(wp_unslash($_GET['plugin'])) : null; // our target.
118
 
8
  use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
9
  use ShortPixel\Controller\StatsController as StatsController;
10
  use ShortPixel\Controller\ApiKeyController as ApiKeyController;
11
+ use ShortPixel\Helper\UtilHelper as UtilHelper;
12
+
13
 
14
  class InstallHelper
15
  {
23
  $env = wpSPIO()->env();
24
 
25
  if(\WPShortPixelSettings::getOpt('deliverWebp') == 3 && ! $env->is_nginx) {
26
+ UtilHelper::alterHtaccess(true,true); //add the htaccess lines
27
  }
28
 
29
  self::checkTables();
44
 
45
  if (! $env->is_nginx)
46
  {
47
+ UtilHelper::alterHtaccess(false, false);
48
  }
49
 
50
  // save remove.
114
  }
115
 
116
  $referrer_url = wp_get_referer();
 
117
  $url = wp_get_referer();
118
  $plugin = (isset($_GET['plugin'])) ? sanitize_text_field(wp_unslash($_GET['plugin'])) : null; // our target.
119
 
class/Helper/UiHelper.php CHANGED
@@ -637,6 +637,26 @@ class UiHelper
637
  return $number;
638
  }
639
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
640
  protected static function convertImageTypeName($name, $type)
641
  {
642
  if ($type == 'webp')
637
  return $number;
638
  }
639
 
640
+ public static function formatDate( $date ) {
641
+
642
+ if ( '0000-00-00 00:00:00' === $date->format('Y-m-d ') ) {
643
+ $h_time = '';
644
+ } else {
645
+ $time = $date->format('U'); //get_post_time( 'G', true, $post, false );
646
+ if ( ( abs( $t_diff = time() - $time ) ) < DAY_IN_SECONDS ) {
647
+ if ( $t_diff < 0 ) {
648
+ $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );
649
+ } else {
650
+ $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );
651
+ }
652
+ } else {
653
+ $h_time = $date->format( 'Y/m/d' );
654
+ }
655
+ }
656
+
657
+ return $h_time;
658
+ }
659
+
660
  protected static function convertImageTypeName($name, $type)
661
  {
662
  if ($type == 'webp')
class/Helper/UtilHelper.php CHANGED
@@ -13,4 +13,128 @@ class UtilHelper
13
  return $wpdb->prefix . 'shortpixel_postmeta';
14
  }
15
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
16
  }
13
  return $wpdb->prefix . 'shortpixel_postmeta';
14
  }
15
 
16
+ public static function shortPixelIsPluginActive($plugin) {
17
+ $activePlugins = apply_filters( 'active_plugins', get_option( 'active_plugins', array()));
18
+ if ( is_multisite() ) {
19
+ $activePlugins = array_merge($activePlugins, get_site_option( 'active_sitewide_plugins'));
20
+ }
21
+ return in_array( $plugin, $activePlugins);
22
+ }
23
+
24
+ static public function timestampToDB($timestamp)
25
+ {
26
+ return date("Y-m-d H:i:s", $timestamp);
27
+ }
28
+
29
+ static public function DBtoTimestamp($date)
30
+ {
31
+ return strtotime($date);
32
+ }
33
+
34
+ public static function alterHtaccess($webp = false, $avif = false){
35
+ // [BS] Backward compat. 11/03/2019 - remove possible settings from root .htaccess
36
+ /* Plugin init is before loading these admin scripts. So it can happen misc.php is not yet loaded */
37
+ if (! function_exists('insert_with_markers'))
38
+ {
39
+ Log::addWarn('AlterHtaccess Called before WP init');
40
+ return;
41
+ //require_once( ABSPATH . 'wp-admin/includes/misc.php' );
42
+ }
43
+ $upload_dir = wp_upload_dir();
44
+ $upload_base = trailingslashit($upload_dir['basedir']);
45
+
46
+ if ( ! $webp && ! $avif ) {
47
+ insert_with_markers( get_home_path() . '.htaccess', 'ShortPixelWebp', '');
48
+ insert_with_markers( $upload_base . '.htaccess', 'ShortPixelWebp', '');
49
+ insert_with_markers( trailingslashit(WP_CONTENT_DIR) . '.htaccess', 'ShortPixelWebp', '');
50
+ } else {
51
+
52
+ $avif_rules = '
53
+ <IfModule mod_rewrite.c>
54
+ RewriteEngine On
55
+ ##### Directives for delivering AVIF files, if they exist #####
56
+ # Does the browser support avif?
57
+ RewriteCond %{HTTP_ACCEPT} image/avif
58
+ # AND is the request a jpg or png? (also grab the basepath %1 to match in the next rule)
59
+ RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
60
+ # AND does a .avif image exist?
61
+ RewriteCond %{DOCUMENT_ROOT}/%1.avif -f
62
+ # THEN send the avif image and set the env var avif
63
+ RewriteRule (.+)\.(?:jpe?g|png)$ $1.avif [NC,T=image/avif,E=avif,L]
64
+
65
+ # Does the browser support avif?
66
+ RewriteCond %{HTTP_ACCEPT} image/avif
67
+ # AND is the request a jpg or png? (also grab the basepath %1 to match in the next rule)
68
+ RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
69
+ # AND does a .jpg.avif image exist?
70
+ RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.avif -f
71
+ # THEN send the avif image and set the env var avif
72
+ RewriteRule ^(.+)$ $1.avif [NC,T=image/avif,E=avif,L]
73
+
74
+ </IfModule>
75
+ <IfModule mod_headers.c>
76
+ # If REDIRECT_avif env var exists, append Accept to the Vary header
77
+ Header append Vary Accept env=REDIRECT_avif
78
+ </IfModule>
79
+ <IfModule mod_mime.c>
80
+ AddType image/avif .avif
81
+ </IfModule>
82
+ ';
83
+
84
+ $webp_rules = '
85
+ <IfModule mod_rewrite.c>
86
+ RewriteEngine On
87
+ ##### TRY FIRST the file appended with .webp (ex. test.jpg.webp) #####
88
+ # Is the browser Chrome?
89
+ RewriteCond %{HTTP_USER_AGENT} Chrome [OR]
90
+ # OR Is request from Page Speed
91
+ RewriteCond %{HTTP_USER_AGENT} "Google Page Speed Insights" [OR]
92
+ # OR does this browser explicitly support webp
93
+ RewriteCond %{HTTP_ACCEPT} image/webp
94
+ # AND NOT MS EDGE 42/17 - doesnt work.
95
+ RewriteCond %{HTTP_USER_AGENT} !Edge/17
96
+ # AND is the request a jpg, png or gif?
97
+ RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
98
+ # AND does a .ext.webp image exist?
99
+ RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.webp -f
100
+ # THEN send the webp image and set the env var webp
101
+ RewriteRule ^(.+)$ $1.webp [NC,T=image/webp,E=webp,L]
102
+ ##### IF NOT, try the file with replaced extension (test.webp) #####
103
+ RewriteCond %{HTTP_USER_AGENT} Chrome [OR]
104
+ RewriteCond %{HTTP_USER_AGENT} "Google Page Speed Insights" [OR]
105
+ RewriteCond %{HTTP_ACCEPT} image/webp
106
+ RewriteCond %{HTTP_USER_AGENT} !Edge/17
107
+ # AND is the request a jpg, png or gif? (also grab the basepath %1 to match in the next rule)
108
+ RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
109
+ # AND does a .webp image exist?
110
+ RewriteCond %{DOCUMENT_ROOT}/%1.webp -f
111
+ # THEN send the webp image and set the env var webp
112
+ RewriteRule (.+)\.(?:jpe?g|png|gif)$ $1.webp [NC,T=image/webp,E=webp,L]
113
+ </IfModule>
114
+ <IfModule mod_headers.c>
115
+ # If REDIRECT_webp env var exists, append Accept to the Vary header
116
+ Header append Vary Accept env=REDIRECT_webp
117
+ </IfModule>
118
+ <IfModule mod_mime.c>
119
+ AddType image/webp .webp
120
+ </IfModule>
121
+ ' ;
122
+
123
+ $rules = '';
124
+ // if ($avif)
125
+ $rules .= $avif_rules;
126
+ // if ($webp)
127
+ $rules .= $webp_rules;
128
+
129
+ insert_with_markers( get_home_path() . '.htaccess', 'ShortPixelWebp', $rules);
130
+
131
+ /** In uploads and on, it needs Inherit. Otherwise things such as the 404 error page will not be loaded properly
132
+ * since the WP rewrite will not be active at that point (overruled) **/
133
+ $rules = str_replace('RewriteEngine On', 'RewriteEngine On' . PHP_EOL . 'RewriteOptions Inherit', $rules);
134
+
135
+ insert_with_markers( $upload_base . '.htaccess', 'ShortPixelWebp', $rules);
136
+ insert_with_markers( trailingslashit(WP_CONTENT_DIR) . '.htaccess', 'ShortPixelWebp', $rules);
137
+
138
+ }
139
+ }
140
  }
class/Model/AccessModel.php CHANGED
@@ -2,6 +2,7 @@
2
  namespace ShortPixel\Model;
3
 
4
  use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
 
5
 
6
  // Central place for user / access checking, roles etc.
7
  class AccessModel
@@ -80,6 +81,30 @@ class AccessModel
80
  return false;
81
  }
82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
 
84
  protected function user()
85
  {
2
  namespace ShortPixel\Model;
3
 
4
  use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
5
+ use ShortPixel\Controller\QuotaController as QuotaController;
6
 
7
  // Central place for user / access checking, roles etc.
8
  class AccessModel
81
  return false;
82
  }
83
 
84
+ public function isFeatureAvailable($name)
85
+ {
86
+ $available = true;
87
+
88
+ switch($name)
89
+ {
90
+ case 'avif':
91
+ $quotaControl = QuotaController::getInstance();
92
+ $quota = $quotaControl->getQuota();
93
+
94
+ if (property_exists($quota, 'unlimited') && $quota->unlimited === true)
95
+ {
96
+ $available = false;
97
+ }
98
+
99
+ break;
100
+ case 'webp':
101
+ default:
102
+
103
+ break;
104
+ }
105
+ return $available;
106
+ }
107
+
108
 
109
  protected function user()
110
  {
class/Model/AdminNoticeModel.php ADDED
@@ -0,0 +1,141 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model;
3
+ use ShortPixel\ShortPixelLogger\ShortPixelLogger as Log;
4
+ use ShortPixel\Notices\NoticeController as Notice;
5
+ use ShortPixel\Notices\NoticeController as Notices;
6
+
7
+
8
+ abstract class AdminNoticeModel
9
+ {
10
+ protected $key; // abstract
11
+ protected $notice;
12
+
13
+ protected $errorLevel = 'normal';
14
+ protected $suppress_delay = YEAR_IN_SECONDS;
15
+ protected $callback;
16
+
17
+ protected $include_screens = array();
18
+ protected $exclude_screens = array();
19
+
20
+ protected $data;
21
+
22
+ // No stuff loading here, low init
23
+ public function __construct()
24
+ {
25
+
26
+ }
27
+
28
+ // The main init, ty.
29
+ public function load()
30
+ {
31
+ $noticeController = Notices::getInstance();
32
+ $notice = $noticeController->getNoticeByID($this->key);
33
+
34
+ if (is_object($notice))
35
+ {
36
+ $this->notice = $notice;
37
+ }
38
+
39
+ if (is_object($notice) && $notice->isDismissed())
40
+ {
41
+ return;
42
+ }
43
+
44
+ if (is_null($this->notice) && $this->checkTrigger() === true)
45
+ {
46
+ $this->add();
47
+ }
48
+ }
49
+
50
+ public function getKey()
51
+ {
52
+ return $this->key;
53
+ }
54
+
55
+ public function reset($key = null)
56
+ {
57
+ $key = (is_null($key)) ? $this->key : $key;
58
+ Notices::removeNoticeByID($key);
59
+ }
60
+
61
+ // For when trigger condition is not applicable.
62
+ public function addManual($args = array())
63
+ {
64
+ foreach($args as $key => $val)
65
+ {
66
+ $this->addData($key, $val);
67
+ }
68
+ $this->add();
69
+ }
70
+
71
+ public function getNoticeObj()
72
+ {
73
+ return $this->notice; // can be null!
74
+ }
75
+
76
+ // Proxy for noticeModel dismissed
77
+ public function isDismissed()
78
+ {
79
+ $notice = $this->getNoticeObj();
80
+ if (is_null($notice) || $notice->isDismissed() === false)
81
+ return false;
82
+
83
+ return true;
84
+ }
85
+
86
+
87
+ protected function add()
88
+ {
89
+
90
+ switch ($this->errorLevel)
91
+ {
92
+ case 'warning':
93
+ $notice = Notices::addWarning($this->getMessage());
94
+ break;
95
+ case 'normal';
96
+ default:
97
+ $notice = Notices::addNormal($this->getMessage());
98
+
99
+ break;
100
+ }
101
+
102
+ /// Todo implement include / exclude screens here.
103
+ if (count($this->exclude_screens) > 0)
104
+ {
105
+ $notice->limitScreens('exclude', $this->exclude_screens);
106
+ }
107
+
108
+ if (count($this->include_screens) > 0)
109
+ {
110
+ $notice->limitScreens('include', $this->include_screens);
111
+ }
112
+
113
+ if (! is_null($this->callback))
114
+ Notices::makePersistent($notice, $this->key, $this->suppress_delay, $this->callback);
115
+ else
116
+ Notices::makePersistent($notice, $this->key, $this->suppress_delay);
117
+
118
+ $this->notice = $notice;
119
+ }
120
+
121
+ protected function addData($name, $value)
122
+ {
123
+ $this->data[$name] = $value;
124
+ }
125
+
126
+ protected function getData($name)
127
+ {
128
+ if (isset($this->data[$name]))
129
+ {
130
+ return $this->data[$name];
131
+ }
132
+ return false;
133
+ }
134
+
135
+ // ?? abstract proteced removeCondition();
136
+
137
+ abstract protected function checkTrigger();
138
+ abstract protected function getMessage();
139
+
140
+
141
+ }
class/Model/AdminNotices/ApiNotice.php ADDED
@@ -0,0 +1,40 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ class ApiNotice extends \ShortPixel\Model\AdminNoticeModel
5
+ {
6
+ protected $key = 'MSG_NO_APIKEY';
7
+
8
+ public function load()
9
+ {
10
+ $activationDate = \wpSPIO()->settings()->activationDate;
11
+ if (! $activationDate)
12
+ {
13
+ $activationDate = time();
14
+ \wpSPIO()->settings()->activationDate = $activationDate;
15
+ }
16
+
17
+ parent::load();
18
+ }
19
+
20
+ protected function checkTrigger()
21
+ {
22
+ if (\wpSPIO()->settings()->verifiedKey)
23
+ {
24
+ return false;
25
+ }
26
+
27
+ // If not key is verified.
28
+ return true;
29
+ }
30
+
31
+ protected function getMessage()
32
+ {
33
+ $message = "<p>" . __('To start the optimization process, you need to validate your API key on the '
34
+ . '<a href="options-general.php?page=wp-shortpixel-settings">ShortPixel Settings</a> page in your WordPress admin.','shortpixel-image-optimiser') . "
35
+ </p>
36
+ <p>" . __('If you do not have an API key yet, just fill out the form and a key will be created.','shortpixel-image-optimiser') . "</p>";
37
+
38
+ return $message;
39
+ }
40
+ }
class/Model/AdminNotices/ApiNoticeRepeat.php ADDED
@@ -0,0 +1,51 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
5
+
6
+ class ApiNoticeRepeat extends \ShortPixel\Model\AdminNoticeModel
7
+ {
8
+ protected $key = 'MSG_NO_APIKEY_REPEAT';
9
+ protected $errorLevel = 'warning';
10
+
11
+ protected function checkTrigger()
12
+ {
13
+ if (\wpSPIO()->settings()->verifiedKey)
14
+ {
15
+ return false;
16
+ }
17
+
18
+ // Is set by general ApiNotice. If not set, don't bother with the repeat.
19
+ $activationDate = \wpSPIO()->settings()->activationDate;
20
+ if (! $activationDate)
21
+ {
22
+ return false;
23
+ }
24
+
25
+ $controller = AdminNoticesController::getInstance();
26
+
27
+ $firstNotice = $controller->getNoticeByKey('MSG_NO_APIKEY');
28
+
29
+ // Check if first notice is there, and not dismissed, then don't repeat.
30
+ if ($firstNotice->isDismissed() === false)
31
+ {
32
+ return false;
33
+ }
34
+
35
+ // After 6 hours
36
+ if (time() < $activationDate + (6 * HOUR_IN_SECONDS))
37
+ {
38
+ return false;
39
+ }
40
+
41
+ // If not key is verified and first one is dismissed, and not this one.
42
+ return true;
43
+ }
44
+
45
+ protected function getMessage()
46
+ {
47
+ $message = __("Action required! Please <a href='https://shortpixel.com/wp-apikey' target='_blank'>get your API key</a> to activate your ShortPixel plugin.",'shortpixel-image-optimiser');
48
+
49
+ return $message;
50
+ }
51
+ }
class/Model/AdminNotices/ApiNoticeRepeatLong.php ADDED
@@ -0,0 +1,57 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
5
+
6
+ class ApiNoticeRepeatLong extends \ShortPixel\Model\AdminNoticeModel
7
+ {
8
+ protected $key = 'MSG_NO_APIKEY_REPEAT_LONG';
9
+ protected $errorLevel = 'warning';
10
+
11
+ protected function checkTrigger()
12
+ {
13
+ if (\wpSPIO()->settings()->verifiedKey)
14
+ {
15
+ return false;
16
+ }
17
+
18
+ // Is set by general ApiNotice. If not set, don't bother with the repeat.
19
+ $activationDate = \wpSPIO()->settings()->activationDate;
20
+ if (! $activationDate)
21
+ {
22
+ return false;
23
+ }
24
+
25
+ $controller = AdminNoticesController::getInstance();
26
+
27
+ // Check the original
28
+ $firstNotice = $controller->getNoticeByKey('MSG_NO_APIKEY');
29
+ if ($firstNotice->isDismissed() === false)
30
+ {
31
+ return false;
32
+ }
33
+
34
+ // Check the Repeat.
35
+ $secondNotice = $controller->getNoticeByKey('MSG_NO_APIKEY_REPEAT');
36
+ if ($secondNotice->isDismissed() === false)
37
+ {
38
+ return false;
39
+ }
40
+
41
+ // After 3 days.
42
+ if (time() < $activationDate + (3 * DAY_IN_SECONDS))
43
+ {
44
+ return false;
45
+ }
46
+
47
+ // If not key is verified and first one is dismissed, and not this one.
48
+ return true;
49
+ }
50
+
51
+ protected function getMessage()
52
+ {
53
+ $message = __("Your image gallery is not optimized. It takes 2 minutes to <a href='https://shortpixel.com/wp-apikey' target='_blank'>get your API key</a> and activate your ShortPixel plugin.",'shortpixel-image-optimiser') . "<BR><BR>";
54
+
55
+ return $message;
56
+ }
57
+ }
class/Model/AdminNotices/AvifNotice.php ADDED
@@ -0,0 +1,97 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ use \ShortPixel\Controller\CacheController as CacheController;
5
+
6
+ class AvifNotice extends \ShortPixel\Model\AdminNoticeModel
7
+ {
8
+ protected $key = 'MSG_AVIF_ERROR';
9
+ protected $errorLevel = 'error';
10
+
11
+ protected $error_message;
12
+ protected $error_detail;
13
+
14
+ protected function checkTrigger()
15
+ {
16
+ // No Automatic Trigger.
17
+ return false;
18
+ }
19
+
20
+ public function check()
21
+ {
22
+ $cache = new CacheController();
23
+ if (apply_filters('shortpixel/avifcheck/override', false) === true)
24
+ { return; }
25
+
26
+ if ($cache->getItem('avif_server_check')->exists() === false)
27
+ {
28
+ $url = \WPSPIO()->plugin_url('res/img/test.avif');
29
+ $headers = get_headers($url);
30
+ $is_error = true;
31
+
32
+ $this->addData('headers', $headers);
33
+ // Defaults.
34
+ $this->error_message = __('AVIF server test failed. Your server may not be configured to display AVIF files correctly. Serving AVIF might cause your images not to load. Check your images, disable the AVIF option, or update your web server configuration.', 'shortpixel-image-optimiser');
35
+ $this->error_detail = __('The request did not return valid HTTP headers. Check if the plugin is allowed to access ' . $url, 'shortpixel-image-optimiser');
36
+
37
+ $contentType = null;
38
+ $response = $headers[0];
39
+
40
+ if (is_array($headers) )
41
+ {
42
+ foreach($headers as $index => $header)
43
+ {
44
+ if ( strpos(strtolower($header), 'content-type') !== false )
45
+ {
46
+ // This is another header that can interrupt.
47
+ if (strpos(strtolower($header), 'x-content-type-options') === false)
48
+ {
49
+ $contentType = $header;
50
+ }
51
+ }
52
+ }
53
+
54
+ // http not ok, redirect etc. Shouldn't happen.
55
+ if (is_null($response) || strpos($response, '200') === false)
56
+ {
57
+ $this->error_detail = sprintf(__('AVIF check could not be completed because the plugin could not retrieve %s %s %s. %s Please check the security/firewall settings and try again', 'shortpixel-image-optimiser'), '<a href="' . $url . '">', $url, '</a>', '<br>');
58
+ }
59
+ elseif(is_null($contentType) || strpos($contentType, 'avif') === false)
60
+ {
61
+ $this->error_detail = sprintf(__('The required Content-type header for AVIF files was not found. Please check this with your hosting and/or CDN provider. For more details on how to fix this issue, %s see this article %s', 'shortpixel_image_optimiser'), '<a href="https://shortpixel.com/blog/avif-mime-type-delivery-apache-nginx/" target="_blank"> ', '</a>');
62
+
63
+ }
64
+ else
65
+ {
66
+ $is_error = false;
67
+ }
68
+ }
69
+
70
+ if ($is_error)
71
+ {
72
+ if (! is_null($this->notice) && ! $this->notice->isDismissed() === true)
73
+ {
74
+ $this->addManual();
75
+ }
76
+
77
+ }
78
+ else
79
+ {
80
+ $this->reset();
81
+
82
+ $item = $cache->getItem('avif_server_check');
83
+ $item->setValue(time());
84
+ $item->setExpires(MONTH_IN_SECONDS);
85
+ $cache->storeItemObject($item );
86
+ }
87
+ }
88
+
89
+ }
90
+
91
+ protected function getMessage()
92
+ {
93
+ $headers = $this->getData('headers');
94
+ $message = '<h4>' . $this->error_message . '</h4><p>' . $this->error_detail . '</p><p class="small">' . __('Returned headers for:<br>', 'shortpixel-image-optimiser') . print_r($headers, true) . '</p>';
95
+ return $message;
96
+ }
97
+ }
class/Model/AdminNotices/CompatNotice.php ADDED
@@ -0,0 +1,191 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ class CompatNotice extends \ShortPixel\Model\AdminNoticeModel
5
+ {
6
+ protected $key = 'MSG_COMPAT';
7
+ protected $errorLevel = 'warning';
8
+
9
+ protected function checkTrigger()
10
+ {
11
+ $conflictPlugins = $this->getConflictingPlugins();
12
+ if (count($conflictPlugins) > 0)
13
+ {
14
+ $this->addData('conflicts', $conflictPlugins);
15
+ return true;
16
+ }
17
+ else {
18
+ return false;
19
+ }
20
+ }
21
+
22
+ protected function getMessage()
23
+ {
24
+ // $conflicts = \ShortPixelTools::getConflictingPlugins();
25
+ $conflicts = $this->getData('conflicts');
26
+ if (! is_array($conflicts))
27
+ $conflicts = array();
28
+
29
+ $message = __("The following plugins are not compatible with ShortPixel and may cause unexpected results: ",'shortpixel-image-optimiser');
30
+ $message .= '<ul class="sp-conflict-plugins">';
31
+ foreach($conflicts as $plugin) {
32
+ //ShortPixelVDD($plugin);
33
+ $action = $plugin['action'];
34
+ $link = ( $action == 'Deactivate' )
35
+ ? wp_nonce_url( admin_url( 'admin-post.php?action=shortpixel_deactivate_conflict_plugin&plugin=' . urlencode( $plugin['path'] ) ), 'sp_deactivate_plugin_nonce' )
36
+ : $plugin['href'];
37
+ $message .= '<li class="sp-conflict-plugins-list"><strong>' . $plugin['name'] . '</strong>';
38
+ $message .= '<a href="' . $link . '" class="button button-primary">' . $action . '</a>';
39
+
40
+ if($plugin['details']) $message .= '<br>';
41
+ if($plugin['details']) $message .= '<span>' . $plugin['details'] . '</span>';
42
+ }
43
+ $message .= "</ul>";
44
+
45
+ return $message;
46
+ }
47
+
48
+ protected function getConflictingPlugins() {
49
+ $settings = \wpSPIO()->settings();
50
+
51
+ $conflictPlugins = array(
52
+ 'WP Smush - Image Optimization'
53
+ => array(
54
+ 'action'=>'Deactivate',
55
+ 'data'=>'wp-smushit/wp-smush.php',
56
+ 'page'=>'wp-smush-bulk'
57
+ ),
58
+ 'Imagify Image Optimizer'
59
+ => array(
60
+ 'action'=>'Deactivate',
61
+ 'data'=>'imagify/imagify.php',
62
+ 'page'=>'imagify'
63
+ ),
64
+ 'Compress JPEG & PNG images (TinyPNG)'
65
+ => array(
66
+ 'action'=>'Deactivate',
67
+ 'data'=>'tiny-compress-images/tiny-compress-images.php',
68
+ 'page'=>'tinify'
69
+ ),
70
+ 'Kraken.io Image Optimizer'
71
+ => array(
72
+ 'action'=>'Deactivate',
73
+ 'data'=>'kraken-image-optimizer/kraken.php',
74
+ 'page'=>'wp-krakenio'
75
+ ),
76
+ 'Optimus - WordPress Image Optimizer'
77
+ => array(
78
+ 'action'=>'Deactivate',
79
+ 'data'=>'optimus/optimus.php',
80
+ 'page'=>'optimus'
81
+ ),
82
+ 'Phoenix Media Rename' => array(
83
+ 'action' => 'Deactivate',
84
+ 'data' => 'phoenix-media-rename/phoenix-media-rename.php',
85
+ ),
86
+ 'EWWW Image Optimizer'
87
+ => array(
88
+ 'action'=>'Deactivate',
89
+ 'data'=>'ewww-image-optimizer/ewww-image-optimizer.php',
90
+ 'page'=>'ewww-image-optimizer%2F'
91
+ ),
92
+ 'EWWW Image Optimizer Cloud'
93
+ => array(
94
+ 'action'=>'Deactivate',
95
+ 'data'=>'ewww-image-optimizer-cloud/ewww-image-optimizer-cloud.php',
96
+ 'page'=>'ewww-image-optimizer-cloud%2F'
97
+ ),
98
+ 'ImageRecycle pdf & image compression'
99
+ => array(
100
+ 'action'=>'Deactivate',
101
+ 'data'=>'imagerecycle-pdf-image-compression/wp-image-recycle.php',
102
+ 'page'=>'option-image-recycle'
103
+ ),
104
+ 'CheetahO Image Optimizer'
105
+ => array(
106
+ 'action'=>'Deactivate',
107
+ 'data'=>'cheetaho-image-optimizer/cheetaho.php',
108
+ 'page'=>'cheetaho'
109
+ ),
110
+ 'Zara 4 Image Compression'
111
+ => array(
112
+ 'action'=>'Deactivate',
113
+ 'data'=>'zara-4/zara-4.php',
114
+ 'page'=>'zara-4'
115
+ ),
116
+ 'CW Image Optimizer'
117
+ => array(
118
+ 'action'=>'Deactivate',
119
+ 'data'=>'cw-image-optimizer/cw-image-optimizer.php',
120
+ 'page'=>'cw-image-optimizer'
121
+ ),
122
+ 'Simple Image Sizes'
123
+ => array(
124
+ 'action'=>'Deactivate',
125
+ 'data'=>'simple-image-sizes/simple_image_sizes.php'
126
+ ),
127
+ 'Regenerate Thumbnails and Delete Unused'
128
+ => array(
129
+ 'action' => 'Deactivate',
130
+ 'data' => 'regenerate-thumbnails-and-delete-unused/regenerate_wpregenerate.php',
131
+ ),
132
+ 'Swift Performance'
133
+ => array(
134
+ 'action' => 'Deactivate',
135
+ 'data' => 'swift-performance/performance.php',
136
+ ),
137
+ 'Swift Performance Lite'
138
+ => array(
139
+ 'action' => 'Deactivate',
140
+ 'data' => 'swift-performance-lite/performance.php',
141
+ ),
142
+ //DEACTIVATED TEMPORARILY - it seems that the customers get scared.
143
+ /* 'Jetpack by WordPress.com - The Speed up image load times Option'
144
+ => array(
145
+ 'action'=>'Change Setting',
146
+ 'data'=>'jetpack/jetpack.php',
147
+ 'href'=>'admin.php?page=jetpack#/settings'
148
+ )
149
+ */
150
+ );
151
+ if($settings->processThumbnails) {
152
+ $details = __('Details: recreating image files may require re-optimization of the resulting thumbnails, even if they were previously optimized. Please use <a href="https://wordpress.org/plugins/regenerate-thumbnails-advanced/" target="_blank">reGenerate Thumbnails Advanced</a> instead.','shortpixel-image-optimiser');
153
+
154
+ $conflictPlugins = array_merge($conflictPlugins, array(
155
+ 'Regenerate Thumbnails'
156
+ => array(
157
+ 'action'=>'Deactivate',
158
+ 'data'=>'regenerate-thumbnails/regenerate-thumbnails.php',
159
+ 'page'=>'regenerate-thumbnails',
160
+ 'details' => $details
161
+ ),
162
+ 'Force Regenerate Thumbnails'
163
+ => array(
164
+ 'action'=>'Deactivate',
165
+ 'data'=>'force-regenerate-thumbnails/force-regenerate-thumbnails.php',
166
+ 'page'=>'force-regenerate-thumbnails',
167
+ 'details' => $details
168
+ )
169
+ ));
170
+ }
171
+
172
+
173
+ $found = array();
174
+ foreach($conflictPlugins as $name => $path) {
175
+ $action = ( isset($path['action']) ) ? $path['action'] : null;
176
+ $data = ( isset($path['data']) ) ? $path['data'] : null;
177
+ $href = ( isset($path['href']) ) ? $path['href'] : null;
178
+ $page = ( isset($path['page']) ) ? $path['page'] : null;
179
+ $details = ( isset($path['details']) ) ? $path['details'] : null;
180
+ if(is_plugin_active($data)) {
181
+ if( $data == 'jetpack/jetpack.php' ){
182
+ $jetPackPhoton = get_option('jetpack_active_modules') ? in_array('photon', get_option('jetpack_active_modules')) : false;
183
+ if( !$jetPackPhoton ){ continue; }
184
+ }
185
+ $found[] = array( 'name' => $name, 'action'=> $action, 'path' => $data, 'href' => $href , 'page' => $page, 'details' => $details);
186
+ }
187
+ }
188
+ return $found;
189
+ }
190
+
191
+ }
class/Model/AdminNotices/LegacyNotice.php ADDED
@@ -0,0 +1,30 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ class LegacyNotice extends \ShortPixel\Model\AdminNoticeModel
5
+ {
6
+ protected $key = 'MSG_CONVERT_LEGACY';
7
+
8
+ protected function checkTrigger()
9
+ {
10
+ return false;
11
+ }
12
+
13
+ protected function getMessage()
14
+ {
15
+ $message = '<p><strong>' . __('ShortPixel has found items in the media library with an outdated optimization format!', 'shortpixel-image-optimiser') . '</strong></p>';
16
+
17
+ $message .= '<p>' . __('Prior to version 5.0, a different format was used to store ShortPixel optimization information. ShortPixel automatically migrates the media library items to the new format when they are opened. %s Please check if your images contain the optimization information after migration. %s Read more %s', 'shortpixel-image-optimiser') . '</p>';
18
+
19
+ $message .= '<p>' . __('It is recommended to migrate all items to the modern format by clicking the button below.', 'shortpixel-image-optimser') . '</p>';
20
+ $message .= '<p><a href="%s" class="button button-primary">%s</a></p>';
21
+
22
+ $read_link = esc_url('https://shortpixel.com/knowledge-base/article/539-spio-5-tells-me-to-convert-legacy-data-what-is-this');
23
+ $action_link = esc_url(admin_url('upload.php?page=wp-short-pixel-bulk&panel=bulk-migrate'));
24
+ $action_name = __('Migrate optimization data', 'shortpixel-image-optimiser');
25
+
26
+ $message = sprintf($message, '<br>', '<a href="' . $read_link . '" target="_blank">', '</a>', $action_link, $action_name);
27
+
28
+ return $message;
29
+ }
30
+ }
class/Model/AdminNotices/ListviewNotice.php ADDED
@@ -0,0 +1,60 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ class ListviewNotice extends \ShortPixel\Model\AdminNoticeModel
5
+ {
6
+ protected $key = 'MSG_LISTVIEW_ACTIVE';
7
+
8
+ public function __construct()
9
+ {
10
+ $this->include_screens[] = 'upload';
11
+ parent::__construct();
12
+ }
13
+
14
+ protected function checkTrigger()
15
+ {
16
+ // Don't check for this, when not on this screen.
17
+ $screen_id = \wpSPIO()->env()->screen_id;
18
+ if ($screen_id !== 'upload')
19
+ {
20
+ return false;
21
+ }
22
+
23
+ if (! function_exists('wp_get_current_user') )
24
+ {
25
+ return false;
26
+
27
+ }
28
+
29
+ $current_user = wp_get_current_user();
30
+ $currentUserID = $current_user->ID;
31
+ $viewMode = get_user_meta($currentUserID, "wp_media_library_mode", true);
32
+
33
+ if ($viewMode === "" || strlen($viewMode) == 0)
34
+ {
35
+ // If nothing is set, set it for them.
36
+ update_user_meta($currentUserID, 'wp_media_library_mode', 'list');
37
+ return false;
38
+ }
39
+ elseif ($viewMode !== "list")
40
+ {
41
+ return true;
42
+ }
43
+ else
44
+ {
45
+ if (is_object($this->getNoticeObj()))
46
+ $this->reset();
47
+ }
48
+
49
+ }
50
+
51
+
52
+ protected function getMessage()
53
+ {
54
+
55
+ $message = sprintf(__('You can see the actions and data of ShortPixel Image Optimiser only through the list view. Switch to the list view to use the plugin via the media library. Click to%s switch to the list view%s now. ', 'shortpixel-image-optimiser'), '<a href="' . admin_url('upload.php?mode=list') . '">','</a>');
56
+
57
+ return $message;
58
+
59
+ }
60
+ }
class/Model/AdminNotices/NextgenNotice.php ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ class NextgenNotice extends \ShortPixel\Model\AdminNoticeModel
5
+ {
6
+ protected $key = 'MSG_INTEGRATION_NGGALLERY';
7
+
8
+ protected function checkTrigger()
9
+ {
10
+
11
+ $settings = \wpSPIO()->settings();
12
+
13
+ if (! $settings->verifiedKey)
14
+ {
15
+ return false; // no key, no integrations.
16
+ }
17
+
18
+ if (\wpSPIO()->env()->has_nextgen && ! $settings->includeNextGen)
19
+ {
20
+ return true;
21
+ }
22
+
23
+ return false;
24
+ }
25
+
26
+ protected function getMessage()
27
+ {
28
+ $url = esc_url(admin_url('options-general.php?page=wp-shortpixel-settings&part=adv-settings'));
29
+ $message = sprintf(__('You seem to be using NextGen Gallery. You can optimize your galleries with ShortPixel, but this is not currently enabled. To enable it, %sgo to settings and enable%s it!', 'shortpixel_image_optimiser'), '<a href="' . $url . '">', '</a>');
30
+
31
+ return $message;
32
+
33
+ }
34
+ }
class/Model/AdminNotices/QuotaNoticeMonth.php ADDED
@@ -0,0 +1,99 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+ use ShortPixel\Controller\StatsController as StatsController;
4
+ use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
5
+ use ShortPixel\Controller\QuotaController as QuotaController;
6
+
7
+ class QuotaNoticeMonth extends \ShortPixel\Model\AdminNoticeModel
8
+ {
9
+ protected $key = 'MSG_UPGRADE_MONTH';
10
+
11
+ public function load()
12
+ {
13
+ $this->callback = array(AdminNoticesController::getInstance(), 'proposeUpgradePopup');
14
+ parent::load();
15
+ }
16
+
17
+ protected function checkTrigger()
18
+ {
19
+ $quotaController = QuotaController::getInstance();
20
+
21
+ if ($quotaController->hasQuota() === false)
22
+ return false;
23
+
24
+ $quotaData = $quotaController->getQuota();
25
+
26
+ if ($this->monthlyUpgradeNeeded($quotaData) === false)
27
+ return false;
28
+
29
+ $this->addData('average', $this->getMonthAverage());
30
+ $this->addData('month_total', $quotaData->monthly->total);
31
+ $this->addData('onetime_remaining', $quotaData->onetime->remaining);
32
+
33
+ }
34
+
35
+ protected function getMessage()
36
+ {
37
+ $quotaController = QuotaController::getInstance();
38
+
39
+ $quotaData = $quotaController->getQuota();
40
+ $average = $this->getMonthAverage(); // $this->getData('average');
41
+ $month_total = $quotaData->monthly->total;// $this->getData('month_total');
42
+ $onetime_remaining = $quotaData->onetime->remaining; //$this->getData('onetime_remaining'); */
43
+
44
+ $message = '<p>' . sprintf(__("You add an average of <strong>%d images and thumbnails</strong> to your Media Library every month and you have <strong>a plan of %d images/month (and %d one-time images)</strong>.%s"
45
+ . " You may need to upgrade your plan to have all your images optimized.", 'shortpixel-image-optimiser'), $average, $month_total, $onetime_remaining, '<br>') . '</p>';
46
+
47
+ $message .= ' <button class="button button-primary" id="shortpixel-upgrade-advice" onclick="ShortPixel.proposeUpgrade()" style="margin-right:10px;"><strong>' . __('Show me the best available options', 'shortpixel-image-optimiser') . '</strong></button>';
48
+
49
+ return $message;
50
+ }
51
+
52
+ protected function CheckUpgradeNeeded($quotaData)
53
+ {
54
+ if (isset($quotaData->monthly->total) && !$quotaData->unlimited)
55
+ {
56
+ $monthAvg = $this->getMonthAvg($quotaData);
57
+ // +20 I suspect to not trigger on very low values of monthly use(?)
58
+ $threshold = $quotaData->monthly->total + ($quotaData->onetime->remaining / 6 ) +20;
59
+
60
+ if ($monthAvg > $threshold)
61
+ {
62
+ return true;
63
+ }
64
+ }
65
+ return false;
66
+ }
67
+
68
+ protected function getMonthAverage() {
69
+ $stats = StatsController::getInstance();
70
+
71
+ // Count how many months have some optimized images.
72
+ for($i = 4, $count = 0; $i>=1; $i--) {
73
+ if($count == 0 && $stats->find('period', 'months', $i) == 0)
74
+ {
75
+ continue;
76
+ }
77
+ $count++;
78
+
79
+ }
80
+ // Sum last 4 months, and divide by number of active months to get number of avg per active month.
81
+ return ($stats->find('period', 'months', 1) + $stats->find('period', 'months', 2) + $stats->find('period', 'months', 3) + $stats->find('period', 'months', 4) / max(1,$count));
82
+ }
83
+
84
+ protected function monthlyUpgradeNeeded($quotaData)
85
+ {
86
+ if (isset($quotaData->monthly->total))
87
+ {
88
+ $monthAvg = $this->getMonthAverage($quotaData);
89
+ // +20 I suspect to not trigger on very low values of monthly use(?)
90
+ $threshold = $quotaData->monthly->total + ($quotaData->onetime->remaining / 6 ) +20;
91
+
92
+ if ($monthAvg > $threshold)
93
+ {
94
+ return true;
95
+ }
96
+ }
97
+ return false;
98
+ }
99
+ } // class
class/Model/AdminNotices/QuotaNoticeReached.php ADDED
@@ -0,0 +1,106 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+ use ShortPixel\Controller\StatsController as StatsController;
4
+ use ShortPixel\Controller\ApiKeyController as ApiKeyController;
5
+ use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
6
+ use ShortPixel\Controller\QuotaController as QuotaController;
7
+
8
+
9
+ class QuotaNoticeReached extends \ShortPixel\Model\AdminNoticeModel
10
+ {
11
+ protected $key = 'MSG_QUOTA_REACHED';
12
+ protected $errorLevel = 'error';
13
+
14
+
15
+ public function load()
16
+ {
17
+ $this->callback = array(AdminNoticesController::getInstance(), 'proposeUpgradePopup');
18
+ parent::load();
19
+ }
20
+
21
+ protected function checkTrigger()
22
+ {
23
+ $quotaController = QuotaController::getInstance();
24
+
25
+ if ($quotaController->hasQuota() === true)
26
+ return false;
27
+
28
+ // $quotaData = $quotaController->getQuota();
29
+
30
+ $this->reset('MSG_UPGRADE_MONTH');
31
+ $this->reset('MSG_UPGRADE_BULK');
32
+ return true;
33
+
34
+ }
35
+
36
+ protected function getMessage()
37
+ {
38
+ $statsControl = StatsController::getInstance();
39
+ $averageCompression = $statsControl->getAverageCompression();
40
+ $quotaController = QuotaController::getInstance();
41
+
42
+ $keyControl = ApiKeyController::getInstance();
43
+
44
+ //$keyModel->loadKey();
45
+
46
+ $login_url = 'https://shortpixel.com/login/';
47
+ $friend_url = $login_url;
48
+
49
+ if ($keyControl->getKeyForDisplay())
50
+ {
51
+ $login_url .= $keyControl->getKeyForDisplay() . '/';
52
+ $friend_url = $login_url . 'tell-a-friend';
53
+ }
54
+
55
+ $message = '<div class="sp-quota-exceeded-alert" id="short-pixel-notice-exceed">';
56
+
57
+ if($averageCompression) {
58
+
59
+ $message .= '<div style="float:right;">
60
+ <div class="bulk-progress-indicator" style="height: 110px">
61
+ <div style="margin-bottom:5px">' . __('Average image<br>reduction until now:','shortpixel-image-optimiser') . '</div>
62
+ <div id="sp-avg-optimization"><input type="text" id="sp-avg-optimization-dial" value="' . round($averageCompression) . '" class="dial percentDial" data-dialsize="60"></div>
63
+ <script>
64
+ jQuery(function() {
65
+ if (ShortPixel)
66
+ {
67
+ ShortPixel.percentDial("#sp-avg-optimization-dial", 60);
68
+ }
69
+ });
70
+ </script>
71
+ </div>
72
+ </div>';
73
+
74
+ }
75
+
76
+ $message .= '<h3>' . __('Quota Exceeded','shortpixel-image-optimiser') . '</h3>';
77
+
78
+ $quota = $quotaController->getQuota();
79
+
80
+ $creditsUsed = number_format($quota->monthly->consumed + $quota->onetime->consumed);
81
+ $totalOptimized = $statsControl->find('total', 'images');
82
+ $totalImagesToOptimize = number_format($statsControl->totalImagesToOptimize());
83
+
84
+ $message .= '<p>' . sprintf(__('The plugin has optimized <strong>%s images</strong> and has been stopped because it has reached the available quota limit.','shortpixel-image-optimiser'),
85
+ $creditsUsed);
86
+
87
+ if($totalImagesToOptimize > 0) {
88
+
89
+ $message .= sprintf(__('<strong> %s images and thumbnails</strong> have not been optimized by ShortPixel yet.','shortpixel-image-optimiser'), $totalImagesToOptimize );
90
+ }
91
+
92
+ $message .= '</p>
93
+ <div>
94
+ <button class="button button-primary" type="button" id="shortpixel-upgrade-advice" onclick="ShortPixel.proposeUpgrade()" style="margin-right:10px;"><strong>' . __('Show me the best available options', 'shortpixel-image-optimiser') . '</strong></button>
95
+ <a class="button button-primary" href="' . $login_url . '"
96
+ title="' . __('Go to My Account and choose a plan','shortpixel-image-optimiser') . '" target="_blank" style="margin-right:10px;">
97
+ <strong>' . __('Upgrade','shortpixel-image-optimiser') . '</strong>
98
+ </a>
99
+ <button type="button" name="checkQuota" class="button" onclick="ShortPixel.checkQuota()">'. __('Confirm new credits','shortpixel-image-optimiser') . '</button>
100
+ </div>';
101
+
102
+ $message .= '</div>'; /// closing div
103
+ return $message;
104
+ }
105
+
106
+ }
class/Model/AdminNotices/SmartcropNotice.php ADDED
@@ -0,0 +1,49 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ class SmartcropNotice extends \ShortPixel\Model\AdminNoticeModel
5
+ {
6
+ protected $key = 'MSG_FEATURE_SMARTCROP';
7
+
8
+ public function __construct()
9
+ {
10
+ $this->exclude_screens[] = 'settings_page_wp-shortpixel-settings';
11
+ parent::__construct();
12
+ }
13
+
14
+ protected function checkTrigger()
15
+ {
16
+
17
+ $settings = \wpSPIO()->settings();
18
+
19
+ if (! $settings->verifiedKey)
20
+ {
21
+ return false; // no key, no integrations.
22
+ }
23
+
24
+ if (\wpSPIO()->env()->has_nextgen && ! $settings->includeNextGen)
25
+ {
26
+ return true;
27
+ }
28
+
29
+ return false;
30
+ }
31
+
32
+ protected function getMessage()
33
+ {
34
+ $link = 'https://shortpixel.com/knowledge-base/article/182-what-is-smart-cropping';
35
+ $link2 = 'https://shortpixel.com/blog/how-to-smart-crop-wordpress-images/#how-to-crop-wordpress-images-automatically-smart-solution';
36
+ $link3 = esc_url(admin_url('options-general.php?page=wp-shortpixel-settings'));
37
+
38
+ $message = sprintf(__('%s With ShortPixel you can now %ssmartly crop%s thumbnails on your website. This is especially useful for eCommerce websites %s(read more)%s. %s %s Enable the option on the %sShortPixel Settings%s page. %s', 'shortpixel-image-optimiser'),
39
+ '<p>' ,
40
+ '<a href="' . $link . '" target="_blank">', '</a>',
41
+ '<a href="' . $link2 . '" target="_blank">', '</a>',
42
+ '</p>', '<p>',
43
+ '<a href="' . $link3 . '" >', '</a>',
44
+ '</p>'
45
+ );
46
+ return $message;
47
+
48
+ }
49
+ }
class/Model/AdminNotices/UnlistedNotice.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel\Model\AdminNotices;
3
+
4
+ class UnlistedNotice extends \ShortPixel\Model\AdminNoticeModel
5
+ {
6
+
7
+ protected $key = 'MSG_UNLISTED_FOUND';
8
+
9
+ protected function checkTrigger()
10
+ {
11
+ return false;
12
+ }
13
+
14
+ // @todo This message is not properly stringF'ed.
15
+ protected function getMessage()
16
+ {
17
+ $settings = \wpSPIO()->settings();
18
+
19
+ //$unlisted = isset($settings->currentStats['foundUnlistedThumbs']) ? $settings->currentStats['foundUnlistedThumbs'] : null;
20
+ $unlisted_id = $this->getData('id');
21
+ $unlisted_name = $this->getData('name');
22
+ $unlistedFiles = (is_array($this->getData('filelist'))) ? $this->getData('filelist') : array();
23
+
24
+ $admin_url = esc_url(admin_url('options-general.php?page=wp-shortpixel-settings&part=adv-settings'));
25
+
26
+
27
+ $message = __("<p>ShortPixel has found thumbnails that are not registered in the metadata, but are present alongside the other thumbnails. These thumbnails could be created and needed by a plugin or the theme. Let ShortPixel optimize them too?</p>", 'shortpixel-image-optimiser');
28
+ $message .= '<p>' . __("For example, the image", 'shortpixel-image-optimiser') . '
29
+ <a href="post.php?post=' . $unlisted_id . '&action=edit" target="_blank">
30
+ ' . $unlisted_name . '
31
+ </a> also has these thumbnails that are not listed in the metadata: ' . (implode(', ', $unlistedFiles)) . '
32
+ </p>';
33
+
34
+ $message .= '<p>' . sprintf(__('You can enable optimizing %s Unlisted Images %s in the %s settings %s', 'shortpixel-image-optimiser'), '<b>', '</b>', '<a href="'. $admin_url . '">','</a>') . '</p>';
35
+
36
+ return $message;
37
+
38
+ }
39
+ }
class/Model/EnvironmentModel.php CHANGED
@@ -224,8 +224,6 @@ class EnvironmentModel extends \ShortPixel\Model
224
  $this->has_nextgen = $ng->has_nextgen();
225
  }
226
 
227
-
228
-
229
  //set default move as "list". only set once, it won't try to set the default mode again.
230
  public function setDefaultViewModeList()
231
  {
224
  $this->has_nextgen = $ng->has_nextgen();
225
  }
226
 
 
 
227
  //set default move as "list". only set once, it won't try to set the default mode again.
228
  public function setDefaultViewModeList()
229
  {
class/Model/File/DirectoryModel.php CHANGED
@@ -32,7 +32,7 @@ class DirectoryModel extends \ShortPixel\Model
32
  */
33
  public function __construct($path)
34
  {
35
- $path = wp_normalize_path($path);
36
  $fs = \wpSPIO()->filesystem();
37
 
38
  if ($fs->pathIsUrl($path))
32
  */
33
  public function __construct($path)
34
  {
35
+ //$path = wp_normalize_path($path);
36
  $fs = \wpSPIO()->filesystem();
37
 
38
  if ($fs->pathIsUrl($path))
class/Model/File/FileModel.php CHANGED
@@ -17,6 +17,7 @@ class FileModel extends \ShortPixel\Model
17
 
18
  // File info
19
  protected $fullpath = null;
 
20
  protected $filename = null; // filename + extension
21
  protected $filebase = null; // filename without extension
22
  protected $directory = null;
@@ -42,6 +43,7 @@ class FileModel extends \ShortPixel\Model
42
  public function __construct($path)
43
  {
44
  $this->fullpath = trim($path);
 
45
  $fs = \wpSPIO()->filesystem();
46
  if ($fs->pathIsUrl($path)) // Asap check for URL's to prevent remote wrappers from running.
47
  {
@@ -382,7 +384,7 @@ class FileModel extends \ShortPixel\Model
382
  // So far, testing use for file Filter */
383
  public function getRawFullPath()
384
  {
385
- return $this->fullpath;
386
  }
387
 
388
  public function getFileName()
@@ -479,7 +481,7 @@ class FileModel extends \ShortPixel\Model
479
  if ($path === false) // don't process further
480
  return false;
481
 
482
- $path = wp_normalize_path($path);
483
  $abspath = $fs->getWPAbsPath();
484
 
485
  if ( is_file($path) && ! is_dir($path) ) // if path and file exist, all should be okish.
17
 
18
  // File info
19
  protected $fullpath = null;
20
+ protected $rawfullpath = null;
21
  protected $filename = null; // filename + extension
22
  protected $filebase = null; // filename without extension
23
  protected $directory = null;
43
  public function __construct($path)
44
  {
45
  $this->fullpath = trim($path);
46
+ $this->rawfullpath = $this->fullpath;
47
  $fs = \wpSPIO()->filesystem();
48
  if ($fs->pathIsUrl($path)) // Asap check for URL's to prevent remote wrappers from running.
49
  {
384
  // So far, testing use for file Filter */
385
  public function getRawFullPath()
386
  {
387
+ return $this->rawfullpath;
388
  }
389
 
390
  public function getFileName()
481
  if ($path === false) // don't process further
482
  return false;
483
 
484
+ // $path = wp_normalize_path($path);
485
  $abspath = $fs->getWPAbsPath();
486
 
487
  if ( is_file($path) && ! is_dir($path) ) // if path and file exist, all should be okish.
class/Model/Image/CustomImageModel.php CHANGED
@@ -2,6 +2,7 @@
2
  namespace ShortPixel\Model\Image;
3
  use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
4
  use ShortPixel\Controller\OptimizeController as OptimizeController;
 
5
 
6
  use ShortPixel\Controller\ApiController as API;
7
 
@@ -208,11 +209,17 @@ class CustomImageModel extends \ShortPixel\Model\Image\ImageModel
208
 
209
  }
210
 
211
- public function restore()
212
  {
213
  do_action('shortpixel_before_restore_image', $this->get('id'));
214
  do_action('shortpixel/image/before_restore', $this);
215
 
 
 
 
 
 
 
216
  $bool = parent::restore();
217
 
218
  $return = true;
@@ -238,7 +245,10 @@ class CustomImageModel extends \ShortPixel\Model\Image\ImageModel
238
  $return = false;
239
  }
240
 
241
- $this->dropFromQueue();
 
 
 
242
  do_action('shortpixel/image/after_restore', $this, $this->id, $bool);
243
 
244
  return $return;
@@ -329,10 +339,10 @@ class CustomImageModel extends \ShortPixel\Model\Image\ImageModel
329
 
330
  //$metaObj->has_backup = (intval($imagerow->backup) == 1) ? true : false;
331
 
332
- $addedDate = \ShortPixelTools::DBtoTimestamp($imagerow->ts_added);
333
  $metaObj->tsAdded = $addedDate;
334
 
335
- $optimizedDate = \ShortPixelTools::DBtoTimestamp($imagerow->ts_optimized);
336
  $metaObj->tsOptimized = $optimizedDate;
337
 
338
  $extraInfo = property_exists($imagerow, 'extra_info') ? $imagerow->extra_info : null;
@@ -480,8 +490,8 @@ class CustomImageModel extends \ShortPixel\Model\Image\ImageModel
480
  'status' => $metaObj->status,
481
  'retries' => 0, // this is unused / legacy
482
  'message' => $message, // this is used for improvement line.
483
- 'ts_added' => \ShortPixelTools::timestampToDB($metaObj->tsAdded),
484
- 'ts_optimized' => \ShortPixelTools::timestampToDB($metaObj->tsOptimized),
485
  'path' => $this->getFullPath(),
486
  'name' => $this->getFileName(),
487
  'path_md5' => md5($this->getFullPath()), // this is legacy
2
  namespace ShortPixel\Model\Image;
3
  use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
4
  use ShortPixel\Controller\OptimizeController as OptimizeController;
5
+ use ShortPixel\Helper\UtilHelper as UtilHelper;
6
 
7
  use ShortPixel\Controller\ApiController as API;
8
 
209
 
210
  }
211
 
212
+ public function restore($args = array())
213
  {
214
  do_action('shortpixel_before_restore_image', $this->get('id'));
215
  do_action('shortpixel/image/before_restore', $this);
216
 
217
+ $defaults = array(
218
+ 'keep_in_queue' => false, // used for bulk restore.
219
+ );
220
+
221
+ $args = wp_parse_args($args, $defaults);
222
+
223
  $bool = parent::restore();
224
 
225
  $return = true;
245
  $return = false;
246
  }
247
 
248
+ if ($args['keep_in_queue'] === false)
249
+ {
250
+ $this->dropFromQueue();
251
+ }
252
  do_action('shortpixel/image/after_restore', $this, $this->id, $bool);
253
 
254
  return $return;
339
 
340
  //$metaObj->has_backup = (intval($imagerow->backup) == 1) ? true : false;
341
 
342
+ $addedDate = UtilHelper::DBtoTimestamp($imagerow->ts_added);
343
  $metaObj->tsAdded = $addedDate;
344
 
345
+ $optimizedDate = UtilHelper::DBtoTimestamp($imagerow->ts_optimized);
346
  $metaObj->tsOptimized = $optimizedDate;
347
 
348
  $extraInfo = property_exists($imagerow, 'extra_info') ? $imagerow->extra_info : null;
490
  'status' => $metaObj->status,
491
  'retries' => 0, // this is unused / legacy
492
  'message' => $message, // this is used for improvement line.
493
+ 'ts_added' => UtiHelper::timestampToDB($metaObj->tsAdded),
494
+ 'ts_optimized' => UtilHelper::timestampToDB($metaObj->tsOptimized),
495
  'path' => $this->getFullPath(),
496
  'name' => $this->getFileName(),
497
  'path_md5' => md5($this->getFullPath()), // this is legacy
class/Model/Image/ImageModel.php CHANGED
@@ -5,7 +5,8 @@ use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
5
  use ShortPixel\Controller\ResponseController as ResponseController;
6
  use ShortPixel\Controller\ApiController as API;
7
 
8
- use \Shortpixel\Model\File\FileModel as FileModel;
 
9
  /* ImageModel class.
10
  *
11
  *
@@ -143,6 +144,11 @@ abstract class ImageModel extends \ShortPixel\Model\File\FileModel
143
  {
144
  $settings = \WPSPIO()->settings();
145
 
 
 
 
 
 
146
  // Pdf, no special files.
147
  if ($this->getExtension() == 'pdf')
148
  return false;
@@ -631,10 +637,6 @@ abstract class ImageModel extends \ShortPixel\Model\File\FileModel
631
  $this->setMeta('resize', false);
632
  }
633
 
634
-
635
- /*if ($tempFile)
636
- $tempFile->delete();
637
- */
638
  if (isset($wasHeic) && $wasHeic == true)
639
  {
640
  $heicFile = $fs->getFile($heicPath);
@@ -643,8 +645,6 @@ abstract class ImageModel extends \ShortPixel\Model\File\FileModel
643
  $heicFile->delete(); // the original heic -file should not linger in uploads.
644
  }
645
  }
646
-
647
-
648
  }
649
  else
650
  {
5
  use ShortPixel\Controller\ResponseController as ResponseController;
6
  use ShortPixel\Controller\ApiController as API;
7
 
8
+ use Shortpixel\Model\File\FileModel as FileModel;
9
+ use ShortPixel\Model\AccessModel as AccessModel;
10
  /* ImageModel class.
11
  *
12
  *
144
  {
145
  $settings = \WPSPIO()->settings();
146
 
147
+ if ( AccessModel::getInstance()->isFeatureAvailable($type) === false)
148
+ {
149
+ return false;
150
+ }
151
+
152
  // Pdf, no special files.
153
  if ($this->getExtension() == 'pdf')
154
  return false;
637
  $this->setMeta('resize', false);
638
  }
639
 
 
 
 
 
640
  if (isset($wasHeic) && $wasHeic == true)
641
  {
642
  $heicFile = $fs->getFile($heicPath);
645
  $heicFile->delete(); // the original heic -file should not linger in uploads.
646
  }
647
  }
 
 
648
  }
649
  else
650
  {
class/Model/Image/MediaLibraryModel.php CHANGED
@@ -8,6 +8,7 @@ use ShortPixel\Controller\OptimizeController as OptimizeController;
8
  use ShortPixel\Controller\QuotaController as QuotaController;
9
 
10
  use ShortPixel\Helper\InstallHelper as InstallHelper;
 
11
 
12
  class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailModel
13
  {
@@ -33,6 +34,8 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
33
 
34
  private $optimizeData; // cache to prevent running this more than once per run.
35
 
 
 
36
 
37
  public function __construct($post_id, $path)
38
  {
@@ -49,7 +52,10 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
49
  }
50
 
51
  if (! $this->isExtensionExcluded())
52
- $this->loadMeta();
 
 
 
53
 
54
  }
55
 
@@ -87,27 +93,21 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
87
  $isSmartCrop = ($settings->useSmartcrop == true && $this->getExtension() !== 'pdf') ? true : false;
88
  $doubles = array(); // check via hash if same command / result is there.
89
 
90
- // Use URL of biggest image.
91
- /*if ($isSmartCrop === true && $this->isScaled())
92
- {
93
- $url = $this->getOriginalFile()->getURL();
94
- } */
95
-
96
  if ($this->isProcessable(true) || ($this->isProcessableAnyFileType() && $this->isOptimized()) )
97
  {
98
  $paramList = $this->createParamList();
99
- $parameters['urls'][0] = $url;
100
- $parameters['paths'][0] = $this->getFullPath();
101
- $parameters['params'][0] = $paramList;
102
- $parameters['returnParams']['sizes'][0] = $this->getFileName();
103
 
104
  if ($isSmartCrop)
105
  {
106
- $parameters['returnParams']['fileSizes'][0] = $this->getFileSize();
107
  }
108
 
109
  $hash = md5( serialize($paramList) . $url);
110
- $doubles[$hash] = 0;
111
  }
112
 
113
  $thumbObjs = $this->getThumbObjects();
@@ -130,7 +130,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
130
  {
131
  $doubleName = $doubles[$hash];
132
 
133
- if (is_numeric($doubleName) && intval($doubleName) === 0)
134
  {
135
  $compareObj = $this;
136
  }
@@ -148,7 +148,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
148
  $aDuplicate = false;
149
  foreach($parameters['returnParams']['doubles'] as $doubleNameInDoubles => $unneeded)
150
  {
151
- if ($doubleNameInDoubles !== 0 && $doubleNameInDoubles !== 1 && $thumbObjs[$doubleNameInDoubles]->getFileName() == $thumbObj->getFileName())
152
  {
153
  $aDuplicate = true;
154
  $parameters['returnParams']['duplicates'][$name] = $doubleNameInDoubles;
@@ -204,10 +204,6 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
204
  $this->optimizeData = null;
205
  }
206
 
207
-
208
-
209
-
210
-
211
  // Try to get the URL via WordPress
212
  // This is now officially a heavy function. Take times, other plugins (like s3) might really delay it
213
  public function getURL()
@@ -216,7 +212,6 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
216
  return $url;
217
  }
218
 
219
-
220
  public function getWPMetaData()
221
  {
222
  if (is_null($this->wp_metadata))
@@ -315,21 +310,21 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
315
  if (! \wpSPIO()->settings()->optimizeRetina)
316
  return;
317
 
318
- if (! isset($this->retinas[0]))
319
  {
320
  $main = $this->getRetina();
321
 
322
  if ($main)
323
  {
324
- $this->retinas[0] = $main; // on purpose not a string, but number to prevent any custom image sizes to get overwritten.
325
  }
326
  }
327
 
328
- if ($this->isScaled() && ! isset($this->retinas[1]))
329
  {
330
  $retscaled = $this->original_file->getRetina();
331
  if ($retscaled)
332
- $this->retinas[1] = $retscaled; //see main
333
  }
334
 
335
  foreach ($this->thumbnails as $thumbname => $thumbObj)
@@ -350,7 +345,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
350
 
351
  $main = $this->getWebp();
352
  if ($main)
353
- $webps[0] = $main; // on purpose not a string, but number to prevent any custom image sizes to get overwritten.
354
 
355
  foreach($this->thumbnails as $thumbname => $thumbObj)
356
  {
@@ -372,7 +367,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
372
  {
373
  $webp = $this->original_file->getWebp();
374
  if ($webp)
375
- $webps[1] = $webp; //see main
376
  }
377
 
378
  return $webps;
@@ -384,7 +379,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
384
  $main = $this->getAvif();
385
 
386
  if ($main)
387
- $avifs[0] = $main; // on purpose not a string, but number to prevent any custom image sizes to get overwritten.
388
 
389
  foreach($this->thumbnails as $thumbname => $thumbObj)
390
  {
@@ -407,7 +402,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
407
  {
408
  $avif = $this->original_file->getAvif();
409
  if ($avif)
410
- $avifs[1] = $avif; //see main
411
  }
412
 
413
  return $avifs;
@@ -454,8 +449,8 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
454
 
455
  $optimized = array();
456
 
457
- // Main file has a 0 index.
458
- $mainFile = (isset($files) && isset($files[0])) ? $files[0] : false;
459
 
460
  if (! $this->isOptimized() && isset($mainFile['img']) ) // main file might not be contained in results
461
  {
@@ -512,7 +507,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
512
  continue;
513
  }
514
 
515
- if (is_numeric($sizeName) && intval($sizeName) === 0)
516
  {
517
  continue;
518
  }
@@ -520,6 +515,9 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
520
  $resultObj = $files[$sizeName];
521
  $thumbnail = $thumbObjs[$sizeName];
522
 
 
 
 
523
  $thumbnail->handleOptimizedFileType($resultObj); // check for webps /etc
524
 
525
  if ($thumbnail->isOptimized())
@@ -769,7 +767,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
769
  $orMeta->fromClass($metadata->original_file);
770
  }
771
  $orFile->setMetaObj($orMeta);
772
- $orFile->setName(1); // 1 is name for original file / image.
773
  $this->original_file = $orFile;
774
  }
775
 
@@ -863,8 +861,8 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
863
  $data->originalSize = $record->original_size;
864
 
865
  // @todo This needs to be Mysql TimeStamp -> Unix TS-ilized.
866
- $data->tsAdded = \ShortPixelTools::DBtoTimestamp($record->tsAdded);
867
- $data->tsOptimized = \ShortPixelTools::DBtoTimestamp($record->tsOptimized);
868
 
869
  // [...]
870
  $extra_info = json_decode($record->extra_info);
@@ -884,7 +882,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
884
  }
885
  elseif ($record->parent == 0 && $record->image_type = self::IMAGE_TYPE_RETINA)
886
  {
887
- $metadata->retinas[0] = $data;
888
  }
889
  elseif($record->parent > 0) // Thumbnails
890
  {
@@ -968,8 +966,8 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
968
  'compression_type' => $data->compressionType,
969
  'compressed_size' => $data->compressedSize,
970
  'original_size' => $data->originalSize,
971
- 'tsAdded' => \ShortPixelTools::timestampToDB($data->tsAdded),
972
- 'tsOptimized' => \ShortPixelTools::timestampToDB($data->tsOptimized),
973
  );
974
 
975
  unset($data->status);
@@ -1394,7 +1392,6 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
1394
  } // convertPNG
1395
 
1396
 
1397
- // Perhaps treat this as thumbnail? And remove function from FileSystemController?
1398
  protected function setOriginalFile()
1399
  {
1400
  $fs = \wpSPIO()->filesystem();
@@ -1403,7 +1400,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
1403
  return false;
1404
 
1405
  $originalFile = $fs->getOriginalImage($this->id);
1406
- $originalFile->setName(1); // required for named API requests et al.
1407
  $originalFile->setImageType(self::IMAGE_TYPE_ORIGINAL);
1408
 
1409
  if ($originalFile->exists() && $originalFile->getFullPath() !== $this->getfullPath() )
@@ -1835,27 +1832,6 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
1835
 
1836
  }
1837
 
1838
- /* if ($this->isScaled())
1839
- {
1840
-
1841
- $originalFile = $this->getOriginalFile();
1842
-
1843
- if ($originalFile->hasBackup())
1844
- {
1845
- $backupFile = $originalFile->getBackupFile();
1846
- $backupFile->delete();
1847
-
1848
- $backupFileJPG = $fs->getFile($backupFile->getFileDir() . $backupFile->getFileBase() . '.jpg');
1849
- if ($backupFileJPG->exists())
1850
- {
1851
- $backupFileJPG->delete();
1852
- }
1853
- }
1854
-
1855
- $toRemove[] = $originalFile;
1856
-
1857
- } */
1858
-
1859
  // Fullpath now will still be .jpg
1860
  // PNGconvert is first, because some plugins check for _attached_file metadata and prevent deleting files if still connected to media library. Exmaple: polylang.
1861
  $pngConvert = new ShortPixelPng2Jpg();
@@ -1925,7 +1901,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
1925
  }
1926
  if ($this->isScaled())
1927
  {
1928
- $objects[1] = $this->getOriginalFile();
1929
  }
1930
 
1931
  return $objects;
@@ -2434,15 +2410,55 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
2434
 
2435
  }
2436
 
2437
- private function getAllThumbnails()
 
2438
  {
 
 
 
2439
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2440
  }
2441
 
2442
  /** Adds Unlisted Image to the Media Library Item
2443
  * This function is called in IsProcessable
2444
  */
2445
- protected function addUnlisted()
2446
  {
2447
  // Setting must be active.
2448
  /*if (! \wpSPIO()->settings()->optimizeUnlisted )
@@ -2451,7 +2467,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
2451
  $searchUnlisted = \wpSPIO()->settings()->optimizeUnlisted;
2452
 
2453
  // Don't check this more than once per run-time.
2454
- if ( in_array($this->get('id'), self::$unlistedChecked ))
2455
  {
2456
  return;
2457
  }
@@ -2483,7 +2499,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
2483
  }
2484
 
2485
  // if all have nothing to do, do nothing.
2486
- if ($searchUnlisted == false && count($searchSuffixes) == 0 && count($searchInfixes) == 0)
2487
  {
2488
  self::$unlistedChecked[] = $this->get('id');
2489
  return;
@@ -2516,7 +2532,6 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
2516
  $all_files = scandir($this->getFileDir(), SCANDIR_SORT_NONE);
2517
  $all_files = array_diff($all_files, $currentFiles);
2518
 
2519
-
2520
  foreach($processFiles as $mediaItem)
2521
  {
2522
 
@@ -2524,7 +2539,7 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
2524
  $ext = $mediaItem->getExtension();
2525
  $path = (string) $mediaItem->getFileDir();
2526
 
2527
- if ($searchUnlisted)
2528
  {
2529
  $pattern = '/^' . preg_quote($base, '/') . '-\d+x\d+\.'. $ext .'/';
2530
  $thumbs = array();
@@ -2576,6 +2591,12 @@ class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailMod
2576
 
2577
  // Quality check on the thumbs. Must exist, must be same extension.
2578
  $added = false;
 
 
 
 
 
 
2579
  foreach($unlisted as $unName)
2580
  {
2581
  if (isset($this->thumbnails[$unName]))
8
  use ShortPixel\Controller\QuotaController as QuotaController;
9
 
10
  use ShortPixel\Helper\InstallHelper as InstallHelper;
11
+ use ShortPixel\Helper\UtilHelper as UtilHelper;
12
 
13
  class MediaLibraryModel extends \ShortPixel\Model\Image\MediaLibraryThumbnailModel
14
  {
34
 
35
  private $optimizeData; // cache to prevent running this more than once per run.
36
 
37
+ private $mainImageKey = 'shortpixel_main_donotuse';
38
+ private $originalImageKey = 'shortpixel_original_donotuse';
39
 
40
  public function __construct($post_id, $path)
41
  {
52
  }
53
 
54
  if (! $this->isExtensionExcluded())
55
+ {
56
+ $this->loadMeta();
57
+ $this->checkUnlistedForNotice();
58
+ }
59
 
60
  }
61
 
93
  $isSmartCrop = ($settings->useSmartcrop == true && $this->getExtension() !== 'pdf') ? true : false;
94
  $doubles = array(); // check via hash if same command / result is there.
95
 
 
 
 
 
 
 
96
  if ($this->isProcessable(true) || ($this->isProcessableAnyFileType() && $this->isOptimized()) )
97
  {
98
  $paramList = $this->createParamList();
99
+ $parameters['urls'][$this->mainImageKey] = $url;
100
+ $parameters['paths'][$this->mainImageKey] = $this->getFullPath();
101
+ $parameters['params'][$this->mainImageKey] = $paramList;
102
+ $parameters['returnParams']['sizes'][$this->mainImageKey] = $this->getFileName();
103
 
104
  if ($isSmartCrop)
105
  {
106
+ $parameters['returnParams']['fileSizes'][$this->mainImageKey] = $this->getFileSize();
107
  }
108
 
109
  $hash = md5( serialize($paramList) . $url);
110
+ $doubles[$hash] = $this->mainImageKey;
111
  }
112
 
113
  $thumbObjs = $this->getThumbObjects();
130
  {
131
  $doubleName = $doubles[$hash];
132
 
133
+ if ($doubleName === $this->mainImageKey)
134
  {
135
  $compareObj = $this;
136
  }
148
  $aDuplicate = false;
149
  foreach($parameters['returnParams']['doubles'] as $doubleNameInDoubles => $unneeded)
150
  {
151
+ if ($doubleNameInDoubles !== $this->mainImageKey && $doubleNameInDoubles !== $this->originalImageKey && $thumbObjs[$doubleNameInDoubles]->getFileName() == $thumbObj->getFileName())
152
  {
153
  $aDuplicate = true;
154
  $parameters['returnParams']['duplicates'][$name] = $doubleNameInDoubles;
204
  $this->optimizeData = null;
205
  }
206
 
 
 
 
 
207
  // Try to get the URL via WordPress
208
  // This is now officially a heavy function. Take times, other plugins (like s3) might really delay it
209
  public function getURL()
212
  return $url;
213
  }
214
 
 
215
  public function getWPMetaData()
216
  {
217
  if (is_null($this->wp_metadata))
310
  if (! \wpSPIO()->settings()->optimizeRetina)
311
  return;
312
 
313
+ if (! isset($this->retinas[$this->mainImageKey]))
314
  {
315
  $main = $this->getRetina();
316
 
317
  if ($main)
318
  {
319
+ $this->retinas[$this->mainImageKey] = $main; // on purpose not a string, but number to prevent any custom image sizes to get overwritten.
320
  }
321
  }
322
 
323
+ if ($this->isScaled() && ! isset($this->retinas[$this->originalImageKey]))
324
  {
325
  $retscaled = $this->original_file->getRetina();
326
  if ($retscaled)
327
+ $this->retinas[$this->originalImageKey] = $retscaled; //see main
328
  }
329
 
330
  foreach ($this->thumbnails as $thumbname => $thumbObj)
345
 
346
  $main = $this->getWebp();
347
  if ($main)
348
+ $webps[$this->mainImageKey] = $main; // on purpose not a string, but number to prevent any custom image sizes to get overwritten.
349
 
350
  foreach($this->thumbnails as $thumbname => $thumbObj)
351
  {
367
  {
368
  $webp = $this->original_file->getWebp();
369
  if ($webp)
370
+ $webps[$this->originalImageKey] = $webp; //see main
371
  }
372
 
373
  return $webps;
379
  $main = $this->getAvif();
380
 
381
  if ($main)
382
+ $avifs[$this->mainImageKey] = $main; // on purpose not a string, but number to prevent any custom image sizes to get overwritten.
383
 
384
  foreach($this->thumbnails as $thumbname => $thumbObj)
385
  {
402
  {
403
  $avif = $this->original_file->getAvif();
404
  if ($avif)
405
+ $avifs[$this->originalImageKey] = $avif; //see main
406
  }
407
 
408
  return $avifs;
449
 
450
  $optimized = array();
451
 
452
+ // Main file has a index.
453
+ $mainFile = (isset($files) && isset($files[$this->mainImageKey])) ? $files[$this->mainImageKey] : false;
454
 
455
  if (! $this->isOptimized() && isset($mainFile['img']) ) // main file might not be contained in results
456
  {
507
  continue;
508
  }
509
 
510
+ if ($sizeName === $this->mainImageKey)
511
  {
512
  continue;
513
  }
515
  $resultObj = $files[$sizeName];
516
  $thumbnail = $thumbObjs[$sizeName];
517
 
518
+ //Log::addTemp('Handle Optimize thumbnail', $thumbnail);
519
+ //Log::add
520
+
521
  $thumbnail->handleOptimizedFileType($resultObj); // check for webps /etc
522
 
523
  if ($thumbnail->isOptimized())
767
  $orMeta->fromClass($metadata->original_file);
768
  }
769
  $orFile->setMetaObj($orMeta);
770
+ $orFile->setName($this->originalImageKey);
771
  $this->original_file = $orFile;
772
  }
773
 
861
  $data->originalSize = $record->original_size;
862
 
863
  // @todo This needs to be Mysql TimeStamp -> Unix TS-ilized.
864
+ $data->tsAdded = UtilHelper::DBtoTimestamp($record->tsAdded);
865
+ $data->tsOptimized = UtilHelper::DBtoTimestamp($record->tsOptimized);
866
 
867
  // [...]
868
  $extra_info = json_decode($record->extra_info);
882
  }
883
  elseif ($record->parent == 0 && $record->image_type = self::IMAGE_TYPE_RETINA)
884
  {
885
+ $metadata->retinas[$this->mainImageKey] = $data;
886
  }
887
  elseif($record->parent > 0) // Thumbnails
888
  {
966
  'compression_type' => $data->compressionType,
967
  'compressed_size' => $data->compressedSize,
968
  'original_size' => $data->originalSize,
969
+ 'tsAdded' => UtilHelper::timestampToDB($data->tsAdded),
970
+ 'tsOptimized' => UtilHelper::timestampToDB($data->tsOptimized),
971
  );
972
 
973
  unset($data->status);
1392
  } // convertPNG
1393
 
1394
 
 
1395
  protected function setOriginalFile()
1396
  {
1397
  $fs = \wpSPIO()->filesystem();
1400
  return false;
1401
 
1402
  $originalFile = $fs->getOriginalImage($this->id);
1403
+ $originalFile->setName($this->originalImageKey); // required for named API requests et al.
1404
  $originalFile->setImageType(self::IMAGE_TYPE_ORIGINAL);
1405
 
1406
  if ($originalFile->exists() && $originalFile->getFullPath() !== $this->getfullPath() )
1832
 
1833
  }
1834
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1835
  // Fullpath now will still be .jpg
1836
  // PNGconvert is first, because some plugins check for _attached_file metadata and prevent deleting files if still connected to media library. Exmaple: polylang.
1837
  $pngConvert = new ShortPixelPng2Jpg();
1901
  }
1902
  if ($this->isScaled())
1903
  {
1904
+ $objects[$this->originalImageKey] = $this->getOriginalFile();
1905
  }
1906
 
1907
  return $objects;
2410
 
2411
  }
2412
 
2413
+ // Check for UnlistedNotice. Check if in this image has unlisted without adding them
2414
+ public function checkUnlistedForNotice()
2415
  {
2416
+ $settings = \wpSPIO()->settings();
2417
+ $control = AdminNoticesController::getInstance();
2418
+ $notice = $control->getNoticeByKey('MSG_UNLISTED_FOUND');
2419
 
2420
+ // already active
2421
+ if ($settings->optimizeUnlisted === true)
2422
+ return;
2423
+
2424
+ // already notice.
2425
+ if (is_object($notice->getNoticeObj()))
2426
+ {
2427
+ return;
2428
+ }
2429
+
2430
+ // todo get counter to indicate
2431
+ $counter = $settings->unlistedCounter;
2432
+
2433
+ if ($counter < 100)
2434
+ {
2435
+ $settings->unlistedCounter++;
2436
+ return;
2437
+ }
2438
+
2439
+ // check unlisted.
2440
+ $unlisted = $this->addUnlisted(true);
2441
+
2442
+
2443
+ if (is_array($unlisted) && count($unlisted) > 0)
2444
+ {
2445
+ // trigger notice.
2446
+ $args = array(
2447
+ 'count' => count($unlisted),
2448
+ 'filelist' => $unlisted,
2449
+ 'name' => $this->getFileName(),
2450
+ 'id' => $this->get('id'),
2451
+ );
2452
+ $notice->addManual($args);
2453
+
2454
+ }
2455
+ $settings->unlistedCounter = 0;
2456
  }
2457
 
2458
  /** Adds Unlisted Image to the Media Library Item
2459
  * This function is called in IsProcessable
2460
  */
2461
+ protected function addUnlisted($check_only = false)
2462
  {
2463
  // Setting must be active.
2464
  /*if (! \wpSPIO()->settings()->optimizeUnlisted )
2467
  $searchUnlisted = \wpSPIO()->settings()->optimizeUnlisted;
2468
 
2469
  // Don't check this more than once per run-time.
2470
+ if ( in_array($this->get('id'), self::$unlistedChecked ) && $check_only === false)
2471
  {
2472
  return;
2473
  }
2499
  }
2500
 
2501
  // if all have nothing to do, do nothing.
2502
+ if ($searchUnlisted == false && count($searchSuffixes) == 0 && count($searchInfixes) == 0 && $check_only === false)
2503
  {
2504
  self::$unlistedChecked[] = $this->get('id');
2505
  return;
2532
  $all_files = scandir($this->getFileDir(), SCANDIR_SORT_NONE);
2533
  $all_files = array_diff($all_files, $currentFiles);
2534
 
 
2535
  foreach($processFiles as $mediaItem)
2536
  {
2537
 
2539
  $ext = $mediaItem->getExtension();
2540
  $path = (string) $mediaItem->getFileDir();
2541
 
2542
+ if ($searchUnlisted || $check_only === true)
2543
  {
2544
  $pattern = '/^' . preg_quote($base, '/') . '-\d+x\d+\.'. $ext .'/';
2545
  $thumbs = array();
2591
 
2592
  // Quality check on the thumbs. Must exist, must be same extension.
2593
  $added = false;
2594
+
2595
+ if ($check_only === true)
2596
+ {
2597
+ return $unlisted;
2598
+ }
2599
+
2600
  foreach($unlisted as $unName)
2601
  {
2602
  if (isset($this->thumbnails[$unName]))
class/Model/Image/MediaLibraryThumbnailModel.php CHANGED
@@ -221,7 +221,8 @@ class MediaLibraryThumbnailModel extends \ShortPixel\Model\Image\ImageModel
221
  {
222
  // if thumbnail processing is off, thumbs are never processable.
223
  // This is also used by main file, so check for that!
224
- if ( $this->excludeThumbnails() && $this->is_main_file === false)
 
225
  {
226
  $this->processable_status = self::P_EXCLUDE_SIZE;
227
  return false;
221
  {
222
  // if thumbnail processing is off, thumbs are never processable.
223
  // This is also used by main file, so check for that!
224
+
225
+ if ( $this->excludeThumbnails() && $this->is_main_file === false && $this->get('imageType') !== self::IMAGE_TYPE_ORIGINAL)
226
  {
227
  $this->processable_status = self::P_EXCLUDE_SIZE;
228
  return false;
class/Model/StatsModel.php CHANGED
@@ -459,10 +459,5 @@ class StatsModel
459
 
460
  }
461
 
462
- //public function from
463
-
464
-
465
-
466
-
467
 
468
  } // class
459
 
460
  }
461
 
 
 
 
 
 
462
 
463
  } // class
class/Tools.php DELETED
@@ -1,376 +0,0 @@
1
- <?php
2
- use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
3
-
4
-
5
- // @todo In time this should be moved to a helper class
6
- class ShortPixelTools {
7
- /* public static function parseJSON($data) {
8
- if ( function_exists('json_decode') ) {
9
- $data = json_decode( $data );
10
- } else {
11
- require_once( 'JSON/JSON.php' );
12
- $json = new Services_JSON( );
13
- $data = $json->decode( $data );
14
- }
15
- return $data;
16
- }*/
17
-
18
- /** Find if a certain plugin is active
19
- * @param String $plugin The name of plugin being searched for
20
- * @return Boolean Active or not
21
- */
22
- public static function shortPixelIsPluginActive($plugin) {
23
- $activePlugins = apply_filters( 'active_plugins', get_option( 'active_plugins', array()));
24
- if ( is_multisite() ) {
25
- $activePlugins = array_merge($activePlugins, get_site_option( 'active_sitewide_plugins'));
26
- }
27
- return in_array( $plugin, $activePlugins);
28
- }
29
-
30
- public static function snakeToCamel($snake_case) {
31
- return str_replace(' ', '', ucwords(str_replace('_', ' ', $snake_case)));
32
- }
33
-
34
- public static function getPluginPath()
35
- {
36
- return plugin_dir_path(SHORTPIXEL_PLUGIN_FILE);
37
- }
38
-
39
-
40
- /** Function to convert dateTime object to a date output
41
- *
42
- * Function checks if the date is recent and then uploads are friendlier message. Taken from media library list table date function
43
- * @param DateTime $date DateTime object
44
- **/
45
- public static function format_nice_date( $date ) {
46
-
47
- if ( '0000-00-00 00:00:00' === $date->format('Y-m-d ') ) {
48
- $h_time = '';
49
- } else {
50
- $time = $date->format('U'); //get_post_time( 'G', true, $post, false );
51
- if ( ( abs( $t_diff = time() - $time ) ) < DAY_IN_SECONDS ) {
52
- if ( $t_diff < 0 ) {
53
- $h_time = sprintf( __( '%s from now' ), human_time_diff( $time ) );
54
- } else {
55
- $h_time = sprintf( __( '%s ago' ), human_time_diff( $time ) );
56
- }
57
- } else {
58
- $h_time = $date->format( 'Y/m/d' );
59
- }
60
- }
61
-
62
- return $h_time;
63
- }
64
-
65
- static public function formatBytes($bytes, $precision = 2) {
66
- $units = array('B', 'KB', 'MB', 'GB', 'TB');
67
-
68
- $bytes = max($bytes, 0);
69
- $pow = floor(($bytes ? log($bytes) : 0) / log(1024));
70
- $pow = min($pow, count($units) - 1);
71
-
72
- $bytes /= pow(1024, $pow);
73
-
74
- return round($bytes, $precision) . ' ' . $units[$pow];
75
- }
76
-
77
- static public function timestampToDB($timestamp)
78
- {
79
- return date("Y-m-d H:i:s", $timestamp);
80
- }
81
-
82
- static public function DBtoTimestamp($date)
83
- {
84
- return strtotime($date);
85
- }
86
-
87
- public static function commonPrefix($str1, $str2) {
88
- $limit = min(strlen($str1), strlen($str2));
89
- for ($i = 0; $i < $limit && $str1[$i] === $str2[$i]; $i++);
90
- return substr($str1, 0, $i);
91
- }
92
-
93
- /**
94
- * This is a simplified wp_send_json made compatible with WP 3.2.x to 3.4.x
95
- * @param type $response
96
- */
97
- public static function sendJSON($response) {
98
- @header( 'Content-Type: application/json; charset=' . get_option( 'blog_charset' ) );
99
- die(json_encode($response));
100
- //wp_send_json($response); // send json proper, dies.
101
- }
102
-
103
-
104
-
105
- /**
106
- * finds if an array contains an item, comparing the property given as key
107
- * @param $item
108
- * @param $arr
109
- * @param $key
110
- * @return the position that was removed, false if not found
111
- */
112
- public static function findItem($item, $arr, $key) {
113
- foreach($arr as $elm) {
114
- if($elm[$key] == $item) {
115
- return $elm;
116
- }
117
- }
118
- return false;
119
- }
120
-
121
-
122
- public static function getConflictingPlugins() {
123
- $settings = \wpSPIO()->settings();
124
-
125
- $conflictPlugins = array(
126
- 'WP Smush - Image Optimization'
127
- => array(
128
- 'action'=>'Deactivate',
129
- 'data'=>'wp-smushit/wp-smush.php',
130
- 'page'=>'wp-smush-bulk'
131
- ),
132
- 'Imagify Image Optimizer'
133
- => array(
134
- 'action'=>'Deactivate',
135
- 'data'=>'imagify/imagify.php',
136
- 'page'=>'imagify'
137
- ),
138
- 'Compress JPEG & PNG images (TinyPNG)'
139
- => array(
140
- 'action'=>'Deactivate',
141
- 'data'=>'tiny-compress-images/tiny-compress-images.php',
142
- 'page'=>'tinify'
143
- ),
144
- 'Kraken.io Image Optimizer'
145
- => array(
146
- 'action'=>'Deactivate',
147
- 'data'=>'kraken-image-optimizer/kraken.php',
148
- 'page'=>'wp-krakenio'
149
- ),
150
- 'Optimus - WordPress Image Optimizer'
151
- => array(
152
- 'action'=>'Deactivate',
153
- 'data'=>'optimus/optimus.php',
154
- 'page'=>'optimus'
155
- ),
156
- 'Phoenix Media Rename' => array(
157
- 'action' => 'Deactivate',
158
- 'data' => 'phoenix-media-rename/phoenix-media-rename.php',
159
- ),
160
- 'EWWW Image Optimizer'
161
- => array(
162
- 'action'=>'Deactivate',
163
- 'data'=>'ewww-image-optimizer/ewww-image-optimizer.php',
164
- 'page'=>'ewww-image-optimizer%2F'
165
- ),
166
- 'EWWW Image Optimizer Cloud'
167
- => array(
168
- 'action'=>'Deactivate',
169
- 'data'=>'ewww-image-optimizer-cloud/ewww-image-optimizer-cloud.php',
170
- 'page'=>'ewww-image-optimizer-cloud%2F'
171
- ),
172
- 'ImageRecycle pdf & image compression'
173
- => array(
174
- 'action'=>'Deactivate',
175
- 'data'=>'imagerecycle-pdf-image-compression/wp-image-recycle.php',
176
- 'page'=>'option-image-recycle'
177
- ),
178
- 'CheetahO Image Optimizer'
179
- => array(
180
- 'action'=>'Deactivate',
181
- 'data'=>'cheetaho-image-optimizer/cheetaho.php',
182
- 'page'=>'cheetaho'
183
- ),
184
- 'Zara 4 Image Compression'
185
- => array(
186
- 'action'=>'Deactivate',
187
- 'data'=>'zara-4/zara-4.php',
188
- 'page'=>'zara-4'
189
- ),
190
- 'CW Image Optimizer'
191
- => array(
192
- 'action'=>'Deactivate',
193
- 'data'=>'cw-image-optimizer/cw-image-optimizer.php',
194
- 'page'=>'cw-image-optimizer'
195
- ),
196
- 'Simple Image Sizes'
197
- => array(
198
- 'action'=>'Deactivate',
199
- 'data'=>'simple-image-sizes/simple_image_sizes.php'
200
- ),
201
- 'Regenerate Thumbnails and Delete Unused'
202
- => array(
203
- 'action' => 'Deactivate',
204
- 'data' => 'regenerate-thumbnails-and-delete-unused/regenerate_wpregenerate.php',
205
- ),
206
- 'Swift Performance'
207
- => array(
208
- 'action' => 'Deactivate',
209
- 'data' => 'swift-performance/performance.php',
210
- ),
211
- 'Swift Performance Lite'
212
- => array(
213
- 'action' => 'Deactivate',
214
- 'data' => 'swift-performance-lite/performance.php',
215
- ),
216
- //DEACTIVATED TEMPORARILY - it seems that the customers get scared.
217
- /* 'Jetpack by WordPress.com - The Speed up image load times Option'
218
- => array(
219
- 'action'=>'Change Setting',
220
- 'data'=>'jetpack/jetpack.php',
221
- 'href'=>'admin.php?page=jetpack#/settings'
222
- )
223
- */
224
- );
225
- if($settings->processThumbnails) {
226
- $details = __('Details: recreating image files may require re-optimization of the resulting thumbnails, even if they were previously optimized. Please use <a href="https://wordpress.org/plugins/regenerate-thumbnails-advanced/" target="_blank">reGenerate Thumbnails Advanced</a> instead.','shortpixel-image-optimiser');
227
-
228
- $conflictPlugins = array_merge($conflictPlugins, array(
229
- 'Regenerate Thumbnails'
230
- => array(
231
- 'action'=>'Deactivate',
232
- 'data'=>'regenerate-thumbnails/regenerate-thumbnails.php',
233
- 'page'=>'regenerate-thumbnails',
234
- 'details' => $details
235
- ),
236
- 'Force Regenerate Thumbnails'
237
- => array(
238
- 'action'=>'Deactivate',
239
- 'data'=>'force-regenerate-thumbnails/force-regenerate-thumbnails.php',
240
- 'page'=>'force-regenerate-thumbnails',
241
- 'details' => $details
242
- )
243
- ));
244
- }
245
-
246
-
247
- $found = array();
248
- foreach($conflictPlugins as $name => $path) {
249
- $action = ( isset($path['action']) ) ? $path['action'] : null;
250
- $data = ( isset($path['data']) ) ? $path['data'] : null;
251
- $href = ( isset($path['href']) ) ? $path['href'] : null;
252
- $page = ( isset($path['page']) ) ? $path['page'] : null;
253
- $details = ( isset($path['details']) ) ? $path['details'] : null;
254
- if(is_plugin_active($data)) {
255
- if( $data == 'jetpack/jetpack.php' ){
256
- $jetPackPhoton = get_option('jetpack_active_modules') ? in_array('photon', get_option('jetpack_active_modules')) : false;
257
- if( !$jetPackPhoton ){ continue; }
258
- }
259
- $found[] = array( 'name' => $name, 'action'=> $action, 'path' => $data, 'href' => $href , 'page' => $page, 'details' => $details);
260
- }
261
- }
262
- return $found;
263
- }
264
-
265
- public static function alterHtaccess($webp = false, $avif = false){
266
- // [BS] Backward compat. 11/03/2019 - remove possible settings from root .htaccess
267
- /* Plugin init is before loading these admin scripts. So it can happen misc.php is not yet loaded */
268
- if (! function_exists('insert_with_markers'))
269
- {
270
- Log::addWarn('AlterHtaccess Called before WP init');
271
- return;
272
- //require_once( ABSPATH . 'wp-admin/includes/misc.php' );
273
- }
274
- $upload_dir = wp_upload_dir();
275
- $upload_base = trailingslashit($upload_dir['basedir']);
276
-
277
- if ( ! $webp && ! $avif ) {
278
- insert_with_markers( get_home_path() . '.htaccess', 'ShortPixelWebp', '');
279
- insert_with_markers( $upload_base . '.htaccess', 'ShortPixelWebp', '');
280
- insert_with_markers( trailingslashit(WP_CONTENT_DIR) . '.htaccess', 'ShortPixelWebp', '');
281
- } else {
282
-
283
- $avif_rules = '
284
- <IfModule mod_rewrite.c>
285
- RewriteEngine On
286
- ##### Directives for delivering AVIF files, if they exist #####
287
- # Does the browser support avif?
288
- RewriteCond %{HTTP_ACCEPT} image/avif
289
- # AND is the request a jpg or png? (also grab the basepath %1 to match in the next rule)
290
- RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
291
- # AND does a .avif image exist?
292
- RewriteCond %{DOCUMENT_ROOT}/%1.avif -f
293
- # THEN send the avif image and set the env var avif
294
- RewriteRule (.+)\.(?:jpe?g|png)$ $1.avif [NC,T=image/avif,E=avif,L]
295
-
296
- # Does the browser support avif?
297
- RewriteCond %{HTTP_ACCEPT} image/avif
298
- # AND is the request a jpg or png? (also grab the basepath %1 to match in the next rule)
299
- RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
300
- # AND does a .jpg.avif image exist?
301
- RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.avif -f
302
- # THEN send the avif image and set the env var avif
303
- RewriteRule ^(.+)$ $1.avif [NC,T=image/avif,E=avif,L]
304
-
305
- </IfModule>
306
- <IfModule mod_headers.c>
307
- # If REDIRECT_avif env var exists, append Accept to the Vary header
308
- Header append Vary Accept env=REDIRECT_avif
309
- </IfModule>
310
- <IfModule mod_mime.c>
311
- AddType image/avif .avif
312
- </IfModule>
313
- ';
314
-
315
- $webp_rules = '
316
- <IfModule mod_rewrite.c>
317
- RewriteEngine On
318
- ##### TRY FIRST the file appended with .webp (ex. test.jpg.webp) #####
319
- # Is the browser Chrome?
320
- RewriteCond %{HTTP_USER_AGENT} Chrome [OR]
321
- # OR Is request from Page Speed
322
- RewriteCond %{HTTP_USER_AGENT} "Google Page Speed Insights" [OR]
323
- # OR does this browser explicitly support webp
324
- RewriteCond %{HTTP_ACCEPT} image/webp
325
- # AND NOT MS EDGE 42/17 - doesnt work.
326
- RewriteCond %{HTTP_USER_AGENT} !Edge/17
327
- # AND is the request a jpg, png or gif?
328
- RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
329
- # AND does a .ext.webp image exist?
330
- RewriteCond %{DOCUMENT_ROOT}%{REQUEST_URI}.webp -f
331
- # THEN send the webp image and set the env var webp
332
- RewriteRule ^(.+)$ $1.webp [NC,T=image/webp,E=webp,L]
333
- ##### IF NOT, try the file with replaced extension (test.webp) #####
334
- RewriteCond %{HTTP_USER_AGENT} Chrome [OR]
335
- RewriteCond %{HTTP_USER_AGENT} "Google Page Speed Insights" [OR]
336
- RewriteCond %{HTTP_ACCEPT} image/webp
337
- RewriteCond %{HTTP_USER_AGENT} !Edge/17
338
- # AND is the request a jpg, png or gif? (also grab the basepath %1 to match in the next rule)
339
- RewriteCond %{REQUEST_URI} ^(.+)\.(?:jpe?g|png|gif)$
340
- # AND does a .webp image exist?
341
- RewriteCond %{DOCUMENT_ROOT}/%1.webp -f
342
- # THEN send the webp image and set the env var webp
343
- RewriteRule (.+)\.(?:jpe?g|png|gif)$ $1.webp [NC,T=image/webp,E=webp,L]
344
- </IfModule>
345
- <IfModule mod_headers.c>
346
- # If REDIRECT_webp env var exists, append Accept to the Vary header
347
- Header append Vary Accept env=REDIRECT_webp
348
- </IfModule>
349
- <IfModule mod_mime.c>
350
- AddType image/webp .webp
351
- </IfModule>
352
- ' ;
353
-
354
- $rules = '';
355
- // if ($avif)
356
- $rules .= $avif_rules;
357
- // if ($webp)
358
- $rules .= $webp_rules;
359
-
360
- insert_with_markers( get_home_path() . '.htaccess', 'ShortPixelWebp', $rules);
361
-
362
- /** In uploads and on, it needs Inherit. Otherwise things such as the 404 error page will not be loaded properly
363
- * since the WP rewrite will not be active at that point (overruled) **/
364
- $rules = str_replace('RewriteEngine On', 'RewriteEngine On' . PHP_EOL . 'RewriteOptions Inherit', $rules);
365
-
366
- insert_with_markers( $upload_base . '.htaccess', 'ShortPixelWebp', $rules);
367
- insert_with_markers( trailingslashit(WP_CONTENT_DIR) . '.htaccess', 'ShortPixelWebp', $rules);
368
-
369
- }
370
- }
371
-
372
- } // class
373
-
374
- function ShortPixelVDD($v){
375
- return highlight_string("<?php\n\$data =\n" . var_export($v, true) . ";\n?>");
376
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
class/ViewController.php CHANGED
@@ -2,6 +2,9 @@
2
  namespace ShortPixel;
3
  use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
4
 
 
 
 
5
  class ViewController extends Controller
6
  {
7
  protected static $controllers = array();
@@ -67,6 +70,10 @@ class ViewController extends Controller
67
  return true;
68
  }
69
 
 
 
 
 
70
 
71
  /** Loads a view
72
  *
@@ -90,7 +97,7 @@ class ViewController extends Controller
90
  $view = $this->view;
91
  $controller = $this;
92
 
93
- $template_path = \ShortPixelTools::getPluginPath() . 'class/view/' . $template . '.php';
94
  if (file_exists($template_path) === false)
95
  {
96
  Log::addError("View $template could not be found in " . $template_path,
2
  namespace ShortPixel;
3
  use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
4
 
5
+ use ShortPixel\Model\AccessModel as AccessModel;
6
+
7
+
8
  class ViewController extends Controller
9
  {
10
  protected static $controllers = array();
70
  return true;
71
  }
72
 
73
+ public function access()
74
+ {
75
+ return AccessModel::getInstance();
76
+ }
77
 
78
  /** Loads a view
79
  *
97
  $view = $this->view;
98
  $controller = $this;
99
 
100
+ $template_path = \wpSPIO()->plugin_path('class/view/' . $template . '.php');
101
  if (file_exists($template_path) === false)
102
  {
103
  Log::addError("View $template could not be found in " . $template_path,
class/external/uncode.php ADDED
@@ -0,0 +1,44 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ namespace ShortPixel;
3
+ use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
4
+
5
+ class UncodeController
6
+ {
7
+ function __construct()
8
+ {
9
+ $this->addHooks();
10
+ }
11
+
12
+ protected function addHooks()
13
+ {
14
+ add_action('uncode_delete_crop_image', array($this, 'removedMetaData'), 10, 2);
15
+ }
16
+
17
+ public function removedMetaData($attach_id, $filePath)
18
+ {
19
+ $fs = \wpSPIO()->filesystem();
20
+ $imageObj = $fs->getImage($attach_id, 'media', false);
21
+ $imageObj->saveMeta();
22
+
23
+ $fileObj = $fs->getFile($filePath);
24
+ if ($fileObj->hasBackup())
25
+ {
26
+ $backupObj = $fileObj->getBackupFile();
27
+ $backupObj->delete();
28
+ }
29
+
30
+ // Check Webp
31
+ $webpObj = $fs->getFile( (string) $fileObj->getFileDir() . $fileObj->getFileBase() . '.webp');
32
+ Log::addTemp('Webp file path ' . $webpObj->getFullPath(), $webpObj);
33
+ if ($webpObj->exists())
34
+ $webpObj->delete();
35
+
36
+ // Check Avif
37
+ $avifObj = $fs->getFile( (string) $fileObj->getFileDir() . $fileObj->getFileBase() . '.avif');
38
+ if ($avifObj->exists())
39
+ $avifObj->delete();
40
+
41
+ }
42
+ }
43
+
44
+ $u = new UncodeController();
class/plugin.json CHANGED
@@ -1 +1 @@
1
- {"name":"ShortPixel\/Plugin","description":"ShortPixel AutoLoader","type":"function","autoload":{"psr-4":{"ShortPixel":"class"},"files":["class\/wp-shortpixel-settings.php","class\/shortpixel-png2jpg.php","class\/front\/img-to-picture-webp.php","class\/external\/cloudflare.php","class\/external\/flywheel.php","class\/external\/nextgen\/nextGenController.php","class\/external\/nextgen\/nextGenViewController.php","class\/external\/visualcomposer.php","class\/external\/wp-offload-media.php","class\/external\/wp-cli\/wp-cli-base.php","class\/external\/wp-cli\/wp-cli-single.php","class\/external\/wp-cli\/wp-cli-bulk.php","class\/external\/custom-suffixes.php","class\/external\/pantheon.php","class\/external\/spai.php","class\/external\/cache.php"]}}
1
+ {"name":"ShortPixel\/Plugin","description":"ShortPixel AutoLoader","type":"function","autoload":{"psr-4":{"ShortPixel":"class"},"files":["class\/wp-shortpixel-settings.php","class\/shortpixel-png2jpg.php","class\/front\/img-to-picture-webp.php","class\/external\/cloudflare.php","class\/external\/flywheel.php","class\/external\/nextgen\/nextGenController.php","class\/external\/nextgen\/nextGenViewController.php","class\/external\/visualcomposer.php","class\/external\/wp-offload-media.php","class\/external\/wp-cli\/wp-cli-base.php","class\/external\/wp-cli\/wp-cli-single.php","class\/external\/wp-cli\/wp-cli-bulk.php","class\/external\/custom-suffixes.php","class\/external\/pantheon.php","class\/external\/spai.php","class\/external\/cache.php","class\/external\/uncode.php"]}}
class/view/bulk/part-dashboard.php CHANGED
@@ -26,7 +26,7 @@ namespace ShortPixel;
26
  <?php if ($this->view->error): ?>
27
  <div class='bulk error'>
28
  <h3><?php echo esc_html($this->view->errorTitle); ?></h3>
29
- <p><?php echo esc_html($this->view->errorContent); ?></p>
30
  <?php if (property_exists($this->view, 'errorText')): ?>
31
  <p class='text'><?php echo esc_html($this->view->errorText) ?></p>
32
  <?php endif; ?>
26
  <?php if ($this->view->error): ?>
27
  <div class='bulk error'>
28
  <h3><?php echo esc_html($this->view->errorTitle); ?></h3>
29
+ <p><?php echo $this->view->errorContent; ?></p>
30
  <?php if (property_exists($this->view, 'errorText')): ?>
31
  <p class='text'><?php echo esc_html($this->view->errorText) ?></p>
32
  <?php endif; ?>
class/view/bulk/part-selection.php CHANGED
@@ -118,19 +118,33 @@ $approx = $this->view->approx;
118
  <div class="option"><?php esc_html_e('The total number of WebP images will be calculated in the next step.','shortpixel-image-optimiser'); ?></div>
119
  </div>
120
 
 
 
 
 
 
 
 
 
121
  <div class='optiongroup'>
122
  <div class='switch_button'>
123
 
124
  <label>
125
- <input type="checkbox" class="switch" id="avif_checkbox" name="avif_checkbox"
126
- <?php checked(\wpSPIO()->settings()->createAvif); ?> />
127
  <div class="the_switch">&nbsp; </div>
128
  </label>
129
 
130
  </div>
131
  <h4><label for="avif_checkbox"><?php esc_html_e('Also create AVIF versions of the images','shortpixel-image-optimiser'); ?></label></h4>
 
132
  <div class="option"><?php esc_html_e('The total number of AVIF images will be calculated in the next step.','shortpixel-image-optimiser'); ?></div>
133
  </div>
 
 
 
 
 
134
  </div>
135
 
136
  <div class="option-block">
118
  <div class="option"><?php esc_html_e('The total number of WebP images will be calculated in the next step.','shortpixel-image-optimiser'); ?></div>
119
  </div>
120
 
121
+
122
+ <?php
123
+ $avifEnabled = $this->access()->isFeatureAvailable('avif');
124
+ $createAvifChecked = (\wpSPIO()->settings()->createAvif == 1 && $avifEnabled === true) ? true : false;
125
+ $disabled = ($avifEnabled === false) ? 'disabled' : '';
126
+ ?>
127
+
128
+
129
  <div class='optiongroup'>
130
  <div class='switch_button'>
131
 
132
  <label>
133
+ <input type="checkbox" class="switch" id="avif_checkbox" name="avif_checkbox" <?php echo $disabled ?>
134
+ <?php checked($createAvifChecked); ?> />
135
  <div class="the_switch">&nbsp; </div>
136
  </label>
137
 
138
  </div>
139
  <h4><label for="avif_checkbox"><?php esc_html_e('Also create AVIF versions of the images','shortpixel-image-optimiser'); ?></label></h4>
140
+ <?php if ($avifEnabled == true): ?>
141
  <div class="option"><?php esc_html_e('The total number of AVIF images will be calculated in the next step.','shortpixel-image-optimiser'); ?></div>
142
  </div>
143
+ <?php else : ?>
144
+ <div class="option"><?php esc_html_e('The creation of AVIF files is not possible with this license type.','shortpixel-image-optimiser'); ?></div>
145
+ </div>
146
+ <?php endif; ?>
147
+
148
  </div>
149
 
150
  <div class="option-block">
class/view/bulk/part-summary.php CHANGED
@@ -15,7 +15,9 @@ namespace ShortPixel;
15
 
16
  <div class='summary-list'>
17
  <h3><?php esc_html_e('Review and start the Bulk Process', 'shortpixel-image-optimiser'); ?>
18
- <span><img src="<?php echo esc_url(wpSPIO()->plugin_url('res/img/bulk/robot-book-summary.svg')); ?>" /></span>
 
 
19
  </h3>
20
  <div class="section-wrapper" data-check-visibility data-control="data-check-media-total">
21
  <h4><span class='dashicons dashicons-images-alt2'>&nbsp;</span>
@@ -59,20 +61,19 @@ namespace ShortPixel;
59
  <div><span><?php esc_html_e('Total from Custom Media','shortpixel-image-optimiser'); ?></span><span data-stats-custom="images-images">0</span></div>
60
  </div>
61
  </div>
62
-
63
-
 
64
  <div class="totals">
65
- <?php esc_html_e('Total credits needed','shortpixel-image-optimiser') ?>: <span class="number" data-stats-total="images-images" data-check-total-total >0</span>
 
 
66
 
67
  <span class='number'></span>
68
  </div>
69
 
70
  </div>
71
-
72
- <?php
73
- $quotaData = $this->view->quotaData;
74
- ?>
75
-
76
  <div class="credits">
77
  <p class='heading'><span><?php esc_html_e('Your ShortPixel Credits Available', 'shortpixel-image-optimiser'); ?></span>
78
  <span><?php echo esc_html($this->formatNumber($quotaData->total->remaining, 0)) ?></span>
@@ -98,17 +99,18 @@ namespace ShortPixel;
98
 
99
  <div class="over-quota" data-check-visibility="false" data-control="data-quota-remaining" data-control-check="data-check-total-total">
100
  <span><img src="<?php echo esc_url(wpSPIO()->plugin_url('res/img/bulk/over-quota.svg')) ?>" /></span>
101
- <p><?php printf(esc_html('In your ShortPixel account you %shave only %s credits available %s, but you have chosen %s images to be optimized in this bulk process. You can either go back and select less images, or you can upgrade to a higher plan or buy one-time credits.','shortpixel-image-optimiser'), '<span class="red">', esc_html($this->formatNumber($quotaData->total->remaining, 0)), '</span>', '<b data-stats-total="images-images">0</b>'); ?>
102
 
103
  <button type="button" class="button" onClick="ShortPixel.proposeUpgrade();"><?php esc_html_e('Show me the best options') ?></button>
104
  </p>
105
 
106
  <span class='hidden' data-quota-remaining><?php
107
- // This is hidden check, no number format.
108
- echo esc_html($quotaData->total->remaining);
109
- ?></span>
110
  </div>
111
- <?php $this->loadView('snippets/part-upgrade-options'); ?>
 
112
 
113
  <div class='no-images' data-check-visibility="false" data-control="data-check-total-total">
114
  <?php esc_html_e('The current selection contains no images. The bulk process cannot start.', 'shortpixel-image-optimiser'); ?>
15
 
16
  <div class='summary-list'>
17
  <h3><?php esc_html_e('Review and start the Bulk Process', 'shortpixel-image-optimiser'); ?>
18
+ <span>
19
+ <img src="<?php echo esc_url(wpSPIO()->plugin_url('res/img/robo-notes.png')); ?>" style="transform: scale(-1, 1);height: 50px;"/>
20
+ </span>
21
  </h3>
22
  <div class="section-wrapper" data-check-visibility data-control="data-check-media-total">
23
  <h4><span class='dashicons dashicons-images-alt2'>&nbsp;</span>
61
  <div><span><?php esc_html_e('Total from Custom Media','shortpixel-image-optimiser'); ?></span><span data-stats-custom="images-images">0</span></div>
62
  </div>
63
  </div>
64
+ <?php
65
+ $quotaData = $this->view->quotaData;
66
+ ?>
67
  <div class="totals">
68
+ <?php
69
+ $quotaData->unlimited ? esc_html_e('Total','shortpixel-image-optimiser') : esc_html_e('Total credits needed','shortpixel-image-optimiser');
70
+ ?>: <span class="number" data-stats-total="images-images" data-check-total-total >0</span>
71
 
72
  <span class='number'></span>
73
  </div>
74
 
75
  </div>
76
+ <?php if(!$quotaData->unlimited) { ?>
 
 
 
 
77
  <div class="credits">
78
  <p class='heading'><span><?php esc_html_e('Your ShortPixel Credits Available', 'shortpixel-image-optimiser'); ?></span>
79
  <span><?php echo esc_html($this->formatNumber($quotaData->total->remaining, 0)) ?></span>
99
 
100
  <div class="over-quota" data-check-visibility="false" data-control="data-quota-remaining" data-control-check="data-check-total-total">
101
  <span><img src="<?php echo esc_url(wpSPIO()->plugin_url('res/img/bulk/over-quota.svg')) ?>" /></span>
102
+ <p><?php printf(esc_html('In your ShortPixel account you %shave only %s credits available %s, but you have chosen %s images to be optimized in this bulk process. You can either go back and select less images, or you can upgrade to a higher plan or buy one-time credits.','shortpixel-image-optimiser'), '<span class="red">', esc_html($this->formatNumber($quotaData->total->remaining, 0)), '</span>', '<b data-stats-total="images-images">0</b>'); ?>
103
 
104
  <button type="button" class="button" onClick="ShortPixel.proposeUpgrade();"><?php esc_html_e('Show me the best options') ?></button>
105
  </p>
106
 
107
  <span class='hidden' data-quota-remaining><?php
108
+ // This is hidden check, no number format.
109
+ echo esc_html($quotaData->total->remaining);
110
+ ?></span>
111
  </div>
112
+ <?php $this->loadView('snippets/part-upgrade-options'); ?>
113
+ <?php } ?>
114
 
115
  <div class='no-images' data-check-visibility="false" data-control="data-check-total-total">
116
  <?php esc_html_e('The current selection contains no images. The bulk process cannot start.', 'shortpixel-image-optimiser'); ?>
class/view/settings/part-advanced.php CHANGED
@@ -16,7 +16,7 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
16
  if( $this->is_nginx ){
17
  $deliverWebpUnaltered = ''; // Uncheck
18
  $deliverWebpUnalteredDisabled = 'disabled'; // Disable
19
- $deliverWebpUnalteredLabel = __('It looks like you\'re running your site on an NGINX server. This means that you can only achieve this functionality by directly configuring the server config files. Please, follow this link for instructions:','shortpixel-image-optimiser')." <a class=\"shortpixel-help-link\" href=\"https://shortpixel.com/knowledge-base/article/111-configure-nginx-to-transparently-serve-webp-files-when-supported\" target=\"_blank\" data-beacon-article=\"5bfeb9de2c7d3a31944e78ee\"><span class=\"dashicons dashicons-editor-help\"></span></a>";
20
  $deliverAVIFLabel = __('<strong>It looks like you\'re running your site on an NGINX server. You may need additional configuration for the AVIF delivery to work as expected</strong>','shortpixel-image-optimiser')." <a class=\"shortpixel-help-link\" href=\"https://shortpixel.com/knowledge-base/article/499-how-do-i-configure-my-web-server-to-deliver-avif-images/\" target=\"_blank\"><span class=\"dashicons dashicons-editor-help\"></span></a>";
21
  } else {
22
  if( !$this->is_htaccess_writable ){
@@ -53,8 +53,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
53
  <tr>
54
  <th scope="row"><?php esc_html_e('Next Generation Images','shortpixel-image-optimiser');?></th>
55
  <td>
 
56
  <div class='switch_button'>
57
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/286-how-to-serve-webp-files-using-spio"></span></div>
58
  <label>
59
  <input type="checkbox" class="switch" name="createWebp" value="1" <?php checked( $view->data->createWebp, "1" );?>>
60
  <div class="the_switch">&nbsp; </div>
@@ -63,19 +63,28 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
63
  </div>
64
 
65
  <p>&nbsp;</p>
66
-
 
 
 
 
 
 
 
 
 
 
67
  <div class='switch_button'>
68
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/467-how-to-create-and-serve-avif-files-using-shortpixel-image-optimizer"></span></div>
69
  <label>
70
- <input type="checkbox" class="switch" name="createAvif" value="1" <?php checked( $view->data->createAvif, "1" );?>>
71
  <div class="the_switch">&nbsp; </div>
72
  <?php printf(esc_html__('Create %s AVIF versions %s of the images, with the additional cost of 1 credit = 1 image or thumbnail.','shortpixel-image-optimiser'), '<a href="https://shortpixel.com/blog/what-is-avif-and-why-is-it-good/" target="_blank">', '</a>');?>
73
  </label>
74
  </div>
75
 
76
 
77
- <?php if($deliverAVIFLabel || true){ ?>
78
- <p class="sp-notice">
79
  <?php echo ( $deliverAVIFLabel );?>
80
  </p>
81
  <?php } ?>
@@ -83,8 +92,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
83
  <p>&nbsp;</p>
84
 
85
  <div class="deliverWebpSettings">
 
86
  <div class='switch_button'>
87
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/126-which-webp-files-delivery-method-is-the-best-for-me"></span></div>
88
  <label>
89
  <input type="checkbox" class="switch" name="deliverWebp" data-toggle="deliverTypes" value="1" <?php checked( ($view->data->deliverWebp > 0), true);?>>
90
  <div class="the_switch">&nbsp; </div>
@@ -132,8 +141,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
132
  <label for="deliverWebpUnaltered">
133
  <?php esc_html_e('Without altering the page code (via .htaccess)','shortpixel-image-optimiser')?>
134
  </label>
135
- <?php if($deliverWebpUnalteredLabel){ ?>
136
- <p class="sp-notice"><strong>
137
  <?php echo( $deliverWebpUnalteredLabel );?>
138
  </strong>
139
  </p>
@@ -146,9 +155,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
146
  <tr>
147
  <th scope="row"><?php esc_html_e('Optimize media on upload','shortpixel-image-optimiser');?></th>
148
  <td>
149
-
150
  <div class='switch_button'>
151
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/521-settings-optimize-media-on-upload"></span></div>
152
  <label>
153
  <input type="checkbox" class="switch" name="autoMediaLibrary" id='autoMediaLibrary' value="1" <?php checked( $view->data->autoMediaLibrary, "1" );?>>
154
  <div class="the_switch">&nbsp; </div>
@@ -174,7 +182,7 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
174
  <tr>
175
  <th scope='row'>&nbsp;</th>
176
  <td>
177
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.helpscoutdocs.com/article/536-why-is-the-option-process-in-the-front-end-gone"></span></div>
178
  <div class='view-notice warning'><p><?php esc_html_e('Important. From version 5 the front processing option is no longer available. There will be no processing on the frontend. To enable optimizing images without visiting the backend, please see the options available for command line optimization.', 'shortpixel-image-optimiser') ?></p>
179
  <p><?php esc_html_e('To turn off this message, click the checkbox and save settings', 'shortpixel-image-optimiser'); ?></p>
180
  </div>
@@ -204,8 +212,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
204
  <tr>
205
  <th scope="row"><?php esc_html_e('Optimize PDFs','shortpixel-image-optimiser');?></th>
206
  <td>
 
207
  <div class='switch_button'>
208
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/520-settings-optimize-pdfs"></span></div>
209
 
210
  <label>
211
  <input type="checkbox" class="switch" name="optimizePdfs" value="1" <?php checked( $view->data->optimizePdfs, "1" );?>>
@@ -219,8 +227,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
219
  <tr>
220
  <th scope="row"><?php esc_html_e('Optimize Retina images','shortpixel-image-optimiser');?></th>
221
  <td>
 
222
  <div class='switch_button'>
223
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/518-settings-optimize-retina-images"></span></div>
224
  <label>
225
  <input type="checkbox" class="switch" name="optimizeRetina" value="1" <?php checked( $view->data->optimizeRetina, "1" );?>>
226
  <div class="the_switch">&nbsp; </div>
@@ -232,10 +240,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
232
  <tr>
233
  <th scope="row"><?php esc_html_e('Optimize other thumbnails','shortpixel-image-optimiser');?></th>
234
  <td>
235
-
236
-
237
  <div class='switch_button'>
238
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/519-settings---optimize-other-thumbs"></span></div>
239
  <label>
240
  <input type="checkbox" class="switch" name="optimizeUnlisted" value="1" <?php checked( $view->data->optimizeUnlisted, "1" );?>>
241
  <div class="the_switch">&nbsp; </div>
@@ -247,8 +253,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
247
  <tr>
248
  <th scope="row"><?php esc_html_e('Convert PNG images to JPEG','shortpixel-image-optimiser');?></th>
249
  <td>
 
250
  <div class='switch_button option-png2jpg'>
251
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/516-settings-convert-png-images-to-jpeg"></span></div>
252
  <label>
253
  <input type="checkbox" class="switch" name="png2jpg" value="1" <?php checked( ($view->data->png2jpg > 0), true);?> <?php echo($this->is_gd_installed ? '' : 'disabled') ?> data-toggle="png2jpgforce">
254
  <div class="the_switch">&nbsp; </div>
@@ -283,8 +289,8 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
283
  <tr>
284
  <th scope="row"><?php esc_html_e('CMYK to RGB conversion','shortpixel-image-optimiser');?></th>
285
  <td>
 
286
  <div class='switch_button'>
287
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/517-settings---cmyk-to-rgb-conversion"></span></div>
288
  <label>
289
  <input type="checkbox" class="switch" name="cmyk2rgb" value="1" <?php checked( $view->data->CMYKtoRGBconversion, "1" );?>>
290
  <div class="the_switch">&nbsp; </div>
@@ -297,12 +303,12 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
297
  <tr>
298
  <th scope="row"><label for="excludeSizes"><?php esc_html_e('Exclude thumbnail sizes','shortpixel-image-optimiser');?></label></th>
299
  <td>
 
300
  <div class="option-content">
301
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/113-how-can-i-optimize-only-certain-thumbnail-sizes"></span></div>
302
 
303
 
304
  <?php foreach($view->allThumbSizes as $sizeKey => $sizeVal) {?>
305
- <span style="margin-right: 20px;white-space:nowrap">
306
  <label>
307
 
308
  <input name="excludeSizes[]" type="checkbox" id="excludeSizes_<?php echo esc_attr($sizeKey);?>" <?php
@@ -514,10 +520,11 @@ use \ShortPixel\Helper\UiHelper as UiHelper;
514
  <th scope="row"><label for="authentication"><?php esc_html_e('HTTP AUTH credentials','shortpixel-image-optimiser');?></label></th>
515
  <td>
516
  <?php if (! defined('SHORTPIXEL_HTTP_AUTH_USER')): ?>
517
- <input name="siteAuthUser" type="text" id="siteAuthUser" value="<?php echo( esc_html(wp_unslash($view->data->siteAuthUser )));?>" class="regular-text" placeholder="<?php esc_html_e('User','shortpixel-image-optimiser');?>"><br>
518
- <input name="siteAuthPass" type="text" id="siteAuthPass" value="<?php echo( esc_html(wp_unslash($view->data->siteAuthPass )));?>" class="regular-text" placeholder="<?php esc_html_e('Password','shortpixel-image-optimiser');?>">
519
  <p class="settings-info">
520
- <?php esc_html_e('Only fill in these fields if your site (front-end) is not publicly accessible and visitors need a user/pass to connect to it. If you don\'t know what is this then just <strong>leave the fields empty</strong>.','shortpixel-image-optimiser');?>
 
521
  </p>
522
  <?php else: ?>
523
  <p><?php esc_html_e('The HTTP AUTH credentials have been defined in the wp-config file.', 'shortpixel-image-optimiser'); ?></p>
16
  if( $this->is_nginx ){
17
  $deliverWebpUnaltered = ''; // Uncheck
18
  $deliverWebpUnalteredDisabled = 'disabled'; // Disable
19
+ $deliverWebpUnalteredLabel = __('It looks like you\'re running your site on an NGINX server. This means that you can only achieve this functionality by directly configuring the server config files. Please follow this link for instructions:','shortpixel-image-optimiser')." <a class=\"shortpixel-help-link\" href=\"https://shortpixel.com/knowledge-base/article/111-configure-nginx-to-transparently-serve-webp-files-when-supported\" target=\"_blank\" data-beacon-article=\"5bfeb9de2c7d3a31944e78ee\"><span class=\"dashicons dashicons-editor-help\"></span></a>";
20
  $deliverAVIFLabel = __('<strong>It looks like you\'re running your site on an NGINX server. You may need additional configuration for the AVIF delivery to work as expected</strong>','shortpixel-image-optimiser')." <a class=\"shortpixel-help-link\" href=\"https://shortpixel.com/knowledge-base/article/499-how-do-i-configure-my-web-server-to-deliver-avif-images/\" target=\"_blank\"><span class=\"dashicons dashicons-editor-help\"></span></a>";
21
  } else {
22
  if( !$this->is_htaccess_writable ){
53
  <tr>
54
  <th scope="row"><?php esc_html_e('Next Generation Images','shortpixel-image-optimiser');?></th>
55
  <td>
56
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/286-how-to-serve-webp-files-using-spio"></span></div>
57
  <div class='switch_button'>
 
58
  <label>
59
  <input type="checkbox" class="switch" name="createWebp" value="1" <?php checked( $view->data->createWebp, "1" );?>>
60
  <div class="the_switch">&nbsp; </div>
63
  </div>
64
 
65
  <p>&nbsp;</p>
66
+ <?php
67
+ $avifEnabled = $this->access()->isFeatureAvailable('avif');
68
+ $createAvifChecked = ($view->data->createAvif == 1 && $avifEnabled === true) ? true : false;
69
+ $disabled = ($avifEnabled === false) ? 'disabled' : '';
70
+ if ($avifEnabled == false)
71
+ {
72
+ $deliverAVIFLabel = __('The creation of AVIF files is not possible with this license type.', 'shortpixel-image-optimiser');
73
+ }
74
+ ?>
75
+
76
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/467-how-to-create-and-serve-avif-files-using-shortpixel-image-optimizer"></span></div>
77
  <div class='switch_button'>
 
78
  <label>
79
+ <input type="checkbox" class="switch" name="createAvif" value="1" <?php echo $disabled ?> <?php checked( $createAvifChecked );?>>
80
  <div class="the_switch">&nbsp; </div>
81
  <?php printf(esc_html__('Create %s AVIF versions %s of the images, with the additional cost of 1 credit = 1 image or thumbnail.','shortpixel-image-optimiser'), '<a href="https://shortpixel.com/blog/what-is-avif-and-why-is-it-good/" target="_blank">', '</a>');?>
82
  </label>
83
  </div>
84
 
85
 
86
+ <?php if(strlen($deliverAVIFLabel)){ ?>
87
+ <p class="sp-notice sp-notice-warning">
88
  <?php echo ( $deliverAVIFLabel );?>
89
  </p>
90
  <?php } ?>
92
  <p>&nbsp;</p>
93
 
94
  <div class="deliverWebpSettings">
95
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/126-which-webp-files-delivery-method-is-the-best-for-me"></span></div>
96
  <div class='switch_button'>
 
97
  <label>
98
  <input type="checkbox" class="switch" name="deliverWebp" data-toggle="deliverTypes" value="1" <?php checked( ($view->data->deliverWebp > 0), true);?>>
99
  <div class="the_switch">&nbsp; </div>
141
  <label for="deliverWebpUnaltered">
142
  <?php esc_html_e('Without altering the page code (via .htaccess)','shortpixel-image-optimiser')?>
143
  </label>
144
+ <?php if(strlen($deliverWebpUnalteredLabel)){ ?>
145
+ <p class="sp-notice sp-notice-warning"><strong>
146
  <?php echo( $deliverWebpUnalteredLabel );?>
147
  </strong>
148
  </p>
155
  <tr>
156
  <th scope="row"><?php esc_html_e('Optimize media on upload','shortpixel-image-optimiser');?></th>
157
  <td>
158
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/521-settings-optimize-media-on-upload"></span></div>
159
  <div class='switch_button'>
 
160
  <label>
161
  <input type="checkbox" class="switch" name="autoMediaLibrary" id='autoMediaLibrary' value="1" <?php checked( $view->data->autoMediaLibrary, "1" );?>>
162
  <div class="the_switch">&nbsp; </div>
182
  <tr>
183
  <th scope='row'>&nbsp;</th>
184
  <td>
185
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.helpscoutdocs.com/article/536-why-is-the-option-process-in-the-front-end-gone"></span></div>
186
  <div class='view-notice warning'><p><?php esc_html_e('Important. From version 5 the front processing option is no longer available. There will be no processing on the frontend. To enable optimizing images without visiting the backend, please see the options available for command line optimization.', 'shortpixel-image-optimiser') ?></p>
187
  <p><?php esc_html_e('To turn off this message, click the checkbox and save settings', 'shortpixel-image-optimiser'); ?></p>
188
  </div>
212
  <tr>
213
  <th scope="row"><?php esc_html_e('Optimize PDFs','shortpixel-image-optimiser');?></th>
214
  <td>
215
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/520-settings-optimize-pdfs"></span></div>
216
  <div class='switch_button'>
 
217
 
218
  <label>
219
  <input type="checkbox" class="switch" name="optimizePdfs" value="1" <?php checked( $view->data->optimizePdfs, "1" );?>>
227
  <tr>
228
  <th scope="row"><?php esc_html_e('Optimize Retina images','shortpixel-image-optimiser');?></th>
229
  <td>
230
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/518-settings-optimize-retina-images"></span></div>
231
  <div class='switch_button'>
 
232
  <label>
233
  <input type="checkbox" class="switch" name="optimizeRetina" value="1" <?php checked( $view->data->optimizeRetina, "1" );?>>
234
  <div class="the_switch">&nbsp; </div>
240
  <tr>
241
  <th scope="row"><?php esc_html_e('Optimize other thumbnails','shortpixel-image-optimiser');?></th>
242
  <td>
243
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/519-settings---optimize-other-thumbs"></span></div>
 
244
  <div class='switch_button'>
 
245
  <label>
246
  <input type="checkbox" class="switch" name="optimizeUnlisted" value="1" <?php checked( $view->data->optimizeUnlisted, "1" );?>>
247
  <div class="the_switch">&nbsp; </div>
253
  <tr>
254
  <th scope="row"><?php esc_html_e('Convert PNG images to JPEG','shortpixel-image-optimiser');?></th>
255
  <td>
256
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/516-settings-convert-png-images-to-jpeg"></span></div>
257
  <div class='switch_button option-png2jpg'>
 
258
  <label>
259
  <input type="checkbox" class="switch" name="png2jpg" value="1" <?php checked( ($view->data->png2jpg > 0), true);?> <?php echo($this->is_gd_installed ? '' : 'disabled') ?> data-toggle="png2jpgforce">
260
  <div class="the_switch">&nbsp; </div>
289
  <tr>
290
  <th scope="row"><?php esc_html_e('CMYK to RGB conversion','shortpixel-image-optimiser');?></th>
291
  <td>
292
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/517-settings---cmyk-to-rgb-conversion"></span></div>
293
  <div class='switch_button'>
 
294
  <label>
295
  <input type="checkbox" class="switch" name="cmyk2rgb" value="1" <?php checked( $view->data->CMYKtoRGBconversion, "1" );?>>
296
  <div class="the_switch">&nbsp; </div>
303
  <tr>
304
  <th scope="row"><label for="excludeSizes"><?php esc_html_e('Exclude thumbnail sizes','shortpixel-image-optimiser');?></label></th>
305
  <td>
306
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/113-how-can-i-optimize-only-certain-thumbnail-sizes"></span></div>
307
  <div class="option-content">
 
308
 
309
 
310
  <?php foreach($view->allThumbSizes as $sizeKey => $sizeVal) {?>
311
+ <span style="margin-right: 20px; white-space:nowrap; line-height: 24px;">
312
  <label>
313
 
314
  <input name="excludeSizes[]" type="checkbox" id="excludeSizes_<?php echo esc_attr($sizeKey);?>" <?php
520
  <th scope="row"><label for="authentication"><?php esc_html_e('HTTP AUTH credentials','shortpixel-image-optimiser');?></label></th>
521
  <td>
522
  <?php if (! defined('SHORTPIXEL_HTTP_AUTH_USER')): ?>
523
+ <input name="siteAuthUser" type="text" id="siteAuthUser" value="<?php echo( esc_html(wp_unslash($view->data->siteAuthUser )));?>" class="regular-text" placeholder="<?php esc_html_e('User','shortpixel-image-optimiser');?>" style="margin-bottom: 8px"><br>
524
+ <input name="siteAuthPass" type="text" id="siteAuthPass" value="<?php echo( esc_html(wp_unslash($view->data->siteAuthPass )));?>" class="regular-text" placeholder="<?php esc_html_e('Password','shortpixel-image-optimiser');?>" style="margin-bottom: 8px">
525
  <p class="settings-info">
526
+ <?php printf(esc_html__('Only fill in these fields if your site (front-end) is not publicly accessible and visitors need a user/pass to connect to it.
527
+ If you don\'t know what is this then just %sleave the fields empty%s.','shortpixel-image-optimiser'), '<strong>', '</strong>'); ?>
528
  </p>
529
  <?php else: ?>
530
  <p><?php esc_html_e('The HTTP AUTH credentials have been defined in the wp-config file.', 'shortpixel-image-optimiser'); ?></p>
class/view/settings/part-debug.php CHANGED
@@ -3,7 +3,7 @@ namespace ShortPixel;
3
  use ShortPixel\Notices\NoticeController as NoticeController;
4
  use Shortpixel\Controller\StatsController as StatsController;
5
  use Shortpixel\Controller\OptimizeController as OptimizeController;
6
-
7
 
8
  $opt = new OptimizeController();
9
 
@@ -63,7 +63,7 @@ $env = \wpSPIO()->env();
63
 
64
 
65
  <div class='debug-quota'>
66
- <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_resetquota'))) ?>">
67
 
68
  <button class='button' type='submit'>Clear Quota Data</button>
69
  </form>
@@ -103,7 +103,7 @@ $env = \wpSPIO()->env();
103
  </div> <!-- stats -->
104
 
105
  <div class='debug-stats'>
106
- <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_resetStats'))) ?>"
107
  id="shortpixel-form-debug-stats">
108
  <button class='button' type='submit'>Clear statistics cache</button>
109
  </form>
@@ -117,16 +117,25 @@ $env = \wpSPIO()->env();
117
  <div class='table notices'>
118
 
119
  <div class='head'>
120
- <span>ID</span><span>Done</span><span>Dismissed</span><span>Persistent</span>
121
  </div>
122
 
123
- <?php foreach ($notices as $noticeObj): ?>
 
 
 
 
 
 
 
124
 
125
  <div>
126
  <span><?php echo esc_html($noticeObj->getID()); ?></span>
127
  <span><?php echo ($noticeObj->isDone()) ? 'Y' : 'N'; ?> </span>
128
  <span><?php echo ($noticeObj->isDismissed()) ? 'Y' : 'N'; ?> </span>
129
  <span><?php echo ($noticeObj->isPersistent()) ? 'Y' : 'N'; ?> </span>
 
 
130
 
131
  </div>
132
 
@@ -135,12 +144,32 @@ $env = \wpSPIO()->env();
135
  </div>
136
 
137
  <div class='debug-notices'>
138
- <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_resetNotices'))) ?>"
139
  id="shortpixel-form-debug-stats">
140
  <button class='button' type='submit'>Reset Notices</button>
141
  </form>
142
  </div>
143
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
144
  <p>&nbsp;</p>
145
 
146
  <div class='table queue-stats'>
@@ -186,7 +215,7 @@ $env = \wpSPIO()->env();
186
  <?php endforeach; ?>
187
 
188
  <div class='debug-queue'>
189
- <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_resetQueue'))) ?>"
190
  id="shortpixel-form-reset-queue">
191
  <button class='button' type='submit'>Reset ShortQ</button>
192
  <select name="queue">
@@ -203,7 +232,7 @@ $env = \wpSPIO()->env();
203
 
204
  <p></p>
205
  <div class='debug-key'>
206
- <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_removeProcessorKey'))) ?>"
207
  id="shortpixel-form-debug-stats">
208
  <button class='button' type='submit'>Reset Processor Key</button>
209
  </form>
3
  use ShortPixel\Notices\NoticeController as NoticeController;
4
  use Shortpixel\Controller\StatsController as StatsController;
5
  use Shortpixel\Controller\OptimizeController as OptimizeController;
6
+ use ShortPixel\Controller\AdminNoticesController as AdminNoticesController;
7
 
8
  $opt = new OptimizeController();
9
 
63
 
64
 
65
  <div class='debug-quota'>
66
+ <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_resetquota'), $this->url)) ?>">
67
 
68
  <button class='button' type='submit'>Clear Quota Data</button>
69
  </form>
103
  </div> <!-- stats -->
104
 
105
  <div class='debug-stats'>
106
+ <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_resetStats'), $this->url)) ?>"
107
  id="shortpixel-form-debug-stats">
108
  <button class='button' type='submit'>Clear statistics cache</button>
109
  </form>
117
  <div class='table notices'>
118
 
119
  <div class='head'>
120
+ <span>ID</span><span>Done</span><span>Dismissed</span><span>Persistent</span><span>Exclude</span><span>Include</span>
121
  </div>
122
 
123
+ <?php foreach ($notices as $noticeObj):
124
+ $exclude = $noticeObj->_debug_getvar('exclude_screens');
125
+ $include = $noticeObj->_debug_getvar('include_screens');
126
+
127
+ $exclude = is_array($exclude) ? implode(',', $exclude) : $exclude;
128
+ $include = is_array($include) ? implode(',', $include) : $include;
129
+
130
+ ?>
131
 
132
  <div>
133
  <span><?php echo esc_html($noticeObj->getID()); ?></span>
134
  <span><?php echo ($noticeObj->isDone()) ? 'Y' : 'N'; ?> </span>
135
  <span><?php echo ($noticeObj->isDismissed()) ? 'Y' : 'N'; ?> </span>
136
  <span><?php echo ($noticeObj->isPersistent()) ? 'Y' : 'N'; ?> </span>
137
+ <span><?php echo $exclude ?></span>
138
+ <span><?php echo $include ?></span>
139
 
140
  </div>
141
 
144
  </div>
145
 
146
  <div class='debug-notices'>
147
+ <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_resetNotices'),$this->url)) ?>"
148
  id="shortpixel-form-debug-stats">
149
  <button class='button' type='submit'>Reset Notices</button>
150
  </form>
151
  </div>
152
 
153
+ <div class='trigger-notices'>
154
+ <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_triggerNotice'), $this->url)) ?>"
155
+ id="shortpixel-form-debug-stats">
156
+ <?php
157
+ $controller = AdminNoticesController::getInstance();
158
+ $notices = $controller->getAllNotices();
159
+ // $refl = new \ReflectionClass('ShortPixel\Controller\AdminNoticesController');
160
+ // $constants = $refl->getConstants();
161
+ ?>
162
+ <select name="notice_constant">
163
+ <option value="trigger-all">Trigger All</option>
164
+ <?php foreach($notices as $key => $noticeObj)
165
+ echo "<option value='$key'>$key </option>";
166
+ ?>
167
+ </select>
168
+ <button class="button" type="submit">Trigger this Notice</button>
169
+
170
+ </form>
171
+ </div>
172
+
173
  <p>&nbsp;</p>
174
 
175
  <div class='table queue-stats'>
215
  <?php endforeach; ?>
216
 
217
  <div class='debug-queue'>
218
+ <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_resetQueue'),$this->url)) ?>"
219
  id="shortpixel-form-reset-queue">
220
  <button class='button' type='submit'>Reset ShortQ</button>
221
  <select name="queue">
232
 
233
  <p></p>
234
  <div class='debug-key'>
235
+ <form method="POST" action="<?php echo esc_url(add_query_arg(array('sp-action' => 'action_debug_removeProcessorKey'),$this->url)) ?>"
236
  id="shortpixel-form-debug-stats">
237
  <button class='button' type='submit'>Reset Processor Key</button>
238
  </form>
class/view/settings/part-general.php CHANGED
@@ -70,6 +70,7 @@ namespace ShortPixel;
70
  <label for="compressionType"><?php esc_html_e('Compression type:','shortpixel-image-optimiser');?></label>
71
  </th>
72
  <td>
 
73
 
74
  <input type="hidden" id="compressionType-database" value="<?php echo esc_attr($view->data->compressionType) ?>">
75
  <div class="shortpixel-compression">
@@ -88,7 +89,6 @@ namespace ShortPixel;
88
 
89
  <?php printf(esc_html__('%s Run a few tests%s to help you decide.', 'shortpixel-image-optimiser'), '<a href="https://shortpixel.com/online-image-compression" style="margin-left:20px;" target="_blank">', '</a>'); ?>
90
 
91
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/11-lossy-glossy-or-lossless-which-one-is-the-best-for-me"></span></div>
92
 
93
  <p class="settings-info shortpixel-radio-info shortpixel-radio-lossy" <?php echo( $view->data->compressionType == 1 ? "" : 'style="display:none"' );?>>
94
  <?php printf(esc_html__('%sLossy compression (recommended): %s offers the best compression rate. %s This is the recommended option for most users, producing results that look the same as the original to the human eye.','shortpixel-image-optimiser'),'<b>','</b>', '<br />');?>
@@ -132,9 +132,8 @@ namespace ShortPixel;
132
  <tr>
133
  <th scope="row"><?php esc_html_e('Thumbnail compression:','shortpixel-image-optimiser');?></th>
134
  <td>
135
-
136
  <div class='switch_button'>
137
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/511-settings-also-include-thumbnails"></span></div>
138
  <label>
139
  <input type="checkbox" class="switch" name="processThumbnails" value="1" <?php checked($view->data->processThumbnails, '1');?>>
140
  <div class="the_switch">&nbsp; </div>
@@ -152,13 +151,12 @@ namespace ShortPixel;
152
  <tr>
153
  <th scope="row"><?php esc_html_e('Enable SmartCrop:','shortpixel-image-optimiser');?></th>
154
  <td>
155
-
156
- <div class='switch_button'>
157
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/182-what-is-smart-cropping"></span></div>
158
  <label>
159
  <input type="checkbox" class="switch" name="useSmartcrop" value="1" <?php checked($view->data->useSmartcrop, '1');?>>
160
  <div class="the_switch">&nbsp; </div>
161
- <?php printf(esc_html__('Enable %s Smartcropping %s option.','shortpixel-image-optimiser'), '<strong>', '</strong>'); ?>
162
  </label>
163
  </div>
164
 
@@ -196,10 +194,8 @@ namespace ShortPixel;
196
  <tr>
197
  <th scope="row"><?php esc_html_e('Remove EXIF','shortpixel-image-optimiser');?></th>
198
  <td>
199
-
200
  <div class='switch_button'>
201
- <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/483-spai-remove-exif">
202
- </span></div>
203
  <label>
204
  <input type="checkbox" class="switch" name="removeExif" value="1" <?php checked($view->data->keepExif, 0);?>>
205
  <div class="the_switch">&nbsp; </div>
70
  <label for="compressionType"><?php esc_html_e('Compression type:','shortpixel-image-optimiser');?></label>
71
  </th>
72
  <td>
73
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/11-lossy-glossy-or-lossless-which-one-is-the-best-for-me"></span></div>
74
 
75
  <input type="hidden" id="compressionType-database" value="<?php echo esc_attr($view->data->compressionType) ?>">
76
  <div class="shortpixel-compression">
89
 
90
  <?php printf(esc_html__('%s Run a few tests%s to help you decide.', 'shortpixel-image-optimiser'), '<a href="https://shortpixel.com/online-image-compression" style="margin-left:20px;" target="_blank">', '</a>'); ?>
91
 
 
92
 
93
  <p class="settings-info shortpixel-radio-info shortpixel-radio-lossy" <?php echo( $view->data->compressionType == 1 ? "" : 'style="display:none"' );?>>
94
  <?php printf(esc_html__('%sLossy compression (recommended): %s offers the best compression rate. %s This is the recommended option for most users, producing results that look the same as the original to the human eye.','shortpixel-image-optimiser'),'<b>','</b>', '<br />');?>
132
  <tr>
133
  <th scope="row"><?php esc_html_e('Thumbnail compression:','shortpixel-image-optimiser');?></th>
134
  <td>
135
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/511-settings-also-include-thumbnails"></span></div>
136
  <div class='switch_button'>
 
137
  <label>
138
  <input type="checkbox" class="switch" name="processThumbnails" value="1" <?php checked($view->data->processThumbnails, '1');?>>
139
  <div class="the_switch">&nbsp; </div>
151
  <tr>
152
  <th scope="row"><?php esc_html_e('Enable SmartCrop:','shortpixel-image-optimiser');?></th>
153
  <td>
154
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/182-what-is-smart-cropping"></span></div>
155
+ <div class='switch_button'>
 
156
  <label>
157
  <input type="checkbox" class="switch" name="useSmartcrop" value="1" <?php checked($view->data->useSmartcrop, '1');?>>
158
  <div class="the_switch">&nbsp; </div>
159
+ <?php printf(esc_html__('Enable %s Smart cropping %s of the images where applicable.','shortpixel-image-optimiser'), '<strong>', '</strong>'); ?>
160
  </label>
161
  </div>
162
 
194
  <tr>
195
  <th scope="row"><?php esc_html_e('Remove EXIF','shortpixel-image-optimiser');?></th>
196
  <td>
197
+ <div class="spio-inline-help"><span class="dashicons dashicons-editor-help" title="Click for more info" data-link="https://shortpixel.com/knowledge-base/article/483-spai-remove-exif"></span></div>
198
  <div class='switch_button'>
 
 
199
  <label>
200
  <input type="checkbox" class="switch" name="removeExif" value="1" <?php checked($view->data->keepExif, 0);?>>
201
  <div class="the_switch">&nbsp; </div>
class/view/settings/part-optpie.php CHANGED
@@ -10,28 +10,26 @@ if( $total >0 ) {
10
 
11
  ?>
12
 
13
- <?php if ( round($view->averageCompression) > 20): ?>
14
- <div class="sp-bulk-summary">
15
- <span><?php esc_html_e('Average optimization', 'shortpixel-image-optimiser'); ?></span>
16
- <a title="<?php esc_html_e('Average optimization', 'shortpixel-image-optimiser'); ?>">
17
- <svg class="opt-circle-average" viewBox="-10 0 150 140">
18
- <path class="trail" d="
19
- M 50,50
20
- m 0,-46
21
- a 46,46 0 1 1 0,92
22
- a 46,46 0 1 1 0,-92
23
- " stroke-width="16" fill-opacity="0">
24
- </path>
25
- <path class="path" d="
26
- M 50,50
27
- m 0,-46
28
- a 46,46 0 1 1 0,92
29
- a 46,46 0 1 1 0,-92
30
- " stroke-width="16" fill-opacity="0" style="stroke-dasharray: 289.027px, 289.027px; stroke-dashoffset: <?php echo esc_html($total_circle) ?>">
31
- </path>
32
- <text class="text" x="52" y="55"><?php echo esc_html($total) ?>%</text>
33
- </svg>
34
- </a>
35
 
36
- </div>
37
- <?php endif; ?>
10
 
11
  ?>
12
 
13
+ <div class="sp-bulk-summary">
14
+ <span><?php esc_html_e('Average optimization', 'shortpixel-image-optimiser'); ?></span><br>
15
+ <a title="<?php esc_html_e('Average optimization', 'shortpixel-image-optimiser'); ?>">
16
+ <svg class="opt-circle-average" viewBox="-10 0 120 100">
17
+ <path class="trail" d="
18
+ M 50,50
19
+ m 0,-46
20
+ a 46,46 0 1 1 0,92
21
+ a 46,46 0 1 1 0,-92
22
+ " stroke-width="16" fill-opacity="0">
23
+ </path>
24
+ <path class="path" d="
25
+ M 50,50
26
+ m 0,-46
27
+ a 46,46 0 1 1 0,92
28
+ a 46,46 0 1 1 0,-92
29
+ " stroke-width="16" fill-opacity="0" style="stroke-dasharray: 289.027px, 289.027px; stroke-dashoffset: <?php echo esc_html($total_circle) ?>">
30
+ </path>
31
+ <text class="text" x="52" y="55"><?php echo esc_html($total) ?>%</text>
32
+ </svg>
33
+ </a>
 
34
 
35
+ </div>
 
class/view/view-settings.php CHANGED
@@ -5,33 +5,41 @@ use ShortPixel\ShortpixelLogger\ShortPixelLogger as Log;
5
 
6
  ?>
7
  <div class="wrap is-shortpixel-settings-page">
8
- <h1><?php esc_html_e('ShortPixel Plugin Settings','shortpixel-image-optimiser');?></h1>
 
 
9
  <div class='top-menu'>
10
 
11
- <div class='links'>
12
  <a href="https://shortpixel.com/<?php
13
- echo esc_attr(($view->data->apiKey ? "login/". $view->data->apiKey : "pricing"));
14
  ?>" target="_blank"><?php esc_html_e( 'Buy credits', 'shortpixel-image-optimiser' );?></a> |
15
  <a href="https://shortpixel.com/knowledge-base/" target="_blank"><?php esc_html_e('Knowledge Base','shortpixel-image-optimiser');?></a> |
16
  <a href="https://shortpixel.com/contact" target="_blank"><?php esc_html_e('Contact Support','shortpixel-image-optimiser');?></a> |
17
  <a href="https://shortpixel.com/<?php
18
- echo esc_attr(($view->data->apiKey ? "login/". $view->data->apiKey . "/dashboard" : "login"));
19
  ?>" target="_blank">
20
  <?php esc_html_e('ShortPixel account','shortpixel-image-optimiser');?>
21
  </a>
22
- <div class='pie-wrapper'><?php $this->loadView('settings/part-optpie'); ?></div>
23
- </div>
24
 
 
 
 
 
 
25
 
26
- <?php if (! is_null($this->quotaData)): ?>
27
- <div class='quota-remaining'>
28
- <a href="https://shortpixel.com/<?php
29
- echo esc_attr(($view->data->apiKey ? "login/". $view->data->apiKey . "/dashboard" : "login"));
30
- ?>" target="_blank">
31
- <?php printf(esc_html__('%s Credits remaining', 'shortpixel-image-optimiser'), esc_html($this->formatNumber($this->quotaData->total->remaining, 0))); ?>
32
- </a>
33
- </div>
34
- <?php endif; ?>
 
 
35
  </div>
36
 
37
  <hr class='wp-header-end'>
5
 
6
  ?>
7
  <div class="wrap is-shortpixel-settings-page">
8
+ <h1>
9
+ <?php esc_html_e('ShortPixel Plugin Settings','shortpixel-image-optimiser');?>
10
+ </h1>
11
  <div class='top-menu'>
12
 
13
+ <div class='links'>
14
  <a href="https://shortpixel.com/<?php
15
+ echo esc_attr(($view->data->apiKey ? "login/". $view->data->apiKey : "pricing"));
16
  ?>" target="_blank"><?php esc_html_e( 'Buy credits', 'shortpixel-image-optimiser' );?></a> |
17
  <a href="https://shortpixel.com/knowledge-base/" target="_blank"><?php esc_html_e('Knowledge Base','shortpixel-image-optimiser');?></a> |
18
  <a href="https://shortpixel.com/contact" target="_blank"><?php esc_html_e('Contact Support','shortpixel-image-optimiser');?></a> |
19
  <a href="https://shortpixel.com/<?php
20
+ echo esc_attr(($view->data->apiKey ? "login/". $view->data->apiKey . "/dashboard" : "login"));
21
  ?>" target="_blank">
22
  <?php esc_html_e('ShortPixel account','shortpixel-image-optimiser');?>
23
  </a>
24
+ </div>
 
25
 
26
+ <?php if ( round($view->averageCompression) > 20 || (!is_null($this->quotaData) && !$this->quotaData->unlimited)): ?>
27
+ <div class="spio-status-box">
28
+ <?php if ( round($view->averageCompression) > 20): ?>
29
+ <div class='pie-wrapper'><?php $this->loadView('settings/part-optpie'); ?></div>
30
+ <?php endif; ?>
31
 
32
+ <?php if (!is_null($this->quotaData) && !$this->quotaData->unlimited): ?>
33
+ <div class='quota-remaining'>
34
+ <a href="https://shortpixel.com/<?php
35
+ echo esc_attr(($view->data->apiKey ? "login/". $view->data->apiKey . "/dashboard" : "login"));
36
+ ?>" target="_blank">
37
+ <?php printf(esc_html__('%s Credits remaining', 'shortpixel-image-optimiser'), esc_html($this->formatNumber(max(0, $this->quotaData->total->remaining), 0))); ?>
38
+ </a>
39
+ </div>
40
+ <?php endif; ?>
41
+ </div>
42
+ <?php endif; ?>
43
  </div>
44
 
45
  <hr class='wp-header-end'>
class/wp-shortpixel-settings.php CHANGED
@@ -69,7 +69,6 @@ class WPShortPixelSettings extends \ShortPixel\Model {
69
  'thumbsCount' => array('key' => 'wp-short-pixel-thumbnail-count', 'default' => 0, 'group' => 'state'),
70
  'under5Percent' => array('key' => 'wp-short-pixel-files-under-5-percent', 'default' => 0, 'group' => 'state'),
71
  'savedSpace' => array('key' => 'wp-short-pixel-savedSpace', 'default' => 0, 'group' => 'state'),
72
- //'averageCompression' => array('key' => 'wp-short-pixel-averageCompression', 'default' => null, 'group' => 'state'),
73
  'apiRetries' => array('key' => 'wp-short-pixel-api-retries', 'default' => 0, 'group' => 'state'),
74
  'totalOptimized' => array('key' => 'wp-short-pixel-total-optimized', 'default' => 0, 'group' => 'state'),
75
  'totalOriginal' => array('key' => 'wp-short-pixel-total-original', 'default' => 0, 'group' => 'state'),
@@ -78,40 +77,12 @@ class WPShortPixelSettings extends \ShortPixel\Model {
78
  'downloadProto' => array('key' => 'wp-short-pixel-download-protocol', 'default' => null, 'group' => 'state'),
79
 
80
  'downloadArchive' => array('key' => 'wp-short-pixel-download-archive', 'default' => -1, 'group' => 'state'),
81
- // 'mediaAlert' => array('key' => 'wp-short-pixel-media-alert', 'default' => null, 'group' => 'state'),
82
- // 'dismissedNotices' => array('key' => 'wp-short-pixel-dismissed-notices', 'default' => array(), 'group' => 'state'),
83
  'activationDate' => array('key' => 'wp-short-pixel-activation-date', 'default' => null, 'group' => 'state'),
84
- //'activationNotice' => array('key' => 'wp-short-pixel-activation-notice', 'default' => null, 'group' => 'state'),
85
  'mediaLibraryViewMode' => array('key' => 'wp-short-pixel-view-mode', 'default' => false, 'group' => 'state'),
86
  'redirectedSettings' => array('key' => 'wp-short-pixel-redirected-settings', 'default' => null, 'group' => 'state'),
87
  'convertedPng2Jpg' => array('key' => 'wp-short-pixel-converted-png2jpg', 'default' => array(), 'group' => 'state'),
88
- //'helpscoutOptin' => array('key' => 'wp-short-pixel-helpscout-optin', 'default' => -1, 'group' => 'state'),
89
-
90
-
91
- //bulk state machine
92
- // @todo These options can all go. Add as well to onDeactivate / onActivate deletions.
93
- // 'bulkType' => array('key' => 'wp-short-pixel-bulk-type', 'default' => null, 'group' => 'bulk'),
94
- // 'bulkLastStatus' => array('key' => 'wp-short-pixel-bulk-last-status', 'default' => null, 'group' => 'bulk'),
95
- // 'startBulkId' => array('key' => 'wp-short-pixel-query-id-start', 'default' => 0, 'group' => 'bulk'),
96
- // 'stopBulkId' => array('key' => 'wp-short-pixel-query-id-stop', 'default' => 0, 'group' => 'bulk'),
97
- // 'bulkCount' => array('key' => 'wp-short-pixel-bulk-count', 'default' => 0, 'group' => 'bulk'),
98
- // 'bulkPreviousPercent' => array('key' => 'wp-short-pixel-bulk-previous-percent', 'default' => 0, 'group' => 'bulk'),
99
- // 'bulkCurrentlyProcessed' => array('key' => 'wp-short-pixel-bulk-processed-items', 'default' => 0, 'group' => 'bulk'),
100
- // 'bulkAlreadyDoneCount' => array('key' => 'wp-short-pixel-bulk-done-count', 'default' => 0, 'group' => 'bulk'),
101
- // 'lastBulkStartTime' => array('key' => 'wp-short-pixel-last-bulk-start-time', 'default' => 0, 'group' => 'bulk'),
102
- // 'lastBulkSuccessTime' => array('key' => 'wp-short-pixel-last-bulk-success-time', 'default' => 0, 'group' => 'bulk'),
103
- // 'bulkRunningTime' => array('key' => 'wp-short-pixel-bulk-running-time', 'default' => 0, 'group' => 'bulk'),
104
- // 'cancelPointer' => array('key' => 'wp-short-pixel-cancel-pointer', 'default' => 0, 'group' => 'bulk'),
105
- // 'skipToCustom' => array('key' => 'wp-short-pixel-skip-to-custom', 'default' => null, 'group' => 'bulk'),
106
- // 'bulkEverRan' => array('key' => 'wp-short-pixel-bulk-ever-ran', 'default' => false, 'group' => 'bulk'),
107
- // 'flagId' => array('key' => 'wp-short-pixel-flag-id', 'default' => 0, 'group' => 'bulk'),
108
- // 'failedImages' => array('key' => 'wp-short-pixel-failed-imgs', 'default' => 0, 'group' => 'bulk'),
109
- // 'bulkProcessingStatus' => array('key' => 'bulkProcessingStatus', 'default' => null, 'group' => 'bulk'),
110
-
111
- //'priorityQueue' => array('key' => 'wp-short-pixel-priorityQueue', 'default' => array()),
112
- // 'prioritySkip' => array('key' => 'wp-short-pixel-prioritySkip', 'default' => array(), 'group' => 'state'),
113
-
114
- //'' => array('key' => 'wp-short-pixel-', 'default' => null),
115
  );
116
 
117
  // This array -- field_name -> (s)anitize mask
@@ -152,33 +123,7 @@ class WPShortPixelSettings extends \ShortPixel\Model {
152
  // 'helpscoutOptin' => array('s' => 'boolean'), // checkbox
153
  );
154
 
155
- public function __construct() {
156
- //$this->populateOptions();
157
- }
158
-
159
- public function populateOptions() {
160
-
161
- /* $this->_apiKey = self::getOpt('wp-short-pixel-apiKey', '');
162
- $this->_verifiedKey = self::getOpt('wp-short-pixel-verifiedKey', $this->_verifiedKey);
163
- $this->_compressionType = self::getOpt('wp-short-pixel-compression', $this->_compressionType);
164
- $this->_processThumbnails = self::getOpt('wp-short-process_thumbnails', $this->_processThumbnails);
165
- $this->_CMYKtoRGBconversion = self::getOpt('wp-short-pixel_cmyk2rgb', $this->_CMYKtoRGBconversion);
166
- $this->_backupImages = self::getOpt('wp-short-backup_images', $this->_backupImages);
167
- $this->_resizeImages = self::getOpt( 'wp-short-pixel-resize-images', 0);
168
- $this->_resizeWidth = self::getOpt( 'wp-short-pixel-resize-width', 0);
169
- $this->_resizeHeight = self::getOpt( 'wp-short-pixel-resize-height', 0); */
170
-
171
- // the following lines practically set defaults for options if they're not set
172
- /*foreach(self::$_optionsMap as $opt) {
173
- self::getOpt($opt['key'], $opt['default']);
174
- }
175
-
176
- if(self::getOpt("downloadArchive") == -1) {
177
- self::setOpt(self::$_optionsMap["downloadArchive"]['key'], crc32(get_site_url())%10);
178
- } */
179
- }
180
-
181
- public static function resetOptions() {
182
  foreach(self::$_optionsMap as $key => $val) {
183
  delete_option($val['key']);
184
  }
@@ -200,19 +145,7 @@ class WPShortPixelSettings extends \ShortPixel\Model {
200
  delete_option(self::$_optionsMap['removeSettingsOnDeletePlugin']['key']);
201
  }
202
  // Dismissed now via Notices Controller.
203
- /* $dismissed = get_option('wp-short-pixel-dismissed-notices', array());
204
- if(isset($dismissed['compat'])) {
205
- unset($dismissed['compat']);
206
- update_option('wp-short-pixel-dismissed-notices', $dismissed, 'no');
207
- } */
208
-
209
- //$formerPrio = get_option('wp-short-pixel-priorityQueue');
210
- // $qGet = (! defined('SHORTPIXEL_NOFLOCK')) ? ShortPixelQueue::get() : ShortPixelQueueDB::get();
211
- /* if(is_array($formerPrio) && !count($qGet)) {
212
 
213
- (! defined('SHORTPIXEL_NOFLOCK')) ? ShortPixelQueue::set($formerPrio) : ShortPixelQueueDB::set($formerPrio); */
214
- // delete_option('wp-short-pixel-priorityQueue');
215
- // }
216
  }
217
 
218
  public static function onDeactivate() {
69
  'thumbsCount' => array('key' => 'wp-short-pixel-thumbnail-count', 'default' => 0, 'group' => 'state'),
70
  'under5Percent' => array('key' => 'wp-short-pixel-files-under-5-percent', 'default' => 0, 'group' => 'state'),
71
  'savedSpace' => array('key' => 'wp-short-pixel-savedSpace', 'default' => 0, 'group' => 'state'),
 
72
  'apiRetries' => array('key' => 'wp-short-pixel-api-retries', 'default' => 0, 'group' => 'state'),
73
  'totalOptimized' => array('key' => 'wp-short-pixel-total-optimized', 'default' => 0, 'group' => 'state'),
74
  'totalOriginal' => array('key' => 'wp-short-pixel-total-original', 'default' => 0, 'group' => 'state'),
77
  'downloadProto' => array('key' => 'wp-short-pixel-download-protocol', 'default' => null, 'group' => 'state'),
78
 
79
  'downloadArchive' => array('key' => 'wp-short-pixel-download-archive', 'default' => -1, 'group' => 'state'),
80
+
 
81
  'activationDate' => array('key' => 'wp-short-pixel-activation-date', 'default' => null, 'group' => 'state'),
 
82
  'mediaLibraryViewMode' => array('key' => 'wp-short-pixel-view-mode', 'default' => false, 'group' => 'state'),
83
  'redirectedSettings' => array('key' => 'wp-short-pixel-redirected-settings', 'default' => null, 'group' => 'state'),
84
  'convertedPng2Jpg' => array('key' => 'wp-short-pixel-converted-png2jpg', 'default' => array(), 'group' => 'state'),
85
+ 'unlistedCounter' => array('key' => 'wp-short-pixel-unlisted-counter', 'default' => 0, 'group' => 'state'),
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
86
  );
87
 
88
  // This array -- field_name -> (s)anitize mask
123
  // 'helpscoutOptin' => array('s' => 'boolean'), // checkbox
124
  );
125
 
126
+ public static function resetOptions() {
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
127
  foreach(self::$_optionsMap as $key => $val) {
128
  delete_option($val['key']);
129
  }
145
  delete_option(self::$_optionsMap['removeSettingsOnDeletePlugin']['key']);
146
  }
147
  // Dismissed now via Notices Controller.
 
 
 
 
 
 
 
 
 
148
 
 
 
 
149
  }
150
 
151
  public static function onDeactivate() {
readme.txt CHANGED
@@ -4,7 +4,7 @@ Tags: convert webp, optimize images, image optimization, resize, compressor, ima
4
  Requires at least: 4.8.0
5
  Tested up to: 6.1
6
  Requires PHP: 5.6
7
- Stable tag: 5.1.1
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
@@ -348,6 +348,21 @@ Add HTTP basic authentication credentials by defining these constants in wp-conf
348
 
349
  == Changelog ==
350
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
351
  = 5.1.1 =
352
  Release date October 20th, 2022
353
  * Fix: a fatal error for PHP 7.2 and lower was discovered and fixed by @KZeni, thanks!
4
  Requires at least: 4.8.0
5
  Tested up to: 6.1
6
  Requires PHP: 5.6
7
+ Stable tag: 5.1.2
8
  License: GPLv2 or later
9
  License URI: http://www.gnu.org/licenses/gpl-2.0.html
10
 
348
 
349
  == Changelog ==
350
 
351
+ = 5.1.2 =
352
+ Release date November 7, 2022
353
+ * Fix: when converting PNG to JPG, the PNG path was saved in the post editor, which could result in broken images;
354
+ * Fix: the bulk restore of Custom Media was performed without saving it to the previous bulks history;
355
+ * Fix: various wording updates and fixes throughout the plugin code;
356
+ * Fix: PNG to JPG conversion failed under certain Windows environments due to wrong path construction;
357
+ * Fix: the plugin now works with thumbs that have a numeric name (e.g. `0`);
358
+ * Fix: on certain hosting restrictions, requesting a new API key caused a fatal error;
359
+ * Fix: the original image was not processed when thumbnail processing was turned off;
360
+ * Compat: added compatibility with the Uncode theme's adaptive images feature;
361
+ * Tweak: minor updates to the settings and Media Library layout for new plans that will be introduced soon;
362
+ * Tweak: added filter/constant that can be used by affiliates;
363
+ * Tweak: reworked plugin notification system to make it more robust and reliable;
364
+ * Language: 44 new strings added, 2 updated, 0 fuzzed, and 39 deprecated.
365
+
366
  = 5.1.1 =
367
  Release date October 20th, 2022
368
  * Fix: a fatal error for PHP 7.2 and lower was discovered and fixed by @KZeni, thanks!
res/css/short-pixel-bar.min.css CHANGED
@@ -1 +1 @@
1
- .shortpixel-hide{display:none}#wpadminbar li.shortpixel-toolbar-processing>a.ab-item>div,li.shortpixel-toolbar-processing>a.ab-item>div{height:33px;margin-top:-1px;padding:0 3px}#wpadminbar li.shortpixel-toolbar-processing>a.ab-item>div>img,li.shortpixel-toolbar-processing>a.ab-item>div>img{margin-right:2px;margin-top:6px;vertical-align:top}#wpadminbar li.shortpixel-toolbar-processing>a.ab-item>div>span.shp-alert,li.shortpixel-toolbar-processing span.shp-alert{display:none}#wpadminbar li.shortpixel-toolbar-processing.shortpixel-alert>a.ab-item>div>span.shp-alert,li.shortpixel-toolbar-processing.shortpixel-alert>a.ab-item>div>span.shp-alert{display:inline;font-size:26px;line-height:26px;color:red;font-weight:700;vertical-align:middle}#wpadminbar li.shortpixel-toolbar-processing.shortpixel-alert>a.ab-item>div,li.shortpixel-toolbar-processing.shortpixel-alert>a.ab-item>div{background-image:none}#wpadminbar .shortpixel-toolbar-processing .cssload-container{width:100%;height:24px;text-align:center;position:absolute;top:0;left:-1px}#wpadminbar .shortpixel-toolbar-processing.shortpixel-alert .cssload-container,#wpadminbar .shortpixel-toolbar-processing.shortpixel-quota-exceeded .cssload-container{display:none}#wpadminbar .shortpixel-toolbar-processing .cssload-speeding-wheel{width:24px;height:24px;opacity:.7;margin:0 auto;border:4px solid #1cbfcb;border-radius:50%;border-left-color:transparent;animation:cssload-spin 2s infinite linear;-o-animation:cssload-spin 2s infinite linear;-ms-animation:cssload-spin 2s infinite linear;-webkit-animation:cssload-spin 2s infinite linear;-moz-animation:cssload-spin 2s infinite linear}@keyframes cssload-spin{100%{transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes cssload-spin{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes cssload-spin{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes cssload-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes cssload-spin{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}.shortpixel-clearfix{width:100%;float:left}
1
+ .shortpixel-hide{display:none}li.shortpixel-toolbar-processing>a.ab-item>div,#wpadminbar li.shortpixel-toolbar-processing>a.ab-item>div{height:33px;margin-top:-1px;padding:0 3px}li.shortpixel-toolbar-processing>a.ab-item>div>img,#wpadminbar li.shortpixel-toolbar-processing>a.ab-item>div>img{margin-right:2px;margin-top:6px;vertical-align:top}li.shortpixel-toolbar-processing span.shp-alert,#wpadminbar li.shortpixel-toolbar-processing>a.ab-item>div>span.shp-alert{display:none}li.shortpixel-toolbar-processing.shortpixel-alert>a.ab-item>div>span.shp-alert,#wpadminbar li.shortpixel-toolbar-processing.shortpixel-alert>a.ab-item>div>span.shp-alert{display:inline;font-size:26px;line-height:26px;color:red;font-weight:bold;vertical-align:middle}li.shortpixel-toolbar-processing.shortpixel-alert>a.ab-item>div,#wpadminbar li.shortpixel-toolbar-processing.shortpixel-alert>a.ab-item>div{background-image:none}#wpadminbar .shortpixel-toolbar-processing .cssload-container{width:100%;height:24px;text-align:center;position:absolute;top:0;left:-1px}#wpadminbar .shortpixel-toolbar-processing.shortpixel-quota-exceeded .cssload-container,#wpadminbar .shortpixel-toolbar-processing.shortpixel-alert .cssload-container{display:none}#wpadminbar .shortpixel-toolbar-processing .cssload-speeding-wheel{width:24px;height:24px;opacity:.7;margin:0 auto;border:4px solid #1cbfcb;border-radius:50%;border-left-color:transparent;animation:cssload-spin 2000ms infinite linear;-o-animation:cssload-spin 2000ms infinite linear;-ms-animation:cssload-spin 2000ms infinite linear;-webkit-animation:cssload-spin 2000ms infinite linear;-moz-animation:cssload-spin 2000ms infinite linear}@keyframes cssload-spin{100%{transform:rotate(360deg);transform:rotate(360deg)}}@-o-keyframes cssload-spin{100%{-o-transform:rotate(360deg);transform:rotate(360deg)}}@-ms-keyframes cssload-spin{100%{-ms-transform:rotate(360deg);transform:rotate(360deg)}}@-webkit-keyframes cssload-spin{100%{-webkit-transform:rotate(360deg);transform:rotate(360deg)}}@-moz-keyframes cssload-spin{100%{-moz-transform:rotate(360deg);transform:rotate(360deg)}}.shortpixel-clearfix{width:100%;float:left}
res/css/short-pixel.css CHANGED
@@ -88,9 +88,10 @@ div.fb-like {
88
  /** In time this is not needed, new notice model **/
89
  .sp-notice {
90
  background: #fff;
 
91
  border-left: 4px solid #fff;
92
  -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
93
- box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
94
  padding: 1px 12px;
95
  }
96
  .sp-notice img {
@@ -108,7 +109,7 @@ div.fb-like {
108
  border-left-color: #46b450;
109
  }
110
  .sp-notice-warning {
111
- border-left-color: #f1e02a;
112
  }
113
 
114
  div.short-pixel-bulk-page input.dial {
88
  /** In time this is not needed, new notice model **/
89
  .sp-notice {
90
  background: #fff;
91
+ border: 1px solid lightgray;
92
  border-left: 4px solid #fff;
93
  -webkit-box-shadow: 0 1px 1px 0 rgba(0,0,0,.1);
94
+ box-shadow: 3px 2px 6px 0 rgba(0,0,0,.1);
95
  padding: 1px 12px;
96
  }
97
  .sp-notice img {
109
  border-left-color: #46b450;
110
  }
111
  .sp-notice-warning {
112
+ border-left-color: #dba617;
113
  }
114
 
115
  div.short-pixel-bulk-page input.dial {
res/css/shortpixel-admin.css CHANGED
@@ -1,27 +1,21 @@
1
  .view-edit-media a.debugModal {
2
  margin: 20px 0;
3
- display: inline-block;
4
- }
5
  .view-edit-media .sp-column-stats {
6
- position: relative;
7
- }
8
- .view-edit-media .sp-column-stats .sp-column-actions {
9
- margin-right: 5px;
10
- margin-top: 16px;
11
- }
12
- .view-edit-media .sp-column-stats .edit-media-stats li {
13
- margin: 0;
14
- line-height: 20px;
15
- }
16
  .view-edit-media .main-actions {
17
  display: inline-block;
18
- width: 100%;
19
- }
20
- .view-edit-media .main-actions .button.button-smaller {
21
- padding: 6px 15px;
22
- height: auto;
23
- float: none;
24
- }
25
 
26
  .spio-message img {
27
  animation: cssload-spin 5000ms infinite linear;
@@ -29,224 +23,164 @@
29
  -ms-animation: cssload-spin 5000ms infinite linear;
30
  -webkit-animation: cssload-spin 5000ms infinite linear;
31
  -moz-animation: cssload-spin 5000ms infinite linear;
32
- vertical-align: top;
33
- }
34
  @keyframes loading-spin {
35
  100% {
36
  transform: rotate(360deg);
37
- transform: rotate(360deg);
38
- }
39
- }
40
  @-o-keyframes loading-spin {
41
  100% {
42
  -o-transform: rotate(360deg);
43
- transform: rotate(360deg);
44
- }
45
- }
46
  @-ms-keyframes loading-spin {
47
  100% {
48
  -ms-transform: rotate(360deg);
49
- transform: rotate(360deg);
50
- }
51
- }
52
  @-webkit-keyframes loading-spin {
53
  100% {
54
  -webkit-transform: rotate(360deg);
55
- transform: rotate(360deg);
56
- }
57
- }
58
  @-moz-keyframes loading-spin {
59
  100% {
60
  -moz-transform: rotate(360deg);
61
- transform: rotate(360deg);
62
- }
63
- }
64
-
65
  .shortpixel-modal-active .debug-modal.debugInfo ul li strong {
66
  display: inline-block;
67
- min-width: 200px;
68
- }
69
  .shortpixel-modal-active .debug-modal.debugInfo ul li img {
70
- max-height: 150px;
71
- }
72
  .shortpixel-modal-active .debug-modal.debugInfo .green {
73
- color: green;
74
- }
75
  .shortpixel-modal-active .debug-modal.debugInfo .red {
76
- color: red;
77
- }
78
 
79
  .shortpixel-other-media .sp-column-info .sp-column-actions {
80
  max-width: 140px;
81
  float: right;
82
- text-align: right;
83
- }
84
  .shortpixel-other-media .message {
85
  font-weight: 700;
86
- margin: 8px 0;
87
- }
88
- .shortpixel-other-media .message img {
89
- animation: cssload-spin 5000ms infinite linear;
90
- -o-animation: cssload-spin 5000ms infinite linear;
91
- -ms-animation: cssload-spin 5000ms infinite linear;
92
- -webkit-animation: cssload-spin 5000ms infinite linear;
93
- -moz-animation: cssload-spin 5000ms infinite linear;
94
- vertical-align: top;
95
- }
96
  @keyframes loading-spin {
97
  100% {
98
  transform: rotate(360deg);
99
- transform: rotate(360deg);
100
- }
101
- }
102
  @-o-keyframes loading-spin {
103
  100% {
104
  -o-transform: rotate(360deg);
105
- transform: rotate(360deg);
106
- }
107
- }
108
  @-ms-keyframes loading-spin {
109
  100% {
110
  -ms-transform: rotate(360deg);
111
- transform: rotate(360deg);
112
- }
113
- }
114
  @-webkit-keyframes loading-spin {
115
  100% {
116
  -webkit-transform: rotate(360deg);
117
- transform: rotate(360deg);
118
- }
119
- }
120
  @-moz-keyframes loading-spin {
121
  100% {
122
  -moz-transform: rotate(360deg);
123
- transform: rotate(360deg);
124
- }
125
- }
126
-
127
  .sp-column-info {
128
- position: relative;
129
- }
130
- .sp-column-info .thumbnails.optimized {
131
- position: relative;
132
- }
133
- .sp-column-info .thumbnails.optimized .thumb-wrapper {
134
- background: #fff;
135
- padding: 8px;
136
- border: 1px solid #ccc;
137
- max-width: 360px;
138
- position: absolute;
139
- display: none;
140
- z-index: 10;
141
- transition: all 1s;
142
- box-sizing: border-box;
143
- }
144
- .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb {
145
- position: relative;
146
- width: 100%;
147
- }
148
- .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb .thumb-name {
149
- overflow: hidden;
150
- max-width: 200px;
151
- white-space: nowrap;
152
- display: inline-block;
153
- }
154
- .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb .optimize-bar {
155
- float: right;
156
- width: 110px;
157
- margin-left: 8px;
158
- }
159
- .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb .optimize-bar .point {
160
- width: 8px;
161
- height: 8px;
162
- display: inline-block;
163
- border: 1px solid #ccc;
164
- margin-left: 1px;
165
- background: #ccc;
166
- vertical-align: middle;
167
- }
168
- .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb .optimize-bar .point.checked {
169
- background: green;
170
- box-shadow: 1px 1px 1px green;
171
- }
172
- .sp-column-info .thumbnails.optimized:hover .thumb-wrapper {
173
- display: block;
174
- }
175
- .sp-column-info .sp-column-actions {
176
- position: absolute;
177
- right: 10px;
178
- top: 0;
179
- }
180
- .sp-column-info .thumbs-todo {
181
- position: relative;
182
- }
183
- .sp-column-info .thumbs-todo span {
184
- display: none;
185
- }
186
- .sp-column-info .thumbs-todo h4:hover ~ span {
187
- display: block;
188
- }
189
- .sp-column-info h4 {
190
- margin: 0;
191
- }
192
- .sp-column-info .shortpixel-image-error {
193
- display: block;
194
- border: 1px solid #ff0000;
195
- padding: 12px;
196
- margin: 14px 0;
197
- font-size: 14px;
198
- font-weight: 700;
199
- }
200
- .sp-column-info .shortpixel-image-error .shortpixel-error-reset {
201
- font-weight: 500;
202
- font-size: 12px;
203
- display: block;
204
- }
205
 
206
  .column-wp-shortPixel .message {
207
  font-size: 14px;
208
  font-weight: 700;
209
- margin: 12px 0;
210
- }
211
- .column-wp-shortPixel .message img {
212
- animation: cssload-spin 5000ms infinite linear;
213
- -o-animation: cssload-spin 5000ms infinite linear;
214
- -ms-animation: cssload-spin 5000ms infinite linear;
215
- -webkit-animation: cssload-spin 5000ms infinite linear;
216
- -moz-animation: cssload-spin 5000ms infinite linear;
217
- vertical-align: top;
218
- }
219
  @keyframes loading-spin {
220
  100% {
221
  transform: rotate(360deg);
222
- transform: rotate(360deg);
223
- }
224
- }
225
  @-o-keyframes loading-spin {
226
  100% {
227
  -o-transform: rotate(360deg);
228
- transform: rotate(360deg);
229
- }
230
- }
231
  @-ms-keyframes loading-spin {
232
  100% {
233
  -ms-transform: rotate(360deg);
234
- transform: rotate(360deg);
235
- }
236
- }
237
  @-webkit-keyframes loading-spin {
238
  100% {
239
  -webkit-transform: rotate(360deg);
240
- transform: rotate(360deg);
241
- }
242
- }
243
  @-moz-keyframes loading-spin {
244
  100% {
245
  -moz-transform: rotate(360deg);
246
- transform: rotate(360deg);
247
- }
248
- }
249
-
250
  div.sp-modal-shade {
251
  display: none;
252
  /* Hidden by default */
@@ -266,8 +200,7 @@ div.sp-modal-shade {
266
  /* Fallback color */
267
  background: rgba(0, 0, 0, 0.4);
268
  /* Black w/ opacity */
269
- opacity: 0.4;
270
- }
271
 
272
  div.shortpixel-modal {
273
  background-color: #fefefe;
@@ -284,44 +217,35 @@ div.shortpixel-modal {
284
  top: 10%;
285
  left: 50%;
286
  max-height: 90%;
287
- overflow-y: auto;
288
- }
289
- div.shortpixel-modal .sp-close-button, div.shortpixel-modal button.sp-close-upgrade-button {
290
- float: right;
291
- margin-top: 0px;
292
- background: transparent !important;
293
- border: none;
294
- font-size: 22px;
295
- line-height: 10px;
296
- cursor: pointer;
297
- }
298
- div.shortpixel-modal .sptw-modal-spinner {
299
- background-image: url("../img/spinner2.gif");
300
- background-repeat: no-repeat;
301
- background-position: center;
302
- }
303
 
304
  div.sp-modal-title {
305
- font-size: 22px;
306
- }
307
 
308
  div.sp-modal-body {
309
- margin-top: 10px;
310
- }
311
 
312
  body.debug-model-active {
313
- overflow: hidden;
314
- }
315
 
316
  .debugInfo .content.wrapper {
317
- display: none;
318
- }
319
- .debugInfo .content.wrapper li strong {
320
- margin-right: 15px;
321
- }
322
- .debugInfo .content.wrapper ul {
323
- margin: 25px 0;
324
- }
325
 
326
  .debug-modal {
327
  display: none;
@@ -337,55 +261,45 @@ body.debug-model-active {
337
  top: 10%;
338
  z-index: 10020;
339
  display: none;
340
- background: #ffffff;
341
- }
342
- .debug-modal.success {
343
- border: 4px solid green;
344
- }
345
- .debug-modal.error {
346
- border: 4px solid red;
347
- }
348
- .debug-modal.error h3 {
349
- background-color: #ff0000;
350
- }
351
- .debug-modal .content-area {
352
- background-color: #fff;
353
- }
354
- .debug-modal .modal_header {
355
- text-align: center;
356
- font-size: 16px;
357
- font-weight: 700;
358
- background-color: #f3f3f3;
359
- border-bottom: 1px solid #ccc;
360
- padding: 8px 5px;
361
- cursor: move;
362
- }
363
- .debug-modal .modal_header h3 {
364
- margin: 0;
365
- color: #444;
366
- font-weight: 400;
367
- padding: 0;
368
- text-align: center;
369
- text-shadow: none;
370
- font-size: 16px;
371
- }
372
- .debug-modal .modal_header .modal_close {
373
- position: absolute;
374
- right: 5px;
375
- top: 8px;
376
- width: 20px;
377
- height: 20px;
378
- cursor: pointer;
379
- color: #444;
380
- }
381
- .debug-modal .modal_header .modal_close:hover {
382
- cursor: pointer;
383
- color: #111;
384
- }
385
- .debug-modal .content, .debug-modal .modal_content {
386
- padding: 5px 15px 10px;
387
- overflow-y: auto;
388
- }
389
 
390
  .debugModal_overlay {
391
  background: #000;
@@ -397,76 +311,61 @@ body.debug-model-active {
397
  position: fixed;
398
  opacity: 0.7;
399
  z-index: 10000;
400
- display: none;
401
- }
402
 
403
  .shortpixel-hide {
404
- display: none !important;
405
- }
406
 
407
  .button-primary.optimize {
408
- margin-bottom: 16px;
409
- }
410
 
411
  .switch_button {
412
  line-height: 12px;
413
  margin: 2px -5px 10px -5px;
414
- display: inline-block;
415
- }
416
- .switch_button label {
417
- padding: 8px 5px;
418
- }
419
- .switch_button label:focus {
420
- outline: none;
421
- }
422
- .switch_button input {
423
- display: none;
424
- }
425
- .switch_button input:checked ~ .the_switch {
426
- background: #1fbec9;
427
- }
428
- .switch_button input:checked ~ .the_switch:after {
429
- left: 20px;
430
- background: #1caecb;
431
- }
432
- .switch_button input:disabled ~ .the_switch {
433
- background: #d5d5d5;
434
- pointer-events: none;
435
- }
436
- .switch_button input:disabled ~ .the_switch:after {
437
- background: #bcbdbc;
438
- }
439
- .switch_button .the_switch {
440
- margin: 8px 15px 8px 0;
441
- position: relative;
442
- display: inline-block;
443
- height: 10px;
444
- width: 40px;
445
- background: #cccccc;
446
- border-radius: 100px;
447
- cursor: pointer;
448
- box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.25) !important;
449
- }
450
- .switch_button .the_switch:after {
451
- position: absolute;
452
- left: -2px;
453
- top: -4px;
454
- display: block;
455
- width: 20px;
456
- height: 20px;
457
- border-radius: 100px;
458
- background: #aaa;
459
- box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.31);
460
- content: "";
461
- -webkit-transition: left 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), padding 0.5s ease, margin 0.5s ease !important;
462
- -o-transition: left 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), padding 0.5s ease, margin 0.5s ease !important;
463
- transition: left 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), padding 0.5s ease, margin 0.5s ease !important;
464
- }
465
- .switch_button .the_switch:active:after {
466
- transform: scale(0.9, 0.85);
467
- }
468
- .switch_button .the_switch:focus {
469
- outline: none;
470
- }
471
 
472
  /*# sourceMappingURL=shortpixel-admin.css.map */
1
  .view-edit-media a.debugModal {
2
  margin: 20px 0;
3
+ display: inline-block; }
 
4
  .view-edit-media .sp-column-stats {
5
+ position: relative; }
6
+ .view-edit-media .sp-column-stats .sp-column-actions {
7
+ margin-right: 5px;
8
+ margin-top: 16px; }
9
+ .view-edit-media .sp-column-stats .edit-media-stats li {
10
+ margin: 0;
11
+ line-height: 20px; }
 
 
 
12
  .view-edit-media .main-actions {
13
  display: inline-block;
14
+ width: 100%; }
15
+ .view-edit-media .main-actions .button.button-smaller {
16
+ padding: 6px 15px;
17
+ height: auto;
18
+ float: none; }
 
 
19
 
20
  .spio-message img {
21
  animation: cssload-spin 5000ms infinite linear;
23
  -ms-animation: cssload-spin 5000ms infinite linear;
24
  -webkit-animation: cssload-spin 5000ms infinite linear;
25
  -moz-animation: cssload-spin 5000ms infinite linear;
26
+ vertical-align: top; }
 
27
  @keyframes loading-spin {
28
  100% {
29
  transform: rotate(360deg);
30
+ transform: rotate(360deg); } }
 
 
31
  @-o-keyframes loading-spin {
32
  100% {
33
  -o-transform: rotate(360deg);
34
+ transform: rotate(360deg); } }
 
 
35
  @-ms-keyframes loading-spin {
36
  100% {
37
  -ms-transform: rotate(360deg);
38
+ transform: rotate(360deg); } }
 
 
39
  @-webkit-keyframes loading-spin {
40
  100% {
41
  -webkit-transform: rotate(360deg);
42
+ transform: rotate(360deg); } }
 
 
43
  @-moz-keyframes loading-spin {
44
  100% {
45
  -moz-transform: rotate(360deg);
46
+ transform: rotate(360deg); } }
 
 
 
47
  .shortpixel-modal-active .debug-modal.debugInfo ul li strong {
48
  display: inline-block;
49
+ min-width: 200px; }
 
50
  .shortpixel-modal-active .debug-modal.debugInfo ul li img {
51
+ max-height: 150px; }
 
52
  .shortpixel-modal-active .debug-modal.debugInfo .green {
53
+ color: green; }
 
54
  .shortpixel-modal-active .debug-modal.debugInfo .red {
55
+ color: red; }
 
56
 
57
  .shortpixel-other-media .sp-column-info .sp-column-actions {
58
  max-width: 140px;
59
  float: right;
60
+ text-align: right; }
 
61
  .shortpixel-other-media .message {
62
  font-weight: 700;
63
+ margin: 8px 0; }
64
+ .shortpixel-other-media .message img {
65
+ animation: cssload-spin 5000ms infinite linear;
66
+ -o-animation: cssload-spin 5000ms infinite linear;
67
+ -ms-animation: cssload-spin 5000ms infinite linear;
68
+ -webkit-animation: cssload-spin 5000ms infinite linear;
69
+ -moz-animation: cssload-spin 5000ms infinite linear;
70
+ vertical-align: top; }
 
 
71
  @keyframes loading-spin {
72
  100% {
73
  transform: rotate(360deg);
74
+ transform: rotate(360deg); } }
 
 
75
  @-o-keyframes loading-spin {
76
  100% {
77
  -o-transform: rotate(360deg);
78
+ transform: rotate(360deg); } }
 
 
79
  @-ms-keyframes loading-spin {
80
  100% {
81
  -ms-transform: rotate(360deg);
82
+ transform: rotate(360deg); } }
 
 
83
  @-webkit-keyframes loading-spin {
84
  100% {
85
  -webkit-transform: rotate(360deg);
86
+ transform: rotate(360deg); } }
 
 
87
  @-moz-keyframes loading-spin {
88
  100% {
89
  -moz-transform: rotate(360deg);
90
+ transform: rotate(360deg); } }
 
 
 
91
  .sp-column-info {
92
+ position: relative; }
93
+ .sp-column-info .thumbnails.optimized {
94
+ position: relative; }
95
+ .sp-column-info .thumbnails.optimized .thumb-wrapper {
96
+ background: #fff;
97
+ padding: 8px;
98
+ border: 1px solid #ccc;
99
+ max-width: 360px;
100
+ position: absolute;
101
+ display: none;
102
+ z-index: 10;
103
+ transition: all 1s;
104
+ box-sizing: border-box; }
105
+ .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb {
106
+ position: relative;
107
+ width: 100%; }
108
+ .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb .thumb-name {
109
+ overflow: hidden;
110
+ max-width: 200px;
111
+ white-space: nowrap;
112
+ display: inline-block; }
113
+ .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb .optimize-bar {
114
+ float: right;
115
+ margin-left: 8px;
116
+ border-radius: 5px;
117
+ overflow: hidden;
118
+ height: 10px;
119
+ margin-top: 4px; }
120
+ .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb .optimize-bar .point {
121
+ width: 10px;
122
+ height: 10px;
123
+ display: inline-block;
124
+ background: #d6d8d9; }
125
+ .sp-column-info .thumbnails.optimized .thumb-wrapper .thumb .optimize-bar .point.checked {
126
+ background: #1abdca; }
127
+ .sp-column-info .thumbnails.optimized:hover .thumb-wrapper {
128
+ display: block; }
129
+ .sp-column-info .sp-column-actions {
130
+ position: absolute;
131
+ right: 10px;
132
+ top: 0; }
133
+ .sp-column-info .thumbs-todo {
134
+ position: relative; }
135
+ .sp-column-info .thumbs-todo span {
136
+ display: none; }
137
+ .sp-column-info .thumbs-todo h4:hover ~ span {
138
+ display: block; }
139
+ .sp-column-info h4 {
140
+ margin: 0; }
141
+ .sp-column-info .shortpixel-image-error {
142
+ display: block;
143
+ border: 1px solid #ff0000;
144
+ padding: 12px;
145
+ margin: 14px 0;
146
+ font-size: 14px;
147
+ font-weight: 700; }
148
+ .sp-column-info .shortpixel-image-error .shortpixel-error-reset {
149
+ font-weight: 500;
150
+ font-size: 12px;
151
+ display: block; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
152
 
153
  .column-wp-shortPixel .message {
154
  font-size: 14px;
155
  font-weight: 700;
156
+ margin: 12px 0; }
157
+ .column-wp-shortPixel .message img {
158
+ animation: cssload-spin 5000ms infinite linear;
159
+ -o-animation: cssload-spin 5000ms infinite linear;
160
+ -ms-animation: cssload-spin 5000ms infinite linear;
161
+ -webkit-animation: cssload-spin 5000ms infinite linear;
162
+ -moz-animation: cssload-spin 5000ms infinite linear;
163
+ vertical-align: top; }
 
 
164
  @keyframes loading-spin {
165
  100% {
166
  transform: rotate(360deg);
167
+ transform: rotate(360deg); } }
 
 
168
  @-o-keyframes loading-spin {
169
  100% {
170
  -o-transform: rotate(360deg);
171
+ transform: rotate(360deg); } }
 
 
172
  @-ms-keyframes loading-spin {
173
  100% {
174
  -ms-transform: rotate(360deg);
175
+ transform: rotate(360deg); } }
 
 
176
  @-webkit-keyframes loading-spin {
177
  100% {
178
  -webkit-transform: rotate(360deg);
179
+ transform: rotate(360deg); } }
 
 
180
  @-moz-keyframes loading-spin {
181
  100% {
182
  -moz-transform: rotate(360deg);
183
+ transform: rotate(360deg); } }
 
 
 
184
  div.sp-modal-shade {
185
  display: none;
186
  /* Hidden by default */
200
  /* Fallback color */
201
  background: rgba(0, 0, 0, 0.4);
202
  /* Black w/ opacity */
203
+ opacity: 0.4; }
 
204
 
205
  div.shortpixel-modal {
206
  background-color: #fefefe;
217
  top: 10%;
218
  left: 50%;
219
  max-height: 90%;
220
+ overflow-y: auto; }
221
+ div.shortpixel-modal .sp-close-button, div.shortpixel-modal button.sp-close-upgrade-button {
222
+ float: right;
223
+ margin-top: 0px;
224
+ background: transparent !important;
225
+ border: none;
226
+ font-size: 22px;
227
+ line-height: 10px;
228
+ cursor: pointer; }
229
+ div.shortpixel-modal .sptw-modal-spinner {
230
+ background-image: url("../img/spinner2.gif");
231
+ background-repeat: no-repeat;
232
+ background-position: center; }
 
 
 
233
 
234
  div.sp-modal-title {
235
+ font-size: 22px; }
 
236
 
237
  div.sp-modal-body {
238
+ margin-top: 10px; }
 
239
 
240
  body.debug-model-active {
241
+ overflow: hidden; }
 
242
 
243
  .debugInfo .content.wrapper {
244
+ display: none; }
245
+ .debugInfo .content.wrapper li strong {
246
+ margin-right: 15px; }
247
+ .debugInfo .content.wrapper ul {
248
+ margin: 25px 0; }
 
 
 
249
 
250
  .debug-modal {
251
  display: none;
261
  top: 10%;
262
  z-index: 10020;
263
  display: none;
264
+ background: #ffffff; }
265
+ .debug-modal.success {
266
+ border: 4px solid green; }
267
+ .debug-modal.error {
268
+ border: 4px solid red; }
269
+ .debug-modal.error h3 {
270
+ background-color: #ff0000; }
271
+ .debug-modal .content-area {
272
+ background-color: #fff; }
273
+ .debug-modal .modal_header {
274
+ text-align: center;
275
+ font-size: 16px;
276
+ font-weight: 700;
277
+ background-color: #f3f3f3;
278
+ border-bottom: 1px solid #ccc;
279
+ padding: 8px 5px;
280
+ cursor: move; }
281
+ .debug-modal .modal_header h3 {
282
+ margin: 0;
283
+ color: #444;
284
+ font-weight: 400;
285
+ padding: 0;
286
+ text-align: center;
287
+ text-shadow: none;
288
+ font-size: 16px; }
289
+ .debug-modal .modal_header .modal_close {
290
+ position: absolute;
291
+ right: 5px;
292
+ top: 8px;
293
+ width: 20px;
294
+ height: 20px;
295
+ cursor: pointer;
296
+ color: #444; }
297
+ .debug-modal .modal_header .modal_close:hover {
298
+ cursor: pointer;
299
+ color: #111; }
300
+ .debug-modal .content, .debug-modal .modal_content {
301
+ padding: 5px 15px 10px;
302
+ overflow-y: auto; }
 
 
 
 
 
 
 
 
 
 
303
 
304
  .debugModal_overlay {
305
  background: #000;
311
  position: fixed;
312
  opacity: 0.7;
313
  z-index: 10000;
314
+ display: none; }
 
315
 
316
  .shortpixel-hide {
317
+ display: none !important; }
 
318
 
319
  .button-primary.optimize {
320
+ margin-bottom: 16px; }
 
321
 
322
  .switch_button {
323
  line-height: 12px;
324
  margin: 2px -5px 10px -5px;
325
+ display: inline-block; }
326
+ .switch_button label {
327
+ padding: 8px 5px; }
328
+ .switch_button label:focus {
329
+ outline: none; }
330
+ .switch_button input {
331
+ display: none; }
332
+ .switch_button input:checked ~ .the_switch {
333
+ background: #7cdce4; }
334
+ .switch_button input:checked ~ .the_switch:after {
335
+ left: 20px;
336
+ background: #1caecb; }
337
+ .switch_button input:disabled ~ .the_switch {
338
+ background: #d5d5d5;
339
+ pointer-events: none; }
340
+ .switch_button input:disabled ~ .the_switch:after {
341
+ background: #bcbdbc; }
342
+ .switch_button .the_switch {
343
+ margin: 8px 15px 8px 0;
344
+ position: relative;
345
+ display: inline-block;
346
+ height: 10px;
347
+ width: 40px;
348
+ background: #cccccc;
349
+ border-radius: 100px;
350
+ cursor: pointer;
351
+ box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.25) !important; }
352
+ .switch_button .the_switch:after {
353
+ position: absolute;
354
+ left: -2px;
355
+ top: -5px;
356
+ display: block;
357
+ width: 20px;
358
+ height: 20px;
359
+ border-radius: 100px;
360
+ background: #aaa;
361
+ box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.31);
362
+ content: '';
363
+ -webkit-transition: left 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), padding 0.5s ease, margin 0.5s ease !important;
364
+ -o-transition: left 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), padding 0.5s ease, margin 0.5s ease !important;
365
+ transition: left 0.3s cubic-bezier(0.175, 0.885, 0.32, 1.275), padding 0.5s ease, margin 0.5s ease !important; }
366
+ .switch_button .the_switch:active:after {
367
+ transform: scale(0.9, 0.85); }
368
+ .switch_button .the_switch:focus {
369
+ outline: none; }
 
 
 
 
 
 
 
 
 
 
 
 
370
 
371
  /*# sourceMappingURL=shortpixel-admin.css.map */
res/css/shortpixel-admin.css.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sourceRoot":"","sources":["../scss/view/_edit-media.scss","../scss/elements/_animation.scss","../scss/view/_other-media.scss","../scss/view/_list-item.scss","../scss/view/_modal.scss","../scss/view/_debug.scss","../scss/shortpixel-admin.scss"],"names":[],"mappings":"AAII;EAEG;EACA;;AAGH;EAEE;;AAEA;EAEE;EACA;;AAOA;EAEE;EACA;;AAIN;EAEE;EACA;;AAEA;EAGE;EACA;EACA;;;AAQP;EC/CC;EACI;EACA;EACA;EACA;ED6CH;;AC3CF;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;;ADmCjC;EAEC;EACA;;AAEF;EACC;;AAUJ;EAAS;;AACT;EAAO;;;AEzEP;EAEG;EACA;EACA;;AAIL;EAEC;EACA;;AACA;EDdA;EACI;EACA;EACA;EACA;ECYF;;ADVH;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;;AExBxC;EAEE;;AAEA;EAEE;;AAKA;EAEK;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACJ;;AACI;EAEI;EACA;;AAEL;EACC;EACA;EACA;EACA;;AAEK;EACI;EACT;EACA;;AACU;EAEG;EACA;EAEA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;;AAOhB;EACI;;AAKV;EAEG;EACA;EACA;;AAEH;EAEG;;AACA;EACI;;AAIJ;EAAkB;;AAGrB;EAAK;;AACL;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEG;EACA;EACA;;;AASP;EAEG;EACA;EACF;;AACA;EF1GD;EACI;EACA;EACA;EACA;EEwGF;;AFtGH;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;;AGzBxC;EACI;AAAe;EACf;AAAiB;EACjB;AAAgB;EAChB;EACA;EACA;AAAa;EACb;AAAc;EACd;AAAgB;EAChB;AAAwB;EACxB;AAA6B;EAC7B;;;AAEJ;EACI;AACA;EACA;EACA;EACA;AAAY;EACZ;AAAkB;EAClB;AAAiB;EACjB;EACA;EACA;EACA;EACA;;AACA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACI;EACA;EACA;;;AAKR;EACI;;;AAEJ;EACI;;;AC/CJ;EACE;;;AAGF;EAEC;;AACA;EACC;;AAED;EAEC;;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;EACC;EACA;EAED;EACA;EACA;EAEA;EAGA;EACA;;AAEA;EAEE;;AAGF;EACE;;AACA;EAAK;;AAGP;EACE;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;;AAIH;EACC;EAIA;;;AAKF;EAEE;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC/FD;EACI;;;AAIJ;EAEE;;;AAGF;EAGC;EACA;EACA;;AAEA;EACC;;AAEA;EACC;;AAGF;EAAQ;;AACP;EAA0B;;AAC1B;EACC;EACA;;AAED;EACC;EACA;;AAED;EAAiC;;AAElC;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACH;EACA;;AAEE;EAAiB;;AACjB;EACC","file":"shortpixel-admin.css"}
1
+ {"version":3,"sourceRoot":"","sources":["../scss/view/_edit-media.scss","../scss/elements/_animation.scss","../scss/view/_other-media.scss","../scss/view/_list-item.scss","../scss/view/_modal.scss","../scss/view/_debug.scss","../scss/shortpixel-admin.scss"],"names":[],"mappings":"AAII;EAEG;EACA;;AAGH;EAEE;;AAEA;EAEE;EACA;;AAOA;EAEE;EACA;;AAIN;EAEE;EACA;;AAEA;EAGE;EACA;EACA;;;AAQP;EC/CC;EACI;EACA;EACA;EACA;ED6CH;;AC3CF;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;;ADmCjC;EAEC;EACA;;AAEF;EACC;;AAUJ;EAAS;;AACT;EAAO;;;AEzEP;EAEG;EACA;EACA;;AAIL;EAEC;EACA;;AACA;EDdA;EACI;EACA;EACA;EACA;ECYF;;ADVH;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;;AExBxC;EAEE;;AAEA;EAEE;;AAKA;EAEK;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACJ;;AACI;EAEI;EACA;;AAEL;EACC;EACA;EACA;EACA;;AAEI;EACK;EACA;EACA;EACA;EACA;EACA;;AAEC;EAEG;EACA;EAEA;EACA;;AAEA;EACE;;AAOhB;EACI;;AAKV;EAEG;EACA;EACA;;AAEH;EAEG;;AACA;EACI;;AAIJ;EAAkB;;AAGrB;EAAK;;AACL;EACI;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEG;EACA;EACA;;;AASP;EAEG;EACA;EACF;;AACA;EF1GD;EACI;EACA;EACA;EACA;EEwGF;;AFtGH;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;;AGzBxC;EACI;AAAe;EACf;AAAiB;EACjB;AAAgB;EAChB;EACA;EACA;AAAa;EACb;AAAc;EACd;AAAgB;EAChB;AAAwB;EACxB;AAA6B;EAC7B;;;AAEJ;EACI;AACA;EACA;EACA;EACA;AAAY;EACZ;AAAkB;EAClB;AAAiB;EACjB;EACA;EACA;EACA;EACA;;AACA;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACI;EACA;EACA;;;AAKR;EACI;;;AAEJ;EACI;;;AC/CJ;EACE;;;AAGF;EAEC;;AACA;EACC;;AAED;EAEC;;;AAKF;EACC;EACA;EACA;EACA;EACA;EACA;EACC;EACA;EAED;EACA;EACA;EAEA;EAGA;EACA;;AAEA;EAEE;;AAGF;EACE;;AACA;EAAK;;AAGP;EACE;;AAIF;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AAGD;EACC;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACC;EACA;;AAIH;EACC;EAIA;;;AAKF;EAEE;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AC/FD;EACI;;;AAIJ;EAEE;;;AAGF;EAGC;EACA;EACA;;AAEA;EACC;;AAEA;EACC;;AAGF;EAAQ;;AACP;EAA0B;;AAC1B;EACC;EACA;;AAED;EACC;EACA;;AAED;EAAiC;;AAElC;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EACC;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAGA;EACH;EACA;;AAEE;EAAiB;;AACjB;EACC","file":"shortpixel-admin.css"}
res/css/shortpixel-bulk.css CHANGED
@@ -2,1008 +2,810 @@
2
  /** GENERAL STYLES **/
3
  /**** DASHBOARD ***/
4
  /***************** SELECTION *************/
5
- /**************** SUMMARY ******/
6
- }
7
- .shortpixel-bulk-wrapper h1 {
8
- font-size: 23px;
9
- font-weight: 400;
10
- line-height: 30px;
11
- margin: 30px 0;
12
- }
13
- .shortpixel-bulk-wrapper h3.heading {
14
- margin: 15px 0 15px 0px;
15
- padding-left: 10px;
16
- font-size: 20px;
17
- font-weight: 400;
18
- line-height: 42px;
19
- border-bottom: 1px solid #ccc;
20
- position: relative;
21
- }
22
- .shortpixel-bulk-wrapper h3.heading span {
23
- vertical-align: top;
24
- margin-right: 20px;
25
- }
26
- .shortpixel-bulk-wrapper i {
27
- font-style: normal;
28
- }
29
- .shortpixel-bulk-wrapper p.description {
30
- font-size: 14px;
31
- margin: 15px 0 15px 15px;
32
- }
33
- .shortpixel-bulk-wrapper .button {
34
- display: flex;
35
- align-items: center;
36
- justify-content: center;
37
- float: left;
38
- margin-right: 8px;
39
- padding: 8px 16px;
40
- background: #F5F5F5;
41
- color: #1cbecb;
42
- letter-spacing: 0.3px;
43
- font-weight: 700;
44
- font-size: 14px;
45
- transition: 300ms all linear;
46
- border: 1px solid #0f6a7d;
47
- min-height: 44px;
48
- }
49
- .shortpixel-bulk-wrapper .button:hover {
50
- background: #1cbecb;
51
- color: #fff;
52
- border: 1px solid #1cbecb;
53
- }
54
- .shortpixel-bulk-wrapper .button:focus {
55
- border-color: #1cbecb;
56
- background: #1cbecb;
57
- }
58
- .shortpixel-bulk-wrapper .button .dashicons {
59
- font-size: 26px;
60
- height: 26px;
61
- margin-right: 8px;
62
- }
63
- .shortpixel-bulk-wrapper .button p {
64
- margin: 0;
65
- display: inline;
66
- font-size: 14px;
67
- vertical-align: bottom;
68
- }
69
- .shortpixel-bulk-wrapper .button-primary {
70
- background: #0f6a7d;
71
- color: #fff;
72
- border: 1px solid #0f6a7d;
73
- border-radius: 3px;
74
- box-shadow: 0px 1px 1px rgba(171, 170, 170, 0.3);
75
- }
76
- .shortpixel-bulk-wrapper nav {
77
- margin: 45px auto;
78
- width: 80%;
79
- min-height: 50px;
80
- }
81
- .shortpixel-bulk-wrapper nav .button-primary {
82
- margin-left: 15px;
83
- }
84
- .shortpixel-bulk-wrapper .kbinfo a {
85
- text-decoration: none;
86
- }
87
- .shortpixel-bulk-wrapper .hidden {
88
- display: none !important;
89
- }
90
- .shortpixel-bulk-wrapper .dashicons.spin {
91
- animation: dashicons-spin 1s infinite;
92
- animation-timing-function: linear;
93
- }
94
  @keyframes dashicons-spin {
95
  0% {
96
- transform: rotate(0deg);
97
- }
98
  100% {
99
- transform: rotate(360deg);
100
- }
101
- }
102
- .shortpixel-bulk-wrapper .loading-icon {
103
- width: 50%;
104
- height: 50%;
105
- }
106
- .shortpixel-bulk-wrapper .bulk-modal {
107
- position: absolute;
108
- padding: 0;
109
- left: 0;
110
- right: 0;
111
- bottom: 0;
112
- top: 0;
113
- width: auto;
114
- box-sizing: border-box;
115
- box-shadow: rgba(0, 0, 0, 0.5) 4px 4px 20px;
116
- }
117
- .shortpixel-bulk-wrapper .bulk-modal .close {
118
- position: absolute;
119
- right: 10px;
120
- top: 10px;
121
- color: white;
122
- font-size: 26px;
123
- cursor: pointer;
124
- }
125
- .shortpixel-bulk-wrapper .bulk-modal .title {
126
- margin: 0;
127
- padding: 12px;
128
- background: #1FB5BF;
129
- background: linear-gradient(90deg, #0f6a7d 0%, #0f6a7d 0%, #1cbecb 100%);
130
- width: 100%;
131
- font-size: 16px;
132
- color: #ffffff;
133
- box-sizing: border-box;
134
- height: 40px;
135
- }
136
- .shortpixel-bulk-wrapper .bulk-modal .content {
137
- padding: 12px;
138
- box-sizing: border-box;
139
- height: 90%;
140
- }
141
- .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper {
142
- display: table;
143
- }
144
- .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper .heading {
145
- font-weight: 700;
146
- }
147
- .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper .heading > span {
148
- border-bottom: 1px solid #ccc;
149
- border-left: 1px solid #ddd;
150
- }
151
- .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper > div {
152
- display: table-row;
153
- }
154
- .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper > div > span {
155
- display: table-cell;
156
- padding: 4px 8px;
157
- }
158
- .shortpixel-bulk-wrapper .bulk-modal .content a {
159
- text-decoration: none;
160
- margin-left: 8px;
161
- }
162
- .shortpixel-bulk-wrapper .screen-wrapper {
163
- background: #fff;
164
- width: 90%;
165
- min-height: 80vh;
166
- position: relative;
167
- }
168
- .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader {
169
- left: 0;
170
- right: 0;
171
- top: 0;
172
- bottom: 0;
173
- background: #fff;
174
- transition: opacity 1s linear;
175
- z-index: -1;
176
- opacity: 0;
177
- visibility: hidden;
178
- padding: 25px 0 15px 0;
179
- width: 60%;
180
- border-radius: 10px;
181
- margin: 0 auto;
182
- }
183
- .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader[data-status=loading] {
184
- z-index: 100;
185
- visibility: visible;
186
- opacity: 0.9;
187
- position: absolute;
188
- width: 100%;
189
- }
190
- .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader .loader {
191
- display: flex;
192
- flex-direction: column;
193
- align-items: center;
194
- width: 100%;
195
- height: 100%;
196
- justify-content: center;
197
- }
198
- .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader .loader span h2 {
199
- color: #555;
200
- }
201
- .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader .loader .svg-spinner .svg-loader {
202
- width: 200px;
203
- height: 50px;
204
- }
205
- .shortpixel-bulk-wrapper .panel {
206
- width: 100%;
207
- position: absolute;
208
- display: none;
209
- z-index: 0;
210
- visibility: hidden;
211
- opacity: 0;
212
- transition: opacity 500ms ease-in;
213
- margin: 15px 0;
214
- padding-bottom: 35px;
215
- }
216
- .shortpixel-bulk-wrapper .panel.active {
217
- visibility: visible;
218
- opacity: 1;
219
- z-index: 5;
220
- position: relative;
221
- }
222
- .shortpixel-bulk-wrapper .panel .panel-container {
223
- z-index: 5;
224
- display: inline-block;
225
- width: 100%;
226
- }
227
- .shortpixel-bulk-wrapper .panel .error h3 {
228
- margin-left: 12px;
229
- }
230
- .shortpixel-bulk-wrapper .panel .error p {
231
- margin-left: 12px;
232
- color: #ff0000;
233
- }
234
- .shortpixel-bulk-wrapper .panel .error p.text {
235
- color: #000;
236
- }
237
- .shortpixel-bulk-wrapper .panel .errorbox {
238
- display: block;
239
- transition: 1s all;
240
- opacity: 0;
241
- display: none;
242
- right: 10px;
243
- top: 4px;
244
- padding: 8px;
245
- height: 100%;
246
- border: 1px solid #000;
247
- width: 80%;
248
- margin: 30px auto;
249
- background: rgba(255, 255, 255, 0.9);
250
- line-height: 22px;
251
- max-height: 300px;
252
- overflow-y: scroll;
253
- }
254
- .shortpixel-bulk-wrapper .panel .errorbox .fatal {
255
- color: #ff0000;
256
- }
257
- .shortpixel-bulk-wrapper .processor-paused {
258
- display: none;
259
- margin: 25px 0;
260
- width: 90%;
261
- background: #1fbec9;
262
- border: 1px solid #ccc;
263
- font-size: 26px;
264
- line-height: 26px;
265
- padding: 26px 0;
266
- text-align: center;
267
- z-index: 10;
268
- border-radius: 3px;
269
- cursor: pointer;
270
- transition: all 900ms;
271
- }
272
- .shortpixel-bulk-wrapper .processor-paused:hover {
273
- background: #1ca9b3;
274
- }
275
- .shortpixel-bulk-wrapper .processor-paused .dashicons {
276
- margin-right: 6px;
277
- }
278
- .shortpixel-bulk-wrapper .processor-paused .dashicons::before {
279
- width: 26px;
280
- height: 26px;
281
- font-size: 26px;
282
- }
283
- .shortpixel-bulk-wrapper .processor-paused .dashicons:hover::before {
284
- content: "\f522";
285
- }
286
- .shortpixel-bulk-wrapper .processor-overquota {
287
- display: none;
288
- background: #ff0000;
289
- line-height: 26px;
290
- padding: 20px 0;
291
- border-radius: 3px;
292
- margin: 25px 0;
293
- width: 90%;
294
- text-align: center;
295
- }
296
- .shortpixel-bulk-wrapper .processor-overquota h3 {
297
- font-size: 26px;
298
- color: #fff;
299
- margin: 10px 0;
300
- }
301
- .shortpixel-bulk-wrapper .processor-overquota p a {
302
- font-size: 16px;
303
- color: #fff;
304
- text-decoration: none;
305
- }
306
- .shortpixel-bulk-wrapper section.panel.dashboard h3.heading {
307
- border: 0;
308
- }
309
- .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper {
310
- background: url("../img/bulk/dashboard-background.svg") no-repeat;
311
- background-size: cover;
312
- background-position: left center;
313
- background-color: #116C7D;
314
- text-align: center;
315
- height: 150px;
316
- position: relative;
317
- display: flex;
318
- align-items: center;
319
- justify-content: center;
320
- }
321
- .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper .dashboard-image {
322
- z-index: 1;
323
- position: absolute;
324
- left: 0;
325
- right: 0;
326
- }
327
- .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper button {
328
- color: #ffffff;
329
- border-radius: 3px;
330
- width: 250px;
331
- height: 65px;
332
- transition: all 0.5s linear;
333
- font-weight: 700;
334
- letter-spacing: 0.3px;
335
- border: 1px solid #ccc;
336
- }
337
- .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper button:hover {
338
- background: #0f6a7d;
339
- height: 80px;
340
- width: 300px;
341
- transition: all 1s linear;
342
- }
343
- .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper button:disabled {
344
- color: #ccc;
345
- background: #0e5358;
346
- }
347
- .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper button span {
348
- margin-right: 16px;
349
- }
350
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log {
351
- display: table;
352
- width: 80%;
353
- margin: 0 auto;
354
- }
355
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log h3 {
356
- display: table-caption;
357
- text-align: center;
358
- }
359
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log > div {
360
- display: table-row;
361
- }
362
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log > div > span {
363
- display: table-cell;
364
- padding: 8px 8px 8px 0;
365
- }
366
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .head span {
367
- font-weight: 700;
368
- padding-left: 15px;
369
- }
370
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .data span {
371
- border-bottom: 1px solid #EBF5FF;
372
- border-top: 1px solid #EBF5FF;
373
- font-size: 15px;
374
- padding-left: 10px;
375
- }
376
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .data span:first-child {
377
- border-left: 1px solid #EBF5FF;
378
- }
379
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .data span:last-child {
380
- border-right: 1px solid #EBF5FF;
381
- }
382
- .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .data span.date {
383
- color: #1FBEC9;
384
- background: url("../img/bulk/checkmark.svg") left center no-repeat;
385
- padding-left: 29px;
386
- }
387
- .shortpixel-bulk-wrapper section.spio-progressbar {
388
- margin: 30px 0;
389
- }
390
- .shortpixel-bulk-wrapper section.spio-progressbar .flex {
391
- display: flex;
392
- flex-direction: row;
393
- width: 90%;
394
- justify-content: space-around;
395
- }
396
- .shortpixel-bulk-wrapper section.spio-progressbar .flex > div {
397
- display: flex;
398
- align-items: center;
399
- position: relative;
400
- flex-direction: column;
401
- flex-grow: 1;
402
- }
403
- .shortpixel-bulk-wrapper section.spio-progressbar .flex > div.result .line {
404
- background: linear-gradient(90deg, #cccccc 0%, #cccccc 49.9%, white 51%, white 100%);
405
- }
406
- .shortpixel-bulk-wrapper section.spio-progressbar .flex .line {
407
- background: #ccc;
408
- height: 2px;
409
- width: 100%;
410
- box-sizing: border-box;
411
- display: inline-block;
412
- position: absolute;
413
- top: 40%;
414
- z-index: 1;
415
- transition: color 1s ease-in;
416
- }
417
- .shortpixel-bulk-wrapper section.spio-progressbar .flex .step {
418
- border: 2px solid #ccc;
419
- border-radius: 50%;
420
- height: 45px;
421
- font-size: 28px;
422
- font-weight: 700;
423
- color: #ccc;
424
- width: 45px;
425
- line-height: 35px;
426
- text-align: center;
427
- box-sizing: border-box;
428
- display: inline-block;
429
- z-index: 2;
430
- background: #fff;
431
- transition: color 1s ease-in;
432
- padding-top: 2px;
433
- }
434
- .shortpixel-bulk-wrapper section.spio-progressbar .flex .text {
435
- font-size: 12px;
436
- font-weight: 700;
437
- text-transform: uppercase;
438
- color: #ccc;
439
- margin-top: 8px;
440
- }
441
- .shortpixel-bulk-wrapper section.panel.selection .spio-progressbar .select .line {
442
- background: linear-gradient(90deg, #1fbec9 0%, #1fbec9 49.9%, #cccccc 50%, #cccccc 100%);
443
- }
444
- .shortpixel-bulk-wrapper section.panel.selection .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.selection .spio-progressbar .select .step {
445
- color: #EC2C25;
446
- }
447
- .shortpixel-bulk-wrapper section.panel.selection .spio-progressbar .select .step {
448
- border-color: #1FBEC9;
449
- }
450
- .shortpixel-bulk-wrapper section.panel.selection .load.wrapper, .shortpixel-bulk-wrapper section.panel.selection .interface.wrapper {
451
- opacity: 0;
452
- height: 0;
453
- transition: opacity 100ms ease-in;
454
- }
455
- .shortpixel-bulk-wrapper section.panel.selection[data-status=loading] .load.wrapper {
456
- opacity: 1;
457
- height: auto;
458
- padding-bottom: 45px;
459
- }
460
- .shortpixel-bulk-wrapper section.panel.selection[data-status=loaded] .interface.wrapper {
461
- opacity: 1;
462
- height: auto;
463
- }
464
- .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading {
465
- display: flex;
466
- color: #ccc;
467
- font-weight: 700;
468
- align-items: center;
469
- width: 90%;
470
- margin: auto;
471
- }
472
- .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading > span > {
473
- height: 65px;
474
- }
475
- .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading > span > p {
476
- margin: 0;
477
- }
478
- .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading span:first-child {
479
- margin-right: 20px;
480
- }
481
- .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading img {
482
- animation: cssload-spin 5000ms infinite linear;
483
- -o-animation: cssload-spin 5000ms infinite linear;
484
- -ms-animation: cssload-spin 5000ms infinite linear;
485
- -webkit-animation: cssload-spin 5000ms infinite linear;
486
- -moz-animation: cssload-spin 5000ms infinite linear;
487
- }
488
  @keyframes loading-spin {
489
  100% {
490
  transform: rotate(360deg);
491
- transform: rotate(360deg);
492
- }
493
- }
494
  @-o-keyframes loading-spin {
495
  100% {
496
  -o-transform: rotate(360deg);
497
- transform: rotate(360deg);
498
- }
499
- }
500
  @-ms-keyframes loading-spin {
501
  100% {
502
  -ms-transform: rotate(360deg);
503
- transform: rotate(360deg);
504
- }
505
- }
506
  @-webkit-keyframes loading-spin {
507
  100% {
508
  -webkit-transform: rotate(360deg);
509
- transform: rotate(360deg);
510
- }
511
- }
512
  @-moz-keyframes loading-spin {
513
  100% {
514
  -moz-transform: rotate(360deg);
515
- transform: rotate(360deg);
516
- }
517
- }
518
- .shortpixel-bulk-wrapper section.panel.selection .option-block {
519
- margin: 0 auto 35px;
520
- width: 80%;
521
- }
522
- .shortpixel-bulk-wrapper section.panel.selection .option-block h2 {
523
- font-size: 22px;
524
- color: #555;
525
- }
526
- .shortpixel-bulk-wrapper section.panel.selection .option-block p {
527
- margin-left: 0;
528
- }
529
- .shortpixel-bulk-wrapper section.panel.selection .optiongroup .switch_button {
530
- display: inline-block;
531
- }
532
- .shortpixel-bulk-wrapper section.panel.selection .optiongroup h4 {
533
- font-size: 14px;
534
- font-weight: 700;
535
- display: inline-block;
536
- margin-left: 25px;
537
- }
538
- .shortpixel-bulk-wrapper section.panel.selection .optiongroup .option {
539
- margin-left: 85px;
540
- line-height: 26px;
541
- }
542
- .shortpixel-bulk-wrapper section.panel.selection .optiongroup .option label {
543
- width: 200px;
544
- display: inline-block;
545
- }
546
- .shortpixel-bulk-wrapper section.panel.selection .optiongroup .option .number {
547
- font-weight: 700;
548
- }
549
- .shortpixel-bulk-wrapper section.panel.selection .count_limited {
550
- color: #ff0000;
551
- }
552
- .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .select .line {
553
- background: #1FBEC9;
554
- }
555
- .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .select .step {
556
- color: #ccc;
557
- }
558
- .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .select .step {
559
- border-color: #1FBEC9;
560
- }
561
- .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .summary .line {
562
- background: linear-gradient(90deg, #1fbec9 0%, #1fbec9 49.9%, #cccccc 50%, #cccccc 100%);
563
- }
564
- .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .summary .text, .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .summary .step {
565
- color: #EC2C25;
566
- }
567
- .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .summary .step {
568
- border-color: #1FBEC9;
569
- }
570
- .shortpixel-bulk-wrapper section.panel.summary .summary-list {
571
- background-color: #F6F9FF;
572
- width: 80%;
573
- margin: 0 auto;
574
- }
575
- .shortpixel-bulk-wrapper section.panel.summary .summary-list h3 {
576
- font-size: 18px;
577
- font-weight: 400;
578
- padding: 26px 0;
579
- color: #555D66;
580
- padding-left: 35px;
581
- border-bottom: 1px solid #DFEAFF;
582
- }
583
- .shortpixel-bulk-wrapper section.panel.summary .summary-list h3 span {
584
- float: right;
585
- margin-right: 35px;
586
- margin-top: -15px;
587
- }
588
- .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper h4 {
589
- font-size: 14px;
590
- font-weight: 700;
591
- padding-left: 80px;
592
- }
593
- .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper h4 .dashicons {
594
- color: #1FBEC9;
595
- margin-right: 10px;
596
- }
597
- .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table {
598
- display: table;
599
- width: 90%;
600
- margin: 0 auto;
601
- }
602
- .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table > div {
603
- display: table-row;
604
- background-color: #F0F5FF;
605
- font-size: 16px;
606
- }
607
- .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table > div.filetypes {
608
- background: #F5F9FF;
609
- color: #aaa;
610
- font-size: 12px;
611
- }
612
- .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table > div.filetypes > span {
613
- border: 0;
614
- }
615
- .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table > div > span {
616
- display: table-cell;
617
- border: 1px solid #DFEAFF;
618
- width: 50%;
619
- padding: 15px 0 15px 15px;
620
- }
621
- .shortpixel-bulk-wrapper section.panel.summary .totals {
622
- text-align: center;
623
- font-size: 25px;
624
- padding: 35px 0;
625
- background: #F6F9FF;
626
- }
627
- .shortpixel-bulk-wrapper section.panel.summary .totals .number {
628
- margin-left: 35px;
629
- }
630
- .shortpixel-bulk-wrapper section.panel.summary .credits {
631
- display: table;
632
- width: 80%;
633
- margin: 35px auto;
634
- }
635
- .shortpixel-bulk-wrapper section.panel.summary .credits > p {
636
- display: table-row;
637
- }
638
- .shortpixel-bulk-wrapper section.panel.summary .credits > p > span {
639
- display: table-cell;
640
- padding: 10px 0;
641
- font-size: 14px;
642
- vertical-align: middle;
643
- }
644
- .shortpixel-bulk-wrapper section.panel.summary .credits > p > span:first-child {
645
- font-weight: 700;
646
- width: 40%;
647
- }
648
- .shortpixel-bulk-wrapper section.panel.summary .credits > p > span:nth-child(2n) {
649
- width: 30%;
650
- }
651
- .shortpixel-bulk-wrapper section.panel.summary .credits > p > span:nth-child(3n) {
652
- text-align: right;
653
- }
654
- .shortpixel-bulk-wrapper section.panel.summary .credits > p > span .button {
655
- float: right;
656
- margin-right: 0;
657
- }
658
- .shortpixel-bulk-wrapper section.panel.summary .credits .heading span {
659
- font-size: 18px;
660
- font-weight: 700;
661
- }
662
- .shortpixel-bulk-wrapper section.panel.summary .over-quota, .shortpixel-bulk-wrapper section.panel.summary .no-images {
663
- border: 1px solid #ff0000;
664
- padding: 16px;
665
- width: 80%;
666
- margin: 30px auto;
667
- display: flex;
668
- align-items: center;
669
- }
670
- .shortpixel-bulk-wrapper section.panel.summary .over-quota > span, .shortpixel-bulk-wrapper section.panel.summary .no-images > span {
671
- margin-right: 20px;
672
- }
673
- .shortpixel-bulk-wrapper section.panel.summary .over-quota p, .shortpixel-bulk-wrapper section.panel.summary .no-images p {
674
- max-width: 550px;
675
- font-size: 14px;
676
- line-height: 21px;
677
- }
678
- .shortpixel-bulk-wrapper section.panel.summary .over-quota p .red, .shortpixel-bulk-wrapper section.panel.summary .no-images p .red {
679
- color: #ff0000;
680
- }
681
- .shortpixel-bulk-wrapper section.panel.summary .over-quota button, .shortpixel-bulk-wrapper section.panel.summary .no-images button {
682
- background: #F5F5F5;
683
- color: #1FBEC9;
684
- border: 1px solid #1FBEC9;
685
- border-radius: 3px;
686
- box-shadow: 0px 1px 1px rgba(171, 170, 170, 0.3);
687
- margin: 16px 0;
688
- }
689
- .shortpixel-bulk-wrapper section.panel.summary .no-images {
690
- font-size: 14px;
691
- padding: 16px;
692
- font-weight: 500;
693
- }
694
- .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .select .line, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .summary .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .line {
695
- background: #1FBEC9;
696
- }
697
- .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .summary .text, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .summary .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .step {
698
- color: #ccc;
699
- }
700
- .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .summary .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .step {
701
- border-color: #1FBEC9;
702
- }
703
- .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .process .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .line {
704
- background: linear-gradient(90deg, #1fbec9 0%, #1fbec9 49.9%, #cccccc 50%, #cccccc 100%);
705
- }
706
- .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .process .text, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .process .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .step {
707
- color: #EC2C25;
708
- }
709
- .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .process .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .step {
710
- border-color: #1FBEC9;
711
- }
712
- .shortpixel-bulk-wrapper section.panel.process .average-optimization, .shortpixel-bulk-wrapper section.panel.finished .average-optimization {
713
- position: absolute;
714
- top: 0px;
715
- right: 0;
716
- display: flex;
717
- justify-content: center;
718
- z-index: 2;
719
- background: rgba(255, 255, 255, 0.4);
720
- }
721
- .shortpixel-bulk-wrapper section.panel.process .average-optimization p, .shortpixel-bulk-wrapper section.panel.finished .average-optimization p {
722
- margin: 0;
723
- font-size: 13px;
724
- position: absolute;
725
- bottom: 45px;
726
- left: 0;
727
- padding: 6px 10px;
728
- color: #fff;
729
- background: rgba(15, 106, 125, 0.5);
730
- font-weight: 700;
731
- border-radius: 3px;
732
- }
733
- .shortpixel-bulk-wrapper section.panel.process .average-optimization .opt-circle-average, .shortpixel-bulk-wrapper section.panel.finished .average-optimization .opt-circle-average {
734
- width: 150px;
735
- height: 150px;
736
- float: right;
737
- }
738
- .shortpixel-bulk-wrapper section.panel.process .average-optimization .opt-circle-average .trail, .shortpixel-bulk-wrapper section.panel.finished .average-optimization .opt-circle-average .trail {
739
- stroke: #ddd;
740
- }
741
- .shortpixel-bulk-wrapper section.panel.process .average-optimization .opt-circle-average .path, .shortpixel-bulk-wrapper section.panel.finished .average-optimization .opt-circle-average .path {
742
- stroke: #1cbecb;
743
- stroke-linecap: round;
744
- transition: stroke-dashoffset 0.5s ease 0s;
745
- }
746
- .shortpixel-bulk-wrapper section.panel.process .average-optimization .opt-circle-average .text, .shortpixel-bulk-wrapper section.panel.finished .average-optimization .opt-circle-average .text {
747
- fill: #1FBEC9;
748
- font-size: 28px;
749
- font-weight: 700;
750
- dominant-baseline: middle;
751
- text-anchor: middle;
752
- }
753
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary {
754
- display: table;
755
- width: 80%;
756
- margin: 30px auto;
757
- }
758
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary > div, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary > div {
759
- display: table-row;
760
- }
761
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary > div > span, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary > div > span {
762
- display: table-cell;
763
- padding: 16px;
764
- width: 33%;
765
- }
766
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary .heading, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .heading {
767
- background: #F6F9FF;
768
- border: 1px solid #EBF5FF;
769
- }
770
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary .line-progressbar, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .line-progressbar {
771
- width: 100px;
772
- height: 20px;
773
- position: relative;
774
- background: #ccc;
775
- display: inline-block;
776
- vertical-align: middle;
777
- }
778
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary .line-progressbar .done-text, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .line-progressbar .done-text {
779
- position: absolute;
780
- color: #fff;
781
- font-size: 10px;
782
- font-weight: 500;
783
- top: 0;
784
- bottom: 0;
785
- padding: 5px 4px;
786
- line-height: 10px;
787
- z-index: 3;
788
- }
789
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary .line-progressbar .done, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .line-progressbar .done {
790
- position: absolute;
791
- z-index: 2;
792
- left: 0;
793
- width: 10%;
794
- top: 0;
795
- bottom: 0;
796
- background: #1FBEC9;
797
- }
798
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary .line-progressbar label input[type=checkbox], .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .line-progressbar label input[type=checkbox] {
799
- margin-right: 8px;
800
- }
801
- .shortpixel-bulk-wrapper section.panel.process .bulk-summary .display-error-box, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .display-error-box {
802
- float: right;
803
- }
804
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section {
805
- background: #F6F9FF;
806
- border: 1px solid #DFEAFF;
807
- width: 80%;
808
- margin: 15px auto;
809
- position: relative;
810
- }
811
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .title, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .title {
812
- position: absolute;
813
- top: 0;
814
- width: 300px;
815
- background: #0f6a7d50;
816
- background: linear-gradient(90deg, #0f6a7d 0%, #0f6a7d 0%, rgba(0, 212, 255, 0) 100%);
817
- color: #fff;
818
- font-size: 20px;
819
- padding: 15px;
820
- }
821
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line {
822
- display: flex;
823
- width: 100%;
824
- justify-content: space-between;
825
- align-items: center;
826
- }
827
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line [data-result=filename], .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line [data-result=filename] {
828
- overflow: hidden;
829
- font-weight: 700;
830
- margin-top: -12px;
831
- }
832
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line .opt-circle-image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line .opt-circle-image {
833
- width: 55px;
834
- height: 55px;
835
- float: right;
836
- margin-top: 12px;
837
- margin-right: 5%;
838
- }
839
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line .opt-circle-image .trail, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line .opt-circle-image .trail {
840
- stroke: #ddd;
841
- }
842
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line .opt-circle-image .path, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line .opt-circle-image .path {
843
- stroke: #1FBEC9;
844
- stroke-linecap: round;
845
- transition: stroke-dashoffset 0.5s ease 0s;
846
- }
847
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line .opt-circle-image .text, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line .opt-circle-image .text {
848
- fill: #1FBEC9;
849
- font-size: 28px;
850
- font-weight: 700;
851
- dominant-baseline: middle;
852
- text-anchor: middle;
853
- }
854
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper {
855
- width: 100%;
856
- overflow: hidden;
857
- margin: 25px 0 40px 0;
858
- }
859
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .slide-mask, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .slide-mask {
860
- flex-wrap: nowrap;
861
- display: flex;
862
- justify-content: flex-start;
863
- }
864
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .preview-image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .preview-image {
865
- transition: 0.5s all linear;
866
- display: flex;
867
- justify-content: center;
868
- align-items: center;
869
- flex-shrink: 0;
870
- flex-grow: 0;
871
- width: 100%;
872
- }
873
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .current.preview-image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .current.preview-image {
874
- opacity: 1;
875
- }
876
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .old.preview-image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .old.preview-image {
877
- display: none;
878
- }
879
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image {
880
- max-width: 45%;
881
- max-height: 600px;
882
- overflow: hidden;
883
- position: relative;
884
- }
885
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image img, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image img {
886
- width: 100%;
887
- height: auto;
888
- object-fit: cover;
889
- z-index: 10;
890
- position: relative;
891
- }
892
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image img[src*="placeholder.svg"], .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image img[src*="placeholder.svg"] {
893
- background-color: #ebedf1;
894
- }
895
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image img[src*="placeholder.svg"]:not(.notempty), .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image img[src*="placeholder.svg"]:not(.notempty) {
896
- z-index: 1;
897
- }
898
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image .svg-loader, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image .svg-loader {
899
- width: 100%;
900
- height: 70px;
901
- position: absolute;
902
- top: calc(50% - 35px);
903
- left: 0;
904
- z-index: 5;
905
- }
906
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image p, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image p {
907
- position: absolute;
908
- top: 0;
909
- z-index: 10;
910
- color: #fff;
911
- background: rgba(0, 0, 0, 0.5);
912
- padding: 4px;
913
- }
914
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image.source, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image.source {
915
- margin-right: 8px;
916
- }
917
- .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image.result, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image.result {
918
- margin-left: 8px;
919
- }
920
- .shortpixel-bulk-wrapper section.panel.process nav, .shortpixel-bulk-wrapper section.panel.finished nav {
921
- width: 80%;
922
- margin-top: 35px;
923
- }
924
- .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .line {
925
- background: #1FBEC9;
926
- }
927
- .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .step {
928
- color: #ccc;
929
- }
930
- .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .step {
931
- border-color: #1FBEC9;
932
- }
933
- .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .result .line {
934
- background: linear-gradient(90deg, #1fbec9 0%, #1fbec9 49.9%, #cccccc 50%, #cccccc 100%);
935
- }
936
- .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .result .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .result .step {
937
- color: #EC2C25;
938
- }
939
- .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .result .step {
940
- border-color: #1FBEC9;
941
- }
942
- .shortpixel-bulk-wrapper section.panel.finished nav {
943
- text-align: center;
944
- }
945
- .shortpixel-bulk-wrapper section.panel.finished nav button.finish {
946
- padding: 12px 60px;
947
- border-radius: 3px;
948
- background: #1FBEC9;
949
- font-size: 16px;
950
- color: #fff;
951
- transition: all 0.5s ease;
952
- }
953
- .shortpixel-bulk-wrapper section.panel.finished nav button.finish:hover {
954
- background: #24d1dd;
955
- }
956
- .shortpixel-bulk-wrapper .part-debug {
957
- background: #000;
958
- color: #fff;
959
- width: 100%;
960
- min-height: 150px;
961
- max-height: 550px;
962
- }
963
- .shortpixel-bulk-wrapper .bulk-special-wrapper {
964
- margin: 0 auto;
965
- max-width: 80%;
966
- }
967
- .shortpixel-bulk-wrapper .bulk-special-wrapper h4 {
968
- color: #ff0000;
969
- font-weight: 700;
970
- font-size: 20px;
971
- }
972
- .shortpixel-bulk-wrapper .bulk-special-wrapper h4.warning {
973
- float: left;
974
- margin: 25px;
975
- }
976
- .shortpixel-bulk-wrapper .bulk-special-wrapper .warning {
977
- color: #ff0000;
978
- }
979
- .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup {
980
- clear: both;
981
- margin-left: 130px;
982
- }
983
- .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup .switch_button {
984
- display: inline-block;
985
- }
986
- .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup h4 {
987
- font-size: 14px;
988
- font-weight: 400;
989
- display: inline-block;
990
- margin-left: 25px;
991
- color: #000;
992
- }
993
- .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup .option {
994
- margin-left: 85px;
995
- line-height: 26px;
996
- }
997
- .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup .option label {
998
- width: 200px;
999
- display: inline-block;
1000
- }
1001
- .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup .option .number {
1002
- font-weight: 700;
1003
- }
1004
- .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup.warning {
1005
- font-weight: 700;
1006
- color: #ff0000;
1007
- }
1008
 
1009
  /*# sourceMappingURL=shortpixel-bulk.css.map */
2
  /** GENERAL STYLES **/
3
  /**** DASHBOARD ***/
4
  /***************** SELECTION *************/
5
+ /**************** SUMMARY ******/ }
6
+ .shortpixel-bulk-wrapper h1 {
7
+ font-size: 23px;
8
+ font-weight: 400;
9
+ line-height: 30px;
10
+ margin: 30px 0; }
11
+ .shortpixel-bulk-wrapper h3.heading {
12
+ margin: 15px 0 15px 0px;
13
+ padding-left: 10px;
14
+ font-size: 20px;
15
+ font-weight: 400;
16
+ line-height: 42px;
17
+ border-bottom: 1px solid #ccc;
18
+ position: relative; }
19
+ .shortpixel-bulk-wrapper h3.heading span {
20
+ vertical-align: top;
21
+ margin-right: 20px; }
22
+ .shortpixel-bulk-wrapper i {
23
+ font-style: normal; }
24
+ .shortpixel-bulk-wrapper p.description {
25
+ font-size: 14px;
26
+ margin: 15px 0 15px 15px; }
27
+ .shortpixel-bulk-wrapper .button {
28
+ display: flex;
29
+ align-items: center;
30
+ justify-content: center;
31
+ float: left;
32
+ margin-right: 8px;
33
+ padding: 8px 16px;
34
+ background: #F5F5F5;
35
+ color: #1cbecb;
36
+ letter-spacing: 0.3px;
37
+ font-weight: 700;
38
+ font-size: 14px;
39
+ transition: 300ms all linear;
40
+ border: 1px solid #0f6a7d;
41
+ min-height: 44px; }
42
+ .shortpixel-bulk-wrapper .button:hover {
43
+ background: #1cbecb;
44
+ color: #fff;
45
+ border: 1px solid #1cbecb; }
46
+ .shortpixel-bulk-wrapper .button:focus {
47
+ border-color: #1cbecb;
48
+ background: #1cbecb; }
49
+ .shortpixel-bulk-wrapper .button .dashicons {
50
+ font-size: 26px;
51
+ height: 26px;
52
+ margin-right: 8px; }
53
+ .shortpixel-bulk-wrapper .button p {
54
+ margin: 0;
55
+ display: inline;
56
+ font-size: 14px;
57
+ vertical-align: bottom; }
58
+ .shortpixel-bulk-wrapper .button-primary {
59
+ background: #0f6a7d;
60
+ color: #fff;
61
+ border: 1px solid #0f6a7d;
62
+ border-radius: 3px;
63
+ box-shadow: 0px 1px 1px rgba(171, 170, 170, 0.3); }
64
+ .shortpixel-bulk-wrapper nav {
65
+ margin: 45px auto;
66
+ width: 80%;
67
+ min-height: 50px; }
68
+ .shortpixel-bulk-wrapper nav .button-primary {
69
+ margin-left: 15px; }
70
+ .shortpixel-bulk-wrapper .kbinfo a {
71
+ text-decoration: none; }
72
+ .shortpixel-bulk-wrapper .hidden {
73
+ display: none !important; }
74
+ .shortpixel-bulk-wrapper .dashicons.spin {
75
+ animation: dashicons-spin 1s infinite;
76
+ animation-timing-function: linear; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
77
  @keyframes dashicons-spin {
78
  0% {
79
+ transform: rotate(0deg); }
 
80
  100% {
81
+ transform: rotate(360deg); } }
82
+ .shortpixel-bulk-wrapper .loading-icon {
83
+ width: 50%;
84
+ height: 50%; }
85
+ .shortpixel-bulk-wrapper .bulk-modal {
86
+ position: absolute;
87
+ padding: 0;
88
+ left: 0;
89
+ right: 0;
90
+ bottom: 0;
91
+ top: 0;
92
+ width: auto;
93
+ box-sizing: border-box;
94
+ box-shadow: rgba(0, 0, 0, 0.5) 4px 4px 20px; }
95
+ .shortpixel-bulk-wrapper .bulk-modal .close {
96
+ position: absolute;
97
+ right: 10px;
98
+ top: 10px;
99
+ color: white;
100
+ font-size: 26px;
101
+ cursor: pointer; }
102
+ .shortpixel-bulk-wrapper .bulk-modal .title {
103
+ margin: 0;
104
+ padding: 12px;
105
+ background: #1FB5BF;
106
+ background: linear-gradient(90deg, #0f6a7d 0%, #0f6a7d 0%, #1cbecb 100%);
107
+ width: 100%;
108
+ font-size: 16px;
109
+ color: #ffffff;
110
+ box-sizing: border-box;
111
+ height: 40px; }
112
+ .shortpixel-bulk-wrapper .bulk-modal .content {
113
+ padding: 12px;
114
+ box-sizing: border-box;
115
+ height: 90%; }
116
+ .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper {
117
+ display: table; }
118
+ .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper .heading {
119
+ font-weight: 700; }
120
+ .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper .heading > span {
121
+ border-bottom: 1px solid #ccc;
122
+ border-left: 1px solid #ddd; }
123
+ .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper > div {
124
+ display: table-row; }
125
+ .shortpixel-bulk-wrapper .bulk-modal .content .table-wrapper > div > span {
126
+ display: table-cell;
127
+ padding: 4px 8px; }
128
+ .shortpixel-bulk-wrapper .bulk-modal .content a {
129
+ text-decoration: none;
130
+ margin-left: 8px; }
131
+ .shortpixel-bulk-wrapper .screen-wrapper {
132
+ background: #fff;
133
+ width: 90%;
134
+ min-height: 80vh;
135
+ position: relative; }
136
+ .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader {
137
+ left: 0;
138
+ right: 0;
139
+ top: 0;
140
+ bottom: 0;
141
+ background: #fff;
142
+ transition: opacity 1s linear;
143
+ z-index: -1;
144
+ opacity: 0;
145
+ visibility: hidden;
146
+ padding: 25px 0 15px 0;
147
+ width: 60%;
148
+ border-radius: 10px;
149
+ margin: 0 auto; }
150
+ .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader[data-status="loading"] {
151
+ z-index: 100;
152
+ visibility: visible;
153
+ opacity: 0.9;
154
+ position: absolute;
155
+ width: 100%; }
156
+ .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader .loader {
157
+ display: flex;
158
+ flex-direction: column;
159
+ align-items: center;
160
+ width: 100%;
161
+ height: 100%;
162
+ justify-content: center; }
163
+ .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader .loader span h2 {
164
+ color: #555; }
165
+ .shortpixel-bulk-wrapper .screen-wrapper .shortpixel-bulk-loader .loader .svg-spinner .svg-loader {
166
+ width: 200px;
167
+ height: 50px; }
168
+ .shortpixel-bulk-wrapper .panel {
169
+ width: 100%;
170
+ position: absolute;
171
+ display: none;
172
+ z-index: 0;
173
+ visibility: hidden;
174
+ opacity: 0;
175
+ transition: opacity 500ms ease-in;
176
+ margin: 15px 0;
177
+ padding-bottom: 35px; }
178
+ .shortpixel-bulk-wrapper .panel.active {
179
+ visibility: visible;
180
+ opacity: 1;
181
+ z-index: 5;
182
+ position: relative; }
183
+ .shortpixel-bulk-wrapper .panel .panel-container {
184
+ z-index: 5;
185
+ display: inline-block;
186
+ width: 100%; }
187
+ .shortpixel-bulk-wrapper .panel .error h3 {
188
+ margin-left: 12px; }
189
+ .shortpixel-bulk-wrapper .panel .error p {
190
+ margin-left: 12px;
191
+ color: #ff0000; }
192
+ .shortpixel-bulk-wrapper .panel .error p.text {
193
+ color: #000; }
194
+ .shortpixel-bulk-wrapper .panel .errorbox {
195
+ display: block;
196
+ transition: 1s all;
197
+ opacity: 0;
198
+ display: none;
199
+ right: 10px;
200
+ top: 4px;
201
+ padding: 8px;
202
+ height: 100%;
203
+ border: 1px solid #000;
204
+ width: 80%;
205
+ margin: 30px auto;
206
+ background: rgba(255, 255, 255, 0.9);
207
+ line-height: 22px;
208
+ max-height: 300px;
209
+ overflow-y: scroll; }
210
+ .shortpixel-bulk-wrapper .panel .errorbox .fatal {
211
+ color: #ff0000; }
212
+ .shortpixel-bulk-wrapper .processor-paused {
213
+ display: none;
214
+ margin: 25px 0;
215
+ width: 90%;
216
+ background: #1fbec9;
217
+ border: 1px solid #ccc;
218
+ font-size: 26px;
219
+ line-height: 26px;
220
+ padding: 26px 0;
221
+ text-align: center;
222
+ z-index: 10;
223
+ border-radius: 3px;
224
+ cursor: pointer;
225
+ transition: all 900ms; }
226
+ .shortpixel-bulk-wrapper .processor-paused:hover {
227
+ background: #1ca9b3; }
228
+ .shortpixel-bulk-wrapper .processor-paused .dashicons {
229
+ margin-right: 6px; }
230
+ .shortpixel-bulk-wrapper .processor-paused .dashicons::before {
231
+ width: 26px;
232
+ height: 26px;
233
+ font-size: 26px; }
234
+ .shortpixel-bulk-wrapper .processor-paused .dashicons:hover::before {
235
+ content: '\F522'; }
236
+ .shortpixel-bulk-wrapper .processor-overquota {
237
+ display: none;
238
+ background: #ff0000;
239
+ line-height: 26px;
240
+ padding: 20px 0;
241
+ border-radius: 3px;
242
+ margin: 25px 0;
243
+ width: 90%;
244
+ text-align: center; }
245
+ .shortpixel-bulk-wrapper .processor-overquota h3 {
246
+ font-size: 26px;
247
+ color: #fff;
248
+ margin: 10px 0; }
249
+ .shortpixel-bulk-wrapper .processor-overquota p a {
250
+ font-size: 16px;
251
+ color: #fff;
252
+ text-decoration: none; }
253
+ .shortpixel-bulk-wrapper section.panel.dashboard h3.heading {
254
+ border: 0; }
255
+ .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper {
256
+ background: url("../img/bulk/dashboard-background.svg") no-repeat;
257
+ background-size: cover;
258
+ background-position: center;
259
+ background-color: #116C7D;
260
+ text-align: center;
261
+ height: 150px;
262
+ position: relative;
263
+ display: flex;
264
+ align-items: center;
265
+ justify-content: center; }
266
+ .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper .dashboard-image {
267
+ z-index: 1;
268
+ position: absolute;
269
+ left: 0;
270
+ right: 0; }
271
+ .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper button {
272
+ color: #ffffff;
273
+ border-radius: 3px;
274
+ width: 250px;
275
+ height: 65px;
276
+ transition: all 0.5s linear;
277
+ font-weight: 700;
278
+ letter-spacing: 0.3px;
279
+ border: 1px solid #ccc; }
280
+ .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper button:hover {
281
+ background: #0f6a7d;
282
+ height: 80px;
283
+ width: 300px;
284
+ transition: all 1s linear; }
285
+ .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper button:disabled {
286
+ color: #ccc;
287
+ background: #0e5358; }
288
+ .shortpixel-bulk-wrapper section.panel.dashboard .bulk-wrapper button span {
289
+ margin-right: 16px; }
290
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log {
291
+ display: table;
292
+ width: 80%;
293
+ margin: 0 auto; }
294
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log h3 {
295
+ display: table-caption;
296
+ text-align: center; }
297
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log > div {
298
+ display: table-row; }
299
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log > div > span {
300
+ display: table-cell;
301
+ padding: 8px 8px 8px 0; }
302
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .head span {
303
+ font-weight: 700;
304
+ padding-left: 15px; }
305
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .data span {
306
+ border-bottom: 1px solid #EBF5FF;
307
+ border-top: 1px solid #EBF5FF;
308
+ font-size: 15px;
309
+ padding-left: 10px; }
310
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .data span:first-child {
311
+ border-left: 1px solid #EBF5FF; }
312
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .data span:last-child {
313
+ border-right: 1px solid #EBF5FF; }
314
+ .shortpixel-bulk-wrapper section.panel.dashboard .dashboard-log .data span.date {
315
+ color: #1FBEC9;
316
+ background: url("../img/bulk/checkmark.svg") left center no-repeat;
317
+ padding-left: 29px; }
318
+ .shortpixel-bulk-wrapper section.spio-progressbar {
319
+ margin: 30px 0; }
320
+ .shortpixel-bulk-wrapper section.spio-progressbar .flex {
321
+ display: flex;
322
+ flex-direction: row;
323
+ width: 90%;
324
+ justify-content: space-around;
325
+ margin: 0 auto; }
326
+ .shortpixel-bulk-wrapper section.spio-progressbar .flex > div {
327
+ display: flex;
328
+ align-items: center;
329
+ position: relative;
330
+ flex-direction: column;
331
+ flex-grow: 1; }
332
+ .shortpixel-bulk-wrapper section.spio-progressbar .flex > div.result .line {
333
+ background: linear-gradient(90deg, #cccccc 0%, #cccccc 49.9%, white 51%, white 100%); }
334
+ .shortpixel-bulk-wrapper section.spio-progressbar .flex > div.select .line {
335
+ width: 50%;
336
+ left: 50%; }
337
+ .shortpixel-bulk-wrapper section.spio-progressbar .flex .line {
338
+ background: #ccc;
339
+ height: 2px;
340
+ width: 100%;
341
+ box-sizing: border-box;
342
+ display: inline-block;
343
+ position: absolute;
344
+ top: 22px;
345
+ z-index: 1;
346
+ transition: color 1s ease-in; }
347
+ .shortpixel-bulk-wrapper section.spio-progressbar .flex .step {
348
+ border: 2px solid #ccc;
349
+ border-radius: 50%;
350
+ height: 45px;
351
+ font-size: 28px;
352
+ font-weight: 700;
353
+ color: #ccc;
354
+ width: 45px;
355
+ line-height: 35px;
356
+ text-align: center;
357
+ box-sizing: border-box;
358
+ display: inline-block;
359
+ z-index: 2;
360
+ background: #fff;
361
+ transition: color 1s ease-in;
362
+ padding-top: 2px; }
363
+ .shortpixel-bulk-wrapper section.spio-progressbar .flex .text {
364
+ font-size: 12px;
365
+ font-weight: 700;
366
+ text-transform: uppercase;
367
+ color: #ccc;
368
+ margin-top: 8px; }
369
+ .shortpixel-bulk-wrapper section.panel.selection .spio-progressbar .select .line {
370
+ background: linear-gradient(90deg, #1fbec9 0%, #1fbec9 49.9%, #cccccc 50%, #cccccc 100%); }
371
+ .shortpixel-bulk-wrapper section.panel.selection .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.selection .spio-progressbar .select .step {
372
+ color: #EC2C25; }
373
+ .shortpixel-bulk-wrapper section.panel.selection .spio-progressbar .select .step {
374
+ border-color: #1FBEC9; }
375
+ .shortpixel-bulk-wrapper section.panel.selection .load.wrapper, .shortpixel-bulk-wrapper section.panel.selection .interface.wrapper {
376
+ opacity: 0;
377
+ height: 0;
378
+ transition: opacity 100ms ease-in; }
379
+ .shortpixel-bulk-wrapper section.panel.selection[data-status="loading"] .load.wrapper {
380
+ opacity: 1;
381
+ height: auto;
382
+ padding-bottom: 45px; }
383
+ .shortpixel-bulk-wrapper section.panel.selection[data-status="loaded"] .interface.wrapper {
384
+ opacity: 1;
385
+ height: auto; }
386
+ .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading {
387
+ display: flex;
388
+ color: #ccc;
389
+ font-weight: 700;
390
+ align-items: center;
391
+ width: 90%;
392
+ margin: auto; }
393
+ .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading > span > {
394
+ height: 65px; }
395
+ .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading > span > p {
396
+ margin: 0; }
397
+ .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading span:first-child {
398
+ margin-right: 20px; }
399
+ .shortpixel-bulk-wrapper section.panel.selection .load.wrapper .loading img {
400
+ animation: cssload-spin 5000ms infinite linear;
401
+ -o-animation: cssload-spin 5000ms infinite linear;
402
+ -ms-animation: cssload-spin 5000ms infinite linear;
403
+ -webkit-animation: cssload-spin 5000ms infinite linear;
404
+ -moz-animation: cssload-spin 5000ms infinite linear; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
405
  @keyframes loading-spin {
406
  100% {
407
  transform: rotate(360deg);
408
+ transform: rotate(360deg); } }
 
 
409
  @-o-keyframes loading-spin {
410
  100% {
411
  -o-transform: rotate(360deg);
412
+ transform: rotate(360deg); } }
 
 
413
  @-ms-keyframes loading-spin {
414
  100% {
415
  -ms-transform: rotate(360deg);
416
+ transform: rotate(360deg); } }
 
 
417
  @-webkit-keyframes loading-spin {
418
  100% {
419
  -webkit-transform: rotate(360deg);
420
+ transform: rotate(360deg); } }
 
 
421
  @-moz-keyframes loading-spin {
422
  100% {
423
  -moz-transform: rotate(360deg);
424
+ transform: rotate(360deg); } }
425
+ .shortpixel-bulk-wrapper section.panel.selection .option-block {
426
+ margin: 0 auto 35px;
427
+ width: 80%; }
428
+ .shortpixel-bulk-wrapper section.panel.selection .option-block h2 {
429
+ font-size: 22px;
430
+ color: #555; }
431
+ .shortpixel-bulk-wrapper section.panel.selection .option-block p {
432
+ margin-left: 0; }
433
+ .shortpixel-bulk-wrapper section.panel.selection .optiongroup .switch_button {
434
+ display: inline-block; }
435
+ .shortpixel-bulk-wrapper section.panel.selection .optiongroup h4 {
436
+ font-size: 14px;
437
+ font-weight: 700;
438
+ display: inline-block;
439
+ margin-left: 25px; }
440
+ .shortpixel-bulk-wrapper section.panel.selection .optiongroup .option {
441
+ margin-left: 85px;
442
+ line-height: 26px; }
443
+ .shortpixel-bulk-wrapper section.panel.selection .optiongroup .option label {
444
+ width: 200px;
445
+ display: inline-block; }
446
+ .shortpixel-bulk-wrapper section.panel.selection .optiongroup .option .number {
447
+ font-weight: 700; }
448
+ .shortpixel-bulk-wrapper section.panel.selection .count_limited {
449
+ color: #ff0000; }
450
+ .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .select .line {
451
+ background: #1FBEC9; }
452
+ .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .select .step {
453
+ color: #ccc; }
454
+ .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .select .step {
455
+ border-color: #1FBEC9; }
456
+ .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .summary .line {
457
+ background: linear-gradient(90deg, #1fbec9 0%, #1fbec9 49.9%, #cccccc 50%, #cccccc 100%); }
458
+ .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .summary .text, .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .summary .step {
459
+ color: #EC2C25; }
460
+ .shortpixel-bulk-wrapper section.panel.summary .spio-progressbar .summary .step {
461
+ border-color: #1FBEC9; }
462
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list {
463
+ background-color: #F6F9FF;
464
+ width: 80%;
465
+ margin: 0 auto; }
466
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list h3 {
467
+ font-size: 18px;
468
+ font-weight: 400;
469
+ padding: 26px 0;
470
+ color: #555D66;
471
+ padding-left: 35px;
472
+ border-bottom: 1px solid #DFEAFF; }
473
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list h3 span {
474
+ float: right;
475
+ margin-right: 35px;
476
+ margin-top: -15px; }
477
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper h4 {
478
+ font-size: 14px;
479
+ font-weight: 700;
480
+ padding-left: 80px; }
481
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper h4 .dashicons {
482
+ color: #1FBEC9;
483
+ margin-right: 10px; }
484
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table {
485
+ display: table;
486
+ width: 90%;
487
+ margin: 0 auto; }
488
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table > div {
489
+ display: table-row;
490
+ background-color: #F0F5FF;
491
+ font-size: 16px; }
492
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table > div.filetypes {
493
+ background: #F5F9FF;
494
+ color: #aaa;
495
+ font-size: 12px; }
496
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table > div.filetypes > span {
497
+ border: 0; }
498
+ .shortpixel-bulk-wrapper section.panel.summary .summary-list .section-wrapper .list-table > div > span {
499
+ display: table-cell;
500
+ border: 1px solid #DFEAFF;
501
+ width: 50%;
502
+ padding: 15px 0 15px 15px; }
503
+ .shortpixel-bulk-wrapper section.panel.summary .totals {
504
+ text-align: center;
505
+ font-size: 25px;
506
+ padding: 35px 0;
507
+ background: #F6F9FF; }
508
+ .shortpixel-bulk-wrapper section.panel.summary .totals .number {
509
+ margin-left: 35px; }
510
+ .shortpixel-bulk-wrapper section.panel.summary .credits {
511
+ display: table;
512
+ width: 80%;
513
+ margin: 35px auto; }
514
+ .shortpixel-bulk-wrapper section.panel.summary .credits > p {
515
+ display: table-row; }
516
+ .shortpixel-bulk-wrapper section.panel.summary .credits > p > span {
517
+ display: table-cell;
518
+ padding: 10px 0;
519
+ font-size: 14px;
520
+ vertical-align: middle; }
521
+ .shortpixel-bulk-wrapper section.panel.summary .credits > p > span:first-child {
522
+ font-weight: 700;
523
+ width: 40%; }
524
+ .shortpixel-bulk-wrapper section.panel.summary .credits > p > span:nth-child(2n) {
525
+ width: 30%; }
526
+ .shortpixel-bulk-wrapper section.panel.summary .credits > p > span:nth-child(3n) {
527
+ text-align: right; }
528
+ .shortpixel-bulk-wrapper section.panel.summary .credits > p > span .button {
529
+ float: right;
530
+ margin-right: 0; }
531
+ .shortpixel-bulk-wrapper section.panel.summary .credits .heading span {
532
+ font-size: 18px;
533
+ font-weight: 700; }
534
+ .shortpixel-bulk-wrapper section.panel.summary .over-quota, .shortpixel-bulk-wrapper section.panel.summary .no-images {
535
+ border: 1px solid #ff0000;
536
+ padding: 16px;
537
+ width: 80%;
538
+ margin: 30px auto;
539
+ display: flex;
540
+ align-items: center; }
541
+ .shortpixel-bulk-wrapper section.panel.summary .over-quota > span, .shortpixel-bulk-wrapper section.panel.summary .no-images > span {
542
+ margin-right: 20px; }
543
+ .shortpixel-bulk-wrapper section.panel.summary .over-quota p, .shortpixel-bulk-wrapper section.panel.summary .no-images p {
544
+ max-width: 550px;
545
+ font-size: 14px;
546
+ line-height: 21px; }
547
+ .shortpixel-bulk-wrapper section.panel.summary .over-quota p .red, .shortpixel-bulk-wrapper section.panel.summary .no-images p .red {
548
+ color: #ff0000; }
549
+ .shortpixel-bulk-wrapper section.panel.summary .over-quota button, .shortpixel-bulk-wrapper section.panel.summary .no-images button {
550
+ background: #F5F5F5;
551
+ color: #1FBEC9;
552
+ border: 1px solid #1FBEC9;
553
+ border-radius: 3px;
554
+ box-shadow: 0px 1px 1px rgba(171, 170, 170, 0.3);
555
+ margin: 16px 0; }
556
+ .shortpixel-bulk-wrapper section.panel.summary .no-images {
557
+ font-size: 14px;
558
+ padding: 16px;
559
+ font-weight: 500; }
560
+ .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .select .line, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .summary .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .line {
561
+ background: #1FBEC9; }
562
+ .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .summary .text, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .summary .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .step {
563
+ color: #ccc; }
564
+ .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .summary .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .step {
565
+ border-color: #1FBEC9; }
566
+ .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .process .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .line {
567
+ background: linear-gradient(90deg, #1fbec9 0%, #1fbec9 49.9%, #cccccc 50%, #cccccc 100%); }
568
+ .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .process .text, .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .process .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .step {
569
+ color: #EC2C25; }
570
+ .shortpixel-bulk-wrapper section.panel.process .spio-progressbar .process .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .step {
571
+ border-color: #1FBEC9; }
572
+ .shortpixel-bulk-wrapper section.panel.process .average-optimization, .shortpixel-bulk-wrapper section.panel.finished .average-optimization {
573
+ position: absolute;
574
+ top: 0px;
575
+ right: 0;
576
+ display: flex;
577
+ justify-content: center;
578
+ z-index: 2;
579
+ background: rgba(255, 255, 255, 0.4); }
580
+ .shortpixel-bulk-wrapper section.panel.process .average-optimization p, .shortpixel-bulk-wrapper section.panel.finished .average-optimization p {
581
+ margin: 0;
582
+ font-size: 13px;
583
+ position: absolute;
584
+ bottom: 45px;
585
+ left: 0;
586
+ padding: 6px 10px;
587
+ color: #fff;
588
+ background: rgba(15, 106, 125, 0.5);
589
+ font-weight: 700;
590
+ border-radius: 3px; }
591
+ .shortpixel-bulk-wrapper section.panel.process .average-optimization .opt-circle-average, .shortpixel-bulk-wrapper section.panel.finished .average-optimization .opt-circle-average {
592
+ width: 150px;
593
+ height: 150px;
594
+ float: right; }
595
+ .shortpixel-bulk-wrapper section.panel.process .average-optimization .opt-circle-average .trail, .shortpixel-bulk-wrapper section.panel.finished .average-optimization .opt-circle-average .trail {
596
+ stroke: #ddd; }
597
+ .shortpixel-bulk-wrapper section.panel.process .average-optimization .opt-circle-average .path, .shortpixel-bulk-wrapper section.panel.finished .average-optimization .opt-circle-average .path {
598
+ stroke: #1cbecb;
599
+ stroke-linecap: round;
600
+ transition: stroke-dashoffset 0.5s ease 0s; }
601
+ .shortpixel-bulk-wrapper section.panel.process .average-optimization .opt-circle-average .text, .shortpixel-bulk-wrapper section.panel.finished .average-optimization .opt-circle-average .text {
602
+ fill: #1FBEC9;
603
+ font-size: 28px;
604
+ font-weight: 700;
605
+ dominant-baseline: middle;
606
+ text-anchor: middle; }
607
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary {
608
+ display: table;
609
+ width: 80%;
610
+ margin: 30px auto; }
611
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary > div, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary > div {
612
+ display: table-row; }
613
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary > div > span, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary > div > span {
614
+ display: table-cell;
615
+ padding: 16px;
616
+ width: 33%; }
617
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary .heading, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .heading {
618
+ background: #F6F9FF;
619
+ border: 1px solid #EBF5FF; }
620
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary .line-progressbar, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .line-progressbar {
621
+ width: 100px;
622
+ height: 20px;
623
+ position: relative;
624
+ background: #ccc;
625
+ display: inline-block;
626
+ vertical-align: middle; }
627
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary .line-progressbar .done-text, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .line-progressbar .done-text {
628
+ position: absolute;
629
+ color: #fff;
630
+ font-size: 10px;
631
+ font-weight: 500;
632
+ top: 0;
633
+ bottom: 0;
634
+ padding: 5px 4px;
635
+ line-height: 10px;
636
+ z-index: 3; }
637
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary .line-progressbar .done, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .line-progressbar .done {
638
+ position: absolute;
639
+ z-index: 2;
640
+ left: 0;
641
+ width: 10%;
642
+ top: 0;
643
+ bottom: 0;
644
+ background: #1FBEC9; }
645
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary .line-progressbar label input[type="checkbox"], .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .line-progressbar label input[type="checkbox"] {
646
+ margin-right: 8px; }
647
+ .shortpixel-bulk-wrapper section.panel.process .bulk-summary .display-error-box, .shortpixel-bulk-wrapper section.panel.finished .bulk-summary .display-error-box {
648
+ float: right; }
649
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section {
650
+ background: #F6F9FF;
651
+ border: 1px solid #DFEAFF;
652
+ width: 80%;
653
+ margin: 15px auto;
654
+ position: relative; }
655
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .title, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .title {
656
+ position: absolute;
657
+ top: 0;
658
+ width: 300px;
659
+ background: #0f6a7d50;
660
+ background: linear-gradient(90deg, #0f6a7d 0%, #0f6a7d 0%, rgba(0, 212, 255, 0) 100%);
661
+ color: #fff;
662
+ font-size: 20px;
663
+ padding: 15px; }
664
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line {
665
+ display: flex;
666
+ width: 100%;
667
+ justify-content: space-between;
668
+ align-items: center; }
669
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line [data-result="filename"], .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line [data-result="filename"] {
670
+ overflow: hidden;
671
+ font-weight: 700;
672
+ margin-top: -12px; }
673
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line .opt-circle-image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line .opt-circle-image {
674
+ width: 55px;
675
+ height: 55px;
676
+ float: right;
677
+ margin-top: 12px;
678
+ margin-right: 5%; }
679
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line .opt-circle-image .trail, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line .opt-circle-image .trail {
680
+ stroke: #ddd; }
681
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line .opt-circle-image .path, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line .opt-circle-image .path {
682
+ stroke: #1FBEC9;
683
+ stroke-linecap: round;
684
+ transition: stroke-dashoffset 0.5s ease 0s; }
685
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .image-preview-line .opt-circle-image .text, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .image-preview-line .opt-circle-image .text {
686
+ fill: #1FBEC9;
687
+ font-size: 28px;
688
+ font-weight: 700;
689
+ dominant-baseline: middle;
690
+ text-anchor: middle; }
691
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper {
692
+ width: 100%;
693
+ overflow: hidden;
694
+ margin: 25px 0 40px 0; }
695
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .slide-mask, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .slide-mask {
696
+ flex-wrap: nowrap;
697
+ display: flex;
698
+ justify-content: flex-start; }
699
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .preview-image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .preview-image {
700
+ transition: 0.5s all linear;
701
+ display: flex;
702
+ justify-content: center;
703
+ align-items: center;
704
+ flex-shrink: 0;
705
+ flex-grow: 0;
706
+ width: 100%; }
707
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .current.preview-image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .current.preview-image {
708
+ opacity: 1; }
709
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .old.preview-image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .old.preview-image {
710
+ display: none; }
711
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image {
712
+ max-width: 45%;
713
+ max-height: 600px;
714
+ overflow: hidden;
715
+ position: relative; }
716
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image img, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image img {
717
+ width: 100%;
718
+ height: auto;
719
+ object-fit: cover;
720
+ z-index: 10;
721
+ position: relative; }
722
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image img[src*="placeholder.svg"], .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image img[src*="placeholder.svg"] {
723
+ background-color: #ebedf1; }
724
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image img[src*="placeholder.svg"]:not(.notempty), .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image img[src*="placeholder.svg"]:not(.notempty) {
725
+ z-index: 1; }
726
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image .svg-loader, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image .svg-loader {
727
+ width: 100%;
728
+ height: 70px;
729
+ position: absolute;
730
+ top: calc(50% - 35px);
731
+ left: 0;
732
+ z-index: 5; }
733
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image p, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image p {
734
+ position: absolute;
735
+ top: 0;
736
+ z-index: 10;
737
+ color: #fff;
738
+ background: rgba(0, 0, 0, 0.5);
739
+ padding: 4px; }
740
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image.source, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image.source {
741
+ margin-right: 8px; }
742
+ .shortpixel-bulk-wrapper section.panel.process .image-preview-section .preview-wrapper .image.result, .shortpixel-bulk-wrapper section.panel.finished .image-preview-section .preview-wrapper .image.result {
743
+ margin-left: 8px; }
744
+ .shortpixel-bulk-wrapper section.panel.process nav, .shortpixel-bulk-wrapper section.panel.finished nav {
745
+ width: 80%;
746
+ margin-top: 35px; }
747
+ .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .line, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .line {
748
+ background: #1FBEC9; }
749
+ .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .step {
750
+ color: #ccc; }
751
+ .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .select .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .summary .step, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .process .step {
752
+ border-color: #1FBEC9; }
753
+ .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .result .line {
754
+ background: linear-gradient(90deg, #1fbec9 0%, #1fbec9 49.9%, #cccccc 50%, #cccccc 100%); }
755
+ .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .result .text, .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .result .step {
756
+ color: #EC2C25; }
757
+ .shortpixel-bulk-wrapper section.panel.finished .spio-progressbar .result .step {
758
+ border-color: #1FBEC9; }
759
+ .shortpixel-bulk-wrapper section.panel.finished nav {
760
+ text-align: center; }
761
+ .shortpixel-bulk-wrapper section.panel.finished nav button.finish {
762
+ padding: 12px 60px;
763
+ border-radius: 3px;
764
+ background: #1FBEC9;
765
+ font-size: 16px;
766
+ color: #fff;
767
+ transition: all 0.5s ease; }
768
+ .shortpixel-bulk-wrapper section.panel.finished nav button.finish:hover {
769
+ background: #24d1dd; }
770
+ .shortpixel-bulk-wrapper .part-debug {
771
+ background: #000;
772
+ color: #fff;
773
+ width: 100%;
774
+ min-height: 150px;
775
+ max-height: 550px; }
776
+ .shortpixel-bulk-wrapper .bulk-special-wrapper {
777
+ margin: 0 auto;
778
+ max-width: 80%; }
779
+ .shortpixel-bulk-wrapper .bulk-special-wrapper h4 {
780
+ color: #ff0000;
781
+ font-weight: 700;
782
+ font-size: 20px; }
783
+ .shortpixel-bulk-wrapper .bulk-special-wrapper h4.warning {
784
+ float: left;
785
+ margin: 25px; }
786
+ .shortpixel-bulk-wrapper .bulk-special-wrapper .warning {
787
+ color: #ff0000; }
788
+ .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup {
789
+ clear: both;
790
+ margin-left: 130px; }
791
+ .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup .switch_button {
792
+ display: inline-block; }
793
+ .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup h4 {
794
+ font-size: 14px;
795
+ font-weight: 400;
796
+ display: inline-block;
797
+ margin-left: 25px;
798
+ color: #000; }
799
+ .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup .option {
800
+ margin-left: 85px;
801
+ line-height: 26px; }
802
+ .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup .option label {
803
+ width: 200px;
804
+ display: inline-block; }
805
+ .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup .option .number {
806
+ font-weight: 700; }
807
+ .shortpixel-bulk-wrapper .bulk-special-wrapper .optiongroup.warning {
808
+ font-weight: 700;
809
+ color: #ff0000; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
810
 
811
  /*# sourceMappingURL=shortpixel-bulk.css.map */
res/css/shortpixel-bulk.css.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"sourceRoot":"","sources":["../scss/shortpixel-bulk.scss","../scss/elements/_colors.scss","../scss/elements/_animation.scss"],"names":[],"mappings":"AAAA;AAKE;AAqWF;AAoLI;AA2GF;;AAnoBE;EACE;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEI;EACA;;AAGN;EACE;;AAGF;EAEG;EAGA;;AAGL;EACC;EACA;EACA;EACA;EAEA;EACA;EACA,YC3CiB;ED4CjB,OC/CU;EDgDV;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEC,YCzDS;ED0DT;EACA;;AAGD;EACC,cC/DS;EDgET,YChES;;ADkEV;EAEE;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;;AAID;EAEE,YCpFU;EDqFV;EACA;EACA;EACA;;AAGJ;EACE;EAED;EACA;;AACA;EAEE;;AAIH;EACG;;AAGD;EACE;;AAGJ;EACG;EACA;;AAGJ;EACG;IACG;;EAEH;IACG;;;AAIN;EAEE;EACA;;AAID;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACC;EAEE;EACA;EACA;EACA;EACA;EACA;;AAEH;EAEE;EACD;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAED;EAEC;EACA;EACA;;AACA;EACC;;AACA;EAAW;;AACR;EAAS;EAA+B;;AAE3C;EAAQ;;AACR;EACE;EACD;;AAGF;EAAI;EAAuB;;AAK5B;EAEI;EACA;EACA;EACA;;AAGA;EAGG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGA;EAEE;EACA;EACA;EACN;EACA;;AAGG;EACI;EACA;EACA;EACA;EACA;EACA;;AACA;EAAU;;AACV;EAEN;EACA;;AAMH;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EAEJ;;AAGI;EAEI;EACA;EACA;EACA;;AAGJ;EAEG;EAED;EACA;;AAKE;EAAK;;AACL;EACE;EACA;;AACA;EAAS;;AAGf;EACE;EACA;EAEA;EACL;EACK;EACA;EACA;EACA;EACA;EACL;EACA;EAEK;EACL;EACA;EACA;;AACA;EAAS;;AAMT;EAGE;EAGH;EACG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EAEE;;AACA;EAEG;EACA;EACA;;AAGH;EAAiB;;AAIvB;EAEE;EACA;EAGA;EACA;EACA;EACA;EACA;EACA;;AACA;EACA;EACA;EACA;;AAEA;EAEC;EACA;EACC;;AASA;EAAa;;AAIb;EAEK;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AACA;EAEE;EACA;EACA;EAAS;;AAGX;EAEG;EAEA;EACA;EACA;EACA;EACP;EAEA;EACA;;AAEO;EAGP,YCnZQ;EDqZP;EACA;EAES;;AAKH;EACE;EACA;;AAEF;EAEN;;AAMF;EAEG;EACA;EACA;;AACA;EAAK;EAAwB;;AAC7B;EACE;;AACA;EAAS;EAAqB;;AAI9B;EACE;EACA;;AAKF;EACE;EACA;EAGA;EACA;;AAHA;EAAgB;;AAChB;EAAgB;;AAGhB;EACG;EACA;EACA;;AAYb;EAEI;;AACA;EAEE;EACA;EACA;EACA;;AAEA;EAEG;EACA;EACA;EACA;EACA;;AAGH;EAEE;;AAGF;EACE;EACA;EACA;EAEA;EACA;EACA;EACA;EACA;EACA;;AAGF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACN;;AAEI;EAEE;EACA;EACA;EACA;EACN;;AAoBG;EATH;;AAUG;EAAe;;AACf;EAAQ;;AAEX;EAEG;EACJ;EACI;;AAKA;EACE;EACL;EACA;;AAKE;EAEG;EACL;;AAKG;EAEG;EACA;EACA;EACA;EACA;EACA;;AACN;EACC;;AACA;EAAI;;AAEC;EACE;;AAEF;EE9kBV;EACI;EACA;EACA;EACA;;AAEL;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;AF6jBrC;EAEE;EACA;;AACA;EACE;EACD;;AAED;EAAI;;AAWA;EACG;;AAEH;EACG;EACA;EACA;EACA;;AAEH;EACE;EAEA;;AACA;EACI;EACA;;AAEJ;EACI;;AAMZ;EAEE;;AAYI;EAAQ;;AACR;EAAe;;AACf;EAAQ;;AAIR;EA1HH;;AA2HG;EAAe;;AACf;EAAQ;;AAEX;EAEI;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;;AAKD;EACI;EACA;EACA;;AACA;EAEG;EACA;;AAIN;EAEG;EAEA;EACA;;AAEA;EACE;EACA;EACA;;AACA;EAEG;EACA;EACA;;AACA;EAEG;;AAIR;EAEG;EACA;EACA;EAEA;;AAOd;EAEE;EACA;EACA;EACA;;AAEA;EAAU;;AAGZ;EACI;EAEA;EAEL;;AACK;EAAM;;AACN;EACG;EACA;EACA;EACN;;AACM;EAAgB;EAAkB;;AACxC;EAAkB;;AAClB;EAAkB;;AAClB;EAAU;EAAc;;AAGrB;EACE;EACA;;AAIN;EAEG;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAEF;EACE;EACA;EACA;;AACA;EAAO;;AAET;EACE;EACA;EACA;EACA;EACA;EACA;;AAGL;EAEI;EACA;EACA;;AASD;EAAQ;;AACR;EAAe;;AACf;EAAQ;;AAIR;EA/QH;;AAgRG;EAAe;;AACf;EAAQ;;AAGX;EAEE;EACA;EACA;EACA;EACA;EACJ;EACA;;AAEI;EACE;EACA;EACL;EAGA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGG;EACI;EACA;EACA;;AAEA;EACE;;AAEF;EACE,QC/0BD;EDg1BC;EACA;;AAEF;EAEE;EACA;EACA;EACA;EACA;;AAKR;EAEE;EACA;EACA;;AACA;EAAQ;;AACR;EACI;EACA;EACN;;AAEE;EACG;EACA;;AAEH;EAEE;EACA;EACA;EACA;EACA;EACL;;AAGK;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAIN;EAEE;;AAMJ;EACC;;AAIC;EACG;EACA;EACA;EACA;EACJ;;AAEA;EACG;EACD;EACA;EACA;EACA;EACA;EACA;EACA;;AAIC;EAEG;EACA;EACA;EACA;;AAIN;EAEC;EACA;EACA;;AAGK;EACI;EACA;EACA;EACP;EACA;;AAEO;EACE;;AAEF;EACE;EACA;EACA;;AAEF;EAEE;EACA;EACA;EACA;EACA;;AAKR;EAIH;EACA;EAGK;;AAEL;EAIC;EACA;EACA;;AAID;EAEC;EACC;EACD;EACA;EACA;EACA;EACA;;AAED;EAEE;;AAIF;EAGC;;AASI;EAEG;EACA;EACA;EACA;;AAEA;EACE;EACR;EACA;EASA;EACA;;AATA;EAEC;;AAED;EAEC;;AAKF;EACE;EACA;EACA;EACA;EACA;EACA;;AAGK;EACE;EACA;EACA;EACA;EACA;EACA;;AAGL;EAEG;;AAEH;EAEE;;AAKP;EACI;EACA;;AAYD;EAAQ;;AACR;EAAe;;AACf;EAAQ;;AAIR;EAvjBH;;AAwjBG;EAAe;;AACf;EAAQ;;AAGX;EACI;;AAEF;EAEI;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAOV;EAEG;EACA;EACA;EACA;EACA;;AAKL;EAEE;EAEA;;AACA;EAAK;EACH;EACA;;AAEA;EAEE;EACA;;AAIJ;EAAW;;AAEX;EAEC;EACA;;AAEK;EACG;;AAEH;EACG;EACA;EACA;EACA;EACN;;AAEG;EACE;EAEA;;AACA;EACI;EACA;;AAEJ;EACI;;AAGX;EAEE;EACA","file":"shortpixel-bulk.css"}
 
 
 
 
 
 
1
+ {
2
+ "version": 3,
3
+ "mappings": "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",
4
+ "sources": ["../scss/shortpixel-bulk.scss","../scss/elements/_colors.scss","../scss/elements/_animation.scss"],
5
+ "names": [],
6
+ "file": "shortpixel-bulk.css"
7
+ }
res/css/shortpixel-nextgen.css CHANGED
@@ -1,24 +1,19 @@
1
  #ngg_page_content .sp-column-info {
2
- position: relative;
3
- }
4
- #ngg_page_content .sp-column-info .button-smaller {
5
- min-width: 150px;
6
- margin-bottom: 5px;
7
- }
8
- #ngg_page_content .sp-column-info .sp-column-actions {
9
- float: right;
10
- position: absolute;
11
- right: 10px;
12
- top: 0;
13
- }
14
- #ngg_page_content .sp-column-info .button {
15
- background-color: black;
16
- }
17
- #ngg_page_content .sp-column-info .dashicons::before {
18
- font-family: dashicons;
19
- width: 20px;
20
- height: 20px;
21
- font-size: 16px;
22
- }
23
 
24
  /*# sourceMappingURL=shortpixel-nextgen.css.map */
1
  #ngg_page_content .sp-column-info {
2
+ position: relative; }
3
+ #ngg_page_content .sp-column-info .button-smaller {
4
+ min-width: 150px;
5
+ margin-bottom: 5px; }
6
+ #ngg_page_content .sp-column-info .sp-column-actions {
7
+ float: right;
8
+ position: absolute;
9
+ right: 10px;
10
+ top: 0; }
11
+ #ngg_page_content .sp-column-info .button {
12
+ background-color: black; }
13
+ #ngg_page_content .sp-column-info .dashicons::before {
14
+ font-family: dashicons;
15
+ width: 20px;
16
+ height: 20px;
17
+ font-size: 16px; }
 
 
 
 
 
18
 
19
  /*# sourceMappingURL=shortpixel-nextgen.css.map */
res/css/shortpixel-nextgen.css.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"sourceRoot":"","sources":["../scss/shortpixel-nextgen.scss"],"names":[],"mappings":"AACA;EAEE;;AAEE;EACI;EACA;;AAEN;EACE;EACA;EACA;EACA;;AAEF;EACC;;AAED;EAEE;EACA;EACA;EACA","file":"shortpixel-nextgen.css"}
 
 
 
 
 
 
1
+ {
2
+ "version": 3,
3
+ "mappings": "AACA,iCACA;EACE,QAAQ,EAAE,QAAQ;EAEhB,iDAAgB;IACZ,SAAS,EAAE,KAAK;IAChB,aAAa,EAAE,GAAG;EAExB,oDAAmB;IACjB,KAAK,EAAE,KAAK;IACZ,QAAQ,EAAE,QAAQ;IAClB,KAAK,EAAE,IAAI;IACX,GAAG,EAAE,CAAC;EAER,yCAAQ;IACP,gBAAgB,EAAE,KAAK;EAExB,oDACA;IACE,WAAW,EAAE,SAAS;IACtB,KAAK,EAAE,IAAI;IACX,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI",
4
+ "sources": ["../scss/shortpixel-nextgen.scss"],
5
+ "names": [],
6
+ "file": "shortpixel-nextgen.css"
7
+ }
res/css/shortpixel-notices.css CHANGED
@@ -8,86 +8,63 @@
8
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
9
  border: 1px solid #c3c4c7;
10
  margin: 15px 0;
 
11
  border-left-color: #72aee6;
12
- position: relative;
13
- }
14
- .shortpixel.shortpixel-notice .notice-dismiss {
15
- margin-top: 10px;
16
- }
17
- .shortpixel.shortpixel-notice span {
18
- vertical-align: middle;
19
- }
20
- .shortpixel.shortpixel-notice span.icon {
21
- margin: 0 25px 0 0;
22
- width: 80px;
23
- }
24
- .shortpixel.shortpixel-notice span.content {
25
- padding: 8px 0;
26
- }
27
- .shortpixel.shortpixel-notice .details-wrapper {
28
- margin: 8px 0 4px 0;
29
- }
30
- .shortpixel.shortpixel-notice .details-wrapper .detail-content-wrapper {
31
- max-height: 0;
32
- overflow: hidden;
33
- }
34
- .shortpixel.shortpixel-notice .details-wrapper .detail-content-wrapper .detail-content {
35
- opacity: 0;
36
- transition: opacity 750ms linear;
37
- }
38
- .shortpixel.shortpixel-notice .details-wrapper label {
39
- opacity: 100;
40
- transition: opacity 250ms ease-in;
41
- }
42
- .shortpixel.shortpixel-notice .details-wrapper label span {
43
- cursor: pointer;
44
- font-size: 14px;
45
- color: #0085ba;
46
- font-weight: 500;
47
- }
48
- .shortpixel.shortpixel-notice .details-wrapper input[name=detailhider] {
49
- display: none;
50
- }
51
- .shortpixel.shortpixel-notice .details-wrapper input[name=detailhider]:checked ~ .detail-content-wrapper {
52
- max-height: none;
53
- }
54
- .shortpixel.shortpixel-notice .details-wrapper input[name=detailhider]:checked ~ .detail-content-wrapper .detail-content {
55
- opacity: 100;
56
- }
57
- .shortpixel.shortpixel-notice .details-wrapper input[name=detailhider]:checked ~ .show-details {
58
- opacity: 0;
59
- transition: opacity 50ms ease-out;
60
- }
61
- .shortpixel.shortpixel-notice .details-wrapper input[name=detailhider]:not(:checked) ~ .hide-details {
62
- opacity: 0;
63
- transition: opacity 50ms ease-out;
64
- }
65
 
66
  .shortpixel.shortpixel-notice .sp-conflict-plugins {
67
  display: table;
68
  border-spacing: 10px;
69
- border-collapse: separate;
70
- }
71
- .shortpixel.shortpixel-notice .sp-conflict-plugins li {
72
- display: table-row;
73
- }
74
- .shortpixel.shortpixel-notice .sp-conflict-plugins li > * {
75
- display: table-cell;
76
- }
77
  .shortpixel.shortpixel-notice .content .button-primary {
78
  background-color: #0f6a7d;
79
- border-color: #0f6a7d;
80
- }
81
- .shortpixel.shortpixel-notice .content .button-primary:hover {
82
- background-color: #1cbecb;
83
- }
84
  .shortpixel.shortpixel-notice li.sp-conflict-plugins-list {
85
  line-height: 28px;
86
  list-style: disc;
87
- margin-left: 80px;
88
- }
89
  .shortpixel.shortpixel-notice li.sp-conflict-plugins-list a.button {
90
- margin-left: 10px;
91
- }
92
 
93
  /*# sourceMappingURL=shortpixel-notices.css.map */
8
  box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
9
  border: 1px solid #c3c4c7;
10
  margin: 15px 0;
11
+ border-left-width: 4px;
12
  border-left-color: #72aee6;
13
+ position: relative; }
14
+ .shortpixel.shortpixel-notice span {
15
+ vertical-align: middle; }
16
+ .shortpixel.shortpixel-notice span.icon {
17
+ margin: 0 25px 0 0;
18
+ width: 80px; }
19
+ .shortpixel.shortpixel-notice span.content {
20
+ padding: 8px 0; }
21
+ .shortpixel.shortpixel-notice .details-wrapper {
22
+ margin: 8px 0 4px 0; }
23
+ .shortpixel.shortpixel-notice .details-wrapper .detail-content-wrapper {
24
+ max-height: 0;
25
+ overflow: hidden; }
26
+ .shortpixel.shortpixel-notice .details-wrapper .detail-content-wrapper .detail-content {
27
+ opacity: 0;
28
+ transition: opacity 750ms linear; }
29
+ .shortpixel.shortpixel-notice .details-wrapper label {
30
+ opacity: 100;
31
+ transition: opacity 250ms ease-in; }
32
+ .shortpixel.shortpixel-notice .details-wrapper label span {
33
+ cursor: pointer;
34
+ font-size: 14px;
35
+ color: #0085ba;
36
+ font-weight: 500; }
37
+ .shortpixel.shortpixel-notice .details-wrapper input[name="detailhider"] {
38
+ display: none; }
39
+ .shortpixel.shortpixel-notice .details-wrapper input[name="detailhider"]:checked ~ .detail-content-wrapper {
40
+ max-height: none; }
41
+ .shortpixel.shortpixel-notice .details-wrapper input[name="detailhider"]:checked ~ .detail-content-wrapper .detail-content {
42
+ opacity: 100; }
43
+ .shortpixel.shortpixel-notice .details-wrapper input[name="detailhider"]:checked ~ .show-details {
44
+ opacity: 0;
45
+ transition: opacity 50ms ease-out; }
46
+ .shortpixel.shortpixel-notice .details-wrapper input[name='detailhider']:not(:checked) ~ .hide-details {
47
+ opacity: 0;
48
+ transition: opacity 50ms ease-out; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
49
 
50
  .shortpixel.shortpixel-notice .sp-conflict-plugins {
51
  display: table;
52
  border-spacing: 10px;
53
+ border-collapse: separate; }
54
+ .shortpixel.shortpixel-notice .sp-conflict-plugins li {
55
+ display: table-row; }
56
+ .shortpixel.shortpixel-notice .sp-conflict-plugins li > * {
57
+ display: table-cell; }
 
 
 
58
  .shortpixel.shortpixel-notice .content .button-primary {
59
  background-color: #0f6a7d;
60
+ border-color: #0f6a7d; }
61
+ .shortpixel.shortpixel-notice .content .button-primary:hover {
62
+ background-color: #1cbecb; }
 
 
63
  .shortpixel.shortpixel-notice li.sp-conflict-plugins-list {
64
  line-height: 28px;
65
  list-style: disc;
66
+ margin-left: 80px; }
 
67
  .shortpixel.shortpixel-notice li.sp-conflict-plugins-list a.button {
68
+ margin-left: 10px; }
 
69
 
70
  /*# sourceMappingURL=shortpixel-notices.css.map */
res/css/shortpixel-notices.css.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"sourceRoot":"","sources":["../scss/shortpixel-notices.scss","../scss/elements/_colors.scss"],"names":[],"mappings":"AAGA;EAIG;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;AAMA;EAEE;;AAEF;EAEE;;AACA;EAEE;EACH;;AAGD;EAGC;;AAGD;EAEG;;AACA;EAEE;EACA;;AAEA;EACE;EACA;;AAGJ;EAEE;EACA;;AACA;EAEE;EACA;EACA;EACA;;AAGJ;EAA4B;;AAC5B;EAEI;;AAEJ;EAEI;;AAGJ;EAEG;EACD;;AAEF;EAEG;EACA;;;AAQP;EACI;EACA;EACA;;AACA;EACI;;AAEJ;EACI;;AAKR;EAEE,kBC3GY;ED4Gd,cC5Gc;;AD8Gd;EAAU,kBC7GC;;ADgHX;EACI;EACA;EACA;;AAEJ;EACI","file":"shortpixel-notices.css"}
 
 
 
 
 
 
1
+ {
2
+ "version": 3,
3
+ "mappings": "AAGA,6BACA;EAGG,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,GAAG;EACZ,OAAO,EAAE,IAAI;EACb,WAAW,EAAE,MAAM;EACnB,UAAU,EAAE,IAAI;EAChB,OAAO,EAAE,QAAQ;EACjB,UAAU,EAAE,6BAA0B;EACtC,MAAM,EAAE,iBAAiB;EACzB,MAAM,EAAE,MAAM;EACf,iBAAiB,EAAE,GAAG;EACrB,iBAAiB,EAAE,OAAO;EAC1B,QAAQ,EAAE,QAAQ;EAMlB,kCACA;IACE,cAAc,EAAE,MAAM;IACtB,uCAAO;MAEL,MAAM,EAAE,UAAU;MACrB,KAAK,EAAE,IAAI;IAGZ,0CACA;MAEC,OAAO,EAAE,KAAK;EAGf,8CACA;IACG,MAAM,EAAE,WAAW;IACnB,sEACA;MACE,UAAU,EAAE,CAAC;MACb,QAAQ,EAAE,MAAM;MAEhB,sFAAgB;QACd,OAAO,EAAE,CAAC;QACV,UAAU,EAAE,oBAAoB;IAGpC,oDACA;MACE,OAAO,EAAE,GAAG;MACZ,UAAU,EAAE,qBAAqB;MACjC,yDACA;QACE,MAAM,EAAE,OAAO;QACf,SAAS,EAAE,IAAI;QACf,KAAK,EAAE,OAAO;QACd,WAAW,EAAE,GAAG;IAGpB,wEAA0B;MAAE,OAAO,EAAE,IAAI;IACzC,0GACA;MACI,UAAU,EAAE,IAAI;IAEpB,0HACA;MACI,OAAO,EAAE,GAAG;IAGhB,gGACA;MACG,OAAO,EAAE,CAAC;MACX,UAAU,EAAE,qBAAqB;IAEnC,sGACA;MACG,OAAO,EAAE,CAAC;MACV,UAAU,EAAE,qBAAqB;;AAQxC,kDAAqB;EACjB,OAAO,EAAE,KAAK;EACd,cAAc,EAAE,IAAI;EACpB,eAAe,EAAE,QAAQ;EACzB,qDAAG;IACC,OAAO,EAAE,SAAS;EAEtB,yDAAO;IACH,OAAO,EAAE,UAAU;AAK3B,sDACA;EACE,gBAAgB,ECxGJ,OAAO;EDyGrB,YAAY,ECzGE,OAAO;ED2GrB,4DAAQ;IAAE,gBAAgB,EC1Gf,OAAO;AD6GlB,yDAA4B;EACxB,WAAW,EAAE,IAAI;EACjB,UAAU,EAAE,IAAI;EAChB,WAAW,EAAE,IAAI;AAErB,kEAAqC;EACjC,WAAW,EAAE,IAAI",
4
+ "sources": ["../scss/shortpixel-notices.scss","../scss/elements/_colors.scss"],
5
+ "names": [],
6
+ "file": "shortpixel-notices.css"
7
+ }
res/css/shortpixel-othermedia.css CHANGED
@@ -1,176 +1,129 @@
1
  @media (max-width: 1250px) {
2
  #shortpixel-hs-blind, #shortpixel-hs-tools, #botbutton, #beacon-container {
3
- display: none !important;
4
- }
5
- }
6
  .shortpixel-other-media {
7
- margin-bottom: 120px;
8
- }
9
- .shortpixel-other-media .search-form {
10
- float: right;
11
- }
12
- .shortpixel-other-media .search-form label {
13
- margin-right: 8px;
14
- }
15
- .shortpixel-other-media .pagination {
16
- margin: 25px 0;
17
- }
18
- @media (max-width: 782px) {
19
- .shortpixel-other-media .pagination .pagination-links {
20
- float: right;
21
- margin: 8px 0;
22
- }
23
- .shortpixel-other-media .pagination .displaying-num {
24
- display: none;
25
- }
26
- }
27
- .shortpixel-other-media .list-overview {
28
- width: 100%;
29
- background: #fff;
30
- border: 1px solid #ccd0d4;
31
- box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
32
- clear: both;
33
- display: table;
34
- }
35
- .shortpixel-other-media .list-overview .heading, .shortpixel-other-media .list-overview .item {
36
- display: table-row;
37
- }
38
- .shortpixel-other-media .list-overview .heading > span, .shortpixel-other-media .list-overview .item > span {
39
- display: table-cell;
40
- padding: 8px 10px;
41
- line-height: 1.5em;
42
- vertical-align: top;
43
- }
44
- .shortpixel-other-media .list-overview .heading {
45
- border-bottom: 1px solid #ccc;
46
- font-size: 14px;
47
- }
48
- .shortpixel-other-media .list-overview .heading a {
49
- text-decoration: none;
50
- display: inline-block;
51
- width: 100%;
52
- }
53
- .shortpixel-other-media .list-overview .heading a .sorted::before {
54
- visibility: visible;
55
- }
56
- .shortpixel-other-media .list-overview .heading a .sorted.desc::before {
57
- content: "\f140";
58
- }
59
- .shortpixel-other-media .list-overview .heading a:hover .sorting-indicator::before {
60
- content: "\f142";
61
- visibility: visible;
62
- }
63
- .shortpixel-other-media .list-overview .heading a:hover .sorting-indicator.asc::before {
64
- content: "\f140";
65
- }
66
- .shortpixel-other-media .list-overview .heading span.heading span {
67
- float: left;
68
- cursor: pointer;
69
- }
70
- .shortpixel-other-media .list-overview .item:nth-child(odd) {
71
- background-color: #f9f9f9;
72
- }
73
- .shortpixel-other-media .list-overview .item span:last-child {
74
- min-width: 400px;
75
- max-width: 400px;
76
- }
77
- .shortpixel-other-media .list-overview .item:hover .row-actions {
78
- left: 0;
79
- color: #bbb;
80
- }
81
- .shortpixel-other-media .list-overview .item:hover .row-actions a {
82
- text-decoration: none;
83
- padding-right: 4px;
84
- padding-left: 4px;
85
- }
86
- .shortpixel-other-media .list-overview .item:hover .row-actions a:first-child {
87
- padding-left: 0;
88
- }
89
- .shortpixel-other-media .list-overview .item .filename {
90
- font-size: 14px;
91
- min-width: 150px;
92
- }
93
- .shortpixel-other-media .list-overview .item .thumb {
94
- min-width: 60px;
95
- min-height: 60px;
96
- display: inline-block;
97
- border: 1px solid #ccc;
98
- background-size: cover;
99
- background-position: center;
100
- }
101
- .shortpixel-other-media .list-overview .item .thumb img {
102
- max-width: 60px;
103
- max-height: 60px;
104
- border: 1px solid #ccc;
105
- background: #eee;
106
- }
107
- .shortpixel-other-media .list-overview .item .actions {
108
- min-width: 105px;
109
- }
110
- .shortpixel-other-media .list-overview .item .single-action {
111
- text-align: left;
112
- }
113
- .shortpixel-other-media .list-overview .item .single-action a {
114
- color: #fff;
115
- text-decoration: none;
116
- text-align: center;
117
- }
118
- .shortpixel-other-media .list-overview .item .single-action .button-smaller {
119
- width: 110px;
120
- }
121
- .shortpixel-other-media .list-overview .item .multi-action-wrapper {
122
- display: flex;
123
- flex-direction: column;
124
- }
125
- .shortpixel-other-media .list-overview .item .multi-action-wrapper .single-action {
126
- display: inline-block;
127
- margin: 8px 0;
128
- }
129
- .shortpixel-other-media .list-overview .item .multi-action-wrapper .single-action a {
130
- display: block;
131
- }
132
- .shortpixel-other-media .list-overview .item .sp-column-info {
133
- width: 100%;
134
- min-width: 250px;
135
- display: inline-block;
136
- position: relative;
137
- }
138
- @media (max-width: 1550px) {
139
- .shortpixel-other-media .list-overview .item .sp-column-info {
140
- width: auto;
141
- }
142
- }
143
- .shortpixel-other-media .list-overview .item .sp-column-info .sp-column-actions {
144
- position: absolute;
145
- right: 15px;
146
- top: 0;
147
- }
148
- @media (max-width: 1250px) {
149
- .shortpixel-other-media .list-overview .heading .type {
150
- display: none;
151
- }
152
- .shortpixel-other-media .list-overview .item .mediatype {
153
- display: none;
154
- }
155
- .shortpixel-other-media .list-overview .item .filename, .shortpixel-other-media .list-overview .item .folderpath {
156
- max-width: 250px;
157
- overflow: hidden;
158
- text-overflow: ellipsis;
159
- }
160
- }
161
- @media (max-width: 1200px) {
162
- .shortpixel-other-media .list-overview .heading .date {
163
- display: none;
164
- }
165
- .shortpixel-other-media .list-overview .item .date {
166
- display: none;
167
- }
168
- }
169
- .shortpixel-other-media .list-overview .no-items {
170
- padding: 10px;
171
- }
172
- .shortpixel-other-media .list-overview .no-items p {
173
- font-size: 14px;
174
- }
175
 
176
  /*# sourceMappingURL=shortpixel-othermedia.css.map */
1
  @media (max-width: 1250px) {
2
  #shortpixel-hs-blind, #shortpixel-hs-tools, #botbutton, #beacon-container {
3
+ display: none !important; } }
 
 
4
  .shortpixel-other-media {
5
+ margin-bottom: 120px; }
6
+ .shortpixel-other-media .search-form {
7
+ float: right; }
8
+ .shortpixel-other-media .search-form label {
9
+ margin-right: 8px; }
10
+ .shortpixel-other-media .pagination {
11
+ margin: 25px 0; }
12
+ @media (max-width: 782px) {
13
+ .shortpixel-other-media .pagination .pagination-links {
14
+ float: right;
15
+ margin: 8px 0; }
16
+ .shortpixel-other-media .pagination .displaying-num {
17
+ display: none; } }
18
+ .shortpixel-other-media .list-overview {
19
+ width: 100%;
20
+ background: #fff;
21
+ border: 1px solid #ccd0d4;
22
+ box-shadow: 0 1px 1px rgba(0, 0, 0, 0.04);
23
+ clear: both;
24
+ display: table; }
25
+ .shortpixel-other-media .list-overview .heading, .shortpixel-other-media .list-overview .item {
26
+ display: table-row; }
27
+ .shortpixel-other-media .list-overview .heading > span, .shortpixel-other-media .list-overview .item > span {
28
+ display: table-cell;
29
+ padding: 8px 10px;
30
+ line-height: 1.5em;
31
+ vertical-align: top; }
32
+ .shortpixel-other-media .list-overview .heading {
33
+ border-bottom: 1px solid #ccc;
34
+ font-size: 14px; }
35
+ .shortpixel-other-media .list-overview .heading a {
36
+ text-decoration: none;
37
+ display: inline-block;
38
+ width: 100%; }
39
+ .shortpixel-other-media .list-overview .heading a .sorted::before {
40
+ visibility: visible; }
41
+ .shortpixel-other-media .list-overview .heading a .sorted.desc::before {
42
+ content: "\f140"; }
43
+ .shortpixel-other-media .list-overview .heading a:hover .sorting-indicator::before {
44
+ content: "\f142";
45
+ visibility: visible; }
46
+ .shortpixel-other-media .list-overview .heading a:hover .sorting-indicator.asc::before {
47
+ content: "\f140"; }
48
+ .shortpixel-other-media .list-overview .heading span.heading span {
49
+ float: left;
50
+ cursor: pointer; }
51
+ .shortpixel-other-media .list-overview .item:nth-child(odd) {
52
+ background-color: #f9f9f9; }
53
+ .shortpixel-other-media .list-overview .item span:last-child {
54
+ min-width: 400px;
55
+ max-width: 400px; }
56
+ .shortpixel-other-media .list-overview .item:hover .row-actions {
57
+ left: 0;
58
+ color: #bbb; }
59
+ .shortpixel-other-media .list-overview .item:hover .row-actions a {
60
+ text-decoration: none;
61
+ padding-right: 4px;
62
+ padding-left: 4px; }
63
+ .shortpixel-other-media .list-overview .item:hover .row-actions a:first-child {
64
+ padding-left: 0; }
65
+ .shortpixel-other-media .list-overview .item .filename {
66
+ font-size: 14px;
67
+ min-width: 150px; }
68
+ .shortpixel-other-media .list-overview .item .thumb {
69
+ min-width: 60px;
70
+ min-height: 60px;
71
+ display: inline-block;
72
+ border: 1px solid #ccc;
73
+ background-size: cover;
74
+ background-position: center; }
75
+ .shortpixel-other-media .list-overview .item .thumb img {
76
+ max-width: 60px;
77
+ max-height: 60px;
78
+ border: 1px solid #ccc;
79
+ background: #eee; }
80
+ .shortpixel-other-media .list-overview .item .actions {
81
+ min-width: 105px; }
82
+ .shortpixel-other-media .list-overview .item .single-action {
83
+ text-align: left; }
84
+ .shortpixel-other-media .list-overview .item .single-action a {
85
+ color: #fff;
86
+ text-decoration: none;
87
+ text-align: center; }
88
+ .shortpixel-other-media .list-overview .item .single-action .button-smaller {
89
+ width: 110px; }
90
+ .shortpixel-other-media .list-overview .item .multi-action-wrapper {
91
+ display: flex;
92
+ flex-direction: column; }
93
+ .shortpixel-other-media .list-overview .item .multi-action-wrapper .single-action {
94
+ display: inline-block;
95
+ margin: 8px 0; }
96
+ .shortpixel-other-media .list-overview .item .multi-action-wrapper .single-action a {
97
+ display: block; }
98
+ .shortpixel-other-media .list-overview .item .sp-column-info {
99
+ width: 100%;
100
+ min-width: 250px;
101
+ display: inline-block;
102
+ position: relative; }
103
+ @media (max-width: 1550px) {
104
+ .shortpixel-other-media .list-overview .item .sp-column-info {
105
+ width: auto; } }
106
+ .shortpixel-other-media .list-overview .item .sp-column-info .sp-column-actions {
107
+ position: absolute;
108
+ right: 15px;
109
+ top: 0; }
110
+ @media (max-width: 1250px) {
111
+ .shortpixel-other-media .list-overview .heading .type {
112
+ display: none; }
113
+ .shortpixel-other-media .list-overview .item .mediatype {
114
+ display: none; }
115
+ .shortpixel-other-media .list-overview .item .filename, .shortpixel-other-media .list-overview .item .folderpath {
116
+ max-width: 250px;
117
+ overflow: hidden;
118
+ text-overflow: ellipsis; } }
119
+ @media (max-width: 1200px) {
120
+ .shortpixel-other-media .list-overview .heading .date {
121
+ display: none; }
122
+ .shortpixel-other-media .list-overview .item .date {
123
+ display: none; } }
124
+ .shortpixel-other-media .list-overview .no-items {
125
+ padding: 10px; }
126
+ .shortpixel-other-media .list-overview .no-items p {
127
+ font-size: 14px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
 
129
  /*# sourceMappingURL=shortpixel-othermedia.css.map */
res/css/shortpixel-othermedia.css.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"sourceRoot":"","sources":["../scss/shortpixel-othermedia.scss"],"names":[],"mappings":"AAAA;EAEE;IAEE;;;AAIJ;EAEE;;AACA;EAEE;;AACA;EAEE;;AAGJ;EAEG;;AACD;EAEI;IAEG;IACA;;EAEH;IAEE;;;AAKP;EAEG;EACA;EACA;EACA;EACA;EACA;;AAEA;EAEE;;AAEA;EAEE;EACA;EACA;EACA;;AAGJ;EAEE;EACA;;AACA;EACE;EACA;EACA;;AACA;EAEE;;AAEF;EAEG;;AAID;EAEE;EACA;;AAEF;EAEE;;AAKN;EAEE;EACA;;AAKD;EACG;;AAEP;EAEE;EACD;;AAIK;EAEE;EACA;;AACA;EAGE;EACA;EACA;;AACA;EACG;;AAKT;EAEE;EACL;;AAEG;EAEE;EACA;EACA;EACA;EACA;EACA;;AAEA;EACE;EACA;EACA;EACA;;AAGJ;EAEE;;AAOF;EAEE;;AACA;EAEE;EACA;EACA;;AAGF;EAEE;;AAIJ;EAEE;EACA;;AACA;EAEE;EACA;;AACA;EAEE;;AAMN;EAEH;EACK;EACA;EACL;;AAEK;EAPF;IAQM;;;AAET;EAEE;EACD;EACA;;AAID;EAII;IAAQ;;EAGP;IAAa;;EACb;IAAyB;IAAkB;IAAkB;;;AAIlE;EAIG;IAAQ;;EAKN;IAAQ;;;AAGb;EAEE;;AACA;EACE","file":"shortpixel-othermedia.css"}
 
 
 
 
 
 
1
+ {
2
+ "version": 3,
3
+ "mappings": "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",
4
+ "sources": ["../scss/shortpixel-othermedia.scss"],
5
+ "names": [],
6
+ "file": "shortpixel-othermedia.css"
7
+ }
res/css/shortpixel-settings.css CHANGED
@@ -1,446 +1,358 @@
1
  .settings_page_wp-shortpixel-settings {
2
- /* In-view notice ( not on top, between the options ) - styled after WP notice */
3
- }
4
- .settings_page_wp-shortpixel-settings a {
5
- color: #0f6a7d;
6
- }
7
- .settings_page_wp-shortpixel-settings p {
8
- font-size: 14px;
9
- }
10
- .settings_page_wp-shortpixel-settings .button, .settings_page_wp-shortpixel-settings button:focus {
11
- color: #0f6a7d;
12
- border-color: #0f6a7d;
13
- }
14
- .settings_page_wp-shortpixel-settings .button-primary, .settings_page_wp-shortpixel-settings .button-primary:focus {
15
- background-color: #0f6a7d;
16
- border-color: #0f6a7d;
17
- color: #fff;
18
- }
19
- .settings_page_wp-shortpixel-settings .button-primary:hover, .settings_page_wp-shortpixel-settings .button-primary:focus:hover {
20
- background-color: #1cbecb;
21
- border-color: #0f6a7d;
22
- }
23
- .settings_page_wp-shortpixel-settings .submit .button {
24
- min-height: 44px;
25
- }
26
- .settings_page_wp-shortpixel-settings .top-menu {
27
- font-size: 18px;
28
- display: flex;
29
- width: 100%;
30
- min-height: 50px;
31
- align-items: center;
32
- margin: 15px 0;
33
- }
34
- .settings_page_wp-shortpixel-settings .top-menu .links {
35
- flex: 12 4 auto;
36
- }
37
- .settings_page_wp-shortpixel-settings .top-menu .links a {
38
- font-size: 18px;
39
- margin-right: 8px;
40
- }
41
- .settings_page_wp-shortpixel-settings .top-menu .quota-remaining {
42
- flex: 2 1 2;
43
- text-align: center;
44
- }
45
- .settings_page_wp-shortpixel-settings .top-menu .pie-wrapper {
46
- position: relative;
47
- flex: 4 2 auto;
48
- min-width: 100px;
49
- display: inline-block;
50
- }
51
- @media (max-width: 1100px) {
52
- .settings_page_wp-shortpixel-settings .top-menu .pie-wrapper {
53
- display: none;
54
- }
55
- }
56
- .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary {
57
- position: absolute;
58
- top: -55px;
59
- right: -25px;
60
- z-index: 10;
61
- }
62
- .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average {
63
- width: 100px;
64
- height: 100px;
65
- float: right;
66
- }
67
- .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average .trail {
68
- stroke: #ddd;
69
- }
70
- .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average .path {
71
- stroke: #1cbecb;
72
- stroke-linecap: round;
73
- transition: stroke-dashoffset 0.5s ease 0s;
74
- }
75
- .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average .text {
76
- fill: #1FBEC9;
77
- font-size: 28px;
78
- font-weight: 700;
79
- dominant-baseline: middle;
80
- text-anchor: middle;
81
- }
82
- .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary span {
83
- display: none;
84
- margin: 0;
85
- font-size: 11px;
86
- position: absolute;
87
- bottom: 45px;
88
- padding: 4px 8px;
89
- color: #fff;
90
- background: rgba(15, 106, 125, 0.5);
91
- font-weight: 700;
92
- border-radius: 3px;
93
- white-space: nowrap;
94
- }
95
- @media (max-width: 1500px) {
96
- .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average {
97
- width: 100px;
98
- height: 100px;
99
- }
100
- .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary span {
 
 
 
 
 
 
 
 
101
  display: none;
102
- }
103
- }
104
- .settings_page_wp-shortpixel-settings .wp-shortpixel-tab-content {
105
- transition: all 1000ms linear;
106
- }
107
- .settings_page_wp-shortpixel-settings .red {
108
- color: #ff0000;
109
- }
110
- .settings_page_wp-shortpixel-settings .option {
111
- padding: 8px;
112
- display: inline-block;
113
- }
114
- .settings_page_wp-shortpixel-settings .option p {
115
- margin: 14px 0;
116
- }
117
- .settings_page_wp-shortpixel-settings .shortpixel-help-link span.dashicons {
118
- text-decoration: none;
119
- margin-top: -1px;
120
- }
121
- .settings_page_wp-shortpixel-settings article.sp-tabs section p.settings-info {
122
- padding-top: 0px;
123
- color: #818181;
124
- font-size: 13px !important;
125
- }
126
- .settings_page_wp-shortpixel-settings article.sp-tabs section p.settings-info.shortpixel-settings-error {
127
- color: #c32525;
128
- }
129
- .settings_page_wp-shortpixel-settings article.sp-tabs section .wp-shortpixel-tab-content {
130
- opacity: 0;
131
- }
132
- .settings_page_wp-shortpixel-settings article.sp-tabs section.sel-tab .wp-shortpixel-tab-content {
133
- opacity: 1;
134
- }
135
- .settings_page_wp-shortpixel-settings article.sp-tabs section .option-content {
136
- display: inline-block;
137
- }
138
- .settings_page_wp-shortpixel-settings article.sp-tabs section .suboption {
139
- margin-left: 20px;
140
- }
141
- .settings_page_wp-shortpixel-settings article.sp-tabs section .toggleTarget {
142
- display: none;
143
- opacity: 0;
144
- height: 0;
145
- overflow: hidden;
146
- transition: height 350ms ease-in-out, opacity 750ms ease-in-out;
147
- }
148
- .settings_page_wp-shortpixel-settings article.sp-tabs section .modalTarget {
149
- display: none;
150
- }
151
- .settings_page_wp-shortpixel-settings article.sp-tabs section .toggleTarget.is-visible {
152
- display: block;
153
- opacity: 1;
154
- height: auto;
155
- }
156
- .settings_page_wp-shortpixel-settings article.sp-tabs section h2 {
157
- position: absolute;
158
- font-size: 1.3em;
159
- font-weight: normal;
160
- width: 180px;
161
- height: 1.8em;
162
- top: -1.8em;
163
- left: 10px;
164
- padding: 0;
165
- margin: 0;
166
- color: #999;
167
- background-color: #ddd;
168
- /* border-radius: 5px 5px 0 0; */
169
- }
170
- .settings_page_wp-shortpixel-settings article.sp-tabs section h2 a {
171
- display: block;
172
- width: 100%;
173
- line-height: 1.8em;
174
- text-align: center;
175
- text-decoration: none;
176
- color: #23282d;
177
- outline: 0 none;
178
- }
179
- .settings_page_wp-shortpixel-settings article.sp-tabs section.sel-tab h2 {
180
- color: #333;
181
- background-color: #fff;
182
- z-index: 2;
183
- }
184
- .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(2) h2 {
185
- left: 192px;
186
- }
187
- .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(3) h2 {
188
- left: 374px;
189
- }
190
- .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(4) h2 {
191
- left: 556px;
192
- }
193
- .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(5) h2 {
194
- left: 738px;
195
- }
196
- .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(6) h2 {
197
- left: 920px;
198
- }
199
- .settings_page_wp-shortpixel-settings section#tab-debug h2 {
200
- left: 738px;
201
- }
202
- .settings_page_wp-shortpixel-settings section#tab-debug .flex {
203
- display: flex;
204
- }
205
- .settings_page_wp-shortpixel-settings section#tab-debug .env .flex {
206
- flex-wrap: wrap;
207
- max-width: 450px;
208
- }
209
- .settings_page_wp-shortpixel-settings section#tab-debug .env .flex span {
210
- width: 45%;
211
- padding: 4px;
212
- }
213
- .settings_page_wp-shortpixel-settings section#tab-debug .table {
214
- display: table;
215
- }
216
- .settings_page_wp-shortpixel-settings section#tab-debug .table > div {
217
- display: table-row;
218
- }
219
- .settings_page_wp-shortpixel-settings section#tab-debug .table > div > span {
220
- display: table-cell;
221
- }
222
- .settings_page_wp-shortpixel-settings section#tab-debug .table > div.head > span {
223
- font-weight: 700;
224
- }
225
- .settings_page_wp-shortpixel-settings section#tab-debug .table.notices > div > span {
226
- width: 25%;
227
- text-align: center;
228
- }
229
- .settings_page_wp-shortpixel-settings section.banner {
230
- width: 100%;
231
- background-color: #dcfdff;
232
- display: flex;
233
- align-items: center;
234
- border: 1px solid #ccc;
235
- margin-top: 35px;
236
- margin-bottom: 45px;
237
- position: relative;
238
- opacity: 0;
239
- }
240
- .settings_page_wp-shortpixel-settings section.banner span {
241
- text-align: center;
242
- }
243
- .settings_page_wp-shortpixel-settings section.banner .image {
244
- flex: 1;
245
- }
246
- .settings_page_wp-shortpixel-settings section.banner .line {
247
- flex: 3;
248
- }
249
- .settings_page_wp-shortpixel-settings section.banner .line h3 {
250
- color: #00d0e5;
251
- }
252
- .settings_page_wp-shortpixel-settings section.banner .button-wrap {
253
- flex: 2;
254
- }
255
- .settings_page_wp-shortpixel-settings section.banner .button-wrap .button {
256
- background: #ff0000;
257
- padding: 8px;
258
- font-weight: 700;
259
- font-size: 20px;
260
- margin: 8px;
261
- color: #fff;
262
- text-transform: uppercase;
263
- }
264
- .settings_page_wp-shortpixel-settings .view-notice, .settings_page_wp-shortpixel-settings .compression-notice {
265
- box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
266
- border: 4px solid #fff;
267
- padding: 1px 12px;
268
- }
269
- .settings_page_wp-shortpixel-settings .view-notice p, .settings_page_wp-shortpixel-settings .compression-notice p {
270
- margin: 1em 0 !important;
271
- }
272
- .settings_page_wp-shortpixel-settings .view-notice h4, .settings_page_wp-shortpixel-settings .compression-notice h4 {
273
- margin: 0;
274
- font-size: 16px;
275
- }
276
- .settings_page_wp-shortpixel-settings .view-notice.warning, .settings_page_wp-shortpixel-settings .compression-notice.warning {
277
- border-left-color: #ffb900;
278
- }
279
- .settings_page_wp-shortpixel-settings .compression-notice {
280
- margin-top: -20px;
281
- }
282
- .settings_page_wp-shortpixel-settings .view-notice-row {
283
- display: none;
284
- }
285
- .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression strong {
286
- line-height: 22px;
287
- }
288
- .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression .shortpixel-compression-options {
289
- display: inline-block;
290
- }
291
- .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression label {
292
- width: 158px;
293
- margin: 0 -2px;
294
- background-color: #93d7e5;
295
- font-weight: bold;
296
- display: inline-block;
297
- }
298
- .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression label span {
299
- text-align: center;
300
- font-size: 16px;
301
- padding: 8px 0px;
302
- display: block;
303
- }
304
- .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression label input {
305
- display: none;
306
- }
307
- .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression label input:checked + span {
308
- background-color: #0f6a7d;
309
- color: #FFF;
310
- }
311
 
312
  /* Specific styles for advanced settings tab */
313
  #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder {
314
- margin: 10px 0;
315
- }
316
- #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder .add-folder-text {
317
- margin-left: 5px;
318
- }
319
- #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder input[type=text] {
320
- width: 50em;
321
- max-width: 70%;
322
- }
323
- #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder input[name=saveAdv] {
324
- margin-left: 8px;
325
- }
326
  #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list {
327
  display: table;
328
- border-collapse: separate;
329
- }
330
- #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div.heading {
331
- width: auto;
332
- display: table-header-group;
333
- padding: 12px 16px 12px 12px;
334
- }
335
- #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div.heading span {
336
- font-weight: 600;
337
- font-size: 14px;
338
- }
339
- #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div {
340
- display: table-row;
341
- }
342
- #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div > span {
343
- display: table-cell;
344
- padding: 5px 10px;
345
- vertical-align: middle;
346
- background-color: #eee;
347
- }
348
- #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div > span.action {
349
- background-color: unset;
350
- }
351
- #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list .refresh-folder {
352
- text-decoration: none;
353
- }
354
- #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list .info-icon {
355
- cursor: pointer;
356
- }
357
  #shortpixel-settings-tabs #tab-adv-settings .deliverWebpTypes, #shortpixel-settings-tabs #tab-adv-settings .deliverWebpAlteringTypes {
358
- margin: 16px 0 16px 16px;
359
- }
360
 
361
  .cf_switch label {
362
  width: 100%;
363
  margin: 0 -2px;
364
  background-color: #e2faff;
365
- display: inline-block;
366
- }
367
- .cf_switch label span {
368
- padding: 8px 0px 8px 15px;
369
- display: block;
370
- }
371
- .cf_switch label input {
372
- display: none;
373
- }
374
- .cf_switch label input:checked + span {
375
- background-color: #0085ba;
376
- color: #F7F7F7;
377
- }
378
  .cf_switch.global-hidden label {
379
- cursor: default;
380
- }
381
  .cf_switch.global-hidden input:checked + span {
382
  background-color: #fff;
383
  color: #000;
384
- padding-left: 0;
385
- }
386
 
387
  #tab-tools .button {
388
- min-height: 44px;
389
- }
390
  #tab-tools .option {
391
  clear: both;
392
  display: flex;
393
- margin: 25px 0;
394
- }
395
- #tab-tools .option div.name {
396
- width: 220px;
397
- font-weight: 700;
398
- display: inline-block;
399
- flex: 0 0 auto;
400
- font-size: 14px;
401
- }
402
- #tab-tools .option div.field {
403
- display: inline-block;
404
- vertical-align: middle;
405
- }
406
- #tab-tools .option div.field .button {
407
- min-width: 200px;
408
- font-weight: 700;
409
- text-align: center;
410
- padding: 6px 8px;
411
- }
412
- #tab-tools .option div.field .button.danger {
413
- color: #fff;
414
- background: #ff0000;
415
- border: 1px solid #ff0000;
416
- }
417
- #tab-tools .option div.field.queue-warning {
418
- border: 1px solid #ff0000;
419
- font-weight: 700;
420
- padding: 6px 8px;
421
- }
422
  #tab-tools .option-row {
423
  margin: 15px 0;
424
- display: block;
425
- }
426
  #tab-tools .danger-zone h3 {
427
  margin-left: 15px;
428
  text-transform: uppercase;
429
- font-weight: 700;
430
- }
431
  #tab-tools .danger-zone > p {
432
- margin-left: 15px;
433
- }
434
 
435
  div.spio-inline-help {
436
  float: right;
437
- margin-left: 15px;
438
- }
439
- div.spio-inline-help span {
440
- font-size: 1.8em;
441
- color: #1caecb;
442
- cursor: pointer;
443
- }
444
 
445
  div.spio-modal-shade {
446
  display: none;
@@ -460,8 +372,7 @@ div.spio-modal-shade {
460
  background-color: black;
461
  /* Fallback color */
462
  background-color: rgba(0, 0, 0, 0.4);
463
- /* Black w/ opacity */
464
- }
465
 
466
  div.spio-modal {
467
  background-color: #fefefe;
@@ -481,26 +392,22 @@ div.spio-modal {
481
  top: 10%;
482
  left: 50%;
483
  max-height: 90%;
484
- overflow-y: auto;
485
- }
486
- div.spio-modal .spio-close-help-button {
487
- position: absolute;
488
- top: 5px;
489
- right: 0;
490
- margin-top: 0px;
491
- background: transparent;
492
- border: none;
493
- font-size: 22px;
494
- line-height: 10px;
495
- cursor: pointer;
496
- }
497
 
498
  div.spio-modal-title {
499
- font-size: 22px;
500
- }
501
 
502
  .spio-hide {
503
- display: none;
504
- }
505
 
506
  /*# sourceMappingURL=shortpixel-settings.css.map */
1
  .settings_page_wp-shortpixel-settings {
2
+ /* In-view notice ( not on top, between the options ) - styled after WP notice */ }
3
+ .settings_page_wp-shortpixel-settings a {
4
+ color: #0f6a7d; }
5
+ .settings_page_wp-shortpixel-settings p {
6
+ font-size: 14px; }
7
+ .settings_page_wp-shortpixel-settings .button, .settings_page_wp-shortpixel-settings button:focus {
8
+ color: #0f6a7d;
9
+ border-color: #0f6a7d; }
10
+ .settings_page_wp-shortpixel-settings .button-primary, .settings_page_wp-shortpixel-settings .button-primary:focus {
11
+ background-color: #0f6a7d;
12
+ border-color: #0f6a7d;
13
+ color: #fff; }
14
+ .settings_page_wp-shortpixel-settings .button-primary:hover, .settings_page_wp-shortpixel-settings .button-primary:focus:hover {
15
+ background-color: #1cbecb;
16
+ border-color: #0f6a7d; }
17
+ .settings_page_wp-shortpixel-settings .submit .button {
18
+ min-height: 44px; }
19
+ .settings_page_wp-shortpixel-settings .top-menu {
20
+ font-size: 18px;
21
+ display: flex;
22
+ width: 100%;
23
+ min-height: 50px;
24
+ align-items: center;
25
+ margin: 15px 0;
26
+ position: relative; }
27
+ @media (max-width: 1200px) {
28
+ .settings_page_wp-shortpixel-settings .top-menu {
29
+ margin-bottom: 50px; } }
30
+ .settings_page_wp-shortpixel-settings .top-menu .links {
31
+ padding-right: 195px;
32
+ flex: 12 4 auto; }
33
+ .settings_page_wp-shortpixel-settings .top-menu .links a {
34
+ font-size: 18px;
35
+ margin-right: 8px;
36
+ white-space: nowrap;
37
+ line-height: 26px; }
38
+ .settings_page_wp-shortpixel-settings .top-menu .quota-remaining {
39
+ font-size: 13px; }
40
+ .settings_page_wp-shortpixel-settings .top-menu .spio-status-box {
41
+ text-align: center;
42
+ position: absolute;
43
+ top: -49px;
44
+ right: 0;
45
+ padding: 5px 10px;
46
+ background: white;
47
+ box-shadow: 0 3px 3px rgba(0, 0, 0, 0.1);
48
+ z-index: 1; }
49
+ .settings_page_wp-shortpixel-settings .top-menu .pie-wrapper {
50
+ flex: 4 2 auto;
51
+ min-width: 100px;
52
+ display: inline-block; }
53
+ .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary {
54
+ z-index: 10; }
55
+ .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average {
56
+ width: 100px;
57
+ height: 100px; }
58
+ .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average .trail {
59
+ stroke: #ddd; }
60
+ .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average .path {
61
+ stroke: #1cbecb;
62
+ stroke-linecap: round;
63
+ transition: stroke-dashoffset 0.5s ease 0s; }
64
+ .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average .text {
65
+ fill: #1FBEC9;
66
+ font-size: 28px;
67
+ font-weight: 700;
68
+ dominant-baseline: middle;
69
+ text-anchor: middle; }
70
+ .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary span {
71
+ margin: 0;
72
+ font-size: 12px;
73
+ padding: 4px 8px;
74
+ font-weight: 700;
75
+ border-radius: 3px;
76
+ white-space: nowrap;
77
+ color: #0f6a7d; }
78
+ @media (max-width: 1500px) {
79
+ .settings_page_wp-shortpixel-settings .top-menu div.sp-bulk-summary .opt-circle-average {
80
+ width: 100px;
81
+ height: 100px; } }
82
+ .settings_page_wp-shortpixel-settings .wp-shortpixel-tab-content {
83
+ transition: all 1000ms linear; }
84
+ .settings_page_wp-shortpixel-settings .red {
85
+ color: #ff0000; }
86
+ .settings_page_wp-shortpixel-settings .option {
87
+ padding: 8px;
88
+ display: inline-block; }
89
+ .settings_page_wp-shortpixel-settings .option p {
90
+ margin: 14px 0; }
91
+ .settings_page_wp-shortpixel-settings .shortpixel-help-link span.dashicons {
92
+ text-decoration: none;
93
+ margin-top: -1px; }
94
+ .settings_page_wp-shortpixel-settings article.sp-tabs section p.settings-info {
95
+ padding-top: 0px;
96
+ color: #818181;
97
+ font-size: 13px !important; }
98
+ .settings_page_wp-shortpixel-settings article.sp-tabs section p.settings-info.shortpixel-settings-error {
99
+ color: #c32525; }
100
+ .settings_page_wp-shortpixel-settings article.sp-tabs section .wp-shortpixel-tab-content {
101
+ opacity: 0; }
102
+ .settings_page_wp-shortpixel-settings article.sp-tabs section.sel-tab .wp-shortpixel-tab-content {
103
+ opacity: 1; }
104
+ .settings_page_wp-shortpixel-settings article.sp-tabs section .option-content {
105
+ display: inline-block; }
106
+ .settings_page_wp-shortpixel-settings article.sp-tabs section .suboption {
107
+ margin-left: 20px; }
108
+ .settings_page_wp-shortpixel-settings article.sp-tabs section .toggleTarget {
109
  display: none;
110
+ opacity: 0;
111
+ height: 0;
112
+ overflow: hidden;
113
+ transition: height 350ms ease-in-out, opacity 750ms ease-in-out; }
114
+ .settings_page_wp-shortpixel-settings article.sp-tabs section .modalTarget {
115
+ display: none; }
116
+ .settings_page_wp-shortpixel-settings article.sp-tabs section .toggleTarget.is-visible {
117
+ display: block;
118
+ opacity: 1;
119
+ height: auto; }
120
+ .settings_page_wp-shortpixel-settings article.sp-tabs section h2 {
121
+ position: absolute;
122
+ font-size: 1.3em;
123
+ font-weight: normal;
124
+ width: 180px;
125
+ height: 1.8em;
126
+ top: -1.8em;
127
+ left: 10px;
128
+ padding: 0;
129
+ margin: 0;
130
+ color: #999;
131
+ background-color: #ddd;
132
+ /* border-radius: 5px 5px 0 0; */ }
133
+ @media (max-width: 991px) {
134
+ .settings_page_wp-shortpixel-settings article.sp-tabs section h2 {
135
+ width: 140px; } }
136
+ .settings_page_wp-shortpixel-settings article.sp-tabs section h2 a {
137
+ display: block;
138
+ width: 100%;
139
+ line-height: 1.8em;
140
+ text-align: center;
141
+ text-decoration: none;
142
+ color: #23282d;
143
+ outline: 0 none; }
144
+ .settings_page_wp-shortpixel-settings article.sp-tabs section.sel-tab h2 {
145
+ color: #333;
146
+ background-color: #fff;
147
+ z-index: 2; }
148
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(2) h2 {
149
+ left: 192px; }
150
+ @media (max-width: 991px) {
151
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(2) h2 {
152
+ left: 152px; } }
153
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(3) h2 {
154
+ left: 374px; }
155
+ @media (max-width: 991px) {
156
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(3) h2 {
157
+ left: 294px; } }
158
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(4) h2 {
159
+ left: 556px; }
160
+ @media (max-width: 991px) {
161
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(4) h2 {
162
+ left: 436px; } }
163
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(5) h2 {
164
+ left: 738px; }
165
+ @media (max-width: 991px) {
166
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(5) h2 {
167
+ left: 578px; } }
168
+ .settings_page_wp-shortpixel-settings article.sp-tabs section:nth-of-type(6) h2 {
169
+ left: 920px; }
170
+ .settings_page_wp-shortpixel-settings section#tab-debug h2 {
171
+ left: 738px; }
172
+ .settings_page_wp-shortpixel-settings section#tab-debug .flex {
173
+ display: flex; }
174
+ .settings_page_wp-shortpixel-settings section#tab-debug .env .flex {
175
+ flex-wrap: wrap;
176
+ max-width: 450px; }
177
+ .settings_page_wp-shortpixel-settings section#tab-debug .env .flex span {
178
+ width: 45%;
179
+ padding: 4px; }
180
+ .settings_page_wp-shortpixel-settings section#tab-debug .table {
181
+ display: table; }
182
+ .settings_page_wp-shortpixel-settings section#tab-debug .table > div {
183
+ display: table-row; }
184
+ .settings_page_wp-shortpixel-settings section#tab-debug .table > div > span {
185
+ display: table-cell; }
186
+ .settings_page_wp-shortpixel-settings section#tab-debug .table > div.head > span {
187
+ font-weight: 700; }
188
+ .settings_page_wp-shortpixel-settings section#tab-debug .table.notices > div > span {
189
+ width: 18%;
190
+ text-align: center; }
191
+ .settings_page_wp-shortpixel-settings section.banner {
192
+ width: 100%;
193
+ background-color: #dcfdff;
194
+ display: flex;
195
+ align-items: center;
196
+ border: 1px solid #ccc;
197
+ margin-top: 35px;
198
+ margin-bottom: 45px;
199
+ position: relative;
200
+ opacity: 0; }
201
+ .settings_page_wp-shortpixel-settings section.banner span {
202
+ text-align: center; }
203
+ .settings_page_wp-shortpixel-settings section.banner .image {
204
+ flex: 1; }
205
+ .settings_page_wp-shortpixel-settings section.banner .line {
206
+ flex: 3; }
207
+ .settings_page_wp-shortpixel-settings section.banner .line h3 {
208
+ color: #00d0e5; }
209
+ .settings_page_wp-shortpixel-settings section.banner .button-wrap {
210
+ flex: 2; }
211
+ .settings_page_wp-shortpixel-settings section.banner .button-wrap .button {
212
+ background: #ff0000;
213
+ padding: 8px;
214
+ font-weight: 700;
215
+ font-size: 20px;
216
+ margin: 8px;
217
+ color: #fff;
218
+ text-transform: uppercase; }
219
+ .settings_page_wp-shortpixel-settings .view-notice, .settings_page_wp-shortpixel-settings .compression-notice {
220
+ box-shadow: 0 1px 1px 0 rgba(0, 0, 0, 0.1);
221
+ border: 4px solid #fff;
222
+ padding: 1px 12px; }
223
+ .settings_page_wp-shortpixel-settings .view-notice p, .settings_page_wp-shortpixel-settings .compression-notice p {
224
+ margin: 1em 0 !important; }
225
+ .settings_page_wp-shortpixel-settings .view-notice h4, .settings_page_wp-shortpixel-settings .compression-notice h4 {
226
+ margin: 0;
227
+ font-size: 16px; }
228
+ .settings_page_wp-shortpixel-settings .view-notice.warning, .settings_page_wp-shortpixel-settings .compression-notice.warning {
229
+ border-left-color: #ffb900; }
230
+ .settings_page_wp-shortpixel-settings .compression-notice {
231
+ margin-top: -20px; }
232
+ .settings_page_wp-shortpixel-settings .view-notice-row {
233
+ display: none; }
234
+ .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression strong {
235
+ line-height: 22px; }
236
+ .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression .shortpixel-compression-options {
237
+ display: inline-block; }
238
+ .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression label {
239
+ width: 158px;
240
+ margin: 0 -2px;
241
+ background-color: #d1f5fd;
242
+ font-weight: bold;
243
+ display: inline-block; }
244
+ .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression label span {
245
+ text-align: center;
246
+ font-size: 16px;
247
+ padding: 8px 0px;
248
+ display: block; }
249
+ .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression label input {
250
+ display: none; }
251
+ .settings_page_wp-shortpixel-settings #tab-settings .shortpixel-compression label input:checked + span {
252
+ background-color: #0f6a7d;
253
+ color: #FFF; }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
254
 
255
  /* Specific styles for advanced settings tab */
256
  #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder {
257
+ margin: 10px 0; }
258
+ #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder .add-folder-text {
259
+ margin-left: 5px; }
260
+ #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder input[type="text"] {
261
+ width: 50em;
262
+ max-width: 70%; }
263
+ #shortpixel-settings-tabs #tab-adv-settings .addCustomFolder input[name="saveAdv"] {
264
+ margin-left: 8px; }
 
 
 
 
265
  #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list {
266
  display: table;
267
+ border-collapse: separate; }
268
+ #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div.heading {
269
+ width: auto;
270
+ display: table-header-group;
271
+ padding: 12px 16px 12px 12px; }
272
+ #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div.heading span {
273
+ font-weight: 600;
274
+ font-size: 14px; }
275
+ #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div {
276
+ display: table-row; }
277
+ #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div > span {
278
+ display: table-cell;
279
+ padding: 5px 10px;
280
+ vertical-align: middle;
281
+ background-color: #eee; }
282
+ #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list div > span.action {
283
+ background-color: unset; }
284
+ #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list .refresh-folder {
285
+ text-decoration: none; }
286
+ #shortpixel-settings-tabs #tab-adv-settings .shortpixel-folders-list .info-icon {
287
+ cursor: pointer; }
 
 
 
 
 
 
 
 
288
  #shortpixel-settings-tabs #tab-adv-settings .deliverWebpTypes, #shortpixel-settings-tabs #tab-adv-settings .deliverWebpAlteringTypes {
289
+ margin: 16px 0 16px 16px; }
 
290
 
291
  .cf_switch label {
292
  width: 100%;
293
  margin: 0 -2px;
294
  background-color: #e2faff;
295
+ display: inline-block; }
296
+ .cf_switch label span {
297
+ padding: 8px 0px 8px 15px;
298
+ display: block; }
299
+ .cf_switch label input {
300
+ display: none; }
301
+ .cf_switch label input:checked + span {
302
+ background-color: #0085ba;
303
+ color: #F7F7F7; }
 
 
 
 
304
  .cf_switch.global-hidden label {
305
+ cursor: default; }
 
306
  .cf_switch.global-hidden input:checked + span {
307
  background-color: #fff;
308
  color: #000;
309
+ padding-left: 0; }
 
310
 
311
  #tab-tools .button {
312
+ min-height: 44px; }
 
313
  #tab-tools .option {
314
  clear: both;
315
  display: flex;
316
+ margin: 25px 0; }
317
+ #tab-tools .option div.name {
318
+ width: 220px;
319
+ font-weight: 700;
320
+ display: inline-block;
321
+ flex: 0 0 auto;
322
+ font-size: 14px; }
323
+ #tab-tools .option div.field {
324
+ display: inline-block;
325
+ vertical-align: middle; }
326
+ #tab-tools .option div.field .button {
327
+ min-width: 200px;
328
+ font-weight: 700;
329
+ text-align: center;
330
+ padding: 6px 8px; }
331
+ #tab-tools .option div.field .button.danger {
332
+ color: #fff;
333
+ background: #ff0000;
334
+ border: 1px solid #ff0000; }
335
+ #tab-tools .option div.field.queue-warning {
336
+ border: 1px solid #ff0000;
337
+ font-weight: 700;
338
+ padding: 6px 8px; }
 
 
 
 
 
 
339
  #tab-tools .option-row {
340
  margin: 15px 0;
341
+ display: block; }
 
342
  #tab-tools .danger-zone h3 {
343
  margin-left: 15px;
344
  text-transform: uppercase;
345
+ font-weight: 700; }
 
346
  #tab-tools .danger-zone > p {
347
+ margin-left: 15px; }
 
348
 
349
  div.spio-inline-help {
350
  float: right;
351
+ margin-left: 15px; }
352
+ div.spio-inline-help span {
353
+ font-size: 1.8em;
354
+ color: #1caecb;
355
+ cursor: pointer; }
 
 
356
 
357
  div.spio-modal-shade {
358
  display: none;
372
  background-color: black;
373
  /* Fallback color */
374
  background-color: rgba(0, 0, 0, 0.4);
375
+ /* Black w/ opacity */ }
 
376
 
377
  div.spio-modal {
378
  background-color: #fefefe;
392
  top: 10%;
393
  left: 50%;
394
  max-height: 90%;
395
+ overflow-y: auto; }
396
+ div.spio-modal .spio-close-help-button {
397
+ position: absolute;
398
+ top: 5px;
399
+ right: 0;
400
+ margin-top: 0px;
401
+ background: transparent;
402
+ border: none;
403
+ font-size: 22px;
404
+ line-height: 10px;
405
+ cursor: pointer; }
 
 
406
 
407
  div.spio-modal-title {
408
+ font-size: 22px; }
 
409
 
410
  .spio-hide {
411
+ display: none; }
 
412
 
413
  /*# sourceMappingURL=shortpixel-settings.css.map */
res/css/shortpixel-settings.css.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"sourceRoot":"","sources":["../scss/view/_settings.scss","../scss/elements/_colors.scss","../scss/elements/_breakpoints.scss","../scss/view/_settings-advanced.scss","../scss/view/_settings-cloudflare.scss","../scss/view/_settings-tools.scss","../scss/view/_inline-help.scss"],"names":[],"mappings":"AAEA;AAkVE;;AA7UD;EACC,OCPc;;ADUf;EACC;;AAED;EAEC,OCfc;EDgBd,cChBc;;ADkBf;EACC,kBCnBc;EDoBd,cCpBc;EDqBd;;AAEA;EAEC,kBCxBU;EDyBV,cC1Ba;;AD+Bd;EACC;;AAGD;EAEE;EACF;EACA;EACA;EACA;EACA;;AAEA;EAGC;;AADE;EAAI;EAAiB;;AAKxB;EAGE;EACA;;AAEF;EAEC;EACA;EACA;EACA;;AEnDC;EF8CF;IASG;;;AAGH;EACE;EACA;EACA;EAEA;;AAEA;EACE;EACA;EACA;;AAEA;EACC;;AAED;EACC,QCpFM;EDqFN;EACA;;AAED;EAEC;EACA;EACA;EACA;EACA;;AAIH;EACC;EACA;EACA;EACA;EAGA;EAEA;EACA;EACA;EACA;EACA;EACA;;AEtGD;EF2GC;IACE;IACA;;EAEF;IAEC;;;AAMJ;EAEE;;AAEF;EACG;;AAGJ;EAEE;EACA;;AAKA;EACC;;AAIH;EAEI;EACA;;AAQF;EACI;EACA;EACA;;AAEJ;EACI;;AAGD;EACE;;AACF;EAEE;;AAIL;EAEE;;AAEF;EAEC;;AAIA;EAEE;EACA;EACA;EACA;EACA;;AAGF;EAEE;;AAGF;EAEC;EACA;EACA;;AAID;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;AACA;;AACA;EACI;EACA;EACA;EACA;EACA;EACA;EACA;;AAGR;EAEC;EACA;EACA;;AAID;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAEJ;EACI;;AAUH;EAAK;;AACH;EACE;;AAEF;EACG;EACA;;AACA;EACI;EACA;;AAGP;EAEG;;AACA;EACI;;AACA;EACE;;AAEF;EAAgB;;AAKpB;EAEG;EACA;;AAKT;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EAEA;EACA;;AAEA;EACE;;AAIF;EAAS;;AACT;EACG;;AACA;EAAK;;AAGR;EAEE;;AACA;EACG;EACA;EACA;EACA;EACA;EACA;EACA;;AAQR;EAGE;EACA;EAEA;;AACA;EACE;;AAIJ;EACC;EACA;;AAEC;EAEE;;AAIL;EAEC;;AAGA;EAEE;;AAQE;EAEC;;AAEF;EAEC;;AAEF;EACI;EACA;EACA,kBClYM;EDmYN;EACA;;AACF;EACI;EACA;EACA;EACA;;AAEJ;EACI;;AACF;EACI,kBChZI;EDiZJ;;;AGlZZ;AAKE;EAEE;;AACA;EAEE;;AAEF;EAEE;EACA;;AAEF;EAEE;;AAKJ;EAEI;EACA;;AAEA;EAEE;EACA;EACA;;AACA;EAEE;EACA;;AAGJ;EAGE;;AACA;EAEE;EACA;EACA;EACA;;AACA;EAAW;;AAMf;EAAkB;;AAClB;EAAa;;AAGlB;EACG;;;ACxDF;EACE;EACD;EACA;EAEA;;AAIC;EAIE;EACA;;AAIF;EACE;;AAEF;EAEE;EACA;;AAMJ;EACE;;AAED;EAEC;EACA;EACA;;;ACvCH;EAAU;;AACV;EACE;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;;AAEF;EACE;EACA;;AAGA;EACE;EACA;EACA;EACA;;AACA;EAEE;EACA;EACA;;AAIJ;EAEC;EACA;EACA;;AAQF;EAEC;EACA;;AAKH;EACC;EACA;EACA;;AAED;EAAM;;;ACzDR;EACI;EACF;;AACA;EACI;EACA;EACA;;;AAIN;EACI;AAAe;EACf;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;AAAkB;EAClB;AAAc;EACd;EACA;EACA;EACA;EACA;;AACF;EACE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;;;AAMJ;EACI;;;AAEJ;EAAa","file":"shortpixel-settings.css"}
 
 
 
 
 
 
1
+ {
2
+ "version": 3,
3
+ "mappings": "AAEA,qCACA;EAgWE,iFAAiF;EA5VlF,uCAAE;IACD,KAAK,ECPS,OAAO;EDUtB,uCAAE;IACD,SAAS,EAAE,IAAI;EAEhB,iGACA;IACC,KAAK,ECfS,OAAO;IDgBrB,YAAY,EChBE,OAAO;EDkBtB,kHAAuC;IACtC,gBAAgB,ECnBF,OAAO;IDoBrB,YAAY,ECpBE,OAAO;IDqBrB,KAAK,EAAE,IAAI;IAEX,8HACA;MACC,gBAAgB,ECxBN,OAAO;MDyBjB,YAAY,EC1BC,OAAO;ED+BrB,qDAAQ;IACP,UAAU,EAAE,IAAI;EAGjB,+CACA;IACI,SAAS,EAAE,IAAI;IAClB,OAAO,EAAE,IAAI;IACb,KAAK,EAAE,IAAI;IACX,UAAU,EAAE,IAAI;IAChB,WAAW,EAAE,MAAM;IACnB,MAAM,EAAE,MAAM;IACd,QAAQ,EAAE,QAAQ;IEhCjB,0BAAyB;MFwB3B,+CACA;QAUE,aAAa,EAAE,IAAI;IAGrB,sDACA;MAGC,aAAa,EAAE,KAAK;MACpB,IAAI,EAAE,SAAS;MAFZ,wDAAE;QAAE,SAAS,EAAE,IAAI;QAAE,YAAY,EAAE,GAAG;QAAE,WAAW,EAAE,MAAM;QAAE,WAAW,EAAE,IAAI;IAIlF,gEACA;MAEC,SAAS,EAAE,IAAI;IAEb,gEAAiB;MACnB,UAAU,EAAE,MAAM;MAClB,QAAQ,EAAE,QAAQ;MAClB,GAAG,EAAE,KAAK;MACV,KAAK,EAAE,CAAC;MACR,OAAO,EAAE,QAAQ;MACjB,UAAU,EAAE,KAAK;MACjB,UAAU,EAAE,4BAAyB;MACrC,OAAO,EAAE,CAAC;IAEX,4DACA;MACC,IAAI,EAAE,QAAQ;MACd,SAAS,EAAE,KAAK;MAChB,OAAO,EAAE,YAAY;IAGtB,mEAAoB;MAElB,OAAO,EAAE,EAAE;MAEX,uFAAoB;QAClB,KAAK,EAAE,KAAK;QACZ,MAAM,EAAE,KAAK;QAEb,8FAAO;UACN,MAAM,EAAE,IAAI;QAEb,6FAAM;UACL,MAAM,ECzFA,OAAO;UD0Fb,cAAc,EAAE,KAAK;UACrB,UAAU,EAAE,8BAA8B;QAE3C,6FAAM;UAEL,IAAI,EAAE,OAAO;UACb,SAAS,EAAE,IAAI;UACf,WAAW,EAAE,GAAG;UAChB,iBAAiB,EAAE,MAAM;UACzB,WAAW,EAAE,MAAM;MAItB,wEAAK;QACJ,MAAM,EAAE,CAAC;QACT,SAAS,EAAE,IAAI;QACf,OAAO,EAAE,OAAO;QAChB,WAAW,EAAE,GAAG;QAChB,aAAa,EAAE,GAAG;QAClB,WAAW,EAAE,MAAM;QACnB,KAAK,EAAE,OAAO;MEpGf,0BAAyB;QFyGxB,uFAAoB;UAClB,KAAK,EAAE,KAAK;UACZ,MAAM,EAAE,KAAK;EAMlB,gEACA;IACE,UAAU,EAAE,iBAAiB;EAE/B,0CAAK;IACF,KAAK,EAAE,OAAO;EAGlB,6CACA;IACE,OAAO,EAAE,GAAG;IACZ,OAAO,EAAE,YAAY;IAKrB,+CAAE;MACD,MAAM,EAAE,MAAM;EAIjB,0EACA;IACI,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,IAAI;EAQlB,6EAAgB;IACZ,WAAW,EAAE,GAAG;IAChB,KAAK,EAAE,OAAO;IACd,SAAS,EAAC,eAAe;EAE7B,uGAA0C;IACtC,KAAK,EAAE,OAAO;EAGf,wFACA;IAAE,OAAO,EAAE,CAAC;EACZ,gGACA;IACE,OAAO,EAAE,CAAC;EAIf,6EACA;IACE,OAAO,EAAE,YAAY;EAEvB,wEACA;IACC,WAAW,EAAE,IAAI;EAIjB,2EACA;IACE,OAAO,EAAE,IAAI;IACb,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;IACT,QAAQ,EAAE,MAAM;IAChB,UAAU,EAAE,mDAAmD;EAGjE,0EACA;IACE,OAAO,EAAE,IAAI;EAGf,sFACA;IACC,OAAO,EAAE,KAAK;IACd,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,IAAI;EAIb,gEAAW;IACT,QAAQ,EAAE,QAAQ;IAClB,SAAS,EAAE,KAAK;IAChB,WAAW,EAAE,MAAM;IACnB,KAAK,EAAE,KAAK;IACZ,MAAM,EAAE,KAAK;IACb,GAAG,EAAE,MAAM;IACX,IAAI,EAAE,IAAI;IACV,OAAO,EAAE,CAAC;IACV,MAAM,EAAE,CAAC;IACT,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,IAAI;IAKtB,iCAAiC;IElNnC,yBAAyB;MFkMzB,gEAAW;QAcZ,KAAK,EAAE,KAAK;IAGT,kEAAE;MACE,OAAO,EAAE,KAAK;MACd,KAAK,EAAE,IAAI;MACX,WAAW,EAAE,KAAK;MAClB,UAAU,EAAE,MAAM;MAClB,eAAe,EAAE,IAAI;MACrB,KAAK,EAAE,OAAO;MACd,OAAO,EAAE,MAAM;EAGvB,wEACA;IACC,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,IAAI;IACtB,OAAO,EAAE,CAAC;EAIX,+EAA0C;IACtC,IAAI,EAAE,KAAK;IEtOb,yBAAyB;MFqO3B,+EAA0C;QAIxC,IAAI,EAAE,KAAK;EAGb,+EAA0C;IACtC,IAAI,EAAE,KAAK;IE7Ob,yBAAyB;MF4O3B,+EAA0C;QAIxC,IAAI,EAAE,KAAK;EAGb,+EAA0C;IACtC,IAAI,EAAE,KAAK;IEpPb,yBAAyB;MFmP3B,+EAA0C;QAIxC,IAAI,EAAE,KAAK;EAGb,+EAA0C;IACtC,IAAI,EAAE,KAAK;IE3Pb,yBAAyB;MF0P3B,+EAA0C;QAIxC,IAAI,EAAE,KAAK;EAGb,+EAA0C;IACtC,IAAI,EAAE,KAAK;EAWd,0DAAG;IAAE,IAAI,EAAE,KAAK;EACd,6DAAM;IACJ,OAAO,EAAE,IAAI;EAEf,kEAAW;IACR,SAAS,EAAE,IAAI;IACf,SAAS,EAAE,KAAK;IAChB,uEAAK;MACD,KAAK,EAAE,GAAG;MACV,OAAO,EAAE,GAAG;EAGnB,8DACA;IACG,OAAO,EAAE,KAAK;IACd,oEAAK;MACD,OAAO,EAAE,SAAS;MAClB,2EAAM;QACJ,OAAO,EAAE,UAAU;MAErB,gFAAc;QAAE,WAAW,EAAE,GAAG;EAKpC,mFACA;IACG,KAAK,EAAE,GAAG;IACV,UAAU,EAAE,MAAM;EAK3B,oDACA;IACG,KAAK,EAAE,IAAI;IACX,gBAAgB,EAAE,OAAO;IACzB,OAAO,EAAE,IAAI;IACb,WAAW,EAAE,MAAM;IACnB,MAAM,EAAE,cAAc;IACtB,UAAU,EAAE,IAAI;IAChB,aAAa,EAAE,IAAI;IAEnB,QAAQ,EAAE,QAAQ;IAClB,OAAO,EAAE,CAAC;IAEV,yDAAK;MACH,UAAU,EAAE,MAAM;IAIpB,2DAAO;MAAE,IAAI,EAAE,CAAC;IAChB,0DAAM;MACH,IAAI,EAAE,CAAC;MACP,6DAAG;QAAE,KAAK,EAAE,OAAO;IAGtB,iEACA;MACE,IAAI,EAAE,CAAC;MACP,yEAAQ;QACL,UAAU,EAAE,OAAO;QACnB,OAAO,EAAE,GAAG;QACZ,WAAW,EAAE,GAAG;QAChB,SAAS,EAAE,IAAI;QACf,MAAM,EAAE,GAAG;QACX,KAAK,EAAE,IAAI;QACX,cAAc,EAAE,SAAS;EAQjC,6GACA;IAEE,UAAU,EAAE,8BAAgC;IAC5C,MAAM,EAAE,cAAc;IAEtB,OAAO,EAAE,QAAQ;IACjB,iHAAE;MACA,MAAM,EAAE,gBAAgB;IAI5B,mHAAG;MACF,MAAM,EAAE,CAAC;MACT,SAAS,EAAE,IAAI;IAEd,6HACA;MACE,iBAAiB,EAAE,OAAO;EAI/B,yDACA;IACC,UAAU,EAAE,KAAK;EAGjB,sDACA;IACE,OAAO,EAAE,IAAI;EAQX,kFACD;IACE,WAAW,EAAE,IAAI;EAEnB,2GAAgC;IAE/B,OAAO,EAAE,YAAY;EAEvB,iFAAM;IACF,KAAK,EAAC,KAAK;IACX,MAAM,EAAE,MAAM;IACd,gBAAgB,ECjZV,OAAO;IDkZb,WAAW,EAAE,IAAI;IACjB,OAAO,EAAE,YAAY;IACvB,sFAAK;MACD,UAAU,EAAC,MAAM;MACjB,SAAS,EAAE,IAAI;MACf,OAAO,EAAC,OAAO;MACf,OAAO,EAAC,KAAK;IAEjB,uFAAM;MACF,OAAO,EAAE,IAAI;MACf,sGAAiB;QACb,gBAAgB,EC/ZZ,OAAO;QDgaX,KAAK,EAAC,IAAI;;AGjatB,+CAA+C;AAK7C,4DACA;EACE,MAAM,EAAE,MAAM;EACd,6EACA;IACE,WAAW,EAAE,GAAG;EAElB,+EACA;IACE,KAAK,EAAE,IAAI;IACX,SAAS,EAAE,GAAG;EAEhB,kFACA;IACE,WAAW,EAAE,GAAG;AAKpB,oEACA;EACI,OAAO,EAAE,KAAK;EACd,eAAe,EAAE,QAAQ;EAEzB,gFACC;IACC,KAAK,EAAE,IAAI;IACX,OAAO,EAAE,kBAAkB;IAC3B,OAAO,EAAE,mBAAmB;IAC5B,qFACA;MACE,WAAW,EAAE,GAAG;MAChB,SAAS,EAAE,IAAI;EAGnB,wEACA;IAEE,OAAO,EAAE,SAAS;IAClB,+EACA;MACE,OAAO,EAAE,UAAU;MACnB,OAAO,EAAE,QAAQ;MACjB,cAAc,EAAE,MAAM;MACtB,gBAAgB,EAAE,IAAI;MACtB,sFAAS;QAAE,gBAAgB,EAAE,KAAK;EAMtC,oFAAgB;IAAE,eAAe,EAAE,IAAI;EACvC,+EAAW;IAAE,MAAM,EAAE,OAAO;AAGjC,oIAA6C;EAC1C,MAAM,EAAE,gBAAgB;;ACxD1B,gBAAM;EACJ,KAAK,EAAE,IAAI;EACZ,MAAM,EAAE,MAAM;EACd,gBAAgB,EAAE,OAAO;EAEzB,OAAO,EAAE,YAAY;EAIpB,qBACA;IAGE,OAAO,EAAC,gBAAgB;IACxB,OAAO,EAAC,KAAK;EAIf,sBAAM;IACJ,OAAO,EAAE,IAAI;EAEf,qCACA;IACE,gBAAgB,EAAC,OAAO;IACxB,KAAK,EAAC,OAAO;AAMjB,8BAAM;EACJ,MAAM,EAAE,OAAO;AAEhB,6CACD;EACE,gBAAgB,EAAE,IAAI;EACtB,KAAK,EAAE,IAAI;EACX,YAAY,EAAE,CAAC;;ACvClB,kBAAQ;EAAE,UAAU,EAAE,IAAI;AAC1B,kBAAO;EACL,KAAK,EAAE,IAAI;EACX,OAAO,EAAE,IAAI;EACb,MAAM,EAAE,MAAM;EACd,2BAAS;IACP,KAAK,EAAE,KAAK;IACZ,WAAW,EAAE,GAAG;IAChB,OAAO,EAAE,YAAY;IACrB,IAAI,EAAG,QAAQ;IACf,SAAS,EAAE,IAAI;EAEjB,4BAAU;IACR,OAAO,EAAE,YAAY;IACrB,cAAc,EAAE,MAAM;IAGtB,oCAAQ;MACN,SAAS,EAAE,KAAK;MAChB,WAAW,EAAE,GAAG;MAChB,UAAU,EAAE,MAAM;MAClB,OAAO,EAAE,OAAO;MAChB,2CACA;QACE,KAAK,EAAE,IAAI;QACX,UAAU,EAAE,OAAO;QACnB,MAAM,EAAE,iBAAiB;IAI7B,0CACA;MACC,MAAM,EAAE,iBAAiB;MACzB,WAAW,EAAE,GAAG;MAChB,OAAO,EAAE,OAAO;AAQlB,sBACA;EACC,MAAM,EAAE,MAAM;EACd,OAAO,EAAE,KAAK;AAKjB,0BAAG;EACF,WAAW,EAAE,IAAI;EACjB,cAAc,EAAE,SAAS;EACzB,WAAW,EAAE,GAAG;AAEjB,2BAAI;EAAE,WAAW,EAAE,IAAI;;ACzDzB,oBAAoB;EAChB,KAAK,EAAC,KAAK;EACb,WAAW,EAAE,IAAI;EACjB,yBAAI;IACA,SAAS,EAAE,KAAK;IAChB,KAAK,EAAE,OAAO;IACd,MAAM,EAAE,OAAO;;AAIrB,oBAAqB;EACjB,OAAO,EAAE,IAAI;EAAE,uBAAuB;EACtC,QAAQ,EAAE,KAAK;EAAE,mBAAmB;EACpC,OAAO,EAAE,EAAE;EAAE,gBAAgB;EAC7B,IAAI,EAAE,CAAC;EACP,GAAG,EAAE,CAAC;EACN,KAAK,EAAE,IAAI;EAAE,gBAAgB;EAC7B,MAAM,EAAE,IAAI;EAAE,iBAAiB;EAC/B,QAAQ,EAAE,IAAI;EAAE,6BAA6B;EAC7C,gBAAgB,EAAE,KAAU;EAAE,oBAAoB;EAClD,gBAAgB,EAAE,kBAAe;EAAE,sBAAsB;;AAE7D,cAAe;EACX,gBAAgB,EAAE,OAAO;EACzB,oDAAoD;EACtD,gBAAgB,EAAE,0BAA0B;EAC1C,iBAAiB,EAAE,SAAS;EAC5B,mBAAmB,EAAE,MAAM;EAE3B,OAAO,EAAE,cAAc;EACvB,MAAM,EAAE,cAAc;EACtB,KAAK,EAAE,GAAG;EAAE,qDAAqD;EACjE,SAAS,EAAE,KAAK;EAAE,qDAAqD;EACvE,OAAO,EAAE,GAAG;EAAE,oBAAoB;EAClC,QAAQ,EAAE,KAAK;EACf,GAAG,EAAE,GAAG;EACR,IAAI,EAAE,GAAG;EACT,UAAU,EAAE,GAAG;EACf,UAAU,EAAE,IAAI;EAClB,sCAAwB;IACtB,QAAQ,EAAC,QAAQ;IACjB,GAAG,EAAC,GAAG;IACP,KAAK,EAAC,CAAC;IACP,UAAU,EAAE,GAAG;IACf,UAAU,EAAE,WAAW;IACvB,MAAM,EAAE,IAAI;IACZ,SAAS,EAAE,IAAI;IACf,WAAW,EAAE,IAAI;IACjB,MAAM,EAAE,OAAO;;AAMnB,oBAAqB;EACjB,SAAS,EAAE,IAAI;;AAEnB,UAAW;EAAE,OAAO,EAAE,IAAI",
4
+ "sources": ["../scss/view/_settings.scss","../scss/elements/_colors.scss","../scss/elements/_breakpoints.scss","../scss/view/_settings-advanced.scss","../scss/view/_settings-cloudflare.scss","../scss/view/_settings-tools.scss","../scss/view/_inline-help.scss"],
5
+ "names": [],
6
+ "file": "shortpixel-settings.css"
7
+ }
res/css/shortpixel-toolbar.css CHANGED
@@ -2,180 +2,148 @@
2
  CSS for features that are displayed on all Admin page, like the bar status icon and some alerts.
3
  */
4
  #wpadminbar li.shortpixel-toolbar-processing {
5
- position: relative;
6
- }
7
- #wpadminbar li.shortpixel-toolbar-processing.shortpixel-hide {
8
- display: none;
9
- }
10
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div {
11
- height: 33px;
12
- width: 33px;
13
- padding: 0;
14
- margin-top: -1px;
15
- padding: 0 3px;
16
- }
17
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div img {
18
- margin-right: 2px;
19
- margin-top: 6px;
20
- vertical-align: top;
21
- opacity: 1;
22
- transition: all 1s linear;
23
- position: absolute;
24
- top: 0;
25
- }
26
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div span.shp-alert {
27
- display: none;
28
- margin-left: -8px;
29
- }
30
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .stats {
31
- left: -1px;
32
- top: 3px;
33
- right: 0;
34
- position: absolute;
35
- z-index: 10;
36
- height: 25px;
37
- width: 25px;
38
- margin: 0 auto;
39
- box-sizing: border-box;
40
- border-radius: 50%;
41
- padding: 5px 0 0 0px;
42
- font-weight: 500;
43
- font-size: 14px;
44
- line-height: 14px;
45
- background: rgba(0, 0, 0, 0.6);
46
- color: #fff;
47
- text-align: center;
48
- }
49
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls {
50
- position: absolute;
51
- top: 0;
52
- height: 32px;
53
- background: rgba(35, 40, 45, 0.5);
54
- box-sizing: border-box;
55
- transition: all 1s linear;
56
- opacity: 0;
57
- visibility: hidden;
58
- z-index: 0;
59
- overflow: hidden;
60
- cursor: pointer;
61
- }
62
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls .play, #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls .pause {
63
- font-family: dashicons;
64
- font-size: 32px;
65
- color: #fff;
66
- display: inline-block;
67
- width: 100%;
68
- line-height: 1;
69
- }
70
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls .play.hidden, #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls .pause.hidden {
71
- display: none;
72
- }
73
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .cssload-container {
74
- width: 100%;
75
- height: 24px;
76
- text-align: center;
77
- position: absolute;
78
- top: 0px;
79
- left: -1px;
80
- }
81
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .cssload-speeding-wheel {
82
- width: 24px;
83
- height: 24px;
84
- opacity: 0.7;
85
- margin: 0 auto;
86
- border: 4px solid #1cbfcb;
87
- border-radius: 50%;
88
- border-left-color: transparent;
89
- animation: cssload-spin 2000ms infinite linear;
90
- -o-animation: cssload-spin 2000ms infinite linear;
91
- -ms-animation: cssload-spin 2000ms infinite linear;
92
- -webkit-animation: cssload-spin 2000ms infinite linear;
93
- -moz-animation: cssload-spin 2000ms infinite linear;
94
- }
95
  @keyframes cssload-spin {
96
  100% {
97
  transform: rotate(360deg);
98
- transform: rotate(360deg);
99
- }
100
- }
101
  @-o-keyframes cssload-spin {
102
  100% {
103
  -o-transform: rotate(360deg);
104
- transform: rotate(360deg);
105
- }
106
- }
107
  @-ms-keyframes cssload-spin {
108
  100% {
109
  -ms-transform: rotate(360deg);
110
- transform: rotate(360deg);
111
- }
112
- }
113
  @-webkit-keyframes cssload-spin {
114
  100% {
115
  -webkit-transform: rotate(360deg);
116
- transform: rotate(360deg);
117
- }
118
- }
119
  @-moz-keyframes cssload-spin {
120
  100% {
121
  -moz-transform: rotate(360deg);
122
- transform: rotate(360deg);
123
- }
124
- }
125
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div:hover img:hover, #wpadminbar li.shortpixel-toolbar-processing .ab-item > div:hover .stats {
126
- opacity: 0;
127
- visibility: hidden;
128
- }
129
- #wpadminbar li.shortpixel-toolbar-processing .ab-item > div:hover .controls {
130
- visibility: visible;
131
- opacity: 1;
132
- z-index: 100;
133
- }
134
- #wpadminbar li.shortpixel-toolbar-processing.shortpixel-paused .ab-item > div .cssload-speeding-wheel {
135
- animation: none;
136
- }
137
- #wpadminbar li.shortpixel-toolbar-processing.shortpixel-paused .ab-item > div .controls {
138
- visibility: visible;
139
- opacity: 1;
140
- z-index: 100;
141
- }
142
- #wpadminbar li.shortpixel-toolbar-processing.shortpixel-paused .ab-item > div .stats {
143
- opacity: 0;
144
- z-index: 0;
145
- }
146
- #wpadminbar li.shortpixel-toolbar-processing.shortpixel-alert .ab-item > div span.shp-alert {
147
- display: inline;
148
- font-size: 26px;
149
- line-height: 26px;
150
- color: red;
151
- font-weight: bold;
152
- vertical-align: middle;
153
- }
154
- #wpadminbar li.shortpixel-toolbar-processing.shortpixel-alert .ab-item > div .controls {
155
- display: none;
156
- }
157
- #wpadminbar li.shortpixel-toolbar-processing.shortpixel-quota-exceeded .ab-item > div .cssload-container {
158
- display: none;
159
- }
160
- #wpadminbar li.shortpixel-toolbar-processing.shortpixel-quota-exceeded .ab-item > div:hover img:hover {
161
- opacity: 1;
162
- visibility: visible;
163
- }
164
- #wpadminbar li.shortpixel-toolbar-processing .toolbar-notice-wrapper {
165
- position: absolute;
166
- left: 0px;
167
- top: 30px;
168
- }
169
- #wpadminbar li.shortpixel-toolbar-processing .toolbar-notice-wrapper .toolbar-notice {
170
- border: 1px solid #1cbfcb;
171
- background: #fff;
172
- color: #000;
173
- padding: 4px 14px;
174
- white-space: nowrap;
175
- transition: opacity 5s;
176
- opacity: 1;
177
- margin: 4px;
178
- min-width: 300px;
179
- }
180
 
181
  /*# sourceMappingURL=shortpixel-toolbar.css.map */
2
  CSS for features that are displayed on all Admin page, like the bar status icon and some alerts.
3
  */
4
  #wpadminbar li.shortpixel-toolbar-processing {
5
+ position: relative; }
6
+ #wpadminbar li.shortpixel-toolbar-processing.shortpixel-hide {
7
+ display: none; }
8
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div {
9
+ height: 33px;
10
+ width: 33px;
11
+ padding: 0;
12
+ margin-top: -1px;
13
+ padding: 0 3px; }
14
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div img {
15
+ margin-right: 2px;
16
+ margin-top: 6px;
17
+ vertical-align: top;
18
+ opacity: 1;
19
+ transition: all 1s linear;
20
+ position: absolute;
21
+ top: 0; }
22
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div span.shp-alert {
23
+ display: none;
24
+ margin-left: -8px; }
25
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .stats {
26
+ left: -1px;
27
+ top: 3px;
28
+ right: 0;
29
+ position: absolute;
30
+ z-index: 10;
31
+ height: 25px;
32
+ width: 25px;
33
+ margin: 0 auto;
34
+ box-sizing: border-box;
35
+ border-radius: 50%;
36
+ padding: 5px 0 0 0px;
37
+ font-weight: 500;
38
+ font-size: 14px;
39
+ line-height: 14px;
40
+ background: rgba(0, 0, 0, 0.6);
41
+ color: #fff;
42
+ text-align: center; }
43
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls {
44
+ position: absolute;
45
+ top: 0;
46
+ height: 32px;
47
+ background: rgba(35, 40, 45, 0.5);
48
+ box-sizing: border-box;
49
+ transition: all 1s linear;
50
+ opacity: 0;
51
+ visibility: hidden;
52
+ z-index: 0;
53
+ overflow: hidden;
54
+ cursor: pointer; }
55
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls .play, #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls .pause {
56
+ font-family: dashicons;
57
+ font-size: 32px;
58
+ color: #fff;
59
+ display: inline-block;
60
+ width: 100%;
61
+ line-height: 1; }
62
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls .play.hidden, #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .controls .pause.hidden {
63
+ display: none; }
64
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .cssload-container {
65
+ width: 100%;
66
+ height: 24px;
67
+ text-align: center;
68
+ position: absolute;
69
+ top: 0px;
70
+ left: -1px; }
71
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div .cssload-speeding-wheel {
72
+ width: 24px;
73
+ height: 24px;
74
+ opacity: 0.7;
75
+ margin: 0 auto;
76
+ border: 4px solid #1cbfcb;
77
+ border-radius: 50%;
78
+ border-left-color: transparent;
79
+ animation: cssload-spin 2000ms infinite linear;
80
+ -o-animation: cssload-spin 2000ms infinite linear;
81
+ -ms-animation: cssload-spin 2000ms infinite linear;
82
+ -webkit-animation: cssload-spin 2000ms infinite linear;
83
+ -moz-animation: cssload-spin 2000ms infinite linear; }
 
 
 
 
 
 
 
 
 
 
 
84
  @keyframes cssload-spin {
85
  100% {
86
  transform: rotate(360deg);
87
+ transform: rotate(360deg); } }
 
 
88
  @-o-keyframes cssload-spin {
89
  100% {
90
  -o-transform: rotate(360deg);
91
+ transform: rotate(360deg); } }
 
 
92
  @-ms-keyframes cssload-spin {
93
  100% {
94
  -ms-transform: rotate(360deg);
95
+ transform: rotate(360deg); } }
 
 
96
  @-webkit-keyframes cssload-spin {
97
  100% {
98
  -webkit-transform: rotate(360deg);
99
+ transform: rotate(360deg); } }
 
 
100
  @-moz-keyframes cssload-spin {
101
  100% {
102
  -moz-transform: rotate(360deg);
103
+ transform: rotate(360deg); } }
104
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div:hover img:hover, #wpadminbar li.shortpixel-toolbar-processing .ab-item > div:hover .stats {
105
+ opacity: 0;
106
+ visibility: hidden; }
107
+ #wpadminbar li.shortpixel-toolbar-processing .ab-item > div:hover .controls {
108
+ visibility: visible;
109
+ opacity: 1;
110
+ z-index: 100; }
111
+ #wpadminbar li.shortpixel-toolbar-processing.shortpixel-paused .ab-item > div .cssload-speeding-wheel {
112
+ animation: none; }
113
+ #wpadminbar li.shortpixel-toolbar-processing.shortpixel-paused .ab-item > div .controls {
114
+ visibility: visible;
115
+ opacity: 1;
116
+ z-index: 100; }
117
+ #wpadminbar li.shortpixel-toolbar-processing.shortpixel-paused .ab-item > div .stats {
118
+ opacity: 0;
119
+ z-index: 0; }
120
+ #wpadminbar li.shortpixel-toolbar-processing.shortpixel-alert .ab-item > div span.shp-alert {
121
+ display: inline;
122
+ font-size: 26px;
123
+ line-height: 26px;
124
+ color: red;
125
+ font-weight: bold;
126
+ vertical-align: middle; }
127
+ #wpadminbar li.shortpixel-toolbar-processing.shortpixel-alert .ab-item > div .controls {
128
+ display: none; }
129
+ #wpadminbar li.shortpixel-toolbar-processing.shortpixel-quota-exceeded .ab-item > div .cssload-container {
130
+ display: none; }
131
+ #wpadminbar li.shortpixel-toolbar-processing.shortpixel-quota-exceeded .ab-item > div:hover img:hover {
132
+ opacity: 1;
133
+ visibility: visible; }
134
+ #wpadminbar li.shortpixel-toolbar-processing .toolbar-notice-wrapper {
135
+ position: absolute;
136
+ left: 0px;
137
+ top: 30px; }
138
+ #wpadminbar li.shortpixel-toolbar-processing .toolbar-notice-wrapper .toolbar-notice {
139
+ border: 1px solid #1cbfcb;
140
+ background: #fff;
141
+ color: #000;
142
+ padding: 4px 14px;
143
+ white-space: nowrap;
144
+ transition: opacity 5s;
145
+ opacity: 1;
146
+ margin: 4px;
147
+ min-width: 300px; }
 
 
 
 
 
 
 
 
 
 
 
 
 
148
 
149
  /*# sourceMappingURL=shortpixel-toolbar.css.map */
res/css/shortpixel-toolbar.css.map CHANGED
@@ -1 +1,7 @@
1
- {"version":3,"sourceRoot":"","sources":["../scss/shortpixel-toolbar.scss"],"names":[],"mappings":"AAAA;AAAA;AAAA;AAIA;EAEG;;AAEA;EACG;;AAEH;EAEI;EACA;EACA;EACA;EACA;;AACA;EACE;EACA;EACA;EACA;EACA;EACA;EACA;;AAGF;EACE;EACA;;AAEF;EAEE;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACJ;;AAEE;EAEI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACL;;AAEM;EAEI;EACA;EACA;EACA;EACA;EACA;;AACA;EACE;;AAKX;EACI;EACA;EACA;EACA;EACA;EACA;;AAEJ;EACI;EACA;EACA;EACA;EACA;EACA;EACA;EACA;EACQ;EACA;EACA;EACA;;AAGZ;EACC;IAAM;IAA2B;;;AAGlC;EACC;IAAM;IAA8B;;;AAGrC;EACC;IAAM;IAA+B;;;AAGtC;EACC;IAAM;IAAmC;;;AAG1C;EACC;IAAM;IAAgC;;;AAKrC;EAEG;EACA;;AAEH;EAEG;EACA;EACA;;AAYL;EAEE;;AAEF;EAEE;EACA;EACA;;AAEF;EAEG;EACA;;AAMH;EACG;EACA;EACA;EACA;EACA;EACA;;AAEJ;EAAY;;AAGX;EAAqB;;AACrB;EAEE;EACA;;AAIP;EAEK;EACA;EACA;;AAEH;EAEG;EACA;EACA;EACA;EACA;EACA;EACA;EACH;EACA","file":"shortpixel-toolbar.css"}
 
 
 
 
 
 
1
+ {
2
+ "version": 3,
3
+ "mappings": "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",
4
+ "sources": ["../scss/shortpixel-toolbar.scss"],
5
+ "names": [],
6
+ "file": "shortpixel-toolbar.css"
7
+ }
res/css/sp-file-tree.min.css CHANGED
@@ -1 +1 @@
1
- div.sp-folder-picker{margin:20px 0;border:1px solid #888;max-height:400px;min-height:100px;overflow:auto}UL.jqueryFileTree LI.directory.selected{background-color:#fafafa}UL.jqueryFileTree{font-family:Verdana,sans-serif;font-size:11px;line-height:18px;padding:3px;margin:0;display:none;margin-left:20px}.sp-folder-picker>UL.jqueryFileTree{margin:0}UL.jqueryFileTree LI{list-style:none;padding:0;margin:0;white-space:nowrap}UL.jqueryFileTree LI a{padding-left:20px}UL.jqueryFileTree LI.directory a{background:url(../img/file-tree/directory.png) left top no-repeat}UL.jqueryFileTree LI.directory-locked{background:url(../img/file-tree/directory-lock.png) left top no-repeat}UL.jqueryFileTree LI.expanded{background:url(../img/file-tree/folder_open.png) left top no-repeat}UL.jqueryFileTree LI.file{background:url(../img/file-tree/file.png) left top no-repeat}UL.jqueryFileTree LI.file-locked{background:url(../img/file-tree/file-lock.png) left top no-repeat!important}UL.jqueryFileTree LI.wait{background:url(../img/file-tree/spinner.gif) left top no-repeat}UL.jqueryFileTree LI.selected>a{font-weight:700}UL.jqueryFileTree LI.ext_3gp{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_afp{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_afpa{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_asp{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_aspx{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_avi{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_bat{background:url(../img/file-tree/application.png) left top no-repeat}UL.jqueryFileTree LI.ext_bmp{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_c{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_cfm{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_cgi{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_com{background:url(../img/file-tree/application.png) left top no-repeat}UL.jqueryFileTree LI.ext_cpp{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_css{background:url(../img/file-tree/css.png) left top no-repeat}UL.jqueryFileTree LI.ext_doc{background:url(../img/file-tree/doc.png) left top no-repeat}UL.jqueryFileTree LI.ext_exe{background:url(../img/file-tree/application.png) left top no-repeat}UL.jqueryFileTree LI.ext_gif{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_fla{background:url(../img/file-tree/flash.png) left top no-repeat}UL.jqueryFileTree LI.ext_h{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_htm{background:url(../img/file-tree/html.png) left top no-repeat}UL.jqueryFileTree LI.ext_html{background:url(../img/file-tree/html.png) left top no-repeat}UL.jqueryFileTree LI.ext_jar{background:url(../img/file-tree/java.png) left top no-repeat}UL.jqueryFileTree LI.ext_jpg{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_jpeg{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_js{background:url(../img/file-tree/script.png) left top no-repeat}UL.jqueryFileTree LI.ext_lasso{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_log{background:url(../img/file-tree/txt.png) left top no-repeat}UL.jqueryFileTree LI.ext_m4p{background:url(../img/file-tree/music.png) left top no-repeat}UL.jqueryFileTree LI.ext_mov{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_mp3{background:url(../img/file-tree/music.png) left top no-repeat}UL.jqueryFileTree LI.ext_mp4{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_mpg{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_mpeg{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_ogg{background:url(../img/file-tree/music.png) left top no-repeat}UL.jqueryFileTree LI.ext_ogv{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_pcx{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_pdf{background:url(../img/file-tree/pdf.png) left top no-repeat}UL.jqueryFileTree LI.ext_php{background:url(../img/file-tree/php.png) left top no-repeat}UL.jqueryFileTree LI.ext_png{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_ppt{background:url(../img/file-tree/ppt.png) left top no-repeat}UL.jqueryFileTree LI.ext_psd{background:url(../img/file-tree/psd.png) left top no-repeat}UL.jqueryFileTree LI.ext_pl{background:url(../img/file-tree/script.png) left top no-repeat}UL.jqueryFileTree LI.ext_py{background:url(../img/file-tree/script.png) left top no-repeat}UL.jqueryFileTree LI.ext_rb{background:url(../img/file-tree/ruby.png) left top no-repeat}UL.jqueryFileTree LI.ext_rbx{background:url(../img/file-tree/ruby.png) left top no-repeat}UL.jqueryFileTree LI.ext_rhtml{background:url(../img/file-tree/ruby.png) left top no-repeat}UL.jqueryFileTree LI.ext_rpm{background:url(../img/file-tree/linux.png) left top no-repeat}UL.jqueryFileTree LI.ext_ruby{background:url(../img/file-tree/ruby.png) left top no-repeat}UL.jqueryFileTree LI.ext_sql{background:url(../img/file-tree/db.png) left top no-repeat}UL.jqueryFileTree LI.ext_swf{background:url(../img/file-tree/flash.png) left top no-repeat}UL.jqueryFileTree LI.ext_tif{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_tiff{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_txt{background:url(../img/file-tree/txt.png) left top no-repeat}UL.jqueryFileTree LI.ext_vb{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_wav{background:url(../img/file-tree/music.png) left top no-repeat}UL.jqueryFileTree LI.ext_webm{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_wmv{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_xls{background:url(../img/file-tree/xls.png) left top no-repeat}UL.jqueryFileTree LI.ext_xml{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_zip{background:url(../img/file-tree/zip.png) left top no-repeat}UL.jqueryFileTree A{color:#333;text-decoration:none;display:inline-block;padding:0 2px;cursor:pointer}UL.jqueryFileTree A:hover{background:#bdf}
1
+ div.sp-folder-picker{margin:20px 0;border:1px solid #888;max-height:400px;min-height:100px;overflow:auto}UL.jqueryFileTree LI.directory.selected{background-color:#fafafa}UL.jqueryFileTree{font-family:Verdana,sans-serif;font-size:11px;line-height:18px;padding:3px;margin:0;display:none;margin-left:20px}.sp-folder-picker>UL.jqueryFileTree{margin:0}UL.jqueryFileTree LI{list-style:none;padding:0;margin:0;white-space:nowrap}UL.jqueryFileTree LI a{padding-left:20px}UL.jqueryFileTree LI.directory a{background:url(../img/file-tree/directory.png) left top no-repeat}UL.jqueryFileTree LI.directory-locked{background:url(../img/file-tree/directory-lock.png) left top no-repeat}UL.jqueryFileTree LI.expanded{background:url(../img/file-tree/folder_open.png) left top no-repeat}UL.jqueryFileTree LI.file{background:url(../img/file-tree/file.png) left top no-repeat}UL.jqueryFileTree LI.file-locked{background:url(../img/file-tree/file-lock.png) left top no-repeat !important}UL.jqueryFileTree LI.wait{background:url(../img/file-tree/spinner.gif) left top no-repeat}UL.jqueryFileTree LI.selected>a{font-weight:bold}UL.jqueryFileTree LI.ext_3gp{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_afp{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_afpa{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_asp{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_aspx{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_avi{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_bat{background:url(../img/file-tree/application.png) left top no-repeat}UL.jqueryFileTree LI.ext_bmp{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_c{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_cfm{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_cgi{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_com{background:url(../img/file-tree/application.png) left top no-repeat}UL.jqueryFileTree LI.ext_cpp{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_css{background:url(../img/file-tree/css.png) left top no-repeat}UL.jqueryFileTree LI.ext_doc{background:url(../img/file-tree/doc.png) left top no-repeat}UL.jqueryFileTree LI.ext_exe{background:url(../img/file-tree/application.png) left top no-repeat}UL.jqueryFileTree LI.ext_gif{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_fla{background:url(../img/file-tree/flash.png) left top no-repeat}UL.jqueryFileTree LI.ext_h{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_htm{background:url(../img/file-tree/html.png) left top no-repeat}UL.jqueryFileTree LI.ext_html{background:url(../img/file-tree/html.png) left top no-repeat}UL.jqueryFileTree LI.ext_jar{background:url(../img/file-tree/java.png) left top no-repeat}UL.jqueryFileTree LI.ext_jpg{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_jpeg{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_js{background:url(../img/file-tree/script.png) left top no-repeat}UL.jqueryFileTree LI.ext_lasso{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_log{background:url(../img/file-tree/txt.png) left top no-repeat}UL.jqueryFileTree LI.ext_m4p{background:url(../img/file-tree/music.png) left top no-repeat}UL.jqueryFileTree LI.ext_mov{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_mp3{background:url(../img/file-tree/music.png) left top no-repeat}UL.jqueryFileTree LI.ext_mp4{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_mpg{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_mpeg{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_ogg{background:url(../img/file-tree/music.png) left top no-repeat}UL.jqueryFileTree LI.ext_ogv{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_pcx{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_pdf{background:url(../img/file-tree/pdf.png) left top no-repeat}UL.jqueryFileTree LI.ext_php{background:url(../img/file-tree/php.png) left top no-repeat}UL.jqueryFileTree LI.ext_png{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_ppt{background:url(../img/file-tree/ppt.png) left top no-repeat}UL.jqueryFileTree LI.ext_psd{background:url(../img/file-tree/psd.png) left top no-repeat}UL.jqueryFileTree LI.ext_pl{background:url(../img/file-tree/script.png) left top no-repeat}UL.jqueryFileTree LI.ext_py{background:url(../img/file-tree/script.png) left top no-repeat}UL.jqueryFileTree LI.ext_rb{background:url(../img/file-tree/ruby.png) left top no-repeat}UL.jqueryFileTree LI.ext_rbx{background:url(../img/file-tree/ruby.png) left top no-repeat}UL.jqueryFileTree LI.ext_rhtml{background:url(../img/file-tree/ruby.png) left top no-repeat}UL.jqueryFileTree LI.ext_rpm{background:url(../img/file-tree/linux.png) left top no-repeat}UL.jqueryFileTree LI.ext_ruby{background:url(../img/file-tree/ruby.png) left top no-repeat}UL.jqueryFileTree LI.ext_sql{background:url(../img/file-tree/db.png) left top no-repeat}UL.jqueryFileTree LI.ext_swf{background:url(../img/file-tree/flash.png) left top no-repeat}UL.jqueryFileTree LI.ext_tif{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_tiff{background:url(../img/file-tree/picture.png) left top no-repeat}UL.jqueryFileTree LI.ext_txt{background:url(../img/file-tree/txt.png) left top no-repeat}UL.jqueryFileTree LI.ext_vb{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_wav{background:url(../img/file-tree/music.png) left top no-repeat}UL.jqueryFileTree LI.ext_webm{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_wmv{background:url(../img/file-tree/film.png) left top no-repeat}UL.jqueryFileTree LI.ext_xls{background:url(../img/file-tree/xls.png) left top no-repeat}UL.jqueryFileTree LI.ext_xml{background:url(../img/file-tree/code.png) left top no-repeat}UL.jqueryFileTree LI.ext_zip{background:url(../img/file-tree/zip.png) left top no-repeat}UL.jqueryFileTree A{color:#333;text-decoration:none;display:inline-block;padding:0 2px;cursor:pointer}UL.jqueryFileTree A:hover{background:#BDF}
res/img/bulk/dashboard-background.svg CHANGED
@@ -1 +1 @@
1
- <svg version="1.2" baseProfile="tiny-ps" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 935 150" preserveAspectRatio="none"><title>kartinkia-svg</title><defs><clipPath clipPathUnits="userSpaceOnUse" id="cp1"><path d="M0 0L935 0L935 150L0 150L0 0Z" /></clipPath><clipPath clipPathUnits="userSpaceOnUse" id="cp2"><path d="M-28 -110L310 -110L310 228L-28 228L-28 -110Z" /></clipPath></defs><style>tspan { white-space:pre }.shp0 { fill: #116c7d } .shp1 { opacity: 0.412;fill: #e1e2fe } .shp2 { opacity: 0.31;fill: #e1e2fe } .shp3 { opacity: 0.102;fill: #ecf1f7 } .shp4 { opacity: 0.102;fill: #e1e2fe } .shp5 { opacity: 0.051;fill: #e1e2fe } .shp6 { fill: #ffffff } .shp7 { opacity: 0.812;fill: #ffffff } .shp8 { opacity: 0.659;fill: #ffffff } .shp9 { fill: #c5d9ff } .shp10 { fill: #599af2 } .shp11 { opacity: 0.361;fill: #4c65ba } .shp12 { opacity: 0.388;fill: #f7a9b4 } .shp13 { opacity: 0.471;fill: #ffffff } </style><g clip-path="url(#cp1)"><g ><path class="shp0" d="M0 1L935 1L935 151L0 151L0 1Z" /><g style="opacity: 0.412"><g style="opacity: 0.412"><g style="opacity: 0.412"><path class="shp1" d="M635.08 197.72C634.5 192.16 634.35 186.6 634.72 180.96C636.33 154.75 648.18 129.5 666.56 111.2C673.14 104.69 680.68 98.68 684.71 90.34C691.52 76.21 690.2 60.47 698.84 46.35C707.55 32.29 720.65 20.94 735.73 14.72C780.75 -3.94 846.26 19.04 843.34 75.77C843.34 75.99 843.34 76.28 843.34 76.65C843.19 88.44 852.63 97.8 864.12 97.44C906.51 96.19 944.57 127.6 954.45 169.32C960.82 196.19 954.09 226.34 935.64 246.55C921.88 261.63 902.77 270.56 883.6 277C845.09 289.88 804.1 294.35 763.62 292.37C725.78 290.47 685.44 281.54 659.6 253.21C645.77 238.13 637.28 218.29 635.08 197.72Z" /></g></g></g><g style="opacity: 0.31"><path class="shp2" d="M828.62 11.36C828.91 16.7 833.38 20.87 838.65 20.58C843.92 20.29 847.95 15.75 847.65 10.33C847.36 4.99 842.9 0.81 837.63 1.11C832.43 1.4 828.33 6.01 828.62 11.36Z" /></g><g style="opacity: 0.31"><path class="shp2" d="M676.66 11.14C676.8 13.92 679.08 16.04 681.86 15.89C684.57 15.75 686.69 13.41 686.54 10.62C686.39 7.84 684.13 5.72 681.34 5.87C678.63 6.01 676.51 8.35 676.66 11.14Z" /></g><path class="shp3" d="M632.81 47.74C628.13 39.46 630.91 28.85 638.96 24.09C647.09 19.26 663.04 18.75 667.73 27.02C672.41 35.29 659.97 43.27 655.14 51.47C648.48 62.89 637.5 56.01 632.81 47.74Z" /><path class="shp4" d="M912.95 -6.21C919.24 -12.87 929.64 -13.02 936.08 -6.58C942.52 -0.14 947.21 14.94 940.91 21.53C934.62 28.19 924.08 18.46 915.36 16.04C903.29 12.67 906.65 0.45 912.95 -6.21Z" /><path class="shp5" d="M646.94 84.48C642.69 96.78 641.52 110.17 644.3 122.84C648.04 139.9 660.77 154.9 658.58 173.05C657.26 183.96 657.48 193.99 657.26 204.68C656.75 226.71 672.12 244.94 690.13 254.01C704.77 261.41 721.46 263.38 737.56 261.99C752.05 260.75 766.33 256.94 780.09 252.18C793.34 247.65 806.22 242.01 820.5 242.45C832.36 242.81 843.41 247.21 854.68 250.28C881.62 257.6 913.53 256.57 936.37 240.69C961.48 223.27 971.58 190.26 962.87 161.41C958.19 145.9 951.89 132.5 954.16 116.03C955.26 107.91 956.94 99.63 955.4 91.58C954.01 84.19 949.91 77.53 945.08 71.75C932.13 56.08 913.61 46.13 894.43 40.27C872.62 33.61 848.46 29.95 825.77 33.46C781.77 40.12 772.18 33.68 726.14 27.09C695.33 22.7 666.34 47.22 652.36 72.55C650.23 76.28 648.4 80.31 646.94 84.48Z" /><g style="opacity: 0.831"><path class="shp4" d="M668.24 119.91C674.61 111.57 684.42 105.86 689.18 96.27C694.96 84.78 693.72 71.16 698.84 59.45C706.45 42.1 720.14 27.31 737.41 19.19C745.69 15.31 754.84 12.89 763.69 13.55C777.38 14.58 789.17 22.77 798.39 32.51C812.15 47 821.82 67.57 838.36 79.14C847.43 85.51 858.12 78.77 867.78 76.58C878.69 74.16 890.04 74.75 900.43 77.67C919.61 83.16 936.15 96.85 944.42 115.01C953.28 134.33 951.96 161.12 935.42 177.74C927.74 185.43 917.34 190.55 911.7 199.77C904.6 211.34 903.73 227 901.75 239.81C899.55 254.01 893.48 267.85 884.33 279.34C884.25 279.49 884.11 279.63 884.03 279.71C868.15 299.4 841.14 306.06 818.3 296.18L769.77 275.17C720.58 253.87 683.17 219.54 665.24 169.69C661.36 158.93 659.97 135.94 664.87 125.4C665.83 123.42 667 121.59 668.24 119.91Z" /></g><g style="opacity: 0.22"><path fill-rule="evenodd" class="shp6" d="M913.27 96.23C913.27 99.31 910.77 101.82 907.69 101.82C904.61 101.82 902.11 99.31 902.11 96.23C902.11 93.16 904.61 90.65 907.69 90.65C910.77 90.65 913.27 93.16 913.27 96.23ZM911.1 96.23C911.1 94.35 909.57 92.82 907.69 92.82C905.8 92.82 904.27 94.35 904.27 96.23C904.27 98.12 905.8 99.65 907.69 99.65C909.57 99.65 911.1 98.12 911.1 96.23Z" /><path class="shp6" d="M907.73 125.33C907.7 125.26 907.66 125.2 907.63 125.14C907.59 125.08 907.54 125.03 907.49 124.98C907.44 124.93 907.39 124.88 907.33 124.84C907.27 124.8 907.21 124.77 907.14 124.74C907.08 124.72 907.01 124.69 906.94 124.68C906.8 124.65 906.65 124.65 906.51 124.68C906.45 124.69 906.38 124.72 906.31 124.74C906.25 124.77 906.18 124.8 906.13 124.84C906.07 124.88 906.01 124.93 905.96 124.98C905.91 125.03 905.87 125.08 905.83 125.14C905.79 125.2 905.75 125.26 905.73 125.33C905.7 125.39 905.68 125.46 905.66 125.53C905.65 125.6 905.64 125.67 905.64 125.74C905.64 125.81 905.65 125.88 905.66 125.95C905.68 126.02 905.7 126.09 905.73 126.16C905.75 126.22 905.79 126.28 905.83 126.34C905.87 126.4 905.91 126.46 905.96 126.51C905.99 126.53 906.01 126.56 906.04 126.58C906.07 126.6 906.1 126.62 906.13 126.64C906.18 126.68 906.25 126.71 906.31 126.74C906.38 126.77 906.45 126.79 906.51 126.8C906.58 126.82 906.66 126.83 906.73 126.83C906.8 126.83 906.87 126.82 906.94 126.8C907.01 126.79 907.08 126.77 907.14 126.74C907.21 126.71 907.27 126.68 907.33 126.64C907.36 126.62 907.39 126.6 907.41 126.58C907.44 126.56 907.47 126.53 907.49 126.51C907.54 126.46 907.59 126.4 907.63 126.34C907.66 126.28 907.7 126.22 907.73 126.16C907.75 126.09 907.77 126.02 907.79 125.95C907.8 125.88 907.81 125.81 907.81 125.74C907.81 125.67 907.8 125.6 907.79 125.53C907.77 125.46 907.75 125.39 907.73 125.33Z" /><path class="shp6" d="M890.68 82.46C890.65 82.4 890.62 82.33 890.58 82.27C890.54 82.21 890.49 82.16 890.44 82.11C890.39 82.06 890.34 82.01 890.28 81.97C890.22 81.94 890.16 81.9 890.09 81.87C890.03 81.85 889.96 81.83 889.89 81.81C889.75 81.78 889.61 81.78 889.47 81.81C889.4 81.83 889.33 81.85 889.26 81.87C889.2 81.9 889.13 81.94 889.08 81.97C889.02 82.01 888.96 82.06 888.91 82.11C888.86 82.16 888.82 82.21 888.78 82.27C888.74 82.33 888.71 82.4 888.68 82.46C888.65 82.53 888.63 82.59 888.62 82.66C888.6 82.73 888.6 82.8 888.6 82.88C888.6 82.95 888.6 83.02 888.62 83.09C888.63 83.16 888.65 83.22 888.68 83.29C888.71 83.35 888.74 83.42 888.78 83.48C888.82 83.53 888.86 83.59 888.91 83.64C888.96 83.69 889.02 83.74 889.08 83.78C889.13 83.81 889.2 83.85 889.26 83.88C889.33 83.9 889.4 83.92 889.47 83.94C889.54 83.95 889.61 83.96 889.68 83.96C889.75 83.96 889.82 83.95 889.89 83.94C889.96 83.92 890.03 83.9 890.09 83.88C890.16 83.85 890.22 83.81 890.28 83.78C890.34 83.74 890.39 83.69 890.44 83.64C890.49 83.59 890.54 83.53 890.58 83.48C890.62 83.42 890.65 83.35 890.68 83.29C890.71 83.22 890.73 83.16 890.74 83.09C890.75 83.02 890.76 82.95 890.76 82.88C890.76 82.8 890.75 82.73 890.74 82.66C890.73 82.59 890.71 82.53 890.68 82.46Z" /><path fill-rule="evenodd" class="shp6" d="M922 88.02L922 125.14C922 128.57 919.21 131.37 915.77 131.37L878.65 131.37C875.71 131.37 873.24 129.32 872.59 126.57C869.24 126.48 866.54 123.72 866.54 120.35L866.54 86.36C866.54 81.2 870.74 77 875.9 77L909.89 77C912.83 77 915.3 79.05 915.95 81.8C919.3 81.89 922 84.65 922 88.02ZM919.83 117.44L916.12 114.03L913.95 112.05L913.7 111.82C912.95 111.13 911.79 111.1 911.01 111.75L906.14 115.79C905.27 116.51 904.18 116.87 903.08 116.82L905.6 121.45C905.88 121.98 905.69 122.64 905.16 122.92C905 123.01 904.82 123.06 904.65 123.06C904.26 123.06 903.89 122.85 903.7 122.49L895.92 108.21L890.57 98.38C890.21 97.73 889.55 97.33 888.81 97.32C888.07 97.31 887.39 97.68 887.02 98.32L874.59 119.39L874.59 125.14C874.59 125.65 874.68 126.13 874.85 126.58C875.43 128.11 876.92 129.2 878.65 129.2L915.77 129.2C918.01 129.2 919.83 127.38 919.83 125.14L919.83 117.44ZM919.83 88.02C919.83 85.9 918.2 84.15 916.12 83.97L913.95 83.96L894.01 83.96C893.41 83.96 892.93 83.47 892.93 82.87C892.93 82.28 893.41 81.79 894.01 81.79L913.69 81.79C913.1 80.26 911.62 79.17 909.89 79.17L875.9 79.17C871.93 79.17 868.7 82.39 868.7 86.36L868.7 120.35C868.7 122.47 870.34 124.22 872.42 124.4L872.42 88.02C872.42 84.59 875.22 81.79 878.65 81.79L885.35 81.79C885.94 81.79 886.43 82.28 886.43 82.87C886.43 83.47 885.94 83.96 885.35 83.96L878.65 83.96C876.41 83.96 874.59 85.78 874.59 88.02L874.59 115.13L885.15 97.22C885.93 95.9 887.31 95.13 888.85 95.15C890.38 95.18 891.74 96 892.47 97.35L895.91 103.67L897.82 107.17L901.24 113.45C901.57 114.06 902.15 114.48 902.84 114.62C903.52 114.75 904.22 114.57 904.76 114.12L909.63 110.08C910.86 109.06 912.54 108.86 913.95 109.45L916.12 111.1L919.83 114.5L919.83 88.02Z" /></g><g style="opacity: 0.4"><g style="opacity: 0.812"><path class="shp7" d="M724.99 123.06L715.62 123.06C715.24 123.06 714.99 122.81 714.99 122.43C714.99 122.05 715.24 121.8 715.62 121.8L724.99 121.8C725.37 121.8 725.62 122.05 725.62 122.43C725.62 122.75 725.37 123.06 724.99 123.06Z" /><path class="shp7" d="M724.99 138.44L715.62 138.44C715.24 138.44 714.99 138.18 714.99 137.8C714.99 137.42 715.24 137.17 715.62 137.17L724.99 137.17C725.37 137.17 725.62 137.42 725.62 137.8C725.62 138.18 725.37 138.44 724.99 138.44Z" /><g style="opacity: 0.812"><g style="opacity: 0.812"><g style="opacity: 0.812"><path fill-rule="evenodd" class="shp7" d="M731.75 154L674.56 154C673.61 154 672.85 153.24 672.85 152.29L672.85 104.46C672.85 103.51 673.61 102.75 674.56 102.75L731.75 102.75C732.7 102.75 733.46 103.51 733.46 104.46L733.46 152.29C733.46 153.24 732.7 154 731.75 154ZM674.56 104.02C674.31 104.02 674.12 104.21 674.12 104.46L674.12 152.29C674.12 152.54 674.31 152.74 674.56 152.74L731.75 152.74C732.01 152.74 732.2 152.54 732.2 152.29L732.2 104.46C732.2 104.21 732.01 104.02 731.75 104.02L674.56 104.02Z" /><path fill-rule="evenodd" class="shp8" d="M731.75 154L674.56 154C673.61 154 672.85 153.24 672.85 152.29L672.85 104.46C672.85 103.51 673.61 102.75 674.56 102.75L731.75 102.75C732.7 102.75 733.46 103.51 733.46 104.46L733.46 152.29C733.46 153.24 732.7 154 731.75 154ZM674.56 104.02C674.31 104.02 674.12 104.21 674.12 104.46L674.12 152.29C674.12 152.54 674.31 152.74 674.56 152.74L731.75 152.74C732.01 152.74 732.2 152.54 732.2 152.29L732.2 104.46C732.2 104.21 732.01 104.02 731.75 104.02L674.56 104.02Z" /></g></g><path class="shp7" d="M724.99 115.53L680.38 115.53C680 115.53 679.75 115.28 679.75 114.9C679.75 114.52 680 114.27 680.38 114.27L724.99 114.27C725.37 114.27 725.62 114.52 725.62 114.9C725.62 115.28 725.37 115.53 724.99 115.53Z" /><path class="shp7" d="M724.99 130.53L680.38 130.53C680 130.53 679.75 130.28 679.75 129.9C679.75 129.52 680 129.26 680.38 129.26L724.99 129.26C725.37 129.26 725.62 129.52 725.62 129.9C725.62 130.21 725.37 130.53 724.99 130.53Z" /><path class="shp7" d="M704.42 123.06L680.38 123.06C680 123.06 679.75 122.81 679.75 122.43C679.75 122.05 680 121.8 680.38 121.8L704.42 121.8C704.8 121.8 705.06 122.05 705.06 122.43C705.06 122.75 704.8 123.06 704.42 123.06Z" /><path class="shp7" d="M704.42 138.44L680.38 138.44C680 138.44 679.75 138.18 679.75 137.8C679.75 137.42 680 137.17 680.38 137.17L704.42 137.17C704.8 137.17 705.06 137.42 705.06 137.8C705.06 138.18 704.8 138.44 704.42 138.44Z" /><path class="shp7" d="M696.58 145.59L680.38 145.59C680 145.59 679.75 145.33 679.75 144.95C679.75 144.57 680 144.32 680.38 144.32L696.58 144.32C696.96 144.32 697.21 144.57 697.21 144.95C697.21 145.33 696.96 145.59 696.58 145.59Z" /></g></g></g><path class="shp9" d="M791.99 74.66L752.01 74.66C745.38 74.66 740 69.27 740 62.65C740 56.02 745.38 50.64 752.01 50.64L791.99 50.64C798.62 50.64 804 56.02 804 62.65C804 69.27 798.62 74.66 791.99 74.66Z" /><path class="shp10" d="M771.98 69.34C781.32 69.34 788.88 61.77 788.88 52.44C788.88 43.11 781.32 35.55 771.98 35.55C762.65 35.55 755.09 43.11 755.09 52.44C755.09 61.77 762.65 69.34 771.98 69.34Z" /><path class="shp10" d="M791.99 71.11L752.01 71.11C745.38 71.11 740 65.73 740 59.1C740 52.47 745.38 47.09 752.01 47.09L791.99 47.09C798.62 47.09 804 52.47 804 59.1C804 65.73 798.62 71.11 791.99 71.11Z" /><path class="shp10" d="M771.98 65.79C781.32 65.79 788.88 58.23 788.88 48.89C788.88 39.56 781.32 32 771.98 32C762.65 32 755.09 39.56 755.09 48.89C755.09 58.23 762.65 65.79 771.98 65.79Z" /><g style="opacity: 0.212"><g style="opacity: 0.349"><path class="shp3" d="M791.99 71.11L752.01 71.11C745.38 71.11 740 65.73 740 59.1C740 52.47 745.38 47.09 752.01 47.09L791.99 47.09C798.62 47.09 804 52.47 804 59.1C804 65.73 798.62 71.11 791.99 71.11Z" /><path class="shp3" d="M771.98 65.79C781.32 65.79 788.88 58.23 788.88 48.89C788.88 39.56 781.32 32 771.98 32C762.65 32 755.09 39.56 755.09 48.89C755.09 58.23 762.65 65.79 771.98 65.79Z" /></g></g><path class="shp6" d="M768.03 51.41C767.85 51.41 767.63 51.35 767.47 51.2C767.16 50.89 767.16 50.39 767.47 50.11L772.02 45.66L776.5 50.14C776.81 50.45 776.81 50.95 776.5 51.23C776.18 51.54 775.69 51.54 775.41 51.23L772.05 47.87L768.62 51.26C768.44 51.35 768.25 51.41 768.03 51.41Z" /><path class="shp6" d="M771.98 57.61C771.55 57.61 771.21 57.26 771.21 56.83L771.21 46.72C771.21 46.28 771.55 45.94 771.98 45.94C772.42 45.94 772.76 46.28 772.76 46.72L772.76 56.83C772.76 57.26 772.42 57.61 771.98 57.61Z" /><path class="shp6" d="M779.36 62.4L764.55 62.4C763.49 62.4 762.62 61.53 762.62 60.47L762.62 55.09C762.62 54.65 762.96 54.31 763.4 54.31C763.83 54.31 764.17 54.65 764.17 55.09L764.17 60.47C764.17 60.69 764.33 60.84 764.55 60.84L779.36 60.84C779.64 60.84 779.86 60.62 779.86 60.34L779.86 55.09C779.86 54.65 780.2 54.31 780.63 54.31C781.07 54.31 781.41 54.65 781.41 55.09L781.41 60.38C781.38 61.5 780.48 62.4 779.36 62.4Z" /><path class="shp11" d="M887.14 64.03L855.66 64.03C854.63 64.03 853.77 63.2 853.77 62.14L853.77 30.69C853.77 29.66 854.6 28.8 855.66 28.8L887.11 28.8C888.14 28.8 889 29.63 889 30.69L889 62.14C889 63.17 888.17 64.03 887.14 64.03Z" /><path class="shp6" d="M885.34 62.23L853.89 62.23C852.86 62.23 852 61.4 852 60.34L852 28.89C852 27.86 852.83 27 853.89 27L885.34 27C886.37 27 887.23 27.83 887.23 28.89L887.23 60.34C887.23 61.4 886.37 62.23 885.34 62.23Z" /><path class="shp12" d="M884.18 30.01L854.99 30.01L854.99 59.21L884.18 59.21L884.18 30.01Z" /><path fill-rule="evenodd" class="shp13" d="M854.57 59.48L854.57 52.71L859.77 46.68C860.51 45.83 861.81 45.65 862.73 46.33L867.51 49.76C867.75 49.93 868.08 49.9 868.31 49.73L875.2 43.82C876.71 42.52 878.95 42.54 880.43 43.85L884.66 47.6L884.66 59.48L854.57 59.48ZM883.77 58.59L883.77 47.98L879.84 44.5C878.69 43.46 876.94 43.46 875.76 44.47L868.88 50.38C868.34 50.85 867.57 50.88 866.98 50.46L862.2 47.04C861.63 46.62 860.87 46.74 860.42 47.24L855.43 53.01L855.43 58.59L883.77 58.59Z" /><path fill-rule="evenodd" class="shp13" d="M871.39 42.04C869.35 42.04 867.69 40.39 867.69 38.35C867.69 36.31 869.35 34.65 871.39 34.65C873.43 34.65 875.08 36.31 875.08 38.35C875.08 40.39 873.43 42.04 871.39 42.04ZM871.39 35.54C869.82 35.54 868.58 36.81 868.58 38.35C868.58 39.88 869.85 41.16 871.39 41.16C872.92 41.16 874.19 39.88 874.19 38.35C874.19 36.81 872.95 35.54 871.39 35.54Z" /><path class="shp11" d="M843.41 120.5L821.27 128.78C820.06 129.22 818.7 128.63 818.26 127.42L809.98 105.28C809.54 104.07 810.13 102.71 811.35 102.27L833.48 93.99C834.69 93.55 836.05 94.14 836.5 95.35L844.77 117.49C845.21 118.7 844.62 120.06 843.41 120.5Z" /><path class="shp6" d="M841.57 119.66L819.43 127.93C818.22 128.37 816.86 127.78 816.42 126.57L808.15 104.44C807.71 103.22 808.29 101.86 809.51 101.42L831.64 93.15C832.86 92.7 834.22 93.29 834.66 94.51L842.93 116.64C843.37 117.86 842.75 119.22 841.57 119.66Z" /><path class="shp9" d="M832.4 95.42L810.4 103.67L818.64 125.67L840.64 117.43L832.4 95.42Z" /><path fill-rule="evenodd" class="shp13" d="M818.29 126.24L816.31 120.91L818.55 114.84C818.92 113.89 819.91 113.37 820.9 113.63L825.47 114.84C825.61 114.88 825.76 114.8 825.83 114.69L829.33 108.3C830.13 106.83 831.94 106.16 833.52 106.75L837.86 108.41L841.31 117.64L818.29 126.24ZM817.49 120.87L818.96 124.81L839.92 116.94L837.01 109.22L833.15 107.74C832.08 107.34 830.87 107.78 830.32 108.77L826.83 115.17C826.5 115.76 825.83 116.02 825.21 115.87L820.65 114.66C820.21 114.55 819.77 114.77 819.62 115.21L817.49 120.87Z" /><path fill-rule="evenodd" class="shp13" d="M825.1 108.48C823.81 108.48 822.6 107.71 822.12 106.42C821.49 104.77 822.34 102.96 823.96 102.34C825.58 101.71 827.41 102.56 828.04 104.18C828.66 105.83 827.82 107.63 826.2 108.26C825.83 108.41 825.47 108.48 825.1 108.48ZM825.1 103.26C824.84 103.26 824.62 103.3 824.36 103.41C823.3 103.81 822.74 104.99 823.15 106.05C823.55 107.12 824.73 107.67 825.8 107.27C826.86 106.86 827.41 105.69 827.01 104.62C826.72 103.77 825.94 103.26 825.1 103.26Z" /><g clip-path="url(#cp2)"><g ><g style="opacity: 0.412"><g style="opacity: 0.412"><g style="opacity: 0.412"><path class="shp1" d="M-58.53 84.76C-59.07 79.62 -59.21 74.49 -58.87 69.28C-57.38 45.08 -46.43 21.76 -29.46 4.86C-23.38 -1.16 -16.42 -6.7 -12.7 -14.41C-6.41 -27.46 -7.63 -41.99 0.35 -55.04C8.39 -68.02 20.49 -78.49 34.42 -84.24C75.99 -101.48 136.5 -80.25 133.79 -27.86C133.79 -27.66 133.79 -27.39 133.79 -27.05C133.66 -16.17 142.38 -7.51 152.99 -7.85C192.13 -9 227.28 20 236.41 58.53C242.29 83.34 236.07 111.19 219.03 129.85C206.32 143.78 188.68 152.02 170.97 157.97C135.41 169.87 97.56 173.99 60.17 172.17C25.23 170.41 -12.02 162.16 -35.89 136C-48.66 122.08 -56.5 103.76 -58.53 84.76Z" /></g></g></g><g style="opacity: 0.31"><path class="shp2" d="M241.14 17.23C241.21 18.92 242.63 20.2 244.32 20.13C246.01 20.07 247.22 18.58 247.16 16.89C247.09 15.2 245.67 13.92 243.98 13.98C242.36 14.12 241.07 15.54 241.14 17.23Z" /></g><path class="shp5" d="M-47.58 -19.82C-51.5 -8.46 -52.58 3.91 -50.01 15.61C-46.57 31.36 -34.8 45.21 -36.83 61.98C-38.05 72.05 -37.85 81.31 -38.05 91.18C-38.52 111.53 -24.33 128.36 -7.7 136.75C5.82 143.57 21.24 145.4 36.11 144.11C49.49 142.96 62.68 139.45 75.38 135.06C87.62 130.86 99.52 125.66 112.7 126.06C123.65 126.4 133.86 130.46 144.27 133.3C169.15 140.06 198.62 139.11 219.71 124.44C242.9 108.35 252.23 77.87 244.18 51.23C239.85 36.9 234.04 24.53 236.14 9.32C237.15 1.82 238.71 -5.82 237.29 -13.26C236 -20.09 232.22 -26.24 227.75 -31.58C215.79 -46.05 198.69 -55.24 180.98 -60.65C160.83 -66.8 138.52 -70.18 117.57 -66.93C76.94 -60.78 68.08 -66.73 25.56 -72.82C-2.9 -76.87 -29.67 -54.23 -42.58 -30.84C-44.54 -27.39 -46.23 -23.67 -47.58 -19.82Z" /><g style="opacity: 0.831"><path class="shp4" d="M-27.91 12.9C-22.03 5.2 -12.97 -0.08 -8.57 -8.93C-3.23 -19.55 -4.38 -32.12 0.35 -42.94C7.38 -58.96 20.02 -72.61 35.97 -80.12C43.61 -83.7 52.06 -85.93 60.24 -85.32C72.88 -84.37 83.77 -76.8 92.28 -67.81C104.99 -54.43 113.92 -35.43 129.19 -24.75C137.58 -18.87 147.45 -25.09 156.37 -27.12C166.44 -29.35 176.92 -28.81 186.52 -26.1C204.23 -21.03 219.51 -8.39 227.15 8.37C235.33 26.22 234.11 50.96 218.83 66.31C211.73 73.4 202.13 78.14 196.93 86.65C190.37 97.33 189.56 111.8 187.74 123.63C185.71 136.75 180.1 149.52 171.65 160.13C171.58 160.27 171.44 160.41 171.38 160.47C156.71 178.66 131.76 184.81 110.67 175.68L65.85 156.28C20.43 136.61 -14.12 104.91 -30.68 58.87C-34.26 48.93 -35.55 27.71 -31.02 17.97C-30.14 16.15 -29.06 14.46 -27.91 12.9Z" /></g><g style="opacity: 0.659"><g style="opacity: 0.659"><g style="opacity: 0.659"><path fill-rule="evenodd" class="shp8" d="M110.11 166.75L105.64 166.75C103.75 166.75 102.13 165.2 102.13 163.24L102.13 158.24C102.13 157.36 101.59 156.55 100.71 156.21C100.17 156.01 99.7 155.8 99.16 155.53C98.34 155.13 97.33 155.33 96.72 155.94L93.21 159.45C92.53 160.13 91.65 160.47 90.77 160.47C89.83 160.47 88.95 160.13 88.34 159.45L85.23 156.34C84.55 155.67 84.22 154.79 84.22 153.91C84.22 152.96 84.55 152.09 85.23 151.48L88.75 147.96C89.35 147.35 89.56 146.34 89.15 145.53C88.95 144.99 88.68 144.51 88.48 143.97C88.14 143.16 87.39 142.55 86.45 142.55L81.51 142.55C79.62 142.55 78 141 78 139.04L78 134.71C78 132.82 79.55 131.2 81.51 131.2L86.51 131.2C87.39 131.2 88.2 130.66 88.54 129.78C88.75 129.24 88.95 128.69 89.22 128.22C89.62 127.41 89.42 126.4 88.81 125.79L85.3 122.27C84.62 121.6 84.28 120.72 84.28 119.84C84.28 118.89 84.62 118.02 85.3 117.41L88.41 114.3C89.76 112.94 91.99 112.94 93.34 114.3L96.86 117.81C97.47 118.42 98.48 118.62 99.29 118.22C99.76 118.02 100.31 117.74 100.85 117.54C101.66 117.2 102.27 116.46 102.27 115.51L102.27 110.51C102.27 108.62 103.82 107 105.78 107L110.24 107C112.14 107 113.76 108.55 113.76 110.51L113.76 115.51C113.76 116.39 114.3 117.2 115.18 117.54C115.72 117.74 116.26 117.95 116.73 118.22C117.54 118.62 118.56 118.42 119.17 117.81L122.68 114.3C124.03 112.94 126.26 112.94 127.61 114.3L130.72 117.41C131.4 118.08 131.74 118.96 131.74 119.84C131.74 120.79 131.4 121.67 130.72 122.27L127.21 125.79C126.6 126.4 126.4 127.41 126.8 128.22C127.01 128.69 127.28 129.24 127.48 129.78C127.82 130.59 128.56 131.2 129.51 131.2L134.51 131.2C136.4 131.2 138.03 132.75 138.03 134.71L138.03 139.17C138.03 141.07 136.47 142.69 134.51 142.69L129.51 142.69C128.63 142.69 127.82 143.23 127.48 144.11C127.28 144.65 127.08 145.19 126.8 145.66C126.4 146.47 126.6 147.49 127.21 148.1L130.72 151.61C131.4 152.29 131.74 153.17 131.74 154.05C131.74 154.99 131.4 155.87 130.72 156.48L127.61 159.59C126.94 160.26 126.06 160.6 125.18 160.6C124.3 160.6 123.36 160.26 122.75 159.59L119.23 156.07C118.63 155.47 117.61 155.26 116.8 155.67C116.26 155.94 115.78 156.14 115.25 156.34C114.43 156.68 113.83 157.43 113.83 158.37L113.83 163.37C113.56 165.2 112 166.75 110.11 166.75ZM98.28 154.11C98.75 154.11 99.29 154.25 99.76 154.45C100.24 154.65 100.71 154.86 101.25 155.06C102.6 155.53 103.55 156.88 103.55 158.3L103.55 163.31C103.55 164.46 104.5 165.47 105.71 165.47L110.17 165.47C111.32 165.47 112.34 164.52 112.34 163.31L112.34 158.3C112.34 156.82 113.28 155.53 114.64 155.06C115.11 154.86 115.58 154.65 116.12 154.45C117.47 153.84 119.03 154.11 120.04 155.13L123.56 158.64C124.37 159.45 125.79 159.45 126.6 158.64L129.71 155.53C130.12 155.13 130.32 154.59 130.32 154.05C130.32 153.5 130.12 152.96 129.71 152.56L126.2 149.04C125.18 148.03 124.91 146.41 125.52 145.12C125.72 144.65 125.92 144.18 126.13 143.63C126.6 142.28 127.95 141.34 129.37 141.34L134.38 141.34C135.53 141.34 136.54 140.39 136.54 139.17L136.54 134.71C136.54 133.56 135.59 132.55 134.38 132.55L129.37 132.55C127.89 132.55 126.6 131.6 126.13 130.25C125.92 129.78 125.72 129.24 125.52 128.76C124.91 127.41 125.18 125.86 126.2 124.84L129.71 121.33C130.12 120.92 130.32 120.38 130.32 119.84C130.32 119.3 130.12 118.76 129.71 118.35L126.6 115.24C125.79 114.43 124.44 114.43 123.56 115.24L120.04 118.76C119.03 119.77 117.41 120.04 116.12 119.43C115.65 119.23 115.18 119.03 114.64 118.83C113.28 118.35 112.34 117 112.34 115.58L112.34 110.58C112.34 109.43 111.39 108.42 110.17 108.42L105.71 108.42C104.56 108.42 103.55 109.36 103.55 110.58L103.55 115.58C103.55 117.07 102.6 118.35 101.25 118.83C100.78 119.03 100.24 119.23 99.76 119.43C98.41 120.04 96.86 119.77 95.84 118.76L92.33 115.24C91.52 114.43 90.17 114.43 89.29 115.24L86.18 118.35C85.77 118.76 85.57 119.3 85.57 119.84C85.57 120.38 85.77 120.92 86.18 121.33L89.69 124.84C90.71 125.86 90.98 127.48 90.37 128.76C90.17 129.24 89.96 129.71 89.76 130.25C89.29 131.6 87.93 132.55 86.51 132.55L81.51 132.55C80.36 132.55 79.35 133.5 79.35 134.71L79.35 139.17C79.35 140.32 80.3 141.34 81.51 141.34L86.51 141.34C88 141.34 89.29 142.28 89.76 143.63C89.96 144.11 90.17 144.65 90.37 145.12C90.98 146.47 90.71 148.03 89.69 149.04L86.18 152.56C85.77 152.96 85.57 153.5 85.57 154.05C85.57 154.59 85.77 155.13 86.18 155.53L89.29 158.64C90.1 159.45 91.52 159.45 92.33 158.64L95.84 155.13C96.52 154.45 97.4 154.11 98.28 154.11ZM107.88 152.63C99.22 152.63 92.19 145.6 92.19 136.94C92.19 128.29 99.22 121.26 107.88 121.26C116.53 121.26 123.56 128.29 123.56 136.94C123.56 145.53 116.53 152.63 107.88 152.63ZM107.88 122.54C99.97 122.54 93.55 128.97 93.55 136.88C93.55 144.78 99.97 151.21 107.88 151.21C115.78 151.21 122.21 144.78 122.21 136.88C122.21 128.97 115.78 122.54 107.88 122.54Z" /></g></g></g><g style="opacity: 0.502"><path class="shp7" d="M171.21 55.27L162.43 55.27C162.02 55.27 161.75 55 161.75 54.59C161.75 54.18 162.02 53.91 162.43 53.91L171.21 53.91C171.62 53.91 171.89 54.18 171.89 54.59C171.89 55 171.62 55.27 171.21 55.27Z" /><path class="shp7" d="M171.21 69.8L162.43 69.8C162.02 69.8 161.75 69.53 161.75 69.12C161.75 68.72 162.02 68.45 162.43 68.45L171.21 68.45C171.62 68.45 171.89 68.72 171.89 69.12C171.89 69.53 171.62 69.8 171.21 69.8Z" /><g style="opacity: 0.812"><g style="opacity: 0.812"><g style="opacity: 0.812"><path fill-rule="evenodd" class="shp7" d="M177.43 84.47L123.83 84.47C122.81 84.47 122 83.66 122 82.64L122 37.83C122 36.81 122.81 36 123.83 36L177.43 36C178.45 36 179.26 36.81 179.26 37.83L179.26 82.64C179.32 83.66 178.45 84.47 177.43 84.47ZM123.89 37.35C123.62 37.35 123.42 37.55 123.42 37.83L123.42 82.64C123.42 82.91 123.62 83.12 123.89 83.12L177.5 83.12C177.77 83.12 177.97 82.91 177.97 82.64L177.97 37.83C177.97 37.55 177.77 37.35 177.5 37.35L123.89 37.35Z" /><path fill-rule="evenodd" class="shp8" d="M177.43 84.47L123.83 84.47C122.81 84.47 122 83.66 122 82.64L122 37.83C122 36.81 122.81 36 123.83 36L177.43 36C178.45 36 179.26 36.81 179.26 37.83L179.26 82.64C179.32 83.66 178.45 84.47 177.43 84.47ZM123.89 37.35C123.62 37.35 123.42 37.55 123.42 37.83L123.42 82.64C123.42 82.91 123.62 83.12 123.89 83.12L177.5 83.12C177.77 83.12 177.97 82.91 177.97 82.64L177.97 37.83C177.97 37.55 177.77 37.35 177.5 37.35L123.89 37.35Z" /></g></g><path class="shp7" d="M171.21 48.24L129.23 48.24C128.83 48.24 128.56 47.97 128.56 47.56C128.56 47.15 128.83 46.88 129.23 46.88L171.21 46.88C171.62 46.88 171.89 47.15 171.89 47.56C171.89 47.97 171.62 48.24 171.21 48.24Z" /><path class="shp7" d="M171.21 62.3L129.23 62.3C128.83 62.3 128.56 62.03 128.56 61.62C128.56 61.22 128.83 60.94 129.23 60.94L171.21 60.94C171.62 60.94 171.89 61.22 171.89 61.62C171.89 62.03 171.62 62.3 171.21 62.3Z" /><path class="shp7" d="M151.88 55.27L129.23 55.27C128.83 55.27 128.56 55 128.56 54.59C128.56 54.18 128.83 53.91 129.23 53.91L151.88 53.91C152.28 53.91 152.56 54.18 152.56 54.59C152.56 55 152.28 55.27 151.88 55.27Z" /><path class="shp7" d="M151.88 69.8L129.23 69.8C128.83 69.8 128.56 69.53 128.56 69.12C128.56 68.72 128.83 68.45 129.23 68.45L151.88 68.45C152.28 68.45 152.56 68.72 152.56 69.12C152.56 69.53 152.28 69.8 151.88 69.8Z" /><path class="shp7" d="M144.51 76.56L129.23 76.56C128.83 76.56 128.56 76.29 128.56 75.88C128.56 75.48 128.83 75.21 129.23 75.21L144.51 75.21C144.92 75.21 145.19 75.48 145.19 75.88C145.19 76.22 144.85 76.56 144.51 76.56Z" /></g></g><g style="opacity: 0.812"><path class="shp7" d="M75.7 18.7L65.7 18.7C65.29 18.7 65.02 18.43 65.02 18.02C65.02 17.62 65.29 17.35 65.7 17.35L75.7 17.35C76.11 17.35 76.38 17.62 76.38 18.02C76.38 18.36 76.11 18.7 75.7 18.7Z" /><path class="shp7" d="M75.7 35.13L65.7 35.13C65.29 35.13 65.02 34.86 65.02 34.45C65.02 34.04 65.29 33.77 65.7 33.77L75.7 33.77C76.11 33.77 76.38 34.04 76.38 34.45C76.38 34.86 76.11 35.13 75.7 35.13Z" /><g style="opacity: 0.812"><g style="opacity: 0.812"><g style="opacity: 0.812"><path fill-rule="evenodd" class="shp7" d="M82.94 51.76L21.83 51.76C20.81 51.76 20 50.94 20 49.93L20 -1.17C20 -2.19 20.81 -3 21.83 -3L82.94 -3C83.95 -3 84.76 -2.19 84.76 -1.17L84.76 49.93C84.76 50.94 83.95 51.76 82.94 51.76ZM21.83 -1.65C21.55 -1.65 21.35 -1.45 21.35 -1.17L21.35 49.93C21.35 50.2 21.55 50.4 21.83 50.4L82.94 50.4C83.21 50.4 83.41 50.2 83.41 49.93L83.41 -1.17C83.41 -1.45 83.21 -1.65 82.94 -1.65L21.83 -1.65Z" /><path fill-rule="evenodd" class="shp8" d="M82.94 51.76L21.83 51.76C20.81 51.76 20 50.94 20 49.93L20 -1.17C20 -2.19 20.81 -3 21.83 -3L82.94 -3C83.95 -3 84.76 -2.19 84.76 -1.17L84.76 49.93C84.76 50.94 83.95 51.76 82.94 51.76ZM21.83 -1.65C21.55 -1.65 21.35 -1.45 21.35 -1.17L21.35 49.93C21.35 50.2 21.55 50.4 21.83 50.4L82.94 50.4C83.21 50.4 83.41 50.2 83.41 49.93L83.41 -1.17C83.41 -1.45 83.21 -1.65 82.94 -1.65L21.83 -1.65Z" /></g></g><path class="shp7" d="M75.7 10.66L28.04 10.66C27.64 10.66 27.37 10.38 27.37 9.98C27.37 9.57 27.64 9.3 28.04 9.3L75.7 9.3C76.11 9.3 76.38 9.57 76.38 9.98C76.38 10.38 76.11 10.66 75.7 10.66Z" /><path class="shp7" d="M75.7 26.68L28.04 26.68C27.64 26.68 27.37 26.41 27.37 26C27.37 25.59 27.64 25.32 28.04 25.32L75.7 25.32C76.11 25.32 76.38 25.59 76.38 26C76.38 26.34 76.11 26.68 75.7 26.68Z" /><path class="shp7" d="M53.73 18.7L28.04 18.7C27.64 18.7 27.37 18.43 27.37 18.02C27.37 17.62 27.64 17.35 28.04 17.35L53.73 17.35C54.14 17.35 54.41 17.62 54.41 18.02C54.41 18.36 54.14 18.7 53.73 18.7Z" /><path class="shp7" d="M53.73 35.13L28.04 35.13C27.64 35.13 27.37 34.86 27.37 34.45C27.37 34.04 27.64 33.77 28.04 33.77L53.73 33.77C54.14 33.77 54.41 34.04 54.41 34.45C54.41 34.86 54.14 35.13 53.73 35.13Z" /><path class="shp7" d="M45.35 42.77L28.04 42.77C27.64 42.77 27.37 42.49 27.37 42.09C27.37 41.68 27.64 41.41 28.04 41.41L45.35 41.41C45.76 41.41 46.03 41.68 46.03 42.09C46.03 42.49 45.76 42.77 45.35 42.77Z" /></g></g><path fill-rule="evenodd" class="shp8" d="M130.11 24L126.89 24C125.53 24 124.46 22.89 124.46 21.57L124.46 17.95C124.46 17.29 124.05 16.67 123.39 16.42C123.02 16.3 122.65 16.13 122.28 15.97C121.66 15.68 120.92 15.8 120.43 16.3L117.87 18.85C117.42 19.3 116.8 19.55 116.14 19.55C115.48 19.55 114.87 19.3 114.41 18.85L112.15 16.59C111.2 15.64 111.2 14.07 112.15 13.13L114.7 10.57C115.2 10.08 115.32 9.34 115.03 8.72C114.87 8.35 114.7 7.98 114.58 7.61C114.33 6.99 113.71 6.54 113.06 6.54L109.43 6.54C108.07 6.54 107 5.42 107 4.11L107 0.89C107 -0.47 108.11 -1.54 109.43 -1.54L113.06 -1.54C113.71 -1.54 114.33 -1.95 114.58 -2.61C114.7 -2.98 114.87 -3.35 115.03 -3.72C115.32 -4.34 115.2 -5.08 114.7 -5.57L112.15 -8.13C111.2 -9.07 111.2 -10.64 112.15 -11.59L114.41 -13.85C115.36 -14.8 116.93 -14.8 117.87 -13.85L120.43 -11.3C120.92 -10.8 121.66 -10.68 122.28 -10.97C122.65 -11.13 123.02 -11.3 123.39 -11.42C124.01 -11.67 124.46 -12.29 124.46 -12.95L124.46 -16.57C124.46 -17.93 125.58 -19 126.89 -19L130.11 -19C131.47 -19 132.54 -17.89 132.54 -16.57L132.54 -12.95C132.54 -12.29 132.95 -11.67 133.61 -11.42C133.98 -11.3 134.35 -11.13 134.72 -10.97C135.34 -10.68 136.08 -10.8 136.57 -11.3L139.13 -13.85C140.07 -14.8 141.64 -14.8 142.59 -13.85L144.85 -11.59C145.8 -10.64 145.8 -9.07 144.85 -8.13L142.3 -5.57C141.8 -5.08 141.68 -4.34 141.97 -3.72C142.13 -3.35 142.3 -2.98 142.42 -2.61C142.67 -1.99 143.29 -1.54 143.94 -1.54L147.57 -1.54C148.93 -1.54 150 -0.42 150 0.89L150 4.11C150 5.47 148.89 6.54 147.57 6.54L143.94 6.54C143.29 6.54 142.67 6.95 142.42 7.61C142.3 7.98 142.13 8.35 141.97 8.72C141.68 9.34 141.8 10.08 142.3 10.57L144.85 13.13C145.8 14.07 145.8 15.64 144.85 16.59L142.59 18.85C142.13 19.3 141.51 19.55 140.86 19.55C140.2 19.55 139.58 19.3 139.13 18.85L136.57 16.3C136.08 15.8 135.34 15.68 134.72 15.97C134.35 16.13 133.98 16.3 133.61 16.42C132.99 16.67 132.54 17.29 132.54 17.95L132.54 21.57C132.58 22.89 131.47 24 130.11 24ZM121.58 14.98C121.95 14.98 122.28 15.06 122.61 15.23C122.94 15.39 123.31 15.52 123.68 15.68C124.63 16.05 125.29 16.96 125.29 17.99L125.29 21.61C125.29 22.52 126.03 23.22 126.89 23.22L130.11 23.22C131.01 23.22 131.71 22.48 131.71 21.61L131.71 17.99C131.71 16.96 132.37 16.05 133.32 15.68C133.69 15.56 134.02 15.39 134.39 15.23C135.34 14.77 136.45 14.98 137.15 15.72L139.7 18.27C140.32 18.89 141.35 18.89 142.01 18.27L144.28 16.01C144.89 15.39 144.89 14.36 144.28 13.7L141.72 11.15C140.98 10.41 140.81 9.3 141.23 8.39C141.39 8.06 141.56 7.69 141.68 7.32C142.05 6.37 142.96 5.71 143.99 5.71L147.61 5.71C148.52 5.71 149.22 4.97 149.22 4.11L149.22 0.89C149.22 -0.01 148.48 -0.71 147.61 -0.71L143.99 -0.71C142.96 -0.71 142.05 -1.37 141.68 -2.32C141.56 -2.69 141.39 -3.02 141.23 -3.39C140.77 -4.34 140.98 -5.45 141.72 -6.15L144.28 -8.7C144.89 -9.32 144.89 -10.35 144.28 -11.01L142.01 -13.27C141.39 -13.89 140.36 -13.89 139.7 -13.27L137.15 -10.72C136.41 -9.98 135.3 -9.82 134.39 -10.23C134.06 -10.39 133.69 -10.56 133.32 -10.68C132.37 -11.05 131.71 -11.96 131.71 -12.99L131.71 -16.61C131.71 -17.52 130.97 -18.22 130.11 -18.22L126.89 -18.22C125.99 -18.22 125.29 -17.48 125.29 -16.61L125.29 -12.99C125.29 -11.96 124.63 -11.05 123.68 -10.68C123.31 -10.56 122.98 -10.39 122.61 -10.23C121.66 -9.77 120.55 -9.98 119.85 -10.72L117.3 -13.27C116.68 -13.89 115.65 -13.89 114.99 -13.27L112.72 -11.01C112.11 -10.39 112.11 -9.36 112.72 -8.7L115.28 -6.15C116.02 -5.41 116.19 -4.3 115.77 -3.39C115.61 -3.06 115.48 -2.69 115.32 -2.32C114.95 -1.37 114.04 -0.71 113.01 -0.71L109.39 -0.71C108.48 -0.71 107.78 0.03 107.78 0.89L107.78 4.11C107.78 5.01 108.52 5.71 109.39 5.71L113.01 5.71C114.04 5.71 114.95 6.37 115.32 7.32C115.44 7.69 115.61 8.02 115.77 8.39C116.23 9.34 116.02 10.45 115.28 11.15L112.72 13.7C112.11 14.32 112.11 15.35 112.72 16.01L114.99 18.27C115.61 18.89 116.64 18.89 117.3 18.27L119.85 15.72C120.3 15.23 120.92 14.98 121.58 14.98ZM128.5 13.74C122.28 13.74 117.17 8.68 117.17 2.46C117.17 -3.76 122.24 -8.87 128.5 -8.87C134.72 -8.87 139.83 -3.8 139.83 2.46C139.83 8.68 134.76 13.74 128.5 13.74ZM128.5 -8.04C122.73 -8.04 118 -3.35 118 2.46C118 8.23 122.69 12.92 128.5 12.92C134.27 12.92 139 8.23 139 2.46C139 -3.35 134.31 -8.04 128.5 -8.04Z" /></g></g></g></g></svg>
1
+ <svg version="1.2" baseProfile="tiny-ps" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 935 150"><title>kartinkia-svg</title><defs><clipPath clipPathUnits="userSpaceOnUse" id="cp1"><path d="M0 0L935 0L935 150L0 150L0 0Z" /></clipPath><clipPath clipPathUnits="userSpaceOnUse" id="cp2"><path d="M-28 -110L310 -110L310 228L-28 228L-28 -110Z" /></clipPath></defs><style>tspan { white-space:pre }.shp0 { fill: #116c7d } .shp1 { opacity: 0.412;fill: #e1e2fe } .shp2 { opacity: 0.31;fill: #e1e2fe } .shp3 { opacity: 0.102;fill: #ecf1f7 } .shp4 { opacity: 0.102;fill: #e1e2fe } .shp5 { opacity: 0.051;fill: #e1e2fe } .shp6 { fill: #ffffff } .shp7 { opacity: 0.812;fill: #ffffff } .shp8 { opacity: 0.659;fill: #ffffff } .shp9 { fill: #c5d9ff } .shp10 { fill: #599af2 } .shp11 { opacity: 0.361;fill: #4c65ba } .shp12 { opacity: 0.388;fill: #f7a9b4 } .shp13 { opacity: 0.471;fill: #ffffff } </style><g clip-path="url(#cp1)"><g ><path class="shp0" d="M0 1L935 1L935 151L0 151L0 1Z" /><g style="opacity: 0.412"><g style="opacity: 0.412"><g style="opacity: 0.412"><path class="shp1" d="M635.08 197.72C634.5 192.16 634.35 186.6 634.72 180.96C636.33 154.75 648.18 129.5 666.56 111.2C673.14 104.69 680.68 98.68 684.71 90.34C691.52 76.21 690.2 60.47 698.84 46.35C707.55 32.29 720.65 20.94 735.73 14.72C780.75 -3.94 846.26 19.04 843.34 75.77C843.34 75.99 843.34 76.28 843.34 76.65C843.19 88.44 852.63 97.8 864.12 97.44C906.51 96.19 944.57 127.6 954.45 169.32C960.82 196.19 954.09 226.34 935.64 246.55C921.88 261.63 902.77 270.56 883.6 277C845.09 289.88 804.1 294.35 763.62 292.37C725.78 290.47 685.44 281.54 659.6 253.21C645.77 238.13 637.28 218.29 635.08 197.72Z" /></g></g></g><g style="opacity: 0.31"><path class="shp2" d="M828.62 11.36C828.91 16.7 833.38 20.87 838.65 20.58C843.92 20.29 847.95 15.75 847.65 10.33C847.36 4.99 842.9 0.81 837.63 1.11C832.43 1.4 828.33 6.01 828.62 11.36Z" /></g><g style="opacity: 0.31"><path class="shp2" d="M676.66 11.14C676.8 13.92 679.08 16.04 681.86 15.89C684.57 15.75 686.69 13.41 686.54 10.62C686.39 7.84 684.13 5.72 681.34 5.87C678.63 6.01 676.51 8.35 676.66 11.14Z" /></g><path class="shp3" d="M632.81 47.74C628.13 39.46 630.91 28.85 638.96 24.09C647.09 19.26 663.04 18.75 667.73 27.02C672.41 35.29 659.97 43.27 655.14 51.47C648.48 62.89 637.5 56.01 632.81 47.74Z" /><path class="shp4" d="M912.95 -6.21C919.24 -12.87 929.64 -13.02 936.08 -6.58C942.52 -0.14 947.21 14.94 940.91 21.53C934.62 28.19 924.08 18.46 915.36 16.04C903.29 12.67 906.65 0.45 912.95 -6.21Z" /><path class="shp5" d="M646.94 84.48C642.69 96.78 641.52 110.17 644.3 122.84C648.04 139.9 660.77 154.9 658.58 173.05C657.26 183.96 657.48 193.99 657.26 204.68C656.75 226.71 672.12 244.94 690.13 254.01C704.77 261.41 721.46 263.38 737.56 261.99C752.05 260.75 766.33 256.94 780.09 252.18C793.34 247.65 806.22 242.01 820.5 242.45C832.36 242.81 843.41 247.21 854.68 250.28C881.62 257.6 913.53 256.57 936.37 240.69C961.48 223.27 971.58 190.26 962.87 161.41C958.19 145.9 951.89 132.5 954.16 116.03C955.26 107.91 956.94 99.63 955.4 91.58C954.01 84.19 949.91 77.53 945.08 71.75C932.13 56.08 913.61 46.13 894.43 40.27C872.62 33.61 848.46 29.95 825.77 33.46C781.77 40.12 772.18 33.68 726.14 27.09C695.33 22.7 666.34 47.22 652.36 72.55C650.23 76.28 648.4 80.31 646.94 84.48Z" /><g style="opacity: 0.831"><path class="shp4" d="M668.24 119.91C674.61 111.57 684.42 105.86 689.18 96.27C694.96 84.78 693.72 71.16 698.84 59.45C706.45 42.1 720.14 27.31 737.41 19.19C745.69 15.31 754.84 12.89 763.69 13.55C777.38 14.58 789.17 22.77 798.39 32.51C812.15 47 821.82 67.57 838.36 79.14C847.43 85.51 858.12 78.77 867.78 76.58C878.69 74.16 890.04 74.75 900.43 77.67C919.61 83.16 936.15 96.85 944.42 115.01C953.28 134.33 951.96 161.12 935.42 177.74C927.74 185.43 917.34 190.55 911.7 199.77C904.6 211.34 903.73 227 901.75 239.81C899.55 254.01 893.48 267.85 884.33 279.34C884.25 279.49 884.11 279.63 884.03 279.71C868.15 299.4 841.14 306.06 818.3 296.18L769.77 275.17C720.58 253.87 683.17 219.54 665.24 169.69C661.36 158.93 659.97 135.94 664.87 125.4C665.83 123.42 667 121.59 668.24 119.91Z" /></g><g style="opacity: 0.22"><path fill-rule="evenodd" class="shp6" d="M913.27 96.23C913.27 99.31 910.77 101.82 907.69 101.82C904.61 101.82 902.11 99.31 902.11 96.23C902.11 93.16 904.61 90.65 907.69 90.65C910.77 90.65 913.27 93.16 913.27 96.23ZM911.1 96.23C911.1 94.35 909.57 92.82 907.69 92.82C905.8 92.82 904.27 94.35 904.27 96.23C904.27 98.12 905.8 99.65 907.69 99.65C909.57 99.65 911.1 98.12 911.1 96.23Z" /><path class="shp6" d="M907.73 125.33C907.7 125.26 907.66 125.2 907.63 125.14C907.59 125.08 907.54 125.03 907.49 124.98C907.44 124.93 907.39 124.88 907.33 124.84C907.27 124.8 907.21 124.77 907.14 124.74C907.08 124.72 907.01 124.69 906.94 124.68C906.8 124.65 906.65 124.65 906.51 124.68C906.45 124.69 906.38 124.72 906.31 124.74C906.25 124.77 906.18 124.8 906.13 124.84C906.07 124.88 906.01 124.93 905.96 124.98C905.91 125.03 905.87 125.08 905.83 125.14C905.79 125.2 905.75 125.26 905.73 125.33C905.7 125.39 905.68 125.46 905.66 125.53C905.65 125.6 905.64 125.67 905.64 125.74C905.64 125.81 905.65 125.88 905.66 125.95C905.68 126.02 905.7 126.09 905.73 126.16C905.75 126.22 905.79 126.28 905.83 126.34C905.87 126.4 905.91 126.46 905.96 126.51C905.99 126.53 906.01 126.56 906.04 126.58C906.07 126.6 906.1 126.62 906.13 126.64C906.18 126.68 906.25 126.71 906.31 126.74C906.38 126.77 906.45 126.79 906.51 126.8C906.58 126.82 906.66 126.83 906.73 126.83C906.8 126.83 906.87 126.82 906.94 126.8C907.01 126.79 907.08 126.77 907.14 126.74C907.21 126.71 907.27 126.68 907.33 126.64C907.36 126.62 907.39 126.6 907.41 126.58C907.44 126.56 907.47 126.53 907.49 126.51C907.54 126.46 907.59 126.4 907.63 126.34C907.66 126.28 907.7 126.22 907.73 126.16C907.75 126.09 907.77 126.02 907.79 125.95C907.8 125.88 907.81 125.81 907.81 125.74C907.81 125.67 907.8 125.6 907.79 125.53C907.77 125.46 907.75 125.39 907.73 125.33Z" /><path class="shp6" d="M890.68 82.46C890.65 82.4 890.62 82.33 890.58 82.27C890.54 82.21 890.49 82.16 890.44 82.11C890.39 82.06 890.34 82.01 890.28 81.97C890.22 81.94 890.16 81.9 890.09 81.87C890.03 81.85 889.96 81.83 889.89 81.81C889.75 81.78 889.61 81.78 889.47 81.81C889.4 81.83 889.33 81.85 889.26 81.87C889.2 81.9 889.13 81.94 889.08 81.97C889.02 82.01 888.96 82.06 888.91 82.11C888.86 82.16 888.82 82.21 888.78 82.27C888.74 82.33 888.71 82.4 888.68 82.46C888.65 82.53 888.63 82.59 888.62 82.66C888.6 82.73 888.6 82.8 888.6 82.88C888.6 82.95 888.6 83.02 888.62 83.09C888.63 83.16 888.65 83.22 888.68 83.29C888.71 83.35 888.74 83.42 888.78 83.48C888.82 83.53 888.86 83.59 888.91 83.64C888.96 83.69 889.02 83.74 889.08 83.78C889.13 83.81 889.2 83.85 889.26 83.88C889.33 83.9 889.4 83.92 889.47 83.94C889.54 83.95 889.61 83.96 889.68 83.96C889.75 83.96 889.82 83.95 889.89 83.94C889.96 83.92 890.03 83.9 890.09 83.88C890.16 83.85 890.22 83.81 890.28 83.78C890.34 83.74 890.39 83.69 890.44 83.64C890.49 83.59 890.54 83.53 890.58 83.48C890.62 83.42 890.65 83.35 890.68 83.29C890.71 83.22 890.73 83.16 890.74 83.09C890.75 83.02 890.76 82.95 890.76 82.88C890.76 82.8 890.75 82.73 890.74 82.66C890.73 82.59 890.71 82.53 890.68 82.46Z" /><path fill-rule="evenodd" class="shp6" d="M922 88.02L922 125.14C922 128.57 919.21 131.37 915.77 131.37L878.65 131.37C875.71 131.37 873.24 129.32 872.59 126.57C869.24 126.48 866.54 123.72 866.54 120.35L866.54 86.36C866.54 81.2 870.74 77 875.9 77L909.89 77C912.83 77 915.3 79.05 915.95 81.8C919.3 81.89 922 84.65 922 88.02ZM919.83 117.44L916.12 114.03L913.95 112.05L913.7 111.82C912.95 111.13 911.79 111.1 911.01 111.75L906.14 115.79C905.27 116.51 904.18 116.87 903.08 116.82L905.6 121.45C905.88 121.98 905.69 122.64 905.16 122.92C905 123.01 904.82 123.06 904.65 123.06C904.26 123.06 903.89 122.85 903.7 122.49L895.92 108.21L890.57 98.38C890.21 97.73 889.55 97.33 888.81 97.32C888.07 97.31 887.39 97.68 887.02 98.32L874.59 119.39L874.59 125.14C874.59 125.65 874.68 126.13 874.85 126.58C875.43 128.11 876.92 129.2 878.65 129.2L915.77 129.2C918.01 129.2 919.83 127.38 919.83 125.14L919.83 117.44ZM919.83 88.02C919.83 85.9 918.2 84.15 916.12 83.97L913.95 83.96L894.01 83.96C893.41 83.96 892.93 83.47 892.93 82.87C892.93 82.28 893.41 81.79 894.01 81.79L913.69 81.79C913.1 80.26 911.62 79.17 909.89 79.17L875.9 79.17C871.93 79.17 868.7 82.39 868.7 86.36L868.7 120.35C868.7 122.47 870.34 124.22 872.42 124.4L872.42 88.02C872.42 84.59 875.22 81.79 878.65 81.79L885.35 81.79C885.94 81.79 886.43 82.28 886.43 82.87C886.43 83.47 885.94 83.96 885.35 83.96L878.65 83.96C876.41 83.96 874.59 85.78 874.59 88.02L874.59 115.13L885.15 97.22C885.93 95.9 887.31 95.13 888.85 95.15C890.38 95.18 891.74 96 892.47 97.35L895.91 103.67L897.82 107.17L901.24 113.45C901.57 114.06 902.15 114.48 902.84 114.62C903.52 114.75 904.22 114.57 904.76 114.12L909.63 110.08C910.86 109.06 912.54 108.86 913.95 109.45L916.12 111.1L919.83 114.5L919.83 88.02Z" /></g><g style="opacity: 0.4"><g style="opacity: 0.812"><path class="shp7" d="M724.99 123.06L715.62 123.06C715.24 123.06 714.99 122.81 714.99 122.43C714.99 122.05 715.24 121.8 715.62 121.8L724.99 121.8C725.37 121.8 725.62 122.05 725.62 122.43C725.62 122.75 725.37 123.06 724.99 123.06Z" /><path class="shp7" d="M724.99 138.44L715.62 138.44C715.24 138.44 714.99 138.18 714.99 137.8C714.99 137.42 715.24 137.17 715.62 137.17L724.99 137.17C725.37 137.17 725.62 137.42 725.62 137.8C725.62 138.18 725.37 138.44 724.99 138.44Z" /><g style="opacity: 0.812"><g style="opacity: 0.812"><g style="opacity: 0.812"><path fill-rule="evenodd" class="shp7" d="M731.75 154L674.56 154C673.61 154 672.85 153.24 672.85 152.29L672.85 104.46C672.85 103.51 673.61 102.75 674.56 102.75L731.75 102.75C732.7 102.75 733.46 103.51 733.46 104.46L733.46 152.29C733.46 153.24 732.7 154 731.75 154ZM674.56 104.02C674.31 104.02 674.12 104.21 674.12 104.46L674.12 152.29C674.12 152.54 674.31 152.74 674.56 152.74L731.75 152.74C732.01 152.74 732.2 152.54 732.2 152.29L732.2 104.46C732.2 104.21 732.01 104.02 731.75 104.02L674.56 104.02Z" /><path fill-rule="evenodd" class="shp8" d="M731.75 154L674.56 154C673.61 154 672.85 153.24 672.85 152.29L672.85 104.46C672.85 103.51 673.61 102.75 674.56 102.75L731.75 102.75C732.7 102.75 733.46 103.51 733.46 104.46L733.46 152.29C733.46 153.24 732.7 154 731.75 154ZM674.56 104.02C674.31 104.02 674.12 104.21 674.12 104.46L674.12 152.29C674.12 152.54 674.31 152.74 674.56 152.74L731.75 152.74C732.01 152.74 732.2 152.54 732.2 152.29L732.2 104.46C732.2 104.21 732.01 104.02 731.75 104.02L674.56 104.02Z" /></g></g><path class="shp7" d="M724.99 115.53L680.38 115.53C680 115.53 679.75 115.28 679.75 114.9C679.75 114.52 680 114.27 680.38 114.27L724.99 114.27C725.37 114.27 725.62 114.52 725.62 114.9C725.62 115.28 725.37 115.53 724.99 115.53Z" /><path class="shp7" d="M724.99 130.53L680.38 130.53C680 130.53 679.75 130.28 679.75 129.9C679.75 129.52 680 129.26 680.38 129.26L724.99 129.26C725.37 129.26 725.62 129.52 725.62 129.9C725.62 130.21 725.37 130.53 724.99 130.53Z" /><path class="shp7" d="M704.42 123.06L680.38 123.06C680 123.06 679.75 122.81 679.75 122.43C679.75 122.05 680 121.8 680.38 121.8L704.42 121.8C704.8 121.8 705.06 122.05 705.06 122.43C705.06 122.75 704.8 123.06 704.42 123.06Z" /><path class="shp7" d="M704.42 138.44L680.38 138.44C680 138.44 679.75 138.18 679.75 137.8C679.75 137.42 680 137.17 680.38 137.17L704.42 137.17C704.8 137.17 705.06 137.42 705.06 137.8C705.06 138.18 704.8 138.44 704.42 138.44Z" /><path class="shp7" d="M696.58 145.59L680.38 145.59C680 145.59 679.75 145.33 679.75 144.95C679.75 144.57 680 144.32 680.38 144.32L696.58 144.32C696.96 144.32 697.21 144.57 697.21 144.95C697.21 145.33 696.96 145.59 696.58 145.59Z" /></g></g></g><path class="shp9" d="M791.99 74.66L752.01 74.66C745.38 74.66 740 69.27 740 62.65C740 56.02 745.38 50.64 752.01 50.64L791.99 50.64C798.62 50.64 804 56.02 804 62.65C804 69.27 798.62 74.66 791.99 74.66Z" /><path class="shp10" d="M771.98 69.34C781.32 69.34 788.88 61.77 788.88 52.44C788.88 43.11 781.32 35.55 771.98 35.55C762.65 35.55 755.09 43.11 755.09 52.44C755.09 61.77 762.65 69.34 771.98 69.34Z" /><path class="shp10" d="M791.99 71.11L752.01 71.11C745.38 71.11 740 65.73 740 59.1C740 52.47 745.38 47.09 752.01 47.09L791.99 47.09C798.62 47.09 804 52.47 804 59.1C804 65.73 798.62 71.11 791.99 71.11Z" /><path class="shp10" d="M771.98 65.79C781.32 65.79 788.88 58.23 788.88 48.89C788.88 39.56 781.32 32 771.98 32C762.65 32 755.09 39.56 755.09 48.89C755.09 58.23 762.65 65.79 771.98 65.79Z" /><g style="opacity: 0.212"><g style="opacity: 0.349"><path class="shp3" d="M791.99 71.11L752.01 71.11C745.38 71.11 740 65.73 740 59.1C740 52.47 745.38 47.09 752.01 47.09L791.99 47.09C798.62 47.09 804 52.47 804 59.1C804 65.73 798.62 71.11 791.99 71.11Z" /><path class="shp3" d="M771.98 65.79C781.32 65.79 788.88 58.23 788.88 48.89C788.88 39.56 781.32 32 771.98 32C762.65 32 755.09 39.56 755.09 48.89C755.09 58.23 762.65 65.79 771.98 65.79Z" /></g></g><path class="shp6" d="M768.03 51.41C767.85 51.41 767.63 51.35 767.47 51.2C767.16 50.89 767.16 50.39 767.47 50.11L772.02 45.66L776.5 50.14C776.81 50.45 776.81 50.95 776.5 51.23C776.18 51.54 775.69 51.54 775.41 51.23L772.05 47.87L768.62 51.26C768.44 51.35 768.25 51.41 768.03 51.41Z" /><path class="shp6" d="M771.98 57.61C771.55 57.61 771.21 57.26 771.21 56.83L771.21 46.72C771.21 46.28 771.55 45.94 771.98 45.94C772.42 45.94 772.76 46.28 772.76 46.72L772.76 56.83C772.76 57.26 772.42 57.61 771.98 57.61Z" /><path class="shp6" d="M779.36 62.4L764.55 62.4C763.49 62.4 762.62 61.53 762.62 60.47L762.62 55.09C762.62 54.65 762.96 54.31 763.4 54.31C763.83 54.31 764.17 54.65 764.17 55.09L764.17 60.47C764.17 60.69 764.33 60.84 764.55 60.84L779.36 60.84C779.64 60.84 779.86 60.62 779.86 60.34L779.86 55.09C779.86 54.65 780.2 54.31 780.63 54.31C781.07 54.31 781.41 54.65 781.41 55.09L781.41 60.38C781.38 61.5 780.48 62.4 779.36 62.4Z" /><path class="shp11" d="M887.14 64.03L855.66 64.03C854.63 64.03 853.77 63.2 853.77 62.14L853.77 30.69C853.77 29.66 854.6 28.8 855.66 28.8L887.11 28.8C888.14 28.8 889 29.63 889 30.69L889 62.14C889 63.17 888.17 64.03 887.14 64.03Z" /><path class="shp6" d="M885.34 62.23L853.89 62.23C852.86 62.23 852 61.4 852 60.34L852 28.89C852 27.86 852.83 27 853.89 27L885.34 27C886.37 27 887.23 27.83 887.23 28.89L887.23 60.34C887.23 61.4 886.37 62.23 885.34 62.23Z" /><path class="shp12" d="M884.18 30.01L854.99 30.01L854.99 59.21L884.18 59.21L884.18 30.01Z" /><path fill-rule="evenodd" class="shp13" d="M854.57 59.48L854.57 52.71L859.77 46.68C860.51 45.83 861.81 45.65 862.73 46.33L867.51 49.76C867.75 49.93 868.08 49.9 868.31 49.73L875.2 43.82C876.71 42.52 878.95 42.54 880.43 43.85L884.66 47.6L884.66 59.48L854.57 59.48ZM883.77 58.59L883.77 47.98L879.84 44.5C878.69 43.46 876.94 43.46 875.76 44.47L868.88 50.38C868.34 50.85 867.57 50.88 866.98 50.46L862.2 47.04C861.63 46.62 860.87 46.74 860.42 47.24L855.43 53.01L855.43 58.59L883.77 58.59Z" /><path fill-rule="evenodd" class="shp13" d="M871.39 42.04C869.35 42.04 867.69 40.39 867.69 38.35C867.69 36.31 869.35 34.65 871.39 34.65C873.43 34.65 875.08 36.31 875.08 38.35C875.08 40.39 873.43 42.04 871.39 42.04ZM871.39 35.54C869.82 35.54 868.58 36.81 868.58 38.35C868.58 39.88 869.85 41.16 871.39 41.16C872.92 41.16 874.19 39.88 874.19 38.35C874.19 36.81 872.95 35.54 871.39 35.54Z" /><path class="shp11" d="M843.41 120.5L821.27 128.78C820.06 129.22 818.7 128.63 818.26 127.42L809.98 105.28C809.54 104.07 810.13 102.71 811.35 102.27L833.48 93.99C834.69 93.55 836.05 94.14 836.5 95.35L844.77 117.49C845.21 118.7 844.62 120.06 843.41 120.5Z" /><path class="shp6" d="M841.57 119.66L819.43 127.93C818.22 128.37 816.86 127.78 816.42 126.57L808.15 104.44C807.71 103.22 808.29 101.86 809.51 101.42L831.64 93.15C832.86 92.7 834.22 93.29 834.66 94.51L842.93 116.64C843.37 117.86 842.75 119.22 841.57 119.66Z" /><path class="shp9" d="M832.4 95.42L810.4 103.67L818.64 125.67L840.64 117.43L832.4 95.42Z" /><path fill-rule="evenodd" class="shp13" d="M818.29 126.24L816.31 120.91L818.55 114.84C818.92 113.89 819.91 113.37 820.9 113.63L825.47 114.84C825.61 114.88 825.76 114.8 825.83 114.69L829.33 108.3C830.13 106.83 831.94 106.16 833.52 106.75L837.86 108.41L841.31 117.64L818.29 126.24ZM817.49 120.87L818.96 124.81L839.92 116.94L837.01 109.22L833.15 107.74C832.08 107.34 830.87 107.78 830.32 108.77L826.83 115.17C826.5 115.76 825.83 116.02 825.21 115.87L820.65 114.66C820.21 114.55 819.77 114.77 819.62 115.21L817.49 120.87Z" /><path fill-rule="evenodd" class="shp13" d="M825.1 108.48C823.81 108.48 822.6 107.71 822.12 106.42C821.49 104.77 822.34 102.96 823.96 102.34C825.58 101.71 827.41 102.56 828.04 104.18C828.66 105.83 827.82 107.63 826.2 108.26C825.83 108.41 825.47 108.48 825.1 108.48ZM825.1 103.26C824.84 103.26 824.62 103.3 824.36 103.41C823.3 103.81 822.74 104.99 823.15 106.05C823.55 107.12 824.73 107.67 825.8 107.27C826.86 106.86 827.41 105.69 827.01 104.62C826.72 103.77 825.94 103.26 825.1 103.26Z" /><g clip-path="url(#cp2)"><g ><g style="opacity: 0.412"><g style="opacity: 0.412"><g style="opacity: 0.412"><path class="shp1" d="M-58.53 84.76C-59.07 79.62 -59.21 74.49 -58.87 69.28C-57.38 45.08 -46.43 21.76 -29.46 4.86C-23.38 -1.16 -16.42 -6.7 -12.7 -14.41C-6.41 -27.46 -7.63 -41.99 0.35 -55.04C8.39 -68.02 20.49 -78.49 34.42 -84.24C75.99 -101.48 136.5 -80.25 133.79 -27.86C133.79 -27.66 133.79 -27.39 133.79 -27.05C133.66 -16.17 142.38 -7.51 152.99 -7.85C192.13 -9 227.28 20 236.41 58.53C242.29 83.34 236.07 111.19 219.03 129.85C206.32 143.78 188.68 152.02 170.97 157.97C135.41 169.87 97.56 173.99 60.17 172.17C25.23 170.41 -12.02 162.16 -35.89 136C-48.66 122.08 -56.5 103.76 -58.53 84.76Z" /></g></g></g><g style="opacity: 0.31"><path class="shp2" d="M241.14 17.23C241.21 18.92 242.63 20.2 244.32 20.13C246.01 20.07 247.22 18.58 247.16 16.89C247.09 15.2 245.67 13.92 243.98 13.98C242.36 14.12 241.07 15.54 241.14 17.23Z" /></g><path class="shp5" d="M-47.58 -19.82C-51.5 -8.46 -52.58 3.91 -50.01 15.61C-46.57 31.36 -34.8 45.21 -36.83 61.98C-38.05 72.05 -37.85 81.31 -38.05 91.18C-38.52 111.53 -24.33 128.36 -7.7 136.75C5.82 143.57 21.24 145.4 36.11 144.11C49.49 142.96 62.68 139.45 75.38 135.06C87.62 130.86 99.52 125.66 112.7 126.06C123.65 126.4 133.86 130.46 144.27 133.3C169.15 140.06 198.62 139.11 219.71 124.44C242.9 108.35 252.23 77.87 244.18 51.23C239.85 36.9 234.04 24.53 236.14 9.32C237.15 1.82 238.71 -5.82 237.29 -13.26C236 -20.09 232.22 -26.24 227.75 -31.58C215.79 -46.05 198.69 -55.24 180.98 -60.65C160.83 -66.8 138.52 -70.18 117.57 -66.93C76.94 -60.78 68.08 -66.73 25.56 -72.82C-2.9 -76.87 -29.67 -54.23 -42.58 -30.84C-44.54 -27.39 -46.23 -23.67 -47.58 -19.82Z" /><g style="opacity: 0.831"><path class="shp4" d="M-27.91 12.9C-22.03 5.2 -12.97 -0.08 -8.57 -8.93C-3.23 -19.55 -4.38 -32.12 0.35 -42.94C7.38 -58.96 20.02 -72.61 35.97 -80.12C43.61 -83.7 52.06 -85.93 60.24 -85.32C72.88 -84.37 83.77 -76.8 92.28 -67.81C104.99 -54.43 113.92 -35.43 129.19 -24.75C137.58 -18.87 147.45 -25.09 156.37 -27.12C166.44 -29.35 176.92 -28.81 186.52 -26.1C204.23 -21.03 219.51 -8.39 227.15 8.37C235.33 26.22 234.11 50.96 218.83 66.31C211.73 73.4 202.13 78.14 196.93 86.65C190.37 97.33 189.56 111.8 187.74 123.63C185.71 136.75 180.1 149.52 171.65 160.13C171.58 160.27 171.44 160.41 171.38 160.47C156.71 178.66 131.76 184.81 110.67 175.68L65.85 156.28C20.43 136.61 -14.12 104.91 -30.68 58.87C-34.26 48.93 -35.55 27.71 -31.02 17.97C-30.14 16.15 -29.06 14.46 -27.91 12.9Z" /></g><g style="opacity: 0.659"><g style="opacity: 0.659"><g style="opacity: 0.659"><path fill-rule="evenodd" class="shp8" d="M110.11 166.75L105.64 166.75C103.75 166.75 102.13 165.2 102.13 163.24L102.13 158.24C102.13 157.36 101.59 156.55 100.71 156.21C100.17 156.01 99.7 155.8 99.16 155.53C98.34 155.13 97.33 155.33 96.72 155.94L93.21 159.45C92.53 160.13 91.65 160.47 90.77 160.47C89.83 160.47 88.95 160.13 88.34 159.45L85.23 156.34C84.55 155.67 84.22 154.79 84.22 153.91C84.22 152.96 84.55 152.09 85.23 151.48L88.75 147.96C89.35 147.35 89.56 146.34 89.15 145.53C88.95 144.99 88.68 144.51 88.48 143.97C88.14 143.16 87.39 142.55 86.45 142.55L81.51 142.55C79.62 142.55 78 141 78 139.04L78 134.71C78 132.82 79.55 131.2 81.51 131.2L86.51 131.2C87.39 131.2 88.2 130.66 88.54 129.78C88.75 129.24 88.95 128.69 89.22 128.22C89.62 127.41 89.42 126.4 88.81 125.79L85.3 122.27C84.62 121.6 84.28 120.72 84.28 119.84C84.28 118.89 84.62 118.02 85.3 117.41L88.41 114.3C89.76 112.94 91.99 112.94 93.34 114.3L96.86 117.81C97.47 118.42 98.48 118.62 99.29 118.22C99.76 118.02 100.31 117.74 100.85 117.54C101.66 117.2 102.27 116.46 102.27 115.51L102.27 110.51C102.27 108.62 103.82 107 105.78 107L110.24 107C112.14 107 113.76 108.55 113.76 110.51L113.76 115.51C113.76 116.39 114.3 117.2 115.18 117.54C115.72 117.74 116.26 117.95 116.73 118.22C117.54 118.62 118.56 118.42 119.17 117.81L122.68 114.3C124.03 112.94 126.26 112.94 127.61 114.3L130.72 117.41C131.4 118.08 131.74 118.96 131.74 119.84C131.74 120.79 131.4 121.67 130.72 122.27L127.21 125.79C126.6 126.4 126.4 127.41 126.8 128.22C127.01 128.69 127.28 129.24 127.48 129.78C127.82 130.59 128.56 131.2 129.51 131.2L134.51 131.2C136.4 131.2 138.03 132.75 138.03 134.71L138.03 139.17C138.03 141.07 136.47 142.69 134.51 142.69L129.51 142.69C128.63 142.69 127.82 143.23 127.48 144.11C127.28 144.65 127.08 145.19 126.8 145.66C126.4 146.47 126.6 147.49 127.21 148.1L130.72 151.61C131.4 152.29 131.74 153.17 131.74 154.05C131.74 154.99 131.4 155.87 130.72 156.48L127.61 159.59C126.94 160.26 126.06 160.6 125.18 160.6C124.3 160.6 123.36 160.26 122.75 159.59L119.23 156.07C118.63 155.47 117.61 155.26 116.8 155.67C116.26 155.94 115.78 156.14 115.25 156.34C114.43 156.68 113.83 157.43 113.83 158.37L113.83 163.37C113.56 165.2 112 166.75 110.11 166.75ZM98.28 154.11C98.75 154.11 99.29 154.25 99.76 154.45C100.24 154.65 100.71 154.86 101.25 155.06C102.6 155.53 103.55 156.88 103.55 158.3L103.55 163.31C103.55 164.46 104.5 165.47 105.71 165.47L110.17 165.47C111.32 165.47 112.34 164.52 112.34 163.31L112.34 158.3C112.34 156.82 113.28 155.53 114.64 155.06C115.11 154.86 115.58 154.65 116.12 154.45C117.47 153.84 119.03 154.11 120.04 155.13L123.56 158.64C124.37 159.45 125.79 159.45 126.6 158.64L129.71 155.53C130.12 155.13 130.32 154.59 130.32 154.05C130.32 153.5 130.12 152.96 129.71 152.56L126.2 149.04C125.18 148.03 124.91 146.41 125.52 145.12C125.72 144.65 125.92 144.18 126.13 143.63C126.6 142.28 127.95 141.34 129.37 141.34L134.38 141.34C135.53 141.34 136.54 140.39 136.54 139.17L136.54 134.71C136.54 133.56 135.59 132.55 134.38 132.55L129.37 132.55C127.89 132.55 126.6 131.6 126.13 130.25C125.92 129.78 125.72 129.24 125.52 128.76C124.91 127.41 125.18 125.86 126.2 124.84L129.71 121.33C130.12 120.92 130.32 120.38 130.32 119.84C130.32 119.3 130.12 118.76 129.71 118.35L126.6 115.24C125.79 114.43 124.44 114.43 123.56 115.24L120.04 118.76C119.03 119.77 117.41 120.04 116.12 119.43C115.65 119.23 115.18 119.03 114.64 118.83C113.28 118.35 112.34 117 112.34 115.58L112.34 110.58C112.34 109.43 111.39 108.42 110.17 108.42L105.71 108.42C104.56 108.42 103.55 109.36 103.55 110.58L103.55 115.58C103.55 117.07 102.6 118.35 101.25 118.83C100.78 119.03 100.24 119.23 99.76 119.43C98.41 120.04 96.86 119.77 95.84 118.76L92.33 115.24C91.52 114.43 90.17 114.43 89.29 115.24L86.18 118.35C85.77 118.76 85.57 119.3 85.57 119.84C85.57 120.38 85.77 120.92 86.18 121.33L89.69 124.84C90.71 125.86 90.98 127.48 90.37 128.76C90.17 129.24 89.96 129.71 89.76 130.25C89.29 131.6 87.93 132.55 86.51 132.55L81.51 132.55C80.36 132.55 79.35 133.5 79.35 134.71L79.35 139.17C79.35 140.32 80.3 141.34 81.51 141.34L86.51 141.34C88 141.34 89.29 142.28 89.76 143.63C89.96 144.11 90.17 144.65 90.37 145.12C90.98 146.47 90.71 148.03 89.69 149.04L86.18 152.56C85.77 152.96 85.57 153.5 85.57 154.05C85.57 154.59 85.77 155.13 86.18 155.53L89.29 158.64C90.1 159.45 91.52 159.45 92.33 158.64L95.84 155.13C96.52 154.45 97.4 154.11 98.28 154.11ZM107.88 152.63C99.22 152.63 92.19 145.6 92.19 136.94C92.19 128.29 99.22 121.26 107.88 121.26C116.53 121.26 123.56 128.29 123.56 136.94C123.56 145.53 116.53 152.63 107.88 152.63ZM107.88 122.54C99.97 122.54 93.55 128.97 93.55 136.88C93.55 144.78 99.97 151.21 107.88 151.21C115.78 151.21 122.21 144.78 122.21 136.88C122.21 128.97 115.78 122.54 107.88 122.54Z" /></g></g></g><g style="opacity: 0.502"><path class="shp7" d="M171.21 55.27L162.43 55.27C162.02 55.27 161.75 55 161.75 54.59C161.75 54.18 162.02 53.91 162.43 53.91L171.21 53.91C171.62 53.91 171.89 54.18 171.89 54.59C171.89 55 171.62 55.27 171.21 55.27Z" /><path class="shp7" d="M171.21 69.8L162.43 69.8C162.02 69.8 161.75 69.53 161.75 69.12C161.75 68.72 162.02 68.45 162.43 68.45L171.21 68.45C171.62 68.45 171.89 68.72 171.89 69.12C171.89 69.53 171.62 69.8 171.21 69.8Z" /><g style="opacity: 0.812"><g style="opacity: 0.812"><g style="opacity: 0.812"><path fill-rule="evenodd" class="shp7" d="M177.43 84.47L123.83 84.47C122.81 84.47 122 83.66 122 82.64L122 37.83C122 36.81 122.81 36 123.83 36L177.43 36C178.45 36 179.26 36.81 179.26 37.83L179.26 82.64C179.32 83.66 178.45 84.47 177.43 84.47ZM123.89 37.35C123.62 37.35 123.42 37.55 123.42 37.83L123.42 82.64C123.42 82.91 123.62 83.12 123.89 83.12L177.5 83.12C177.77 83.12 177.97 82.91 177.97 82.64L177.97 37.83C177.97 37.55 177.77 37.35 177.5 37.35L123.89 37.35Z" /><path fill-rule="evenodd" class="shp8" d="M177.43 84.47L123.83 84.47C122.81 84.47 122 83.66 122 82.64L122 37.83C122 36.81 122.81 36 123.83 36L177.43 36C178.45 36 179.26 36.81 179.26 37.83L179.26 82.64C179.32 83.66 178.45 84.47 177.43 84.47ZM123.89 37.35C123.62 37.35 123.42 37.55 123.42 37.83L123.42 82.64C123.42 82.91 123.62 83.12 123.89 83.12L177.5 83.12C177.77 83.12 177.97 82.91 177.97 82.64L177.97 37.83C177.97 37.55 177.77 37.35 177.5 37.35L123.89 37.35Z" /></g></g><path class="shp7" d="M171.21 48.24L129.23 48.24C128.83 48.24 128.56 47.97 128.56 47.56C128.56 47.15 128.83 46.88 129.23 46.88L171.21 46.88C171.62 46.88 171.89 47.15 171.89 47.56C171.89 47.97 171.62 48.24 171.21 48.24Z" /><path class="shp7" d="M171.21 62.3L129.23 62.3C128.83 62.3 128.56 62.03 128.56 61.62C128.56 61.22 128.83 60.94 129.23 60.94L171.21 60.94C171.62 60.94 171.89 61.22 171.89 61.62C171.89 62.03 171.62 62.3 171.21 62.3Z" /><path class="shp7" d="M151.88 55.27L129.23 55.27C128.83 55.27 128.56 55 128.56 54.59C128.56 54.18 128.83 53.91 129.23 53.91L151.88 53.91C152.28 53.91 152.56 54.18 152.56 54.59C152.56 55 152.28 55.27 151.88 55.27Z" /><path class="shp7" d="M151.88 69.8L129.23 69.8C128.83 69.8 128.56 69.53 128.56 69.12C128.56 68.72 128.83 68.45 129.23 68.45L151.88 68.45C152.28 68.45 152.56 68.72 152.56 69.12C152.56 69.53 152.28 69.8 151.88 69.8Z" /><path class="shp7" d="M144.51 76.56L129.23 76.56C128.83 76.56 128.56 76.29 128.56 75.88C128.56 75.48 128.83 75.21 129.23 75.21L144.51 75.21C144.92 75.21 145.19 75.48 145.19 75.88C145.19 76.22 144.85 76.56 144.51 76.56Z" /></g></g><g style="opacity: 0.812"><path class="shp7" d="M75.7 18.7L65.7 18.7C65.29 18.7 65.02 18.43 65.02 18.02C65.02 17.62 65.29 17.35 65.7 17.35L75.7 17.35C76.11 17.35 76.38 17.62 76.38 18.02C76.38 18.36 76.11 18.7 75.7 18.7Z" /><path class="shp7" d="M75.7 35.13L65.7 35.13C65.29 35.13 65.02 34.86 65.02 34.45C65.02 34.04 65.29 33.77 65.7 33.77L75.7 33.77C76.11 33.77 76.38 34.04 76.38 34.45C76.38 34.86 76.11 35.13 75.7 35.13Z" /><g style="opacity: 0.812"><g style="opacity: 0.812"><g style="opacity: 0.812"><path fill-rule="evenodd" class="shp7" d="M82.94 51.76L21.83 51.76C20.81 51.76 20 50.94 20 49.93L20 -1.17C20 -2.19 20.81 -3 21.83 -3L82.94 -3C83.95 -3 84.76 -2.19 84.76 -1.17L84.76 49.93C84.76 50.94 83.95 51.76 82.94 51.76ZM21.83 -1.65C21.55 -1.65 21.35 -1.45 21.35 -1.17L21.35 49.93C21.35 50.2 21.55 50.4 21.83 50.4L82.94 50.4C83.21 50.4 83.41 50.2 83.41 49.93L83.41 -1.17C83.41 -1.45 83.21 -1.65 82.94 -1.65L21.83 -1.65Z" /><path fill-rule="evenodd" class="shp8" d="M82.94 51.76L21.83 51.76C20.81 51.76 20 50.94 20 49.93L20 -1.17C20 -2.19 20.81 -3 21.83 -3L82.94 -3C83.95 -3 84.76 -2.19 84.76 -1.17L84.76 49.93C84.76 50.94 83.95 51.76 82.94 51.76ZM21.83 -1.65C21.55 -1.65 21.35 -1.45 21.35 -1.17L21.35 49.93C21.35 50.2 21.55 50.4 21.83 50.4L82.94 50.4C83.21 50.4 83.41 50.2 83.41 49.93L83.41 -1.17C83.41 -1.45 83.21 -1.65 82.94 -1.65L21.83 -1.65Z" /></g></g><path class="shp7" d="M75.7 10.66L28.04 10.66C27.64 10.66 27.37 10.38 27.37 9.98C27.37 9.57 27.64 9.3 28.04 9.3L75.7 9.3C76.11 9.3 76.38 9.57 76.38 9.98C76.38 10.38 76.11 10.66 75.7 10.66Z" /><path class="shp7" d="M75.7 26.68L28.04 26.68C27.64 26.68 27.37 26.41 27.37 26C27.37 25.59 27.64 25.32 28.04 25.32L75.7 25.32C76.11 25.32 76.38 25.59 76.38 26C76.38 26.34 76.11 26.68 75.7 26.68Z" /><path class="shp7" d="M53.73 18.7L28.04 18.7C27.64 18.7 27.37 18.43 27.37 18.02C27.37 17.62 27.64 17.35 28.04 17.35L53.73 17.35C54.14 17.35 54.41 17.62 54.41 18.02C54.41 18.36 54.14 18.7 53.73 18.7Z" /><path class="shp7" d="M53.73 35.13L28.04 35.13C27.64 35.13 27.37 34.86 27.37 34.45C27.37 34.04 27.64 33.77 28.04 33.77L53.73 33.77C54.14 33.77 54.41 34.04 54.41 34.45C54.41 34.86 54.14 35.13 53.73 35.13Z" /><path class="shp7" d="M45.35 42.77L28.04 42.77C27.64 42.77 27.37 42.49 27.37 42.09C27.37 41.68 27.64 41.41 28.04 41.41L45.35 41.41C45.76 41.41 46.03 41.68 46.03 42.09C46.03 42.49 45.76 42.77 45.35 42.77Z" /></g></g><path fill-rule="evenodd" class="shp8" d="M130.11 24L126.89 24C125.53 24 124.46 22.89 124.46 21.57L124.46 17.95C124.46 17.29 124.05 16.67 123.39 16.42C123.02 16.3 122.65 16.13 122.28 15.97C121.66 15.68 120.92 15.8 120.43 16.3L117.87 18.85C117.42 19.3 116.8 19.55 116.14 19.55C115.48 19.55 114.87 19.3 114.41 18.85L112.15 16.59C111.2 15.64 111.2 14.07 112.15 13.13L114.7 10.57C115.2 10.08 115.32 9.34 115.03 8.72C114.87 8.35 114.7 7.98 114.58 7.61C114.33 6.99 113.71 6.54 113.06 6.54L109.43 6.54C108.07 6.54 107 5.42 107 4.11L107 0.89C107 -0.47 108.11 -1.54 109.43 -1.54L113.06 -1.54C113.71 -1.54 114.33 -1.95 114.58 -2.61C114.7 -2.98 114.87 -3.35 115.03 -3.72C115.32 -4.34 115.2 -5.08 114.7 -5.57L112.15 -8.13C111.2 -9.07 111.2 -10.64 112.15 -11.59L114.41 -13.85C115.36 -14.8 116.93 -14.8 117.87 -13.85L120.43 -11.3C120.92 -10.8 121.66 -10.68 122.28 -10.97C122.65 -11.13 123.02 -11.3 123.39 -11.42C124.01 -11.67 124.46 -12.29 124.46 -12.95L124.46 -16.57C124.46 -17.93 125.58 -19 126.89 -19L130.11 -19C131.47 -19 132.54 -17.89 132.54 -16.57L132.54 -12.95C132.54 -12.29 132.95 -11.67 133.61 -11.42C133.98 -11.3 134.35 -11.13 134.72 -10.97C135.34 -10.68 136.08 -10.8 136.57 -11.3L139.13 -13.85C140.07 -14.8 141.64 -14.8 142.59 -13.85L144.85 -11.59C145.8 -10.64 145.8 -9.07 144.85 -8.13L142.3 -5.57C141.8 -5.08 141.68 -4.34 141.97 -3.72C142.13 -3.35 142.3 -2.98 142.42 -2.61C142.67 -1.99 143.29 -1.54 143.94 -1.54L147.57 -1.54C148.93 -1.54 150 -0.42 150 0.89L150 4.11C150 5.47 148.89 6.54 147.57 6.54L143.94 6.54C143.29 6.54 142.67 6.95 142.42 7.61C142.3 7.98 142.13 8.35 141.97 8.72C141.68 9.34 141.8 10.08 142.3 10.57L144.85 13.13C145.8 14.07 145.8 15.64 144.85 16.59L142.59 18.85C142.13 19.3 141.51 19.55 140.86 19.55C140.2 19.55 139.58 19.3 139.13 18.85L136.57 16.3C136.08 15.8 135.34 15.68 134.72 15.97C134.35 16.13 133.98 16.3 133.61 16.42C132.99 16.67 132.54 17.29 132.54 17.95L132.54 21.57C132.58 22.89 131.47 24 130.11 24ZM121.58 14.98C121.95 14.98 122.28 15.06 122.61 15.23C122.94 15.39 123.31 15.52 123.68 15.68C124.63 16.05 125.29 16.96 125.29 17.99L125.29 21.61C125.29 22.52 126.03 23.22 126.89 23.22L130.11 23.22C131.01 23.22 131.71 22.48 131.71 21.61L131.71 17.99C131.71 16.96 132.37 16.05 133.32 15.68C133.69 15.56 134.02 15.39 134.39 15.23C135.34 14.77 136.45 14.98 137.15 15.72L139.7 18.27C140.32 18.89 141.35 18.89 142.01 18.27L144.28 16.01C144.89 15.39 144.89 14.36 144.28 13.7L141.72 11.15C140.98 10.41 140.81 9.3 141.23 8.39C141.39 8.06 141.56 7.69 141.68 7.32C142.05 6.37 142.96 5.71 143.99 5.71L147.61 5.71C148.52 5.71 149.22 4.97 149.22 4.11L149.22 0.89C149.22 -0.01 148.48 -0.71 147.61 -0.71L143.99 -0.71C142.96 -0.71 142.05 -1.37 141.68 -2.32C141.56 -2.69 141.39 -3.02 141.23 -3.39C140.77 -4.34 140.98 -5.45 141.72 -6.15L144.28 -8.7C144.89 -9.32 144.89 -10.35 144.28 -11.01L142.01 -13.27C141.39 -13.89 140.36 -13.89 139.7 -13.27L137.15 -10.72C136.41 -9.98 135.3 -9.82 134.39 -10.23C134.06 -10.39 133.69 -10.56 133.32 -10.68C132.37 -11.05 131.71 -11.96 131.71 -12.99L131.71 -16.61C131.71 -17.52 130.97 -18.22 130.11 -18.22L126.89 -18.22C125.99 -18.22 125.29 -17.48 125.29 -16.61L125.29 -12.99C125.29 -11.96 124.63 -11.05 123.68 -10.68C123.31 -10.56 122.98 -10.39 122.61 -10.23C121.66 -9.77 120.55 -9.98 119.85 -10.72L117.3 -13.27C116.68 -13.89 115.65 -13.89 114.99 -13.27L112.72 -11.01C112.11 -10.39 112.11 -9.36 112.72 -8.7L115.28 -6.15C116.02 -5.41 116.19 -4.3 115.77 -3.39C115.61 -3.06 115.48 -2.69 115.32 -2.32C114.95 -1.37 114.04 -0.71 113.01 -0.71L109.39 -0.71C108.48 -0.71 107.78 0.03 107.78 0.89L107.78 4.11C107.78 5.01 108.52 5.71 109.39 5.71L113.01 5.71C114.04 5.71 114.95 6.37 115.32 7.32C115.44 7.69 115.61 8.02 115.77 8.39C116.23 9.34 116.02 10.45 115.28 11.15L112.72 13.7C112.11 14.32 112.11 15.35 112.72 16.01L114.99 18.27C115.61 18.89 116.64 18.89 117.3 18.27L119.85 15.72C120.3 15.23 120.92 14.98 121.58 14.98ZM128.5 13.74C122.28 13.74 117.17 8.68 117.17 2.46C117.17 -3.76 122.24 -8.87 128.5 -8.87C134.72 -8.87 139.83 -3.8 139.83 2.46C139.83 8.68 134.76 13.74 128.5 13.74ZM128.5 -8.04C122.73 -8.04 118 -3.35 118 2.46C118 8.23 122.69 12.92 128.5 12.92C134.27 12.92 139 8.23 139 2.46C139 -3.35 134.31 -8.04 128.5 -8.04Z" /></g></g></g></g></svg>
res/js/jquery.knob.js CHANGED
@@ -707,10 +707,10 @@
707
  this.o.displayInput
708
  && this.i.css({
709
  'width' : ((this.w / 2 + 4) >> 0) + 'px',
710
- 'height' : ((this.w / 3) >> 0) + 'px',
711
  'position' : 'absolute',
712
  'vertical-align' : 'middle',
713
- 'margin-top' : ((this.w / 3) >> 0) + 'px',
714
  'margin-left' : '-' + ((this.w * 3 / 4 + 2) >> 0) + 'px',
715
  'border' : 0,
716
  'background' : 'none',
707
  this.o.displayInput
708
  && this.i.css({
709
  'width' : ((this.w / 2 + 4) >> 0) + 'px',
710
+ 'height' : ((this.w / 2) >> 0) + 'px',
711
  'position' : 'absolute',
712
  'vertical-align' : 'middle',
713
+ 'margin-top' : ((this.w / 4) >> 0) + 'px',
714
  'margin-left' : '-' + ((this.w * 3 / 4 + 2) >> 0) + 'px',
715
  'border' : 0,
716
  'background' : 'none',
res/js/jquery.knob.min.js CHANGED
@@ -1,2 +1,2 @@
1
  /*!jQuery Knob*/
2
- (function(a){if(typeof exports==="object"){module.exports=a(require("jquery"))}else{if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}}(function(d){var b={},a=Math.max,c=Math.min;b.c={};b.c.d=d(document);b.c.t=function(f){return f.originalEvent.touches.length-1};b.o=function(){var e=this;this.o=null;this.$=null;this.i=null;this.g=null;this.v=null;this.cv=null;this.x=0;this.y=0;this.w=0;this.h=0;this.$c=null;this.c=null;this.t=0;this.isInit=false;this.fgColor=null;this.pColor=null;this.dH=null;this.cH=null;this.eH=null;this.rH=null;this.scale=1;this.relative=false;this.relativeWidth=false;this.relativeHeight=false;this.$div=null;this.run=function(){var f=function(i,h){var g;for(g in h){e.o[g]=h[g]}e._carve().init();e._configure()._draw()};if(this.$.data("kontroled")){return}this.$.data("kontroled",true);this.extend();this.o=d.extend({min:this.$.data("min")!==undefined?this.$.data("min"):0,max:this.$.data("max")!==undefined?this.$.data("max"):100,stopper:true,readOnly:this.$.data("readonly")||(this.$.attr("readonly")==="readonly"),cursor:this.$.data("cursor")===true&&30||this.$.data("cursor")||0,thickness:this.$.data("thickness")&&Math.max(Math.min(this.$.data("thickness"),1),0.01)||0.35,lineCap:this.$.data("linecap")||"butt",width:this.$.data("width")||200,height:this.$.data("height")||200,displayInput:this.$.data("displayinput")==null||this.$.data("displayinput"),displayPrevious:this.$.data("displayprevious"),fgColor:this.$.data("fgcolor")||"#87CEEB",inputColor:this.$.data("inputcolor"),font:this.$.data("font")||"Arial",fontWeight:this.$.data("font-weight")||"bold",inline:false,step:this.$.data("step")||1,rotation:this.$.data("rotation"),draw:null,change:null,cancel:null,release:null,format:function(g){return g},parse:function(g){return parseFloat(g)}},this.o);this.o.flip=this.o.rotation==="anticlockwise"||this.o.rotation==="acw";if(!this.o.inputColor){this.o.inputColor=this.o.fgColor}if(this.$.is("fieldset")){this.v={};this.i=this.$.find("input");this.i.each(function(g){var h=d(this);e.i[g]=h;e.v[g]=e.o.parse(h.val());h.bind("change blur",function(){var i={};i[g]=h.val();e.val(e._validate(i))})});this.$.find("legend").remove()}else{this.i=this.$;this.v=this.o.parse(this.$.val());this.v===""&&(this.v=this.o.min);this.$.bind("change blur",function(){e.val(e._validate(e.o.parse(e.$.val())))})}!this.o.displayInput&&this.$.hide();this.$c=d(document.createElement("canvas")).attr({width:this.o.width,height:this.o.height});this.$div=d('<div style="'+(this.o.inline?"display:inline;":"")+"width:"+this.o.width+"px;height:"+this.o.height+'px;"></div>');this.$.wrap(this.$div).before(this.$c);this.$div=this.$.parent();if(typeof G_vmlCanvasManager!=="undefined"){G_vmlCanvasManager.initElement(this.$c[0])}this.c=this.$c[0].getContext?this.$c[0].getContext("2d"):null;if(!this.c){throw {name:"CanvasNotSupportedException",message:"Canvas not supported. Please use excanvas on IE8.0.",toString:function(){return this.name+": "+this.message}}}this.scale=(window.devicePixelRatio||1)/(this.c.webkitBackingStorePixelRatio||this.c.mozBackingStorePixelRatio||this.c.msBackingStorePixelRatio||this.c.oBackingStorePixelRatio||this.c.backingStorePixelRatio||1);this.relativeWidth=this.o.width%1!==0&&this.o.width.indexOf("%");this.relativeHeight=this.o.height%1!==0&&this.o.height.indexOf("%");this.relative=this.relativeWidth||this.relativeHeight;this._carve();if(this.v instanceof Object){this.cv={};this.copy(this.v,this.cv)}else{this.cv=this.v}this.$.bind("configure",f).parent().bind("configure",f);this._listen()._configure()._xy().init();this.isInit=true;this.$.val(this.o.format(this.v));this._draw();return this};this._carve=function(){if(this.relative){var f=this.relativeWidth?this.$div.parent().width()*parseInt(this.o.width)/100:this.$div.parent().width(),g=this.relativeHeight?this.$div.parent().height()*parseInt(this.o.height)/100:this.$div.parent().height();this.w=this.h=Math.min(f,g)}else{this.w=this.o.width;this.h=this.o.height}this.$div.css({width:this.w+"px",height:this.h+"px"});this.$c.attr({width:this.w,height:this.h});if(this.scale!==1){this.$c[0].width=this.$c[0].width*this.scale;this.$c[0].height=this.$c[0].height*this.scale;this.$c.width(this.w);this.$c.height(this.h)}return this};this._draw=function(){var f=true;e.g=e.c;e.clear();e.dH&&(f=e.dH());f!==false&&e.draw()};this._touch=function(f){var g=function(i){var h=e.xy2val(i.originalEvent.touches[e.t].pageX,i.originalEvent.touches[e.t].pageY);if(h==e.cv){return}if(e.cH&&e.cH(h)===false){return}e.change(e._validate(h));e._draw()};this.t=b.c.t(f);g(f);b.c.d.bind("touchmove.k",g).bind("touchend.k",function(){b.c.d.unbind("touchmove.k touchend.k");e.val(e.cv)});return this};this._mouse=function(g){var f=function(i){var h=e.xy2val(i.pageX,i.pageY);if(h==e.cv){return}if(e.cH&&(e.cH(h)===false)){return}e.change(e._validate(h));e._draw()};f(g);b.c.d.bind("mousemove.k",f).bind("keyup.k",function(h){if(h.keyCode===27){b.c.d.unbind("mouseup.k mousemove.k keyup.k");if(e.eH&&e.eH()===false){return}e.cancel()}}).bind("mouseup.k",function(h){b.c.d.unbind("mousemove.k mouseup.k keyup.k");e.val(e.cv)});return this};this._xy=function(){var f=this.$c.offset();this.x=f.left;this.y=f.top;return this};this._listen=function(){if(!this.o.readOnly){this.$c.bind("mousedown",function(f){f.preventDefault();e._xy()._mouse(f)}).bind("touchstart",function(f){f.preventDefault();e._xy()._touch(f)});this.listen()}else{this.$.attr("readonly","readonly")}if(this.relative){d(window).resize(function(){e._carve().init();e._draw()})}return this};this._configure=function(){if(this.o.draw){this.dH=this.o.draw}if(this.o.change){this.cH=this.o.change}if(this.o.cancel){this.eH=this.o.cancel}if(this.o.release){this.rH=this.o.release}if(this.o.displayPrevious){this.pColor=this.h2rgba(this.o.fgColor,"0.4");this.fgColor=this.h2rgba(this.o.fgColor,"0.6")}else{this.fgColor=this.o.fgColor}return this};this._clear=function(){this.$c[0].width=this.$c[0].width};this._validate=function(f){var g=(~~(((f<0)?-0.5:0.5)+(f/this.o.step)))*this.o.step;return Math.round(g*100)/100};this.listen=function(){};this.extend=function(){};this.init=function(){};this.change=function(f){};this.val=function(f){};this.xy2val=function(f,g){};this.draw=function(){};this.clear=function(){this._clear()};this.h2rgba=function(i,f){var g;i=i.substring(1,7);g=[parseInt(i.substring(0,2),16),parseInt(i.substring(2,4),16),parseInt(i.substring(4,6),16)];return"rgba("+g[0]+","+g[1]+","+g[2]+","+f+")"};this.copy=function(j,h){for(var g in j){h[g]=j[g]}}};b.Dial=function(){b.o.call(this);this.startAngle=null;this.xy=null;this.radius=null;this.lineWidth=null;this.cursorExt=null;this.w2=null;this.PI2=2*Math.PI;this.extend=function(){this.o=d.extend({bgColor:this.$.data("bgcolor")||"#EEEEEE",angleOffset:this.$.data("angleoffset")||0,angleArc:this.$.data("anglearc")||360,inline:true},this.o)};this.val=function(e,f){if(null!=e){e=this.o.parse(e);if(f!==false&&e!=this.v&&this.rH&&this.rH(e)===false){return}this.cv=this.o.stopper?a(c(e,this.o.max),this.o.min):e;this.v=this.cv;this.$.val(this.o.format(this.v));this._draw()}else{return this.v}};this.xy2val=function(e,h){var f,g;f=Math.atan2(e-(this.x+this.w2),-(h-this.y-this.w2))-this.angleOffset;if(this.o.flip){f=this.angleArc-f-this.PI2}if(this.angleArc!=this.PI2&&(f<0)&&(f>-0.5)){f=0}else{if(f<0){f+=this.PI2}}g=(f*(this.o.max-this.o.min)/this.angleArc)+this.o.min;this.o.stopper&&(g=a(c(g,this.o.max),this.o.min));return g};this.listen=function(){var h=this,g,f,l=function(q){q.preventDefault();var p=q.originalEvent,n=p.detail||p.wheelDeltaX,m=p.detail||p.wheelDeltaY,o=h._validate(h.o.parse(h.$.val()))+(n>0||m>0?h.o.step:n<0||m<0?-h.o.step:0);o=a(c(o,h.o.max),h.o.min);h.val(o,false);if(h.rH){clearTimeout(g);g=setTimeout(function(){h.rH(o);g=null},100);if(!f){f=setTimeout(function(){if(g){h.rH(o)}f=null},200)}}},j,k,e=1,i={37:-h.o.step,38:h.o.step,39:h.o.step,40:-h.o.step};this.$.bind("keydown",function(o){var n=o.keyCode;if(n>=96&&n<=105){n=o.keyCode=n-48}j=parseInt(String.fromCharCode(n));if(isNaN(j)){(n!==13)&&n!==8&&n!==9&&n!==189&&(n!==190||h.$.val().match(/\./))&&o.preventDefault();if(d.inArray(n,[37,38,39,40])>-1){o.preventDefault();var m=h.o.parse(h.$.val())+i[n]*e;h.o.stopper&&(m=a(c(m,h.o.max),h.o.min));h.change(h._validate(m));h._draw();k=window.setTimeout(function(){e*=2},30)}}}).bind("keyup",function(m){if(isNaN(j)){if(k){window.clearTimeout(k);k=null;e=1;h.val(h.$.val())}}else{(h.$.val()>h.o.max&&h.$.val(h.o.max))||(h.$.val()<h.o.min&&h.$.val(h.o.min))}});this.$c.bind("mousewheel DOMMouseScroll",l);this.$.bind("mousewheel DOMMouseScroll",l)};this.init=function(){if(this.v<this.o.min||this.v>this.o.max){this.v=this.o.min}this.$.val(this.v);this.w2=this.w/2;this.cursorExt=this.o.cursor/100;this.xy=this.w2*this.scale;this.lineWidth=this.xy*this.o.thickness;this.lineCap=this.o.lineCap;this.radius=this.xy-this.lineWidth/2;this.o.angleOffset&&(this.o.angleOffset=isNaN(this.o.angleOffset)?0:this.o.angleOffset);this.o.angleArc&&(this.o.angleArc=isNaN(this.o.angleArc)?this.PI2:this.o.angleArc);this.angleOffset=this.o.angleOffset*Math.PI/180;this.angleArc=this.o.angleArc*Math.PI/180;this.startAngle=1.5*Math.PI+this.angleOffset;this.endAngle=1.5*Math.PI+this.angleOffset+this.angleArc;var e=a(String(Math.abs(this.o.max)).length,String(Math.abs(this.o.min)).length,2)+2;this.o.displayInput&&this.i.css({width:((this.w/2+4)>>0)+"px",height:((this.w/3)>>0)+"px",position:"absolute","vertical-align":"middle","margin-top":((this.w/3)>>0)+"px","margin-left":"-"+((this.w*3/4+2)>>0)+"px",border:0,background:"none",font:this.o.fontWeight+" "+((this.w/e)>>0)+"px "+this.o.font,"text-align":"center",color:this.o.inputColor||this.o.fgColor,padding:"0px","-webkit-appearance":"none"})||this.i.css({width:"0px",visibility:"hidden"})};this.change=function(e){this.cv=e;this.$.val(this.o.format(e))};this.angle=function(e){return(e-this.o.min)*this.angleArc/(this.o.max-this.o.min)};this.arc=function(f){var e,g;f=this.angle(f);if(this.o.flip){e=this.endAngle+0.00001;g=e-f-0.00001}else{e=this.startAngle-0.00001;g=e+f+0.00001}this.o.cursor&&(e=g-this.cursorExt)&&(g=g+this.cursorExt);return{s:e,e:g,d:this.o.flip&&!this.o.cursor}};this.draw=function(){var h=this.g,e=this.arc(this.cv),f,g=1;h.lineWidth=this.lineWidth;h.lineCap=this.lineCap;if(this.o.bgColor!=="none"){h.beginPath();h.strokeStyle=this.o.bgColor;h.arc(this.xy,this.xy,this.radius,this.endAngle-0.00001,this.startAngle+0.00001,true);h.stroke()}if(this.o.displayPrevious){f=this.arc(this.v);h.beginPath();h.strokeStyle=this.pColor;h.arc(this.xy,this.xy,this.radius,f.s,f.e,f.d);h.stroke();g=this.cv==this.v}h.beginPath();h.strokeStyle=g?this.o.fgColor:this.fgColor;h.arc(this.xy,this.xy,this.radius,e.s,e.e,e.d);h.stroke()};this.cancel=function(){this.val(this.v)}};d.fn.dial=d.fn.knob=function(e){return this.each(function(){var f=new b.Dial();f.o=e;f.$=d(this);f.run()}).parent()}}));
1
  /*!jQuery Knob*/
2
+ (function(a){if(typeof exports==="object"){module.exports=a(require("jquery"))}else{if(typeof define==="function"&&define.amd){define(["jquery"],a)}else{a(jQuery)}}}(function(d){var b={},a=Math.max,c=Math.min;b.c={};b.c.d=d(document);b.c.t=function(f){return f.originalEvent.touches.length-1};b.o=function(){var e=this;this.o=null;this.$=null;this.i=null;this.g=null;this.v=null;this.cv=null;this.x=0;this.y=0;this.w=0;this.h=0;this.$c=null;this.c=null;this.t=0;this.isInit=false;this.fgColor=null;this.pColor=null;this.dH=null;this.cH=null;this.eH=null;this.rH=null;this.scale=1;this.relative=false;this.relativeWidth=false;this.relativeHeight=false;this.$div=null;this.run=function(){var f=function(i,h){var g;for(g in h){e.o[g]=h[g]}e._carve().init();e._configure()._draw()};if(this.$.data("kontroled")){return}this.$.data("kontroled",true);this.extend();this.o=d.extend({min:this.$.data("min")!==undefined?this.$.data("min"):0,max:this.$.data("max")!==undefined?this.$.data("max"):100,stopper:true,readOnly:this.$.data("readonly")||(this.$.attr("readonly")==="readonly"),cursor:this.$.data("cursor")===true&&30||this.$.data("cursor")||0,thickness:this.$.data("thickness")&&Math.max(Math.min(this.$.data("thickness"),1),0.01)||0.35,lineCap:this.$.data("linecap")||"butt",width:this.$.data("width")||200,height:this.$.data("height")||200,displayInput:this.$.data("displayinput")==null||this.$.data("displayinput"),displayPrevious:this.$.data("displayprevious"),fgColor:this.$.data("fgcolor")||"#87CEEB",inputColor:this.$.data("inputcolor"),font:this.$.data("font")||"Arial",fontWeight:this.$.data("font-weight")||"bold",inline:false,step:this.$.data("step")||1,rotation:this.$.data("rotation"),draw:null,change:null,cancel:null,release:null,format:function(g){return g},parse:function(g){return parseFloat(g)}},this.o);this.o.flip=this.o.rotation==="anticlockwise"||this.o.rotation==="acw";if(!this.o.inputColor){this.o.inputColor=this.o.fgColor}if(this.$.is("fieldset")){this.v={};this.i=this.$.find("input");this.i.each(function(g){var h=d(this);e.i[g]=h;e.v[g]=e.o.parse(h.val());h.bind("change blur",function(){var i={};i[g]=h.val();e.val(e._validate(i))})});this.$.find("legend").remove()}else{this.i=this.$;this.v=this.o.parse(this.$.val());this.v===""&&(this.v=this.o.min);this.$.bind("change blur",function(){e.val(e._validate(e.o.parse(e.$.val())))})}!this.o.displayInput&&this.$.hide();this.$c=d(document.createElement("canvas")).attr({width:this.o.width,height:this.o.height});this.$div=d('<div style="'+(this.o.inline?"display:inline;":"")+"width:"+this.o.width+"px;height:"+this.o.height+'px;"></div>');this.$.wrap(this.$div).before(this.$c);this.$div=this.$.parent();if(typeof G_vmlCanvasManager!=="undefined"){G_vmlCanvasManager.initElement(this.$c[0])}this.c=this.$c[0].getContext?this.$c[0].getContext("2d"):null;if(!this.c){throw {name:"CanvasNotSupportedException",message:"Canvas not supported. Please use excanvas on IE8.0.",toString:function(){return this.name+": "+this.message}}}this.scale=(window.devicePixelRatio||1)/(this.c.webkitBackingStorePixelRatio||this.c.mozBackingStorePixelRatio||this.c.msBackingStorePixelRatio||this.c.oBackingStorePixelRatio||this.c.backingStorePixelRatio||1);this.relativeWidth=this.o.width%1!==0&&this.o.width.indexOf("%");this.relativeHeight=this.o.height%1!==0&&this.o.height.indexOf("%");this.relative=this.relativeWidth||this.relativeHeight;this._carve();if(this.v instanceof Object){this.cv={};this.copy(this.v,this.cv)}else{this.cv=this.v}this.$.bind("configure",f).parent().bind("configure",f);this._listen()._configure()._xy().init();this.isInit=true;this.$.val(this.o.format(this.v));this._draw();return this};this._carve=function(){if(this.relative){var f=this.relativeWidth?this.$div.parent().width()*parseInt(this.o.width)/100:this.$div.parent().width(),g=this.relativeHeight?this.$div.parent().height()*parseInt(this.o.height)/100:this.$div.parent().height();this.w=this.h=Math.min(f,g)}else{this.w=this.o.width;this.h=this.o.height}this.$div.css({width:this.w+"px",height:this.h+"px"});this.$c.attr({width:this.w,height:this.h});if(this.scale!==1){this.$c[0].width=this.$c[0].width*this.scale;this.$c[0].height=this.$c[0].height*this.scale;this.$c.width(this.w);this.$c.height(this.h)}return this};this._draw=function(){var f=true;e.g=e.c;e.clear();e.dH&&(f=e.dH());f!==false&&e.draw()};this._touch=function(f){var g=function(i){var h=e.xy2val(i.originalEvent.touches[e.t].pageX,i.originalEvent.touches[e.t].pageY);if(h==e.cv){return}if(e.cH&&e.cH(h)===false){return}e.change(e._validate(h));e._draw()};this.t=b.c.t(f);g(f);b.c.d.bind("touchmove.k",g).bind("touchend.k",function(){b.c.d.unbind("touchmove.k touchend.k");e.val(e.cv)});return this};this._mouse=function(g){var f=function(i){var h=e.xy2val(i.pageX,i.pageY);if(h==e.cv){return}if(e.cH&&(e.cH(h)===false)){return}e.change(e._validate(h));e._draw()};f(g);b.c.d.bind("mousemove.k",f).bind("keyup.k",function(h){if(h.keyCode===27){b.c.d.unbind("mouseup.k mousemove.k keyup.k");if(e.eH&&e.eH()===false){return}e.cancel()}}).bind("mouseup.k",function(h){b.c.d.unbind("mousemove.k mouseup.k keyup.k");e.val(e.cv)});return this};this._xy=function(){var f=this.$c.offset();this.x=f.left;this.y=f.top;return this};this._listen=function(){if(!this.o.readOnly){this.$c.bind("mousedown",function(f){f.preventDefault();e._xy()._mouse(f)}).bind("touchstart",function(f){f.preventDefault();e._xy()._touch(f)});this.listen()}else{this.$.attr("readonly","readonly")}if(this.relative){d(window).resize(function(){e._carve().init();e._draw()})}return this};this._configure=function(){if(this.o.draw){this.dH=this.o.draw}if(this.o.change){this.cH=this.o.change}if(this.o.cancel){this.eH=this.o.cancel}if(this.o.release){this.rH=this.o.release}if(this.o.displayPrevious){this.pColor=this.h2rgba(this.o.fgColor,"0.4");this.fgColor=this.h2rgba(this.o.fgColor,"0.6")}else{this.fgColor=this.o.fgColor}return this};this._clear=function(){this.$c[0].width=this.$c[0].width};this._validate=function(f){var g=(~~(((f<0)?-0.5:0.5)+(f/this.o.step)))*this.o.step;return Math.round(g*100)/100};this.listen=function(){};this.extend=function(){};this.init=function(){};this.change=function(f){};this.val=function(f){};this.xy2val=function(f,g){};this.draw=function(){};this.clear=function(){this._clear()};this.h2rgba=function(i,f){var g;i=i.substring(1,7);g=[parseInt(i.substring(0,2),16),parseInt(i.substring(2,4),16),parseInt(i.substring(4,6),16)];return"rgba("+g[0]+","+g[1]+","+g[2]+","+f+")"};this.copy=function(j,h){for(var g in j){h[g]=j[g]}}};b.Dial=function(){b.o.call(this);this.startAngle=null;this.xy=null;this.radius=null;this.lineWidth=null;this.cursorExt=null;this.w2=null;this.PI2=2*Math.PI;this.extend=function(){this.o=d.extend({bgColor:this.$.data("bgcolor")||"#EEEEEE",angleOffset:this.$.data("angleoffset")||0,angleArc:this.$.data("anglearc")||360,inline:true},this.o)};this.val=function(e,f){if(null!=e){e=this.o.parse(e);if(f!==false&&e!=this.v&&this.rH&&this.rH(e)===false){return}this.cv=this.o.stopper?a(c(e,this.o.max),this.o.min):e;this.v=this.cv;this.$.val(this.o.format(this.v));this._draw()}else{return this.v}};this.xy2val=function(e,h){var f,g;f=Math.atan2(e-(this.x+this.w2),-(h-this.y-this.w2))-this.angleOffset;if(this.o.flip){f=this.angleArc-f-this.PI2}if(this.angleArc!=this.PI2&&(f<0)&&(f>-0.5)){f=0}else{if(f<0){f+=this.PI2}}g=(f*(this.o.max-this.o.min)/this.angleArc)+this.o.min;this.o.stopper&&(g=a(c(g,this.o.max),this.o.min));return g};this.listen=function(){var h=this,g,f,l=function(q){q.preventDefault();var p=q.originalEvent,n=p.detail||p.wheelDeltaX,m=p.detail||p.wheelDeltaY,o=h._validate(h.o.parse(h.$.val()))+(n>0||m>0?h.o.step:n<0||m<0?-h.o.step:0);o=a(c(o,h.o.max),h.o.min);h.val(o,false);if(h.rH){clearTimeout(g);g=setTimeout(function(){h.rH(o);g=null},100);if(!f){f=setTimeout(function(){if(g){h.rH(o)}f=null},200)}}},j,k,e=1,i={37:-h.o.step,38:h.o.step,39:h.o.step,40:-h.o.step};this.$.bind("keydown",function(o){var n=o.keyCode;if(n>=96&&n<=105){n=o.keyCode=n-48}j=parseInt(String.fromCharCode(n));if(isNaN(j)){(n!==13)&&n!==8&&n!==9&&n!==189&&(n!==190||h.$.val().match(/\./))&&o.preventDefault();if(d.inArray(n,[37,38,39,40])>-1){o.preventDefault();var m=h.o.parse(h.$.val())+i[n]*e;h.o.stopper&&(m=a(c(m,h.o.max),h.o.min));h.change(h._validate(m));h._draw();k=window.setTimeout(function(){e*=2},30)}}}).bind("keyup",function(m){if(isNaN(j)){if(k){window.clearTimeout(k);k=null;e=1;h.val(h.$.val())}}else{(h.$.val()>h.o.max&&h.$.val(h.o.max))||(h.$.val()<h.o.min&&h.$.val(h.o.min))}});this.$c.bind("mousewheel DOMMouseScroll",l);this.$.bind("mousewheel DOMMouseScroll",l)};this.init=function(){if(this.v<this.o.min||this.v>this.o.max){this.v=this.o.min}this.$.val(this.v);this.w2=this.w/2;this.cursorExt=this.o.cursor/100;this.xy=this.w2*this.scale;this.lineWidth=this.xy*this.o.thickness;this.lineCap=this.o.lineCap;this.radius=this.xy-this.lineWidth/2;this.o.angleOffset&&(this.o.angleOffset=isNaN(this.o.angleOffset)?0:this.o.angleOffset);this.o.angleArc&&(this.o.angleArc=isNaN(this.o.angleArc)?this.PI2:this.o.angleArc);this.angleOffset=this.o.angleOffset*Math.PI/180;this.angleArc=this.o.angleArc*Math.PI/180;this.startAngle=1.5*Math.PI+this.angleOffset;this.endAngle=1.5*Math.PI+this.angleOffset+this.angleArc;var e=a(String(Math.abs(this.o.max)).length,String(Math.abs(this.o.min)).length,2)+2;this.o.displayInput&&this.i.css({width:((this.w/2+4)>>0)+"px",height:((this.w/2)>>0)+"px",position:"absolute","vertical-align":"middle","margin-top":((this.w/4)>>0)+"px","margin-left":"-"+((this.w*3/4+2)>>0)+"px",border:0,background:"none",font:this.o.fontWeight+" "+((this.w/e)>>0)+"px "+this.o.font,"text-align":"center",color:this.o.inputColor||this.o.fgColor,padding:"0px","-webkit-appearance":"none"})||this.i.css({width:"0px",visibility:"hidden"})};this.change=function(e){this.cv=e;this.$.val(this.o.format(e))};this.angle=function(e){return(e-this.o.min)*this.angleArc/(this.o.max-this.o.min)};this.arc=function(f){var e,g;f=this.angle(f);if(this.o.flip){e=this.endAngle+0.00001;g=e-f-0.00001}else{e=this.startAngle-0.00001;g=e+f+0.00001}this.o.cursor&&(e=g-this.cursorExt)&&(g=g+this.cursorExt);return{s:e,e:g,d:this.o.flip&&!this.o.cursor}};this.draw=function(){var h=this.g,e=this.arc(this.cv),f,g=1;h.lineWidth=this.lineWidth;h.lineCap=this.lineCap;if(this.o.bgColor!=="none"){h.beginPath();h.strokeStyle=this.o.bgColor;h.arc(this.xy,this.xy,this.radius,this.endAngle-0.00001,this.startAngle+0.00001,true);h.stroke()}if(this.o.displayPrevious){f=this.arc(this.v);h.beginPath();h.strokeStyle=this.pColor;h.arc(this.xy,this.xy,this.radius,f.s,f.e,f.d);h.stroke();g=this.cv==this.v}h.beginPath();h.strokeStyle=g?this.o.fgColor:this.fgColor;h.arc(this.xy,this.xy,this.radius,e.s,e.e,e.d);h.stroke()};this.cancel=function(){this.val(this.v)}};d.fn.dial=d.fn.knob=function(e){return this.each(function(){var f=new b.Dial();f.o=e;f.$=d(this);f.run()}).parent()}}));
res/js/screens/screen-bulk.js CHANGED
@@ -826,7 +826,7 @@ console.log("Screen Init Done", initMedia, initCustom);
826
  {
827
 
828
  var control = element.getAttribute('data-control');
829
- var hasCompareControl = element.hasAttribute('data-control-check');
830
 
831
 
832
  var checker = document.querySelector('[' + control + ']');
@@ -834,7 +834,7 @@ console.log("Screen Init Done", initMedia, initCustom);
834
  // basic check if value > 0
835
  if (checker == null)
836
  {
837
- console.error('Control named ' + control + ' on ' + element.innerHTML + ' didn\'t find reference value element ');
838
  return;
839
  }
840
 
@@ -842,8 +842,9 @@ console.log("Screen Init Done", initMedia, initCustom);
842
  if ( hasCompareControl)
843
  {
844
  var compareControl = document.querySelector('[' + element.getAttribute('data-control-check') + ']');
845
- var compareValue = parseInt(compareControl.innerHTML);
846
-
 
847
  }
848
  if (isNaN(value))
849
  {
826
  {
827
 
828
  var control = element.getAttribute('data-control');
829
+ var hasCompareControl = element.hasAttribute('data-control-check');
830
 
831
 
832
  var checker = document.querySelector('[' + control + ']');
834
  // basic check if value > 0
835
  if (checker == null)
836
  {
837
+ console.log('Control named ' + control + ' on ' + element.innerHTML + ' didn\'t find reference value element ');
838
  return;
839
  }
840
 
842
  if ( hasCompareControl)
843
  {
844
  var compareControl = document.querySelector('[' + element.getAttribute('data-control-check') + ']');
845
+ if (compareControl !== null) {
846
+ var compareValue = parseInt(compareControl.innerHTML);
847
+ }
848
  }
849
  if (isNaN(value))
850
  {
res/scss/elements/_colors.scss CHANGED
@@ -1,6 +1,6 @@
1
 
2
  $color-darkest: #0f6a7d;
3
  $color-dark: #1cbecb;
4
- $color-light: #93d7e5;
5
 
6
  $color-brokenwhite: #F5F5F5;
1
 
2
  $color-darkest: #0f6a7d;
3
  $color-dark: #1cbecb;
4
+ $color-light: #d1f5fd;
5
 
6
  $color-brokenwhite: #F5F5F5;
res/scss/shortpixel-admin.scss CHANGED
@@ -36,7 +36,7 @@
36
  }
37
  }
38
  input { display: none;
39
- &:checked ~ .the_switch { background: #1fbec9; } // background of bar when active
40
  &:checked ~ .the_switch:after {
41
  left: 20px;
42
  background: #1caecb; // color of circle when active
@@ -61,7 +61,7 @@
61
  &:after {
62
  position: absolute;
63
  left: -2px;
64
- top: -4px;
65
  display: block;
66
  width: 20px;
67
  height: 20px;
36
  }
37
  }
38
  input { display: none;
39
+ &:checked ~ .the_switch { background: #7cdce4; } // background of bar when active
40
  &:checked ~ .the_switch:after {
41
  left: 20px;
42
  background: #1caecb; // color of circle when active
61
  &:after {
62
  position: absolute;
63
  left: -2px;
64
+ top: -5px;
65
  display: block;
66
  width: 20px;
67
  height: 20px;
res/scss/shortpixel-bulk.scss CHANGED
@@ -371,7 +371,7 @@
371
  {
372
  background: url('../img/bulk/dashboard-background.svg') no-repeat;
373
  background-size: cover;
374
- background-position: left center;
375
  background-color: #116C7D;
376
  text-align: center;
377
  height: 150px;
@@ -474,6 +474,7 @@
474
  flex-direction: row;
475
  width: 90%;
476
  justify-content: space-around;
 
477
 
478
  >div
479
  {
@@ -488,6 +489,11 @@
488
  {
489
  background: linear-gradient(90deg, rgba(204,204,204,100) 0%, rgba(204,204,204,100) 49.9%, rgba(255,255,255,1) 51%, rgba(255,255,255,1) 100%);
490
  }
 
 
 
 
 
491
 
492
  .line {
493
  background: #ccc;
@@ -497,7 +503,7 @@
497
  box-sizing: border-box;
498
  display: inline-block;
499
  position: absolute;
500
- top: 40%;
501
  z-index: 1;
502
  transition: color 1s ease-in;
503
 
371
  {
372
  background: url('../img/bulk/dashboard-background.svg') no-repeat;
373
  background-size: cover;
374
+ background-position: center;
375
  background-color: #116C7D;
376
  text-align: center;
377
  height: 150px;
474
  flex-direction: row;
475
  width: 90%;
476
  justify-content: space-around;
477
+ margin: 0 auto;
478
 
479
  >div
480
  {
489
  {
490
  background: linear-gradient(90deg, rgba(204,204,204,100) 0%, rgba(204,204,204,100) 49.9%, rgba(255,255,255,1) 51%, rgba(255,255,255,1) 100%);
491
  }
492
+ >div.select .line
493
+ {
494
+ width: 50%;
495
+ left: 50%;
496
+ }
497
 
498
  .line {
499
  background: #ccc;
503
  box-sizing: border-box;
504
  display: inline-block;
505
  position: absolute;
506
+ top: 22px;
507
  z-index: 1;
508
  transition: color 1s ease-in;
509
 
res/scss/shortpixel-notices.scss CHANGED
@@ -14,6 +14,7 @@
14
  box-shadow: 0 1px 1px rgba(0,0,0,0.04);
15
  border: 1px solid #c3c4c7;
16
  margin: 15px 0;
 
17
  border-left-color: #72aee6;
18
  position: relative;
19
 
@@ -21,10 +22,6 @@
21
  {
22
  // max-height: 50px;
23
  }
24
- .notice-dismiss
25
- {
26
- margin-top: 10px;
27
- }
28
  span
29
  {
30
  vertical-align: middle;
14
  box-shadow: 0 1px 1px rgba(0,0,0,0.04);
15
  border: 1px solid #c3c4c7;
16
  margin: 15px 0;
17
+ border-left-width: 4px;
18
  border-left-color: #72aee6;
19
  position: relative;
20
 
22
  {
23
  // max-height: 50px;
24
  }
 
 
 
 
25
  span
26
  {
27
  vertical-align: middle;
res/scss/view/_list-item.scss CHANGED
@@ -32,24 +32,24 @@
32
  white-space: nowrap;
33
  display: inline-block;
34
  }
35
- .optimize-bar {
36
  float: right;
37
- width: 110px;
38
- margin-left: 8px;
 
 
 
 
39
  .point
40
  {
41
- width: 8px;
42
- height: 8px;
43
 
44
  display: inline-block;
45
- border: 1px solid #ccc;
46
- margin-left: 1px;
47
- background: #ccc;
48
- vertical-align: middle;
49
 
50
  &.checked {
51
- background: green;
52
- box-shadow: 1px 1px 1px green;
53
  }
54
  }
55
  }
32
  white-space: nowrap;
33
  display: inline-block;
34
  }
35
+ .optimize-bar {
36
  float: right;
37
+ margin-left: 8px;
38
+ border-radius: 5px;
39
+ overflow: hidden;
40
+ height: 10px;
41
+ margin-top: 4px;
42
+
43
  .point
44
  {
45
+ width: 10px;
46
+ height: 10px;
47
 
48
  display: inline-block;
49
+ background: #d6d8d9;
 
 
 
50
 
51
  &.checked {
52
+ background: #1abdca;
 
53
  }
54
  }
55
  }
res/scss/view/_settings.scss CHANGED
@@ -36,49 +36,54 @@
36
  }
37
  .top-menu
38
  {
39
- font-size: 18px;
40
- display: flex;
41
- width: 100%;
42
- min-height: 50px;
43
- align-items: center;
44
- margin: 15px 0;
 
 
 
 
 
45
 
46
  .links
47
  {
48
- a { font-size: 18px; margin-right: 8px; }
49
- flex: 12 4 auto;
50
- // flex-grow: 14;
51
 
 
 
 
52
  }
53
  .quota-remaining
54
  {
55
  //float: right;
56
- flex: 2 1 2;
57
- text-align: center;
 
 
 
 
 
 
 
 
 
58
  }
59
  .pie-wrapper
60
  {
61
- position: relative;
62
  flex: 4 2 auto;
63
  min-width: 100px;
64
  display: inline-block;
65
  // flex-grow: 2;
66
- @include breakpoint(0, 1100px)
67
- {
68
- display: none;
69
- }
70
  }
71
  div.sp-bulk-summary {
72
- position: absolute;
73
- top: -55px;
74
- right: -25px;
75
 
76
  z-index: 10;
77
 
78
  .opt-circle-average {
79
  width: 100px;
80
  height: 100px;
81
- float: right;
82
  // margin-right: 35px;
83
  .trail {
84
  stroke: #ddd;
@@ -99,20 +104,13 @@
99
 
100
  }
101
  span {
102
- display: none;
103
  margin: 0;
104
- font-size: 11px;
105
- position: absolute;
106
- // width: 100%;
107
-
108
- bottom: 45px;
109
- //left: -15px;
110
  padding: 4px 8px;
111
- color: #fff;
112
- background: rgba($color-darkest, 0.5);
113
  font-weight: 700;
114
  border-radius: 3px;
115
  white-space: nowrap;
 
116
  }
117
  @include breakpoint(0,1500px)
118
  {
@@ -121,10 +119,6 @@
121
  width: 100px;
122
  height: 100px;
123
  }
124
- span
125
- {
126
- display: none;
127
- }
128
  }
129
  } // optimized thing
130
  } // top menu
@@ -222,6 +216,10 @@
222
  margin: 0;
223
  color: #999;
224
  background-color: #ddd;
 
 
 
 
225
  /* border-radius: 5px 5px 0 0; */
226
  a {
227
  display: block;
@@ -243,19 +241,36 @@
243
 
244
  article.sp-tabs section:nth-of-type(2) h2 {
245
  left: 192px;
 
 
 
 
246
  }
247
  article.sp-tabs section:nth-of-type(3) h2 {
248
  left: 374px;
 
 
 
 
249
  }
250
  article.sp-tabs section:nth-of-type(4) h2 {
251
  left: 556px;
 
 
 
 
252
  }
253
  article.sp-tabs section:nth-of-type(5) h2 {
254
  left: 738px;
 
 
 
 
255
  }
256
  article.sp-tabs section:nth-of-type(6) h2 {
257
  left: 920px;
258
  }
 
259
  //debug-tab is now after the other tabs, because of form issues.
260
  article.sp-tabs section#tab-debug {
261
 
@@ -291,7 +306,7 @@
291
  .table.notices {
292
  > div > span
293
  {
294
- width: 25%;
295
  text-align: center;
296
  }
297
  }
36
  }
37
  .top-menu
38
  {
39
+ font-size: 18px;
40
+ display: flex;
41
+ width: 100%;
42
+ min-height: 50px;
43
+ align-items: center;
44
+ margin: 15px 0;
45
+ position: relative;
46
+ @include breakpoint(0, 1200px)
47
+ {
48
+ margin-bottom: 50px;
49
+ }
50
 
51
  .links
52
  {
 
 
 
53
 
54
+ a { font-size: 18px; margin-right: 8px; white-space: nowrap; line-height: 26px;}
55
+ padding-right: 195px;
56
+ flex: 12 4 auto;
57
  }
58
  .quota-remaining
59
  {
60
  //float: right;
61
+ font-size: 13px;
62
+ }
63
+ .spio-status-box {
64
+ text-align: center;
65
+ position: absolute;
66
+ top: -49px;
67
+ right: 0;
68
+ padding: 5px 10px;
69
+ background: white;
70
+ box-shadow: 0 3px 3px rgba(0,0,0,0.1);
71
+ z-index: 1;
72
  }
73
  .pie-wrapper
74
  {
 
75
  flex: 4 2 auto;
76
  min-width: 100px;
77
  display: inline-block;
78
  // flex-grow: 2;
 
 
 
 
79
  }
80
  div.sp-bulk-summary {
 
 
 
81
 
82
  z-index: 10;
83
 
84
  .opt-circle-average {
85
  width: 100px;
86
  height: 100px;
 
87
  // margin-right: 35px;
88
  .trail {
89
  stroke: #ddd;
104
 
105
  }
106
  span {
 
107
  margin: 0;
108
+ font-size: 12px;
 
 
 
 
 
109
  padding: 4px 8px;
 
 
110
  font-weight: 700;
111
  border-radius: 3px;
112
  white-space: nowrap;
113
+ color: #0f6a7d;
114
  }
115
  @include breakpoint(0,1500px)
116
  {
119
  width: 100px;
120
  height: 100px;
121
  }
 
 
 
 
122
  }
123
  } // optimized thing
124
  } // top menu
216
  margin: 0;
217
  color: #999;
218
  background-color: #ddd;
219
+ @include breakpoint(0, 991px)
220
+ {
221
+ width: 140px;
222
+ }
223
  /* border-radius: 5px 5px 0 0; */
224
  a {
225
  display: block;
241
 
242
  article.sp-tabs section:nth-of-type(2) h2 {
243
  left: 192px;
244
+ @include breakpoint(0, 991px)
245
+ {
246
+ left: 152px;
247
+ }
248
  }
249
  article.sp-tabs section:nth-of-type(3) h2 {
250
  left: 374px;
251
+ @include breakpoint(0, 991px)
252
+ {
253
+ left: 294px;
254
+ }
255
  }
256
  article.sp-tabs section:nth-of-type(4) h2 {
257
  left: 556px;
258
+ @include breakpoint(0, 991px)
259
+ {
260
+ left: 436px;
261
+ }
262
  }
263
  article.sp-tabs section:nth-of-type(5) h2 {
264
  left: 738px;
265
+ @include breakpoint(0, 991px)
266
+ {
267
+ left: 578px;
268
+ }
269
  }
270
  article.sp-tabs section:nth-of-type(6) h2 {
271
  left: 920px;
272
  }
273
+
274
  //debug-tab is now after the other tabs, because of form issues.
275
  article.sp-tabs section#tab-debug {
276
 
306
  .table.notices {
307
  > div > span
308
  {
309
+ width: 18%;
310
  text-align: center;
311
  }
312
  }
wp-shortpixel.php CHANGED
@@ -3,7 +3,7 @@
3
  * Plugin Name: ShortPixel Image Optimizer
4
  * Plugin URI: https://shortpixel.com/
5
  * Description: ShortPixel optimizes images automatically, while guarding the quality of your images. Check your <a href="/wp-admin/options-general.php?page=wp-shortpixel-settings" target="_blank">Settings &gt; ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
6
- * Version: 5.1.1
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  * GitHub Plugin URI: https://github.com/short-pixel-optimizer/shortpixel-image-optimiser
@@ -31,7 +31,7 @@ if (! defined('SHORTPIXEL_RESET_ON_ACTIVATE'))
31
  define('SHORTPIXEL_PLUGIN_FILE', __FILE__);
32
  define('SHORTPIXEL_PLUGIN_DIR', __DIR__);
33
 
34
- define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "5.1.1");
35
 
36
  define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
37
  define('SHORTPIXEL_MAX_FAIL_RETRIES', 3);
@@ -71,6 +71,7 @@ define('SHORTPIXEL_BACKUP_URL',
71
 
72
 
73
  //define('SHORTPIXEL_SILENT_MODE', true); // no global notifications. Can lead to data damage. After setting, reactivate plugin.
 
74
 
75
  // Starting logging services, early as possible.
76
  if (! defined('SHORTPIXEL_DEBUG'))
3
  * Plugin Name: ShortPixel Image Optimizer
4
  * Plugin URI: https://shortpixel.com/
5
  * Description: ShortPixel optimizes images automatically, while guarding the quality of your images. Check your <a href="/wp-admin/options-general.php?page=wp-shortpixel-settings" target="_blank">Settings &gt; ShortPixel</a> page on how to start optimizing your image library and make your website load faster.
6
+ * Version: 5.1.2
7
  * Author: ShortPixel
8
  * Author URI: https://shortpixel.com
9
  * GitHub Plugin URI: https://github.com/short-pixel-optimizer/shortpixel-image-optimiser
31
  define('SHORTPIXEL_PLUGIN_FILE', __FILE__);
32
  define('SHORTPIXEL_PLUGIN_DIR', __DIR__);
33
 
34
+ define('SHORTPIXEL_IMAGE_OPTIMISER_VERSION', "5.1.2");
35
 
36
  define('SHORTPIXEL_BACKUP', 'ShortpixelBackups');
37
  define('SHORTPIXEL_MAX_FAIL_RETRIES', 3);
71
 
72
 
73
  //define('SHORTPIXEL_SILENT_MODE', true); // no global notifications. Can lead to data damage. After setting, reactivate plugin.
74
+ //define('SHORTPIXEL_AFFILIATE_ID');
75
 
76
  // Starting logging services, early as possible.
77
  if (! defined('SHORTPIXEL_DEBUG'))