plugin installs
72
wp/wp-content/plugins/gravityformshubspot/change_log.txt
Normal file
@@ -0,0 +1,72 @@
|
|||||||
|
### 2.1.0 | 2024-03-14
|
||||||
|
- Updated the additional contact field settings to use the generic field map instead of the deprecated dynamic field map field type.
|
||||||
|
- Updated to use the v3 Owners API before v2 is sunset in August 2024.
|
||||||
|
- Updated the minimum Gravity Forms version to 2.7.1.
|
||||||
|
- Fixed a JavaScript error on the feed configuration page with Gravity Forms 2.8+.
|
||||||
|
|
||||||
|
### 2.0.0 | 2023-11-01
|
||||||
|
- Fixed a bug where feeds can't be created or edited due to an invalid_lifecycle_stage error.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.9 | 2023-04-06
|
||||||
|
- Added support for async (background) feed processing to improve form submission performance.
|
||||||
|
- Fixed an issue where auth token refresh requests continue to occur after the app is uninstalled from within the connected HubSpot account.
|
||||||
|
- Fixed an issue where unnecessary auth token refresh requests can occur during feed processing.
|
||||||
|
- Fixed an issue where the connect button is displayed on the settings page when API requests are being rate limited.
|
||||||
|
- Fixed an issue that causes the API to initialize on all front-end pages containing forms and all admin pages.
|
||||||
|
- Fixed an issue where multiple auth token refresh requests can occur around the same time.
|
||||||
|
- Fixed an issue where HubSpot forms are recreated when reconnecting to the same HubSpot account.
|
||||||
|
- Fixed a fatal error that can occur when attempting to reconnect the add-on during an API outage.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.8 | 2022-11-3
|
||||||
|
- Fixed an issue with lifecycle stages which causes feeds to error when being saved or updated.
|
||||||
|
- Fixed a typo in the "clear cache" setting description.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.7 | 2021-11-10
|
||||||
|
- Updated the styling for the disconnect alert messaging.
|
||||||
|
- Fixed an issue where the disconnect from HubSpot button doesn't show when used with Gravity Forms 2.4.
|
||||||
|
- Fixed an issue where the lead status and lifecycle stage fields are missing from the feed configuration page.
|
||||||
|
- Fixed an issue where the add-on is disconnected after HubSpot reduced auth token lifespan from 6 hours to 30 minutes.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.6 | 2021-10-12
|
||||||
|
- Added a button in the add-on settings page to manually clear the contact custom properties cache.
|
||||||
|
- Added support for mapping single checkbox, multiple checkboxes, dropdown select, and radio select type HubSpot properties.
|
||||||
|
- Added security enhancements.
|
||||||
|
- Fixed an issue where a notice appears on the feed settings edit page.
|
||||||
|
- Fixed fatal errors that can occur when the Hubspot API returns an error while updating feed settings.
|
||||||
|
- Fixed an issue where authentication may not complete after attempting a connection with HubSpot.
|
||||||
|
- Fixed issue where conditional Contact Owner feed settings are not getting saved.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.5 | 2020-09-23
|
||||||
|
- Added support for Gravity Forms 2.5.
|
||||||
|
- Fixed PHP warnings and notices which occur when the request to the HubSpot API to get the contact properties fails.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.4 | 2020-07-14
|
||||||
|
- Added security enhancements.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.3 | 2020-05-18
|
||||||
|
- Added translations for Hebrew, Hindi, Japanese, and Turkish.
|
||||||
|
- Added support for feed duplication.
|
||||||
|
- Fixed a PHP 7.4 notice which can occur when generating the HubSpot form for a feed outside the Form Settings area.
|
||||||
|
- Fixed an issue with the position in the Form Settings menu when multiple add-ons are installed.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.2 | 2019-10-23
|
||||||
|
- Updated the text in the add-on settings.
|
||||||
|
- Updated the submission process to always send the IP address to Hubspot unless saving of the submitter IP is disabled in a form's personal data settings.
|
||||||
|
- Fixed an issue where references to the add-on would appear as "Gravity Forms HubSpot Add-On Add-On."
|
||||||
|
- Fixed an issue where HubSpot users without names display as empty labels when assigning contact owner(s) for a feed.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.1 | 2019-08-07
|
||||||
|
- Added security enhancements.
|
||||||
|
|
||||||
|
|
||||||
|
### 1.0 | 2019-07-18
|
||||||
|
- All new!
|
||||||
2424
wp/wp-content/plugins/gravityformshubspot/class-gf-hubspot.php
Normal file
@@ -0,0 +1,96 @@
|
|||||||
|
|
||||||
|
.gform-routing-row{
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
#assignees,
|
||||||
|
#editable_fields{
|
||||||
|
position: absolute;
|
||||||
|
left: -9999px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.rtl #assignees,
|
||||||
|
.rtl #editable_fields{
|
||||||
|
right: -9999px;
|
||||||
|
left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.gforms_form_settings th{
|
||||||
|
border-left: 0;
|
||||||
|
padding-left: 0!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
table.gform-routings thead th{
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.gform-routings tr.gform-routing-row td{
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.gform-routings tr.gform-routing-row td .repeater-buttons{
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.repeater-buttons{
|
||||||
|
display:inline-block;
|
||||||
|
}
|
||||||
|
.gform-routing-owners,
|
||||||
|
.gform-routing-field{
|
||||||
|
width:100%;
|
||||||
|
min-width:150px;
|
||||||
|
}
|
||||||
|
.gform-routing-operator{
|
||||||
|
width:120px;
|
||||||
|
}
|
||||||
|
.gform-routing-value{
|
||||||
|
width:190px;
|
||||||
|
}
|
||||||
|
|
||||||
|
html:not([dir="rtl"]) .gform-routings__heading {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
html[dir="rtl"] .gform-routings__heading {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
|
||||||
|
#gaddon-setting-row-additional_fields > th, #gaddon-setting-row-contact_owner_conditional > th {
|
||||||
|
display:none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.contact_owner_section {
|
||||||
|
display:none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.add-item {
|
||||||
|
margin-left: 6px;
|
||||||
|
}
|
||||||
|
.add-item, .remove-item {
|
||||||
|
position: relative;
|
||||||
|
color: #444;
|
||||||
|
top: 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#feed_condition_conditional_logic_container {
|
||||||
|
margin-top:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gform-routings-field__buttons {
|
||||||
|
position: relative;
|
||||||
|
vertical-align: middle;
|
||||||
|
width: 40px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gform-routings-field__buttons .repeater-buttons {
|
||||||
|
align-items: center;
|
||||||
|
display: flex;
|
||||||
|
flex: 1 0;
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
height: 100%;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/gravityformshubspot/css/form_settings.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.gform-routing-row{vertical-align:top}#assignees,#editable_fields{left:-9999px;position:absolute}.rtl #assignees,.rtl #editable_fields{left:auto;right:-9999px}table.gforms_form_settings th{border-left:0;padding-left:0!important}table.gform-routings thead th{padding:0}table.gform-routings tr.gform-routing-row td{vertical-align:top}table.gform-routings tr.gform-routing-row td .repeater-buttons{white-space:nowrap}.repeater-buttons{display:inline-block}.gform-routing-field,.gform-routing-owners{min-width:150px;width:100%}.gform-routing-operator{width:120px}.gform-routing-value{width:190px}html:not([dir=rtl]) .gform-routings__heading{text-align:left}html[dir=rtl] .gform-routings__heading{text-align:right}#gaddon-setting-row-additional_fields>th,#gaddon-setting-row-contact_owner_conditional>th{display:none!important}.contact_owner_section{display:none}.add-item{margin-left:6px}.add-item,.remove-item{color:#444;position:relative;top:3px}#feed_condition_conditional_logic_container{margin-top:10px}.gform-routings-field__buttons{position:relative;vertical-align:middle;width:40px}.gform-routings-field__buttons .repeater-buttons{align-items:center;bottom:0;display:flex;flex:1 0;height:100%;position:absolute;top:0;width:100%}
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
#deauth_scope {
|
||||||
|
display: none;
|
||||||
|
margin-top: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.deauth_button {
|
||||||
|
margin-top: 0.5em !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#gform_hubspot_deauth_button {
|
||||||
|
border: 1px solid #9E0B0F;
|
||||||
|
background: #9E0B0F;
|
||||||
|
color: #FFF;
|
||||||
|
-webkit-box-shadow: inset 0 2px 5px -3px rgba( 173, 12, 17, 0.5 );
|
||||||
|
box-shadow: inset 0 2px 5px -3px rgba( 173, 12, 17, 0.5 );
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tab_gravityformshubspot table.gforms_form_settings > tbody > tr > th {
|
||||||
|
padding: 0;
|
||||||
|
width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#tab_gravityformshubspot table.gforms_form_settings #gform-settings-save,
|
||||||
|
#tab_gravityformshubspot .gform-settings-save-container {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
#last_cache_clearance {
|
||||||
|
font-size: 0.75rem;
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/gravityformshubspot/css/plugin_settings.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
#deauth_scope{display:none;margin-top:18px}.deauth_button{margin-top:.5em!important}#gform_hubspot_deauth_button{background:#9e0b0f;border:1px solid #9e0b0f;box-shadow:inset 0 2px 5px -3px rgba(173,12,17,.5);color:#fff;text-shadow:none}#tab_gravityformshubspot table.gforms_form_settings>tbody>tr>th{padding:0;width:0}#tab_gravityformshubspot .gform-settings-save-container,#tab_gravityformshubspot table.gforms_form_settings #gform-settings-save{display:none}#last_cache_clearance{font-size:.75rem}
|
||||||
75
wp/wp-content/plugins/gravityformshubspot/hubspot.php
Normal file
@@ -0,0 +1,75 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
Plugin Name: Gravity Forms HubSpot Add-On
|
||||||
|
Plugin URI: https://gravityforms.com
|
||||||
|
Description: Integrates Gravity Forms with HubSpot, allowing form submissions to be automatically sent to your HubSpot account.
|
||||||
|
Version: 2.1.0
|
||||||
|
Author: Gravity Forms
|
||||||
|
Author URI: https://gravityforms.com
|
||||||
|
License: GPL-3.0+
|
||||||
|
Text Domain: gravityformshubspot
|
||||||
|
Domain Path: /languages
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Copyright 2019-2024 Rocketgenius, Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see http://www.gnu.org/licenses.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
// Defines the current version of the Gravity Forms HubSpot Add-On.
|
||||||
|
define( 'GF_HSPOT_VERSION', '2.1.0' );
|
||||||
|
|
||||||
|
define( 'GF_HSPOT_MIN_GF_VERSION', '2.7.1' );
|
||||||
|
|
||||||
|
// After GF is loaded, load the add-on.
|
||||||
|
add_action( 'gform_loaded', array( 'GF_HSpot_Bootstrap', 'load_addon' ), 5 );
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the Gravity Forms HubSpot Add-On.
|
||||||
|
*
|
||||||
|
* Includes the main class and registers it with GFAddOn.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
class GF_HSpot_Bootstrap {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the required files.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @access public
|
||||||
|
* @static
|
||||||
|
*/
|
||||||
|
public static function load_addon() {
|
||||||
|
|
||||||
|
// Requires the class file.
|
||||||
|
require_once plugin_dir_path( __FILE__ ) . '/class-gf-hubspot.php';
|
||||||
|
|
||||||
|
// Registers the class name with GFAddOn.
|
||||||
|
GFAddOn::register( 'GF_HubSpot' );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an instance of the GF_HubSpot class
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return GF_HubSpot An instance of the GF_HubSpot class
|
||||||
|
*/
|
||||||
|
function gf_hspot() {
|
||||||
|
return GF_HubSpot::get_instance();
|
||||||
|
}
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="22" height="22" viewBox="0 0 22 22" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M20.3215 10.0344C19.8536 9.22941 19.1954 8.58406 18.3726 8.09821C17.7577 7.74025 17.1201 7.51306 16.4016 7.41549V4.85763C17.1201 4.55256 17.566 3.87731 17.566 3.08955C17.566 2.01582 16.705 1.14572 15.6321 1.14572C14.5584 1.14572 13.6822 2.01582 13.6822 3.08955C13.6822 3.87731 14.1024 4.55256 14.8209 4.85763V7.41664C14.2461 7.4997 13.65 7.67889 13.1057 7.95422C11.9939 7.10984 8.34823 4.33974 6.21558 2.72182C6.26616 2.53946 6.30511 2.35151 6.30511 2.1532C6.30511 0.963939 5.34203 0 4.15234 0C2.96265 0 2 0.963939 2 2.1532C2 3.34232 2.96365 4.30654 4.15335 4.30654C4.55915 4.30654 4.93449 4.18785 5.25839 3.9927L5.70846 4.33413L11.8927 8.78998C11.5658 9.09017 11.2613 9.4316 11.0177 9.8147C10.5241 10.5957 10.2225 11.455 10.2225 12.3924V12.588C10.2225 13.246 10.3475 13.8672 10.5605 14.4507C10.748 14.9603 11.0222 15.4236 11.3618 15.8425L9.30929 17.9C9.01184 17.7893 8.6888 17.7665 8.37878 17.8345C8.06876 17.9025 7.78487 18.0583 7.56104 18.2834C7.40607 18.4376 7.28324 18.621 7.19967 18.823C7.1161 19.025 7.07345 19.2416 7.07419 19.4603C7.07433 19.9047 7.24749 20.3225 7.5619 20.6367C7.71601 20.7918 7.89937 20.9148 8.10134 20.9985C8.30331 21.0822 8.51989 21.125 8.73852 21.1245C8.95722 21.125 9.17385 21.0822 9.37589 20.9985C9.57793 20.9148 9.76136 20.7918 9.91557 20.6367C10.0704 20.4825 10.1932 20.2992 10.2768 20.0972C10.3605 19.8953 10.4032 19.6788 10.4027 19.4603C10.4027 19.2883 10.3761 19.1204 10.3261 18.9609L12.4476 16.8392C12.7384 17.0401 13.0525 17.2092 13.3902 17.3551C14.0563 17.643 14.7914 17.8185 15.596 17.8185H15.7435C16.633 17.8185 17.472 17.6096 18.2608 17.1822C19.092 16.7305 19.7425 16.1129 20.2339 15.3244C20.728 14.5338 21 13.6603 21 12.6992V12.6512C21 11.7058 20.7811 10.8335 20.3215 10.0344ZM17.7294 14.4852C17.1536 15.1251 16.4917 15.5193 15.7435 15.5193H15.6202C15.1928 15.5193 14.7748 15.4012 14.3655 15.1863C13.9042 14.9498 13.5536 14.6124 13.2666 14.1852C12.97 13.7659 12.8091 13.308 12.8091 12.8226V12.6752C12.8091 12.198 12.9006 11.7455 13.1314 11.3181C13.3782 10.8509 13.7114 10.4876 14.1546 10.1988C14.5897 9.91199 15.0544 9.77131 15.572 9.77131H15.6202C16.0895 9.77131 16.5338 9.86385 16.9531 10.0784C17.3803 10.3072 17.7294 10.6197 18 11.0308C18.2628 11.4421 18.4192 11.8857 18.4694 12.369C18.4774 12.4694 18.4814 12.5723 18.4814 12.6706C18.4814 13.3264 18.2308 13.9339 17.7294 14.4852Z" fill="#242748"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.4 KiB |
@@ -0,0 +1,362 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gravity Forms HubSpot API Library.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @package GravityForms
|
||||||
|
* @author Rocketgenius
|
||||||
|
* @copyright Copyright (c) 2019, Rocketgenius
|
||||||
|
*/
|
||||||
|
class GF_HubSpot_API {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HubSpot API URL.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $api_url HubSpot API URL.
|
||||||
|
*/
|
||||||
|
protected $api_url = 'https://api.hubapi.com/';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* HubSpot authentication data.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var array $auth_data HubSpot authentication data.
|
||||||
|
*/
|
||||||
|
protected $auth_data = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize API library.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $auth_data HubSpot authentication data.
|
||||||
|
*/
|
||||||
|
public function __construct( $auth_data = null ) {
|
||||||
|
$this->auth_data = $auth_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Make API request.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $path Request path.
|
||||||
|
* @param array $options Request options.
|
||||||
|
* @param string $method Request method. Defaults to GET.
|
||||||
|
* @param string $return_key Array key from response to return. Defaults to null (return full response).
|
||||||
|
* @param int|array $response_code Expected HTTP response code.
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function make_request( $path = '', $options = array(), $method = 'GET', $return_key = null, $response_code = 200 ) {
|
||||||
|
|
||||||
|
// Log API call succeed.
|
||||||
|
gf_hspot()->log_debug( __METHOD__ . '(): Making request to: ' . $path );
|
||||||
|
|
||||||
|
// Get authentication data.
|
||||||
|
$auth_data = $this->auth_data;
|
||||||
|
|
||||||
|
// Build request URL.
|
||||||
|
if ( $path === 'token/revoke' ) {
|
||||||
|
$request_url = 'https://api.hubapi.com/oauth/v1/refresh-tokens/' . $options['token'];
|
||||||
|
|
||||||
|
// Execute request.
|
||||||
|
$response = wp_remote_request( $request_url, array( 'method' => $method ) );
|
||||||
|
} else {
|
||||||
|
$request_url = strpos( $path, 'https://' ) === 0 ? $path : $this->api_url . $path;
|
||||||
|
|
||||||
|
// Add options if this is a GET request.
|
||||||
|
if ( 'GET' === $method ) {
|
||||||
|
$request_url = add_query_arg( $options, $request_url );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Prepare request arguments.
|
||||||
|
$args = array(
|
||||||
|
'method' => $method,
|
||||||
|
'headers' => array(
|
||||||
|
'Accept' => 'application/json',
|
||||||
|
'Authorization' => 'Bearer ' . $auth_data['access_token'],
|
||||||
|
'Content-Type' => 'application/json',
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Add request arguments to body.
|
||||||
|
if ( in_array( $method, array( 'POST', 'PUT' ) ) ) {
|
||||||
|
$args['body'] = json_encode( $options );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Execute API request.
|
||||||
|
$response = wp_remote_request( $request_url, $args );
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( is_wp_error( $response ) ) {
|
||||||
|
gf_hspot()->log_error( __METHOD__ . '(): HTTP request failed; ' . $response->get_error_message() );
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If an incorrect response code was returned, return WP_Error.
|
||||||
|
$retrieved_response_code = wp_remote_retrieve_response_code( $response );
|
||||||
|
if ( is_int( $response_code ) ) {
|
||||||
|
$response_code = array( $response_code );
|
||||||
|
}
|
||||||
|
if ( ! in_array( $retrieved_response_code, $response_code, true ) ) {
|
||||||
|
$response_code = implode( ', ', $response_code );
|
||||||
|
$error_message = "Expected response code: {$response_code}. Returned response code: {$retrieved_response_code}.";
|
||||||
|
$json_body = gf_hspot()->maybe_decode_json( $response['body'] );
|
||||||
|
|
||||||
|
$error_data = array( 'status' => $retrieved_response_code );
|
||||||
|
if ( ! rgempty( 'message', $json_body ) ) {
|
||||||
|
$error_message = $json_body['message'];
|
||||||
|
}
|
||||||
|
if ( ! rgempty( rgars( $json_body, 'errors' ) ) ) {
|
||||||
|
$error_data['data'] = rgars( $json_body, 'errors' );
|
||||||
|
}
|
||||||
|
|
||||||
|
// 401 Unauthorized - Returned when the authentication provided is invalid.
|
||||||
|
if ( $retrieved_response_code === 401 ) {
|
||||||
|
$log = 'API credentials are invalid;';
|
||||||
|
} else {
|
||||||
|
$log = 'API errors returned;';
|
||||||
|
}
|
||||||
|
|
||||||
|
gf_hspot()->log_error( __METHOD__ . "(): $log " . $error_message . '; error data: ' . print_r( $error_data, true ) );
|
||||||
|
|
||||||
|
return new WP_Error( 'hubspot_api_error', $error_message, $error_data );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Convert JSON response to array.
|
||||||
|
$response = gf_hspot()->maybe_decode_json( $response['body'] );
|
||||||
|
|
||||||
|
// If a return key is defined and array item exists, return it.
|
||||||
|
if ( ! empty( $return_key ) && rgar( $response, $return_key ) ) {
|
||||||
|
return rgar( $response, $return_key );
|
||||||
|
}
|
||||||
|
|
||||||
|
return $response;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Refresh access tokens.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function refresh_token() {
|
||||||
|
// Get authentication data.
|
||||||
|
$auth_data = $this->auth_data;
|
||||||
|
|
||||||
|
// If refresh token is not provided, throw exception.
|
||||||
|
if ( ! rgar( $auth_data, 'refresh_token' ) ) {
|
||||||
|
return new WP_Error( 'hubspot_refresh_token_error', esc_html__( 'Refresh token must be provided.', 'gravityformshubspot' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
$args = array(
|
||||||
|
'body' => array(
|
||||||
|
'refresh_token' => $auth_data['refresh_token'],
|
||||||
|
'state' => wp_create_nonce( gf_hspot()->get_authentication_state_action() ),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
$response = wp_remote_post( gf_hspot()->get_gravity_api_url( '/auth/hubspot/refresh' ), $args );
|
||||||
|
$response_code = wp_remote_retrieve_response_code( $response );
|
||||||
|
$message = wp_remote_retrieve_response_message( $response );
|
||||||
|
|
||||||
|
if ( $response_code === 200 ) {
|
||||||
|
$auth_payload = json_decode( wp_remote_retrieve_body( $response ), true );
|
||||||
|
$auth_payload = json_decode( $auth_payload['auth_payload'], true );
|
||||||
|
|
||||||
|
if ( isset( $auth_payload['access_token'] ) && wp_verify_nonce( $auth_payload['state'], gf_hspot()->get_authentication_state_action() ) ) {
|
||||||
|
$auth_data['access_token'] = $auth_payload['access_token'];
|
||||||
|
$auth_data['refresh_token'] = $auth_payload['refresh_token'];
|
||||||
|
$auth_data['expires_in'] = $auth_payload['expires_in'];
|
||||||
|
|
||||||
|
$this->auth_data = $auth_data;
|
||||||
|
|
||||||
|
return $auth_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( isset( $auth_payload['error'] ) ) {
|
||||||
|
$message = $auth_payload['error'];
|
||||||
|
} elseif ( isset( $auth_payload['status'] ) ) {
|
||||||
|
$message = $auth_payload['status'];
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
return new WP_Error( 'hubspot_refresh_token_error', $message, array( 'status' => $response_code ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Revoke authentication token.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function revoke_token() {
|
||||||
|
|
||||||
|
// Get authentication data.
|
||||||
|
$auth_data = $this->auth_data;
|
||||||
|
|
||||||
|
// If refresh token is not provided, throw exception.
|
||||||
|
if ( ! rgar( $auth_data, 'refresh_token' ) ) {
|
||||||
|
return new WP_Error( 'hubspot_revoke_token_error', esc_html__( 'Refresh token must be provided.', 'gravityformshubspot' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->make_request( 'token/revoke', array( 'token' => $auth_data['refresh_token'] ), 'DELETE', null, 204 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get available users.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function get_contacts() {
|
||||||
|
static $contacts;
|
||||||
|
|
||||||
|
if ( ! isset( $contacts ) ) {
|
||||||
|
$contacts = $this->make_request( 'contacts/v1/lists/all/contacts/all', array(), 'GET', 'users' );
|
||||||
|
}
|
||||||
|
|
||||||
|
return $contacts;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get contact properties.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function get_contact_properties() {
|
||||||
|
|
||||||
|
$properties = $this->make_request( 'properties/v1/contacts/groups/?includeProperties=true', array(), 'GET' );
|
||||||
|
|
||||||
|
return $properties;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update contact properties by email.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $email Email.
|
||||||
|
* @param array $data Contact data.
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function update_contact_by_email( $email, $data ) {
|
||||||
|
return $this->make_request( "contacts/v1/contact/createOrUpdate/email/{$email}/", $data, 'POST' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Create a new form.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $form The form options array.
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function create_form( $form ) {
|
||||||
|
return $this->make_request( 'forms/v2/forms', $form, 'POST' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get form by guid.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $guid GUID of the form.
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function get_form( $guid ) {
|
||||||
|
return $this->make_request( "forms/v2/forms/{$guid}" );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get all forms.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array|WP_Error Returns an array of forms
|
||||||
|
*/
|
||||||
|
public function get_forms() {
|
||||||
|
return $this->make_request( 'forms/v2/forms' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Update the form.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $guid GUID of the form.
|
||||||
|
* @param array $form The form options array.
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function update_form( $guid, $form ) {
|
||||||
|
|
||||||
|
gf_hspot()->log_debug( 'Updating Form. GUID: ' . $guid );
|
||||||
|
gf_hspot()->log_debug( 'Payload: ' . print_r( $form, true ) );
|
||||||
|
|
||||||
|
return $this->make_request( "forms/v2/forms/{$guid}", $form, 'POST' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete form.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $guid GUID of the form.
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function delete_form( $guid ) {
|
||||||
|
return $this->make_request( "forms/v2/forms/{$guid}", array(), 'DELETE', null, 204 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get contact owners from HubSpot.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @since 2.1 Updated to use the v3 endpoint.
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function get_owners() {
|
||||||
|
return $this->make_request( 'crm/v3/owners', array( 'limit' => 500 ), 'GET', 'results' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Submit form data to HubSpot.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $portal_id HubSpot portal ID.
|
||||||
|
* @param string $form_guid HubSpot form GUID.
|
||||||
|
* @param array $submission Form submission data.
|
||||||
|
*
|
||||||
|
* @return array|WP_Error
|
||||||
|
*/
|
||||||
|
public function submit_form( $portal_id, $form_guid, $submission ) {
|
||||||
|
|
||||||
|
// Submit HubSpot form.
|
||||||
|
$url = "https://api.hsforms.com/submissions/v3/integration/submit/{$portal_id}/{$form_guid}";
|
||||||
|
|
||||||
|
gf_hspot()->log_debug( 'Submitting Form. URL:' . $url );
|
||||||
|
gf_hspot()->log_debug( 'Payload: ' . print_r( $submission, true ) );
|
||||||
|
|
||||||
|
return $this->make_request( $url, $submission, 'POST' );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,310 @@
|
|||||||
|
/* global jQuery, gform_hubspot_owner_settings_strings, gf_vars */
|
||||||
|
/* eslint-disable no-var */
|
||||||
|
|
||||||
|
jQuery(document).ready( function() {
|
||||||
|
|
||||||
|
new GFOwnerSetting();
|
||||||
|
|
||||||
|
} );
|
||||||
|
|
||||||
|
var legacyUI = gform_hubspot_owner_settings_strings.legacy_ui;
|
||||||
|
var prefix = {
|
||||||
|
input: legacyUI ? '_gaddon_setting_' : '_gform_setting_',
|
||||||
|
field: legacyUI ? 'gaddon-setting-row-' : 'gform_setting_',
|
||||||
|
};
|
||||||
|
|
||||||
|
function GFOwnerSetting() {
|
||||||
|
var $ = jQuery;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the Contact Owner module in the HubSpot feed settings.
|
||||||
|
*/
|
||||||
|
this.init = function() {
|
||||||
|
this.initOwner();
|
||||||
|
new GFConditionsSetting();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Binds event listeners to the contact owner inputs and initializes the state.
|
||||||
|
*/
|
||||||
|
this.initOwner = function() {
|
||||||
|
var t = this;
|
||||||
|
|
||||||
|
$( '#contact_owner0, #contact_owner1, #contact_owner2' ).on( 'change', function() {
|
||||||
|
t.toggleOwner( true );
|
||||||
|
} );
|
||||||
|
|
||||||
|
this.toggleOwner( false );
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Toggles the active owner inputs.
|
||||||
|
*
|
||||||
|
* @param {boolean} doSlide
|
||||||
|
*/
|
||||||
|
this.toggleOwner = function( doSlide ) {
|
||||||
|
var ownerRadioIds = [
|
||||||
|
'#' + prefix.field + 'contact_owner_select',
|
||||||
|
'#' + prefix.field + 'contact_owner_conditional',
|
||||||
|
];
|
||||||
|
var $section = $( '.contact_owner_section' );
|
||||||
|
var $selectedOption = $( 'input[name="' + prefix.input + 'contact_owner"]:checked' );
|
||||||
|
var selection = $selectedOption.val();
|
||||||
|
|
||||||
|
$( ownerRadioIds.join( ', ' ) ).hide();
|
||||||
|
|
||||||
|
// No contact owner selected. Hide and exit.
|
||||||
|
if ( selection === 'none' ) {
|
||||||
|
if ( doSlide && legacyUI ) {
|
||||||
|
$section.slideUp();
|
||||||
|
} else {
|
||||||
|
$section.hide();
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show the contact owner section and the selected option.
|
||||||
|
if ( $section.is( ':hidden' ) ) {
|
||||||
|
if ( doSlide && legacyUI ) {
|
||||||
|
$section.slideDown();
|
||||||
|
} else {
|
||||||
|
$section.show();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$( '#' + prefix.field + 'contact_owner_' + selection ).show();
|
||||||
|
};
|
||||||
|
|
||||||
|
//Initializes this class
|
||||||
|
this.init();
|
||||||
|
}
|
||||||
|
|
||||||
|
function GFConditionsSetting() {
|
||||||
|
var $ = jQuery;
|
||||||
|
|
||||||
|
//Instantiating conditions repeater
|
||||||
|
this.$element = jQuery('#gform_conditions_setting');
|
||||||
|
this.fieldId = 'conditions';
|
||||||
|
this.fieldName = prefix.input + 'conditions';
|
||||||
|
this.options = null;
|
||||||
|
|
||||||
|
this.init = function() {
|
||||||
|
|
||||||
|
var t = this;
|
||||||
|
|
||||||
|
this.options = {
|
||||||
|
fieldName: this.fieldName,
|
||||||
|
fieldId: this.fieldId,
|
||||||
|
fields: gform_hubspot_owner_settings_strings['fields'],// [{'id': '1', 'label':'Name'}, {'id':'2', 'label': 'Email'} ],// gf_routing_setting_strings['fields'],
|
||||||
|
owners: gform_hubspot_owner_settings_strings['owners'],
|
||||||
|
imagesURL: gf_vars.baseUrl + "/images",
|
||||||
|
items: this.getItems(),
|
||||||
|
operatorStrings: {"is":"is","isnot":"isNot", ">":"greaterThan", "<":"lessThan", "contains":"contains", "starts_with":"startsWith", "ends_with":"endsWith"},
|
||||||
|
};
|
||||||
|
|
||||||
|
var routingsMarkup, headerMarkup;
|
||||||
|
headerMarkup = '<thead><tr><th class="gform-routings__heading gform-routings__heading--assign">{0}</th>';
|
||||||
|
headerMarkup += '<th class="gform-routings__heading gform-routings__heading--condition" colspan="3">{1}</th>';
|
||||||
|
headerMarkup += '</tr></thead>';
|
||||||
|
|
||||||
|
headerMarkup = headerMarkup.gformFormat( gform_hubspot_owner_settings_strings.assign_to, gform_hubspot_owner_settings_strings.condition );
|
||||||
|
routingsMarkup = '<table class="gform-routings">{0}<tbody class="repeater">{1}</tbody></table>'.gformFormat(headerMarkup, this.getNewRow());
|
||||||
|
|
||||||
|
var $routings = $(routingsMarkup);
|
||||||
|
|
||||||
|
$routings.find('.repeater').repeater({
|
||||||
|
|
||||||
|
limit : 0,
|
||||||
|
items : this.options.items,
|
||||||
|
addButtonMarkup : '<i class="gficon-add"></i>',
|
||||||
|
removeButtonMarkup: '<i class="gficon-subtract"></i>',
|
||||||
|
callbacks : {
|
||||||
|
save : function (obj, data) {
|
||||||
|
$('#' + t.options.fieldId).val($.toJSON(data));
|
||||||
|
},
|
||||||
|
beforeAdd: function (obj, $elem, item) {
|
||||||
|
if ( item.owner ) {
|
||||||
|
$elem.find('.gform-routing-owners').val(item.owner);
|
||||||
|
}
|
||||||
|
|
||||||
|
var $field = $elem.find('.gform-routing-field').first();
|
||||||
|
$field.value = item.fieldId;
|
||||||
|
t.changeField($field);
|
||||||
|
|
||||||
|
var $operator = $elem.find('.gform-routing-operator').first();
|
||||||
|
$operator.value = item.operator;
|
||||||
|
|
||||||
|
t.changeOperator($operator);
|
||||||
|
|
||||||
|
var $value = $elem.find('.gform-routing-value');
|
||||||
|
$value.val(item.value);
|
||||||
|
|
||||||
|
},
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.on('change', '.gform-routing-field', function (e) {
|
||||||
|
t.changeField(this);
|
||||||
|
})
|
||||||
|
.on('change', '.gform-routing-operator', function () {
|
||||||
|
t.changeOperator(this);
|
||||||
|
})
|
||||||
|
|
||||||
|
this.$element.append($routings);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getNewRow = function () {
|
||||||
|
var r = [];
|
||||||
|
|
||||||
|
r.push( '<td>{0}</td>'.gformFormat( this.getOwners() ) );
|
||||||
|
r.push( '<td>{0}</td>'.gformFormat( this.getFields() ) );
|
||||||
|
r.push( '<td>{0}</td>'.gformFormat( this.getOperators( this.options.fields[0] ) ) );
|
||||||
|
r.push( '<td>{0}</td>'.gformFormat( this.getValues() ) );
|
||||||
|
r.push( '<td class="gform-routings-field gform-routings-field__buttons">{buttons}</td>' );
|
||||||
|
|
||||||
|
return '<tr class="gform-routing-row">{0}</tr>'.gformFormat( r.join('') );
|
||||||
|
},
|
||||||
|
|
||||||
|
this.getOwners = function () {
|
||||||
|
|
||||||
|
var i, n, account,
|
||||||
|
owners = this.options.owners,
|
||||||
|
str = '<select class="gform-routing-owners owner_{i}">';
|
||||||
|
|
||||||
|
for (i = 0; i < owners.length; i++) {
|
||||||
|
str += '<option value="{0}">{1}</option>'.gformFormat( owners[i].value, owners[i].label );
|
||||||
|
}
|
||||||
|
|
||||||
|
str += "</select>";
|
||||||
|
return str;
|
||||||
|
},
|
||||||
|
|
||||||
|
this.getFields = function () {
|
||||||
|
var i, j, key, val, label, groupLabel, options, numRows,
|
||||||
|
select = [],
|
||||||
|
settings = this.options.fields;
|
||||||
|
select.push('<select class="gform-routing-field fieldId_{i}" >');
|
||||||
|
for (i = 0; i < settings.length; i++) {
|
||||||
|
key = settings[i].key;
|
||||||
|
if (settings[i].group) {
|
||||||
|
groupLabel = settings[i].text;
|
||||||
|
numRows = settings[i].filters.length;
|
||||||
|
options = [];
|
||||||
|
for (j = 0; j < numRows; j++) {
|
||||||
|
label = settings[i].filters[j].text;
|
||||||
|
val = settings[i].filters[j].key;
|
||||||
|
options.push('<option value="{0}">{1}</option>'.gformFormat(val, label));
|
||||||
|
}
|
||||||
|
select.push('<optgroup label="{0}">{1}</optgroup>'.gformFormat(groupLabel, options.join('')));
|
||||||
|
} else {
|
||||||
|
label = settings[i].text;
|
||||||
|
select.push('<option value="{0}">{1}</option>'.gformFormat(key, label));
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
select.push("</select>");
|
||||||
|
return select.join('');
|
||||||
|
},
|
||||||
|
|
||||||
|
this.changeOperator = function (operatorSelect) {
|
||||||
|
var $select = $(operatorSelect),
|
||||||
|
$buttons = $select.closest('tr').find('.repeater-buttons');
|
||||||
|
var index = $buttons.find('.add-item ').data('index');
|
||||||
|
var $fieldSelect = $select.closest('tr').find('.gform-routing-field');
|
||||||
|
var filter = this.getFilter($fieldSelect.value);
|
||||||
|
if (filter) {
|
||||||
|
$select.closest('tr').find(".gform-routing-value").replaceWith(this.getValues(filter, operatorSelect.value, index));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
this.changeField = function (fieldSelect) {
|
||||||
|
var filter = this.getFilter(fieldSelect.value);
|
||||||
|
if (filter) {
|
||||||
|
var $select = $(fieldSelect),
|
||||||
|
$buttons = $select.closest('tr').find('.repeater-buttons');
|
||||||
|
var index = $buttons.find('.add-item ').data('index');
|
||||||
|
$select.closest('tr').find(".gform-routing-value").replaceWith(this.getValues(filter, null, index));
|
||||||
|
$select.closest('tr').find(".gform-filter-type").val(filter.type).change();
|
||||||
|
var $newOperators = $(this.getOperators(filter, index));
|
||||||
|
$select.closest('tr').find(".gform-routing-operator").replaceWith($newOperators);
|
||||||
|
$select.closest('tr').find(".gform-routing-operator").change();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
this.getOperators = function (filter, index) {
|
||||||
|
if ( typeof index == 'undefined' || index === null ){
|
||||||
|
index = '{i}';
|
||||||
|
}
|
||||||
|
var i, operator,
|
||||||
|
operatorStrings = this.options.operatorStrings,
|
||||||
|
str = '<select class="gform-routing-operator operator_{0}">'.gformFormat(index);
|
||||||
|
|
||||||
|
if (filter) {
|
||||||
|
for (i = 0; i < filter.operators.length; i++) {
|
||||||
|
operator = filter.operators[i];
|
||||||
|
str += '<option value="{0}">{1}</option>'.gformFormat(operator, gf_vars[operatorStrings[operator]] );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
str += "</select>";
|
||||||
|
return str;
|
||||||
|
},
|
||||||
|
|
||||||
|
this.getValues = function (filter, selectedOperator, index) {
|
||||||
|
var i, val, text, str, options = "";
|
||||||
|
|
||||||
|
if ( typeof index == 'undefined' || index === null ){
|
||||||
|
index = '{i}';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( filter && filter.values && selectedOperator != 'contains' ) {
|
||||||
|
for (i = 0; i < filter.values.length; i++) {
|
||||||
|
val = filter.values[i].value;
|
||||||
|
text = filter.values[i].text;
|
||||||
|
options += '<option value="{0}">{1}</option>'.gformFormat(val, text);
|
||||||
|
}
|
||||||
|
str = '<select class="gform-routing-value value_{0}">{1}</select>'.gformFormat(index, options);
|
||||||
|
} else {
|
||||||
|
str = '<input type="text" value="" class="gform-routing-value value_{0}" />'.gformFormat(index);
|
||||||
|
}
|
||||||
|
|
||||||
|
return str;
|
||||||
|
},
|
||||||
|
|
||||||
|
this.getFilter = function (key) {
|
||||||
|
var fields = this.options.fields;
|
||||||
|
if (!key)
|
||||||
|
return;
|
||||||
|
for (var i = 0; i < fields.length; i++) {
|
||||||
|
if (key == fields[i].key)
|
||||||
|
return fields[i];
|
||||||
|
if (fields[i].group) {
|
||||||
|
for (var j = 0; j < fields[i].filters.length; j++) {
|
||||||
|
if (key == fields[i].filters[j].key)
|
||||||
|
return fields[i].filters[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
this.selected = function (selected, current){
|
||||||
|
return selected == current ? 'selected="selected"' : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getItems = function () {
|
||||||
|
var json = $('#' + this.fieldId ).val();
|
||||||
|
var default_items = [ {owner: '', fieldId: '0', operator: 'is', value: ''} ];
|
||||||
|
var items = json ? $.parseJSON(json) : default_items;
|
||||||
|
return items;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.init();
|
||||||
|
|
||||||
|
String.prototype.format = function () {
|
||||||
|
var args = arguments;
|
||||||
|
return this.replace(/{(\d+)}/g, function (match, number) {
|
||||||
|
return typeof args[number] != 'undefined' ? args[number] : match;
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
1
wp/wp-content/plugins/gravityformshubspot/js/contact_owner_setting.min.js
vendored
Normal file
105
wp/wp-content/plugins/gravityformshubspot/js/plugin_settings.js
Normal file
@@ -0,0 +1,105 @@
|
|||||||
|
/* global gform_hubspot_pluginsettings_strings */
|
||||||
|
window.GFHubSpotSettings = null;
|
||||||
|
|
||||||
|
(function ($) {
|
||||||
|
GFHubSpotSettings = function () {
|
||||||
|
var self = this;
|
||||||
|
|
||||||
|
this.init = function () {
|
||||||
|
this.pageURL = gform_hubspot_pluginsettings_strings.settings_url;
|
||||||
|
|
||||||
|
this.deauthActionable = false;
|
||||||
|
|
||||||
|
this.bindDeauthorize();
|
||||||
|
this.bindClearCache();
|
||||||
|
}
|
||||||
|
|
||||||
|
this.bindDeauthorize = function () {
|
||||||
|
// De-Authorize Zoho CRM.
|
||||||
|
$('.gform_hubspot_deauth_button').on('click', function (e) {
|
||||||
|
e.preventDefault();
|
||||||
|
|
||||||
|
// Get button.
|
||||||
|
var deauthButton = $('#gform_hubspot_deauth_button'),
|
||||||
|
deauthScope = $('#deauth_scope'),
|
||||||
|
disconnectMessage = gform_hubspot_pluginsettings_strings.disconnect;
|
||||||
|
|
||||||
|
if (!self.deauthActionable) {
|
||||||
|
$('.gform_hubspot_deauth_button').eq(0).hide();
|
||||||
|
|
||||||
|
deauthScope.show(0, function(){
|
||||||
|
self.deauthActionable = true;
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
var deauthScopeVal = $('#deauth_scope0').is(':checked') ? 'site' : 'account';
|
||||||
|
// Confirm deletion.
|
||||||
|
if (!confirm(disconnectMessage[deauthScopeVal])) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set disabled state.
|
||||||
|
deauthButton.attr('disabled', 'disabled');
|
||||||
|
|
||||||
|
// De-Authorize.
|
||||||
|
$.ajax({
|
||||||
|
async: false,
|
||||||
|
url: ajaxurl,
|
||||||
|
dataType: 'json',
|
||||||
|
method: 'POST',
|
||||||
|
data: {action: 'gfhubspot_deauthorize', scope: deauthScopeVal, nonce: gform_hubspot_pluginsettings_strings.deauth_nonce},
|
||||||
|
success: function (response) {
|
||||||
|
if (response.success) {
|
||||||
|
window.location.href = self.pageURL;
|
||||||
|
} else {
|
||||||
|
alert(response.data.message);
|
||||||
|
}
|
||||||
|
|
||||||
|
deauthButton.removeAttr('disabled');
|
||||||
|
}
|
||||||
|
}).fail(function(jqXHR, textStatus, error) {
|
||||||
|
alert(error);
|
||||||
|
deauthButton.removeAttr('disabled');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
this.bindClearCache = function() {
|
||||||
|
$( '#clear_hubspot_cache' ).on( 'click', function ( e ) {
|
||||||
|
|
||||||
|
e.preventDefault();
|
||||||
|
e.stopImmediatePropagation();
|
||||||
|
|
||||||
|
var $button = $( this );
|
||||||
|
$button.attr( 'disabled', true );
|
||||||
|
|
||||||
|
$.ajax({
|
||||||
|
method: 'POST',
|
||||||
|
url: ajaxurl,
|
||||||
|
data: {
|
||||||
|
action: 'gf_hubspot_clear_cache',
|
||||||
|
nonce: gform_hubspot_pluginsettings_strings.clear_cache_nonce,
|
||||||
|
},
|
||||||
|
success: function( response ) {
|
||||||
|
if ( 'last_clearance' in response.data ) {
|
||||||
|
jQuery('.success-alert-container').fadeIn();
|
||||||
|
$( '#last_cache_clearance .time' ).text( response.data.last_clearance );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
error: function () {
|
||||||
|
jQuery('.error-alert-container').fadeIn();
|
||||||
|
},
|
||||||
|
complete: function () {
|
||||||
|
$button.attr( 'disabled', false );
|
||||||
|
setTimeout( function () { jQuery('.alert-container').fadeOut(); }, 10000 );
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
this.init();
|
||||||
|
};
|
||||||
|
|
||||||
|
$(document).ready( GFHubSpotSettings );
|
||||||
|
})(jQuery);
|
||||||
1
wp/wp-content/plugins/gravityformshubspot/js/plugin_settings.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
window.GFHubSpotSettings=null,function(o){GFHubSpotSettings=function(){var i=this;this.init=function(){this.pageURL=gform_hubspot_pluginsettings_strings.settings_url,this.deauthActionable=!1,this.bindDeauthorize(),this.bindClearCache()},this.bindDeauthorize=function(){o(".gform_hubspot_deauth_button").on("click",function(t){t.preventDefault();var a=o("#gform_hubspot_deauth_button"),t=o("#deauth_scope"),e=gform_hubspot_pluginsettings_strings.disconnect;if(i.deauthActionable){var n=o("#deauth_scope0").is(":checked")?"site":"account";if(!confirm(e[n]))return!1;a.attr("disabled","disabled"),o.ajax({async:!1,url:ajaxurl,dataType:"json",method:"POST",data:{action:"gfhubspot_deauthorize",scope:n,nonce:gform_hubspot_pluginsettings_strings.deauth_nonce},success:function(t){t.success?window.location.href=i.pageURL:alert(t.data.message),a.removeAttr("disabled")}}).fail(function(t,e,n){alert(n),a.removeAttr("disabled")})}else o(".gform_hubspot_deauth_button").eq(0).hide(),t.show(0,function(){i.deauthActionable=!0})})},this.bindClearCache=function(){o("#clear_hubspot_cache").on("click",function(t){t.preventDefault(),t.stopImmediatePropagation();var e=o(this);e.attr("disabled",!0),o.ajax({method:"POST",url:ajaxurl,data:{action:"gf_hubspot_clear_cache",nonce:gform_hubspot_pluginsettings_strings.clear_cache_nonce},success:function(t){"last_clearance"in t.data&&(jQuery(".success-alert-container").fadeIn(),o("#last_cache_clearance .time").text(t.data.last_clearance))},error:function(){jQuery(".error-alert-container").fadeIn()},complete:function(){e.attr("disabled",!1),setTimeout(function(){jQuery(".alert-container").fadeOut()},1e4)}})})},this.init()},o(document).ready(GFHubSpotSettings)}(jQuery);
|
||||||
@@ -0,0 +1,266 @@
|
|||||||
|
# Copyright (C) 2024 Gravity Forms
|
||||||
|
# This file is distributed under the GPL-3.0+.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Gravity Forms HubSpot Add-On 2.1.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://gravityforms.com/support\n"
|
||||||
|
"Last-Translator: Gravity Forms <support@gravityforms.com>\n"
|
||||||
|
"Language-Team: Gravity Forms <support@gravityforms.com>\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"POT-Creation-Date: 2024-03-14T17:07:42+00:00\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"X-Generator: WP-CLI 2.8.1\n"
|
||||||
|
"X-Domain: gravityformshubspot\n"
|
||||||
|
|
||||||
|
#. Plugin Name of the plugin
|
||||||
|
msgid "Gravity Forms HubSpot Add-On"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Plugin URI of the plugin
|
||||||
|
#. Author URI of the plugin
|
||||||
|
msgid "https://gravityforms.com"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Description of the plugin
|
||||||
|
msgid "Integrates Gravity Forms with HubSpot, allowing form submissions to be automatically sent to your HubSpot account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Author of the plugin
|
||||||
|
msgid "Gravity Forms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:255
|
||||||
|
#: class-gf-hubspot.php:1086
|
||||||
|
#: class-gf-hubspot.php:1091
|
||||||
|
msgid "Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:285
|
||||||
|
msgid "Create record in HubSpot only when payment is received."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:338
|
||||||
|
msgid "Are you sure you want to disconnect from HubSpot for this website?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:339
|
||||||
|
msgid "Are you sure you want to disconnect all Gravity Forms sites connected to this HubSpot account?"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:484
|
||||||
|
msgid "Unable to connect your HubSpot account due to mismatched state."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:504
|
||||||
|
msgid "HubSpot settings have been updated."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:516
|
||||||
|
msgid "Unable to connect your HubSpot account."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:617
|
||||||
|
msgid "HubSpot is an all-in-one CRM, Sales, Marketing, and Customer Service platform."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:620
|
||||||
|
msgid "The Gravity Forms HubSpot Add-On connects the power of the world’s leading growth platform - HubSpot - with Gravity Forms so your business can grow better."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: 1: Open link tag 2: Close link tag
|
||||||
|
#: class-gf-hubspot.php:625
|
||||||
|
msgid "If you don't have a HubSpot account, you can %1$ssign up for your free HubSpot account here%2$s."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:646
|
||||||
|
msgid "Clear Custom Contact Properties Cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: 1: Open link tag 2: Close link tag
|
||||||
|
#: class-gf-hubspot.php:722
|
||||||
|
msgid "There is a problem communicating with HubSpot right now, please check back later. If this issue persists for more than a day, please %1$sopen a support ticket%2$s."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:763
|
||||||
|
msgid "Click here to connect your HubSpot account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:768
|
||||||
|
msgid "SSL Certificate Required"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: 1: Open link tag 2: Close link tag
|
||||||
|
#: class-gf-hubspot.php:770
|
||||||
|
msgid "Make sure you have an SSL certificate installed and enabled, then %1$sclick here to continue%2$s."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:783
|
||||||
|
msgid "Signed into HubSpot."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:787
|
||||||
|
#: class-gf-hubspot.php:793
|
||||||
|
msgid "Disconnect your HubSpot account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:791
|
||||||
|
msgid "De-authorize this site only"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:792
|
||||||
|
msgid "Disconnect all Gravity Forms sites connected to this HubSpot account"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:822
|
||||||
|
msgid "Cache was cleared successfully."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:830
|
||||||
|
msgid "The cache could not be cleared at the moment."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:835
|
||||||
|
msgid "Due to HubSpot's daily API usage limits, Gravity Forms stores HubSpot custom contact properties data for one hour. If you added new custom properties or made a change to them, you might not see it reflected immediately due to this data caching. To manually clear the custom contact properties cache, click the button below."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:837
|
||||||
|
msgid "Clear Custom Fields Cache"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:842
|
||||||
|
msgid "never cleared manually before"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:843
|
||||||
|
msgid "Last time the cache was cleared manually: "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:997
|
||||||
|
msgid "Access denied."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1091
|
||||||
|
msgid "Enter a feed name to uniquely identify this feed."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1095
|
||||||
|
msgid "Feed Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1099
|
||||||
|
msgid "Create Contact"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1108
|
||||||
|
#: class-gf-hubspot.php:1114
|
||||||
|
msgid "HubSpot Form Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1115
|
||||||
|
msgid "Enter the name for the form that will be automatically created in your HubSpot account to work in conjunction with this feed. This HubSpot form will be configured to match your mapped fields below and is required. Once created, please don't remove or edit it."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1140
|
||||||
|
#: class-gf-hubspot.php:1163
|
||||||
|
msgid "Contact Owner"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1146
|
||||||
|
msgid "None "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1150
|
||||||
|
msgid "Select Owner "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1154
|
||||||
|
msgid "Assign Conditionally"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1158
|
||||||
|
msgid "Select a HubSpot user that will be assigned as the owner of the newly created Contact."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1177
|
||||||
|
msgid "Select Owner"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1214
|
||||||
|
msgid "Add Additional Contact Fields"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1234
|
||||||
|
msgid "Additional Options"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1331
|
||||||
|
msgid "There was an error connecting to Hubspot."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1338
|
||||||
|
msgid "There was an error validating the form name. Please try saving again"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1343
|
||||||
|
msgid "This form name is already in use in HubSpot. Please enter a unique form name."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1352
|
||||||
|
msgid "edit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:1352
|
||||||
|
msgid "add"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. translators: Action to perform on the form.
|
||||||
|
#: class-gf-hubspot.php:1354
|
||||||
|
msgid "Could not %s HubSpot form. Please try again later."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2000
|
||||||
|
msgid "Error retrieving HubSpot owners"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2016
|
||||||
|
msgid "No Name"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2067
|
||||||
|
msgid "Select a Contact Property"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2111
|
||||||
|
msgid "Select an Option"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2172
|
||||||
|
msgid "<h6>Lead Status</h6>Select the lead status value the newly added contact should be set to."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2173
|
||||||
|
msgid "<h6>Lifecycle Stage</h6>Select the lifecycle stage value the newly added contact should be set to."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2241
|
||||||
|
msgid "Feed was not processed because the submission object was empty."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2250
|
||||||
|
msgid "Feed was not processed because API was not initialized."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2258
|
||||||
|
msgid "There was an error when creating the contact in HubSpot. %s"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-hubspot.php:2347
|
||||||
|
msgid "Do not delete or edit"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/class-gf-hubspot-api.php:155
|
||||||
|
#: includes/class-gf-hubspot-api.php:208
|
||||||
|
msgid "Refresh token must be provided."
|
||||||
|
msgstr ""
|
||||||
31
wp/wp-content/plugins/gravityformsrecaptcha/change_log.txt
Normal file
@@ -0,0 +1,31 @@
|
|||||||
|
## 1.6.0 | 2024-07-30
|
||||||
|
- Added support for the upcoming gform/submission/pre_submission filter that will be released with Gravity Forms 2.9.
|
||||||
|
|
||||||
|
## 1.5.0 | 2024-04-30
|
||||||
|
- Fixed an issue where duplicate entries are created when using Conversational Forms with reCAPTCHA v3.
|
||||||
|
- Fixed an issue where form submission hangs after Stripe 3DS validation.
|
||||||
|
- Fixed an issue where all REST API submissions are marked as spam.
|
||||||
|
- Note: If used alongside the Stripe Add-On, this version of the reCAPTCHA Add-On requires version 5.5.0 or later of the Stripe Add-On.
|
||||||
|
|
||||||
|
## 1.4.0 | 2024-01-17
|
||||||
|
- Fixed an issue where reCaptcha v3 validation is not triggered when using the Stripe Payment Element.
|
||||||
|
- Fixed the PHP 8.2 creation of dynamic property deprecation notice that occurs on form submission.
|
||||||
|
|
||||||
|
## 1.3.0 | 2023-11-09
|
||||||
|
- Fixed an issue where a JavaScript error can occur on the front-end if the page also includes custom or third-party forms.
|
||||||
|
- Fixed an issue where the v3 settings aren't populated by the GF_RECAPTCHA_V3_SITE_KEY and GF_RECAPTCHA_V3_SECRET_KEY constants.
|
||||||
|
|
||||||
|
## 1.2.0 | 2023-08-31
|
||||||
|
- Updated the reCAPTCHA settings link for the Captcha field "To use the reCAPTCHA field" message in the form editor.
|
||||||
|
- Fixed an issue where reCAPTCHA fails validation when using the Stripe Payment Element.
|
||||||
|
- Fixed an issue that causes the scripts for the frontend to not be available in production mode when compiled by Webpack.
|
||||||
|
- Fixed an issue where scripts are sometimes missing dependencies, and sometimes getting loaded unnecessarily.
|
||||||
|
|
||||||
|
## 1.1 | 2021-07-21
|
||||||
|
- Fixed an issue where an undefined variable notice appears on the add-on settings page.
|
||||||
|
- Fixed an issue where forms can fail validation if they include dynamically added fields such as the honeypot.
|
||||||
|
- Fixed an issue where the reCAPTCHA response is saved and output by merge tags.
|
||||||
|
- Fixed an issue where submissions from the User Registration Add-On login form are blocked.
|
||||||
|
|
||||||
|
## 1.0 | 2021-06-23
|
||||||
|
- It's all new!
|
||||||
@@ -0,0 +1,993 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Gravity_Forms\Gravity_Forms_RECAPTCHA;
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || die();
|
||||||
|
|
||||||
|
use GFForms;
|
||||||
|
use GFAddOn;
|
||||||
|
use GF_Fields;
|
||||||
|
use GFAPI;
|
||||||
|
use GFFormDisplay;
|
||||||
|
use GFFormsModel;
|
||||||
|
use Gravity_Forms\Gravity_Forms_RECAPTCHA\Settings;
|
||||||
|
|
||||||
|
// Include the Gravity Forms Add-On Framework.
|
||||||
|
GFForms::include_addon_framework();
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gravity Forms Gravity Forms Recaptcha Add-On.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @package GravityForms
|
||||||
|
* @author Gravity Forms
|
||||||
|
* @copyright Copyright (c) 2021, Gravity Forms
|
||||||
|
*/
|
||||||
|
class GF_RECAPTCHA extends GFAddOn {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Contains an instance of this class, if available.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var GF_RECAPTCHA $_instance If available, contains an instance of this class
|
||||||
|
*/
|
||||||
|
private static $_instance = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the version of the Gravity Forms Recaptcha Add-On.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_version Contains the version.
|
||||||
|
*/
|
||||||
|
protected $_version = GF_RECAPTCHA_VERSION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the minimum Gravity Forms version required.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_min_gravityforms_version The minimum version required.
|
||||||
|
*/
|
||||||
|
protected $_min_gravityforms_version = GF_RECAPTCHA_MIN_GF_VERSION;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the plugin slug.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_slug The slug used for this plugin.
|
||||||
|
*/
|
||||||
|
protected $_slug = 'gravityformsrecaptcha';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the main plugin file.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_path The path to the main plugin file, relative to the plugins folder.
|
||||||
|
*/
|
||||||
|
protected $_path = 'gravityformsrecaptcha/recaptcha.php';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the full path to this class file.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_full_path The full path.
|
||||||
|
*/
|
||||||
|
protected $_full_path = __FILE__;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the URL where this add-on can be found.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string The URL of the Add-On.
|
||||||
|
*/
|
||||||
|
protected $_url = 'https://gravityforms.com';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the title of this add-on.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_title The title of the add-on.
|
||||||
|
*/
|
||||||
|
protected $_title = 'Gravity Forms reCAPTCHA Add-On';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the short title of the add-on.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_short_title The short title.
|
||||||
|
*/
|
||||||
|
protected $_short_title = 'reCAPTCHA';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines if Add-On should use Gravity Forms servers for update data.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
protected $_enable_rg_autoupgrade = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the capabilities needed for the Gravity Forms Recaptcha Add-On
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var array $_capabilities The capabilities needed for the Add-On
|
||||||
|
*/
|
||||||
|
protected $_capabilities = array( 'gravityforms_recaptcha', 'gravityforms_recaptcha_uninstall' );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the capability needed to access the Add-On settings page.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_capabilities_settings_page The capability needed to access the Add-On settings page.
|
||||||
|
*/
|
||||||
|
protected $_capabilities_settings_page = 'gravityforms_recaptcha';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the capability needed to access the Add-On form settings page.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_capabilities_form_settings The capability needed to access the Add-On form settings page.
|
||||||
|
*/
|
||||||
|
protected $_capabilities_form_settings = 'gravityforms_recaptcha';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Defines the capability needed to uninstall the Add-On.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string $_capabilities_uninstall The capability needed to uninstall the Add-On.
|
||||||
|
*/
|
||||||
|
protected $_capabilities_uninstall = 'gravityforms_recaptcha_uninstall';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class instance.
|
||||||
|
*
|
||||||
|
* @var RECAPTCHA_API
|
||||||
|
*/
|
||||||
|
private $api;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Object responsible for verifying tokens.
|
||||||
|
*
|
||||||
|
* @var Token_Verifier
|
||||||
|
*/
|
||||||
|
private $token_verifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prefix for add-on assets.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $asset_prefix = 'gforms_recaptcha_';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Wrapper class for plugin settings.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var Settings\Plugin_Settings
|
||||||
|
*/
|
||||||
|
private $plugin_settings;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* GF_Field_RECAPTCHA instance.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var GF_Field_RECAPTCHA
|
||||||
|
*/
|
||||||
|
private $field;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Possible disabled states for v3.
|
||||||
|
*
|
||||||
|
* disabled: reCAPTCHA is disabled in feed settings.
|
||||||
|
* disconnected: No valid v3 site and secret keys are saved.
|
||||||
|
*
|
||||||
|
* @var array
|
||||||
|
*/
|
||||||
|
private $v3_disabled_states = array(
|
||||||
|
'disabled',
|
||||||
|
'disconnected',
|
||||||
|
);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an instance of this class, and stores it in the $_instance property.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return GF_RECAPTCHA $_instance An instance of the GF_RECAPTCHA class
|
||||||
|
*/
|
||||||
|
public static function get_instance() {
|
||||||
|
if ( ! self::$_instance instanceof GF_RECAPTCHA ) {
|
||||||
|
self::$_instance = new self();
|
||||||
|
}
|
||||||
|
|
||||||
|
return self::$_instance;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Run add-on pre-initialization processes.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public function pre_init() {
|
||||||
|
require_once plugin_dir_path( __FILE__ ) . '/includes/settings/class-plugin-settings.php';
|
||||||
|
require_once plugin_dir_path( __FILE__ ) . '/includes/class-gf-field-recaptcha.php';
|
||||||
|
require_once plugin_dir_path( __FILE__ ) . '/includes/class-recaptcha-api.php';
|
||||||
|
require_once plugin_dir_path( __FILE__ ) . '/includes/class-token-verifier.php';
|
||||||
|
|
||||||
|
$this->api = new RECAPTCHA_API();
|
||||||
|
$this->token_verifier = new Token_Verifier( $this, $this->api );
|
||||||
|
$this->plugin_settings = new Settings\Plugin_Settings( $this, $this->token_verifier );
|
||||||
|
$this->field = new GF_Field_RECAPTCHA();
|
||||||
|
|
||||||
|
GF_Fields::register( $this->field );
|
||||||
|
|
||||||
|
add_filter( 'gform_settings_menu', array( $this, 'replace_core_recaptcha_menu_item' ) );
|
||||||
|
|
||||||
|
parent::pre_init();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Replaces the core recaptcha settings menu item with the addon settings menu item.
|
||||||
|
*
|
||||||
|
* @param array $settings_tabs Registered settings tabs.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function replace_core_recaptcha_menu_item( $settings_tabs ) {
|
||||||
|
// Get tab names with the same index as is in the settings tabs.
|
||||||
|
$tabs = array_combine( array_keys( $settings_tabs ), array_column( $settings_tabs, 'name' ) );
|
||||||
|
|
||||||
|
// Bail if for some reason this add-on is not registered as a settings tab.
|
||||||
|
if ( ! in_array( $this->_slug, $tabs ) ) {
|
||||||
|
return $settings_tabs;
|
||||||
|
}
|
||||||
|
|
||||||
|
$prepared_tabs = array_flip( $tabs );
|
||||||
|
|
||||||
|
$settings_tabs[ rgar( $prepared_tabs, 'recaptcha' ) ]['name'] = $this->_slug;
|
||||||
|
unset( $settings_tabs[ rgar( $prepared_tabs, $this->_slug ) ] );
|
||||||
|
|
||||||
|
return $settings_tabs;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register initialization hooks.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public function init() {
|
||||||
|
parent::init();
|
||||||
|
|
||||||
|
if ( ! $this->is_gravityforms_supported( $this->_min_gravityforms_version ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Enqueue shared scripts that need to run everywhere, instead of just on forms pages.
|
||||||
|
add_action( 'wp_enqueue_scripts', array( $this, 'enqueue_recaptcha_script' ) );
|
||||||
|
|
||||||
|
// Add Recaptcha field to the form output.
|
||||||
|
add_filter( 'gform_form_tag', array( $this, 'add_recaptcha_input' ), 50, 2 );
|
||||||
|
|
||||||
|
// Register a custom metabox for the entry details page.
|
||||||
|
add_filter( 'gform_entry_detail_meta_boxes', array( $this, 'register_meta_box' ), 10, 3 );
|
||||||
|
|
||||||
|
add_filter( 'gform_entry_is_spam', array( $this, 'check_for_spam_entry' ), 10, 3 );
|
||||||
|
add_filter( 'gform_validation', array( $this, 'validate_submission' ) );
|
||||||
|
|
||||||
|
add_filter( 'gform_field_content', array( $this, 'update_captcha_field_settings_link' ), 10, 2 );
|
||||||
|
add_filter( 'gform_incomplete_submission_pre_save', array( $this, 'add_recaptcha_v3_input_to_draft' ), 10, 3 );
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register admin initialization hooks.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public function init_admin() {
|
||||||
|
parent::init_admin();
|
||||||
|
|
||||||
|
add_action( 'admin_enqueue_scripts', array( $this, 'enqueue_recaptcha_script' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate the secret key on the plugin settings screen.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public function init_ajax() {
|
||||||
|
parent::init_ajax();
|
||||||
|
|
||||||
|
add_action( 'wp_ajax_verify_secret_key', array( $this->plugin_settings, 'verify_v3_keys' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register scripts.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function scripts() {
|
||||||
|
$frontend_script_name = version_compare( GFForms::$version, '2.9.0-dev-1', '<' ) ? 'frontend-legacy' : 'frontend';
|
||||||
|
$scripts = array(
|
||||||
|
array(
|
||||||
|
'handle' => $this->asset_prefix . $frontend_script_name,
|
||||||
|
'src' => $this->get_script_url( $frontend_script_name ),
|
||||||
|
'version' => $this->_version,
|
||||||
|
'deps' => array( 'jquery', "{$this->asset_prefix}recaptcha" ),
|
||||||
|
'in_footer' => true,
|
||||||
|
'enqueue' => array(
|
||||||
|
array( $this, 'frontend_script_callback' ),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
// Prevent plugin settings from loading on the frontend. Remove this condition to see it in action.
|
||||||
|
if ( is_admin() ) {
|
||||||
|
if ( $this->requires_recaptcha_script() ) {
|
||||||
|
$admin_deps = array( 'jquery', "{$this->asset_prefix}recaptcha" );
|
||||||
|
} else {
|
||||||
|
$admin_deps = array( 'jquery' );
|
||||||
|
}
|
||||||
|
|
||||||
|
$scripts[] = array(
|
||||||
|
'handle' => "{$this->asset_prefix}plugin_settings",
|
||||||
|
'src' => $this->get_script_url( 'plugin_settings' ),
|
||||||
|
'version' => $this->_version,
|
||||||
|
'deps' => $admin_deps,
|
||||||
|
'enqueue' => array(
|
||||||
|
array(
|
||||||
|
'admin_page' => array( 'plugin_settings' ),
|
||||||
|
'tab' => $this->_slug,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_merge( parent::scripts(), $scripts );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the URL for a JavaScript file.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $filename The name of the script to return.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function get_script_url( $filename ) {
|
||||||
|
$base_path = $this->get_base_path() . '/js';
|
||||||
|
$base_url = $this->get_base_url() . '/js';
|
||||||
|
|
||||||
|
// Production scripts.
|
||||||
|
if ( is_readable( "{$base_path}/{$filename}.min.js" ) && ! ( defined( 'SCRIPT_DEBUG' ) && SCRIPT_DEBUG ) ) {
|
||||||
|
return "{$base_url}/{$filename}.min.js";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Uncompiled scripts.
|
||||||
|
if ( is_readable( "{$base_path}/src/{$filename}.js" ) ) {
|
||||||
|
return "{$base_url}/src/{$filename}.js";
|
||||||
|
}
|
||||||
|
|
||||||
|
// Compiled dev scripts.
|
||||||
|
return "{$base_url}/{$filename}.js";
|
||||||
|
}
|
||||||
|
|
||||||
|
// # PLUGIN SETTINGS -----------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Define plugin settings fields.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function plugin_settings_fields() {
|
||||||
|
return $this->plugin_settings->get_fields();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the plugin settings.
|
||||||
|
*
|
||||||
|
* This method overrides the add-on framework because we need to retrieve the values for reCAPTCHA v2 from core
|
||||||
|
* and populate them if they exist. Since the Plugin_Settings class houses all of the logic related to the plugin
|
||||||
|
* settings screen, we need to pass the return value of this method's parent to delegate that responsibility.
|
||||||
|
*
|
||||||
|
* In a future release, once reCAPTCHA logic is migrated into this add-on, we
|
||||||
|
* should be able to safely remove this override.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get_plugin_settings() {
|
||||||
|
return $this->plugin_settings->get_settings( parent::get_plugin_settings() );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to update plugin settings on save.
|
||||||
|
*
|
||||||
|
* We override this method in order to save values for reCAPTCHA v2 with their original keys in the options table.
|
||||||
|
* In a future release, we'll eventually migrate all previous reCAPTCHA logic into this add-on, at which time we
|
||||||
|
* should be able to remove this method altogether.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $settings The settings to update.
|
||||||
|
*/
|
||||||
|
public function update_plugin_settings( $settings ) {
|
||||||
|
$this->plugin_settings->update_settings( $settings );
|
||||||
|
parent::update_plugin_settings( $settings );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The settings page icon.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function get_menu_icon() {
|
||||||
|
return 'gform-icon--recaptcha';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the recaptcha field to the end of the form.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @depecated 1.1
|
||||||
|
*
|
||||||
|
* @param array $form The form array.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function add_recaptcha_field( $form ) {
|
||||||
|
return $form;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the recaptcha input to the form.
|
||||||
|
*
|
||||||
|
* @since 1.1
|
||||||
|
*
|
||||||
|
* @param string $form_tag The form tag.
|
||||||
|
* @param array $form The form array.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function add_recaptcha_input( $form_tag, $form ) {
|
||||||
|
if ( empty( $form_tag ) || $this->is_disabled_by_form_setting( $form ) || ! $this->initialize_api() ) {
|
||||||
|
return $form_tag;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $form_tag . $this->field->get_field_input( $form );
|
||||||
|
}
|
||||||
|
|
||||||
|
// # FORM SETTINGS
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Register a form settings tab for reCAPTCHA v3.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $form The form data.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function form_settings_fields( $form ) {
|
||||||
|
return array(
|
||||||
|
array(
|
||||||
|
'title' => 'reCAPTCHA Settings',
|
||||||
|
'fields' => array(
|
||||||
|
array(
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'name' => 'disable-recaptchav3',
|
||||||
|
'choices' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'disable-recaptchav3',
|
||||||
|
'label' => __( 'Disable reCAPTCHA v3 for this form.', 'gravityformsrecaptcha' ),
|
||||||
|
'default_value' => 0,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the query string for the settings link displayed in the form editor preview of the Captcha field.
|
||||||
|
*
|
||||||
|
* @since 1.2
|
||||||
|
*
|
||||||
|
* @param string $field_content The field markup.
|
||||||
|
* @param \GF_Field $field The field being processed.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function update_captcha_field_settings_link( $field_content, $field ) {
|
||||||
|
if ( $field->type !== 'captcha' || ! $field->is_form_editor() ) {
|
||||||
|
return $field_content;
|
||||||
|
}
|
||||||
|
|
||||||
|
return str_replace(
|
||||||
|
array( '&subview=recaptcha', '?page=gf_settings' ),
|
||||||
|
array( '', '?page=gf_settings&subview=gravityformsrecaptcha' ),
|
||||||
|
$field_content
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
// # HELPER METHODS ------------------------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the instance of the Token_Verifier class.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return Token_Verifier
|
||||||
|
*/
|
||||||
|
public function get_token_verifier() {
|
||||||
|
return $this->token_verifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the instance of the Plugin_Settings class.
|
||||||
|
*
|
||||||
|
* @return Settings\Plugin_Settings
|
||||||
|
*/
|
||||||
|
public function get_plugin_settings_instance() {
|
||||||
|
return $this->plugin_settings;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the connection to the reCAPTCHA API.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function initialize_api() {
|
||||||
|
static $result;
|
||||||
|
|
||||||
|
if ( is_bool( $result ) ) {
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = false;
|
||||||
|
$site_key = $this->plugin_settings->get_recaptcha_key( 'site_key_v3' );
|
||||||
|
$secret_key = $this->plugin_settings->get_recaptcha_key( 'secret_key_v3' );
|
||||||
|
|
||||||
|
if ( ! ( $site_key && $secret_key ) ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Missing v3 key configuration. Please check the add-on settings.' );
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( '1' !== $this->get_plugin_setting( 'recaptcha_keys_status_v3' ) ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Could not initialize reCAPTCHA v3 because site and/or secret key is invalid.' );
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = true;
|
||||||
|
$this->log_debug( __METHOD__ . '(): API Initialized.' );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check to determine whether the reCAPTCHA script is needed on a page.
|
||||||
|
*
|
||||||
|
* The script is needed on every page of the front-end if we're able to initialize the API because we've already
|
||||||
|
* verified that the v3 site and secret keys are valid.
|
||||||
|
*
|
||||||
|
* On the back-end, we only want to load this on the settings page, and it should be available regardless of the
|
||||||
|
* status of the keys.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function requires_recaptcha_script() {
|
||||||
|
return is_admin() ? $this->is_plugin_settings( $this->_slug ) : $this->initialize_api();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Custom enqueuing of the external reCAPTCHA script.
|
||||||
|
*
|
||||||
|
* This script is enqueued via the normal WordPress process because, on the front-end, it's needed on every
|
||||||
|
* single page of the site in order for reCAPTCHA to properly score the interactions leading up to the form
|
||||||
|
* submission.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @see GF_RECAPTCHA::init()
|
||||||
|
*/
|
||||||
|
public function enqueue_recaptcha_script() {
|
||||||
|
if ( ! $this->requires_recaptcha_script() ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$script_url = add_query_arg(
|
||||||
|
'render',
|
||||||
|
$this->plugin_settings->get_recaptcha_key( 'site_key_v3' ),
|
||||||
|
'https://www.google.com/recaptcha/api.js'
|
||||||
|
);
|
||||||
|
|
||||||
|
wp_enqueue_script(
|
||||||
|
"{$this->asset_prefix}recaptcha",
|
||||||
|
$script_url,
|
||||||
|
array( 'jquery' ),
|
||||||
|
$this->_version,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
|
||||||
|
wp_localize_script(
|
||||||
|
"{$this->asset_prefix}recaptcha",
|
||||||
|
"{$this->asset_prefix}recaptcha_strings",
|
||||||
|
array(
|
||||||
|
'site_key' => $this->plugin_settings->get_recaptcha_key( 'site_key_v3' ),
|
||||||
|
'ajaxurl' => admin_url( 'admin-ajax.php' ),
|
||||||
|
'nonce' => wp_create_nonce( "{$this->_slug}_verify_token_nonce" ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( $this->get_plugin_setting( 'disable_badge_v3' ) !== '1' ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Add inline JS to disable the badge.
|
||||||
|
wp_add_inline_script(
|
||||||
|
"{$this->asset_prefix}recaptcha",
|
||||||
|
'(function($){grecaptcha.ready(function(){$(\'.grecaptcha-badge\').css(\'visibility\',\'hidden\');});})(jQuery);'
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to determine whether to render the frontend script.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $form The form array.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function frontend_script_callback( $form ) {
|
||||||
|
return $form && ! is_admin();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets up additional data points for sorting on the entry.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $entry_meta The entry metadata.
|
||||||
|
* @param int $form_id The ID of the form.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get_entry_meta( $entry_meta, $form_id ) {
|
||||||
|
$entry_meta[ "{$this->_slug}_score" ] = array(
|
||||||
|
'label' => __( 'reCAPTCHA Score', 'gravityformsrecaptcha' ),
|
||||||
|
'is_numeric' => true,
|
||||||
|
'update_entry_meta_callback' => array( $this, 'update_entry_meta' ),
|
||||||
|
'is_default_column' => true,
|
||||||
|
'filter' => array(
|
||||||
|
'operators' => array( 'is', '>', '<' ),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return $entry_meta;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save the Recaptcha metadata values to the entry.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @see GF_RECAPTCHA::get_entry_meta()
|
||||||
|
*
|
||||||
|
* @param string $key The entry meta key.
|
||||||
|
* @param array $entry The entry data.
|
||||||
|
* @param array $form The form data.
|
||||||
|
*
|
||||||
|
* @return float|void
|
||||||
|
*/
|
||||||
|
public function update_entry_meta( $key, $entry, $form ) {
|
||||||
|
if ( $key !== "{$this->_slug}_score" ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $this->is_disabled_by_form_setting( $form ) ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): reCAPTCHA v3 disabled on form ' . rgar( $form, 'id' ) );
|
||||||
|
return 'disabled';
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $this->initialize_api() ) {
|
||||||
|
return 'disconnected';
|
||||||
|
}
|
||||||
|
|
||||||
|
return $this->token_verifier->get_score();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Registers a metabox on the entry details screen.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $metaboxes Gravity Forms registered metaboxes.
|
||||||
|
* @param array $entry The entry array.
|
||||||
|
* @param array $form The form array.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function register_meta_box( $metaboxes, $entry, $form ) {
|
||||||
|
$score = $this->get_score_from_entry( $entry );
|
||||||
|
|
||||||
|
if ( ! $score ) {
|
||||||
|
return $metaboxes;
|
||||||
|
}
|
||||||
|
|
||||||
|
$metaboxes[ $this->_slug ] = array(
|
||||||
|
'title' => esc_html__( 'reCAPTCHA', 'gravityformsrecaptcha' ),
|
||||||
|
'callback' => array( $this, 'add_recaptcha_meta_box' ),
|
||||||
|
'context' => 'side',
|
||||||
|
);
|
||||||
|
|
||||||
|
return $metaboxes;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to output the entry details metabox.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @see GF_RECAPTCHA::register_meta_box()
|
||||||
|
*
|
||||||
|
* @param array $data An array containing the form and entry data.
|
||||||
|
*/
|
||||||
|
public function add_recaptcha_meta_box( $data ) {
|
||||||
|
$score = $this->get_score_from_entry( rgar( $data, 'entry' ) );
|
||||||
|
|
||||||
|
printf(
|
||||||
|
'<div><p>%s: %s</p><p><a href="%s">%s</a></p></div>',
|
||||||
|
esc_html__( 'Score', 'gravityformsrecaptcha' ),
|
||||||
|
esc_html( $score ),
|
||||||
|
esc_html( 'https://docs.gravityforms.com/captcha/' ),
|
||||||
|
esc_html__( 'Click here to learn more about reCAPTCHA.', 'gravityformsrecaptcha' )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Callback to gform_entry_is_spam that determines whether to categorize this entry as such.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @see GF_RECAPTCHA::init();
|
||||||
|
*
|
||||||
|
* @param bool $is_spam Whether the entry is spam.
|
||||||
|
* @param array $form The form data.
|
||||||
|
* @param array $entry The entry data.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function check_for_spam_entry( $is_spam, $form, $entry ) {
|
||||||
|
|
||||||
|
if ( $is_spam ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Skipping, entry has already been identified as spam by another anti-spam solution.' );
|
||||||
|
return $is_spam;
|
||||||
|
}
|
||||||
|
|
||||||
|
$is_spam = $this->is_spam_submission( $form, $entry );
|
||||||
|
$this->log_debug( __METHOD__ . '(): Is submission considered spam? ' . ( $is_spam ? 'Yes.' : 'No.' ) );
|
||||||
|
|
||||||
|
return $is_spam;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines if the submission is spam by comparing its score with the threshold.
|
||||||
|
*
|
||||||
|
* @since 1.4
|
||||||
|
* @since 1.5 Added the optional $entry param.
|
||||||
|
*
|
||||||
|
* @param array $form The form being processed.
|
||||||
|
* @param array $entry The entry being processed.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function is_spam_submission( $form, $entry = array() ) {
|
||||||
|
if ( $this->should_skip_validation( $form ) ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Score check skipped.' );
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$score = empty( $entry ) ? $this->token_verifier->get_score() : $this->get_score_from_entry( $entry );
|
||||||
|
$threshold = $this->get_spam_score_threshold();
|
||||||
|
|
||||||
|
return (float) $score <= (float) $threshold;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Get the Recaptcha score from the entry details.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $entry The entry array.
|
||||||
|
*
|
||||||
|
* @return float|string
|
||||||
|
*/
|
||||||
|
private function get_score_from_entry( $entry ) {
|
||||||
|
$score = rgar( $entry, "{$this->_slug}_score" );
|
||||||
|
|
||||||
|
if ( in_array( $score, $this->v3_disabled_states, true ) ) {
|
||||||
|
return $score;
|
||||||
|
}
|
||||||
|
|
||||||
|
return $score ? (float) $score : $this->token_verifier->get_score();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The score that determines whether the entry is spam.
|
||||||
|
*
|
||||||
|
* Hard-coded for now, but this will eventually be an option within the add-on.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
private function get_spam_score_threshold() {
|
||||||
|
static $value;
|
||||||
|
|
||||||
|
if ( ! empty( $value ) ) {
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
$value = (float) $this->get_plugin_setting( 'score_threshold_v3' );
|
||||||
|
if ( empty( $value ) ) {
|
||||||
|
$value = 0.5;
|
||||||
|
}
|
||||||
|
$this->log_debug( __METHOD__ . '(): ' . $value );
|
||||||
|
|
||||||
|
return $value;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determine whether a given form has disabled reCAPTCHA within its settings.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $form The form data.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function is_disabled_by_form_setting( $form ) {
|
||||||
|
return empty( $form['id'] ) || '1' === rgar( $this->get_form_settings( $form ), 'disable-recaptchav3' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate the form submission.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $submission_data The submitted form data.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function validate_submission( $submission_data ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Validating form (#' . rgars( $submission_data, 'form/id' ) . ') submission.' );
|
||||||
|
|
||||||
|
if ( $this->should_skip_validation( rgar( $submission_data, 'form' ) ) ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Validation skipped.' );
|
||||||
|
|
||||||
|
return $submission_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->log_debug( __METHOD__ . '(): Validating reCAPTCHA v3.' );
|
||||||
|
|
||||||
|
return $this->field->validation_check( $submission_data );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check If reCaptcha validation should be skipped.
|
||||||
|
*
|
||||||
|
* In some situations where the form validation could be triggered twice, for example while making a stripe payment element transaction
|
||||||
|
* we want to skip the reCaptcha validation so it isn't triggered twice, as this will make it always fail.
|
||||||
|
*
|
||||||
|
* @since 1.4
|
||||||
|
* @since 1.5 Changed param to $form array.
|
||||||
|
*
|
||||||
|
* @param array $form The form being processed.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function should_skip_validation( $form ) {
|
||||||
|
static $result = array();
|
||||||
|
|
||||||
|
$form_id = rgar( $form, 'id' );
|
||||||
|
if ( isset( $result[ $form_id ] ) ) {
|
||||||
|
return $result[ $form_id ];
|
||||||
|
}
|
||||||
|
|
||||||
|
$result[ $form_id ] = true;
|
||||||
|
|
||||||
|
if ( $this->is_preview() ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Yes! Form preview page.' );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $this->initialize_api() ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Yes! API not initialized.' );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( $this->is_disabled_by_form_setting( $form ) ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Yes! Disabled by form setting.' );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( defined( 'REST_REQUEST' ) && REST_REQUEST && ! isset( $_POST[ $this->field->get_input_name( $form_id ) ] ) ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Yes! REST request without input.' );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// For older versions of Stripe, skip the first validation attempt and only validate on the second attempt. Newer versions of Stripe will validate twice without a problem.
|
||||||
|
if ( $this->is_stripe_validation() && version_compare( gf_stripe()->get_version(), '5.4.3', '<' ) ) {
|
||||||
|
$this->log_debug( __METHOD__ . '(): Yes! Older Stripe validation.' );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$result[ $form_id ] = false;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this is a stripe validation request.
|
||||||
|
*
|
||||||
|
* @since 1.4
|
||||||
|
*
|
||||||
|
* @return bool Returns true if this is a stripe validation request. Returns false otherwise.
|
||||||
|
*/
|
||||||
|
public function is_stripe_validation() {
|
||||||
|
return function_exists( 'gf_stripe' ) && rgpost( 'action' ) === 'gfstripe_validate_form';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check if this is a preview request, taking into account Stripe's validation request.
|
||||||
|
*
|
||||||
|
* @since 1.4
|
||||||
|
*
|
||||||
|
* @return bool Returns true if this is a preview request. Returns false otherwise.
|
||||||
|
*/
|
||||||
|
public function is_preview() {
|
||||||
|
|
||||||
|
return parent::is_preview() || ( $this->is_stripe_validation() && rgget( 'preview' ) === '1' );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add the recaptcha v3 input and value to the draft.
|
||||||
|
*
|
||||||
|
* @since 1.2
|
||||||
|
*
|
||||||
|
* @param array $submission_json The json containing the submitted values and the partial entry created from the values.
|
||||||
|
* @param string $resume_token The resume token.
|
||||||
|
* @param array $form The form data.
|
||||||
|
*
|
||||||
|
* @return string The json string for the submission with the recaptcha v3 input and value added.
|
||||||
|
*/
|
||||||
|
public function add_recaptcha_v3_input_to_draft( $submission_json, $resume_token, $form ) {
|
||||||
|
$submission = json_decode( $submission_json, true );
|
||||||
|
$input_name = $this->field->get_input_name( rgar( $form , 'id' ) );
|
||||||
|
$submission[ 'partial_entry' ][ $input_name ] = rgpost( $input_name );
|
||||||
|
|
||||||
|
return wp_json_encode( $submission );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,158 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
namespace Gravity_Forms\Gravity_Forms_RECAPTCHA;
|
||||||
|
|
||||||
|
use GF_Field;
|
||||||
|
use GFCommon;
|
||||||
|
use GFAPI;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class GF_Field_RECAPTCHA
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @package Gravity_Forms\Gravity_Forms_RECAPTCHA
|
||||||
|
*/
|
||||||
|
class GF_Field_RECAPTCHA extends GF_Field {
|
||||||
|
/**
|
||||||
|
* Recaptcha field type.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
public $type = 'recaptcha';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Prevent the field being saved to the entry.
|
||||||
|
*
|
||||||
|
* @since 1.1
|
||||||
|
* @var bool
|
||||||
|
*/
|
||||||
|
public $displayOnly = true;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Decoded field data.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var object
|
||||||
|
*/
|
||||||
|
private $data;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return empty array to prevent the field from showing up in the form editor.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get_form_editor_button() {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The field markup.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $form The form array.
|
||||||
|
* @param string $value The field value.
|
||||||
|
* @param array|null $entry The entry array.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function get_field_input( $form, $value = '', $entry = null ) {
|
||||||
|
$plugin_settings = gf_recaptcha()->get_plugin_settings_instance();
|
||||||
|
$site_key = $plugin_settings->get_recaptcha_key( 'site_key_v3' );
|
||||||
|
$secret_key = $plugin_settings->get_recaptcha_key( 'secret_key_v3' );
|
||||||
|
|
||||||
|
if ( empty( $site_key ) || empty( $secret_key ) ) {
|
||||||
|
GFCommon::log_error( __METHOD__ . sprintf( '(): reCAPTCHA secret keys not saved in the reCAPTCHA Settings (%s). The reCAPTCHA field will always fail validation during form submission.', admin_url( 'admin.php' ) . '?page=gf_settings&subview=recaptcha' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->formId = absint( rgar( $form, 'id' ) );
|
||||||
|
$name = $this->get_input_name();
|
||||||
|
$tabindex = GFCommon::$tab_index > 0 ? GFCommon::$tab_index ++ : 0;
|
||||||
|
|
||||||
|
return "<div class='gf_invisible ginput_recaptchav3' data-sitekey='" . esc_attr( $site_key ) . "' data-tabindex='{$tabindex}'>"
|
||||||
|
. '<input id="' . esc_attr( $name ) . '" class="gfield_recaptcha_response" type="hidden" name="' . esc_attr( $name ) . '" value=""/>'
|
||||||
|
. '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Modify the validation result if the Recaptcha response has been altered.
|
||||||
|
*
|
||||||
|
* This is a callback to the gform_validation filter to allow us to validate the values in the hidden field.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @see GF_RECAPTCHA::init()
|
||||||
|
*
|
||||||
|
* @param array $validation_data The validation data.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function validation_check( $validation_data ) {
|
||||||
|
$this->formId = absint( rgars( $validation_data, 'form/id' ) );
|
||||||
|
|
||||||
|
if ( $this->is_valid_field_data() ) {
|
||||||
|
|
||||||
|
// Set is_spam value.
|
||||||
|
$validation_data['is_spam'] = gf_recaptcha()->is_spam_submission( rgar( $validation_data, 'form' ) );
|
||||||
|
|
||||||
|
return $validation_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set is_valid to false and return the validation data.
|
||||||
|
return $this->invalidate( $validation_data );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validates that the data in the hidden input is a valid Recaptcha entry.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function is_valid_field_data() {
|
||||||
|
$data = rgpost( $this->get_input_name() );
|
||||||
|
|
||||||
|
if ( empty( $data ) ) {
|
||||||
|
gf_recaptcha()->log_debug( __METHOD__ . "(): Input {$this->get_input_name()} empty." );
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return gf_recaptcha()->get_token_verifier()->verify_submission( $data );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Set is_valid to false on the validation data.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $validation_data The validation data.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
private function invalidate( $validation_data ) {
|
||||||
|
$validation_data['is_valid'] = false;
|
||||||
|
|
||||||
|
return $validation_data;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the value of the input name attribute.
|
||||||
|
*
|
||||||
|
* @since 1.1
|
||||||
|
* @since 1.2 Added optional form_id parameter.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function get_input_name( $form_id = null ) {
|
||||||
|
if ( $form_id ) {
|
||||||
|
$this->formId = absint( $form_id );
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'input_' . md5( 'recaptchav3' . gf_recaptcha()->get_version() . $this->formId );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* API wrapper for the Recaptcha service.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @package Gravity_Forms\Gravity_Forms_RECAPTCHA
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Gravity_Forms\Gravity_Forms_RECAPTCHA;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class RECAPTCHA_API
|
||||||
|
*
|
||||||
|
* @package Gravity_Forms\Gravity_Forms_RECAPTCHA
|
||||||
|
*/
|
||||||
|
class RECAPTCHA_API {
|
||||||
|
/**
|
||||||
|
* Google Recaptcha token verification URL.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $verification_url = 'https://www.google.com/recaptcha/api/siteverify';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the result of token verification from the Recaptcha API.
|
||||||
|
*
|
||||||
|
* @param string $token The token to verify.
|
||||||
|
* @param string $secret The site's secret key.
|
||||||
|
*
|
||||||
|
* @return array|\WP_Error
|
||||||
|
*/
|
||||||
|
public function verify_token( $token, $secret ) {
|
||||||
|
return wp_remote_post(
|
||||||
|
$this->verification_url,
|
||||||
|
array(
|
||||||
|
'body' => array(
|
||||||
|
'secret' => $secret,
|
||||||
|
'response' => $token,
|
||||||
|
),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,364 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Class responsible for verifying tokens returned by Recaptcha.
|
||||||
|
*
|
||||||
|
* @package Gravity_Forms\Gravity_Forms_RECAPTCHA
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Gravity_Forms\Gravity_Forms_RECAPTCHA;
|
||||||
|
|
||||||
|
use GFCommon;
|
||||||
|
use stdClass;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Token_Verifier
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @package Gravity_Forms\Gravity_Forms_RECAPTCHA
|
||||||
|
*/
|
||||||
|
class Token_Verifier {
|
||||||
|
/**
|
||||||
|
* Error code returned if a token or secret is missing.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
const ERROR_CODE_MISSING_TOKEN_OR_SECRET = 'gravityformsrecaptcha-missing-token-or-secret';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Error code returned if the token cannot be verified.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
const ERROR_CODE_CANNOT_VERIFY_TOKEN = 'gravityforms-cannot-verify-token';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Instance of the add-on class.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var GF_RECAPTCHA
|
||||||
|
*/
|
||||||
|
private $addon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class instance.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var RECAPTCHA_API
|
||||||
|
*/
|
||||||
|
private $api;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Minimum score the Recaptcha API can return before a form submission is marked as spam.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var float
|
||||||
|
*/
|
||||||
|
private $score_threshold;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Token generated by the Recaptcha service that requires validation.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $token;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Recaptcha application secret used to verify the token.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $secret;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Result of the recaptcha request.
|
||||||
|
*
|
||||||
|
* @var stdClass
|
||||||
|
*/
|
||||||
|
private $recaptcha_result;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The reCAPTCHA action.
|
||||||
|
*
|
||||||
|
* @since 1.4 Previously a dynamic property.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
private $action;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Token_Verifier constructor.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param GF_RECAPTCHA $addon Instance of the GF_RECAPTCHA add-on.
|
||||||
|
* @param RECAPTCHA_API $api Instance of the Recaptcha API.
|
||||||
|
*/
|
||||||
|
public function __construct( GF_RECAPTCHA $addon, RECAPTCHA_API $api ) {
|
||||||
|
$this->addon = $addon;
|
||||||
|
$this->api = $api;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes this object for use.
|
||||||
|
*
|
||||||
|
* @param string $token The reCAPTCHA token.
|
||||||
|
* @param string $action The reCAPTCHA action.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public function init( $token = '', $action = '' ) {
|
||||||
|
$this->token = $token;
|
||||||
|
$this->action = $action;
|
||||||
|
$this->secret = $this->addon->get_plugin_settings_instance()->get_recaptcha_key( 'secret_key_v3' );
|
||||||
|
$this->score_threshold = $this->addon->get_plugin_setting( 'score_threshold_v3', 0.5 );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the reCAPTCHA result.
|
||||||
|
*
|
||||||
|
* Returns a stdClass if it's already been processed.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return stdClass|null
|
||||||
|
*/
|
||||||
|
public function get_recaptcha_result() {
|
||||||
|
return $this->recaptcha_result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate that the reCAPTCHA response data has the required properties and meets expectations.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $response_data The response data to validate.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function validate_response_data( $response_data ) {
|
||||||
|
if (
|
||||||
|
! empty( $response_data->{'error-codes'} )
|
||||||
|
|| ( property_exists( $response_data, 'success' ) && $response_data->success !== true )
|
||||||
|
) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$validation_properties = array( 'hostname', 'action', 'success', 'score', 'challenge_ts' );
|
||||||
|
$response_properties = array_filter(
|
||||||
|
$validation_properties,
|
||||||
|
function( $property ) use ( $response_data ) {
|
||||||
|
return property_exists( $response_data, $property );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( count( $validation_properties ) !== count( $response_properties ) ) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
$response_data->success
|
||||||
|
&& $this->verify_hostname( $response_data->hostname )
|
||||||
|
&& $this->verify_action( $response_data->action )
|
||||||
|
&& $this->verify_score( $response_data->score )
|
||||||
|
&& $this->verify_timestamp( $response_data->challenge_ts )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify the submission data.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $token The Recapatcha token.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function verify_submission( $token ) {
|
||||||
|
|
||||||
|
$data = \GFCache::get( 'recaptcha_' . $token, $found );
|
||||||
|
if ( $found ) {
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Using cached reCAPTCHA result: ' . print_r( $data, true ) );
|
||||||
|
$this->recaptcha_result = $data;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Verifying reCAPTCHA submission.' );
|
||||||
|
|
||||||
|
if ( empty( $token ) ) {
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Could not verify the submission because no token was found.' . PHP_EOL );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->init( $token, 'submit' );
|
||||||
|
|
||||||
|
$data = $this->get_response_data( $this->api->verify_token( $token, $this->addon->get_plugin_settings_instance()->get_recaptcha_key( 'secret_key_v3' ) ) );
|
||||||
|
|
||||||
|
if ( is_wp_error( $data ) ) {
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Validating the reCAPTCHA response has failed due to the following: ' . $data->get_error_message() );
|
||||||
|
wp_send_json_error(
|
||||||
|
array(
|
||||||
|
'error' => $data->get_error_message(),
|
||||||
|
'code' => self::ERROR_CODE_CANNOT_VERIFY_TOKEN,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ( ! $this->validate_response_data( $data ) ) {
|
||||||
|
$this->addon->log_debug(
|
||||||
|
__METHOD__ . '(): Could not validate the token request from the reCAPTCHA service. ' . PHP_EOL
|
||||||
|
. "token: {$token}" . PHP_EOL
|
||||||
|
. "response: " . print_r( $data, true ) . PHP_EOL // @codingStandardsIgnoreLine
|
||||||
|
);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// @codingStandardsIgnoreLine
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Validated reCAPTCHA: ' . print_r( $data, true ) );
|
||||||
|
$this->recaptcha_result = $data;
|
||||||
|
|
||||||
|
// Caching result for 1 hour.
|
||||||
|
\GFCache::set( 'recaptcha_' . $token, $data, true, 60 * 60 );
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the data from the response.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param WP_Error|string $response The response from the API request.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
private function get_response_data( $response ) {
|
||||||
|
if ( is_wp_error( $response ) ) {
|
||||||
|
return $response;
|
||||||
|
}
|
||||||
|
|
||||||
|
return json_decode( wp_remote_retrieve_body( $response ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify the reCAPTCHA hostname.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $hostname Verify that the host name returned matches the site.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function verify_hostname( $hostname ) {
|
||||||
|
if ( ! has_filter( 'gform_recaptcha_valid_hostnames' ) ) {
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): gform_recaptcha_valid_hostnames filter not implemented. Skipping.' );
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): gform_recaptcha_valid_hostnames filter detected. Verifying hostname.' );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Filter for the set of hostnames considered valid by this site.
|
||||||
|
*
|
||||||
|
* Google returns a 'hostname' value in reCAPTCHA verification results. We validate against this value to ensure
|
||||||
|
* that the data is good. By default, we use only the WordPress installation's home URL, but have extended
|
||||||
|
* this via a filter so developers can define an array of hostnames to allow.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $valid_hostnames {
|
||||||
|
* An indexed array of valid hostname strings. Example:
|
||||||
|
* array( 'example.com', 'another-example.com' )
|
||||||
|
* }
|
||||||
|
*/
|
||||||
|
$valid_hostnames = apply_filters(
|
||||||
|
'gform_recaptcha_valid_hostnames',
|
||||||
|
array(
|
||||||
|
wp_parse_url( get_home_url(), PHP_URL_HOST ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
return is_array( $valid_hostnames ) ? in_array( $hostname, $valid_hostnames, true ) : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify the reCAPTCHA action.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $action The reCAPTCHA result action.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function verify_action( $action ) {
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Verifying action from reCAPTCHA response.' );
|
||||||
|
|
||||||
|
return $this->action === $action;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify that the score is valid.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param float $score The reCAPTCHA v3 score.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function verify_score( $score ) {
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Verifying score from reCAPTCHA response.' );
|
||||||
|
|
||||||
|
return is_float( $score ) && $score >= 0.0 && $score <= 1.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verify that the timestamp of the submission is valid.
|
||||||
|
*
|
||||||
|
* Google allows a reCAPTCHA token to be valid for two minutes. On multi-page forms, we generate a new token with
|
||||||
|
* the advancement of each page, but the timestamp that's returned is always the same. Thus, we'll allow a longer
|
||||||
|
* time frame for form submissions before considering them to be invalid.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $challenge_ts The challenge timestamp from the reCAPTCHA service.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
private function verify_timestamp( $challenge_ts ) {
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Verifying timestamp from reCAPTCHA response.' );
|
||||||
|
|
||||||
|
return ( gmdate( time() ) - strtotime( $challenge_ts ) ) <= 24 * HOUR_IN_SECONDS;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the score from the Recaptcha result.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return float
|
||||||
|
*/
|
||||||
|
public function get_score() {
|
||||||
|
if ( empty( $this->recaptcha_result ) || ! property_exists( $this->recaptcha_result, 'score' ) ) {
|
||||||
|
return $this->addon->is_preview() ? 0.9 : 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return (float) $this->recaptcha_result->score;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the decoded response data from the API.
|
||||||
|
*
|
||||||
|
* @param string $token The validation token.
|
||||||
|
* @param string $secret The stored secret key from the settings page.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return WP_Error|mixed|string
|
||||||
|
*/
|
||||||
|
public function verify( $token, $secret ) {
|
||||||
|
return $this->get_response_data( $this->api->verify_token( $token, $secret ) );
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,630 @@
|
|||||||
|
<?php
|
||||||
|
/**
|
||||||
|
* Object responsible for organizing and constructing the plugin settings page.
|
||||||
|
*
|
||||||
|
* @package Gravity_Forms\Gravity_Forms_RECAPTCHA\Settings
|
||||||
|
*/
|
||||||
|
|
||||||
|
namespace Gravity_Forms\Gravity_Forms_RECAPTCHA\Settings;
|
||||||
|
|
||||||
|
use Gravity_Forms\Gravity_Forms_RECAPTCHA\GF_RECAPTCHA;
|
||||||
|
use Gravity_Forms\Gravity_Forms\Settings\Fields\Text;
|
||||||
|
use Gravity_Forms\Gravity_Forms_RECAPTCHA\Token_Verifier;
|
||||||
|
use GF_Field_CAPTCHA;
|
||||||
|
use GFCommon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Class Plugin_Settings
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @package Gravity_Forms\Gravity_Forms_RECAPTCHA\Settings
|
||||||
|
*/
|
||||||
|
class Plugin_Settings {
|
||||||
|
/**
|
||||||
|
* Add-on instance.
|
||||||
|
*
|
||||||
|
* @var GF_RECAPTCHA
|
||||||
|
*/
|
||||||
|
private $addon;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Token_Verifier instance.
|
||||||
|
*
|
||||||
|
* @var Token_Verifier
|
||||||
|
*/
|
||||||
|
private $token_verifier;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Plugin_Settings constructor.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param GF_RECAPTCHA $addon GF_RECAPTCHA instance.
|
||||||
|
* @param Token_Verifier $token_verifier Instance of the Token_Verifier class.
|
||||||
|
*/
|
||||||
|
public function __construct( $addon, $token_verifier ) {
|
||||||
|
$this->addon = $addon;
|
||||||
|
$this->token_verifier = $token_verifier;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin settings fields.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @see GF_RECAPTCHA::plugin_settings_fields()
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get_fields() {
|
||||||
|
return array(
|
||||||
|
$this->get_description_fields(),
|
||||||
|
$this->get_v3_fields(),
|
||||||
|
$this->get_v2_fields(),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets any custom plugin settings, ensuring they contain the latest values from the constants.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $settings Add-on's parent plugin settings.
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
public function get_settings( $settings ) {
|
||||||
|
if ( ! is_array( $settings ) ) {
|
||||||
|
$settings = array();
|
||||||
|
}
|
||||||
|
|
||||||
|
$site_key = $this->get_recaptcha_key( 'site_key_v3', true );
|
||||||
|
if ( $site_key ) {
|
||||||
|
$settings['site_key_v3'] = $site_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
$secret_key = $this->get_recaptcha_key( 'secret_key_v3', true );
|
||||||
|
if ( $secret_key ) {
|
||||||
|
$settings['secret_key_v3'] = $secret_key;
|
||||||
|
}
|
||||||
|
|
||||||
|
return array_merge(
|
||||||
|
$settings,
|
||||||
|
array(
|
||||||
|
'site_key_v2' => get_option( 'rg_gforms_captcha_public_key' ),
|
||||||
|
'secret_key_v2' => get_option( 'rg_gforms_captcha_private_key' ),
|
||||||
|
'type_v2' => get_option( 'rg_gforms_captcha_type' ),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles updating of custom plugin settings.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $settings Update the v2 settings.
|
||||||
|
*/
|
||||||
|
public function update_settings( $settings ) {
|
||||||
|
update_option( 'rg_gforms_captcha_public_key', rgar( $settings, 'site_key_v2' ) );
|
||||||
|
update_option( 'rg_gforms_captcha_private_key', rgar( $settings, 'secret_key_v2' ) );
|
||||||
|
update_option( 'rg_gforms_captcha_type', rgar( $settings, 'type_v2' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the description section for the plugin settings.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function get_description_fields() {
|
||||||
|
return array(
|
||||||
|
'id' => 'gravityformsrecaptcha_description',
|
||||||
|
'title' => esc_html__( 'reCAPTCHA Settings', 'gravityformsrecaptcha' ),
|
||||||
|
'description' => $this->get_settings_intro_description(),
|
||||||
|
'fields' => array(
|
||||||
|
array(
|
||||||
|
'type' => 'html',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin settings fields for reCAPTCHA v3.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function get_v3_fields() {
|
||||||
|
$site_key = $this->get_recaptcha_key( 'site_key_v3', true );
|
||||||
|
$secret_key = $this->get_recaptcha_key( 'secret_key_v3', true );
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'id' => 'gravityformsrecaptcha_v3',
|
||||||
|
'title' => esc_html__( 'reCAPTCHA v3', 'gravityformsrecaptcha' ),
|
||||||
|
'fields' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'site_key_v3',
|
||||||
|
'label' => esc_html__( 'Site Key', 'gravityformsrecaptcha' ),
|
||||||
|
'type' => 'text',
|
||||||
|
'feedback_callback' => array( $this, 'v3_keys_status_feedback_callback' ),
|
||||||
|
'readonly' => empty( $site_key ) ? '' : 'readonly',
|
||||||
|
'after_input' => $this->get_constant_message( $site_key, 'GF_RECAPTCHA_V3_SITE_KEY' ),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'secret_key_v3',
|
||||||
|
'label' => esc_html__( 'Secret Key', 'gravityformsrecaptcha' ),
|
||||||
|
'type' => 'text',
|
||||||
|
'feedback_callback' => array( $this, 'v3_keys_status_feedback_callback' ),
|
||||||
|
'readonly' => empty( $secret_key ) ? '' : 'readonly',
|
||||||
|
'after_input' => $this->get_constant_message( $secret_key, 'GF_RECAPTCHA_V3_SECRET_KEY' ),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'score_threshold_v3',
|
||||||
|
'label' => esc_html__( 'Score Threshold', 'gravityformsrecaptcha' ),
|
||||||
|
'description' => $this->get_score_threshold_description(),
|
||||||
|
'default_value' => 0.5,
|
||||||
|
'type' => 'text',
|
||||||
|
'input_type' => 'number',
|
||||||
|
'step' => '0.01',
|
||||||
|
'min' => '0.0',
|
||||||
|
'max' => '1.0',
|
||||||
|
'validation_callback' => array( $this, 'validate_score_threshold_v3' ),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'disable_badge_v3',
|
||||||
|
'label' => esc_html__( 'Disable Google reCAPTCHA Badge', 'gravityformsrecaptcha' ),
|
||||||
|
'description' => esc_html__( 'By default reCAPTCHA v3 displays a badge on every page of your site with links to the Google terms of service and privacy policy. You are allowed to hide the badge as long as you include the reCAPTCHA branding and links visibly in the user flow.', 'gravityformsrecaptcha' ),
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'choices' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'disable_badge_v3',
|
||||||
|
'label' => esc_html__( 'I have added the reCAPTCHA branding, terms of service and privacy policy to my site. ', 'gravityformsrecaptcha' ),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'recaptcha_keys_status_v3',
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'default_value' => $this->get_recaptcha_key( 'recaptcha_keys_status_v3' ),
|
||||||
|
'hidden' => true,
|
||||||
|
'choices' => array(
|
||||||
|
array(
|
||||||
|
'type' => 'checkbox',
|
||||||
|
'name' => 'recaptcha_keys_status_v3',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the setting info message to be displayed when the value is defined using a constant.
|
||||||
|
*
|
||||||
|
* @since 1.3
|
||||||
|
*
|
||||||
|
* @param string $value The value.
|
||||||
|
* @param string $constant The constant name.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function get_constant_message( $value, $constant ) {
|
||||||
|
if ( empty( $value ) ) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
return '<div class="alert gforms_note_info">' . sprintf( esc_html__( 'Value defined using the %s constant.', 'gravityformsrecaptcha' ), $constant ) . '</div>';
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the plugin settings fields for reCAPTCHA v2.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function get_v2_fields() {
|
||||||
|
return array(
|
||||||
|
'id' => 'gravityformsrecaptcha_v2',
|
||||||
|
'title' => esc_html__( 'reCAPTCHA v2', 'gravityformsrecaptcha' ),
|
||||||
|
'fields' => array(
|
||||||
|
array(
|
||||||
|
'name' => 'site_key_v2',
|
||||||
|
'label' => esc_html__( 'Site Key', 'gravityformsrecaptcha' ),
|
||||||
|
'tooltip' => gform_tooltip( 'settings_recaptcha_public', null, true ),
|
||||||
|
'type' => 'text',
|
||||||
|
'feedback_callback' => array( $this, 'validate_key_v2' ),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'secret_key_v2',
|
||||||
|
'label' => esc_html__( 'Secret Key', 'gravityformsrecaptcha' ),
|
||||||
|
'tooltip' => gform_tooltip( 'settings_recaptcha_private', null, true ),
|
||||||
|
'type' => 'text',
|
||||||
|
'feedback_callback' => array( $this, 'validate_key_v2' ),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'type_v2',
|
||||||
|
'label' => esc_html__( 'Type', 'gravityformsrecaptcha' ),
|
||||||
|
'tooltip' => gform_tooltip( 'settings_recaptcha_type', null, true ),
|
||||||
|
'type' => 'radio',
|
||||||
|
'horizontal' => true,
|
||||||
|
'default_value' => 'checkbox',
|
||||||
|
'choices' => array(
|
||||||
|
array(
|
||||||
|
'label' => esc_html__( 'Checkbox', 'gravityformsrecaptcha' ),
|
||||||
|
'value' => 'checkbox',
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'label' => esc_html__( 'Invisible', 'gravityformsrecaptcha' ),
|
||||||
|
'value' => 'invisible',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
array(
|
||||||
|
'name' => 'reset_v2',
|
||||||
|
'label' => esc_html__( 'Validate Keys', 'gravityformsrecaptcha' ),
|
||||||
|
'type' => 'recaptcha_reset',
|
||||||
|
'callback' => array( $this, 'handle_recaptcha_v2_reset' ),
|
||||||
|
'hidden' => true,
|
||||||
|
'validation_callback' => function( $field, $value ) {
|
||||||
|
|
||||||
|
// If reCAPTCHA key is empty, exit.
|
||||||
|
if ( rgblank( $value ) ) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
$values = $this->addon->get_settings_renderer()->get_posted_values();
|
||||||
|
|
||||||
|
// Get public, private keys, API response.
|
||||||
|
$public_key = rgar( $values, 'site_key_v2' );
|
||||||
|
$private_key = rgar( $values, 'secret_key_v2' );
|
||||||
|
$response = rgpost( 'g-recaptcha-response' );
|
||||||
|
|
||||||
|
// If keys and response are provided, verify and save.
|
||||||
|
if ( $public_key && $private_key && $response ) {
|
||||||
|
// Log public, private keys, API response.
|
||||||
|
// @codingStandardsIgnoreStart - print_r okay for logging.
|
||||||
|
GFCommon::log_debug( __METHOD__ . '(): reCAPTCHA Site Key:' . print_r( $public_key, true ) );
|
||||||
|
GFCommon::log_debug( __METHOD__ . '(): reCAPTCHA Secret Key:' . print_r( $private_key, true ) );
|
||||||
|
GFCommon::log_debug( __METHOD__ . '(): reCAPTCHA Response:' . print_r( $response, true ) );
|
||||||
|
|
||||||
|
// Verify response.
|
||||||
|
$recaptcha = new GF_Field_CAPTCHA();
|
||||||
|
$recaptcha_response = $recaptcha->verify_recaptcha_response( $response, $private_key );
|
||||||
|
|
||||||
|
// Log verification response.
|
||||||
|
GFCommon::log_debug( __METHOD__ . '(): reCAPTCHA verification response:' . print_r( $recaptcha_response, true ) );
|
||||||
|
// @codingStandardsIgnoreEnd
|
||||||
|
|
||||||
|
// If response is false, return validation error.
|
||||||
|
if ( $recaptcha_response === false ) {
|
||||||
|
$field->set_error( __( 'reCAPTCHA keys are invalid.', 'gravityformsrecaptcha' ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
// Save status.
|
||||||
|
update_option( 'gform_recaptcha_keys_status', $recaptcha_response );
|
||||||
|
} else {
|
||||||
|
// Delete existing status.
|
||||||
|
delete_option( 'gform_recaptcha_keys_status' );
|
||||||
|
}
|
||||||
|
},
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Convert an array containing arrays of translated strings into HTML paragraphs.
|
||||||
|
*
|
||||||
|
* @param array $paragraphs An array of arrays containing translated text.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function get_description( array $paragraphs ) {
|
||||||
|
$description_text = array();
|
||||||
|
|
||||||
|
foreach ( $paragraphs as $paragraph ) {
|
||||||
|
$description_text[] = '<p>' . implode( ' ', $paragraph ) . '</p>';
|
||||||
|
}
|
||||||
|
|
||||||
|
return implode( '', $description_text );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the contents of the description field.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function get_settings_intro_description() {
|
||||||
|
$description = array();
|
||||||
|
|
||||||
|
$description[] = array(
|
||||||
|
esc_html__( 'Google reCAPTCHA is a free anti-spam service that protects your website from fraud and abuse.', 'gravityformsrecaptcha' ),
|
||||||
|
esc_html__( 'By adding reCAPTCHA to your forms, you can deter automated software from submitting form entries, while still ensuring a user-friendly experience for real people.', 'gravityformsrecaptcha' ),
|
||||||
|
);
|
||||||
|
|
||||||
|
$description[] = array(
|
||||||
|
esc_html__( 'Gravity Forms integrates with three types of Google reCAPTCHA.', 'gravityformsrecaptcha' ),
|
||||||
|
'<ul><li>',
|
||||||
|
esc_html__( 'reCAPTCHA v3 - Adds a script to every page of your site and uploads form content for processing by Google.', 'gravityformsrecaptcha' ),
|
||||||
|
esc_html__( 'All submissions are accepted and suspicious submissions are marked as spam.', 'gravityformsrecaptcha' ),
|
||||||
|
esc_html__( 'When reCAPTCHA v3 is configured, it is enabled automatically on all forms by default. It can be disabled for specific forms in the form settings.', 'gravityformsrecaptcha' ),
|
||||||
|
'</li><li>',
|
||||||
|
esc_html__( 'reCAPTCHA v2 (Invisible) - Displays a badge on your form and will present a challenge to the user if the activity is suspicious e.g. select the traffic lights.', 'gravityformsrecaptcha' ),
|
||||||
|
esc_html__( 'Please note, only v2 keys are supported and checkbox keys are not compatible with invisible reCAPTCHA.', 'gravityformsrecaptcha' ),
|
||||||
|
esc_html__( 'To activate reCAPTCHA v2 on your form, simply add the CAPTCHA field in the form editor.', 'gravityformsrecaptcha' ),
|
||||||
|
sprintf(
|
||||||
|
'<a href="%s">%s</a>',
|
||||||
|
esc_url( 'https://docs.gravityforms.com/captcha/' ),
|
||||||
|
__( 'Read more about reCAPTCHA.', 'gravityformsrecaptcha' )
|
||||||
|
),
|
||||||
|
'</li><li>',
|
||||||
|
esc_html__( 'reCAPTCHA v2 (Checkbox) - Requires a user to click a checkbox to indicate that they are not a robot and displays a challenge if the activity is suspicious', 'gravityformsrecaptcha' ),
|
||||||
|
'</li></ul>',
|
||||||
|
);
|
||||||
|
|
||||||
|
$description[] = array(
|
||||||
|
esc_html__( 'For more information on reCAPTCHA, which version is right for you, and how to add it to your forms,', 'gravityformsrecaptcha' ),
|
||||||
|
sprintf(
|
||||||
|
'<a href="%s">%s</a>',
|
||||||
|
esc_url( 'https://docs.gravityforms.com/captcha/' ),
|
||||||
|
esc_html__( 'check out our documentation.', 'gravityformsrecaptcha' )
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->get_description( $description );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the description for the score threshold.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function get_score_threshold_description() {
|
||||||
|
$description = array(
|
||||||
|
array(
|
||||||
|
esc_html__( 'reCAPTCHA v3 returns a score (1.0 is very likely a good interaction, 0.0 is very likely a bot).', 'gravityformsrecaptcha' ),
|
||||||
|
esc_html__( 'If the score is less than or equal to this threshold, the form submission will be sent to spam.', 'gravityformsrecaptcha' ),
|
||||||
|
esc_html__( 'The default threshold is 0.5.', 'gravityformsrecaptcha' ),
|
||||||
|
sprintf(
|
||||||
|
'<a href="%s">Learn about about reCAPTCHA.</a>',
|
||||||
|
esc_url( 'https://docs.gravityforms.com/captcha/' )
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
|
||||||
|
return $this->get_description( $description );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders a reCAPTCHA verification field.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param array $props Field properties.
|
||||||
|
* @param bool $echo Output the field markup directly.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function handle_recaptcha_v2_reset( $props = array(), $echo = true ) {
|
||||||
|
// Add setup message.
|
||||||
|
$html = sprintf(
|
||||||
|
'<p id="gforms_checkbox_recaptcha_message" style="margin-bottom:10px;">%s</p>',
|
||||||
|
esc_html__( 'Please complete the reCAPTCHA widget to validate your reCAPTCHA keys:', 'gravityforms' )
|
||||||
|
);
|
||||||
|
|
||||||
|
// Add reCAPTCHA container, reset input.
|
||||||
|
$html .= '<div id="recaptcha"></div>';
|
||||||
|
$html .= sprintf( '<input type="hidden" name="%s_%s" />', esc_attr( $this->addon->get_settings_renderer()->get_input_name_prefix() ), esc_attr( $props['name'] ) );
|
||||||
|
|
||||||
|
return $html;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Validate that the score is a number between 0.0 and 1.0
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param Base $field Settings field object.
|
||||||
|
* @param string $score The submitted score threshold.
|
||||||
|
*
|
||||||
|
* @return bool
|
||||||
|
*/
|
||||||
|
public function validate_score_threshold_v3( $field, $score ) {
|
||||||
|
if ( ! $field instanceof Text ) {
|
||||||
|
$field->set_error( esc_html__( 'Unexpected field type.', 'gravityformsrecaptcha' ) );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
$field_value = (float) $score;
|
||||||
|
|
||||||
|
if ( ! is_numeric( $score ) || $field_value < $field->min || $field_value > $field->max ) {
|
||||||
|
$field->set_error( esc_html__( 'Score threshold must be between 0.0 and 1.0', 'gravityformsrecaptcha' ) );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns true, false, or null, depending on the state of validation.
|
||||||
|
*
|
||||||
|
* The add-on framework will use this value to determine which field icon to display.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param null|string $key_status The status of the key (a string of 1 or 0).
|
||||||
|
* @param string $value The posted value of the field to validate.
|
||||||
|
*
|
||||||
|
* @return bool|null
|
||||||
|
*/
|
||||||
|
public function check_validated_status( $key_status, $value ) {
|
||||||
|
if ( ! is_null( $key_status ) ) {
|
||||||
|
return (bool) $key_status;
|
||||||
|
}
|
||||||
|
|
||||||
|
return rgblank( $value ) ? null : false;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Return strue, false, or null, depending on the state of validation.
|
||||||
|
*
|
||||||
|
* The add-on framework will use this value to determine which field icon to display.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param string $value The posted value of the field.
|
||||||
|
*
|
||||||
|
* @return bool|null
|
||||||
|
*/
|
||||||
|
public function validate_key_v2( $value ) {
|
||||||
|
return $this->check_validated_status( get_option( 'gform_recaptcha_keys_status', null ), $value );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Feedback callback for v3 key validation.
|
||||||
|
*
|
||||||
|
* @param string $value The posted value.
|
||||||
|
*
|
||||||
|
* @return bool|null
|
||||||
|
*/
|
||||||
|
public function v3_keys_status_feedback_callback( $value ) {
|
||||||
|
return $this->check_validated_status( $this->addon->get_setting( 'recaptcha_keys_status_v3' ), $value );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ajax callback to verify the secret key on the plugin settings screen.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public function verify_v3_keys() {
|
||||||
|
$result = $this->token_verifier->verify(
|
||||||
|
sanitize_text_field( rgpost( 'token' ) ),
|
||||||
|
sanitize_text_field( rgpost( 'secret_key_v3' ) )
|
||||||
|
);
|
||||||
|
|
||||||
|
$this->apply_status_changes( $result );
|
||||||
|
|
||||||
|
if ( is_wp_error( $result ) ) {
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): Failed to verify reCAPTCHA token. ' . $result->get_error_message() );
|
||||||
|
|
||||||
|
wp_send_json_error();
|
||||||
|
}
|
||||||
|
|
||||||
|
$this->addon->log_debug( __METHOD__ . '(): reCAPTCHA token successfully verified.' );
|
||||||
|
|
||||||
|
$result->keys_status = $this->addon->get_plugin_setting( 'recaptcha_keys_status_v3' );
|
||||||
|
|
||||||
|
wp_send_json_success( $result );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Applies updates to the verified key status when the site and secret v3 keys are saved.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param object $response The response of the secret key verification process.
|
||||||
|
*/
|
||||||
|
private function apply_status_changes( $response ) {
|
||||||
|
$posted_keys = $this->get_posted_keys();
|
||||||
|
|
||||||
|
// Set the updated status of the keys.
|
||||||
|
$posted_keys['recaptcha_keys_status_v3'] = ( ! is_wp_error( $response ) && $response->success === true ) ? '1' : '0';
|
||||||
|
|
||||||
|
$this->addon->update_plugin_settings(
|
||||||
|
array_merge(
|
||||||
|
$this->addon->get_plugin_settings(),
|
||||||
|
$posted_keys
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the posted of the v3 keys from the settings page.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return array
|
||||||
|
*/
|
||||||
|
private function get_posted_keys() {
|
||||||
|
$settings = $this->addon->get_plugin_settings();
|
||||||
|
$posted_site_key = $this->get_posted_key( 'site_key_v3' );
|
||||||
|
$posted_secret_key = $this->get_posted_key( 'secret_key_v3' );
|
||||||
|
|
||||||
|
if (
|
||||||
|
$posted_site_key === rgar( $settings, 'site_key_v3' )
|
||||||
|
&& $posted_secret_key === rgar( $settings, 'secret_key_v3' )
|
||||||
|
) {
|
||||||
|
return array();
|
||||||
|
}
|
||||||
|
|
||||||
|
return array(
|
||||||
|
'site_key_v3' => $posted_site_key,
|
||||||
|
'secret_key_v3' => $posted_secret_key,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Gets the value of the specified input from the $_POST.
|
||||||
|
*
|
||||||
|
* @since 1.3
|
||||||
|
*
|
||||||
|
* @param string $key_name The name of the key to retrieve.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
private function get_posted_key( $key_name ) {
|
||||||
|
if ( ! defined( 'DOING_AJAX' ) || ! DOING_AJAX ) {
|
||||||
|
$key_name = "_gform_setting_{$key_name}";
|
||||||
|
}
|
||||||
|
|
||||||
|
return sanitize_text_field( rgpost( $key_name ) );
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the value of one of the reCAPTCHA keys from the plugin settings.
|
||||||
|
*
|
||||||
|
* Checks first for a value defined as a constant, and secondarily, the add-on options.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
* @since 1.3 Added the $only_from_constant param.
|
||||||
|
*
|
||||||
|
* @param string $key_name The name of the key to retrieve.
|
||||||
|
* @param bool $only_from_constant Indicates if value should only be retrieved from the constant.
|
||||||
|
*
|
||||||
|
* @return string
|
||||||
|
*/
|
||||||
|
public function get_recaptcha_key( $key_name, $only_from_constant = false ) {
|
||||||
|
if ( ! $only_from_constant && is_admin() ) {
|
||||||
|
$posted_key = $this->get_posted_key( $key_name );
|
||||||
|
|
||||||
|
if ( $posted_key ) {
|
||||||
|
return $posted_key;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$keys = array(
|
||||||
|
'site_key_v3' => defined( 'GF_RECAPTCHA_V3_SITE_KEY' ) ? GF_RECAPTCHA_V3_SITE_KEY : '',
|
||||||
|
'secret_key_v3' => defined( 'GF_RECAPTCHA_V3_SECRET_KEY' ) ? GF_RECAPTCHA_V3_SECRET_KEY : '',
|
||||||
|
'site_key_v2' => '',
|
||||||
|
'secret_key_v2' => '',
|
||||||
|
);
|
||||||
|
|
||||||
|
if ( ! in_array( $key_name, array_keys( $keys ), true ) ) {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = rgar( $keys, $key_name, '' );
|
||||||
|
|
||||||
|
if ( ! empty( $key ) || $only_from_constant ) {
|
||||||
|
return $key;
|
||||||
|
}
|
||||||
|
|
||||||
|
$key = $this->addon->get_plugin_setting( $key_name );
|
||||||
|
|
||||||
|
return ! empty( $key ) ? $key : '';
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -0,0 +1,146 @@
|
|||||||
|
/******/ (function() { // webpackBootstrap
|
||||||
|
/******/ var __webpack_modules__ = ({
|
||||||
|
|
||||||
|
/***/ "./js/src/frontend-legacy.js":
|
||||||
|
/*!***********************************!*\
|
||||||
|
!*** ./js/src/frontend-legacy.js ***!
|
||||||
|
\***********************************/
|
||||||
|
/***/ (function() {
|
||||||
|
|
||||||
|
var _this = this;
|
||||||
|
/* global jQuery, gform, gforms_recaptcha_recaptcha_strings, grecaptcha */
|
||||||
|
(function ($, gform, grecaptcha, strings) {
|
||||||
|
/**
|
||||||
|
* Make the API request to Google to get the reCAPTCHA token right before submission.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param {Object} e The event object.
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
var getToken = function getToken(e) {
|
||||||
|
var form = $(e.data.form);
|
||||||
|
var recaptchaField = form.find('.ginput_recaptchav3');
|
||||||
|
var dataInput = recaptchaField.find('.gfield_recaptcha_response');
|
||||||
|
if (!dataInput.length || dataInput.val().length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
e.preventDefault();
|
||||||
|
grecaptcha.ready(function () {
|
||||||
|
grecaptcha.execute(strings.site_key, {
|
||||||
|
action: 'submit'
|
||||||
|
}).then(function (token) {
|
||||||
|
if (token.length && typeof token === 'string') {
|
||||||
|
dataInput.val(token);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Sometimes the submit button is disabled to prevent the user from clicking it again,
|
||||||
|
// for example when 3DS is being processed for stripe elements.
|
||||||
|
// We need to enable it before submitting the form, otherwise it won't be submitted.
|
||||||
|
var $submitButton = $('#gform_submit_button_' + form[0].dataset.formid);
|
||||||
|
if ($submitButton.prop('disabled') === true) {
|
||||||
|
$submitButton.prop('disabled', false);
|
||||||
|
}
|
||||||
|
form.submit();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add event listeners to the form.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param {string|number} formId The numeric ID of the form.
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
var addFormEventListeners = function addFormEventListeners(formId) {
|
||||||
|
var $form = $("#gform_".concat(formId, ":not(.recaptcha-v3-initialized)"));
|
||||||
|
$form.on('submit', {
|
||||||
|
form: $form
|
||||||
|
}, getToken);
|
||||||
|
$form.addClass('recaptcha-v3-initialized');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The reCAPTCHA handler.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
var gfRecaptcha = function gfRecaptcha() {
|
||||||
|
var self = _this;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the Recaptcha handler.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
self.init = function () {
|
||||||
|
self.elements = {
|
||||||
|
formIds: self.getFormIds()
|
||||||
|
};
|
||||||
|
self.addEventListeners();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get an array of form IDs.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {Array} Array of form IDs.
|
||||||
|
*/
|
||||||
|
self.getFormIds = function () {
|
||||||
|
var ids = [];
|
||||||
|
var forms = document.querySelectorAll('.gform_wrapper form');
|
||||||
|
forms.forEach(function (form) {
|
||||||
|
if ('formid' in form.dataset) {
|
||||||
|
ids.push(form.dataset.formid);
|
||||||
|
} else {
|
||||||
|
ids.push(form.getAttribute('id').split('gform_')[1]);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return ids;
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add event listeners to the page.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
self.addEventListeners = function () {
|
||||||
|
self.elements.formIds.forEach(function (formId) {
|
||||||
|
addFormEventListeners(formId);
|
||||||
|
});
|
||||||
|
$(document).on('gform_post_render', function (event, formId) {
|
||||||
|
addFormEventListeners(formId);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
self.init();
|
||||||
|
};
|
||||||
|
|
||||||
|
// Initialize and run the whole shebang.
|
||||||
|
$(document).ready(function () {
|
||||||
|
gfRecaptcha();
|
||||||
|
});
|
||||||
|
})(jQuery, gform, grecaptcha, gforms_recaptcha_recaptcha_strings);
|
||||||
|
|
||||||
|
/***/ })
|
||||||
|
|
||||||
|
/******/ });
|
||||||
|
/************************************************************************/
|
||||||
|
/******/
|
||||||
|
/******/ // startup
|
||||||
|
/******/ // Load entry module and return exports
|
||||||
|
/******/ // This entry module is referenced by other modules so it can't be inlined
|
||||||
|
/******/ var __webpack_exports__ = {};
|
||||||
|
/******/ __webpack_modules__["./js/src/frontend-legacy.js"]();
|
||||||
|
/******/
|
||||||
|
/******/ })()
|
||||||
|
;
|
||||||
|
//# sourceMappingURL=frontend-legacy.js.map
|
||||||
1
wp/wp-content/plugins/gravityformsrecaptcha/js/frontend-legacy.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
({966:function(){var t=this;!function(e,n,r,i){var a=function(t){var n=e(t.data.form),a=n.find(".ginput_recaptchav3").find(".gfield_recaptcha_response");a.length&&!a.val().length&&(t.preventDefault(),r.ready((function(){r.execute(i.site_key,{action:"submit"}).then((function(t){t.length&&"string"==typeof t&&a.val(t);var r=e("#gform_submit_button_"+n[0].dataset.formid);!0===r.prop("disabled")&&r.prop("disabled",!1),n.submit()}))})))},o=function(t){var n=e("#gform_".concat(t,":not(.recaptcha-v3-initialized)"));n.on("submit",{form:n},a),n.addClass("recaptcha-v3-initialized")};e(document).ready((function(){var n;(n=t).init=function(){n.elements={formIds:n.getFormIds()},n.addEventListeners()},n.getFormIds=function(){var t=[];return document.querySelectorAll(".gform_wrapper form").forEach((function(e){"formid"in e.dataset?t.push(e.dataset.formid):t.push(e.getAttribute("id").split("gform_")[1])})),t},n.addEventListeners=function(){n.elements.formIds.forEach((function(t){o(t)})),e(document).on("gform_post_render",(function(t,e){o(e)}))},n.init()}))}(jQuery,gform,grecaptcha,gforms_recaptcha_recaptcha_strings)}})[966]();
|
||||||
106
wp/wp-content/plugins/gravityformsrecaptcha/js/frontend.js
Normal file
2
wp/wp-content/plugins/gravityformsrecaptcha/js/frontend.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
/*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/facebook/regenerator/blob/main/LICENSE */
|
||||||
@@ -0,0 +1,412 @@
|
|||||||
|
/******/ (function() { // webpackBootstrap
|
||||||
|
var __webpack_exports__ = {};
|
||||||
|
/*!***********************************!*\
|
||||||
|
!*** ./js/src/plugin_settings.js ***!
|
||||||
|
\***********************************/
|
||||||
|
/* global jQuery, gform, grecaptcha, gforms_recaptcha_recaptcha_strings */
|
||||||
|
|
||||||
|
(function ($) {
|
||||||
|
/**
|
||||||
|
* Handles reCAPTCHA v2 plugin settings validation.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
var recaptchaV2Settings = function recaptchaV2Settings() {
|
||||||
|
var v2Settings = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize reCAPTCHA v2 settings.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v2Settings.init = function () {
|
||||||
|
v2Settings.cacheElements();
|
||||||
|
v2Settings.addEventListeners();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache the fields used by this handler.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v2Settings.cacheElements = function () {
|
||||||
|
v2Settings.container = $('div[id="gform_setting_reset_v2"]');
|
||||||
|
v2Settings.fields = {
|
||||||
|
siteKey: $('input[name="_gform_setting_site_key_v2"]'),
|
||||||
|
secretKey: $('input[name="_gform_setting_secret_key_v2"]'),
|
||||||
|
reset: $('input[name="_gform_setting_reset_v2"]'),
|
||||||
|
type: $('input[name="_gform_setting_type_v2"]')
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add event listeners for this handler.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v2Settings.addEventListeners = function () {
|
||||||
|
v2Settings.fields.siteKey.on('change', window.loadRecaptcha);
|
||||||
|
v2Settings.fields.secretKey.on('change', window.loadRecaptcha);
|
||||||
|
v2Settings.fields.type.on('change', function () {
|
||||||
|
return window.loadRecaptcha();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles showing and hiding the reCAPTCHA itself.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
window.loadRecaptcha = function () {
|
||||||
|
var self = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize the reCAPTCHA rendering process.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
self.init = function () {
|
||||||
|
v2Settings.recaptcha = $('#recaptcha');
|
||||||
|
v2Settings.save = $('#gform-settings-save');
|
||||||
|
self.flushExistingState();
|
||||||
|
|
||||||
|
// Reset key status.
|
||||||
|
// Note: recaptcha is misspelled here for legacy reasons.
|
||||||
|
$('#recpatcha .gform-settings-field__feedback').remove();
|
||||||
|
|
||||||
|
// If no public or private key is provided, exit.
|
||||||
|
if (!self.canBeDisplayed()) {
|
||||||
|
self.hideRecaptcha();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
v2Settings.save.prop('disabled', true);
|
||||||
|
self.showSelectedRecaptcha();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Renders the v2 reCAPTCHA.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param {string} typeValue The selected type to render.
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
self.render = function (typeValue) {
|
||||||
|
// Render reCAPTCHA.
|
||||||
|
grecaptcha.render('recaptcha', {
|
||||||
|
sitekey: v2Settings.fields.siteKey.val().trim(),
|
||||||
|
size: typeValue === 'invisible' ? typeValue : '',
|
||||||
|
badge: 'inline',
|
||||||
|
'error-callback': function errorCallback() {},
|
||||||
|
callback: function callback() {
|
||||||
|
return v2Settings.save.prop('disabled', false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Flush the existing state of the reCAPTCHA handler.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
self.flushExistingState = function () {
|
||||||
|
window.___grecaptcha_cfg.clients = {};
|
||||||
|
window.___grecaptcha_cfg.count = 0;
|
||||||
|
v2Settings.recaptcha.html('');
|
||||||
|
v2Settings.fields.reset.val('1');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Determines whether the reCAPTCHA can be shown.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {boolean} Whether the reCAPTCHA can be shown.
|
||||||
|
*/
|
||||||
|
self.canBeDisplayed = function () {
|
||||||
|
return v2Settings.fields.siteKey.val() && v2Settings.fields.secretKey.val();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Hides the reCAPTCHA element.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
self.hideRecaptcha = function () {
|
||||||
|
v2Settings.save.prop('disabled', false);
|
||||||
|
v2Settings.container.hide();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Show the selected reCAPTCHA type.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
self.showSelectedRecaptcha = function () {
|
||||||
|
var typeValue = $('input[name="_gform_setting_type_v2"]:checked').val();
|
||||||
|
self.render(typeValue);
|
||||||
|
switch (typeValue) {
|
||||||
|
case 'checkbox':
|
||||||
|
$('#gforms_checkbox_recaptcha_message, label[for="reset"]').show();
|
||||||
|
break;
|
||||||
|
case 'invisible':
|
||||||
|
$('#gforms_checkbox_recaptcha_message, label[for="reset"]').hide();
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error('Unexpected type selected.');
|
||||||
|
}
|
||||||
|
v2Settings.container.show();
|
||||||
|
if (typeValue === 'invisible') {
|
||||||
|
grecaptcha.execute();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
self.init();
|
||||||
|
};
|
||||||
|
v2Settings.init();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles reCAPTCHA v3 plugin settings validation.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
var recaptchaV3Settings = function recaptchaV3Settings() {
|
||||||
|
var v3Settings = {};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initializes the reCAPTCHA v3 settings handler.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v3Settings.init = function () {
|
||||||
|
v3Settings.token = '';
|
||||||
|
v3Settings.strings = gforms_recaptcha_recaptcha_strings;
|
||||||
|
v3Settings.cacheElements();
|
||||||
|
v3Settings.validateKeysV3();
|
||||||
|
v3Settings.addEventListeners();
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cache HTML elements for the v3 reCAPTCHA settings.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v3Settings.cacheElements = function () {
|
||||||
|
v3Settings.fields = {
|
||||||
|
siteKey: '#site_key_v3',
|
||||||
|
secretKey: '#secret_key_v3',
|
||||||
|
threshold: '#score_threshold_v3',
|
||||||
|
disableBadge: '#disable_badge_v3',
|
||||||
|
keysStatus: '#gform_setting_recaptcha_keys_status_v3'
|
||||||
|
};
|
||||||
|
v3Settings.cache = {
|
||||||
|
siteKey: $(v3Settings.fields.siteKey),
|
||||||
|
secretKey: $(v3Settings.fields.secretKey),
|
||||||
|
keysStatus: $(v3Settings.fields.keysStatus),
|
||||||
|
save: $('#gform-settings-save')
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Setup event listeners for field validation.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v3Settings.addEventListeners = function () {
|
||||||
|
if (!v3Settings.strings.site_key.length) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
$(v3Settings.fields.siteKey).on('keyup', function () {
|
||||||
|
return v3Settings.clearValidationFeedback();
|
||||||
|
});
|
||||||
|
$(v3Settings.fields.secretKey).on('keyup', function () {
|
||||||
|
return v3Settings.clearValidationFeedback();
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Empty out the validation feedback if the fields are modified, as we can't yet know the status.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v3Settings.clearValidationFeedback = function () {
|
||||||
|
v3Settings.unsetValid(v3Settings.cache.siteKey.closest('.gform-settings-input__container'));
|
||||||
|
v3Settings.unsetValid(v3Settings.cache.secretKey.closest('.gform-settings-input__container'));
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles validation of the v3 site key.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {Promise<unknown>} Returns a promise so this can be verified synchronously if checking the secret key.
|
||||||
|
*/
|
||||||
|
v3Settings.getRecaptchaToken = function () {
|
||||||
|
return new Promise(function (resolve, reject) {
|
||||||
|
var siteKeyContainer = v3Settings.cache.siteKey.closest('.gform-settings-input__container');
|
||||||
|
try {
|
||||||
|
var siteKey = v3Settings.cache.siteKey;
|
||||||
|
var siteKeyValue = siteKey.val().trim();
|
||||||
|
if (0 === siteKeyValue.length) {
|
||||||
|
v3Settings.unsetValid(siteKeyContainer);
|
||||||
|
v3Settings.unsetValid(v3Settings.cache.keysStatus.closest('.gform-settings-input__container'));
|
||||||
|
$(v3Settings.fields.keysStatus).find('input').val('0');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
grecaptcha.ready(function () {
|
||||||
|
try {
|
||||||
|
grecaptcha.execute(siteKeyValue, {
|
||||||
|
action: 'submit'
|
||||||
|
}).then(function (token) {
|
||||||
|
resolve(token);
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
} catch (error) {
|
||||||
|
reject(error);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Handles validation of the v3 site and secret keys.
|
||||||
|
*
|
||||||
|
* On page load, attempt to generate a reCAPTCHA token and immediately validate it on the server. If it's good,
|
||||||
|
* we'll update the presentation of the keys to indicate success or failure.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v3Settings.validateKeysV3 = function () {
|
||||||
|
var siteKeyContainer = v3Settings.cache.siteKey.closest('.gform-settings-input__container');
|
||||||
|
var secretKeyContainer = v3Settings.cache.secretKey.closest('.gform-settings-input__container');
|
||||||
|
var keysStatusInput = $(v3Settings.fields.keysStatus).find('input');
|
||||||
|
if (!$(v3Settings.fields.siteKey).val().trim().length) {
|
||||||
|
v3Settings.unsetValid(siteKeyContainer);
|
||||||
|
v3Settings.unsetValid(secretKeyContainer);
|
||||||
|
keysStatusInput.val('0');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
v3Settings.getRecaptchaToken().then(function (token) {
|
||||||
|
v3Settings.token = token;
|
||||||
|
}).catch(function () {
|
||||||
|
v3Settings.setInvalid(siteKeyContainer);
|
||||||
|
v3Settings.setInvalid(secretKeyContainer);
|
||||||
|
keysStatusInput.val('0');
|
||||||
|
}).finally(function () {
|
||||||
|
$.ajax({
|
||||||
|
method: 'POST',
|
||||||
|
dataType: 'JSON',
|
||||||
|
url: v3Settings.strings.ajaxurl,
|
||||||
|
data: {
|
||||||
|
action: 'verify_secret_key',
|
||||||
|
nonce: v3Settings.strings.nonce,
|
||||||
|
token: v3Settings.token,
|
||||||
|
site_key_v3: $(v3Settings.fields.siteKey).val(),
|
||||||
|
secret_key_v3: $(v3Settings.fields.secretKey).val()
|
||||||
|
}
|
||||||
|
}).then(function (response) {
|
||||||
|
switch (response.data.keys_status) {
|
||||||
|
case '1':
|
||||||
|
v3Settings.setValid(siteKeyContainer);
|
||||||
|
v3Settings.setValid(secretKeyContainer);
|
||||||
|
keysStatusInput.val('1');
|
||||||
|
break;
|
||||||
|
case '0':
|
||||||
|
v3Settings.setInvalid(siteKeyContainer);
|
||||||
|
v3Settings.setInvalid(secretKeyContainer);
|
||||||
|
keysStatusInput.val('0');
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
v3Settings.unsetValid(siteKeyContainer);
|
||||||
|
v3Settings.unsetValid(secretKeyContainer);
|
||||||
|
keysStatusInput.val('0');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the text field to display no feedback.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param {Object} el The jQuery element.
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v3Settings.unsetValid = function (el) {
|
||||||
|
el.removeClass('gform-settings-input__container--feedback-success');
|
||||||
|
el.removeClass('gform-settings-input__container--feedback-error');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the text field to display the successful feedback.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param {Object} el The jQuery element.
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v3Settings.setValid = function (el) {
|
||||||
|
el.addClass('gform-settings-input__container--feedback-success');
|
||||||
|
el.removeClass('gform-settings-input__container--feedback-error');
|
||||||
|
};
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Updates the text field to display the error feedback.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @param {Object} el The jQuery element.
|
||||||
|
*
|
||||||
|
* @return {void}
|
||||||
|
*/
|
||||||
|
v3Settings.setInvalid = function (el) {
|
||||||
|
el.removeClass('gform-settings-input__container--feedback-success');
|
||||||
|
el.addClass('gform-settings-input__container--feedback-error');
|
||||||
|
};
|
||||||
|
v3Settings.init();
|
||||||
|
};
|
||||||
|
$(document).ready(function () {
|
||||||
|
recaptchaV3Settings();
|
||||||
|
recaptchaV2Settings();
|
||||||
|
gform.adminUtils.handleUnsavedChanges('#gform-settings');
|
||||||
|
});
|
||||||
|
})(jQuery);
|
||||||
|
/******/ })()
|
||||||
|
;
|
||||||
|
//# sourceMappingURL=plugin_settings.js.map
|
||||||
1
wp/wp-content/plugins/gravityformsrecaptcha/js/plugin_settings.min.js
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
!function(){var e;(e=jQuery)(document).ready((function(){var t,n;(t={init:function(){t.token="",t.strings=gforms_recaptcha_recaptcha_strings,t.cacheElements(),t.validateKeysV3(),t.addEventListeners()},cacheElements:function(){t.fields={siteKey:"#site_key_v3",secretKey:"#secret_key_v3",threshold:"#score_threshold_v3",disableBadge:"#disable_badge_v3",keysStatus:"#gform_setting_recaptcha_keys_status_v3"},t.cache={siteKey:e(t.fields.siteKey),secretKey:e(t.fields.secretKey),keysStatus:e(t.fields.keysStatus),save:e("#gform-settings-save")}},addEventListeners:function(){t.strings.site_key.length&&(e(t.fields.siteKey).on("keyup",(function(){return t.clearValidationFeedback()})),e(t.fields.secretKey).on("keyup",(function(){return t.clearValidationFeedback()})))},clearValidationFeedback:function(){t.unsetValid(t.cache.siteKey.closest(".gform-settings-input__container")),t.unsetValid(t.cache.secretKey.closest(".gform-settings-input__container"))},getRecaptchaToken:function(){return new Promise((function(n,s){var a=t.cache.siteKey.closest(".gform-settings-input__container");try{var i=t.cache.siteKey.val().trim();if(0===i.length)return t.unsetValid(a),t.unsetValid(t.cache.keysStatus.closest(".gform-settings-input__container")),void e(t.fields.keysStatus).find("input").val("0");grecaptcha.ready((function(){try{grecaptcha.execute(i,{action:"submit"}).then((function(e){n(e)}))}catch(e){s(e)}}))}catch(e){s(e)}}))},validateKeysV3:function(){var n=t.cache.siteKey.closest(".gform-settings-input__container"),s=t.cache.secretKey.closest(".gform-settings-input__container"),a=e(t.fields.keysStatus).find("input");if(!e(t.fields.siteKey).val().trim().length)return t.unsetValid(n),t.unsetValid(s),void a.val("0");t.getRecaptchaToken().then((function(e){t.token=e})).catch((function(){t.setInvalid(n),t.setInvalid(s),a.val("0")})).finally((function(){e.ajax({method:"POST",dataType:"JSON",url:t.strings.ajaxurl,data:{action:"verify_secret_key",nonce:t.strings.nonce,token:t.token,site_key_v3:e(t.fields.siteKey).val(),secret_key_v3:e(t.fields.secretKey).val()}}).then((function(e){switch(e.data.keys_status){case"1":t.setValid(n),t.setValid(s),a.val("1");break;case"0":t.setInvalid(n),t.setInvalid(s),a.val("0");break;default:t.unsetValid(n),t.unsetValid(s),a.val("0")}}))}))},unsetValid:function(e){e.removeClass("gform-settings-input__container--feedback-success"),e.removeClass("gform-settings-input__container--feedback-error")},setValid:function(e){e.addClass("gform-settings-input__container--feedback-success"),e.removeClass("gform-settings-input__container--feedback-error")},setInvalid:function(e){e.removeClass("gform-settings-input__container--feedback-success"),e.addClass("gform-settings-input__container--feedback-error")}}).init(),n={init:function(){n.cacheElements(),n.addEventListeners()},cacheElements:function(){n.container=e('div[id="gform_setting_reset_v2"]'),n.fields={siteKey:e('input[name="_gform_setting_site_key_v2"]'),secretKey:e('input[name="_gform_setting_secret_key_v2"]'),reset:e('input[name="_gform_setting_reset_v2"]'),type:e('input[name="_gform_setting_type_v2"]')}},addEventListeners:function(){n.fields.siteKey.on("change",window.loadRecaptcha),n.fields.secretKey.on("change",window.loadRecaptcha),n.fields.type.on("change",(function(){return window.loadRecaptcha()}))}},window.loadRecaptcha=function(){var t={init:function(){n.recaptcha=e("#recaptcha"),n.save=e("#gform-settings-save"),t.flushExistingState(),e("#recpatcha .gform-settings-field__feedback").remove(),t.canBeDisplayed()?(n.save.prop("disabled",!0),t.showSelectedRecaptcha()):t.hideRecaptcha()},render:function(e){grecaptcha.render("recaptcha",{sitekey:n.fields.siteKey.val().trim(),size:"invisible"===e?e:"",badge:"inline","error-callback":function(){},callback:function(){return n.save.prop("disabled",!1)}})},flushExistingState:function(){window.___grecaptcha_cfg.clients={},window.___grecaptcha_cfg.count=0,n.recaptcha.html(""),n.fields.reset.val("1")},canBeDisplayed:function(){return n.fields.siteKey.val()&&n.fields.secretKey.val()},hideRecaptcha:function(){n.save.prop("disabled",!1),n.container.hide()},showSelectedRecaptcha:function(){var s=e('input[name="_gform_setting_type_v2"]:checked').val();switch(t.render(s),s){case"checkbox":e('#gforms_checkbox_recaptcha_message, label[for="reset"]').show();break;case"invisible":e('#gforms_checkbox_recaptcha_message, label[for="reset"]').hide();break;default:throw new Error("Unexpected type selected.")}n.container.show(),"invisible"===s&&grecaptcha.execute()}};t.init()},n.init(),gform.adminUtils.handleUnsavedChanges("#gform-settings")}))}();
|
||||||
@@ -0,0 +1,186 @@
|
|||||||
|
# Copyright (C) 2024 Gravity Forms
|
||||||
|
# This file is distributed under the GPL-3.0+.
|
||||||
|
msgid ""
|
||||||
|
msgstr ""
|
||||||
|
"Project-Id-Version: Gravity Forms reCAPTCHA Add-On 1.6.0\n"
|
||||||
|
"Report-Msgid-Bugs-To: https://gravityforms.com/support\n"
|
||||||
|
"Last-Translator: Gravity Forms <support@gravityforms.com>\n"
|
||||||
|
"Language-Team: Gravity Forms <support@gravityforms.com>\n"
|
||||||
|
"MIME-Version: 1.0\n"
|
||||||
|
"Content-Type: text/plain; charset=UTF-8\n"
|
||||||
|
"Content-Transfer-Encoding: 8bit\n"
|
||||||
|
"POT-Creation-Date: 2024-07-30T13:59:39+00:00\n"
|
||||||
|
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
|
||||||
|
"X-Generator: WP-CLI 2.10.0\n"
|
||||||
|
"X-Domain: gravityformsrecaptcha\n"
|
||||||
|
|
||||||
|
#. Plugin Name of the plugin
|
||||||
|
msgid "Gravity Forms reCAPTCHA Add-On"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Plugin URI of the plugin
|
||||||
|
#. Author URI of the plugin
|
||||||
|
msgid "https://gravityforms.com"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Description of the plugin
|
||||||
|
msgid "Enhance Gravity Forms with support for Google reCAPTCHA."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#. Author of the plugin
|
||||||
|
msgid "Gravity Forms"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-recaptcha.php:492
|
||||||
|
msgid "Disable reCAPTCHA v3 for this form."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-recaptcha.php:674
|
||||||
|
msgid "reCAPTCHA Score"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-recaptcha.php:735
|
||||||
|
msgid "reCAPTCHA"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-recaptcha.php:756
|
||||||
|
msgid "Score"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: class-gf-recaptcha.php:759
|
||||||
|
msgid "Click here to learn more about reCAPTCHA."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:122
|
||||||
|
msgid "reCAPTCHA Settings"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:144
|
||||||
|
msgid "reCAPTCHA v3"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:148
|
||||||
|
#: includes/settings/class-plugin-settings.php:233
|
||||||
|
msgid "Site Key"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:156
|
||||||
|
#: includes/settings/class-plugin-settings.php:240
|
||||||
|
msgid "Secret Key"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:164
|
||||||
|
msgid "Score Threshold"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:176
|
||||||
|
msgid "Disable Google reCAPTCHA Badge"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:177
|
||||||
|
msgid "By default reCAPTCHA v3 displays a badge on every page of your site with links to the Google terms of service and privacy policy. You are allowed to hide the badge as long as you include the reCAPTCHA branding and links visibly in the user flow."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:182
|
||||||
|
msgid "I have added the reCAPTCHA branding, terms of service and privacy policy to my site. "
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:217
|
||||||
|
msgid "Value defined using the %s constant."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:229
|
||||||
|
msgid "reCAPTCHA v2"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:247
|
||||||
|
msgid "Type"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:254
|
||||||
|
msgid "Checkbox"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:258
|
||||||
|
msgid "Invisible"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:265
|
||||||
|
msgid "Validate Keys"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:301
|
||||||
|
msgid "reCAPTCHA keys are invalid."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:344
|
||||||
|
msgid "Google reCAPTCHA is a free anti-spam service that protects your website from fraud and abuse."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:345
|
||||||
|
msgid "By adding reCAPTCHA to your forms, you can deter automated software from submitting form entries, while still ensuring a user-friendly experience for real people."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:349
|
||||||
|
msgid "Gravity Forms integrates with three types of Google reCAPTCHA."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:351
|
||||||
|
msgid "reCAPTCHA v3 - Adds a script to every page of your site and uploads form content for processing by Google."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:352
|
||||||
|
msgid "All submissions are accepted and suspicious submissions are marked as spam."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:353
|
||||||
|
msgid "When reCAPTCHA v3 is configured, it is enabled automatically on all forms by default. It can be disabled for specific forms in the form settings."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:355
|
||||||
|
msgid "reCAPTCHA v2 (Invisible) - Displays a badge on your form and will present a challenge to the user if the activity is suspicious e.g. select the traffic lights."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:356
|
||||||
|
msgid "Please note, only v2 keys are supported and checkbox keys are not compatible with invisible reCAPTCHA."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:357
|
||||||
|
msgid "To activate reCAPTCHA v2 on your form, simply add the CAPTCHA field in the form editor."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:361
|
||||||
|
msgid "Read more about reCAPTCHA."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:364
|
||||||
|
msgid "reCAPTCHA v2 (Checkbox) - Requires a user to click a checkbox to indicate that they are not a robot and displays a challenge if the activity is suspicious"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:369
|
||||||
|
msgid "For more information on reCAPTCHA, which version is right for you, and how to add it to your forms,"
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:373
|
||||||
|
msgid "check out our documentation."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:389
|
||||||
|
msgid "reCAPTCHA v3 returns a score (1.0 is very likely a good interaction, 0.0 is very likely a bot)."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:390
|
||||||
|
msgid "If the score is less than or equal to this threshold, the form submission will be sent to spam."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:391
|
||||||
|
msgid "The default threshold is 0.5."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:438
|
||||||
|
msgid "Unexpected field type."
|
||||||
|
msgstr ""
|
||||||
|
|
||||||
|
#: includes/settings/class-plugin-settings.php:445
|
||||||
|
msgid "Score threshold must be between 0.0 and 1.0"
|
||||||
|
msgstr ""
|
||||||
78
wp/wp-content/plugins/gravityformsrecaptcha/recaptcha.php
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
<?php
|
||||||
|
/*
|
||||||
|
Plugin Name: Gravity Forms reCAPTCHA Add-On
|
||||||
|
Plugin URI: https://gravityforms.com
|
||||||
|
Description: Enhance Gravity Forms with support for Google reCAPTCHA.
|
||||||
|
Version: 1.6.0
|
||||||
|
Author: Gravity Forms
|
||||||
|
Author URI: https://gravityforms.com
|
||||||
|
License: GPL-3.0+
|
||||||
|
Text Domain: gravityformsrecaptcha
|
||||||
|
Domain Path: /languages
|
||||||
|
|
||||||
|
------------------------------------------------------------------------
|
||||||
|
Copyright 2023-2024 Rocketgenius Inc.
|
||||||
|
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
(at your option) any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU General Public License
|
||||||
|
along with this program. If not, see http://www.gnu.org/licenses.
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
defined( 'ABSPATH' ) || die();
|
||||||
|
|
||||||
|
use Gravity_Forms\Gravity_Forms_RECAPTCHA\GF_RECAPTCHA;
|
||||||
|
|
||||||
|
// Defines the current version of the Gravity Forms Recaptcha Add-On.
|
||||||
|
define( 'GF_RECAPTCHA_VERSION', '1.6.0' );
|
||||||
|
|
||||||
|
// Defines the minimum version of Gravity Forms required to run Gravity Forms Recaptcha Add-On.
|
||||||
|
define( 'GF_RECAPTCHA_MIN_GF_VERSION', '2.5-rc-1' );
|
||||||
|
|
||||||
|
// After Gravity Forms is loaded, load the Add-On.
|
||||||
|
add_action( 'gform_loaded', array( 'GF_RECAPTCHA_Bootstrap', 'load_addon' ), 5 );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the Gravity Forms reCAPTCHA Add-On.
|
||||||
|
*
|
||||||
|
* Includes the main class and registers it with GFAddOn.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
class GF_RECAPTCHA_Bootstrap {
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads the required files.
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*/
|
||||||
|
public static function load_addon() {
|
||||||
|
|
||||||
|
// Requires the class file.
|
||||||
|
require_once plugin_dir_path( __FILE__ ) . '/class-gf-recaptcha.php';
|
||||||
|
|
||||||
|
// Registers the class name with GFAddOn.
|
||||||
|
GFAddOn::register( 'Gravity_Forms\Gravity_Forms_RECAPTCHA\GF_RECAPTCHA' );
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an instance of the GF_RECAPTCHA class
|
||||||
|
*
|
||||||
|
* @since 1.0
|
||||||
|
*
|
||||||
|
* @return GF_RECAPTCHA|bool An instance of the GF_RECAPTCHA class
|
||||||
|
*/
|
||||||
|
function gf_recaptcha() {
|
||||||
|
return class_exists( 'Gravity_Forms\Gravity_Forms_RECAPTCHA\GF_RECAPTCHA' ) ? GF_RECAPTCHA::get_instance() : false;
|
||||||
|
}
|
||||||
6
wp/wp-content/plugins/imagify/SECURITY.md
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
## Reporting Security Bugs
|
||||||
|
|
||||||
|
Please report security bugs found in the site-reviews plugin's source code through the [Patchstack Vulnerability Disclosure Program](https://patchstack.com/database/vdp/imagify). The Patchstack team will assist you with verification, CVE assignment and take care of notifying the developers of this plugin.
|
||||||
|
---
|
||||||
20
wp/wp-content/plugins/imagify/_dev/bud.config.js
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
/**
|
||||||
|
* @typedef {import('@roots/bud').Bud} Bud
|
||||||
|
*
|
||||||
|
* @param {Bud} bud
|
||||||
|
*/
|
||||||
|
module.exports = async bud => {
|
||||||
|
bud.externals({
|
||||||
|
jQuery: 'window.jquery',
|
||||||
|
wp: 'window.wp',
|
||||||
|
})
|
||||||
|
bud.runtime('single')
|
||||||
|
|
||||||
|
await bud
|
||||||
|
.setPath('@dist', '../assets/admin')
|
||||||
|
.entry({
|
||||||
|
chart: 'chart.js',
|
||||||
|
bulk: 'bulk.js',
|
||||||
|
})
|
||||||
|
//.when( bud.isProduction, () => bud.splitChunks().minimize() )
|
||||||
|
}
|
||||||
15
wp/wp-content/plugins/imagify/_dev/package.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"name": "imagify_dev",
|
||||||
|
"version": "1.0.0",
|
||||||
|
"dependencies": {
|
||||||
|
},
|
||||||
|
"devDependencies": {
|
||||||
|
"@roots/bud": "^6.11.0",
|
||||||
|
"chart.js": "^4.4.0"
|
||||||
|
},
|
||||||
|
"scripts": {
|
||||||
|
"dev": "bud dev",
|
||||||
|
"build": "bud build",
|
||||||
|
"bud": "bud"
|
||||||
|
}
|
||||||
|
}
|
||||||
1143
wp/wp-content/plugins/imagify/_dev/src/bulk.js
Normal file
6
wp/wp-content/plugins/imagify/_dev/src/chart.js
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
import * as chart from 'chart.js/auto'
|
||||||
|
|
||||||
|
window.imagify = window.imagify || {};
|
||||||
|
|
||||||
|
window.imagify.Color = chart.Colors;
|
||||||
|
window.imagify.Chart = chart.Chart;
|
||||||
14
wp/wp-content/plugins/imagify/assets/admin/entrypoints.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"chart": {
|
||||||
|
"js": [
|
||||||
|
"js/runtime.js",
|
||||||
|
"js/chart.js"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"bulk": {
|
||||||
|
"js": [
|
||||||
|
"js/runtime.js",
|
||||||
|
"js/bulk.js"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/imagify/assets/admin/js/bulk.js
Normal file
1
wp/wp-content/plugins/imagify/assets/admin/js/chart.js
Normal file
1
wp/wp-content/plugins/imagify/assets/admin/js/runtime.js
Normal file
@@ -0,0 +1 @@
|
|||||||
|
(()=>{"use strict";var r,e={},o={};function t(r){var n=o[r];if(void 0!==n)return n.exports;var s=o[r]={exports:{}};return e[r](s,s.exports,t),s.exports}t.m=e,r=[],t.O=(e,o,n,s)=>{if(!o){var a=1/0;for(u=0;u<r.length;u++){for(var[o,n,s]=r[u],i=!0,f=0;f<o.length;f++)(!1&s||a>=s)&&Object.keys(t.O).every((r=>t.O[r](o[f])))?o.splice(f--,1):(i=!1,s<a&&(a=s));if(i){r.splice(u--,1);var l=n();void 0!==l&&(e=l)}}return e}s=s||0;for(var u=r.length;u>0&&r[u-1][2]>s;u--)r[u]=r[u-1];r[u]=[o,n,s]},t.o=(r,e)=>Object.prototype.hasOwnProperty.call(r,e),(()=>{var r={666:0};t.O.j=e=>0===r[e];var e=(e,o)=>{var n,s,[a,i,f]=o,l=0;if(a.some((e=>0!==r[e]))){for(n in i)t.o(i,n)&&(t.m[n]=i[n]);if(f)var u=f(t)}for(e&&e(o);l<a.length;l++)s=a[l],t.o(r,s)&&r[s]&&r[s][0](),r[s]=0;return t.O(u)},o=self.webpackChunk_roots_bud=self.webpackChunk_roots_bud||[];o.forEach(e.bind(null,0)),o.push=e.bind(null,o.push.bind(o))})()})();
|
||||||
6
wp/wp-content/plugins/imagify/assets/admin/manifest.json
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"chart.js": "js/chart.js",
|
||||||
|
"bulk.js": "js/bulk.js",
|
||||||
|
"runtime.js": "js/runtime.js",
|
||||||
|
"entrypoints.json": "entrypoints.json"
|
||||||
|
}
|
||||||
199
wp/wp-content/plugins/imagify/assets/css/admin-bar.css
Normal file
@@ -0,0 +1,199 @@
|
|||||||
|
.imagify-account,
|
||||||
|
.imagify-account-link {
|
||||||
|
padding-right: 15px;
|
||||||
|
}
|
||||||
|
.imagify-meteo-icon {
|
||||||
|
display: inline-block;
|
||||||
|
height: 38px;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
.imagify-user-plan {
|
||||||
|
color: #40b1d0;
|
||||||
|
}
|
||||||
|
.imagify-meteo-title.imagify-meteo-title {
|
||||||
|
color: #FFF;
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
.imagify-space-left > p {
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile [class^="imagify-bar-"] {
|
||||||
|
position: relative;
|
||||||
|
height: 1.5em;
|
||||||
|
width: 100%;
|
||||||
|
background: #60758D;
|
||||||
|
color: #FFF;
|
||||||
|
font-size: 10px;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-progress {
|
||||||
|
height: 1.5em;
|
||||||
|
font-size: 1em;
|
||||||
|
}
|
||||||
|
.imagify-progress {
|
||||||
|
transition: width .3s;
|
||||||
|
}
|
||||||
|
.imagify-bar-positive .imagify-progress {
|
||||||
|
background: #8CC152;
|
||||||
|
}
|
||||||
|
.imagify-bar-positive .imagify-barnb {
|
||||||
|
color: #8CC152;
|
||||||
|
}
|
||||||
|
.imagify-bar-negative .imagify-progress {
|
||||||
|
background: #73818C;
|
||||||
|
}
|
||||||
|
.imagify-bar-negative .imagify-barnb {
|
||||||
|
color: #73818C;
|
||||||
|
}
|
||||||
|
.imagify-bar-neutral .imagify-progress {
|
||||||
|
background: #F5A623;
|
||||||
|
}
|
||||||
|
.imagify-space-left .imagify-bar-negative .imagify-progress {
|
||||||
|
background: #D0021B;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile * {
|
||||||
|
line-height: 1.5;
|
||||||
|
white-space: initial;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify .ab-submenu {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .ab-item {
|
||||||
|
height: auto;
|
||||||
|
padding: 0 13px;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile {
|
||||||
|
min-width: 200px;
|
||||||
|
padding: 15px 0 10px;
|
||||||
|
margin-top: 0.7em;
|
||||||
|
background: #222;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify .dashicons {
|
||||||
|
font-family: "dashicons";
|
||||||
|
font-size: 18px;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: 0 5px 0 0;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify .button-text {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify .imagify-abq-row {
|
||||||
|
display: table;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify .imagify-abq-row + .imagify-abq-row {
|
||||||
|
margin-top: .75em;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify .imagify-abq-row > * {
|
||||||
|
display: table-cell;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-meteo-icon {
|
||||||
|
padding-right: 7px;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-meteo-icon img {
|
||||||
|
width: 37px;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-meteo-title {
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-meteo-subs {
|
||||||
|
color: #72889F;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile strong {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile a {
|
||||||
|
padding: 0;
|
||||||
|
color: #40B1D0;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link {
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link > * {
|
||||||
|
display: table-cell;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left {
|
||||||
|
max-width: 210px;
|
||||||
|
min-width: 210px;
|
||||||
|
width: 210px;
|
||||||
|
}
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-error,
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-warning {
|
||||||
|
padding: 10px;
|
||||||
|
margin: 0 -13px -13px;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-error p + p,
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-warning p + p {
|
||||||
|
margin-top: .5em;
|
||||||
|
}
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-error p + p + p,
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-warning p + p + p {
|
||||||
|
margin-top: 1em;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost {
|
||||||
|
display: inline-block;
|
||||||
|
height: auto;
|
||||||
|
padding: 7px 10px;
|
||||||
|
border: 1px solid #FFF;
|
||||||
|
text-align: center;
|
||||||
|
background: transparent;
|
||||||
|
color: #FFF;
|
||||||
|
border-radius: 3px;
|
||||||
|
transition: all .275s;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost:hover,
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost:focus {
|
||||||
|
background: #FFF;
|
||||||
|
color: #888;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wpadminbar .imagify-warning * {
|
||||||
|
background: #f5a623;
|
||||||
|
color: #FFF;
|
||||||
|
text-shadow: 0 0 2px rgba(0, 0, 0, 0.2);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-upsell-admin-bar {
|
||||||
|
position:relative ;
|
||||||
|
background: #c51161;
|
||||||
|
margin: 10px -13px -10px -13px;
|
||||||
|
padding: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wp-admin-bar-imagify-profile .imagify-upsell-admin-bar p {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wp-admin-bar-imagify-profile a.imagify-upsell-admin-bar-button {
|
||||||
|
display: block;
|
||||||
|
height: auto !important;
|
||||||
|
border: 1px solid #fff;
|
||||||
|
border-radius: 5px;
|
||||||
|
color: #fff !important;
|
||||||
|
padding: 5px 10px !important;
|
||||||
|
text-align: center;
|
||||||
|
text-decoration: none;
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile a.imagify-upsell-dismiss {
|
||||||
|
display: inline !important;
|
||||||
|
height: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#wpadminbar #wp-admin-bar-imagify-profile .imagify-upsell-dismiss::before {
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
right: 10px;
|
||||||
|
content: "\2715";
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/imagify/assets/css/admin-bar.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.imagify-account,.imagify-account-link{padding-right:15px}.imagify-meteo-icon{display:inline-block;height:38px;vertical-align:middle;margin-right:10px}.imagify-user-plan{color:#40b1d0}.imagify-meteo-title.imagify-meteo-title{color:#fff;font-size:17px}.imagify-space-left>p{color:#fff}#wp-admin-bar-imagify-profile [class^=imagify-bar-]{position:relative;height:1.5em;width:100%;background:#60758d;color:#fff;font-size:10px}#wp-admin-bar-imagify-profile .imagify-progress{height:1.5em;font-size:1em}.imagify-progress{-webkit-transition:width .3s;-o-transition:width .3s;transition:width .3s}.imagify-bar-positive .imagify-progress{background:#8cc152}.imagify-bar-positive .imagify-barnb{color:#8cc152}.imagify-bar-negative .imagify-progress{background:#73818c}.imagify-bar-negative .imagify-barnb{color:#73818c}.imagify-bar-neutral .imagify-progress{background:#f5a623}.imagify-space-left .imagify-bar-negative .imagify-progress{background:#d0021b}#wpadminbar #wp-admin-bar-imagify-profile *{line-height:1.5;white-space:initial}#wpadminbar #wp-admin-bar-imagify .ab-submenu{padding-bottom:0}#wpadminbar #wp-admin-bar-imagify-profile .ab-item{height:auto;padding:0 13px}#wpadminbar #wp-admin-bar-imagify-profile{min-width:200px;padding:15px 0 10px;margin-top:.7em;background:#222}#wp-admin-bar-imagify .dashicons{font-family:dashicons;font-size:18px;vertical-align:middle;margin:0 5px 0 0}#wp-admin-bar-imagify .button-text{display:inline-block;vertical-align:middle}#wp-admin-bar-imagify .imagify-abq-row{display:table;width:100%}#wp-admin-bar-imagify .imagify-abq-row+.imagify-abq-row{margin-top:.75em}#wp-admin-bar-imagify .imagify-abq-row>*{display:table-cell}#wp-admin-bar-imagify-profile .imagify-meteo-icon{padding-right:7px}#wp-admin-bar-imagify-profile .imagify-meteo-icon img{width:37px}#wp-admin-bar-imagify-profile .imagify-meteo-title{font-size:17px}#wp-admin-bar-imagify-profile .imagify-meteo-subs{color:#72889f}#wpadminbar #wp-admin-bar-imagify-profile strong{font-weight:700}#wpadminbar #wp-admin-bar-imagify-profile .imagify-user-plan,#wpadminbar #wp-admin-bar-imagify-profile a{padding:0;color:#40b1d0}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link{display:table}#wpadminbar #wp-admin-bar-imagify-profile .imagify-account-link>*{display:table-cell}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left{max-width:210px;min-width:210px;width:210px}#wpadminbar #wp-admin-bar-imagify-profile .imagify-space-left p{font-size:12px}#wp-admin-bar-imagify-profile .imagify-error,#wp-admin-bar-imagify-profile .imagify-warning{padding:10px;margin:0 -13px -13px}#wp-admin-bar-imagify-profile .imagify-error p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p{margin-top:.5em}#wp-admin-bar-imagify-profile .imagify-error p+p+p,#wp-admin-bar-imagify-profile .imagify-warning p+p+p{margin-top:1em}#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost{display:inline-block;height:auto;padding:7px 10px;border:1px solid #fff;text-align:center;background:0 0;color:#fff;border-radius:3px;-webkit-transition:all .275s;-o-transition:all .275s;transition:all .275s}#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost:focus,#wpadminbar #wp-admin-bar-imagify-profile .imagify-btn-ghost:hover{background:#fff;color:#888}#wpadminbar .imagify-warning *{background:#f5a623;color:#fff;text-shadow:0 0 2px rgba(0,0,0,.2)}#wp-admin-bar-imagify-profile .imagify-upsell-admin-bar{position:relative;background:#c51161;margin:10px -13px -10px -13px;padding:20px}#wp-admin-bar-imagify-profile .imagify-upsell-admin-bar p{color:#fff}#wp-admin-bar-imagify-profile a.imagify-upsell-admin-bar-button{display:block;height:auto!important;border:1px solid #fff;border-radius:5px;color:#fff!important;padding:5px 10px!important;text-align:center;text-decoration:none;margin-top:10px}#wpadminbar #wp-admin-bar-imagify-profile a.imagify-upsell-dismiss{display:inline!important;height:auto!important}#wpadminbar #wp-admin-bar-imagify-profile .imagify-upsell-dismiss::before{position:absolute;top:5px;right:10px;content:"\2715";color:#fff}
|
||||||
1597
wp/wp-content/plugins/imagify/assets/css/admin.css
Normal file
1
wp/wp-content/plugins/imagify/assets/css/admin.min.css
vendored
Normal file
1306
wp/wp-content/plugins/imagify/assets/css/bulk.css
Normal file
1
wp/wp-content/plugins/imagify/assets/css/bulk.min.css
vendored
Normal file
171
wp/wp-content/plugins/imagify/assets/css/files-list.css
Normal file
@@ -0,0 +1,171 @@
|
|||||||
|
/* Filter block */
|
||||||
|
.imagify-files-list .wp-filter {
|
||||||
|
padding: 0 20px 15px;
|
||||||
|
}
|
||||||
|
.imagify-files-list .filter-items select {
|
||||||
|
height: auto;
|
||||||
|
padding: 2px 20px 3px 6px;
|
||||||
|
margin: 15px 12px 0 0;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
.imagify-files-list .filter-items .button {
|
||||||
|
height: auto;
|
||||||
|
padding: 2px 12px 3px;
|
||||||
|
margin-top: 15px;
|
||||||
|
}
|
||||||
|
@media screen and (max-width: 782px) {
|
||||||
|
.imagify-files-list .filter-items .button {
|
||||||
|
margin-bottom: 0;
|
||||||
|
line-height: 2.15384615;
|
||||||
|
padding: 0 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Empty table */
|
||||||
|
.imagify-files-list .no-items td {
|
||||||
|
padding: 35px;
|
||||||
|
text-align: center;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
.imagify-files-list .no-items td a {
|
||||||
|
text-decoration: underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Th sortable */
|
||||||
|
.imagify-files-list .sortable a {
|
||||||
|
color: #000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Global links */
|
||||||
|
.imagify-files-list a {
|
||||||
|
color: #3694AE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Global TDs */
|
||||||
|
.imagify-files-list tbody td,
|
||||||
|
.imagify-files-list tbody th,
|
||||||
|
.imagify-files-list.imagify-files-list tbody .check-column {
|
||||||
|
vertical-align: middle;
|
||||||
|
padding-top: 20px;
|
||||||
|
padding-bottom: 20px;
|
||||||
|
color: #626E7B;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Col Title */
|
||||||
|
.imagify-files-list .column-title strong {
|
||||||
|
font-weight: normal;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.imagify-files-list .column-title strong a {
|
||||||
|
display: inline-flex;
|
||||||
|
align-items: center;
|
||||||
|
word-break: break-all;
|
||||||
|
word-wrap: break-word;
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.imagify-files-list .filename {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.imagify-files-list .media-icon {
|
||||||
|
position: relative;
|
||||||
|
width: 60px;
|
||||||
|
overflow: hidden;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.media-icon .centered {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
transform: translate( 50%, 50% );
|
||||||
|
}
|
||||||
|
.media-icon .centered img {
|
||||||
|
position: absolute;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
transform: translate( -50%, -50% );
|
||||||
|
}
|
||||||
|
table.media .column-title .media-icon.landscape img {
|
||||||
|
max-width: none;
|
||||||
|
width: auto;
|
||||||
|
height: 60px;
|
||||||
|
}
|
||||||
|
table.media .column-title .media-icon.portrait img {
|
||||||
|
width: 60px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optimization datas Col */
|
||||||
|
.imagify-files-list ul.imagify-datas-list {
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
.imagify-files-list ul.imagify-datas-list .big {
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
.imagify-files-list ul.imagify-datas-list span.imagify-chart-value {
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
.imagify-files-list ul.imagify-datas-list .imagify-chart-container {
|
||||||
|
margin-right: 2px;
|
||||||
|
}
|
||||||
|
.imagify-files-list ul.imagify-datas-list canvas {
|
||||||
|
width: 18px!important;
|
||||||
|
height: 18px!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Optimization Level Col */
|
||||||
|
.imagify-files-list .optimization_level {
|
||||||
|
text-align: center;
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 14px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
}
|
||||||
|
.imagify-files-list .column-optimization_level,
|
||||||
|
.imagify-files-list .column-optimization_level a {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.imagify-files-list .column-optimization_level a span {
|
||||||
|
float: none;
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.imagify-files-list .column-optimization_level .sorting-indicator {
|
||||||
|
vertical-align: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Actions col */
|
||||||
|
.imagify-files-list .column-actions .button,
|
||||||
|
.imagify-files-list .column-actions .button-primary {
|
||||||
|
padding: 5px 20px;
|
||||||
|
font-size: 14px;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
.imagify-files-list .column-actions .button-primary {
|
||||||
|
background: #3694AE;
|
||||||
|
color: #FFF;
|
||||||
|
border: 0;
|
||||||
|
box-shadow: none;
|
||||||
|
text-shadow: none;
|
||||||
|
}
|
||||||
|
.imagify-files-list .column-actions a,
|
||||||
|
.status a.button-imagify-refresh-status {
|
||||||
|
display: inline-block;
|
||||||
|
margin: .3em 0;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.imagify-files-list .imagify-status-already_optimized {
|
||||||
|
font-weight: bold;
|
||||||
|
color: #8BC34A;
|
||||||
|
}
|
||||||
|
.imagify-files-list .column-actions a .dashicons,
|
||||||
|
.imagify-files-list .column-actions a .dashicons:before,
|
||||||
|
.status a.button-imagify-refresh-status .dashicons,
|
||||||
|
.status a.button-imagify-refresh-status .dashicons:before {
|
||||||
|
margin-right: 2px;
|
||||||
|
font-size: 17px;
|
||||||
|
height: 17px;
|
||||||
|
width: 17px;
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/imagify/assets/css/files-list.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
.imagify-files-list .wp-filter{padding:0 20px 15px}.imagify-files-list .filter-items select{height:auto;padding:2px 20px 3px 6px;margin:15px 12px 0 0;max-width:100%}.imagify-files-list .filter-items .button{height:auto;padding:2px 12px 3px;margin-top:15px}@media screen and (max-width:782px){.imagify-files-list .filter-items .button{margin-bottom:0;line-height:2.15384615;padding:0 12px}}.imagify-files-list .no-items td{padding:35px;text-align:center;font-size:18px}.imagify-files-list .no-items td a{text-decoration:underline}.imagify-files-list .sortable a{color:#000}.imagify-files-list a{color:#3694ae}.imagify-files-list tbody td,.imagify-files-list tbody th,.imagify-files-list.imagify-files-list tbody .check-column{vertical-align:middle;padding-top:20px;padding-bottom:20px;color:#626e7b}.imagify-files-list .column-title strong{font-weight:400;font-size:14px}.imagify-files-list .column-title strong a{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;word-break:break-all;word-wrap:break-word;font-weight:400}.imagify-files-list .filename{font-size:12px;font-weight:700}.imagify-files-list .media-icon{position:relative;width:60px;overflow:hidden;-ms-flex-negative:0;flex-shrink:0}.media-icon .centered{position:absolute;left:0;top:0;width:100%;height:100%;-webkit-transform:translate(50%,50%);-ms-transform:translate(50%,50%);transform:translate(50%,50%)}.media-icon .centered img{position:absolute;left:0;top:0;-webkit-transform:translate(-50%,-50%);-ms-transform:translate(-50%,-50%);transform:translate(-50%,-50%)}table.media .column-title .media-icon.landscape img{max-width:none;width:auto;height:60px}table.media .column-title .media-icon.portrait img{width:60px}.imagify-files-list ul.imagify-datas-list{font-size:11px}.imagify-files-list ul.imagify-datas-list .big{font-size:13px}.imagify-files-list ul.imagify-datas-list span.imagify-chart-value{font-size:12px}.imagify-files-list ul.imagify-datas-list .imagify-chart-container{margin-right:2px}.imagify-files-list ul.imagify-datas-list canvas{width:18px!important;height:18px!important}.imagify-files-list .optimization_level{text-align:center;font-weight:700;font-size:14px;text-transform:uppercase;letter-spacing:.02em}.imagify-files-list .column-optimization_level,.imagify-files-list .column-optimization_level a{text-align:center}.imagify-files-list .column-optimization_level a span{float:none;display:inline-block;vertical-align:middle}.imagify-files-list .column-optimization_level .sorting-indicator{vertical-align:-10px}.imagify-files-list .column-actions .button,.imagify-files-list .column-actions .button-primary{padding:5px 20px;font-size:14px;height:auto}.imagify-files-list .column-actions .button-primary{background:#3694ae;color:#fff;border:0;-webkit-box-shadow:none;box-shadow:none;text-shadow:none}.imagify-files-list .column-actions a,.status a.button-imagify-refresh-status{display:inline-block;margin:.3em 0;font-size:12px;font-weight:700}.imagify-files-list .imagify-status-already_optimized{font-weight:700;color:#8bc34a}.imagify-files-list .column-actions a .dashicons,.imagify-files-list .column-actions a .dashicons:before,.status a.button-imagify-refresh-status .dashicons,.status a.button-imagify-refresh-status .dashicons:before{margin-right:2px;font-size:17px;height:17px;width:17px}
|
||||||
376
wp/wp-content/plugins/imagify/assets/css/notices.css
Normal file
@@ -0,0 +1,376 @@
|
|||||||
|
/* Error Notice */
|
||||||
|
.imagify-plugins-error {
|
||||||
|
overflow: hidden;
|
||||||
|
padding-left: 20px;
|
||||||
|
list-style-type: disc
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-plugins-error li {
|
||||||
|
width: 300px;
|
||||||
|
line-height: 30px
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 570px) {
|
||||||
|
.imagify-plugins-error li {
|
||||||
|
width: auto;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Notice close link */
|
||||||
|
.imagify-notice-dismiss.notice-dismiss {
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Notices in Imagify related pages */
|
||||||
|
.media_page_imagify-bulk-optimization .notice,
|
||||||
|
body[class*="_imagify-ngg-bulk-optimization"] .notice,
|
||||||
|
.settings_page_imagify .notice {
|
||||||
|
margin-right: 20px;
|
||||||
|
margin-left: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice .button-mini {
|
||||||
|
padding: 2px 10px;
|
||||||
|
font-size: 13px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice.imagify-notice {
|
||||||
|
position: relative;
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
padding: 0;
|
||||||
|
margin: 10px 20px 10px 2px;
|
||||||
|
border: 0 none;
|
||||||
|
background: #4A5362;
|
||||||
|
box-shadow: none;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 782px) {
|
||||||
|
.imagify-notice.imagify-notice,
|
||||||
|
.imagify-welcome {
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 450px) {
|
||||||
|
.imagify-notice.imagify-notice {
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-box-direction: normal;
|
||||||
|
-webkit-flex-direction: column;
|
||||||
|
-ms-flex-direction: column;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.wrap .imagify-notice {
|
||||||
|
margin: 5px 15px 2px;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-logo {
|
||||||
|
padding: 18px 23px;
|
||||||
|
background: #40B1D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-logo .imagify-logo {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-flex-notice-content .imagify-notice-logo {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.updated .imagify-notice-logo {
|
||||||
|
background: #8BC34A;
|
||||||
|
}
|
||||||
|
|
||||||
|
.error .imagify-notice-logo {
|
||||||
|
background: #C51162;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-title {
|
||||||
|
font-size: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-content {
|
||||||
|
padding: 5px 23px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-content.imagify-notice-content p {
|
||||||
|
margin: 0.65em 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-flex-notice-content .imagify-notice-content {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-flex-notice-content .imagify-notice-content > * {
|
||||||
|
padding: 10px 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-flex-notice-content .imagify-meteo-icon img {
|
||||||
|
height: 100%;
|
||||||
|
margin-top: 6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-quota [class^="imagify-bar-"] {
|
||||||
|
background: #1F2332;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-quota .imagify-space-left p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-flex-notice-content .imagify-notice-content .imagify-notice-quota {
|
||||||
|
padding-right: 24px;
|
||||||
|
padding-left: 8px;
|
||||||
|
background: #343A49;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice a {
|
||||||
|
color: #40B1D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice a:hover,
|
||||||
|
.imagify-notice a:focus {
|
||||||
|
color: #FEE102;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice code {
|
||||||
|
background: rgba(0, 0, 0, 0.4) none repeat scroll 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice .imagify-rate-us.imagify-rate-us {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice .imagify-rate-us .stars {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* == Welcome section
|
||||||
|
*/
|
||||||
|
.imagify-welcome {
|
||||||
|
margin: 30px 20px 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-welcome .baseline {
|
||||||
|
display: inline-block;
|
||||||
|
margin: .2em 0 0 2em;
|
||||||
|
font-size: 17px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-welcome .imagify-logo {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-welcome-remove {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
right: 15px;
|
||||||
|
margin-top: -8px;
|
||||||
|
color: #FFF;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Welcome columns */
|
||||||
|
.imagify-columns [class^="col-"] img {
|
||||||
|
float: left;
|
||||||
|
margin-right: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-col-content {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-col-title {
|
||||||
|
margin: 0 0 15px 0;
|
||||||
|
font-size: 23px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.counter .imagify-col-title:before {
|
||||||
|
counter-increment: cols;
|
||||||
|
content: counter(cols) ". ";
|
||||||
|
color: #40B1D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-col-desc {
|
||||||
|
color: #5F758E;
|
||||||
|
margin-bottom: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* WP Rocket notice */
|
||||||
|
.imagify-rkt-notice.imagify-rkt-notice {
|
||||||
|
position: relative;
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -webkit-flex;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-webkit-align-items: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
-ms-grid-row-align: center;
|
||||||
|
align-items: center;
|
||||||
|
padding: 10px 45px 10px 0;
|
||||||
|
border: 0 none;
|
||||||
|
box-shadow: none;
|
||||||
|
color: #FFF;
|
||||||
|
background: #1F2332;
|
||||||
|
}
|
||||||
|
|
||||||
|
.media_page_imagify-bulk-optimization .imagify-rkt-notice {
|
||||||
|
margin-left: 2px;
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 782px) {
|
||||||
|
.media_page_imagify-bulk-optimization .imagify-rkt-notice {
|
||||||
|
margin-left: 0;
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-cross {
|
||||||
|
position: absolute;
|
||||||
|
right: 8px;
|
||||||
|
top: 50%;
|
||||||
|
width: 22px;
|
||||||
|
height: 22px;
|
||||||
|
padding: 0;
|
||||||
|
margin-top: -11px;
|
||||||
|
background: transparent;
|
||||||
|
color: rgba(255, 255, 255, .5);
|
||||||
|
text-decoration: none;
|
||||||
|
border-radius: 50%;
|
||||||
|
transition: all .275s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-cross .dashicons {
|
||||||
|
position: relative;
|
||||||
|
top: 2px;
|
||||||
|
left: 1px;
|
||||||
|
transition: all .275s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-cross:hover {
|
||||||
|
background: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-cross:hover .dashicons {
|
||||||
|
color: #412355;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-rkt-cta,
|
||||||
|
.imagify-rkt-notice .imagify-rkt-logo,
|
||||||
|
.imagify-rkt-notice .imagify-rkt-coupon {
|
||||||
|
-webkit-flex-shrink: 0;
|
||||||
|
-ms-flex-negative: 0;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-rkt-logo {
|
||||||
|
width: 150px !important; /* !important because of a dirtugly WP Engine code */
|
||||||
|
text-align: center;
|
||||||
|
padding: 0 25px 0 30px;
|
||||||
|
line-height: 0.8;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-rkt-msg {
|
||||||
|
width: 100% !important; /* !important because of a dirtugly WP Engine code */
|
||||||
|
color: #FFF;
|
||||||
|
padding: 0 15px;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: 1.6;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-rkt-coupon {
|
||||||
|
width: 150px !important; /* !important because of a dirtugly WP Engine code */
|
||||||
|
padding: 0 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-rkt-coupon-code {
|
||||||
|
padding: 5px 10px;
|
||||||
|
font-size: 23px;
|
||||||
|
font-weight: bold;
|
||||||
|
border: 1px dashed #F56640;
|
||||||
|
color: #F56640;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-rkt-cta {
|
||||||
|
width: 250px !important; /* !important because of a dirtugly WP Engine code */
|
||||||
|
-webkit-box-flex: 1;
|
||||||
|
-webkit-flex-grow: 1;
|
||||||
|
-ms-flex-positive: 1;
|
||||||
|
flex-grow: 1;
|
||||||
|
-webkit-flex-basis: 200px;
|
||||||
|
-ms-flex-preferred-size: 200px;
|
||||||
|
flex-basis: 200px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .button.button {
|
||||||
|
position: relative;
|
||||||
|
top: -1px;
|
||||||
|
height: auto;
|
||||||
|
font-weight: 600;
|
||||||
|
font-size: 14px;
|
||||||
|
border: 0 none;
|
||||||
|
padding: 9px 18px 9px;
|
||||||
|
background: #F56640;
|
||||||
|
box-shadow: none;
|
||||||
|
text-shadow: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 880px) {
|
||||||
|
.imagify-rkt-notice {
|
||||||
|
-webkit-flex-wrap: wrap;
|
||||||
|
-ms-flex-wrap: wrap;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-rkt-msg,
|
||||||
|
.imagify-rkt-notice .imagify-rkt-cta,
|
||||||
|
.imagify-rkt-notice .imagify-rkt-logo {
|
||||||
|
text-align: left;
|
||||||
|
padding: 5px 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-cross.imagify-cross {
|
||||||
|
top: 8px;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-rkt-notice .imagify-cross .dashicons {
|
||||||
|
top: 1px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 782px) {
|
||||||
|
.imagify-flex-notice-content .imagify-notice-content .imagify-notice-quota {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-quota-btn-container{
|
||||||
|
text-align: center;
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
.imagify-notice-quota-btn-container .imagify-button{
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-bulk-complete {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
padding: 12px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-notice-bulk-complete-logo {
|
||||||
|
padding-right: 12px;
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/imagify/assets/css/notices.min.css
vendored
Normal file
968
wp/wp-content/plugins/imagify/assets/css/options.css
Normal file
@@ -0,0 +1,968 @@
|
|||||||
|
.wrap.imagify-settings {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.imagify-settings.imagify-have-rocket {
|
||||||
|
margin-right: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* The field that checks the API Key */
|
||||||
|
#imagify-check-api-container {
|
||||||
|
display: block;
|
||||||
|
margin-top: 6px;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
#imagify-check-api-container .dashicons {
|
||||||
|
font-size: 25px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#imagify-check-api-container .dashicons-no:before {
|
||||||
|
color: #f06e57;
|
||||||
|
vertical-align: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#imagify-check-api-container .imagify-icon {
|
||||||
|
font-size: 1.8em;
|
||||||
|
margin-right: 3px;
|
||||||
|
margin-left: 1px;
|
||||||
|
color: #8BC34A;
|
||||||
|
vertical-align: -2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-account-info-col .imagify-api-line {
|
||||||
|
padding: 22px 26px;
|
||||||
|
background: #343A49
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-api-line label,
|
||||||
|
p.imagify-api-key-invite-title {
|
||||||
|
display: block;
|
||||||
|
margin-bottom: 6px;
|
||||||
|
font-size: 14px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #343A49;
|
||||||
|
}
|
||||||
|
.imagify-account-info-col .imagify-api-line label {
|
||||||
|
color: #E5EBEF;
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
.imagify-api-line.imagify-api-line input[type="text"] {
|
||||||
|
width: 100%;
|
||||||
|
padding: 6px 10px;
|
||||||
|
border: 1px solid #40B1D0;
|
||||||
|
font-family: "PT Mono", "Consolas", monospace;
|
||||||
|
font-size: 14px;
|
||||||
|
letter-spacing: 0.01em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #40B1D0;
|
||||||
|
background: transparent;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-no-api-key .imagify-api-line {
|
||||||
|
margin: 3em 0 0 0;
|
||||||
|
padding: 2em 0 0;
|
||||||
|
}
|
||||||
|
.imagify-no-api-key .imagify-api-line input[type="text"] {
|
||||||
|
margin-top: 5px;
|
||||||
|
width: 400px;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
.imagify-settings .imagify-no-api-key div.submit.submit {
|
||||||
|
border: 0;
|
||||||
|
padding: 0 16px;
|
||||||
|
margin-top: 0;
|
||||||
|
background: #FFF;
|
||||||
|
}
|
||||||
|
.imagify-settings .imagify-no-api-key div.submit.submit p {
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-options-title {
|
||||||
|
margin: .75em 0 0 0;
|
||||||
|
font-size: 24px;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #343A49;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-options-subtitle {
|
||||||
|
padding-bottom: .3em;
|
||||||
|
margin-bottom: 20px;
|
||||||
|
border-bottom: 1px solid #D2D3D6;
|
||||||
|
font-size: 14px;
|
||||||
|
letter-spacing: 0.01em;
|
||||||
|
font-weight: bold;
|
||||||
|
text-transform: uppercase;
|
||||||
|
color: #626E7B;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-options-subtitle a {
|
||||||
|
font-size: 12px;
|
||||||
|
color: #338EA6;
|
||||||
|
text-transform: none;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-options-subtitle .imagify-info {
|
||||||
|
margin-left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-setting-line {
|
||||||
|
border-top: 1px solid #D2D3D6;
|
||||||
|
padding: 25px 0 13px;
|
||||||
|
margin: 1em 0;
|
||||||
|
}
|
||||||
|
.imagify-options-subtitle + .imagify-setting-line {
|
||||||
|
border-top: 0;
|
||||||
|
padding-top: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* 3 inlined buttons + Visual comparison */
|
||||||
|
.imagify-setting-optim-level {
|
||||||
|
display: flex;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-setting-optim-level > p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-setting-optim-level .imagify-info {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-setting-optim-level .imagify-error {
|
||||||
|
margin: 10px 0 0 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-setting-optim-level .imagify-error a {
|
||||||
|
color: #fff;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-setting-optim-level .imagify-inline-options {
|
||||||
|
flex-basis: 60%;
|
||||||
|
flex-grow: 1;
|
||||||
|
width: auto;
|
||||||
|
display: flex;
|
||||||
|
background: #2E3243;
|
||||||
|
border-radius: 3px;
|
||||||
|
}
|
||||||
|
.imagify-setting-optim-level .imagify-inline-options-error {
|
||||||
|
background: #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-setting-optim-level .imagify-inline-options label {
|
||||||
|
display: block !important;
|
||||||
|
width: 100%;
|
||||||
|
font-size: 14px !important;
|
||||||
|
border-radius: 3px!important;
|
||||||
|
}
|
||||||
|
.imagify-setting-optim-level .imagify-visual-comparison-text {
|
||||||
|
flex-basis: 40%;
|
||||||
|
flex-shrink: 1;
|
||||||
|
padding-left: 20px;
|
||||||
|
margin-top: 20px;
|
||||||
|
color: #626E7B;
|
||||||
|
box-sizing: border-box;
|
||||||
|
}
|
||||||
|
.imagify-setting-optim-level.imagify-setting-optim-level .imagify-visual-comparison-btn {
|
||||||
|
padding-top: 5px;
|
||||||
|
margin-top: 2px;
|
||||||
|
border-radius: 2px;
|
||||||
|
text-transform: none;
|
||||||
|
letter-spacing: 0;
|
||||||
|
text-shadow: none!important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TODO: maybe remove table lines, we don't use theme anymore… */
|
||||||
|
@media (max-width: 782px) {
|
||||||
|
.imagify-settings .form-table th {
|
||||||
|
padding-top: 2em;
|
||||||
|
padding-bottom: .5em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.imagify-settings .form-table td {
|
||||||
|
vertical-align: top;
|
||||||
|
}
|
||||||
|
.imagify-settings .form-table th span {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.imagify-middle th {
|
||||||
|
padding-top: 35px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-settings div.submit.submit {
|
||||||
|
border-top: 1px solid #D9D9D9;
|
||||||
|
margin-top: 2em;
|
||||||
|
padding: 18px 0 7px 30px;
|
||||||
|
}
|
||||||
|
.imagify-settings .hidden + div.submit.submit {
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
.imagify-settings p.submit {
|
||||||
|
float: left;
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
.imagify-settings p.submit .button {
|
||||||
|
margin: 0 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-sub-header th {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.imagify-sub-header .form-table {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.imagify-sub-header th,
|
||||||
|
.imagify-sub-header td {
|
||||||
|
padding-top: 0;
|
||||||
|
padding-bottom: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-sub-header [for="api_key"] {
|
||||||
|
padding-top: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 1120px) {
|
||||||
|
.imagify-settings .imagify-logo-block {
|
||||||
|
margin-right: 0;
|
||||||
|
}
|
||||||
|
.imagify-settings .imagify-rate-us.imagify-rate-us {
|
||||||
|
margin: 1em 0 -1em;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-settings .imagify-rate-us {
|
||||||
|
margin-right: 25px;
|
||||||
|
margin-left: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Label & fake labels */
|
||||||
|
label + .imagify-info,
|
||||||
|
.imagify-visual-label {
|
||||||
|
display: inline-block;
|
||||||
|
width: 550px;
|
||||||
|
max-width: calc(100% - 38px);
|
||||||
|
margin-left: 38px;
|
||||||
|
padding-right: 25px;
|
||||||
|
}
|
||||||
|
.imagify-options-line {
|
||||||
|
-webkit-transition: opacity .3s;
|
||||||
|
transition: opacity .3s;
|
||||||
|
}
|
||||||
|
label ~ .imagify-options-line {
|
||||||
|
display: block;
|
||||||
|
margin: 8px 0 20px 40px;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.imagify-options-line + .imagify-info {
|
||||||
|
margin-left: 38px;
|
||||||
|
}
|
||||||
|
label + .imagify-info {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.imagify-options-line + .imagify-info + .imagify-options-line {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
.imagify-visual-label {
|
||||||
|
vertical-align: -5px;
|
||||||
|
}
|
||||||
|
label[for="imagify_sizes_full"] + .imagify-info {
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-settings.imagify-settings [type="checkbox"]:not(:checked) + label ~ .imagify-options-line,
|
||||||
|
.imagify-settings.imagify-settings [type="checkbox"]:not(:checked) + label .imagify-visual-label,
|
||||||
|
:checked + label ~ .imagify-options-line :checked + label ~ .imagify-options-line .imagify-faded {
|
||||||
|
opacity: .5;
|
||||||
|
}
|
||||||
|
.imagify-settings.imagify-settings [type="checkbox"]:checked + label ~ .imagify-options-line,
|
||||||
|
.imagify-settings.imagify-settings [type="checkbox"]:checked + label .imagify-visual-label,
|
||||||
|
.imagify-settings.imagify-settings :not(:checked) + label ~ .imagify-options-line :not(:checked) + label ~ .imagify-options-line {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-radio-group + .imagify-options-line {
|
||||||
|
display: block;
|
||||||
|
margin: 0 0 0 1.7em;
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-checkbox-marged {
|
||||||
|
max-width: 500px;
|
||||||
|
margin-left: 45px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-settings [type="text"],
|
||||||
|
.imagify-settings [type="number"] {
|
||||||
|
width: 20em;
|
||||||
|
max-width: 100%;
|
||||||
|
height: auto;
|
||||||
|
padding: 6px;
|
||||||
|
margin: 0 6px;
|
||||||
|
border: 1px solid #8BA6B4;
|
||||||
|
box-shadow: none;
|
||||||
|
border-radius: 2px;
|
||||||
|
color: #338EA6;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.imagify-settings [type="number"] {
|
||||||
|
width: 5em;
|
||||||
|
}
|
||||||
|
.imagify-settings ::-webkit-input-placeholder {
|
||||||
|
color: #B1B1B1;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
.imagify-settings ::-moz-placeholder {
|
||||||
|
color: #B1B1B1;
|
||||||
|
font-weight: 400;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.imagify-settings :-ms-input-placeholder {
|
||||||
|
color: #B1B1B1;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
.imagify-settings :-moz-placeholder {
|
||||||
|
color: #B1B1B1;
|
||||||
|
font-weight: 400;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
.imagify-settings ::placeholder {
|
||||||
|
color: #B1B1B1;
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-menu-bar-img {
|
||||||
|
box-sizing: border-box;
|
||||||
|
max-width: 100%;
|
||||||
|
width: 350px;
|
||||||
|
height: auto;
|
||||||
|
margin-top: 0;
|
||||||
|
border: 1px solid #8BA6B4;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Layout */
|
||||||
|
.imagify-col.imagify-main {
|
||||||
|
float: left;
|
||||||
|
width: calc(100% - 320px);
|
||||||
|
padding-left: 0;
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
.imagify-have-rocket .imagify-main {
|
||||||
|
float: none;
|
||||||
|
width: 1265px;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
.imagify-sidebar {
|
||||||
|
float: left;
|
||||||
|
width: 300px;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sidebar with Ads */
|
||||||
|
.imagify-sidebar-section {
|
||||||
|
border: 1px solid #BBB;
|
||||||
|
background: #1F2332;
|
||||||
|
}
|
||||||
|
.imagify-sidebar-section + .imagify-sidebar-section {
|
||||||
|
margin-top: 2em;
|
||||||
|
}
|
||||||
|
|
||||||
|
@media (max-width: 820px) {
|
||||||
|
.imagify-settings {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
-webkit-box-direction: normal;
|
||||||
|
-ms-flex-direction: column;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
.imagify-main {
|
||||||
|
width: auto;
|
||||||
|
float: none;
|
||||||
|
}
|
||||||
|
.imagify-sidebar {
|
||||||
|
order: 2;
|
||||||
|
float: none;
|
||||||
|
width: auto;
|
||||||
|
max-width: none;
|
||||||
|
margin-left: 0;
|
||||||
|
margin-top: 25px;
|
||||||
|
}
|
||||||
|
.wp-media-products {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.wp-media-products li {
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
max-width: 276px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (min-width: 1400px) {
|
||||||
|
.imagify-main {
|
||||||
|
width: 74%;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.imagify-sidebar-section {
|
||||||
|
position: relative;
|
||||||
|
padding: 10px 20px;
|
||||||
|
text-align: center;
|
||||||
|
color: #F2F2F2;
|
||||||
|
}
|
||||||
|
.imagify-sidebar-close {
|
||||||
|
position: absolute;
|
||||||
|
top: 8px;
|
||||||
|
right: 12px;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.imagify-sidebar-close i {
|
||||||
|
font-size: 2em;
|
||||||
|
color: rgba(255,255,255,.5);
|
||||||
|
}
|
||||||
|
p.imagify-sidebar-title {
|
||||||
|
margin: 1.2em 0 1.5em;
|
||||||
|
text-align: left;
|
||||||
|
color: #F56640;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.015em;
|
||||||
|
word-spacing: 0.015em;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
p.imagify-sidebar-description {
|
||||||
|
margin: 1.5em 0;
|
||||||
|
text-align: left;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #F2F2F2;
|
||||||
|
}
|
||||||
|
.imagify-sidebar-description strong {
|
||||||
|
color: #39CE9A;
|
||||||
|
}
|
||||||
|
.imagify-rocket-cta-promo {
|
||||||
|
display: block;
|
||||||
|
padding: 8px 10px;
|
||||||
|
margin: 1.3em 0 .5em 0;
|
||||||
|
border: 2px dashed #F56640;
|
||||||
|
border-radius: 3px;
|
||||||
|
font-size: 18px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #F56640;
|
||||||
|
}
|
||||||
|
.imagify-rocket-cta-promo strong {
|
||||||
|
color: #F2F2F2;
|
||||||
|
}
|
||||||
|
a.btn-rocket {
|
||||||
|
display: block;
|
||||||
|
font-size: 15px;
|
||||||
|
padding: 10px 12px;
|
||||||
|
margin: 0 0 1.5em;
|
||||||
|
background: #F56640;
|
||||||
|
border-radius: 3px;
|
||||||
|
color: #F2F2F2;
|
||||||
|
text-transform: uppercase;
|
||||||
|
font-weight: bold;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
a.btn-rocket:hover,
|
||||||
|
a.btn-rocket:focus {
|
||||||
|
background: #AC2B15;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-sidebar-section ul {
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-sidebar-section li {
|
||||||
|
position: relative;
|
||||||
|
margin: 1.2em 0;
|
||||||
|
padding-left: 25px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.imagify-sidebar-section li:before {
|
||||||
|
content: "✓";
|
||||||
|
position: absolute;
|
||||||
|
left: 0; top: 0;
|
||||||
|
color: #39CE9A;
|
||||||
|
font-size: 18px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Menu in admin bar label exception */
|
||||||
|
label[for="imagify_admin_bar_menu"],
|
||||||
|
label[for="imagify_partner_links"] {
|
||||||
|
font-weight: normal !important;
|
||||||
|
color: #626E7B !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Select / Unselect all buttons */
|
||||||
|
.imagify-select-all-buttons {
|
||||||
|
margin-top: 8px;
|
||||||
|
}
|
||||||
|
.imagify-link-like.imagify-select-all {
|
||||||
|
font-weight: bold;
|
||||||
|
font-size: 12px;
|
||||||
|
color: #3694AE;
|
||||||
|
}
|
||||||
|
.imagify-select-all.imagify-is-inactive {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add Themes box */
|
||||||
|
.imagify-fts-header {
|
||||||
|
padding: 10px 16px;
|
||||||
|
background: #343A49;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
.imagify-fts-header i {
|
||||||
|
font-size: 1.8em;
|
||||||
|
margin-right: 12px;
|
||||||
|
}
|
||||||
|
.imagify-fts-header p {
|
||||||
|
margin: 0;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
.imagify-fts-header strong,
|
||||||
|
#imagify-add-themes-to-custom-folder strong {
|
||||||
|
color: #40B1D0;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-fts-content {
|
||||||
|
padding: 16px;
|
||||||
|
background: #F4F7F9;
|
||||||
|
border: 1px solid #CDD0D4;
|
||||||
|
border-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-fts-content p {
|
||||||
|
margin-top: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-kindof-title {
|
||||||
|
margin-top: 2em;
|
||||||
|
padding: 0 0 10px 0;
|
||||||
|
border-bottom: 1px solid #D2D3D6;
|
||||||
|
justify-content: space-between;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.imagify-settings .imagify-button-mini {
|
||||||
|
padding: 4px 13px 4px 10px;
|
||||||
|
}
|
||||||
|
.imagify-settings .imagify-button-mini .dashicons-plus {
|
||||||
|
vertical-align: -7.5px;
|
||||||
|
}
|
||||||
|
.imagify-settings .imagify-button-mini.imagify-button-primary:hover,
|
||||||
|
.imagify-settings .imagify-button-mini.imagify-button-primary:focus {
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
p.imagify-custom-folder-line {
|
||||||
|
position: relative;
|
||||||
|
margin: 0;
|
||||||
|
padding: 12px 15px;
|
||||||
|
color: #4A5362;
|
||||||
|
font-weight: 500;
|
||||||
|
transition: all .75s;
|
||||||
|
}
|
||||||
|
.imagify-custom-folder-line.imagify-will-remove {
|
||||||
|
background: #C51162;
|
||||||
|
color: #FFF;
|
||||||
|
transform: translateX(-120px);
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
.imagify-custom-folder-line:first-child {
|
||||||
|
margin-top: -.5em;
|
||||||
|
}
|
||||||
|
.imagify-custom-folder-line + .imagify-custom-folder-line {
|
||||||
|
border-top: 1px solid #E9EFF2;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-custom-folders-remove {
|
||||||
|
position: absolute;
|
||||||
|
right: 0;
|
||||||
|
top: 6px;
|
||||||
|
border: 0;
|
||||||
|
padding: 5px 10px 4px;
|
||||||
|
box-shadow: none;
|
||||||
|
color: #7A8996;
|
||||||
|
border-radius: 16px;
|
||||||
|
font-size: 13px;
|
||||||
|
line-height: 18px;
|
||||||
|
background: #FFF;
|
||||||
|
transition: all .275s;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.imagify-custom-folders-remove-text {
|
||||||
|
max-width: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
display: inline-block;
|
||||||
|
transform: scale(0);
|
||||||
|
opacity: 0;
|
||||||
|
transition: all .275s;
|
||||||
|
}
|
||||||
|
.imagify-custom-folders-remove:hover,
|
||||||
|
.imagify-custom-folders-remove:focus {
|
||||||
|
background: #D9EFF6;
|
||||||
|
color: #225E6E;
|
||||||
|
}
|
||||||
|
.imagify-custom-folders-remove:hover .imagify-custom-folders-remove-text,
|
||||||
|
.imagify-custom-folders-remove:focus .imagify-custom-folders-remove-text {
|
||||||
|
max-width: 6em;
|
||||||
|
transform: scale(1);
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Progress bar */
|
||||||
|
.imagify-settings .progress {
|
||||||
|
height: 8px;
|
||||||
|
margin-top: 1em;
|
||||||
|
background: #343A49;
|
||||||
|
}
|
||||||
|
.imagify-settings .bar {
|
||||||
|
position: relative;
|
||||||
|
width: 1px;
|
||||||
|
height: 8px;
|
||||||
|
background: #46B1CE;
|
||||||
|
-webkit-transition: width .5s;
|
||||||
|
transition: width .5s;
|
||||||
|
}
|
||||||
|
.imagify-settings .percent {
|
||||||
|
position: absolute;
|
||||||
|
top: 6px;
|
||||||
|
right: 0;
|
||||||
|
padding: 0 5px;
|
||||||
|
line-height: 1.85;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #40B1D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Icon rotation */
|
||||||
|
.dashicons.rotate {
|
||||||
|
-webkit-animation: icon-rotate 2.6s infinite linear;
|
||||||
|
animation: icon-rotate 2.6s infinite linear;
|
||||||
|
}
|
||||||
|
|
||||||
|
@-webkit-keyframes icon-rotate {
|
||||||
|
from {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@keyframes icon-rotate {
|
||||||
|
from {
|
||||||
|
transform: rotate(0deg);
|
||||||
|
}
|
||||||
|
to {
|
||||||
|
transform: rotate(360deg);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Files tree Part */
|
||||||
|
.imagify-add-custom-folder + .imagify-loader {
|
||||||
|
display: none;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
.imagify-add-custom-folder[disabled] + .imagify-loader {
|
||||||
|
display: inline-block;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-folders-information {
|
||||||
|
position: relative;
|
||||||
|
margin: -5px 0 20px 0;
|
||||||
|
padding: 10px 10px 10px 40px;
|
||||||
|
text-align: left;
|
||||||
|
background: #F2F2F2;
|
||||||
|
}
|
||||||
|
.imagify-folders-information i {
|
||||||
|
position: absolute;
|
||||||
|
left: 10px;
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Tree */
|
||||||
|
.imagify-folders-tree {
|
||||||
|
margin: 0;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree li {
|
||||||
|
clear: left;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder {
|
||||||
|
box-sizing: border-box;
|
||||||
|
position: relative;
|
||||||
|
width: 48px;
|
||||||
|
z-index: 2;
|
||||||
|
float: left;
|
||||||
|
margin-top: -3px;
|
||||||
|
padding: 0 8px 0 0;
|
||||||
|
border: 0;
|
||||||
|
background: transparent!important;
|
||||||
|
box-shadow: none;
|
||||||
|
cursor: pointer;
|
||||||
|
transition: all .275s;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree span.imagify-folder {
|
||||||
|
padding-left: 1.5px;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder:before {
|
||||||
|
content: "+";
|
||||||
|
display: inline-block;
|
||||||
|
width: 13px;
|
||||||
|
height: 21px;
|
||||||
|
font-size: 1.5em;
|
||||||
|
vertical-align: .15em;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree span.imagify-folder:before {
|
||||||
|
content: '';
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder-icon path {
|
||||||
|
transition: all .275s;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-is-open .imagify-folder-icon path {
|
||||||
|
stroke: #7A8996;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-is-open.imagify-folder:before {
|
||||||
|
content: "-";
|
||||||
|
color: #7A8996;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-is-open ~ label {
|
||||||
|
color: #7A8996;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder.imagify-loading:before,
|
||||||
|
.imagify-folders-tree .imagify-folder .imagify-loader {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder.imagify-loading .imagify-loader {
|
||||||
|
display: inline-block;
|
||||||
|
width: 13px;
|
||||||
|
height: 21px;
|
||||||
|
font-size: 1.5em;
|
||||||
|
vertical-align: .15em;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder.imagify-loading .imagify-loader img {
|
||||||
|
display: inline-block;
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-folders-tree button.imagify-folder:hover,
|
||||||
|
.imagify-folders-tree button.imagify-folder:focus,
|
||||||
|
.imagify-folders-tree button.imagify-folder:hover path,
|
||||||
|
.imagify-folders-tree button.imagify-folder:focus path {
|
||||||
|
color: #3694AE;
|
||||||
|
stroke: #3694AE;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-folders-tree .imagify-folder:disabled,
|
||||||
|
.imagify-folders-tree .imagify-folder.disabled {
|
||||||
|
color: rgb(127, 127, 127);
|
||||||
|
}
|
||||||
|
.imagify-swal-content .imagify-folders-tree label {
|
||||||
|
position: relative;
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
padding: 3px 0;
|
||||||
|
font-size: 15px;
|
||||||
|
font-weight: 500;
|
||||||
|
vertical-align: top;
|
||||||
|
transition: all .475s;
|
||||||
|
}
|
||||||
|
.imagify-swal-content .imagify-folders-tree label:hover,
|
||||||
|
.imagify-folders-tree input:focus + label {
|
||||||
|
background: #F4F7F9;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-folders-tree .imagify-folder-already-selected label,
|
||||||
|
.imagify-folders-tree .imagify-folder-already-selected label:hover,
|
||||||
|
.imagify-folders-tree .imagify-folder-already-selected input:focus + label {
|
||||||
|
background: #40B1D0;
|
||||||
|
color: #FFF;
|
||||||
|
border-radius: 3px;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder-already-selected button,
|
||||||
|
.imagify-folders-tree .imagify-folder-already-selected button path {
|
||||||
|
color: #FFF;
|
||||||
|
stroke: #FFF;
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder-already-selected button:hover path,
|
||||||
|
.imagify-folders-tree .imagify-folder-already-selected button:focus path {
|
||||||
|
stroke: #FFF;
|
||||||
|
}
|
||||||
|
.imagify-folders-tree .imagify-folder-already-selected button:before {
|
||||||
|
content: '';
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Add Folder fake checkbox */
|
||||||
|
.imagify-add-ed-folder {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
font-size: 11px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.02em;
|
||||||
|
word-spacing: 0.02em;
|
||||||
|
color: #3694AE;
|
||||||
|
background: #F4F7F9;
|
||||||
|
opacity: 0;
|
||||||
|
transform: translateX(15px);
|
||||||
|
transition: all .275s;
|
||||||
|
}
|
||||||
|
label:hover .imagify-add-ed-folder,
|
||||||
|
input:focus + label .imagify-add-ed-folder,
|
||||||
|
input:checked + label .imagify-add-ed-folder,
|
||||||
|
.imagify-folder-already-selected .imagify-add-ed-folder {
|
||||||
|
opacity: 1;
|
||||||
|
transform: translateX(0);
|
||||||
|
}
|
||||||
|
input:checked + label .imagify-add-ed-folder {
|
||||||
|
background: #FFF;
|
||||||
|
}
|
||||||
|
input:checked:focus + label .imagify-add-ed-folder,
|
||||||
|
input:checked + label:hover .imagify-add-ed-folder {
|
||||||
|
background: #F4F7F9;
|
||||||
|
}
|
||||||
|
.imagify-folder-already-selected .imagify-add-ed-folder {
|
||||||
|
background: #40B1D0;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
.imagify-fake-checkbox {
|
||||||
|
position: relative;
|
||||||
|
display: inline-block;
|
||||||
|
width: 14px;
|
||||||
|
height: 14px;
|
||||||
|
margin: 3.5px 15px 0 5px;
|
||||||
|
border: 1.5px solid #3694AE;
|
||||||
|
border-radius: 3px;
|
||||||
|
vertical-align: -4px;
|
||||||
|
}
|
||||||
|
.imagify-fake-checkbox:after {
|
||||||
|
position: absolute;
|
||||||
|
left: 1px;
|
||||||
|
top: 0;
|
||||||
|
content: "✓";
|
||||||
|
color: #3694AE;
|
||||||
|
font-size: 14px;
|
||||||
|
line-height: .9;
|
||||||
|
font-style: normal;
|
||||||
|
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
|
||||||
|
opacity: 0;
|
||||||
|
transform: scale(0);
|
||||||
|
transition: all .475s;
|
||||||
|
}
|
||||||
|
input:checked + label .imagify-fake-checkbox:after,
|
||||||
|
.imagify-folder-already-selected .imagify-fake-checkbox:after {
|
||||||
|
opacity: 1;
|
||||||
|
transform: scale(1);
|
||||||
|
}
|
||||||
|
.imagify-folder-already-selected .imagify-fake-checkbox {
|
||||||
|
border-color: #40B1D0;
|
||||||
|
}
|
||||||
|
.imagify-folder-already-selected .imagify-fake-checkbox:after {
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Sub Trees */
|
||||||
|
.imagify-folders-sub-tree {
|
||||||
|
position: relative;
|
||||||
|
margin-left: .75em;
|
||||||
|
padding-top: .6em;
|
||||||
|
padding-left: 1em;
|
||||||
|
border-left: 1px dotted rgba(98, 110, 123, .3);
|
||||||
|
}
|
||||||
|
.imagify-folders-sub-tree li {
|
||||||
|
position: relative;
|
||||||
|
margin-bottom: 4px;
|
||||||
|
}
|
||||||
|
.imagify-folders-sub-tree li:before {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
top: 12px;
|
||||||
|
left: -1em;
|
||||||
|
height: 1px;
|
||||||
|
width: 0.9em;
|
||||||
|
border-top: 1px dotted rgba(98, 110, 123, .3);
|
||||||
|
}
|
||||||
|
.imagify-folders-sub-tree li:last-child:after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
left: -1.1em;
|
||||||
|
bottom: 0;
|
||||||
|
height: 11px;
|
||||||
|
width: 3px;
|
||||||
|
background: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-empty-folder {
|
||||||
|
margin-top: -.5em;
|
||||||
|
}
|
||||||
|
.imagify-empty-folder em {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #A2AFBC;
|
||||||
|
}
|
||||||
|
@media (max-width: 782px) {
|
||||||
|
.imagify-settings.imagify-have-rocket {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
label + .imagify-info, .imagify-visual-label {
|
||||||
|
max-width: calc(100% - 65px);
|
||||||
|
padding-right: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-options-title {
|
||||||
|
font-size: 22px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-user-plan-label {
|
||||||
|
margin-right: -5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-col.imagify-main {
|
||||||
|
width:100%;
|
||||||
|
padding-right: 10px;
|
||||||
|
}
|
||||||
|
.imagify-col + .imagify-col{
|
||||||
|
padding:0px 10px 0px 0px;
|
||||||
|
}
|
||||||
|
.imagify-no-api-key .imagify-api-line input[type="text"]{
|
||||||
|
margin-left: 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media (max-width: 513px) {
|
||||||
|
.imagify-setting-optim-level .imagify-visual-comparison-text{
|
||||||
|
margin-top: 20px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-col-content .imagify-space-left {
|
||||||
|
margin: 15px 30px 15px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-col-content .imagify-space-left p {
|
||||||
|
margin: 0 0 10px 0;
|
||||||
|
font-size: 19px;
|
||||||
|
font-weight: 500;
|
||||||
|
color: #343A49;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-col-content .imagify-meteo-icon {
|
||||||
|
height: 64px;
|
||||||
|
margin: 15px 15px 15px 0;
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/imagify/assets/css/options.min.css
vendored
Normal file
1340
wp/wp-content/plugins/imagify/assets/css/pricing-modal.css
Normal file
1
wp/wp-content/plugins/imagify/assets/css/pricing-modal.min.css
vendored
Normal file
172
wp/wp-content/plugins/imagify/assets/css/sweetalert-custom.css
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
/* Sub Layer */
|
||||||
|
body[class*="_imagify"] .swal2-container.swal2-shown {
|
||||||
|
background: rgb(31, 35 ,50);
|
||||||
|
background: rgba(31, 35 ,50, .9);
|
||||||
|
z-index: 100000;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* White Container */
|
||||||
|
.imagify-sweet-alert .swal2-modal {
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* To get icon background dark */
|
||||||
|
.imagify-sweet-alert {
|
||||||
|
background: #1F2332!important;
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert .swal2-icon {
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* header error color */
|
||||||
|
.imagify-swal-error-header {
|
||||||
|
background: #C51162!important;
|
||||||
|
}
|
||||||
|
.imagify-swal-error-header .swal2-icon {
|
||||||
|
border-color: #FFF;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Title and Subtitle */
|
||||||
|
.imagify-sweet-alert .swal2-title {
|
||||||
|
margin: 0;
|
||||||
|
padding: 28px 32px;
|
||||||
|
font-size: 24px;
|
||||||
|
text-align: center;
|
||||||
|
color: #FFF;
|
||||||
|
background: #1F2332;
|
||||||
|
}
|
||||||
|
.imagify-swal-has-subtitle .swal2-title {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.imagify-swal-error-header .swal2-title {
|
||||||
|
background: #C51162;
|
||||||
|
text-align: center;
|
||||||
|
line-height: 1.15;
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert .imagify-swal-subtitle {
|
||||||
|
padding: 0 32px 28px;
|
||||||
|
margin-top: -16px;
|
||||||
|
font-weight: 500;
|
||||||
|
font-size: 14px;
|
||||||
|
text-align: left;
|
||||||
|
color: #7A8996;
|
||||||
|
background: #1F2332;
|
||||||
|
}
|
||||||
|
.imagify-swal-error-header .imagify-swal-subtitle {
|
||||||
|
color: #FFF;
|
||||||
|
background: #C51162;
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Buttons */
|
||||||
|
.imagify-sweet-alert .swal2-buttonswrapper,
|
||||||
|
.imagify-swal-buttonswrapper {
|
||||||
|
margin-top: 0;
|
||||||
|
padding: 22px;
|
||||||
|
background: #F4F7F9;
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert button.swal2-styled,
|
||||||
|
.imagify-swal-buttonswrapper a.button.imagify-button-primary {
|
||||||
|
height: auto;
|
||||||
|
padding: 12px 32px;
|
||||||
|
margin: 10px;
|
||||||
|
font-size: 14px;
|
||||||
|
letter-spacing: 1px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
border-radius: 3px;
|
||||||
|
background-color: #40b1d0 !important;
|
||||||
|
text-shadow: none!important;
|
||||||
|
box-shadow: 0 3px 0 #338ea6;
|
||||||
|
white-space: normal;
|
||||||
|
line-height: 1.5;
|
||||||
|
}
|
||||||
|
.imagify-swal-buttonswrapper a.button.imagify-button-primary:focus,
|
||||||
|
.imagify-swal-buttonswrapper a.button.imagify-button-primary:hover {
|
||||||
|
text-shadow: none;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
.imagify-swal-buttonswrapper a.button svg {
|
||||||
|
margin-right: 12px;
|
||||||
|
vertical-align: -2px;
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert button.loading {
|
||||||
|
border-radius: 100% !important;
|
||||||
|
height: 40px !important;
|
||||||
|
padding:0!important;
|
||||||
|
box-shadow: none!important;
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert button.swal2-cancel {
|
||||||
|
color: #7A8996;
|
||||||
|
background: #E9EFF2 !important;
|
||||||
|
box-shadow: 0 3px 0 rgba(31, 35, 50, .2);
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert-signup.imagify-sweet-alert {
|
||||||
|
background: #FFF!important;
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert-signup .swal2-buttonswrapper {
|
||||||
|
padding: 12px 22px;
|
||||||
|
}
|
||||||
|
.swal2-success-circular-line-left,
|
||||||
|
.swal2-success-fix,
|
||||||
|
.swal2-success-circular-line-right {
|
||||||
|
background: #1F2332 !important
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert-signup .sa-confirm-button-container {
|
||||||
|
width: 40%;
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert-signup .swal2-input {
|
||||||
|
margin-top: 0;
|
||||||
|
margin-left: 40px;
|
||||||
|
margin-right: 40px;
|
||||||
|
width: calc( 100% - 80px);
|
||||||
|
}
|
||||||
|
.imagify-sweet-alert .sa-input-error:before,
|
||||||
|
.imagify-sweet-alert .sa-input-error:after,
|
||||||
|
.imagify-sweet-alert .la-ball-fall {
|
||||||
|
top: 25% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-sweet-alert .swal2-buttonswrapper.swal2-loading .swal2-confirm.swal2-confirm {
|
||||||
|
height: 40px !important;
|
||||||
|
border-radius: 100% !important;
|
||||||
|
border-left-width: 0 !important;
|
||||||
|
border-right-width: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Imagify swal contents */
|
||||||
|
.imagify-sweet-alert .swal2-content {
|
||||||
|
padding: 28px 32px;
|
||||||
|
background: #FFF;
|
||||||
|
}
|
||||||
|
.imagify-swal-has-subtitle .swal2-content {
|
||||||
|
padding: 0;
|
||||||
|
}
|
||||||
|
.imagify-swal-content {
|
||||||
|
font-size: 14px;
|
||||||
|
padding: 28px 32px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Quota */
|
||||||
|
.imagify-swal-quota .imagify-space-left {
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: space-between;
|
||||||
|
padding: 4px 32px;
|
||||||
|
text-align: left;
|
||||||
|
font-weight: bold;
|
||||||
|
color: #FFF;
|
||||||
|
background: #343A49;
|
||||||
|
}
|
||||||
|
.imagify-swal-quota .imagify-space-left p {
|
||||||
|
font-size: 14px;
|
||||||
|
}
|
||||||
|
.imagify-swal-quota .imagify-space-left [class^="imagify-bar-"] {
|
||||||
|
width: auto;
|
||||||
|
flex-basis: 269px;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Close button */
|
||||||
|
.imagify-sweet-alert .swal2-close {
|
||||||
|
color: rgba(255,255,255,.5);
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/imagify/assets/css/sweetalert-custom.min.css
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
body[class*="_imagify"] .swal2-container.swal2-shown{background:rgb(31,35 ,50);background:rgba(31,35 ,50,.9);z-index:100000}.imagify-sweet-alert .swal2-modal{border-radius:2px}.imagify-sweet-alert{background:#1f2332!important}.imagify-sweet-alert .swal2-icon{margin-bottom:5px}.imagify-swal-error-header{background:#c51162!important}.imagify-swal-error-header .swal2-icon{border-color:#fff;color:#fff}.imagify-sweet-alert .swal2-title{margin:0;padding:28px 32px;font-size:24px;text-align:center;color:#fff;background:#1f2332}.imagify-swal-has-subtitle .swal2-title{text-align:left}.imagify-swal-error-header .swal2-title{background:#c51162;text-align:center;line-height:1.15}.imagify-sweet-alert .imagify-swal-subtitle{padding:0 32px 28px;margin-top:-16px;font-weight:500;font-size:14px;text-align:left;color:#7a8996;background:#1f2332}.imagify-swal-error-header .imagify-swal-subtitle{color:#fff;background:#c51162;text-align:center}.imagify-swal-buttonswrapper,.imagify-sweet-alert .swal2-buttonswrapper{margin-top:0;padding:22px;background:#f4f7f9}.imagify-swal-buttonswrapper a.button.imagify-button-primary,.imagify-sweet-alert button.swal2-styled{height:auto;padding:12px 32px;margin:10px;font-size:14px;letter-spacing:1px;text-transform:uppercase;border-radius:3px;background-color:#40b1d0!important;text-shadow:none!important;-webkit-box-shadow:0 3px 0 #338ea6;box-shadow:0 3px 0 #338ea6;white-space:normal;line-height:1.5}.imagify-swal-buttonswrapper a.button.imagify-button-primary:focus,.imagify-swal-buttonswrapper a.button.imagify-button-primary:hover{text-shadow:none;color:#fff}.imagify-swal-buttonswrapper a.button svg{margin-right:12px;vertical-align:-2px}.imagify-sweet-alert button.loading{border-radius:100%!important;height:40px!important;padding:0!important;-webkit-box-shadow:none!important;box-shadow:none!important}.imagify-sweet-alert button.swal2-cancel{color:#7a8996;background:#e9eff2!important;-webkit-box-shadow:0 3px 0 rgba(31,35,50,.2);box-shadow:0 3px 0 rgba(31,35,50,.2)}.imagify-sweet-alert-signup.imagify-sweet-alert{background:#fff!important}.imagify-sweet-alert-signup .swal2-buttonswrapper{padding:12px 22px}.swal2-success-circular-line-left,.swal2-success-circular-line-right,.swal2-success-fix{background:#1f2332!important}.imagify-sweet-alert-signup .sa-confirm-button-container{width:40%}.imagify-sweet-alert-signup .swal2-input{margin-top:0;margin-left:40px;margin-right:40px;width:calc(100% - 80px)}.imagify-sweet-alert .la-ball-fall,.imagify-sweet-alert .sa-input-error:after,.imagify-sweet-alert .sa-input-error:before{top:25%!important}.imagify-sweet-alert .swal2-buttonswrapper.swal2-loading .swal2-confirm.swal2-confirm{height:40px!important;border-radius:100%!important;border-left-width:0!important;border-right-width:0!important}.imagify-sweet-alert .swal2-content{padding:28px 32px;background:#fff}.imagify-swal-has-subtitle .swal2-content{padding:0}.imagify-swal-content{font-size:14px;padding:28px 32px}.imagify-swal-quota .imagify-space-left{display:-webkit-box;display:-ms-flexbox;display:flex;-webkit-box-align:center;-ms-flex-align:center;align-items:center;-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between;padding:4px 32px;text-align:left;font-weight:700;color:#fff;background:#343a49}.imagify-swal-quota .imagify-space-left p{font-size:14px}.imagify-swal-quota .imagify-space-left [class^=imagify-bar-]{width:auto;-ms-flex-preferred-size:269px;flex-basis:269px}.imagify-sweet-alert .swal2-close{color:rgba(255,255,255,.5)}
|
||||||
716
wp/wp-content/plugins/imagify/assets/css/sweetalert2.css
Normal file
@@ -0,0 +1,716 @@
|
|||||||
|
body.swal2-shown {
|
||||||
|
overflow-y: hidden; }
|
||||||
|
|
||||||
|
body.swal2-iosfix {
|
||||||
|
position: fixed;
|
||||||
|
left: 0;
|
||||||
|
right: 0; }
|
||||||
|
|
||||||
|
.swal2-container {
|
||||||
|
display: -webkit-box;
|
||||||
|
display: -ms-flexbox;
|
||||||
|
display: flex;
|
||||||
|
-webkit-box-align: center;
|
||||||
|
-ms-flex-align: center;
|
||||||
|
align-items: center;
|
||||||
|
position: fixed;
|
||||||
|
top: 0;
|
||||||
|
left: 0;
|
||||||
|
bottom: 0;
|
||||||
|
right: 0;
|
||||||
|
padding: 10px;
|
||||||
|
background-color: transparent;
|
||||||
|
z-index: 1060; }
|
||||||
|
.swal2-container.swal2-fade {
|
||||||
|
-webkit-transition: background-color .1s;
|
||||||
|
transition: background-color .1s; }
|
||||||
|
.swal2-container.swal2-shown {
|
||||||
|
background-color: rgba(0, 0, 0, 0.4); }
|
||||||
|
|
||||||
|
.swal2-modal {
|
||||||
|
background-color: #fff;
|
||||||
|
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
|
border-radius: 5px;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
text-align: center;
|
||||||
|
margin: auto;
|
||||||
|
overflow-x: hidden;
|
||||||
|
overflow-y: auto;
|
||||||
|
display: none;
|
||||||
|
position: relative;
|
||||||
|
max-width: 100%; }
|
||||||
|
.swal2-modal:focus {
|
||||||
|
outline: none; }
|
||||||
|
.swal2-modal.swal2-loading {
|
||||||
|
overflow-y: hidden; }
|
||||||
|
.swal2-modal .swal2-title {
|
||||||
|
color: #595959;
|
||||||
|
font-size: 30px;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 600;
|
||||||
|
text-transform: none;
|
||||||
|
position: relative;
|
||||||
|
margin: 0 0 .4em;
|
||||||
|
padding: 0;
|
||||||
|
display: block;
|
||||||
|
word-wrap: break-word; }
|
||||||
|
.swal2-modal .swal2-buttonswrapper {
|
||||||
|
margin-top: 15px; }
|
||||||
|
.swal2-modal .swal2-buttonswrapper:not(.swal2-loading) .swal2-styled[disabled] {
|
||||||
|
opacity: .4;
|
||||||
|
cursor: no-drop; }
|
||||||
|
.swal2-modal .swal2-buttonswrapper.swal2-loading .swal2-styled.swal2-confirm {
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
border: 4px solid transparent;
|
||||||
|
border-color: transparent;
|
||||||
|
width: 40px;
|
||||||
|
height: 40px;
|
||||||
|
padding: 0;
|
||||||
|
margin: 7.5px;
|
||||||
|
vertical-align: top;
|
||||||
|
background-color: transparent !important;
|
||||||
|
color: transparent;
|
||||||
|
cursor: default;
|
||||||
|
border-radius: 100%;
|
||||||
|
-webkit-animation: rotate-loading 1.5s linear 0s infinite normal;
|
||||||
|
animation: rotate-loading 1.5s linear 0s infinite normal;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none; }
|
||||||
|
.swal2-modal .swal2-buttonswrapper.swal2-loading .swal2-styled.swal2-cancel {
|
||||||
|
margin-left: 30px;
|
||||||
|
margin-right: 30px; }
|
||||||
|
.swal2-modal .swal2-buttonswrapper.swal2-loading :not(.swal2-styled).swal2-confirm::after {
|
||||||
|
display: inline-block;
|
||||||
|
content: '';
|
||||||
|
margin-left: 5px 0 15px;
|
||||||
|
vertical-align: -1px;
|
||||||
|
height: 15px;
|
||||||
|
width: 15px;
|
||||||
|
border: 3px solid #999999;
|
||||||
|
-webkit-box-shadow: 1px 1px 1px #fff;
|
||||||
|
box-shadow: 1px 1px 1px #fff;
|
||||||
|
border-right-color: transparent;
|
||||||
|
border-radius: 50%;
|
||||||
|
-webkit-animation: rotate-loading 1.5s linear 0s infinite normal;
|
||||||
|
animation: rotate-loading 1.5s linear 0s infinite normal; }
|
||||||
|
.swal2-modal .swal2-styled {
|
||||||
|
border: 0;
|
||||||
|
border-radius: 3px;
|
||||||
|
-webkit-box-shadow: none;
|
||||||
|
box-shadow: none;
|
||||||
|
color: #fff;
|
||||||
|
cursor: pointer;
|
||||||
|
font-size: 17px;
|
||||||
|
font-weight: 500;
|
||||||
|
margin: 15px 5px 0;
|
||||||
|
padding: 10px 32px; }
|
||||||
|
.swal2-modal .swal2-image {
|
||||||
|
margin: 20px auto;
|
||||||
|
max-width: 100%; }
|
||||||
|
.swal2-modal .swal2-close {
|
||||||
|
background: transparent;
|
||||||
|
border: 0;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
width: 38px;
|
||||||
|
height: 40px;
|
||||||
|
font-size: 36px;
|
||||||
|
line-height: 40px;
|
||||||
|
font-family: serif;
|
||||||
|
position: absolute;
|
||||||
|
top: 5px;
|
||||||
|
right: 8px;
|
||||||
|
cursor: pointer;
|
||||||
|
color: #cccccc;
|
||||||
|
-webkit-transition: color .1s ease;
|
||||||
|
transition: color .1s ease; }
|
||||||
|
.swal2-modal .swal2-close:hover {
|
||||||
|
color: #d55; }
|
||||||
|
.swal2-modal > .swal2-input,
|
||||||
|
.swal2-modal > .swal2-file,
|
||||||
|
.swal2-modal > .swal2-textarea,
|
||||||
|
.swal2-modal > .swal2-select,
|
||||||
|
.swal2-modal > .swal2-radio,
|
||||||
|
.swal2-modal > .swal2-checkbox {
|
||||||
|
display: none; }
|
||||||
|
.swal2-modal .swal2-content {
|
||||||
|
font-size: 18px;
|
||||||
|
text-align: center;
|
||||||
|
font-weight: 300;
|
||||||
|
position: relative;
|
||||||
|
float: none;
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
line-height: normal;
|
||||||
|
color: #545454;
|
||||||
|
word-wrap: break-word; }
|
||||||
|
.swal2-modal .swal2-input,
|
||||||
|
.swal2-modal .swal2-file,
|
||||||
|
.swal2-modal .swal2-textarea,
|
||||||
|
.swal2-modal .swal2-select,
|
||||||
|
.swal2-modal .swal2-radio,
|
||||||
|
.swal2-modal .swal2-checkbox {
|
||||||
|
margin: 20px auto; }
|
||||||
|
.swal2-modal .swal2-input,
|
||||||
|
.swal2-modal .swal2-file,
|
||||||
|
.swal2-modal .swal2-textarea {
|
||||||
|
width: 100%;
|
||||||
|
-webkit-box-sizing: border-box;
|
||||||
|
box-sizing: border-box;
|
||||||
|
font-size: 18px;
|
||||||
|
border-radius: 3px;
|
||||||
|
border: 1px solid #d9d9d9;
|
||||||
|
-webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06);
|
||||||
|
box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.06);
|
||||||
|
-webkit-transition: border-color box-shadow .3s;
|
||||||
|
transition: border-color box-shadow .3s; }
|
||||||
|
.swal2-modal .swal2-input.swal2-inputerror,
|
||||||
|
.swal2-modal .swal2-file.swal2-inputerror,
|
||||||
|
.swal2-modal .swal2-textarea.swal2-inputerror {
|
||||||
|
border-color: #f27474 !important;
|
||||||
|
-webkit-box-shadow: 0 0 2px #f27474 !important;
|
||||||
|
box-shadow: 0 0 2px #f27474 !important; }
|
||||||
|
.swal2-modal .swal2-input:focus,
|
||||||
|
.swal2-modal .swal2-file:focus,
|
||||||
|
.swal2-modal .swal2-textarea:focus {
|
||||||
|
outline: none;
|
||||||
|
border: 1px solid #b4dbed;
|
||||||
|
-webkit-box-shadow: 0 0 3px #c4e6f5;
|
||||||
|
box-shadow: 0 0 3px #c4e6f5; }
|
||||||
|
.swal2-modal .swal2-input:focus::-webkit-input-placeholder,
|
||||||
|
.swal2-modal .swal2-file:focus::-webkit-input-placeholder,
|
||||||
|
.swal2-modal .swal2-textarea:focus::-webkit-input-placeholder {
|
||||||
|
-webkit-transition: opacity .3s .03s ease;
|
||||||
|
transition: opacity .3s .03s ease;
|
||||||
|
opacity: .8; }
|
||||||
|
.swal2-modal .swal2-input:focus:-ms-input-placeholder,
|
||||||
|
.swal2-modal .swal2-file:focus:-ms-input-placeholder,
|
||||||
|
.swal2-modal .swal2-textarea:focus:-ms-input-placeholder {
|
||||||
|
-webkit-transition: opacity .3s .03s ease;
|
||||||
|
transition: opacity .3s .03s ease;
|
||||||
|
opacity: .8; }
|
||||||
|
.swal2-modal .swal2-input:focus::placeholder,
|
||||||
|
.swal2-modal .swal2-file:focus::placeholder,
|
||||||
|
.swal2-modal .swal2-textarea:focus::placeholder {
|
||||||
|
-webkit-transition: opacity .3s .03s ease;
|
||||||
|
transition: opacity .3s .03s ease;
|
||||||
|
opacity: .8; }
|
||||||
|
.swal2-modal .swal2-input::-webkit-input-placeholder,
|
||||||
|
.swal2-modal .swal2-file::-webkit-input-placeholder,
|
||||||
|
.swal2-modal .swal2-textarea::-webkit-input-placeholder {
|
||||||
|
color: #e6e6e6; }
|
||||||
|
.swal2-modal .swal2-input:-ms-input-placeholder,
|
||||||
|
.swal2-modal .swal2-file:-ms-input-placeholder,
|
||||||
|
.swal2-modal .swal2-textarea:-ms-input-placeholder {
|
||||||
|
color: #e6e6e6; }
|
||||||
|
.swal2-modal .swal2-input::placeholder,
|
||||||
|
.swal2-modal .swal2-file::placeholder,
|
||||||
|
.swal2-modal .swal2-textarea::placeholder {
|
||||||
|
color: #e6e6e6; }
|
||||||
|
.swal2-modal .swal2-range input {
|
||||||
|
float: left;
|
||||||
|
width: 80%; }
|
||||||
|
.swal2-modal .swal2-range output {
|
||||||
|
float: right;
|
||||||
|
width: 20%;
|
||||||
|
font-size: 20px;
|
||||||
|
font-weight: 600;
|
||||||
|
text-align: center; }
|
||||||
|
.swal2-modal .swal2-range input,
|
||||||
|
.swal2-modal .swal2-range output {
|
||||||
|
height: 43px;
|
||||||
|
line-height: 43px;
|
||||||
|
vertical-align: middle;
|
||||||
|
margin: 20px auto;
|
||||||
|
padding: 0; }
|
||||||
|
.swal2-modal .swal2-input {
|
||||||
|
height: 43px;
|
||||||
|
padding: 0 12px; }
|
||||||
|
.swal2-modal .swal2-input[type='number'] {
|
||||||
|
max-width: 150px; }
|
||||||
|
.swal2-modal .swal2-file {
|
||||||
|
font-size: 20px; }
|
||||||
|
.swal2-modal .swal2-textarea {
|
||||||
|
height: 108px;
|
||||||
|
padding: 12px; }
|
||||||
|
.swal2-modal .swal2-select {
|
||||||
|
color: #545454;
|
||||||
|
font-size: inherit;
|
||||||
|
padding: 5px 10px;
|
||||||
|
min-width: 40%;
|
||||||
|
max-width: 100%; }
|
||||||
|
.swal2-modal .swal2-radio {
|
||||||
|
border: 0; }
|
||||||
|
.swal2-modal .swal2-radio label:not(:first-child) {
|
||||||
|
margin-left: 20px; }
|
||||||
|
.swal2-modal .swal2-radio input,
|
||||||
|
.swal2-modal .swal2-radio span {
|
||||||
|
vertical-align: middle; }
|
||||||
|
.swal2-modal .swal2-radio input {
|
||||||
|
margin: 0 3px 0 0; }
|
||||||
|
.swal2-modal .swal2-checkbox {
|
||||||
|
color: #545454; }
|
||||||
|
.swal2-modal .swal2-checkbox input,
|
||||||
|
.swal2-modal .swal2-checkbox span {
|
||||||
|
vertical-align: middle; }
|
||||||
|
.swal2-modal .swal2-validationerror {
|
||||||
|
background-color: #f0f0f0;
|
||||||
|
margin: 0 -20px;
|
||||||
|
overflow: hidden;
|
||||||
|
padding: 10px;
|
||||||
|
color: gray;
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 300;
|
||||||
|
display: none; }
|
||||||
|
.swal2-modal .swal2-validationerror::before {
|
||||||
|
content: '!';
|
||||||
|
display: inline-block;
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
border-radius: 50%;
|
||||||
|
background-color: #ea7d7d;
|
||||||
|
color: #fff;
|
||||||
|
line-height: 24px;
|
||||||
|
text-align: center;
|
||||||
|
margin-right: 10px; }
|
||||||
|
|
||||||
|
@supports (-ms-accelerator: true) {
|
||||||
|
.swal2-range input {
|
||||||
|
width: 100% !important; }
|
||||||
|
.swal2-range output {
|
||||||
|
display: none; } }
|
||||||
|
|
||||||
|
@media all and (-ms-high-contrast: none), (-ms-high-contrast: active) {
|
||||||
|
.swal2-range input {
|
||||||
|
width: 100% !important; }
|
||||||
|
.swal2-range output {
|
||||||
|
display: none; } }
|
||||||
|
|
||||||
|
.swal2-icon {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
border: 4px solid transparent;
|
||||||
|
border-radius: 50%;
|
||||||
|
margin: 20px auto 30px;
|
||||||
|
padding: 0;
|
||||||
|
position: relative;
|
||||||
|
-webkit-box-sizing: content-box;
|
||||||
|
box-sizing: content-box;
|
||||||
|
cursor: default;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none; }
|
||||||
|
.swal2-icon.swal2-error {
|
||||||
|
border-color: #f27474; }
|
||||||
|
.swal2-icon.swal2-error .swal2-x-mark {
|
||||||
|
position: relative;
|
||||||
|
display: block; }
|
||||||
|
.swal2-icon.swal2-error [class^='swal2-x-mark-line'] {
|
||||||
|
position: absolute;
|
||||||
|
height: 5px;
|
||||||
|
width: 47px;
|
||||||
|
background-color: #f27474;
|
||||||
|
display: block;
|
||||||
|
top: 37px;
|
||||||
|
border-radius: 2px; }
|
||||||
|
.swal2-icon.swal2-error [class^='swal2-x-mark-line'][class$='left'] {
|
||||||
|
-webkit-transform: rotate(45deg);
|
||||||
|
transform: rotate(45deg);
|
||||||
|
left: 17px; }
|
||||||
|
.swal2-icon.swal2-error [class^='swal2-x-mark-line'][class$='right'] {
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
right: 16px; }
|
||||||
|
.swal2-icon.swal2-warning {
|
||||||
|
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
|
color: #f8bb86;
|
||||||
|
border-color: #facea8;
|
||||||
|
font-size: 60px;
|
||||||
|
line-height: 80px;
|
||||||
|
text-align: center; }
|
||||||
|
.swal2-icon.swal2-info {
|
||||||
|
font-family: 'Open Sans', sans-serif;
|
||||||
|
color: #3fc3ee;
|
||||||
|
border-color: #9de0f6;
|
||||||
|
font-size: 60px;
|
||||||
|
line-height: 80px;
|
||||||
|
text-align: center; }
|
||||||
|
.swal2-icon.swal2-question {
|
||||||
|
font-family: 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||||
|
color: #87adbd;
|
||||||
|
border-color: #c9dae1;
|
||||||
|
font-size: 60px;
|
||||||
|
line-height: 80px;
|
||||||
|
text-align: center; }
|
||||||
|
.swal2-icon.swal2-success {
|
||||||
|
border-color: #a5dc86; }
|
||||||
|
.swal2-icon.swal2-success [class^='swal2-success-circular-line'] {
|
||||||
|
border-radius: 50%;
|
||||||
|
position: absolute;
|
||||||
|
width: 60px;
|
||||||
|
height: 120px;
|
||||||
|
-webkit-transform: rotate(45deg);
|
||||||
|
transform: rotate(45deg); }
|
||||||
|
.swal2-icon.swal2-success [class^='swal2-success-circular-line'][class$='left'] {
|
||||||
|
border-radius: 120px 0 0 120px;
|
||||||
|
top: -7px;
|
||||||
|
left: -33px;
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
-webkit-transform-origin: 60px 60px;
|
||||||
|
transform-origin: 60px 60px; }
|
||||||
|
.swal2-icon.swal2-success [class^='swal2-success-circular-line'][class$='right'] {
|
||||||
|
border-radius: 0 120px 120px 0;
|
||||||
|
top: -11px;
|
||||||
|
left: 30px;
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg);
|
||||||
|
-webkit-transform-origin: 0 60px;
|
||||||
|
transform-origin: 0 60px; }
|
||||||
|
.swal2-icon.swal2-success .swal2-success-ring {
|
||||||
|
width: 80px;
|
||||||
|
height: 80px;
|
||||||
|
border: 4px solid rgba(165, 220, 134, 0.2);
|
||||||
|
border-radius: 50%;
|
||||||
|
-webkit-box-sizing: content-box;
|
||||||
|
box-sizing: content-box;
|
||||||
|
position: absolute;
|
||||||
|
left: -4px;
|
||||||
|
top: -4px;
|
||||||
|
z-index: 2; }
|
||||||
|
.swal2-icon.swal2-success .swal2-success-fix {
|
||||||
|
width: 7px;
|
||||||
|
height: 90px;
|
||||||
|
position: absolute;
|
||||||
|
left: 28px;
|
||||||
|
top: 8px;
|
||||||
|
z-index: 1;
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg); }
|
||||||
|
.swal2-icon.swal2-success [class^='swal2-success-line'] {
|
||||||
|
height: 5px;
|
||||||
|
background-color: #a5dc86;
|
||||||
|
display: block;
|
||||||
|
border-radius: 2px;
|
||||||
|
position: absolute;
|
||||||
|
z-index: 2; }
|
||||||
|
.swal2-icon.swal2-success [class^='swal2-success-line'][class$='tip'] {
|
||||||
|
width: 25px;
|
||||||
|
left: 14px;
|
||||||
|
top: 46px;
|
||||||
|
-webkit-transform: rotate(45deg);
|
||||||
|
transform: rotate(45deg); }
|
||||||
|
.swal2-icon.swal2-success [class^='swal2-success-line'][class$='long'] {
|
||||||
|
width: 47px;
|
||||||
|
right: 8px;
|
||||||
|
top: 38px;
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg); }
|
||||||
|
|
||||||
|
.swal2-progresssteps {
|
||||||
|
font-weight: 600;
|
||||||
|
margin: 0 0 20px;
|
||||||
|
padding: 0; }
|
||||||
|
.swal2-progresssteps li {
|
||||||
|
display: inline-block;
|
||||||
|
position: relative; }
|
||||||
|
.swal2-progresssteps .swal2-progresscircle {
|
||||||
|
background: #3085d6;
|
||||||
|
border-radius: 2em;
|
||||||
|
color: #fff;
|
||||||
|
height: 2em;
|
||||||
|
line-height: 2em;
|
||||||
|
text-align: center;
|
||||||
|
width: 2em;
|
||||||
|
z-index: 20; }
|
||||||
|
.swal2-progresssteps .swal2-progresscircle:first-child {
|
||||||
|
margin-left: 0; }
|
||||||
|
.swal2-progresssteps .swal2-progresscircle:last-child {
|
||||||
|
margin-right: 0; }
|
||||||
|
.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep {
|
||||||
|
background: #3085d6; }
|
||||||
|
.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep ~ .swal2-progresscircle {
|
||||||
|
background: #add8e6; }
|
||||||
|
.swal2-progresssteps .swal2-progresscircle.swal2-activeprogressstep ~ .swal2-progressline {
|
||||||
|
background: #add8e6; }
|
||||||
|
.swal2-progresssteps .swal2-progressline {
|
||||||
|
background: #3085d6;
|
||||||
|
height: .4em;
|
||||||
|
margin: 0 -1px;
|
||||||
|
z-index: 10; }
|
||||||
|
|
||||||
|
[class^='swal2'] {
|
||||||
|
-webkit-tap-highlight-color: transparent; }
|
||||||
|
|
||||||
|
@-webkit-keyframes showSweetAlert {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: scale(0.7);
|
||||||
|
transform: scale(0.7); }
|
||||||
|
45% {
|
||||||
|
-webkit-transform: scale(1.05);
|
||||||
|
transform: scale(1.05); }
|
||||||
|
80% {
|
||||||
|
-webkit-transform: scale(0.95);
|
||||||
|
transform: scale(0.95); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1); } }
|
||||||
|
|
||||||
|
@keyframes showSweetAlert {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: scale(0.7);
|
||||||
|
transform: scale(0.7); }
|
||||||
|
45% {
|
||||||
|
-webkit-transform: scale(1.05);
|
||||||
|
transform: scale(1.05); }
|
||||||
|
80% {
|
||||||
|
-webkit-transform: scale(0.95);
|
||||||
|
transform: scale(0.95); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1); } }
|
||||||
|
|
||||||
|
@-webkit-keyframes hideSweetAlert {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1);
|
||||||
|
opacity: 1; }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(0.5);
|
||||||
|
transform: scale(0.5);
|
||||||
|
opacity: 0; } }
|
||||||
|
|
||||||
|
@keyframes hideSweetAlert {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1);
|
||||||
|
opacity: 1; }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(0.5);
|
||||||
|
transform: scale(0.5);
|
||||||
|
opacity: 0; } }
|
||||||
|
|
||||||
|
.swal2-show {
|
||||||
|
-webkit-animation: showSweetAlert 0.3s;
|
||||||
|
animation: showSweetAlert 0.3s; }
|
||||||
|
.swal2-show.swal2-noanimation {
|
||||||
|
-webkit-animation: none;
|
||||||
|
animation: none; }
|
||||||
|
|
||||||
|
.swal2-hide {
|
||||||
|
-webkit-animation: hideSweetAlert 0.15s forwards;
|
||||||
|
animation: hideSweetAlert 0.15s forwards; }
|
||||||
|
.swal2-hide.swal2-noanimation {
|
||||||
|
-webkit-animation: none;
|
||||||
|
animation: none; }
|
||||||
|
|
||||||
|
@-webkit-keyframes animate-success-tip {
|
||||||
|
0% {
|
||||||
|
width: 0;
|
||||||
|
left: 1px;
|
||||||
|
top: 19px; }
|
||||||
|
54% {
|
||||||
|
width: 0;
|
||||||
|
left: 1px;
|
||||||
|
top: 19px; }
|
||||||
|
70% {
|
||||||
|
width: 50px;
|
||||||
|
left: -8px;
|
||||||
|
top: 37px; }
|
||||||
|
84% {
|
||||||
|
width: 17px;
|
||||||
|
left: 21px;
|
||||||
|
top: 48px; }
|
||||||
|
100% {
|
||||||
|
width: 25px;
|
||||||
|
left: 14px;
|
||||||
|
top: 45px; } }
|
||||||
|
|
||||||
|
@keyframes animate-success-tip {
|
||||||
|
0% {
|
||||||
|
width: 0;
|
||||||
|
left: 1px;
|
||||||
|
top: 19px; }
|
||||||
|
54% {
|
||||||
|
width: 0;
|
||||||
|
left: 1px;
|
||||||
|
top: 19px; }
|
||||||
|
70% {
|
||||||
|
width: 50px;
|
||||||
|
left: -8px;
|
||||||
|
top: 37px; }
|
||||||
|
84% {
|
||||||
|
width: 17px;
|
||||||
|
left: 21px;
|
||||||
|
top: 48px; }
|
||||||
|
100% {
|
||||||
|
width: 25px;
|
||||||
|
left: 14px;
|
||||||
|
top: 45px; } }
|
||||||
|
|
||||||
|
@-webkit-keyframes animate-success-long {
|
||||||
|
0% {
|
||||||
|
width: 0;
|
||||||
|
right: 46px;
|
||||||
|
top: 54px; }
|
||||||
|
65% {
|
||||||
|
width: 0;
|
||||||
|
right: 46px;
|
||||||
|
top: 54px; }
|
||||||
|
84% {
|
||||||
|
width: 55px;
|
||||||
|
right: 0;
|
||||||
|
top: 35px; }
|
||||||
|
100% {
|
||||||
|
width: 47px;
|
||||||
|
right: 8px;
|
||||||
|
top: 38px; } }
|
||||||
|
|
||||||
|
@keyframes animate-success-long {
|
||||||
|
0% {
|
||||||
|
width: 0;
|
||||||
|
right: 46px;
|
||||||
|
top: 54px; }
|
||||||
|
65% {
|
||||||
|
width: 0;
|
||||||
|
right: 46px;
|
||||||
|
top: 54px; }
|
||||||
|
84% {
|
||||||
|
width: 55px;
|
||||||
|
right: 0;
|
||||||
|
top: 35px; }
|
||||||
|
100% {
|
||||||
|
width: 47px;
|
||||||
|
right: 8px;
|
||||||
|
top: 38px; } }
|
||||||
|
|
||||||
|
@-webkit-keyframes rotatePlaceholder {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg); }
|
||||||
|
5% {
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg); }
|
||||||
|
12% {
|
||||||
|
-webkit-transform: rotate(-405deg);
|
||||||
|
transform: rotate(-405deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(-405deg);
|
||||||
|
transform: rotate(-405deg); } }
|
||||||
|
|
||||||
|
@keyframes rotatePlaceholder {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg); }
|
||||||
|
5% {
|
||||||
|
-webkit-transform: rotate(-45deg);
|
||||||
|
transform: rotate(-45deg); }
|
||||||
|
12% {
|
||||||
|
-webkit-transform: rotate(-405deg);
|
||||||
|
transform: rotate(-405deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(-405deg);
|
||||||
|
transform: rotate(-405deg); } }
|
||||||
|
|
||||||
|
.swal2-animate-success-line-tip {
|
||||||
|
-webkit-animation: animate-success-tip 0.75s;
|
||||||
|
animation: animate-success-tip 0.75s; }
|
||||||
|
|
||||||
|
.swal2-animate-success-line-long {
|
||||||
|
-webkit-animation: animate-success-long 0.75s;
|
||||||
|
animation: animate-success-long 0.75s; }
|
||||||
|
|
||||||
|
.swal2-success.swal2-animate-success-icon .swal2-success-circular-line-right {
|
||||||
|
-webkit-animation: rotatePlaceholder 4.25s ease-in;
|
||||||
|
animation: rotatePlaceholder 4.25s ease-in; }
|
||||||
|
|
||||||
|
@-webkit-keyframes animate-error-icon {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotateX(100deg);
|
||||||
|
transform: rotateX(100deg);
|
||||||
|
opacity: 0; }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotateX(0deg);
|
||||||
|
transform: rotateX(0deg);
|
||||||
|
opacity: 1; } }
|
||||||
|
|
||||||
|
@keyframes animate-error-icon {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotateX(100deg);
|
||||||
|
transform: rotateX(100deg);
|
||||||
|
opacity: 0; }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotateX(0deg);
|
||||||
|
transform: rotateX(0deg);
|
||||||
|
opacity: 1; } }
|
||||||
|
|
||||||
|
.swal2-animate-error-icon {
|
||||||
|
-webkit-animation: animate-error-icon 0.5s;
|
||||||
|
animation: animate-error-icon 0.5s; }
|
||||||
|
|
||||||
|
@-webkit-keyframes animate-x-mark {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: scale(0.4);
|
||||||
|
transform: scale(0.4);
|
||||||
|
margin-top: 26px;
|
||||||
|
opacity: 0; }
|
||||||
|
50% {
|
||||||
|
-webkit-transform: scale(0.4);
|
||||||
|
transform: scale(0.4);
|
||||||
|
margin-top: 26px;
|
||||||
|
opacity: 0; }
|
||||||
|
80% {
|
||||||
|
-webkit-transform: scale(1.15);
|
||||||
|
transform: scale(1.15);
|
||||||
|
margin-top: -6px; }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1);
|
||||||
|
margin-top: 0;
|
||||||
|
opacity: 1; } }
|
||||||
|
|
||||||
|
@keyframes animate-x-mark {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: scale(0.4);
|
||||||
|
transform: scale(0.4);
|
||||||
|
margin-top: 26px;
|
||||||
|
opacity: 0; }
|
||||||
|
50% {
|
||||||
|
-webkit-transform: scale(0.4);
|
||||||
|
transform: scale(0.4);
|
||||||
|
margin-top: 26px;
|
||||||
|
opacity: 0; }
|
||||||
|
80% {
|
||||||
|
-webkit-transform: scale(1.15);
|
||||||
|
transform: scale(1.15);
|
||||||
|
margin-top: -6px; }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: scale(1);
|
||||||
|
transform: scale(1);
|
||||||
|
margin-top: 0;
|
||||||
|
opacity: 1; } }
|
||||||
|
|
||||||
|
.swal2-animate-x-mark {
|
||||||
|
-webkit-animation: animate-x-mark 0.5s;
|
||||||
|
animation: animate-x-mark 0.5s; }
|
||||||
|
|
||||||
|
@-webkit-keyframes rotate-loading {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg); } }
|
||||||
|
|
||||||
|
@keyframes rotate-loading {
|
||||||
|
0% {
|
||||||
|
-webkit-transform: rotate(0deg);
|
||||||
|
transform: rotate(0deg); }
|
||||||
|
100% {
|
||||||
|
-webkit-transform: rotate(360deg);
|
||||||
|
transform: rotate(360deg); } }
|
||||||
1
wp/wp-content/plugins/imagify/assets/css/sweetalert2.min.css
vendored
Normal file
315
wp/wp-content/plugins/imagify/assets/css/twentytwenty.css
Normal file
@@ -0,0 +1,315 @@
|
|||||||
|
/**
|
||||||
|
* Twentwenty image comparison
|
||||||
|
*/
|
||||||
|
.twentytwenty-handle {
|
||||||
|
z-index: 40;
|
||||||
|
position: absolute;
|
||||||
|
left: 50%;
|
||||||
|
top: 50%;
|
||||||
|
height: 64px;
|
||||||
|
width: 64px;
|
||||||
|
margin-left: -32px;
|
||||||
|
margin-top: -32px;
|
||||||
|
border-radius: 50%;
|
||||||
|
box-shadow: 0 3px 0 #338EA6;
|
||||||
|
background: #40B1D0;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.twentytwenty-horizontal .twentytwenty-handle:before,
|
||||||
|
.twentytwenty-horizontal .twentytwenty-handle:after {
|
||||||
|
left: 50%;
|
||||||
|
width: 2px;
|
||||||
|
height: 9999px;
|
||||||
|
margin-left: -1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-horizontal .twentytwenty-handle:before {
|
||||||
|
bottom: 50%;
|
||||||
|
margin-bottom: 32px;
|
||||||
|
box-shadow: 0 3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-horizontal .twentytwenty-handle:after {
|
||||||
|
top: 50%;
|
||||||
|
margin-top: 34px;
|
||||||
|
box-shadow: 0 -3px 0 white, 0px 0px 12px rgba(51, 51, 51, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-horizontal .twentytwenty-handle:before,
|
||||||
|
.twentytwenty-horizontal .twentytwenty-handle:after {
|
||||||
|
content: "";
|
||||||
|
position: absolute;
|
||||||
|
z-index: 30;
|
||||||
|
display: block;
|
||||||
|
background: #F2F5F7;
|
||||||
|
box-shadow: 0px 0px 12px rgba(51, 51, 51, 0.5);
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-labels,
|
||||||
|
.twentytwenty-overlay {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
-webkit-transition-duration: 0.5s;
|
||||||
|
transition-duration: 0.5s;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-labels {
|
||||||
|
opacity: 1;
|
||||||
|
-webkit-transition-property: opacity;
|
||||||
|
transition-property: opacity;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-labels .twentytwenty-label-content {
|
||||||
|
position: absolute;
|
||||||
|
padding: 0 12px;
|
||||||
|
font-size: 13px;
|
||||||
|
letter-spacing: 0.1em;
|
||||||
|
line-height: 38px;
|
||||||
|
color: white;
|
||||||
|
background: #1F2332;
|
||||||
|
border-radius: 2px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-horizontal .twentytwenty-labels .twentytwenty-label-content {
|
||||||
|
bottom: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-after-label .twentytwenty-label-content {
|
||||||
|
background: #40B1D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-left-arrow,
|
||||||
|
.twentytwenty-right-arrow {
|
||||||
|
position: absolute;
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
border: 8px inset transparent;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-left-arrow,
|
||||||
|
.twentytwenty-right-arrow {
|
||||||
|
top: 50%;
|
||||||
|
margin-top: -8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-container {
|
||||||
|
box-sizing: content-box;
|
||||||
|
position: relative;
|
||||||
|
z-index: 0;
|
||||||
|
overflow: hidden;
|
||||||
|
box-shadow: 0 5px 10px rgba(0, 0, 0, 0.15);
|
||||||
|
opacity: 0;
|
||||||
|
-webkit-transition: opacity 0.4s;
|
||||||
|
transition: opacity 0.4s;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-moz-user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-container * {
|
||||||
|
box-sizing: content-box;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-container img {
|
||||||
|
position: absolute;
|
||||||
|
top: 0;
|
||||||
|
display: block;
|
||||||
|
width: 100%;
|
||||||
|
height: auto;
|
||||||
|
}
|
||||||
|
|
||||||
|
.loaded .twentytwenty-container {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-container.active .twentytwenty-overlay .twentytwenty-labels,
|
||||||
|
.twentytwenty-container.active .twentytwenty-overlay:hover .twentytwenty-labels {
|
||||||
|
opacity: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-horizontal .twentytwenty-before-label .twentytwenty-label-content {
|
||||||
|
left: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-horizontal .twentytwenty-after-label .twentytwenty-label-content {
|
||||||
|
right: 15px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-overlay {
|
||||||
|
z-index: 25;
|
||||||
|
}
|
||||||
|
.twentytwenty-before {
|
||||||
|
z-index: 20;
|
||||||
|
}
|
||||||
|
.twentytwenty-after {
|
||||||
|
z-index: 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Buttons for image choices */
|
||||||
|
.twentytwenty-duo-buttons {
|
||||||
|
position: absolute;
|
||||||
|
top: 10px;
|
||||||
|
z-index: 30;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-duo-buttons button {
|
||||||
|
float: left;
|
||||||
|
padding: 2px 6px;
|
||||||
|
font-size: 11px;
|
||||||
|
text-transform: uppercase;
|
||||||
|
letter-spacing: 0.125em;
|
||||||
|
font-weight: bold;
|
||||||
|
border: 0;
|
||||||
|
background: #1f2332;
|
||||||
|
color: #FFF;
|
||||||
|
transition: all .3s;
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-duo-buttons button:hover,
|
||||||
|
.twentytwenty-duo-buttons button:focus {
|
||||||
|
background: #444;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-duo-buttons button:first-child {
|
||||||
|
border-radius: 3px 0 0 3px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-duo-buttons button:last-child {
|
||||||
|
border-radius: 0 3px 3px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-duo-buttons button.selected {
|
||||||
|
background: #8bc34a;
|
||||||
|
text-shadow: 0 0 1px rgba(0,0,0,.2);
|
||||||
|
cursor: default;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-duo-left {
|
||||||
|
left: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-duo-right {
|
||||||
|
right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-left-arrow {
|
||||||
|
left: 50%;
|
||||||
|
margin-left: -22px;
|
||||||
|
border-right: 8px solid white;
|
||||||
|
}
|
||||||
|
|
||||||
|
.twentytwenty-right-arrow {
|
||||||
|
right: 50%;
|
||||||
|
margin-right: -22px;
|
||||||
|
border-left: 8px solid white;
|
||||||
|
}
|
||||||
|
|
||||||
|
#imagify-visual-comparison .close-btn,
|
||||||
|
.imagify-visual-comparison .close-btn {
|
||||||
|
top: 50px;
|
||||||
|
right: 5px;
|
||||||
|
width: 33px;
|
||||||
|
height: 33px;
|
||||||
|
padding: 1px 0 0 2px;
|
||||||
|
border: 1px solid #F2F2F2;
|
||||||
|
color: #F2F2F2;
|
||||||
|
line-height: 19px;
|
||||||
|
text-align: center;
|
||||||
|
border-radius: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-modal .imagify-comparison-title {
|
||||||
|
font-size: 28px;
|
||||||
|
margin-bottom: 1em;
|
||||||
|
color: #F2F2F2;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.imagify-modal .imagify-comparison-title .twentytwenty-duo-buttons {
|
||||||
|
position: static;
|
||||||
|
margin: 0 10px 0 15px;
|
||||||
|
}
|
||||||
|
.imagify-comparison-title .twentytwenty-duo-buttons button {
|
||||||
|
float: none;
|
||||||
|
padding: 6px 12px;
|
||||||
|
font-size: 16px;
|
||||||
|
text-transform: none;
|
||||||
|
border: 1px solid #40B1D0;
|
||||||
|
color: #888899;
|
||||||
|
letter-spacing: 0;
|
||||||
|
}
|
||||||
|
.imagify-comparison-title .twentytwenty-duo-buttons button:focus {
|
||||||
|
outline: none;
|
||||||
|
box-shadow: none;
|
||||||
|
}
|
||||||
|
.imagify-comparison-title .twentytwenty-duo-buttons .selected {
|
||||||
|
border: 1px solid #40B1D0;
|
||||||
|
color: #FFF;
|
||||||
|
background: #40B1D0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.imagify-comparison-levels {
|
||||||
|
margin: 15px 0;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.imagify-comparison-levels .imagify-c-level {
|
||||||
|
display: none;
|
||||||
|
min-width: 175px;
|
||||||
|
font-size: 11px;
|
||||||
|
}
|
||||||
|
.imagify-c-level.go-left {
|
||||||
|
float: left;
|
||||||
|
}
|
||||||
|
.imagify-c-level.go-right {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.imagify-c-level.go-right,
|
||||||
|
.imagify-c-level.go-left {
|
||||||
|
display: table;
|
||||||
|
}
|
||||||
|
.imagify-c-level .imagify-c-level-row {
|
||||||
|
display: table-row;
|
||||||
|
margin: 0;
|
||||||
|
color: #FFF;
|
||||||
|
}
|
||||||
|
.imagify-c-level-row > span {
|
||||||
|
display: table-cell;
|
||||||
|
padding: 2px 0;
|
||||||
|
}
|
||||||
|
.imagify-c-level-row .value {
|
||||||
|
text-align: right;
|
||||||
|
padding-left: 5px;
|
||||||
|
}
|
||||||
|
.imagify-c-level-row .value.level {
|
||||||
|
color: #40b1d0;
|
||||||
|
}
|
||||||
|
.imagify-c-level-row .value.size {
|
||||||
|
color: #8bc34a;
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* TT Loader */
|
||||||
|
.imagify-modal .loader {
|
||||||
|
position: absolute;
|
||||||
|
top: 50%;
|
||||||
|
left: 50%;
|
||||||
|
margin: -32px 0 0 -32px;
|
||||||
|
opacity: 0;
|
||||||
|
visibility: hidden;
|
||||||
|
transition: opacity .4s;
|
||||||
|
}
|
||||||
|
.imagify-modal .loading .loader {
|
||||||
|
visibility: visible;
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Specifics for too high modals */
|
||||||
|
.modal-is-too-high .imagify-comparison-levels {
|
||||||
|
position: absolute;
|
||||||
|
padding: 15px 20px;
|
||||||
|
background: rgba(31, 35, 50, 0.95);
|
||||||
|
bottom: 0; left: 0; right: 0;
|
||||||
|
margin-bottom: 0;
|
||||||
|
}
|
||||||
1
wp/wp-content/plugins/imagify/assets/css/twentytwenty.min.css
vendored
Normal file
BIN
wp/wp-content/plugins/imagify/assets/images/big-blue-check.png
Normal file
|
After Width: | Height: | Size: 2.9 KiB |
1
wp/wp-content/plugins/imagify/assets/images/bulk.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg viewBox="0 0 38 36" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m233.09 177.21l-5.52 10.248c-.08.145-.018.272-.023.388-.074.193-.033.4-.033.619v21.615c0 .952.601 1.429 1.552 1.429h33.897c.952 0 1.962-.478 1.962-1.429v-21.615c0-.487-.323-.925-.649-1.24l-5.623-9.976c-.405-.726-1.202-1.179-2.034-1.182l-21.486-.068c-.849 0-1.64.464-2.043 1.211m30.424 32.869c0 .173-.378.018-.551.018h-33.897c-.172 0-.14.155-.14-.018v-21.576l33.961-.281c.066.008.186.09.263.128.054.027.205.049.258.073.002.014.106.027.106.041v21.615m-6.153-32.11l4.91 8.835h-14.992v-9.354l9.306.045c.322.001.619.192.776.474m-11.494-.523v9.358h-16.306l4.773-8.892c.155-.289.456-.484.787-.484l10.746.018m7.06 17.12c0 .39-.316.706-.706.706h-12.706c-.39 0-.706-.316-.706-.706 0-.39.316-.706.706-.706h12.706c.39 0 .706.316.706.706" transform="translate(-227-176)" fill="#7a8996"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 888 B |
1
wp/wp-content/plugins/imagify/assets/images/check-1.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" width="15px" height="16px" viewBox="0 0 15 16" enable-background="new 0 0 15 16"><path d="m13.8 1c-.5-.3-1.1-.1-1.4.4l-6.4 11.1-3.6-3.3c-.4-.4-1-.4-1.4 0-.4.4-.4 1 0 1.4l4.6 4.2c.4.4 1 .4 1.4 0 .1-.1 7.2-12.4 7.2-12.4.2-.5.1-1.1-.4-1.4" fill="#8ba6b3"/></svg>
|
||||||
|
After Width: | Height: | Size: 299 B |
@@ -0,0 +1,9 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
width="8px" height="8px" viewBox="0 0 8 8" style="enable-background:new 0 0 8 8;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#8BA6B3;}
|
||||||
|
</style>
|
||||||
|
<path class="st0" d="M7.5,0.1C7.3,0,6.9,0.1,6.8,0.3L3.2,6.5l-2-1.9C1,4.4,0.6,4.4,0.4,4.6s-0.2,0.6,0,0.8L3,7.8
|
||||||
|
C3.2,8,3.6,8,3.8,7.8c0.1-0.1,4-7,4-7C7.9,0.6,7.8,0.3,7.5,0.1"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 508 B |
14
wp/wp-content/plugins/imagify/assets/images/check-mini.svg
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg width="8px" height="8px" viewBox="0 0 8 8" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
|
||||||
|
<!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Path</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
|
||||||
|
<g id="Imagify-Settings-Page" sketch:type="MSArtboardGroup" transform="translate(-409.000000, -548.000000)" fill="#8BA6B4">
|
||||||
|
<g id="checkboxes" sketch:type="MSLayerGroup" transform="translate(403.000000, 347.000000)">
|
||||||
|
<path d="M13.3901875,201.101875 C13.12075,200.944375 12.7770625,201.04 12.6218125,201.304375 L9.024625,207.536875 L7.012,205.680625 C6.799375,205.455625 6.4433125,205.444375 6.216625,205.658125 C5.9899375,205.86625 5.978125,206.22625 6.19075,206.45125 L8.7625,208.825 C8.9745625,209.05 9.330625,209.06125 9.5573125,208.8475 C9.6259375,208.785625 13.5960625,201.866875 13.5960625,201.866875 C13.7513125,201.6025 13.6590625,201.25375 13.3901875,201.101875 L13.3901875,201.101875 Z" id="Path" sketch:type="MSShapeGroup"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
14
wp/wp-content/plugins/imagify/assets/images/check.svg
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg width="15px" height="16px" viewBox="0 0 15 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
|
||||||
|
<!-- Generator: Sketch 3.3.2 (12043) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Path</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
|
||||||
|
<g id="Imagify-Settings-Page" sketch:type="MSArtboardGroup" transform="translate(-411.000000, -355.000000)" fill="#8BA6B4">
|
||||||
|
<g id="checkboxes" sketch:type="MSLayerGroup" transform="translate(403.000000, 347.000000)">
|
||||||
|
<path d="M22.027,9.07 C21.548,8.79 20.937,8.96 20.661,9.43 L14.266,20.51 L10.688,17.21 C10.31,16.81 9.677,16.79 9.274,17.17 C8.871,17.54 8.85,18.18 9.228,18.58 L13.8,22.8 C14.177,23.2 14.81,23.22 15.213,22.84 C15.335,22.73 22.393,10.43 22.393,10.43 C22.669,9.96 22.505,9.34 22.027,9.07 L22.027,9.07 Z" id="Path" sketch:type="MSShapeGroup"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
22
wp/wp-content/plugins/imagify/assets/images/cloudy-sun.svg
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<!-- Generator: Adobe Illustrator 19.1.0, SVG Export Plug-In . SVG Version: 6.00 Build 0) -->
|
||||||
|
<svg version="1.1" id="Calque_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
|
||||||
|
viewBox="0 0 74 63.3" style="enable-background:new 0 0 74 63.3;" xml:space="preserve">
|
||||||
|
<style type="text/css">
|
||||||
|
.st0{fill:#F5A623;}
|
||||||
|
</style>
|
||||||
|
<g>
|
||||||
|
<circle class="st0" cx="41.9" cy="11.5" r="1.2"/>
|
||||||
|
<circle class="st0" cx="27.7" cy="5.7" r="1.2"/>
|
||||||
|
<circle class="st0" cx="7.1" cy="26.3" r="1.2"/>
|
||||||
|
<circle class="st0" cx="13.3" cy="11.7" r="1.2"/>
|
||||||
|
</g>
|
||||||
|
<path class="st0" d="M45.8,16.1c-1.9,0-3.7,0.2-5.5,0.7c-2.9-3.8-7.5-6.3-12.7-6.3c-8.8,0-15.9,7.1-15.9,15.9c0,2.6,0.6,5.1,1.8,7.2
|
||||||
|
c-1.6,0.7-3,1.7-4.3,3c-5.9,5.9-6,15.4-0.2,21.2c2.3,2.3,5.3,2.9,7.6,3.1c0.5,0.1,12.1,0.3,20.9,0.3c1.6,0,3,0,4.3,0
|
||||||
|
c1.2,0,2.3,0,3.2,0c1.9,0,3.2-0.1,4.3-0.3c0,0,0,0,0,0c0,0,0,0,0,0C60,58.8,68.1,49.3,68.1,38.9C68.1,26.3,58.1,16.1,45.8,16.1z
|
||||||
|
M13.7,26.4c0-7.7,6.2-13.9,13.9-13.9c4.3,0,8.1,2,10.6,5c-6.7,2.5-12.1,8.1-14.2,15.2c-2.9-0.8-5.9-0.7-8.8,0.2
|
||||||
|
C14.3,31,13.7,28.8,13.7,26.4z M48.9,59.2C48.9,59.2,48.9,59.2,48.9,59.2c-1.3,0.3-3.7,0.2-7,0.2c-1.3,0-2.8,0-4.4,0
|
||||||
|
c-9.3,0-20.1-0.3-20.6-0.3c-2.2-0.2-4.6-0.7-6.4-2.6c-5-5-4.9-13.3,0.2-18.4c3.6-3.6,9-4.9,13.7-3.2c0.5,0.2,1.1-0.1,1.3-0.6
|
||||||
|
c0-0.1,0-0.1,0-0.2c0.1-0.1,0.2-0.2,0.2-0.4c2.4-9,10.8-15.6,19.9-15.6c11.2,0,20.2,9.3,20.2,20.8C66.1,48.3,58.7,57.1,48.9,59.2z"
|
||||||
|
/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.5 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg viewBox="0 0 18 18" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m203.25 10h-16.5c-.415 0-.75.336-.75.75v16.5c0 .414.336.75.75.75h8.812v-6.75h-2.25v-2.813h2.25v-2.25c0-2.325 1.472-3.469 3.546-3.469.993 0 1.847.074 2.096.107v2.43h-1.438c-1.128 0-1.391.536-1.391 1.322v1.859h2.813l-.563 2.813h-2.25l.045 6.75h4.83c.414 0 .75-.336.75-.75v-16.5c0-.414-.336-.75-.75-.75" transform="translate(-186-10)" fill="#fff"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 459 B |
1
wp/wp-content/plugins/imagify/assets/images/gear.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg viewBox="0 0 49 48" xmlns="http://www.w3.org/2000/svg"><g fill="#7a8996" fill-rule="evenodd" transform="translate(.868)"><path d="m3 29.25h2.875c.647 0 1.22.413 1.424 1.027l.547 1.64c.182.543.043 1.132-.361 1.537l-1.925 1.924c-.567.567-.88 1.321-.88 2.123 0 .802.313 1.556.88 2.123l2.815 2.816c.567.567 1.321.88 2.123.88.802 0 1.556-.313 2.123-.88l1.924-1.924c.399-.398 1-.54 1.536-.362l1.641.547c.614.205 1.027.777 1.027 1.424v2.876c0 1.655 1.346 3 3 3h4.497c1.655 0 3-1.346 3-3v-2.876c0-.647.413-1.219 1.027-1.424l1.641-.547c.535-.178 1.138-.036 1.536.362l1.924 1.924c.567.567 1.321.88 2.123.88.802 0 1.556-.313 2.123-.88l2.816-2.816c.567-.567.88-1.321.88-2.123 0-.802-.313-1.556-.88-2.123l-1.924-1.924c-.405-.405-.544-.994-.362-1.537l.546-1.64c.205-.614.778-1.027 1.425-1.027h2.876c1.655 0 3-1.346 3-3v-4.497c0-1.655-1.346-3-3-3h-2.876c-.647 0-1.22-.413-1.424-1.027l-.547-1.64c-.181-.543-.043-1.132.362-1.537l1.924-1.924c.567-.567.88-1.321.88-2.123 0-.802-.313-1.556-.88-2.123l-2.816-2.815c-.567-.567-1.321-.88-2.123-.88-.802 0-1.556.313-2.123.88l-1.924 1.924c-.398.399-1 .541-1.536.362l-1.641-.547c-.614-.205-1.027-.777-1.027-1.424v-2.875c0-1.655-1.346-3-3-3h-4.497c-1.655 0-3 1.346-3 3v2.875c0 .647-.413 1.22-1.027 1.424l-1.641.547c-.533.179-1.137.037-1.536-.362l-1.924-1.924c-.567-.567-1.321-.88-2.123-.88-.802 0-1.556.313-2.123.88l-2.815 2.815c-.567.567-.88 1.321-.88 2.123 0 .802.313 1.556.88 2.123l1.925 1.924c.404.405.543.994.361 1.537l-.546 1.64c-.205.614-.778 1.027-1.425 1.027h-2.875c-1.655 0-3 1.346-3 3v4.497c0 1.655 1.346 3 3 3m-1.502-7.499c0-.828.674-1.502 1.502-1.502h2.875c1.294 0 2.438-.825 2.849-2.053l.546-1.64c.361-1.085.084-2.262-.724-3.071l-1.925-1.924c-.283-.284-.44-.661-.44-1.062 0-.401.157-.778.44-1.062l2.816-2.816c.567-.567 1.557-.567 2.124 0l1.924 1.924c.796.796 2 1.082 3.071.725l1.641-.547c1.227-.409 2.052-1.553 2.052-2.848v-2.875c0-.828.674-1.502 1.502-1.502h4.497c.827 0 1.502.674 1.502 1.502v2.875c0 1.295.825 2.438 2.052 2.848l1.641.547c1.067.356 2.276.071 3.071-.725l1.924-1.924c.567-.567 1.557-.567 2.124 0l2.816 2.816c.284.284.44.661.44 1.062 0 .401-.157.778-.44 1.062l-1.924 1.924c-.809.809-1.087 1.986-.725 3.071l.547 1.641c.41 1.227 1.554 2.052 2.848 2.052h2.876c.828 0 1.502.674 1.502 1.502v4.497c0 .828-.673 1.502-1.502 1.502h-2.876c-1.294 0-2.438.825-2.848 2.053l-.546 1.64c-.361 1.085-.084 2.262.725 3.071l1.924 1.924c.284.284.44.661.44 1.062 0 .401-.157.778-.44 1.062l-2.816 2.816c-.567.567-1.557.567-2.124 0l-1.924-1.924c-.795-.796-2-1.081-3.071-.725l-1.641.547c-1.227.41-2.052 1.553-2.052 2.848v2.876c0 .828-.674 1.502-1.502 1.502h-4.497c-.828 0-1.502-.673-1.502-1.502v-2.876c0-1.294-.825-2.438-2.052-2.848l-1.641-.547c-.307-.102-.626-.154-.949-.154-.802 0-1.556.312-2.123.879l-1.924 1.924c-.567.567-1.557.567-2.124 0l-2.816-2.816c-.283-.284-.44-.661-.44-1.062 0-.401.157-.778.44-1.062l1.925-1.924c.808-.809 1.086-1.986.724-3.071l-.547-1.641c-.409-1.227-1.554-2.052-2.848-2.052h-2.875c-.827 0-1.502-.674-1.502-1.502v-4.497"/><path d="m24 29.25c.396 0 .797-.044 1.192-.132 1.951-.433 3.493-1.974 3.925-3.926.354-1.595-.019-3.226-1.021-4.475-1.251-1.558-3.293-2.279-5.289-1.834-1.951.433-3.493 1.974-3.925 3.926-.354 1.595.019 3.225 1.021 4.474 1 1.25 2.496 1.967 4.096 1.967m-3.653-6.117c.302-1.364 1.422-2.484 2.786-2.787.289-.063.581-.096.867-.096 1.144 0 2.209.512 2.927 1.405.716.893.982 2.064.727 3.212-.302 1.364-1.422 2.484-2.786 2.787-.289.063-.58.096-.866.096-1.144 0-2.21-.512-2.927-1.406-.716-.893-.982-2.064-.727-3.212"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 3.4 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg width="36" height="33" viewBox="0 0 36 33" xmlns="http://www.w3.org/2000/svg"><g fill="#40b1d0" fill-rule="nonzero"><path d="m35.38 26.295c0-.002 0-.002 0 0l-13.501-23.787c-.8-1.41-2.247-2.252-3.873-2.252-1.625 0-3.071.843-3.872 2.252l-13.5 23.786c-.791 1.393-.78 3.051.027 4.437.807 1.386 2.246 2.214 3.846 2.214l27 0c1.6 0 3.038-.828 3.844-2.212.807-1.386.818-3.045.029-4.437m-1.325 3.681c-.534.919-1.488 1.469-2.548 1.469l-27 0c-1.062 0-2.01-.549-2.55-1.469-.534-.919-.541-2.02-.018-2.941l13.5-23.787c.529-.934 1.489-1.493 2.566-1.493 1.078 0 2.038.558 2.568 1.493l13.502 23.786c.523.924.516 2.025-.02 2.943"/><path d="m18.01 9.459c-.414 0-.75.336-.75.75l0 10.772c0 .414.336.75.75.75.414 0 .75-.336.75-.75l0-10.772c0-.414-.336-.75-.75-.75"/><path d="m18.01 24.933c-.414 0-.75.336-.75.75l0 .373c0 .414.336.75.75.75.414 0 .75-.336.75-.75l0-.373c0-.416-.336-.75-.75-.75"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 887 B |
|
After Width: | Height: | Size: 401 B |
@@ -0,0 +1,12 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg width="29px" height="30px" viewBox="0 0 29 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Shape</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Bulk-Optimize" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||||
|
<g id="Bulk-Optimize-Free-Account-Popup-0-Pricing-One-Time" transform="translate(-770.000000, -526.000000)" fill="#1F2332">
|
||||||
|
<path d="M802.296271,541.590991 L799.162499,532.943366 C798.845155,532.07067 797.893123,531.634322 797.020427,531.951666 C796.147731,532.26901 795.711383,533.221042 796.028727,534.093738 L797.774119,538.933235 C793.608979,536.156474 788.650479,534.64909 783.572975,534.64909 C777.70211,534.64909 772.188258,536.553154 767.626438,540.162943 C766.912414,540.718295 766.79341,541.789331 767.348762,542.503355 C767.904114,543.217379 768.97515,543.336383 769.689174,542.781031 C773.695642,539.647259 778.49547,537.981203 783.612643,537.981203 C788.214131,537.981203 792.696615,539.409251 796.465075,541.987671 L791.585911,543.772731 C790.713215,544.090075 790.276867,545.042107 790.594211,545.914803 C790.832219,546.589159 791.466907,547.025507 792.141263,547.025507 C792.339603,547.025507 792.537943,546.985839 792.696615,546.906503 L801.344239,543.772731 L801.344239,543.772731 C802.177267,543.415719 802.613615,542.463687 802.296271,541.590991 L802.296271,541.590991 Z" id="Shape" transform="translate(784.700047, 539.436891) scale(-1, 1) rotate(-310.000000) translate(-784.700047, -539.436891) "></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg width="36" height="47" viewBox="0 0 36 47" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" transform="translate(-594-569)"><path d="m13.304 31.3l-7.826 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l7.826 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m0-4.696l-7.826 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l7.826 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m0 9.391l-7.826 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l7.826 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m0 4.696l-7.826 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l7.826 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m-8.609-22.696c0 .432.351.783.783.783l25.04 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783l-25.04 0c-.432 0-.783.351-.783.783m30.522-18l-21.913 0c-.105 0-.207.022-.302.061-.045.019-.08.053-.121.08-.044.03-.094.05-.131.088l-12.522 12.522c-.036.036-.056.085-.085.127-.028.042-.064.078-.083.125-.039.095-.061.197-.061.302l0 32.87c0 .432.351.783.783.783l34.435 0c.432 0 .783-.351.783-.783l0-45.39c0-.432-.351-.783-.783-.783m-22.696 2.672l0 9.85-9.85 0 9.85-9.85m21.913 42.719l-32.87 0 0-31.3 11.739 0c.432 0 .783-.351.783-.783l0-11.739 20.348 0 0 43.826m-3.913-23.478l-25.04 0c-.432 0-.783.351-.783.783 0 .432.351.783.783.783l25.04 0c.432 0 .783-.351.783-.783 0-.432-.351-.783-.783-.783m0 4.696l-14.09 0c-.432 0-.783.351-.783.783l0 14.09c0 .011.006.019.006.03.003.063.019.121.036.182.011.039.017.08.034.116.022.047.056.086.086.128.03.041.056.083.094.117.009.009.014.02.023.03.03.025.066.033.097.052.045.028.091.058.142.077.05.017.1.023.152.031.038.003.072.02.111.02l14.09 0c.161 0 .302-.059.426-.144.014-.009.03-.005.044-.014.014-.011.02-.025.033-.036.044-.038.08-.081.114-.128.028-.038.055-.072.075-.111.022-.044.034-.091.049-.141.014-.052.028-.102.031-.155.002-.019.011-.033.011-.052l0-14.09c0-.434-.351-.784-.783-.784m-12.417 14.09l2.446-2.936 2.576 1.288c.34.171.75.072.977-.23l1.722-2.295 3.13 4.173-10.852 0m11.634-1.567l-3.287-4.383c-.296-.394-.958-.394-1.252 0l-1.957 2.608-2.547-1.273c-.327-.164-.72-.08-.952.199l-2.528 3.033 0-11.14 12.522 0 0 10.955m-9.391-6.259c.862 0 1.565-.703 1.565-1.565 0-.862-.703-1.565-1.565-1.565-.862 0-1.565.703-1.565 1.565 0 .862.703 1.565 1.565 1.565" transform="translate(594 569)" fill="#40b1d0" fill-rule="nonzero"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 2.3 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg width="16" height="16" viewBox="0 0 16 16" xmlns="http://www.w3.org/2000/svg"><g fill="#000" fill-rule="nonzero" transform="translate(1 1)" stroke="#fff"><polygon points="8.75 0 8.75 0.7 12.8065 0.7 5.0015 8.5015 5.4985 8.9985 13.3 1.1935 13.3 5.25 14 5.25 14 0"/><polygon points="11.9 13.3 0.7 13.3 0.7 2.1 6.3 2.1 6.3 1.4 0 1.4 0 14 12.6 14 12.6 7.7 11.9 7.7"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 378 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg width="12" height="12" viewBox="0 0 12 12" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g fill="#40b1d0" fill-rule="evenodd">
|
||||||
|
<polygon points="11.6054688 11.6054688 8.7890625 11.6054688 8.7890625 0.39453125 11.6054688 0.39453125"/>
|
||||||
|
<polygon points="7.39453125 11.6054688 4.60546875 11.6054688 4.60546875 3.89453125 7.39453125 3.89453125"/>
|
||||||
|
<polygon points="3.2109375 11.6054688 0.39453125 11.6054688 0.39453125 6 3.2109375 6"/>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 444 B |
@@ -0,0 +1 @@
|
|||||||
|
<svg width="27" height="28" viewBox="0 0 27 28" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd"><path d="m13.3.254c-.773 0-1.4.627-1.4 1.4l0 4.2c0 .773.627 1.4 1.4 1.4.773 0 1.4-.627 1.4-1.4l0-4.2c0-.773-.627-1.4-1.4-1.4m-8.422 3.478c-.358 0-.711.142-.984.416-.547.547-.547 1.444 0 1.991l2.975 2.953c.547.547 1.422.547 1.969 0 .547-.547.547-1.422 0-1.969l-2.953-2.975c-.273-.273-.648-.416-1.01-.416m16.844 0c-.358 0-.733.142-1.01.416l-2.953 2.975c-.547.547-.547 1.422 0 1.969.547.547 1.422.547 1.969 0l2.975-2.953c.547-.547.547-1.444 0-1.991-.273-.273-.626-.416-.984-.416m-20.322 8.422c-.773 0-1.4.627-1.4 1.4 0 .773.627 1.4 1.4 1.4l4.2 0c.773 0 1.4-.627 1.4-1.4 0-.773-.627-1.4-1.4-1.4l-4.2 0m19.6 0c-.773 0-1.4.627-1.4 1.4 0 .773.627 1.4 1.4 1.4l4.2 0c.773 0 1.4-.627 1.4-1.4 0-.773-.627-1.4-1.4-1.4l-4.2 0m-13.147 5.447c-.358 0-.711.142-.984.416l-2.975 2.953c-.547.547-.547 1.444 0 1.991.547.547 1.444.547 1.991 0l2.953-2.975c.547-.547.547-1.422 0-1.969-.273-.273-.626-.416-.984-.416m10.894 0c-.358 0-.711.142-.984.416-.547.547-.547 1.422 0 1.969l2.953 2.975c.547.547 1.444.547 1.991 0 .547-.547.547-1.444 0-1.991l-2.975-2.953c-.273-.273-.626-.416-.984-.416m-5.447 2.253c-.773 0-1.4.627-1.4 1.4l0 4.2c0 .773.627 1.4 1.4 1.4.773 0 1.4-.627 1.4-1.4l0-4.2c0-.773-.627-1.4-1.4-1.4" fill="#40b1d0" fill-rule="nonzero"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
BIN
wp/wp-content/plugins/imagify/assets/images/icon-lock.png
Normal file
|
After Width: | Height: | Size: 262 B |
@@ -0,0 +1,2 @@
|
|||||||
|
<svg height="19" viewBox="0 0 448 512" width="16" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="m400 224h-24v-72c0-83.8-68.2-152-152-152s-152 68.2-152 152v72h-24c-26.5 0-48 21.5-48 48v192c0 26.5 21.5 48 48 48h352c26.5 0 48-21.5 48-48v-192c0-26.5-21.5-48-48-48zm-104 0h-144v-72c0-39.7 32.3-72 72-72s72 32.3 72 72z" fill="#8bc34a" fill-rule="evenodd"/></svg>
|
||||||
|
After Width: | Height: | Size: 355 B |
BIN
wp/wp-content/plugins/imagify/assets/images/icon-pack.png
Normal file
|
After Width: | Height: | Size: 438 B |
16
wp/wp-content/plugins/imagify/assets/images/icon-pack.svg
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg width="75px" height="54px" viewBox="0 0 75 54" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||||
|
<!-- Generator: Sketch 3.6.1 (26313) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>Shape</title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Bulk-Optimize" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" opacity="0.15">
|
||||||
|
<g id="Bulk-Optimize-Free-Account-Popup-0-Pricing-One-Time" transform="translate(-602.000000, -556.000000)" fill="#FFFFFF">
|
||||||
|
<g id="Group-16" transform="translate(541.000000, 544.000000)">
|
||||||
|
<g id="Shape">
|
||||||
|
<path d="M135.847615,65.4118845 L135.847615,30.0205479 L98.4782609,12.3256648 L61.1089067,30.0205479 L61.1089067,65.4110993 L98.4782609,83.1067676 L135.847615,65.4118845 L135.847615,65.4118845 Z M98.4782609,45.4491918 L68.2896132,31.1544527 L80.9908469,25.1402027 L111.180452,39.4349418 L98.4782609,45.4491918 L98.4782609,45.4491918 Z M100.87183,77.4403845 L100.87183,48.8493358 L113.573063,42.8350858 L113.573063,48.4205878 L118.360201,46.1535635 L118.360201,40.5680614 L131.061435,34.5538114 L131.061435,63.1440749 L100.87183,77.4403845 L100.87183,77.4403845 Z M128.666909,31.1544527 L115.965675,37.1687027 L85.7770272,22.8731783 L98.4782609,16.8589283 L128.666909,31.1544527 L128.666909,31.1544527 Z M65.8960444,34.5545967 L96.084692,48.8493358 L96.084692,77.4395993 L65.8960444,63.1448602 L65.8960444,34.5545967 L65.8960444,34.5545967 Z"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<svg width="36" height="36" viewBox="0 0 36 36" xmlns="http://www.w3.org/2000/svg"><g fill="#40b1d0" fill-rule="nonzero"><path d="m18 36c-9.925 0-18-8.07-18-18 0-9.925 8.07-18 18-18 9.925 0 18 8.07 18 18 0 9.925-8.07 18-18 18m0-34.435c-9.06 0-16.435 7.372-16.435 16.435 0 9.06 7.372 16.435 16.435 16.435 9.06 0 16.435-7.372 16.435-16.435 0-9.06-7.372-16.435-16.435-16.435"/><path d="m27.391 18.783l-9.391 0c-.432 0-.783-.351-.783-.783l0-12.522c0-.432.351-.783.783-.783.432 0 .783.351.783.783l0 11.739 8.609 0c.432 0 .783.351.783.783 0 .432-.351.783-.783.783"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 570 B |
BIN
wp/wp-content/plugins/imagify/assets/images/imagify-logo.png
Normal file
|
After Width: | Height: | Size: 3.1 KiB |
|
After Width: | Height: | Size: 25 KiB |
|
After Width: | Height: | Size: 23 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 24 KiB |
|
After Width: | Height: | Size: 25 KiB |
32
wp/wp-content/plugins/imagify/assets/images/imagify.svg
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
|
||||||
|
<svg width="256px" height="256px" viewBox="0 0 256 256" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" xmlns:sketch="http://www.bohemiancoding.com/sketch/ns">
|
||||||
|
<!-- Generator: Sketch 3.4.4 (17249) - http://www.bohemiancoding.com/sketch -->
|
||||||
|
<title>WordPress Plugin </title>
|
||||||
|
<desc>Created with Sketch.</desc>
|
||||||
|
<defs></defs>
|
||||||
|
<g id="Marketing-stuff" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" sketch:type="MSPage">
|
||||||
|
<g id="WordPress-Plugin-" sketch:type="MSArtboardGroup">
|
||||||
|
<g id="Group-+-Group" sketch:type="MSLayerGroup" transform="translate(-1.000000, 0.000000)">
|
||||||
|
<g id="Group" transform="translate(0.626812, 0.000000)" sketch:type="MSShapeGroup">
|
||||||
|
<rect id="Rectangle-7" fill="#2E3243" x="0.373188406" y="0" width="256" height="256"></rect>
|
||||||
|
<path d="M81.9742306,158.483219 L54.1635666,109.918063 L64.2449323,103.97844 L61.2900493,96.6412582 L43.3869343,106.948252 L79.0193476,169.139602 L106.830012,153.06768 C107.003828,150.272563 107.351462,147.477446 107.699095,144.68233 L101.094062,147.302752 L81.9742306,158.483219 L81.9742306,158.483219 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<path d="M70.6761484,87.033044 L79.0193476,83.8885375 L77.1073644,76.3766609 L60.7685993,82.6656738 L85.798197,148.875005 L108.741995,140.140265 C109.611078,136.821063 111.001611,133.501862 112.565961,130.357356 L90.3174299,138.917401 L70.6761484,87.033044 L70.6761484,87.033044 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<path d="M114.477944,64.6721089 L103.179862,112.189096 L137.943192,105.026609 C140.028992,103.97844 142.114792,103.104966 144.374408,102.406187 C146.981658,101.532713 149.588908,100.833934 152.196157,100.309849 C155.324857,99.7857647 158.627373,99.4363751 161.92989,99.4363751 L162.103706,99.4363751 L164.710956,99.4363751 L172.185072,97.8641219 L150.284174,78.2983037 L141.593342,89.1293816 L114.477944,64.6721089 L114.477944,64.6721089 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<ellipse id="Oval" fill="#FFFFFF" cx="156.367757" cy="64.1480245" rx="6.77884936" ry="6.81309739"></ellipse>
|
||||||
|
<path d="M116.563744,123.544258 C118.997177,119.875667 121.95206,116.731161 125.08076,113.761349 L98.4868124,119.176888 L87.1887302,64.3227193 L167.665839,47.7267129 L178.790105,102.056797 C181.744988,103.104966 184.699871,104.32783 187.480937,105.725388 L173.749422,38.4678882 L78.1502643,58.0337064 L92.5770463,128.435713 L116.563744,123.544258 L116.563744,123.544258 Z" id="Shape" fill="#FFFFFF"></path>
|
||||||
|
<ellipse id="Oval" fill="#00A8DC" cx="161.40844" cy="155.164018" rx="4.17159961" ry="4.19267532"></ellipse>
|
||||||
|
<path d="M162.277523,104.502524 C134.988309,104.502524 112.739778,126.863459 112.739778,154.465239 C112.739778,160.579557 113.782678,166.344485 115.868477,171.760024 L132.554876,171.760024 C130.121443,167.392654 128.557093,162.5012 128.035643,157.260356 L122.647327,157.260356 C121.082977,157.260356 120.040077,156.037492 120.040077,154.465239 C120.040077,152.892985 121.256794,151.670122 122.647327,151.670122 L128.035643,151.670122 C128.557093,144.158245 131.511976,137.519843 136.031209,132.104304 L132.207243,128.261018 C131.164343,127.212849 131.164343,125.465901 132.207243,124.417732 C133.250142,123.369563 134.988309,123.369563 136.031209,124.417732 L139.855175,128.261018 C145.243491,123.718953 151.848524,120.749141 159.32264,120.225057 L159.32264,114.634823 C159.32264,113.06257 160.539357,111.839706 161.92989,111.839706 C163.49424,111.839706 164.710956,113.06257 164.710956,114.634823 L164.710956,120.225057 C171.489806,120.749141 177.747205,123.369563 182.961704,127.387544 L185.916588,125.291206 C187.480937,124.068343 189.566737,124.243037 190.95727,125.640596 C192.347804,127.038154 192.52162,129.309187 191.304904,130.706745 L169.230189,162.15181 C165.232406,166.169791 158.975007,166.344485 154.803407,162.5012 C154.62959,162.326505 154.62959,162.326505 154.455774,162.15181 C150.457991,158.13383 150.457991,151.320732 154.455774,147.302752 C154.977224,146.778667 155.324857,146.429278 155.846307,146.079888 L155.846307,146.079888 L177.747205,131.056135 C173.227972,127.911628 167.839656,126.16468 161.92989,126.16468 C146.286391,126.16468 133.771592,138.917401 133.771592,154.639933 C133.771592,161.103641 135.857392,167.043265 139.507542,171.760024 L184.526054,171.760024 C188.176204,167.043265 190.262004,161.103641 190.262004,154.639933 C190.262004,150.971343 189.566737,147.652141 188.350021,144.507635 L192.347804,138.917401 C194.433603,142.935382 195.65032,147.302752 195.997953,152.019511 L201.386269,152.019511 C202.950619,152.019511 203.993519,153.242375 203.993519,154.814628 C203.993519,156.386881 202.776803,157.609745 201.386269,157.609745 L195.997953,157.609745 C195.65032,162.850589 194.08597,167.742044 191.47872,172.109414 L208.686569,172.109414 C210.598552,166.693875 211.815268,160.928946 211.815268,154.814628 C211.641452,126.863459 189.566737,104.502524 162.277523,104.502524 L162.277523,104.502524 Z" id="Shape" fill="#00A8DC"></path>
|
||||||
|
</g>
|
||||||
|
<g id="Group" transform="translate(43.000000, 194.489583)" fill="#FFFFFF" sketch:type="MSShapeGroup">
|
||||||
|
<path d="M3.77407837,0.466865079 L0.644354843,0.466865079 C0.30683564,0.466865079 0,0.776137858 0,1.11633791 L0,23.5386144 C0,23.8788144 0.30683564,24.1880872 0.644354843,24.1880872 L3.77407837,24.1880872 C4.11159757,24.1880872 4.41843321,23.8788144 4.41843321,23.5386144 L4.41843321,1.11633791 C4.38774965,0.776137858 4.08091401,0.466865079 3.77407837,0.466865079 L3.77407837,0.466865079 Z" id="Shape"></path>
|
||||||
|
<path d="M38.0093602,0.611552716 C37.9786767,0.333207215 37.7638917,0.11671627 37.395689,0.11671627 L36.8433848,0.11671627 C36.5365492,0.11671627 36.3831313,0.240425381 36.2603971,0.456916326 L28.8656582,16.446319 L28.7736075,16.446319 L21.3788686,0.456916326 C21.2868179,0.240425381 21.0720329,0.11671627 20.7958808,0.11671627 L20.2435767,0.11671627 C19.8753739,0.11671627 19.660589,0.364134493 19.6299054,0.611552716 L15.6410421,23.3740292 C15.579675,23.8379384 15.855827,24.1472112 16.2853969,24.1472112 L19.3230698,24.1472112 C19.6299054,24.1472112 19.9060575,23.8688657 19.9367411,23.6523747 L21.9004891,10.8175544 L21.9925398,10.8175544 L27.9451513,24.1162839 C28.0372019,24.3327748 28.2213033,24.4874112 28.528139,24.4874112 L29.1418102,24.4874112 C29.4486459,24.4874112 29.6327473,24.3327748 29.724798,24.1162839 L35.6160422,10.8175544 L35.7080929,10.8175544 L37.7025246,23.6523747 C37.7638917,23.899793 38.0400438,24.1472112 38.3468794,24.1472112 L41.4152358,24.1472112 C41.8448057,24.1472112 42.1209578,23.8379384 42.0289071,23.3740292 L38.0093602,0.611552716 L38.0093602,0.611552716 Z" id="Shape"></path>
|
||||||
|
<path d="M62.0639694,0.487843604 C61.9719187,0.271352659 61.8185008,0.11671627 61.4809816,0.11671627 L61.1434624,0.11671627 C60.8366268,0.11671627 60.683209,0.271352659 60.5604747,0.487843604 L50.0973794,23.2812474 C49.8825945,23.7142293 50.1587465,24.1472112 50.6803671,24.1472112 L53.5953057,24.1472112 C54.1476098,24.1472112 54.4237619,23.8070111 54.5771797,23.4668111 L56.2340922,19.8173923 L66.2983012,19.8173923 L67.9552136,23.4668111 C68.2006821,23.9307202 68.4154671,24.1472112 68.9370877,24.1472112 L71.8520263,24.1472112 C72.3429633,24.1472112 72.6191154,23.7142293 72.435014,23.2812474 L62.0639694,0.487843604 L62.0639694,0.487843604 Z M57.9216882,16.0442644 L61.2048296,8.59079041 L61.2968803,8.59079041 L64.6413887,16.0442644 L57.9216882,16.0442644 L57.9216882,16.0442644 Z" id="Shape"></path>
|
||||||
|
<path d="M100.514948,12.3090566 L94.0713998,12.3090566 C93.7031971,12.3090566 93.427045,12.5874021 93.427045,12.9585294 L93.427045,15.6182753 C93.427045,15.9584754 93.7031971,16.2368209 94.0713998,16.2368209 L96.7715535,16.2368209 L96.7715535,19.1130577 C96.0965151,19.3914032 94.6543875,19.9480942 92.7826901,19.9480942 C88.5483583,19.9480942 85.2345334,16.3914573 85.2345334,12.1853475 C85.2345334,7.94831041 88.5483583,4.3298189 92.7520066,4.3298189 C94.5930204,4.3298189 96.3726671,5.01021901 97.8147946,6.30916469 C98.1216303,6.58751019 98.4284659,6.58751019 98.6739344,6.30916469 L100.760417,4.11332796 C101.036569,3.83498246 101.005885,3.43292784 100.729733,3.15458234 C98.4591495,1.17523656 95.5442109,1.77635684e-15 92.5372216,1.77635684e-15 C85.8482047,1.77635684e-15 80.478581,5.44320091 80.478581,12.2162748 C80.478581,18.9893486 85.8482047,24.3397677 92.5372216,24.3397677 C97.4159083,24.3397677 100.883151,22.143931 100.883151,22.143931 C101.005885,22.0511491 101.159303,21.8655855 101.159303,21.58724 L101.159303,12.9276021 C101.097936,12.6183294 100.852467,12.3090566 100.514948,12.3090566 L100.514948,12.3090566 Z" id="Shape"></path>
|
||||||
|
<path d="M116.444092,0.466865079 L113.314368,0.466865079 C112.976849,0.466865079 112.670013,0.776137858 112.670013,1.11633791 L112.670013,23.5386144 C112.670013,23.8788144 112.976849,24.1880872 113.314368,24.1880872 L116.444092,24.1880872 C116.781611,24.1880872 117.088447,23.8788144 117.088447,23.5386144 L117.088447,1.11633791 C117.088447,0.776137858 116.781611,0.466865079 116.444092,0.466865079 L116.444092,0.466865079 Z" id="Shape"></path>
|
||||||
|
<path d="M144.252919,0.466865079 L130.56805,0.466865079 C130.199847,0.466865079 129.923695,0.776137858 129.923695,1.11633791 L129.923695,23.5386144 C129.923695,23.8788144 130.199847,24.1880872 130.56805,24.1880872 L133.66709,24.1880872 C134.004609,24.1880872 134.311444,23.8788144 134.311444,23.5386144 L134.311444,14.9717584 L142.596007,14.9717584 C142.933526,14.9717584 143.240362,14.6624856 143.240362,14.3222856 L143.240362,11.5388306 C143.240362,11.1986305 142.933526,10.8893577 142.596007,10.8893577 L134.311444,10.8893577 L134.311444,4.51833848 L144.252919,4.51833848 C144.621122,4.51833848 144.897274,4.2090657 144.897274,3.86886565 L144.897274,1.08541064 C144.897274,0.776137858 144.651805,0.466865079 144.252919,0.466865079 L144.252919,0.466865079 Z" id="Shape"></path>
|
||||||
|
<path d="M172.362315,0.466865079 L168.895072,0.466865079 C168.61892,0.466865079 168.465502,0.621501469 168.342768,0.776137858 L162.973144,8.56981188 L157.60352,0.776137858 C157.51147,0.652428747 157.327368,0.466865079 157.051216,0.466865079 L153.614657,0.466865079 C153.062353,0.466865079 152.816884,1.02355608 153.062353,1.45653797 L160.733244,12.7759217 L160.733244,23.5386144 C160.733244,23.8788144 161.009396,24.1880872 161.377599,24.1880872 L164.476639,24.1880872 C164.814158,24.1880872 165.120994,23.8788144 165.120994,23.5386144 L165.120994,12.7140671 L172.883935,1.42561069 C173.160087,0.992628803 172.883935,0.466865079 172.362315,0.466865079 L172.362315,0.466865079 Z" id="Shape"></path>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</g>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
1
wp/wp-content/plugins/imagify/assets/images/key.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg viewBox="0 0 51 50" xmlns="http://www.w3.org/2000/svg"><g fill="none" fill-rule="evenodd" transform="translate(1.5 1)"><path d="m41.36 22.552h-23.986c-.323-2.979-2.74-5.302-5.666-5.302-3.146 0-5.705 2.684-5.705 5.982 0 3.299 2.559 5.982 5.705 5.982 2.951 0 5.386-2.361 5.676-5.376h17.547v3.857c0 .355.287.643.643.643.355 0 .643-.287.643-.643v-3.857h4.499l-.009 5.703c-.001.355.287.726.642.726.355 0 .644-.368.644-.723l.01-6.306c0-.17-.067-.355-.188-.475-.12-.122-.284-.21-.455-.21m-29.652 5.376c-2.436 0-4.419-2.107-4.419-4.696 0-2.59 1.983-4.697 4.419-4.697 2.437 0 4.42 2.107 4.42 4.697 0 2.589-1.983 4.696-4.42 4.696" fill="#7a8996"/><circle stroke="#7a8996" stroke-width="2" cx="24" cy="24" r="24"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 718 B |
BIN
wp/wp-content/plugins/imagify/assets/images/lazyload.png
Normal file
|
After Width: | Height: | Size: 734 B |
144
wp/wp-content/plugins/imagify/assets/images/loader-balls.svg
Normal file
@@ -0,0 +1,144 @@
|
|||||||
|
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 32 32" width="32" height="32" fill="#7a8996">
|
||||||
|
<circle transform="translate(8 0)" cx="0" cy="16" r="0">
|
||||||
|
<animate attributeName="r" values="0; 4; 0; 0" dur="1.2s" repeatCount="indefinite" begin="0" keytimes="0;0.2;0.7;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"/>
|
||||||
|
</circle>
|
||||||
|
<circle transform="translate(16 0)" cx="0" cy="16" r="0">
|
||||||
|
<animate attributeName="r" values="0; 4; 0; 0" dur="1.2s" repeatCount="indefinite" begin="0.3" keytimes="0;0.2;0.7;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"/>
|
||||||
|
</circle>
|
||||||
|
<circle transform="translate(24 0)" cx="0" cy="16" r="0">
|
||||||
|
<animate attributeName="r" values="0; 4; 0; 0" dur="1.2s" repeatCount="indefinite" begin="0.6" keytimes="0;0.2;0.7;1" keySplines="0.2 0.2 0.4 0.8;0.2 0.6 0.4 0.8;0.2 0.6 0.4 0.8" calcMode="spline"/>
|
||||||
|
</circle>
|
||||||
|
<style xmlns="http://www.w3.org/1999/xhtml" charset="utf-8" type="text/css" class="firebugResetStyles">/* See license.txt for terms of usage */
|
||||||
|
/** reset styling **/
|
||||||
|
.firebugResetStyles {
|
||||||
|
z-index: 2147483646 !important;
|
||||||
|
top: 0 !important;
|
||||||
|
left: 0 !important;
|
||||||
|
display: block !important;
|
||||||
|
border: 0 none !important;
|
||||||
|
margin: 0 !important;
|
||||||
|
padding: 0 !important;
|
||||||
|
outline: 0 !important;
|
||||||
|
min-width: 0 !important;
|
||||||
|
max-width: none !important;
|
||||||
|
min-height: 0 !important;
|
||||||
|
max-height: none !important;
|
||||||
|
position: fixed !important;
|
||||||
|
transform: rotate(0deg) !important;
|
||||||
|
transform-origin: 50% 50% !important;
|
||||||
|
border-radius: 0 !important;
|
||||||
|
box-shadow: none !important;
|
||||||
|
background: transparent none !important;
|
||||||
|
pointer-events: none !important;
|
||||||
|
white-space: normal !important;
|
||||||
|
}
|
||||||
|
style.firebugResetStyles {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugBlockBackgroundColor {
|
||||||
|
background-color: transparent !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugResetStyles:before, .firebugResetStyles:after {
|
||||||
|
content: "" !important;
|
||||||
|
}
|
||||||
|
/**actual styling to be modified by firebug theme**/
|
||||||
|
.firebugCanvas {
|
||||||
|
display: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
.firebugLayoutBox {
|
||||||
|
width: auto !important;
|
||||||
|
position: static !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugLayoutBoxOffset {
|
||||||
|
opacity: 0.8 !important;
|
||||||
|
position: fixed !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugLayoutLine {
|
||||||
|
opacity: 0.4 !important;
|
||||||
|
background-color: #000000 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugLayoutLineLeft, .firebugLayoutLineRight {
|
||||||
|
width: 1px !important;
|
||||||
|
height: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugLayoutLineTop, .firebugLayoutLineBottom {
|
||||||
|
width: 100% !important;
|
||||||
|
height: 1px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugLayoutLineTop {
|
||||||
|
margin-top: -1px !important;
|
||||||
|
border-top: 1px solid #999999 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugLayoutLineRight {
|
||||||
|
border-right: 1px solid #999999 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugLayoutLineBottom {
|
||||||
|
border-bottom: 1px solid #999999 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugLayoutLineLeft {
|
||||||
|
margin-left: -1px !important;
|
||||||
|
border-left: 1px solid #999999 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
.firebugLayoutBoxParent {
|
||||||
|
border-top: 0 none !important;
|
||||||
|
border-right: 1px dashed #E00 !important;
|
||||||
|
border-bottom: 1px dashed #E00 !important;
|
||||||
|
border-left: 0 none !important;
|
||||||
|
position: fixed !important;
|
||||||
|
width: auto !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugRuler{
|
||||||
|
position: absolute !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugRulerH {
|
||||||
|
top: -15px !important;
|
||||||
|
left: 0 !important;
|
||||||
|
width: 100% !important;
|
||||||
|
height: 14px !important;
|
||||||
|
background: url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%13%88%00%00%00%0E%08%02%00%00%00L%25a%0A%00%00%00%04gAMA%00%00%D6%D8%D4OX2%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%04%F8IDATx%DA%EC%DD%D1n%E2%3A%00E%D1%80%F8%FF%EF%E2%AF2%95%D0D4%0E%C1%14%B0%8Fa-%E9%3E%CC%9C%87n%B9%81%A6W0%1C%A6i%9A%E7y%0As8%1CT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AATE9%FE%FCw%3E%9F%AF%2B%2F%BA%97%FDT%1D~K(%5C%9D%D5%EA%1B%5C%86%B5%A9%BDU%B5y%80%ED%AB*%03%FAV9%AB%E1%CEj%E7%82%EF%FB%18%BC%AEJ8%AB%FA'%D2%BEU9%D7U%ECc0%E1%A2r%5DynwVi%CFW%7F%BB%17%7Dy%EACU%CD%0E%F0%FA%3BX%FEbV%FEM%9B%2B%AD%BE%AA%E5%95v%AB%AA%E3E5%DCu%15rV9%07%B5%7F%B5w%FCm%BA%BE%AA%FBY%3D%14%F0%EE%C7%60%0EU%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5JU%88%D3%F5%1F%AE%DF%3B%1B%F2%3E%DAUCNa%F92%D02%AC%7Dm%F9%3A%D4%F2%8B6%AE*%BF%5C%C2Ym~9g5%D0Y%95%17%7C%C8c%B0%7C%18%26%9CU%CD%13i%F7%AA%90%B3Z%7D%95%B4%C7%60%E6E%B5%BC%05%B4%FBY%95U%9E%DB%FD%1C%FC%E0%9F%83%7F%BE%17%7DkjMU%E3%03%AC%7CWj%DF%83%9An%BCG%AE%F1%95%96yQ%0Dq%5Dy%00%3Et%B5'%FC6%5DS%95pV%95%01%81%FF'%07%00%00%00%00%00%00%00%00%00%F8x%C7%F0%BE%9COp%5D%C9%7C%AD%E7%E6%EBV%FB%1E%E0(%07%E5%AC%C6%3A%ABi%9C%8F%C6%0E9%AB%C0'%D2%8E%9F%F99%D0E%B5%99%14%F5%0D%CD%7F%24%C6%DEH%B8%E9rV%DFs%DB%D0%F7%00k%FE%1D%84%84%83J%B8%E3%BA%FB%EF%20%84%1C%D7%AD%B0%8E%D7U%C8Y%05%1E%D4t%EF%AD%95Q%BF8w%BF%E9%0A%BF%EB%03%00%00%00%00%00%00%00%00%00%B8vJ%8E%BB%F5%B1u%8Cx%80%E1o%5E%CA9%AB%CB%CB%8E%03%DF%1D%B7T%25%9C%D5(%EFJM8%AB%CC'%D2%B2*%A4s%E7c6%FB%3E%FA%A2%1E%80~%0E%3E%DA%10x%5D%95Uig%15u%15%ED%7C%14%B6%87%A1%3B%FCo8%A8%D8o%D3%ADO%01%EDx%83%1A~%1B%9FpP%A3%DC%C6'%9C%95gK%00%00%00%00%00%00%00%00%00%20%D9%C9%11%D0%C0%40%AF%3F%EE%EE%92%94%D6%16X%B5%BCMH%15%2F%BF%D4%A7%C87%F1%8E%F2%81%AE%AAvzr%DA2%ABV%17%7C%E63%83%E7I%DC%C6%0Bs%1B%EF6%1E%00%00%00%00%00%00%00%00%00%80cr%9CW%FF%7F%C6%01%0E%F1%CE%A5%84%B3%CA%BC%E0%CB%AA%84%CE%F9%BF)%EC%13%08WU%AE%AB%B1%AE%2BO%EC%8E%CBYe%FE%8CN%ABr%5Dy%60~%CFA%0D%F4%AE%D4%BE%C75%CA%EDVB%EA(%B7%F1%09g%E5%D9%12%00%00%00%00%00%00%00%00%00H%F6%EB%13S%E7y%5E%5E%FB%98%F0%22%D1%B2'%A7%F0%92%B1%BC%24z3%AC%7Dm%60%D5%92%B4%7CEUO%5E%F0%AA*%3BU%B9%AE%3E%A0j%94%07%A0%C7%A0%AB%FD%B5%3F%A0%F7%03T%3Dy%D7%F7%D6%D4%C0%AAU%D2%E6%DFt%3F%A8%CC%AA%F2%86%B9%D7%F5%1F%18%E6%01%F8%CC%D5%9E%F0%F3z%88%AA%90%EF%20%00%00%00%00%00%00%00%00%00%C0%A6%D3%EA%CFi%AFb%2C%7BB%0A%2B%C3%1A%D7%06V%D5%07%A8r%5D%3D%D9%A6%CAu%F5%25%CF%A2%99%97zNX%60%95%AB%5DUZ%D5%FBR%03%AB%1C%D4k%9F%3F%BB%5C%FF%81a%AE%AB'%7F%F3%EA%FE%F3z%94%AA%D8%DF%5B%01%00%00%00%00%00%00%00%00%00%8E%FB%F3%F2%B1%1B%8DWU%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*UiU%C7%BBe%E7%F3%B9%CB%AAJ%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5J%95*U%AAT%A9R%A5*%AAj%FD%C6%D4%5Eo%90%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5%86%AF%1B%9F%98%DA%EBm%BBV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%ADV%AB%D5j%B5Z%AD%D6%E4%F58%01%00%00%00%00%00%00%00%00%00%00%00%00%00%40%85%7F%02%0C%008%C2%D0H%16j%8FX%00%00%00%00IEND%AEB%60%82") repeat-x !important;
|
||||||
|
border-top: 1px solid #BBBBBB !important;
|
||||||
|
border-right: 1px dashed #BBBBBB !important;
|
||||||
|
border-bottom: 1px solid #000000 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.firebugRulerV {
|
||||||
|
top: 0 !important;
|
||||||
|
left: -15px !important;
|
||||||
|
width: 14px !important;
|
||||||
|
height: 100% !important;
|
||||||
|
background: url("data:image/png,%89PNG%0D%0A%1A%0A%00%00%00%0DIHDR%00%00%00%0E%00%00%13%88%08%02%00%00%00%0E%F5%CB%10%00%00%00%04gAMA%00%00%D6%D8%D4OX2%00%00%00%19tEXtSoftware%00Adobe%20ImageReadyq%C9e%3C%00%00%06~IDATx%DA%EC%DD%D1v%A20%14%40Qt%F1%FF%FF%E4%97%D9%07%3BT%19%92%DC%40(%90%EEy%9A5%CB%B6%E8%F6%9Ac%A4%CC0%84%FF%DC%9E%CF%E7%E3%F1%88%DE4%F8%5D%C7%9F%2F%BA%DD%5E%7FI%7D%F18%DDn%BA%C5%FB%DF%97%BFk%F2%10%FF%FD%B4%F2M%A7%FB%FD%FD%B3%22%07p%8F%3F%AE%E3%F4S%8A%8F%40%EEq%9D%BE8D%F0%0EY%A1Uq%B7%EA%1F%81%88V%E8X%3F%B4%CEy%B7h%D1%A2E%EBohU%FC%D9%AF2fO%8BBeD%BE%F7X%0C%97%A4%D6b7%2Ck%A5%12%E3%9B%60v%B7r%C7%1AI%8C%BD%2B%23r%00c0%B2v%9B%AD%CA%26%0C%1Ek%05A%FD%93%D0%2B%A1u%8B%16-%95q%5Ce%DCSO%8E%E4M%23%8B%F7%C2%FE%40%BB%BD%8C%FC%8A%B5V%EBu%40%F9%3B%A72%FA%AE%8C%D4%01%CC%B5%DA%13%9CB%AB%E2I%18%24%B0n%A9%0CZ*Ce%9C%A22%8E%D8NJ%1E%EB%FF%8F%AE%CAP%19*%C3%BAEKe%AC%D1%AAX%8C*%DEH%8F%C5W%A1e%AD%D4%B7%5C%5B%19%C5%DB%0D%EF%9F%19%1D%7B%5E%86%BD%0C%95%A12%AC%5B*%83%96%CAP%19%F62T%86%CAP%19*%83%96%CA%B8Xe%BC%FE)T%19%A1%17xg%7F%DA%CBP%19*%C3%BA%A52T%86%CAP%19%F62T%86%CA%B0n%A9%0CZ%1DV%C6%3D%F3%FCH%DE%B4%B8~%7F%5CZc%F1%D6%1F%AF%84%F9%0F6%E6%EBVt9%0E~%BEr%AF%23%B0%97%A12T%86%CAP%19%B4T%86%CA%B8Re%D8%CBP%19*%C3%BA%A52huX%19%AE%CA%E5%BC%0C%7B%19*CeX%B7h%A9%0C%95%E1%BC%0C%7B%19*CeX%B7T%06%AD%CB%5E%95%2B%BF.%8F%C5%97%D5%E4%7B%EE%82%D6%FB%CF-%9C%FD%B9%CF%3By%7B%19%F62T%86%CA%B0n%D1R%19*%A3%D3%CA%B0%97%A12T%86uKe%D0%EA%B02*%3F1%99%5DB%2B%A4%B5%F8%3A%7C%BA%2B%8Co%7D%5C%EDe%A8%0C%95a%DDR%19%B4T%C66%82fA%B2%ED%DA%9FC%FC%17GZ%06%C9%E1%B3%E5%2C%1A%9FoiB%EB%96%CA%A0%D5qe4%7B%7D%FD%85%F7%5B%ED_%E0s%07%F0k%951%ECr%0D%B5C%D7-g%D1%A8%0C%EB%96%CA%A0%A52T%C6)*%C3%5E%86%CAP%19%D6-%95A%EB*%95q%F8%BB%E3%F9%AB%F6%E21%ACZ%B7%22%B7%9B%3F%02%85%CB%A2%5B%B7%BA%5E%B7%9C%97%E1%BC%0C%EB%16-%95%A12z%AC%0C%BFc%A22T%86uKe%D0%EA%B02V%DD%AD%8A%2B%8CWhe%5E%AF%CF%F5%3B%26%CE%CBh%5C%19%CE%CB%B0%F3%A4%095%A1%CAP%19*Ce%A8%0C%3BO*Ce%A8%0C%95%A12%3A%AD%8C%0A%82%7B%F0v%1F%2FD%A9%5B%9F%EE%EA%26%AF%03%CA%DF9%7B%19*Ce%A8%0C%95%A12T%86%CA%B8Ze%D8%CBP%19*Ce%A8%0C%95%D1ae%EC%F7%89I%E1%B4%D7M%D7P%8BjU%5C%BB%3E%F2%20%D8%CBP%19*Ce%A8%0C%95%A12T%C6%D5*%C3%5E%86%CAP%19*Ce%B4O%07%7B%F0W%7Bw%1C%7C%1A%8C%B3%3B%D1%EE%AA%5C%D6-%EBV%83%80%5E%D0%CA%10%5CU%2BD%E07YU%86%CAP%19*%E3%9A%95%91%D9%A0%C8%AD%5B%EDv%9E%82%FFKOee%E4%8FUe%A8%0C%95%A12T%C6%1F%A9%8C%C8%3D%5B%A5%15%FD%14%22r%E7B%9F%17l%F8%BF%ED%EAf%2B%7F%CF%ECe%D8%CBP%19*Ce%A8%0C%95%E1%93~%7B%19%F62T%86%CAP%19*Ce%A8%0C%E7%13%DA%CBP%19*Ce%A8%0CZf%8B%16-Z%B4h%D1R%19f%8B%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1%A2%A52%CC%16-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2EKe%98-Z%B4h%D1%A2EKe%D02%5B%B4h%D1%A2EKe%D02%5B%B4h%D1%A2E%8B%96%CA0%5B%B4h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%16-%95a%B6h%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-Z*%C3l%D1%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z%B4T%86%D9%A2E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4h%A9%0C%B3E%8B%16-Z%B4h%A9%0CZf%8B%16-Z%B4h%A9%0CZf%8B%16-Z%B4h%D1R%19f%8B%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1%A2%A52%CC%16-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2EKe%98-Z%B4h%D1%A2EKe%D02%5B%B4h%D1%A2EKe%D02%5B%B4h%D1%A2E%8B%96%CA0%5B%B4h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%16-%95a%B6h%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-Z*%C3l%D1%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z%B4T%86%D9%A2E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4h%A9%0C%B3E%8B%16-Z%B4h%A9%0CZf%8B%16-Z%B4h%A9%0CZf%8B%16-Z%B4h%D1R%19f%8B%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1R%19%B4%CC%16-Z%B4h%D1%A2%A52%CC%16-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2%A52h%99-Z%B4h%D1%A2EKe%98-Z%B4h%D1%A2EKe%D02%5B%B4h%D1%A2EKe%D02%5B%B4h%D1%A2E%8B%96%CA0%5B%B4h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%96%CA%A0e%B6h%D1%A2E%8B%16-%95a%B6h%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-%95A%CBl%D1%A2E%8B%16-Z*%C3l%D1%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z*%83%96%D9%A2E%8B%16-Z%B4T%86%D9%A2E%8B%16-Z%B4T%06-%B3E%8B%16-Z%B4%AE%A4%F5%25%C0%00%DE%BF%5C'%0F%DA%B8q%00%00%00%00IEND%AEB%60%82") repeat-y !important;
|
||||||
|
border-left: 1px solid #BBBBBB !important;
|
||||||
|
border-right: 1px solid #000000 !important;
|
||||||
|
border-bottom: 1px dashed #BBBBBB !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overflowRulerX > .firebugRulerV {
|
||||||
|
left: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.overflowRulerY > .firebugRulerH {
|
||||||
|
top: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
|
||||||
|
.fbProxyElement {
|
||||||
|
position: fixed !important;
|
||||||
|
pointer-events: auto !important;
|
||||||
|
}
|
||||||
|
</style></svg>
|
||||||
|
After Width: | Height: | Size: 11 KiB |
BIN
wp/wp-content/plugins/imagify/assets/images/logo-wprocket.png
Normal file
|
After Width: | Height: | Size: 3.5 KiB |
|
After Width: | Height: | Size: 35 KiB |
BIN
wp/wp-content/plugins/imagify/assets/images/logo-wprocket@2x.png
Normal file
|
After Width: | Height: | Size: 7.6 KiB |
1
wp/wp-content/plugins/imagify/assets/images/mail.svg
Normal file
@@ -0,0 +1 @@
|
|||||||
|
<svg viewBox="0 0 21 18" xmlns="http://www.w3.org/2000/svg"><g fill="#40b1d0" fill-rule="evenodd"><path d="m1.967 5.913c.259.183 1.041.726 2.344 1.629 1.304.903 2.302 1.599 2.996 2.087.076.053.238.17.486.349.248.179.454.324.617.435.164.11.362.234.595.372.233.137.452.24.658.308.206.069.396.103.572.103h.012.012c.175 0 .366-.034.572-.103.206-.068.425-.172.658-.308.232-.137.431-.261.595-.372.164-.11.37-.255.617-.435.248-.179.41-.295.486-.349.701-.488 2.485-1.727 5.351-3.716.556-.389 1.021-.858 1.395-1.406.374-.549.56-1.124.56-1.726 0-.503-.181-.934-.543-1.292-.362-.358-.791-.537-1.286-.537h-16.832c-.587 0-1.039.198-1.355.595-.316.396-.475.892-.475 1.487 0 .48.21 1 .629 1.561.419.56.865 1 1.338 1.321"/><path d="m19.348 7.136c-2.5 1.692-4.399 3.01-5.694 3.945-.435.32-.787.57-1.058.749-.271.179-.631.362-1.081.549-.45.187-.869.28-1.258.28h-.012-.012c-.389 0-.808-.093-1.258-.28-.45-.187-.81-.37-1.081-.549-.271-.179-.623-.429-1.058-.749-1.029-.755-2.924-2.07-5.683-3.945-.435-.29-.82-.621-1.155-.995v9.08c0 .503.179.934.537 1.292.358.358.789.538 1.292.538h16.832c.503 0 .934-.179 1.292-.538.358-.358.537-.789.537-1.292v-9.08c-.328.366-.709.698-1.144.995"/></g></svg>
|
||||||
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 103 KiB |
BIN
wp/wp-content/plugins/imagify/assets/images/mushrooms-normal.jpg
Normal file
|
After Width: | Height: | Size: 287 KiB |
|
After Width: | Height: | Size: 327 KiB |