update plugins

This commit is contained in:
Tony Volpe
2024-06-17 14:42:23 -04:00
parent a00f379f7f
commit 38e314323c
9467 changed files with 2032414 additions and 0 deletions

View File

@@ -0,0 +1,6 @@
# Security Policy
## Reporting Security Bugs
Please report security bugs found in the site-reviews plugin's source code through the [Patchstack Vulnerability Disclosure Program](https://patchstack.com/database/vdp/imagify). The Patchstack team will assist you with verification, CVE assignment and take care of notifying the developers of this plugin.
---

View File

@@ -0,0 +1,20 @@
/**
* @typedef {import('@roots/bud').Bud} Bud
*
* @param {Bud} bud
*/
module.exports = async bud => {
bud.externals({
jQuery: 'window.jquery',
wp: 'window.wp',
})
bud.runtime('single')
await bud
.setPath('@dist', '../assets/admin')
.entry({
chart: 'chart.js',
bulk: 'bulk.js',
})
//.when( bud.isProduction, () => bud.splitChunks().minimize() )
}

View File

@@ -0,0 +1,15 @@
{
"name": "imagify_dev",
"version": "1.0.0",
"dependencies": {
},
"devDependencies": {
"@roots/bud": "^6.11.0",
"chart.js": "^4.4.0"
},
"scripts": {
"dev": "bud dev",
"build": "bud build",
"bud": "bud"
}
}

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,6 @@
import * as chart from 'chart.js/auto'
window.imagify = window.imagify || {};
window.imagify.Color = chart.Colors;
window.imagify.Chart = chart.Chart;

View File

@@ -0,0 +1,14 @@
{
"chart": {
"js": [
"js/runtime.js",
"js/chart.js"
]
},
"bulk": {
"js": [
"js/runtime.js",
"js/bulk.js"
]
}
}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1 @@
(()=>{"use strict";var r,e={},o={};function t(r){var n=o[r];if(void 0!==n)return n.exports;var s=o[r]={exports:{}};return e[r](s,s.exports,t),s.exports}t.m=e,r=[],t.O=(e,o,n,s)=>{if(!o){var a=1/0;for(u=0;u<r.length;u++){for(var[o,n,s]=r[u],i=!0,f=0;f<o.length;f++)(!1&s||a>=s)&&Object.keys(t.O).every((r=>t.O[r](o[f])))?o.splice(f--,1):(i=!1,s<a&&(a=s));if(i){r.splice(u--,1);var l=n();void 0!==l&&(e=l)}}return e}s=s||0;for(var u=r.length;u>0&&r[u-1][2]>s;u--)r[u]=r[u-1];r[u]=[o,n,s]},t.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),(()=>{var r={666:0};t.O.j=e=>0===r[e];var e=(e,o)=>{var n,s,[a,i,f]=o,l=0;if(a.some((e=>0!==r[e]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(f)var u=f(t)}for(e&&e(o);l<a.length;l++)s=a[l],t.o(r,s)&&r[s]&&r[s][0](),r[s]=0;return t.O(u)},o=self.webpackChunk_roots_bud=self.webpackChunk_roots_bud||[];o.forEach(e.bind(null,0)),o.push=e.bind(null,o.push.bind(o))})()})();

View File

@@ -0,0 +1,6 @@
{
"chart.js": "js/chart.js",
"bulk.js": "js/bulk.js",
"runtime.js": "js/runtime.js",
"entrypoints.json": "entrypoints.json"
}

View File

@@ -0,0 +1,199 @@
.imagify-account,
.imagify-account-link {
padding-right: 15px;
}
.imagify-meteo-icon {
display: inline-block;
height: 38px;
vertical-align: middle;
margin-right: 10px;
}
.imagify-user-plan {
color: #40b1d0;
}
.imagify-meteo-title.imagify-meteo-title {
color: #FFF;
font-size: 17px;
}
.imagify-space-left > p {
color: #FFF;
}
#wp-admin-bar-imagify-profile [class^="imagify-bar-"] {
position: relative;
height: 1.5em;
width: 100%;
background: #60758D;
color: #FFF;
font-size: 10px;
}
#wp-admin-bar-imagify-profile .imagify-progress {
height: 1.5em;
font-size: 1em;
}
.imagify-progress {
transition: width .3s;
}
.imagify-bar-positive .imagify-progress {
background: #8CC152;
}
.imagify-bar-positive .imagify-barnb {
color: #8CC152;
}
.imagify-bar-negative .imagify-progress {
background: #73818C;
}
.imagify-bar-negative .imagify-barnb {
color: #73818C;
}
.imagify-bar-neutral .imagify-progress {
background: #F5A623;
}
.imagify-space-left .imagify-bar-negative .imagify-progress {
background: #D0021B;
}
#wpadminbar #wp-admin-bar-imagify-profile * {
line-height: 1.5;
white-space: initial;
}
#wpadminbar #wp-admin-bar-imagify .ab-submenu {
padding-bottom: 0;
}
#wpadminbar #wp-admin-bar-imagify-profile .ab-item {
height: auto;
padding: 0 13px;
}
#wpadminbar #wp-admin-bar-imagify-profile {
min-width: 200px;
padding: 15px 0 10px;
margin-top: 0.7em;
background: #222;
}
#wp-admin-bar-imagify .dashicons {
font-family: "dashicons";
font-size: 18px;
vertical-align: middle;
margin: 0 5px 0 0;
}
#wp-admin-bar-imagify .button-text {
display: inline-block;
vertical-align: middle;
}
#wp-admin-bar-imagify .imagify-abq-row {
display: table;
width: 100%;
}
#wp-admin-bar-imagify .imagify-abq-row + .imagify-abq-row {
margin-top: .75em;
}
#wp-admin-bar-imagify .imagify-abq-row > * {
display: table-cell;
}
#wp-admin-bar-imagify-profile .imagify-meteo-icon {
padding-right: 7px;
}
#wp-admin-bar-imagify-profile .imagify-meteo-icon img {
width: 37px;
}
#wp-admin-bar-imagify-profile .imagify-meteo-title {
font-size: 17px;
}
#wp-admin-bar-imagify-profile .imagify-meteo-subs {
color: #72889F;
}
#wpadminbar #wp-admin-bar-imagify-profile strong {
font-weight: bold;
}
#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,
#wpadminbar #wp-admin-bar-imagify-profile a {
padding: 0;
color: #40B1D0;
}
#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link {
display: table;
}
#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link > * {
display: table-cell;
}
#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left {
max-width: 210px;
min-width: 210px;
width: 210px;
}
#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p {
font-size: 12px;
}
#wp-admin-bar-imagify-profile .imagify-error,
#wp-admin-bar-imagify-profile .imagify-warning {
padding: 10px;
margin: 0 -13px -13px;
}
#wp-admin-bar-imagify-profile .imagify-error p + p,
#wp-admin-bar-imagify-profile .imagify-warning p + p {
margin-top: .5em;
}
#wp-admin-bar-imagify-profile .imagify-error p + p + p,
#wp-admin-bar-imagify-profile .imagify-warning p + p + p {
margin-top: 1em;
}
#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost {
display: inline-block;
height: auto;
padding: 7px 10px;
border: 1px solid #FFF;
text-align: center;
background: transparent;
color: #FFF;
border-radius: 3px;
transition: all .275s;
}
#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost:hover,
#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost:focus {
background: #FFF;
color: #888;
}
#wpadminbar .imagify-warning * {
background: #f5a623;
color: #FFF;
text-shadow: 0 0 2px rgba(0, 0, 0, 0.2);
}
#wp-admin-bar-imagify-profile .imagify-upsell-admin-bar {
position:relative ;
background: #c51161;
margin: 10px -13px -10px -13px;
padding: 20px;
}
#wp-admin-bar-imagify-profile .imagify-upsell-admin-bar p {
color: #fff;
}
#wp-admin-bar-imagify-profile a.imagify-upsell-admin-bar-button {
display: block;
height: auto !important;
border: 1px solid #fff;
border-radius: 5px;
color: #fff !important;
padding: 5px 10px !important;
text-align: center;
text-decoration: none;
margin-top: 10px;
}
#wpadminbar #wp-admin-bar-imagify-profile a.imagify-upsell-dismiss {
display: inline !important;
height: auto !important;
}
#wpadminbar #wp-admin-bar-imagify-profile .imagify-upsell-dismiss::before {
position: absolute;
top: 5px;
right: 10px;
content: "\2715";
color: #fff;
}

View File

@@ -0,0 +1 @@
.imagify-account,.imagify-account-link{padding-right:15px}.imagify-meteo-icon{display:inline-block;height:38px;vertical-align:middle;margin-right:10px}.imagify-user-plan{color:#40b1d0}.imagify-meteo-title.imagify-meteo-title{color:#fff;font-size:17px}.imagify-space-left>p{color:#fff}#wp-admin-bar-imagify-profile [class^=imagify-bar-]{position:relative;height:1.5em;width:100%;background:#60758d;color:#fff;font-size:10px}#wp-admin-bar-imagify-profile .imagify-progress{height:1.5em;font-size:1em}.imagify-progress{-webkit-transition:width .3s;-o-transition:width .3s;transition:width .3s}.imagify-bar-positive .imagify-progress{background:#8cc152}.imagify-bar-positive .imagify-barnb{color:#8cc152}.imagify-bar-negative .imagify-progress{background:#73818c}.imagify-bar-negative .imagify-barnb{color:#73818c}.imagify-bar-neutral .imagify-progress{background:#f5a623}.imagify-space-left .imagify-bar-negative .imagify-progress{background:#d0021b}#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:dashicons;font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row+.imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row>*{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889f}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:700}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40b1d0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link>*{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p+p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p+p{margin-top:1em}#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #fff;text-align:center;background:0 0;color:#fff;border-radius:3px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost:hover{background:#fff;color:#888}#wpadminbar .imagify-warning *{background:#f5a623;color:#fff;text-shadow:0 0 2px rgba(0,0,0,.2)}#wp-admin-bar-imagify-profile .imagify-upsell-admin-bar{position:relative;background:#c51161;margin:10px -13px -10px -13px;padding:20px}#wp-admin-bar-imagify-profile .imagify-upsell-admin-bar p{color:#fff}#wp-admin-bar-imagify-profile a.imagify-upsell-admin-bar-button{display:block;height:auto!important;border:1px solid #fff;border-radius:5px;color:#fff!important;padding:5px 10px!important;text-align:center;text-decoration:none;margin-top:10px}#wpadminbar #wp-admin-bar-imagify-profile a.imagify-upsell-dismiss{display:inline!important;height:auto!important}#wpadminbar #wp-admin-bar-imagify-profile .imagify-upsell-dismiss::before{position:absolute;top:5px;right:10px;content:"\2715";color:#fff}

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,171 @@
/* Filter block */
.imagify-files-list .wp-filter {
padding: 0 20px 15px;
}
.imagify-files-list .filter-items select {
height: auto;
padding: 2px 20px 3px 6px;
margin: 15px 12px 0 0;
max-width: 100%;
}
.imagify-files-list .filter-items .button {
height: auto;
padding: 2px 12px 3px;
margin-top: 15px;
}
@media screen and (max-width: 782px) {
.imagify-files-list .filter-items .button {
margin-bottom: 0;
line-height: 2.15384615;
padding: 0 12px;
}
}
/* Empty table */
.imagify-files-list .no-items td {
padding: 35px;
text-align: center;
font-size: 18px;
}
.imagify-files-list .no-items td a {
text-decoration: underline;
}
/* Th sortable */
.imagify-files-list .sortable a {
color: #000;
}
/* Global links */
.imagify-files-list a {
color: #3694AE;
}
/* Global TDs */
.imagify-files-list tbody td,
.imagify-files-list tbody th,
.imagify-files-list.imagify-files-list tbody .check-column {
vertical-align: middle;
padding-top: 20px;
padding-bottom: 20px;
color: #626E7B;
}
/* Col Title */
.imagify-files-list .column-title strong {
font-weight: normal;
font-size: 14px;
}
.imagify-files-list .column-title strong a {
display: inline-flex;
align-items: center;
word-break: break-all;
word-wrap: break-word;
font-weight: normal;
}
.imagify-files-list .filename {
font-size: 12px;
font-weight: bold;
}
.imagify-files-list .media-icon {
position: relative;
width: 60px;
overflow: hidden;
flex-shrink: 0;
}
.media-icon .centered {
position: absolute;
left: 0;
top: 0;
width: 100%;
height: 100%;
transform: translate( 50%, 50% );
}
.media-icon .centered img {
position: absolute;
left: 0;
top: 0;
transform: translate( -50%, -50% );
}
table.media .column-title .media-icon.landscape img {
max-width: none;
width: auto;
height: 60px;
}
table.media .column-title .media-icon.portrait img {
width: 60px;
}
/* Optimization datas Col */
.imagify-files-list ul.imagify-datas-list {
font-size: 11px;
}
.imagify-files-list ul.imagify-datas-list .big {
font-size: 13px;
}
.imagify-files-list ul.imagify-datas-list span.imagify-chart-value {
font-size: 12px;
}
.imagify-files-list ul.imagify-datas-list .imagify-chart-container {
margin-right: 2px;
}
.imagify-files-list ul.imagify-datas-list canvas {
width: 18px!important;
height: 18px!important;
}
/* Optimization Level Col */
.imagify-files-list .optimization_level {
text-align: center;
font-weight: bold;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 0.02em;
}
.imagify-files-list .column-optimization_level,
.imagify-files-list .column-optimization_level a {
text-align: center;
}
.imagify-files-list .column-optimization_level a span {
float: none;
display: inline-block;
vertical-align: middle;
}
.imagify-files-list .column-optimization_level .sorting-indicator {
vertical-align: -10px;
}
/* Actions col */
.imagify-files-list .column-actions .button,
.imagify-files-list .column-actions .button-primary {
padding: 5px 20px;
font-size: 14px;
height: auto;
}
.imagify-files-list .column-actions .button-primary {
background: #3694AE;
color: #FFF;
border: 0;
box-shadow: none;
text-shadow: none;
}
.imagify-files-list .column-actions a,
.status a.button-imagify-refresh-status {
display: inline-block;
margin: .3em 0;
font-size: 12px;
font-weight: bold;
}
.imagify-files-list .imagify-status-already_optimized {
font-weight: bold;
color: #8BC34A;
}
.imagify-files-list .column-actions a .dashicons,
.imagify-files-list .column-actions a .dashicons:before,
.status a.button-imagify-refresh-status .dashicons,
.status a.button-imagify-refresh-status .dashicons:before {
margin-right: 2px;
font-size: 17px;
height: 17px;
width: 17px;
}

View File

@@ -0,0 +1 @@
.imagify-files-list .wp-filter{padding:0 20px 15px}.imagify-files-list .filter-items select{height:auto;padding:2px 20px 3px 6px;margin:15px 12px 0 0;max-width:100%}.imagify-files-list .filter-items .button{height:auto;padding:2px 12px 3px;margin-top:15px}@media screen and (max-width:782px){.imagify-files-list .filter-items .button{margin-bottom:0;line-height:2.15384615;padding:0 12px}}.imagify-files-list .no-items td{padding:35px;text-align:center;font-size:18px}.imagify-files-list .no-items td a{text-decoration:underline}.imagify-files-list .sortable a{color:#000}.imagify-files-list a{color:#3694ae}.imagify-files-list tbody td,.imagify-files-list tbody th,.imagify-files-list.imagify-files-list tbody .check-column{vertical-align:middle;padding-top:20px;padding-bottom:20px;color:#626e7b}.imagify-files-list .column-title strong{font-weight:400;font-size:14px}.imagify-files-list .column-title strong a{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;word-break:break-all;word-wrap:break-word;font-weight:400}.imagify-files-list .filename{font-size:12px;font-weight:700}.imagify-files-list .media-icon{position:relative;width:60px;overflow:hidden;-ms-flex-negative:0;flex-shrink:0}.media-icon .centered{position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:translate(50%,50%);-ms-transform:translate(50%,50%);transform:translate(50%,50%)}.media-icon .centered img{position:absolute;left:0;top:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}table.media .column-title .media-icon.landscape img{max-width:none;width:auto;height:60px}table.media .column-title .media-icon.portrait img{width:60px}.imagify-files-list ul.imagify-datas-list{font-size:11px}.imagify-files-list ul.imagify-datas-list .big{font-size:13px}.imagify-files-list ul.imagify-datas-list span.imagify-chart-value{font-size:12px}.imagify-files-list ul.imagify-datas-list .imagify-chart-container{margin-right:2px}.imagify-files-list ul.imagify-datas-list canvas{width:18px!important;height:18px!important}.imagify-files-list .optimization_level{text-align:center;font-weight:700;font-size:14px;text-transform:uppercase;letter-spacing:.02em}.imagify-files-list .column-optimization_level,.imagify-files-list .column-optimization_level a{text-align:center}.imagify-files-list .column-optimization_level a span{float:none;display:inline-block;vertical-align:middle}.imagify-files-list .column-optimization_level .sorting-indicator{vertical-align:-10px}.imagify-files-list .column-actions .button,.imagify-files-list .column-actions .button-primary{padding:5px 20px;font-size:14px;height:auto}.imagify-files-list .column-actions .button-primary{background:#3694ae;color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none}.imagify-files-list .column-actions a,.status a.button-imagify-refresh-status{display:inline-block;margin:.3em 0;font-size:12px;font-weight:700}.imagify-files-list .imagify-status-already_optimized{font-weight:700;color:#8bc34a}.imagify-files-list .column-actions a .dashicons,.imagify-files-list .column-actions a .dashicons:before,.status a.button-imagify-refresh-status .dashicons,.status a.button-imagify-refresh-status .dashicons:before{margin-right:2px;font-size:17px;height:17px;width:17px}

View File

@@ -0,0 +1,376 @@
/* Error Notice */
.imagify-plugins-error {
overflow: hidden;
padding-left: 20px;
list-style-type: disc
}
.imagify-plugins-error li {
width: 300px;
line-height: 30px
}
@media (max-width: 570px) {
.imagify-plugins-error li {
width: auto;
}
}
/* Notice close link */
.imagify-notice-dismiss.notice-dismiss {
text-decoration: none;
}
/* Notices in Imagify related pages */
.media_page_imagify-bulk-optimization .notice,
body[class*="_imagify-ngg-bulk-optimization"] .notice,
.settings_page_imagify .notice {
margin-right: 20px;
margin-left: 2px;
}
.imagify-notice .button-mini {
padding: 2px 10px;
font-size: 13px;
}
.imagify-notice.imagify-notice {
position: relative;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
padding: 0;
margin: 10px 20px 10px 2px;
border: 0 none;
background: #4A5362;
box-shadow: none;
color: #FFF;
}
@media (max-width: 782px) {
.imagify-notice.imagify-notice,
.imagify-welcome {
margin-right: 12px;
}
}
@media (max-width: 450px) {
.imagify-notice.imagify-notice {
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-webkit-flex-direction: column;
-ms-flex-direction: column;
flex-direction: column;
}
}
.wrap .imagify-notice {
margin: 5px 15px 2px;
position: relative;
}
.imagify-notice-logo {
padding: 18px 23px;
background: #40B1D0;
}
.imagify-notice-logo .imagify-logo {
opacity: 1;
}
.imagify-flex-notice-content .imagify-notice-logo {
display: flex;
align-items: center;
}
.updated .imagify-notice-logo {
background: #8BC34A;
}
.error .imagify-notice-logo {
background: #C51162;
}
.imagify-notice-title {
font-size: 15px;
}
.imagify-notice-content {
padding: 5px 23px;
}
.imagify-notice-content.imagify-notice-content p {
margin: 0.65em 0;
}
.imagify-flex-notice-content .imagify-notice-content {
display: flex;
flex-wrap: wrap;
padding: 0;
}
.imagify-flex-notice-content .imagify-notice-content > * {
padding: 10px 20px;
}
.imagify-flex-notice-content .imagify-meteo-icon img {
height: 100%;
margin-top: 6px;
}
.imagify-notice-quota [class^="imagify-bar-"] {
background: #1F2332;
}
.imagify-notice-quota .imagify-space-left p {
margin: 0;
}
.imagify-flex-notice-content .imagify-notice-content .imagify-notice-quota {
padding-right: 24px;
padding-left: 8px;
background: #343A49;
}
.imagify-notice a {
color: #40B1D0;
}
.imagify-notice a:hover,
.imagify-notice a:focus {
color: #FEE102;
}
.imagify-notice code {
background: rgba(0, 0, 0, 0.4) none repeat scroll 0 0;
}
.imagify-notice .imagify-rate-us.imagify-rate-us {
text-align: left;
}
.imagify-notice .imagify-rate-us .stars {
margin: 0;
}
/**
* == Welcome section
*/
.imagify-welcome {
margin: 30px 20px 0 0;
}
.imagify-welcome .baseline {
display: inline-block;
margin: .2em 0 0 2em;
font-size: 17px;
}
.imagify-welcome .imagify-logo {
vertical-align: middle;
}
.imagify-welcome-remove {
position: absolute;
top: 50%;
right: 15px;
margin-top: -8px;
color: #FFF;
text-decoration: none;
}
/* Welcome columns */
.imagify-columns [class^="col-"] img {
float: left;
margin-right: 18px;
}
.imagify-col-content {
overflow: hidden;
}
.imagify-col-title {
margin: 0 0 15px 0;
font-size: 23px;
}
.counter .imagify-col-title:before {
counter-increment: cols;
content: counter(cols) ". ";
color: #40B1D0;
}
.imagify-col-desc {
color: #5F758E;
margin-bottom: 2em;
}
/* WP Rocket notice */
.imagify-rkt-notice.imagify-rkt-notice {
position: relative;
display: -webkit-box;
display: -webkit-flex;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-webkit-align-items: center;
-ms-flex-align: center;
-ms-grid-row-align: center;
align-items: center;
padding: 10px 45px 10px 0;
border: 0 none;
box-shadow: none;
color: #FFF;
background: #1F2332;
}
.media_page_imagify-bulk-optimization .imagify-rkt-notice {
margin-left: 2px;
margin-right: 20px;
}
@media (max-width: 782px) {
.media_page_imagify-bulk-optimization .imagify-rkt-notice {
margin-left: 0;
margin-right: 12px;
}
}
.imagify-rkt-notice .imagify-cross {
position: absolute;
right: 8px;
top: 50%;
width: 22px;
height: 22px;
padding: 0;
margin-top: -11px;
background: transparent;
color: rgba(255, 255, 255, .5);
text-decoration: none;
border-radius: 50%;
transition: all .275s;
}
.imagify-rkt-notice .imagify-cross .dashicons {
position: relative;
top: 2px;
left: 1px;
transition: all .275s;
}
.imagify-rkt-notice .imagify-cross:hover {
background: #FFF;
}
.imagify-rkt-notice .imagify-cross:hover .dashicons {
color: #412355;
}
.imagify-rkt-notice .imagify-rkt-cta,
.imagify-rkt-notice .imagify-rkt-logo,
.imagify-rkt-notice .imagify-rkt-coupon {
-webkit-flex-shrink: 0;
-ms-flex-negative: 0;
flex-shrink: 0;
}
.imagify-rkt-notice .imagify-rkt-logo {
width: 150px !important; /* !important because of a dirtugly WP Engine code */
text-align: center;
padding: 0 25px 0 30px;
line-height: 0.8;
}
.imagify-rkt-notice .imagify-rkt-msg {
width: 100% !important; /* !important because of a dirtugly WP Engine code */
color: #FFF;
padding: 0 15px;
font-size: 14px;
line-height: 1.6;
}
.imagify-rkt-notice .imagify-rkt-coupon {
width: 150px !important; /* !important because of a dirtugly WP Engine code */
padding: 0 15px;
}
.imagify-rkt-notice .imagify-rkt-coupon-code {
padding: 5px 10px;
font-size: 23px;
font-weight: bold;
border: 1px dashed #F56640;
color: #F56640;
}
.imagify-rkt-notice .imagify-rkt-cta {
width: 250px !important; /* !important because of a dirtugly WP Engine code */
-webkit-box-flex: 1;
-webkit-flex-grow: 1;
-ms-flex-positive: 1;
flex-grow: 1;
-webkit-flex-basis: 200px;
-ms-flex-preferred-size: 200px;
flex-basis: 200px;
}
.imagify-rkt-notice .button.button {
position: relative;
top: -1px;
height: auto;
font-weight: 600;
font-size: 14px;
border: 0 none;
padding: 9px 18px 9px;
background: #F56640;
box-shadow: none;
text-shadow: none !important;
}
@media (max-width: 880px) {
.imagify-rkt-notice {
-webkit-flex-wrap: wrap;
-ms-flex-wrap: wrap;
flex-wrap: wrap;
}
.imagify-rkt-notice .imagify-rkt-msg,
.imagify-rkt-notice .imagify-rkt-cta,
.imagify-rkt-notice .imagify-rkt-logo {
text-align: left;
padding: 5px 15px;
}
.imagify-cross.imagify-cross {
top: 8px;
margin-top: 0;
}
.imagify-rkt-notice .imagify-cross .dashicons {
top: 1px;
}
}
@media (max-width: 782px) {
.imagify-flex-notice-content .imagify-notice-content .imagify-notice-quota {
width: 100%;
}
.imagify-notice-quota-btn-container{
text-align: center;
width: 100%;
}
.imagify-notice-quota-btn-container .imagify-button{
display: inline-block;
}
}
.imagify-notice-bulk-complete {
display: flex;
align-items: center;
padding: 12px 0;
}
.imagify-notice-bulk-complete-logo {
padding-right: 12px;
}

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,968 @@
.wrap.imagify-settings {
margin-right: 0;
}
.imagify-settings.imagify-have-rocket {
margin-right: 20px;
}
/* The field that checks the API Key */
#imagify-check-api-container {
display: block;
margin-top: 6px;
font-weight: bold;
}
#imagify-check-api-container .dashicons {
font-size: 25px;
}
#imagify-check-api-container .dashicons-no:before {
color: #f06e57;
vertical-align: -1px;
}
#imagify-check-api-container .imagify-icon {
font-size: 1.8em;
margin-right: 3px;
margin-left: 1px;
color: #8BC34A;
vertical-align: -2px;
}
.imagify-account-info-col .imagify-api-line {
padding: 22px 26px;
background: #343A49
}
.imagify-api-line label,
p.imagify-api-key-invite-title {
display: block;
margin-bottom: 6px;
font-size: 14px;
text-transform: uppercase;
letter-spacing: 0.02em;
font-weight: bold;
color: #343A49;
}
.imagify-account-info-col .imagify-api-line label {
color: #E5EBEF;
display: inline-block;
}
.imagify-api-line.imagify-api-line input[type="text"] {
width: 100%;
padding: 6px 10px;
border: 1px solid #40B1D0;
font-family: "PT Mono", "Consolas", monospace;
font-size: 14px;
letter-spacing: 0.01em;
font-weight: bold;
color: #40B1D0;
background: transparent;
box-shadow: none;
}
.imagify-no-api-key .imagify-api-line {
margin: 3em 0 0 0;
padding: 2em 0 0;
}
.imagify-no-api-key .imagify-api-line input[type="text"] {
margin-top: 5px;
width: 400px;
max-width: 100%;
}
.imagify-settings .imagify-no-api-key div.submit.submit {
border: 0;
padding: 0 16px;
margin-top: 0;
background: #FFF;
}
.imagify-settings .imagify-no-api-key div.submit.submit p {
padding-bottom: 0;
}
.imagify-options-title {
margin: .75em 0 0 0;
font-size: 24px;
letter-spacing: 0.02em;
font-weight: bold;
color: #343A49;
}
.imagify-options-subtitle {
padding-bottom: .3em;
margin-bottom: 20px;
border-bottom: 1px solid #D2D3D6;
font-size: 14px;
letter-spacing: 0.01em;
font-weight: bold;
text-transform: uppercase;
color: #626E7B;
}
.imagify-options-subtitle a {
font-size: 12px;
color: #338EA6;
text-transform: none;
letter-spacing: 0;
}
.imagify-options-subtitle .imagify-info {
margin-left: 15px;
}
.imagify-setting-line {
border-top: 1px solid #D2D3D6;
padding: 25px 0 13px;
margin: 1em 0;
}
.imagify-options-subtitle + .imagify-setting-line {
border-top: 0;
padding-top: 8px;
}
/* 3 inlined buttons + Visual comparison */
.imagify-setting-optim-level {
display: flex;
flex-wrap: wrap;
align-items: center;
}
.imagify-setting-optim-level > p {
margin: 0;
}
.imagify-setting-optim-level .imagify-info {
margin-top: 10px;
}
.imagify-setting-optim-level .imagify-error {
margin: 10px 0 0 0;
}
.imagify-setting-optim-level .imagify-error a {
color: #fff;
}
.imagify-setting-optim-level .imagify-inline-options {
flex-basis: 60%;
flex-grow: 1;
width: auto;
display: flex;
background: #2E3243;
border-radius: 3px;
}
.imagify-setting-optim-level .imagify-inline-options-error {
background: #ccc;
}
.imagify-setting-optim-level .imagify-inline-options label {
display: block !important;
width: 100%;
font-size: 14px !important;
border-radius: 3px!important;
}
.imagify-setting-optim-level .imagify-visual-comparison-text {
flex-basis: 40%;
flex-shrink: 1;
padding-left: 20px;
margin-top: 20px;
color: #626E7B;
box-sizing: border-box;
}
.imagify-setting-optim-level.imagify-setting-optim-level .imagify-visual-comparison-btn {
padding-top: 5px;
margin-top: 2px;
border-radius: 2px;
text-transform: none;
letter-spacing: 0;
text-shadow: none!important;
}
/* TODO: maybe remove table lines, we don't use theme anymore… */
@media (max-width: 782px) {
.imagify-settings .form-table th {
padding-top: 2em;
padding-bottom: .5em;
}
}
.imagify-settings .form-table td {
vertical-align: top;
}
.imagify-settings .form-table th span {
cursor: pointer;
}
.imagify-middle th {
padding-top: 35px;
}
.imagify-settings div.submit.submit {
border-top: 1px solid #D9D9D9;
margin-top: 2em;
padding: 18px 0 7px 30px;
}
.imagify-settings .hidden + div.submit.submit {
margin-top: -1px;
}
.imagify-settings p.submit {
float: left;
margin-top: 0;
}
.imagify-settings p.submit .button {
margin: 0 5px;
}
.imagify-sub-header th {
text-align: right;
}
.imagify-sub-header .form-table {
margin: 0;
}
.imagify-sub-header th,
.imagify-sub-header td {
padding-top: 0;
padding-bottom: 0;
}
.imagify-sub-header [for="api_key"] {
padding-top: 5px;
}
@media (max-width: 1120px) {
.imagify-settings .imagify-logo-block {
margin-right: 0;
}
.imagify-settings .imagify-rate-us.imagify-rate-us {
margin: 1em 0 -1em;
}
}
.imagify-settings .imagify-rate-us {
margin-right: 25px;
margin-left: auto;
}
/* Label & fake labels */
label + .imagify-info,
.imagify-visual-label {
display: inline-block;
width: 550px;
max-width: calc(100% - 38px);
margin-left: 38px;
padding-right: 25px;
}
.imagify-options-line {
-webkit-transition: opacity .3s;
transition: opacity .3s;
}
label ~ .imagify-options-line {
display: block;
margin: 8px 0 20px 40px;
font-size: 14px;
}
.imagify-options-line + .imagify-info {
margin-left: 38px;
}
label + .imagify-info {
margin-top: 10px;
}
.imagify-options-line + .imagify-info + .imagify-options-line {
margin-top: 20px;
}
.imagify-visual-label {
vertical-align: -5px;
}
label[for="imagify_sizes_full"] + .imagify-info {
vertical-align: middle;
}
.imagify-settings.imagify-settings [type="checkbox"]:not(:checked) + label ~ .imagify-options-line,
.imagify-settings.imagify-settings [type="checkbox"]:not(:checked) + label .imagify-visual-label,
:checked + label ~ .imagify-options-line :checked + label ~ .imagify-options-line .imagify-faded {
opacity: .5;
}
.imagify-settings.imagify-settings [type="checkbox"]:checked + label ~ .imagify-options-line,
.imagify-settings.imagify-settings [type="checkbox"]:checked + label .imagify-visual-label,
.imagify-settings.imagify-settings :not(:checked) + label ~ .imagify-options-line :not(:checked) + label ~ .imagify-options-line {
opacity: 1;
}
.imagify-radio-group + .imagify-options-line {
display: block;
margin: 0 0 0 1.7em;
font-size: 14px;
}
.imagify-checkbox-marged {
max-width: 500px;
margin-left: 45px;
}
.imagify-settings [type="text"],
.imagify-settings [type="number"] {
width: 20em;
max-width: 100%;
height: auto;
padding: 6px;
margin: 0 6px;
border: 1px solid #8BA6B4;
box-shadow: none;
border-radius: 2px;
color: #338EA6;
font-weight: bold;
}
.imagify-settings [type="number"] {
width: 5em;
}
.imagify-settings ::-webkit-input-placeholder {
color: #B1B1B1;
font-weight: 400;
}
.imagify-settings ::-moz-placeholder {
color: #B1B1B1;
font-weight: 400;
opacity: 1;
}
.imagify-settings :-ms-input-placeholder {
color: #B1B1B1;
font-weight: 400;
}
.imagify-settings :-moz-placeholder {
color: #B1B1B1;
font-weight: 400;
opacity: 1;
}
.imagify-settings ::placeholder {
color: #B1B1B1;
font-weight: 400;
}
.imagify-menu-bar-img {
box-sizing: border-box;
max-width: 100%;
width: 350px;
height: auto;
margin-top: 0;
border: 1px solid #8BA6B4;
}
/* Layout */
.imagify-col.imagify-main {
float: left;
width: calc(100% - 320px);
padding-left: 0;
padding-right: 0;
}
.imagify-have-rocket .imagify-main {
float: none;
width: 1265px;
max-width: 100%;
}
.imagify-sidebar {
float: left;
width: 300px;
max-width: 100%;
}
/* Sidebar with Ads */
.imagify-sidebar-section {
border: 1px solid #BBB;
background: #1F2332;
}
.imagify-sidebar-section + .imagify-sidebar-section {
margin-top: 2em;
}
@media (max-width: 820px) {
.imagify-settings {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-orient: vertical;
-webkit-box-direction: normal;
-ms-flex-direction: column;
flex-direction: column;
}
.imagify-main {
width: auto;
float: none;
}
.imagify-sidebar {
order: 2;
float: none;
width: auto;
max-width: none;
margin-left: 0;
margin-top: 25px;
}
.wp-media-products {
text-align: center;
}
.wp-media-products li {
display: inline-block;
width: 100%;
max-width: 276px;
}
}
@media (min-width: 1400px) {
.imagify-main {
width: 74%;
}
}
.imagify-sidebar-section {
position: relative;
padding: 10px 20px;
text-align: center;
color: #F2F2F2;
}
.imagify-sidebar-close {
position: absolute;
top: 8px;
right: 12px;
text-decoration: none;
}
.imagify-sidebar-close i {
font-size: 2em;
color: rgba(255,255,255,.5);
}
p.imagify-sidebar-title {
margin: 1.2em 0 1.5em;
text-align: left;
color: #F56640;
text-transform: uppercase;
letter-spacing: 0.015em;
word-spacing: 0.015em;
font-weight: bold;
}
p.imagify-sidebar-description {
margin: 1.5em 0;
text-align: left;
font-weight: 500;
color: #F2F2F2;
}
.imagify-sidebar-description strong {
color: #39CE9A;
}
.imagify-rocket-cta-promo {
display: block;
padding: 8px 10px;
margin: 1.3em 0 .5em 0;
border: 2px dashed #F56640;
border-radius: 3px;
font-size: 18px;
font-weight: bold;
color: #F56640;
}
.imagify-rocket-cta-promo strong {
color: #F2F2F2;
}
a.btn-rocket {
display: block;
font-size: 15px;
padding: 10px 12px;
margin: 0 0 1.5em;
background: #F56640;
border-radius: 3px;
color: #F2F2F2;
text-transform: uppercase;
font-weight: bold;
text-decoration: none;
}
a.btn-rocket:hover,
a.btn-rocket:focus {
background: #AC2B15;
}
.imagify-sidebar-section ul {
margin-top: 20px;
}
.imagify-sidebar-section li {
position: relative;
margin: 1.2em 0;
padding-left: 25px;
text-align: left;
}
.imagify-sidebar-section li:before {
content: "✓";
position: absolute;
left: 0; top: 0;
color: #39CE9A;
font-size: 18px;
}
/* Menu in admin bar label exception */
label[for="imagify_admin_bar_menu"],
label[for="imagify_partner_links"] {
font-weight: normal !important;
color: #626E7B !important;
}
/* Select / Unselect all buttons */
.imagify-select-all-buttons {
margin-top: 8px;
}
.imagify-link-like.imagify-select-all {
font-weight: bold;
font-size: 12px;
color: #3694AE;
}
.imagify-select-all.imagify-is-inactive {
color: inherit;
text-decoration: none;
cursor: default;
}
/* Add Themes box */
.imagify-fts-header {
padding: 10px 16px;
background: #343A49;
color: #FFF;
}
.imagify-fts-header i {
font-size: 1.8em;
margin-right: 12px;
}
.imagify-fts-header p {
margin: 0;
color: #FFF;
}
.imagify-fts-header strong,
#imagify-add-themes-to-custom-folder strong {
color: #40B1D0;
font-weight: bold;
}
.imagify-fts-content {
padding: 16px;
background: #F4F7F9;
border: 1px solid #CDD0D4;
border-top: 0;
}
.imagify-fts-content p {
margin-top: 0;
}
.imagify-kindof-title {
margin-top: 2em;
padding: 0 0 10px 0;
border-bottom: 1px solid #D2D3D6;
justify-content: space-between;
font-weight: bold;
}
.imagify-settings .imagify-button-mini {
padding: 4px 13px 4px 10px;
}
.imagify-settings .imagify-button-mini .dashicons-plus {
vertical-align: -7.5px;
}
.imagify-settings .imagify-button-mini.imagify-button-primary:hover,
.imagify-settings .imagify-button-mini.imagify-button-primary:focus {
color: #FFF;
}
p.imagify-custom-folder-line {
position: relative;
margin: 0;
padding: 12px 15px;
color: #4A5362;
font-weight: 500;
transition: all .75s;
}
.imagify-custom-folder-line.imagify-will-remove {
background: #C51162;
color: #FFF;
transform: translateX(-120px);
opacity: 0;
}
.imagify-custom-folder-line:first-child {
margin-top: -.5em;
}
.imagify-custom-folder-line + .imagify-custom-folder-line {
border-top: 1px solid #E9EFF2;
}
.imagify-custom-folders-remove {
position: absolute;
right: 0;
top: 6px;
border: 0;
padding: 5px 10px 4px;
box-shadow: none;
color: #7A8996;
border-radius: 16px;
font-size: 13px;
line-height: 18px;
background: #FFF;
transition: all .275s;
cursor: pointer;
}
.imagify-custom-folders-remove-text {
max-width: 0;
overflow: hidden;
white-space: nowrap;
display: inline-block;
transform: scale(0);
opacity: 0;
transition: all .275s;
}
.imagify-custom-folders-remove:hover,
.imagify-custom-folders-remove:focus {
background: #D9EFF6;
color: #225E6E;
}
.imagify-custom-folders-remove:hover .imagify-custom-folders-remove-text,
.imagify-custom-folders-remove:focus .imagify-custom-folders-remove-text {
max-width: 6em;
transform: scale(1);
opacity: 1;
}
/* Progress bar */
.imagify-settings .progress {
height: 8px;
margin-top: 1em;
background: #343A49;
}
.imagify-settings .bar {
position: relative;
width: 1px;
height: 8px;
background: #46B1CE;
-webkit-transition: width .5s;
transition: width .5s;
}
.imagify-settings .percent {
position: absolute;
top: 6px;
right: 0;
padding: 0 5px;
line-height: 1.85;
font-size: 14px;
font-weight: bold;
color: #40B1D0;
}
/* Icon rotation */
.dashicons.rotate {
-webkit-animation: icon-rotate 2.6s infinite linear;
animation: icon-rotate 2.6s infinite linear;
}
@-webkit-keyframes icon-rotate {
from {
-webkit-transform: rotate(0deg);
transform: rotate(0deg);
}
to {
-webkit-transform: rotate(360deg);
transform: rotate(360deg);
}
}
@keyframes icon-rotate {
from {
transform: rotate(0deg);
}
to {
transform: rotate(360deg);
}
}
/* Files tree Part */
.imagify-add-custom-folder + .imagify-loader {
display: none;
vertical-align: middle;
}
.imagify-add-custom-folder[disabled] + .imagify-loader {
display: inline-block;
}
.imagify-folders-information {
position: relative;
margin: -5px 0 20px 0;
padding: 10px 10px 10px 40px;
text-align: left;
background: #F2F2F2;
}
.imagify-folders-information i {
position: absolute;
left: 10px;
top: 50%;
margin-top: -10px;
}
/* Tree */
.imagify-folders-tree {
margin: 0;
text-align: left;
}
.imagify-folders-tree li {
clear: left;
}
.imagify-folders-tree .imagify-folder {
box-sizing: border-box;
position: relative;
width: 48px;
z-index: 2;
float: left;
margin-top: -3px;
padding: 0 8px 0 0;
border: 0;
background: transparent!important;
box-shadow: none;
cursor: pointer;
transition: all .275s;
}
.imagify-folders-tree span.imagify-folder {
padding-left: 1.5px;
}
.imagify-folders-tree .imagify-folder:before {
content: "+";
display: inline-block;
width: 13px;
height: 21px;
font-size: 1.5em;
vertical-align: .15em;
}
.imagify-folders-tree span.imagify-folder:before {
content: '';
}
.imagify-folders-tree .imagify-folder-icon path {
transition: all .275s;
}
.imagify-folders-tree .imagify-is-open .imagify-folder-icon path {
stroke: #7A8996;
}
.imagify-folders-tree .imagify-is-open.imagify-folder:before {
content: "-";
color: #7A8996;
}
.imagify-folders-tree .imagify-is-open ~ label {
color: #7A8996;
}
.imagify-folders-tree .imagify-folder.imagify-loading:before,
.imagify-folders-tree .imagify-folder .imagify-loader {
display: none;
}
.imagify-folders-tree .imagify-folder.imagify-loading .imagify-loader {
display: inline-block;
width: 13px;
height: 21px;
font-size: 1.5em;
vertical-align: .15em;
}
.imagify-folders-tree .imagify-folder.imagify-loading .imagify-loader img {
display: inline-block;
width: 100%;
height: auto;
vertical-align: middle;
}
.imagify-folders-tree button.imagify-folder:hover,
.imagify-folders-tree button.imagify-folder:focus,
.imagify-folders-tree button.imagify-folder:hover path,
.imagify-folders-tree button.imagify-folder:focus path {
color: #3694AE;
stroke: #3694AE;
}
.imagify-folders-tree .imagify-folder:disabled,
.imagify-folders-tree .imagify-folder.disabled {
color: rgb(127, 127, 127);
}
.imagify-swal-content .imagify-folders-tree label {
position: relative;
display: block;
width: 100%;
padding: 3px 0;
font-size: 15px;
font-weight: 500;
vertical-align: top;
transition: all .475s;
}
.imagify-swal-content .imagify-folders-tree label:hover,
.imagify-folders-tree input:focus + label {
background: #F4F7F9;
}
.imagify-folders-tree .imagify-folder-already-selected label,
.imagify-folders-tree .imagify-folder-already-selected label:hover,
.imagify-folders-tree .imagify-folder-already-selected input:focus + label {
background: #40B1D0;
color: #FFF;
border-radius: 3px;
cursor: default;
}
.imagify-folders-tree .imagify-folder-already-selected button,
.imagify-folders-tree .imagify-folder-already-selected button path {
color: #FFF;
stroke: #FFF;
cursor: default;
}
.imagify-folders-tree .imagify-folder-already-selected button:hover path,
.imagify-folders-tree .imagify-folder-already-selected button:focus path {
stroke: #FFF;
}
.imagify-folders-tree .imagify-folder-already-selected button:before {
content: '';
}
/* Add Folder fake checkbox */
.imagify-add-ed-folder {
position: absolute;
top: 0;
bottom: 0;
right: 0;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.02em;
word-spacing: 0.02em;
color: #3694AE;
background: #F4F7F9;
opacity: 0;
transform: translateX(15px);
transition: all .275s;
}
label:hover .imagify-add-ed-folder,
input:focus + label .imagify-add-ed-folder,
input:checked + label .imagify-add-ed-folder,
.imagify-folder-already-selected .imagify-add-ed-folder {
opacity: 1;
transform: translateX(0);
}
input:checked + label .imagify-add-ed-folder {
background: #FFF;
}
input:checked:focus + label .imagify-add-ed-folder,
input:checked + label:hover .imagify-add-ed-folder {
background: #F4F7F9;
}
.imagify-folder-already-selected .imagify-add-ed-folder {
background: #40B1D0;
color: #FFF;
}
.imagify-fake-checkbox {
position: relative;
display: inline-block;
width: 14px;
height: 14px;
margin: 3.5px 15px 0 5px;
border: 1.5px solid #3694AE;
border-radius: 3px;
vertical-align: -4px;
}
.imagify-fake-checkbox:after {
position: absolute;
left: 1px;
top: 0;
content: "✓";
color: #3694AE;
font-size: 14px;
line-height: .9;
font-style: normal;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
opacity: 0;
transform: scale(0);
transition: all .475s;
}
input:checked + label .imagify-fake-checkbox:after,
.imagify-folder-already-selected .imagify-fake-checkbox:after {
opacity: 1;
transform: scale(1);
}
.imagify-folder-already-selected .imagify-fake-checkbox {
border-color: #40B1D0;
}
.imagify-folder-already-selected .imagify-fake-checkbox:after {
color: #FFF;
}
/* Sub Trees */
.imagify-folders-sub-tree {
position: relative;
margin-left: .75em;
padding-top: .6em;
padding-left: 1em;
border-left: 1px dotted rgba(98, 110, 123, .3);
}
.imagify-folders-sub-tree li {
position: relative;
margin-bottom: 4px;
}
.imagify-folders-sub-tree li:before {
content: "";
position: absolute;
top: 12px;
left: -1em;
height: 1px;
width: 0.9em;
border-top: 1px dotted rgba(98, 110, 123, .3);
}
.imagify-folders-sub-tree li:last-child:after {
content: "";
position: absolute;
left: -1.1em;
bottom: 0;
height: 11px;
width: 3px;
background: #FFF;
}
.imagify-empty-folder {
margin-top: -.5em;
}
.imagify-empty-folder em {
font-size: 12px;
font-weight: 500;
color: #A2AFBC;
}
@media (max-width: 782px) {
.imagify-settings.imagify-have-rocket {
margin-right: 10px;
}
label + .imagify-info, .imagify-visual-label {
max-width: calc(100% - 65px);
padding-right: 0;
}
.imagify-options-title {
font-size: 22px;
}
.imagify-user-plan-label {
margin-right: -5px;
}
.imagify-col.imagify-main {
width:100%;
padding-right: 10px;
}
.imagify-col + .imagify-col{
padding:0px 10px 0px 0px;
}
.imagify-no-api-key .imagify-api-line input[type="text"]{
margin-left: 0;
}
}
@media (max-width: 513px) {
.imagify-setting-optim-level .imagify-visual-comparison-text{
margin-top: 20px;
}
}
.imagify-col-content .imagify-space-left {
margin: 15px 30px 15px 0;
}
.imagify-col-content .imagify-space-left p {
margin: 0 0 10px 0;
font-size: 19px;
font-weight: 500;
color: #343A49;
}
.imagify-col-content .imagify-meteo-icon {
height: 64px;
margin: 15px 15px 15px 0;
}

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,172 @@
/* Sub Layer */
body[class*="_imagify"] .swal2-container.swal2-shown {
background: rgb(31, 35 ,50);
background: rgba(31, 35 ,50, .9);
z-index: 100000;
}
/* White Container */
.imagify-sweet-alert .swal2-modal {
border-radius: 2px;
}
/* To get icon background dark */
.imagify-sweet-alert {
background: #1F2332!important;
}
.imagify-sweet-alert .swal2-icon {
margin-bottom: 5px;
}
/* header error color */
.imagify-swal-error-header {
background: #C51162!important;
}
.imagify-swal-error-header .swal2-icon {
border-color: #FFF;
color: #FFF;
}
/* Title and Subtitle */
.imagify-sweet-alert .swal2-title {
margin: 0;
padding: 28px 32px;
font-size: 24px;
text-align: center;
color: #FFF;
background: #1F2332;
}
.imagify-swal-has-subtitle .swal2-title {
text-align: left;
}
.imagify-swal-error-header .swal2-title {
background: #C51162;
text-align: center;
line-height: 1.15;
}
.imagify-sweet-alert .imagify-swal-subtitle {
padding: 0 32px 28px;
margin-top: -16px;
font-weight: 500;
font-size: 14px;
text-align: left;
color: #7A8996;
background: #1F2332;
}
.imagify-swal-error-header .imagify-swal-subtitle {
color: #FFF;
background: #C51162;
text-align: center;
}
/* Buttons */
.imagify-sweet-alert .swal2-buttonswrapper,
.imagify-swal-buttonswrapper {
margin-top: 0;
padding: 22px;
background: #F4F7F9;
}
.imagify-sweet-alert button.swal2-styled,
.imagify-swal-buttonswrapper a.button.imagify-button-primary {
height: auto;
padding: 12px 32px;
margin: 10px;
font-size: 14px;
letter-spacing: 1px;
text-transform: uppercase;
border-radius: 3px;
background-color: #40b1d0 !important;
text-shadow: none!important;
box-shadow: 0 3px 0 #338ea6;
white-space: normal;
line-height: 1.5;
}
.imagify-swal-buttonswrapper a.button.imagify-button-primary:focus,
.imagify-swal-buttonswrapper a.button.imagify-button-primary:hover {
text-shadow: none;
color: #FFF;
}
.imagify-swal-buttonswrapper a.button svg {
margin-right: 12px;
vertical-align: -2px;
}
.imagify-sweet-alert button.loading {
border-radius: 100% !important;
height: 40px !important;
padding:0!important;
box-shadow: none!important;
}
.imagify-sweet-alert button.swal2-cancel {
color: #7A8996;
background: #E9EFF2 !important;
box-shadow: 0 3px 0 rgba(31, 35, 50, .2);
}
.imagify-sweet-alert-signup.imagify-sweet-alert {
background: #FFF!important;
}
.imagify-sweet-alert-signup .swal2-buttonswrapper {
padding: 12px 22px;
}
.swal2-success-circular-line-left,
.swal2-success-fix,
.swal2-success-circular-line-right {
background: #1F2332 !important
}
.imagify-sweet-alert-signup .sa-confirm-button-container {
width: 40%;
}
.imagify-sweet-alert-signup .swal2-input {
margin-top: 0;
margin-left: 40px;
margin-right: 40px;
width: calc( 100% - 80px);
}
.imagify-sweet-alert .sa-input-error:before,
.imagify-sweet-alert .sa-input-error:after,
.imagify-sweet-alert .la-ball-fall {
top: 25% !important;
}
.imagify-sweet-alert .swal2-buttonswrapper.swal2-loading .swal2-confirm.swal2-confirm {
height: 40px !important;
border-radius: 100% !important;
border-left-width: 0 !important;
border-right-width: 0 !important;
}
/* Imagify swal contents */
.imagify-sweet-alert .swal2-content {
padding: 28px 32px;
background: #FFF;
}
.imagify-swal-has-subtitle .swal2-content {
padding: 0;
}
.imagify-swal-content {
font-size: 14px;
padding: 28px 32px;
}
/* Quota */
.imagify-swal-quota .imagify-space-left {
display: flex;
align-items: center;
justify-content: space-between;
padding: 4px 32px;
text-align: left;
font-weight: bold;
color: #FFF;
background: #343A49;
}
.imagify-swal-quota .imagify-space-left p {
font-size: 14px;
}
.imagify-swal-quota .imagify-space-left [class^="imagify-bar-"] {
width: auto;
flex-basis: 269px;
}
/* Close button */
.imagify-sweet-alert .swal2-close {
color: rgba(255,255,255,.5);
}

View File

@@ -0,0 +1 @@
body[class*="_imagify"] .swal2-container.swal2-shown{background:rgb(31,35 ,50);background:rgba(31,35 ,50,.9);z-index:100000}.imagify-sweet-alert .swal2-modal{border-radius:2px}.imagify-sweet-alert{background:#1f2332!important}.imagify-sweet-alert .swal2-icon{margin-bottom:5px}.imagify-swal-error-header{background:#c51162!important}.imagify-swal-error-header .swal2-icon{border-color:#fff;color:#fff}.imagify-sweet-alert .swal2-title{margin:0;padding:28px 32px;font-size:24px;text-align:center;color:#fff;background:#1f2332}.imagify-swal-has-subtitle .swal2-title{text-align:left}.imagify-swal-error-header .swal2-title{background:#c51162;text-align:center;line-height:1.15}.imagify-sweet-alert .imagify-swal-subtitle{padding:0 32px 28px;margin-top:-16px;font-weight:500;font-size:14px;text-align:left;color:#7a8996;background:#1f2332}.imagify-swal-error-header .imagify-swal-subtitle{color:#fff;background:#c51162;text-align:center}.imagify-swal-buttonswrapper,.imagify-sweet-alert .swal2-buttonswrapper{margin-top:0;padding:22px;background:#f4f7f9}.imagify-swal-buttonswrapper a.button.imagify-button-primary,.imagify-sweet-alert button.swal2-styled{height:auto;padding:12px 32px;margin:10px;font-size:14px;letter-spacing:1px;text-transform:uppercase;border-radius:3px;background-color:#40b1d0!important;text-shadow:none!important;-webkit-box-shadow:0 3px 0 #338ea6;box-shadow:0 3px 0 #338ea6;white-space:normal;line-height:1.5}.imagify-swal-buttonswrapper a.button.imagify-button-primary:focus,.imagify-swal-buttonswrapper a.button.imagify-button-primary:hover{text-shadow:none;color:#fff}.imagify-swal-buttonswrapper a.button svg{margin-right:12px;vertical-align:-2px}.imagify-sweet-alert button.loading{border-radius:100%!important;height:40px!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-sweet-alert button.swal2-cancel{color:#7a8996;background:#e9eff2!important;-webkit-box-shadow:0 3px 0 rgba(31,35,50,.2);box-shadow:0 3px 0 rgba(31,35,50,.2)}.imagify-sweet-alert-signup.imagify-sweet-alert{background:#fff!important}.imagify-sweet-alert-signup .swal2-buttonswrapper{padding:12px 22px}.swal2-success-circular-line-left,.swal2-success-circular-line-right,.swal2-success-fix{background:#1f2332!important}.imagify-sweet-alert-signup .sa-confirm-button-container{width:40%}.imagify-sweet-alert-signup .swal2-input{margin-top:0;margin-left:40px;margin-right:40px;width:calc(100% - 80px)}.imagify-sweet-alert .la-ball-fall,.imagify-sweet-alert .sa-input-error:after,.imagify-sweet-alert .sa-input-error:before{top:25%!important}.imagify-sweet-alert .swal2-buttonswrapper.swal2-loading .swal2-confirm.swal2-confirm{height:40px!important;border-radius:100%!important;border-left-width:0!important;border-right-width:0!important}.imagify-sweet-alert .swal2-content{padding:28px 32px;background:#fff}.imagify-swal-has-subtitle .swal2-content{padding:0}.imagify-swal-content{font-size:14px;padding:28px 32px}.imagify-swal-quota .imagify-space-left{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:4px 32px;text-align:left;font-weight:700;color:#fff;background:#343a49}.imagify-swal-quota .imagify-space-left p{font-size:14px}.imagify-swal-quota .imagify-space-left [class^=imagify-bar-]{width:auto;-ms-flex-preferred-size:269px;flex-basis:269px}.imagify-sweet-alert .swal2-close{color:rgba(255,255,255,.5)}

View File

@@ -0,0 +1,716 @@
body.swal2-shown {
overflow-y: hidden; }
body.swal2-iosfix {
position: fixed;
left: 0;
right: 0; }
.swal2-container {
display: -webkit-box;
display: -ms-flexbox;
display: flex;
-webkit-box-align: center;
-ms-flex-align: center;
align-items: center;
position: fixed;
top: 0;
left: 0;
bottom: 0;
right: 0;
padding: 10px;
background-color: transparent;
z-index: 1060; }
.swal2-container.swal2-fade {
-webkit-transition: background-color .1s;
transition: background-color .1s; }
.swal2-container.swal2-shown {
background-color: rgba(0, 0, 0, 0.4); }
.swal2-modal {
background-color: #fff;
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
border-radius: 5px;
-webkit-box-sizing: border-box;
box-sizing: border-box;
text-align: center;
margin: auto;
overflow-x: hidden;
overflow-y: auto;
display: none;
position: relative;
max-width: 100%; }
.swal2-modal:focus {
outline: none; }
.swal2-modal.swal2-loading {
overflow-y: hidden; }
.swal2-modal .swal2-title {
color: #595959;
font-size: 30px;
text-align: center;
font-weight: 600;
text-transform: none;
position: relative;
margin: 0 0 .4em;
padding: 0;
display: block;
word-wrap: break-word; }
.swal2-modal .swal2-buttonswrapper {
margin-top: 15px; }
.swal2-modal .swal2-buttonswrapper:not(.swal2-loading) .swal2-styled[disabled] {
opacity: .4;
cursor: no-drop; }
.swal2-modal .swal2-buttonswrapper.swal2-loading .swal2-styled.swal2-confirm {
-webkit-box-sizing: border-box;
box-sizing: border-box;
border: 4px solid transparent;
border-color: transparent;
width: 40px;
height: 40px;
padding: 0;
margin: 7.5px;
vertical-align: top;
background-color: transparent !important;
color: transparent;
cursor: default;
border-radius: 100%;
-webkit-animation: rotate-loading 1.5s linear 0s infinite normal;
animation: rotate-loading 1.5s linear 0s infinite normal;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.swal2-modal .swal2-buttonswrapper.swal2-loading .swal2-styled.swal2-cancel {
margin-left: 30px;
margin-right: 30px; }
.swal2-modal .swal2-buttonswrapper.swal2-loading :not(.swal2-styled).swal2-confirm::after {
display: inline-block;
content: '';
margin-left: 5px 0 15px;
vertical-align: -1px;
height: 15px;
width: 15px;
border: 3px solid #999999;
-webkit-box-shadow: 1px 1px 1px #fff;
box-shadow: 1px 1px 1px #fff;
border-right-color: transparent;
border-radius: 50%;
-webkit-animation: rotate-loading 1.5s linear 0s infinite normal;
animation: rotate-loading 1.5s linear 0s infinite normal; }
.swal2-modal .swal2-styled {
border: 0;
border-radius: 3px;
-webkit-box-shadow: none;
box-shadow: none;
color: #fff;
cursor: pointer;
font-size: 17px;
font-weight: 500;
margin: 15px 5px 0;
padding: 10px 32px; }
.swal2-modal .swal2-image {
margin: 20px auto;
max-width: 100%; }
.swal2-modal .swal2-close {
background: transparent;
border: 0;
margin: 0;
padding: 0;
width: 38px;
height: 40px;
font-size: 36px;
line-height: 40px;
font-family: serif;
position: absolute;
top: 5px;
right: 8px;
cursor: pointer;
color: #cccccc;
-webkit-transition: color .1s ease;
transition: color .1s ease; }
.swal2-modal .swal2-close:hover {
color: #d55; }
.swal2-modal > .swal2-input,
.swal2-modal > .swal2-file,
.swal2-modal > .swal2-textarea,
.swal2-modal > .swal2-select,
.swal2-modal > .swal2-radio,
.swal2-modal > .swal2-checkbox {
display: none; }
.swal2-modal .swal2-content {
font-size: 18px;
text-align: center;
font-weight: 300;
position: relative;
float: none;
margin: 0;
padding: 0;
line-height: normal;
color: #545454;
word-wrap: break-word; }
.swal2-modal .swal2-input,
.swal2-modal .swal2-file,
.swal2-modal .swal2-textarea,
.swal2-modal .swal2-select,
.swal2-modal .swal2-radio,
.swal2-modal .swal2-checkbox {
margin: 20px auto; }
.swal2-modal .swal2-input,
.swal2-modal .swal2-file,
.swal2-modal .swal2-textarea {
width: 100%;
-webkit-box-sizing: border-box;
box-sizing: border-box;
font-size: 18px;
border-radius: 3px;
border: 1px solid #d9d9d9;
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06);
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06);
-webkit-transition: border-color box-shadow .3s;
transition: border-color box-shadow .3s; }
.swal2-modal .swal2-input.swal2-inputerror,
.swal2-modal .swal2-file.swal2-inputerror,
.swal2-modal .swal2-textarea.swal2-inputerror {
border-color: #f27474 !important;
-webkit-box-shadow: 0 0 2px #f27474 !important;
box-shadow: 0 0 2px #f27474 !important; }
.swal2-modal .swal2-input:focus,
.swal2-modal .swal2-file:focus,
.swal2-modal .swal2-textarea:focus {
outline: none;
border: 1px solid #b4dbed;
-webkit-box-shadow: 0 0 3px #c4e6f5;
box-shadow: 0 0 3px #c4e6f5; }
.swal2-modal .swal2-input:focus::-webkit-input-placeholder,
.swal2-modal .swal2-file:focus::-webkit-input-placeholder,
.swal2-modal .swal2-textarea:focus::-webkit-input-placeholder {
-webkit-transition: opacity .3s .03s ease;
transition: opacity .3s .03s ease;
opacity: .8; }
.swal2-modal .swal2-input:focus:-ms-input-placeholder,
.swal2-modal .swal2-file:focus:-ms-input-placeholder,
.swal2-modal .swal2-textarea:focus:-ms-input-placeholder {
-webkit-transition: opacity .3s .03s ease;
transition: opacity .3s .03s ease;
opacity: .8; }
.swal2-modal .swal2-input:focus::placeholder,
.swal2-modal .swal2-file:focus::placeholder,
.swal2-modal .swal2-textarea:focus::placeholder {
-webkit-transition: opacity .3s .03s ease;
transition: opacity .3s .03s ease;
opacity: .8; }
.swal2-modal .swal2-input::-webkit-input-placeholder,
.swal2-modal .swal2-file::-webkit-input-placeholder,
.swal2-modal .swal2-textarea::-webkit-input-placeholder {
color: #e6e6e6; }
.swal2-modal .swal2-input:-ms-input-placeholder,
.swal2-modal .swal2-file:-ms-input-placeholder,
.swal2-modal .swal2-textarea:-ms-input-placeholder {
color: #e6e6e6; }
.swal2-modal .swal2-input::placeholder,
.swal2-modal .swal2-file::placeholder,
.swal2-modal .swal2-textarea::placeholder {
color: #e6e6e6; }
.swal2-modal .swal2-range input {
float: left;
width: 80%; }
.swal2-modal .swal2-range output {
float: right;
width: 20%;
font-size: 20px;
font-weight: 600;
text-align: center; }
.swal2-modal .swal2-range input,
.swal2-modal .swal2-range output {
height: 43px;
line-height: 43px;
vertical-align: middle;
margin: 20px auto;
padding: 0; }
.swal2-modal .swal2-input {
height: 43px;
padding: 0 12px; }
.swal2-modal .swal2-input[type='number'] {
max-width: 150px; }
.swal2-modal .swal2-file {
font-size: 20px; }
.swal2-modal .swal2-textarea {
height: 108px;
padding: 12px; }
.swal2-modal .swal2-select {
color: #545454;
font-size: inherit;
padding: 5px 10px;
min-width: 40%;
max-width: 100%; }
.swal2-modal .swal2-radio {
border: 0; }
.swal2-modal .swal2-radio label:not(:first-child) {
margin-left: 20px; }
.swal2-modal .swal2-radio input,
.swal2-modal .swal2-radio span {
vertical-align: middle; }
.swal2-modal .swal2-radio input {
margin: 0 3px 0 0; }
.swal2-modal .swal2-checkbox {
color: #545454; }
.swal2-modal .swal2-checkbox input,
.swal2-modal .swal2-checkbox span {
vertical-align: middle; }
.swal2-modal .swal2-validationerror {
background-color: #f0f0f0;
margin: 0 -20px;
overflow: hidden;
padding: 10px;
color: gray;
font-size: 16px;
font-weight: 300;
display: none; }
.swal2-modal .swal2-validationerror::before {
content: '!';
display: inline-block;
width: 24px;
height: 24px;
border-radius: 50%;
background-color: #ea7d7d;
color: #fff;
line-height: 24px;
text-align: center;
margin-right: 10px; }
@supports (-ms-accelerator: true) {
.swal2-range input {
width: 100% !important; }
.swal2-range output {
display: none; } }
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
.swal2-range input {
width: 100% !important; }
.swal2-range output {
display: none; } }
.swal2-icon {
width: 80px;
height: 80px;
border: 4px solid transparent;
border-radius: 50%;
margin: 20px auto 30px;
padding: 0;
position: relative;
-webkit-box-sizing: content-box;
box-sizing: content-box;
cursor: default;
-webkit-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none; }
.swal2-icon.swal2-error {
border-color: #f27474; }
.swal2-icon.swal2-error .swal2-x-mark {
position: relative;
display: block; }
.swal2-icon.swal2-error [class^='swal2-x-mark-line'] {
position: absolute;
height: 5px;
width: 47px;
background-color: #f27474;
display: block;
top: 37px;
border-radius: 2px; }
.swal2-icon.swal2-error [class^='swal2-x-mark-line'][class$='left'] {
-webkit-transform: rotate(45deg);
transform: rotate(45deg);
left: 17px; }
.swal2-icon.swal2-error [class^='swal2-x-mark-line'][class$='right'] {
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
right: 16px; }
.swal2-icon.swal2-warning {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
color: #f8bb86;
border-color: #facea8;
font-size: 60px;
line-height: 80px;
text-align: center; }
.swal2-icon.swal2-info {
font-family: 'Open Sans', sans-serif;
color: #3fc3ee;
border-color: #9de0f6;
font-size: 60px;
line-height: 80px;
text-align: center; }
.swal2-icon.swal2-question {
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
color: #87adbd;
border-color: #c9dae1;
font-size: 60px;
line-height: 80px;
text-align: center; }
.swal2-icon.swal2-success {
border-color: #a5dc86; }
.swal2-icon.swal2-success [class^='swal2-success-circular-line'] {
border-radius: 50%;
position: absolute;
width: 60px;
height: 120px;
-webkit-transform: rotate(45deg);
transform: rotate(45deg); }
.swal2-icon.swal2-success [class^='swal2-success-circular-line'][class$='left'] {
border-radius: 120px 0 0 120px;
top: -7px;
left: -33px;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
-webkit-transform-origin: 60px 60px;
transform-origin: 60px 60px; }
.swal2-icon.swal2-success [class^='swal2-success-circular-line'][class$='right'] {
border-radius: 0 120px 120px 0;
top: -11px;
left: 30px;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg);
-webkit-transform-origin: 0 60px;
transform-origin: 0 60px; }
.swal2-icon.swal2-success .swal2-success-ring {
width: 80px;
height: 80px;
border: 4px solid rgba(165, 220, 134, 0.2);
border-radius: 50%;
-webkit-box-sizing: content-box;
box-sizing: content-box;
position: absolute;
left: -4px;
top: -4px;
z-index: 2; }
.swal2-icon.swal2-success .swal2-success-fix {
width: 7px;
height: 90px;
position: absolute;
left: 28px;
top: 8px;
z-index: 1;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg); }
.swal2-icon.swal2-success [class^='swal2-success-line'] {
height: 5px;
background-color: #a5dc86;
display: block;
border-radius: 2px;
position: absolute;
z-index: 2; }
.swal2-icon.swal2-success [class^='swal2-success-line'][class$='tip'] {
width: 25px;
left: 14px;
top: 46px;
-webkit-transform: rotate(45deg);
transform: rotate(45deg); }
.swal2-icon.swal2-success [class^='swal2-success-line'][class$='long'] {
width: 47px;
right: 8px;
top: 38px;
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg); }
.swal2-progresssteps {
font-weight: 600;
margin: 0 0 20px;
padding: 0; }
.swal2-progresssteps li {
display: inline-block;
position: relative; }
.swal2-progresssteps .swal2-progresscircle {
background: #3085d6;
border-radius: 2em;
color: #fff;
height: 2em;
line-height: 2em;
text-align: center;
width: 2em;
z-index: 20; }
.swal2-progresssteps .swal2-progresscircle:first-child {
margin-left: 0; }
.swal2-progresssteps .swal2-progresscircle:last-child {
margin-right: 0; }
.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep {
background: #3085d6; }
.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep ~ .swal2-progresscircle {
background: #add8e6; }
.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep ~ .swal2-progressline {
background: #add8e6; }
.swal2-progresssteps .swal2-progressline {
background: #3085d6;
height: .4em;
margin: 0 -1px;
z-index: 10; }
[class^='swal2'] {
-webkit-tap-highlight-color: transparent; }
@-webkit-keyframes showSweetAlert {
0% {
-webkit-transform: scale(0.7);
transform: scale(0.7); }
45% {
-webkit-transform: scale(1.05);
transform: scale(1.05); }
80% {
-webkit-transform: scale(0.95);
transform: scale(0.95); }
100% {
-webkit-transform: scale(1);
transform: scale(1); } }
@keyframes showSweetAlert {
0% {
-webkit-transform: scale(0.7);
transform: scale(0.7); }
45% {
-webkit-transform: scale(1.05);
transform: scale(1.05); }
80% {
-webkit-transform: scale(0.95);
transform: scale(0.95); }
100% {
-webkit-transform: scale(1);
transform: scale(1); } }
@-webkit-keyframes hideSweetAlert {
0% {
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1; }
100% {
-webkit-transform: scale(0.5);
transform: scale(0.5);
opacity: 0; } }
@keyframes hideSweetAlert {
0% {
-webkit-transform: scale(1);
transform: scale(1);
opacity: 1; }
100% {
-webkit-transform: scale(0.5);
transform: scale(0.5);
opacity: 0; } }
.swal2-show {
-webkit-animation: showSweetAlert 0.3s;
animation: showSweetAlert 0.3s; }
.swal2-show.swal2-noanimation {
-webkit-animation: none;
animation: none; }
.swal2-hide {
-webkit-animation: hideSweetAlert 0.15s forwards;
animation: hideSweetAlert 0.15s forwards; }
.swal2-hide.swal2-noanimation {
-webkit-animation: none;
animation: none; }
@-webkit-keyframes animate-success-tip {
0% {
width: 0;
left: 1px;
top: 19px; }
54% {
width: 0;
left: 1px;
top: 19px; }
70% {
width: 50px;
left: -8px;
top: 37px; }
84% {
width: 17px;
left: 21px;
top: 48px; }
100% {
width: 25px;
left: 14px;
top: 45px; } }
@keyframes animate-success-tip {
0% {
width: 0;
left: 1px;
top: 19px; }
54% {
width: 0;
left: 1px;
top: 19px; }
70% {
width: 50px;
left: -8px;
top: 37px; }
84% {
width: 17px;
left: 21px;
top: 48px; }
100% {
width: 25px;
left: 14px;
top: 45px; } }
@-webkit-keyframes animate-success-long {
0% {
width: 0;
right: 46px;
top: 54px; }
65% {
width: 0;
right: 46px;
top: 54px; }
84% {
width: 55px;
right: 0;
top: 35px; }
100% {
width: 47px;
right: 8px;
top: 38px; } }
@keyframes animate-success-long {
0% {
width: 0;
right: 46px;
top: 54px; }
65% {
width: 0;
right: 46px;
top: 54px; }
84% {
width: 55px;
right: 0;
top: 35px; }
100% {
width: 47px;
right: 8px;
top: 38px; } }
@-webkit-keyframes rotatePlaceholder {
0% {
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg); }
5% {
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg); }
12% {
-webkit-transform: rotate(-405deg);
transform: rotate(-405deg); }
100% {
-webkit-transform: rotate(-405deg);
transform: rotate(-405deg); } }
@keyframes rotatePlaceholder {
0% {
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg); }
5% {
-webkit-transform: rotate(-45deg);
transform: rotate(-45deg); }
12% {
-webkit-transform: rotate(-405deg);
transform: rotate(-405deg); }
100% {
-webkit-transform: rotate(-405deg);
transform: rotate(-405deg); } }
.swal2-animate-success-line-tip {
-webkit-animation: animate-success-tip 0.75s;
animation: animate-success-tip 0.75s; }
.swal2-animate-success-line-long {
-webkit-animation: animate-success-long 0.75s;
animation: animate-success-long 0.75s; }
.swal2-success.swal2-animate-success-icon .swal2-success-circular-line-right {
-webkit-animation: rotatePlaceholder 4.25s ease-in;
animation: rotatePlaceholder 4.25s ease-in; }
@-webkit-keyframes animate-error-icon {
0% {
-webkit-transform: rotateX(100deg);
transform: rotateX(100deg);
opacity: 0; }
100% {
-webkit-transform: rotateX(0deg);
transform: rotateX(0deg);
opacity: 1; } }
@keyframes animate-error-icon {
0% {
-webkit-transform: rotateX(100deg);
transform: rotateX(100deg);
opacity: 0; }
100% {
-webkit-transform: rotateX(0deg);
transform: rotateX(0deg);
opacity: 1; } }
.swal2-animate-error-icon {
-webkit-animation: animate-error-icon 0.5s;
animation: animate-error-icon 0.5s; }
@-webkit-keyframes animate-x-mark {
0% {
-webkit-transform: scale(0.4);
transform: scale(0.4);
margin-top: 26px;
opacity: 0; }
50% {
-webkit-transform: scale(0.4);
transform: scale(0.4);
margin-top: 26px;
opacity: 0; }
80% {
-webkit-transform: scale(1.15);
transform: scale(1.15);
margin-top: -6px; }
100% {
-webkit-transform: scale(1);
transform: scale(1);
margin-top: 0;
opacity: 1; } }
@keyframes animate-x-mark {
0% {
-webkit-transform: scale(0.4);
transform: scale(0.4);
margin-top: 26px;
opacity: 0; }
50% {
-webkit-transform: scale(0.4);
transform: scale(0.4);
margin-top: 26px;
opacity: 0; }
80% {
-webkit-transform: scale(1.15);
transform: scale(1.15);
margin-top: -6px; }
100% {
-webkit-transform: scale(1);
transform: scale(1);
margin-top: 0;
opacity: 1; } }
.swal2-animate-x-mark {
-webkit-animation: animate-x-mark 0.5s;
animation: animate-x-mark 0.5s; }
@-webkit-keyframes rotate-loading {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }
@keyframes rotate-loading {
0% {
-webkit-transform: rotate(0deg);
transform: rotate(0deg); }
100% {
-webkit-transform: rotate(360deg);
transform: rotate(360deg); } }

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,315 @@
/**
* Twentwenty image comparison
*/
.twentytwenty-handle {
z-index: 40;
position: absolute;
left: 50%;
top: 50%;
height: 64px;
width: 64px;
margin-left: -32px;
margin-top: -32px;
border-radius: 50%;
box-shadow: 0 3px 0 #338EA6;
background: #40B1D0;
cursor: pointer;
}
.twentytwenty-horizontal .twentytwenty-handle:before,
.twentytwenty-horizontal .twentytwenty-handle:after {
left: 50%;
width: 2px;
height: 9999px;
margin-left: -1px;
}
.twentytwenty-horizontal .twentytwenty-handle:before {
bottom: 50%;
margin-bottom: 32px;
box-shadow: 0 3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5);
}
.twentytwenty-horizontal .twentytwenty-handle:after {
top: 50%;
margin-top: 34px;
box-shadow: 0 -3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5);
}
.twentytwenty-horizontal .twentytwenty-handle:before,
.twentytwenty-horizontal .twentytwenty-handle:after {
content: "";
position: absolute;
z-index: 30;
display: block;
background: #F2F5F7;
box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5);
}
.twentytwenty-labels,
.twentytwenty-overlay {
position: absolute;
top: 0;
width: 100%;
height: 100%;
-webkit-transition-duration: 0.5s;
transition-duration: 0.5s;
}
.twentytwenty-labels {
opacity: 1;
-webkit-transition-property: opacity;
transition-property: opacity;
}
.twentytwenty-labels .twentytwenty-label-content {
position: absolute;
padding: 0 12px;
font-size: 13px;
letter-spacing: 0.1em;
line-height: 38px;
color: white;
background: #1F2332;
border-radius: 2px;
}
.twentytwenty-horizontal .twentytwenty-labels .twentytwenty-label-content {
bottom: 15px;
}
.twentytwenty-after-label .twentytwenty-label-content {
background: #40B1D0;
}
.twentytwenty-left-arrow,
.twentytwenty-right-arrow {
position: absolute;
width: 0;
height: 0;
border: 8px inset transparent;
}
.twentytwenty-left-arrow,
.twentytwenty-right-arrow {
top: 50%;
margin-top: -8px;
}
.twentytwenty-container {
box-sizing: content-box;
position: relative;
z-index: 0;
overflow: hidden;
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.15);
opacity: 0;
-webkit-transition: opacity 0.4s;
transition: opacity 0.4s;
-webkit-user-select: none;
-moz-user-select: none;
}
.twentytwenty-container * {
box-sizing: content-box;
}
.twentytwenty-container img {
position: absolute;
top: 0;
display: block;
width: 100%;
height: auto;
}
.loaded .twentytwenty-container {
opacity: 1;
}
.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-labels,
.twentytwenty-container.active .twentytwenty-overlay:hover .twentytwenty-labels {
opacity: 0;
}
.twentytwenty-horizontal .twentytwenty-before-label .twentytwenty-label-content {
left: 15px;
}
.twentytwenty-horizontal .twentytwenty-after-label .twentytwenty-label-content {
right: 15px;
}
.twentytwenty-overlay {
z-index: 25;
}
.twentytwenty-before {
z-index: 20;
}
.twentytwenty-after {
z-index: 10;
}
/* Buttons for image choices */
.twentytwenty-duo-buttons {
position: absolute;
top: 10px;
z-index: 30;
overflow: hidden;
}
.twentytwenty-duo-buttons button {
float: left;
padding: 2px 6px;
font-size: 11px;
text-transform: uppercase;
letter-spacing: 0.125em;
font-weight: bold;
border: 0;
background: #1f2332;
color: #FFF;
transition: all .3s;
cursor: pointer;
}
.twentytwenty-duo-buttons button:hover,
.twentytwenty-duo-buttons button:focus {
background: #444;
}
.twentytwenty-duo-buttons button:first-child {
border-radius: 3px 0 0 3px;
}
.twentytwenty-duo-buttons button:last-child {
border-radius: 0 3px 3px 0;
}
.twentytwenty-duo-buttons button.selected {
background: #8bc34a;
text-shadow: 0 0 1px rgba(0,0,0,.2);
cursor: default;
}
.twentytwenty-duo-left {
left: 10px;
}
.twentytwenty-duo-right {
right: 10px;
}
.twentytwenty-left-arrow {
left: 50%;
margin-left: -22px;
border-right: 8px solid white;
}
.twentytwenty-right-arrow {
right: 50%;
margin-right: -22px;
border-left: 8px solid white;
}
#imagify-visual-comparison .close-btn,
.imagify-visual-comparison .close-btn {
top: 50px;
right: 5px;
width: 33px;
height: 33px;
padding: 1px 0 0 2px;
border: 1px solid #F2F2F2;
color: #F2F2F2;
line-height: 19px;
text-align: center;
border-radius: 50%;
}
.imagify-modal .imagify-comparison-title {
font-size: 28px;
margin-bottom: 1em;
color: #F2F2F2;
text-align: left;
}
.imagify-modal .imagify-comparison-title .twentytwenty-duo-buttons {
position: static;
margin: 0 10px 0 15px;
}
.imagify-comparison-title .twentytwenty-duo-buttons button {
float: none;
padding: 6px 12px;
font-size: 16px;
text-transform: none;
border: 1px solid #40B1D0;
color: #888899;
letter-spacing: 0;
}
.imagify-comparison-title .twentytwenty-duo-buttons button:focus {
outline: none;
box-shadow: none;
}
.imagify-comparison-title .twentytwenty-duo-buttons .selected {
border: 1px solid #40B1D0;
color: #FFF;
background: #40B1D0;
}
.imagify-comparison-levels {
margin: 15px 0;
overflow: hidden;
}
.imagify-comparison-levels .imagify-c-level {
display: none;
min-width: 175px;
font-size: 11px;
}
.imagify-c-level.go-left {
float: left;
}
.imagify-c-level.go-right {
float: right;
}
.imagify-c-level.go-right,
.imagify-c-level.go-left {
display: table;
}
.imagify-c-level .imagify-c-level-row {
display: table-row;
margin: 0;
color: #FFF;
}
.imagify-c-level-row > span {
display: table-cell;
padding: 2px 0;
}
.imagify-c-level-row .value {
text-align: right;
padding-left: 5px;
}
.imagify-c-level-row .value.level {
color: #40b1d0;
}
.imagify-c-level-row .value.size {
color: #8bc34a;
font-weight: bold;
}
/* TT Loader */
.imagify-modal .loader {
position: absolute;
top: 50%;
left: 50%;
margin: -32px 0 0 -32px;
opacity: 0;
visibility: hidden;
transition: opacity .4s;
}
.imagify-modal .loading .loader {
visibility: visible;
opacity: 1;
}
/* Specifics for too high modals */
.modal-is-too-high .imagify-comparison-levels {
position: absolute;
padding: 15px 20px;
background: rgba(31, 35, 50, 0.95);
bottom: 0; left: 0; right: 0;
margin-bottom: 0;
}

File diff suppressed because one or more lines are too long

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.9 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 38 36" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m233.09 177.21l-5.52 10.248c-.08.145-.018.272-.023.388-.074.193-.033.4-.033.619v21.615c0 .952.601 1.429 1.552 1.429h33.897c.952 0 1.962-.478 1.962-1.429v-21.615c0-.487-.323-.925-.649-1.24l-5.623-9.976c-.405-.726-1.202-1.179-2.034-1.182l-21.486-.068c-.849 0-1.64.464-2.043 1.211m30.424 32.869c0 .173-.378.018-.551.018h-33.897c-.172 0-.14.155-.14-.018v-21.576l33.961-.281c.066.008.186.09.263.128.054.027.205.049.258.073.002.014.106.027.106.041v21.615m-6.153-32.11l4.91 8.835h-14.992v-9.354l9.306.045c.322.001.619.192.776.474m-11.494-.523v9.358h-16.306l4.773-8.892c.155-.289.456-.484.787-.484l10.746.018m7.06 17.12c0 .39-.316.706-.706.706h-12.706c-.39 0-.706-.316-.706-.706 0-.39.316-.706.706-.706h12.706c.39 0 .706.316.706.706" transform="translate(-227-176)" fill="#7a8996"/></g></svg>

After

Width:  |  Height:  |  Size: 888 B

View File

@@ -0,0 +1 @@
<svg xmlns="http://www.w3.org/2000/svg" width="15px" height="16px" viewBox="0 0 15 16" enable-background="new 0 0 15 16"><path d="m13.8 1c-.5-.3-1.1-.1-1.4.4l-6.4 11.1-3.6-3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4l4.6 4.2c.4.4 1 .4 1.4 0 .1-.1 7.2-12.4 7.2-12.4.2-.5.1-1.1-.4-1.4" fill="#8ba6b3"/></svg>

After

Width:  |  Height:  |  Size: 299 B

View File

@@ -0,0 +1,9 @@
<?xml version="1.0" encoding="utf-8"?>
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
width="8px" height="8px" viewBox="0 0 8 8" style="enable-background:new 0 0 8 8;" xml:space="preserve">
<style type="text/css">
.st0{fill:#8BA6B3;}
</style>
<path class="st0" d="M7.5,0.1C7.3,0,6.9,0.1,6.8,0.3L3.2,6.5l-2-1.9C1,4.4,0.6,4.4,0.4,4.6s-0.2,0.6,0,0.8L3,7.8
C3.2,8,3.6,8,3.8,7.8c0.1-0.1,4-7,4-7C7.9,0.6,7.8,0.3,7.5,0.1"/>
</svg>

After

Width:  |  Height:  |  Size: 508 B

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
<title>Path</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Imagify-Settings-Page" sketch:type="MSArtboardGroup" transform="translate(-409.000000, -548.000000)" fill="#8BA6B4">
<g id="checkboxes" sketch:type="MSLayerGroup" transform="translate(403.000000, 347.000000)">
<path d="M13.3901875,201.101875 C13.12075,200.944375 12.7770625,201.04 12.6218125,201.304375 L9.024625,207.536875 L7.012,205.680625 C6.799375,205.455625 6.4433125,205.444375 6.216625,205.658125 C5.9899375,205.86625 5.978125,206.22625 6.19075,206.45125 L8.7625,208.825 C8.9745625,209.05 9.330625,209.06125 9.5573125,208.8475 C9.6259375,208.785625 13.5960625,201.866875 13.5960625,201.866875 C13.7513125,201.6025 13.6590625,201.25375 13.3901875,201.101875 L13.3901875,201.101875 Z" id="Path" sketch:type="MSShapeGroup"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

View File

@@ -0,0 +1,14 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="15px" height="16px" viewBox="0 0 15 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
<title>Path</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="Imagify-Settings-Page" sketch:type="MSArtboardGroup" transform="translate(-411.000000, -355.000000)" fill="#8BA6B4">
<g id="checkboxes" sketch:type="MSLayerGroup" transform="translate(403.000000, 347.000000)">
<path d="M22.027,9.07 C21.548,8.79 20.937,8.96 20.661,9.43 L14.266,20.51 L10.688,17.21 C10.31,16.81 9.677,16.79 9.274,17.17 C8.871,17.54 8.85,18.18 9.228,18.58 L13.8,22.8 C14.177,23.2 14.81,23.22 15.213,22.84 C15.335,22.73 22.393,10.43 22.393,10.43 C22.669,9.96 22.505,9.34 22.027,9.07 L22.027,9.07 Z" id="Path" sketch:type="MSShapeGroup"></path>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1,22 @@
<?xml version="1.0" encoding="utf-8"?>
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
viewBox="0 0 74 63.3" style="enable-background:new 0 0 74 63.3;" xml:space="preserve">
<style type="text/css">
.st0{fill:#F5A623;}
</style>
<g>
<circle class="st0" cx="41.9" cy="11.5" r="1.2"/>
<circle class="st0" cx="27.7" cy="5.7" r="1.2"/>
<circle class="st0" cx="7.1" cy="26.3" r="1.2"/>
<circle class="st0" cx="13.3" cy="11.7" r="1.2"/>
</g>
<path class="st0" d="M45.8,16.1c-1.9,0-3.7,0.2-5.5,0.7c-2.9-3.8-7.5-6.3-12.7-6.3c-8.8,0-15.9,7.1-15.9,15.9c0,2.6,0.6,5.1,1.8,7.2
c-1.6,0.7-3,1.7-4.3,3c-5.9,5.9-6,15.4-0.2,21.2c2.3,2.3,5.3,2.9,7.6,3.1c0.5,0.1,12.1,0.3,20.9,0.3c1.6,0,3,0,4.3,0
c1.2,0,2.3,0,3.2,0c1.9,0,3.2-0.1,4.3-0.3c0,0,0,0,0,0c0,0,0,0,0,0C60,58.8,68.1,49.3,68.1,38.9C68.1,26.3,58.1,16.1,45.8,16.1z
M13.7,26.4c0-7.7,6.2-13.9,13.9-13.9c4.3,0,8.1,2,10.6,5c-6.7,2.5-12.1,8.1-14.2,15.2c-2.9-0.8-5.9-0.7-8.8,0.2
C14.3,31,13.7,28.8,13.7,26.4z M48.9,59.2C48.9,59.2,48.9,59.2,48.9,59.2c-1.3,0.3-3.7,0.2-7,0.2c-1.3,0-2.8,0-4.4,0
c-9.3,0-20.1-0.3-20.6-0.3c-2.2-0.2-4.6-0.7-6.4-2.6c-5-5-4.9-13.3,0.2-18.4c3.6-3.6,9-4.9,13.7-3.2c0.5,0.2,1.1-0.1,1.3-0.6
c0-0.1,0-0.1,0-0.2c0.1-0.1,0.2-0.2,0.2-0.4c2.4-9,10.8-15.6,19.9-15.6c11.2,0,20.2,9.3,20.2,20.8C66.1,48.3,58.7,57.1,48.9,59.2z"
/>
</svg>

After

Width:  |  Height:  |  Size: 1.5 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m203.25 10h-16.5c-.415 0-.75.336-.75.75v16.5c0 .414.336.75.75.75h8.812v-6.75h-2.25v-2.813h2.25v-2.25c0-2.325 1.472-3.469 3.546-3.469.993 0 1.847.074 2.096.107v2.43h-1.438c-1.128 0-1.391.536-1.391 1.322v1.859h2.813l-.563 2.813h-2.25l.045 6.75h4.83c.414 0 .75-.336.75-.75v-16.5c0-.414-.336-.75-.75-.75" transform="translate(-186-10)" fill="#fff"/></g></svg>

After

Width:  |  Height:  |  Size: 459 B

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 49 48" xmlns="http://www.w3.org/2000/svg"><g fill="#7a8996" fill-rule="evenodd" transform="translate(.868)"><path d="m3 29.25h2.875c.647 0 1.22.413 1.424 1.027l.547 1.64c.182.543.043 1.132-.361 1.537l-1.925 1.924c-.567.567-.88 1.321-.88 2.123 0 .802.313 1.556.88 2.123l2.815 2.816c.567.567 1.321.88 2.123.88.802 0 1.556-.313 2.123-.88l1.924-1.924c.399-.398 1-.54 1.536-.362l1.641.547c.614.205 1.027.777 1.027 1.424v2.876c0 1.655 1.346 3 3 3h4.497c1.655 0 3-1.346 3-3v-2.876c0-.647.413-1.219 1.027-1.424l1.641-.547c.535-.178 1.138-.036 1.536.362l1.924 1.924c.567.567 1.321.88 2.123.88.802 0 1.556-.313 2.123-.88l2.816-2.816c.567-.567.88-1.321.88-2.123 0-.802-.313-1.556-.88-2.123l-1.924-1.924c-.405-.405-.544-.994-.362-1.537l.546-1.64c.205-.614.778-1.027 1.425-1.027h2.876c1.655 0 3-1.346 3-3v-4.497c0-1.655-1.346-3-3-3h-2.876c-.647 0-1.22-.413-1.424-1.027l-.547-1.64c-.181-.543-.043-1.132.362-1.537l1.924-1.924c.567-.567.88-1.321.88-2.123 0-.802-.313-1.556-.88-2.123l-2.816-2.815c-.567-.567-1.321-.88-2.123-.88-.802 0-1.556.313-2.123.88l-1.924 1.924c-.398.399-1 .541-1.536.362l-1.641-.547c-.614-.205-1.027-.777-1.027-1.424v-2.875c0-1.655-1.346-3-3-3h-4.497c-1.655 0-3 1.346-3 3v2.875c0 .647-.413 1.22-1.027 1.424l-1.641.547c-.533.179-1.137.037-1.536-.362l-1.924-1.924c-.567-.567-1.321-.88-2.123-.88-.802 0-1.556.313-2.123.88l-2.815 2.815c-.567.567-.88 1.321-.88 2.123 0 .802.313 1.556.88 2.123l1.925 1.924c.404.405.543.994.361 1.537l-.546 1.64c-.205.614-.778 1.027-1.425 1.027h-2.875c-1.655 0-3 1.346-3 3v4.497c0 1.655 1.346 3 3 3m-1.502-7.499c0-.828.674-1.502 1.502-1.502h2.875c1.294 0 2.438-.825 2.849-2.053l.546-1.64c.361-1.085.084-2.262-.724-3.071l-1.925-1.924c-.283-.284-.44-.661-.44-1.062 0-.401.157-.778.44-1.062l2.816-2.816c.567-.567 1.557-.567 2.124 0l1.924 1.924c.796.796 2 1.082 3.071.725l1.641-.547c1.227-.409 2.052-1.553 2.052-2.848v-2.875c0-.828.674-1.502 1.502-1.502h4.497c.827 0 1.502.674 1.502 1.502v2.875c0 1.295.825 2.438 2.052 2.848l1.641.547c1.067.356 2.276.071 3.071-.725l1.924-1.924c.567-.567 1.557-.567 2.124 0l2.816 2.816c.284.284.44.661.44 1.062 0 .401-.157.778-.44 1.062l-1.924 1.924c-.809.809-1.087 1.986-.725 3.071l.547 1.641c.41 1.227 1.554 2.052 2.848 2.052h2.876c.828 0 1.502.674 1.502 1.502v4.497c0 .828-.673 1.502-1.502 1.502h-2.876c-1.294 0-2.438.825-2.848 2.053l-.546 1.64c-.361 1.085-.084 2.262.725 3.071l1.924 1.924c.284.284.44.661.44 1.062 0 .401-.157.778-.44 1.062l-2.816 2.816c-.567.567-1.557.567-2.124 0l-1.924-1.924c-.795-.796-2-1.081-3.071-.725l-1.641.547c-1.227.41-2.052 1.553-2.052 2.848v2.876c0 .828-.674 1.502-1.502 1.502h-4.497c-.828 0-1.502-.673-1.502-1.502v-2.876c0-1.294-.825-2.438-2.052-2.848l-1.641-.547c-.307-.102-.626-.154-.949-.154-.802 0-1.556.312-2.123.879l-1.924 1.924c-.567.567-1.557.567-2.124 0l-2.816-2.816c-.283-.284-.44-.661-.44-1.062 0-.401.157-.778.44-1.062l1.925-1.924c.808-.809 1.086-1.986.724-3.071l-.547-1.641c-.409-1.227-1.554-2.052-2.848-2.052h-2.875c-.827 0-1.502-.674-1.502-1.502v-4.497"/><path d="m24 29.25c.396 0 .797-.044 1.192-.132 1.951-.433 3.493-1.974 3.925-3.926.354-1.595-.019-3.226-1.021-4.475-1.251-1.558-3.293-2.279-5.289-1.834-1.951.433-3.493 1.974-3.925 3.926-.354 1.595.019 3.225 1.021 4.474 1 1.25 2.496 1.967 4.096 1.967m-3.653-6.117c.302-1.364 1.422-2.484 2.786-2.787.289-.063.581-.096.867-.096 1.144 0 2.209.512 2.927 1.405.716.893.982 2.064.727 3.212-.302 1.364-1.422 2.484-2.786 2.787-.289.063-.58.096-.866.096-1.144 0-2.21-.512-2.927-1.406-.716-.893-.982-2.064-.727-3.212"/></g></svg>

After

Width:  |  Height:  |  Size: 3.4 KiB

View File

@@ -0,0 +1 @@
<svg width="36" height="33" viewBox="0 0 36 33" xmlns="http://www.w3.org/2000/svg"><g fill="#40b1d0" fill-rule="nonzero"><path d="m35.38 26.295c0-.002 0-.002 0 0l-13.501-23.787c-.8-1.41-2.247-2.252-3.873-2.252-1.625 0-3.071.843-3.872 2.252l-13.5 23.786c-.791 1.393-.78 3.051.027 4.437.807 1.386 2.246 2.214 3.846 2.214l27 0c1.6 0 3.038-.828 3.844-2.212.807-1.386.818-3.045.029-4.437m-1.325 3.681c-.534.919-1.488 1.469-2.548 1.469l-27 0c-1.062 0-2.01-.549-2.55-1.469-.534-.919-.541-2.02-.018-2.941l13.5-23.787c.529-.934 1.489-1.493 2.566-1.493 1.078 0 2.038.558 2.568 1.493l13.502 23.786c.523.924.516 2.025-.02 2.943"/><path d="m18.01 9.459c-.414 0-.75.336-.75.75l0 10.772c0 .414.336.75.75.75.414 0 .75-.336.75-.75l0-10.772c0-.414-.336-.75-.75-.75"/><path d="m18.01 24.933c-.414 0-.75.336-.75.75l0 .373c0 .414.336.75.75.75.414 0 .75-.336.75-.75l0-.373c0-.416-.336-.75-.75-.75"/></g></svg>

After

Width:  |  Height:  |  Size: 887 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 401 B

View File

@@ -0,0 +1,12 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="29px" height="30px" viewBox="0 0 29 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>Shape</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Bulk-Optimize" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
<g id="Bulk-Optimize-Free-Account-Popup-0-Pricing-One-Time" transform="translate(-770.000000, -526.000000)" fill="#1F2332">
<path d="M802.296271,541.590991 L799.162499,532.943366 C798.845155,532.07067 797.893123,531.634322 797.020427,531.951666 C796.147731,532.26901 795.711383,533.221042 796.028727,534.093738 L797.774119,538.933235 C793.608979,536.156474 788.650479,534.64909 783.572975,534.64909 C777.70211,534.64909 772.188258,536.553154 767.626438,540.162943 C766.912414,540.718295 766.79341,541.789331 767.348762,542.503355 C767.904114,543.217379 768.97515,543.336383 769.689174,542.781031 C773.695642,539.647259 778.49547,537.981203 783.612643,537.981203 C788.214131,537.981203 792.696615,539.409251 796.465075,541.987671 L791.585911,543.772731 C790.713215,544.090075 790.276867,545.042107 790.594211,545.914803 C790.832219,546.589159 791.466907,547.025507 792.141263,547.025507 C792.339603,547.025507 792.537943,546.985839 792.696615,546.906503 L801.344239,543.772731 L801.344239,543.772731 C802.177267,543.415719 802.613615,542.463687 802.296271,541.590991 L802.296271,541.590991 Z" id="Shape" transform="translate(784.700047, 539.436891) scale(-1, 1) rotate(-310.000000) translate(-784.700047, -539.436891) "></path>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View File

@@ -0,0 +1 @@
<svg width="36" height="47" viewBox="0 0 36 47" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" transform="translate(-594-569)"><path d="m13.304 31.3l-7.826 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l7.826 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m0-4.696l-7.826 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l7.826 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m0 9.391l-7.826 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l7.826 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m0 4.696l-7.826 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l7.826 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m-8.609-22.696c0 .432.351.783.783.783l25.04 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783l-25.04 0c-.432 0-.783.351-.783.783m30.522-18l-21.913 0c-.105 0-.207.022-.302.061-.045.019-.08.053-.121.08-.044.03-.094.05-.131.088l-12.522 12.522c-.036.036-.056.085-.085.127-.028.042-.064.078-.083.125-.039.095-.061.197-.061.302l0 32.87c0 .432.351.783.783.783l34.435 0c.432 0 .783-.351.783-.783l0-45.39c0-.432-.351-.783-.783-.783m-22.696 2.672l0 9.85-9.85 0 9.85-9.85m21.913 42.719l-32.87 0 0-31.3 11.739 0c.432 0 .783-.351.783-.783l0-11.739 20.348 0 0 43.826m-3.913-23.478l-25.04 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l25.04 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m0 4.696l-14.09 0c-.432 0-.783.351-.783.783l0 14.09c0 .011.006.019.006.03.003.063.019.121.036.182.011.039.017.08.034.116.022.047.056.086.086.128.03.041.056.083.094.117.009.009.014.02.023.03.03.025.066.033.097.052.045.028.091.058.142.077.05.017.1.023.152.031.038.003.072.02.111.02l14.09 0c.161 0 .302-.059.426-.144.014-.009.03-.005.044-.014.014-.011.02-.025.033-.036.044-.038.08-.081.114-.128.028-.038.055-.072.075-.111.022-.044.034-.091.049-.141.014-.052.028-.102.031-.155.002-.019.011-.033.011-.052l0-14.09c0-.434-.351-.784-.783-.784m-12.417 14.09l2.446-2.936 2.576 1.288c.34.171.75.072.977-.23l1.722-2.295 3.13 4.173-10.852 0m11.634-1.567l-3.287-4.383c-.296-.394-.958-.394-1.252 0l-1.957 2.608-2.547-1.273c-.327-.164-.72-.08-.952.199l-2.528 3.033 0-11.14 12.522 0 0 10.955m-9.391-6.259c.862 0 1.565-.703 1.565-1.565 0-.862-.703-1.565-1.565-1.565-.862 0-1.565.703-1.565 1.565 0 .862.703 1.565 1.565 1.565" transform="translate(594 569)" fill="#40b1d0" fill-rule="nonzero"/></g></svg>

After

Width:  |  Height:  |  Size: 2.3 KiB

View File

@@ -0,0 +1 @@
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="#000" fill-rule="nonzero" transform="translate(1 1)" stroke="#fff"><polygon points="8.75 0 8.75 0.7 12.8065 0.7 5.0015 8.5015 5.4985 8.9985 13.3 1.1935 13.3 5.25 14 5.25 14 0"/><polygon points="11.9 13.3 0.7 13.3 0.7 2.1 6.3 2.1 6.3 1.4 0 1.4 0 14 12.6 14 12.6 7.7 11.9 7.7"/></g></svg>

After

Width:  |  Height:  |  Size: 378 B

View File

@@ -0,0 +1,7 @@
<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg">
<g fill="#40b1d0" fill-rule="evenodd">
<polygon points="11.6054688 11.6054688 8.7890625 11.6054688 8.7890625 0.39453125 11.6054688 0.39453125"/>
<polygon points="7.39453125 11.6054688 4.60546875 11.6054688 4.60546875 3.89453125 7.39453125 3.89453125"/>
<polygon points="3.2109375 11.6054688 0.39453125 11.6054688 0.39453125 6 3.2109375 6"/>
</g>
</svg>

After

Width:  |  Height:  |  Size: 444 B

View File

@@ -0,0 +1 @@
<svg width="27" height="28" viewBox="0 0 27 28" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m13.3.254c-.773 0-1.4.627-1.4 1.4l0 4.2c0 .773.627 1.4 1.4 1.4.773 0 1.4-.627 1.4-1.4l0-4.2c0-.773-.627-1.4-1.4-1.4m-8.422 3.478c-.358 0-.711.142-.984.416-.547.547-.547 1.444 0 1.991l2.975 2.953c.547.547 1.422.547 1.969 0 .547-.547.547-1.422 0-1.969l-2.953-2.975c-.273-.273-.648-.416-1.01-.416m16.844 0c-.358 0-.733.142-1.01.416l-2.953 2.975c-.547.547-.547 1.422 0 1.969.547.547 1.422.547 1.969 0l2.975-2.953c.547-.547.547-1.444 0-1.991-.273-.273-.626-.416-.984-.416m-20.322 8.422c-.773 0-1.4.627-1.4 1.4 0 .773.627 1.4 1.4 1.4l4.2 0c.773 0 1.4-.627 1.4-1.4 0-.773-.627-1.4-1.4-1.4l-4.2 0m19.6 0c-.773 0-1.4.627-1.4 1.4 0 .773.627 1.4 1.4 1.4l4.2 0c.773 0 1.4-.627 1.4-1.4 0-.773-.627-1.4-1.4-1.4l-4.2 0m-13.147 5.447c-.358 0-.711.142-.984.416l-2.975 2.953c-.547.547-.547 1.444 0 1.991.547.547 1.444.547 1.991 0l2.953-2.975c.547-.547.547-1.422 0-1.969-.273-.273-.626-.416-.984-.416m10.894 0c-.358 0-.711.142-.984.416-.547.547-.547 1.422 0 1.969l2.953 2.975c.547.547 1.444.547 1.991 0 .547-.547.547-1.444 0-1.991l-2.975-2.953c-.273-.273-.626-.416-.984-.416m-5.447 2.253c-.773 0-1.4.627-1.4 1.4l0 4.2c0 .773.627 1.4 1.4 1.4.773 0 1.4-.627 1.4-1.4l0-4.2c0-.773-.627-1.4-1.4-1.4" fill="#40b1d0" fill-rule="nonzero"/></g></svg>

After

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 262 B

View File

@@ -0,0 +1,2 @@
<svg height="19" viewBox="0 0 448 512" width="16" xmlns="http://www.w3.org/2000/svg">
<path d="m400 224h-24v-72c0-83.8-68.2-152-152-152s-152 68.2-152 152v72h-24c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-192c0-26.5-21.5-48-48-48zm-104 0h-144v-72c0-39.7 32.3-72 72-72s72 32.3 72 72z" fill="#8bc34a" fill-rule="evenodd"/></svg>

After

Width:  |  Height:  |  Size: 355 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 438 B

View File

@@ -0,0 +1,16 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="75px" height="54px" viewBox="0 0 75 54" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
<title>Shape</title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Bulk-Optimize" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.15">
<g id="Bulk-Optimize-Free-Account-Popup-0-Pricing-One-Time" transform="translate(-602.000000, -556.000000)" fill="#FFFFFF">
<g id="Group-16" transform="translate(541.000000, 544.000000)">
<g id="Shape">
<path d="M135.847615,65.4118845 L135.847615,30.0205479 L98.4782609,12.3256648 L61.1089067,30.0205479 L61.1089067,65.4110993 L98.4782609,83.1067676 L135.847615,65.4118845 L135.847615,65.4118845 Z M98.4782609,45.4491918 L68.2896132,31.1544527 L80.9908469,25.1402027 L111.180452,39.4349418 L98.4782609,45.4491918 L98.4782609,45.4491918 Z M100.87183,77.4403845 L100.87183,48.8493358 L113.573063,42.8350858 L113.573063,48.4205878 L118.360201,46.1535635 L118.360201,40.5680614 L131.061435,34.5538114 L131.061435,63.1440749 L100.87183,77.4403845 L100.87183,77.4403845 Z M128.666909,31.1544527 L115.965675,37.1687027 L85.7770272,22.8731783 L98.4782609,16.8589283 L128.666909,31.1544527 L128.666909,31.1544527 Z M65.8960444,34.5545967 L96.084692,48.8493358 L96.084692,77.4395993 L65.8960444,63.1448602 L65.8960444,34.5545967 L65.8960444,34.5545967 Z"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1 @@
<svg width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg"><g fill="#40b1d0" fill-rule="nonzero"><path d="m18 36c-9.925 0-18-8.07-18-18 0-9.925 8.07-18 18-18 9.925 0 18 8.07 18 18 0 9.925-8.07 18-18 18m0-34.435c-9.06 0-16.435 7.372-16.435 16.435 0 9.06 7.372 16.435 16.435 16.435 9.06 0 16.435-7.372 16.435-16.435 0-9.06-7.372-16.435-16.435-16.435"/><path d="m27.391 18.783l-9.391 0c-.432 0-.783-.351-.783-.783l0-12.522c0-.432.351-.783.783-.783.432 0 .783.351.783.783l0 11.739 8.609 0c.432 0 .783.351.783.783 0 .432-.351.783-.783.783"/></g></svg>

After

Width:  |  Height:  |  Size: 570 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 25 KiB

View File

@@ -0,0 +1,32 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg width="256px" height="256px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
<title>WordPress Plugin </title>
<desc>Created with Sketch.</desc>
<defs></defs>
<g id="Marketing-stuff" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
<g id="WordPress-Plugin-" sketch:type="MSArtboardGroup">
<g id="Group-+-Group" sketch:type="MSLayerGroup" transform="translate(-1.000000, 0.000000)">
<g id="Group" transform="translate(0.626812, 0.000000)" sketch:type="MSShapeGroup">
<rect id="Rectangle-7" fill="#2E3243" x="0.373188406" y="0" width="256" height="256"></rect>
<path d="M81.9742306,158.483219 L54.1635666,109.918063 L64.2449323,103.97844 L61.2900493,96.6412582 L43.3869343,106.948252 L79.0193476,169.139602 L106.830012,153.06768 C107.003828,150.272563 107.351462,147.477446 107.699095,144.68233 L101.094062,147.302752 L81.9742306,158.483219 L81.9742306,158.483219 Z" id="Shape" fill="#FFFFFF"></path>
<path d="M70.6761484,87.033044 L79.0193476,83.8885375 L77.1073644,76.3766609 L60.7685993,82.6656738 L85.798197,148.875005 L108.741995,140.140265 C109.611078,136.821063 111.001611,133.501862 112.565961,130.357356 L90.3174299,138.917401 L70.6761484,87.033044 L70.6761484,87.033044 Z" id="Shape" fill="#FFFFFF"></path>
<path d="M114.477944,64.6721089 L103.179862,112.189096 L137.943192,105.026609 C140.028992,103.97844 142.114792,103.104966 144.374408,102.406187 C146.981658,101.532713 149.588908,100.833934 152.196157,100.309849 C155.324857,99.7857647 158.627373,99.4363751 161.92989,99.4363751 L162.103706,99.4363751 L164.710956,99.4363751 L172.185072,97.8641219 L150.284174,78.2983037 L141.593342,89.1293816 L114.477944,64.6721089 L114.477944,64.6721089 Z" id="Shape" fill="#FFFFFF"></path>
<ellipse id="Oval" fill="#FFFFFF" cx="156.367757" cy="64.1480245" rx="6.77884936" ry="6.81309739"></ellipse>
<path d="M116.563744,123.544258 C118.997177,119.875667 121.95206,116.731161 125.08076,113.761349 L98.4868124,119.176888 L87.1887302,64.3227193 L167.665839,47.7267129 L178.790105,102.056797 C181.744988,103.104966 184.699871,104.32783 187.480937,105.725388 L173.749422,38.4678882 L78.1502643,58.0337064 L92.5770463,128.435713 L116.563744,123.544258 L116.563744,123.544258 Z" id="Shape" fill="#FFFFFF"></path>
<ellipse id="Oval" fill="#00A8DC" cx="161.40844" cy="155.164018" rx="4.17159961" ry="4.19267532"></ellipse>
<path d="M162.277523,104.502524 C134.988309,104.502524 112.739778,126.863459 112.739778,154.465239 C112.739778,160.579557 113.782678,166.344485 115.868477,171.760024 L132.554876,171.760024 C130.121443,167.392654 128.557093,162.5012 128.035643,157.260356 L122.647327,157.260356 C121.082977,157.260356 120.040077,156.037492 120.040077,154.465239 C120.040077,152.892985 121.256794,151.670122 122.647327,151.670122 L128.035643,151.670122 C128.557093,144.158245 131.511976,137.519843 136.031209,132.104304 L132.207243,128.261018 C131.164343,127.212849 131.164343,125.465901 132.207243,124.417732 C133.250142,123.369563 134.988309,123.369563 136.031209,124.417732 L139.855175,128.261018 C145.243491,123.718953 151.848524,120.749141 159.32264,120.225057 L159.32264,114.634823 C159.32264,113.06257 160.539357,111.839706 161.92989,111.839706 C163.49424,111.839706 164.710956,113.06257 164.710956,114.634823 L164.710956,120.225057 C171.489806,120.749141 177.747205,123.369563 182.961704,127.387544 L185.916588,125.291206 C187.480937,124.068343 189.566737,124.243037 190.95727,125.640596 C192.347804,127.038154 192.52162,129.309187 191.304904,130.706745 L169.230189,162.15181 C165.232406,166.169791 158.975007,166.344485 154.803407,162.5012 C154.62959,162.326505 154.62959,162.326505 154.455774,162.15181 C150.457991,158.13383 150.457991,151.320732 154.455774,147.302752 C154.977224,146.778667 155.324857,146.429278 155.846307,146.079888 L155.846307,146.079888 L177.747205,131.056135 C173.227972,127.911628 167.839656,126.16468 161.92989,126.16468 C146.286391,126.16468 133.771592,138.917401 133.771592,154.639933 C133.771592,161.103641 135.857392,167.043265 139.507542,171.760024 L184.526054,171.760024 C188.176204,167.043265 190.262004,161.103641 190.262004,154.639933 C190.262004,150.971343 189.566737,147.652141 188.350021,144.507635 L192.347804,138.917401 C194.433603,142.935382 195.65032,147.302752 195.997953,152.019511 L201.386269,152.019511 C202.950619,152.019511 203.993519,153.242375 203.993519,154.814628 C203.993519,156.386881 202.776803,157.609745 201.386269,157.609745 L195.997953,157.609745 C195.65032,162.850589 194.08597,167.742044 191.47872,172.109414 L208.686569,172.109414 C210.598552,166.693875 211.815268,160.928946 211.815268,154.814628 C211.641452,126.863459 189.566737,104.502524 162.277523,104.502524 L162.277523,104.502524 Z" id="Shape" fill="#00A8DC"></path>
</g>
<g id="Group" transform="translate(43.000000, 194.489583)" fill="#FFFFFF" sketch:type="MSShapeGroup">
<path d="M3.77407837,0.466865079 L0.644354843,0.466865079 C0.30683564,0.466865079 0,0.776137858 0,1.11633791 L0,23.5386144 C0,23.8788144 0.30683564,24.1880872 0.644354843,24.1880872 L3.77407837,24.1880872 C4.11159757,24.1880872 4.41843321,23.8788144 4.41843321,23.5386144 L4.41843321,1.11633791 C4.38774965,0.776137858 4.08091401,0.466865079 3.77407837,0.466865079 L3.77407837,0.466865079 Z" id="Shape"></path>
<path d="M38.0093602,0.611552716 C37.9786767,0.333207215 37.7638917,0.11671627 37.395689,0.11671627 L36.8433848,0.11671627 C36.5365492,0.11671627 36.3831313,0.240425381 36.2603971,0.456916326 L28.8656582,16.446319 L28.7736075,16.446319 L21.3788686,0.456916326 C21.2868179,0.240425381 21.0720329,0.11671627 20.7958808,0.11671627 L20.2435767,0.11671627 C19.8753739,0.11671627 19.660589,0.364134493 19.6299054,0.611552716 L15.6410421,23.3740292 C15.579675,23.8379384 15.855827,24.1472112 16.2853969,24.1472112 L19.3230698,24.1472112 C19.6299054,24.1472112 19.9060575,23.8688657 19.9367411,23.6523747 L21.9004891,10.8175544 L21.9925398,10.8175544 L27.9451513,24.1162839 C28.0372019,24.3327748 28.2213033,24.4874112 28.528139,24.4874112 L29.1418102,24.4874112 C29.4486459,24.4874112 29.6327473,24.3327748 29.724798,24.1162839 L35.6160422,10.8175544 L35.7080929,10.8175544 L37.7025246,23.6523747 C37.7638917,23.899793 38.0400438,24.1472112 38.3468794,24.1472112 L41.4152358,24.1472112 C41.8448057,24.1472112 42.1209578,23.8379384 42.0289071,23.3740292 L38.0093602,0.611552716 L38.0093602,0.611552716 Z" id="Shape"></path>
<path d="M62.0639694,0.487843604 C61.9719187,0.271352659 61.8185008,0.11671627 61.4809816,0.11671627 L61.1434624,0.11671627 C60.8366268,0.11671627 60.683209,0.271352659 60.5604747,0.487843604 L50.0973794,23.2812474 C49.8825945,23.7142293 50.1587465,24.1472112 50.6803671,24.1472112 L53.5953057,24.1472112 C54.1476098,24.1472112 54.4237619,23.8070111 54.5771797,23.4668111 L56.2340922,19.8173923 L66.2983012,19.8173923 L67.9552136,23.4668111 C68.2006821,23.9307202 68.4154671,24.1472112 68.9370877,24.1472112 L71.8520263,24.1472112 C72.3429633,24.1472112 72.6191154,23.7142293 72.435014,23.2812474 L62.0639694,0.487843604 L62.0639694,0.487843604 Z M57.9216882,16.0442644 L61.2048296,8.59079041 L61.2968803,8.59079041 L64.6413887,16.0442644 L57.9216882,16.0442644 L57.9216882,16.0442644 Z" id="Shape"></path>
<path d="M100.514948,12.3090566 L94.0713998,12.3090566 C93.7031971,12.3090566 93.427045,12.5874021 93.427045,12.9585294 L93.427045,15.6182753 C93.427045,15.9584754 93.7031971,16.2368209 94.0713998,16.2368209 L96.7715535,16.2368209 L96.7715535,19.1130577 C96.0965151,19.3914032 94.6543875,19.9480942 92.7826901,19.9480942 C88.5483583,19.9480942 85.2345334,16.3914573 85.2345334,12.1853475 C85.2345334,7.94831041 88.5483583,4.3298189 92.7520066,4.3298189 C94.5930204,4.3298189 96.3726671,5.01021901 97.8147946,6.30916469 C98.1216303,6.58751019 98.4284659,6.58751019 98.6739344,6.30916469 L100.760417,4.11332796 C101.036569,3.83498246 101.005885,3.43292784 100.729733,3.15458234 C98.4591495,1.17523656 95.5442109,1.77635684e-15 92.5372216,1.77635684e-15 C85.8482047,1.77635684e-15 80.478581,5.44320091 80.478581,12.2162748 C80.478581,18.9893486 85.8482047,24.3397677 92.5372216,24.3397677 C97.4159083,24.3397677 100.883151,22.143931 100.883151,22.143931 C101.005885,22.0511491 101.159303,21.8655855 101.159303,21.58724 L101.159303,12.9276021 C101.097936,12.6183294 100.852467,12.3090566 100.514948,12.3090566 L100.514948,12.3090566 Z" id="Shape"></path>
<path d="M116.444092,0.466865079 L113.314368,0.466865079 C112.976849,0.466865079 112.670013,0.776137858 112.670013,1.11633791 L112.670013,23.5386144 C112.670013,23.8788144 112.976849,24.1880872 113.314368,24.1880872 L116.444092,24.1880872 C116.781611,24.1880872 117.088447,23.8788144 117.088447,23.5386144 L117.088447,1.11633791 C117.088447,0.776137858 116.781611,0.466865079 116.444092,0.466865079 L116.444092,0.466865079 Z" id="Shape"></path>
<path d="M144.252919,0.466865079 L130.56805,0.466865079 C130.199847,0.466865079 129.923695,0.776137858 129.923695,1.11633791 L129.923695,23.5386144 C129.923695,23.8788144 130.199847,24.1880872 130.56805,24.1880872 L133.66709,24.1880872 C134.004609,24.1880872 134.311444,23.8788144 134.311444,23.5386144 L134.311444,14.9717584 L142.596007,14.9717584 C142.933526,14.9717584 143.240362,14.6624856 143.240362,14.3222856 L143.240362,11.5388306 C143.240362,11.1986305 142.933526,10.8893577 142.596007,10.8893577 L134.311444,10.8893577 L134.311444,4.51833848 L144.252919,4.51833848 C144.621122,4.51833848 144.897274,4.2090657 144.897274,3.86886565 L144.897274,1.08541064 C144.897274,0.776137858 144.651805,0.466865079 144.252919,0.466865079 L144.252919,0.466865079 Z" id="Shape"></path>
<path d="M172.362315,0.466865079 L168.895072,0.466865079 C168.61892,0.466865079 168.465502,0.621501469 168.342768,0.776137858 L162.973144,8.56981188 L157.60352,0.776137858 C157.51147,0.652428747 157.327368,0.466865079 157.051216,0.466865079 L153.614657,0.466865079 C153.062353,0.466865079 152.816884,1.02355608 153.062353,1.45653797 L160.733244,12.7759217 L160.733244,23.5386144 C160.733244,23.8788144 161.009396,24.1880872 161.377599,24.1880872 L164.476639,24.1880872 C164.814158,24.1880872 165.120994,23.8788144 165.120994,23.5386144 L165.120994,12.7140671 L172.883935,1.42561069 C173.160087,0.992628803 172.883935,0.466865079 172.362315,0.466865079 L172.362315,0.466865079 Z" id="Shape"></path>
</g>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 11 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 51 50" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" transform="translate(1.5 1)"><path d="m41.36 22.552h-23.986c-.323-2.979-2.74-5.302-5.666-5.302-3.146 0-5.705 2.684-5.705 5.982 0 3.299 2.559 5.982 5.705 5.982 2.951 0 5.386-2.361 5.676-5.376h17.547v3.857c0 .355.287.643.643.643.355 0 .643-.287.643-.643v-3.857h4.499l-.009 5.703c-.001.355.287.726.642.726.355 0 .644-.368.644-.723l.01-6.306c0-.17-.067-.355-.188-.475-.12-.122-.284-.21-.455-.21m-29.652 5.376c-2.436 0-4.419-2.107-4.419-4.696 0-2.59 1.983-4.697 4.419-4.697 2.437 0 4.42 2.107 4.42 4.697 0 2.589-1.983 4.696-4.42 4.696" fill="#7a8996"/><circle stroke="#7a8996" stroke-width="2" cx="24" cy="24" r="24"/></g></svg>

After

Width:  |  Height:  |  Size: 718 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 734 B

View File

@@ -0,0 +1,144 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="#7a8996">
<circle transform="translate(8 0)" cx="0" cy="16" r="0">
<animate attributeName="r" values="0; 4; 0; 0" dur="1.2s" repeatCount="indefinite" begin="0" keytimes="0;0.2;0.7;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"/>
</circle>
<circle transform="translate(16 0)" cx="0" cy="16" r="0">
<animate attributeName="r" values="0; 4; 0; 0" dur="1.2s" repeatCount="indefinite" begin="0.3" keytimes="0;0.2;0.7;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"/>
</circle>
<circle transform="translate(24 0)" cx="0" cy="16" r="0">
<animate attributeName="r" values="0; 4; 0; 0" dur="1.2s" repeatCount="indefinite" begin="0.6" keytimes="0;0.2;0.7;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"/>
</circle>
<style xmlns="http://www.w3.org/1999/xhtml" charset="utf-8" type="text/css" class="firebugResetStyles">/* See license.txt for terms of usage */
/** reset styling **/
.firebugResetStyles {
z-index: 2147483646 !important;
top: 0 !important;
left: 0 !important;
display: block !important;
border: 0 none !important;
margin: 0 !important;
padding: 0 !important;
outline: 0 !important;
min-width: 0 !important;
max-width: none !important;
min-height: 0 !important;
max-height: none !important;
position: fixed !important;
transform: rotate(0deg) !important;
transform-origin: 50% 50% !important;
border-radius: 0 !important;
box-shadow: none !important;
background: transparent none !important;
pointer-events: none !important;
white-space: normal !important;
}
style.firebugResetStyles {
display: none !important;
}
.firebugBlockBackgroundColor {
background-color: transparent !important;
}
.firebugResetStyles:before, .firebugResetStyles:after {
content: "" !important;
}
/**actual styling to be modified by firebug theme**/
.firebugCanvas {
display: none !important;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
.firebugLayoutBox {
width: auto !important;
position: static !important;
}
.firebugLayoutBoxOffset {
opacity: 0.8 !important;
position: fixed !important;
}
.firebugLayoutLine {
opacity: 0.4 !important;
background-color: #000000 !important;
}
.firebugLayoutLineLeft, .firebugLayoutLineRight {
width: 1px !important;
height: 100% !important;
}
.firebugLayoutLineTop, .firebugLayoutLineBottom {
width: 100% !important;
height: 1px !important;
}
.firebugLayoutLineTop {
margin-top: -1px !important;
border-top: 1px solid #999999 !important;
}
.firebugLayoutLineRight {
border-right: 1px solid #999999 !important;
}
.firebugLayoutLineBottom {
border-bottom: 1px solid #999999 !important;
}
.firebugLayoutLineLeft {
margin-left: -1px !important;
border-left: 1px solid #999999 !important;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
.firebugLayoutBoxParent {
border-top: 0 none !important;
border-right: 1px dashed #E00 !important;
border-bottom: 1px dashed #E00 !important;
border-left: 0 none !important;
position: fixed !important;
width: auto !important;
}
.firebugRuler{
position: absolute !important;
}
.firebugRulerH {
top: -15px !important;
left: 0 !important;
width: 100% !important;
height: 14px !important;
background: url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%13%88%00%00%00%0E%08%02%00%00%00L%25a%0A%00%00%00%04gAMA%00%00%D6%D8%D4OX2%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%04%F8IDATx%DA%EC%DD%D1n%E2%3A%00E%D1%80%F8%FF%EF%E2%AF2%95%D0D4%0E%C1%14%B0%8Fa-%E9%3E%CC%9C%87n%B9%81%A6W0%1C%A6i%9A%E7y%0As8%1CT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AATE9%FE%FCw%3E%9F%AF%2B%2F%BA%97%FDT%1D~K(%5C%9D%D5%EA%1B%5C%86%B5%A9%BDU%B5y%80%ED%AB*%03%FAV9%AB%E1%CEj%E7%82%EF%FB%18%BC%AEJ8%AB%FA'%D2%BEU9%D7U%ECc0%E1%A2r%5DynwVi%CFW%7F%BB%17%7Dy%EACU%CD%0E%F0%FA%3BX%FEbV%FEM%9B%2B%AD%BE%AA%E5%95v%AB%AA%E3E5%DCu%15rV9%07%B5%7F%B5w%FCm%BA%BE%AA%FBY%3D%14%F0%EE%C7%60%0EU%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5JU%88%D3%F5%1F%AE%DF%3B%1B%F2%3E%DAUCNa%F92%D02%AC%7Dm%F9%3A%D4%F2%8B6%AE*%BF%5C%C2Ym~9g5%D0Y%95%17%7C%C8c%B0%7C%18%26%9CU%CD%13i%F7%AA%90%B3Z%7D%95%B4%C7%60%E6E%B5%BC%05%B4%FBY%95U%9E%DB%FD%1C%FC%E0%9F%83%7F%BE%17%7DkjMU%E3%03%AC%7CWj%DF%83%9An%BCG%AE%F1%95%96yQ%0Dq%5Dy%00%3Et%B5'%FC6%5DS%95pV%95%01%81%FF'%07%00%00%00%00%00%00%00%00%00%F8x%C7%F0%BE%9COp%5D%C9%7C%AD%E7%E6%EBV%FB%1E%E0(%07%E5%AC%C6%3A%ABi%9C%8F%C6%0E9%AB%C0'%D2%8E%9F%F99%D0E%B5%99%14%F5%0D%CD%7F%24%C6%DEH%B8%E9rV%DFs%DB%D0%F7%00k%FE%1D%84%84%83J%B8%E3%BA%FB%EF%20%84%1C%D7%AD%B0%8E%D7U%C8Y%05%1E%D4t%EF%AD%95Q%BF8w%BF%E9%0A%BF%EB%03%00%00%00%00%00%00%00%00%00%B8vJ%8E%BB%F5%B1u%8Cx%80%E1o%5E%CA9%AB%CB%CB%8E%03%DF%1D%B7T%25%9C%D5(%EFJM8%AB%CC'%D2%B2*%A4s%E7c6%FB%3E%FA%A2%1E%80~%0E%3E%DA%10x%5D%95Uig%15u%15%ED%7C%14%B6%87%A1%3B%FCo8%A8%D8o%D3%ADO%01%EDx%83%1A~%1B%9FpP%A3%DC%C6'%9C%95gK%00%00%00%00%00%00%00%00%00%20%D9%C9%11%D0%C0%40%AF%3F%EE%EE%92%94%D6%16X%B5%BCMH%15%2F%BF%D4%A7%C87%F1%8E%F2%81%AE%AAvzr%DA2%ABV%17%7C%E63%83%E7I%DC%C6%0Bs%1B%EF6%1E%00%00%00%00%00%00%00%00%00%80cr%9CW%FF%7F%C6%01%0E%F1%CE%A5%84%B3%CA%BC%E0%CB%AA%84%CE%F9%BF)%EC%13%08WU%AE%AB%B1%AE%2BO%EC%8E%CBYe%FE%8CN%ABr%5Dy%60~%CFA%0D%F4%AE%D4%BE%C75%CA%EDVB%EA(%B7%F1%09g%E5%D9%12%00%00%00%00%00%00%00%00%00H%F6%EB%13S%E7y%5E%5E%FB%98%F0%22%D1%B2'%A7%F0%92%B1%BC%24z3%AC%7Dm%60%D5%92%B4%7CEUO%5E%F0%AA*%3BU%B9%AE%3E%A0j%94%07%A0%C7%A0%AB%FD%B5%3F%A0%F7%03T%3Dy%D7%F7%D6%D4%C0%AAU%D2%E6%DFt%3F%A8%CC%AA%F2%86%B9%D7%F5%1F%18%E6%01%F8%CC%D5%9E%F0%F3z%88%AA%90%EF%20%00%00%00%00%00%00%00%00%00%C0%A6%D3%EA%CFi%AFb%2C%7BB%0A%2B%C3%1A%D7%06V%D5%07%A8r%5D%3D%D9%A6%CAu%F5%25%CF%A2%99%97zNX%60%95%AB%5DUZ%D5%FBR%03%AB%1C%D4k%9F%3F%BB%5C%FF%81a%AE%AB'%7F%F3%EA%FE%F3z%94%AA%D8%DF%5B%01%00%00%00%00%00%00%00%00%00%8E%FB%F3%F2%B1%1B%8DWU%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*UiU%C7%BBe%E7%F3%B9%CB%AAJ%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5*%AAj%FD%C6%D4%5Eo%90%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5%86%AF%1B%9F%98%DA%EBm%BBV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%AD%D6%E4%F58%01%00%00%00%00%00%00%00%00%00%00%00%00%00%40%85%7F%02%0C%008%C2%D0H%16j%8FX%00%00%00%00IEND%AEB%60%82") repeat-x !important;
border-top: 1px solid #BBBBBB !important;
border-right: 1px dashed #BBBBBB !important;
border-bottom: 1px solid #000000 !important;
}
.firebugRulerV {
top: 0 !important;
left: -15px !important;
width: 14px !important;
height: 100% !important;
background: url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0E%00%00%13%88%08%02%00%00%00%0E%F5%CB%10%00%00%00%04gAMA%00%00%D6%D8%D4OX2%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%06~IDATx%DA%EC%DD%D1v%A20%14%40Qt%F1%FF%FF%E4%97%D9%07%3BT%19%92%DC%40(%90%EEy%9A5%CB%B6%E8%F6%9Ac%A4%CC0%84%FF%DC%9E%CF%E7%E3%F1%88%DE4%F8%5D%C7%9F%2F%BA%DD%5E%7FI%7D%F18%DDn%BA%C5%FB%DF%97%BFk%F2%10%FF%FD%B4%F2M%A7%FB%FD%FD%B3%22%07p%8F%3F%AE%E3%F4S%8A%8F%40%EEq%9D%BE8D%F0%0EY%A1Uq%B7%EA%1F%81%88V%E8X%3F%B4%CEy%B7h%D1%A2E%EBohU%FC%D9%AF2fO%8BBeD%BE%F7X%0C%97%A4%D6b7%2Ck%A5%12%E3%9B%60v%B7r%C7%1AI%8C%BD%2B%23r%00c0%B2v%9B%AD%CA%26%0C%1Ek%05A%FD%93%D0%2B%A1u%8B%16-%95q%5Ce%DCSO%8E%E4M%23%8B%F7%C2%FE%40%BB%BD%8C%FC%8A%B5V%EBu%40%F9%3B%A72%FA%AE%8C%D4%01%CC%B5%DA%13%9CB%AB%E2I%18%24%B0n%A9%0CZ*Ce%9C%A22%8E%D8NJ%1E%EB%FF%8F%AE%CAP%19*%C3%BAEKe%AC%D1%AAX%8C*%DEH%8F%C5W%A1e%AD%D4%B7%5C%5B%19%C5%DB%0D%EF%9F%19%1D%7B%5E%86%BD%0C%95%A12%AC%5B*%83%96%CAP%19%F62T%86%CAP%19*%83%96%CA%B8Xe%BC%FE)T%19%A1%17xg%7F%DA%CBP%19*%C3%BA%A52T%86%CAP%19%F62T%86%CA%B0n%A9%0CZ%1DV%C6%3D%F3%FCH%DE%B4%B8~%7F%5CZc%F1%D6%1F%AF%84%F9%0F6%E6%EBVt9%0E~%BEr%AF%23%B0%97%A12T%86%CAP%19%B4T%86%CA%B8Re%D8%CBP%19*%C3%BA%A52huX%19%AE%CA%E5%BC%0C%7B%19*CeX%B7h%A9%0C%95%E1%BC%0C%7B%19*CeX%B7T%06%AD%CB%5E%95%2B%BF.%8F%C5%97%D5%E4%7B%EE%82%D6%FB%CF-%9C%FD%B9%CF%3By%7B%19%F62T%86%CA%B0n%D1R%19*%A3%D3%CA%B0%97%A12T%86uKe%D0%EA%B02*%3F1%99%5DB%2B%A4%B5%F8%3A%7C%BA%2B%8Co%7D%5C%EDe%A8%0C%95a%DDR%19%B4T%C66%82fA%B2%ED%DA%9FC%FC%17GZ%06%C9%E1%B3%E5%2C%1A%9FoiB%EB%96%CA%A0%D5qe4%7B%7D%FD%85%F7%5B%ED_%E0s%07%F0k%951%ECr%0D%B5C%D7-g%D1%A8%0C%EB%96%CA%A0%A52T%C6)*%C3%5E%86%CAP%19%D6-%95A%EB*%95q%F8%BB%E3%F9%AB%F6%E21%ACZ%B7%22%B7%9B%3F%02%85%CB%A2%5B%B7%BA%5E%B7%9C%97%E1%BC%0C%EB%16-%95%A12z%AC%0C%BFc%A22T%86uKe%D0%EA%B02V%DD%AD%8A%2B%8CWhe%5E%AF%CF%F5%3B%26%CE%CBh%5C%19%CE%CB%B0%F3%A4%095%A1%CAP%19*Ce%A8%0C%3BO*Ce%A8%0C%95%A12%3A%AD%8C%0A%82%7B%F0v%1F%2FD%A9%5B%9F%EE%EA%26%AF%03%CA%DF9%7B%19*Ce%A8%0C%95%A12T%86%CA%B8Ze%D8%CBP%19*Ce%A8%0C%95%D1ae%EC%F7%89I%E1%B4%D7M%D7P%8BjU%5C%BB%3E%F2%20%D8%CBP%19*Ce%A8%0C%95%A12T%C6%D5*%C3%5E%86%CAP%19*Ce%B4O%07%7B%F0W%7Bw%1C%7C%1A%8C%B3%3B%D1%EE%AA%5C%D6-%EBV%83%80%5E%D0%CA%10%5CU%2BD%E07YU%86%CAP%19*%E3%9A%95%91%D9%A0%C8%AD%5B%EDv%9E%82%FFKOee%E4%8FUe%A8%0C%95%A12T%C6%1F%A9%8C%C8%3D%5B%A5%15%FD%14%22r%E7B%9F%17l%F8%BF%ED%EAf%2B%7F%CF%ECe%D8%CBP%19*Ce%A8%0C%95%E1%93~%7B%19%F62T%86%CAP%19*Ce%A8%0C%E7%13%DA%CBP%19*Ce%A8%0CZf%8B%16-Z%B4h%D1R%19f%8B%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1%A2%A52%CC%16-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2EKe%98-Z%B4h%D1%A2EKe%D02%5B%B4h%D1%A2EKe%D02%5B%B4h%D1%A2E%8B%96%CA0%5B%B4h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%16-%95a%B6h%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-Z*%C3l%D1%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z%B4T%86%D9%A2E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4h%A9%0C%B3E%8B%16-Z%B4h%A9%0CZf%8B%16-Z%B4h%A9%0CZf%8B%16-Z%B4h%D1R%19f%8B%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1%A2%A52%CC%16-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2EKe%98-Z%B4h%D1%A2EKe%D02%5B%B4h%D1%A2EKe%D02%5B%B4h%D1%A2E%8B%96%CA0%5B%B4h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%16-%95a%B6h%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-Z*%C3l%D1%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z%B4T%86%D9%A2E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4h%A9%0C%B3E%8B%16-Z%B4h%A9%0CZf%8B%16-Z%B4h%A9%0CZf%8B%16-Z%B4h%D1R%19f%8B%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1%A2%A52%CC%16-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2EKe%98-Z%B4h%D1%A2EKe%D02%5B%B4h%D1%A2EKe%D02%5B%B4h%D1%A2E%8B%96%CA0%5B%B4h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%16-%95a%B6h%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-Z*%C3l%D1%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z%B4T%86%D9%A2E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4%AE%A4%F5%25%C0%00%DE%BF%5C'%0F%DA%B8q%00%00%00%00IEND%AEB%60%82") repeat-y !important;
border-left: 1px solid #BBBBBB !important;
border-right: 1px solid #000000 !important;
border-bottom: 1px dashed #BBBBBB !important;
}
.overflowRulerX &gt; .firebugRulerV {
left: 0 !important;
}
.overflowRulerY &gt; .firebugRulerH {
top: 0 !important;
}
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
.fbProxyElement {
position: fixed !important;
pointer-events: auto !important;
}
</style></svg>

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 35 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 21 18" xmlns="http://www.w3.org/2000/svg"><g fill="#40b1d0" fill-rule="evenodd"><path d="m1.967 5.913c.259.183 1.041.726 2.344 1.629 1.304.903 2.302 1.599 2.996 2.087.076.053.238.17.486.349.248.179.454.324.617.435.164.11.362.234.595.372.233.137.452.24.658.308.206.069.396.103.572.103h.012.012c.175 0 .366-.034.572-.103.206-.068.425-.172.658-.308.232-.137.431-.261.595-.372.164-.11.37-.255.617-.435.248-.179.41-.295.486-.349.701-.488 2.485-1.727 5.351-3.716.556-.389 1.021-.858 1.395-1.406.374-.549.56-1.124.56-1.726 0-.503-.181-.934-.543-1.292-.362-.358-.791-.537-1.286-.537h-16.832c-.587 0-1.039.198-1.355.595-.316.396-.475.892-.475 1.487 0 .48.21 1 .629 1.561.419.56.865 1 1.338 1.321"/><path d="m19.348 7.136c-2.5 1.692-4.399 3.01-5.694 3.945-.435.32-.787.57-1.058.749-.271.179-.631.362-1.081.549-.45.187-.869.28-1.258.28h-.012-.012c-.389 0-.808-.093-1.258-.28-.45-.187-.81-.37-1.081-.549-.271-.179-.623-.429-1.058-.749-1.029-.755-2.924-2.07-5.683-3.945-.435-.29-.82-.621-1.155-.995v9.08c0 .503.179.934.537 1.292.358.358.789.538 1.292.538h16.832c.503 0 .934-.179 1.292-.538.358-.358.537-.789.537-1.292v-9.08c-.328.366-.709.698-1.144.995"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 327 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 44 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 19 16" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m18.15 5.733c-.259-.259-.571-.388-.937-.388v-3.973c0-.359-.131-.669-.393-.931-.262-.262-.573-.393-.931-.393-3.18 2.649-6.27 3.973-9.27 3.973h-4.966c-.455 0-.845.162-1.169.486-.324.324-.486.714-.486 1.169v1.986c0 .455.162.845.486 1.169.324.324.714.486 1.169.486h1.262c-.117.373-.193.754-.228 1.143-.034.39-.046.729-.036 1.019.01.29.062.638.155 1.045.093.407.172.714.238.921.066.207.176.533.331.978.155.445.257.747.305.905.317.29.772.481 1.366.574.593.093 1.174.053 1.743-.119.569-.172.954-.459 1.154-.859-.262-.207-.474-.381-.636-.523-.162-.141-.328-.314-.497-.517-.169-.203-.284-.393-.347-.569-.062-.176-.083-.376-.062-.6.021-.224.1-.45.238-.678-.262-.269-.4-.588-.414-.957-.014-.369.093-.716.321-1.04.228-.324.541-.552.941-.683 2.725.228 5.525 1.538 8.401 3.931.358 0 .669-.131.931-.393.262-.262.393-.573.393-.931v-3.973c.366 0 .678-.129.937-.388.258-.259.388-.571.388-.936 0-.366-.13-.678-.388-.936m-2.261 5.861c-2.697-2.062-5.345-3.238-7.946-3.528v-2.793c2.579-.283 5.228-1.466 7.946-3.549v9.87" fill="#40b1d0"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9.4 KiB

View File

@@ -0,0 +1,29 @@
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="64" height="64" fill="white">
<circle fill="#66748c" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
<circle fill="#66748c" transform="rotate(45 16 16)" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0.125s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
<circle fill="#66748c" transform="rotate(90 16 16)" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0.25s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
<circle fill="#66748c" transform="rotate(135 16 16)" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0.375s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
<circle fill="#66748c" transform="rotate(180 16 16)" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0.5s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
<circle fill="#66748c" transform="rotate(225 16 16)" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0.625s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
<circle fill="#66748c" transform="rotate(270 16 16)" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0.75s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
<circle fill="#66748c" transform="rotate(315 16 16)" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0.875s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
<circle fill="#66748c" transform="rotate(180 16 16)" cx="16" cy="3" r="0">
<animate attributeName="r" values="0;3;0;0" dur="1s" repeatCount="indefinite" begin="0.5s" keySplines="0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8;0.2 0.2 0.4 0.8" calcMode="spline" />
</circle>
</svg>

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.5 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 39 36" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m1273.12 126.78c-.12 0-.24-.06-.36-.12-.24-.18-.3-.6-.12-.84l5.58-7.26h-3.84c-.48 0-.9-.24-1.08-.66-.18-.42-.18-.9.12-1.26l2.16-2.82c.18-.24.6-.3.84-.12.24.18.3.6.12.84l-2.16 2.82h3.84c.48 0 .9.24 1.08.66.18.42.18.9-.12 1.26l-5.58 7.26c-.12.18-.3.24-.48.24m11.76-8.34c6.12-1.32 10.56-6.96 10.56-13.38 0-7.56-6-13.68-13.32-13.68-6 0-11.52 4.32-13.14 10.26-.06.3.12.66.42.72.3.06.66-.12.72-.42 1.44-5.4 6.48-9.36 11.94-9.36 6.72 0 12.12 5.58 12.12 12.48 0 5.88-4.02 10.98-9.6 12.18-.3.06-.54.42-.48.72.06.3.3.48.6.48h.18m-18.66 0c0-.36-.24-.6-.54-.66-1.8-.12-3.54-.9-4.8-2.22-3-3-2.94-7.98.12-11.04 2.16-2.16 5.4-2.94 8.22-1.92.3.12.66-.06.78-.36.12-.3-.06-.66-.36-.78-3.24-1.08-6.96-.24-9.48 2.28-3.54 3.54-3.6 9.24-.12 12.72 1.5 1.5 3.48 2.4 5.58 2.52h.06c.3.06.54-.18.54-.54" transform="translate(-1257-91)" fill="#C51162"/></g></svg>

After

Width:  |  Height:  |  Size: 939 B

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 37 38" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m1107.26 119.4c0 .555-.449 1-1 1-.554 0-1-.449-1-1 0-.554.45-1 1-1 .555 0 1 .45 1 1m3.716-13.671c-.554 0-1 .449-1 1 0 .555.45 1 1 1 .555 0 1-.449 1-1 0-.555-.449-1-1-1m-4.779-12.667c-.555 0-1 .45-1 1 0 .555.449 1 1 1 .554 0 1-.449 1-1 0-.554-.45-1-1-1m-12.38-5.067c-.555 0-1 .45-1 1 0 .555.449 1 1 1 .554 0 1-.449 1-1 0-.554-.45-1-1-1m-17.818 17.949c-.554 0-1 .449-1 1 0 .555.45 1 1 1 .555 0 1-.449 1-1 0-.555-.449-1-1-1m5.354-12.667c-.555 0-1 .45-1 1 0 .555.45 1 1 1 .554 0 1-.449 1-1 0-.554-.45-1-1-1m.287 24.7c-.554 0-1 .45-1 1 0 .555.45 1 1 1 .554 0 1-.449 1-1 0-.554-.45-1-1-1m11.949 5.485c-.554 0-1 .45-1 1 0 .555.45 1 1 1 .555 0 1-.449 1-1 0-.554-.449-1-1-1m13.829-16.436c0-7.496-6.098-13.593-13.593-13.593-7.495 0-13.593 6.098-13.593 13.593 0 7.495 6.098 13.593 13.593 13.593 7.495 0 13.593-6.098 13.593-13.593m-1.267 0c0 6.796-5.53 12.326-12.326 12.326-6.797 0-12.327-5.53-12.327-12.326 0-6.796 5.53-12.327 12.327-12.327 6.796 0 12.326 5.53 12.326 12.327" transform="translate(-1075-88)" fill="#F5A623"/></g></svg>

After

Width:  |  Height:  |  Size: 1.1 KiB

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 23 18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m244.15 12.13c-.815.361-1.691.606-2.61.716.939-.563 1.659-1.453 1.998-2.514-.878.521-1.851.898-2.886 1.103-.829-.883-2.01-1.435-3.317-1.435-2.51 0-4.544 2.034-4.544 4.544 0 .356.04.703.118 1.035-3.777-.19-7.125-1.999-9.367-4.748-.391.671-.615 1.452-.615 2.285 0 1.576.802 2.967 2.02 3.782-.745-.024-1.445-.228-2.058-.568-.001.019-.001.038-.001.057 0 2.202 1.566 4.04 3.646 4.456-.381.104-.783.159-1.197.159-.293 0-.577-.028-.855-.081.578 1.805 2.256 3.119 4.245 3.156-1.555 1.219-3.515 1.945-5.644 1.945-.367 0-.728-.021-1.084-.063 2.01 1.289 4.399 2.041 6.966 2.041 8.359 0 12.929-6.925 12.929-12.929 0-.197-.004-.393-.013-.588.888-.64 1.658-1.44 2.268-2.352" transform="translate(-222-10)" fill="#fff"/></g></svg>

After

Width:  |  Height:  |  Size: 819 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 557 B

View File

@@ -0,0 +1 @@
<svg viewBox="0 0 48 48" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m247.84 188c-13.145 0-23.839 10.694-23.839 23.838 0 13.145 10.694 23.838 23.839 23.838 13.145 0 23.838-10.694 23.838-23.838 0-13.145-10.693-23.838-23.838-23.838m-11.709 42.879c.843-.346 1.89-.371 3.466-.371h2.247c.244 0 .473-.12.61-.322l2.581-3.785c.104-.151.135-.328.116-.498.85.42 1.75.668 2.68.668.952 0 1.873-.261 2.741-.701-.029.182.007.375.122.538l2.643 3.784c.137.199.363.316.605.316h2.694c1.443 0 2.281.018 2.969.336-3.42 2.125-7.45 3.356-11.764 3.356-4.29 0-8.301-1.217-11.709-3.321m19.223-25.11c.839 2.898 1.558 8-.083 9.361-.17.14-.267.349-.267.569 0 4.144-3.378 9.399-7.173 9.399-3.796 0-7.173-5.256-7.173-9.399 0-.102-.021-.203-.062-.297-2.169-4.94-.335-9.511-.316-9.556.037-.09.056-.186.056-.283 0-2.455.442-4.333 5.999-4.333.138 0 .272-.038.39-.112 1.589-.986 3.1-1.486 4.49-1.486 1.567 0 2.878.649 3.692 1.827.778 1.127.953 2.562.467 3.841-.056.149-.062.314-.018.467m5.598 24.17c-1.224-.91-2.546-.905-4.321-.905h-2.305l-2.423-3.468c-.095-.136-.23-.218-.377-.266 2.8-1.955 4.827-5.837 4.948-9.277 2.363-2.479.772-8.944.363-10.435.55-1.671.288-3.511-.718-4.968-1.081-1.566-2.869-2.464-4.906-2.464-1.614 0-3.325.537-5.089 1.597-6.28.058-7.237 2.737-7.266 5.668-.326.87-1.821 5.403.323 10.432.06 3.491 2.118 7.48 4.976 9.461-.133.052-.256.131-.343.257l-2.361 3.462h-1.857c-1.924 0-3.483.009-4.844.922-5.613-4.067-9.274-10.669-9.274-18.11 0-12.331 10.03-22.362 22.362-22.362 12.33 0 22.361 10.03 22.361 22.362 0 7.435-3.651 14.03-9.249 18.1" transform="translate(-224-188)" fill="#7a8996"/></g></svg>

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@@ -0,0 +1,37 @@
// Admin bar =======================================================================================
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
var busy = false;
$( d ).on( 'mouseenter', '#wp-admin-bar-imagify', function() {
var $adminBarProfile, url;
if ( true === busy ) {
return;
}
busy = true;
$adminBarProfile = $( '#wp-admin-bar-imagify-profile-content' );
if ( ! $adminBarProfile.is( ':empty' ) ) {
return;
}
if ( w.ajaxurl ) {
url = w.ajaxurl;
} else {
url = w.imagifyAdminBar.ajaxurl;
}
url += url.indexOf( '?' ) > 0 ? '&' : '?';
$.get( url + 'action=imagify_get_admin_bar_profile&imagifygetadminbarprofilenonce=' + $( '#imagifygetadminbarprofilenonce' ).val() )
.done( function( response ) {
$adminBarProfile.html( response.data );
$( '#wp-admin-bar-imagify-profile-loading' ).remove();
busy = false;
} );
} );
} )(jQuery, document, window);

View File

@@ -0,0 +1 @@
!function(n,i,e){var m=!1;n(i).on("mouseenter","#wp-admin-bar-imagify",function(){var a,i;!0!==m&&(m=!0,(a=n("#wp-admin-bar-imagify-profile-content")).is(":empty"))&&(i=e.ajaxurl||e.imagifyAdminBar.ajaxurl,i+=0<i.indexOf("?")?"&":"?",n.get(i+"action=imagify_get_admin_bar_profile&imagifygetadminbarprofilenonce="+n("#imagifygetadminbarprofilenonce").val()).done(function(i){a.html(i.data),n("#wp-admin-bar-imagify-profile-loading").remove(),m=!1}))})}(jQuery,document,window);

View File

@@ -0,0 +1,103 @@
window.imagify = window.imagify || {};
jQuery.extend( window.imagify, {
concat: ajaxurl.indexOf( '?' ) > 0 ? '&' : '?',
log: function( content ) {
if ( undefined !== console ) {
console.log( content ); // eslint-disable-line no-console
}
},
info: function( content ) {
if ( undefined !== console ) {
console.info( content ); // eslint-disable-line no-console
}
},
openModal: function( $link ) {
var target = $link.data( 'target' ) || $link.attr( 'href' );
jQuery( target ).css( 'display', 'flex' ).hide().fadeIn( 400 ).attr( {
'aria-hidden': 'false',
'tabindex': '0'
} ).trigger('focus').removeAttr( 'tabindex' ).addClass( 'modal-is-open' );
jQuery( 'body' ).addClass( 'imagify-modal-is-open' );
},
template: function( id ) {
if ( undefined === _ ) {
// No need to load underscore everywhere if we don't use it.
return '';
}
return _.memoize( function( data ) {
var compiled,
options = {
evaluate: /<#([\s\S]+?)#>/g,
interpolate: /\{\{\{([\s\S]+?)\}\}\}/g,
escape: /\{\{([^}]+?)\}\}(?!\})/g,
variable: 'data'
};
return function() {
compiled = compiled || _.template( jQuery( '#tmpl-' + id ).html(), null, options );
data = data || {};
return compiled( data );
};
} );
},
humanSize: function( bytes ) {
var sizes = ['B', 'kB', 'MB'],
i;
if ( 0 === bytes ) {
return '0\xA0kB';
}
i = parseInt( Math.floor( Math.log( bytes ) / Math.log( 1024 ) ), 10 );
return ( bytes / Math.pow( 1024, i ) ).toFixed( 2 ) + '\xA0' + sizes[ i ];
}
} );
// Imagify light modal =============================================================================
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
// Accessibility.
$( '.imagify-modal' ).attr( 'aria-hidden', 'true' );
$( d )
// On click on modal trigger, open modal.
.on( 'click.imagify', '.imagify-modal-trigger', function( e ) {
e.preventDefault();
w.imagify.openModal( $( this ) );
} )
// On click on close button, close modal.
.on( 'click.imagify', '.imagify-modal .close-btn', function() {
var $modal = $( this ).closest( '.imagify-modal' );
$modal.fadeOut( 400 ).attr( 'aria-hidden', 'true' ).removeClass( 'modal-is-open' ).trigger( 'modalClosed.imagify' );
$( 'body' ).removeClass( 'imagify-modal-is-open' );
} )
// On close button blur, improve accessibility.
.on( 'blur.imagify', '.imagify-modal .close-btn', function() {
var $modal = $( this ).closest( '.imagify-modal' );
if ( $modal.attr( 'aria-hidden' ) === 'false' ) {
$modal.attr( 'tabindex', '0' ).trigger('focus').removeAttr( 'tabindex' );
}
} )
// On click on dropped layer of modal, close modal.
.on( 'click.imagify', '.imagify-modal', function( e ) {
$( e.target ).filter( '.modal-is-open' ).find( '.close-btn' ).trigger( 'click.imagify' );
} )
// `Esc` key binding, close modal.
.on( 'keydown.imagify', function( e ) {
if ( 27 === e.keyCode && $( '.imagify-modal.modal-is-open' ).length > 0 ) {
e.preventDefault();
// Trigger the event.
$( '.imagify-modal.modal-is-open' ).find( '.close-btn' ).trigger( 'click.imagify' );
}
} );
} )(jQuery, document, window);

View File

@@ -0,0 +1 @@
window.imagify=window.imagify||{},jQuery.extend(window.imagify,{concat:0<ajaxurl.indexOf("?")?"&":"?",log:function(i){void 0!==console&&console.log(i)},info:function(i){void 0!==console&&console.info(i)},openModal:function(i){i=i.data("target")||i.attr("href");jQuery(i).css("display","flex").hide().fadeIn(400).attr({"aria-hidden":"false",tabindex:"0"}).trigger("focus").removeAttr("tabindex").addClass("modal-is-open"),jQuery("body").addClass("imagify-modal-is-open")},template:function(o){return void 0===_?"":_.memoize(function(i){var a,e={evaluate:/<#([\s\S]+?)#>/g,interpolate:/\{\{\{([\s\S]+?)\}\}\}/g,escape:/\{\{([^}]+?)\}\}(?!\})/g,variable:"data"};return function(){return(a=a||_.template(jQuery("#tmpl-"+o).html(),null,e))(i=i||{})}})},humanSize:function(i){var a;return 0===i?"0 kB":(a=parseInt(Math.floor(Math.log(i)/Math.log(1024)),10),(i/Math.pow(1024,a)).toFixed(2)+" "+["B","kB","MB"][a])}}),function(a,i,e){a(".imagify-modal").attr("aria-hidden","true"),a(i).on("click.imagify",".imagify-modal-trigger",function(i){i.preventDefault(),e.imagify.openModal(a(this))}).on("click.imagify",".imagify-modal .close-btn",function(){a(this).closest(".imagify-modal").fadeOut(400).attr("aria-hidden","true").removeClass("modal-is-open").trigger("modalClosed.imagify"),a("body").removeClass("imagify-modal-is-open")}).on("blur.imagify",".imagify-modal .close-btn",function(){var i=a(this).closest(".imagify-modal");"false"===i.attr("aria-hidden")&&i.attr("tabindex","0").trigger("focus").removeAttr("tabindex")}).on("click.imagify",".imagify-modal",function(i){a(i.target).filter(".modal-is-open").find(".close-btn").trigger("click.imagify")}).on("keydown.imagify",function(i){27===i.keyCode&&0<a(".imagify-modal.modal-is-open").length&&(i.preventDefault(),a(".imagify-modal.modal-is-open").find(".close-btn").trigger("click.imagify"))})}(jQuery,document,window);

View File

@@ -0,0 +1,872 @@
/**
* Imagify beat API
*
* This is a modified version of WordPress Heartbeat (WP 5.2.1).
* The main difference is that it allows to prevent suspension entirely.
* It uses the var imagifybeatSettings on init.
*
* Custom jQuery events:
* - imagifybeat-send
* - imagifybeat-tick
* - imagifybeat-error
* - imagifybeat-connection-lost
* - imagifybeat-connection-restored
* - imagifybeat-nonces-expired
*
* @since 1.9.3
*/
window.imagify = window.imagify || {};
/* eslint-disable no-use-before-define */
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
/**
* Constructs the Imagifybeat API.
*
* @since 1.9.3
* @constructor
*
* @return {Imagifybeat} An instance of the Imagifybeat class.
*/
var Imagifybeat = function() {
var $document = $( d ),
settings = {
// Suspend/resume.
suspend: false,
// Whether suspending is enabled.
suspendEnabled: true,
// Current screen id, defaults to the JS global 'pagenow' when present
// (in the admin) or 'front'.
screenId: '',
// XHR request URL, defaults to the JS global 'ajaxurl' when present.
url: '',
// Timestamp, start of the last connection request.
lastTick: 0,
// Container for the enqueued items.
queue: {},
// Connect interval (in seconds).
mainInterval: 60,
// Used when the interval is set to 5 sec. temporarily.
tempInterval: 0,
// Used when the interval is reset.
originalInterval: 0,
// Used to limit the number of AJAX requests.
minimalInterval: 0,
// Used together with tempInterval.
countdown: 0,
// Whether a connection is currently in progress.
connecting: false,
// Whether a connection error occurred.
connectionError: false,
// Used to track non-critical errors.
errorcount: 0,
// Whether at least one connection has been completed successfully.
hasConnected: false,
// Whether the current browser w is in focus and the user is active.
hasFocus: true,
// Timestamp, last time the user was active. Checked every 30 sec.
userActivity: 0,
// Flag whether events tracking user activity were set.
userActivityEvents: false,
// Timer that keeps track of how long a user has focus.
checkFocusTimer: 0,
// Timer that keeps track of how long needs to be waited before connecting to
// the server again.
beatTimer: 0
};
/**
* Sets local variables and events, then starts the beat.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function initialize() {
var options, hidden, visibilityState, visibilitychange;
if ( typeof w.pagenow === 'string' ) {
settings.screenId = w.pagenow;
}
if ( typeof w.ajaxurl === 'string' ) {
settings.url = w.ajaxurl;
}
// Pull in options passed from PHP.
if ( typeof w.imagifybeatSettings === 'object' ) {
options = w.imagifybeatSettings;
// The XHR URL can be passed as option when w.ajaxurl is not set.
if ( ! settings.url && options.ajaxurl ) {
settings.url = options.ajaxurl;
}
/*
* The interval can be from 15 to 120 sec. and can be set temporarily to 5 sec.
* It can be set in the initial options or changed later through JS and/or
* through PHP.
*/
if ( options.interval ) {
settings.mainInterval = options.interval;
if ( settings.mainInterval < 15 ) {
settings.mainInterval = 15;
} else if ( settings.mainInterval > 120 ) {
settings.mainInterval = 120;
}
}
/*
* Used to limit the number of AJAX requests. Overrides all other intervals if
* they are shorter. Needed for some hosts that cannot handle frequent requests
* and the user may exceed the allocated server CPU time, etc. The minimal
* interval can be up to 600 sec. however setting it to longer than 120 sec.
* will limit or disable some of the functionality (like post locks). Once set
* at initialization, minimalInterval cannot be changed/overridden.
*/
if ( options.minimalInterval ) {
options.minimalInterval = parseInt( options.minimalInterval, 10 );
settings.minimalInterval = options.minimalInterval > 0 && options.minimalInterval <= 600 ? options.minimalInterval * 1000 : 0;
}
if ( settings.minimalInterval && settings.mainInterval < settings.minimalInterval ) {
settings.mainInterval = settings.minimalInterval;
}
// 'screenId' can be added from settings on the front end where the JS global
// 'pagenow' is not set.
if ( ! settings.screenId ) {
settings.screenId = options.screenId || 'front';
}
if ( 'disable' === options.suspension ) {
disableSuspend();
}
}
// Convert to milliseconds.
settings.mainInterval = settings.mainInterval * 1000;
settings.originalInterval = settings.mainInterval;
/*
* Switch the interval to 120 seconds by using the Page Visibility API.
* If the browser doesn't support it (Safari < 7, Android < 4.4, IE < 10), the
* interval will be increased to 120 seconds after 5 minutes of mouse and keyboard
* inactivity.
*/
if ( typeof document.hidden !== 'undefined' ) {
hidden = 'hidden';
visibilitychange = 'visibilitychange';
visibilityState = 'visibilityState';
} else if ( typeof document.msHidden !== 'undefined' ) { // IE10
hidden = 'msHidden';
visibilitychange = 'msvisibilitychange';
visibilityState = 'msVisibilityState';
} else if ( typeof document.webkitHidden !== 'undefined' ) { // Android
hidden = 'webkitHidden';
visibilitychange = 'webkitvisibilitychange';
visibilityState = 'webkitVisibilityState';
}
if ( hidden ) {
if ( document[ hidden ] ) {
settings.hasFocus = false;
}
$document.on( visibilitychange + '.imagifybeat', function() {
if ( 'hidden' === document[ visibilityState ] ) {
blurred();
w.clearInterval( settings.checkFocusTimer );
} else {
focused();
if ( document.hasFocus ) {
settings.checkFocusTimer = w.setInterval( checkFocus, 10000 );
}
}
});
}
// Use document.hasFocus() if available.
if ( document.hasFocus ) {
settings.checkFocusTimer = w.setInterval( checkFocus, 10000 );
}
$( w ).on( 'unload.imagifybeat', function() {
// Don't connect anymore.
settings.suspend = true;
// Abort the last request if not completed.
if ( settings.xhr && 4 !== settings.xhr.readyState ) {
settings.xhr.abort();
}
} );
// Check for user activity every 30 seconds.
w.setInterval( checkUserActivity, 30000 );
// Start one tick after DOM ready.
$document.ready( function() {
settings.lastTick = time();
scheduleNextTick();
} );
}
/**
* Returns the current time according to the browser.
*
* @since 1.9.3
* @access private
*
* @return {int} Returns the current time.
*/
function time() {
return (new Date()).getTime();
}
/**
* Checks if the iframe is from the same origin.
*
* @since 1.9.3
* @access private
*
* @return {bool} Returns whether or not the iframe is from the same origin.
*/
function isLocalFrame( frame ) {
var origin, src = frame.src; // eslint-disable-line no-shadow
/*
* Need to compare strings as WebKit doesn't throw JS errors when iframes have different origin. It throws uncatchable exceptions.
*/
if ( src && /^https?:\/\//.test( src ) ) {
origin = w.location.origin ? w.location.origin : w.location.protocol + '//' + w.location.host;
if ( src.indexOf( origin ) !== 0 ) {
return false;
}
}
try {
if ( frame.contentWindow.document ) {
return true;
}
} catch ( e ) {} // eslint-disable-line no-empty
return false;
}
/**
* Checks if the document's focus has changed.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function checkFocus() {
if ( settings.hasFocus && ! document.hasFocus() ) {
blurred();
} else if ( ! settings.hasFocus && document.hasFocus() ) {
focused();
}
}
/**
* Sets error state and fires an event on XHR errors or timeout.
*
* @since 1.9.3
* @access private
*
* @param {string} error The error type passed from the XHR.
* @param {int} httpStatus The HTTP status code passed from jqXHR (200, 404, 500, etc.).
* @return {void}
*/
function setErrorState( error, httpStatus ) {
var trigger;
if ( error ) {
switch ( error ) {
case 'abort':
// Do nothing.
break;
case 'timeout':
// No response for 30 sec.
trigger = true;
break;
case 'error':
if ( 503 === httpStatus && settings.hasConnected ) {
trigger = true;
break;
}
/* falls through */
case 'parsererror':
case 'empty':
case 'unknown':
settings.errorcount++;
if ( settings.errorcount > 2 && settings.hasConnected ) {
trigger = true;
}
break;
}
if ( trigger && ! hasConnectionError() ) {
settings.connectionError = true;
$document.trigger( 'imagifybeat-connection-lost', [ error, httpStatus ] );
if ( w.wp.hooks ) {
w.wp.hooks.doAction( 'imagifybeat.connection-lost', error, httpStatus );
}
}
}
}
/**
* Clears the error state and fires an event if there is a connection error.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function clearErrorState() {
// Has connected successfully.
settings.hasConnected = true;
if ( hasConnectionError() ) {
settings.errorcount = 0;
settings.connectionError = false;
$document.trigger( 'imagifybeat-connection-restored' );
if ( w.wp.hooks ) {
w.wp.hooks.doAction( 'imagifybeat.connection-restored' );
}
}
}
/**
* Gathers the data and connects to the server.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function connect() {
var ajaxData, imagifybeatData;
// If the connection to the server is slower than the interval,
// imagifybeat connects as soon as the previous connection's response is received.
if ( settings.connecting || settings.suspend ) {
return;
}
settings.lastTick = time();
imagifybeatData = $.extend( {}, settings.queue );
// Clear the data queue. Anything added after this point will be sent on the next tick.
settings.queue = {};
$document.trigger( 'imagifybeat-send', [ imagifybeatData ] );
if ( w.wp.hooks ) {
w.wp.hooks.doAction( 'imagifybeat.send', imagifybeatData );
}
ajaxData = {
data: imagifybeatData,
interval: settings.tempInterval ? settings.tempInterval / 1000 : settings.mainInterval / 1000,
_nonce: typeof w.imagifybeatSettings === 'object' ? w.imagifybeatSettings.nonce : '',
action: 'imagifybeat',
screen_id: settings.screenId,
has_focus: settings.hasFocus
};
if ( 'customize' === settings.screenId ) {
ajaxData.wp_customize = 'on';
}
settings.connecting = true;
settings.xhr = $.ajax( {
url: settings.url,
type: 'post',
timeout: 60000, // Throw an error if not completed after 60 sec.
data: ajaxData,
dataType: 'json'
} ).always( function() {
settings.connecting = false;
scheduleNextTick();
} ).done( function( response, textStatus, jqXHR ) {
var newInterval;
if ( ! response ) {
setErrorState( 'empty' );
return;
}
clearErrorState();
if ( response.nonces_expired ) {
$document.trigger( 'imagifybeat-nonces-expired' );
if ( w.wp.hooks ) {
w.wp.hooks.doAction( 'imagifybeat.nonces-expired' );
}
}
// Change the interval from PHP
if ( response.imagifybeat_interval ) {
newInterval = response.imagifybeat_interval;
delete response.imagifybeat_interval;
}
// Update the imagifybeat nonce if set.
if ( response.imagifybeat_nonce && typeof w.imagifybeatSettings === 'object' ) {
w.imagifybeatSettings.nonce = response.imagifybeat_nonce;
delete response.imagifybeat_nonce;
}
$document.trigger( 'imagifybeat-tick', [ response, textStatus, jqXHR ] );
if ( w.wp.hooks ) {
w.wp.hooks.doAction( 'imagifybeat.tick', response, textStatus, jqXHR );
}
// Do this last. Can trigger the next XHR if connection time > 5 sec. and newInterval == 'fast'.
if ( newInterval ) {
interval( newInterval );
}
} ).fail( function( jqXHR, textStatus, error ) {
setErrorState( textStatus || 'unknown', jqXHR.status );
$document.trigger( 'imagifybeat-error', [ jqXHR, textStatus, error ] );
if ( w.wp.hooks ) {
w.wp.hooks.doAction( 'imagifybeat.error', jqXHR, textStatus, error );
}
} );
}
/**
* Schedules the next connection.
*
* Fires immediately if the connection time is longer than the interval.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function scheduleNextTick() {
var delta = time() - settings.lastTick,
interv = settings.mainInterval;
if ( settings.suspend ) {
return;
}
if ( ! settings.hasFocus && settings.suspendEnabled ) {
// When no user activity or the window lost focus, increase polling interval to 120 seconds, but only if suspend is enabled.
interv = 120000; // 120 sec.
} else if ( settings.countdown > 0 && settings.tempInterval ) {
interv = settings.tempInterval;
settings.countdown--;
if ( settings.countdown < 1 ) {
settings.tempInterval = 0;
}
}
if ( settings.minimalInterval && interv < settings.minimalInterval ) {
interv = settings.minimalInterval;
}
w.clearTimeout( settings.beatTimer );
if ( delta < interv ) {
settings.beatTimer = w.setTimeout(
function() {
connect();
},
interv - delta
);
} else {
connect();
}
}
/**
* Sets the internal state when the browser w becomes hidden or loses focus.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function blurred() {
settings.hasFocus = false;
}
/**
* Sets the internal state when the browser w becomes visible or is in focus.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function focused() {
settings.userActivity = time();
// Resume if suspended
settings.suspend = false;
if ( ! settings.hasFocus ) {
settings.hasFocus = true;
scheduleNextTick();
}
}
/**
* Runs when the user becomes active after a period of inactivity.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function userIsActive() {
settings.userActivityEvents = false;
$document.off( '.imagifybeat-active' );
$( 'iframe' ).each( function( i, frame ) {
if ( isLocalFrame( frame ) ) {
$( frame.contentWindow ).off( '.imagifybeat-active' );
}
} );
focused();
}
/**
* Checks for user activity.
*
* Runs every 30 sec. Sets 'hasFocus = true' if user is active and the w is
* in the background. Sets 'hasFocus = false' if the user has been inactive
* (no mouse or keyboard activity) for 5 min. even when the w has focus.
*
* @since 1.9.3
* @access private
*
* @return {void}
*/
function checkUserActivity() {
var lastActive = settings.userActivity ? time() - settings.userActivity : 0;
// Set hasFocus to false when no mouse or keyboard activity for 5 min.
if ( lastActive > 300000 && settings.hasFocus ) {
blurred();
}
// Suspend after 10 min. of inactivity.
if ( settings.suspendEnabled && lastActive > 600000 ) {
settings.suspend = true;
}
if ( ! settings.userActivityEvents ) {
$document.on( 'mouseover.imagifybeat-active keyup.imagifybeat-active touchend.imagifybeat-active', function() {
userIsActive();
} );
$( 'iframe' ).each( function( i, frame ) {
if ( isLocalFrame( frame ) ) {
$( frame.contentWindow ).on( 'mouseover.imagifybeat-active keyup.imagifybeat-active touchend.imagifybeat-active', function() {
userIsActive();
} );
}
} );
settings.userActivityEvents = true;
}
}
// Public methods.
/**
* Checks whether the w (or any local iframe in it) has focus, or the user
* is active.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @return {bool} True if the w or the user is active.
*/
function hasFocus() {
return settings.hasFocus;
}
/**
* Checks whether there is a connection error.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @return {bool} True if a connection error was found.
*/
function hasConnectionError() {
return settings.connectionError;
}
/**
* Connects as soon as possible regardless of 'hasFocus' state.
*
* Will not open two concurrent connections. If a connection is in progress,
* will connect again immediately after the current connection completes.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @return {void}
*/
function connectNow() {
settings.lastTick = 0;
scheduleNextTick();
}
/**
* Disables suspending.
*
* Should be used only when Imagifybeat is performing critical tasks like
* autosave, post-locking, etc. Using this on many screens may overload the
* user's hosting account if several browser ws/tabs are left open for a
* long time.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @return {void}
*/
function disableSuspend() {
settings.suspendEnabled = false;
}
/**
* Enables suspending.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @return {void}
*/
function enableSuspend() {
settings.suspendEnabled = true;
}
/**
* Gets/Sets the interval.
*
* When setting to 'fast' or 5, the interval is 5 seconds for the next 30 ticks
* (for 2 minutes and 30 seconds) by default. In this case the number of 'ticks'
* can be passed as second argument. If the window doesn't have focus, the
* interval slows down to 2 min.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @param {string|int} speed Interval: 'fast' or 5, 15, 30, 60, 120. Fast equals 5.
* @param {string} ticks Tells how many ticks before the interval reverts back. Used with speed = 'fast' or 5.
* @return {int} Current interval in seconds.
*/
function interval( speed, ticks ) {
var newInterval,
oldInterval = settings.tempInterval ? settings.tempInterval : settings.mainInterval;
if ( speed ) {
switch ( speed ) {
case 'fast':
case 5:
newInterval = 5000;
break;
case 15:
newInterval = 15000;
break;
case 30:
newInterval = 30000;
break;
case 60:
newInterval = 60000;
break;
case 120:
newInterval = 120000;
break;
case 'long-polling':
// Allow long polling, (experimental)
settings.mainInterval = 0;
return 0;
default:
newInterval = settings.originalInterval;
}
if ( settings.minimalInterval && newInterval < settings.minimalInterval ) {
newInterval = settings.minimalInterval;
}
if ( 5000 === newInterval ) {
ticks = parseInt( ticks, 10 ) || 30;
ticks = ticks < 1 || ticks > 30 ? 30 : ticks;
settings.countdown = ticks;
settings.tempInterval = newInterval;
} else {
settings.countdown = 0;
settings.tempInterval = 0;
settings.mainInterval = newInterval;
}
// Change the next connection time if new interval has been set.
// Will connect immediately if the time since the last connection
// is greater than the new interval.
if ( newInterval !== oldInterval ) {
scheduleNextTick();
}
}
return settings.tempInterval ? settings.tempInterval / 1000 : settings.mainInterval / 1000;
}
/**
* Resets the interval.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @return {int} Current interval in seconds.
*/
function resetInterval() {
return interval( settings.originalInterval );
}
/**
* Enqueues data to send with the next XHR.
*
* As the data is send asynchronously, this function doesn't return the XHR
* response. To see the response, use the custom jQuery event 'imagifybeat-tick'
* on the document, example:
* $(document).on( 'imagifybeat-tick.myname', function( event, data, textStatus, jqXHR ) {
* // code
* });
* If the same 'handle' is used more than once, the data is not overwritten when
* the third argument is 'true'. Use `imagify.beat.isQueued('handle')` to see if
* any data is already queued for that handle.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @param {string} handle Unique handle for the data, used in PHP to receive the data.
* @param {mixed} data The data to send.
* @param {bool} noOverwrite Whether to overwrite existing data in the queue.
* @return {bool} True if the data was queued.
*/
function enqueue( handle, data, noOverwrite ) {
if ( handle ) {
if ( noOverwrite && this.isQueued( handle ) ) {
return false;
}
settings.queue[handle] = data;
return true;
}
return false;
}
/**
* Checks if data with a particular handle is queued.
*
* @since 1.9.3
*
* @param {string} handle The handle for the data.
* @return {bool} True if the data is queued with this handle.
*/
function isQueued( handle ) {
if ( handle ) {
return Object.prototype.hasOwnProperty.call( settings.queue, handle );
}
}
/**
* Removes data with a particular handle from the queue.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @param {string} handle The handle for the data.
*/
function dequeue( handle ) {
if ( handle ) {
delete settings.queue[handle];
}
}
/**
* Gets data that was enqueued with a particular handle.
*
* @since 1.9.3
* @memberOf imagify.beat.prototype
*
* @param {string} handle The handle for the data.
* @return {mixed} The data or undefined.
*/
function getQueuedItem( handle ) {
if ( handle ) {
return this.isQueued( handle ) ? settings.queue[ handle ] : undefined;
}
}
initialize();
// Expose public methods.
return {
hasFocus: hasFocus,
connectNow: connectNow,
disableSuspend: disableSuspend,
enableSuspend: enableSuspend,
interval: interval,
resetInterval: resetInterval,
hasConnectionError: hasConnectionError,
enqueue: enqueue,
dequeue: dequeue,
isQueued: isQueued,
getQueuedItem: getQueuedItem
};
};
/**
* Contains the Imagifybeat API.
*
* @namespace imagify.beat
* @type {Imagifybeat}
*/
w.imagify.beat = new Imagifybeat();
} )( jQuery, document, window );

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,457 @@
/**
* Mini chart.
*
* @param {element} canvas The canvas element.
*/
window.imagify.drawMeAChart = function( canvas ) {
canvas.each( function() {
var value = parseInt( jQuery( this ).closest( '.imagify-chart' ).next( '.imagify-chart-value' ).text(), 10 );
new window.imagify.Chart( this, { // eslint-disable-line no-new
type: 'doughnut',
data: {
datasets: [ {
data: [ value, 100 - value ],
backgroundColor: [ '#00B3D3', '#D8D8D8' ],
borderColor: '#fff',
borderWidth: 1
} ]
},
options: {
legend: {
display: false
},
events: [],
animation: {
easing: 'easeOutBounce'
},
tooltips: {
enabled: false
},
responsive: false
}
} );
} );
};
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
w.imagify.filesList = {
working: [],
/*
* Init.
*/
init: function () {
var $document = $( d ),
$processing;
// Update the chart in the media modal when a media is selected, and the ones already printed.
$( w ).on( 'canvasprinted.imagify', this.updateChart ).trigger( 'canvasprinted.imagify' );
// Handle bulk actions.
this.insertBulkActionTags();
$( '#doaction, #doaction2' ).on( 'click.imagify', this.processBulkAction );
// Optimize, restore, etc.
$document.on( 'click.imagify', '.button-imagify-optimize, .button-imagify-manual-reoptimize, .button-imagify-generate-webp, .button-imagify-delete-webp, .button-imagify-restore, .button-imagify-refresh-status', this.processOptimization );
$document.on( 'imagifybeat-send', this.addToImagifybeat );
$document.on( 'imagifybeat-tick', this.processImagifybeat );
// Some items may be processed in background on page load.
$processing = $( '.wp-list-table.imagify-files .button-imagify-processing' );
if ( $processing.length ) {
// Some media are already being processed.
// Lock the items, so we can check their status with Imagifybeat.
$processing.closest( 'tr' ).find( '.check-column [name="bulk_select[]"]' ).each( function() {
var id = w.imagify.filesList.sanitizeId( this.value );
w.imagify.filesList.lockItem( w.imagifyFiles.context, id );
} );
// Fasten Imagifybeat.
w.imagify.beat.interval( 15 );
}
},
// Charts ==================================================================================
/**
* Update the chart in the media modal when a media is selected, and the ones already printed.
*
* @param {object} e Event.
* @param {string} selector A CSS selector.
*/
updateChart: function( e, selector ) {
var $canvas;
selector = selector || '.imagify-consumption-chart';
$canvas = $( selector );
w.imagify.drawMeAChart( $canvas );
$canvas.closest( '.imagify-datas-list' ).siblings( '.imagify-datas-details' ).hide();
},
// Bulk optimization =======================================================================
/**
* Insert the bulk actions in the <select> tag.
*/
insertBulkActionTags: function() {
var bulkActions = '<option value="imagify-bulk-optimize">' + w.imagifyFiles.labels.bulkActionsOptimize + '</option>';
if ( w.imagifyFiles.backupOption || $( '.file-has-backup' ).length ) {
// If the backup option is enabled, or if we have items that can be restored.
bulkActions += '<option value="imagify-bulk-restore">' + w.imagifyFiles.labels.bulkActionsRestore + '</option>';
}
$( '.bulkactions select[name="action"] option:first-child, .bulkactions select[name="action2"] option:first-child' ).after( bulkActions );
},
/**
* Process one of these actions: bulk restore, bulk optimize, or bulk refresh-status.
*
* @param {object} e Event.
*/
processBulkAction: function( e ) {
var value = $( this ).prev( 'select' ).val(),
action;
if ( 'imagify-bulk-optimize' !== value && 'imagify-bulk-restore' !== value && 'imagify-bulk-refresh-status' !== value ) {
return;
}
e.preventDefault();
action = value.replace( 'imagify-bulk-', '' );
$( 'input[name="bulk_select[]"]:checked' ).closest( 'tr' ).find( '.button-imagify-' + action ).each( function ( index, el ) {
setTimeout( function() {
$( el ).trigger( 'click.imagify' );
}, index * 500 );
} );
},
// Optimization ============================================================================
/**
* Process one of these actions: optimize, re-optimize, restore, or refresh-status.
*
* @param {object} e Event.
*/
processOptimization: function( e ) {
var $button = $( this ),
$row = $button.closest( 'tr' ),
$checkbox = $row.find( '.check-column [type="checkbox"]' ),
id = imagify.filesList.sanitizeId( $checkbox.val() ),
context = w.imagifyFiles.context,
$parent, href, processingTemplate;
e.preventDefault();
if ( imagify.filesList.isItemLocked( context, id ) ) {
return;
}
imagify.filesList.lockItem( context, id );
href = $button.attr( 'href' );
processingTemplate = w.imagify.template( 'imagify-button-processing' );
$parent = $button.closest( '.column-actions, .column-status' );
$parent.html( processingTemplate( {
label: $button.data( 'processing-label' )
} ) );
$.get( href.replace( 'admin-post.php', 'admin-ajax.php' ) )
.done( function( r ) {
if ( ! r.success ) {
if ( r.data && r.data.row ) {
$row.html( '<td class="colspanchange" colspan="' + $row.children().length + '">' + r.data.row + '</td>' );
} else {
$parent.html( r.data );
}
$row.find( '.check-column [type="checkbox"]' ).prop( 'checked', false );
imagify.filesList.unlockItem( context, id );
return;
}
if ( r.data && r.data.columns ) {
// The work is done.
w.imagify.filesList.displayProcessResult( context, id, r.data.columns );
} else {
// Still processing in background: we're waiting for the result by poking Imagifybeat.
// Set the Imagifybeat interval to 15 seconds.
w.imagify.beat.interval( 15 );
}
} );
},
// Imagifybeat =============================================================================
/**
* Send the media IDs and their status to Imagifybeat.
*
* @param {object} e Event object.
* @param {object} data Object containing all Imagifybeat IDs.
*/
addToImagifybeat: function ( e, data ) {
var $boxes = $( '.wp-list-table.imagify-files .check-column [name="bulk_select[]"]' );
if ( ! $boxes.length ) {
return;
}
data[ w.imagifyFiles.imagifybeatID ] = {};
$boxes.each( function() {
var id = w.imagify.filesList.sanitizeId( this.value ),
context = w.imagifyFiles.context,
locked = w.imagify.filesList.isItemLocked( context, id ) ? 1 : 0;
data[ w.imagifyFiles.imagifybeatID ][ context ] = data[ w.imagifyFiles.imagifybeatID ][ context ] || {};
data[ w.imagifyFiles.imagifybeatID ][ context ][ '_' + id ] = locked;
} );
},
/**
* Listen for the custom event "imagifybeat-tick" on $(document).
*
* @param {object} e Event object.
* @param {object} data Object containing all Imagifybeat IDs.
*/
processImagifybeat: function ( e, data ) {
if ( typeof data[ w.imagifyFiles.imagifybeatID ] === 'undefined' ) {
return;
}
$.each( data[ w.imagifyFiles.imagifybeatID ], function( contextId, columns ) {
var context, id;
context = $.trim( contextId ).match( /^(.+)_(\d+)$/ );
if ( ! context ) {
return;
}
id = w.imagify.filesList.sanitizeId( context[2] );
context = w.imagify.filesList.sanitizeContext( context[1] );
if ( context !== w.imagifyFiles.context ) {
return;
}
w.imagify.filesList.displayProcessResult( context, id, columns );
} );
},
// DOM manipulation tools ==================================================================
/**
* Display a successful process result.
*
* @param {string} context The media context.
* @param {int} id The media ID.
* @param {string} columns A list of HTML, keyed by column name.
*/
displayProcessResult: function( context, id, columns ) {
var $row = w.imagify.filesList.getContainers( id );
$.each( columns, function( k, v ) {
$row.children( '.column-' + k ).html( v );
} );
$row.find( '.check-column [type="checkbox"]' ).prop( 'checked', false );
w.imagify.filesList.unlockItem( context, id );
if ( ! w.imagify.filesList.working.length ) {
// Work is done.
// Reset Imagifybeat interval.
w.imagify.beat.resetInterval();
}
},
/**
* Get all containers matching the given id.
*
* @param {int} id The media ID.
* @return {object} A jQuery collection.
*/
getContainers: function( id ) {
return $( '.wp-list-table.imagify-files .check-column [name="bulk_select[]"][value="' + id + '"]' ).closest( 'tr' );
},
// Sanitization ============================================================================
/**
* Sanitize a media ID.
*
* @param {int|string} id A media ID.
* @return {int}
*/
sanitizeId: function( id ) {
return parseInt( id, 10 );
},
/**
* Sanitize a media context.
*
* @param {string} context A media context.
* @return {string}
*/
sanitizeContext: function( context ) {
context = context.replace( '/[^a-z0-9_-]/gi', '' ).toLowerCase();
return context ? context : 'wp';
},
// Locks ===================================================================================
/**
* Lock an item.
*
* @param {string} context The media context.
* @param {int} id The media ID.
*/
lockItem: function( context, id ) {
if ( ! this.isItemLocked( context, id ) ) {
this.working.push( context + '_' + id );
}
},
/**
* Unlock an item.
*
* @param {string} context The media context.
* @param {int} id The media ID.
*/
unlockItem: function( context, id ) {
var name = context + '_' + id,
i = _.indexOf( this.working, name );
if ( i > -1 ) {
this.working.splice( i, 1 );
}
},
/**
* Tell if an item is locked.
*
* @param {string} context The media context.
* @param {int} id The media ID.
* @return {bool}
*/
isItemLocked: function( context, id ) {
return _.indexOf( this.working, context + '_' + id ) > -1;
}
};
w.imagify.filesList.init();
} )(jQuery, document, window);
(function(w) { // eslint-disable-line no-shadow, no-shadow-restricted-names
/**
* requestAnimationFrame polyfill by Erik Möller.
* Fixes from Paul Irish and Tino Zijdel.
* MIT license - http://paulirish.com/2011/requestanimationframe-for-smart-animating/ - http://my.opera.com/emoller/blog/2011/12/20/requestanimationframe-for-smart-er-animating.
*/
var lastTime = 0,
vendors = ['ms', 'moz', 'webkit', 'o'];
for ( var x = 0; x < vendors.length && ! w.requestAnimationFrame; ++x ) {
w.requestAnimationFrame = w[vendors[x] + 'RequestAnimationFrame'];
w.cancelAnimationFrame = w[vendors[x] + 'CancelAnimationFrame'] || w[vendors[x] + 'CancelRequestAnimationFrame'];
}
if ( ! w.requestAnimationFrame ) {
w.requestAnimationFrame = function( callback ) {
var currTime = new Date().getTime(),
timeToCall = Math.max( 0, 16 - ( currTime - lastTime ) ),
id = setTimeout( function() {
callback( currTime + timeToCall );
}, timeToCall );
lastTime = currTime + timeToCall;
return id;
};
}
if ( ! w.cancelAnimationFrame ) {
w.cancelAnimationFrame = function( id ) {
clearTimeout( id );
};
}
})(window);
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
/**
* LazyLoad images in the list.
*/
var lazyImages = $( '#imagify-files-list-form' ).find( '[data-lazy-src]' ),
lazyTimer;
function lazyLoadThumbnails() {
w.cancelAnimationFrame( lazyTimer );
lazyTimer = w.requestAnimationFrame( lazyLoadThumbnailsCallback ); // eslint-disable-line no-use-before-define
}
function lazyLoadThumbnailsCallback() {
var $w = $( w ),
winScroll = $w.scrollTop(),
winHeight = $w.outerHeight();
$.each( lazyImages, function() {
var $image = $( this ),
imgTop = $image.offset().top,
imgBottom = imgTop + $image.outerHeight(),
screenTopThresholded = winScroll - 150,
screenBottomThresholded = winScroll + winHeight + 150,
src;
lazyImages = lazyImages.not( $image );
if ( ! lazyImages.length ) {
$w.off( 'scroll resize orientationchange', lazyLoadThumbnails );
}
/**
* Hidden images that are above the fold and below the top, are reported as:
* - offset: window scroll,
* - height: 0,
* (at least in Firefox).
* That's why I use <= and >=.
*
* 150 is the threshold.
*/
if ( imgBottom >= screenTopThresholded && imgTop <= screenBottomThresholded ) {
src = $image.attr( 'data-lazy-src' );
if ( undefined !== src && src ) {
$image.attr( 'src', src ).removeAttr( 'data-lazy-src' );
}
$image.next( 'noscript' ).remove();
}
} );
}
if ( lazyImages.length ) {
$( w ).on( 'scroll resize orientationchange', lazyLoadThumbnails );
lazyLoadThumbnailsCallback();
}
} )(jQuery, document, window);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,400 @@
/**
* Library that handles the bulk optimization processes.
*
* @requires jQuery
*/
window.imagify = window.imagify || {};
/* eslint-disable no-underscore-dangle, consistent-this */
(function($, d, w) {
/**
* Construct the optimizer.
*
* @param {object} settings {
* Optimizer settings:
*
* @type {string} groupID Group ID, like 'library' or 'custom-folders'.
* @type {string} context Context within this group, like 'wp' or 'custom-folders' (yes, again).
* @type {int} level Optimization level: 0 to 2.
* @type {int} bufferSize Number of parallel optimizations: usually 4.
* @type {string} ajaxUrl URL to request to optimize.
* @type {object} files Files to optimize: media ID as key (prefixed with an underscore), file URL as value.
* @type {string} defaultThumb A default thumbnail URL.
* @type {string} doneEvent Name of the event to listen to know when optimizations end.
* @type {array} imageExtensions A list of supported image extensions (only images).
* }
*/
w.imagify.Optimizer = function ( settings ) {
// Settings.
this.groupID = settings.groupID;
this.context = settings.context;
this.level = settings.level;
this.bufferSize = settings.bufferSize || 1;
this.ajaxUrl = settings.ajaxUrl;
this.files = settings.files;
this.defaultThumb = settings.defaultThumb;
this.doneEvent = settings.doneEvent;
if ( settings.imageExtensions ) {
this.imageExtensions = settings.imageExtensions;
} else {
this.imageExtensions = [ 'jpg', 'jpeg', 'jpe', 'png', 'gif' ];
}
/**
* An array of media IDs (prefixed with an underscore).
*/
this.prefixedMediaIDs = Object.keys( this.files );
/**
* An array of medias currently being optimized: {
* @type {int} mediaID The media ID.
* @type {string} filename The file name.
* @type {string} thumbnail The file thumbnail URL.
* }
*/
this.currentItems = [];
// Internal counters.
this.totalMedia = this.prefixedMediaIDs.length;
this.processedMedia = 0;
// Global stats.
this.globalOriginalSize = 0;
this.globalOptimizedSize = 0;
this.globalGain = 0;
this.globalPercent = 0;
// Callbacks.
this._before = function () {};
this._each = function () {};
this._done = function () {};
// Listen to the "optimization done" event.
if ( this.totalMedia && this.doneEvent ) {
$( w ).on( this.doneEvent, { _this: this }, this.processedCallback );
}
};
/**
* Callback to trigger before each media optimization.
*
* @param {callable} fnc A callback.
* @return this
*/
w.imagify.Optimizer.prototype.before = function( fnc ) {
this._before = fnc;
return this;
};
/**
* Callback to trigger after each media optimization.
*
* @param {callable} fnc A callback.
* @return this
*/
w.imagify.Optimizer.prototype.each = function( fnc ) {
this._each = fnc;
return this;
};
/**
* Callback to trigger all media optimizations have been done.
*
* @param {callable} fnc A callback.
* @return this
*/
w.imagify.Optimizer.prototype.done = function( fnc ) {
this._done = fnc;
return this;
};
/**
* Launch optimizations.
*
* @return this
*/
w.imagify.Optimizer.prototype.run = function() {
var chunkLength = this.prefixedMediaIDs.length > this.bufferSize ? this.bufferSize : this.prefixedMediaIDs.length,
i;
for ( i = 0; i < chunkLength; i++ ) {
this.processNext();
}
return this;
};
/**
* Launch next optimization.
*
* @return this
*/
w.imagify.Optimizer.prototype.processNext = function() {
if ( this.prefixedMediaIDs.length ) {
this.process( this.prefixedMediaIDs.shift() );
}
return this;
};
/**
* Launch an optimization.
*
* @param {string} prefixedId A media ID, prefixed with an underscore.
* @return this
*/
w.imagify.Optimizer.prototype.process = function( prefixedId ) {
var _this = this,
fileURL = this.files[ prefixedId ],
data = {
mediaID: parseInt( prefixedId.toString().substr( 1 ), 10 ),
filename: this.files[ prefixedId ].split( '/' ).pop(),
thumbnail: this.defaultThumb
},
extension = data.filename.split( '.' ).pop().toLowerCase(),
regexp = new RegExp( '^' + this.imageExtensions.join( '|' ).toLowerCase() + '$' ),
image;
if ( ! extension.match( regexp ) ) {
// Not an image.
this.currentItems.push( data );
this._before( data );
this.send( data );
return this;
}
// Create a thumbnail and send the ajax request.
image = new Image();
image.onerror = function () {
_this.currentItems.push( data );
_this._before( data );
_this.send( data );
};
image.onload = function () {
var maxWidth = 33,
maxHeight = 33,
imageWidth = image.width,
imageHeight = image.height,
newHeight = 0,
newWidth = 0,
topOffset = 0,
leftOffset = 0,
canvas = null,
ctx = null;
if ( imageWidth < imageHeight ) {
// Portrait.
newWidth = maxWidth;
newHeight = newWidth * imageHeight / imageWidth;
topOffset = ( maxHeight - newHeight ) / 2;
} else {
// Landscape.
newHeight = maxHeight;
newWidth = newHeight * imageWidth / imageHeight;
leftOffset = ( maxWidth - newWidth ) / 2;
}
canvas = d.createElement( 'canvas' );
canvas.width = maxWidth;
canvas.height = maxHeight;
ctx = canvas.getContext( '2d' );
ctx.drawImage( this, leftOffset, topOffset, newWidth, newHeight );
try {
data.thumbnail = canvas.toDataURL( 'image/jpeg' );
} catch ( e ) {
data.thumbnail = _this.defaultThumb;
}
canvas = null;
ctx = null;
image = null;
_this.currentItems.push( data );
_this._before( data );
_this.send( data );
};
image.src = fileURL;
return this;
};
/**
* Do the ajax request.
*
* @param {object} data {
* The data:
*
* @type {int} mediaID The media ID.
* @type {string} filename The file name.
* @type {string} thumbnail The file thumbnail URL.
* }
* @return this
*/
w.imagify.Optimizer.prototype.send = function( data ) {
var _this = this,
defaultResponse = {
success: false,
mediaID: data.mediaID,
groupID: this.groupID,
context: this.context,
filename: data.filename,
thumbnail: data.thumbnail,
status: 'error',
error: ''
};
$.post( {
url: this.ajaxUrl,
data: {
media_id: data.mediaID,
context: this.context,
optimization_level: this.level
},
dataType: 'json'
} )
.done( function( response ) {
if ( response.success ) {
return;
}
defaultResponse.error = response.data.error;
_this.processed( defaultResponse );
} )
.fail( function( jqXHR ) {
if ( 200 === jqXHR.status ) {
defaultResponse.error = jqXHR.responseText.replace( /<h1>.*<\/h1>\n*/, '' );
} else {
defaultResponse.error = jqXHR.statusText;
}
_this.processed( defaultResponse );
} );
return this;
};
/**
* Callback triggered when an optimization is complete.
*
* @param {object} e jQuery's Event object.
* @param {object} item {
* The response:
*
* @type {int} mediaID The media ID.
* @type {string} context The context.
* }
*/
w.imagify.Optimizer.prototype.processedCallback = function( e, item ) {
var _this = e.data._this;
if ( item.context !== _this.context ) {
return;
}
if ( ! item.mediaID || typeof _this.files[ '_' + item.mediaID ] === 'undefined' ) {
return;
}
item.groupID = _this.groupID;
if ( ! _this.currentItems.length ) {
// Trouble.
_this.processed( item );
return;
}
$.each( _this.currentItems, function( i, mediaData ) {
if ( item.mediaID === mediaData.mediaID ) {
item.filename = mediaData.filename;
item.thumbnail = mediaData.thumbnail;
return false;
}
} );
_this.processed( item );
};
/**
* After a media has been processed.
*
* @param {object} response {
* The response:
*
* @type {bool} success Whether the optimization succeeded or not ("already optimized" is a success).
* @type {int} mediaID The media ID.
* @type {string} groupID The group ID.
* @type {string} context The context.
* @type {string} filename The file name.
* @type {string} thumbnail The file thumbnail URL.
* @type {string} status The status, like 'optimized', 'already-optimized', 'over-quota', 'error'.
* @type {string} error The error message.
* }
* @return this
*/
w.imagify.Optimizer.prototype.processed = function( response ) {
var currentItems = this.currentItems;
if ( currentItems.length ) {
// Remove this media from the "current" list.
$.each( currentItems, function( i, mediaData ) {
if ( response.mediaID === mediaData.mediaID ) {
currentItems.splice( i, 1 );
return false;
}
} );
this.currentItems = currentItems;
}
// Update stats.
if ( response.success && 'already-optimized' !== response.status ) {
this.globalOriginalSize += response.originalOverallSize;
this.globalOptimizedSize += response.newOverallSize;
this.globalGain += response.overallSaving;
this.globalPercent = ( 100 - this.globalOptimizedSize / this.globalOptimizedSize * 100 ).toFixed( 2 );
}
++this.processedMedia;
response.progress = Math.floor( this.processedMedia / this.totalMedia * 100 );
this._each( response );
if ( this.prefixedMediaIDs.length ) {
this.processNext();
} else if ( this.totalMedia === this.processedMedia ) {
this._done( {
globalOriginalSize: this.globalOriginalSize,
globalOptimizedSize: this.globalOptimizedSize,
globalGain: this.globalGain
} );
}
return this;
};
/**
* Stop the process.
*
* @return this
*/
w.imagify.Optimizer.prototype.stopProcess = function() {
this.files = {};
this.prefixedMediaIDs = [];
this.currentItems = [];
if ( this.doneEvent ) {
$( w ).off( this.doneEvent, this.processedCallback );
}
return this;
};
} )(jQuery, document, window);

View File

@@ -0,0 +1,396 @@
/**
* Library that handles the bulk optimization processes.
*
* @requires jQuery
*/
window.imagify = window.imagify || {};
/* eslint-disable no-underscore-dangle, consistent-this */
(function($, d, w) {
/**
* Construct the optimizer.
*
* @param {object} settings {
* Optimizer settings:
*
* @type {string} groupID Group ID, like 'library' or 'custom-folders'.
* @type {string} context Context within this group, like 'wp' or 'custom-folders' (yes, again).
* @type {int} level Optimization level: 0 to 2.
* @type {int} bufferSize Number of parallel optimizations: usually 4.
* @type {string} ajaxUrl URL to request to optimize.
* @type {object} files Files to optimize: media ID as key (prefixed with an underscore), file URL as value.
* @type {string} defaultThumb A default thumbnail URL.
* @type {string} doneEvent Name of the event to listen to know when optimizations end.
* @type {array} imageExtensions A list of supported image extensions (only images).
* }
*/
w.imagify.Optimizer = function ( settings ) {
// Settings.
this.groupID = settings.groupID;
this.context = settings.context;
this.level = settings.level;
this.bufferSize = settings.bufferSize || 1;
this.ajaxUrl = settings.ajaxUrl;
this.files = settings.files;
this.defaultThumb = settings.defaultThumb;
this.doneEvent = settings.doneEvent;
if ( settings.imageExtensions ) {
this.imageExtensions = settings.imageExtensions;
} else {
this.imageExtensions = [ 'jpg', 'jpeg', 'jpe', 'png', 'gif' ];
}
/**
* An array of media IDs (prefixed with an underscore).
*/
this.prefixedMediaIDs = Object.keys( this.files );
/**
* An array of medias currently being optimized: {
* @type {int} mediaID The media ID.
* @type {string} filename The file name.
* @type {string} thumbnail The file thumbnail URL.
* }
*/
this.currentItems = [];
// Internal counters.
this.totalMedia = this.prefixedMediaIDs.length;
this.processedMedia = 0;
// Global stats.
this.globalOriginalSize = 0;
this.globalOptimizedSize = 0;
this.globalGain = 0;
this.globalPercent = 0;
// Callbacks.
this._before = function () {};
this._each = function () {};
this._done = function () {};
// Listen to the "optimization done" event.
if ( this.totalMedia && this.doneEvent ) {
$( w ).on( this.doneEvent, { _this: this }, this.processedCallback );
}
};
/**
* Callback to trigger before each media optimization.
*
* @param {callable} fnc A callback.
* @return this
*/
w.imagify.Optimizer.prototype.before = function( fnc ) {
this._before = fnc;
return this;
};
/**
* Callback to trigger after each media optimization.
*
* @param {callable} fnc A callback.
* @return this
*/
w.imagify.Optimizer.prototype.each = function( fnc ) {
this._each = fnc;
return this;
};
/**
* Callback to trigger all media optimizations have been done.
*
* @param {callable} fnc A callback.
* @return this
*/
w.imagify.Optimizer.prototype.done = function( fnc ) {
this._done = fnc;
return this;
};
/**
* Launch optimizations.
*
* @return this
*/
w.imagify.Optimizer.prototype.run = function() {
var chunkLength = this.prefixedMediaIDs.length > this.bufferSize ? this.bufferSize : this.prefixedMediaIDs.length,
i;
for ( i = 0; i < chunkLength; i++ ) {
this.processNext();
}
return this;
};
/**
* Launch next optimization.
*
* @return this
*/
w.imagify.Optimizer.prototype.processNext = function() {
if ( this.prefixedMediaIDs.length ) {
this.process( this.prefixedMediaIDs.shift() );
}
return this;
};
/**
* Launch an optimization.
*
* @param {string} prefixedId A media ID, prefixed with an underscore.
* @return this
*/
w.imagify.Optimizer.prototype.process = function( prefixedId ) {
var _this = this,
fileURL = this.files[ prefixedId ],
data = {
mediaID: parseInt( prefixedId.toString().substr( 1 ), 10 ),
filename: this.files[ prefixedId ].split( '/' ).pop(),
thumbnail: this.defaultThumb
},
extension = data.filename.split( '.' ).pop().toLowerCase(),
regexp = new RegExp( '^' + this.imageExtensions.join( '|' ).toLowerCase() + '$' ),
image;
if ( ! extension.match( regexp ) ) {
// Not an image.
this.currentItems.push( data );
this._before( data );
this.send( data );
return this;
}
// Create a thumbnail and send the ajax request.
image = new Image();
image.onerror = function () {
_this.currentItems.push( data );
_this._before( data );
_this.send( data );
};
image.onload = function () {
var maxWidth = 33,
maxHeight = 33,
imageWidth = image.width,
imageHeight = image.height,
newHeight = 0,
newWidth = 0,
topOffset = 0,
leftOffset = 0,
canvas = null,
ctx = null;
if ( imageWidth < imageHeight ) {
// Portrait.
newWidth = maxWidth;
newHeight = newWidth * imageHeight / imageWidth;
topOffset = ( maxHeight - newHeight ) / 2;
} else {
// Landscape.
newHeight = maxHeight;
newWidth = newHeight * imageWidth / imageHeight;
leftOffset = ( maxWidth - newWidth ) / 2;
}
canvas = d.createElement( 'canvas' );
canvas.width = maxWidth;
canvas.height = maxHeight;
ctx = canvas.getContext( '2d' );
ctx.drawImage( this, leftOffset, topOffset, newWidth, newHeight );
try {
data.thumbnail = canvas.toDataURL( 'image/jpeg' );
} catch ( e ) {
data.thumbnail = _this.defaultThumb;
}
canvas = null;
ctx = null;
image = null;
_this.currentItems.push( data );
_this._before( data );
_this.send( data );
};
image.src = fileURL;
return this;
};
/**
* Do the ajax request.
*
* @param {object} data {
* The data:
*
* @type {int} mediaID The media ID.
* @type {string} filename The file name.
* @type {string} thumbnail The file thumbnail URL.
* }
* @return this
*/
w.imagify.Optimizer.prototype.send = function( data ) {
var _this = this,
defaultResponse = {
success: false,
mediaID: data.mediaID,
groupID: this.groupID,
context: this.context,
filename: data.filename,
thumbnail: data.thumbnail,
status: 'error',
error: ''
};
$.post( {
url: this.ajaxUrl,
data: {
media_id: data.mediaID,
context: this.context,
optimization_level: this.level
},
dataType: 'json'
} )
.done( function( response ) {
if ( response.success ) {
return;
}
defaultResponse.error = response.data.error;
_this.processed( defaultResponse );
} )
.fail( function( jqXHR ) {
defaultResponse.error = jqXHR.statusText;
_this.processed( defaultResponse );
} );
return this;
};
/**
* Callback triggered when an optimization is complete.
*
* @param {object} e jQuery's Event object.
* @param {object} item {
* The response:
*
* @type {int} mediaID The media ID.
* @type {string} context The context.
* }
*/
w.imagify.Optimizer.prototype.processedCallback = function( e, item ) {
var _this = e.data._this;
if ( item.context !== _this.context ) {
return;
}
if ( ! item.mediaID || typeof _this.files[ '_' + item.mediaID ] === 'undefined' ) {
return;
}
item.groupID = _this.groupID;
if ( ! _this.currentItems.length ) {
// Trouble.
_this.processed( item );
return;
}
$.each( _this.currentItems, function( i, mediaData ) {
if ( item.mediaID === mediaData.mediaID ) {
item.filename = mediaData.filename;
item.thumbnail = mediaData.thumbnail;
return false;
}
} );
_this.processed( item );
};
/**
* After a media has been processed.
*
* @param {object} response {
* The response:
*
* @type {bool} success Whether the optimization succeeded or not ("already optimized" is a success).
* @type {int} mediaID The media ID.
* @type {string} groupID The group ID.
* @type {string} context The context.
* @type {string} filename The file name.
* @type {string} thumbnail The file thumbnail URL.
* @type {string} status The status, like 'optimized', 'already-optimized', 'over-quota', 'error'.
* @type {string} error The error message.
* }
* @return this
*/
w.imagify.Optimizer.prototype.processed = function( response ) {
var currentItems = this.currentItems;
if ( currentItems.length ) {
// Remove this media from the "current" list.
$.each( currentItems, function( i, mediaData ) {
if ( response.mediaID === mediaData.mediaID ) {
currentItems.splice( i, 1 );
return false;
}
} );
this.currentItems = currentItems;
}
// Update stats.
if ( response.success && 'already-optimized' !== response.status ) {
this.globalOriginalSize += response.originalOverallSize;
this.globalOptimizedSize += response.newOverallSize;
this.globalGain += response.overallSaving;
this.globalPercent = ( 100 - this.globalOptimizedSize / this.globalOptimizedSize * 100 ).toFixed( 2 );
}
++this.processedMedia;
response.progress = Math.floor( this.processedMedia / this.totalMedia * 100 );
this._each( response );
if ( this.prefixedMediaIDs.length ) {
this.processNext();
} else if ( this.totalMedia === this.processedMedia ) {
this._done( {
globalOriginalSize: this.globalOriginalSize,
globalOptimizedSize: this.globalOptimizedSize,
globalGain: this.globalGain
} );
}
return this;
};
/**
* Stop the process.
*
* @return this
*/
w.imagify.Optimizer.prototype.stopProcess = function() {
this.files = {};
this.prefixedMediaIDs = [];
this.currentItems = [];
if ( this.doneEvent ) {
$( w ).off( this.doneEvent, this.processedCallback );
}
return this;
};
} )(jQuery, document, window);

View File

@@ -0,0 +1,584 @@
// DOM.event.move
//
// 2.0.1
//
// Stephen Band
//
// Triggers 'movestart', 'move' and 'moveend' events after
// mousemoves following a mousedown cross a distance threshold,
// similar to the native 'dragstart', 'drag' and 'dragend' events.
// Move events are throttled to animation frames. Move event objects
// have the properties:
//
// pageX:
// pageY: Page coordinates of pointer.
// startX:
// startY: Page coordinates of pointer at movestart.
// distX:
// distY: Distance the pointer has moved since movestart.
// deltaX:
// deltaY: Distance the finger has moved since last event.
// velocityX:
// velocityY: Average velocity over last few events.
(function(fn) {
if (typeof define === 'function' && define.amd) {
define([], fn);
} else if ((typeof module !== "undefined" && module !== null) && module.exports) {
module.exports = fn;
} else {
fn();
}
})(function(){
var assign = Object.assign || window.jQuery && jQuery.extend;
// Number of pixels a pressed pointer travels before movestart
// event is fired.
var threshold = 8;
// Shim for requestAnimationFrame, falling back to timer. See:
// see http://paulirish.com/2011/requestanimationframe-for-smart-animating/
var requestFrame = (function(){
return (
window.requestAnimationFrame ||
window.webkitRequestAnimationFrame ||
window.mozRequestAnimationFrame ||
window.oRequestAnimationFrame ||
window.msRequestAnimationFrame ||
function(fn, element){
return window.setTimeout(function(){
fn();
}, 25);
}
);
})();
var ignoreTags = {
textarea: true,
input: true,
select: true,
button: true
};
var mouseevents = {
move: 'mousemove',
cancel: 'mouseup dragstart',
end: 'mouseup'
};
var touchevents = {
move: 'touchmove',
cancel: 'touchend',
end: 'touchend'
};
var rspaces = /\s+/;
// DOM Events
var eventOptions = { bubbles: true, cancelable: true };
var eventsSymbol = Symbol('events');
function createEvent(type) {
return new CustomEvent(type, eventOptions);
}
function getEvents(node) {
return node[eventsSymbol] || (node[eventsSymbol] = {});
}
function on(node, types, fn, data, selector) {
types = types.split(rspaces);
var events = getEvents(node);
var i = types.length;
var handlers, type;
function handler(e) { fn(e, data); }
while (i--) {
type = types[i];
handlers = events[type] || (events[type] = []);
handlers.push([fn, handler]);
node.addEventListener(type, handler);
}
}
function off(node, types, fn, selector) {
types = types.split(rspaces);
var events = getEvents(node);
var i = types.length;
var type, handlers, k;
if (!events) { return; }
while (i--) {
type = types[i];
handlers = events[type];
if (!handlers) { continue; }
k = handlers.length;
while (k--) {
if (handlers[k][0] === fn) {
node.removeEventListener(type, handlers[k][1]);
handlers.splice(k, 1);
}
}
}
}
function trigger(node, type, properties) {
// Don't cache events. It prevents you from triggering an event of a
// given type from inside the handler of another event of that type.
var event = createEvent(type);
if (properties) { assign(event, properties); }
node.dispatchEvent(event);
}
// Constructors
function Timer(fn){
var callback = fn,
active = false,
running = false;
function trigger(time) {
if (active){
callback();
requestFrame(trigger);
running = true;
active = false;
}
else {
running = false;
}
}
this.kick = function(fn) {
active = true;
if (!running) { trigger(); }
};
this.end = function(fn) {
var cb = callback;
if (!fn) { return; }
// If the timer is not running, simply call the end callback.
if (!running) {
fn();
}
// If the timer is running, and has been kicked lately, then
// queue up the current callback and the end callback, otherwise
// just the end callback.
else {
callback = active ?
function(){ cb(); fn(); } :
fn ;
active = true;
}
};
}
// Functions
function noop() {}
function preventDefault(e) {
e.preventDefault();
}
function isIgnoreTag(e) {
return !!ignoreTags[e.target.tagName.toLowerCase()];
}
function isPrimaryButton(e) {
// Ignore mousedowns on any button other than the left (or primary)
// mouse button, or when a modifier key is pressed.
return (e.which === 1 && !e.ctrlKey && !e.altKey);
}
function identifiedTouch(touchList, id) {
var i, l;
if (touchList.identifiedTouch) {
return touchList.identifiedTouch(id);
}
// touchList.identifiedTouch() does not exist in
// webkit yet… we must do the search ourselves...
i = -1;
l = touchList.length;
while (++i < l) {
if (touchList[i].identifier === id) {
return touchList[i];
}
}
}
function changedTouch(e, data) {
var touch = identifiedTouch(e.changedTouches, data.identifier);
// This isn't the touch you're looking for.
if (!touch) { return; }
// Chrome Android (at least) includes touches that have not
// changed in e.changedTouches. That's a bit annoying. Check
// that this touch has changed.
if (touch.pageX === data.pageX && touch.pageY === data.pageY) { return; }
return touch;
}
// Handlers that decide when the first movestart is triggered
function mousedown(e){
// Ignore non-primary buttons
if (!isPrimaryButton(e)) { return; }
// Ignore form and interactive elements
if (isIgnoreTag(e)) { return; }
on(document, mouseevents.move, mousemove, e);
on(document, mouseevents.cancel, mouseend, e);
}
function mousemove(e, data){
checkThreshold(e, data, e, removeMouse);
}
function mouseend(e, data) {
removeMouse();
}
function removeMouse() {
off(document, mouseevents.move, mousemove);
off(document, mouseevents.cancel, mouseend);
}
function touchstart(e) {
// Don't get in the way of interaction with form elements
if (ignoreTags[e.target.tagName.toLowerCase()]) { return; }
var touch = e.changedTouches[0];
// iOS live updates the touch objects whereas Android gives us copies.
// That means we can't trust the touchstart object to stay the same,
// so we must copy the data. This object acts as a template for
// movestart, move and moveend event objects.
var data = {
target: touch.target,
pageX: touch.pageX,
pageY: touch.pageY,
identifier: touch.identifier,
// The only way to make handlers individually unbindable is by
// making them unique.
touchmove: function(e, data) { touchmove(e, data); },
touchend: function(e, data) { touchend(e, data); }
};
on(document, touchevents.move, data.touchmove, data);
on(document, touchevents.cancel, data.touchend, data);
}
function touchmove(e, data) {
var touch = changedTouch(e, data);
if (!touch) { return; }
checkThreshold(e, data, touch, removeTouch);
}
function touchend(e, data) {
var touch = identifiedTouch(e.changedTouches, data.identifier);
if (!touch) { return; }
removeTouch(data);
}
function removeTouch(data) {
off(document, touchevents.move, data.touchmove);
off(document, touchevents.cancel, data.touchend);
}
function checkThreshold(e, data, touch, fn) {
var distX = touch.pageX - data.pageX;
var distY = touch.pageY - data.pageY;
// Do nothing if the threshold has not been crossed.
if ((distX * distX) + (distY * distY) < (threshold * threshold)) { return; }
triggerStart(e, data, touch, distX, distY, fn);
}
function triggerStart(e, data, touch, distX, distY, fn) {
var touches = e.targetTouches;
var time = e.timeStamp - data.timeStamp;
// Create a movestart object with some special properties that
// are passed only to the movestart handlers.
var template = {
altKey: e.altKey,
ctrlKey: e.ctrlKey,
shiftKey: e.shiftKey,
startX: data.pageX,
startY: data.pageY,
distX: distX,
distY: distY,
deltaX: distX,
deltaY: distY,
pageX: touch.pageX,
pageY: touch.pageY,
velocityX: distX / time,
velocityY: distY / time,
identifier: data.identifier,
targetTouches: touches,
finger: touches ? touches.length : 1,
enableMove: function() {
this.moveEnabled = true;
this.enableMove = noop;
e.preventDefault();
}
};
// Trigger the movestart event.
trigger(data.target, 'movestart', template);
// Unbind handlers that tracked the touch or mouse up till now.
fn(data);
}
// Handlers that control what happens following a movestart
function activeMousemove(e, data) {
var timer = data.timer;
data.touch = e;
data.timeStamp = e.timeStamp;
timer.kick();
}
function activeMouseend(e, data) {
var target = data.target;
var event = data.event;
var timer = data.timer;
removeActiveMouse();
endEvent(target, event, timer, function() {
// Unbind the click suppressor, waiting until after mouseup
// has been handled.
setTimeout(function(){
off(target, 'click', preventDefault);
}, 0);
});
}
function removeActiveMouse() {
off(document, mouseevents.move, activeMousemove);
off(document, mouseevents.end, activeMouseend);
}
function activeTouchmove(e, data) {
var event = data.event;
var timer = data.timer;
var touch = changedTouch(e, event);
if (!touch) { return; }
// Stop the interface from gesturing
e.preventDefault();
event.targetTouches = e.targetTouches;
data.touch = touch;
data.timeStamp = e.timeStamp;
timer.kick();
}
function activeTouchend(e, data) {
var target = data.target;
var event = data.event;
var timer = data.timer;
var touch = identifiedTouch(e.changedTouches, event.identifier);
// This isn't the touch you're looking for.
if (!touch) { return; }
removeActiveTouch(data);
endEvent(target, event, timer);
}
function removeActiveTouch(data) {
off(document, touchevents.move, data.activeTouchmove);
off(document, touchevents.end, data.activeTouchend);
}
// Logic for triggering move and moveend events
function updateEvent(event, touch, timeStamp) {
var time = timeStamp - event.timeStamp;
event.distX = touch.pageX - event.startX;
event.distY = touch.pageY - event.startY;
event.deltaX = touch.pageX - event.pageX;
event.deltaY = touch.pageY - event.pageY;
// Average the velocity of the last few events using a decay
// curve to even out spurious jumps in values.
event.velocityX = 0.3 * event.velocityX + 0.7 * event.deltaX / time;
event.velocityY = 0.3 * event.velocityY + 0.7 * event.deltaY / time;
event.pageX = touch.pageX;
event.pageY = touch.pageY;
}
function endEvent(target, event, timer, fn) {
timer.end(function(){
trigger(target, 'moveend', event);
return fn && fn();
});
}
// Set up the DOM
function movestart(e) {
if (e.defaultPrevented) { return; }
if (!e.moveEnabled) { return; }
var event = {
startX: e.startX,
startY: e.startY,
pageX: e.pageX,
pageY: e.pageY,
distX: e.distX,
distY: e.distY,
deltaX: e.deltaX,
deltaY: e.deltaY,
velocityX: e.velocityX,
velocityY: e.velocityY,
identifier: e.identifier,
targetTouches: e.targetTouches,
finger: e.finger
};
var data = {
target: e.target,
event: event,
timer: new Timer(update),
touch: undefined,
timeStamp: e.timeStamp
};
function update(time) {
updateEvent(event, data.touch, data.timeStamp);
trigger(data.target, 'move', event);
}
if (e.identifier === undefined) {
// We're dealing with a mouse event.
// Stop clicks from propagating during a move
on(e.target, 'click', preventDefault);
on(document, mouseevents.move, activeMousemove, data);
on(document, mouseevents.end, activeMouseend, data);
}
else {
// In order to unbind correct handlers they have to be unique
data.activeTouchmove = function(e, data) { activeTouchmove(e, data); };
data.activeTouchend = function(e, data) { activeTouchend(e, data); };
// We're dealing with a touch.
on(document, touchevents.move, data.activeTouchmove, data);
on(document, touchevents.end, data.activeTouchend, data);
}
}
on(document, 'mousedown', mousedown);
on(document, 'touchstart', touchstart);
on(document, 'movestart', movestart);
// jQuery special events
//
// jQuery event objects are copies of DOM event objects. They need
// a little help copying the move properties across.
if (!window.jQuery) { return; }
var properties = ("startX startY pageX pageY distX distY deltaX deltaY velocityX velocityY").split(' ');
function enableMove1(e) { e.enableMove(); }
function enableMove2(e) { e.enableMove(); }
function enableMove3(e) { e.enableMove(); }
function add(handleObj) {
var handler = handleObj.handler;
handleObj.handler = function(e) {
// Copy move properties across from originalEvent
var i = properties.length;
var property;
while(i--) {
property = properties[i];
e[property] = e.originalEvent[property];
}
handler.apply(this, arguments);
};
}
jQuery.event.special.movestart = {
setup: function() {
// Movestart must be enabled to allow other move events
on(this, 'movestart', enableMove1);
// Do listen to DOM events
return false;
},
teardown: function() {
off(this, 'movestart', enableMove1);
return false;
},
add: add
};
jQuery.event.special.move = {
setup: function() {
on(this, 'movestart', enableMove2);
return false;
},
teardown: function() {
off(this, 'movestart', enableMove2);
return false;
},
add: add
};
jQuery.event.special.moveend = {
setup: function() {
on(this, 'movestart', enableMove3);
return false;
},
teardown: function() {
off(this, 'movestart', enableMove3);
return false;
},
add: add
};
});

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,708 @@
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
$.fn.twentytwenty = function( options, callback ) {
options = $.extend( {
handlePosition: 0.5,
orientation: 'horizontal',
labelBefore: 'Before',
labelAfter: 'After'
}, options );
return this.each( function() {
var sliderPct = options.handlePosition,
$container = $( this ),
sliderOrientation = options.orientation,
beforeDirection = ( 'vertical' === sliderOrientation ) ? 'down' : 'left',
afterDirection = ( 'vertical' === sliderOrientation ) ? 'up' : 'right',
$beforeImg = $container.find( 'img:first' ),
$afterImg = $container.find( 'img:last' ),
offsetX = 0,
offsetY = 0,
imgWidth = 0,
imgHeight = 0,
$slider, $overlay,
calcOffset = function( dimensionPct ) {
var width = parseInt( $beforeImg.width(), 10 ),
height = parseInt( $beforeImg.height(), 10 );
if ( ! width || ! height ) {
width = parseInt( $beforeImg.attr( 'width' ), 10 );
height = parseInt( $beforeImg.attr( 'height' ), 10 );
}
return {
w: width + "px",
h: height + "px",
cw: ( dimensionPct * width ) + "px",
ch: ( dimensionPct * height ) + "px"
};
},
adjustContainer = function( offset ) {
// Make it dynamic, in case the "before" image changes.
var $beforeImage = $container.find( '.twentytwenty-before' );
if ( 'vertical' === sliderOrientation ) {
$beforeImage.css( 'clip', 'rect(0,' + offset.w + ',' + offset.ch + ',0)' );
} else {
$beforeImage.css( 'clip', 'rect(0,' + offset.cw + ',' + offset.h + ',0)' );
}
$container.css( 'height', offset.h );
if ( typeof callback === 'function' ) {
callback();
}
},
adjustSlider = function( pct ) {
var offset = calcOffset( pct );
if ( 'vertical' === sliderOrientation ) {
$slider.css( 'top', offset.ch );
} else {
$slider.css( 'left', offset.cw );
}
adjustContainer( offset );
};
if ( $container.parent( '.twentytwenty-wrapper' ).length ) {
$container.unwrap();
}
$container.wrap( '<div class="twentytwenty-wrapper twentytwenty-' + sliderOrientation + '"></div>' );
$container.children( '.twentytwenty-overlay, .twentytwenty-handle' ).remove();
$container.append( '<div class="twentytwenty-overlay"></div>' );
$container.append( '<div class="twentytwenty-handle"></div>' );
$slider = $container.find( '.twentytwenty-handle' );
$slider.append( '<span class="twentytwenty-' + beforeDirection + '-arrow"></span>' );
$slider.append( '<span class="twentytwenty-' + afterDirection + '-arrow"></span>' );
$container.addClass( 'twentytwenty-container' );
$beforeImg.addClass( 'twentytwenty-before' );
$afterImg.addClass( 'twentytwenty-after' );
$overlay = $container.find( '.twentytwenty-overlay' );
$overlay.append( '<div class="twentytwenty-labels twentytwenty-before-label"><span class="twentytwenty-label-content">' + options.labelBefore + '</span></div>' );
$overlay.append( '<div class="twentytwenty-labels twentytwenty-after-label"><span class="twentytwenty-label-content">' + options.labelAfter + '</span></div>' );
$( w ).on( 'resize.twentytwenty', function() {
adjustSlider( sliderPct );
} );
$slider.on( 'movestart', function( e ) {
if ( 'vertical' !== sliderOrientation && ( ( e.distX > e.distY && e.distX < -e.distY ) || ( e.distX < e.distY && e.distX > -e.distY ) ) ) {
e.preventDefault();
} else if ( 'vertical' === sliderOrientation && ( ( e.distX < e.distY && e.distX < -e.distY ) || ( e.distX > e.distY && e.distX > -e.distY ) ) ) {
e.preventDefault();
}
$container.addClass( 'active' );
offsetX = $container.offset().left;
offsetY = $container.offset().top;
imgWidth = $beforeImg.width();
imgHeight = $beforeImg.height();
} );
$slider.on( 'moveend', function() {
$container.removeClass( 'active' );
} );
$slider.on( 'move', function( e ) {
if ( $container.hasClass('active') ) {
sliderPct = 'vertical' === sliderOrientation ? ( e.pageY - offsetY ) / imgHeight : ( e.pageX - offsetX ) / imgWidth;
if ( sliderPct < 0 ) {
sliderPct = 0;
} else if ( sliderPct > 1 ) {
sliderPct = 1;
}
adjustSlider( sliderPct );
}
} );
$container.find( 'img' ).on( 'mousedown', function( e ) {
e.preventDefault();
} );
$( w ).trigger( 'resize.twentytwenty' );
} );
};
} )(jQuery, document, window);
/**
* Twentytwenty Imagify Init
*/
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
/*
* Mini chart
*
* @param {element} canvas
*/
var drawMeAChart = function ( canvas ) {
canvas.each( function() {
var value = parseInt( $( this ).closest( '.imagify-chart' ).next( '.imagify-chart-value' ).text(), 10 );
new w.imagify.Chart( this, { // eslint-disable-line no-new
type: 'doughnut',
data: {
datasets: [{
data: [ value, 100 - value ],
backgroundColor: [ '#00B3D3', '#D8D8D8' ],
borderColor: '#2A2E3C',
borderWidth: 1
}]
},
options: {
legend: {
display: false
},
events: [],
animation: {
easing: 'easeOutBounce'
},
tooltips: {
enabled: false
},
responsive: false,
cutoutPercentage: 60
}
} );
} );
},
/**
* Dynamic modal
*
* @param {object} Parameters to build modal with datas
*/
imagifyTwentyModal = function( options ) {
var defaults = {
width: 0, //px
height: 0, //px
originalUrl: '', //url
optimizedUrl: '', //url
originalSize: 0, //mb
optimizedSize: 0, // mb
saving: 0, //percent
modalAppendTo: $( 'body' ), // jQuery element
trigger: $( '[data-target="imagify-visual-comparison"]' ), // jQuery element (button, link) with data-target="modalId"
modalId: 'imagify-visual-comparison', // should be dynamic if multiple modals
openModal: false
},
settings = $.extend( {}, defaults, options ),
modalHtml;
if ( 0 === settings.width || 0 === settings.height || '' === settings.originalUrl || '' === settings.optimizedUrl || 0 === settings.originalSize || 0 === settings.optimizedSize || 0 === settings.saving ) {
return 'error';
}
// create modal box
modalHtml = '<div id="' + settings.modalId + '" class="imagify-modal imagify-visual-comparison" aria-hidden="true">';
/* eslint-disable indent */
modalHtml += '<div class="imagify-modal-content loading">';
modalHtml += '<div class="twentytwenty-container">';
modalHtml += '<img class="imagify-img-before" alt="" width="' + settings.width + '" height="' + settings.height + '">';
modalHtml += '<img class="imagify-img-after" alt="" width="' + settings.width + '" height="' + settings.height + '">';
modalHtml += '</div>';
modalHtml += '<div class="imagify-comparison-levels">';
modalHtml += '<div class="imagify-c-level imagify-level-original go-left imagify-original-fize-size">';
modalHtml += '<p class="imagify-c-level-row">';
modalHtml += '<span class="label">' + imagifyTTT.labels.filesize + '</span>';
modalHtml += '<span class="value level">' + settings.originalSize + '</span>';
modalHtml += '</p>';
modalHtml += '</div>';
modalHtml += '<div class="imagify-c-level imagify-level-optimized go-right">';
modalHtml += '<p class="imagify-c-level-row">';
modalHtml += '<span class="label">' + imagifyTTT.labels.filesize + '</span>';
modalHtml += '<span class="value level">' + settings.optimizedSize + '</span>';
modalHtml += '</p>';
modalHtml += '<p class="imagify-c-level-row">';
modalHtml += '<span class="label">' + imagifyTTT.labels.saving + '</span>';
modalHtml += '<span class="value"><span class="imagify-chart"><span class="imagify-chart-container"><canvas id="imagify-consumption-chart-normal" width="15" height="15"></canvas></span></span><span class="imagify-chart-value">' + settings.saving + '</span>%</span>';
modalHtml += '</p>';
modalHtml += '</div>';
modalHtml += '</div>';
modalHtml += '<button class="close-btn absolute" type="button"><i aria-hidden="true" class="dashicons dashicons-no-alt"></i><span class="screen-reader-text">' + imagifyTTT.labels.close + '</span></button>';
modalHtml += '</div>';
/* eslint-enable indent */
modalHtml += '</div>';
settings.modalAppendTo.append( modalHtml );
settings.trigger.on( 'click.imagify', function( e ) {
var $modal = $( $( this ).data( 'target' ) ),
imgsLoaded = 0,
$tt, checkLoad;
e.preventDefault();
if ( settings.openModal ) {
w.imagify.openModal( $( this ) );
}
$modal.find( '.imagify-modal-content' ).css( {
'width': ( $( w ).outerWidth() * 0.85 ) + 'px',
'max-width': settings.width
} );
// Load before img.
$modal.find( '.imagify-img-before' ).on( 'load', function() {
imgsLoaded++;
} ).attr( 'src', settings.originalUrl );
// Load after img.
$modal.find( '.imagify-img-after' ).on( 'load', function() {
imgsLoaded++;
} ).attr( 'src', settings.optimizedUrl + ( settings.optimizedUrl.indexOf( '?' ) > 0 ? '&' : '?' ) + 'v=' + Date.now() );
$tt = $modal.find( '.twentytwenty-container' );
checkLoad = setInterval( function() {
if ( 2 !== imgsLoaded ) {
return;
}
$tt.twentytwenty( {
handlePosition: 0.3,
orientation: 'horizontal',
labelBefore: imagifyTTT.labels.originalL,
labelAfter: imagifyTTT.labels.optimizedL
}, function() {
var windowH = $( w ).height(),
ttH = $modal.find( '.twentytwenty-container' ).height(),
ttTop = $modal.find( '.twentytwenty-wrapper' ).position().top,
$handle, $labels, $datas, datasH, handlePos, labelsPos;
if ( ! $tt.closest( '.imagify-modal-content' ).hasClass( 'loaded' ) ) {
$tt.closest( '.imagify-modal-content' ).removeClass( 'loading' ).addClass( 'loaded' );
drawMeAChart( $modal.find( '.imagify-level-optimized .imagify-chart canvas' ) );
}
// Check if image height is to big.
if ( windowH < ttH && ! $modal.hasClass( 'modal-is-too-high' ) ) {
$modal.addClass( 'modal-is-too-high' );
$handle = $modal.find( '.twentytwenty-handle' );
$labels = $modal.find( '.twentytwenty-label-content' );
$datas = $modal.find( '.imagify-comparison-levels' );
datasH = $datas.outerHeight();
handlePos = ( windowH - ttTop - $handle.height() ) / 2;
labelsPos = ( windowH - ttTop * 3 - datasH );
$handle.css( {
top: handlePos
} );
$labels.css( {
top: labelsPos,
bottom: 'auto'
} );
$modal.find( '.twentytwenty-wrapper' ).css( {
paddingBottom: datasH
} );
$modal.find( '.imagify-modal-content' ).on( 'scroll.imagify', function() {
var scrollTop = $( this ).scrollTop();
$handle.css( {
top: handlePos + scrollTop
} );
$labels.css( {
top: labelsPos + scrollTop
} );
$datas.css( {
bottom: -scrollTop
} );
} );
}
} );
clearInterval( checkLoad );
checkLoad = null;
return 'done';
}, 75 );
} );
}; // imagifyTwentyModal( options );
/**
* The complexe visual comparison
*/
$( '.imagify-visual-comparison-btn' ).on( 'click', function() {
var $tt, imgsLoaded, loader,
labelOriginal, labelNormal, labelAggressive, labelUltra,
originalLabel, originalAlt, originalSrc, originalDim,
normalAlt, normalSrc, normalDim,
aggressiveAlt, aggressiveSrc, aggressiveDim,
ultraLabel, ultraAlt, ultraSrc, ultraDim,
ttBeforeButtons, ttAfterButtons, image50, twentyMe;
if ( $( '.twentytwenty-wrapper' ).length === 1 ) {
return;
}
$( $( this ).data( 'target' ) ).find( '.imagify-modal-content' ).css( 'width', ( $( w ).outerWidth() * 0.95 ) + 'px' );
if ( $( '.twentytwenty-container' ).length > 0 && $( w ).outerWidth() <= 800 ) {
return;
}
$tt = $( '.twentytwenty-container' );
imgsLoaded = 0;
loader = $tt.data( 'loader' );
labelOriginal = $tt.data( 'label-original' );
labelNormal = $tt.data( 'label-normal' );
labelAggressive = $tt.data( 'label-aggressive' );
labelUltra = $tt.data( 'label-ultra' );
originalLabel = $tt.data( 'original-label' ).replace( /\*\*/, '<strong>' ).replace( /\*\*/, '</strong>' );
originalAlt = $tt.data( 'original-alt' );
originalSrc = $tt.data( 'original-img' );
originalDim = $tt.data( 'original-dim' ).split( 'x' );
normalAlt = $tt.data( 'normal-alt' );
normalSrc = $tt.data( 'normal-img' );
normalDim = $tt.data( 'normal-dim' ).split( 'x' );
aggressiveAlt = $tt.data( 'aggressive-alt' );
aggressiveSrc = $tt.data( 'aggressive-img' );
aggressiveDim = $tt.data( 'aggressive-dim' ).split( 'x' );
ultraLabel = $tt.data( 'ultra-label' ).replace( /\*\*/, '<strong>' ).replace( /\*\*/, '</strong>' );
ultraAlt = $tt.data( 'ultra-alt' );
ultraSrc = $tt.data( 'ultra-img' );
ultraDim = $tt.data( 'ultra-dim' ).split( 'x' );
ttBeforeButtons = '<span class="twentytwenty-duo-buttons twentytwenty-duo-left">';
/* eslint-disable indent */
ttBeforeButtons += '<button type="button" class="imagify-comparison-original selected" data-img="original">' + labelOriginal + '</button>';
ttBeforeButtons += '<button type="button" class="imagify-comparison-normal" data-img="normal">' + labelNormal + '</button>';
ttBeforeButtons += '<button type="button" class="imagify-comparison-aggressive" data-img="aggressive">' + labelAggressive + '</button>';
/* eslint-enable indent */
ttBeforeButtons += '</span>';
ttAfterButtons = '<span class="twentytwenty-duo-buttons twentytwenty-duo-right">';
/* eslint-disable indent */
ttAfterButtons += '<button type="button" class="imagify-comparison-normal" data-img="normal">' + labelNormal + '</button>';
ttAfterButtons += '<button type="button" class="imagify-comparison-aggressive" data-img="aggressive">' + labelAggressive + '</button>';
ttAfterButtons += '<button type="button" class="imagify-comparison-ultra selected" data-img="ultra">' + labelUltra + '</button>';
/* eslint-enable indent */
ttAfterButtons += '</span>';
// Loader.
$tt.before( '<img class="loader" src="' + loader + '" alt="Loading…" width="64" height="64">' );
// Should be more locally integrated...
$( '.twentytwenty-left-buttons' ).append( ttBeforeButtons );
$( '.twentytwenty-right-buttons' ).append( ttAfterButtons );
image50 = '<img class="img-original" alt="' + originalAlt + '" width="' + originalDim[0] + '" height="' + originalDim[1] + '">';
image50 += '<img class="img-normal" alt="' + normalAlt + '" width="' + normalDim[0] + '" height="' + normalDim[1] + '">';
image50 += '<img class="img-aggressive" alt="' + aggressiveAlt + '" width="' + aggressiveDim[0] + '" height="' + aggressiveDim[1] + '">';
image50 += '<img class="img-ultra" alt="' + ultraAlt + '" width="' + ultraDim[0] + '" height="' + ultraDim[1] + '">';
// Add switchers button only if needed.
// Should be more locally integrated...
image50 += $( '.twentytwenty-left-buttons' ).lenght ? ttBeforeButtons + ttAfterButtons : '';
// Add images to 50/50 area.
$tt.closest( '.imagify-modal-content' ).addClass( 'loading' ).find( '.twentytwenty-container' ).append( image50 );
// Load image original.
$( '.img-original' ).on( 'load', function() {
imgsLoaded++;
} ).attr( 'src', originalSrc );
// Load image normal.
$( '.img-normal' ).on( 'load', function() {
imgsLoaded++;
} ).attr( 'src', normalSrc );
// Load image aggressive.
$( '.img-aggressive' ).on( 'load', function() {
imgsLoaded++;
} ).attr( 'src', aggressiveSrc );
// Load image ultra.
$( '.img-ultra' ).on( 'load', function() {
imgsLoaded++;
} ).attr( 'src', ultraSrc );
twentyMe = setInterval( function() {
if ( 4 !== imgsLoaded ) {
return;
}
$tt.twentytwenty({
handlePosition: 0.6,
orientation: 'horizontal',
labelBefore: originalLabel,
labelAfter: ultraLabel
}, function() {
// Fires on initialisation & each time the handle is moving.
if ( ! $tt.closest( '.imagify-modal-content' ).hasClass( 'loaded' ) ) {
$tt.closest( '.imagify-modal-content' ).removeClass( 'loading' ).addClass( 'loaded' );
drawMeAChart( $( '.imagify-level-ultra .imagify-chart canvas' ) );
}
} );
clearInterval( twentyMe );
twentyMe = null;
}, 75);
// On click on button choices.
$( '.imagify-comparison-title' ).on( 'click', '.twentytwenty-duo-buttons button:not(.selected)', function( e ) {
var $this = $( this ),
$container = $this.closest( '.imagify-comparison-title' ).nextAll( '.twentytwenty-wrapper' ).find( '.twentytwenty-container' ),
side = $this.closest( '.twentytwenty-duo-buttons' ).hasClass( 'twentytwenty-duo-left' ) ? 'left' : 'right',
$otherSide = 'left' === side ? $this.closest( '.imagify-comparison-title' ).find( '.twentytwenty-duo-right' ) : $this.closest( '.imagify-comparison-title' ).find( '.twentytwenty-duo-left' ),
$duo = $this.closest( '.twentytwenty-duo-buttons' ).find( 'button' ),
$imgBefore = $container.find( '.twentytwenty-before' ),
$imgAfter = $container.find( '.twentytwenty-after' ),
image = $this.data( 'img' ),
clipStyles;
e.stopPropagation();
e.preventDefault();
// Button coloration.
$duo.removeClass( 'selected' );
$this.addClass( 'selected' );
// Other side action (to not compare same images).
if ( $otherSide.find( '.selected' ).data( 'img' ) === image ) {
$otherSide.find( 'button:not(.selected)' ).eq( 0 ).trigger( 'click' );
}
// Left buttons.
if ( 'left' === side ) {
clipStyles = $imgBefore.css( 'clip' );
$imgBefore.attr( 'style', '' );
$imgBefore.removeClass( 'twentytwenty-before' );
$container.find( '.img-' + image ).addClass( 'twentytwenty-before' ).css( 'clip', clipStyles );
$( '.twentytwenty-before-label .twentytwenty-label-content' ).text( $container.data( image + '-label' ) );
$( '.imagify-c-level.go-left' ).attr( 'aria-hidden', 'true' ).removeClass( 'go-left go-right' );
$( '.imagify-level-' + image ).attr( 'aria-hidden', 'false' ).addClass( 'go-left' );
}
// Right buttons.
if ( 'right' === side ) {
$imgAfter.removeClass( 'twentytwenty-after' );
$container.find( '.img-' + image ).addClass( 'twentytwenty-after' );
$( '.twentytwenty-after-label .twentytwenty-label-content' ).text( $container.data( image + '-label' ) );
$( '.imagify-c-level.go-right' ).attr( 'aria-hidden', 'true' ).removeClass( 'go-left go-right' );
$( '.imagify-level-' + image ).attr( 'aria-hidden', 'false' ).addClass( 'go-right' );
}
drawMeAChart( $( '.imagify-level-' + image + ' .imagify-chart canvas' ) );
} );
} );
/**
* Imagify comparison inside Media post edition.
*/
if ( imagifyTTT.imageWidth && $( '.post-php .wp_attachment_image .thumbnail' ).length > 0 ) {
var $oriParent = $( '.post-php .wp_attachment_image' ),
oriSource = { src: $( '#imagify-full-original' ).val(), size: $( '#imagify-full-original-size' ).val() },
$optimizeBtn = $( '#misc-publishing-actions' ).find( '.misc-pub-imagify .button-primary' ),
filesize, saving;
imagifyTTT.widthLimit = parseInt( imagifyTTT.widthLimit, 10 );
// If shown image > 360, use twentytwenty.
if ( imagifyTTT.imageWidth > imagifyTTT.widthLimit && oriSource.src ) {
filesize = $( '#imagify-full-optimized-size' ).val();
saving = $( '.imagify-data-item .imagify-chart-value' ).text();
// Create button to trigger.
$( '[id^="imgedit-open-btn-"]' ).before( '<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-visual-comparison" id="imagify-start-comparison">' + imagifyTTT.labels.compare + '</button>' );
// Modal and trigger event creation.
imagifyTwentyModal( {
width: parseInt( imagifyTTT.imageWidth, 10 ),
height: parseInt( imagifyTTT.imageHeight, 10 ),
originalUrl: oriSource.src,
optimizedUrl: imagifyTTT.imageSrc,
originalSize: oriSource.size,
optimizedSize: filesize,
saving: saving,
modalAppendTo: $oriParent,
trigger: $( '#imagify-start-comparison' ),
modalId: 'imagify-visual-comparison'
} );
}
// Else put images next to next.
else if ( imagifyTTT.imageWidth < imagifyTTT.widthLimit && oriSource.src ) {
// TODO
}
// If image has no backup.
else if ( $( '#imagify-full-original' ).length > 0 && '' === oriSource.src ) {
// do nothing ?
}
// In case image is not optimized.
else {
// If is not in optimizing process, propose the Optimize button trigger.
if ( $( '#misc-publishing-actions' ).find( '.misc-pub-imagify .button-primary' ).length === 1 ) {
$( '[id^="imgedit-open-btn-"]' ).before( '<span class="spinner imagify-hidden"></span><a class="imagify-button-primary button-primary imagify-optimize-trigger" id="imagify-optimize-trigger" href="' + $optimizeBtn.attr( 'href' ) + '">' + imagifyTTT.labels.optimize + '</a>' );
$( '#imagify-optimize-trigger' ).on( 'click', function() {
$( this ).prev( '.spinner' ).removeClass( 'imagify-hidden' ).addClass( 'is-active' );
} );
}
}
}
/**
* Images comparison in attachments list page (upload.php).
*/
if ( $( '.upload-php .imagify-compare-images' ).length > 0 ) {
$( '.imagify-compare-images' ).each( function() {
var $this = $( this ),
id = $this.data( 'id' ),
$datas = $this.closest( '#post-' + id ).find( '.column-imagify_optimized_file' );
// Modal and trigger event creation.
imagifyTwentyModal( {
width: parseInt( $this.data( 'full-width' ), 10 ),
height: parseInt( $this.data( 'full-height' ), 10 ),
originalUrl: $this.data( 'backup-src' ),
optimizedUrl: $this.data( 'full-src' ),
originalSize: $datas.find( '.original' ).text(),
optimizedSize: $datas.find( '#imagify_data_sum .big' ).text(),
saving: $datas.find( '.imagify-chart-value' ).text(),
modalAppendTo: $this.closest( '.column-primary' ),
trigger: $this,
modalId: 'imagify-comparison-' + id
} );
} );
}
/**
* Images Comparison in Grid View modal.
*/
if ( $( '.upload-php' ).length > 0 ) {
var getVar = function( param ) {
var vars = {};
w.location.href.replace(
/[?&]+([^=&]+)=?([^&]*)?/gi,
function( m, key, value ) {
vars[ key ] = undefined !== value ? value : '';
}
);
if ( param ) {
return vars[ param ] ? vars[ param ] : null;
}
return vars;
},
imagifyContentInModal = function() {
var tempTimer = setInterval( function() {
var $datas, originalSrc, $actions;
if ( ! $( '.media-modal .imagify-datas-details' ).length ) {
return;
}
originalSrc = $( '#imagify-original-src' ).val();
if ( originalSrc ) {
// Trigger creation.
$actions = $( '.media-frame-content .attachment-actions' );
$actions.find( '#imagify-media-frame-comparison-btn' ).remove();
$actions.prepend( '<button type="button" class="imagify-button-primary button-primary imagify-modal-trigger" data-target="#imagify-comparison-modal" id="imagify-media-frame-comparison-btn">' + imagifyTTT.labels.compare + '</button>' );
// Get datas.
$datas = $( '.media-frame-content .compat-field-imagify' );
// Modal and trigger event creation.
imagifyTwentyModal( {
width: parseInt( $( '#imagify-full-width' ).val(), 10 ),
height: parseInt( $( '#imagify-full-height' ).val(), 10 ),
originalUrl: originalSrc,
optimizedUrl: $( '#imagify-full-src' ).val(),
originalSize: $( '#imagify-original-size' ).val(),
optimizedSize: $datas.find( '#imagify_data_sum .big' ).text(),
saving: $datas.find( '.imagify-chart-value' ).text(),
modalAppendTo: $( '.media-frame-content .thumbnail-image' ),
trigger: $( '#imagify-media-frame-comparison-btn' ),
modalId: 'imagify-comparison-modal',
openModal: true
} );
}
clearInterval( tempTimer );
tempTimer = null;
}, 20 );
};
// If attachment is clicked, or the "Previous" and "Next" buttons, build the modal inside the modal.
$( '.upload-php' ).on( 'click', '.media-frame.mode-grid .attachment, .edit-media-header .left, .edit-media-header .right', function() {
imagifyContentInModal();
} );
// If attachment is mentionned in URL, build the modal inside the modal.
if ( getVar( 'item' ) ) {
imagifyContentInModal();
}
}
/**
* Images comparison in custom folders list page.
*/
if ( $( '#imagify-files-list-form' ).length > 0 ) {
var buildComparisonModal = function( $buttons ) {
$buttons.each( function() {
var $this = $( this ),
id = $this.data( 'id' ),
$datas = $this.closest( 'tr' ).find( '.column-optimization .imagify-data-item' );
$( '#imagify-comparison-' + id ).remove();
// Modal and trigger event creation.
imagifyTwentyModal( {
width: parseInt( $this.data( 'full-width' ), 10 ),
height: parseInt( $this.data( 'full-height' ), 10 ),
originalUrl: $this.data( 'backup-src' ),
optimizedUrl: $this.data( 'full-src' ),
originalSize: $datas.find( '.original' ).text(),
optimizedSize: $datas.find( '.optimized' ).text(),
saving: $datas.find( '.imagify-chart-value' ).text(),
modalAppendTo: $this.closest( '.column-primary' ),
trigger: $this,
modalId: 'imagify-comparison-' + id
} );
} );
};
/**
* Update the comparison tool window when a file row is updated via ajax, and the ones already printed.
*/
$( w ).on( 'comparisonprinted.imagify', function( e, id ) {
var $buttons;
id = id || 0;
if ( id ) {
$buttons = $( '#imagify-files-list-form' ).find( '.imagify-compare-images[data-id="' + id + '"]' );
} else {
$buttons = $( '#imagify-files-list-form' ).find( '.imagify-compare-images' );
}
if ( $buttons.length ) {
buildComparisonModal( $buttons );
}
} )
.trigger( 'comparisonprinted.imagify' );
}
} )(jQuery, document, window);

File diff suppressed because one or more lines are too long

View File

@@ -0,0 +1,51 @@
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
var bulkOpt;
/**
* Add a "Imagify'em all" in the select list.
*/
bulkOpt = '<option value="imagify-bulk|optimize">' + imagifyLibrary.labels.bulkActionsOptimize + '</option>';
if ( $( '.button-imagify-optimize-missing-sizes' ).length ) {
// If we have items that have missing sizes.
bulkOpt += '<option value="imagify-bulk|optimize_missing_sizes">' + imagifyLibrary.labels.bulkActionsOptimizeMissingSizes + '</option>';
}
if ( imagifyLibrary.backupOption || $( '.attachment-has-backup' ).length ) {
// If the backup option is enabled, or if we have items that can be restored.
bulkOpt += '<option value="imagify-bulk|restore">' + imagifyLibrary.labels.bulkActionsRestore + '</option>';
}
$( '.bulkactions select[name="action"] option:last-child' ).before( bulkOpt );
$( '.bulkactions select[name="action2"] option:last-child' ).before( bulkOpt );
$( '#bulkaction option:last-child' ).after( bulkOpt );
/**
* Process optimization for all selected images.
*/
$( '#doaction' )
.add( '#doaction2' )
.add( '#bulkaction + [name="showThickbox"]' )
.on( 'click', function( e ) {
var value = $( this ).prev( 'select' ).val().split( '|' ),
action, ids;
if ( 'imagify-bulk' !== value[0] ) {
return;
}
e.preventDefault();
action = value[1];
ids = $( 'input[name^="media"]:checked, input[name^="doaction"]:checked' ).map( function() {
return this.value;
} ).get();
ids.forEach( function( id, index ) {
setTimeout( function() {
$( 'table .imagify-data-actions-container[data-id="' + id + '"] .button-imagify-' + action ).first().trigger( 'click' );
}, index * 300 );
} );
} );
} )(jQuery, document, window);

View File

@@ -0,0 +1 @@
!function(o){var i='<option value="imagify-bulk|optimize">'+imagifyLibrary.labels.bulkActionsOptimize+"</option>";o(".button-imagify-optimize-missing-sizes").length&&(i+='<option value="imagify-bulk|optimize_missing_sizes">'+imagifyLibrary.labels.bulkActionsOptimizeMissingSizes+"</option>"),(imagifyLibrary.backupOption||o(".attachment-has-backup").length)&&(i+='<option value="imagify-bulk|restore">'+imagifyLibrary.labels.bulkActionsRestore+"</option>"),o('.bulkactions select[name="action"] option:last-child').before(i),o('.bulkactions select[name="action2"] option:last-child').before(i),o("#bulkaction option:last-child").after(i),o("#doaction").add("#doaction2").add('#bulkaction + [name="showThickbox"]').on("click",function(i){var a,t=o(this).prev("select").val().split("|");"imagify-bulk"===t[0]&&(i.preventDefault(),a=t[1],o('input[name^="media"]:checked, input[name^="doaction"]:checked').map(function(){return this.value}).get().forEach(function(i,t){setTimeout(function(){o('table .imagify-data-actions-container[data-id="'+i+'"] .button-imagify-'+a).first().trigger("click")},300*t)}))})}(jQuery,(document,window));

View File

@@ -0,0 +1,334 @@
/**
* Mini chart.
*
* @param {element} canvas The canvas element.
*/
window.imagify.drawMeAChart = function( canvas ) {
canvas.each( function() {
var value = parseInt( jQuery( this ).closest( '.imagify-chart' ).next( '.imagify-chart-value' ).text(), 10 );
new window.imagify.Chart( this, { // eslint-disable-line no-new
type: 'doughnut',
data: {
datasets: [ {
data: [ value, 100 - value ],
backgroundColor: [ '#00B3D3', '#D8D8D8' ],
borderColor: '#fff',
borderWidth: 1
} ]
},
options: {
legend: {
display: false
},
events: [],
animation: {
easing: 'easeOutBounce'
},
tooltips: {
enabled: false
},
responsive: false
}
} );
} );
};
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
w.imagify.modal = {
working: [],
/*
* Init.
*/
init: function () {
var $document = $( d ),
$processing;
// Update the chart in the media modal when a media is selected, and the ones already printed.
$( w ).on( 'canvasprinted.imagify', this.updateChart ).trigger( 'canvasprinted.imagify' );
// Toggle slide in custom column.
$( '.imagify-datas-details' ).hide();
$document.on( 'click', '.imagify-datas-more-action a', this.toggleSlide );
// Optimize, restore, etc.
$document.on( 'click', '.button-imagify-restore, .button-imagify-optimize, .button-imagify-manual-reoptimize, .button-imagify-optimize-missing-sizes, .button-imagify-generate-webp, .button-imagify-delete-webp', this.processOptimization );
$document.on( 'imagifybeat-send', this.addToImagifybeat );
$document.on( 'imagifybeat-tick', this.processImagifybeat );
// Some items may be processed in background on page load.
$processing = $( '.imagify-data-actions-container .button-imagify-processing' );
if ( $processing.length ) {
// Some media are already being processed.
// Lock the items, so we can check their status with Imagifybeat.
$processing.closest( '.imagify-data-actions-container' ).each( function() {
var $this = $( this ),
id = w.imagify.modal.sanitizeId( $this.data( 'id' ) ),
context = w.imagify.modal.sanitizeContext( $this.data( 'context' ) );
w.imagify.modal.lockItem( context, id );
} );
// Fasten Imagifybeat.
w.imagify.beat.interval( 15 );
}
},
// Charts ==================================================================================
/**
* Update the chart in the media modal when a media is selected, and the ones already printed.
*
* @param {object} e Event.
* @param {string} selector A CSS selector.
*/
updateChart: function( e, selector ) {
var $canvas;
selector = selector || '.imagify-consumption-chart';
$canvas = $( selector );
w.imagify.drawMeAChart( $canvas );
$canvas.closest( '.imagify-datas-list' ).siblings( '.imagify-datas-details' ).hide();
},
// Optimization ============================================================================
/**
* Process to one of these actions: restore, optimize, re-optimize, or optimize missing sizes.
*
* @param {object} e Event.
*/
processOptimization: function( e ) {
var $obj = $( this ),
$container = $obj.parents( '.imagify-data-actions-container' ),
id = w.imagify.modal.sanitizeId( $container.data( 'id' ) ),
context = w.imagify.modal.sanitizeContext( $container.data( 'context' ) ),
href, processingTemplate;
e.preventDefault();
if ( w.imagify.modal.isItemLocked( context, id ) ) {
return;
}
w.imagify.modal.lockItem( context, id );
href = $obj.attr( 'href' );
processingTemplate = w.imagify.template( 'imagify-button-processing' );
$container.html( processingTemplate( {
label: $obj.data( 'processing-label' )
} ) );
$.get( href.replace( 'admin-post.php', 'admin-ajax.php' ) )
.done( function( response ) {
if ( response.data && response.data.html ) {
// The work is done.
w.imagify.modal.displayProcessResult( context, id, response.data.html );
} else {
// Still processing in background: we're waiting for the result by poking Imagifybeat.
// Set the Imagifybeat interval to 15 seconds.
w.imagify.beat.interval( 15 );
}
} );
},
// Imagifybeat =============================================================================
/**
* Send the media IDs and their status to Imagifybeat.
*
* @param {object} e Event object.
* @param {object} data Object containing all Imagifybeat IDs.
*/
addToImagifybeat: function ( e, data ) {
var $containers = $( '.imagify-data-actions-container' );
if ( ! $containers.length ) {
return;
}
data[ w.imagifyModal.imagifybeatID ] = {};
$containers.each( function() {
var $this = $( this ),
id = w.imagify.modal.sanitizeId( $this.data( 'id' ) ),
context = w.imagify.modal.sanitizeContext( $this.data( 'context' ) ),
locked = w.imagify.modal.isItemLocked( context, id ) ? 1 : 0;
data[ w.imagifyModal.imagifybeatID ][ context ] = data[ w.imagifyModal.imagifybeatID ][ context ] || {};
data[ w.imagifyModal.imagifybeatID ][ context ][ '_' + id ] = locked;
} );
},
/**
* Listen for the custom event "imagifybeat-tick" on $(document).
*
* @param {object} e Event object.
* @param {object} data Object containing all Imagifybeat IDs.
*/
processImagifybeat: function ( e, data ) {
if ( typeof data[ w.imagifyModal.imagifybeatID ] === 'undefined' ) {
return;
}
$.each( data[ w.imagifyModal.imagifybeatID ], function( contextId, htmlContent ) {
var context, id;
context = $.trim( contextId ).match( /^(.+)_(\d+)$/ );
if ( ! context ) {
return;
}
id = w.imagify.modal.sanitizeId( context[2] );
context = w.imagify.modal.sanitizeContext( context[1] );
w.imagify.modal.displayProcessResult( context, id, htmlContent );
} );
},
// DOM manipulation tools ==================================================================
/**
* Display the process result.
*
* @param {string} context The media context.
* @param {int} id The media ID.
* @param {string} htmlContent The HTML to insert.
*/
displayProcessResult: function( context, id, htmlContent ) {
var $containers = w.imagify.modal.getContainers( context, id );
$containers.html( htmlContent );
w.imagify.modal.unlockItem( context, id );
if ( ! w.imagify.modal.working.length ) {
// Work is done.
// Open the last container being processed.
w.imagify.modal.openSlide( $containers );
// Reset Imagifybeat interval.
w.imagify.beat.resetInterval();
}
},
/**
* Open a slide rapidly.
*
* @param {object} $containers A jQuery collection.
*/
openSlide: function( $containers ) {
$containers.each( function() {
var $container = $( this ),
text = $container.find( '.imagify-datas-more-action a' ).data( 'close' );
$container.find( '.imagify-datas-more-action a' ).addClass( 'is-open' ).find( '.the-text' ).text( text );
$container.find( '.imagify-datas-details' ).show().addClass( 'is-open' );
} );
},
/**
* Toggle slide in custom column.
*
* @param {object} e Event.
*/
toggleSlide: function( e ) {
var $this = $( this );
e.preventDefault();
if ( $this.hasClass( 'is-open' ) ) {
$( $this.attr( 'href' ) ).slideUp( 300 ).removeClass( 'is-open' );
$this.removeClass( 'is-open' ).find( '.the-text' ).text( $this.data( 'open' ) );
} else {
$( $this.attr( 'href' ) ).slideDown( 300 ).addClass( 'is-open' );
$this.addClass( 'is-open' ).find( '.the-text' ).text( $this.data( 'close' ) );
}
},
/**
* Get all containers matching the given context and id.
*
* @param {string} context The media context.
* @param {int} id The media ID.
* @return {object} A jQuery collection.
*/
getContainers: function( context, id ) {
return $( '.imagify-data-actions-container[data-id="' + id + '"][data-context="' + context + '"]' );
},
// Sanitization ============================================================================
/**
* Sanitize a media ID.
*
* @param {int|string} id A media ID.
* @return {int}
*/
sanitizeId: function( id ) {
return parseInt( id, 10 );
},
/**
* Sanitize a media context.
*
* @param {string} context A media context.
* @return {string}
*/
sanitizeContext: function( context ) {
context = context.replace( '/[^a-z0-9_-]/gi', '' ).toLowerCase();
return context ? context : 'wp';
},
// Locks ===================================================================================
/**
* Lock an item.
*
* @param {string} context The media context.
* @param {int} id The media ID.
*/
lockItem: function( context, id ) {
if ( ! this.isItemLocked( context, id ) ) {
this.working.push( context + '_' + id );
}
},
/**
* Unlock an item.
*
* @param {string} context The media context.
* @param {int} id The media ID.
*/
unlockItem: function( context, id ) {
var name = context + '_' + id,
i = _.indexOf( this.working, name );
if ( i > -1 ) {
this.working.splice( i, 1 );
}
},
/**
* Tell if an item is locked.
*
* @param {string} context The media context.
* @param {int} id The media ID.
* @return {bool}
*/
isItemLocked: function( context, id ) {
return _.indexOf( this.working, context + '_' + id ) > -1;
}
};
w.imagify.modal.init();
} )(jQuery, document, window);

View File

@@ -0,0 +1 @@
window.imagify.drawMeAChart=function(i){i.each(function(){var i=parseInt(jQuery(this).closest(".imagify-chart").next(".imagify-chart-value").text(),10);new window.imagify.Chart(this,{type:"doughnut",data:{datasets:[{data:[i,100-i],backgroundColor:["#00B3D3","#D8D8D8"],borderColor:"#fff",borderWidth:1}]},options:{legend:{display:!1},events:[],animation:{easing:"easeOutBounce"},tooltips:{enabled:!1},responsive:!1}})})},function(s,a,d){d.imagify.modal={working:[],init:function(){var i=s(a);s(d).on("canvasprinted.imagify",this.updateChart).trigger("canvasprinted.imagify"),s(".imagify-datas-details").hide(),i.on("click",".imagify-datas-more-action a",this.toggleSlide),i.on("click",".button-imagify-restore, .button-imagify-optimize, .button-imagify-manual-reoptimize, .button-imagify-optimize-missing-sizes, .button-imagify-generate-webp, .button-imagify-delete-webp",this.processOptimization),i.on("imagifybeat-send",this.addToImagifybeat),i.on("imagifybeat-tick",this.processImagifybeat),(i=s(".imagify-data-actions-container .button-imagify-processing")).length&&(i.closest(".imagify-data-actions-container").each(function(){var i=s(this),a=d.imagify.modal.sanitizeId(i.data("id")),i=d.imagify.modal.sanitizeContext(i.data("context"));d.imagify.modal.lockItem(i,a)}),d.imagify.beat.interval(15))},updateChart:function(i,a){a=s(a=a||".imagify-consumption-chart");d.imagify.drawMeAChart(a),a.closest(".imagify-datas-list").siblings(".imagify-datas-details").hide()},processOptimization:function(i){var a,t=s(this),e=t.parents(".imagify-data-actions-container"),n=d.imagify.modal.sanitizeId(e.data("id")),o=d.imagify.modal.sanitizeContext(e.data("context"));i.preventDefault(),d.imagify.modal.isItemLocked(o,n)||(d.imagify.modal.lockItem(o,n),i=t.attr("href"),a=d.imagify.template("imagify-button-processing"),e.html(a({label:t.data("processing-label")})),s.get(i.replace("admin-post.php","admin-ajax.php")).done(function(i){i.data&&i.data.html?d.imagify.modal.displayProcessResult(o,n,i.data.html):d.imagify.beat.interval(15)}))},addToImagifybeat:function(i,e){var a=s(".imagify-data-actions-container");a.length&&(e[d.imagifyModal.imagifybeatID]={},a.each(function(){var i=s(this),a=d.imagify.modal.sanitizeId(i.data("id")),i=d.imagify.modal.sanitizeContext(i.data("context")),t=d.imagify.modal.isItemLocked(i,a)?1:0;e[d.imagifyModal.imagifybeatID][i]=e[d.imagifyModal.imagifybeatID][i]||{},e[d.imagifyModal.imagifybeatID][i]["_"+a]=t}))},processImagifybeat:function(i,a){void 0!==a[d.imagifyModal.imagifybeatID]&&s.each(a[d.imagifyModal.imagifybeatID],function(i,a){var t,i=s.trim(i).match(/^(.+)_(\d+)$/);i&&(t=d.imagify.modal.sanitizeId(i[2]),i=d.imagify.modal.sanitizeContext(i[1]),d.imagify.modal.displayProcessResult(i,t,a))})},displayProcessResult:function(i,a,t){var e=d.imagify.modal.getContainers(i,a);e.html(t),d.imagify.modal.unlockItem(i,a),d.imagify.modal.working.length||(d.imagify.modal.openSlide(e),d.imagify.beat.resetInterval())},openSlide:function(i){i.each(function(){var i=s(this),a=i.find(".imagify-datas-more-action a").data("close");i.find(".imagify-datas-more-action a").addClass("is-open").find(".the-text").text(a),i.find(".imagify-datas-details").show().addClass("is-open")})},toggleSlide:function(i){var a=s(this);i.preventDefault(),a.hasClass("is-open")?(s(a.attr("href")).slideUp(300).removeClass("is-open"),a.removeClass("is-open").find(".the-text").text(a.data("open"))):(s(a.attr("href")).slideDown(300).addClass("is-open"),a.addClass("is-open").find(".the-text").text(a.data("close")))},getContainers:function(i,a){return s('.imagify-data-actions-container[data-id="'+a+'"][data-context="'+i+'"]')},sanitizeId:function(i){return parseInt(i,10)},sanitizeContext:function(i){return(i=i.replace("/[^a-z0-9_-]/gi","").toLowerCase())||"wp"},lockItem:function(i,a){this.isItemLocked(i,a)||this.working.push(i+"_"+a)},unlockItem:function(i,a){i=_.indexOf(this.working,i+"_"+a);-1<i&&this.working.splice(i,1)},isItemLocked:function(i,a){return-1<_.indexOf(this.working,i+"_"+a)}},d.imagify.modal.init()}(jQuery,document,window);

View File

@@ -0,0 +1,127 @@
// All notices =====================================================================================
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
/**
* Close an Imagify notice.
*/
$( '.imagify-notice-dismiss' ).on( 'click.imagify', function( e ) {
var $this = $( this ),
$parent = $this.parents( '.imagify-welcome, .imagify-notice, .imagify-rkt-notice, .imagify-upsell, .imagify-upsell-admin-bar' ),
href = $this.attr( 'href' );
e.preventDefault();
// Hide the notice.
$parent.fadeTo( 100 , 0, function() {
$( this ).slideUp( 100, function() {
$( this ).remove();
} );
} );
// Save the dismiss notice.
$.get( href.replace( 'admin-post.php', 'admin-ajax.php' ) );
} );
} )(jQuery, document, window);
// The "welcome steps" notice + "wrong API key" notice =============================================
(function($, d, w, undefined) { // eslint-disable-line no-unused-vars, no-shadow, no-shadow-restricted-names
/**
* 1. Create a new Imagify account.
*/
$( '#imagify-signup' ).on( 'click.imagify', function( e ) {
e.preventDefault();
// Display the sign up form.
swal( {
title: imagifyNotices.labels.signupTitle,
html: imagifyNotices.labels.signupText,
confirmButtonText: imagifyNotices.labels.signupConfirmButtonText,
input: 'email',
padding: 0,
showLoaderOnConfirm: true,
customClass: 'imagify-sweet-alert imagify-sweet-alert-signup',
inputValidator: function( inputValue ) {
return new Promise( function( resolve, reject ) {
if ( $.trim( inputValue ) === '' || ! inputValue ) {
reject( imagifyNotices.labels.signupErrorEmptyEmail );
} else {
resolve();
}
} );
},
preConfirm: function( inputValue ) {
return new Promise( function( resolve, reject ) {
setTimeout( function() {
$.get( ajaxurl + w.imagify.concat + 'action=imagify_signup&email=' + inputValue + '&imagifysignupnonce=' + $( '#imagifysignupnonce' ).val() )
.done( function( response ) {
if ( ! response.success ) {
reject( response.data );
} else {
resolve();
}
} );
}, 2000 );
} );
},
} ).then( function() {
swal( {
title: imagifyNotices.labels.signupSuccessTitle,
html: imagifyNotices.labels.signupSuccessText,
type: 'success',
padding: 0,
customClass: 'imagify-sweet-alert'
} );
} );
} );
/**
* 2. Check and save the Imagify API Key.
*/
$( '#imagify-save-api-key' ).on( 'click.imagify', function( e ) {
e.preventDefault();
// Display the API key form.
swal( {
title: imagifyNotices.labels.saveApiKeyTitle,
html: imagifyNotices.labels.saveApiKeyText,
confirmButtonText: imagifyNotices.labels.saveApiKeyConfirmButtonText,
input: 'text',
padding: 0,
showLoaderOnConfirm: true,
customClass: 'imagify-sweet-alert imagify-sweet-alert-signup',
inputValidator: function( inputValue ) {
return new Promise( function( resolve, reject ) {
if ( $.trim( inputValue ) === '' || ! inputValue ) {
reject( imagifyNotices.labels.ApiKeyErrorEmpty );
} else {
resolve();
}
} );
},
preConfirm: function( inputValue ) {
return new Promise( function( resolve, reject ) {
$.get( ajaxurl + w.imagify.concat + 'action=imagify_check_api_key_validity&api_key=' + inputValue + '&imagifycheckapikeynonce=' + $( '#imagifycheckapikeynonce' ).val() )
.done( function( response ) {
if ( ! response.success ) {
reject( response.data );
} else {
resolve();
}
} );
} );
},
} ).then( function() {
swal( {
title: imagifyNotices.labels.ApiKeyCheckSuccessTitle,
html: imagifyNotices.labels.ApiKeyCheckSuccessText,
type: 'success',
padding: 0,
customClass: 'imagify-sweet-alert'
} );
} );
} );
} )(jQuery, document, window);

Some files were not shown because too many files have changed in this diff Show More