Version Description
Download this release
Release Info
| Developer | wp_media |
| Plugin | |
| Version | 2.0 |
| Comparing to | |
| See all releases | |
Code changes from version 1.35 to 2.0
- .gitattributes +7 -0
- Imagify_Partner.php +875 -0
- Notices.php +155 -0
- Plugin_Card_Helper.php +662 -0
- assets/css/style.css +810 -0
- assets/css/style.min.css +1 -0
- assets/css/style.scss +10 -0
- assets/img/Imagify-Logo-Gray-Colored.svg +32 -0
- assets/img/bridge-normal.jpg +0 -0
- assets/img/bridge-original.jpg +0 -0
- assets/img/bridge-ultra.jpg +0 -0
- assets/img/fond-CTA.svg +23 -0
- assets/img/fusee.svg +30 -0
- assets/img/logo-heartbeat.svg +53 -0
- assets/img/logo-rocket.jpg +0 -0
- assets/img/logo.svg +11 -0
- assets/img/mini-imagify.svg +22 -0
- assets/img/optimize.svg +13 -0
- assets/img/ordi.png +0 -0
- assets/img/quality.svg +16 -0
- assets/img/team-2.jpg +0 -0
- assets/img/team.jpg +0 -0
- assets/img/time.svg +23 -0
- assets/js/imagesLoaded.js +496 -0
- assets/js/jquery.event.move.js +599 -0
- assets/js/jquery.twentytwenty.js +151 -0
- assets/js/script.js +71 -0
- assets/js/scripts.min.js +41 -0
- phpcs.xml +28 -0
- readme.txt +8 -4
- upload-max-file-size.php +292 -0
- upload_max_file_size.php +0 -295
- views/admin-form.php +57 -0
- views/admin-page.php +246 -0
.gitattributes
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# Directories
|
| 2 |
+
/.wordpress-org export-ignore
|
| 3 |
+
/.github export-ignore
|
| 4 |
+
|
| 5 |
+
# Files
|
| 6 |
+
/.gitattributes export-ignore
|
| 7 |
+
/.distignore export-ignore
|
Imagify_Partner.php
ADDED
|
@@ -0,0 +1,875 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Tool allowing 3rd party WordPress plugins to handle partnership with Imagify.
|
| 4 |
+
*
|
| 5 |
+
* @package wp-media/wp-imagify-partner
|
| 6 |
+
*/
|
| 7 |
+
|
| 8 |
+
namespace UMFS;
|
| 9 |
+
|
| 10 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
| 11 |
+
|
| 12 |
+
/**
|
| 13 |
+
* Class allowing to download, install, and activate Imagify plugin.
|
| 14 |
+
*
|
| 15 |
+
* @author Grégory Viguier
|
| 16 |
+
*/
|
| 17 |
+
class Imagify_Partner {
|
| 18 |
+
|
| 19 |
+
/**
|
| 20 |
+
* Class version.
|
| 21 |
+
*
|
| 22 |
+
* @var string
|
| 23 |
+
*/
|
| 24 |
+
const VERSION = '1.0';
|
| 25 |
+
|
| 26 |
+
/**
|
| 27 |
+
* Name of the option that stores the partner identifier.
|
| 28 |
+
*
|
| 29 |
+
* @var string
|
| 30 |
+
*/
|
| 31 |
+
const OPTION_NAME = 'imagifyp_id';
|
| 32 |
+
|
| 33 |
+
/**
|
| 34 |
+
* Name of the transient that stores the error messages.
|
| 35 |
+
*
|
| 36 |
+
* @var string
|
| 37 |
+
*/
|
| 38 |
+
const ERROR_TRANSIENT_NAME = 'imagifyp_error';
|
| 39 |
+
|
| 40 |
+
/**
|
| 41 |
+
* Name of the URL argument used on success.
|
| 42 |
+
*
|
| 43 |
+
* @var string
|
| 44 |
+
*/
|
| 45 |
+
const SUCCESS_ARG = 'imp-success';
|
| 46 |
+
|
| 47 |
+
/**
|
| 48 |
+
* Name of the URL argument used to display an error notice.
|
| 49 |
+
*
|
| 50 |
+
* @var string
|
| 51 |
+
*/
|
| 52 |
+
const ERROR_ARG = 'imp-error';
|
| 53 |
+
|
| 54 |
+
/**
|
| 55 |
+
* ID of the nonce used to install Imagify.
|
| 56 |
+
*
|
| 57 |
+
* @var string
|
| 58 |
+
*/
|
| 59 |
+
const NONCE_NAME = 'install_imagify_from_partner';
|
| 60 |
+
|
| 61 |
+
/**
|
| 62 |
+
* Message used as fallback in get_message().
|
| 63 |
+
*
|
| 64 |
+
* @var string
|
| 65 |
+
*/
|
| 66 |
+
const FALLBACK_MESSAGE = 'Unknown message';
|
| 67 |
+
|
| 68 |
+
/**
|
| 69 |
+
* Partner identifier.
|
| 70 |
+
*
|
| 71 |
+
* @var string
|
| 72 |
+
* @access protected
|
| 73 |
+
*/
|
| 74 |
+
protected $partner;
|
| 75 |
+
|
| 76 |
+
|
| 77 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 78 |
+
/** INSTANCE, INIT ========================================================================== */
|
| 79 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 80 |
+
|
| 81 |
+
/**
|
| 82 |
+
* Class constructor: sanitize and set the partner identifier.
|
| 83 |
+
*
|
| 84 |
+
* @since 1.0
|
| 85 |
+
* @access public
|
| 86 |
+
* @author Grégory Viguier
|
| 87 |
+
*
|
| 88 |
+
* @param string $partner Partner identifier.
|
| 89 |
+
*/
|
| 90 |
+
public function __construct( $partner ) {
|
| 91 |
+
$this->partner = self::sanitize_partner( $partner );
|
| 92 |
+
}
|
| 93 |
+
|
| 94 |
+
/**
|
| 95 |
+
* Class init.
|
| 96 |
+
*
|
| 97 |
+
* @since 1.0
|
| 98 |
+
* @access public
|
| 99 |
+
* @author Grégory Viguier
|
| 100 |
+
*/
|
| 101 |
+
public function init() {
|
| 102 |
+
if ( ! $this->get_partner() ) {
|
| 103 |
+
return;
|
| 104 |
+
}
|
| 105 |
+
|
| 106 |
+
if ( ! is_admin() ) {
|
| 107 |
+
return;
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
if ( ! self::has_imagify_api_key() ) {
|
| 111 |
+
add_action( 'wp_ajax_' . $this->get_post_action(), array( $this, 'post_callback' ) );
|
| 112 |
+
add_action( 'admin_post_' . $this->get_post_action(), array( $this, 'post_callback' ) );
|
| 113 |
+
}
|
| 114 |
+
|
| 115 |
+
if ( self::is_success() || self::is_error() ) {
|
| 116 |
+
add_action( 'all_admin_notices', array( __CLASS__, 'error_notice' ) );
|
| 117 |
+
add_filter( 'removable_query_args', array( __CLASS__, 'add_query_args' ) );
|
| 118 |
+
}
|
| 119 |
+
}
|
| 120 |
+
|
| 121 |
+
|
| 122 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 123 |
+
/** MAIN PUBLIC TOOLS ======================================================================= */
|
| 124 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 125 |
+
|
| 126 |
+
/**
|
| 127 |
+
* Tell if Imagify's API key is set.
|
| 128 |
+
*
|
| 129 |
+
* @since 1.0
|
| 130 |
+
* @access public
|
| 131 |
+
* @author Grégory Viguier
|
| 132 |
+
*
|
| 133 |
+
* @return bool
|
| 134 |
+
*/
|
| 135 |
+
public static function has_imagify_api_key() {
|
| 136 |
+
static $has;
|
| 137 |
+
|
| 138 |
+
if ( isset( $has ) ) {
|
| 139 |
+
return $has;
|
| 140 |
+
}
|
| 141 |
+
|
| 142 |
+
if ( function_exists( 'get_imagify_option' ) ) {
|
| 143 |
+
// Imagify is already installed and activated.
|
| 144 |
+
$has = (bool) get_imagify_option( 'api_key' );
|
| 145 |
+
return $has;
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
if ( defined( 'IMAGIFY_API_KEY' ) && IMAGIFY_API_KEY ) {
|
| 149 |
+
// It's defined in wp-config.php.
|
| 150 |
+
$has = true;
|
| 151 |
+
return $has;
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
if ( ! is_multisite() ) {
|
| 155 |
+
// Monosite: grab the value from the options table.
|
| 156 |
+
$options = get_option( 'imagify_settings' );
|
| 157 |
+
$has = ! empty( $options['api_key'] );
|
| 158 |
+
return $has;
|
| 159 |
+
}
|
| 160 |
+
|
| 161 |
+
$options = get_site_option( 'imagify_settings' );
|
| 162 |
+
|
| 163 |
+
if ( ! empty( $options['api_key'] ) ) {
|
| 164 |
+
// Multisite: Imagify was activated in the network.
|
| 165 |
+
$has = true;
|
| 166 |
+
return $has;
|
| 167 |
+
}
|
| 168 |
+
|
| 169 |
+
// Multisite: Imagify was activated for this site.
|
| 170 |
+
$options = get_option( 'imagify_settings' );
|
| 171 |
+
$has = ! empty( $options['api_key'] );
|
| 172 |
+
return $has;
|
| 173 |
+
}
|
| 174 |
+
|
| 175 |
+
/**
|
| 176 |
+
* Tell if Imagify is activated.
|
| 177 |
+
*
|
| 178 |
+
* @since 1.0
|
| 179 |
+
* @access public
|
| 180 |
+
* @author Grégory Viguier
|
| 181 |
+
*
|
| 182 |
+
* @return bool
|
| 183 |
+
*/
|
| 184 |
+
public static function is_imagify_activated() {
|
| 185 |
+
return defined( 'IMAGIFY_VERSION' );
|
| 186 |
+
}
|
| 187 |
+
|
| 188 |
+
/**
|
| 189 |
+
* Tell if Imagify is installed.
|
| 190 |
+
*
|
| 191 |
+
* @since 1.0
|
| 192 |
+
* @access public
|
| 193 |
+
* @author Grégory Viguier
|
| 194 |
+
*
|
| 195 |
+
* @return bool
|
| 196 |
+
*/
|
| 197 |
+
public static function is_imagify_installed() {
|
| 198 |
+
if ( self::is_imagify_activated() ) {
|
| 199 |
+
return true;
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
return file_exists( self::get_imagify_path() );
|
| 203 |
+
}
|
| 204 |
+
|
| 205 |
+
/**
|
| 206 |
+
* Tell if Imagify has been successfully installed.
|
| 207 |
+
*
|
| 208 |
+
* @since 1.0
|
| 209 |
+
* @access public
|
| 210 |
+
* @author Grégory Viguier
|
| 211 |
+
*
|
| 212 |
+
* @return bool
|
| 213 |
+
*/
|
| 214 |
+
public static function is_success() {
|
| 215 |
+
return ! empty( $_GET[ self::SUCCESS_ARG ] ); // WPCS: CSRF ok.
|
| 216 |
+
}
|
| 217 |
+
|
| 218 |
+
/**
|
| 219 |
+
* Tell if Imagify install failed.
|
| 220 |
+
*
|
| 221 |
+
* @since 1.0
|
| 222 |
+
* @access public
|
| 223 |
+
* @author Grégory Viguier
|
| 224 |
+
*
|
| 225 |
+
* @return bool
|
| 226 |
+
*/
|
| 227 |
+
public static function is_error() {
|
| 228 |
+
return ! empty( $_GET[ self::ERROR_ARG ] ); // WPCS: CSRF ok.
|
| 229 |
+
}
|
| 230 |
+
|
| 231 |
+
/**
|
| 232 |
+
* Get the URL to install and activate Imagify.
|
| 233 |
+
*
|
| 234 |
+
* @since 1.0
|
| 235 |
+
* @access public
|
| 236 |
+
* @author Grégory Viguier
|
| 237 |
+
*
|
| 238 |
+
* @return string The URL.
|
| 239 |
+
*/
|
| 240 |
+
public function get_post_install_url() {
|
| 241 |
+
if ( ! $this->get_partner() || ! self::current_user_can() ) {
|
| 242 |
+
return '';
|
| 243 |
+
}
|
| 244 |
+
|
| 245 |
+
$install_url = admin_url( 'admin-post.php' );
|
| 246 |
+
$args = array(
|
| 247 |
+
'action' => $this->get_post_action(),
|
| 248 |
+
'_wpnonce' => wp_create_nonce( self::NONCE_NAME ),
|
| 249 |
+
// To make sure we have a referrer.
|
| 250 |
+
'_wp_http_referer' => rawurlencode( self::get_current_url() ),
|
| 251 |
+
);
|
| 252 |
+
|
| 253 |
+
return add_query_arg( $args, $install_url );
|
| 254 |
+
}
|
| 255 |
+
|
| 256 |
+
/**
|
| 257 |
+
* Get the partner identifier.
|
| 258 |
+
*
|
| 259 |
+
* @since 1.0
|
| 260 |
+
* @access public
|
| 261 |
+
* @author Grégory Viguier
|
| 262 |
+
*
|
| 263 |
+
* @return string Partner identifier.
|
| 264 |
+
*/
|
| 265 |
+
public function get_partner() {
|
| 266 |
+
return $this->partner;
|
| 267 |
+
}
|
| 268 |
+
|
| 269 |
+
|
| 270 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 271 |
+
/** HOOKS =================================================================================== */
|
| 272 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 273 |
+
|
| 274 |
+
/**
|
| 275 |
+
* Post callback to install and activate Imagify.
|
| 276 |
+
*
|
| 277 |
+
* @since 1.0
|
| 278 |
+
* @access public
|
| 279 |
+
* @author Grégory Viguier
|
| 280 |
+
*/
|
| 281 |
+
public function post_callback() {
|
| 282 |
+
if ( ! check_ajax_referer( self::NONCE_NAME, '_wpnonce', false ) ) {
|
| 283 |
+
$this->error_die();
|
| 284 |
+
}
|
| 285 |
+
|
| 286 |
+
if ( ! self::current_user_can() ) {
|
| 287 |
+
$this->error_die( 'cant_install' );
|
| 288 |
+
}
|
| 289 |
+
|
| 290 |
+
/**
|
| 291 |
+
* Store the partner ID before doing anything.
|
| 292 |
+
* If something goes wrong during the plugin installation, the partner ID will still be saved.
|
| 293 |
+
*/
|
| 294 |
+
self::store_partner( $this->get_partner() );
|
| 295 |
+
|
| 296 |
+
// Install Imagify.
|
| 297 |
+
$result = $this->install_imagify();
|
| 298 |
+
|
| 299 |
+
if ( is_wp_error( $result ) ) {
|
| 300 |
+
// Install failed.
|
| 301 |
+
if ( self::doing_ajax() ) {
|
| 302 |
+
$this->send_json_error( $result );
|
| 303 |
+
}
|
| 304 |
+
// Redirect to the plugins search page.
|
| 305 |
+
$this->error_redirect( $result );
|
| 306 |
+
}
|
| 307 |
+
|
| 308 |
+
// Activate Imagify.
|
| 309 |
+
$result = $this->activate_imagify();
|
| 310 |
+
|
| 311 |
+
if ( is_wp_error( $result ) ) {
|
| 312 |
+
// Activation failed.
|
| 313 |
+
if ( self::doing_ajax() ) {
|
| 314 |
+
$this->send_json_error( $result );
|
| 315 |
+
}
|
| 316 |
+
// Redirect to the plugins search page.
|
| 317 |
+
$this->error_redirect( $result );
|
| 318 |
+
}
|
| 319 |
+
|
| 320 |
+
if ( self::doing_ajax() ) {
|
| 321 |
+
$this->send_json_success();
|
| 322 |
+
}
|
| 323 |
+
// Redirect to the partner's page.
|
| 324 |
+
$this->success_redirect();
|
| 325 |
+
}
|
| 326 |
+
|
| 327 |
+
/**
|
| 328 |
+
* Maybe print an error notice on the plugins install page.
|
| 329 |
+
* We add the query argument we use to display an error message.
|
| 330 |
+
*
|
| 331 |
+
* @since 1.0
|
| 332 |
+
* @access public
|
| 333 |
+
* @author Grégory Viguier
|
| 334 |
+
*/
|
| 335 |
+
public static function error_notice() {
|
| 336 |
+
if ( ! self::is_error() ) {
|
| 337 |
+
// No URL argument.
|
| 338 |
+
return;
|
| 339 |
+
}
|
| 340 |
+
|
| 341 |
+
$screen = get_current_screen();
|
| 342 |
+
|
| 343 |
+
if ( ! $screen || 'plugin-install' !== $screen->id ) {
|
| 344 |
+
// Not the good page.
|
| 345 |
+
return;
|
| 346 |
+
}
|
| 347 |
+
|
| 348 |
+
$partner = self::get_stored_partner();
|
| 349 |
+
|
| 350 |
+
if ( ! $partner ) {
|
| 351 |
+
// No partner stored in the database.
|
| 352 |
+
return;
|
| 353 |
+
}
|
| 354 |
+
|
| 355 |
+
$errors = get_transient( self::ERROR_TRANSIENT_NAME );
|
| 356 |
+
|
| 357 |
+
if ( ! $errors ) {
|
| 358 |
+
// No error messages.
|
| 359 |
+
return;
|
| 360 |
+
}
|
| 361 |
+
|
| 362 |
+
if ( ! is_wp_error( $errors ) ) {
|
| 363 |
+
// Invalid value.
|
| 364 |
+
delete_transient( self::ERROR_TRANSIENT_NAME );
|
| 365 |
+
return;
|
| 366 |
+
}
|
| 367 |
+
|
| 368 |
+
$errors = $errors->get_error_messages();
|
| 369 |
+
|
| 370 |
+
if ( $errors ) {
|
| 371 |
+
foreach ( $errors as $i => $error ) {
|
| 372 |
+
if ( self::FALLBACK_MESSAGE === $error ) {
|
| 373 |
+
unset( $errors[ $i ] );
|
| 374 |
+
}
|
| 375 |
+
}
|
| 376 |
+
}
|
| 377 |
+
|
| 378 |
+
if ( ! $errors ) {
|
| 379 |
+
// Add a generic message.
|
| 380 |
+
$instance = new self( $partner );
|
| 381 |
+
$errors[] = $instance->get_message( 'process_failed' );
|
| 382 |
+
}
|
| 383 |
+
|
| 384 |
+
echo '<div class="error notice is-dismissible"><p>' . implode( '<br/>', $errors ) . '</p></div>';
|
| 385 |
+
}
|
| 386 |
+
|
| 387 |
+
/**
|
| 388 |
+
* Filter the list of query variables to remove from admin area URLs.
|
| 389 |
+
* We add the query arguments we use on success or error.
|
| 390 |
+
*
|
| 391 |
+
* @since 1.0
|
| 392 |
+
* @access public
|
| 393 |
+
* @see wp_removable_query_args()
|
| 394 |
+
* @author Grégory Viguier
|
| 395 |
+
*
|
| 396 |
+
* @param array $removable_query_args An array of query variables to remove from a URL.
|
| 397 |
+
* @return array
|
| 398 |
+
*/
|
| 399 |
+
public static function add_query_args( $removable_query_args ) {
|
| 400 |
+
$removable_query_args[] = self::SUCCESS_ARG;
|
| 401 |
+
$removable_query_args[] = self::ERROR_ARG;
|
| 402 |
+
return $removable_query_args;
|
| 403 |
+
}
|
| 404 |
+
|
| 405 |
+
|
| 406 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 407 |
+
/** INFOS, INSTALL, ACTIVATE ================================================================ */
|
| 408 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 409 |
+
|
| 410 |
+
/**
|
| 411 |
+
* Get Imagify infos from the repository.
|
| 412 |
+
*
|
| 413 |
+
* @since 1.0
|
| 414 |
+
* @access protected
|
| 415 |
+
* @author Grégory Viguier
|
| 416 |
+
*
|
| 417 |
+
* @return object The plugin infos on success. A WP_Error object on failure.
|
| 418 |
+
*/
|
| 419 |
+
protected function get_imagify_infos() {
|
| 420 |
+
static $infos;
|
| 421 |
+
|
| 422 |
+
if ( isset( $infos ) ) {
|
| 423 |
+
return $infos;
|
| 424 |
+
}
|
| 425 |
+
|
| 426 |
+
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
|
| 427 |
+
|
| 428 |
+
// Get Plugin Infos.
|
| 429 |
+
$infos = plugins_api( 'plugin_information', array(
|
| 430 |
+
'slug' => 'imagify',
|
| 431 |
+
'fields' => array(
|
| 432 |
+
'short_description' => false,
|
| 433 |
+
'sections' => false,
|
| 434 |
+
'rating' => false,
|
| 435 |
+
'ratings' => false,
|
| 436 |
+
'downloaded' => false,
|
| 437 |
+
'last_updated' => false,
|
| 438 |
+
'added' => false,
|
| 439 |
+
'tags' => false,
|
| 440 |
+
'homepage' => false,
|
| 441 |
+
'donate_link' => false,
|
| 442 |
+
),
|
| 443 |
+
) );
|
| 444 |
+
|
| 445 |
+
return $infos;
|
| 446 |
+
}
|
| 447 |
+
|
| 448 |
+
/**
|
| 449 |
+
* Get the URL to download Imagify.
|
| 450 |
+
*
|
| 451 |
+
* @since 1.0
|
| 452 |
+
* @access protected
|
| 453 |
+
* @author Grégory Viguier
|
| 454 |
+
*
|
| 455 |
+
* @return string The URL. An empty string on error.
|
| 456 |
+
*/
|
| 457 |
+
protected function get_download_url() {
|
| 458 |
+
$infos = $this->get_imagify_infos();
|
| 459 |
+
return ! empty( $infos->download_link ) ? $infos->download_link : '';
|
| 460 |
+
}
|
| 461 |
+
|
| 462 |
+
/**
|
| 463 |
+
* Install Imagify.
|
| 464 |
+
*
|
| 465 |
+
* @since 1.0
|
| 466 |
+
* @access protected
|
| 467 |
+
* @author Grégory Viguier
|
| 468 |
+
*
|
| 469 |
+
* @return object|null A WP_Object on failure, null on success.
|
| 470 |
+
*/
|
| 471 |
+
protected function install_imagify() {
|
| 472 |
+
if ( self::is_imagify_installed() ) {
|
| 473 |
+
// Imagify is already installed.
|
| 474 |
+
return null;
|
| 475 |
+
}
|
| 476 |
+
|
| 477 |
+
$infos = $this->get_imagify_infos();
|
| 478 |
+
|
| 479 |
+
if ( is_wp_error( $infos ) ) {
|
| 480 |
+
return $infos;
|
| 481 |
+
}
|
| 482 |
+
|
| 483 |
+
ob_start();
|
| 484 |
+
@set_time_limit( 0 );
|
| 485 |
+
|
| 486 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
|
| 487 |
+
|
| 488 |
+
$upgrader = new Plugin_Upgrader( new Automatic_Upgrader_Skin() );
|
| 489 |
+
$result = $upgrader->install( $this->get_download_url() );
|
| 490 |
+
|
| 491 |
+
ob_end_clean();
|
| 492 |
+
|
| 493 |
+
if ( is_wp_error( $result ) ) {
|
| 494 |
+
return $result;
|
| 495 |
+
}
|
| 496 |
+
|
| 497 |
+
clearstatcache();
|
| 498 |
+
|
| 499 |
+
if ( ! self::is_imagify_installed() ) {
|
| 500 |
+
return new WP_Error( 'process_failed', $this->get_message( 'process_failed' ) );
|
| 501 |
+
}
|
| 502 |
+
|
| 503 |
+
return null;
|
| 504 |
+
}
|
| 505 |
+
|
| 506 |
+
/**
|
| 507 |
+
* Activate Imagify.
|
| 508 |
+
*
|
| 509 |
+
* @since 1.0
|
| 510 |
+
* @access protected
|
| 511 |
+
* @author Grégory Viguier
|
| 512 |
+
*
|
| 513 |
+
* @return object|null A WP_Object on failure, null on success.
|
| 514 |
+
*/
|
| 515 |
+
protected function activate_imagify() {
|
| 516 |
+
return activate_plugin( self::get_imagify_path(), false, is_multisite() );
|
| 517 |
+
}
|
| 518 |
+
|
| 519 |
+
/**
|
| 520 |
+
* Get a message used by the class.
|
| 521 |
+
*
|
| 522 |
+
* @since 1.0
|
| 523 |
+
* @access protected
|
| 524 |
+
* @author Grégory Viguier
|
| 525 |
+
*
|
| 526 |
+
* @param string $message_id A message ID.
|
| 527 |
+
* @return string A message.
|
| 528 |
+
*/
|
| 529 |
+
protected function get_message( $message_id ) {
|
| 530 |
+
$messages = array(
|
| 531 |
+
'success' => __( 'Plugin installed successfully.' ),
|
| 532 |
+
'cant_install' => __( 'Sorry, you are not allowed to install plugins on this site.' ),
|
| 533 |
+
'not_allowed' => __( 'Sorry, you are not allowed to do that.' ),
|
| 534 |
+
'process_failed' => __( 'Plugin install failed.' ),
|
| 535 |
+
'go_back' => __( 'Go back' ),
|
| 536 |
+
);
|
| 537 |
+
|
| 538 |
+
/**
|
| 539 |
+
* Filter messages used everywhere in the class.
|
| 540 |
+
* Default messages are already translated by WordPress.
|
| 541 |
+
*
|
| 542 |
+
* @since 1.0
|
| 543 |
+
* @author Grégory Viguier
|
| 544 |
+
*
|
| 545 |
+
* @param array $messages Messages.
|
| 546 |
+
*/
|
| 547 |
+
$messages = apply_filters( 'imagify_partner_messages_' . $this->get_partner(), $messages );
|
| 548 |
+
|
| 549 |
+
return ! empty( $messages[ $message_id ] ) ? $messages[ $message_id ] : self::FALLBACK_MESSAGE;
|
| 550 |
+
}
|
| 551 |
+
|
| 552 |
+
|
| 553 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 554 |
+
/** HANDLE SUCCESS ========================================================================== */
|
| 555 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 556 |
+
|
| 557 |
+
/**
|
| 558 |
+
* Send a JSON response back to an Ajax request, indicating success.
|
| 559 |
+
*
|
| 560 |
+
* @since 1.0
|
| 561 |
+
* @access protected
|
| 562 |
+
* @author Grégory Viguier
|
| 563 |
+
*/
|
| 564 |
+
protected function send_json_success() {
|
| 565 |
+
delete_transient( self::ERROR_TRANSIENT_NAME );
|
| 566 |
+
|
| 567 |
+
wp_send_json_success( $this->get_message( 'success' ) );
|
| 568 |
+
}
|
| 569 |
+
|
| 570 |
+
/**
|
| 571 |
+
* Redirect the user after Imagify is successfully installed and activated.
|
| 572 |
+
*
|
| 573 |
+
* @since 1.0
|
| 574 |
+
* @access protected
|
| 575 |
+
* @author Grégory Viguier
|
| 576 |
+
*/
|
| 577 |
+
protected function success_redirect() {
|
| 578 |
+
delete_transient( self::ERROR_TRANSIENT_NAME );
|
| 579 |
+
|
| 580 |
+
wp_safe_redirect( esc_url_raw( $this->get_success_redirection_url() ) );
|
| 581 |
+
die();
|
| 582 |
+
}
|
| 583 |
+
|
| 584 |
+
/**
|
| 585 |
+
* Get the URL to redirect the user to after Imagify is successfully installed and activated: the referrer (partner's page URL).
|
| 586 |
+
* A "success" argument is added.
|
| 587 |
+
*
|
| 588 |
+
* @since 1.0
|
| 589 |
+
* @access public
|
| 590 |
+
* @author Grégory Viguier
|
| 591 |
+
*
|
| 592 |
+
* @return string
|
| 593 |
+
*/
|
| 594 |
+
public function get_success_redirection_url() {
|
| 595 |
+
$success_url = add_query_arg( array(
|
| 596 |
+
self::SUCCESS_ARG => 1,
|
| 597 |
+
self::ERROR_ARG => false,
|
| 598 |
+
), wp_get_referer() );
|
| 599 |
+
|
| 600 |
+
/**
|
| 601 |
+
* Filter the URL to redirect the user to after Imagify is successfully installed and activated.
|
| 602 |
+
* Default is the partner's page URL.
|
| 603 |
+
*
|
| 604 |
+
* @since 1.0
|
| 605 |
+
* @author Grégory Viguier
|
| 606 |
+
*
|
| 607 |
+
* @param string $success_url The URL.
|
| 608 |
+
*/
|
| 609 |
+
return apply_filters( 'imagify_partner_success_url_' . $this->get_partner(), $success_url );
|
| 610 |
+
}
|
| 611 |
+
|
| 612 |
+
|
| 613 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 614 |
+
/** HANDLE ERROR ============================================================================ */
|
| 615 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 616 |
+
|
| 617 |
+
/**
|
| 618 |
+
* Die on error.
|
| 619 |
+
*
|
| 620 |
+
* @since 1.0
|
| 621 |
+
* @access protected
|
| 622 |
+
* @author Grégory Viguier
|
| 623 |
+
*
|
| 624 |
+
* @param string $message_id An error message ID.
|
| 625 |
+
*/
|
| 626 |
+
protected function error_die( $message_id = 'not_allowed' ) {
|
| 627 |
+
$message = $this->get_message( $message_id );
|
| 628 |
+
|
| 629 |
+
if ( self::doing_ajax() ) {
|
| 630 |
+
$message = new WP_Error( $message_id, $message );
|
| 631 |
+
$this->send_json_error( $message );
|
| 632 |
+
}
|
| 633 |
+
|
| 634 |
+
if ( wp_get_referer() ) {
|
| 635 |
+
$message .= '</p><p>';
|
| 636 |
+
$message .= sprintf( '<a href="%s">%s</a>',
|
| 637 |
+
esc_url( remove_query_arg( 'updated', wp_get_referer() ) ),
|
| 638 |
+
$this->get_message( 'go_back' )
|
| 639 |
+
);
|
| 640 |
+
}
|
| 641 |
+
|
| 642 |
+
wp_die( $message, '', 403 );
|
| 643 |
+
}
|
| 644 |
+
|
| 645 |
+
/**
|
| 646 |
+
* Send a JSON response back to an Ajax request, indicating failure.
|
| 647 |
+
* This is a backward compatible version of wp_send_json_error(): WP_Error object handling was introduced in WP 4.1.
|
| 648 |
+
*
|
| 649 |
+
* @since 1.0
|
| 650 |
+
* @access protected
|
| 651 |
+
* @author Grégory Viguier
|
| 652 |
+
*
|
| 653 |
+
* @param mixed $data Data to encode as JSON, then print and die.
|
| 654 |
+
*/
|
| 655 |
+
protected function send_json_error( $data ) {
|
| 656 |
+
if ( is_wp_error( $data ) ) {
|
| 657 |
+
$result = array();
|
| 658 |
+
foreach ( $data->errors as $code => $messages ) {
|
| 659 |
+
foreach ( $messages as $message ) {
|
| 660 |
+
$result[] = array(
|
| 661 |
+
'code' => $code,
|
| 662 |
+
'message' => $message,
|
| 663 |
+
);
|
| 664 |
+
}
|
| 665 |
+
}
|
| 666 |
+
} else {
|
| 667 |
+
$result = $data;
|
| 668 |
+
}
|
| 669 |
+
|
| 670 |
+
wp_send_json_error( $result );
|
| 671 |
+
}
|
| 672 |
+
|
| 673 |
+
/**
|
| 674 |
+
* Store an error message in a transient then redirect the user.
|
| 675 |
+
*
|
| 676 |
+
* @since 1.0
|
| 677 |
+
* @access protected
|
| 678 |
+
* @author Grégory Viguier
|
| 679 |
+
*
|
| 680 |
+
* @param object $error A WP_Error object.
|
| 681 |
+
*/
|
| 682 |
+
protected function error_redirect( $error ) {
|
| 683 |
+
set_transient( self::ERROR_TRANSIENT_NAME, $error, 30 );
|
| 684 |
+
|
| 685 |
+
wp_safe_redirect( esc_url_raw( $this->get_error_redirection_url() ) );
|
| 686 |
+
die();
|
| 687 |
+
}
|
| 688 |
+
|
| 689 |
+
/**
|
| 690 |
+
* Get the URL to redirect the user to after Imagify installation failure: the plugins search page URL, searching for Imagify.
|
| 691 |
+
* An "error" argument is added, to display an error notice.
|
| 692 |
+
*
|
| 693 |
+
* @since 1.0
|
| 694 |
+
* @access public
|
| 695 |
+
* @author Grégory Viguier
|
| 696 |
+
*
|
| 697 |
+
* @return string
|
| 698 |
+
*/
|
| 699 |
+
public function get_error_redirection_url() {
|
| 700 |
+
$error_url = 'plugin-install.php?s=imagify&tab=search&type=term&' . self::ERROR_ARG . '=1';
|
| 701 |
+
$error_url = is_multisite() ? network_admin_url( $error_url ) : admin_url( $error_url );
|
| 702 |
+
|
| 703 |
+
/**
|
| 704 |
+
* Filter the URL to redirect the user to after Imagify installation failure.
|
| 705 |
+
* Default is the plugins search page URL.
|
| 706 |
+
*
|
| 707 |
+
* @since 1.0
|
| 708 |
+
* @author Grégory Viguier
|
| 709 |
+
*
|
| 710 |
+
* @param string $error_url The URL.
|
| 711 |
+
*/
|
| 712 |
+
return apply_filters( 'imagify_partner_error_url_' . $this->get_partner(), $error_url );
|
| 713 |
+
}
|
| 714 |
+
|
| 715 |
+
|
| 716 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 717 |
+
/** STORING THE PARTNER ID IN DATABASE ====================================================== */
|
| 718 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 719 |
+
|
| 720 |
+
/**
|
| 721 |
+
* Get the partner identifier stored in the Database.
|
| 722 |
+
*
|
| 723 |
+
* @since 1.0
|
| 724 |
+
* @access public
|
| 725 |
+
* @author Grégory Viguier
|
| 726 |
+
*
|
| 727 |
+
* @return string|bool The partner identifier, or false if none is stored.
|
| 728 |
+
*/
|
| 729 |
+
public static function get_stored_partner() {
|
| 730 |
+
$partner = get_option( self::OPTION_NAME );
|
| 731 |
+
|
| 732 |
+
if ( $partner && is_string( $partner ) ) {
|
| 733 |
+
$partner = self::sanitize_partner( $partner );
|
| 734 |
+
}
|
| 735 |
+
|
| 736 |
+
return $partner ? $partner : false;
|
| 737 |
+
}
|
| 738 |
+
|
| 739 |
+
/**
|
| 740 |
+
* Delete the partner identifier stored in the Database.
|
| 741 |
+
*
|
| 742 |
+
* @since 1.0
|
| 743 |
+
* @access public
|
| 744 |
+
* @author Grégory Viguier
|
| 745 |
+
*/
|
| 746 |
+
public static function delete_stored_partner() {
|
| 747 |
+
if ( false !== get_option( self::OPTION_NAME ) ) {
|
| 748 |
+
delete_option( self::OPTION_NAME );
|
| 749 |
+
}
|
| 750 |
+
}
|
| 751 |
+
|
| 752 |
+
/**
|
| 753 |
+
* Store the partner identifier in Database.
|
| 754 |
+
*
|
| 755 |
+
* @since 1.0
|
| 756 |
+
* @access protected
|
| 757 |
+
* @author Grégory Viguier
|
| 758 |
+
*
|
| 759 |
+
* @param string $partner The partner identifier to store.
|
| 760 |
+
*/
|
| 761 |
+
protected static function store_partner( $partner ) {
|
| 762 |
+
if ( false === get_option( self::OPTION_NAME ) ) {
|
| 763 |
+
add_option( self::OPTION_NAME, $partner );
|
| 764 |
+
} else {
|
| 765 |
+
update_option( self::OPTION_NAME, $partner );
|
| 766 |
+
}
|
| 767 |
+
}
|
| 768 |
+
|
| 769 |
+
/**
|
| 770 |
+
* Sanitize a partner ID.
|
| 771 |
+
*
|
| 772 |
+
* @since 1.0
|
| 773 |
+
* @access protected
|
| 774 |
+
* @author Grégory Viguier
|
| 775 |
+
*
|
| 776 |
+
* @param string $partner Partner identifier.
|
| 777 |
+
* @return string
|
| 778 |
+
*/
|
| 779 |
+
protected static function sanitize_partner( $partner ) {
|
| 780 |
+
return preg_replace( '@[^a-z0-9_-]@', '', strtolower( (string) $partner ) );
|
| 781 |
+
}
|
| 782 |
+
|
| 783 |
+
|
| 784 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 785 |
+
/** VARIOUS TOOLS =========================================================================== */
|
| 786 |
+
/** ----------------------------------------------------------------------------------------- */
|
| 787 |
+
|
| 788 |
+
/**
|
| 789 |
+
* Get the action.
|
| 790 |
+
*
|
| 791 |
+
* @since 1.0
|
| 792 |
+
* @access public
|
| 793 |
+
* @author Grégory Viguier
|
| 794 |
+
*
|
| 795 |
+
* @return string Partner identifier.
|
| 796 |
+
*/
|
| 797 |
+
public function get_post_action() {
|
| 798 |
+
return 'install_imagify_from_partner_' . $this->get_partner();
|
| 799 |
+
}
|
| 800 |
+
|
| 801 |
+
/**
|
| 802 |
+
* Determines whether the current request is a WordPress Ajax request.
|
| 803 |
+
* This is a clone of wp_doing_ajax(), intriduced in WP 4.7.
|
| 804 |
+
*
|
| 805 |
+
* @since 1.0
|
| 806 |
+
* @access public
|
| 807 |
+
* @author Grégory Viguier
|
| 808 |
+
*
|
| 809 |
+
* @return bool True if it's a WordPress Ajax request, false otherwise.
|
| 810 |
+
*/
|
| 811 |
+
public static function doing_ajax() {
|
| 812 |
+
/**
|
| 813 |
+
* Filters whether the current request is a WordPress Ajax request.
|
| 814 |
+
*
|
| 815 |
+
* @since 1.0
|
| 816 |
+
*
|
| 817 |
+
* @param bool $wp_doing_ajax Whether the current request is a WordPress Ajax request.
|
| 818 |
+
*/
|
| 819 |
+
return apply_filters( 'wp_doing_ajax', defined( 'DOING_AJAX' ) && DOING_AJAX );
|
| 820 |
+
}
|
| 821 |
+
|
| 822 |
+
/**
|
| 823 |
+
* Get Imagify's file path.
|
| 824 |
+
*
|
| 825 |
+
* @since 1.0
|
| 826 |
+
* @access public
|
| 827 |
+
* @author Grégory Viguier
|
| 828 |
+
*
|
| 829 |
+
* @return string The file path.
|
| 830 |
+
*/
|
| 831 |
+
public static function get_imagify_path() {
|
| 832 |
+
if ( defined( 'IMAGIFY_FILE' ) ) {
|
| 833 |
+
return IMAGIFY_FILE;
|
| 834 |
+
}
|
| 835 |
+
|
| 836 |
+
return WP_PLUGIN_DIR . '/imagify/imagify.php';
|
| 837 |
+
}
|
| 838 |
+
|
| 839 |
+
/**
|
| 840 |
+
* Tell if the current user can install and activate Imagify.
|
| 841 |
+
*
|
| 842 |
+
* @since 1.0
|
| 843 |
+
* @access public
|
| 844 |
+
* @author Grégory Viguier
|
| 845 |
+
*
|
| 846 |
+
* @return bool
|
| 847 |
+
*/
|
| 848 |
+
public static function current_user_can() {
|
| 849 |
+
static $can;
|
| 850 |
+
|
| 851 |
+
if ( ! isset( $can ) ) {
|
| 852 |
+
$can = is_multisite() ? 'manage_network_plugins' : 'install_plugins';
|
| 853 |
+
$can = current_user_can( $can );
|
| 854 |
+
}
|
| 855 |
+
|
| 856 |
+
return $can;
|
| 857 |
+
}
|
| 858 |
+
|
| 859 |
+
/**
|
| 860 |
+
* Get the current URL.
|
| 861 |
+
*
|
| 862 |
+
* @since 1.0
|
| 863 |
+
* @access public
|
| 864 |
+
* @author Grégory Viguier
|
| 865 |
+
*
|
| 866 |
+
* @return string
|
| 867 |
+
*/
|
| 868 |
+
public static function get_current_url() {
|
| 869 |
+
$port = (int) $_SERVER['SERVER_PORT'];
|
| 870 |
+
$port = 80 !== $port && 443 !== $port ? ( ':' . $port ) : '';
|
| 871 |
+
$url = ! empty( $GLOBALS['HTTP_SERVER_VARS']['REQUEST_URI'] ) ? $GLOBALS['HTTP_SERVER_VARS']['REQUEST_URI'] : ( ! empty( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' );
|
| 872 |
+
|
| 873 |
+
return 'http' . ( is_ssl() ? 's' : '' ) . '://' . $_SERVER['HTTP_HOST'] . $port . $url;
|
| 874 |
+
}
|
| 875 |
+
}
|
Notices.php
ADDED
|
@@ -0,0 +1,155 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Contains the UMFS\Notices class.
|
| 4 |
+
*
|
| 5 |
+
* Simple to use message flashbag for admin base on user_id.
|
| 6 |
+
*
|
| 7 |
+
* @package UMFS
|
| 8 |
+
*/
|
| 9 |
+
|
| 10 |
+
namespace UMFS;
|
| 11 |
+
|
| 12 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
| 13 |
+
|
| 14 |
+
/**
|
| 15 |
+
* Simple notification flashbag
|
| 16 |
+
*/
|
| 17 |
+
class Notices {
|
| 18 |
+
/**
|
| 19 |
+
* The single instance of the class.
|
| 20 |
+
*
|
| 21 |
+
* @var Notices
|
| 22 |
+
* @access protected
|
| 23 |
+
*/
|
| 24 |
+
protected static $instance;
|
| 25 |
+
|
| 26 |
+
/**
|
| 27 |
+
* The transient name.
|
| 28 |
+
*
|
| 29 |
+
* @var string
|
| 30 |
+
* @access protected
|
| 31 |
+
*/
|
| 32 |
+
protected $transient;
|
| 33 |
+
|
| 34 |
+
/**
|
| 35 |
+
* Store notices.
|
| 36 |
+
*
|
| 37 |
+
* @var int
|
| 38 |
+
* @access protected
|
| 39 |
+
*/
|
| 40 |
+
protected $notices = false;
|
| 41 |
+
|
| 42 |
+
/**
|
| 43 |
+
* The user ID.
|
| 44 |
+
*
|
| 45 |
+
* @var int
|
| 46 |
+
* @access protected
|
| 47 |
+
*/
|
| 48 |
+
protected $user_id;
|
| 49 |
+
|
| 50 |
+
/**
|
| 51 |
+
* Main Plugin Instance.
|
| 52 |
+
*
|
| 53 |
+
* Ensures only one instance of the class is loaded or can be loaded.
|
| 54 |
+
*
|
| 55 |
+
* @return Notices - Main instance.
|
| 56 |
+
*/
|
| 57 |
+
public static function get_instance() {
|
| 58 |
+
if ( ! self::$instance ) {
|
| 59 |
+
self::$instance = new Notices();
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
+
return self::$instance;
|
| 63 |
+
}
|
| 64 |
+
|
| 65 |
+
/**
|
| 66 |
+
* Constructor.
|
| 67 |
+
*/
|
| 68 |
+
public function __construct() {
|
| 69 |
+
$this->transient = basename( plugin_dir_path( __FILE__ ) ) . '_notices';
|
| 70 |
+
$this->notices = get_transient( $this->transient );
|
| 71 |
+
$this->user_id = get_current_user_id();
|
| 72 |
+
}
|
| 73 |
+
|
| 74 |
+
/**
|
| 75 |
+
* Append a new notice for the current user.
|
| 76 |
+
*
|
| 77 |
+
* @param string $class The class of the message use for styling and typing.
|
| 78 |
+
* @param string $notice The message of the notice.
|
| 79 |
+
*/
|
| 80 |
+
public function append( $class, $notice ) {
|
| 81 |
+
$new_notices = array();
|
| 82 |
+
|
| 83 |
+
if ( $this->notices ) {
|
| 84 |
+
$new_notices = json_decode( $this->notices, true );
|
| 85 |
+
}
|
| 86 |
+
|
| 87 |
+
$new_notices[ $this->user_id ][] = array(
|
| 88 |
+
'class' => $class,
|
| 89 |
+
'notice' => $notice,
|
| 90 |
+
);
|
| 91 |
+
$this->notices = json_encode( $new_notices ); // phpcs:ignore WordPress.WP.AlternativeFunctions
|
| 92 |
+
|
| 93 |
+
set_transient( $this->transient, $this->notices, 30 );
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
/**
|
| 97 |
+
* Echo notices for the current user.
|
| 98 |
+
*
|
| 99 |
+
* @param boolean $trash [optional] If true the notices will be trash after the echo.
|
| 100 |
+
*/
|
| 101 |
+
public function echo_notices( $trash = true ) {
|
| 102 |
+
if ( $this->notices ) {
|
| 103 |
+
$notices = json_decode( $this->notices, true );
|
| 104 |
+
|
| 105 |
+
if ( isset( $notices[ $this->user_id ] ) ) {
|
| 106 |
+
foreach ( $notices[ $this->user_id ] as $n ) {
|
| 107 |
+
echo '<div class="notice notice-' . esc_attr( $n['class'] ) . ' is-dismissible"><p><strong>' . esc_html( $n['notice'] ) . '</strong></p></div>'; // phpcs:ignore WordPress.Security.EscapeOutput
|
| 108 |
+
}
|
| 109 |
+
|
| 110 |
+
if ( $trash ) {
|
| 111 |
+
$this->trash( $notices, $this->user_id );
|
| 112 |
+
}
|
| 113 |
+
}
|
| 114 |
+
}
|
| 115 |
+
}
|
| 116 |
+
|
| 117 |
+
/**
|
| 118 |
+
* Return the notices for the current user.
|
| 119 |
+
*
|
| 120 |
+
* @param boolean $trash [optional] If true the notices will be trash after get returned.
|
| 121 |
+
* @return mixed Output a array if a notice or more exist, a false if not.
|
| 122 |
+
*/
|
| 123 |
+
public function get( $trash = true ) {
|
| 124 |
+
if ( $this->notices ) {
|
| 125 |
+
$notices = json_decode( $this->notices, true );
|
| 126 |
+
if ( isset( $notices[ $this->user_id ] ) ) {
|
| 127 |
+
if ( $trash ) {
|
| 128 |
+
$this->trash( $notices, $this->user_id );
|
| 129 |
+
}
|
| 130 |
+
|
| 131 |
+
return $notices[ $this->user_id ];
|
| 132 |
+
}
|
| 133 |
+
}
|
| 134 |
+
|
| 135 |
+
return false;
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
/**
|
| 139 |
+
* Unset notice for a given user and save the new notices as a transient.
|
| 140 |
+
*
|
| 141 |
+
* @param array $notices An array of $notices to clean.
|
| 142 |
+
* @param int $user_id [optional] A user id, if null it's will find the current user id.
|
| 143 |
+
*/
|
| 144 |
+
private function trash( $notices, $user_id = null ) {
|
| 145 |
+
if ( is_null( $user_id ) ) {
|
| 146 |
+
$user_id = $this->user_id;
|
| 147 |
+
}
|
| 148 |
+
|
| 149 |
+
if ( isset( $notices[ $user_id ] ) ) {
|
| 150 |
+
unset( $notices[ $user_id ] );
|
| 151 |
+
}
|
| 152 |
+
|
| 153 |
+
set_transient( $this->transient, json_encode( $notices ), 30 ); // phpcs:ignore WordPress.WP.AlternativeFunctions
|
| 154 |
+
}
|
| 155 |
+
}
|
Plugin_Card_Helper.php
ADDED
|
@@ -0,0 +1,662 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
namespace UMFS;
|
| 3 |
+
|
| 4 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
| 5 |
+
|
| 6 |
+
/**
|
| 7 |
+
* Class Plugin_Card_Helper
|
| 8 |
+
* This check plugin info from plugins_api and help to build a functional installation plugin card.
|
| 9 |
+
*
|
| 10 |
+
* @package UMFS
|
| 11 |
+
*/
|
| 12 |
+
class Plugin_Card_Helper {
|
| 13 |
+
|
| 14 |
+
/**
|
| 15 |
+
* Store nonce action.
|
| 16 |
+
*
|
| 17 |
+
* @var string
|
| 18 |
+
* @access protected
|
| 19 |
+
*/
|
| 20 |
+
protected $nonce = 'plugin_card_helper_wpnonce';
|
| 21 |
+
|
| 22 |
+
/**
|
| 23 |
+
* Store plugin slug.
|
| 24 |
+
*
|
| 25 |
+
* @var string
|
| 26 |
+
* @access protected
|
| 27 |
+
*/
|
| 28 |
+
protected $plugin_slug;
|
| 29 |
+
|
| 30 |
+
/**
|
| 31 |
+
* Store plugin's main file path.
|
| 32 |
+
*
|
| 33 |
+
* @var string
|
| 34 |
+
* @access protected
|
| 35 |
+
*/
|
| 36 |
+
protected $plugin_file_path;
|
| 37 |
+
|
| 38 |
+
/**
|
| 39 |
+
* Store plugins_api result, all plugin information from WordPress plugin repository.
|
| 40 |
+
*
|
| 41 |
+
* @var array
|
| 42 |
+
* @access protected
|
| 43 |
+
*/
|
| 44 |
+
protected $plugin_information;
|
| 45 |
+
|
| 46 |
+
/**
|
| 47 |
+
* Boolean is plugin is activated.
|
| 48 |
+
*
|
| 49 |
+
* @var boolean
|
| 50 |
+
* @access protected
|
| 51 |
+
*/
|
| 52 |
+
protected $activated;
|
| 53 |
+
|
| 54 |
+
/**
|
| 55 |
+
* Boolean is plugin is installed.
|
| 56 |
+
*
|
| 57 |
+
* @var boolean
|
| 58 |
+
* @access protected
|
| 59 |
+
*/
|
| 60 |
+
protected $installed;
|
| 61 |
+
|
| 62 |
+
/**
|
| 63 |
+
* Boolean is plugin is compatible with installed WordPress version.
|
| 64 |
+
*
|
| 65 |
+
* @var boolean
|
| 66 |
+
* @access protected
|
| 67 |
+
*/
|
| 68 |
+
protected $wp_compatibility;
|
| 69 |
+
|
| 70 |
+
/**
|
| 71 |
+
* Boolean is plugin is compatible with installed php version.
|
| 72 |
+
*
|
| 73 |
+
* @var boolean
|
| 74 |
+
* @access protected
|
| 75 |
+
*/
|
| 76 |
+
protected $php_compatibility;
|
| 77 |
+
|
| 78 |
+
/**
|
| 79 |
+
* Boolean is plugin can be install.
|
| 80 |
+
*
|
| 81 |
+
* @var boolean
|
| 82 |
+
* @access protected
|
| 83 |
+
*/
|
| 84 |
+
protected $can_install;
|
| 85 |
+
|
| 86 |
+
/**
|
| 87 |
+
* Store setup arguments.
|
| 88 |
+
*
|
| 89 |
+
* @var array
|
| 90 |
+
* @access protected
|
| 91 |
+
*/
|
| 92 |
+
protected $args;
|
| 93 |
+
|
| 94 |
+
/**
|
| 95 |
+
* Store overwrite variables.
|
| 96 |
+
*
|
| 97 |
+
* @var array
|
| 98 |
+
* @access protected
|
| 99 |
+
*/
|
| 100 |
+
protected $params = array(
|
| 101 |
+
'title' => null,
|
| 102 |
+
'description' => null,
|
| 103 |
+
'icon' => null,
|
| 104 |
+
'status_text' => null,
|
| 105 |
+
'button_text' => null,
|
| 106 |
+
'install_url' => null,
|
| 107 |
+
);
|
| 108 |
+
|
| 109 |
+
/**
|
| 110 |
+
* Is this card have been initialised.
|
| 111 |
+
*
|
| 112 |
+
* @var boolean
|
| 113 |
+
* @access protected
|
| 114 |
+
*/
|
| 115 |
+
protected $init = false;
|
| 116 |
+
|
| 117 |
+
/**
|
| 118 |
+
* Constructor method, it's construct things.
|
| 119 |
+
* Set some basic parameters and register controller soon as possible.
|
| 120 |
+
* Else in some context install and activation route will not be register.
|
| 121 |
+
*
|
| 122 |
+
* @param array $args Required index plugin_slug. Use this array to pass param (force_activation active and install).
|
| 123 |
+
* @return void
|
| 124 |
+
*/
|
| 125 |
+
public function __construct( $args = null ) {
|
| 126 |
+
$this->args = wp_parse_args(
|
| 127 |
+
$args,
|
| 128 |
+
array(
|
| 129 |
+
'plugin_slug' => null,
|
| 130 |
+
'force_activation' => true,
|
| 131 |
+
)
|
| 132 |
+
);
|
| 133 |
+
|
| 134 |
+
if ( is_null( $this->args['plugin_slug'] ) ) {
|
| 135 |
+
return;
|
| 136 |
+
}
|
| 137 |
+
|
| 138 |
+
$this->plugin_slug = preg_replace( '@[^a-z0-9_-]@', '', strtolower( (string) $this->args['plugin_slug'] ) );
|
| 139 |
+
|
| 140 |
+
if ( isset( $this->args['params'] ) ) {
|
| 141 |
+
$this->params = wp_parse_args( $this->args['params'], $this->params );
|
| 142 |
+
}
|
| 143 |
+
|
| 144 |
+
if ( ! $this->is_installed() ) {
|
| 145 |
+
add_action( 'admin_post_install_plugin_' . $this->plugin_slug, array( $this, 'install_callback' ) );
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
if ( ! $this->is_activated() ) {
|
| 149 |
+
add_action( 'admin_post_activate_plugin_' . $this->plugin_slug, array( $this, 'activate_callback' ) );
|
| 150 |
+
}
|
| 151 |
+
}
|
| 152 |
+
|
| 153 |
+
/**
|
| 154 |
+
* Init method, initialise things.
|
| 155 |
+
* Separate init form constructor, because route registering need to be early and this do not.
|
| 156 |
+
* This is execute only if install or activation route are reached or helper method is call.
|
| 157 |
+
*
|
| 158 |
+
* @return void
|
| 159 |
+
*/
|
| 160 |
+
protected function init() {
|
| 161 |
+
if ( $this->init ) {
|
| 162 |
+
return;
|
| 163 |
+
}
|
| 164 |
+
|
| 165 |
+
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
|
| 166 |
+
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
| 167 |
+
|
| 168 |
+
$this->is_installed();
|
| 169 |
+
$this->is_activated();
|
| 170 |
+
|
| 171 |
+
$this->plugin_information = plugins_api(
|
| 172 |
+
'plugin_information',
|
| 173 |
+
array(
|
| 174 |
+
'slug' => $this->plugin_slug,
|
| 175 |
+
'fields' => array(
|
| 176 |
+
'short_description' => true,
|
| 177 |
+
'icons' => true,
|
| 178 |
+
'sections' => false,
|
| 179 |
+
'rating' => false,
|
| 180 |
+
'ratings' => false,
|
| 181 |
+
'downloaded' => false,
|
| 182 |
+
'last_updated' => false,
|
| 183 |
+
'added' => false,
|
| 184 |
+
'tags' => false,
|
| 185 |
+
'homepage' => false,
|
| 186 |
+
'donate_link' => false,
|
| 187 |
+
),
|
| 188 |
+
)
|
| 189 |
+
);
|
| 190 |
+
|
| 191 |
+
if ( is_wp_error( $this->plugin_information ) ) {
|
| 192 |
+
$this->can_install = false;
|
| 193 |
+
} elseif ( isset( $this->plugin_information->requires ) ) {
|
| 194 |
+
$this->wp_compatibility = ( $this->plugin_information->requires <= get_bloginfo( 'version' ) );
|
| 195 |
+
} elseif ( isset( $this->plugin_information->requires_php ) ) {
|
| 196 |
+
$this->php_compatibility = ( $this->plugin_information->requires_php <= phpversion() );
|
| 197 |
+
}
|
| 198 |
+
|
| 199 |
+
$this->init = true;
|
| 200 |
+
}
|
| 201 |
+
|
| 202 |
+
// -- GETTER
|
| 203 |
+
|
| 204 |
+
/**
|
| 205 |
+
* Get plugin information return by WordPress function plugins_api().
|
| 206 |
+
* Check https://developer.wordpress.org/reference/functions/plugins_api/ form more information
|
| 207 |
+
*
|
| 208 |
+
* @return array if the instance has reach information from WordPress plugin repository, null if not.
|
| 209 |
+
*/
|
| 210 |
+
public function get_plugin_information() {
|
| 211 |
+
if ( is_wp_error( $this->plugin_information ) ) {
|
| 212 |
+
return null;
|
| 213 |
+
}
|
| 214 |
+
|
| 215 |
+
return $this->plugin_information;
|
| 216 |
+
}
|
| 217 |
+
|
| 218 |
+
/**
|
| 219 |
+
* Get the plugin title.
|
| 220 |
+
*
|
| 221 |
+
* @return string The plugin title.
|
| 222 |
+
*/
|
| 223 |
+
public function get_title() {
|
| 224 |
+
$pi = ( ! is_wp_error( $this->plugin_information ) && isset( $this->plugin_information->name ) ) ? $this->plugin_information->name : '';
|
| 225 |
+
return ( ! is_null( $this->params['title'] ) ) ? $this->params['title'] : $pi;
|
| 226 |
+
}
|
| 227 |
+
|
| 228 |
+
/**
|
| 229 |
+
* Get the plugin description.
|
| 230 |
+
*
|
| 231 |
+
* @return string The plugin short description.
|
| 232 |
+
*/
|
| 233 |
+
public function get_description() {
|
| 234 |
+
$pi = ( ! is_wp_error( $this->plugin_information ) && isset( $this->plugin_information->short_description ) ) ? $this->plugin_information->short_description : '';
|
| 235 |
+
return ( ! is_null( $this->params['description'] ) ) ? $this->params['description'] : $pi;
|
| 236 |
+
}
|
| 237 |
+
|
| 238 |
+
/**
|
| 239 |
+
* Get the plugin icon.
|
| 240 |
+
*
|
| 241 |
+
* @return string The plugin icon as a img tag.
|
| 242 |
+
*/
|
| 243 |
+
public function get_icon() {
|
| 244 |
+
$pi = ( ! is_wp_error( $this->plugin_information ) && isset( $this->plugin_information->icons ) ) ? '<img src="' . $this->plugin_information->icons['2x'] . '"/>' : '';
|
| 245 |
+
return ( ! is_null( $this->params['icon'] ) ) ? $this->params['icon'] : $pi;
|
| 246 |
+
}
|
| 247 |
+
|
| 248 |
+
/**
|
| 249 |
+
* Get the plugin activation ans installation status.
|
| 250 |
+
*
|
| 251 |
+
* @return string The plugin status as a one of this string ['activated', 'installed', 'not_installed'].
|
| 252 |
+
*/
|
| 253 |
+
public function get_status() {
|
| 254 |
+
return $this->is_installed() ? ( $this->is_activated() ? 'activated' : 'installed' ) : 'not_installed';
|
| 255 |
+
}
|
| 256 |
+
|
| 257 |
+
/**
|
| 258 |
+
* Get the plugin status text.
|
| 259 |
+
*
|
| 260 |
+
* @param string $status Override the current status by this param.
|
| 261 |
+
* @return string The plugin status text based on the current or given one.
|
| 262 |
+
*/
|
| 263 |
+
public function get_status_text( $status = null ) {
|
| 264 |
+
$s = ( is_string( $status ) && ! empty( $status ) ) ? $status : $this->get_status();
|
| 265 |
+
$st = array(
|
| 266 |
+
'activated' => __( 'activated' ),
|
| 267 |
+
'installed' => __( 'installed' ),
|
| 268 |
+
'not_installed' => __( 'not installed' ),
|
| 269 |
+
);
|
| 270 |
+
if ( isset( $this->params['status_text'][ $s ] ) ) {
|
| 271 |
+
return $this->params['status_text'][ $s ];
|
| 272 |
+
}
|
| 273 |
+
return ( isset( $st[ $s ] ) ) ? $st[ $s ] : $st;
|
| 274 |
+
}
|
| 275 |
+
|
| 276 |
+
/**
|
| 277 |
+
* Get the plugin button text.
|
| 278 |
+
*
|
| 279 |
+
* @param string $status Override the current status by this param.
|
| 280 |
+
* @return string The plugin button text based on the current or given one.
|
| 281 |
+
*/
|
| 282 |
+
public function get_button_text( $status = null ) {
|
| 283 |
+
$s = ( is_string( $status ) && ! empty( $status ) ) ? $status : $this->get_status();
|
| 284 |
+
$bt = array(
|
| 285 |
+
'activated' => __( 'Already activated' ),
|
| 286 |
+
'installed' => __( 'Activate plugin' ),
|
| 287 |
+
'not_installed' => __( 'Install plugin' ),
|
| 288 |
+
);
|
| 289 |
+
|
| 290 |
+
if ( isset( $this->params['button_text'][ $s ] ) ) {
|
| 291 |
+
return $this->params['button_text'][ $s ];
|
| 292 |
+
}
|
| 293 |
+
|
| 294 |
+
return ( isset( $bt[ $s ] ) ) ? $bt[ $s ] : $bt;
|
| 295 |
+
}
|
| 296 |
+
|
| 297 |
+
/**
|
| 298 |
+
* Get the plugin activation or installation url.
|
| 299 |
+
*
|
| 300 |
+
* @param string $status Override the current status by this param.
|
| 301 |
+
* @return string The appropriate activation/installation url based on the current or given one.
|
| 302 |
+
*/
|
| 303 |
+
public function get_install_url( $status = null ) {
|
| 304 |
+
$s = ( is_string( $status ) && ! empty( $status ) ) ? $status : $this->get_status();
|
| 305 |
+
$bl = array(
|
| 306 |
+
'activated' => '#',
|
| 307 |
+
'installed' => add_query_arg(
|
| 308 |
+
array(
|
| 309 |
+
'action' => 'activate_plugin_' . $this->plugin_slug,
|
| 310 |
+
'_wpnonce' => wp_create_nonce( $this->nonce ),
|
| 311 |
+
'_wp_http_referer' => rawurlencode( $this->get_current_url() ),
|
| 312 |
+
),
|
| 313 |
+
admin_url( 'admin-post.php' )
|
| 314 |
+
),
|
| 315 |
+
'not_installed' => add_query_arg(
|
| 316 |
+
array(
|
| 317 |
+
'action' => 'install_plugin_' . $this->plugin_slug,
|
| 318 |
+
'_wpnonce' => wp_create_nonce( $this->nonce ),
|
| 319 |
+
'_wp_http_referer' => rawurlencode( $this->get_current_url() ),
|
| 320 |
+
),
|
| 321 |
+
admin_url( 'admin-post.php' )
|
| 322 |
+
),
|
| 323 |
+
);
|
| 324 |
+
|
| 325 |
+
if ( isset( $this->params['install_url'][ $s ] ) ) {
|
| 326 |
+
return $this->params['install_url'][ $s ];
|
| 327 |
+
}
|
| 328 |
+
|
| 329 |
+
return ( isset( $bl[ $s ] ) ) ? $bl[ $s ] : $bl;
|
| 330 |
+
}
|
| 331 |
+
|
| 332 |
+
/**
|
| 333 |
+
* Get the plugin activation status as a boolean.
|
| 334 |
+
*
|
| 335 |
+
* @return boolean True if plugin is activated false if not.
|
| 336 |
+
*/
|
| 337 |
+
public function is_activated() {
|
| 338 |
+
if ( is_null( $this->activated ) ) {
|
| 339 |
+
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
| 340 |
+
|
| 341 |
+
if ( is_null( $this->installed ) ) {
|
| 342 |
+
$this->is_installed();
|
| 343 |
+
}
|
| 344 |
+
|
| 345 |
+
$this->activated = is_plugin_active( $this->plugin_file_path );
|
| 346 |
+
}
|
| 347 |
+
|
| 348 |
+
return $this->activated;
|
| 349 |
+
}
|
| 350 |
+
|
| 351 |
+
/**
|
| 352 |
+
* Get the plugin installation status as a boolean.
|
| 353 |
+
*
|
| 354 |
+
* @return boolean True if plugin is installed false if not.
|
| 355 |
+
*/
|
| 356 |
+
public function is_installed() {
|
| 357 |
+
if ( is_null( $this->installed ) ) {
|
| 358 |
+
require_once ABSPATH . 'wp-admin/includes/plugin.php';
|
| 359 |
+
|
| 360 |
+
$installed_plugins = get_plugins();
|
| 361 |
+
$m = array();
|
| 362 |
+
|
| 363 |
+
foreach ( $installed_plugins as $k => $p ) {
|
| 364 |
+
preg_match( '/([a-zA-Z0-9-_\s]+)\/([a-zA-Z0-9-_]+)\.php/', $k, $m );
|
| 365 |
+
|
| 366 |
+
if ( isset( $m[2] ) && $this->plugin_slug === $m[2] ) {
|
| 367 |
+
$this->plugin_file_path = $k;
|
| 368 |
+
$this->installed = true;
|
| 369 |
+
break;
|
| 370 |
+
}
|
| 371 |
+
}
|
| 372 |
+
}
|
| 373 |
+
|
| 374 |
+
return $this->installed;
|
| 375 |
+
}
|
| 376 |
+
|
| 377 |
+
|
| 378 |
+
// -- SETTER
|
| 379 |
+
|
| 380 |
+
/**
|
| 381 |
+
* Set a title override.
|
| 382 |
+
*
|
| 383 |
+
* @param string $title Whatever you want, a appropriate title preferably.
|
| 384 |
+
* @return void
|
| 385 |
+
*/
|
| 386 |
+
public function set_title( $title ) {
|
| 387 |
+
if ( is_string( $title ) ) {
|
| 388 |
+
$this->params['title'] = $title;
|
| 389 |
+
}
|
| 390 |
+
}
|
| 391 |
+
|
| 392 |
+
/**
|
| 393 |
+
* Set a description override.
|
| 394 |
+
*
|
| 395 |
+
* @param string $desc The description.
|
| 396 |
+
* @return void
|
| 397 |
+
*/
|
| 398 |
+
public function set_description( $desc ) {
|
| 399 |
+
if ( is_string( $desc ) ) {
|
| 400 |
+
$this->params['description'] = $desc;
|
| 401 |
+
}
|
| 402 |
+
}
|
| 403 |
+
|
| 404 |
+
/**
|
| 405 |
+
* Set a icon override.
|
| 406 |
+
*
|
| 407 |
+
* @param string $string The icon, has a tag... no ? whatever.
|
| 408 |
+
* @return void
|
| 409 |
+
*/
|
| 410 |
+
public function set_icon( $string ) {
|
| 411 |
+
if ( is_string( $string ) ) {
|
| 412 |
+
$this->params['icon'] = $string;
|
| 413 |
+
}
|
| 414 |
+
}
|
| 415 |
+
|
| 416 |
+
/**
|
| 417 |
+
* Set status text override.
|
| 418 |
+
*
|
| 419 |
+
* @param array $array An array of strings key must be valid status ['activated', 'installed', 'not_installed'].
|
| 420 |
+
* @return void
|
| 421 |
+
*/
|
| 422 |
+
public function set_status_text( $array ) {
|
| 423 |
+
if ( is_array( $array ) && ! empty( $array ) ) {
|
| 424 |
+
$this->params['status_text'] = $array;
|
| 425 |
+
}
|
| 426 |
+
}
|
| 427 |
+
|
| 428 |
+
/**
|
| 429 |
+
* Set button text override.
|
| 430 |
+
*
|
| 431 |
+
* @param array $array An array of strings key must be valid status ['activated', 'installed', 'not_installed'].
|
| 432 |
+
* @return void
|
| 433 |
+
*/
|
| 434 |
+
public function set_button_text( $array ) {
|
| 435 |
+
if ( is_array( $array ) && ! empty( $array ) ) {
|
| 436 |
+
$this->params['button_text'] = $array;
|
| 437 |
+
}
|
| 438 |
+
}
|
| 439 |
+
|
| 440 |
+
// -- Install and activation route and logic
|
| 441 |
+
|
| 442 |
+
/**
|
| 443 |
+
* Install plugin controller.
|
| 444 |
+
*
|
| 445 |
+
* @return mixed
|
| 446 |
+
*/
|
| 447 |
+
public function install_callback() {
|
| 448 |
+
if ( ! check_admin_referer( $this->nonce ) ) {
|
| 449 |
+
return false;
|
| 450 |
+
}
|
| 451 |
+
|
| 452 |
+
if ( ! current_user_can( is_multisite() ? 'manage_network_plugins' : 'install_plugins' ) ) {
|
| 453 |
+
return false;
|
| 454 |
+
}
|
| 455 |
+
|
| 456 |
+
$notices = Notices::get_instance();
|
| 457 |
+
$result = $this->install();
|
| 458 |
+
|
| 459 |
+
if ( is_wp_error( $result ) ) {
|
| 460 |
+
$notices->append( 'error', $result->get_error_code() . ' : ' . $result->get_error_message() );
|
| 461 |
+
wp_safe_redirect( wp_get_referer() );
|
| 462 |
+
}
|
| 463 |
+
|
| 464 |
+
if ( $this->args['force_activation'] ) {
|
| 465 |
+
$result = $this->activate();
|
| 466 |
+
|
| 467 |
+
if ( is_wp_error( $result ) ) {
|
| 468 |
+
$notices->append( 'error', $result->get_error_code() . ' : ' . $result->get_error_message() );
|
| 469 |
+
wp_safe_redirect( wp_get_referer() );
|
| 470 |
+
}
|
| 471 |
+
|
| 472 |
+
$notices->append(
|
| 473 |
+
'success',
|
| 474 |
+
sprintf(
|
| 475 |
+
// translators: %1$s: plugin title.
|
| 476 |
+
esc_html__( '%1$s has been successfully installed and activated.' ),
|
| 477 |
+
$this->get_title()
|
| 478 |
+
)
|
| 479 |
+
);
|
| 480 |
+
} else {
|
| 481 |
+
$notices->append(
|
| 482 |
+
'success',
|
| 483 |
+
sprintf(
|
| 484 |
+
// translators: %1$s: plugin title.
|
| 485 |
+
esc_html__( '%1$s has been successfully installed.' ),
|
| 486 |
+
$this->get_title()
|
| 487 |
+
)
|
| 488 |
+
);
|
| 489 |
+
}
|
| 490 |
+
|
| 491 |
+
wp_safe_redirect( wp_get_referer() );
|
| 492 |
+
}
|
| 493 |
+
|
| 494 |
+
/**
|
| 495 |
+
* Activate plugin controller.
|
| 496 |
+
*
|
| 497 |
+
* @return mixed
|
| 498 |
+
*/
|
| 499 |
+
public function activate_callback() {
|
| 500 |
+
if ( ! check_admin_referer( $this->nonce ) ) {
|
| 501 |
+
return false;
|
| 502 |
+
}
|
| 503 |
+
|
| 504 |
+
if ( ! current_user_can( is_multisite() ? 'manage_network_plugins' : 'install_plugins' ) ) {
|
| 505 |
+
return false;
|
| 506 |
+
}
|
| 507 |
+
|
| 508 |
+
$notices = Notices::get_instance();
|
| 509 |
+
$result = $this->activate();
|
| 510 |
+
|
| 511 |
+
if ( is_wp_error( $result ) ) {
|
| 512 |
+
$notices->append( 'error', $result->get_error_code() . ' : ' . $result->get_error_message() );
|
| 513 |
+
|
| 514 |
+
wp_safe_redirect( wp_get_referer() );
|
| 515 |
+
}
|
| 516 |
+
|
| 517 |
+
$notices->append(
|
| 518 |
+
'success',
|
| 519 |
+
sprintf(
|
| 520 |
+
// translators: %1$s: plugin title.
|
| 521 |
+
esc_html__( '%1$s has been successfully activated.' ),
|
| 522 |
+
$this->get_title()
|
| 523 |
+
)
|
| 524 |
+
);
|
| 525 |
+
|
| 526 |
+
wp_safe_redirect( wp_get_referer() );
|
| 527 |
+
}
|
| 528 |
+
|
| 529 |
+
/**
|
| 530 |
+
* Install plugin.
|
| 531 |
+
*
|
| 532 |
+
* @return mixed
|
| 533 |
+
*/
|
| 534 |
+
protected function install() {
|
| 535 |
+
$this->init();
|
| 536 |
+
|
| 537 |
+
if ( $this->installed ) {
|
| 538 |
+
return null;
|
| 539 |
+
}
|
| 540 |
+
|
| 541 |
+
require_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
|
| 542 |
+
|
| 543 |
+
ob_start();
|
| 544 |
+
@set_time_limit( 0 ); // phpcs:ignore WordPress.PHP.NoSilencedErrors
|
| 545 |
+
$upgrader = new \Plugin_Upgrader( new \Automatic_Upgrader_Skin() );
|
| 546 |
+
$result = $upgrader->install( $this->plugin_information->download_link );
|
| 547 |
+
ob_end_clean();
|
| 548 |
+
|
| 549 |
+
if ( is_wp_error( $result ) ) {
|
| 550 |
+
return $result;
|
| 551 |
+
}
|
| 552 |
+
|
| 553 |
+
clearstatcache();
|
| 554 |
+
|
| 555 |
+
$this->plugin_file_path = $upgrader->plugin_info();
|
| 556 |
+
$this->installed = true;
|
| 557 |
+
|
| 558 |
+
return null;
|
| 559 |
+
}
|
| 560 |
+
|
| 561 |
+
/**
|
| 562 |
+
* Activate plugin.
|
| 563 |
+
*
|
| 564 |
+
* @return mixed
|
| 565 |
+
*/
|
| 566 |
+
protected function activate() {
|
| 567 |
+
$this->init();
|
| 568 |
+
|
| 569 |
+
if ( $this->is_activated() ) {
|
| 570 |
+
return null;
|
| 571 |
+
}
|
| 572 |
+
|
| 573 |
+
require_once ABSPATH . 'wp-admin/includes/plugin-install.php';
|
| 574 |
+
|
| 575 |
+
$result = activate_plugin( $this->plugin_file_path, false, is_multisite() );
|
| 576 |
+
|
| 577 |
+
if ( is_wp_error( $result ) ) {
|
| 578 |
+
return $result;
|
| 579 |
+
}
|
| 580 |
+
|
| 581 |
+
$this->activated = true;
|
| 582 |
+
|
| 583 |
+
return null;
|
| 584 |
+
}
|
| 585 |
+
|
| 586 |
+
// -- Helper
|
| 587 |
+
|
| 588 |
+
/**
|
| 589 |
+
* Card helper, construct a functional card.
|
| 590 |
+
*
|
| 591 |
+
* @param boolean $echo Print the result if true.
|
| 592 |
+
* @return mixed If echo is false, else it's return the card as a sting.
|
| 593 |
+
*/
|
| 594 |
+
public function helper( $echo = true ) {
|
| 595 |
+
$this->init();
|
| 596 |
+
|
| 597 |
+
if ( false === $echo ) {
|
| 598 |
+
ob_start();
|
| 599 |
+
}
|
| 600 |
+
|
| 601 |
+
$this->render_helper();
|
| 602 |
+
|
| 603 |
+
if ( false === $echo ) {
|
| 604 |
+
$r = ob_get_contents();
|
| 605 |
+
ob_end_clean();
|
| 606 |
+
return $r;
|
| 607 |
+
}
|
| 608 |
+
}
|
| 609 |
+
|
| 610 |
+
/**
|
| 611 |
+
* Card helper, the real one.
|
| 612 |
+
*
|
| 613 |
+
* @return void
|
| 614 |
+
*/
|
| 615 |
+
protected function render_helper() { ?>
|
| 616 |
+
<div class="card single-link">
|
| 617 |
+
<div class="link-infos">
|
| 618 |
+
<div class="link-infos-logo"><?php echo $this->get_icon(); // phpcs:ignore WordPress.Security.EscapeOutput ?></div>
|
| 619 |
+
<span class="link-infos-txt">
|
| 620 |
+
<h3><?php echo esc_html( $this->get_title() ); ?></h3>
|
| 621 |
+
<p>
|
| 622 |
+
<?php
|
| 623 |
+
printf(
|
| 624 |
+
// translators: %1$s: status (not installed, installed or activated).
|
| 625 |
+
esc_html__( 'Status : %1$s' ),
|
| 626 |
+
esc_html( $this->get_status_text() )
|
| 627 |
+
);
|
| 628 |
+
?>
|
| 629 |
+
</p>
|
| 630 |
+
</span>
|
| 631 |
+
</div>
|
| 632 |
+
<div class="link-content"><?php echo $this->get_description(); // phpcs:ignore WordPress.Security.EscapeOutput ?></div>
|
| 633 |
+
<?php if ( 'activated' === $this->get_status() ) : ?>
|
| 634 |
+
<span class="wrapper-infos-active"><span class="dashicons dashicons-yes"></span><span class="info-active"><?php echo esc_html( $this->get_button_text() ); ?></span></span>
|
| 635 |
+
<?php else : ?>
|
| 636 |
+
<a class="link-btn button-primary referer-link <?php echo esc_attr( $this->get_status() ); ?>" href="<?php echo esc_url( $this->get_install_url() ); ?>"><?php echo esc_html( $this->get_button_text() ); ?></a>
|
| 637 |
+
<?php endif; ?>
|
| 638 |
+
</div>
|
| 639 |
+
<?php
|
| 640 |
+
}
|
| 641 |
+
|
| 642 |
+
// -- tools
|
| 643 |
+
|
| 644 |
+
/**
|
| 645 |
+
* Rebuilt current url.
|
| 646 |
+
*
|
| 647 |
+
* @return string The current url.
|
| 648 |
+
*/
|
| 649 |
+
public function get_current_url() {
|
| 650 |
+
$_server_port = filter_input( INPUT_SERVER, 'SERVER_PORT', FILTER_SANITIZE_NUMBER_INT );
|
| 651 |
+
$_request_uri = ( ! empty( $GLOBALS['HTTP_SERVER_VARS']['REQUEST_URI'] ) )
|
| 652 |
+
? $GLOBALS['HTTP_SERVER_VARS']['REQUEST_URI']
|
| 653 |
+
: filter_input( INPUT_SERVER, 'REQUEST_URI', FILTER_SANITIZE_URL );
|
| 654 |
+
$_http_host = filter_input( INPUT_SERVER, 'HTTP_HOST', FILTER_SANITIZE_URL );
|
| 655 |
+
|
| 656 |
+
$port = (int) $_server_port;
|
| 657 |
+
$port = 80 !== $port && 443 !== $port ? ( ':' . $port ) : '';
|
| 658 |
+
$url = $_request_uri ? $_request_uri : '';
|
| 659 |
+
|
| 660 |
+
return 'http' . ( is_ssl() ? 's' : '' ) . '://' . $_http_host . $port . $url;
|
| 661 |
+
}
|
| 662 |
+
}
|
assets/css/style.css
ADDED
|
@@ -0,0 +1,810 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.twentytwenty-horizontal .twentytwenty-handle:before, .twentytwenty-horizontal .twentytwenty-handle:after, .twentytwenty-vertical .twentytwenty-handle:before, .twentytwenty-vertical .twentytwenty-handle:after {
|
| 2 |
+
content: " ";
|
| 3 |
+
display: block;
|
| 4 |
+
background: white;
|
| 5 |
+
position: absolute;
|
| 6 |
+
z-index: 30;
|
| 7 |
+
box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5); }
|
| 8 |
+
|
| 9 |
+
.twentytwenty-horizontal .twentytwenty-handle:before, .twentytwenty-horizontal .twentytwenty-handle:after {
|
| 10 |
+
width: 3px;
|
| 11 |
+
height: 9999px;
|
| 12 |
+
left: 50%;
|
| 13 |
+
margin-left: -1.5px; }
|
| 14 |
+
|
| 15 |
+
.twentytwenty-vertical .twentytwenty-handle:before, .twentytwenty-vertical .twentytwenty-handle:after {
|
| 16 |
+
width: 9999px;
|
| 17 |
+
height: 3px;
|
| 18 |
+
top: 50%;
|
| 19 |
+
margin-top: -1.5px; }
|
| 20 |
+
|
| 21 |
+
.twentytwenty-before-label, .twentytwenty-after-label, .twentytwenty-overlay {
|
| 22 |
+
position: absolute;
|
| 23 |
+
top: 0;
|
| 24 |
+
width: 100%;
|
| 25 |
+
height: 100%; }
|
| 26 |
+
|
| 27 |
+
.twentytwenty-before-label, .twentytwenty-after-label, .twentytwenty-overlay {
|
| 28 |
+
transition-duration: 0.5s; }
|
| 29 |
+
|
| 30 |
+
.twentytwenty-before-label, .twentytwenty-after-label {
|
| 31 |
+
transition-property: opacity; }
|
| 32 |
+
|
| 33 |
+
.twentytwenty-before-label:before, .twentytwenty-after-label:before {
|
| 34 |
+
color: white;
|
| 35 |
+
font-size: 13px;
|
| 36 |
+
letter-spacing: 0.1em; }
|
| 37 |
+
|
| 38 |
+
.twentytwenty-before-label:before, .twentytwenty-after-label:before {
|
| 39 |
+
position: absolute;
|
| 40 |
+
background: rgba(255, 255, 255, 0.2);
|
| 41 |
+
line-height: 38px;
|
| 42 |
+
padding: 0 20px;
|
| 43 |
+
border-radius: 2px; }
|
| 44 |
+
|
| 45 |
+
.twentytwenty-horizontal .twentytwenty-before-label:before, .twentytwenty-horizontal .twentytwenty-after-label:before {
|
| 46 |
+
top: 50%;
|
| 47 |
+
margin-top: -19px; }
|
| 48 |
+
|
| 49 |
+
.twentytwenty-vertical .twentytwenty-before-label:before, .twentytwenty-vertical .twentytwenty-after-label:before {
|
| 50 |
+
left: 50%;
|
| 51 |
+
margin-left: -45px;
|
| 52 |
+
text-align: center;
|
| 53 |
+
width: 90px; }
|
| 54 |
+
|
| 55 |
+
.twentytwenty-left-arrow, .twentytwenty-right-arrow, .twentytwenty-up-arrow, .twentytwenty-down-arrow {
|
| 56 |
+
width: 0;
|
| 57 |
+
height: 0;
|
| 58 |
+
border: 6px inset transparent;
|
| 59 |
+
position: absolute; }
|
| 60 |
+
|
| 61 |
+
.twentytwenty-left-arrow, .twentytwenty-right-arrow {
|
| 62 |
+
top: 50%;
|
| 63 |
+
margin-top: -6px; }
|
| 64 |
+
|
| 65 |
+
.twentytwenty-up-arrow, .twentytwenty-down-arrow {
|
| 66 |
+
left: 50%;
|
| 67 |
+
margin-left: -6px; }
|
| 68 |
+
|
| 69 |
+
.twentytwenty-container {
|
| 70 |
+
box-sizing: content-box;
|
| 71 |
+
z-index: 0;
|
| 72 |
+
overflow: hidden;
|
| 73 |
+
position: relative;
|
| 74 |
+
-webkit-user-select: none;
|
| 75 |
+
-moz-user-select: none;
|
| 76 |
+
-ms-user-select: none; }
|
| 77 |
+
|
| 78 |
+
.twentytwenty-container img {
|
| 79 |
+
max-width: 100%;
|
| 80 |
+
position: absolute;
|
| 81 |
+
top: 0;
|
| 82 |
+
display: block; }
|
| 83 |
+
|
| 84 |
+
.twentytwenty-container.active .twentytwenty-overlay, .twentytwenty-container.active :hover.twentytwenty-overlay {
|
| 85 |
+
background: rgba(0, 0, 0, 0); }
|
| 86 |
+
|
| 87 |
+
.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-before-label,
|
| 88 |
+
.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-after-label, .twentytwenty-container.active :hover.twentytwenty-overlay .twentytwenty-before-label,
|
| 89 |
+
.twentytwenty-container.active :hover.twentytwenty-overlay .twentytwenty-after-label {
|
| 90 |
+
opacity: 0; }
|
| 91 |
+
|
| 92 |
+
.twentytwenty-container * {
|
| 93 |
+
box-sizing: content-box; }
|
| 94 |
+
|
| 95 |
+
.twentytwenty-before-label {
|
| 96 |
+
opacity: 0; }
|
| 97 |
+
|
| 98 |
+
.twentytwenty-before-label:before {
|
| 99 |
+
content: attr(data-content); }
|
| 100 |
+
|
| 101 |
+
.twentytwenty-after-label {
|
| 102 |
+
opacity: 0; }
|
| 103 |
+
|
| 104 |
+
.twentytwenty-after-label:before {
|
| 105 |
+
content: attr(data-content); }
|
| 106 |
+
|
| 107 |
+
.twentytwenty-horizontal .twentytwenty-before-label:before {
|
| 108 |
+
left: 10px; }
|
| 109 |
+
|
| 110 |
+
.twentytwenty-horizontal .twentytwenty-after-label:before {
|
| 111 |
+
right: 10px; }
|
| 112 |
+
|
| 113 |
+
.twentytwenty-vertical .twentytwenty-before-label:before {
|
| 114 |
+
top: 10px; }
|
| 115 |
+
|
| 116 |
+
.twentytwenty-vertical .twentytwenty-after-label:before {
|
| 117 |
+
bottom: 10px; }
|
| 118 |
+
|
| 119 |
+
.twentytwenty-overlay {
|
| 120 |
+
transition-property: background;
|
| 121 |
+
background: rgba(0, 0, 0, 0);
|
| 122 |
+
z-index: 25; }
|
| 123 |
+
|
| 124 |
+
.twentytwenty-overlay:hover {
|
| 125 |
+
background: rgba(0, 0, 0, 0.5); }
|
| 126 |
+
|
| 127 |
+
.twentytwenty-overlay:hover .twentytwenty-after-label {
|
| 128 |
+
opacity: 1; }
|
| 129 |
+
|
| 130 |
+
.twentytwenty-overlay:hover .twentytwenty-before-label {
|
| 131 |
+
opacity: 1; }
|
| 132 |
+
|
| 133 |
+
.twentytwenty-before {
|
| 134 |
+
z-index: 20; }
|
| 135 |
+
|
| 136 |
+
.twentytwenty-after {
|
| 137 |
+
z-index: 10; }
|
| 138 |
+
|
| 139 |
+
.twentytwenty-handle {
|
| 140 |
+
height: 38px;
|
| 141 |
+
width: 38px;
|
| 142 |
+
position: absolute;
|
| 143 |
+
left: 50%;
|
| 144 |
+
top: 50%;
|
| 145 |
+
margin-left: -22px;
|
| 146 |
+
margin-top: -22px;
|
| 147 |
+
border: 3px solid white;
|
| 148 |
+
border-radius: 1000px;
|
| 149 |
+
box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5);
|
| 150 |
+
z-index: 40;
|
| 151 |
+
cursor: pointer; }
|
| 152 |
+
|
| 153 |
+
.twentytwenty-horizontal .twentytwenty-handle:before {
|
| 154 |
+
bottom: 50%;
|
| 155 |
+
margin-bottom: 22px;
|
| 156 |
+
box-shadow: 0 3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); }
|
| 157 |
+
|
| 158 |
+
.twentytwenty-horizontal .twentytwenty-handle:after {
|
| 159 |
+
top: 50%;
|
| 160 |
+
margin-top: 22px;
|
| 161 |
+
box-shadow: 0 -3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); }
|
| 162 |
+
|
| 163 |
+
.twentytwenty-vertical .twentytwenty-handle:before {
|
| 164 |
+
left: 50%;
|
| 165 |
+
margin-left: 22px;
|
| 166 |
+
box-shadow: 3px 0 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); }
|
| 167 |
+
|
| 168 |
+
.twentytwenty-vertical .twentytwenty-handle:after {
|
| 169 |
+
right: 50%;
|
| 170 |
+
margin-right: 22px;
|
| 171 |
+
box-shadow: -3px 0 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5); }
|
| 172 |
+
|
| 173 |
+
.twentytwenty-left-arrow {
|
| 174 |
+
border-right: 6px solid white;
|
| 175 |
+
left: 50%;
|
| 176 |
+
margin-left: -17px; }
|
| 177 |
+
|
| 178 |
+
.twentytwenty-right-arrow {
|
| 179 |
+
border-left: 6px solid white;
|
| 180 |
+
right: 50%;
|
| 181 |
+
margin-right: -17px; }
|
| 182 |
+
|
| 183 |
+
.twentytwenty-up-arrow {
|
| 184 |
+
border-bottom: 6px solid white;
|
| 185 |
+
top: 50%;
|
| 186 |
+
margin-top: -17px; }
|
| 187 |
+
|
| 188 |
+
.twentytwenty-down-arrow {
|
| 189 |
+
border-top: 6px solid white;
|
| 190 |
+
bottom: 50%;
|
| 191 |
+
margin-bottom: -17px; }
|
| 192 |
+
|
| 193 |
+
/*
|
| 194 |
+
|
| 195 |
+
COLORS
|
| 196 |
+
|
| 197 |
+
*/
|
| 198 |
+
#tab_about-us {
|
| 199 |
+
background: #fff; }
|
| 200 |
+
|
| 201 |
+
.wrapper-top {
|
| 202 |
+
width: 100%;
|
| 203 |
+
display: -ms-flexbox;
|
| 204 |
+
display: flex;
|
| 205 |
+
-ms-flex-direction: row;
|
| 206 |
+
flex-direction: row;
|
| 207 |
+
padding: 20px 20px 0 20px;
|
| 208 |
+
box-sizing: border-box; }
|
| 209 |
+
@media only screen and (max-width: 860px) {
|
| 210 |
+
.wrapper-top {
|
| 211 |
+
-ms-flex-direction: column;
|
| 212 |
+
flex-direction: column; } }
|
| 213 |
+
.wrapper-top .top-img {
|
| 214 |
+
display: -ms-flexbox;
|
| 215 |
+
display: flex;
|
| 216 |
+
width: 50%; }
|
| 217 |
+
.wrapper-top .top-img img {
|
| 218 |
+
width: 380px;
|
| 219 |
+
height: 250px; }
|
| 220 |
+
.wrapper-top .top-txt {
|
| 221 |
+
display: -ms-flexbox;
|
| 222 |
+
display: flex;
|
| 223 |
+
width: 50%;
|
| 224 |
+
-ms-flex-direction: column;
|
| 225 |
+
flex-direction: column;
|
| 226 |
+
font-weight: 400; }
|
| 227 |
+
@media only screen and (max-width: 860px) {
|
| 228 |
+
.wrapper-top .top-txt {
|
| 229 |
+
margin-top: 20px;
|
| 230 |
+
width: 100%; } }
|
| 231 |
+
.wrapper-top .top-txt h2 {
|
| 232 |
+
font-size: 22px;
|
| 233 |
+
font-weight: 700;
|
| 234 |
+
margin-top: 0; }
|
| 235 |
+
.wrapper-top .top-txt p {
|
| 236 |
+
font-size: 16px;
|
| 237 |
+
line-height: 24px;
|
| 238 |
+
margin: 5px 0; }
|
| 239 |
+
|
| 240 |
+
.wrapper-bottom {
|
| 241 |
+
display: -ms-flexbox;
|
| 242 |
+
display: flex;
|
| 243 |
+
-ms-flex-pack: justify;
|
| 244 |
+
justify-content: space-between;
|
| 245 |
+
padding: 10px 20px 0 20px;
|
| 246 |
+
-ms-flex-wrap: wrap;
|
| 247 |
+
flex-wrap: wrap; }
|
| 248 |
+
@media only screen and (max-width: 860px) {
|
| 249 |
+
.wrapper-bottom {
|
| 250 |
+
-ms-flex-direction: column;
|
| 251 |
+
flex-direction: column; } }
|
| 252 |
+
.wrapper-bottom .single-link {
|
| 253 |
+
display: -ms-flexbox;
|
| 254 |
+
display: flex;
|
| 255 |
+
width: 400px;
|
| 256 |
+
-ms-flex-direction: column;
|
| 257 |
+
flex-direction: column;
|
| 258 |
+
padding: 20px;
|
| 259 |
+
background: #f6f6f6;
|
| 260 |
+
box-sizing: border-box;
|
| 261 |
+
text-decoration: none;
|
| 262 |
+
color: #494949;
|
| 263 |
+
position: relative;
|
| 264 |
+
height: 230px;
|
| 265 |
+
margin-top: 0 !important;
|
| 266 |
+
margin-bottom: 20px;
|
| 267 |
+
border: none !important; }
|
| 268 |
+
@media only screen and (max-width: 860px) {
|
| 269 |
+
.wrapper-bottom .single-link {
|
| 270 |
+
width: 100%;
|
| 271 |
+
margin-bottom: 20px; } }
|
| 272 |
+
.wrapper-bottom .single-link .link-infos {
|
| 273 |
+
display: -ms-flexbox;
|
| 274 |
+
display: flex;
|
| 275 |
+
margin-bottom: 15px; }
|
| 276 |
+
.wrapper-bottom .single-link .link-infos .link-infos-logo {
|
| 277 |
+
width: 64px;
|
| 278 |
+
height: 64px;
|
| 279 |
+
margin-right: 15px; }
|
| 280 |
+
.wrapper-bottom .single-link .link-infos .link-infos-logo img {
|
| 281 |
+
width: 100%; }
|
| 282 |
+
.wrapper-bottom .single-link .link-infos .link-infos-txt {
|
| 283 |
+
display: -ms-flexbox;
|
| 284 |
+
display: flex;
|
| 285 |
+
-ms-flex-direction: column;
|
| 286 |
+
flex-direction: column;
|
| 287 |
+
-ms-flex-pack: center;
|
| 288 |
+
justify-content: center; }
|
| 289 |
+
.wrapper-bottom .single-link .link-infos .link-infos-txt h3 {
|
| 290 |
+
color: #40B1D0;
|
| 291 |
+
margin-bottom: 0;
|
| 292 |
+
margin-top: 0;
|
| 293 |
+
font-size: 18px;
|
| 294 |
+
line-height: 18px;
|
| 295 |
+
font-weight: 700; }
|
| 296 |
+
.wrapper-bottom .single-link .link-infos .link-infos-txt p {
|
| 297 |
+
margin-top: 0;
|
| 298 |
+
margin-bottom: 0; }
|
| 299 |
+
.wrapper-bottom .single-link .link-content {
|
| 300 |
+
font-size: 14px;
|
| 301 |
+
line-height: 20px;
|
| 302 |
+
margin-bottom: 20px;
|
| 303 |
+
font-weight: 400; }
|
| 304 |
+
.wrapper-bottom .single-link .link-btn {
|
| 305 |
+
padding: 10px 20px;
|
| 306 |
+
background: #494949;
|
| 307 |
+
color: #fff;
|
| 308 |
+
width: -webkit-max-content;
|
| 309 |
+
width: -moz-max-content;
|
| 310 |
+
width: max-content;
|
| 311 |
+
text-transform: uppercase;
|
| 312 |
+
font-size: 15px;
|
| 313 |
+
border-radius: 5px;
|
| 314 |
+
margin-left: 0;
|
| 315 |
+
position: absolute;
|
| 316 |
+
bottom: 20px;
|
| 317 |
+
margin-bottom: 0; }
|
| 318 |
+
.wrapper-bottom .single-link .link-btn:hover {
|
| 319 |
+
background: #23282d; }
|
| 320 |
+
.wrapper-bottom .single-link .wrapper-infos-active {
|
| 321 |
+
display: -ms-flexbox;
|
| 322 |
+
display: flex;
|
| 323 |
+
position: absolute;
|
| 324 |
+
bottom: 20px;
|
| 325 |
+
height: 40px;
|
| 326 |
+
-ms-flex-align: center;
|
| 327 |
+
align-items: center; }
|
| 328 |
+
.wrapper-bottom .single-link .wrapper-infos-active .dashicons-yes {
|
| 329 |
+
width: 18px;
|
| 330 |
+
height: 18px;
|
| 331 |
+
background: #494949;
|
| 332 |
+
color: #fff;
|
| 333 |
+
display: -ms-flexbox;
|
| 334 |
+
display: flex;
|
| 335 |
+
-ms-flex-pack: center;
|
| 336 |
+
justify-content: center;
|
| 337 |
+
-ms-flex-align: center;
|
| 338 |
+
align-items: center;
|
| 339 |
+
margin-right: 5px; }
|
| 340 |
+
.wrapper-bottom .single-link .wrapper-infos-active .info-active {
|
| 341 |
+
font-size: 15px;
|
| 342 |
+
color: #494949;
|
| 343 |
+
text-transform: uppercase;
|
| 344 |
+
font-weight: 700; }
|
| 345 |
+
.wrapper-bottom .single-link.imagify .link-infos .link-infos-logo {
|
| 346 |
+
background: url(../img/mini-imagify.svg); }
|
| 347 |
+
.wrapper-bottom .single-link.imagify .link-infos .link-infos-txt h3 {
|
| 348 |
+
color: #00B3D4; }
|
| 349 |
+
.wrapper-bottom .single-link.wp-rocket .link-infos .link-infos-txt h3 {
|
| 350 |
+
color: #f56640; }
|
| 351 |
+
.wrapper-bottom .single-link.lazyload .link-infos .link-infos-txt h3 {
|
| 352 |
+
color: #f56640; }
|
| 353 |
+
.wrapper-bottom .single-link.heartbeat .link-infos .link-infos-txt h3 {
|
| 354 |
+
color: #f56640; }
|
| 355 |
+
|
| 356 |
+
.imagify-welcome .button-primary.button-primary {
|
| 357 |
+
width: -webkit-max-content;
|
| 358 |
+
width: -moz-max-content;
|
| 359 |
+
width: max-content; }
|
| 360 |
+
.imagify-welcome .button-primary.button-primary:hover {
|
| 361 |
+
background: #338ea6 !important; }
|
| 362 |
+
|
| 363 |
+
/* .tab {
|
| 364 |
+
position: absolute;
|
| 365 |
+
left: -9999px;
|
| 366 |
+
}
|
| 367 |
+
.tab-active {
|
| 368 |
+
position: relative;
|
| 369 |
+
left: 0;
|
| 370 |
+
}
|
| 371 |
+
*/
|
| 372 |
+
.wrapper-settings {
|
| 373 |
+
width: 860px;
|
| 374 |
+
overflow: hidden;
|
| 375 |
+
margin-top: 20px; }
|
| 376 |
+
@media only screen and (max-width: 860px) {
|
| 377 |
+
.wrapper-settings {
|
| 378 |
+
width: 100%; } }
|
| 379 |
+
|
| 380 |
+
.wrapper-nav {
|
| 381 |
+
background: #fff; }
|
| 382 |
+
|
| 383 |
+
.nav-tab-wrapper {
|
| 384 |
+
background: #fff;
|
| 385 |
+
padding-top: 0 !important;
|
| 386 |
+
margin-top: 9px !important;
|
| 387 |
+
margin-left: 20px !important;
|
| 388 |
+
margin-right: 20px !important; }
|
| 389 |
+
.nav-tab-wrapper:first-child {
|
| 390 |
+
padding-left: 0; }
|
| 391 |
+
.nav-tab-wrapper:before {
|
| 392 |
+
content: ""; }
|
| 393 |
+
.nav-tab-wrapper:after {
|
| 394 |
+
content: ""; }
|
| 395 |
+
.nav-tab-wrapper .nav-tab {
|
| 396 |
+
background: #fff;
|
| 397 |
+
border: none;
|
| 398 |
+
color: #494949;
|
| 399 |
+
font-size: 16px;
|
| 400 |
+
font-weight: 400;
|
| 401 |
+
padding: 10px 10px;
|
| 402 |
+
margin-left: 0;
|
| 403 |
+
margin-right: 2px; }
|
| 404 |
+
.nav-tab-wrapper .nav-tab:first-child {
|
| 405 |
+
padding-left: 0; }
|
| 406 |
+
.nav-tab-wrapper .nav-tab:hover {
|
| 407 |
+
cursor: pointer;
|
| 408 |
+
color: #40B1D0; }
|
| 409 |
+
.nav-tab-wrapper .nav-tab-active {
|
| 410 |
+
color: #40B1D0;
|
| 411 |
+
border-bottom: 2px solid #40B1D0; }
|
| 412 |
+
|
| 413 |
+
body {
|
| 414 |
+
color: #1F2332; }
|
| 415 |
+
|
| 416 |
+
strong {
|
| 417 |
+
font-weight: 700; }
|
| 418 |
+
|
| 419 |
+
b {
|
| 420 |
+
font-weight: 700; }
|
| 421 |
+
|
| 422 |
+
.btn {
|
| 423 |
+
padding: 10px 20px;
|
| 424 |
+
width: -webkit-max-content;
|
| 425 |
+
width: -moz-max-content;
|
| 426 |
+
width: max-content;
|
| 427 |
+
text-transform: uppercase;
|
| 428 |
+
font-size: 15px;
|
| 429 |
+
border-radius: 4px;
|
| 430 |
+
text-decoration: none;
|
| 431 |
+
font-weight: 600; }
|
| 432 |
+
|
| 433 |
+
.header {
|
| 434 |
+
background: #1F2332;
|
| 435 |
+
color: #fff;
|
| 436 |
+
display: -ms-flexbox;
|
| 437 |
+
display: flex;
|
| 438 |
+
-ms-flex-pack: justify;
|
| 439 |
+
justify-content: space-between;
|
| 440 |
+
-ms-flex-align: center;
|
| 441 |
+
align-items: center;
|
| 442 |
+
padding: 30px 20px;
|
| 443 |
+
margin-bottom: 15px; }
|
| 444 |
+
@media only screen and (max-width: 860px) {
|
| 445 |
+
.header {
|
| 446 |
+
-ms-flex-direction: column;
|
| 447 |
+
flex-direction: column; } }
|
| 448 |
+
.header .header-right {
|
| 449 |
+
text-align: right; }
|
| 450 |
+
@media only screen and (max-width: 860px) {
|
| 451 |
+
.header .header-right {
|
| 452 |
+
text-align: center; } }
|
| 453 |
+
@media only screen and (max-width: 860px) {
|
| 454 |
+
.header .visuel {
|
| 455 |
+
margin-bottom: 20px; } }
|
| 456 |
+
.header .txt-1 {
|
| 457 |
+
font-size: 15px;
|
| 458 |
+
line-height: 24px;
|
| 459 |
+
font-weight: 600; }
|
| 460 |
+
.header .txt-2 {
|
| 461 |
+
font-size: 15px;
|
| 462 |
+
line-height: 24px; }
|
| 463 |
+
.header .txt-2 a {
|
| 464 |
+
color: #40B1D0; }
|
| 465 |
+
.header .txt-2 a:hover {
|
| 466 |
+
text-decoration: none; }
|
| 467 |
+
.header .txt-3 {
|
| 468 |
+
margin-top: 5px; }
|
| 469 |
+
.header .txt-3 a {
|
| 470 |
+
color: #40B1D0;
|
| 471 |
+
text-decoration: none; }
|
| 472 |
+
.header .txt-3 span {
|
| 473 |
+
margin-left: 5px; }
|
| 474 |
+
|
| 475 |
+
.wrapper-intro {
|
| 476 |
+
display: -ms-flexbox;
|
| 477 |
+
display: flex;
|
| 478 |
+
margin-top: -26px;
|
| 479 |
+
background: #fff;
|
| 480 |
+
width: 100%;
|
| 481 |
+
padding-top: 25px; }
|
| 482 |
+
.wrapper-intro .wrapper-left {
|
| 483 |
+
display: -ms-flexbox;
|
| 484 |
+
display: flex;
|
| 485 |
+
-ms-flex-direction: column;
|
| 486 |
+
flex-direction: column;
|
| 487 |
+
width: 335px;
|
| 488 |
+
-ms-flex-pack: center;
|
| 489 |
+
justify-content: center;
|
| 490 |
+
padding-left: 40px;
|
| 491 |
+
margin-top: 30px; }
|
| 492 |
+
@media only screen and (max-width: 860px) {
|
| 493 |
+
.wrapper-intro .wrapper-left {
|
| 494 |
+
width: 100%;
|
| 495 |
+
margin-bottom: 30px; } }
|
| 496 |
+
.wrapper-intro .wrapper-left .wrapper-img {
|
| 497 |
+
margin-bottom: 35px; }
|
| 498 |
+
.wrapper-intro .wrapper-left .wrapper-txt p {
|
| 499 |
+
font-size: 16px !important;
|
| 500 |
+
margin: 0; }
|
| 501 |
+
.wrapper-intro .wrapper-left .wrapper-txt p:first-child {
|
| 502 |
+
margin-bottom: 5px; }
|
| 503 |
+
.wrapper-intro .wrapper-left .btn {
|
| 504 |
+
background: #40B1D0;
|
| 505 |
+
color: #fff;
|
| 506 |
+
transition: all .275s;
|
| 507 |
+
margin-top: 20px; }
|
| 508 |
+
.wrapper-intro .wrapper-left .btn:hover {
|
| 509 |
+
background: #1f2332;
|
| 510 |
+
-ms-transform: translateY(-2px);
|
| 511 |
+
transform: translateY(-2px); }
|
| 512 |
+
.wrapper-intro .wrapper-right {
|
| 513 |
+
display: -ms-flexbox;
|
| 514 |
+
display: flex;
|
| 515 |
+
width: 485px;
|
| 516 |
+
height: 370px;
|
| 517 |
+
position: relative; }
|
| 518 |
+
@media only screen and (max-width: 860px) {
|
| 519 |
+
.wrapper-intro .wrapper-right {
|
| 520 |
+
display: none; } }
|
| 521 |
+
.wrapper-intro .wrapper-right .wrapper-right-img {
|
| 522 |
+
background-image: url(../img/ordi.png);
|
| 523 |
+
background-repeat: no-repeat;
|
| 524 |
+
height: 100%;
|
| 525 |
+
width: 517px;
|
| 526 |
+
position: absolute;
|
| 527 |
+
right: -30px;
|
| 528 |
+
top: 0; }
|
| 529 |
+
|
| 530 |
+
.wrapper-numbers {
|
| 531 |
+
background: #338EA6;
|
| 532 |
+
color: #fff;
|
| 533 |
+
padding-top: 60px;
|
| 534 |
+
margin-top: -26px; }
|
| 535 |
+
.wrapper-numbers .top-part {
|
| 536 |
+
font-size: 20px;
|
| 537 |
+
padding: 0 260px;
|
| 538 |
+
text-align: center;
|
| 539 |
+
line-height: 28px;
|
| 540 |
+
margin-bottom: 60px; }
|
| 541 |
+
@media only screen and (max-width: 860px) {
|
| 542 |
+
.wrapper-numbers .top-part {
|
| 543 |
+
padding: 0 20px; } }
|
| 544 |
+
.wrapper-numbers .bottom-part {
|
| 545 |
+
padding: 0 50px 40px; }
|
| 546 |
+
.wrapper-numbers .bottom-part ul {
|
| 547 |
+
display: -ms-flexbox;
|
| 548 |
+
display: flex;
|
| 549 |
+
-ms-flex-pack: justify;
|
| 550 |
+
justify-content: space-between;
|
| 551 |
+
-ms-flex-wrap: wrap;
|
| 552 |
+
flex-wrap: wrap; }
|
| 553 |
+
@media only screen and (max-width: 860px) {
|
| 554 |
+
.wrapper-numbers .bottom-part ul {
|
| 555 |
+
-ms-flex-direction: column;
|
| 556 |
+
flex-direction: column;
|
| 557 |
+
-ms-flex-pack: center;
|
| 558 |
+
justify-content: center;
|
| 559 |
+
-ms-flex-align: center;
|
| 560 |
+
align-items: center; } }
|
| 561 |
+
.wrapper-numbers .bottom-part ul li {
|
| 562 |
+
display: -ms-flexbox;
|
| 563 |
+
display: flex;
|
| 564 |
+
-ms-flex-direction: column;
|
| 565 |
+
flex-direction: column;
|
| 566 |
+
width: 180px; }
|
| 567 |
+
@media only screen and (max-width: 860px) {
|
| 568 |
+
.wrapper-numbers .bottom-part ul li {
|
| 569 |
+
width: 50%;
|
| 570 |
+
margin-bottom: 20px; } }
|
| 571 |
+
.wrapper-numbers .bottom-part ul li .visuel {
|
| 572 |
+
text-align: center;
|
| 573 |
+
margin-bottom: 15px;
|
| 574 |
+
height: 60px;
|
| 575 |
+
-ms-flex-align: center;
|
| 576 |
+
align-items: center;
|
| 577 |
+
-ms-flex-pack: center;
|
| 578 |
+
justify-content: center;
|
| 579 |
+
display: -ms-flexbox;
|
| 580 |
+
display: flex; }
|
| 581 |
+
.wrapper-numbers .bottom-part ul li .visuel-chiffre {
|
| 582 |
+
background-image: url(../img/80.svg);
|
| 583 |
+
background-repeat: no-repeat;
|
| 584 |
+
background-position: center; }
|
| 585 |
+
.wrapper-numbers .bottom-part ul li .txt-title {
|
| 586 |
+
font-size: 16px;
|
| 587 |
+
line-height: 18px;
|
| 588 |
+
text-align: center;
|
| 589 |
+
margin-bottom: 15px; }
|
| 590 |
+
.wrapper-numbers .bottom-part ul li .txt-title strong {
|
| 591 |
+
font-size: 16px;
|
| 592 |
+
line-height: 18px;
|
| 593 |
+
font-weight: 600; }
|
| 594 |
+
.wrapper-numbers .bottom-part ul li .txt {
|
| 595 |
+
font-size: 14px;
|
| 596 |
+
line-height: 18px;
|
| 597 |
+
text-align: center;
|
| 598 |
+
padding: 0 8px; }
|
| 599 |
+
.wrapper-numbers .bottom-part ul li:first-child .visuel {
|
| 600 |
+
font-size: 50px;
|
| 601 |
+
font-weight: 700;
|
| 602 |
+
line-height: 33px; }
|
| 603 |
+
|
| 604 |
+
.wrapper-compare-imgs {
|
| 605 |
+
padding: 50px 40px 40px 40px;
|
| 606 |
+
background: #343A49; }
|
| 607 |
+
.wrapper-compare-imgs .twentytwenty-container {
|
| 608 |
+
/* height: 360px!important; */ }
|
| 609 |
+
.wrapper-compare-imgs .twentytwenty-container img {
|
| 610 |
+
clip: inherit; }
|
| 611 |
+
.wrapper-compare-imgs .txt-title {
|
| 612 |
+
text-align: center;
|
| 613 |
+
color: #fff;
|
| 614 |
+
font-size: 20px;
|
| 615 |
+
line-height: 28px;
|
| 616 |
+
margin-bottom: 40px; }
|
| 617 |
+
.wrapper-compare-imgs .twentytwenty-before-label {
|
| 618 |
+
opacity: 1; }
|
| 619 |
+
.wrapper-compare-imgs .twentytwenty-before-label:before {
|
| 620 |
+
background: #1F2332;
|
| 621 |
+
font-size: 14px;
|
| 622 |
+
line-height: 24px;
|
| 623 |
+
text-transform: uppercase;
|
| 624 |
+
border-radius: 4px;
|
| 625 |
+
top: auto;
|
| 626 |
+
bottom: 20px;
|
| 627 |
+
left: 20px;
|
| 628 |
+
padding: 0 12px; }
|
| 629 |
+
.wrapper-compare-imgs .twentytwenty-after-label {
|
| 630 |
+
opacity: 1; }
|
| 631 |
+
.wrapper-compare-imgs .twentytwenty-after-label:before {
|
| 632 |
+
background: #40B1D0;
|
| 633 |
+
font-size: 14px;
|
| 634 |
+
line-height: 24px;
|
| 635 |
+
text-transform: uppercase;
|
| 636 |
+
border-radius: 4px;
|
| 637 |
+
top: auto;
|
| 638 |
+
bottom: 20px;
|
| 639 |
+
right: 20px;
|
| 640 |
+
padding: 0 12px; }
|
| 641 |
+
.wrapper-compare-imgs .twentytwenty-handle {
|
| 642 |
+
z-index: 40;
|
| 643 |
+
position: absolute;
|
| 644 |
+
left: 50%;
|
| 645 |
+
top: 50%;
|
| 646 |
+
height: 40px;
|
| 647 |
+
width: 40px;
|
| 648 |
+
margin-left: -32px;
|
| 649 |
+
margin-top: -32px;
|
| 650 |
+
border-radius: 50%;
|
| 651 |
+
box-shadow: 0 3px 0 #338EA6;
|
| 652 |
+
background: #40B1D0;
|
| 653 |
+
cursor: pointer;
|
| 654 |
+
border: none; }
|
| 655 |
+
.wrapper-compare-imgs .twentytwenty-handle:before {
|
| 656 |
+
content: "";
|
| 657 |
+
position: absolute;
|
| 658 |
+
z-index: 30;
|
| 659 |
+
display: block;
|
| 660 |
+
background: #F2F5F7;
|
| 661 |
+
box-shadow: 0 0 12px rgba(51, 51, 51, 0.5);
|
| 662 |
+
bottom: 50%;
|
| 663 |
+
margin-bottom: 20px;
|
| 664 |
+
left: 50%;
|
| 665 |
+
width: 2px;
|
| 666 |
+
height: 9999px;
|
| 667 |
+
margin-left: -1px; }
|
| 668 |
+
.wrapper-compare-imgs .twentytwenty-handle:after {
|
| 669 |
+
content: "";
|
| 670 |
+
position: absolute;
|
| 671 |
+
z-index: 30;
|
| 672 |
+
display: block;
|
| 673 |
+
background: #F2F5F7;
|
| 674 |
+
box-shadow: 0 0 12px rgba(51, 51, 51, 0.5);
|
| 675 |
+
top: 50%;
|
| 676 |
+
margin-top: 23px;
|
| 677 |
+
left: 50%;
|
| 678 |
+
width: 2px;
|
| 679 |
+
height: 9999px;
|
| 680 |
+
margin-left: -1px; }
|
| 681 |
+
.wrapper-compare-imgs .twentytwenty-handle .twentytwenty-left-arrow {
|
| 682 |
+
left: 50%;
|
| 683 |
+
margin-left: -19px;
|
| 684 |
+
border-right: 8px solid #fff; }
|
| 685 |
+
.wrapper-compare-imgs .twentytwenty-handle .twentytwenty-right-arrow {
|
| 686 |
+
right: 50%;
|
| 687 |
+
margin-right: -19px;
|
| 688 |
+
border-left: 8px solid #fff; }
|
| 689 |
+
.wrapper-compare-imgs .compare-imgs-txt {
|
| 690 |
+
display: -ms-flexbox;
|
| 691 |
+
display: flex;
|
| 692 |
+
-ms-flex-pack: justify;
|
| 693 |
+
justify-content: space-between;
|
| 694 |
+
color: #fff;
|
| 695 |
+
font-size: 14px;
|
| 696 |
+
line-height: 18px; }
|
| 697 |
+
.wrapper-compare-imgs .compare-imgs-txt .compare-imgs-txt-left {
|
| 698 |
+
margin-top: 17px; }
|
| 699 |
+
.wrapper-compare-imgs .compare-imgs-txt .compare-imgs-txt-right {
|
| 700 |
+
text-align: right;
|
| 701 |
+
margin-top: 17px; }
|
| 702 |
+
.wrapper-compare-imgs .compare-imgs-txt .compare-imgs-txt-right p strong {
|
| 703 |
+
color: #8AC34A; }
|
| 704 |
+
.wrapper-compare-imgs .compare-imgs-txt p {
|
| 705 |
+
margin: 0;
|
| 706 |
+
font-size: 14px;
|
| 707 |
+
line-height: 18px; }
|
| 708 |
+
.wrapper-compare-imgs .compare-imgs-txt p strong {
|
| 709 |
+
color: #40B1D0; }
|
| 710 |
+
|
| 711 |
+
.wrapper-install {
|
| 712 |
+
background-color: #1F2332;
|
| 713 |
+
background-image: url(../img/fond-CTA.svg) !important;
|
| 714 |
+
background-repeat: no-repeat !important;
|
| 715 |
+
background-position: 310px 39px;
|
| 716 |
+
padding: 50px 70px;
|
| 717 |
+
color: #fff;
|
| 718 |
+
display: -ms-flexbox;
|
| 719 |
+
display: flex;
|
| 720 |
+
-ms-flex-align: center;
|
| 721 |
+
align-items: center;
|
| 722 |
+
-ms-flex-direction: column;
|
| 723 |
+
flex-direction: column;
|
| 724 |
+
height: 220px;
|
| 725 |
+
box-sizing: border-box;
|
| 726 |
+
text-align: center; }
|
| 727 |
+
@media only screen and (max-width: 860px) {
|
| 728 |
+
.wrapper-install {
|
| 729 |
+
padding: 50px 40px; } }
|
| 730 |
+
.wrapper-install .txt {
|
| 731 |
+
font-size: 20px;
|
| 732 |
+
line-height: 28px;
|
| 733 |
+
margin-bottom: 20px; }
|
| 734 |
+
@media only screen and (max-width: 860px) {
|
| 735 |
+
.wrapper-install .txt br {
|
| 736 |
+
display: none; } }
|
| 737 |
+
.wrapper-install .install-btn {
|
| 738 |
+
display: -ms-flexbox;
|
| 739 |
+
display: flex; }
|
| 740 |
+
.wrapper-install .install-btn a {
|
| 741 |
+
width: 30%;
|
| 742 |
+
background: #40B1D0;
|
| 743 |
+
color: #fff;
|
| 744 |
+
transition: all .275s;
|
| 745 |
+
width: -webkit-max-content;
|
| 746 |
+
width: -moz-max-content;
|
| 747 |
+
width: max-content; }
|
| 748 |
+
.wrapper-install .install-btn a:hover {
|
| 749 |
+
background: #1f2332;
|
| 750 |
+
-ms-transform: translateY(-2px);
|
| 751 |
+
transform: translateY(-2px); }
|
| 752 |
+
|
| 753 |
+
.wrap-content-inner .gray-box {
|
| 754 |
+
margin: 0px 20px 0 20px;
|
| 755 |
+
padding: 20px 20px 20px 20px;
|
| 756 |
+
font-size: 14px;
|
| 757 |
+
line-height: 24px;
|
| 758 |
+
background: #F7F7F7; }
|
| 759 |
+
|
| 760 |
+
.wrap-content-inner .wrapper-form-content {
|
| 761 |
+
background: #fff;
|
| 762 |
+
padding-top: 17px; }
|
| 763 |
+
|
| 764 |
+
.wrap-content-inner .txt {
|
| 765 |
+
margin: 20px 0 0 40px; }
|
| 766 |
+
|
| 767 |
+
.wrap-content-inner p {
|
| 768 |
+
font-size: 14px !important;
|
| 769 |
+
line-height: 24px;
|
| 770 |
+
font-size: 14px;
|
| 771 |
+
line-height: 24px; }
|
| 772 |
+
|
| 773 |
+
.wrap-content-inner .submit {
|
| 774 |
+
margin-top: 20px;
|
| 775 |
+
padding-top: 0; }
|
| 776 |
+
|
| 777 |
+
.wrap-content-inner form .form-table {
|
| 778 |
+
padding: 0 0 23px 40px;
|
| 779 |
+
background: #fff;
|
| 780 |
+
display: -ms-flexbox;
|
| 781 |
+
display: flex;
|
| 782 |
+
margin-top: 0; }
|
| 783 |
+
.wrap-content-inner form .form-table th {
|
| 784 |
+
width: 260px; }
|
| 785 |
+
.wrap-content-inner form .form-table label {
|
| 786 |
+
font-size: 16px;
|
| 787 |
+
line-height: 24px;
|
| 788 |
+
font-weight: 700; }
|
| 789 |
+
|
| 790 |
+
.wrapper-settings .button-primary {
|
| 791 |
+
background: #40B1D0;
|
| 792 |
+
border: none;
|
| 793 |
+
text-shadow: none;
|
| 794 |
+
box-shadow: none;
|
| 795 |
+
text-transform: uppercase;
|
| 796 |
+
font-weight: 600;
|
| 797 |
+
border-radius: 4px;
|
| 798 |
+
padding: 0 15px;
|
| 799 |
+
font-size: 15px;
|
| 800 |
+
margin-bottom: 20px;
|
| 801 |
+
height: 40px;
|
| 802 |
+
display: -ms-flexbox;
|
| 803 |
+
display: flex;
|
| 804 |
+
-ms-flex-align: center;
|
| 805 |
+
align-items: center;
|
| 806 |
+
transition: all .275s; }
|
| 807 |
+
.wrapper-settings .button-primary:hover {
|
| 808 |
+
background: #1f2332 !important;
|
| 809 |
+
-ms-transform: translateY(-2px);
|
| 810 |
+
transform: translateY(-2px); }
|
assets/css/style.min.css
ADDED
|
@@ -0,0 +1 @@
|
|
|
|
| 1 |
+
.twentytwenty-horizontal .twentytwenty-handle:after,.twentytwenty-horizontal .twentytwenty-handle:before,.twentytwenty-vertical .twentytwenty-handle:after,.twentytwenty-vertical .twentytwenty-handle:before{content:" ";display:block;background:#fff;position:absolute;z-index:30}.twentytwenty-horizontal .twentytwenty-handle:after,.twentytwenty-horizontal .twentytwenty-handle:before{width:3px;height:9999px;left:50%;margin-left:-1.5px}.twentytwenty-vertical .twentytwenty-handle:after,.twentytwenty-vertical .twentytwenty-handle:before{width:9999px;height:3px;top:50%;margin-top:-1.5px}.twentytwenty-after-label,.twentytwenty-before-label,.twentytwenty-overlay{position:absolute;top:0;width:100%;height:100%;transition-duration:.5s}.twentytwenty-after-label,.twentytwenty-before-label{transition-property:opacity}.twentytwenty-after-label:before,.twentytwenty-before-label:before{color:#fff;font-size:13px;letter-spacing:.1em;position:absolute;background:rgba(255,255,255,.2);line-height:38px;padding:0 20px;border-radius:2px;content:attr(data-content)}.twentytwenty-horizontal .twentytwenty-after-label:before,.twentytwenty-horizontal .twentytwenty-before-label:before{top:50%;margin-top:-19px}.twentytwenty-vertical .twentytwenty-after-label:before,.twentytwenty-vertical .twentytwenty-before-label:before{left:50%;margin-left:-45px;text-align:center;width:90px}.twentytwenty-down-arrow,.twentytwenty-left-arrow,.twentytwenty-right-arrow,.twentytwenty-up-arrow{width:0;height:0;border:6px inset transparent;position:absolute}.twentytwenty-left-arrow,.twentytwenty-right-arrow{top:50%;margin-top:-6px}.twentytwenty-down-arrow,.twentytwenty-up-arrow{left:50%;margin-left:-6px}.twentytwenty-container{box-sizing:content-box;z-index:0;overflow:hidden;position:relative;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none}.twentytwenty-container img{max-width:100%;position:absolute;top:0;display:block}.twentytwenty-container.active .twentytwenty-overlay,.twentytwenty-container.active :hover.twentytwenty-overlay{background:rgba(0,0,0,0)}.twentytwenty-container *{box-sizing:content-box}.twentytwenty-after-label,.twentytwenty-before-label,.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-after-label,.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-before-label,.twentytwenty-container.active :hover.twentytwenty-overlay .twentytwenty-after-label,.twentytwenty-container.active :hover.twentytwenty-overlay .twentytwenty-before-label{opacity:0}.twentytwenty-horizontal .twentytwenty-before-label:before{left:10px}.twentytwenty-horizontal .twentytwenty-after-label:before{right:10px}.twentytwenty-vertical .twentytwenty-before-label:before{top:10px}.twentytwenty-vertical .twentytwenty-after-label:before{bottom:10px}.twentytwenty-overlay{transition-property:background;background:rgba(0,0,0,0);z-index:25}.twentytwenty-overlay:hover{background:rgba(0,0,0,.5)}.twentytwenty-overlay:hover .twentytwenty-after-label,.twentytwenty-overlay:hover .twentytwenty-before-label{opacity:1}.twentytwenty-before{z-index:20}.twentytwenty-after{z-index:10}.twentytwenty-handle{height:38px;width:38px;position:absolute;left:50%;top:50%;margin-left:-22px;margin-top:-22px;border:3px solid #fff;border-radius:1000px;box-shadow:0 0 12px rgba(51,51,51,.5);z-index:40;cursor:pointer}.twentytwenty-horizontal .twentytwenty-handle:before{bottom:50%;margin-bottom:22px;box-shadow:0 3px 0 #fff,0 0 12px rgba(51,51,51,.5)}.twentytwenty-horizontal .twentytwenty-handle:after{top:50%;margin-top:22px;box-shadow:0 -3px 0 #fff,0 0 12px rgba(51,51,51,.5)}.twentytwenty-vertical .twentytwenty-handle:before{left:50%;margin-left:22px;box-shadow:3px 0 0 #fff,0 0 12px rgba(51,51,51,.5)}.twentytwenty-vertical .twentytwenty-handle:after{right:50%;margin-right:22px;box-shadow:-3px 0 0 #fff,0 0 12px rgba(51,51,51,.5)}.twentytwenty-left-arrow{border-right:6px solid #fff;left:50%;margin-left:-17px}.twentytwenty-right-arrow{border-left:6px solid #fff;right:50%;margin-right:-17px}.twentytwenty-up-arrow{border-bottom:6px solid #fff;top:50%;margin-top:-17px}.twentytwenty-down-arrow{border-top:6px solid #fff;bottom:50%;margin-bottom:-17px}#tab_about-us{background:#fff}.wrapper-top{width:100%;display:-ms-flexbox;display:flex;-ms-flex-direction:row;flex-direction:row;padding:20px 20px 0;box-sizing:border-box}@media only screen and (max-width:860px){.wrapper-top{-ms-flex-direction:column;flex-direction:column}}.wrapper-top .top-img,.wrapper-top .top-txt{display:-ms-flexbox;display:flex;width:50%}.wrapper-top .top-img img{width:380px;height:250px}.wrapper-top .top-txt{-ms-flex-direction:column;flex-direction:column;font-weight:400}@media only screen and (max-width:860px){.wrapper-top .top-txt{margin-top:20px;width:100%}}.wrapper-top .top-txt h2{font-size:22px;font-weight:700;margin-top:0}.wrapper-top .top-txt p{font-size:16px;line-height:24px;margin:5px 0}.wrapper-bottom{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;padding:10px 20px 0;-ms-flex-wrap:wrap;flex-wrap:wrap}@media only screen and (max-width:860px){.wrapper-bottom{-ms-flex-direction:column;flex-direction:column}}.wrapper-bottom .single-link{display:-ms-flexbox;display:flex;width:400px;-ms-flex-direction:column;flex-direction:column;padding:20px;background:#f6f6f6;box-sizing:border-box;text-decoration:none;color:#494949;position:relative;height:230px;margin-top:0!important;margin-bottom:20px;border:none!important}@media only screen and (max-width:860px){.wrapper-bottom .single-link{width:100%;margin-bottom:20px}}.wrapper-bottom .single-link .link-infos{display:-ms-flexbox;display:flex;margin-bottom:15px}.wrapper-bottom .single-link .link-infos .link-infos-logo{width:64px;height:64px;margin-right:15px}.wrapper-bottom .single-link .link-infos .link-infos-logo img{width:100%}.wrapper-bottom .single-link .link-infos .link-infos-txt{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center}.wrapper-bottom .single-link .link-infos .link-infos-txt h3{color:#40b1d0;margin-bottom:0;margin-top:0;font-size:18px;line-height:18px;font-weight:700}.wrapper-bottom .single-link .link-infos .link-infos-txt p{margin-top:0;margin-bottom:0}.wrapper-bottom .single-link .link-content{font-size:14px;line-height:20px;margin-bottom:20px;font-weight:400}.wrapper-bottom .single-link .link-btn{padding:10px 20px;background:#494949;color:#fff;width:-webkit-max-content;width:-moz-max-content;width:max-content;text-transform:uppercase;font-size:15px;border-radius:5px;margin-left:0;position:absolute;bottom:20px;margin-bottom:0}.wrapper-bottom .single-link .link-btn:hover{background:#23282d}.wrapper-bottom .single-link .wrapper-infos-active{display:-ms-flexbox;display:flex;position:absolute;bottom:20px;height:40px;-ms-flex-align:center;align-items:center}.wrapper-bottom .single-link .wrapper-infos-active .dashicons-yes{width:18px;height:18px;background:#494949;color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center;margin-right:5px}.wrapper-bottom .single-link .wrapper-infos-active .info-active{font-size:15px;color:#494949;text-transform:uppercase;font-weight:700}.wrapper-bottom .single-link.imagify .link-infos .link-infos-logo{background:url(../img/mini-imagify.svg)}.wrapper-bottom .single-link.imagify .link-infos .link-infos-txt h3{color:#00b3d4}.wrapper-bottom .single-link.heartbeat .link-infos .link-infos-txt h3,.wrapper-bottom .single-link.lazyload .link-infos .link-infos-txt h3,.wrapper-bottom .single-link.wp-rocket .link-infos .link-infos-txt h3{color:#f56640}.imagify-welcome .button-primary.button-primary{width:-webkit-max-content;width:-moz-max-content;width:max-content}.imagify-welcome .button-primary.button-primary:hover{background:#338ea6!important}.wrapper-settings{width:860px;overflow:hidden;margin-top:20px}@media only screen and (max-width:860px){.wrapper-settings{width:100%}}.wrapper-nav{background:#fff}.nav-tab-wrapper{background:#fff;padding-top:0!important;margin-top:9px!important;margin-left:20px!important;margin-right:20px!important}.nav-tab-wrapper .nav-tab:first-child,.nav-tab-wrapper:first-child{padding-left:0}.nav-tab-wrapper:after,.nav-tab-wrapper:before{content:""}.nav-tab-wrapper .nav-tab{background:#fff;border:none;color:#494949;font-size:16px;font-weight:400;padding:10px;margin-left:0;margin-right:2px}.nav-tab-wrapper .nav-tab:hover{cursor:pointer;color:#40b1d0}.nav-tab-wrapper .nav-tab-active{color:#40b1d0;border-bottom:2px solid #40b1d0}body{color:#1f2332}b,strong{font-weight:700}.btn{padding:10px 20px;width:-webkit-max-content;width:-moz-max-content;width:max-content;text-transform:uppercase;font-size:15px;border-radius:4px;text-decoration:none;font-weight:600}.header{background:#1f2332;color:#fff;display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-align:center;align-items:center;padding:30px 20px;margin-bottom:15px}@media only screen and (max-width:860px){.header{-ms-flex-direction:column;flex-direction:column}}.header .header-right{text-align:right}@media only screen and (max-width:860px){.header .header-right{text-align:center}.header .visuel{margin-bottom:20px}}.header .txt-1{font-weight:600}.header .txt-1,.header .txt-2{font-size:15px;line-height:24px}.header .txt-2 a,.wrapper-compare-imgs .compare-imgs-txt p strong{color:#40b1d0}.header .txt-2 a:hover,.header .txt-3 a{text-decoration:none}.header .txt-3{margin-top:5px}.header .txt-3 a{color:#40b1d0}.header .txt-3 span{margin-left:5px}.wrapper-intro{display:-ms-flexbox;display:flex;margin-top:-26px;background:#fff;width:100%;padding-top:25px}.wrapper-intro .wrapper-left{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:335px;-ms-flex-pack:center;justify-content:center;padding-left:40px;margin-top:30px}@media only screen and (max-width:860px){.wrapper-intro .wrapper-left{width:100%;margin-bottom:30px}}.wrapper-intro .wrapper-left .wrapper-img{margin-bottom:35px}.wrapper-intro .wrapper-left .wrapper-txt p{font-size:16px!important;margin:0}.wrapper-intro .wrapper-left .wrapper-txt p:first-child{margin-bottom:5px}.wrapper-intro .wrapper-left .btn{background:#40b1d0;color:#fff;transition:all .275s;margin-top:20px}.wrapper-install .install-btn a:hover,.wrapper-intro .wrapper-left .btn:hover{background:#1f2332;-ms-transform:translateY(-2px);transform:translateY(-2px)}.wrapper-intro .wrapper-right{display:-ms-flexbox;display:flex;width:485px;height:370px;position:relative}@media only screen and (max-width:860px){.wrapper-intro .wrapper-right{display:none}}.wrapper-intro .wrapper-right .wrapper-right-img{background-image:url(../img/ordi.png);background-repeat:no-repeat;height:100%;width:517px;position:absolute;right:-30px;top:0}.wrapper-numbers{background:#338ea6;color:#fff;padding-top:60px;margin-top:-26px}.wrapper-numbers .top-part{font-size:20px;padding:0 260px;text-align:center;line-height:28px;margin-bottom:60px}@media only screen and (max-width:860px){.wrapper-numbers .top-part{padding:0 20px}}.wrapper-numbers .bottom-part{padding:0 50px 40px}.wrapper-numbers .bottom-part ul{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;-ms-flex-wrap:wrap;flex-wrap:wrap}@media only screen and (max-width:860px){.wrapper-numbers .bottom-part ul{-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;-ms-flex-align:center;align-items:center}}.wrapper-numbers .bottom-part ul li{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;width:180px}@media only screen and (max-width:860px){.wrapper-numbers .bottom-part ul li{width:50%;margin-bottom:20px}}.wrapper-numbers .bottom-part ul li .visuel{text-align:center;margin-bottom:15px;height:60px;-ms-flex-align:center;align-items:center;-ms-flex-pack:center;justify-content:center;display:-ms-flexbox;display:flex}.wrapper-numbers .bottom-part ul li .visuel-chiffre{background-image:url(../img/80.svg);background-repeat:no-repeat;background-position:center}.wrapper-numbers .bottom-part ul li .txt-title{font-size:16px;line-height:18px;text-align:center;margin-bottom:15px}.wrapper-numbers .bottom-part ul li .txt-title strong{font-size:16px;line-height:18px;font-weight:600}.wrapper-numbers .bottom-part ul li .txt{font-size:14px;line-height:18px;text-align:center;padding:0 8px}.wrapper-numbers .bottom-part ul li:first-child .visuel{font-size:50px;font-weight:700;line-height:33px}.wrapper-compare-imgs{padding:50px 40px 40px;background:#343a49}.wrapper-compare-imgs .twentytwenty-container img{clip:inherit}.wrapper-compare-imgs .txt-title{text-align:center;color:#fff;font-size:20px;line-height:28px;margin-bottom:40px}.wrapper-compare-imgs .twentytwenty-after-label,.wrapper-compare-imgs .twentytwenty-before-label{opacity:1}.wrapper-compare-imgs .twentytwenty-before-label:before{background:#1f2332;font-size:14px;line-height:24px;text-transform:uppercase;border-radius:4px;top:auto;bottom:20px;left:20px;padding:0 12px}.wrapper-compare-imgs .twentytwenty-after-label:before{background:#40b1d0;font-size:14px;line-height:24px;text-transform:uppercase;border-radius:4px;top:auto;bottom:20px;right:20px;padding:0 12px}.wrapper-compare-imgs .twentytwenty-handle{z-index:40;position:absolute;left:50%;top:50%;height:40px;width:40px;margin-left:-32px;margin-top:-32px;border-radius:50%;box-shadow:0 3px 0 #338ea6;background:#40b1d0;cursor:pointer;border:none}.wrapper-compare-imgs .twentytwenty-handle:after,.wrapper-compare-imgs .twentytwenty-handle:before{content:"";position:absolute;z-index:30;display:block;background:#f2f5f7;box-shadow:0 0 12px rgba(51,51,51,.5);left:50%;width:2px;height:9999px;margin-left:-1px}.wrapper-compare-imgs .twentytwenty-handle:before{bottom:50%;margin-bottom:20px}.wrapper-compare-imgs .twentytwenty-handle:after{top:50%;margin-top:23px}.wrapper-compare-imgs .twentytwenty-handle .twentytwenty-left-arrow{left:50%;margin-left:-19px;border-right:8px solid #fff}.wrapper-compare-imgs .twentytwenty-handle .twentytwenty-right-arrow{right:50%;margin-right:-19px;border-left:8px solid #fff}.wrapper-compare-imgs .compare-imgs-txt{display:-ms-flexbox;display:flex;-ms-flex-pack:justify;justify-content:space-between;color:#fff;font-size:14px;line-height:18px}.wrapper-compare-imgs .compare-imgs-txt .compare-imgs-txt-left{margin-top:17px}.wrapper-compare-imgs .compare-imgs-txt .compare-imgs-txt-right{text-align:right;margin-top:17px}.wrapper-compare-imgs .compare-imgs-txt .compare-imgs-txt-right p strong{color:#8ac34a}.wrapper-compare-imgs .compare-imgs-txt p{margin:0;font-size:14px;line-height:18px}.wrapper-install{background-color:#1f2332;background-image:url(../img/fond-CTA.svg)!important;background-repeat:no-repeat!important;background-position:310px 39px;padding:50px 70px;color:#fff;-ms-flex-align:center;align-items:center;-ms-flex-direction:column;flex-direction:column;height:220px;box-sizing:border-box;text-align:center}@media only screen and (max-width:860px){.wrapper-install{padding:50px 40px}}.wrapper-install .txt{font-size:20px;line-height:28px;margin-bottom:20px}@media only screen and (max-width:860px){.wrapper-install .txt br{display:none}}.wrapper-install,.wrapper-install .install-btn{display:-ms-flexbox;display:flex}.wrapper-install .install-btn a{background:#40b1d0;color:#fff;transition:all .275s;width:-webkit-max-content;width:-moz-max-content;width:max-content}.wrap-content-inner .gray-box{margin:0 20px;padding:20px;font-size:14px;line-height:24px;background:#f7f7f7}.wrap-content-inner .wrapper-form-content{background:#fff;padding-top:17px}.wrap-content-inner .txt{margin:20px 0 0 40px}.wrap-content-inner p{font-size:14px!important;line-height:24px}.wrap-content-inner .submit{margin-top:20px;padding-top:0}.wrap-content-inner form .form-table{padding:0 0 23px 40px;background:#fff;display:-ms-flexbox;display:flex;margin-top:0}.wrap-content-inner form .form-table th{width:260px}.wrap-content-inner form .form-table label{font-size:16px;line-height:24px;font-weight:700}.wrapper-settings .button-primary{background:#40b1d0;border:none;text-shadow:none;box-shadow:none;text-transform:uppercase;font-weight:600;border-radius:4px;padding:0 15px;font-size:15px;margin-bottom:20px;height:40px;display:-ms-flexbox;display:flex;-ms-flex-align:center;align-items:center;transition:all .275s}.wrapper-settings .button-primary:hover{background:#1f2332!important;-ms-transform:translateY(-2px);transform:translateY(-2px)}
|
assets/css/style.scss
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
.slider-field-value-display {
|
| 2 |
+
float: right;
|
| 3 |
+
font-weight: 400;
|
| 4 |
+
font-size: 12px;
|
| 5 |
+
color: #888;
|
| 6 |
+
padding-top: .5em;
|
| 7 |
+
}
|
| 8 |
+
h3 {
|
| 9 |
+
color: red;
|
| 10 |
+
}
|
assets/img/Imagify-Logo-Gray-Colored.svg
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="250px" height="30px" viewBox="0 0 250 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>Imagify-Logo-Gray-Colored</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<g id="Plugin-Increase-File" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
| 7 |
+
<g id="IFM----More-Optimization-V2" transform="translate(-171.000000, -324.000000)" fill-rule="nonzero">
|
| 8 |
+
<g id="Imagify-Logo-Gray-Colored" transform="translate(171.000000, 324.000000)">
|
| 9 |
+
<g id="Group" transform="translate(0.000000, 0.528000)" fill="#7A8997">
|
| 10 |
+
<path d="M8.249,25.362 L2.46,15.302 L4.558,14.072 L3.943,12.552 L0.217,14.687 L7.634,27.567 L13.423,24.238 C13.459,23.659 13.532,23.08 13.604,22.501 L12.229,23.044 L8.249,25.359" id="Path"></path>
|
| 11 |
+
<path d="M5.897,10.564 L7.634,9.913 L7.236,8.357 L3.835,9.659 L9.045,23.371 L13.821,21.562 C14.002,20.875 14.291,20.187 14.617,19.536 L9.986,21.309 L5.898,10.564" id="Path"></path>
|
| 12 |
+
<path d="M15.01,5.933 L12.658,15.774 L19.894,14.291 C20.328,14.074 20.762,13.893 21.233,13.748 C21.776,13.567 22.318,13.422 22.861,13.314 C23.512,13.205 24.2,13.133 24.887,13.133 L24.923,13.133 L25.466,13.133 L27.022,12.807 L22.463,8.755 L20.654,10.998 L15.01,5.933" id="Path"></path>
|
| 13 |
+
<circle id="Oval" cx="23.734" cy="5.825" r="1.411"></circle>
|
| 14 |
+
<path d="M15.449,18.13 C15.956,17.37 16.571,16.719 17.222,16.104 L11.687,17.226 L9.335,5.866 L26.086,2.429 L28.401,13.681 C29.016,13.898 29.631,14.151 30.21,14.441 L27.352,0.512 L7.453,4.564 L10.453,19.144 L15.446,18.131" id="Path"></path>
|
| 15 |
+
</g>
|
| 16 |
+
<g id="Group" transform="translate(14.000000, 14.528000)" fill="#00A8DC">
|
| 17 |
+
<circle id="Oval" cx="10.783" cy="10.674" r="1"></circle>
|
| 18 |
+
<path d="M10.964,0.182 C5.284,0.182 0.653,4.813 0.653,10.529 C0.653,11.795 0.87,12.989 1.304,14.111 L4.777,14.111 C4.27,13.207 3.945,12.193 3.836,11.111 L2.714,11.111 C2.388,11.111 2.171,10.858 2.171,10.532 C2.171,10.206 2.424,9.953 2.714,9.953 L3.836,9.953 C3.945,8.397 4.56,7.022 5.5,5.901 L4.704,5.105 C4.487,4.888 4.487,4.526 4.704,4.309 C4.921,4.092 5.283,4.092 5.5,4.309 L6.296,5.105 C7.418,4.164 8.792,3.549 10.348,3.441 L10.348,2.283 C10.348,1.957 10.601,1.704 10.891,1.704 C11.217,1.704 11.47,1.957 11.47,2.283 L11.47,3.441 C12.881,3.55 14.183,4.092 15.269,4.924 L15.884,4.49 C16.21,4.237 16.644,4.273 16.933,4.562 C17.222,4.851 17.259,5.322 17.005,5.611 L12.41,12.123 C11.578,12.955 10.275,12.991 9.41,12.195 L9.338,12.123 C8.506,11.291 8.506,9.88 9.338,9.048 C9.447,8.939 9.519,8.867 9.627,8.795 L14.186,5.684 C13.245,5.033 12.124,4.671 10.894,4.671 C7.638,4.671 5.033,7.312 5.033,10.568 C5.033,11.907 5.467,13.137 6.227,14.114 L15.597,14.114 C16.357,13.137 16.791,11.907 16.791,10.568 C16.791,9.808 16.646,9.121 16.393,8.47 L17.225,7.312 C17.659,8.144 17.912,9.049 17.985,10.025 L19.107,10.025 C19.433,10.025 19.65,10.278 19.65,10.604 C19.65,10.93 19.397,11.183 19.107,11.183 L17.985,11.183 C17.913,12.268 17.587,13.281 17.044,14.183 L20.626,14.183 C21.024,13.061 21.277,11.868 21.277,10.601 C21.241,4.812 16.646,0.181 10.966,0.181" id="Path"></path>
|
| 19 |
+
</g>
|
| 20 |
+
<g id="Group" transform="translate(45.000000, 0.528000)" fill="#7A8997">
|
| 21 |
+
<path d="M5.29,0.507 L1.6,0.507 C1.202,0.507 0.84,0.869 0.84,1.267 L0.84,27.497 C0.84,27.895 1.202,28.257 1.6,28.257 L5.29,28.257 C5.688,28.257 6.05,27.895 6.05,27.497 L6.05,1.267 C6.014,0.869 5.652,0.507 5.29,0.507" id="Path"></path>
|
| 22 |
+
<path d="M45.63,0.687 C45.594,0.361 45.341,0.108 44.906,0.108 L44.255,0.108 C43.893,0.108 43.712,0.253 43.568,0.506 L34.849,19.211 L34.74,19.211 L26.021,0.506 C25.912,0.253 25.659,0.108 25.334,0.108 L24.683,0.108 C24.249,0.108 23.996,0.397 23.959,0.687 L19.256,27.315 C19.184,27.858 19.509,28.219 20.016,28.219 L23.598,28.219 C23.96,28.219 24.285,27.893 24.322,27.64 L26.637,12.63 L26.746,12.63 L33.766,28.187 C33.875,28.44 34.092,28.621 34.453,28.621 L35.177,28.621 C35.539,28.621 35.756,28.44 35.864,28.187 L42.81,12.63 L42.919,12.63 L45.271,27.64 C45.343,27.929 45.669,28.219 46.031,28.219 L49.649,28.219 C50.156,28.219 50.481,27.857 50.373,27.315 L45.633,0.687" id="Path"></path>
|
| 23 |
+
<path d="M74.1,0.543 C73.991,0.29 73.811,0.109 73.413,0.109 L73.015,0.109 C72.653,0.109 72.472,0.29 72.328,0.543 L59.991,27.207 C59.738,27.714 60.063,28.22 60.678,28.22 L64.115,28.22 C64.766,28.22 65.092,27.822 65.273,27.424 L67.227,23.155 L79.094,23.155 L81.048,27.424 C81.337,27.967 81.591,28.22 82.206,28.22 L85.643,28.22 C86.222,28.22 86.547,27.713 86.33,27.207 L74.101,0.543 M69.217,18.741 L73.088,10.022 L73.197,10.022 L77.141,18.741 L69.218,18.741" id="Shape"></path>
|
| 24 |
+
<path d="M119.33,14.472 L111.732,14.472 C111.298,14.472 110.972,14.798 110.972,15.232 L110.972,18.343 C110.972,18.741 111.298,19.067 111.732,19.067 L114.916,19.067 L114.916,22.432 C114.12,22.758 112.42,23.409 110.213,23.409 C105.22,23.409 101.313,19.248 101.313,14.329 C101.313,9.372 105.22,5.139 110.177,5.139 C112.348,5.139 114.446,5.935 116.147,7.454 C116.509,7.78 116.871,7.78 117.16,7.454 L119.62,4.885 C119.946,4.559 119.909,4.089 119.584,3.763 C116.907,1.448 113.47,0.073 109.924,0.073 C102.037,0.073 95.705,6.441 95.705,14.364 C95.705,22.287 102.036,28.546 109.924,28.546 C115.677,28.546 119.765,25.977 119.765,25.977 C119.91,25.868 120.091,25.651 120.091,25.326 L120.091,15.196 C120.019,14.834 119.729,14.472 119.331,14.472" id="Path"></path>
|
| 25 |
+
<path d="M138.21,0.507 L134.52,0.507 C134.122,0.507 133.76,0.869 133.76,1.267 L133.76,27.497 C133.76,27.895 134.122,28.257 134.52,28.257 L138.21,28.257 C138.608,28.257 138.97,27.895 138.97,27.497 L138.97,1.267 C138.97,0.869 138.608,0.507 138.21,0.507" id="Path"></path>
|
| 26 |
+
<path d="M170.96,0.507 L154.82,0.507 C154.386,0.507 154.06,0.869 154.06,1.267 L154.06,27.497 C154.06,27.895 154.386,28.257 154.82,28.257 L158.474,28.257 C158.872,28.257 159.234,27.895 159.234,27.497 L159.234,17.477 L169.002,17.477 C169.4,17.477 169.762,17.115 169.762,16.717 L169.762,13.461 C169.762,13.063 169.4,12.701 169.002,12.701 L159.234,12.701 L159.234,5.248 L170.956,5.248 C171.39,5.248 171.716,4.886 171.716,4.488 L171.716,1.232 C171.716,0.87 171.427,0.508 170.956,0.508" id="Path"></path>
|
| 27 |
+
<path d="M204.06,0.507 L199.972,0.507 C199.646,0.507 199.465,0.688 199.321,0.869 L192.99,9.986 L186.659,0.869 C186.55,0.724 186.333,0.507 186.008,0.507 L181.956,0.507 C181.305,0.507 181.015,1.158 181.305,1.665 L190.345,14.907 L190.345,27.497 C190.345,27.895 190.671,28.257 191.105,28.257 L194.759,28.257 C195.157,28.257 195.519,27.895 195.519,27.497 L195.519,14.834 L204.672,1.629 C204.998,1.122 204.672,0.507 204.057,0.507" id="Path"></path>
|
| 28 |
+
</g>
|
| 29 |
+
</g>
|
| 30 |
+
</g>
|
| 31 |
+
</g>
|
| 32 |
+
</svg>
|
assets/img/bridge-normal.jpg
ADDED
|
Binary file
|
assets/img/bridge-original.jpg
ADDED
|
Binary file
|
assets/img/bridge-ultra.jpg
ADDED
|
Binary file
|
assets/img/fond-CTA.svg
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="245px" height="180px" viewBox="0 0 245 180" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>Group 14</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<g id="Plugin-Increase-File" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.348997201">
|
| 7 |
+
<g id="IFM----More-Optimization-V2" transform="translate(-439.000000, -1550.000000)" fill="#8BA6B4">
|
| 8 |
+
<g id="Group-14" transform="translate(131.000000, 1509.000000)">
|
| 9 |
+
<g transform="translate(308.000000, 41.000000)" id="Group-7">
|
| 10 |
+
<g opacity="0.335179571">
|
| 11 |
+
<path d="M56.2341674,173.134729 L15.7050377,102.817583 L30.3968472,94.2176439 L26.0906272,83.5941901 L0,98.5176133 L51.9279474,188.564031 L92.457077,165.293609 C92.7103841,161.246579 93.2169982,157.199549 93.7236124,153.152519 L84.0979441,156.946609 L56.2341674,173.134729 L56.2341674,173.134729 Z" id="Shape"></path>
|
| 12 |
+
<path d="M40.3498099,70.1454991 L52.5085488,65.5925904 L49.7221711,54.7161972 L25.9113074,63.8220147 L62.3875241,159.686038 L95.8240561,147.03907 C97.0905914,142.233221 99.1170479,137.427373 101.396811,132.874464 L68.9735077,145.268494 L40.3498099,70.1454991 L40.3498099,70.1454991 Z" id="Shape"></path>
|
| 13 |
+
<path d="M103.344049,37.9973592 L86.8790896,106.79687 L137.540502,96.4263551 C140.580186,94.9087188 143.619871,93.6440219 146.912863,92.6322644 C150.712469,91.3675676 154.512075,90.35581 158.311681,89.5969919 C162.871208,88.8381738 167.684042,88.332295 172.496876,88.332295 L172.750183,88.332295 L176.549789,88.332295 L187.441993,86.0558406 L155.525303,57.7266305 L142.85995,73.4088718 L103.344049,37.9973592 L103.344049,37.9973592 Z" id="Shape"></path>
|
| 14 |
+
<ellipse id="Oval" cx="165.34682" cy="37.2227343" rx="9.87897536" ry="9.86463568"></ellipse>
|
| 15 |
+
<path d="M106.279281,123.181476 C109.82558,117.869749 114.1318,113.316841 118.691327,109.016871 L79.9353464,116.857992 L63.4703875,37.4350277 L180.751556,13.4057869 L196.963208,92.069933 C201.269428,93.5875692 205.575648,95.3581449 209.628561,97.3816599 L189.617304,-1.68489297e-14 L50.2984203,28.3292101 L71.3229063,130.263779 L106.279281,123.181476 L106.279281,123.181476 Z" id="Shape"></path>
|
| 16 |
+
<ellipse id="Oval" cx="172.216576" cy="168.699242" rx="6.07936945" ry="6.07054503"></ellipse>
|
| 17 |
+
<path d="M172.789353,95.7533451 C133.020144,95.7533451 100.596841,128.129585 100.596841,168.094007 C100.596841,176.946885 102.116683,185.293884 105.156368,193.135005 L129.473846,193.135005 C125.927547,186.811521 123.647783,179.729218 122.887862,172.141037 L115.035343,172.141037 C112.75558,172.141037 111.235737,170.370461 111.235737,168.094007 C111.235737,165.817552 113.008887,164.046977 115.035343,164.046977 L122.887862,164.046977 C123.647783,153.170583 127.954003,143.558887 134.539987,135.717767 L128.967231,130.1531 C127.447389,128.635464 127.447389,126.10607 128.967231,124.588434 C130.487074,123.070798 133.020144,123.070798 134.539987,124.588434 L140.112742,130.1531 C147.965261,123.576676 157.590929,119.276707 168.483133,118.517889 L168.483133,110.423829 C168.483133,108.147375 170.256282,106.376799 172.282739,106.376799 C174.562502,106.376799 176.335652,108.147375 176.335652,110.423829 L176.335652,118.517889 C186.214627,119.276707 195.333681,123.070798 202.932893,128.888403 L207.239113,125.853131 C209.518877,124.082555 212.558561,124.335495 214.585018,126.35901 C216.611474,128.382525 216.864781,131.670737 215.091632,133.694252 L182.921635,179.223339 C177.095573,185.040945 167.976519,185.293884 161.897149,179.729218 L161.390535,179.223339 C155.564473,173.405734 155.564473,163.541098 161.390535,157.723492 C162.150456,156.964674 162.65707,156.458795 163.416992,155.952917 L163.416992,155.952917 L195.333681,134.20013 C188.747698,129.647221 180.895179,127.117828 172.282739,127.117828 C149.485103,127.117828 131.246995,145.582402 131.246995,168.346946 C131.246995,177.705703 134.28668,186.305642 139.606128,193.135005 L205.212657,193.135005 C210.532105,186.305642 213.57179,177.705703 213.57179,168.346946 C213.57179,163.035219 212.558561,158.229371 210.785412,153.676462 L216.611474,145.582402 C219.651159,151.400008 221.424308,157.723492 221.930923,164.552855 L229.783441,164.552855 C232.063205,164.552855 233.583047,166.323431 233.583047,168.599885 C233.583047,170.87634 231.809898,172.646915 229.783441,172.646915 L221.930923,172.646915 C221.424308,180.235097 219.144545,187.317399 215.344939,193.640884 L240.422338,193.640884 C243.208716,185.799763 244.981865,177.452764 244.981865,168.599885 C244.728558,128.129585 212.558561,95.7533451 172.789353,95.7533451 L172.789353,95.7533451 Z" id="Shape"></path>
|
| 18 |
+
</g>
|
| 19 |
+
</g>
|
| 20 |
+
</g>
|
| 21 |
+
</g>
|
| 22 |
+
</g>
|
| 23 |
+
</svg>
|
assets/img/fusee.svg
ADDED
|
@@ -0,0 +1,30 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="59px" height="60px" viewBox="0 0 59 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>Calque_1</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<g id="Plugin-Increase-File" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
| 7 |
+
<g id="IFM----More-Optimization-V2" transform="translate(-228.000000, -750.000000)" fill="#FFFFFF">
|
| 8 |
+
<g id="Group-4" transform="translate(171.000000, 667.000000)">
|
| 9 |
+
<g id="Calque_1" transform="translate(57.000000, 83.000000)">
|
| 10 |
+
<path d="M57.8263441,2.10315789 C57.7275575,1.78279766 57.4756665,1.53203021 57.153871,1.43368421 C55.1197253,0.882979851 53.0192283,0.613088302 50.9112903,0.631578947 C46.0770598,0.562408602 41.3684639,2.16511936 37.5887097,5.16631579 C33.2355878,8.62072888 29.8671928,13.1499571 27.8188172,18.3031579 C26.9595812,18.06305 26.0720918,17.9377415 25.1796774,17.9305263 C23.07962,17.8925361 21.0538173,18.7038006 19.5651613,20.1789474 L12.7643011,26.9368421 C12.4701646,27.2252079 12.38075,27.6621908 12.5381401,28.0421248 C12.6955302,28.4220588 13.0683702,28.6692542 13.4811828,28.6673684 L13.5636559,28.6673684 L24.9830108,27.7515789 C24.2090323,31.08 23.6317204,34.1431579 23.5873118,34.3515789 C23.5304058,34.6483427 23.6098625,34.9548874 23.8039017,35.1871849 C23.9979408,35.4194823 24.2862052,35.5531615 24.5896774,35.5515789 L24.78,35.5515789 C24.9893548,35.5136842 28.0408602,34.92 31.3841935,34.1494737 L30.457957,45.4673684 C30.422548,45.890634 30.6567759,46.290768 31.0441421,46.468755 C31.4315083,46.646742 31.8893272,46.5645895 32.1898925,46.2631579 L38.9907527,39.5052632 C41.2429032,37.2694737 41.6743011,34.1305263 40.8939785,31.2947368 C46.0640744,29.2598142 50.6105908,25.9157541 54.0833333,21.5936842 C61.1252688,13.0547368 57.965914,2.54526316 57.8263441,2.10315789 L57.8263441,2.10315789 Z M16.1583871,26.4252632 L20.9989247,21.6063158 C22.1104592,20.5186329 23.6150272,19.9222217 25.1733333,19.9515789 C25.8156965,19.958486 26.4548188,20.0433222 27.0765591,20.2042105 C26.9433333,20.5831579 26.8101075,20.9557895 26.695914,21.2968421 C26.2772043,22.5094737 25.8458065,24.0631579 25.4270968,25.68 L16.1583871,26.4252632 Z M25.8775269,33.2526316 C26.1312903,31.9894737 26.5119355,30.0568421 26.994086,28.0484211 L31.0860215,32.1221053 C29.0812903,32.5894737 27.14,32.9936842 25.8775269,33.2526316 L25.8775269,33.2526316 Z M37.5569892,38.0715789 L32.7164516,42.8905263 L33.4650538,33.6378947 C35.0891398,33.2336842 36.6370968,32.8042105 37.8741935,32.3747368 L38.9590323,31.9957895 C39.4919355,34.08 39.2572043,36.3789474 37.5506452,38.0715789 L37.5569892,38.0715789 Z M52.5036559,20.3052632 C46.832043,27.1831579 40.8051613,29.2421053 37.2080645,30.4673684 C35.8821505,30.9221053 34.0804301,31.4021053 32.2533333,31.8442105 L27.2732258,26.8863158 C27.7046237,25.0926316 28.1867742,23.2736842 28.6435484,21.9347368 C29.8806452,18.3536842 31.9488172,12.36 38.8575269,6.72 C42.2801167,4.01300477 46.5406673,2.5731111 50.9112903,2.64631579 C52.6194163,2.64653366 54.3220225,2.83934129 55.9865591,3.22105263 C56.5321505,5.38105263 57.9976344,13.6484211 52.5036559,20.3052632 L52.5036559,20.3052632 Z" id="Shape"></path>
|
| 11 |
+
<path d="M45.7535484,8.47578947 C43.3720381,8.47583274 41.3220762,10.1503657 40.8569814,12.4756017 C40.3918866,14.8008376 41.6411459,17.1294086 43.8409791,18.037658 C46.0408123,18.9459074 48.5787647,18.1809698 49.9031668,16.2105178 C51.2275689,14.2400657 50.9696944,11.6126918 49.2872043,9.93473684 C48.3525956,8.99768798 47.0799823,8.47226167 45.7535484,8.47578947 L45.7535484,8.47578947 Z M48.3292473,16.0105263 C47.2218041,17.1433599 45.5116224,17.446079 44.0798078,16.7627193 C42.6479931,16.0793595 41.8140752,14.5624223 42.0076981,12.9934512 C42.201321,11.4244801 43.3792751,10.1536132 44.9346648,9.83561595 C46.4900545,9.51761865 48.0757726,10.2234565 48.8748387,11.5894737 L45.0239785,11.5894737 C44.8365283,11.5894737 44.6845699,11.7407543 44.6845699,11.9273684 C44.6845699,12.1139825 44.8365283,12.2652632 45.0239785,12.2652632 L49.1856989,12.2652632 C49.6457554,13.5738658 49.3129687,15.0291423 48.3292473,16.0105263 L48.3292473,16.0105263 Z" id="Shape"></path>
|
| 12 |
+
<path d="M22.3058065,42.8652632 L17.7951613,47.3494737 C17.3974866,47.7453746 17.3974866,48.3872569 17.7951613,48.7831579 C18.192836,49.1790589 18.8375941,49.1790589 19.2352688,48.7831579 L23.745914,44.2989474 C24.1435887,43.9030464 24.1435887,43.2611641 23.745914,42.8652632 C23.3482393,42.4693622 22.7034812,42.4693622 22.3058065,42.8652632 L22.3058065,42.8652632 Z" id="Shape"></path>
|
| 13 |
+
<ellipse id="Oval" cx="6.07129032" cy="45.4042105" rx="1" ry="1"></ellipse>
|
| 14 |
+
<path d="M20.6055914,39.5431579 L17.5160215,42.6189474 C17.1756322,43.020889 17.2016756,43.6155178 17.5759145,43.986439 C17.9501534,44.3573601 18.5475559,44.3806501 18.9497849,44.04 L22.0393548,40.9642105 C22.3797441,40.5622689 22.3537007,39.9676401 21.9794618,39.5967189 C21.6052229,39.2257978 21.0078204,39.2025077 20.6055914,39.5431579 L20.6055914,39.5431579 Z" id="Shape"></path>
|
| 15 |
+
<ellipse id="Oval" transform="translate(6.055361, 50.434691) rotate(-45.020000) translate(-6.055361, -50.434691) " cx="6.05536097" cy="50.4346909" rx="1" ry="1"></ellipse>
|
| 16 |
+
<ellipse id="Oval" cx="2.95" cy="58.5347368" rx="1" ry="1"></ellipse>
|
| 17 |
+
<ellipse id="Oval" transform="translate(16.361453, 50.201380) rotate(-45.040000) translate(-16.361453, -50.201380) " cx="16.3614529" cy="50.2013804" rx="1" ry="1"></ellipse>
|
| 18 |
+
<ellipse id="Oval" cx="0.913548387" cy="50.5326316" rx="1" ry="1"></ellipse>
|
| 19 |
+
<ellipse id="Oval" cx="9.87774194" cy="46.6294737" rx="1" ry="1"></ellipse>
|
| 20 |
+
<path d="M14.75,36.7642105 C14.5594564,36.573294 14.3002855,36.4659348 14.0299462,36.4659348 C13.759607,36.4659348 13.5004361,36.573294 13.3098925,36.7642105 L7.49870968,42.5431579 C7.10103496,42.9390589 7.10103496,43.5809411 7.49870968,43.9768421 C7.89638439,44.3727431 8.54114249,44.3727431 8.9388172,43.9768421 L14.75,38.1978947 C14.9417719,38.008201 15.0496121,37.7501861 15.0496121,37.4810526 C15.0496121,37.2119191 14.9417719,36.9539042 14.75,36.7642105 L14.75,36.7642105 Z" id="Shape"></path>
|
| 21 |
+
<path d="M47.5489247,12.8842105 L43.7424731,12.8842105 C43.5550229,12.8842105 43.4030645,13.0354912 43.4030645,13.2221053 C43.4030645,13.4087194 43.5550229,13.56 43.7424731,13.56 L47.5489247,13.56 C47.7363749,13.56 47.8883333,13.4087194 47.8883333,13.2221053 C47.8883333,13.0354912 47.7363749,12.8842105 47.5489247,12.8842105 L47.5489247,12.8842105 Z" id="Shape"></path>
|
| 22 |
+
<ellipse id="Oval" cx="10.1505376" cy="51.3726316" rx="1" ry="1"></ellipse>
|
| 23 |
+
<path d="M21.3732258,35.1978947 C21.1826822,35.0069782 20.9235113,34.899619 20.653172,34.899619 C20.3828328,34.899619 20.1236619,35.0069782 19.9331183,35.1978947 L11.3178495,43.7684211 C10.9201748,44.164322 10.9201748,44.8062043 11.3178495,45.2021052 C11.7155242,45.5980062 12.3602823,45.5980062 12.757957,45.2021053 L21.3732258,36.6252632 C21.7684708,36.230827 21.7684708,35.5923309 21.3732258,35.1978947 L21.3732258,35.1978947 Z" id="Shape"></path>
|
| 24 |
+
<ellipse id="Oval" cx="10.7786022" cy="55.7621053" rx="1" ry="1"></ellipse>
|
| 25 |
+
<ellipse id="Oval" cx="16.075914" cy="45.48" rx="1" ry="1"></ellipse>
|
| 26 |
+
</g>
|
| 27 |
+
</g>
|
| 28 |
+
</g>
|
| 29 |
+
</g>
|
| 30 |
+
</svg>
|
assets/img/logo-heartbeat.svg
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="65px" height="66px" viewBox="0 0 65 66" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>Group 3 Copy</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<defs>
|
| 7 |
+
<rect id="path-1" x="0" y="0.580078125" width="65" height="65"></rect>
|
| 8 |
+
</defs>
|
| 9 |
+
<g id="Plugin-Increase-File" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
| 10 |
+
<g id="IFM---About-Us-VS" transform="translate(-593.000000, -795.000000)">
|
| 11 |
+
<g id="Group-3-Copy" transform="translate(593.000000, 795.000000)">
|
| 12 |
+
<g id="Bitmap">
|
| 13 |
+
<mask id="mask-2" fill="white">
|
| 14 |
+
<use xlink:href="#path-1"></use>
|
| 15 |
+
</mask>
|
| 16 |
+
<use id="Mask" fill="#F56640" xlink:href="#path-1"></use>
|
| 17 |
+
</g>
|
| 18 |
+
<g id="heartbeat-icon" transform="translate(17.000000, 7.419922)" fill="#FFFFFF" fill-rule="nonzero">
|
| 19 |
+
<path d="M23.3268266,16.9714453 C22.9594815,16.9714453 22.6278285,16.7584057 22.4815854,16.4300597 L21.5608536,14.3585508 L18.1309303,20.5542708 C17.9695258,20.8456201 17.6577721,21.0259792 17.3201178,21.0259792 C17.3100102,21.0259792 17.2999027,21.0259792 17.2897952,21.0256709 C16.9404541,21.0145719 16.6280686,20.8117064 16.482773,20.5018588 L12.6810825,12.4199219 L10.7846593,16.4544159 C10.6349417,16.7741293 10.3073949,16.9788446 9.94731456,16.9788446 L5,16.9788446 L17.488787,29.4045066 L17.488787,29.4199219 L17.4963676,29.4122142 L17.5039482,29.4199219 L17.5039482,29.4045066 L30,16.9714453 L23.3268266,16.9714453 Z" id="Path"></path>
|
| 20 |
+
<path d="M2.37624212,15.3327375 L2.44149877,15.3984831 L8.71481653,15.3984831 L11.2466459,9.94731587 C11.3990186,9.61795268 11.732374,9.40705861 12.0988399,9.40705861 C12.4653058,9.40705861 12.7986612,9.61795268 12.9510339,9.94699826 L16.8882922,18.4199219 L20.4034718,11.9930519 C20.5735248,11.6811574 20.9113807,11.4924961 21.2688457,11.5077415 C21.627918,11.5233044 21.9458432,11.7392803 22.0888935,12.0648321 L23.5492923,15.3908604 L31.5655734,15.3908604 L31.623115,15.3327375 L31.6137926,15.3305142 C33.0905859,13.7462678 34,11.6376446 34,9.31431603 C34,4.40213563 29.968875,0.419921875 24.9958683,0.419921875 C21.5128348,0.419921875 18.4975276,2.37704431 17.0001607,5.23554836 C15.5024724,2.37704431 12.4874866,0.419921875 9.00413172,0.419921875 C4.03144648,0.419921875 0,4.40213563 0,9.31431603 C0,11.6376446 0.909414089,13.7462678 2.38620742,15.3305142 L2.37624212,15.3327375 Z" id="Path"></path>
|
| 21 |
+
</g>
|
| 22 |
+
<g id="Group-7" transform="translate(7.000000, 42.419922)" fill-rule="nonzero">
|
| 23 |
+
<polygon id="Path" fill="#FFFFFF" points="5.6775937 1.64313008e-14 5.6775937 6.62004662 4.15365693 6.62004662 4.15365693 3.90675991 1.52393677 3.90675991 1.52393677 6.62004662 -4.35207426e-14 6.62004662 -4.35207426e-14 1.64313008e-14 1.52393677 1.64313008e-14 1.52393677 2.56410256 4.15365693 2.56410256 4.15365693 1.64313008e-14"></polygon>
|
| 24 |
+
<polygon id="Path" fill="#FFFFFF" points="11.6056968 5.27738928 11.6056968 6.62004662 6.96884037 6.62004662 6.96884037 1.64313008e-14 11.5220661 1.64313008e-14 11.5220661 1.34265734 8.49277714 1.34265734 8.49277714 2.62937063 11.0946204 2.62937063 11.0946204 3.86946387 8.49277714 3.86946387 8.49277714 5.27738928"></polygon>
|
| 25 |
+
<polygon id="Path" fill="#FFFFFF" points="14.3558341 1.64313008e-14 15.7310941 1.64313008e-14 18.1377992 6.62004662 16.5766932 6.62004662 16.0656168 5.13752914 14.0120191 5.13752914 13.5102351 6.62004662 11.9491291 6.62004662"></polygon>
|
| 26 |
+
<polygon id="Path" fill="#F56640" points="15.8147248 4.08391608 15.0434641 1.74358974 14.2536188 4.08391608"></polygon>
|
| 27 |
+
<path d="M18.8157542,6.62004662 L18.8157542,1.64313008e-14 L21.7892894,1.64313008e-14 C22.0990341,1.64313008e-14 22.3855438,0.0652674126 22.6488269,0.195804196 C22.9121099,0.326340979 23.1397689,0.497279441 23.3318107,0.708624709 C23.5238525,0.919969977 23.6740765,1.15928382 23.7824871,1.42657343 C23.8908978,1.69386303 23.9451023,1.9642566 23.9451023,2.23776224 C23.9451023,2.44289147 23.9203231,2.64024769 23.870764,2.82983683 C23.8212048,3.01942597 23.7499646,3.19813436 23.6570411,3.36596737 C23.5641177,3.53380037 23.4510625,3.68453702 23.3178723,3.81818182 C23.184682,3.95182662 23.034458,4.0652676 22.8671958,4.15850816 L24.3167942,6.62004662 L22.5977192,6.62004662 L21.3339668,4.48484848 L20.339691,4.48484848 L20.339691,6.62004662 L18.8157542,6.62004662 Z" id="Path" fill="#FFFFFF"></path>
|
| 28 |
+
<path d="M20.339691,3.15151515 L21.7335356,3.15151515 C21.9131875,3.15151515 22.0680576,3.06604592 22.1981504,2.8951049 C22.3282433,2.72416387 22.3932887,2.50505184 22.3932887,2.23776224 C22.3932887,1.9642566 22.318951,1.74669855 22.1702735,1.58508159 C22.021596,1.42346462 21.8605312,1.34265734 21.6870741,1.34265734 L20.339691,1.34265734 L20.339691,3.15151515 Z" id="Path" fill="#F56640"></path>
|
| 29 |
+
<polygon id="Path" fill="#FFFFFF" points="29.8917624 1.34265734 27.8846262 1.34265734 27.8846262 6.62004662 26.3606894 6.62004662 26.3606894 1.34265734 24.3442609 1.34265734 24.3442609 1.64313008e-14 29.8917624 1.64313008e-14"></polygon>
|
| 30 |
+
<path d="M36.117219,4.92307692 C36.117219,5.20901464 36.0583684,5.4576524 35.9406654,5.66899767 C35.8229623,5.88034294 35.6618975,6.05594336 35.4574659,6.1958042 C35.2530343,6.33566503 35.0145344,6.44133608 34.741959,6.51282051 C34.4693836,6.58430494 34.1813252,6.62004662 33.8777754,6.62004662 L30.6626405,6.62004662 L30.6626405,1.64313008e-14 L34.3330979,1.64313008e-14 C34.5623091,1.64313008e-14 34.769835,0.0497275524 34.9556818,0.149184149 C35.1415287,0.248640746 35.2994962,0.377621585 35.429589,0.536130536 C35.5596818,0.694639487 35.6603474,0.874901865 35.7315887,1.07692308 C35.80283,1.27894429 35.8384501,1.48562443 35.8384501,1.6969697 C35.8384501,2.0139876 35.7594664,2.31235291 35.6014965,2.59207459 C35.4435267,2.87179627 35.2065755,3.08313837 34.8906358,3.22610723 C35.2685244,3.3379959 35.5674237,3.53690611 35.7873425,3.82284382 C36.0072613,4.10878154 36.117219,4.47552224 36.117219,4.92307692 Z" id="Path" fill="#FFFFFF"></path>
|
| 31 |
+
<path d="M34.5654054,4.61538462 C34.5654054,4.41025538 34.5065547,4.23620895 34.3888517,4.09324009 C34.2711487,3.95027124 34.1224734,3.87878788 33.9428214,3.87878788 L32.1865772,3.87878788 L32.1865772,5.32400932 L33.8777754,5.32400932 C34.076012,5.32400932 34.2401743,5.25874191 34.3702671,5.12820513 C34.5003599,4.99766834 34.5654054,4.82672988 34.5654054,4.61538462 Z" id="Path" fill="#F56640"></path>
|
| 32 |
+
<path d="M32.1865772,1.30536131 L32.1865772,2.67599068 L33.6826371,2.67599068 C33.8498993,2.67599068 33.9985746,2.62004718 34.1286674,2.50815851 C34.2587602,2.39626984 34.3238056,2.2222234 34.3238056,1.98601399 C34.3238056,1.76845268 34.2665037,1.60062219 34.1518981,1.48251748 C34.0372925,1.36441277 33.8994582,1.30536131 33.7383909,1.30536131 L32.1865772,1.30536131 Z" id="Path" fill="#F56640"></path>
|
| 33 |
+
<polygon id="Path" fill="#FFFFFF" points="41.6829225 5.27738928 41.6829225 6.62004662 37.0460661 6.62004662 37.0460661 1.64313008e-14 41.5992918 1.64313008e-14 41.5992918 1.34265734 38.5700029 1.34265734 38.5700029 2.62937063 41.1718461 2.62937063 41.1718461 3.86946387 38.5700029 3.86946387 38.5700029 5.27738928"></polygon>
|
| 34 |
+
<polygon id="Path" fill="#FFFFFF" points="44.4330598 1.64313008e-14 45.8083198 1.64313008e-14 48.2150249 6.62004662 46.6539189 6.62004662 46.1428426 5.13752914 44.0892448 5.13752914 43.5874608 6.62004662 42.0263548 6.62004662"></polygon>
|
| 35 |
+
<polygon id="Path" fill="#F56640" points="45.8919505 4.08391608 45.1206898 1.74358974 44.3308446 4.08391608"></polygon>
|
| 36 |
+
<polygon id="Path" fill="#FFFFFF" points="52.6190158 1.34265734 50.6118796 1.34265734 50.6118796 6.62004662 49.0879428 6.62004662 49.0879428 1.34265734 47.0715143 1.34265734 47.0715143 1.64313008e-14 52.6190158 1.64313008e-14"></polygon>
|
| 37 |
+
</g>
|
| 38 |
+
<g id="Group-5" transform="translate(11.000000, 51.419922)" fill-rule="nonzero">
|
| 39 |
+
<path d="M2.12274642e-13,3.29137529 C2.12274642e-13,2.8935489 0.0743376357,2.49728247 0.223015137,2.1025641 C0.371692639,1.70784573 0.588510743,1.35509091 0.873475954,1.04428904 C1.15844117,0.733487179 1.50535013,0.481741445 1.91421326,0.289044289 C2.32307639,0.0963471329 2.78768661,4.97379915e-14 3.30805787,4.97379915e-14 C3.92754746,4.97379915e-14 4.46494662,0.133642797 4.92027147,0.400932401 C5.37559632,0.668222005 5.71476178,1.01631487 5.93777803,1.44522145 L4.76694856,2.26573427 C4.69260981,2.09168522 4.59813906,1.94716452 4.48353349,1.83216783 C4.36892792,1.71717114 4.24348315,1.62393198 4.10719545,1.55244755 C3.97090774,1.48096312 3.83152467,1.43123557 3.68904206,1.4032634 C3.54655946,1.37529124 3.40717639,1.36130536 3.27088868,1.36130536 C2.97972857,1.36130536 2.72574165,1.42035683 2.50892029,1.53846154 C2.29209894,1.65656625 2.11244965,1.80885688 1.96996705,1.995338 C1.82748444,2.18181911 1.72217279,2.39316121 1.65402893,2.62937063 C1.58588508,2.86558005 1.55181366,3.10489389 1.55181366,3.34731935 C1.55181366,3.60839291 1.59207988,3.86013865 1.67261353,4.1025641 C1.75314718,4.34498956 1.86929973,4.55943963 2.02107468,4.74592075 C2.17284963,4.93240186 2.35559632,5.08003054 2.56932023,5.18881119 C2.78304414,5.29759184 3.02309275,5.35198135 3.28947328,5.35198135 C3.42576098,5.35198135 3.56669275,5.33488751 3.71227281,5.3006993 C3.85785286,5.2665111 3.99723593,5.21367557 4.13042619,5.14219114 C4.26361645,5.07070671 4.38596381,4.97746755 4.49747194,4.86247086 C4.60898006,4.74747417 4.6988047,4.60606145 4.76694856,4.43822844 L6.01211641,5.17482517 C5.91299808,5.41725063 5.7658715,5.63480867 5.57073228,5.82750583 C5.37559306,6.02020298 5.15103145,6.18181753 4.89704072,6.31235431 C4.64304999,6.4428911 4.37357606,6.5423462 4.08861085,6.61072261 C3.80364564,6.67909902 3.52487951,6.71328671 3.25230409,6.71328671 C2.7752971,6.71328671 2.33701479,6.61538559 1.93744401,6.41958042 C1.53787322,6.22377524 1.19406165,5.96425958 0.905998995,5.64102564 C0.617936336,5.3177917 0.394923429,4.951051 0.236953583,4.54079254 C0.0789837379,4.13053408 2.12274642e-13,3.71406583 2.12274642e-13,3.29137529 Z" id="Path" fill="#FFFFFF"></path>
|
| 40 |
+
<path d="M9.5613738,6.71328671 C9.07197703,6.71328671 8.62595121,6.61693958 8.22328298,6.42424242 C7.82061475,6.23154527 7.47680318,5.97824555 7.19183797,5.66433566 C6.90687276,5.35042578 6.68540855,4.99145501 6.52743871,4.58741259 C6.36946886,4.18337016 6.29048512,3.76690191 6.29048512,3.33799534 C6.29048512,2.90287273 6.37256626,2.4832965 6.536731,2.07925408 C6.70089574,1.67521166 6.93010345,1.31934886 7.22436101,1.01165501 C7.51861856,0.703961166 7.86707623,0.458431375 8.26974447,0.275058275 C8.6724127,0.0916851748 9.11224371,4.97379915e-14 9.58925069,4.97379915e-14 C10.0786475,4.97379915e-14 10.5246733,0.0963471329 10.9273415,0.289044289 C11.3300098,0.481741445 11.6738213,0.736595152 11.9587865,1.05361305 C12.2437517,1.37063096 12.4636672,1.73115571 12.6185396,2.13519814 C12.773412,2.53924056 12.8508471,2.94949287 12.8508471,3.36596737 C12.8508471,3.80108998 12.7687659,4.2206662 12.6046012,4.62470862 C12.4404365,5.02875105 12.2127774,5.38461385 11.9216173,5.69230769 C11.6304572,6.00000154 11.2835483,6.24708531 10.88088,6.43356643 C10.4782118,6.62004755 10.0383808,6.71328671 9.5613738,6.71328671 Z" id="Path" fill="#FFFFFF"></path>
|
| 41 |
+
<path d="M7.84229879,3.35664336 C7.84229879,3.61150089 7.8794676,3.85858466 7.95380635,4.0979021 C8.02814511,4.33721953 8.13810286,4.55011562 8.28368291,4.73659674 C8.42926297,4.92307786 8.61046095,5.07226051 8.82728231,5.18414918 C9.04410367,5.29603786 9.29189578,5.35198135 9.5706661,5.35198135 C9.86182621,5.35198135 10.1158131,5.29292988 10.3326345,5.17482517 C10.5494558,5.05672047 10.7291051,4.90287585 10.8715877,4.71328671 C11.0140703,4.52369758 11.1209307,4.30924751 11.192172,4.06993007 C11.2634133,3.83061263 11.2990334,3.58663683 11.2990334,3.33799534 C11.2990334,3.08313781 11.2618646,2.83605403 11.1875258,2.5967366 C11.1131871,2.35741916 11.0016806,2.14607706 10.8530031,1.96270396 C10.7043256,1.77933086 10.5231277,1.63325618 10.3094037,1.52447552 C10.0956798,1.41569487 9.84943642,1.36130536 9.5706661,1.36130536 C9.27950599,1.36130536 9.02706777,1.41880284 8.81334386,1.53379953 C8.59961995,1.64879622 8.41997067,1.79953287 8.27439061,1.98601399 C8.12881056,2.1724951 8.02040151,2.38539119 7.94916021,2.62470862 C7.8779189,2.86402606 7.84229879,3.10800186 7.84229879,3.35664336 Z" id="Path" fill="#F56640"></path>
|
| 42 |
+
<polygon id="Path" fill="#FFFFFF" points="15.2850463 2.87179487 15.2850463 6.65734266 13.7611095 6.65734266 13.7611095 0.0372960373 14.9505236 0.0372960373 18.026274 3.92540793 18.026274 0.0372960373 19.5502108 0.0372960373 19.5502108 6.65734266 18.3236276 6.65734266"></polygon>
|
| 43 |
+
<polygon id="Path" fill="#FFFFFF" points="25.8685904 1.37995338 23.8614541 1.37995338 23.8614541 6.65734266 22.3375174 6.65734266 22.3375174 1.37995338 20.3210888 1.37995338 20.3210888 0.0372960373 25.8685904 0.0372960373"></polygon>
|
| 44 |
+
<path d="M26.6394684,6.65734266 L26.6394684,0.0372960373 L29.6130035,0.0372960373 C29.9227483,0.0372960373 30.209258,0.10256345 30.4725411,0.233100233 C30.7358241,0.363637016 30.9634831,0.534575478 31.1555249,0.745920746 C31.3475667,0.957266014 31.4977907,1.19657986 31.6062013,1.46386946 C31.714612,1.73115907 31.7688165,2.00155263 31.7688165,2.27505828 C31.7688165,2.48018751 31.7440373,2.67754373 31.6944782,2.86713287 C31.644919,3.056722 31.5736788,3.2354304 31.4807553,3.4032634 C31.3878319,3.57109641 31.2747767,3.72183305 31.1415865,3.85547786 C31.0083962,3.98912266 30.8581722,4.10256364 30.69091,4.1958042 L32.1405084,6.65734266 L30.4214334,6.65734266 L29.157681,4.52214452 L28.1634052,4.52214452 L28.1634052,6.65734266 L26.6394684,6.65734266 Z" id="Path" fill="#FFFFFF"></path>
|
| 45 |
+
<path d="M28.1634052,3.18881119 L29.5572498,3.18881119 C29.7369017,3.18881119 29.8917718,3.10334196 30.0218646,2.93240093 C30.1519574,2.76145991 30.2170029,2.54234788 30.2170029,2.27505828 C30.2170029,2.00155263 30.1426652,1.78399459 29.9939877,1.62237762 C29.8453102,1.46076065 29.6842454,1.37995338 29.5107883,1.37995338 L28.1634052,1.37995338 L28.1634052,3.18881119 Z" id="Path" fill="#F56640"></path>
|
| 46 |
+
<path d="M35.7827063,6.71328671 C35.2933096,6.71328671 34.8472837,6.61693958 34.4446155,6.42424242 C34.0419473,6.23154527 33.6981357,5.97824555 33.4131705,5.66433566 C33.1282053,5.35042578 32.9067411,4.99145501 32.7487712,4.58741259 C32.5908014,4.18337016 32.5118177,3.76690191 32.5118177,3.33799534 C32.5118177,2.90287273 32.5938988,2.4832965 32.7580635,2.07925408 C32.9222283,1.67521166 33.151436,1.31934886 33.4456935,1.01165501 C33.7399511,0.703961166 34.0884088,0.458431375 34.491077,0.275058275 C34.8937452,0.0916851748 35.3335762,4.97379915e-14 35.8105832,4.97379915e-14 C36.29998,4.97379915e-14 36.7460058,0.0963471329 37.1486741,0.289044289 C37.5513423,0.481741445 37.8951538,0.736595152 38.1801191,1.05361305 C38.4650843,1.37063096 38.6849998,1.73115571 38.8398722,2.13519814 C38.9947446,2.53924056 39.0721796,2.94949287 39.0721796,3.36596737 C39.0721796,3.80108998 38.9900985,4.2206662 38.8259337,4.62470862 C38.661769,5.02875105 38.43411,5.38461385 38.1429499,5.69230769 C37.8517898,6.00000154 37.5048808,6.24708531 37.1022126,6.43356643 C36.6995443,6.62004755 36.2597133,6.71328671 35.7827063,6.71328671 Z" id="Path" fill="#FFFFFF"></path>
|
| 47 |
+
<path d="M34.0636313,3.35664336 C34.0636313,3.61150089 34.1008001,3.85858466 34.1751389,4.0979021 C34.2494776,4.33721953 34.3594354,4.55011562 34.5050154,4.73659674 C34.6505955,4.92307786 34.8317935,5.07226051 35.0486148,5.18414918 C35.2654362,5.29603786 35.5132283,5.35198135 35.7919986,5.35198135 C36.0831587,5.35198135 36.3371457,5.29292988 36.553967,5.17482517 C36.7707884,5.05672047 36.9504377,4.90287585 37.0929203,4.71328671 C37.2354029,4.52369758 37.3422632,4.30924751 37.4135045,4.06993007 C37.4847458,3.83061263 37.5203659,3.58663683 37.5203659,3.33799534 C37.5203659,3.08313781 37.4831971,2.83605403 37.4088584,2.5967366 C37.3345196,2.35741916 37.2230132,2.14607706 37.0743357,1.96270396 C36.9256582,1.77933086 36.7444602,1.63325618 36.5307363,1.52447552 C36.3170124,1.41569487 36.0707689,1.36130536 35.7919986,1.36130536 C35.5008385,1.36130536 35.2484003,1.41880284 35.0346764,1.53379953 C34.8209525,1.64879622 34.6413032,1.79953287 34.4957231,1.98601399 C34.3501431,2.1724951 34.241734,2.38539119 34.1704927,2.62470862 C34.0992514,2.86402606 34.0636313,3.10800186 34.0636313,3.35664336 Z" id="Path" fill="#F56640"></path>
|
| 48 |
+
<polygon id="Path" fill="#FFFFFF" points="39.9824421 6.65734266 39.9824421 0.0372960373 41.5063789 0.0372960373 41.5063789 5.31468531 44.7029292 5.31468531 44.7029292 6.65734266"></polygon>
|
| 49 |
+
</g>
|
| 50 |
+
</g>
|
| 51 |
+
</g>
|
| 52 |
+
</g>
|
| 53 |
+
</svg>
|
assets/img/logo-rocket.jpg
ADDED
|
Binary file
|
assets/img/logo.svg
ADDED
|
@@ -0,0 +1,11 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="307px" height="51px" viewBox="0 0 307 51" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>INCREASEMAXIMUMUPLOADFILESIZE</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<g id="Plugin-Increase-File" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
| 7 |
+
<g id="header" transform="translate(-25.000000, -44.000000)" fill="#FFFFFF" fill-rule="nonzero">
|
| 8 |
+
<path d="M25.548,63.468 L25.548,44.932 C25.548,44.652 25.8,44.4 26.08,44.4 L28.684,44.4 C28.964,44.4 29.216,44.652 29.216,44.932 L29.216,63.468 C29.216,63.748 28.964,64 28.684,64 L26.08,64 C25.8,64 25.548,63.748 25.548,63.468 Z M36.312,63.468 L36.312,44.624 C36.312,44.344 36.564,44.12 36.844,44.12 L37.544,44.12 L49.192,56.496 L49.22,56.496 L49.22,44.932 C49.22,44.652 49.444,44.4 49.752,44.4 L52.328,44.4 C52.608,44.4 52.86,44.652 52.86,44.932 L52.86,63.776 C52.86,64.056 52.608,64.28 52.328,64.28 L51.656,64.28 L39.952,51.428 L39.924,51.428 L39.924,63.468 C39.924,63.748 39.7,64 39.392,64 L36.844,64 C36.564,64 36.312,63.748 36.312,63.468 Z M58.528,54.228 C58.528,48.628 63.036,44.12 68.636,44.12 C71.464,44.12 73.508,45.016 75.412,46.724 C75.664,46.948 75.664,47.284 75.44,47.508 L73.732,49.272 C73.536,49.496 73.256,49.496 73.032,49.272 C71.856,48.236 70.288,47.62 68.72,47.62 C65.136,47.62 62.476,50.616 62.476,54.144 C62.476,57.644 65.164,60.612 68.748,60.612 C70.428,60.612 71.856,59.968 73.032,59.016 C73.256,58.82 73.564,58.848 73.732,59.016 L75.468,60.808 C75.692,61.004 75.636,61.368 75.44,61.564 C73.536,63.412 71.128,64.28 68.636,64.28 C63.036,64.28 58.528,59.828 58.528,54.228 Z M81.108,63.468 L81.108,44.932 C81.108,44.652 81.332,44.4 81.64,44.4 L89.648,44.4 C93.008,44.4 95.752,47.088 95.752,50.42 C95.752,52.996 94.044,55.096 91.608,56.076 L95.444,63.188 C95.64,63.552 95.444,64 94.968,64 L92.028,64 C91.776,64 91.636,63.86 91.58,63.748 L87.856,56.328 L84.748,56.328 L84.748,63.468 C84.748,63.748 84.496,64 84.216,64 L81.64,64 C81.332,64 81.108,63.748 81.108,63.468 Z M84.776,53.332 L89.34,53.332 C90.824,53.332 92.112,52.044 92.112,50.476 C92.112,48.992 90.824,47.76 89.34,47.76 L84.776,47.76 L84.776,53.332 Z M101.756,63.468 L101.756,44.932 C101.756,44.652 101.98,44.4 102.288,44.4 L113.684,44.4 C113.992,44.4 114.216,44.652 114.216,44.932 L114.216,47.228 C114.216,47.508 113.992,47.76 113.684,47.76 L105.396,47.76 L105.396,52.352 L112.312,52.352 C112.592,52.352 112.844,52.604 112.844,52.884 L112.844,55.208 C112.844,55.516 112.592,55.74 112.312,55.74 L105.396,55.74 L105.396,60.64 L113.684,60.64 C113.992,60.64 114.216,60.892 114.216,61.172 L114.216,63.468 C114.216,63.748 113.992,64 113.684,64 L102.288,64 C101.98,64 101.756,63.748 101.756,63.468 Z M118.148,64 C117.728,64 117.504,63.636 117.672,63.272 L126.38,44.428 C126.464,44.26 126.604,44.12 126.856,44.12 L127.136,44.12 C127.416,44.12 127.528,44.26 127.612,44.428 L136.236,63.272 C136.404,63.636 136.18,64 135.76,64 L133.324,64 C132.904,64 132.708,63.832 132.512,63.44 L131.14,60.416 L122.768,60.416 L121.396,63.44 C121.284,63.72 121.032,64 120.584,64 L118.148,64 Z M124.14,57.308 L129.768,57.308 L126.968,51.148 L126.884,51.148 L124.14,57.308 Z M139.776,62.096 C139.524,61.844 139.384,61.704 139.636,61.256 L140.644,59.52 C140.868,59.128 141.344,59.128 141.596,59.324 C141.736,59.408 144.004,61.06 145.824,61.06 C147.28,61.06 148.372,60.108 148.372,58.904 C148.372,57.476 147.168,56.496 144.816,55.544 C142.184,54.48 139.552,52.8 139.552,49.496 C139.552,47.004 141.4,44.12 145.852,44.12 C148.708,44.12 150.892,45.576 151.452,45.996 C151.732,46.164 151.816,46.64 151.62,46.92 L150.556,48.516 C150.332,48.852 149.912,49.076 149.576,48.852 C149.352,48.712 147.224,47.312 145.684,47.312 C144.088,47.312 143.22,48.376 143.22,49.272 C143.22,50.588 144.256,51.484 146.524,52.408 C149.24,53.5 152.376,55.124 152.376,58.736 C152.376,61.62 149.884,64.28 145.936,64.28 C142.408,64.28 140.336,62.628 139.776,62.096 Z M157.96,63.468 L157.96,44.932 C157.96,44.652 158.184,44.4 158.492,44.4 L169.888,44.4 C170.196,44.4 170.42,44.652 170.42,44.932 L170.42,47.228 C170.42,47.508 170.196,47.76 169.888,47.76 L161.6,47.76 L161.6,52.352 L168.516,52.352 C168.796,52.352 169.048,52.604 169.048,52.884 L169.048,55.208 C169.048,55.516 168.796,55.74 168.516,55.74 L161.6,55.74 L161.6,60.64 L169.888,60.64 C170.196,60.64 170.42,60.892 170.42,61.172 L170.42,63.468 C170.42,63.748 170.196,64 169.888,64 L158.492,64 C158.184,64 157.96,63.748 157.96,63.468 Z M183.324,63.356 L186.656,44.54 C186.684,44.316 186.852,44.12 187.16,44.12 L187.608,44.12 C187.832,44.12 188,44.232 188.084,44.4 L194.244,57.616 L194.328,57.616 L200.488,44.4 C200.572,44.232 200.712,44.12 200.964,44.12 L201.412,44.12 C201.72,44.12 201.888,44.316 201.916,44.54 L205.22,63.356 C205.304,63.748 205.08,64 204.716,64 L202.168,64 C201.916,64 201.692,63.776 201.636,63.58 L199.984,52.968 L199.9,52.968 L195,63.972 C194.944,64.14 194.776,64.28 194.524,64.28 L194.02,64.28 C193.768,64.28 193.628,64.14 193.544,63.972 L188.588,52.968 L188.504,52.968 L186.88,63.58 C186.852,63.776 186.628,64 186.376,64 L183.856,64 C183.492,64 183.268,63.748 183.324,63.356 Z M208.984,64 C208.564,64 208.34,63.636 208.508,63.272 L217.216,44.428 C217.3,44.26 217.44,44.12 217.692,44.12 L217.972,44.12 C218.252,44.12 218.364,44.26 218.448,44.428 L227.072,63.272 C227.24,63.636 227.016,64 226.596,64 L224.16,64 C223.74,64 223.544,63.832 223.348,63.44 L221.976,60.416 L213.604,60.416 L212.232,63.44 C212.12,63.72 211.868,64 211.42,64 L208.984,64 Z M214.976,57.308 L220.604,57.308 L217.804,51.148 L217.72,51.148 L214.976,57.308 Z M229.912,63.216 L235.736,53.948 L230.136,45.184 C229.912,44.82 230.136,44.4 230.612,44.4 L233.86,44.4 C234.084,44.4 234.224,44.54 234.308,44.652 L237.892,50.588 L237.92,50.588 L241.56,44.652 C241.616,44.54 241.784,44.4 242.008,44.4 L245.256,44.4 C245.732,44.4 245.956,44.82 245.732,45.184 L240.104,53.948 L245.928,63.216 C246.152,63.608 245.928,64 245.452,64 L242.428,64 C242.204,64 242.008,63.86 241.952,63.748 L237.948,57.336 L237.864,57.336 L233.916,63.748 C233.832,63.86 233.664,64 233.44,64 L230.416,64 C229.912,64 229.688,63.58 229.912,63.216 Z M251.316,63.468 L251.316,44.932 C251.316,44.652 251.568,44.4 251.848,44.4 L254.452,44.4 C254.732,44.4 254.984,44.652 254.984,44.932 L254.984,63.468 C254.984,63.748 254.732,64 254.452,64 L251.848,64 C251.568,64 251.316,63.748 251.316,63.468 Z M260.792,63.356 L264.124,44.54 C264.152,44.316 264.32,44.12 264.628,44.12 L265.076,44.12 C265.3,44.12 265.468,44.232 265.552,44.4 L271.712,57.616 L271.796,57.616 L277.956,44.4 C278.04,44.232 278.18,44.12 278.432,44.12 L278.88,44.12 C279.188,44.12 279.356,44.316 279.384,44.54 L282.688,63.356 C282.772,63.748 282.548,64 282.184,64 L279.636,64 C279.384,64 279.16,63.776 279.104,63.58 L277.452,52.968 L277.368,52.968 L272.468,63.972 C272.412,64.14 272.244,64.28 271.992,64.28 L271.488,64.28 C271.236,64.28 271.096,64.14 271.012,63.972 L266.056,52.968 L265.972,52.968 L264.348,63.58 C264.32,63.776 264.096,64 263.844,64 L261.324,64 C260.96,64 260.736,63.748 260.792,63.356 Z M288.244,56.58 L288.244,44.932 C288.244,44.652 288.496,44.4 288.776,44.4 L291.436,44.4 C291.744,44.4 291.968,44.652 291.968,44.932 L291.968,56.384 C291.968,58.764 293.592,60.64 296.028,60.64 C298.464,60.64 300.116,58.764 300.116,56.412 L300.116,44.932 C300.116,44.652 300.34,44.4 300.648,44.4 L303.308,44.4 C303.588,44.4 303.84,44.652 303.84,44.932 L303.84,56.58 C303.84,60.836 300.452,64.28 296.028,64.28 C291.632,64.28 288.244,60.836 288.244,56.58 Z M309.368,63.356 L312.7,44.54 C312.728,44.316 312.896,44.12 313.204,44.12 L313.652,44.12 C313.876,44.12 314.044,44.232 314.128,44.4 L320.288,57.616 L320.372,57.616 L326.532,44.4 C326.616,44.232 326.756,44.12 327.008,44.12 L327.456,44.12 C327.764,44.12 327.932,44.316 327.96,44.54 L331.264,63.356 C331.348,63.748 331.124,64 330.76,64 L328.212,64 C327.96,64 327.736,63.776 327.68,63.58 L326.028,52.968 L325.944,52.968 L321.044,63.972 C320.988,64.14 320.82,64.28 320.568,64.28 L320.064,64.28 C319.812,64.28 319.672,64.14 319.588,63.972 L314.632,52.968 L314.548,52.968 L312.924,63.58 C312.896,63.776 312.672,64 312.42,64 L309.9,64 C309.536,64 309.312,63.748 309.368,63.356 Z M25.268,86.58 L25.268,74.932 C25.268,74.652 25.52,74.4 25.8,74.4 L28.46,74.4 C28.768,74.4 28.992,74.652 28.992,74.932 L28.992,86.384 C28.992,88.764 30.616,90.64 33.052,90.64 C35.488,90.64 37.14,88.764 37.14,86.412 L37.14,74.932 C37.14,74.652 37.364,74.4 37.672,74.4 L40.332,74.4 C40.612,74.4 40.864,74.652 40.864,74.932 L40.864,86.58 C40.864,90.836 37.476,94.28 33.052,94.28 C28.656,94.28 25.268,90.836 25.268,86.58 Z M47.68,93.468 L47.68,74.932 C47.68,74.652 47.904,74.4 48.212,74.4 L54.792,74.4 C58.236,74.4 61.064,77.2 61.064,80.588 C61.064,84.06 58.236,86.888 54.82,86.888 L51.32,86.888 L51.32,93.468 C51.32,93.748 51.068,94 50.788,94 L48.212,94 C47.904,94 47.68,93.748 47.68,93.468 Z M51.32,83.472 L54.568,83.472 C56.136,83.472 57.452,82.212 57.452,80.56 C57.452,79.02 56.136,77.844 54.568,77.844 L51.32,77.844 L51.32,83.472 Z M66.256,93.468 L66.256,74.932 C66.256,74.652 66.48,74.4 66.788,74.4 L69.364,74.4 C69.644,74.4 69.896,74.652 69.896,74.932 L69.896,90.64 L77.036,90.64 C77.344,90.64 77.568,90.892 77.568,91.172 L77.568,93.468 C77.568,93.748 77.344,94 77.036,94 L66.788,94 C66.48,94 66.256,93.748 66.256,93.468 Z M80.8,84.228 C80.8,78.628 85.252,74.12 90.852,74.12 C96.452,74.12 100.932,78.628 100.932,84.228 C100.932,89.828 96.452,94.28 90.852,94.28 C85.252,94.28 80.8,89.828 80.8,84.228 Z M84.44,84.228 C84.44,87.756 87.324,90.64 90.852,90.64 C94.38,90.64 97.292,87.756 97.292,84.228 C97.292,80.7 94.38,77.76 90.852,77.76 C87.324,77.76 84.44,80.7 84.44,84.228 Z M104.388,94 C103.968,94 103.744,93.636 103.912,93.272 L112.62,74.428 C112.704,74.26 112.844,74.12 113.096,74.12 L113.376,74.12 C113.656,74.12 113.768,74.26 113.852,74.428 L122.476,93.272 C122.644,93.636 122.42,94 122,94 L119.564,94 C119.144,94 118.948,93.832 118.752,93.44 L117.38,90.416 L109.008,90.416 L107.636,93.44 C107.524,93.72 107.272,94 106.824,94 L104.388,94 Z M110.38,87.308 L116.008,87.308 L113.208,81.148 L113.124,81.148 L110.38,87.308 Z M127.024,93.468 L127.024,74.932 C127.024,74.652 127.248,74.4 127.528,74.4 L134.164,74.4 C139.568,74.4 143.992,78.796 143.992,84.172 C143.992,89.604 139.568,94 134.164,94 L127.528,94 C127.248,94 127.024,93.748 127.024,93.468 Z M130.636,90.584 L133.828,90.584 C137.468,90.584 140.128,87.84 140.128,84.172 C140.128,80.532 137.468,77.788 133.828,77.788 L130.636,77.788 L130.636,90.584 Z M157.876,93.468 L157.876,74.932 C157.876,74.652 158.1,74.4 158.408,74.4 L169.804,74.4 C170.112,74.4 170.336,74.652 170.336,74.932 L170.336,77.228 C170.336,77.508 170.112,77.76 169.804,77.76 L161.516,77.76 L161.516,83.024 L168.432,83.024 C168.712,83.024 168.964,83.276 168.964,83.556 L168.964,85.852 C168.964,86.132 168.712,86.384 168.432,86.384 L161.516,86.384 L161.516,93.468 C161.516,93.748 161.264,94 160.984,94 L158.408,94 C158.1,94 157.876,93.748 157.876,93.468 Z M175.668,93.468 L175.668,74.932 C175.668,74.652 175.92,74.4 176.2,74.4 L178.804,74.4 C179.084,74.4 179.336,74.652 179.336,74.932 L179.336,93.468 C179.336,93.748 179.084,94 178.804,94 L176.2,94 C175.92,94 175.668,93.748 175.668,93.468 Z M186.432,93.468 L186.432,74.932 C186.432,74.652 186.656,74.4 186.964,74.4 L189.54,74.4 C189.82,74.4 190.072,74.652 190.072,74.932 L190.072,90.64 L197.212,90.64 C197.52,90.64 197.744,90.892 197.744,91.172 L197.744,93.468 C197.744,93.748 197.52,94 197.212,94 L186.964,94 C186.656,94 186.432,93.748 186.432,93.468 Z M202.572,93.468 L202.572,74.932 C202.572,74.652 202.796,74.4 203.104,74.4 L214.5,74.4 C214.808,74.4 215.032,74.652 215.032,74.932 L215.032,77.228 C215.032,77.508 214.808,77.76 214.5,77.76 L206.212,77.76 L206.212,82.352 L213.128,82.352 C213.408,82.352 213.66,82.604 213.66,82.884 L213.66,85.208 C213.66,85.516 213.408,85.74 213.128,85.74 L206.212,85.74 L206.212,90.64 L214.5,90.64 C214.808,90.64 215.032,90.892 215.032,91.172 L215.032,93.468 C215.032,93.748 214.808,94 214.5,94 L203.104,94 C202.796,94 202.572,93.748 202.572,93.468 Z M228.216,92.096 C227.964,91.844 227.824,91.704 228.076,91.256 L229.084,89.52 C229.308,89.128 229.784,89.128 230.036,89.324 C230.176,89.408 232.444,91.06 234.264,91.06 C235.72,91.06 236.812,90.108 236.812,88.904 C236.812,87.476 235.608,86.496 233.256,85.544 C230.624,84.48 227.992,82.8 227.992,79.496 C227.992,77.004 229.84,74.12 234.292,74.12 C237.148,74.12 239.332,75.576 239.892,75.996 C240.172,76.164 240.256,76.64 240.06,76.92 L238.996,78.516 C238.772,78.852 238.352,79.076 238.016,78.852 C237.792,78.712 235.664,77.312 234.124,77.312 C232.528,77.312 231.66,78.376 231.66,79.272 C231.66,80.588 232.696,81.484 234.964,82.408 C237.68,83.5 240.816,85.124 240.816,88.736 C240.816,91.62 238.324,94.28 234.376,94.28 C230.848,94.28 228.776,92.628 228.216,92.096 Z M246.4,93.468 L246.4,74.932 C246.4,74.652 246.652,74.4 246.932,74.4 L249.536,74.4 C249.816,74.4 250.068,74.652 250.068,74.932 L250.068,93.468 C250.068,93.748 249.816,94 249.536,94 L246.932,94 C246.652,94 246.4,93.748 246.4,93.468 Z M255.316,93.468 L255.316,92.964 L263.66,77.9 L263.66,77.788 L256.66,77.788 C256.38,77.788 256.128,77.536 256.128,77.256 L256.128,74.932 C256.128,74.652 256.38,74.4 256.66,74.4 L268.364,74.4 C268.644,74.4 268.896,74.652 268.896,74.932 L268.896,75.296 L260.664,90.556 L260.664,90.612 L267.804,90.612 C268.112,90.612 268.336,90.864 268.336,91.144 L268.336,93.468 C268.336,93.748 268.112,94 267.804,94 L255.848,94 C255.568,94 255.316,93.748 255.316,93.468 Z M274.228,93.468 L274.228,74.932 C274.228,74.652 274.452,74.4 274.76,74.4 L286.156,74.4 C286.464,74.4 286.688,74.652 286.688,74.932 L286.688,77.228 C286.688,77.508 286.464,77.76 286.156,77.76 L277.868,77.76 L277.868,82.352 L284.784,82.352 C285.064,82.352 285.316,82.604 285.316,82.884 L285.316,85.208 C285.316,85.516 285.064,85.74 284.784,85.74 L277.868,85.74 L277.868,90.64 L286.156,90.64 C286.464,90.64 286.688,90.892 286.688,91.172 L286.688,93.468 C286.688,93.748 286.464,94 286.156,94 L274.76,94 C274.452,94 274.228,93.748 274.228,93.468 Z" id="INCREASEMAXIMUMUPLOADFILESIZE"></path>
|
| 9 |
+
</g>
|
| 10 |
+
</g>
|
| 11 |
+
</svg>
|
assets/img/mini-imagify.svg
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="65px" height="65px" viewBox="0 0 65 65" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>Group 3 Copy</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<defs>
|
| 7 |
+
<rect id="path-1" x="0" y="0" width="65" height="65"></rect>
|
| 8 |
+
</defs>
|
| 9 |
+
<g id="Plugin-HeartBeat" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
| 10 |
+
<g id="About-Us-VS" transform="translate(-450.000000, -549.000000)">
|
| 11 |
+
<g id="Group-3-Copy" transform="translate(450.000000, 549.000000)">
|
| 12 |
+
<g id="Bitmap">
|
| 13 |
+
<mask id="mask-2" fill="white">
|
| 14 |
+
<use xlink:href="#path-1"></use>
|
| 15 |
+
</mask>
|
| 16 |
+
<use id="Mask" fill="#000000" xlink:href="#path-1"></use>
|
| 17 |
+
<image mask="url(#mask-2)" x="-8" y="-6" width="78" height="76" xlink:href="data:image/png;base64,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"></image>
|
| 18 |
+
</g>
|
| 19 |
+
</g>
|
| 20 |
+
</g>
|
| 21 |
+
</g>
|
| 22 |
+
</svg>
|
assets/img/optimize.svg
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="48px" height="60px" viewBox="0 0 48 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>Shape</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<g id="Plugin-Increase-File" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
| 7 |
+
<g id="IFM----More-Optimization-V2" transform="translate(-629.000000, -750.000000)" fill="#FFFFFF">
|
| 8 |
+
<g id="Group-4" transform="translate(171.000000, 667.000000)">
|
| 9 |
+
<path d="M484.820619,83.0374766 C484.721649,83.0374766 484.721649,83.0374766 484.820619,83.0374766 L461.958763,83.0374766 C459.781443,83.0374766 458,84.8363523 458,87.0349781 L458,135.404747 C458,137.603373 459.781443,139.402249 461.958763,139.402249 L463.938144,139.402249 L463.938144,140.001874 C463.938144,141.600874 465.224742,143 466.907216,143 L503.030928,143 C504.614433,143 506,141.600874 506,140.001874 L506,126.710181 C506,125.111181 504.614433,123.712055 503.030928,123.712055 L500.358763,123.712055 L500.358763,98.32792 C500.457732,98.128045 500.358763,97.8282324 500.259794,97.6283573 L500.259794,97.6283573 C500.259794,97.5284197 500.160825,97.5284197 500.160825,97.4284822 L500.160825,97.4284822 C500.160825,97.4284822 500.160825,97.4284822 500.061856,97.4284822 L500.061856,97.4284822 C500.061856,97.4284822 500.061856,97.4284822 499.962887,97.4284822 L499.962887,97.4284822 L485.513402,83.4372267 C485.513402,83.4372267 485.513402,83.4372267 485.414433,83.3372892 C485.315464,83.0374766 485.117526,82.937539 484.820619,83.0374766 L484.820619,83.0374766 L484.820619,83.0374766 Z M461.958763,85.0362274 L483.929897,85.0362274 L483.929897,95.0299813 C483.929897,97.2286071 485.71134,99.0274828 487.88866,99.0274828 L498.379381,99.0274828 L498.379381,123.712055 L466.907216,123.712055 C465.323711,123.712055 463.938144,125.111181 463.938144,126.710181 L463.938144,137.403498 L461.958763,137.403498 C460.870103,137.403498 459.979381,136.50406 459.979381,135.404747 L459.979381,87.0349781 C459.979381,85.9356652 460.870103,85.0362274 461.958763,85.0362274 L461.958763,85.0362274 Z M485.909278,86.3354154 L496.004124,96.1292942 L496.894845,97.028732 L487.88866,97.028732 C486.8,97.028732 485.909278,96.1292942 485.909278,95.0299813 L485.909278,86.3354154 L485.909278,86.3354154 Z M468.985567,100.126796 C466.808247,100.126796 465.026804,101.925671 465.026804,104.124297 C465.026804,106.322923 466.808247,108.121799 468.985567,108.121799 C471.162887,108.121799 472.94433,106.322923 472.94433,104.124297 C472.94433,101.925671 471.162887,100.126796 468.985567,100.126796 L468.985567,100.126796 Z M468.985567,102.125547 C470.074227,102.125547 470.964948,103.024984 470.964948,104.124297 C470.964948,105.22361 470.074227,106.123048 468.985567,106.123048 C467.896907,106.123048 467.006186,105.22361 467.006186,104.124297 C467.006186,102.925047 467.896907,102.125547 468.985567,102.125547 L468.985567,102.125547 Z M474.923711,108.621487 C474.626804,108.621487 474.428866,108.821362 474.230928,109.021237 L464.630928,120.713929 C464.334021,121.113679 464.334021,121.813242 464.828866,122.113054 C465.224742,122.412867 465.917526,122.412867 466.214433,122.013117 L475.02268,111.3198 L483.731959,122.013117 C484.127835,122.412867 484.721649,122.512804 485.117526,122.113054 C485.513402,121.713304 485.612371,121.113679 485.216495,120.713929 L485.216495,120.713929 L483.435052,118.515303 L486.503093,115.317302 L491.847423,122.013117 C492.14433,122.412867 492.837113,122.512804 493.23299,122.212992 C493.628866,121.913179 493.727835,121.213616 493.430928,120.813866 L493.430928,120.813866 L487.393814,113.218613 C487.195876,112.918801 486.898969,112.818863 486.503093,112.818863 C486.305155,112.818863 486.008247,112.918801 485.909278,113.118676 L482.247423,117.01624 L475.715464,109.021237 C475.715464,108.721424 475.418557,108.621487 474.923711,108.621487 L474.923711,108.621487 L474.923711,108.621487 L474.923711,108.621487 Z M466.907216,125.710806 L503.030928,125.710806 C503.624742,125.710806 504.020619,126.110556 504.020619,126.710181 L504.020619,140.001874 C504.020619,140.601499 503.624742,141.001249 503.030928,141.001249 L466.907216,141.001249 C466.313402,141.001249 465.917526,140.601499 465.917526,140.001874 L465.917526,126.710181 C465.917526,126.110556 466.313402,125.710806 466.907216,125.710806 L466.907216,125.710806 Z M491.154639,129.408495 C490.659794,129.408495 490.263918,129.60837 489.868041,129.808245 C489.274227,130.108057 488.779381,130.607745 488.383505,131.20737 C488.086598,131.806996 487.88866,132.506558 487.88866,133.306059 C487.88866,134.005621 488.086598,134.705184 488.383505,135.404747 C488.680412,136.004372 489.076289,136.50406 489.670103,136.803873 C490.263918,137.103685 490.956701,137.30356 491.748454,137.30356 C492.342268,137.30356 493.035052,137.203623 493.628866,137.003748 C494.22268,136.803873 494.717526,136.50406 495.014433,136.204247 L495.014433,133.106184 L491.748454,133.106184 L491.748454,134.405372 L493.430928,134.405372 L493.430928,135.404747 C493.23299,135.604622 492.936082,135.70456 492.639175,135.904435 C492.342268,136.004372 492.045361,136.10431 491.649485,136.10431 C490.956701,136.10431 490.461856,135.904435 490.065979,135.404747 C489.670103,134.905059 489.472165,134.205497 489.472165,133.306059 C489.472165,132.506558 489.670103,131.806996 490.065979,131.407245 C490.461856,131.007495 490.956701,130.707683 491.649485,130.707683 C492.045361,130.707683 492.441237,130.80762 492.738144,131.007495 C493.035052,131.20737 493.23299,131.507183 493.331959,131.906933 L494.816495,131.607121 C494.618557,130.907558 494.321649,130.307933 493.826804,129.908182 C493.331959,129.508432 492.540206,129.308557 491.649485,129.308557 C491.451546,129.408495 491.352577,129.408495 491.154639,129.408495 L491.154639,129.408495 L491.154639,129.408495 Z M473.439175,129.508432 L473.439175,137.203623 L474.923711,137.203623 L474.923711,134.305434 L475.913402,134.305434 C476.606186,134.305434 477.101031,134.305434 477.496907,134.205497 C477.793814,134.105559 477.991753,134.005621 478.28866,133.805746 C478.585567,133.605871 478.783505,133.405996 478.981443,133.006246 C479.179381,132.706433 479.179381,132.306683 479.179381,131.806996 C479.179381,131.20737 479.080412,130.707683 478.783505,130.307933 C478.486598,129.908182 478.090722,129.708307 477.694845,129.508432 C477.397938,129.408495 476.804124,129.408495 475.913402,129.408495 L473.439175,129.508432 L473.439175,129.508432 L473.439175,129.508432 Z M480.465979,129.508432 L480.465979,137.203623 L481.851546,137.203623 L481.851546,132.206746 L484.919588,137.203623 L486.503093,137.203623 L486.503093,129.508432 L485.117526,129.508432 L485.117526,134.605247 L481.950515,129.508432 L480.465979,129.508432 L480.465979,129.508432 Z M474.923711,130.907558 L475.616495,130.907558 L476.705155,130.907558 C477.002062,130.907558 477.2,131.107433 477.298969,131.20737 C477.496907,131.407245 477.496907,131.607121 477.496907,131.906933 C477.496907,132.106808 477.397938,132.306683 477.298969,132.506558 C477.2,132.706433 477.002062,132.806371 476.804124,132.906309 C476.606186,133.006246 476.210309,133.006246 475.616495,133.006246 L474.725773,133.006246 L474.725773,130.907558 L474.923711,130.907558 L474.923711,130.907558 Z M470.470103,135.804497 L470.470103,137.30356 L471.954639,137.30356 L471.954639,135.804497 L470.470103,135.804497 L470.470103,135.804497 Z" id="Shape"></path>
|
| 10 |
+
</g>
|
| 11 |
+
</g>
|
| 12 |
+
</g>
|
| 13 |
+
</svg>
|
assets/img/ordi.png
ADDED
|
Binary file
|
assets/img/quality.svg
ADDED
|
@@ -0,0 +1,16 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="56px" height="60px" viewBox="0 0 56 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>Calque_1</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<g id="Plugin-Increase-File" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
| 7 |
+
<g id="IFM----More-Optimization-V2" transform="translate(-838.000000, -750.000000)" fill="#FFFFFF">
|
| 8 |
+
<g id="Group-4" transform="translate(171.000000, 667.000000)">
|
| 9 |
+
<g id="Calque_1" transform="translate(667.000000, 83.000000)">
|
| 10 |
+
<path d="M18.8646716,20.7542857 C18.878128,18.2388603 17.3714397,15.9854678 15.099204,15.1226788 C12.8269682,14.2598899 10.2784568,14.9734854 8.73004517,16.9060741 C7.18163349,18.8386628 6.96673503,21.5741078 8.19297776,23.7424115 C9.41922049,25.9107152 11.8225623,27.0449851 14.1993333,26.5771429 C16.887985,26.0365376 18.8386927,23.601839 18.8646716,20.7542857 L18.8646716,20.7542857 Z M9.69884804,20.7542857 C9.69884804,17.5028571 13.7377451,16 15.7434559,18.4685714 C17.7491667,20.9371429 15.6280588,24.8228571 12.5453088,24.2571429 C10.9158905,23.9454864 9.7272111,22.4770267 9.70983824,20.7542857 L9.69884804,20.7542857 Z" id="Shape"></path>
|
| 11 |
+
<path d="M55.0169216,29.2514286 L41.7847255,20.1085714 L41.7847255,17.1142857 L46.0873873,19.4685714 L44.9279216,12.4285714 L49.8735098,7.44 L43.0431029,6.41142857 L40.0043137,3.55271368e-15 L36.9600294,6.41142857 L30.157098,7.44 L32.7782598,10.1085714 L1.6924902,10.1085714 C1.07801627,10.1080986 0.573143255,10.6129172 0.549509804,11.2514286 L0.549509804,46.8285714 C0.547426645,46.8666359 0.547426645,46.9047927 0.549509804,46.9428571 C0.611493877,47.5325718 1.07855374,47.9866918 1.64852941,48.0114286 L17.430451,48.0114286 L37.7623137,59.7142857 C38.3074206,60.0200081 38.9873424,59.8262634 39.3064363,59.2742857 L55.3411324,30.8342857 C55.6513776,30.3003164 55.5094872,29.6075814 55.0169216,29.2514286 L55.0169216,29.2514286 Z M2.8134902,12.4628571 L35.0752108,12.4628571 L33.9212402,19.4685714 L39.4932696,16.4228571 L39.4932696,41.8114286 L29.0525833,20.2285714 C28.8574985,19.842322 28.4769777,19.595795 28.0575838,19.5839438 C27.6381899,19.5720927 27.2453559,19.7967663 27.0303873,20.1714286 L18.6228873,35.4114286 L12.8200637,29.4 C12.5731987,29.149382 12.231831,29.0261009 11.8887257,29.0636579 C11.5456203,29.1012148 11.2364195,29.2957083 11.0451471,29.5942857 L2.84096569,42.7942857 L2.84096569,12.4628571 L2.8134902,12.4628571 Z M3.76414216,45.6457143 L12.1716422,32.1142857 L18.0623873,38.1885714 C18.3173677,38.4468515 18.6723041,38.5690266 19.0251182,38.5199596 C19.3779323,38.4708927 19.6895217,38.2560218 19.8702745,37.9371429 L27.970049,23.2514286 L38.784402,45.6457143 L3.79161765,45.6457143 L3.76414216,45.6457143 Z M37.8996912,57.0742857 L22.1617304,48.0114286 L40.63625,48.0114286 C41.2558561,47.9880916 41.7538028,47.4727723 41.7792304,46.8285714 L41.7792304,22.9714286 L52.8463578,30.6057143 L37.8996912,57.0742857 Z" id="Shape"></path>
|
| 12 |
+
</g>
|
| 13 |
+
</g>
|
| 14 |
+
</g>
|
| 15 |
+
</g>
|
| 16 |
+
</svg>
|
assets/img/team-2.jpg
ADDED
|
Binary file
|
assets/img/team.jpg
ADDED
|
Binary file
|
assets/img/time.svg
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0" encoding="UTF-8"?>
|
| 2 |
+
<svg width="51px" height="60px" viewBox="0 0 51 60" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
| 3 |
+
<!-- Generator: Sketch 55 (78076) - https://sketchapp.com -->
|
| 4 |
+
<title>Group 3</title>
|
| 5 |
+
<desc>Created with Sketch.</desc>
|
| 6 |
+
<g id="Plugin-Increase-File" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
| 7 |
+
<g id="IFM----More-Optimization-V2" transform="translate(-432.000000, -750.000000)">
|
| 8 |
+
<g id="Group-4" transform="translate(171.000000, 667.000000)">
|
| 9 |
+
<g id="Group-3" transform="translate(261.000000, 83.000000)">
|
| 10 |
+
<g id="Group-2">
|
| 11 |
+
<path d="M32.95875,4.5 C32.95875,3.67157288 32.4221633,3 31.76025,3 L22.17225,3 C21.5103367,3 20.97375,3.67157288 20.97375,4.5 C20.97375,5.32842712 21.5103367,6 22.17225,6 L31.76025,6 C32.4221633,6 32.95875,5.32842712 32.95875,4.5 L32.95875,4.5 Z" id="Shape"></path>
|
| 12 |
+
<polygon id="Shape" fill="#FFFFFF" points="10.4100225 9 2.99625 16.0538793 4.57122751 18 11.985 10.9461207"></polygon>
|
| 13 |
+
<g id="Group">
|
| 14 |
+
<path d="M25.1994503,57.1714286 C37.5648631,57.1714286 47.5890107,46.9379371 47.5890107,34.3142857 C47.5890107,21.6906343 37.5648631,11.4571429 25.1994503,11.4571429 C12.8340375,11.4571429 2.80988984,21.6906343 2.80988984,34.3142857 C2.80988984,40.3763769 5.16878318,46.1901806 9.36764026,50.4767264 C13.5664973,54.7632722 19.2613696,57.1714286 25.1994503,57.1714286 L25.1994503,57.1714286 Z M24.3878287,33.5142857 L37.2954103,20.32 C37.5783756,20.0311252 37.9908066,19.9183068 38.3773444,20.0240423 C38.7638822,20.1297778 39.0658026,20.4380035 39.1693751,20.8326137 C39.2729476,21.227224 39.162437,21.6482681 38.8794717,21.9371429 L25.9718901,35.1257143 C25.5277257,35.5140306 24.8656285,35.4879226 24.4521279,35.0657865 C24.0386274,34.6436505 24.0130534,33.967726 24.3934261,33.5142857 L24.3878287,33.5142857 Z" id="Shape"></path>
|
| 15 |
+
<path d="M25.1994503,59.4571429 C38.8014042,59.7727339 50.0785701,48.7717307 50.3877054,34.8857143 C50.6968407,20.9996979 39.9208822,9.48702006 26.3189283,9.17142857 L26.3189283,6.86285714 L29.6773624,6.86285714 C31.5321743,6.86285714 33.0357964,5.32783343 33.0357964,3.43428571 C33.0357964,1.540738 31.5321743,0.00571428571 29.6773624,0.00571428571 L20.7215382,0.00571428571 C18.8667263,0.00571428571 17.3631041,1.540738 17.3631041,3.43428571 C17.3631041,5.32783343 18.8667263,6.86285714 20.7215382,6.86285714 L24.0799723,6.86285714 L24.0799723,9.17714286 C10.4795641,9.49273443 -0.295141321,21.004133 0.0139939942,34.8885714 C0.323129309,48.7730098 11.5990421,59.7727338 25.1994503,59.4571429 L25.1994503,59.4571429 Z M20.7215382,4.6 C20.1032675,4.6 19.6020602,4.08832543 19.6020602,3.45714286 C19.6020602,2.82596029 20.1032675,2.31428571 20.7215382,2.31428571 L29.6773624,2.31428571 C30.295633,2.31428571 30.7968404,2.82596029 30.7968404,3.45714286 C30.7968404,4.08832543 30.295633,4.6 29.6773624,4.6 L20.7215382,4.6 L20.7215382,4.6 Z M25.1994503,11.4571429 C37.5648631,11.4571429 47.5890107,21.6906343 47.5890107,34.3142857 C47.5890107,46.9379371 37.5648631,57.1714286 25.1994503,57.1714286 C12.8340375,57.1714286 2.80988984,46.9379371 2.80988984,34.3142857 C2.80394787,28.2482352 5.16021781,22.4285577 9.35971909,18.1370671 C13.5592204,13.8455764 19.2574884,11.4342827 25.1994503,11.4342857 L25.1994503,11.4571429 Z" id="Shape" fill="#FFFFFF"></path>
|
| 16 |
+
<path d="M25.9718901,35.1257143 L38.8794717,21.9371429 C39.162437,21.6482681 39.2729476,21.227224 39.1693751,20.8326137 C39.0658026,20.4380035 38.7638822,20.1297778 38.3773444,20.0240423 C37.9908066,19.9183068 37.5783756,20.0311252 37.2954103,20.32 L24.3934261,33.5142857 C24.0130534,33.967726 24.0386274,34.6436505 24.4521279,35.0657865 C24.8656285,35.4879226 25.5277257,35.5140306 25.9718901,35.1257143 L25.9718901,35.1257143 Z" id="Shape" fill="#FFFFFF"></path>
|
| 17 |
+
</g>
|
| 18 |
+
</g>
|
| 19 |
+
</g>
|
| 20 |
+
</g>
|
| 21 |
+
</g>
|
| 22 |
+
</g>
|
| 23 |
+
</svg>
|
assets/js/imagesLoaded.js
ADDED
|
@@ -0,0 +1,496 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
/*!
|
| 2 |
+
* imagesLoaded PACKAGED v4.1.4
|
| 3 |
+
* JavaScript is all like "You images are done yet or what?"
|
| 4 |
+
* MIT License
|
| 5 |
+
*/
|
| 6 |
+
|
| 7 |
+
/**
|
| 8 |
+
* EvEmitter v1.1.0
|
| 9 |
+
* Lil' event emitter
|
| 10 |
+
* MIT License
|
| 11 |
+
*/
|
| 12 |
+
|
| 13 |
+
/* jshint unused: true, undef: true, strict: true */
|
| 14 |
+
|
| 15 |
+
( function( global, factory ) {
|
| 16 |
+
// universal module definition
|
| 17 |
+
/* jshint strict: false */ /* globals define, module, window */
|
| 18 |
+
if ( typeof define == 'function' && define.amd ) {
|
| 19 |
+
// AMD - RequireJS
|
| 20 |
+
define( 'ev-emitter/ev-emitter',factory );
|
| 21 |
+
} else if ( typeof module == 'object' && module.exports ) {
|
| 22 |
+
// CommonJS - Browserify, Webpack
|
| 23 |
+
module.exports = factory();
|
| 24 |
+
} else {
|
| 25 |
+
// Browser globals
|
| 26 |
+
global.EvEmitter = factory();
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
}( typeof window != 'undefined' ? window : this, function() {
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
|
| 33 |
+
function EvEmitter() {}
|
| 34 |
+
|
| 35 |
+
var proto = EvEmitter.prototype;
|
| 36 |
+
|
| 37 |
+
proto.on = function( eventName, listener ) {
|
| 38 |
+
if ( !eventName || !listener ) {
|
| 39 |
+
return;
|
| 40 |
+
}
|
| 41 |
+
// set events hash
|
| 42 |
+
var events = this._events = this._events || {};
|
| 43 |
+
// set listeners array
|
| 44 |
+
var listeners = events[ eventName ] = events[ eventName ] || [];
|
| 45 |
+
// only add once
|
| 46 |
+
if ( listeners.indexOf( listener ) == -1 ) {
|
| 47 |
+
listeners.push( listener );
|
| 48 |
+
}
|
| 49 |
+
|
| 50 |
+
return this;
|
| 51 |
+
};
|
| 52 |
+
|
| 53 |
+
proto.once = function( eventName, listener ) {
|
| 54 |
+
if ( !eventName || !listener ) {
|
| 55 |
+
return;
|
| 56 |
+
}
|
| 57 |
+
// add event
|
| 58 |
+
this.on( eventName, listener );
|
| 59 |
+
// set once flag
|
| 60 |
+
// set onceEvents hash
|
| 61 |
+
var onceEvents = this._onceEvents = this._onceEvents || {};
|
| 62 |
+
// set onceListeners object
|
| 63 |
+
var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
|
| 64 |
+
// set flag
|
| 65 |
+
onceListeners[ listener ] = true;
|
| 66 |
+
|
| 67 |
+
return this;
|
| 68 |
+
};
|
| 69 |
+
|
| 70 |
+
proto.off = function( eventName, listener ) {
|
| 71 |
+
var listeners = this._events && this._events[ eventName ];
|
| 72 |
+
if ( !listeners || !listeners.length ) {
|
| 73 |
+
return;
|
| 74 |
+
}
|
| 75 |
+
var index = listeners.indexOf( listener );
|
| 76 |
+
if ( index != -1 ) {
|
| 77 |
+
listeners.splice( index, 1 );
|
| 78 |
+
}
|
| 79 |
+
|
| 80 |
+
return this;
|
| 81 |
+
};
|
| 82 |
+
|
| 83 |
+
proto.emitEvent = function( eventName, args ) {
|
| 84 |
+
var listeners = this._events && this._events[ eventName ];
|
| 85 |
+
if ( !listeners || !listeners.length ) {
|
| 86 |
+
return;
|
| 87 |
+
}
|
| 88 |
+
// copy over to avoid interference if .off() in listener
|
| 89 |
+
listeners = listeners.slice(0);
|
| 90 |
+
args = args || [];
|
| 91 |
+
// once stuff
|
| 92 |
+
var onceListeners = this._onceEvents && this._onceEvents[ eventName ];
|
| 93 |
+
|
| 94 |
+
for ( var i=0; i < listeners.length; i++ ) {
|
| 95 |
+
var listener = listeners[i]
|
| 96 |
+
var isOnce = onceListeners && onceListeners[ listener ];
|
| 97 |
+
if ( isOnce ) {
|
| 98 |
+
// remove listener
|
| 99 |
+
// remove before trigger to prevent recursion
|
| 100 |
+
this.off( eventName, listener );
|
| 101 |
+
// unset once flag
|
| 102 |
+
delete onceListeners[ listener ];
|
| 103 |
+
}
|
| 104 |
+
// trigger listener
|
| 105 |
+
listener.apply( this, args );
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
return this;
|
| 109 |
+
};
|
| 110 |
+
|
| 111 |
+
proto.allOff = function() {
|
| 112 |
+
delete this._events;
|
| 113 |
+
delete this._onceEvents;
|
| 114 |
+
};
|
| 115 |
+
|
| 116 |
+
return EvEmitter;
|
| 117 |
+
|
| 118 |
+
}));
|
| 119 |
+
|
| 120 |
+
/*!
|
| 121 |
+
* imagesLoaded v4.1.4
|
| 122 |
+
* JavaScript is all like "You images are done yet or what?"
|
| 123 |
+
* MIT License
|
| 124 |
+
*/
|
| 125 |
+
|
| 126 |
+
( function( window, factory ) { 'use strict';
|
| 127 |
+
// universal module definition
|
| 128 |
+
|
| 129 |
+
/*global define: false, module: false, require: false */
|
| 130 |
+
|
| 131 |
+
if ( typeof define == 'function' && define.amd ) {
|
| 132 |
+
// AMD
|
| 133 |
+
define( [
|
| 134 |
+
'ev-emitter/ev-emitter'
|
| 135 |
+
], function( EvEmitter ) {
|
| 136 |
+
return factory( window, EvEmitter );
|
| 137 |
+
});
|
| 138 |
+
} else if ( typeof module == 'object' && module.exports ) {
|
| 139 |
+
// CommonJS
|
| 140 |
+
module.exports = factory(
|
| 141 |
+
window,
|
| 142 |
+
require('ev-emitter')
|
| 143 |
+
);
|
| 144 |
+
} else {
|
| 145 |
+
// browser global
|
| 146 |
+
window.imagesLoaded = factory(
|
| 147 |
+
window,
|
| 148 |
+
window.EvEmitter
|
| 149 |
+
);
|
| 150 |
+
}
|
| 151 |
+
|
| 152 |
+
})( typeof window !== 'undefined' ? window : this,
|
| 153 |
+
|
| 154 |
+
// -------------------------- factory -------------------------- //
|
| 155 |
+
|
| 156 |
+
function factory( window, EvEmitter ) {
|
| 157 |
+
|
| 158 |
+
|
| 159 |
+
|
| 160 |
+
var $ = window.jQuery;
|
| 161 |
+
var console = window.console;
|
| 162 |
+
|
| 163 |
+
// -------------------------- helpers -------------------------- //
|
| 164 |
+
|
| 165 |
+
// extend objects
|
| 166 |
+
function extend( a, b ) {
|
| 167 |
+
for ( var prop in b ) {
|
| 168 |
+
a[ prop ] = b[ prop ];
|
| 169 |
+
}
|
| 170 |
+
return a;
|
| 171 |
+
}
|
| 172 |
+
|
| 173 |
+
var arraySlice = Array.prototype.slice;
|
| 174 |
+
|
| 175 |
+
// turn element or nodeList into an array
|
| 176 |
+
function makeArray( obj ) {
|
| 177 |
+
if ( Array.isArray( obj ) ) {
|
| 178 |
+
// use object if already an array
|
| 179 |
+
return obj;
|
| 180 |
+
}
|
| 181 |
+
|
| 182 |
+
var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
|
| 183 |
+
if ( isArrayLike ) {
|
| 184 |
+
// convert nodeList to array
|
| 185 |
+
return arraySlice.call( obj );
|
| 186 |
+
}
|
| 187 |
+
|
| 188 |
+
// array of single index
|
| 189 |
+
return [ obj ];
|
| 190 |
+
}
|
| 191 |
+
|
| 192 |
+
// -------------------------- imagesLoaded -------------------------- //
|
| 193 |
+
|
| 194 |
+
/**
|
| 195 |
+
* @param {Array, Element, NodeList, String} elem
|
| 196 |
+
* @param {Object or Function} options - if function, use as callback
|
| 197 |
+
* @param {Function} onAlways - callback function
|
| 198 |
+
*/
|
| 199 |
+
function ImagesLoaded( elem, options, onAlways ) {
|
| 200 |
+
// coerce ImagesLoaded() without new, to be new ImagesLoaded()
|
| 201 |
+
if ( !( this instanceof ImagesLoaded ) ) {
|
| 202 |
+
return new ImagesLoaded( elem, options, onAlways );
|
| 203 |
+
}
|
| 204 |
+
// use elem as selector string
|
| 205 |
+
var queryElem = elem;
|
| 206 |
+
if ( typeof elem == 'string' ) {
|
| 207 |
+
queryElem = document.querySelectorAll( elem );
|
| 208 |
+
}
|
| 209 |
+
// bail if bad element
|
| 210 |
+
if ( !queryElem ) {
|
| 211 |
+
console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
|
| 212 |
+
return;
|
| 213 |
+
}
|
| 214 |
+
|
| 215 |
+
this.elements = makeArray( queryElem );
|
| 216 |
+
this.options = extend( {}, this.options );
|
| 217 |
+
// shift arguments if no options set
|
| 218 |
+
if ( typeof options == 'function' ) {
|
| 219 |
+
onAlways = options;
|
| 220 |
+
} else {
|
| 221 |
+
extend( this.options, options );
|
| 222 |
+
}
|
| 223 |
+
|
| 224 |
+
if ( onAlways ) {
|
| 225 |
+
this.on( 'always', onAlways );
|
| 226 |
+
}
|
| 227 |
+
|
| 228 |
+
this.getImages();
|
| 229 |
+
|
| 230 |
+
if ( $ ) {
|
| 231 |
+
// add jQuery Deferred object
|
| 232 |
+
this.jqDeferred = new $.Deferred();
|
| 233 |
+
}
|
| 234 |
+
|
| 235 |
+
// HACK check async to allow time to bind listeners
|
| 236 |
+
setTimeout( this.check.bind( this ) );
|
| 237 |
+
}
|
| 238 |
+
|
| 239 |
+
ImagesLoaded.prototype = Object.create( EvEmitter.prototype );
|
| 240 |
+
|
| 241 |
+
ImagesLoaded.prototype.options = {};
|
| 242 |
+
|
| 243 |
+
ImagesLoaded.prototype.getImages = function() {
|
| 244 |
+
this.images = [];
|
| 245 |
+
|
| 246 |
+
// filter & find items if we have an item selector
|
| 247 |
+
this.elements.forEach( this.addElementImages, this );
|
| 248 |
+
};
|
| 249 |
+
|
| 250 |
+
/**
|
| 251 |
+
* @param {Node} element
|
| 252 |
+
*/
|
| 253 |
+
ImagesLoaded.prototype.addElementImages = function( elem ) {
|
| 254 |
+
// filter siblings
|
| 255 |
+
if ( elem.nodeName == 'IMG' ) {
|
| 256 |
+
this.addImage( elem );
|
| 257 |
+
}
|
| 258 |
+
// get background image on element
|
| 259 |
+
if ( this.options.background === true ) {
|
| 260 |
+
this.addElementBackgroundImages( elem );
|
| 261 |
+
}
|
| 262 |
+
|
| 263 |
+
// find children
|
| 264 |
+
// no non-element nodes, #143
|
| 265 |
+
var nodeType = elem.nodeType;
|
| 266 |
+
if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
|
| 267 |
+
return;
|
| 268 |
+
}
|
| 269 |
+
var childImgs = elem.querySelectorAll('img');
|
| 270 |
+
// concat childElems to filterFound array
|
| 271 |
+
for ( var i=0; i < childImgs.length; i++ ) {
|
| 272 |
+
var img = childImgs[i];
|
| 273 |
+
this.addImage( img );
|
| 274 |
+
}
|
| 275 |
+
|
| 276 |
+
// get child background images
|
| 277 |
+
if ( typeof this.options.background == 'string' ) {
|
| 278 |
+
var children = elem.querySelectorAll( this.options.background );
|
| 279 |
+
for ( i=0; i < children.length; i++ ) {
|
| 280 |
+
var child = children[i];
|
| 281 |
+
this.addElementBackgroundImages( child );
|
| 282 |
+
}
|
| 283 |
+
}
|
| 284 |
+
};
|
| 285 |
+
|
| 286 |
+
var elementNodeTypes = {
|
| 287 |
+
1: true,
|
| 288 |
+
9: true,
|
| 289 |
+
11: true
|
| 290 |
+
};
|
| 291 |
+
|
| 292 |
+
ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
|
| 293 |
+
var style = getComputedStyle( elem );
|
| 294 |
+
if ( !style ) {
|
| 295 |
+
// Firefox returns null if in a hidden iframe https://bugzil.la/548397
|
| 296 |
+
return;
|
| 297 |
+
}
|
| 298 |
+
// get url inside url("...")
|
| 299 |
+
var reURL = /url\((['"])?(.*?)\1\)/gi;
|
| 300 |
+
var matches = reURL.exec( style.backgroundImage );
|
| 301 |
+
while ( matches !== null ) {
|
| 302 |
+
var url = matches && matches[2];
|
| 303 |
+
if ( url ) {
|
| 304 |
+
this.addBackground( url, elem );
|
| 305 |
+
}
|
| 306 |
+
matches = reURL.exec( style.backgroundImage );
|
| 307 |
+
}
|
| 308 |
+
};
|
| 309 |
+
|
| 310 |
+
/**
|
| 311 |
+
* @param {Image} img
|
| 312 |
+
*/
|
| 313 |
+
ImagesLoaded.prototype.addImage = function( img ) {
|
| 314 |
+
var loadingImage = new LoadingImage( img );
|
| 315 |
+
this.images.push( loadingImage );
|
| 316 |
+
};
|
| 317 |
+
|
| 318 |
+
ImagesLoaded.prototype.addBackground = function( url, elem ) {
|
| 319 |
+
var background = new Background( url, elem );
|
| 320 |
+
this.images.push( background );
|
| 321 |
+
};
|
| 322 |
+
|
| 323 |
+
ImagesLoaded.prototype.check = function() {
|
| 324 |
+
var _this = this;
|
| 325 |
+
this.progressedCount = 0;
|
| 326 |
+
this.hasAnyBroken = false;
|
| 327 |
+
// complete if no images
|
| 328 |
+
if ( !this.images.length ) {
|
| 329 |
+
this.complete();
|
| 330 |
+
return;
|
| 331 |
+
}
|
| 332 |
+
|
| 333 |
+
function onProgress( image, elem, message ) {
|
| 334 |
+
// HACK - Chrome triggers event before object properties have changed. #83
|
| 335 |
+
setTimeout( function() {
|
| 336 |
+
_this.progress( image, elem, message );
|
| 337 |
+
});
|
| 338 |
+
}
|
| 339 |
+
|
| 340 |
+
this.images.forEach( function( loadingImage ) {
|
| 341 |
+
loadingImage.once( 'progress', onProgress );
|
| 342 |
+
loadingImage.check();
|
| 343 |
+
});
|
| 344 |
+
};
|
| 345 |
+
|
| 346 |
+
ImagesLoaded.prototype.progress = function( image, elem, message ) {
|
| 347 |
+
this.progressedCount++;
|
| 348 |
+
this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
|
| 349 |
+
// progress event
|
| 350 |
+
this.emitEvent( 'progress', [ this, image, elem ] );
|
| 351 |
+
if ( this.jqDeferred && this.jqDeferred.notify ) {
|
| 352 |
+
this.jqDeferred.notify( this, image );
|
| 353 |
+
}
|
| 354 |
+
// check if completed
|
| 355 |
+
if ( this.progressedCount == this.images.length ) {
|
| 356 |
+
this.complete();
|
| 357 |
+
}
|
| 358 |
+
|
| 359 |
+
if ( this.options.debug && console ) {
|
| 360 |
+
console.log( 'progress: ' + message, image, elem );
|
| 361 |
+
}
|
| 362 |
+
};
|
| 363 |
+
|
| 364 |
+
ImagesLoaded.prototype.complete = function() {
|
| 365 |
+
var eventName = this.hasAnyBroken ? 'fail' : 'done';
|
| 366 |
+
this.isComplete = true;
|
| 367 |
+
this.emitEvent( eventName, [ this ] );
|
| 368 |
+
this.emitEvent( 'always', [ this ] );
|
| 369 |
+
if ( this.jqDeferred ) {
|
| 370 |
+
var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
|
| 371 |
+
this.jqDeferred[ jqMethod ]( this );
|
| 372 |
+
}
|
| 373 |
+
};
|
| 374 |
+
|
| 375 |
+
// -------------------------- -------------------------- //
|
| 376 |
+
|
| 377 |
+
function LoadingImage( img ) {
|
| 378 |
+
this.img = img;
|
| 379 |
+
}
|
| 380 |
+
|
| 381 |
+
LoadingImage.prototype = Object.create( EvEmitter.prototype );
|
| 382 |
+
|
| 383 |
+
LoadingImage.prototype.check = function() {
|
| 384 |
+
// If complete is true and browser supports natural sizes,
|
| 385 |
+
// try to check for image status manually.
|
| 386 |
+
var isComplete = this.getIsImageComplete();
|
| 387 |
+
if ( isComplete ) {
|
| 388 |
+
// report based on naturalWidth
|
| 389 |
+
this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
|
| 390 |
+
return;
|
| 391 |
+
}
|
| 392 |
+
|
| 393 |
+
// If none of the checks above matched, simulate loading on detached element.
|
| 394 |
+
this.proxyImage = new Image();
|
| 395 |
+
this.proxyImage.addEventListener( 'load', this );
|
| 396 |
+
this.proxyImage.addEventListener( 'error', this );
|
| 397 |
+
// bind to image as well for Firefox. #191
|
| 398 |
+
this.img.addEventListener( 'load', this );
|
| 399 |
+
this.img.addEventListener( 'error', this );
|
| 400 |
+
this.proxyImage.src = this.img.src;
|
| 401 |
+
};
|
| 402 |
+
|
| 403 |
+
LoadingImage.prototype.getIsImageComplete = function() {
|
| 404 |
+
// check for non-zero, non-undefined naturalWidth
|
| 405 |
+
// fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
|
| 406 |
+
return this.img.complete && this.img.naturalWidth;
|
| 407 |
+
};
|
| 408 |
+
|
| 409 |
+
LoadingImage.prototype.confirm = function( isLoaded, message ) {
|
| 410 |
+
this.isLoaded = isLoaded;
|
| 411 |
+
this.emitEvent( 'progress', [ this, this.img, message ] );
|
| 412 |
+
};
|
| 413 |
+
|
| 414 |
+
// ----- events ----- //
|
| 415 |
+
|
| 416 |
+
// trigger specified handler for event type
|
| 417 |
+
LoadingImage.prototype.handleEvent = function( event ) {
|
| 418 |
+
var method = 'on' + event.type;
|
| 419 |
+
if ( this[ method ] ) {
|
| 420 |
+
this[ method ]( event );
|
| 421 |
+
}
|
| 422 |
+
};
|
| 423 |
+
|
| 424 |
+
LoadingImage.prototype.onload = function() {
|
| 425 |
+
this.confirm( true, 'onload' );
|
| 426 |
+
this.unbindEvents();
|
| 427 |
+
};
|
| 428 |
+
|
| 429 |
+
LoadingImage.prototype.onerror = function() {
|
| 430 |
+
this.confirm( false, 'onerror' );
|
| 431 |
+
this.unbindEvents();
|
| 432 |
+
};
|
| 433 |
+
|
| 434 |
+
LoadingImage.prototype.unbindEvents = function() {
|
| 435 |
+
this.proxyImage.removeEventListener( 'load', this );
|
| 436 |
+
this.proxyImage.removeEventListener( 'error', this );
|
| 437 |
+
this.img.removeEventListener( 'load', this );
|
| 438 |
+
this.img.removeEventListener( 'error', this );
|
| 439 |
+
};
|
| 440 |
+
|
| 441 |
+
// -------------------------- Background -------------------------- //
|
| 442 |
+
|
| 443 |
+
function Background( url, element ) {
|
| 444 |
+
this.url = url;
|
| 445 |
+
this.element = element;
|
| 446 |
+
this.img = new Image();
|
| 447 |
+
}
|
| 448 |
+
|
| 449 |
+
// inherit LoadingImage prototype
|
| 450 |
+
Background.prototype = Object.create( LoadingImage.prototype );
|
| 451 |
+
|
| 452 |
+
Background.prototype.check = function() {
|
| 453 |
+
this.img.addEventListener( 'load', this );
|
| 454 |
+
this.img.addEventListener( 'error', this );
|
| 455 |
+
this.img.src = this.url;
|
| 456 |
+
// check if image is already complete
|
| 457 |
+
var isComplete = this.getIsImageComplete();
|
| 458 |
+
if ( isComplete ) {
|
| 459 |
+
this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
|
| 460 |
+
this.unbindEvents();
|
| 461 |
+
}
|
| 462 |
+
};
|
| 463 |
+
|
| 464 |
+
Background.prototype.unbindEvents = function() {
|
| 465 |
+
this.img.removeEventListener( 'load', this );
|
| 466 |
+
this.img.removeEventListener( 'error', this );
|
| 467 |
+
};
|
| 468 |
+
|
| 469 |
+
Background.prototype.confirm = function( isLoaded, message ) {
|
| 470 |
+
this.isLoaded = isLoaded;
|
| 471 |
+
this.emitEvent( 'progress', [ this, this.element, message ] );
|
| 472 |
+
};
|
| 473 |
+
|
| 474 |
+
// -------------------------- jQuery -------------------------- //
|
| 475 |
+
|
| 476 |
+
ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
|
| 477 |
+
jQuery = jQuery || window.jQuery;
|
| 478 |
+
if ( !jQuery ) {
|
| 479 |
+
return;
|
| 480 |
+
}
|
| 481 |
+
// set local variable
|
| 482 |
+
$ = jQuery;
|
| 483 |
+
// $().imagesLoaded()
|
| 484 |
+
$.fn.imagesLoaded = function( options, callback ) {
|
| 485 |
+
var instance = new ImagesLoaded( this, options, callback );
|
| 486 |
+
return instance.jqDeferred.promise( $(this) );
|
| 487 |
+
};
|
| 488 |
+
};
|
| 489 |
+
// try making plugin
|
| 490 |
+
ImagesLoaded.makeJQueryPlugin();
|
| 491 |
+
|
| 492 |
+
// -------------------------- -------------------------- //
|
| 493 |
+
|
| 494 |
+
return ImagesLoaded;
|
| 495 |
+
|
| 496 |
+
});
|
assets/js/jquery.event.move.js
ADDED
|
@@ -0,0 +1,599 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
// DOM.event.move
|
| 2 |
+
//
|
| 3 |
+
// 2.0.0
|
| 4 |
+
//
|
| 5 |
+
// Stephen Band
|
| 6 |
+
//
|
| 7 |
+
// Triggers 'movestart', 'move' and 'moveend' events after
|
| 8 |
+
// mousemoves following a mousedown cross a distance threshold,
|
| 9 |
+
// similar to the native 'dragstart', 'drag' and 'dragend' events.
|
| 10 |
+
// Move events are throttled to animation frames. Move event objects
|
| 11 |
+
// have the properties:
|
| 12 |
+
//
|
| 13 |
+
// pageX:
|
| 14 |
+
// pageY: Page coordinates of pointer.
|
| 15 |
+
// startX:
|
| 16 |
+
// startY: Page coordinates of pointer at movestart.
|
| 17 |
+
// distX:
|
| 18 |
+
// distY: Distance the pointer has moved since movestart.
|
| 19 |
+
// deltaX:
|
| 20 |
+
// deltaY: Distance the finger has moved since last event.
|
| 21 |
+
// velocityX:
|
| 22 |
+
// velocityY: Average velocity over last few events.
|
| 23 |
+
|
| 24 |
+
|
| 25 |
+
(function(fn) {
|
| 26 |
+
if (typeof define === 'function' && define.amd) {
|
| 27 |
+
define([], fn);
|
| 28 |
+
} else if ((typeof module !== "undefined" && module !== null) && module.exports) {
|
| 29 |
+
module.exports = fn;
|
| 30 |
+
} else {
|
| 31 |
+
fn();
|
| 32 |
+
}
|
| 33 |
+
})(function(){
|
| 34 |
+
var assign = Object.assign || window.jQuery && jQuery.extend;
|
| 35 |
+
|
| 36 |
+
// Number of pixels a pressed pointer travels before movestart
|
| 37 |
+
// event is fired.
|
| 38 |
+
var threshold = 8;
|
| 39 |
+
|
| 40 |
+
// Shim for requestAnimationFrame, falling back to timer. See:
|
| 41 |
+
// see http://paulirish.com/2011/requestanimationframe-for-smart-animating/
|
| 42 |
+
var requestFrame = (function(){
|
| 43 |
+
return (
|
| 44 |
+
window.requestAnimationFrame ||
|
| 45 |
+
window.webkitRequestAnimationFrame ||
|
| 46 |
+
window.mozRequestAnimationFrame ||
|
| 47 |
+
window.oRequestAnimationFrame ||
|
| 48 |
+
window.msRequestAnimationFrame ||
|
| 49 |
+
function(fn, element){
|
| 50 |
+
return window.setTimeout(function(){
|
| 51 |
+
fn();
|
| 52 |
+
}, 25);
|
| 53 |
+
}
|
| 54 |
+
);
|
| 55 |
+
})();
|
| 56 |
+
|
| 57 |
+
// Shim for customEvent
|
| 58 |
+
// see https://developer.mozilla.org/en-US/docs/Web/API/CustomEvent/CustomEvent#Polyfill
|
| 59 |
+
(function () {
|
| 60 |
+
if ( typeof window.CustomEvent === "function" ) return false;
|
| 61 |
+
function CustomEvent ( event, params ) {
|
| 62 |
+
params = params || { bubbles: false, cancelable: false, detail: undefined };
|
| 63 |
+
var evt = document.createEvent( 'CustomEvent' );
|
| 64 |
+
evt.initCustomEvent( event, params.bubbles, params.cancelable, params.detail );
|
| 65 |
+
return evt;
|
| 66 |
+
}
|
| 67 |
+
|
| 68 |
+
CustomEvent.prototype = window.Event.prototype;
|
| 69 |
+
window.CustomEvent = CustomEvent;
|
| 70 |
+
})();
|
| 71 |
+
|
| 72 |
+
var ignoreTags = {
|
| 73 |
+
textarea: true,
|
| 74 |
+
input: true,
|
| 75 |
+
select: true,
|
| 76 |
+
button: true
|
| 77 |
+
};
|
| 78 |
+
|
| 79 |
+
var mouseevents = {
|
| 80 |
+
move: 'mousemove',
|
| 81 |
+
cancel: 'mouseup dragstart',
|
| 82 |
+
end: 'mouseup'
|
| 83 |
+
};
|
| 84 |
+
|
| 85 |
+
var touchevents = {
|
| 86 |
+
move: 'touchmove',
|
| 87 |
+
cancel: 'touchend',
|
| 88 |
+
end: 'touchend'
|
| 89 |
+
};
|
| 90 |
+
|
| 91 |
+
var rspaces = /\s+/;
|
| 92 |
+
|
| 93 |
+
|
| 94 |
+
// DOM Events
|
| 95 |
+
|
| 96 |
+
var eventOptions = { bubbles: true, cancelable: true };
|
| 97 |
+
|
| 98 |
+
var eventsSymbol = typeof Symbol === "function" ? Symbol('events') : {};
|
| 99 |
+
|
| 100 |
+
function createEvent(type) {
|
| 101 |
+
return new CustomEvent(type, eventOptions);
|
| 102 |
+
}
|
| 103 |
+
|
| 104 |
+
function getEvents(node) {
|
| 105 |
+
return node[eventsSymbol] || (node[eventsSymbol] = {});
|
| 106 |
+
}
|
| 107 |
+
|
| 108 |
+
function on(node, types, fn, data, selector) {
|
| 109 |
+
types = types.split(rspaces);
|
| 110 |
+
|
| 111 |
+
var events = getEvents(node);
|
| 112 |
+
var i = types.length;
|
| 113 |
+
var handlers, type;
|
| 114 |
+
|
| 115 |
+
function handler(e) { fn(e, data); }
|
| 116 |
+
|
| 117 |
+
while (i--) {
|
| 118 |
+
type = types[i];
|
| 119 |
+
handlers = events[type] || (events[type] = []);
|
| 120 |
+
handlers.push([fn, handler]);
|
| 121 |
+
node.addEventListener(type, handler);
|
| 122 |
+
}
|
| 123 |
+
}
|
| 124 |
+
|
| 125 |
+
function off(node, types, fn, selector) {
|
| 126 |
+
types = types.split(rspaces);
|
| 127 |
+
|
| 128 |
+
var events = getEvents(node);
|
| 129 |
+
var i = types.length;
|
| 130 |
+
var type, handlers, k;
|
| 131 |
+
|
| 132 |
+
if (!events) { return; }
|
| 133 |
+
|
| 134 |
+
while (i--) {
|
| 135 |
+
type = types[i];
|
| 136 |
+
handlers = events[type];
|
| 137 |
+
if (!handlers) { continue; }
|
| 138 |
+
k = handlers.length;
|
| 139 |
+
while (k--) {
|
| 140 |
+
if (handlers[k][0] === fn) {
|
| 141 |
+
node.removeEventListener(type, handlers[k][1]);
|
| 142 |
+
handlers.splice(k, 1);
|
| 143 |
+
}
|
| 144 |
+
}
|
| 145 |
+
}
|
| 146 |
+
}
|
| 147 |
+
|
| 148 |
+
function trigger(node, type, properties) {
|
| 149 |
+
// Don't cache events. It prevents you from triggering an event of a
|
| 150 |
+
// given type from inside the handler of another event of that type.
|
| 151 |
+
var event = createEvent(type);
|
| 152 |
+
if (properties) { assign(event, properties); }
|
| 153 |
+
node.dispatchEvent(event);
|
| 154 |
+
}
|
| 155 |
+
|
| 156 |
+
|
| 157 |
+
// Constructors
|
| 158 |
+
|
| 159 |
+
function Timer(fn){
|
| 160 |
+
var callback = fn,
|
| 161 |
+
active = false,
|
| 162 |
+
running = false;
|
| 163 |
+
|
| 164 |
+
function trigger(time) {
|
| 165 |
+
if (active){
|
| 166 |
+
callback();
|
| 167 |
+
requestFrame(trigger);
|
| 168 |
+
running = true;
|
| 169 |
+
active = false;
|
| 170 |
+
}
|
| 171 |
+
else {
|
| 172 |
+
running = false;
|
| 173 |
+
}
|
| 174 |
+
}
|
| 175 |
+
|
| 176 |
+
this.kick = function(fn) {
|
| 177 |
+
active = true;
|
| 178 |
+
if (!running) { trigger(); }
|
| 179 |
+
};
|
| 180 |
+
|
| 181 |
+
this.end = function(fn) {
|
| 182 |
+
var cb = callback;
|
| 183 |
+
|
| 184 |
+
if (!fn) { return; }
|
| 185 |
+
|
| 186 |
+
// If the timer is not running, simply call the end callback.
|
| 187 |
+
if (!running) {
|
| 188 |
+
fn();
|
| 189 |
+
}
|
| 190 |
+
// If the timer is running, and has been kicked lately, then
|
| 191 |
+
// queue up the current callback and the end callback, otherwise
|
| 192 |
+
// just the end callback.
|
| 193 |
+
else {
|
| 194 |
+
callback = active ?
|
| 195 |
+
function(){ cb(); fn(); } :
|
| 196 |
+
fn ;
|
| 197 |
+
|
| 198 |
+
active = true;
|
| 199 |
+
}
|
| 200 |
+
};
|
| 201 |
+
}
|
| 202 |
+
|
| 203 |
+
|
| 204 |
+
// Functions
|
| 205 |
+
|
| 206 |
+
function noop() {}
|
| 207 |
+
|
| 208 |
+
function preventDefault(e) {
|
| 209 |
+
e.preventDefault();
|
| 210 |
+
}
|
| 211 |
+
|
| 212 |
+
function isIgnoreTag(e) {
|
| 213 |
+
return !!ignoreTags[e.target.tagName.toLowerCase()];
|
| 214 |
+
}
|
| 215 |
+
|
| 216 |
+
function isPrimaryButton(e) {
|
| 217 |
+
// Ignore mousedowns on any button other than the left (or primary)
|
| 218 |
+
// mouse button, or when a modifier key is pressed.
|
| 219 |
+
return (e.which === 1 && !e.ctrlKey && !e.altKey);
|
| 220 |
+
}
|
| 221 |
+
|
| 222 |
+
function identifiedTouch(touchList, id) {
|
| 223 |
+
var i, l;
|
| 224 |
+
|
| 225 |
+
if (touchList.identifiedTouch) {
|
| 226 |
+
return touchList.identifiedTouch(id);
|
| 227 |
+
}
|
| 228 |
+
|
| 229 |
+
// touchList.identifiedTouch() does not exist in
|
| 230 |
+
// webkit yet… we must do the search ourselves...
|
| 231 |
+
|
| 232 |
+
i = -1;
|
| 233 |
+
l = touchList.length;
|
| 234 |
+
|
| 235 |
+
while (++i < l) {
|
| 236 |
+
if (touchList[i].identifier === id) {
|
| 237 |
+
return touchList[i];
|
| 238 |
+
}
|
| 239 |
+
}
|
| 240 |
+
}
|
| 241 |
+
|
| 242 |
+
function changedTouch(e, data) {
|
| 243 |
+
var touch = identifiedTouch(e.changedTouches, data.identifier);
|
| 244 |
+
|
| 245 |
+
// This isn't the touch you're looking for.
|
| 246 |
+
if (!touch) { return; }
|
| 247 |
+
|
| 248 |
+
// Chrome Android (at least) includes touches that have not
|
| 249 |
+
// changed in e.changedTouches. That's a bit annoying. Check
|
| 250 |
+
// that this touch has changed.
|
| 251 |
+
if (touch.pageX === data.pageX && touch.pageY === data.pageY) { return; }
|
| 252 |
+
|
| 253 |
+
return touch;
|
| 254 |
+
}
|
| 255 |
+
|
| 256 |
+
|
| 257 |
+
// Handlers that decide when the first movestart is triggered
|
| 258 |
+
|
| 259 |
+
function mousedown(e){
|
| 260 |
+
// Ignore non-primary buttons
|
| 261 |
+
if (!isPrimaryButton(e)) { return; }
|
| 262 |
+
|
| 263 |
+
// Ignore form and interactive elements
|
| 264 |
+
if (isIgnoreTag(e)) { return; }
|
| 265 |
+
|
| 266 |
+
on(document, mouseevents.move, mousemove, e);
|
| 267 |
+
on(document, mouseevents.cancel, mouseend, e);
|
| 268 |
+
}
|
| 269 |
+
|
| 270 |
+
function mousemove(e, data){
|
| 271 |
+
checkThreshold(e, data, e, removeMouse);
|
| 272 |
+
}
|
| 273 |
+
|
| 274 |
+
function mouseend(e, data) {
|
| 275 |
+
removeMouse();
|
| 276 |
+
}
|
| 277 |
+
|
| 278 |
+
function removeMouse() {
|
| 279 |
+
off(document, mouseevents.move, mousemove);
|
| 280 |
+
off(document, mouseevents.cancel, mouseend);
|
| 281 |
+
}
|
| 282 |
+
|
| 283 |
+
function touchstart(e) {
|
| 284 |
+
// Don't get in the way of interaction with form elements
|
| 285 |
+
if (ignoreTags[e.target.tagName.toLowerCase()]) { return; }
|
| 286 |
+
|
| 287 |
+
var touch = e.changedTouches[0];
|
| 288 |
+
|
| 289 |
+
// iOS live updates the touch objects whereas Android gives us copies.
|
| 290 |
+
// That means we can't trust the touchstart object to stay the same,
|
| 291 |
+
// so we must copy the data. This object acts as a template for
|
| 292 |
+
// movestart, move and moveend event objects.
|
| 293 |
+
var data = {
|
| 294 |
+
target: touch.target,
|
| 295 |
+
pageX: touch.pageX,
|
| 296 |
+
pageY: touch.pageY,
|
| 297 |
+
identifier: touch.identifier,
|
| 298 |
+
|
| 299 |
+
// The only way to make handlers individually unbindable is by
|
| 300 |
+
// making them unique.
|
| 301 |
+
touchmove: function(e, data) { touchmove(e, data); },
|
| 302 |
+
touchend: function(e, data) { touchend(e, data); }
|
| 303 |
+
};
|
| 304 |
+
|
| 305 |
+
on(document, touchevents.move, data.touchmove, data);
|
| 306 |
+
on(document, touchevents.cancel, data.touchend, data);
|
| 307 |
+
}
|
| 308 |
+
|
| 309 |
+
function touchmove(e, data) {
|
| 310 |
+
var touch = changedTouch(e, data);
|
| 311 |
+
if (!touch) { return; }
|
| 312 |
+
checkThreshold(e, data, touch, removeTouch);
|
| 313 |
+
}
|
| 314 |
+
|
| 315 |
+
function touchend(e, data) {
|
| 316 |
+
var touch = identifiedTouch(e.changedTouches, data.identifier);
|
| 317 |
+
if (!touch) { return; }
|
| 318 |
+
removeTouch(data);
|
| 319 |
+
}
|
| 320 |
+
|
| 321 |
+
function removeTouch(data) {
|
| 322 |
+
off(document, touchevents.move, data.touchmove);
|
| 323 |
+
off(document, touchevents.cancel, data.touchend);
|
| 324 |
+
}
|
| 325 |
+
|
| 326 |
+
function checkThreshold(e, data, touch, fn) {
|
| 327 |
+
var distX = touch.pageX - data.pageX;
|
| 328 |
+
var distY = touch.pageY - data.pageY;
|
| 329 |
+
|
| 330 |
+
// Do nothing if the threshold has not been crossed.
|
| 331 |
+
if ((distX * distX) + (distY * distY) < (threshold * threshold)) { return; }
|
| 332 |
+
|
| 333 |
+
triggerStart(e, data, touch, distX, distY, fn);
|
| 334 |
+
}
|
| 335 |
+
|
| 336 |
+
function triggerStart(e, data, touch, distX, distY, fn) {
|
| 337 |
+
var touches = e.targetTouches;
|
| 338 |
+
var time = e.timeStamp - data.timeStamp;
|
| 339 |
+
|
| 340 |
+
// Create a movestart object with some special properties that
|
| 341 |
+
// are passed only to the movestart handlers.
|
| 342 |
+
var template = {
|
| 343 |
+
altKey: e.altKey,
|
| 344 |
+
ctrlKey: e.ctrlKey,
|
| 345 |
+
shiftKey: e.shiftKey,
|
| 346 |
+
startX: data.pageX,
|
| 347 |
+
startY: data.pageY,
|
| 348 |
+
distX: distX,
|
| 349 |
+
distY: distY,
|
| 350 |
+
deltaX: distX,
|
| 351 |
+
deltaY: distY,
|
| 352 |
+
pageX: touch.pageX,
|
| 353 |
+
pageY: touch.pageY,
|
| 354 |
+
velocityX: distX / time,
|
| 355 |
+
velocityY: distY / time,
|
| 356 |
+
identifier: data.identifier,
|
| 357 |
+
targetTouches: touches,
|
| 358 |
+
finger: touches ? touches.length : 1,
|
| 359 |
+
enableMove: function() {
|
| 360 |
+
this.moveEnabled = true;
|
| 361 |
+
this.enableMove = noop;
|
| 362 |
+
e.preventDefault();
|
| 363 |
+
}
|
| 364 |
+
};
|
| 365 |
+
|
| 366 |
+
// Trigger the movestart event.
|
| 367 |
+
trigger(data.target, 'movestart', template);
|
| 368 |
+
|
| 369 |
+
// Unbind handlers that tracked the touch or mouse up till now.
|
| 370 |
+
fn(data);
|
| 371 |
+
}
|
| 372 |
+
|
| 373 |
+
|
| 374 |
+
// Handlers that control what happens following a movestart
|
| 375 |
+
|
| 376 |
+
function activeMousemove(e, data) {
|
| 377 |
+
var timer = data.timer;
|
| 378 |
+
|
| 379 |
+
data.touch = e;
|
| 380 |
+
data.timeStamp = e.timeStamp;
|
| 381 |
+
timer.kick();
|
| 382 |
+
}
|
| 383 |
+
|
| 384 |
+
function activeMouseend(e, data) {
|
| 385 |
+
var target = data.target;
|
| 386 |
+
var event = data.event;
|
| 387 |
+
var timer = data.timer;
|
| 388 |
+
|
| 389 |
+
removeActiveMouse();
|
| 390 |
+
|
| 391 |
+
endEvent(target, event, timer, function() {
|
| 392 |
+
// Unbind the click suppressor, waiting until after mouseup
|
| 393 |
+
// has been handled.
|
| 394 |
+
setTimeout(function(){
|
| 395 |
+
off(target, 'click', preventDefault);
|
| 396 |
+
}, 0);
|
| 397 |
+
});
|
| 398 |
+
}
|
| 399 |
+
|
| 400 |
+
function removeActiveMouse() {
|
| 401 |
+
off(document, mouseevents.move, activeMousemove);
|
| 402 |
+
off(document, mouseevents.end, activeMouseend);
|
| 403 |
+
}
|
| 404 |
+
|
| 405 |
+
function activeTouchmove(e, data) {
|
| 406 |
+
var event = data.event;
|
| 407 |
+
var timer = data.timer;
|
| 408 |
+
var touch = changedTouch(e, event);
|
| 409 |
+
|
| 410 |
+
if (!touch) { return; }
|
| 411 |
+
|
| 412 |
+
// Stop the interface from gesturing
|
| 413 |
+
e.preventDefault();
|
| 414 |
+
|
| 415 |
+
event.targetTouches = e.targetTouches;
|
| 416 |
+
data.touch = touch;
|
| 417 |
+
data.timeStamp = e.timeStamp;
|
| 418 |
+
|
| 419 |
+
timer.kick();
|
| 420 |
+
}
|
| 421 |
+
|
| 422 |
+
function activeTouchend(e, data) {
|
| 423 |
+
var target = data.target;
|
| 424 |
+
var event = data.event;
|
| 425 |
+
var timer = data.timer;
|
| 426 |
+
var touch = identifiedTouch(e.changedTouches, event.identifier);
|
| 427 |
+
|
| 428 |
+
// This isn't the touch you're looking for.
|
| 429 |
+
if (!touch) { return; }
|
| 430 |
+
|
| 431 |
+
removeActiveTouch(data);
|
| 432 |
+
endEvent(target, event, timer);
|
| 433 |
+
}
|
| 434 |
+
|
| 435 |
+
function removeActiveTouch(data) {
|
| 436 |
+
off(document, touchevents.move, data.activeTouchmove);
|
| 437 |
+
off(document, touchevents.end, data.activeTouchend);
|
| 438 |
+
}
|
| 439 |
+
|
| 440 |
+
|
| 441 |
+
// Logic for triggering move and moveend events
|
| 442 |
+
|
| 443 |
+
function updateEvent(event, touch, timeStamp) {
|
| 444 |
+
var time = timeStamp - event.timeStamp;
|
| 445 |
+
|
| 446 |
+
event.distX = touch.pageX - event.startX;
|
| 447 |
+
event.distY = touch.pageY - event.startY;
|
| 448 |
+
event.deltaX = touch.pageX - event.pageX;
|
| 449 |
+
event.deltaY = touch.pageY - event.pageY;
|
| 450 |
+
|
| 451 |
+
// Average the velocity of the last few events using a decay
|
| 452 |
+
// curve to even out spurious jumps in values.
|
| 453 |
+
event.velocityX = 0.3 * event.velocityX + 0.7 * event.deltaX / time;
|
| 454 |
+
event.velocityY = 0.3 * event.velocityY + 0.7 * event.deltaY / time;
|
| 455 |
+
event.pageX = touch.pageX;
|
| 456 |
+
event.pageY = touch.pageY;
|
| 457 |
+
}
|
| 458 |
+
|
| 459 |
+
function endEvent(target, event, timer, fn) {
|
| 460 |
+
timer.end(function(){
|
| 461 |
+
trigger(target, 'moveend', event);
|
| 462 |
+
return fn && fn();
|
| 463 |
+
});
|
| 464 |
+
}
|
| 465 |
+
|
| 466 |
+
|
| 467 |
+
// Set up the DOM
|
| 468 |
+
|
| 469 |
+
function movestart(e) {
|
| 470 |
+
if (e.defaultPrevented) { return; }
|
| 471 |
+
if (!e.moveEnabled) { return; }
|
| 472 |
+
|
| 473 |
+
var event = {
|
| 474 |
+
startX: e.startX,
|
| 475 |
+
startY: e.startY,
|
| 476 |
+
pageX: e.pageX,
|
| 477 |
+
pageY: e.pageY,
|
| 478 |
+
distX: e.distX,
|
| 479 |
+
distY: e.distY,
|
| 480 |
+
deltaX: e.deltaX,
|
| 481 |
+
deltaY: e.deltaY,
|
| 482 |
+
velocityX: e.velocityX,
|
| 483 |
+
velocityY: e.velocityY,
|
| 484 |
+
identifier: e.identifier,
|
| 485 |
+
targetTouches: e.targetTouches,
|
| 486 |
+
finger: e.finger
|
| 487 |
+
};
|
| 488 |
+
|
| 489 |
+
var data = {
|
| 490 |
+
target: e.target,
|
| 491 |
+
event: event,
|
| 492 |
+
timer: new Timer(update),
|
| 493 |
+
touch: undefined,
|
| 494 |
+
timeStamp: e.timeStamp
|
| 495 |
+
};
|
| 496 |
+
|
| 497 |
+
function update(time) {
|
| 498 |
+
updateEvent(event, data.touch, data.timeStamp);
|
| 499 |
+
trigger(data.target, 'move', event);
|
| 500 |
+
}
|
| 501 |
+
|
| 502 |
+
if (e.identifier === undefined) {
|
| 503 |
+
// We're dealing with a mouse event.
|
| 504 |
+
// Stop clicks from propagating during a move
|
| 505 |
+
on(e.target, 'click', preventDefault);
|
| 506 |
+
on(document, mouseevents.move, activeMousemove, data);
|
| 507 |
+
on(document, mouseevents.end, activeMouseend, data);
|
| 508 |
+
}
|
| 509 |
+
else {
|
| 510 |
+
// In order to unbind correct handlers they have to be unique
|
| 511 |
+
data.activeTouchmove = function(e, data) { activeTouchmove(e, data); };
|
| 512 |
+
data.activeTouchend = function(e, data) { activeTouchend(e, data); };
|
| 513 |
+
|
| 514 |
+
// We're dealing with a touch.
|
| 515 |
+
on(document, touchevents.move, data.activeTouchmove, data);
|
| 516 |
+
on(document, touchevents.end, data.activeTouchend, data);
|
| 517 |
+
}
|
| 518 |
+
}
|
| 519 |
+
|
| 520 |
+
on(document, 'mousedown', mousedown);
|
| 521 |
+
on(document, 'touchstart', touchstart);
|
| 522 |
+
on(document, 'movestart', movestart);
|
| 523 |
+
|
| 524 |
+
|
| 525 |
+
// jQuery special events
|
| 526 |
+
//
|
| 527 |
+
// jQuery event objects are copies of DOM event objects. They need
|
| 528 |
+
// a little help copying the move properties across.
|
| 529 |
+
|
| 530 |
+
if (!window.jQuery) { return; }
|
| 531 |
+
|
| 532 |
+
var properties = ("startX startY pageX pageY distX distY deltaX deltaY velocityX velocityY").split(' ');
|
| 533 |
+
|
| 534 |
+
function enableMove1(e) { e.enableMove(); }
|
| 535 |
+
function enableMove2(e) { e.enableMove(); }
|
| 536 |
+
function enableMove3(e) { e.enableMove(); }
|
| 537 |
+
|
| 538 |
+
function add(handleObj) {
|
| 539 |
+
var handler = handleObj.handler;
|
| 540 |
+
|
| 541 |
+
handleObj.handler = function(e) {
|
| 542 |
+
// Copy move properties across from originalEvent
|
| 543 |
+
var i = properties.length;
|
| 544 |
+
var property;
|
| 545 |
+
|
| 546 |
+
while(i--) {
|
| 547 |
+
property = properties[i];
|
| 548 |
+
e[property] = e.originalEvent[property];
|
| 549 |
+
}
|
| 550 |
+
|
| 551 |
+
handler.apply(this, arguments);
|
| 552 |
+
};
|
| 553 |
+
}
|
| 554 |
+
|
| 555 |
+
jQuery.event.special.movestart = {
|
| 556 |
+
setup: function() {
|
| 557 |
+
// Movestart must be enabled to allow other move events
|
| 558 |
+
on(this, 'movestart', enableMove1);
|
| 559 |
+
|
| 560 |
+
// Do listen to DOM events
|
| 561 |
+
return false;
|
| 562 |
+
},
|
| 563 |
+
|
| 564 |
+
teardown: function() {
|
| 565 |
+
off(this, 'movestart', enableMove1);
|
| 566 |
+
return false;
|
| 567 |
+
},
|
| 568 |
+
|
| 569 |
+
add: add
|
| 570 |
+
};
|
| 571 |
+
|
| 572 |
+
jQuery.event.special.move = {
|
| 573 |
+
setup: function() {
|
| 574 |
+
on(this, 'movestart', enableMove2);
|
| 575 |
+
return false;
|
| 576 |
+
},
|
| 577 |
+
|
| 578 |
+
teardown: function() {
|
| 579 |
+
off(this, 'movestart', enableMove2);
|
| 580 |
+
return false;
|
| 581 |
+
},
|
| 582 |
+
|
| 583 |
+
add: add
|
| 584 |
+
};
|
| 585 |
+
|
| 586 |
+
jQuery.event.special.moveend = {
|
| 587 |
+
setup: function() {
|
| 588 |
+
on(this, 'movestart', enableMove3);
|
| 589 |
+
return false;
|
| 590 |
+
},
|
| 591 |
+
|
| 592 |
+
teardown: function() {
|
| 593 |
+
off(this, 'movestart', enableMove3);
|
| 594 |
+
return false;
|
| 595 |
+
},
|
| 596 |
+
|
| 597 |
+
add: add
|
| 598 |
+
};
|
| 599 |
+
});
|
assets/js/jquery.twentytwenty.js
ADDED
|
@@ -0,0 +1,151 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
(function($){
|
| 2 |
+
|
| 3 |
+
$.fn.twentytwenty = function(options) {
|
| 4 |
+
var options = $.extend({
|
| 5 |
+
default_offset_pct: 0.5,
|
| 6 |
+
orientation: 'horizontal',
|
| 7 |
+
before_label: 'Before',
|
| 8 |
+
after_label: 'After',
|
| 9 |
+
no_overlay: false,
|
| 10 |
+
move_slider_on_hover: false,
|
| 11 |
+
move_with_handle_only: true,
|
| 12 |
+
click_to_move: false
|
| 13 |
+
}, options);
|
| 14 |
+
|
| 15 |
+
return this.each(function() {
|
| 16 |
+
|
| 17 |
+
var sliderPct = options.default_offset_pct;
|
| 18 |
+
var container = $(this);
|
| 19 |
+
var sliderOrientation = options.orientation;
|
| 20 |
+
var beforeDirection = (sliderOrientation === 'vertical') ? 'down' : 'left';
|
| 21 |
+
var afterDirection = (sliderOrientation === 'vertical') ? 'up' : 'right';
|
| 22 |
+
|
| 23 |
+
|
| 24 |
+
container.wrap("<div class='twentytwenty-wrapper twentytwenty-" + sliderOrientation + "'></div>");
|
| 25 |
+
if(!options.no_overlay) {
|
| 26 |
+
container.append("<div class='twentytwenty-overlay'></div>");
|
| 27 |
+
var overlay = container.find(".twentytwenty-overlay");
|
| 28 |
+
overlay.append("<div class='twentytwenty-before-label' data-content='"+options.before_label+"'></div>");
|
| 29 |
+
overlay.append("<div class='twentytwenty-after-label' data-content='"+options.after_label+"'></div>");
|
| 30 |
+
}
|
| 31 |
+
var beforeImg = container.find("img:first");
|
| 32 |
+
var afterImg = container.find("img:last");
|
| 33 |
+
container.append("<div class='twentytwenty-handle'></div>");
|
| 34 |
+
var slider = container.find(".twentytwenty-handle");
|
| 35 |
+
slider.append("<span class='twentytwenty-" + beforeDirection + "-arrow'></span>");
|
| 36 |
+
slider.append("<span class='twentytwenty-" + afterDirection + "-arrow'></span>");
|
| 37 |
+
container.addClass("twentytwenty-container");
|
| 38 |
+
beforeImg.addClass("twentytwenty-before");
|
| 39 |
+
afterImg.addClass("twentytwenty-after");
|
| 40 |
+
|
| 41 |
+
var calcOffset = function(dimensionPct) {
|
| 42 |
+
var w = beforeImg.width();
|
| 43 |
+
var h = beforeImg.height();
|
| 44 |
+
return {
|
| 45 |
+
w: w+"px",
|
| 46 |
+
h: h+"px",
|
| 47 |
+
cw: (dimensionPct*w)+"px",
|
| 48 |
+
ch: (dimensionPct*h)+"px"
|
| 49 |
+
};
|
| 50 |
+
};
|
| 51 |
+
|
| 52 |
+
var adjustContainer = function(offset) {
|
| 53 |
+
if (sliderOrientation === 'vertical') {
|
| 54 |
+
beforeImg.css("clip", "rect(0,"+offset.w+","+offset.ch+",0)");
|
| 55 |
+
afterImg.css("clip", "rect("+offset.ch+","+offset.w+","+offset.h+",0)");
|
| 56 |
+
}
|
| 57 |
+
else {
|
| 58 |
+
beforeImg.css("clip", "rect(0,"+offset.cw+","+offset.h+",0)");
|
| 59 |
+
afterImg.css("clip", "rect(0,"+offset.w+","+offset.h+","+offset.cw+")");
|
| 60 |
+
}
|
| 61 |
+
container.css("height", offset.h);
|
| 62 |
+
};
|
| 63 |
+
|
| 64 |
+
var adjustSlider = function(pct) {
|
| 65 |
+
var offset = calcOffset(pct);
|
| 66 |
+
slider.css((sliderOrientation==="vertical") ? "top" : "left", (sliderOrientation==="vertical") ? offset.ch : offset.cw);
|
| 67 |
+
adjustContainer(offset);
|
| 68 |
+
};
|
| 69 |
+
|
| 70 |
+
// Return the number specified or the min/max number if it outside the range given.
|
| 71 |
+
var minMaxNumber = function(num, min, max) {
|
| 72 |
+
return Math.max(min, Math.min(max, num));
|
| 73 |
+
};
|
| 74 |
+
|
| 75 |
+
// Calculate the slider percentage based on the position.
|
| 76 |
+
var getSliderPercentage = function(positionX, positionY) {
|
| 77 |
+
var sliderPercentage = (sliderOrientation === 'vertical') ?
|
| 78 |
+
(positionY-offsetY)/imgHeight :
|
| 79 |
+
(positionX-offsetX)/imgWidth;
|
| 80 |
+
|
| 81 |
+
return minMaxNumber(sliderPercentage, 0, 1);
|
| 82 |
+
};
|
| 83 |
+
|
| 84 |
+
|
| 85 |
+
$(window).on("resize.twentytwenty", function(e) {
|
| 86 |
+
adjustSlider(sliderPct);
|
| 87 |
+
});
|
| 88 |
+
|
| 89 |
+
var offsetX = 0;
|
| 90 |
+
var offsetY = 0;
|
| 91 |
+
var imgWidth = 0;
|
| 92 |
+
var imgHeight = 0;
|
| 93 |
+
var onMoveStart = function(e) {
|
| 94 |
+
if (((e.distX > e.distY && e.distX < -e.distY) || (e.distX < e.distY && e.distX > -e.distY)) && sliderOrientation !== 'vertical') {
|
| 95 |
+
e.preventDefault();
|
| 96 |
+
}
|
| 97 |
+
else if (((e.distX < e.distY && e.distX < -e.distY) || (e.distX > e.distY && e.distX > -e.distY)) && sliderOrientation === 'vertical') {
|
| 98 |
+
e.preventDefault();
|
| 99 |
+
}
|
| 100 |
+
container.addClass("active");
|
| 101 |
+
offsetX = container.offset().left;
|
| 102 |
+
offsetY = container.offset().top;
|
| 103 |
+
imgWidth = beforeImg.width();
|
| 104 |
+
imgHeight = beforeImg.height();
|
| 105 |
+
};
|
| 106 |
+
var onMove = function(e) {
|
| 107 |
+
if (container.hasClass("active")) {
|
| 108 |
+
sliderPct = getSliderPercentage(e.pageX, e.pageY);
|
| 109 |
+
adjustSlider(sliderPct);
|
| 110 |
+
}
|
| 111 |
+
};
|
| 112 |
+
var onMoveEnd = function() {
|
| 113 |
+
container.removeClass("active");
|
| 114 |
+
};
|
| 115 |
+
|
| 116 |
+
var moveTarget = options.move_with_handle_only ? slider : container;
|
| 117 |
+
moveTarget.on("movestart",onMoveStart);
|
| 118 |
+
moveTarget.on("move",onMove);
|
| 119 |
+
moveTarget.on("moveend",onMoveEnd);
|
| 120 |
+
|
| 121 |
+
if (options.move_slider_on_hover) {
|
| 122 |
+
container.on("mouseenter", onMoveStart);
|
| 123 |
+
container.on("mousemove", onMove);
|
| 124 |
+
container.on("mouseleave", onMoveEnd);
|
| 125 |
+
}
|
| 126 |
+
|
| 127 |
+
slider.on("touchmove", function(e) {
|
| 128 |
+
e.preventDefault();
|
| 129 |
+
});
|
| 130 |
+
|
| 131 |
+
container.find("img").on("mousedown", function(event) {
|
| 132 |
+
event.preventDefault();
|
| 133 |
+
});
|
| 134 |
+
|
| 135 |
+
if (options.click_to_move) {
|
| 136 |
+
container.on('click', function(e) {
|
| 137 |
+
offsetX = container.offset().left;
|
| 138 |
+
offsetY = container.offset().top;
|
| 139 |
+
imgWidth = beforeImg.width();
|
| 140 |
+
imgHeight = beforeImg.height();
|
| 141 |
+
|
| 142 |
+
sliderPct = getSliderPercentage(e.pageX, e.pageY);
|
| 143 |
+
adjustSlider(sliderPct);
|
| 144 |
+
});
|
| 145 |
+
}
|
| 146 |
+
|
| 147 |
+
$(window).trigger("resize.twentytwenty");
|
| 148 |
+
});
|
| 149 |
+
};
|
| 150 |
+
|
| 151 |
+
})(jQuery);
|
assets/js/script.js
ADDED
|
@@ -0,0 +1,71 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
( function( $ ){
|
| 2 |
+
'use strict';
|
| 3 |
+
function switch_tab( tab ){
|
| 4 |
+
var tabs = $( 'span[data-tab]' ).map( function( i ,e ){ return $( e ).attr( 'data-tab' ); }).get();
|
| 5 |
+
var previous_tab = tabs.includes( getUrlParam( "tab" ) )?getUrlParam( "tab" ):tabs[0];
|
| 6 |
+
var active_tab = ( tabs.includes( tab ) )?tab:previous_tab;
|
| 7 |
+
setUrlParam( 'tab', active_tab );
|
| 8 |
+
|
| 9 |
+
$( '.nav-tab' ).removeClass( 'nav-tab-active' );
|
| 10 |
+
$( 'span[data-tab="'+active_tab+'"]' ).addClass( 'nav-tab-active' );
|
| 11 |
+
$( '.tab' ).hide();
|
| 12 |
+
$( '.tab' ).removeClass( 'tab-active' );
|
| 13 |
+
$( '#tab_'+active_tab ).show();
|
| 14 |
+
$( '#tab_'+active_tab ).addClass( 'tab-active' );
|
| 15 |
+
|
| 16 |
+
update_referer( previous_tab, active_tab, getUrlParam("page") );
|
| 17 |
+
|
| 18 |
+
}
|
| 19 |
+
|
| 20 |
+
function getUrlParam( param_name ){
|
| 21 |
+
var regex = RegExp(param_name+'=([^&]+)','g');
|
| 22 |
+
var r = regex.exec( location.href );
|
| 23 |
+
if( null !== r ){
|
| 24 |
+
return r[1];
|
| 25 |
+
}
|
| 26 |
+
return false;
|
| 27 |
+
}
|
| 28 |
+
|
| 29 |
+
function setUrlParam( param_name, param_value ){
|
| 30 |
+
var tr = getUrlParam( param_name );
|
| 31 |
+
var url = window.location.href;
|
| 32 |
+
if( tr ){
|
| 33 |
+
url = url.replace( param_name+'='+tr, param_name+'='+param_value );
|
| 34 |
+
}else{
|
| 35 |
+
var s = ( -1 === url.indexOf('?') )?'?':'&';
|
| 36 |
+
url += s+param_name+'='+param_value;
|
| 37 |
+
}
|
| 38 |
+
history.replaceState( null, null, url );
|
| 39 |
+
}
|
| 40 |
+
|
| 41 |
+
function update_referer( previous_tab, active_tab, page_settings ){
|
| 42 |
+
$( '.referer-link' ).each(function( i, e ) {
|
| 43 |
+
var href = $(e).attr('href');
|
| 44 |
+
if( -1 !== href.search( '%26tab%3D'+previous_tab ) ){
|
| 45 |
+
$(e).attr( 'href', href.replace( previous_tab, active_tab ) );
|
| 46 |
+
}else{
|
| 47 |
+
$(e).attr( 'href', href.replace( page_settings, page_settings+'%26tab%3D'+active_tab ) );
|
| 48 |
+
}
|
| 49 |
+
});
|
| 50 |
+
}
|
| 51 |
+
|
| 52 |
+
//initialisation
|
| 53 |
+
$(document).ready(function() {
|
| 54 |
+
$("#container1").twentytwenty({
|
| 55 |
+
before_label: 'Original',
|
| 56 |
+
after_label: 'Imagified',
|
| 57 |
+
});
|
| 58 |
+
$( '.nav-tab' ).click(function(){
|
| 59 |
+
switch_tab( $( this ).attr('data-tab') );
|
| 60 |
+
$('#container').imagesLoaded( function() {
|
| 61 |
+
$("#container1").twentytwenty({
|
| 62 |
+
before_label: 'Original',
|
| 63 |
+
after_label: 'Imagified',
|
| 64 |
+
});
|
| 65 |
+
});
|
| 66 |
+
});
|
| 67 |
+
switch_tab();
|
| 68 |
+
});
|
| 69 |
+
|
| 70 |
+
|
| 71 |
+
})( jQuery );
|
assets/js/scripts.min.js
ADDED
|
@@ -0,0 +1,41 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
( function( $ ){
|
| 2 |
+
$(document).ready(function() {
|
| 3 |
+
$( ".nav-tab" ).click(function() {
|
| 4 |
+
$('#container').imagesLoaded( function() {
|
| 5 |
+
$("#container1").twentytwenty({
|
| 6 |
+
before_label: 'Original',
|
| 7 |
+
after_label: 'Imagified',
|
| 8 |
+
});
|
| 9 |
+
});
|
| 10 |
+
});
|
| 11 |
+
});
|
| 12 |
+
})( jQuery );
|
| 13 |
+
|
| 14 |
+
|
| 15 |
+
( function( $ ){
|
| 16 |
+
'use strict';
|
| 17 |
+
function switch_tab( tab ){
|
| 18 |
+
var active_tab = ( tab )?tab:( window.location.hash )?window.location.hash:'#tab1';
|
| 19 |
+
history.replaceState( null, null, active_tab );
|
| 20 |
+
$( '.nav-tab' ).removeClass( 'nav-tab-active' );
|
| 21 |
+
$( 'a[href^="'+active_tab+'"]' ).addClass( 'nav-tab-active' );
|
| 22 |
+
$( '.tab' ).hide();
|
| 23 |
+
$( '.tab' ).removeClass( 'tab-active' );
|
| 24 |
+
$( active_tab ).show();
|
| 25 |
+
$( active_tab ).addClass( 'tab-active' );
|
| 26 |
+
}
|
| 27 |
+
//initialisation
|
| 28 |
+
$(document).ready(function() {
|
| 29 |
+
$("#container1").twentytwenty({
|
| 30 |
+
before_label: 'Original',
|
| 31 |
+
after_label: 'Imagified',
|
| 32 |
+
});
|
| 33 |
+
$( '.nav-tab' ).click(function(){
|
| 34 |
+
event.preventDefault();
|
| 35 |
+
switch_tab( $( this ).attr('href') );
|
| 36 |
+
});
|
| 37 |
+
switch_tab();
|
| 38 |
+
});
|
| 39 |
+
|
| 40 |
+
|
| 41 |
+
})( jQuery );
|
phpcs.xml
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?xml version="1.0"?>
|
| 2 |
+
<ruleset name="WordPress Coding Standards">
|
| 3 |
+
<description>Increase Maximum Upload File Size dev PHP_CodeSniffer ruleset.</description>
|
| 4 |
+
|
| 5 |
+
<arg name="extensions" value="php"/>
|
| 6 |
+
|
| 7 |
+
<file>.</file>
|
| 8 |
+
|
| 9 |
+
<!-- Exclude Composer vendor directory. -->
|
| 10 |
+
<exclude-pattern>*/vendor/*</exclude-pattern>
|
| 11 |
+
|
| 12 |
+
<!-- Exclude Imagify Partner API. -->
|
| 13 |
+
<exclude-pattern>Imagify_Partner.php</exclude-pattern>
|
| 14 |
+
|
| 15 |
+
<rule ref="WordPress">
|
| 16 |
+
<!-- https://github.com/WordPress-Coding-Standards/WordPress-Coding-Standards/ -->
|
| 17 |
+
<exclude name="Squiz.Commenting.FileComment.Missing"/>
|
| 18 |
+
<exclude name="Squiz.Commenting.FileComment.MissingPackageTag"/>
|
| 19 |
+
<exclude name="Squiz.Commenting.FunctionCommentThrowTag"/>
|
| 20 |
+
<exclude name="WordPress.Files.FileName.NotHyphenatedLowercase" />
|
| 21 |
+
</rule>
|
| 22 |
+
|
| 23 |
+
<rule ref="WordPress.Files.FileName">
|
| 24 |
+
<properties>
|
| 25 |
+
<property name="strict_class_file_names" value="false" />
|
| 26 |
+
</properties>
|
| 27 |
+
</rule>
|
| 28 |
+
</ruleset>
|
readme.txt
CHANGED
|
@@ -1,10 +1,10 @@
|
|
| 1 |
=== Increase Maximum Upload File Size ===
|
| 2 |
-
Contributors:
|
| 3 |
Tags: max upload file size, increase upload limit, increase file size limit, upload limit, post max size, upload file size, upload_max_filesize
|
| 4 |
Requires at least: 3.0
|
| 5 |
-
Requires PHP: 5.
|
| 6 |
-
Tested up to: 5.
|
| 7 |
-
Stable tag:
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
|
@@ -55,6 +55,10 @@ Yes, it works with all servers. But, please know that server adjusted limits can
|
|
| 55 |
|
| 56 |
== Changelog ==
|
| 57 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 58 |
= v1.35 =
|
| 59 |
* 2019/08/12
|
| 60 |
* better messages to clearly communicate max upload file size limits
|
| 1 |
=== Increase Maximum Upload File Size ===
|
| 2 |
+
Contributors: imagify, wp_media
|
| 3 |
Tags: max upload file size, increase upload limit, increase file size limit, upload limit, post max size, upload file size, upload_max_filesize
|
| 4 |
Requires at least: 3.0
|
| 5 |
+
Requires PHP: 5.3
|
| 6 |
+
Tested up to: 5.3
|
| 7 |
+
Stable tag: 2.0
|
| 8 |
License: GPLv2 or later
|
| 9 |
License URI: http://www.gnu.org/licenses/gpl-2.0.html
|
| 10 |
|
| 55 |
|
| 56 |
== Changelog ==
|
| 57 |
|
| 58 |
+
= v2.0 =
|
| 59 |
+
* 2019/11/04
|
| 60 |
+
* Revamp the settings page.
|
| 61 |
+
|
| 62 |
= v1.35 =
|
| 63 |
* 2019/08/12
|
| 64 |
* better messages to clearly communicate max upload file size limits
|
upload-max-file-size.php
ADDED
|
@@ -0,0 +1,292 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Plugin Name: Increase Maximum Upload File Size
|
| 4 |
+
* Description: Increase maximum upload file size with one click.
|
| 5 |
+
* Author: Imagify
|
| 6 |
+
* Author URI: https://wordpress.org/plugins/imagify/
|
| 7 |
+
* Plugin URI: https://wordpress.org/plugins/upload-max-file-size/
|
| 8 |
+
* Version: 2.0
|
| 9 |
+
* License: GPL2
|
| 10 |
+
* Text Domain: upload-max-file-size
|
| 11 |
+
*/
|
| 12 |
+
|
| 13 |
+
namespace UMFS;
|
| 14 |
+
|
| 15 |
+
define( 'UMFS_VERSION', '2.0' );
|
| 16 |
+
define( 'UMFS_PLUGIN_PATH', plugin_dir_path( __FILE__ ) );
|
| 17 |
+
define( 'UMFS_PLUGIN_URL', plugin_dir_url( __FILE__ ) );
|
| 18 |
+
|
| 19 |
+
/**
|
| 20 |
+
* The primary plugin class.
|
| 21 |
+
*/
|
| 22 |
+
class Plugin {
|
| 23 |
+
/**
|
| 24 |
+
* A array of plugin card.
|
| 25 |
+
*
|
| 26 |
+
* @var array of Plugin_Card_Helper Object
|
| 27 |
+
*/
|
| 28 |
+
protected static $plugins_block = array();
|
| 29 |
+
|
| 30 |
+
/**
|
| 31 |
+
* Plugin init.
|
| 32 |
+
*
|
| 33 |
+
* @return void
|
| 34 |
+
*/
|
| 35 |
+
public static function init() {
|
| 36 |
+
if ( is_admin() ) {
|
| 37 |
+
add_action( 'admin_menu', array( __CLASS__, 'upload_max_file_size_add_pages' ) );
|
| 38 |
+
add_filter( 'plugin_action_links_' . plugin_basename( __FILE__ ), array( __CLASS__, 'plugin_action_links' ) );
|
| 39 |
+
add_filter( 'plugin_row_meta', array( __CLASS__, 'plugin_meta_links' ), 10, 2 );
|
| 40 |
+
|
| 41 |
+
self::init_card();
|
| 42 |
+
self::process_settings();
|
| 43 |
+
}
|
| 44 |
+
|
| 45 |
+
add_filter( 'upload_size_limit', array( __CLASS__, 'upload_max_increase_upload' ) );
|
| 46 |
+
}
|
| 47 |
+
|
| 48 |
+
/**
|
| 49 |
+
* Plugin card init.
|
| 50 |
+
*
|
| 51 |
+
* @return void
|
| 52 |
+
*/
|
| 53 |
+
public static function init_card() {
|
| 54 |
+
require_once UMFS_PLUGIN_PATH . 'Notices.php';
|
| 55 |
+
require_once UMFS_PLUGIN_PATH . 'Imagify_Partner.php';
|
| 56 |
+
require_once UMFS_PLUGIN_PATH . 'Plugin_Card_Helper.php';
|
| 57 |
+
|
| 58 |
+
$imagify_partner = new Imagify_Partner( 'upload-max-file-size' );
|
| 59 |
+
$imagify_partner->init();
|
| 60 |
+
self::$plugins_block = array(
|
| 61 |
+
'rocket-lazy-load' => new Plugin_Card_Helper(
|
| 62 |
+
array(
|
| 63 |
+
'plugin_slug' => 'rocket-lazy-load',
|
| 64 |
+
'params' => array(
|
| 65 |
+
'title' => 'LazyLoad',
|
| 66 |
+
),
|
| 67 |
+
)
|
| 68 |
+
),
|
| 69 |
+
'heartbeat-control' => new Plugin_Card_Helper(
|
| 70 |
+
array(
|
| 71 |
+
'plugin_slug' => 'heartbeat-control',
|
| 72 |
+
'params' => array(
|
| 73 |
+
'title' => 'Heartbeat Control',
|
| 74 |
+
'description' => sprintf(
|
| 75 |
+
// translators: %1$s %2$s: bold markup.
|
| 76 |
+
esc_html__( 'Helps you control the WordPress Heartbeat API and %1$sreduce CPU usage%2$s.', 'upload-max-file-size' ),
|
| 77 |
+
'<strong>',
|
| 78 |
+
'</strong>'
|
| 79 |
+
),
|
| 80 |
+
),
|
| 81 |
+
)
|
| 82 |
+
),
|
| 83 |
+
'wp-rocket' => new Plugin_Card_Helper(
|
| 84 |
+
array(
|
| 85 |
+
'plugin_slug' => 'wp-rocket',
|
| 86 |
+
'params' => array(
|
| 87 |
+
'icon' => '<img src="' . UMFS_PLUGIN_URL . 'assets/img/logo-rocket.jpg" alt="">',
|
| 88 |
+
'title' => 'WP Rocket',
|
| 89 |
+
'description' => sprintf(
|
| 90 |
+
// translators: %1$s %2$s: link markup.
|
| 91 |
+
esc_html__( 'Integrate more than 80% of web performance good practices automatically to %1$sreduce your website\'s loading time.%2$s', 'upload-max-file-size' ),
|
| 92 |
+
'<strong>',
|
| 93 |
+
'</strong>'
|
| 94 |
+
),
|
| 95 |
+
'install_url' => array(
|
| 96 |
+
'not_installed' => 'https://wp-rocket.me/?utm_source=wp_plugin&utm_medium=upload_max_file_size',
|
| 97 |
+
),
|
| 98 |
+
'button_text' => array(
|
| 99 |
+
'not_installed' => __( 'Get WP Rocket', 'upload-max-file-size' ),
|
| 100 |
+
),
|
| 101 |
+
),
|
| 102 |
+
)
|
| 103 |
+
),
|
| 104 |
+
'imagify' => new Plugin_Card_Helper(
|
| 105 |
+
array(
|
| 106 |
+
'plugin_slug' => 'imagify',
|
| 107 |
+
'params' => array(
|
| 108 |
+
'title' => 'Imagify',
|
| 109 |
+
'description' => sprintf(
|
| 110 |
+
// translators: %1$s: line break, %2$s %3$s: bold markup.
|
| 111 |
+
esc_html__( '%2$sReduces image file sizes%3$s without losing quality.%1$sBy compressing your images you speed up your website and boost your SEO.', 'upload-max-file-size' ),
|
| 112 |
+
'<br>',
|
| 113 |
+
'<strong>',
|
| 114 |
+
'</strong>'
|
| 115 |
+
),
|
| 116 |
+
),
|
| 117 |
+
)
|
| 118 |
+
),
|
| 119 |
+
);
|
| 120 |
+
}
|
| 121 |
+
|
| 122 |
+
/**
|
| 123 |
+
* Process the settings changes.
|
| 124 |
+
*
|
| 125 |
+
* @return void
|
| 126 |
+
*/
|
| 127 |
+
public static function process_settings() {
|
| 128 |
+
if ( isset( $_POST['upload_max_file_size_field'], $_POST['upload_max_file_size_nonce'] )
|
| 129 |
+
&& wp_verify_nonce( sanitize_key( $_POST['upload_max_file_size_nonce'] ), 'upload_max_file_size_action' )
|
| 130 |
+
&& is_numeric( $_POST['upload_max_file_size_field'] ) ) {
|
| 131 |
+
$notices = Notices::get_instance();
|
| 132 |
+
$max_size = (int) $_POST['upload_max_file_size_field'] * 1024 * 1024;
|
| 133 |
+
|
| 134 |
+
if ( update_option( 'max_file_size', $max_size ) ) {
|
| 135 |
+
$notices->append( 'success', __( 'Settings saved.' ) );
|
| 136 |
+
}
|
| 137 |
+
}
|
| 138 |
+
}
|
| 139 |
+
|
| 140 |
+
/**
|
| 141 |
+
* HOOKED
|
| 142 |
+
* add a link to the plugin settings page into item of the plugin list.
|
| 143 |
+
*
|
| 144 |
+
* @param string $links See https://developer.wordpress.org/reference/hooks/plugin_action_links_plugin_file/.
|
| 145 |
+
* @return string $links A link to the page settings.
|
| 146 |
+
*/
|
| 147 |
+
public static function plugin_action_links( $links ) {
|
| 148 |
+
$settings_link = '<a href="' . admin_url( 'options-general.php?page=upload-max-file-size' ) . '" title="Adjust Max File Upload Size Settings">Settings</a>';
|
| 149 |
+
array_unshift( $links, $settings_link );
|
| 150 |
+
|
| 151 |
+
return $links;
|
| 152 |
+
}
|
| 153 |
+
|
| 154 |
+
/**
|
| 155 |
+
* Add a link to the WordPress plugin depository page into item of the plugin list.
|
| 156 |
+
*
|
| 157 |
+
* @param string $links See https://developer.wordpress.org/reference/hooks/plugin_row_meta/.
|
| 158 |
+
* @param string $file See https://developer.wordpress.org/reference/hooks/plugin_row_meta/.
|
| 159 |
+
* @return string $links A link to the WordPress plugin depository.
|
| 160 |
+
*/
|
| 161 |
+
public static function plugin_meta_links( $links, $file ) {
|
| 162 |
+
$support_link = '<a target="_blank" href="https://wordpress.org/support/plugin/upload-max-file-size" title="Get help">Support</a>';
|
| 163 |
+
|
| 164 |
+
if ( plugin_basename( __FILE__ ) === $file ) {
|
| 165 |
+
$links[] = $support_link;
|
| 166 |
+
}
|
| 167 |
+
|
| 168 |
+
return $links;
|
| 169 |
+
}
|
| 170 |
+
|
| 171 |
+
/**
|
| 172 |
+
* Add menu pages.
|
| 173 |
+
*
|
| 174 |
+
* @return void
|
| 175 |
+
*/
|
| 176 |
+
public static function upload_max_file_size_add_pages() {
|
| 177 |
+
add_action( 'admin_enqueue_scripts', array( __CLASS__, 'enqueue_scripts' ) );
|
| 178 |
+
add_options_page( 'Increase Max Upload File Size', 'Increase Maximum Upload File Size', 'manage_options', 'upload-max-file-size', array( __CLASS__, 'admin_controller_options' ) );
|
| 179 |
+
}
|
| 180 |
+
|
| 181 |
+
/**
|
| 182 |
+
* Get closest value from array.
|
| 183 |
+
*
|
| 184 |
+
* @param int $search Search value.
|
| 185 |
+
* @param array $arr Array to find closest value in.
|
| 186 |
+
* @return int $closest The closest value in MB.
|
| 187 |
+
*/
|
| 188 |
+
public static function get_closest( $search, $arr ) {
|
| 189 |
+
$closest = null;
|
| 190 |
+
|
| 191 |
+
foreach ( $arr as $item ) {
|
| 192 |
+
if ( null === $closest || abs( $search - $closest ) > abs( $item - $search ) ) {
|
| 193 |
+
$closest = $item;
|
| 194 |
+
}
|
| 195 |
+
}
|
| 196 |
+
|
| 197 |
+
return $closest;
|
| 198 |
+
}
|
| 199 |
+
|
| 200 |
+
/**
|
| 201 |
+
* Option admin page enqueue script and style.
|
| 202 |
+
*
|
| 203 |
+
* @param string $hook Use for context validation.
|
| 204 |
+
* @return void
|
| 205 |
+
*/
|
| 206 |
+
public static function enqueue_scripts( $hook ) {
|
| 207 |
+
if ( 'settings_page_upload-max-file-size' !== $hook ) {
|
| 208 |
+
return;
|
| 209 |
+
}
|
| 210 |
+
|
| 211 |
+
wp_register_style( 'umfs_admin_style', UMFS_PLUGIN_URL . 'assets/css/style.min.css', array(), UMFS_VERSION );
|
| 212 |
+
wp_enqueue_style( 'umfs_admin_style' );
|
| 213 |
+
wp_register_script( 'umfs_admin_event', UMFS_PLUGIN_URL . 'assets/js/jquery.event.move.js', array( 'jquery' ), UMFS_VERSION, false );
|
| 214 |
+
wp_enqueue_script( 'umfs_admin_event' );
|
| 215 |
+
wp_register_script( 'umfs_admin_twenty', UMFS_PLUGIN_URL . 'assets/js/jquery.twentytwenty.js', array( 'jquery' ), UMFS_VERSION, false );
|
| 216 |
+
wp_enqueue_script( 'umfs_admin_twenty' );
|
| 217 |
+
wp_register_script( 'umfs_admin_test', UMFS_PLUGIN_URL . 'assets/js/imagesLoaded.js', array( 'jquery' ), UMFS_VERSION, false );
|
| 218 |
+
wp_enqueue_script( 'umfs_admin_test' );
|
| 219 |
+
|
| 220 |
+
wp_register_script( 'umfs_admin_script', UMFS_PLUGIN_URL . 'assets/js/script.js', array( 'jquery' ), UMFS_VERSION, true );
|
| 221 |
+
wp_enqueue_script( 'umfs_admin_script' );
|
| 222 |
+
}
|
| 223 |
+
|
| 224 |
+
/**
|
| 225 |
+
* Simple admin option page controller.
|
| 226 |
+
*
|
| 227 |
+
* @return void
|
| 228 |
+
*/
|
| 229 |
+
public static function admin_controller_options() {
|
| 230 |
+
$notices = Notices::get_instance();
|
| 231 |
+
$plugins_block = self::$plugins_block;
|
| 232 |
+
$asset_image_url = UMFS_PLUGIN_URL . 'assets/img/';
|
| 233 |
+
|
| 234 |
+
include_once UMFS_PLUGIN_PATH . 'views/admin-page.php';
|
| 235 |
+
}
|
| 236 |
+
|
| 237 |
+
/**
|
| 238 |
+
* Admin setting form controller.
|
| 239 |
+
*
|
| 240 |
+
* @return void
|
| 241 |
+
*/
|
| 242 |
+
public static function upload_max_file_size_form() {
|
| 243 |
+
$ini_size = ini_get( 'upload_max_filesize' );
|
| 244 |
+
|
| 245 |
+
if ( ! $ini_size ) {
|
| 246 |
+
$ini_size = 'unknown';
|
| 247 |
+
} elseif ( is_numeric( $ini_size ) ) {
|
| 248 |
+
$ini_size .= ' bytes';
|
| 249 |
+
} else {
|
| 250 |
+
$ini_size .= 'B';
|
| 251 |
+
}
|
| 252 |
+
|
| 253 |
+
$wp_size = wp_max_upload_size();
|
| 254 |
+
|
| 255 |
+
if ( ! $wp_size ) {
|
| 256 |
+
$wp_size = 'unknown';
|
| 257 |
+
} else {
|
| 258 |
+
$wp_size = round( ( $wp_size / 1024 / 1024 ) );
|
| 259 |
+
$wp_size = 1024 === $wp_size ? '1GB' : $wp_size . 'MB';
|
| 260 |
+
}
|
| 261 |
+
|
| 262 |
+
$max_size = get_option( 'max_file_size' );
|
| 263 |
+
|
| 264 |
+
if ( ! $max_size ) {
|
| 265 |
+
$max_size = 64 * 1024 * 1024;
|
| 266 |
+
}
|
| 267 |
+
|
| 268 |
+
$max_size = $max_size / 1024 / 1024;
|
| 269 |
+
$upload_sizes = array( 16, 32, 64, 128, 256, 512, 1024 );
|
| 270 |
+
$current_max_size = self::get_closest( $max_size, $upload_sizes );
|
| 271 |
+
|
| 272 |
+
include_once UMFS_PLUGIN_PATH . 'views/admin-form.php';
|
| 273 |
+
}
|
| 274 |
+
|
| 275 |
+
|
| 276 |
+
/**
|
| 277 |
+
* Filter to increase max_file_size
|
| 278 |
+
*
|
| 279 |
+
* @return int max_size in bytes
|
| 280 |
+
*/
|
| 281 |
+
public static function upload_max_increase_upload() {
|
| 282 |
+
$max_size = (int) get_option( 'max_file_size' );
|
| 283 |
+
|
| 284 |
+
if ( ! $max_size ) {
|
| 285 |
+
$max_size = 64 * 1024 * 1024;
|
| 286 |
+
}
|
| 287 |
+
|
| 288 |
+
return $max_size;
|
| 289 |
+
}
|
| 290 |
+
}
|
| 291 |
+
|
| 292 |
+
add_action( 'init', array( 'UMFS\Plugin', 'init' ) );
|
upload_max_file_size.php
DELETED
|
@@ -1,295 +0,0 @@
|
|
| 1 |
-
<?php
|
| 2 |
-
/*
|
| 3 |
-
Plugin Name: Increase Maximum Upload File Size
|
| 4 |
-
Description: Increase maximum upload file size with one click.
|
| 5 |
-
Author: WebFactory Ltd
|
| 6 |
-
Author URI: https://www.webfactoryltd.com/
|
| 7 |
-
Plugin URI: https://wordpress.org/plugins/upload-max-file-size/
|
| 8 |
-
Version: 1.35
|
| 9 |
-
License: GPL2
|
| 10 |
-
Text Domain: upload-max-file-size
|
| 11 |
-
|
| 12 |
-
Copyright 2013 - 2019 WebFactory Ltd (email: support@webfactoryltd.com)
|
| 13 |
-
|
| 14 |
-
Increase Upload Max Filesize is free software; you can redistribute it and/or modify
|
| 15 |
-
it under the terms of the GNU General Public License, version 2, as
|
| 16 |
-
published by the Free Software Foundation.
|
| 17 |
-
|
| 18 |
-
Increase Upload Max Filesize is distributed in the hope that it will be useful,
|
| 19 |
-
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
| 20 |
-
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
| 21 |
-
GNU General Public License for more details.
|
| 22 |
-
|
| 23 |
-
You should have received a copy of the GNU General Public License
|
| 24 |
-
along with Upload Max File Size; if not, write to the Free Software
|
| 25 |
-
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
| 26 |
-
*/
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
// main plugin class
|
| 30 |
-
class WF_Upload_Max_File_Size
|
| 31 |
-
{
|
| 32 |
-
static function init()
|
| 33 |
-
{
|
| 34 |
-
if (is_admin()) {
|
| 35 |
-
add_action('admin_menu', array(__CLASS__, 'upload_max_file_size_add_pages'));
|
| 36 |
-
add_filter('install_plugins_table_api_args_featured', array(__CLASS__, 'featured_plugins_tab'));
|
| 37 |
-
add_filter('plugin_action_links_' . plugin_basename(__FILE__), array(__CLASS__, 'plugin_action_links'));
|
| 38 |
-
add_filter('plugin_row_meta', array(__CLASS__, 'plugin_meta_links'), 10, 2);
|
| 39 |
-
add_filter('admin_footer_text', array(__CLASS__, 'admin_footer_text'));
|
| 40 |
-
|
| 41 |
-
if (isset($_POST['upload_max_file_size_field'])
|
| 42 |
-
&& wp_verify_nonce($_POST['upload_max_file_size_nonce'], 'upload_max_file_size_action')
|
| 43 |
-
&& is_numeric($_POST['upload_max_file_size_field'])) {
|
| 44 |
-
$max_size = (int) $_POST['upload_max_file_size_field'] * 1024 * 1024;
|
| 45 |
-
update_option('max_file_size', $max_size);
|
| 46 |
-
wp_safe_redirect(admin_url('?page=upload_max_file_size&max-size-updated=true'));
|
| 47 |
-
}
|
| 48 |
-
}
|
| 49 |
-
|
| 50 |
-
add_filter('upload_size_limit', array(__CLASS__, 'upload_max_increase_upload'));
|
| 51 |
-
} // init
|
| 52 |
-
|
| 53 |
-
|
| 54 |
-
// get plugin version from header
|
| 55 |
-
static function get_plugin_version() {
|
| 56 |
-
$plugin_data = get_file_data(__FILE__, array('version' => 'Version'), 'plugin');
|
| 57 |
-
|
| 58 |
-
return $plugin_data['version'];
|
| 59 |
-
} // get_plugin_version
|
| 60 |
-
|
| 61 |
-
|
| 62 |
-
// test if we're on plugin's page
|
| 63 |
-
static function is_plugin_page() {
|
| 64 |
-
$current_screen = get_current_screen();
|
| 65 |
-
|
| 66 |
-
if ($current_screen->id == 'toplevel_page_upload_max_file_size') {
|
| 67 |
-
return true;
|
| 68 |
-
} else {
|
| 69 |
-
return false;
|
| 70 |
-
}
|
| 71 |
-
} // is_plugin_page
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
// add settings link to plugins page
|
| 75 |
-
static function plugin_action_links($links) {
|
| 76 |
-
$settings_link = '<a href="' . admin_url('admin.php?page=upload_max_file_size') . '" title="Adjust Max File Upload Size Settings">Settings</a>';
|
| 77 |
-
|
| 78 |
-
array_unshift($links, $settings_link);
|
| 79 |
-
|
| 80 |
-
return $links;
|
| 81 |
-
} // plugin_action_links
|
| 82 |
-
|
| 83 |
-
|
| 84 |
-
// add links to plugin's description in plugins table
|
| 85 |
-
static function plugin_meta_links($links, $file) {
|
| 86 |
-
$support_link = '<a target="_blank" href="https://wordpress.org/support/plugin/upload-max-file-size" title="Get help">Support</a>';
|
| 87 |
-
|
| 88 |
-
|
| 89 |
-
if ($file == plugin_basename(__FILE__)) {
|
| 90 |
-
$links[] = $support_link;
|
| 91 |
-
}
|
| 92 |
-
|
| 93 |
-
return $links;
|
| 94 |
-
} // plugin_meta_links
|
| 95 |
-
|
| 96 |
-
|
| 97 |
-
// additional powered by text in admin footer; only on plugin's page
|
| 98 |
-
static function admin_footer_text($text) {
|
| 99 |
-
if (!self::is_plugin_page()) {
|
| 100 |
-
return $text;
|
| 101 |
-
}
|
| 102 |
-
|
| 103 |
-
$text = '<i>Increase Maximum Upload File Size v' . self::get_plugin_version() . ' by <a href="https://www.webfactoryltd.com/" title="Visit our site to get more great plugins" target="_blank">WebFactory Ltd</a>.</i> ' . $text;
|
| 104 |
-
|
| 105 |
-
return $text;
|
| 106 |
-
} // admin_footer_text
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
/**
|
| 110 |
-
* Add menu pages
|
| 111 |
-
*
|
| 112 |
-
* @since 1.4
|
| 113 |
-
*
|
| 114 |
-
* @return null
|
| 115 |
-
*
|
| 116 |
-
*/
|
| 117 |
-
static function upload_max_file_size_add_pages()
|
| 118 |
-
{
|
| 119 |
-
// Add a new menu on main menu
|
| 120 |
-
add_menu_page('Increase Max Upload File Size', 'Increase Maximum Upload File Size', 'manage_options', 'upload_max_file_size', array(__CLASS__, 'upload_max_file_size_dash'), 'dashicons-upload');
|
| 121 |
-
} // upload_max_file_size_add_pages
|
| 122 |
-
|
| 123 |
-
|
| 124 |
-
/**
|
| 125 |
-
* Get closest value from array
|
| 126 |
-
*
|
| 127 |
-
* @since 1.4
|
| 128 |
-
*
|
| 129 |
-
* @param int search value
|
| 130 |
-
* @param array to find closest value in
|
| 131 |
-
*
|
| 132 |
-
* @return int in MB, closest value
|
| 133 |
-
*
|
| 134 |
-
*/
|
| 135 |
-
static function get_closest($search, $arr)
|
| 136 |
-
{
|
| 137 |
-
$closest = null;
|
| 138 |
-
foreach ($arr as $item) {
|
| 139 |
-
if ($closest === null || abs($search - $closest) > abs($item - $search)) {
|
| 140 |
-
$closest = $item;
|
| 141 |
-
}
|
| 142 |
-
}
|
| 143 |
-
return $closest;
|
| 144 |
-
} // get_closest
|
| 145 |
-
|
| 146 |
-
|
| 147 |
-
/**
|
| 148 |
-
* Dashboard Page
|
| 149 |
-
*
|
| 150 |
-
* @since 1.4
|
| 151 |
-
*
|
| 152 |
-
* @return null
|
| 153 |
-
*
|
| 154 |
-
*/
|
| 155 |
-
static function upload_max_file_size_dash()
|
| 156 |
-
{
|
| 157 |
-
echo '<style>';
|
| 158 |
-
echo '.wrap, .wrap p { font-size: 15px; } .form-table th { width: 230px; }';
|
| 159 |
-
echo '.gray-box { display: inline-block; padding: 15px; background-color: #e6e6e6; }';
|
| 160 |
-
echo '</style>';
|
| 161 |
-
|
| 162 |
-
if (isset($_GET['max-size-updated'])) {
|
| 163 |
-
echo '<div class="notice-success notice is-dismissible"><p>Maximum Upload File Size Saved & Changed!</p></div>';
|
| 164 |
-
}
|
| 165 |
-
|
| 166 |
-
$ini_size = ini_get('upload_max_filesize');
|
| 167 |
-
if (!$ini_size) {
|
| 168 |
-
$ini_size = 'unknown';
|
| 169 |
-
} elseif (is_numeric($ini_size)) {
|
| 170 |
-
$ini_size .= ' bytes';
|
| 171 |
-
} else {
|
| 172 |
-
$ini_size .= 'B';
|
| 173 |
-
}
|
| 174 |
-
|
| 175 |
-
$wp_size = wp_max_upload_size();
|
| 176 |
-
if (!$wp_size) {
|
| 177 |
-
$wp_size = 'unknown';
|
| 178 |
-
} else {
|
| 179 |
-
$wp_size = round(($wp_size / 1024 / 1024));
|
| 180 |
-
$wp_size = $wp_size == 1024 ? '1GB' : $wp_size . 'MB';
|
| 181 |
-
}
|
| 182 |
-
|
| 183 |
-
$max_size = get_option('max_file_size');
|
| 184 |
-
if (!$max_size) {
|
| 185 |
-
$max_size = 64 * 1024 * 1024;
|
| 186 |
-
}
|
| 187 |
-
$max_size = $max_size / 1024 / 1024;
|
| 188 |
-
|
| 189 |
-
|
| 190 |
-
$upload_sizes = array(16, 32, 64, 128, 256, 512, 1024);
|
| 191 |
-
|
| 192 |
-
$current_max_size = self::get_closest($max_size, $upload_sizes);
|
| 193 |
-
|
| 194 |
-
echo '<div class="wrap">';
|
| 195 |
-
echo '<h1><span class="dashicons dashicons-upload" style="font-size: inherit; line-height: unset;"></span> Increase Maximum Upload File Size</h1><br>';
|
| 196 |
-
|
| 197 |
-
echo '<p class="gray-box"><b>Important</b>: if you want to upload files larger than ' . $ini_size . ' (which is the limit set by your hosting provider) you have to contact your hosting provider.<br>It\'s <b>NOT POSSIBLE</b> to increase that hosting defined upload limit from a plugin.</p>';
|
| 198 |
-
|
| 199 |
-
echo '<p>Maximum upload file size, set by your hosting provider: ' . $ini_size . '.<br>';
|
| 200 |
-
echo 'Maximum upload file size, set by WordPress: ' . $wp_size . '.</p>';
|
| 201 |
-
|
| 202 |
-
echo '<form method="post">';
|
| 203 |
-
settings_fields("header_section");
|
| 204 |
-
echo '<table class="form-table"><tbody><tr><th scope="row"><label for="upload_max_file_size_field">Choose Maximum Upload File Size</label></th><td>';
|
| 205 |
-
echo '<select id="upload_max_file_size_field" name="upload_max_file_size_field">';
|
| 206 |
-
foreach ($upload_sizes as $size) {
|
| 207 |
-
echo '<option value="' . $size . '" ' . ($size == $current_max_size ? 'selected' : '') . '>' . ($size == 1024 ? '1GB' : $size . 'MB') . '</option>';
|
| 208 |
-
}
|
| 209 |
-
echo '</select>';
|
| 210 |
-
echo '</td></tr></tbody></table>';
|
| 211 |
-
echo wp_nonce_field('upload_max_file_size_action', 'upload_max_file_size_nonce');
|
| 212 |
-
submit_button();
|
| 213 |
-
echo '</form>';
|
| 214 |
-
|
| 215 |
-
echo '<p class="gray-box">Did the plugin help you? Please <a href="https://wordpress.org/support/plugin/upload-max-file-size/reviews/?filter=5" target="_blank">rate it with ★★★★★</a>. It\'s what keeps it free!</p>';
|
| 216 |
-
|
| 217 |
-
echo '</div>';
|
| 218 |
-
} // upload_max_file_size_dash
|
| 219 |
-
|
| 220 |
-
|
| 221 |
-
/**
|
| 222 |
-
* Filter to increase max_file_size
|
| 223 |
-
*
|
| 224 |
-
* @since 1.4
|
| 225 |
-
*
|
| 226 |
-
* @return int max_size in bytes
|
| 227 |
-
*
|
| 228 |
-
*/
|
| 229 |
-
static function upload_max_increase_upload()
|
| 230 |
-
{
|
| 231 |
-
$max_size = (int) get_option('max_file_size');
|
| 232 |
-
if (!$max_size) {
|
| 233 |
-
$max_size = 64 * 1024 * 1024;
|
| 234 |
-
}
|
| 235 |
-
|
| 236 |
-
return $max_size;
|
| 237 |
-
} // upload_max_increase_upload
|
| 238 |
-
|
| 239 |
-
|
| 240 |
-
// add our plugins to recommended list
|
| 241 |
-
static function plugins_api_result($res, $action, $args) {
|
| 242 |
-
remove_filter('plugins_api_result', array(__CLASS__, 'plugins_api_result'), 10, 3);
|
| 243 |
-
|
| 244 |
-
$res = self::add_plugin_favs('under-construction-page', $res);
|
| 245 |
-
$res = self::add_plugin_favs('wp-reset', $res);
|
| 246 |
-
$res = self::add_plugin_favs('eps-301-redirects', $res);
|
| 247 |
-
|
| 248 |
-
return $res;
|
| 249 |
-
} // plugins_api_result
|
| 250 |
-
|
| 251 |
-
|
| 252 |
-
// helper function for adding plugins to fav list
|
| 253 |
-
static function featured_plugins_tab($args) {
|
| 254 |
-
add_filter('plugins_api_result', array(__CLASS__, 'plugins_api_result'), 10, 3);
|
| 255 |
-
|
| 256 |
-
return $args;
|
| 257 |
-
} // featured_plugins_tab
|
| 258 |
-
|
| 259 |
-
|
| 260 |
-
// add single plugin to list of favs
|
| 261 |
-
static function add_plugin_favs($plugin_slug, $res) {
|
| 262 |
-
if (!empty($res->plugins) && is_array($res->plugins)) {
|
| 263 |
-
foreach ($res->plugins as $plugin) {
|
| 264 |
-
if (is_object($plugin) && !empty($plugin->slug) && $plugin->slug == $plugin_slug) {
|
| 265 |
-
return $res;
|
| 266 |
-
}
|
| 267 |
-
} // foreach
|
| 268 |
-
}
|
| 269 |
-
|
| 270 |
-
if ($plugin_info = get_transient('wf-plugin-info-' . $plugin_slug)) {
|
| 271 |
-
array_unshift($res->plugins, $plugin_info);
|
| 272 |
-
} else {
|
| 273 |
-
$plugin_info = plugins_api('plugin_information', array(
|
| 274 |
-
'slug' => $plugin_slug,
|
| 275 |
-
'is_ssl' => is_ssl(),
|
| 276 |
-
'fields' => array(
|
| 277 |
-
'banners' => true,
|
| 278 |
-
'reviews' => true,
|
| 279 |
-
'downloaded' => true,
|
| 280 |
-
'active_installs' => true,
|
| 281 |
-
'icons' => true,
|
| 282 |
-
'short_description' => true,
|
| 283 |
-
)
|
| 284 |
-
));
|
| 285 |
-
if (!is_wp_error($plugin_info)) {
|
| 286 |
-
$res->plugins[] = $plugin_info;
|
| 287 |
-
set_transient('wf-plugin-info-' . $plugin_slug, $plugin_info, DAY_IN_SECONDS * 7);
|
| 288 |
-
}
|
| 289 |
-
}
|
| 290 |
-
|
| 291 |
-
return $res;
|
| 292 |
-
} // add_plugin_favs
|
| 293 |
-
} // class WF_Upload_Max_File_Size
|
| 294 |
-
|
| 295 |
-
add_action('init', array('WF_Upload_Max_File_Size', 'init'));
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
views/admin-form.php
ADDED
|
@@ -0,0 +1,57 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<div class="wrap-content-inner">
|
| 2 |
+
<div class="wrapper-form-content">
|
| 3 |
+
<p class="gray-box">
|
| 4 |
+
<?php
|
| 5 |
+
printf(
|
| 6 |
+
// translators: %1$s %2$s: bold markup, %3$s: ini size value.
|
| 7 |
+
esc_html__( '%1$sImportant%2$s: if you want to upload files larger than %3$s (which is the limit set by your hosting provider) you have to contact your hosting provider. It\'s %1$sNOT POSSIBLE%2$s to increase that hosting defined upload limit from a plugin.', 'upload-max-file-size' ),
|
| 8 |
+
'<strong>',
|
| 9 |
+
'</strong>',
|
| 10 |
+
$ini_size // phpcs:ignore WordPress.Security.EscapeOutput
|
| 11 |
+
);
|
| 12 |
+
?>
|
| 13 |
+
</p>
|
| 14 |
+
<p class="txt">
|
| 15 |
+
<?php
|
| 16 |
+
printf(
|
| 17 |
+
// translators: %1$s: ini size value.
|
| 18 |
+
esc_html__( 'Maximum upload file size, set by your hosting provider: %1$s', 'upload-max-file-size' ),
|
| 19 |
+
$ini_size // phpcs:ignore WordPress.Security.EscapeOutput
|
| 20 |
+
);
|
| 21 |
+
?>
|
| 22 |
+
<br>
|
| 23 |
+
<?php
|
| 24 |
+
printf(
|
| 25 |
+
// translators: %1$s: ini size value.
|
| 26 |
+
esc_html__( 'Maximum upload file size, set by WordPress: %1$s', 'upload-max-file-size' ),
|
| 27 |
+
$wp_size // phpcs:ignore WordPress.Security.EscapeOutput
|
| 28 |
+
);
|
| 29 |
+
?>
|
| 30 |
+
</p>
|
| 31 |
+
</div>
|
| 32 |
+
<form method="post">
|
| 33 |
+
<?php settings_fields( 'header_section' ); ?>
|
| 34 |
+
<table class="form-table">
|
| 35 |
+
<tbody>
|
| 36 |
+
<tr>
|
| 37 |
+
<th scope="row">
|
| 38 |
+
<label for="upload_max_file_size_field">
|
| 39 |
+
<?php esc_html_e( 'Choose Maximum Upload File Size', 'upload-max-file-size' ); ?>
|
| 40 |
+
</label>
|
| 41 |
+
</th>
|
| 42 |
+
<td>
|
| 43 |
+
<select id="upload_max_file_size_field" name="upload_max_file_size_field">';
|
| 44 |
+
<?php foreach ( $upload_sizes as $size ) : ?>
|
| 45 |
+
<option value="<?php echo (int) $size; ?>" <?php selected( $size, $current_max_size ); ?>>
|
| 46 |
+
<?php echo ( 1024 === $size ) ? '1GB' : (int) $size . 'MB'; ?>
|
| 47 |
+
</option>';
|
| 48 |
+
<?php endforeach; ?>
|
| 49 |
+
</select>
|
| 50 |
+
</td>
|
| 51 |
+
</tr>
|
| 52 |
+
</tbody>
|
| 53 |
+
</table>
|
| 54 |
+
<?php echo wp_nonce_field( 'upload_max_file_size_action', 'upload_max_file_size_nonce' ); // phpcs:ignore WordPress.Security.EscapeOutput ?>
|
| 55 |
+
<?php submit_button(); ?>
|
| 56 |
+
</form>
|
| 57 |
+
</div>
|
views/admin-page.php
ADDED
|
@@ -0,0 +1,246 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
<?php
|
| 2 |
+
/**
|
| 3 |
+
* Admin Page view
|
| 4 |
+
*/
|
| 5 |
+
|
| 6 |
+
defined( 'ABSPATH' ) || die( 'Cheatin\' uh?' );
|
| 7 |
+
|
| 8 |
+
global $wp_version;
|
| 9 |
+
$heading_tag = version_compare( $wp_version, '4.3' ) >= 0 ? 'h1' : 'h2';
|
| 10 |
+
$notices->echo_notices();
|
| 11 |
+
?>
|
| 12 |
+
<div class="wrap">
|
| 13 |
+
<<?php echo $heading_tag; // phpcs:ignore WordPress.Security.EscapeOutput ?> class="screen-reader-text"><?php echo esc_html( get_admin_page_title() ); ?></<?php echo $heading_tag; // phpcs:ignore WordPress.Security.EscapeOutput ?>>
|
| 14 |
+
<div class="wrapper-settings">
|
| 15 |
+
<div class="header">
|
| 16 |
+
<div class="header-left">
|
| 17 |
+
<div class="visuel">
|
| 18 |
+
<img src="<?php echo esc_url( $asset_image_url . 'logo.svg' ); ?>" alt="">
|
| 19 |
+
</div>
|
| 20 |
+
</div>
|
| 21 |
+
<div class="header-right">
|
| 22 |
+
<div class="txt-1"><?php esc_html_e( 'Do you like this plugin ?', 'upload-max-file-size' ); ?></div>
|
| 23 |
+
<div class="txt-2">
|
| 24 |
+
<?php
|
| 25 |
+
printf(
|
| 26 |
+
// translators: %1$s %2$s: link markup.
|
| 27 |
+
esc_html__( 'Please, take a few seconds to %1$srate it on WordPress.org%2$s', 'upload-max-file-size' ),
|
| 28 |
+
'<a href="https://wordpress.org/support/plugin/upload-max-file-size/reviews/?filter=5"><strong>',
|
| 29 |
+
'</strong></a>'
|
| 30 |
+
);
|
| 31 |
+
?>
|
| 32 |
+
</div>
|
| 33 |
+
<div class="txt-3">
|
| 34 |
+
<a href="https://wordpress.org/support/plugin/upload-max-file-size/reviews/?filter=5">
|
| 35 |
+
<span class="dashicons dashicons-star-filled"></span>
|
| 36 |
+
<span class="dashicons dashicons-star-filled"></span>
|
| 37 |
+
<span class="dashicons dashicons-star-filled"></span>
|
| 38 |
+
<span class="dashicons dashicons-star-filled"></span>
|
| 39 |
+
<span class="dashicons dashicons-star-filled"></span>
|
| 40 |
+
</a>
|
| 41 |
+
</div>
|
| 42 |
+
</div>
|
| 43 |
+
</div>
|
| 44 |
+
<div class="wrapper-nav">
|
| 45 |
+
<h2 class="nav-tab-wrapper">
|
| 46 |
+
<span class="nav-tab nav-tab-active" data-tab="general-settings"><?php esc_html_e( 'General settings', 'upload-max-file-size' ); ?></span>
|
| 47 |
+
<?php if ( ! $plugins_block['imagify']->is_activated() ) : ?>
|
| 48 |
+
<span class="nav-tab" data-tab="more-optimization"><?php esc_html_e( 'More optimization', 'upload-max-file-size' ); ?></span>
|
| 49 |
+
<?php endif; ?>
|
| 50 |
+
<span class="nav-tab" data-tab="about-us" ><?php esc_html_e( 'About us', 'upload-max-file-size' ); ?></span>
|
| 51 |
+
</h2>
|
| 52 |
+
</div>
|
| 53 |
+
<div id="tab_general-settings" class="tab tab-active"><?php UMFS\Plugin::upload_max_file_size_form(); ?></div>
|
| 54 |
+
<?php if ( ! $plugins_block['imagify']->is_activated() ) : ?>
|
| 55 |
+
<div id="tab_more-optimization" class="tab">
|
| 56 |
+
<div class="wrapper-content wrapper-intro">
|
| 57 |
+
<div class="wrapper-left">
|
| 58 |
+
<div class="wrapper-img">
|
| 59 |
+
<img src="<?php echo esc_url( $asset_image_url . 'Imagify-Logo-Gray-Colored.svg' ); ?>" alt="">
|
| 60 |
+
</div>
|
| 61 |
+
<div class="wrapper-txt">
|
| 62 |
+
<p>
|
| 63 |
+
<?php
|
| 64 |
+
printf(
|
| 65 |
+
// translators: %1$s %2$s: bold markup, %3$s: break line.
|
| 66 |
+
esc_html__( 'Looking for more optimization?%3$sThen you should use %1$sImagify%2$s to speed up your website with %1$slighter images%2$s. Our algorithms will reduce the weight of your images without sacrificing their quality.', 'upload-max-file-size' ),
|
| 67 |
+
'<strong>',
|
| 68 |
+
'</strong>',
|
| 69 |
+
'<br/>'
|
| 70 |
+
);
|
| 71 |
+
?>
|
| 72 |
+
</p>
|
| 73 |
+
</div>
|
| 74 |
+
<a class="btn referer-link <?php echo esc_attr( $plugins_block['imagify']->get_status() ); ?>" href="<?php echo esc_url( $plugins_block['imagify']->get_install_url() ); ?>">
|
| 75 |
+
<?php echo esc_html( $plugins_block['imagify']->get_button_text() ); ?>
|
| 76 |
+
</a>
|
| 77 |
+
<div class="wrapper-img"></div>
|
| 78 |
+
</div>
|
| 79 |
+
<div class="wrapper-right">
|
| 80 |
+
<div class="wrapper-right-img"></div>
|
| 81 |
+
</div>
|
| 82 |
+
</div>
|
| 83 |
+
<div class="wrapper-content wrapper-numbers">
|
| 84 |
+
<div class="top-part">
|
| 85 |
+
<?php esc_html_e( 'Imagify will help you reach perfection!', 'upload-max-file-size' ); ?>
|
| 86 |
+
</div>
|
| 87 |
+
<div class="bottom-part">
|
| 88 |
+
<ul>
|
| 89 |
+
<li>
|
| 90 |
+
<div class="visuel">
|
| 91 |
+
<img src="<?php echo esc_url( $asset_image_url . 'fusee.svg' ); ?>" alt="">
|
| 92 |
+
</div>
|
| 93 |
+
<div class="txt-title">
|
| 94 |
+
<?php
|
| 95 |
+
printf(
|
| 96 |
+
// translators: %1$s %2$s: bold markup.
|
| 97 |
+
esc_html__( '%1$sSpeed up your websites%2$s', 'upload-max-file-size' ),
|
| 98 |
+
'<strong>',
|
| 99 |
+
'</strong>'
|
| 100 |
+
);
|
| 101 |
+
?>
|
| 102 |
+
</div>
|
| 103 |
+
<div class="txt">
|
| 104 |
+
<?php esc_html_e( 'With lighter images, you will gain in speed, user experience and even in SEO.', 'upload-max-file-size' ); ?>
|
| 105 |
+
</div>
|
| 106 |
+
</li>
|
| 107 |
+
<li>
|
| 108 |
+
<div class="visuel">
|
| 109 |
+
<img src="<?php echo esc_url( $asset_image_url . 'time.svg' ); ?>" alt="">
|
| 110 |
+
</div>
|
| 111 |
+
<div class="txt-title">
|
| 112 |
+
<?php
|
| 113 |
+
printf(
|
| 114 |
+
// translators: %1$s %2$s: bold markup.
|
| 115 |
+
esc_html__( '%1$sSave time%2$s', 'upload-max-file-size' ),
|
| 116 |
+
'<strong>',
|
| 117 |
+
'</strong>'
|
| 118 |
+
);
|
| 119 |
+
?>
|
| 120 |
+
</div>
|
| 121 |
+
<div class="txt">
|
| 122 |
+
<?php esc_html_e( 'Stop fine-tuning your images, they are now automatically optimized.', 'upload-max-file-size' ); ?>
|
| 123 |
+
</div>
|
| 124 |
+
</li>
|
| 125 |
+
<li>
|
| 126 |
+
<div class="visuel">
|
| 127 |
+
<img src="<?php echo esc_url( $asset_image_url . 'optimize.svg' ); ?>" alt="">
|
| 128 |
+
</div>
|
| 129 |
+
<div class="txt-title">
|
| 130 |
+
<?php
|
| 131 |
+
printf(
|
| 132 |
+
// translators: %1$s %2$s: bold markup.
|
| 133 |
+
esc_html__( '%1$sOptimize every format%2$s', 'upload-max-file-size' ),
|
| 134 |
+
'<strong>',
|
| 135 |
+
'</strong>'
|
| 136 |
+
);
|
| 137 |
+
?>
|
| 138 |
+
</div>
|
| 139 |
+
<div class="txt">
|
| 140 |
+
<?php esc_html_e( 'Optimize pdf, jpg, png and gif formats. And for each image, you also get its WebP version.', 'upload-max-file-size' ); ?>
|
| 141 |
+
</div>
|
| 142 |
+
</li>
|
| 143 |
+
<li>
|
| 144 |
+
<div class="visuel">
|
| 145 |
+
<img src="<?php echo esc_url( $asset_image_url . 'quality.svg' ); ?>" alt="">
|
| 146 |
+
</div>
|
| 147 |
+
<div class="txt-title">
|
| 148 |
+
<?php
|
| 149 |
+
printf(
|
| 150 |
+
// translators: %1$s %2$s: bold markup.
|
| 151 |
+
esc_html__( '%1$sDon\'t sacrifice quality%2$s', 'upload-max-file-size' ),
|
| 152 |
+
'<strong>',
|
| 153 |
+
'</strong>'
|
| 154 |
+
);
|
| 155 |
+
?>
|
| 156 |
+
</div>
|
| 157 |
+
<div class="txt">
|
| 158 |
+
<?php esc_html_e( 'Reduce the weight of your images without sacrificing their quality. They will remain beautiful.', 'upload-max-file-size' ); ?>
|
| 159 |
+
</div>
|
| 160 |
+
</li>
|
| 161 |
+
</ul>
|
| 162 |
+
</div>
|
| 163 |
+
</div>
|
| 164 |
+
<div class="wrapper-compare-imgs">
|
| 165 |
+
<div class="txt-title">
|
| 166 |
+
<?php esc_html_e( 'You will not see any image degradation!', 'upload-max-file-size' ); ?>
|
| 167 |
+
</div>
|
| 168 |
+
<div id="container1" class="twentytwenty-container">
|
| 169 |
+
<img src="<?php echo esc_url( $asset_image_url . 'bridge-original.jpg' ); ?>" alt="">
|
| 170 |
+
<img src="<?php echo esc_url( $asset_image_url . 'bridge-normal.jpg' ); ?>" alt="">
|
| 171 |
+
</div>
|
| 172 |
+
<div class="compare-imgs-txt">
|
| 173 |
+
<div class="compare-imgs-txt-left">
|
| 174 |
+
<p>
|
| 175 |
+
<?php
|
| 176 |
+
printf(
|
| 177 |
+
// translators: %1$s %2$s: bold markup.
|
| 178 |
+
esc_html__( 'Level : %1$sOriginal%2$s', 'upload-max-file-size' ),
|
| 179 |
+
'<strong>',
|
| 180 |
+
'</strong>'
|
| 181 |
+
);
|
| 182 |
+
?>
|
| 183 |
+
</p>
|
| 184 |
+
<p>
|
| 185 |
+
<?php esc_html_e( 'File Size : 682kb', 'upload-max-file-size' ); ?>
|
| 186 |
+
</p>
|
| 187 |
+
</div>
|
| 188 |
+
<div class="compare-imgs-txt-right">
|
| 189 |
+
<p>
|
| 190 |
+
<?php esc_html_e( 'Level : Ultra', 'upload-max-file-size' ); ?>
|
| 191 |
+
</p>
|
| 192 |
+
<p>
|
| 193 |
+
<?php
|
| 194 |
+
printf(
|
| 195 |
+
// translators: %1$s %2$s: bold markup.
|
| 196 |
+
esc_html__( 'File Size : %1$s175kb%2$s', 'upload-max-file-size' ),
|
| 197 |
+
'<strong>',
|
| 198 |
+
'</strong>'
|
| 199 |
+
);
|
| 200 |
+
?>
|
| 201 |
+
</p>
|
| 202 |
+
<p>
|
| 203 |
+
<?php esc_html_e( 'Original Saving : 74,37%', 'upload-max-file-size' ); ?>
|
| 204 |
+
</p>
|
| 205 |
+
</div>
|
| 206 |
+
</div>
|
| 207 |
+
</div>
|
| 208 |
+
<div class="wrapper-content wrapper-install">
|
| 209 |
+
<div class="txt">
|
| 210 |
+
<?php
|
| 211 |
+
printf(
|
| 212 |
+
// translators: %1$s: break line.
|
| 213 |
+
esc_html__( 'Compress your images in one click with%1$s the Imagify WordPress plugin', 'upload-max-file-size' ),
|
| 214 |
+
'<br>'
|
| 215 |
+
);
|
| 216 |
+
?>
|
| 217 |
+
</div>
|
| 218 |
+
<div class="install-btn">
|
| 219 |
+
<a class="btn referer-link <?php echo esc_attr( $plugins_block['imagify']->get_status() ); ?>" href="<?php echo esc_url( $plugins_block['imagify']->get_install_url() ); ?>">
|
| 220 |
+
<?php echo esc_html( $plugins_block['imagify']->get_button_text() ); ?>
|
| 221 |
+
</a>
|
| 222 |
+
</div>
|
| 223 |
+
</div>
|
| 224 |
+
</div>
|
| 225 |
+
<?php endif; ?>
|
| 226 |
+
<div id="tab_about-us" class="tab">
|
| 227 |
+
<div class="wrapper-top wrapper-info">
|
| 228 |
+
<div class="top-img">
|
| 229 |
+
<img src="<?php echo esc_url( $asset_image_url . 'team.jpg' ); ?>" alt="">
|
| 230 |
+
</div>
|
| 231 |
+
<div class="top-txt">
|
| 232 |
+
<h2><?php esc_html_e( 'Welcome to WP Media!', 'upload-max-file-size' ); ?></h2>
|
| 233 |
+
<p><?php esc_html_e( 'Founded in 2014 in beautiful Lyon (France), WP Media is now a distributed company of more than 20 WordPress lovers living in the four corners of the world.', 'upload-max-file-size' ); ?></p>
|
| 234 |
+
<p><?php esc_html_e( 'We develop plugins that make the web a better place - faster, lighter, and easier to use.', 'upload-max-file-size' ); ?></p>
|
| 235 |
+
<p><?php esc_html_e( 'Check out our other plugins: we built them all to give a boost to the performance of your website!', 'upload-max-file-size' ); ?></p>
|
| 236 |
+
</div>
|
| 237 |
+
</div>
|
| 238 |
+
<div class="wrapper-bottom wrapper-link">
|
| 239 |
+
<?php $plugins_block['wp-rocket']->helper(); ?>
|
| 240 |
+
<?php $plugins_block['imagify']->helper(); ?>
|
| 241 |
+
<?php $plugins_block['rocket-lazy-load']->helper(); ?>
|
| 242 |
+
<?php $plugins_block['heartbeat-control']->helper(); ?>
|
| 243 |
+
</div>
|
| 244 |
+
</div>
|
| 245 |
+
</div>
|
| 246 |
+
</div>
|
