Version Description
Download this release
Release Info
Developer | Icegram |
Plugin | Email Subscribers & Newsletters |
Version | 4.6.3 |
Comparing to | |
See all releases |
Code changes from version 4.6.2 to 4.6.3
- email-subscribers.php +4 -4
- lite/admin/class-email-subscribers-admin.php +12 -8
- lite/admin/class-ig-es-onboarding.php +13 -1
- lite/admin/css/email-subscribers-admin.css +14 -5
- lite/admin/dist/main.css +1 -1
- lite/admin/js/email-subscribers-admin.js +14 -2
- lite/admin/partials/onboarding.php +1 -1
- lite/includes/class-email-subscribers-i18n.php +2 -2
- lite/includes/class-email-subscribers.php +58 -25
- lite/includes/class-es-install.php +7 -0
- lite/includes/classes/class-es-admin-settings.php +2 -0
- lite/includes/classes/class-es-campaigns-table.php +14 -1
- lite/includes/classes/class-es-contacts-table.php +6 -2
- lite/includes/classes/class-es-forms-table.php +8 -5
- lite/includes/classes/class-es-handle-post-notification.php +42 -64
- lite/includes/classes/class-es-newsletters.php +48 -34
- lite/includes/classes/class-es-queue.php +130 -8
- lite/includes/classes/class-es-reports-table.php +1 -1
- lite/includes/classes/class-es-templates-table.php +5 -1
- lite/includes/classes/class-ig-es-background-process-helper.php +259 -0
- lite/includes/db/class-es-db-campaigns.php +37 -0
- lite/includes/db/class-es-db-contacts.php +115 -1
- lite/includes/db/class-es-db-mailing-queue.php +25 -0
- lite/includes/es-backward.php +2 -1
- lite/includes/notices/views/trial-consent.php +4 -3
- lite/includes/pro-features.php +2 -4
- lite/includes/upgrade/es-update-functions.php +42 -0
- lite/includes/workflows/abstracts/class-es-workflow-trigger.php +6 -1
- lite/includes/workflows/actions/class-es-action-add-to-list.php +1 -1
- lite/includes/workflows/admin/class-es-workflow-admin-edit.php +6 -6
- lite/includes/workflows/class-es-workflow.php +1 -1
- lite/includes/workflows/queue/class-es-workflow-queue-runner.php +2 -2
- lite/public/class-email-subscribers-public.php +3 -3
- readme.txt +9 -2
email-subscribers.php
CHANGED
@@ -3,11 +3,11 @@
|
|
3 |
* Plugin Name: Email Subscribers & Newsletters
|
4 |
* Plugin URI: https://www.icegram.com/
|
5 |
* Description: Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.
|
6 |
-
* Version: 4.6.
|
7 |
* Author: Icegram
|
8 |
* Author URI: https://www.icegram.com/
|
9 |
* Requires at least: 3.9
|
10 |
-
* Tested up to: 5.5.
|
11 |
* Requires PHP: 5.6
|
12 |
* Text Domain: email-subscribers
|
13 |
* Domain Path: /lite/languages/
|
@@ -119,7 +119,7 @@ if ( ! function_exists( 'deactivate_plugins' ) ) {
|
|
119 |
$ig_es_plan = 'lite';
|
120 |
if ( 'email-subscribers-premium.php' === basename( __FILE__ ) ) {
|
121 |
$ig_es_plan = 'premium';
|
122 |
-
} elseif ( 'marketing-automation
|
123 |
$ig_es_plan = 'woo';
|
124 |
}
|
125 |
|
@@ -175,7 +175,7 @@ if ( 'premium' === $ig_es_plan ) {
|
|
175 |
/* ***************************** Initial Compatibility Work (End) ******************* */
|
176 |
|
177 |
if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
|
178 |
-
define( 'ES_PLUGIN_VERSION', '4.6.
|
179 |
}
|
180 |
|
181 |
// Plugin Folder Path.
|
3 |
* Plugin Name: Email Subscribers & Newsletters
|
4 |
* Plugin URI: https://www.icegram.com/
|
5 |
* Description: Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.
|
6 |
+
* Version: 4.6.3
|
7 |
* Author: Icegram
|
8 |
* Author URI: https://www.icegram.com/
|
9 |
* Requires at least: 3.9
|
10 |
+
* Tested up to: 5.5.3
|
11 |
* Requires PHP: 5.6
|
12 |
* Text Domain: email-subscribers
|
13 |
* Domain Path: /lite/languages/
|
119 |
$ig_es_plan = 'lite';
|
120 |
if ( 'email-subscribers-premium.php' === basename( __FILE__ ) ) {
|
121 |
$ig_es_plan = 'premium';
|
122 |
+
} elseif ( 'icegram-marketing-automation.php' === basename( __FILE__ ) ) {
|
123 |
$ig_es_plan = 'woo';
|
124 |
}
|
125 |
|
175 |
/* ***************************** Initial Compatibility Work (End) ******************* */
|
176 |
|
177 |
if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
|
178 |
+
define( 'ES_PLUGIN_VERSION', '4.6.3' );
|
179 |
}
|
180 |
|
181 |
// Plugin Folder Path.
|
lite/admin/class-email-subscribers-admin.php
CHANGED
@@ -165,9 +165,9 @@ class Email_Subscribers_Admin {
|
|
165 |
|
166 |
wp_localize_script( $this->email_subscribers, 'ig_es_js_data', $ig_es_js_data );
|
167 |
|
168 |
-
$page_prefix =
|
169 |
|
170 |
-
if ( ES()->is_es_admin_screen( $page_prefix . '
|
171 |
|
172 |
wp_enqueue_script( $this->email_subscribers . '-workflows', plugin_dir_url( __FILE__ ) . 'js/ig-es-workflows.js', array( 'jquery', 'jquery-ui-datepicker' ), $this->version, false );
|
173 |
|
@@ -224,12 +224,14 @@ class Email_Subscribers_Admin {
|
|
224 |
|
225 |
if ( count( $accessible_sub_menus ) > 0 ) {
|
226 |
|
227 |
-
|
228 |
-
|
229 |
-
|
230 |
-
|
231 |
-
|
232 |
-
|
|
|
|
|
233 |
}
|
234 |
|
235 |
// Submenu.
|
@@ -305,7 +307,9 @@ class Email_Subscribers_Admin {
|
|
305 |
new ES_Handle_Post_Notification();
|
306 |
ES_Handle_Sync_Wp_User::get_instance();
|
307 |
new ES_Import_Subscribers();
|
|
|
308 |
ES_Info::get_instance();
|
|
|
309 |
ES_Newsletters::get_instance();
|
310 |
ES_Tools::get_instance();
|
311 |
new ES_Tracking();
|
165 |
|
166 |
wp_localize_script( $this->email_subscribers, 'ig_es_js_data', $ig_es_js_data );
|
167 |
|
168 |
+
$page_prefix = ES()->get_admin_page_prefix();
|
169 |
|
170 |
+
if ( ES()->is_es_admin_screen( $page_prefix . '_page_es_workflows' ) ) {
|
171 |
|
172 |
wp_enqueue_script( $this->email_subscribers . '-workflows', plugin_dir_url( __FILE__ ) . 'js/ig-es-workflows.js', array( 'jquery', 'jquery-ui-datepicker' ), $this->version, false );
|
173 |
|
224 |
|
225 |
if ( count( $accessible_sub_menus ) > 0 ) {
|
226 |
|
227 |
+
$menu_title = ES()->get_admin_menu_title();
|
228 |
+
|
229 |
+
// This adds the main menu page.
|
230 |
+
add_menu_page( $menu_title, $menu_title, 'edit_posts', 'es_dashboard', array( $this, 'es_dashboard_callback' ), 'dashicons-email', 30 );
|
231 |
+
|
232 |
+
if ( 'woo' === IG_ES_PLUGIN_PLAN ) {
|
233 |
+
// Add Icegram submenu under WooCommerce marketing admin menu.
|
234 |
+
add_submenu_page( 'woocommerce-marketing', $menu_title, $menu_title, 'manage_woocommerce', 'es_dashboard', array( $this, 'es_dashboard_callback' ) );
|
235 |
}
|
236 |
|
237 |
// Submenu.
|
307 |
new ES_Handle_Post_Notification();
|
308 |
ES_Handle_Sync_Wp_User::get_instance();
|
309 |
new ES_Import_Subscribers();
|
310 |
+
// Start-IG-Code.
|
311 |
ES_Info::get_instance();
|
312 |
+
// End-IG-Code.
|
313 |
ES_Newsletters::get_instance();
|
314 |
ES_Tools::get_instance();
|
315 |
new ES_Tracking();
|
lite/admin/class-ig-es-onboarding.php
CHANGED
@@ -493,6 +493,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
|
|
493 |
$admin_name = get_option( 'admin_email' );
|
494 |
$user = get_user_by( 'email', $admin_email );
|
495 |
$wp_user_id = 0;
|
|
|
496 |
if ( $user instanceof WP_User ) {
|
497 |
$wp_user_id = $user->ID;
|
498 |
}
|
@@ -504,6 +505,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
|
|
504 |
'last_name' => '',
|
505 |
'email' => $admin_email,
|
506 |
'source' => 'admin',
|
|
|
507 |
'form_id' => 0,
|
508 |
'status' => 'verified',
|
509 |
'unsubscribed' => 0,
|
@@ -520,7 +522,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
|
|
520 |
'status' => 'subscribed',
|
521 |
'optin_type' => IG_SINGLE_OPTIN,
|
522 |
'subscribed_at' => ig_get_current_date_time(),
|
523 |
-
'subscribed_ip' =>
|
524 |
);
|
525 |
|
526 |
if ( ! empty( $default_list_id ) ) {
|
@@ -812,10 +814,17 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
|
|
812 |
$from_email = ES_Common::get_ig_option( 'from_email' );
|
813 |
|
814 |
// First Create Default Template.
|
|
|
815 |
$sample = '<strong style="color: #990000">What can you achieve using Email Subscribers?</strong><p>Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.';
|
|
|
|
|
|
|
|
|
816 |
$sample .= ' You can also Import or Export subscribers from any list to Email Subscribers.</p>';
|
817 |
$sample .= ' <strong style="color: #990000">Plugin Features</strong><ol>';
|
|
|
818 |
$sample .= ' <li>Send notification emails to subscribers when new blog posts are published.</li>';
|
|
|
819 |
$sample .= ' <li>Subscribe form available with 3 options to setup.</li>';
|
820 |
$sample .= ' <li>Double Opt-In and Single Opt-In support.</li>';
|
821 |
$sample .= ' <li>Email notification to admin when a new user signs up (Optional).</li>';
|
@@ -827,6 +836,8 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
|
|
827 |
$sample .= ' <strong>Thanks & Regards,</strong><br/>Admin<br/>';
|
828 |
|
829 |
$title = esc_html__( 'Welcome To Email Subscribers', 'email-subscribers' );
|
|
|
|
|
830 |
$es_post = array(
|
831 |
'post_title' => $title,
|
832 |
'post_content' => $sample,
|
@@ -851,6 +862,7 @@ if ( ! class_exists( 'IG_ES_Onboarding' ) ) {
|
|
851 |
|
852 |
$data['slug'] = sanitize_title( $title );
|
853 |
$data['name'] = $title;
|
|
|
854 |
$data['type'] = 'newsletter';
|
855 |
$data['from_email'] = $from_email;
|
856 |
$data['reply_to_email'] = $from_email;
|
493 |
$admin_name = get_option( 'admin_email' );
|
494 |
$user = get_user_by( 'email', $admin_email );
|
495 |
$wp_user_id = 0;
|
496 |
+
$ip_address = ig_es_get_ip();
|
497 |
if ( $user instanceof WP_User ) {
|
498 |
$wp_user_id = $user->ID;
|
499 |
}
|
505 |
'last_name' => '',
|
506 |
'email' => $admin_email,
|
507 |
'source' => 'admin',
|
508 |
+
'ip_address' => $ip_address,
|
509 |
'form_id' => 0,
|
510 |
'status' => 'verified',
|
511 |
'unsubscribed' => 0,
|
522 |
'status' => 'subscribed',
|
523 |
'optin_type' => IG_SINGLE_OPTIN,
|
524 |
'subscribed_at' => ig_get_current_date_time(),
|
525 |
+
'subscribed_ip' => $ip_address,
|
526 |
);
|
527 |
|
528 |
if ( ! empty( $default_list_id ) ) {
|
814 |
$from_email = ES_Common::get_ig_option( 'from_email' );
|
815 |
|
816 |
// First Create Default Template.
|
817 |
+
// Start-IG-Code.
|
818 |
$sample = '<strong style="color: #990000">What can you achieve using Email Subscribers?</strong><p>Add subscription forms on website, send HTML newsletters & automatically notify subscribers about new blog posts once it is published.';
|
819 |
+
// End-IG-Code.
|
820 |
+
// Start-Woo-Code.
|
821 |
+
$sample = '<strong style="color: #990000">What can you achieve using Email Subscribers?</strong><p>Add subscription forms on website, send HTML newsletters.';
|
822 |
+
// End-Woo-Code.
|
823 |
$sample .= ' You can also Import or Export subscribers from any list to Email Subscribers.</p>';
|
824 |
$sample .= ' <strong style="color: #990000">Plugin Features</strong><ol>';
|
825 |
+
// Start-IG-Code.
|
826 |
$sample .= ' <li>Send notification emails to subscribers when new blog posts are published.</li>';
|
827 |
+
// End-IG-Code.
|
828 |
$sample .= ' <li>Subscribe form available with 3 options to setup.</li>';
|
829 |
$sample .= ' <li>Double Opt-In and Single Opt-In support.</li>';
|
830 |
$sample .= ' <li>Email notification to admin when a new user signs up (Optional).</li>';
|
836 |
$sample .= ' <strong>Thanks & Regards,</strong><br/>Admin<br/>';
|
837 |
|
838 |
$title = esc_html__( 'Welcome To Email Subscribers', 'email-subscribers' );
|
839 |
+
$subject = esc_html__( 'Welcome To Email Subscribers', 'email-subscribers' );
|
840 |
+
|
841 |
$es_post = array(
|
842 |
'post_title' => $title,
|
843 |
'post_content' => $sample,
|
862 |
|
863 |
$data['slug'] = sanitize_title( $title );
|
864 |
$data['name'] = $title;
|
865 |
+
$data['subject'] = $subject;
|
866 |
$data['type'] = 'newsletter';
|
867 |
$data['from_email'] = $from_email;
|
868 |
$data['reply_to_email'] = $from_email;
|
lite/admin/css/email-subscribers-admin.css
CHANGED
@@ -1496,7 +1496,7 @@ body[class*="_page_es_workflows"] #post-body .postbox .inside {
|
|
1496 |
|
1497 |
.ig-es-action.js-open .ig-es-action__header h4,
|
1498 |
.ig-es-action.js-open .ig-es-action__header a {
|
1499 |
-
color:
|
1500 |
}
|
1501 |
|
1502 |
.ig-es-action__header {
|
@@ -1532,7 +1532,7 @@ body[class*="_page_es_workflows"] #post-body .postbox .inside {
|
|
1532 |
text-indent: -999em;
|
1533 |
display: block;
|
1534 |
width: 2.25rem;
|
1535 |
-
height: 1.
|
1536 |
border-radius: 30px;
|
1537 |
border: none;
|
1538 |
position: relative;
|
@@ -1554,9 +1554,10 @@ body[class*="_page_es_workflows"] #post-body .postbox .inside {
|
|
1554 |
content: '';
|
1555 |
position: absolute;
|
1556 |
display: block;
|
1557 |
-
|
1558 |
-
|
1559 |
-
|
|
|
1560 |
left: 2px;
|
1561 |
-webkit-transition: all .15s ease;
|
1562 |
transition: all .15s ease;
|
@@ -1773,3 +1774,11 @@ div.broadcast_side_content{
|
|
1773 |
|
1774 |
/* Upselling css : end */
|
1775 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1496 |
|
1497 |
.ig-es-action.js-open .ig-es-action__header h4,
|
1498 |
.ig-es-action.js-open .ig-es-action__header a {
|
1499 |
+
color: #4a5568;
|
1500 |
}
|
1501 |
|
1502 |
.ig-es-action__header {
|
1532 |
text-indent: -999em;
|
1533 |
display: block;
|
1534 |
width: 2.25rem;
|
1535 |
+
height: 1.2rem;
|
1536 |
border-radius: 30px;
|
1537 |
border: none;
|
1538 |
position: relative;
|
1554 |
content: '';
|
1555 |
position: absolute;
|
1556 |
display: block;
|
1557 |
+
margin-left:1px;
|
1558 |
+
width: 0.82rem ;
|
1559 |
+
height: 0.85rem;
|
1560 |
+
top: 2.7px;
|
1561 |
left: 2px;
|
1562 |
-webkit-transition: all .15s ease;
|
1563 |
transition: all .15s ease;
|
1774 |
|
1775 |
/* Upselling css : end */
|
1776 |
|
1777 |
+
.es-mail-toggle-dot{
|
1778 |
+
margin-top: 0.19rem !important;
|
1779 |
+
width: 0.85rem !important;
|
1780 |
+
height: 0.8rem !important;
|
1781 |
+
}
|
1782 |
+
.es-mail-toggle-line{
|
1783 |
+
height: 1.2rem !important;
|
1784 |
+
}
|
lite/admin/dist/main.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}a{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}img{border-width:0}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-input::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-input::-moz-placeholder{color:#9fa6b2;opacity:1}.form-input::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-textarea::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-moz-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem 2.5rem .5rem .75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.ig-es-primary-button,.ig-es-send-queue-emails{border-color:transparent;padding:.5rem 1rem;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.ig-es-primary-button,.ig-es-send-queue-emails,.ig-es-title-button,.wp-heading-inline+.page-title-action{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;font-size:.875rem;line-height:1.25rem;font-weight:500;--text-opacity:1;--bg-opacity:1;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-title-button,.wp-heading-inline+.page-title-action{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity));color:#374151;color:rgba(55,65,81,var(--text-opacity));background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));padding:.25rem .75rem}.wrap .wp-heading-inline+.page-title-action{margin-left:.5rem}.ig-es-title-button:hover,.wp-heading-inline+.page-title-action:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity));--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.ig-es-title-button:focus,.wp-heading-inline+.page-title-action:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45);--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.ig-es-primary-button:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity));--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.ig-es-primary-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.ig-es-imp-button{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important;border-radius:.375rem!important;border-width:1px!important;border-color:transparent!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;font-size:.875rem!important;line-height:1.25rem!important;font-weight:500!important;background-color:#0e9f6e!important;background-color:rgba(14,159,110,var(--bg-opacity))!important;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform!important;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-transition-duration:.15s!important;transition-duration:.15s!important}.ig-es-imp-button,.ig-es-imp-button:hover{--text-opacity:1!important;color:#fff!important;color:rgba(255,255,255,var(--text-opacity))!important;--bg-opacity:1!important}.ig-es-imp-button:hover{background-color:#31c48d!important;background-color:rgba(49,196,141,var(--bg-opacity))!important}.ig-es-imp-button:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(132,225,188,.45)!important;box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}.ig-es-link-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));font-size:.875rem;line-height:1.25rem;font-weight:500;background-color:#ff5a1f;background-color:rgba(255,90,31,var(--bg-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-link-button,.ig-es-link-button:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity));--bg-opacity:1}.ig-es-link-button:hover{background-color:#ff8a4c;background-color:rgba(255,138,76,var(--bg-opacity))}.ig-es-link-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(253,186,140,.45);box-shadow:0 0 0 3px rgba(253,186,140,.45)}.ig-es-action.js-open .ig-es-action__header{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.form-input{--bg-opacity:1!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;border-width:1px!important;border-radius:.375rem!important;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05)!important;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)!important;--border-opacity:1!important;border-color:#d2d6dc!important;border-color:rgba(210,214,220,var(--border-opacity))!important}.form-input:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important}.form-checkbox{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.form-radio{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-checkbox:checked,.form-radio:checked{--text-opacity:1!important;color:#5850ec!important;color:rgba(88,80,236,var(--text-opacity))!important}.form-select{font-size:.875rem!important;--border-opacity:1!important;border-color:#9fa6b2!important;border-color:rgba(159,166,178,var(--border-opacity))!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")!important}.form-select:focus,input[type=number]:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;--border-opacity:1!important;border-color:#a4cafe!important;border-color:rgba(164,202,254,var(--border-opacity))!important}.es-check-toggle:checked~.es-mail-toggle-line{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.es-check-toggle:checked~.es-mail-toggle-dot{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-translate-x:100%}.es-mail-toggle-line{width:2.25rem;height:1.25rem;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity));-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.es-mail-toggle-dot,.es-mail-toggle-line{display:block;--bg-opacity:1;border-radius:9999px}.es-mail-toggle-dot{width:1rem;height:1rem;margin-top:.125rem;margin-left:.125rem;position:absolute;top:0;bottom:0;-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.es-mail-toggle-dot:focus-within{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}[type=radio]:checked+.es-mailer-logo{-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-scale-x:1.1;--transform-scale-y:1.1;-webkit-box-shadow:0 0 3px 1px #5a67d8;box-shadow:0 0 3px 1px #5a67d8}[type=radio]:checked+.es-mailer-logo:hover{border-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.wp-core-ui .button,.wp-core-ui .button-secondary{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{font-size:.875rem;border-radius:.375rem;border-width:1px;line-height:1.25rem;font-weight:500;--text-opacity:1}.wp-core-ui .button-primary{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.wp-core-ui .button-primary:hover,.wp-core-ui .button:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.wp-core-ui .search-box input[name=s],.wp-core-ui select{border-radius:.375rem}.wp-core-ui #bulk-action-selector-top,.wp-core-ui #doaction,.wp-core-ui #doaction2,.wp-core-ui #filter-by-date,.wp-core-ui #post-query-submit,.wp-core-ui #poststuff select,.wp-core-ui #search-submit{cursor:pointer;line-height:1.25rem;--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity));background-color:transparent;font-size:.875rem}.wp-core-ui #search-submit{margin-left:.375rem}.wp-core-ui #doaction2:hover .wp-core-ui #post-query-submit:hover,.wp-core-ui #doaction:hover,.wp-core-ui #search-submit:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.wp-core-ui #doaction2:focus .wp-core-ui #post-query-submit:focus,.wp-core-ui #doaction:focus,.wp-core-ui #search-submit:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(159,166,178,.45);box-shadow:0 0 0 3px rgba(159,166,178,.45)}.es-items-lists table.fixed,.post-type-es_template table.fixed{margin-top:1.5rem;margin-bottom:1rem;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-radius:.5rem;overflow:hidden}.es-items-lists table.fixed tfoot td,.es-items-lists table.fixed tfoot th,.es-items-lists table.fixed thead td,.es-items-lists table.fixed thead th,.post-type-es_template table.fixed tfoot th,.post-type-es_template table.fixed thead td,.post-type-es_template table.fixed thead th{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity));font-weight:500;letter-spacing:.05em}.es-items-lists table.fixed tfoot th,.es-items-lists table.fixed thead th,.post-type-es_template table.fixed tfoot th,.post-type-es_template table.fixed thead th{padding-top:.5rem;padding-bottom:.5rem}.es-items-lists .widefat thead td input,.post-type-es_template .widefat thead td input{margin-right:1.5rem}.post-type-es_template .wrap{padding-top:1rem;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.post-type-es_template .wrap>h1{padding-top:0;font-weight:600;--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity));line-height:2.25rem}.es-items-lists .striped>tbody tr,.post-type-es_template .striped>tbody tr{border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));padding-top:.5rem;padding-bottom:.5rem}.es-items-lists .striped>tbody>:nth-child(odd),.post-type-es_template .striped>tbody>:nth-child(odd){--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.es_onboard_email{padding:.25rem .75rem!important}.es_reports_table_header{border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));text-align:left;font-size:.875rem;line-height:1rem;font-weight:500;--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity));letter-spacing:.05em}.space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.25rem*var(--space-y-reverse))}.space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.5rem*var(--space-y-reverse))}.space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.75rem*var(--space-y-reverse))}.space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0.75rem*var(--space-x-reverse));margin-left:calc(0.75rem*(1 - var(--space-x-reverse)))}.space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1rem*var(--space-y-reverse))}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-50{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#e5e7eb;background-color:rgba(229,231,235,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity))}.bg-red-50{--bg-opacity:1;background-color:#fdf2f2;background-color:rgba(253,242,242,var(--bg-opacity))}.bg-red-100{--bg-opacity:1;background-color:#fde8e8;background-color:rgba(253,232,232,var(--bg-opacity))}.bg-yellow-100{--bg-opacity:1;background-color:#fdf6b2;background-color:rgba(253,246,178,var(--bg-opacity))}.bg-green-100{--bg-opacity:1;background-color:#def7ec;background-color:rgba(222,247,236,var(--bg-opacity))}.bg-green-300{--bg-opacity:1;background-color:#84e1bc;background-color:rgba(132,225,188,var(--bg-opacity))}.bg-green-600{--bg-opacity:1;background-color:#057a55;background-color:rgba(5,122,85,var(--bg-opacity))}.bg-teal-50{--bg-opacity:1;background-color:#edfafa;background-color:rgba(237,250,250,var(--bg-opacity))}.bg-blue-50{--bg-opacity:1;background-color:#ebf5ff;background-color:rgba(235,245,255,var(--bg-opacity))}.bg-blue-300{--bg-opacity:1;background-color:#a4cafe;background-color:rgba(164,202,254,var(--bg-opacity))}.bg-indigo-200{--bg-opacity:1;background-color:#cddbfe;background-color:rgba(205,219,254,var(--bg-opacity))}.bg-indigo-500{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.bg-indigo-600{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.bg-indigo-700{--bg-opacity:1;background-color:#5145cd;background-color:rgba(81,69,205,var(--bg-opacity))}.bg-indigo-800{--bg-opacity:1;background-color:#42389d;background-color:rgba(66,56,157,var(--bg-opacity))}.bg-pink-200{--bg-opacity:1;background-color:#fad1e8;background-color:rgba(250,209,232,var(--bg-opacity))}.group:focus .group-focus\:bg-gray-400,.group:hover .group-hover\:bg-gray-400{--bg-opacity:1;background-color:#9fa6b2;background-color:rgba(159,166,178,var(--bg-opacity))}.hover\:bg-gray-50:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.hover\:bg-green-500:hover{--bg-opacity:1;background-color:#0e9f6e;background-color:rgba(14,159,110,var(--bg-opacity))}.hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.focus\:bg-gray-50:focus{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.border-collapse{border-collapse:collapse}.border-transparent{border-color:transparent}.border-gray-100{--border-opacity:1;border-color:#f4f5f7;border-color:rgba(244,245,247,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#9fa6b2;border-color:rgba(159,166,178,var(--border-opacity))}.border-indigo-300{--border-opacity:1;border-color:#b4c6fc;border-color:rgba(180,198,252,var(--border-opacity))}.border-indigo-500{--border-opacity:1;border-color:#6875f5;border-color:rgba(104,117,245,var(--border-opacity))}.border-indigo-600{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.hover\:border-gray-200:hover{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.hover\:border-gray-500:hover{--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.hover\:border-red-400:hover{--border-opacity:1;border-color:#f98080;border-color:rgba(249,128,128,var(--border-opacity))}.hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.focus\:border-blue-300:focus{--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-0{border-width:0}.border-2{border-width:2px}.border{border-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.grid{display:grid}.contents{display:contents}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-col,.flex-row{-webkit-box-direction:normal}.flex-col{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.self-start{-ms-flex-item-align:start;align-self:flex-start}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.flex-1{-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.float-right{float:right}.float-left{float:left}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-mono{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-thin{font-weight:200}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-0{height:0}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-15{height:3.75rem}.h-20{height:5rem}.h-48{height:12rem}.h-auto{height:auto}.h-1\.5{height:.375rem}.h-2\.5{height:.625rem}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-9{line-height:2.25rem}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-4{margin:1rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mx-auto{margin-left:auto;margin-right:auto}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-5{margin-top:1.25rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-7{margin-top:1.75rem}.mb-7{margin-bottom:1.75rem}.ml-7{margin-left:1.75rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.ml-8{margin-left:2rem}.mr-10{margin-right:2.5rem}.mt-12{margin-top:3rem}.ml-12{margin-left:3rem}.ml-14{margin-left:3.5rem}.mt-16{margin-top:4rem}.mr-16{margin-right:4rem}.ml-16{margin-left:4rem}.mt-0\.5{margin-top:.125rem}.mt-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mt-2\.5{margin-top:.625rem}.-mt-1{margin-top:-.25rem}.-mr-1{margin-right:-.25rem}.-mb-1{margin-bottom:-.25rem}.-mb-2{margin-bottom:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-5{margin-top:-1.25rem}.-ml-6{margin-left:-1.5rem}.-ml-8{margin-left:-2rem}.-mb-0\.5{margin-bottom:-.125rem}.-mt-1\.5{margin-top:-.375rem}.max-h-full{max-height:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.min-w-full{min-width:100%}.object-cover{-o-object-fit:cover;object-fit:cover}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.focus\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.p-0{padding:0}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-13{padding:3.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-12{padding-top:3rem;padding-bottom:3rem}.px-12{padding-left:3rem;padding-right:3rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pt-5{padding-top:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pt-10{padding-top:2.5rem}.pl-10{padding-left:2.5rem}.pr-12{padding-right:3rem}.pb-12{padding-bottom:3rem}.pl-16{padding-left:4rem}.pt-0\.5{padding-top:.125rem}.pl-0\.5{padding-left:.125rem}.pt-1\.5{padding-top:.375rem}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{right:0;left:0}.inset-0,.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.bottom-2{bottom:.5rem}.top-8{top:2rem}.resize{resize:both}.shadow-xs{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.05);box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05);box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-inner{-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-lg:focus{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.focus\:shadow-outline:focus{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.focus\:shadow-outline-red:focus{-webkit-box-shadow:0 0 0 3px rgba(248,180,180,.45);box-shadow:0 0 0 3px rgba(248,180,180,.45)}.focus\:shadow-outline-indigo:focus{-webkit-box-shadow:0 0 0 3px rgba(180,198,252,.45);box-shadow:0 0 0 3px rgba(180,198,252,.45)}.fill-current{fill:currentColor}.table-fixed{table-layout:fixed}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#9fa6b2;color:rgba(159,166,178,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.text-red-400{--text-opacity:1;color:#f98080;color:rgba(249,128,128,var(--text-opacity))}.text-red-500{--text-opacity:1;color:#f05252;color:rgba(240,82,82,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e02424;color:rgba(224,36,36,var(--text-opacity))}.text-red-800{--text-opacity:1;color:#9b1c1c;color:rgba(155,28,28,var(--text-opacity))}.text-orange-400{--text-opacity:1;color:#ff8a4c;color:rgba(255,138,76,var(--text-opacity))}.text-orange-500{--text-opacity:1;color:#ff5a1f;color:rgba(255,90,31,var(--text-opacity))}.text-yellow-400{--text-opacity:1;color:#e3a008;color:rgba(227,160,8,var(--text-opacity))}.text-green-400{--text-opacity:1;color:#31c48d;color:rgba(49,196,141,var(--text-opacity))}.text-green-600{--text-opacity:1;color:#057a55;color:rgba(5,122,85,var(--text-opacity))}.text-green-800{--text-opacity:1;color:#03543f;color:rgba(3,84,63,var(--text-opacity))}.text-teal-400{--text-opacity:1;color:#16bdca;color:rgba(22,189,202,var(--text-opacity))}.text-teal-700{--text-opacity:1;color:#036672;color:rgba(3,102,114,var(--text-opacity))}.text-teal-800{--text-opacity:1;color:#05505c;color:rgba(5,80,92,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#76a9fa;color:rgba(118,169,250,var(--text-opacity))}.text-blue-500{--text-opacity:1;color:#3f83f8;color:rgba(63,131,248,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.text-blue-800{--text-opacity:1;color:#1e429f;color:rgba(30,66,159,var(--text-opacity))}.text-indigo-100{--text-opacity:1;color:#e5edff;color:rgba(229,237,255,var(--text-opacity))}.text-indigo-400{--text-opacity:1;color:#8da2fb;color:rgba(141,162,251,var(--text-opacity))}.text-indigo-500{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.text-indigo-600{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-indigo-700{--text-opacity:1;color:#5145cd;color:rgba(81,69,205,var(--text-opacity))}.text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.group:hover .group-hover\:text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.group:hover .group-hover\:text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.group:focus .group-focus\:text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.group:focus .group-focus\:text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-800:hover{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.hover\:text-blue-700:hover{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.hover\:text-indigo-500:hover{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.active\:text-indigo-600:active{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-opacity-75{--text-opacity:0.75}.italic{font-style:italic}.not-italic{font-style:normal}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.hover\:underline:hover{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.visible{visibility:visible}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-0{width:0}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-12{width:3rem}.w-40{width:10rem}.w-56{width:14rem}.w-auto{width:auto}.w-1\.5{width:.375rem}.w-2\.5{width:.625rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-9\/12{width:75%}.w-11\/12{width:91.666667%}.w-full{width:100%}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.gap-8{grid-gap:2rem;gap:2rem}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{-webkit-transform-origin:top right;transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.transition-all{-webkit-transition-property:all;transition-property:all}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform}.ease-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{-webkit-transition-duration:75ms;transition-duration:75ms}.duration-100{-webkit-transition-duration:.1s;transition-duration:.1s}.duration-150{-webkit-transition-duration:.15s;transition-duration:.15s}.duration-300{-webkit-transition-duration:.3s;transition-duration:.3s}@-webkit-keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes ping{75%,to{-webkit-transform:scale(2);transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{-webkit-transform:translateY(-25%);transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{-webkit-transform:none;transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media (min-width:640px){.sm\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px*(1 - var(--space-y-reverse)));margin-bottom:calc(0px*var(--space-y-reverse))}.sm\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.75rem*var(--space-y-reverse))}.sm\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem*var(--space-x-reverse));margin-left:calc(1rem*(1 - var(--space-x-reverse)))}.sm\:rounded-md{border-radius:.375rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.sm\:grid{display:grid}.sm\:flex-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.sm\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.sm\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sm\:h-10{height:2.5rem}.sm\:text-sm{font-size:.875rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-9{line-height:2.25rem}.sm\:my-0{margin-top:0;margin-bottom:0}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:my-12{margin-top:3rem;margin-bottom:3rem}.sm\:mt-0{margin-top:0}.sm\:ml-3{margin-left:.75rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-5{margin-top:1.25rem}.sm\:max-w-lg{max-width:32rem}.sm\:p-6{padding:1.5rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:w-10{width:2.5rem}.sm\:w-32{width:8rem}.sm\:w-auto{width:auto}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.333333%}.sm\:w-2\/3{width:66.666667%}.sm\:w-full{width:100%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.md\:rounded-lg{border-radius:.5rem}.md\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.md\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.md\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.md\:justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.md\:text-base{font-size:1rem}.md\:mx-0{margin-left:0;margin-right:0}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:mt-0{margin-top:0}.md\:ml-2{margin-left:.5rem}.md\:ml-4{margin-left:1rem}.md\:ml-8{margin-left:2rem}.md\:-mr-8{margin-right:-2rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-5xl{max-width:64rem}.md\:p-2{padding:.5rem}.md\:p-6{padding:1.5rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:pb-2{padding-bottom:.5rem}.md\:pr-4{padding-right:1rem}.md\:pt-6{padding-top:1.5rem}.md\:shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:w-3\/5{width:60%}}@media (min-width:1024px){.lg\:bg-transparent{background-color:transparent}.lg\:border-transparent{border-color:transparent}.lg\:rounded-full{border-radius:9999px}.lg\:block{display:block}.lg\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.lg\:inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.lg\:text-sm{font-size:.875rem}.lg\:text-lg{font-size:1.125rem}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:my-24{margin-top:6rem;margin-bottom:6rem}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:ml-16{margin-left:4rem}.lg\:-mr-16{margin-right:-4rem}.lg\:max-w-3xl{max-width:48rem}.lg\:p-6{padding:1.5rem}.lg\:p-8{padding:2rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-2{padding-top:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pl-2{padding-left:.5rem}.lg\:top-1\/2{top:50%}.lg\:shadow-none{-webkit-box-shadow:none;box-shadow:none}.lg\:w-40{width:10rem}.lg\:w-48{width:12rem}.lg\:w-1\/2{width:50%}.lg\:w-3\/5{width:60%}.lg\:w-3\/12{width:25%}.lg\:w-7\/12{width:58.333333%}}@media (min-width:1280px){.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:mr-0{margin-right:0}.xl\:ml-3{margin-left:.75rem}.xl\:ml-4{margin-left:1rem}.xl\:ml-20{margin-left:5rem}.xl\:max-w-4xl{max-width:56rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:pb-4{padding-bottom:1rem}.xl\:top-1\/3{top:33.333333%}.xl\:w-1\/4{width:25%}.xl\:w-2\/5{width:40%}.xl\:w-3\/5{width:60%}.xl\:w-2\/12{width:16.666667%}.xl\:w-7\/12{width:58.333333%}}
|
1 |
+
/*! normalize.css v8.0.1 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-webkit-text-size-adjust:100%}body{margin:0}main{display:block}h1{font-size:2em;margin:.67em 0}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}img{border-style:none}button,input,optgroup,select,textarea{font-family:inherit;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=button],[type=reset],[type=submit],button{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details{display:block}summary{display:list-item}[hidden],template{display:none}blockquote,dd,dl,figure,h1,h2,h3,h4,h5,h6,hr,p,pre{margin:0}button{background-color:transparent;background-image:none}button:focus{outline:1px dotted;outline:5px auto -webkit-focus-ring-color}fieldset,ol,ul{margin:0;padding:0}ol,ul{list-style:none}html{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji;line-height:1.5}*,:after,:before{-webkit-box-sizing:border-box;box-sizing:border-box;border:0 solid #d2d6dc}hr{border-top-width:1px}img{border-style:solid}textarea{resize:vertical}input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#a0aec0}input::-moz-placeholder,textarea::-moz-placeholder{color:#a0aec0}input::-ms-input-placeholder,textarea::-ms-input-placeholder{color:#a0aec0}input::placeholder,textarea::placeholder{color:#a0aec0}[role=button],button{cursor:pointer}table{border-collapse:collapse}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;text-decoration:inherit}button,input,optgroup,select,textarea{padding:0;line-height:inherit;color:inherit}code,kbd,pre,samp{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}audio,canvas,embed,iframe,img,object,svg,video{display:block;vertical-align:middle}img,video{max-width:100%;height:auto}a{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}img{border-width:0}.container{width:100%}@media (min-width:640px){.container{max-width:640px}}@media (min-width:768px){.container{max-width:768px}}@media (min-width:1024px){.container{max-width:1024px}}@media (min-width:1280px){.container{max-width:1280px}}.form-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-input::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-input::-moz-placeholder{color:#9fa6b2;opacity:1}.form-input::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-input::placeholder{color:#9fa6b2;opacity:1}.form-input:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-textarea{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-textarea::-webkit-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-moz-placeholder{color:#9fa6b2;opacity:1}.form-textarea::-ms-input-placeholder{color:#9fa6b2;opacity:1}.form-textarea::placeholder{color:#9fa6b2;opacity:1}.form-textarea:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-multiselect{-webkit-appearance:none;-moz-appearance:none;appearance:none;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem .75rem;font-size:1rem;line-height:1.5}.form-multiselect:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-select{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E");-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;background-repeat:no-repeat;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.375rem;padding:.5rem 2.5rem .5rem .75rem;font-size:1rem;line-height:1.5;background-position:right .5rem center;background-size:1.5em 1.5em}.form-select::-ms-expand{color:#9fa6b2;border:none}@media not print{.form-select::-ms-expand{display:none}}@media print and (-ms-high-contrast:active),print and (-ms-high-contrast:none){.form-select{padding-right:.75rem}}.form-select:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px;border-radius:.25rem}.form-checkbox:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-checkbox::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-checkbox:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-checkbox:checked:focus{border-color:transparent}.form-radio{-webkit-appearance:none;-moz-appearance:none;appearance:none;-webkit-print-color-adjust:exact;color-adjust:exact;display:inline-block;vertical-align:middle;background-origin:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-ms-flex-negative:0;flex-shrink:0;border-radius:100%;height:1rem;width:1rem;color:#3f83f8;background-color:#fff;border-color:#d2d6dc;border-width:1px}.form-radio:checked{background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E");border-color:transparent;background-color:currentColor;background-size:100% 100%;background-position:50%;background-repeat:no-repeat}@media not print{.form-radio::-ms-check{border-width:1px;color:transparent;background:inherit;border-color:inherit;border-radius:inherit}}.form-radio:focus{outline:none;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45);border-color:#a4cafe}.form-radio:checked:focus{border-color:transparent}.ig-es-primary-button,.ig-es-send-queue-emails{border-color:transparent;padding:.5rem 1rem;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.ig-es-primary-button,.ig-es-send-queue-emails,.ig-es-title-button,.wp-heading-inline+.page-title-action{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;font-size:.875rem;line-height:1.25rem;font-weight:500;--text-opacity:1;--bg-opacity:1;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-title-button,.wp-heading-inline+.page-title-action{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity));color:#374151;color:rgba(55,65,81,var(--text-opacity));background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));padding:.25rem .75rem}.wrap .wp-heading-inline+.page-title-action{margin-left:.5rem}.ig-es-title-button:hover,.wp-heading-inline+.page-title-action:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity));--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.ig-es-title-button:focus,.wp-heading-inline+.page-title-action:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45);--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.ig-es-primary-button:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity));--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.ig-es-primary-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.ig-es-imp-button{display:-webkit-inline-box!important;display:-ms-inline-flexbox!important;display:inline-flex!important;-webkit-box-pack:center!important;-ms-flex-pack:center!important;justify-content:center!important;border-radius:.375rem!important;border-width:1px!important;border-color:transparent!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;font-size:.875rem!important;line-height:1.25rem!important;font-weight:500!important;background-color:#0e9f6e!important;background-color:rgba(14,159,110,var(--bg-opacity))!important;-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform!important;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform!important;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1)!important;transition-timing-function:cubic-bezier(.4,0,.2,1)!important;-webkit-transition-duration:.15s!important;transition-duration:.15s!important}.ig-es-imp-button,.ig-es-imp-button:hover{--text-opacity:1!important;color:#fff!important;color:rgba(255,255,255,var(--text-opacity))!important;--bg-opacity:1!important}.ig-es-imp-button:hover{background-color:#31c48d!important;background-color:rgba(49,196,141,var(--bg-opacity))!important}.ig-es-imp-button:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(132,225,188,.45)!important;box-shadow:0 0 0 3px rgba(132,225,188,.45)!important}.ig-es-link-button{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex;-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center;border-radius:.375rem;border-width:1px;border-color:transparent;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));font-size:.875rem;line-height:1.25rem;font-weight:500;background-color:#ff5a1f;background-color:rgba(255,90,31,var(--bg-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.ig-es-link-button,.ig-es-link-button:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity));--bg-opacity:1}.ig-es-link-button:hover{background-color:#ff8a4c;background-color:rgba(255,138,76,var(--bg-opacity))}.ig-es-link-button:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(253,186,140,.45);box-shadow:0 0 0 3px rgba(253,186,140,.45)}.ig-es-action.js-open .ig-es-action__header{--bg-opacity:1;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity));--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity));--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity))}.form-input{--bg-opacity:1!important;background-color:#fff!important;background-color:rgba(255,255,255,var(--bg-opacity))!important;border-width:1px!important;border-radius:.375rem!important;-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05)!important;box-shadow:0 1px 2px 0 rgba(0,0,0,.05)!important;--border-opacity:1!important;border-color:#d2d6dc!important;border-color:rgba(210,214,220,var(--border-opacity))!important}.form-input:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important}.form-checkbox{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath d='M5.707 7.293a1 1 0 00-1.414 1.414l2 2a1 1 0 001.414 0l4-4a1 1 0 00-1.414-1.414L7 8.586 5.707 7.293z'/%3E%3C/svg%3E")}.form-radio{content:url("data:image/svg+xml;charset=utf-8,%3Csvg viewBox='0 0 16 16' fill='%23fff' xmlns='http://www.w3.org/2000/svg'%3E%3Ccircle cx='8' cy='8' r='3'/%3E%3C/svg%3E")}.form-checkbox:checked,.form-radio:checked{--text-opacity:1!important;color:#5850ec!important;color:rgba(88,80,236,var(--text-opacity))!important}.form-select{font-size:.875rem!important;--border-opacity:1!important;border-color:#9fa6b2!important;border-color:rgba(159,166,178,var(--border-opacity))!important;background-image:url("data:image/svg+xml;charset=utf-8,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 20 20' fill='none'%3E%3Cpath d='M7 7l3-3 3 3m0 6l-3 3-3-3' stroke='%239fa6b2' stroke-width='1.5' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E")!important}.form-select:focus,input[type=number]:focus{outline:0!important;-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;box-shadow:0 0 0 3px rgba(164,202,254,.45)!important;--border-opacity:1!important;border-color:#a4cafe!important;border-color:rgba(164,202,254,var(--border-opacity))!important}.es-check-toggle:checked~.es-mail-toggle-line{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.es-check-toggle:checked~.es-mail-toggle-dot{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-translate-x:100%}.es-mail-toggle-line{width:2.25rem;height:1.25rem;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity));-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.es-mail-toggle-dot,.es-mail-toggle-line{display:block;--bg-opacity:1;border-radius:9999px}.es-mail-toggle-dot{width:.875rem;height:.875rem;margin-left:.25rem;position:absolute;top:0;bottom:0;-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.3s;transition-duration:.3s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity));-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.es-mail-toggle-dot:focus-within{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}[type=radio]:checked+.es-mailer-logo{-webkit-transition-property:all;transition-property:all;-webkit-transition-duration:.1s;transition-duration:.1s;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));--transform-scale-x:1.1;--transform-scale-y:1.1;-webkit-box-shadow:0 0 3px 1px #5a67d8;box-shadow:0 0 3px 1px #5a67d8}[type=radio]:checked+.es-mailer-logo:hover{border-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.wp-core-ui .button,.wp-core-ui .button-secondary{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.wp-core-ui .button,.wp-core-ui .button-primary,.wp-core-ui .button-secondary{font-size:.875rem;border-radius:.375rem;border-width:1px;line-height:1.25rem;font-weight:500;--text-opacity:1}.wp-core-ui .button-primary{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity));color:#fff;color:rgba(255,255,255,var(--text-opacity));-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform;-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1);-webkit-transition-duration:.15s;transition-duration:.15s}.wp-core-ui .button-primary:hover,.wp-core-ui .button:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity));--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.wp-core-ui .search-box input[name=s],.wp-core-ui select{border-radius:.375rem}.wp-core-ui #bulk-action-selector-top,.wp-core-ui #doaction,.wp-core-ui #doaction2,.wp-core-ui #filter-by-date,.wp-core-ui #post-query-submit,.wp-core-ui #poststuff select,.wp-core-ui #search-submit{cursor:pointer;line-height:1.25rem;--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity));background-color:transparent;font-size:.875rem}.wp-core-ui #search-submit{margin-left:.375rem}.wp-core-ui #doaction2:hover .wp-core-ui #post-query-submit:hover,.wp-core-ui #doaction:hover,.wp-core-ui #search-submit:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.wp-core-ui #doaction2:focus .wp-core-ui #post-query-submit:focus,.wp-core-ui #doaction:focus,.wp-core-ui #search-submit:focus{outline:0;-webkit-box-shadow:0 0 0 3px rgba(159,166,178,.45);box-shadow:0 0 0 3px rgba(159,166,178,.45)}.es-items-lists table.fixed,.post-type-es_template table.fixed{margin-top:1.5rem;margin-bottom:1rem;-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);border-radius:.5rem;overflow:hidden}.es-items-lists table.fixed tfoot td,.es-items-lists table.fixed tfoot th,.es-items-lists table.fixed thead td,.es-items-lists table.fixed thead th,.post-type-es_template table.fixed tfoot th,.post-type-es_template table.fixed thead td,.post-type-es_template table.fixed thead th{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity));font-weight:500;letter-spacing:.05em}.es-items-lists table.fixed tfoot th,.es-items-lists table.fixed thead th,.post-type-es_template table.fixed tfoot th,.post-type-es_template table.fixed thead th{padding-top:.5rem;padding-bottom:.5rem}.es-items-lists .widefat thead td input,.post-type-es_template .widefat thead td input{margin-right:1.5rem}.post-type-es_template .wrap{padding-top:1rem;font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.post-type-es_template .wrap>h1{padding-top:0;font-weight:600;--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity));line-height:2.25rem}.es-items-lists .striped>tbody tr,.post-type-es_template .striped>tbody tr{border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));padding-top:.5rem;padding-bottom:.5rem}.es-items-lists .striped>tbody>:nth-child(odd),.post-type-es_template .striped>tbody>:nth-child(odd){--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.es_onboard_email{padding:.25rem .75rem!important}.es_reports_table_header{border-bottom-width:1px;--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity));--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity));text-align:left;font-size:.875rem;line-height:1rem;font-weight:500;--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity));letter-spacing:.05em}.space-y-1>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.25rem*var(--space-y-reverse))}.space-y-2>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.5rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.5rem*var(--space-y-reverse))}.space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.75rem*var(--space-y-reverse))}.space-x-3>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(0.75rem*var(--space-x-reverse));margin-left:calc(0.75rem*(1 - var(--space-x-reverse)))}.space-y-4>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1rem*var(--space-y-reverse))}.space-y-5>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(1.25rem*(1 - var(--space-y-reverse)));margin-bottom:calc(1.25rem*var(--space-y-reverse))}.bg-white{--bg-opacity:1;background-color:#fff;background-color:rgba(255,255,255,var(--bg-opacity))}.bg-gray-50{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.bg-gray-100{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.bg-gray-200{--bg-opacity:1;background-color:#e5e7eb;background-color:rgba(229,231,235,var(--bg-opacity))}.bg-gray-300{--bg-opacity:1;background-color:#d2d6dc;background-color:rgba(210,214,220,var(--bg-opacity))}.bg-red-50{--bg-opacity:1;background-color:#fdf2f2;background-color:rgba(253,242,242,var(--bg-opacity))}.bg-red-100{--bg-opacity:1;background-color:#fde8e8;background-color:rgba(253,232,232,var(--bg-opacity))}.bg-yellow-100{--bg-opacity:1;background-color:#fdf6b2;background-color:rgba(253,246,178,var(--bg-opacity))}.bg-green-100{--bg-opacity:1;background-color:#def7ec;background-color:rgba(222,247,236,var(--bg-opacity))}.bg-green-300{--bg-opacity:1;background-color:#84e1bc;background-color:rgba(132,225,188,var(--bg-opacity))}.bg-green-600{--bg-opacity:1;background-color:#057a55;background-color:rgba(5,122,85,var(--bg-opacity))}.bg-teal-50{--bg-opacity:1;background-color:#edfafa;background-color:rgba(237,250,250,var(--bg-opacity))}.bg-blue-50{--bg-opacity:1;background-color:#ebf5ff;background-color:rgba(235,245,255,var(--bg-opacity))}.bg-blue-300{--bg-opacity:1;background-color:#a4cafe;background-color:rgba(164,202,254,var(--bg-opacity))}.bg-indigo-200{--bg-opacity:1;background-color:#cddbfe;background-color:rgba(205,219,254,var(--bg-opacity))}.bg-indigo-500{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.bg-indigo-600{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.bg-indigo-700{--bg-opacity:1;background-color:#5145cd;background-color:rgba(81,69,205,var(--bg-opacity))}.bg-indigo-800{--bg-opacity:1;background-color:#42389d;background-color:rgba(66,56,157,var(--bg-opacity))}.bg-pink-200{--bg-opacity:1;background-color:#fad1e8;background-color:rgba(250,209,232,var(--bg-opacity))}.group:focus .group-focus\:bg-gray-400,.group:hover .group-hover\:bg-gray-400{--bg-opacity:1;background-color:#9fa6b2;background-color:rgba(159,166,178,var(--bg-opacity))}.hover\:bg-gray-50:hover{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.hover\:bg-gray-100:hover{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.hover\:bg-green-500:hover{--bg-opacity:1;background-color:#0e9f6e;background-color:rgba(14,159,110,var(--bg-opacity))}.hover\:bg-indigo-500:hover{--bg-opacity:1;background-color:#6875f5;background-color:rgba(104,117,245,var(--bg-opacity))}.hover\:bg-indigo-600:hover{--bg-opacity:1;background-color:#5850ec;background-color:rgba(88,80,236,var(--bg-opacity))}.focus\:bg-gray-50:focus{--bg-opacity:1;background-color:#f9fafb;background-color:rgba(249,250,251,var(--bg-opacity))}.focus\:bg-gray-100:focus{--bg-opacity:1;background-color:#f4f5f7;background-color:rgba(244,245,247,var(--bg-opacity))}.border-collapse{border-collapse:collapse}.border-transparent{border-color:transparent}.border-gray-100{--border-opacity:1;border-color:#f4f5f7;border-color:rgba(244,245,247,var(--border-opacity))}.border-gray-200{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.border-gray-300{--border-opacity:1;border-color:#d2d6dc;border-color:rgba(210,214,220,var(--border-opacity))}.border-gray-400{--border-opacity:1;border-color:#9fa6b2;border-color:rgba(159,166,178,var(--border-opacity))}.border-indigo-300{--border-opacity:1;border-color:#b4c6fc;border-color:rgba(180,198,252,var(--border-opacity))}.border-indigo-500{--border-opacity:1;border-color:#6875f5;border-color:rgba(104,117,245,var(--border-opacity))}.border-indigo-600{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.hover\:border-gray-200:hover{--border-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--border-opacity))}.hover\:border-gray-500:hover{--border-opacity:1;border-color:#6b7280;border-color:rgba(107,114,128,var(--border-opacity))}.hover\:border-red-400:hover{--border-opacity:1;border-color:#f98080;border-color:rgba(249,128,128,var(--border-opacity))}.hover\:border-indigo-600:hover{--border-opacity:1;border-color:#5850ec;border-color:rgba(88,80,236,var(--border-opacity))}.focus\:border-blue-300:focus{--border-opacity:1;border-color:#a4cafe;border-color:rgba(164,202,254,var(--border-opacity))}.rounded{border-radius:.25rem}.rounded-md{border-radius:.375rem}.rounded-lg{border-radius:.5rem}.rounded-full{border-radius:9999px}.rounded-r-lg{border-top-right-radius:.5rem;border-bottom-right-radius:.5rem}.rounded-l-lg{border-top-left-radius:.5rem;border-bottom-left-radius:.5rem}.border-dashed{border-style:dashed}.border-dotted{border-style:dotted}.border-0{border-width:0}.border-2{border-width:2px}.border{border-width:1px}.border-t{border-top-width:1px}.border-r{border-right-width:1px}.border-b{border-bottom-width:1px}.cursor-default{cursor:default}.cursor-pointer{cursor:pointer}.cursor-not-allowed{cursor:not-allowed}.block{display:block}.inline-block{display:inline-block}.inline{display:inline}.flex{display:-webkit-box;display:-ms-flexbox;display:flex}.inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.table{display:table}.table-caption{display:table-caption}.table-cell{display:table-cell}.grid{display:grid}.contents{display:contents}.hidden{display:none}.flex-row{-webkit-box-orient:horizontal;-ms-flex-direction:row;flex-direction:row}.flex-col,.flex-row{-webkit-box-direction:normal}.flex-col{-webkit-box-orient:vertical;-ms-flex-direction:column;flex-direction:column}.flex-wrap{-ms-flex-wrap:wrap;flex-wrap:wrap}.items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.self-start{-ms-flex-item-align:start;align-self:flex-start}.justify-start{-webkit-box-pack:start;-ms-flex-pack:start;justify-content:flex-start}.justify-center{-webkit-box-pack:center;-ms-flex-pack:center;justify-content:center}.justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.flex-1{-webkit-box-flex:1;-ms-flex:1 1 0%;flex:1 1 0%}.flex-auto{-webkit-box-flex:1;-ms-flex:1 1 auto;flex:1 1 auto}.flex-none{-webkit-box-flex:0;-ms-flex:none;flex:none}.flex-shrink-0{-ms-flex-negative:0;flex-shrink:0}.float-right{float:right}.float-left{float:left}.font-sans{font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,Noto Sans,sans-serif,Apple Color Emoji,Segoe UI Emoji,Segoe UI Symbol,Noto Color Emoji}.font-mono{font-family:Menlo,Monaco,Consolas,Liberation Mono,Courier New,monospace}.font-thin{font-weight:200}.font-normal{font-weight:400}.font-medium{font-weight:500}.font-semibold{font-weight:600}.font-bold{font-weight:700}.h-0{height:0}.h-2{height:.5rem}.h-3{height:.75rem}.h-4{height:1rem}.h-5{height:1.25rem}.h-6{height:1.5rem}.h-7{height:1.75rem}.h-8{height:2rem}.h-9{height:2.25rem}.h-10{height:2.5rem}.h-12{height:3rem}.h-15{height:3.75rem}.h-20{height:5rem}.h-48{height:12rem}.h-auto{height:auto}.h-1\.5{height:.375rem}.h-2\.5{height:.625rem}.h-full{height:100%}.text-xs{font-size:.75rem}.text-sm{font-size:.875rem}.text-base{font-size:1rem}.text-lg{font-size:1.125rem}.text-xl{font-size:1.25rem}.text-2xl{font-size:1.5rem}.text-3xl{font-size:1.875rem}.text-4xl{font-size:2.25rem}.leading-4{line-height:1rem}.leading-5{line-height:1.25rem}.leading-6{line-height:1.5rem}.leading-7{line-height:1.75rem}.leading-9{line-height:2.25rem}.leading-none{line-height:1}.leading-snug{line-height:1.375}.leading-normal{line-height:1.5}.leading-relaxed{line-height:1.625}.list-none{list-style-type:none}.list-disc{list-style-type:disc}.list-decimal{list-style-type:decimal}.m-4{margin:1rem}.my-0{margin-top:0;margin-bottom:0}.my-1{margin-top:.25rem;margin-bottom:.25rem}.mx-1{margin-left:.25rem;margin-right:.25rem}.my-2{margin-top:.5rem;margin-bottom:.5rem}.mx-2{margin-left:.5rem;margin-right:.5rem}.my-3{margin-top:.75rem;margin-bottom:.75rem}.my-4{margin-top:1rem;margin-bottom:1rem}.mx-4{margin-left:1rem;margin-right:1rem}.my-6{margin-top:1.5rem;margin-bottom:1.5rem}.mx-6{margin-left:1.5rem;margin-right:1.5rem}.my-8{margin-top:2rem;margin-bottom:2rem}.mx-8{margin-left:2rem;margin-right:2rem}.my-12{margin-top:3rem;margin-bottom:3rem}.mx-auto{margin-left:auto;margin-right:auto}.-my-4{margin-top:-1rem;margin-bottom:-1rem}.mt-0{margin-top:0}.mb-0{margin-bottom:0}.mt-1{margin-top:.25rem}.mr-1{margin-right:.25rem}.mb-1{margin-bottom:.25rem}.ml-1{margin-left:.25rem}.mt-2{margin-top:.5rem}.mr-2{margin-right:.5rem}.mb-2{margin-bottom:.5rem}.ml-2{margin-left:.5rem}.mt-3{margin-top:.75rem}.mr-3{margin-right:.75rem}.mb-3{margin-bottom:.75rem}.ml-3{margin-left:.75rem}.mt-4{margin-top:1rem}.mr-4{margin-right:1rem}.mb-4{margin-bottom:1rem}.ml-4{margin-left:1rem}.mt-5{margin-top:1.25rem}.ml-5{margin-left:1.25rem}.mt-6{margin-top:1.5rem}.mr-6{margin-right:1.5rem}.mb-6{margin-bottom:1.5rem}.ml-6{margin-left:1.5rem}.mt-7{margin-top:1.75rem}.mb-7{margin-bottom:1.75rem}.ml-7{margin-left:1.75rem}.mt-8{margin-top:2rem}.mr-8{margin-right:2rem}.ml-8{margin-left:2rem}.mr-10{margin-right:2.5rem}.mt-12{margin-top:3rem}.ml-12{margin-left:3rem}.ml-14{margin-left:3.5rem}.mt-16{margin-top:4rem}.mr-16{margin-right:4rem}.ml-16{margin-left:4rem}.mt-0\.5{margin-top:.125rem}.mt-1\.5{margin-top:.375rem}.mr-1\.5{margin-right:.375rem}.mt-2\.5{margin-top:.625rem}.-mt-1{margin-top:-.25rem}.-mr-1{margin-right:-.25rem}.-mb-1{margin-bottom:-.25rem}.-mb-2{margin-bottom:-.5rem}.-mt-3{margin-top:-.75rem}.-mt-5{margin-top:-1.25rem}.-ml-6{margin-left:-1.5rem}.-ml-8{margin-left:-2rem}.-mb-0\.5{margin-bottom:-.125rem}.-mt-1\.5{margin-top:-.375rem}.max-h-full{max-height:100%}.max-w-7xl{max-width:80rem}.max-w-full{max-width:100%}.min-h-screen{min-height:100vh}.min-w-0{min-width:0}.min-w-full{min-width:100%}.object-cover{-o-object-fit:cover;object-fit:cover}.opacity-0{opacity:0}.opacity-50{opacity:.5}.opacity-100{opacity:1}.focus\:outline-none:focus{outline:0}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.overflow-x-hidden{overflow-x:hidden}.p-0{padding:0}.p-2{padding:.5rem}.p-3{padding:.75rem}.p-4{padding:1rem}.p-13{padding:3.25rem}.py-1{padding-top:.25rem;padding-bottom:.25rem}.px-1{padding-left:.25rem;padding-right:.25rem}.py-2{padding-top:.5rem;padding-bottom:.5rem}.px-2{padding-left:.5rem;padding-right:.5rem}.py-3{padding-top:.75rem;padding-bottom:.75rem}.px-3{padding-left:.75rem;padding-right:.75rem}.py-4{padding-top:1rem;padding-bottom:1rem}.px-4{padding-left:1rem;padding-right:1rem}.py-5{padding-top:1.25rem;padding-bottom:1.25rem}.px-5{padding-left:1.25rem;padding-right:1.25rem}.px-6{padding-left:1.5rem;padding-right:1.5rem}.py-8{padding-top:2rem;padding-bottom:2rem}.py-12{padding-top:3rem;padding-bottom:3rem}.px-12{padding-left:3rem;padding-right:3rem}.py-0\.5{padding-top:.125rem;padding-bottom:.125rem}.py-1\.5{padding-top:.375rem;padding-bottom:.375rem}.px-1\.5{padding-left:.375rem;padding-right:.375rem}.pt-1{padding-top:.25rem}.pr-1{padding-right:.25rem}.pb-1{padding-bottom:.25rem}.pl-1{padding-left:.25rem}.pt-2{padding-top:.5rem}.pr-2{padding-right:.5rem}.pb-2{padding-bottom:.5rem}.pl-2{padding-left:.5rem}.pt-3{padding-top:.75rem}.pr-3{padding-right:.75rem}.pb-3{padding-bottom:.75rem}.pl-3{padding-left:.75rem}.pt-4{padding-top:1rem}.pr-4{padding-right:1rem}.pb-4{padding-bottom:1rem}.pl-4{padding-left:1rem}.pt-5{padding-top:1.25rem}.pb-5{padding-bottom:1.25rem}.pl-5{padding-left:1.25rem}.pt-6{padding-top:1.5rem}.pr-6{padding-right:1.5rem}.pb-6{padding-bottom:1.5rem}.pl-6{padding-left:1.5rem}.pt-7{padding-top:1.75rem}.pt-8{padding-top:2rem}.pb-8{padding-bottom:2rem}.pl-8{padding-left:2rem}.pt-10{padding-top:2.5rem}.pl-10{padding-left:2.5rem}.pr-12{padding-right:3rem}.pb-12{padding-bottom:3rem}.pl-16{padding-left:4rem}.pt-0\.5{padding-top:.125rem}.pl-0\.5{padding-left:.125rem}.pt-1\.5{padding-top:.375rem}.pointer-events-none{pointer-events:none}.static{position:static}.fixed{position:fixed}.absolute{position:absolute}.relative{position:relative}.sticky{position:-webkit-sticky;position:sticky}.inset-0{right:0;left:0}.inset-0,.inset-y-0{top:0;bottom:0}.top-0{top:0}.right-0{right:0}.left-0{left:0}.bottom-2{bottom:.5rem}.top-8{top:2rem}.resize{resize:both}.shadow-xs{-webkit-box-shadow:0 0 0 1px rgba(0,0,0,.05);box-shadow:0 0 0 1px rgba(0,0,0,.05)}.shadow-sm{-webkit-box-shadow:0 1px 2px 0 rgba(0,0,0,.05);box-shadow:0 1px 2px 0 rgba(0,0,0,.05)}.shadow{-webkit-box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06);box-shadow:0 1px 3px 0 rgba(0,0,0,.1),0 1px 2px 0 rgba(0,0,0,.06)}.shadow-md{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.shadow-lg{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.shadow-inner{-webkit-box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06);box-shadow:inset 0 2px 4px 0 rgba(0,0,0,.06)}.hover\:shadow-md:hover{-webkit-box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06);box-shadow:0 4px 6px -1px rgba(0,0,0,.1),0 2px 4px -1px rgba(0,0,0,.06)}.focus\:shadow-lg:focus{-webkit-box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05);box-shadow:0 10px 15px -3px rgba(0,0,0,.1),0 4px 6px -2px rgba(0,0,0,.05)}.focus\:shadow-outline:focus{-webkit-box-shadow:0 0 0 3px rgba(118,169,250,.45);box-shadow:0 0 0 3px rgba(118,169,250,.45)}.focus\:shadow-outline-blue:focus{-webkit-box-shadow:0 0 0 3px rgba(164,202,254,.45);box-shadow:0 0 0 3px rgba(164,202,254,.45)}.focus\:shadow-outline-red:focus{-webkit-box-shadow:0 0 0 3px rgba(248,180,180,.45);box-shadow:0 0 0 3px rgba(248,180,180,.45)}.focus\:shadow-outline-indigo:focus{-webkit-box-shadow:0 0 0 3px rgba(180,198,252,.45);box-shadow:0 0 0 3px rgba(180,198,252,.45)}.fill-current{fill:currentColor}.table-fixed{table-layout:fixed}.text-left{text-align:left}.text-center{text-align:center}.text-right{text-align:right}.text-white{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.text-black{--text-opacity:1;color:#000;color:rgba(0,0,0,var(--text-opacity))}.text-gray-400{--text-opacity:1;color:#9fa6b2;color:rgba(159,166,178,var(--text-opacity))}.text-gray-500{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,var(--text-opacity))}.text-gray-600{--text-opacity:1;color:#4b5563;color:rgba(75,85,99,var(--text-opacity))}.text-gray-700{--text-opacity:1;color:#374151;color:rgba(55,65,81,var(--text-opacity))}.text-gray-800{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.text-red-400{--text-opacity:1;color:#f98080;color:rgba(249,128,128,var(--text-opacity))}.text-red-500{--text-opacity:1;color:#f05252;color:rgba(240,82,82,var(--text-opacity))}.text-red-600{--text-opacity:1;color:#e02424;color:rgba(224,36,36,var(--text-opacity))}.text-red-800{--text-opacity:1;color:#9b1c1c;color:rgba(155,28,28,var(--text-opacity))}.text-orange-400{--text-opacity:1;color:#ff8a4c;color:rgba(255,138,76,var(--text-opacity))}.text-orange-500{--text-opacity:1;color:#ff5a1f;color:rgba(255,90,31,var(--text-opacity))}.text-yellow-400{--text-opacity:1;color:#e3a008;color:rgba(227,160,8,var(--text-opacity))}.text-green-400{--text-opacity:1;color:#31c48d;color:rgba(49,196,141,var(--text-opacity))}.text-green-600{--text-opacity:1;color:#057a55;color:rgba(5,122,85,var(--text-opacity))}.text-green-800{--text-opacity:1;color:#03543f;color:rgba(3,84,63,var(--text-opacity))}.text-teal-400{--text-opacity:1;color:#16bdca;color:rgba(22,189,202,var(--text-opacity))}.text-teal-700{--text-opacity:1;color:#036672;color:rgba(3,102,114,var(--text-opacity))}.text-teal-800{--text-opacity:1;color:#05505c;color:rgba(5,80,92,var(--text-opacity))}.text-blue-400{--text-opacity:1;color:#76a9fa;color:rgba(118,169,250,var(--text-opacity))}.text-blue-500{--text-opacity:1;color:#3f83f8;color:rgba(63,131,248,var(--text-opacity))}.text-blue-700{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.text-blue-800{--text-opacity:1;color:#1e429f;color:rgba(30,66,159,var(--text-opacity))}.text-indigo-100{--text-opacity:1;color:#e5edff;color:rgba(229,237,255,var(--text-opacity))}.text-indigo-400{--text-opacity:1;color:#8da2fb;color:rgba(141,162,251,var(--text-opacity))}.text-indigo-500{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.text-indigo-600{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-indigo-700{--text-opacity:1;color:#5145cd;color:rgba(81,69,205,var(--text-opacity))}.text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.group:hover .group-hover\:text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.group:hover .group-hover\:text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.group:focus .group-focus\:text-gray-900{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.group:focus .group-focus\:text-indigo-800{--text-opacity:1;color:#42389d;color:rgba(66,56,157,var(--text-opacity))}.hover\:text-white:hover{--text-opacity:1;color:#fff;color:rgba(255,255,255,var(--text-opacity))}.hover\:text-gray-800:hover{--text-opacity:1;color:#252f3f;color:rgba(37,47,63,var(--text-opacity))}.hover\:text-gray-900:hover{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.hover\:text-blue-700:hover{--text-opacity:1;color:#1a56db;color:rgba(26,86,219,var(--text-opacity))}.hover\:text-indigo-500:hover{--text-opacity:1;color:#6875f5;color:rgba(104,117,245,var(--text-opacity))}.focus\:text-gray-900:focus{--text-opacity:1;color:#161e2e;color:rgba(22,30,46,var(--text-opacity))}.active\:text-indigo-600:active{--text-opacity:1;color:#5850ec;color:rgba(88,80,236,var(--text-opacity))}.text-opacity-75{--text-opacity:0.75}.italic{font-style:italic}.not-italic{font-style:normal}.uppercase{text-transform:uppercase}.lowercase{text-transform:lowercase}.underline{text-decoration:underline}.no-underline{text-decoration:none}.hover\:underline:hover{text-decoration:underline}.antialiased{-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.tracking-wide{letter-spacing:.025em}.tracking-wider{letter-spacing:.05em}.select-none{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.select-all{-webkit-user-select:all;-moz-user-select:all;-ms-user-select:all;user-select:all}.align-middle{vertical-align:middle}.align-bottom{vertical-align:bottom}.visible{visibility:visible}.whitespace-no-wrap{white-space:nowrap}.break-words{overflow-wrap:break-word}.break-all{word-break:break-all}.truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.w-0{width:0}.w-2{width:.5rem}.w-3{width:.75rem}.w-4{width:1rem}.w-5{width:1.25rem}.w-6{width:1.5rem}.w-7{width:1.75rem}.w-8{width:2rem}.w-12{width:3rem}.w-24{width:6rem}.w-40{width:10rem}.w-56{width:14rem}.w-auto{width:auto}.w-1\.5{width:.375rem}.w-2\.5{width:.625rem}.w-1\/2{width:50%}.w-1\/3{width:33.333333%}.w-2\/3{width:66.666667%}.w-1\/4{width:25%}.w-2\/4{width:50%}.w-3\/4{width:75%}.w-1\/5{width:20%}.w-2\/5{width:40%}.w-3\/5{width:60%}.w-4\/5{width:80%}.w-3\/6{width:50%}.w-4\/6{width:66.666667%}.w-5\/6{width:83.333333%}.w-1\/12{width:8.333333%}.w-2\/12{width:16.666667%}.w-3\/12{width:25%}.w-4\/12{width:33.333333%}.w-5\/12{width:41.666667%}.w-9\/12{width:75%}.w-11\/12{width:91.666667%}.w-full{width:100%}.z-20{z-index:20}.z-40{z-index:40}.z-50{z-index:50}.gap-8{grid-gap:2rem;gap:2rem}.grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}.transform{--transform-translate-x:0;--transform-translate-y:0;--transform-rotate:0;--transform-skew-x:0;--transform-skew-y:0;--transform-scale-x:1;--transform-scale-y:1;-webkit-transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y));transform:translateX(var(--transform-translate-x)) translateY(var(--transform-translate-y)) rotate(var(--transform-rotate)) skewX(var(--transform-skew-x)) skewY(var(--transform-skew-y)) scaleX(var(--transform-scale-x)) scaleY(var(--transform-scale-y))}.origin-top-right{-webkit-transform-origin:top right;transform-origin:top right}.scale-95{--transform-scale-x:.95;--transform-scale-y:.95}.scale-100{--transform-scale-x:1;--transform-scale-y:1}.transition-all{-webkit-transition-property:all;transition-property:all}.transition{-webkit-transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,-webkit-box-shadow,-webkit-transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform;transition-property:background-color,border-color,color,fill,stroke,opacity,box-shadow,transform,-webkit-box-shadow,-webkit-transform}.ease-in{-webkit-transition-timing-function:cubic-bezier(.4,0,1,1);transition-timing-function:cubic-bezier(.4,0,1,1)}.ease-out{-webkit-transition-timing-function:cubic-bezier(0,0,.2,1);transition-timing-function:cubic-bezier(0,0,.2,1)}.ease-in-out{-webkit-transition-timing-function:cubic-bezier(.4,0,.2,1);transition-timing-function:cubic-bezier(.4,0,.2,1)}.duration-75{-webkit-transition-duration:75ms;transition-duration:75ms}.duration-100{-webkit-transition-duration:.1s;transition-duration:.1s}.duration-150{-webkit-transition-duration:.15s;transition-duration:.15s}.duration-300{-webkit-transition-duration:.3s;transition-duration:.3s}@-webkit-keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes spin{to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes ping{75%,to{-webkit-transform:scale(2);transform:scale(2);opacity:0}}@keyframes pulse{50%{opacity:.5}}@keyframes bounce{0%,to{-webkit-transform:translateY(-25%);transform:translateY(-25%);-webkit-animation-timing-function:cubic-bezier(.8,0,1,1);animation-timing-function:cubic-bezier(.8,0,1,1)}50%{-webkit-transform:none;transform:none;-webkit-animation-timing-function:cubic-bezier(0,0,.2,1);animation-timing-function:cubic-bezier(0,0,.2,1)}}.animate-ping{-webkit-animation:ping 1s cubic-bezier(0,0,.2,1) infinite;animation:ping 1s cubic-bezier(0,0,.2,1) infinite}.animate-pulse{-webkit-animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite;animation:pulse 2s cubic-bezier(.4,0,.6,1) infinite}@media (min-width:640px){.sm\:space-y-0>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0px*(1 - var(--space-y-reverse)));margin-bottom:calc(0px*var(--space-y-reverse))}.sm\:space-y-3>:not(template)~:not(template){--space-y-reverse:0;margin-top:calc(0.75rem*(1 - var(--space-y-reverse)));margin-bottom:calc(0.75rem*var(--space-y-reverse))}.sm\:space-x-4>:not(template)~:not(template){--space-x-reverse:0;margin-right:calc(1rem*var(--space-x-reverse));margin-left:calc(1rem*(1 - var(--space-x-reverse)))}.sm\:rounded-md{border-radius:.375rem}.sm\:rounded-lg{border-radius:.5rem}.sm\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.sm\:grid{display:grid}.sm\:flex-row-reverse{-webkit-box-orient:horizontal;-webkit-box-direction:reverse;-ms-flex-direction:row-reverse;flex-direction:row-reverse}.sm\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.sm\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.sm\:h-10{height:2.5rem}.sm\:text-sm{font-size:.875rem}.sm\:text-2xl{font-size:1.5rem}.sm\:text-3xl{font-size:1.875rem}.sm\:leading-5{line-height:1.25rem}.sm\:leading-7{line-height:1.75rem}.sm\:leading-9{line-height:2.25rem}.sm\:my-0{margin-top:0;margin-bottom:0}.sm\:mx-0{margin-left:0;margin-right:0}.sm\:my-7{margin-top:1.75rem;margin-bottom:1.75rem}.sm\:my-8{margin-top:2rem;margin-bottom:2rem}.sm\:my-12{margin-top:3rem;margin-bottom:3rem}.sm\:mt-0{margin-top:0}.sm\:ml-3{margin-left:.75rem}.sm\:ml-4{margin-left:1rem}.sm\:mt-5{margin-top:1.25rem}.sm\:max-w-lg{max-width:32rem}.sm\:p-6{padding:1.5rem}.sm\:px-0{padding-left:0;padding-right:0}.sm\:px-2{padding-left:.5rem;padding-right:.5rem}.sm\:px-4{padding-left:1rem;padding-right:1rem}.sm\:px-6{padding-left:1.5rem;padding-right:1.5rem}.sm\:pb-4{padding-bottom:1rem}.sm\:text-left{text-align:left}.sm\:align-middle{vertical-align:middle}.sm\:truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sm\:w-10{width:2.5rem}.sm\:w-32{width:8rem}.sm\:w-auto{width:auto}.sm\:w-1\/2{width:50%}.sm\:w-1\/3{width:33.333333%}.sm\:w-2\/3{width:66.666667%}.sm\:w-full{width:100%}.sm\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.sm\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (min-width:768px){.md\:rounded-lg{border-radius:.5rem}.md\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.md\:items-start{-webkit-box-align:start;-ms-flex-align:start;align-items:flex-start}.md\:items-center{-webkit-box-align:center;-ms-flex-align:center;align-items:center}.md\:justify-between{-webkit-box-pack:justify;-ms-flex-pack:justify;justify-content:space-between}.md\:text-base{font-size:1rem}.md\:mx-0{margin-left:0;margin-right:0}.md\:my-2{margin-top:.5rem;margin-bottom:.5rem}.md\:mx-auto{margin-left:auto;margin-right:auto}.md\:mt-0{margin-top:0}.md\:ml-2{margin-left:.5rem}.md\:ml-4{margin-left:1rem}.md\:ml-8{margin-left:2rem}.md\:-mr-8{margin-right:-2rem}.md\:max-w-xl{max-width:36rem}.md\:max-w-5xl{max-width:64rem}.md\:p-2{padding:.5rem}.md\:p-6{padding:1.5rem}.md\:py-0{padding-top:0;padding-bottom:0}.md\:px-1{padding-left:.25rem;padding-right:.25rem}.md\:px-2{padding-left:.5rem;padding-right:.5rem}.md\:py-5{padding-top:1.25rem;padding-bottom:1.25rem}.md\:px-8{padding-left:2rem;padding-right:2rem}.md\:pb-2{padding-bottom:.5rem}.md\:pr-4{padding-right:1rem}.md\:pt-6{padding-top:1.5rem}.md\:shadow-xl{-webkit-box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04);box-shadow:0 20px 25px -5px rgba(0,0,0,.1),0 10px 10px -5px rgba(0,0,0,.04)}.md\:w-3\/5{width:60%}}@media (min-width:1024px){.lg\:bg-transparent{background-color:transparent}.lg\:border-transparent{border-color:transparent}.lg\:rounded-full{border-radius:9999px}.lg\:block{display:block}.lg\:flex{display:-webkit-box;display:-ms-flexbox;display:flex}.lg\:inline-flex{display:-webkit-inline-box;display:-ms-inline-flexbox;display:inline-flex}.lg\:text-sm{font-size:.875rem}.lg\:text-lg{font-size:1.125rem}.lg\:my-0{margin-top:0;margin-bottom:0}.lg\:mx-5{margin-left:1.25rem;margin-right:1.25rem}.lg\:my-24{margin-top:6rem;margin-bottom:6rem}.lg\:mx-auto{margin-left:auto;margin-right:auto}.lg\:ml-16{margin-left:4rem}.lg\:-mr-16{margin-right:-4rem}.lg\:max-w-3xl{max-width:48rem}.lg\:p-6{padding:1.5rem}.lg\:p-8{padding:2rem}.lg\:px-3{padding-left:.75rem;padding-right:.75rem}.lg\:px-4{padding-left:1rem;padding-right:1rem}.lg\:px-8{padding-left:2rem;padding-right:2rem}.lg\:pt-2{padding-top:.5rem}.lg\:pb-2{padding-bottom:.5rem}.lg\:pl-2{padding-left:.5rem}.lg\:top-1\/2{top:50%}.lg\:shadow-none{-webkit-box-shadow:none;box-shadow:none}.lg\:w-40{width:10rem}.lg\:w-48{width:12rem}.lg\:w-1\/2{width:50%}.lg\:w-3\/5{width:60%}.lg\:w-3\/12{width:25%}.lg\:w-7\/12{width:58.333333%}}@media (min-width:1280px){.xl\:mx-7{margin-left:1.75rem;margin-right:1.75rem}.xl\:mr-0{margin-right:0}.xl\:ml-3{margin-left:.75rem}.xl\:ml-4{margin-left:1rem}.xl\:ml-20{margin-left:5rem}.xl\:max-w-4xl{max-width:56rem}.xl\:px-4{padding-left:1rem;padding-right:1rem}.xl\:pb-4{padding-bottom:1rem}.xl\:top-1\/3{top:33.333333%}.xl\:w-1\/4{width:25%}.xl\:w-2\/5{width:40%}.xl\:w-3\/5{width:60%}.xl\:w-2\/12{width:16.666667%}.xl\:w-7\/12{width:58.333333%}}
|
lite/admin/js/email-subscribers-admin.js
CHANGED
@@ -55,15 +55,27 @@
|
|
55 |
|
56 |
});
|
57 |
|
58 |
-
$(
|
|
|
59 |
|
|
|
60 |
let scheduling_option = $(this).val();
|
|
|
|
|
|
|
|
|
|
|
61 |
if ( 'schedule_later' === scheduling_option ) {
|
62 |
$('.display_schedule').removeClass('hidden');
|
|
|
|
|
63 |
} else {
|
64 |
$('.display_schedule').addClass('hidden');
|
|
|
65 |
}
|
66 |
-
}
|
|
|
|
|
67 |
|
68 |
$('#preview_template').hide();
|
69 |
$('#spam_score_modal').hide();
|
55 |
|
56 |
});
|
57 |
|
58 |
+
let schedule_option = $('input:radio[name="broadcast_data[scheduling_option]"]:checked').val()
|
59 |
+
broadcast_send_option_change_text(schedule_option);
|
60 |
|
61 |
+
$("input:radio[name='broadcast_data[scheduling_option]']").click(function() {
|
62 |
let scheduling_option = $(this).val();
|
63 |
+
broadcast_send_option_change_text(scheduling_option);
|
64 |
+
|
65 |
+
});
|
66 |
+
|
67 |
+
function broadcast_send_option_change_text( scheduling_option = 'Schedule' ) {
|
68 |
if ( 'schedule_later' === scheduling_option ) {
|
69 |
$('.display_schedule').removeClass('hidden');
|
70 |
+
$('.ig_es_broadcast_send_option_text').text('Schedule');
|
71 |
+
|
72 |
} else {
|
73 |
$('.display_schedule').addClass('hidden');
|
74 |
+
$('.ig_es_broadcast_send_option_text').text('Send');
|
75 |
}
|
76 |
+
}
|
77 |
+
|
78 |
+
|
79 |
|
80 |
$('#preview_template').hide();
|
81 |
$('#spam_score_modal').hide();
|
lite/admin/partials/onboarding.php
CHANGED
@@ -379,7 +379,7 @@
|
|
379 |
type="button"
|
380 |
id="es_delivery_check_processed"
|
381 |
class="relative inline-flex items-center px-4 py-2 text-base font-medium leading-5 text-white bg-indigo-800 border border-transparent rounded-md hover:bg-indigo-600 focus:outline-none focus:shadow-outline"
|
382 |
-
data-error-text="<?php echo
|
383 |
>
|
384 |
<?php echo esc_html__('All good, let\'s finish up →', 'email-subscribers'); ?>
|
385 |
</button>
|
379 |
type="button"
|
380 |
id="es_delivery_check_processed"
|
381 |
class="relative inline-flex items-center px-4 py-2 text-base font-medium leading-5 text-white bg-indigo-800 border border-transparent rounded-md hover:bg-indigo-600 focus:outline-none focus:shadow-outline"
|
382 |
+
data-error-text="<?php echo esc_attr__( 'Continue anyway →', 'email-subscribers' ); ?>"
|
383 |
>
|
384 |
<?php echo esc_html__('All good, let\'s finish up →', 'email-subscribers'); ?>
|
385 |
</button>
|
lite/includes/class-email-subscribers-i18n.php
CHANGED
@@ -19,10 +19,10 @@ class Email_Subscribers_I18n {
|
|
19 |
*/
|
20 |
public function load_plugin_textdomain() {
|
21 |
|
|
|
22 |
load_plugin_textdomain(
|
23 |
-
|
24 |
);
|
25 |
-
|
26 |
}
|
27 |
|
28 |
}
|
19 |
*/
|
20 |
public function load_plugin_textdomain() {
|
21 |
|
22 |
+
$plugin_text_domain = 'email-subscribers';
|
23 |
load_plugin_textdomain(
|
24 |
+
$plugin_text_domain, false, dirname( dirname( plugin_basename( __FILE__ ) ) ) . '/languages/'
|
25 |
);
|
|
|
26 |
}
|
27 |
|
28 |
}
|
lite/includes/class-email-subscribers.php
CHANGED
@@ -688,7 +688,9 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
688 |
'lite/includes/classes/class-es-form-widget.php',
|
689 |
'lite/includes/classes/class-es-export-subscribers.php',
|
690 |
'lite/includes/classes/class-es-import-subscribers.php',
|
|
|
691 |
'lite/includes/classes/class-es-info.php',
|
|
|
692 |
'lite/includes/classes/class-es-handle-post-notification.php',
|
693 |
'lite/includes/classes/class-es-handle-subscription.php',
|
694 |
'lite/includes/classes/class-es-handle-sync-wp-user.php',
|
@@ -722,13 +724,17 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
722 |
// End-IG-Code.
|
723 |
'lite/admin/class-email-subscribers-admin.php',
|
724 |
|
|
|
725 |
// Pro Feature
|
726 |
'lite/includes/pro-features.php',
|
|
|
727 |
|
728 |
// Feedback Class
|
729 |
'lite/includes/feedback/class-ig-tracker.php',
|
|
|
730 |
'lite/includes/feedback/class-ig-feedback.php',
|
731 |
'lite/includes/feedback.php',
|
|
|
732 |
|
733 |
//Load Starter & Pro files if exists
|
734 |
'starter/class-es-utils.php',
|
@@ -856,6 +862,9 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
856 |
|
857 |
// Premium services ui components.
|
858 |
'lite/includes/premium-services-ui/class-ig-es-premium-services-ui.php',
|
|
|
|
|
|
|
859 |
);
|
860 |
|
861 |
foreach ( $files_to_load as $file ) {
|
@@ -1148,11 +1157,7 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
1148 |
public function get_es_admin_screens() {
|
1149 |
|
1150 |
// TODO: Can be updated with a version check when https://core.trac.wordpress.org/ticket/18857 is fixed
|
1151 |
-
|
1152 |
-
$prefix = sanitize_title( __( 'Marketing Automation', 'email-subscribers' ) );
|
1153 |
-
} else {
|
1154 |
-
$prefix = sanitize_title( __( 'Email Subscribers', 'email-subscribers' ) );
|
1155 |
-
}
|
1156 |
|
1157 |
$screens = array(
|
1158 |
'es_template',
|
@@ -1320,6 +1325,7 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
1320 |
self::$instance->workflows_db = new ES_DB_Workflows();
|
1321 |
self::$instance->trial = new IG_ES_Trial();
|
1322 |
|
|
|
1323 |
if ( is_admin() ) {
|
1324 |
$ig_es_feedback_class = 'IG_Feedback_V_' . str_replace( '.', '_', IG_ES_FEEDBACK_TRACKER_VERSION );
|
1325 |
|
@@ -1341,6 +1347,7 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
1341 |
|
1342 |
$ig_es_feedback->render_deactivate_feedback();
|
1343 |
}
|
|
|
1344 |
|
1345 |
add_action( 'admin_init', array( self::$instance, 'add_admin_notice' ) );
|
1346 |
add_action( 'admin_init', array( self::$instance, 'check_trial_optin_consent' ) );
|
@@ -1356,26 +1363,6 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
1356 |
return self::$instance;
|
1357 |
}
|
1358 |
|
1359 |
-
/**
|
1360 |
-
* Function to init action scheduler queue runner to allow immediate processing of Action Scheduler queue.
|
1361 |
-
*
|
1362 |
-
* @since 4.4.4
|
1363 |
-
*/
|
1364 |
-
public function init_action_scheduler_queue_runner( $action = 'ig_es_init_queue_runner' ) {
|
1365 |
-
|
1366 |
-
$admin_ajax_url = admin_url( 'admin-ajax.php' );
|
1367 |
-
$admin_ajax_url = add_query_arg( 'action', $action, $admin_ajax_url );
|
1368 |
-
$args = array(
|
1369 |
-
'timeout' => 0.01,
|
1370 |
-
'blocking' => false,
|
1371 |
-
'cookies' => $_COOKIE,
|
1372 |
-
'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
|
1373 |
-
);
|
1374 |
-
|
1375 |
-
// Make a asynchronous request to our ajax handler function which in turn calls Action Schedulers' queue runner to start immediate processing in background.
|
1376 |
-
wp_remote_get( esc_url_raw( $admin_ajax_url ), $args );
|
1377 |
-
}
|
1378 |
-
|
1379 |
/**
|
1380 |
* Method to get plugin plan
|
1381 |
*
|
@@ -1478,5 +1465,51 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
1478 |
}
|
1479 |
}
|
1480 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1481 |
}
|
1482 |
}
|
688 |
'lite/includes/classes/class-es-form-widget.php',
|
689 |
'lite/includes/classes/class-es-export-subscribers.php',
|
690 |
'lite/includes/classes/class-es-import-subscribers.php',
|
691 |
+
// Start-IG-Code.
|
692 |
'lite/includes/classes/class-es-info.php',
|
693 |
+
// End-IG-Code.
|
694 |
'lite/includes/classes/class-es-handle-post-notification.php',
|
695 |
'lite/includes/classes/class-es-handle-subscription.php',
|
696 |
'lite/includes/classes/class-es-handle-sync-wp-user.php',
|
724 |
// End-IG-Code.
|
725 |
'lite/admin/class-email-subscribers-admin.php',
|
726 |
|
727 |
+
// Start-IG-Code.
|
728 |
// Pro Feature
|
729 |
'lite/includes/pro-features.php',
|
730 |
+
// End-IG-Code.
|
731 |
|
732 |
// Feedback Class
|
733 |
'lite/includes/feedback/class-ig-tracker.php',
|
734 |
+
// Start-IG-Code.
|
735 |
'lite/includes/feedback/class-ig-feedback.php',
|
736 |
'lite/includes/feedback.php',
|
737 |
+
// End-IG-Code.
|
738 |
|
739 |
//Load Starter & Pro files if exists
|
740 |
'starter/class-es-utils.php',
|
862 |
|
863 |
// Premium services ui components.
|
864 |
'lite/includes/premium-services-ui/class-ig-es-premium-services-ui.php',
|
865 |
+
|
866 |
+
// Background Process Helper
|
867 |
+
'lite/includes/classes/class-ig-es-background-process-helper.php',
|
868 |
);
|
869 |
|
870 |
foreach ( $files_to_load as $file ) {
|
1157 |
public function get_es_admin_screens() {
|
1158 |
|
1159 |
// TODO: Can be updated with a version check when https://core.trac.wordpress.org/ticket/18857 is fixed
|
1160 |
+
$prefix = $this->get_admin_page_prefix();
|
|
|
|
|
|
|
|
|
1161 |
|
1162 |
$screens = array(
|
1163 |
'es_template',
|
1325 |
self::$instance->workflows_db = new ES_DB_Workflows();
|
1326 |
self::$instance->trial = new IG_ES_Trial();
|
1327 |
|
1328 |
+
// Start-IG-Code.
|
1329 |
if ( is_admin() ) {
|
1330 |
$ig_es_feedback_class = 'IG_Feedback_V_' . str_replace( '.', '_', IG_ES_FEEDBACK_TRACKER_VERSION );
|
1331 |
|
1347 |
|
1348 |
$ig_es_feedback->render_deactivate_feedback();
|
1349 |
}
|
1350 |
+
// End-IG-Code.
|
1351 |
|
1352 |
add_action( 'admin_init', array( self::$instance, 'add_admin_notice' ) );
|
1353 |
add_action( 'admin_init', array( self::$instance, 'check_trial_optin_consent' ) );
|
1363 |
return self::$instance;
|
1364 |
}
|
1365 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1366 |
/**
|
1367 |
* Method to get plugin plan
|
1368 |
*
|
1465 |
}
|
1466 |
}
|
1467 |
|
1468 |
+
/**
|
1469 |
+
* Method to get admin menu title.
|
1470 |
+
*
|
1471 |
+
* @return string $menu_title Admin menu title
|
1472 |
+
*
|
1473 |
+
* @since 4.6.3
|
1474 |
+
*/
|
1475 |
+
public function get_admin_menu_title() {
|
1476 |
+
|
1477 |
+
global $ig_es_tracker;
|
1478 |
+
|
1479 |
+
$menu_title = __( 'Email Subscribers', 'email-subscribers' );
|
1480 |
+
|
1481 |
+
if ( 'woo' === IG_ES_PLUGIN_PLAN ) {
|
1482 |
+
$menu_title = __( 'Icegram', 'email-subscribers' );
|
1483 |
+
|
1484 |
+
$icegram_lite_plugin_slug = 'icegram/icegram.php';
|
1485 |
+
$icegram_premium_plugin_slug = 'icegram-engage/icegram-engage.php';
|
1486 |
+
|
1487 |
+
$icegram_lite_installed = $ig_es_tracker::is_plugin_installed( $icegram_lite_plugin_slug );
|
1488 |
+
$icegram_premium_installed = $ig_es_tracker::is_plugin_installed( $icegram_premium_plugin_slug );
|
1489 |
+
|
1490 |
+
// Change Woo Plugin's menu name if Icegram or Icegram premium plugin is installed on the site.
|
1491 |
+
if ( $icegram_lite_installed || $icegram_premium_installed ) {
|
1492 |
+
$menu_title = __( 'Icegram WC', 'email-subscribers' );
|
1493 |
+
}
|
1494 |
+
}
|
1495 |
+
|
1496 |
+
return $menu_title;
|
1497 |
+
}
|
1498 |
+
|
1499 |
+
/**
|
1500 |
+
* Method to get admin menu page prefix.
|
1501 |
+
*
|
1502 |
+
* @return string $page_prefix Admin menu page prefix.
|
1503 |
+
*
|
1504 |
+
* @since 4.6.3
|
1505 |
+
*/
|
1506 |
+
public function get_admin_page_prefix() {
|
1507 |
+
|
1508 |
+
$menu_title = $this->get_admin_menu_title();
|
1509 |
+
$page_prefix = sanitize_title( $menu_title );
|
1510 |
+
|
1511 |
+
return $page_prefix;
|
1512 |
+
}
|
1513 |
+
|
1514 |
}
|
1515 |
}
|
lite/includes/class-es-install.php
CHANGED
@@ -225,6 +225,12 @@ if ( ! class_exists( 'ES_Install' ) ) {
|
|
225 |
'ig_es_update_457_db_version',
|
226 |
),
|
227 |
|
|
|
|
|
|
|
|
|
|
|
|
|
228 |
);
|
229 |
|
230 |
/**
|
@@ -872,6 +878,7 @@ if ( ! class_exists( 'ES_Install' ) ) {
|
|
872 |
`last_name` varchar(50) DEFAULT NULL,
|
873 |
`email` varchar(50) NOT NULL,
|
874 |
`source` varchar(50) DEFAULT NULL,
|
|
|
875 |
`form_id` int(10) NOT NULL DEFAULT '0',
|
876 |
`status` varchar(10) DEFAULT NULL,
|
877 |
`unsubscribed` tinyint(1) NOT NULL DEFAULT '0',
|
225 |
'ig_es_update_457_db_version',
|
226 |
),
|
227 |
|
228 |
+
'4.6.3' => array(
|
229 |
+
'ig_es_update_463_alter_contacts_table',
|
230 |
+
'ig_es_migrate_ip_from_list_contacts_to_contacts_table',
|
231 |
+
'ig_es_update_463_db_version',
|
232 |
+
),
|
233 |
+
|
234 |
);
|
235 |
|
236 |
/**
|
878 |
`last_name` varchar(50) DEFAULT NULL,
|
879 |
`email` varchar(50) NOT NULL,
|
880 |
`source` varchar(50) DEFAULT NULL,
|
881 |
+
`ip_address` varchar(50) DEFAULT NULL,
|
882 |
`form_id` int(10) NOT NULL DEFAULT '0',
|
883 |
`status` varchar(10) DEFAULT NULL,
|
884 |
`unsubscribed` tinyint(1) NOT NULL DEFAULT '0',
|
lite/includes/classes/class-es-admin-settings.php
CHANGED
@@ -223,6 +223,7 @@ class ES_Admin_Settings {
|
|
223 |
'default' => '',
|
224 |
),
|
225 |
|
|
|
226 |
'ig_es_post_image_size' => array(
|
227 |
'id' => 'ig_es_post_image_size',
|
228 |
'name' => __( 'Image size', 'email-subscribers' ),
|
@@ -231,6 +232,7 @@ class ES_Admin_Settings {
|
|
231 |
'desc' => __( 'Select image size for {{POSTIMAGE}} to be shown in the Post Notification emails.', 'email-subscribers' ),
|
232 |
'default' => 'full',
|
233 |
),
|
|
|
234 |
|
235 |
'ig_es_track_email_opens' => array(
|
236 |
'id' => 'ig_es_track_email_opens',
|
223 |
'default' => '',
|
224 |
),
|
225 |
|
226 |
+
// Start-IG-Code.
|
227 |
'ig_es_post_image_size' => array(
|
228 |
'id' => 'ig_es_post_image_size',
|
229 |
'name' => __( 'Image size', 'email-subscribers' ),
|
232 |
'desc' => __( 'Select image size for {{POSTIMAGE}} to be shown in the Post Notification emails.', 'email-subscribers' ),
|
233 |
'default' => 'full',
|
234 |
),
|
235 |
+
// End-IG-Code.
|
236 |
|
237 |
'ig_es_track_email_opens' => array(
|
238 |
'id' => 'ig_es_track_email_opens',
|
lite/includes/classes/class-es-campaigns-table.php
CHANGED
@@ -376,6 +376,8 @@ class ES_Campaigns_Table extends WP_List_Table {
|
|
376 |
public function column_name( $item ) {
|
377 |
global $wpdb;
|
378 |
|
|
|
|
|
379 |
$type = $item['type'];
|
380 |
|
381 |
$nonce = wp_create_nonce( 'es_post_notification' );
|
@@ -436,7 +438,15 @@ class ES_Campaigns_Table extends WP_List_Table {
|
|
436 |
/* translators: 1: Slug 2: View Action 3: Hash 4. WP Nonce */
|
437 |
$actions['report'] = sprintf( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">%s</a>', esc_attr( 'es_reports' ), 'view', $report['hash'], $es_nonce, __( 'Report', 'email-subscribers' ) );
|
438 |
}
|
|
|
|
|
439 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
440 |
/* translators: 1: Slug 2: Delete Action 3: ID 4. WP Nonce */
|
441 |
$actions['delete'] = sprintf( __( '<a href="?page=%1$s&action=%2$s&list=%3$s&_wpnonce=%4$s" onclick="return checkDelete()">Delete</a>', 'email-subscribers' ), esc_attr( 'es_campaigns' ), 'delete', absint( $item['id'] ), $nonce );
|
442 |
|
@@ -684,6 +694,7 @@ class ES_Campaigns_Table extends WP_List_Table {
|
|
684 |
}
|
685 |
|
686 |
public function process_bulk_action() {
|
|
|
687 |
|
688 |
if ( 'delete' === $this->current_action() ) {
|
689 |
|
@@ -694,7 +705,6 @@ class ES_Campaigns_Table extends WP_List_Table {
|
|
694 |
$message = __( 'You are not allowed to delete campaign.', 'email-subscribers' );
|
695 |
$status = 'error';
|
696 |
} else {
|
697 |
-
$campaign_id = ig_es_get_request_data( 'list' );
|
698 |
|
699 |
$this->db->delete_campaigns( $campaign_id );
|
700 |
$message = __( 'Campaign deleted successfully!', 'email-subscribers' );
|
@@ -703,6 +713,9 @@ class ES_Campaigns_Table extends WP_List_Table {
|
|
703 |
|
704 |
ES_Common::show_message( $message, $status );
|
705 |
}
|
|
|
|
|
|
|
706 |
|
707 |
$action = ig_es_get_request_data( 'action' );
|
708 |
$action2 = ig_es_get_request_data( 'action2' );
|
376 |
public function column_name( $item ) {
|
377 |
global $wpdb;
|
378 |
|
379 |
+
$actions = array();
|
380 |
+
|
381 |
$type = $item['type'];
|
382 |
|
383 |
$nonce = wp_create_nonce( 'es_post_notification' );
|
438 |
/* translators: 1: Slug 2: View Action 3: Hash 4. WP Nonce */
|
439 |
$actions['report'] = sprintf( '<a href="?page=%s&action=%s&list=%s&_wpnonce=%s" class="text-indigo-600">%s</a>', esc_attr( 'es_reports' ), 'view', $report['hash'], $es_nonce, __( 'Report', 'email-subscribers' ) );
|
440 |
}
|
441 |
+
|
442 |
+
|
443 |
}
|
444 |
+
|
445 |
+
$campaign_type = array( 'post_notification', 'post_digest' );
|
446 |
+
if ( ! in_array( $item['type'], $campaign_type ) ) {
|
447 |
+
$actions = apply_filters( 'ig_es_campaign_actions', $actions, $item );
|
448 |
+
}
|
449 |
+
|
450 |
/* translators: 1: Slug 2: Delete Action 3: ID 4. WP Nonce */
|
451 |
$actions['delete'] = sprintf( __( '<a href="?page=%1$s&action=%2$s&list=%3$s&_wpnonce=%4$s" onclick="return checkDelete()">Delete</a>', 'email-subscribers' ), esc_attr( 'es_campaigns' ), 'delete', absint( $item['id'] ), $nonce );
|
452 |
|
694 |
}
|
695 |
|
696 |
public function process_bulk_action() {
|
697 |
+
$campaign_id = ig_es_get_request_data( 'list' );
|
698 |
|
699 |
if ( 'delete' === $this->current_action() ) {
|
700 |
|
705 |
$message = __( 'You are not allowed to delete campaign.', 'email-subscribers' );
|
706 |
$status = 'error';
|
707 |
} else {
|
|
|
708 |
|
709 |
$this->db->delete_campaigns( $campaign_id );
|
710 |
$message = __( 'Campaign deleted successfully!', 'email-subscribers' );
|
713 |
|
714 |
ES_Common::show_message( $message, $status );
|
715 |
}
|
716 |
+
$campaign_action = $this->current_action();
|
717 |
+
|
718 |
+
do_action( 'ig_es_campaign_action', $campaign_id, $campaign_action );
|
719 |
|
720 |
$action = ig_es_get_request_data( 'action' );
|
721 |
$action2 = ig_es_get_request_data( 'action2' );
|
lite/includes/classes/class-es-contacts-table.php
CHANGED
@@ -143,7 +143,7 @@ class ES_Contacts_Table extends WP_List_Table {
|
|
143 |
'url' => add_query_arg( 'action', 'export', 'admin.php?page=es_subscribers' ),
|
144 |
),
|
145 |
// Start-IG-Code.
|
146 |
-
|
147 |
'sync' => array(
|
148 |
'label' => __( 'Sync', 'email-subscribers' ),
|
149 |
'indicator_option' => 'ig_es_show_sync_tab',
|
@@ -152,7 +152,7 @@ class ES_Contacts_Table extends WP_List_Table {
|
|
152 |
'action' => 'sync',
|
153 |
'url' => add_query_arg( 'action', 'sync', 'admin.php?page=es_subscribers' ),
|
154 |
),
|
155 |
-
|
156 |
// End-IG-Code.
|
157 |
'manage_lists' => array(
|
158 |
'label' => __( 'Manage Lists', 'email-subscribers' ),
|
@@ -862,6 +862,9 @@ class ES_Contacts_Table extends WP_List_Table {
|
|
862 |
return $this->get_lists_to_show( $item['id'] );
|
863 |
case 'created_at':
|
864 |
return ig_es_format_date_time( $item[ $column_name ] );
|
|
|
|
|
|
|
865 |
case 'first_name':
|
866 |
case 'email':
|
867 |
default:
|
@@ -1012,6 +1015,7 @@ class ES_Contacts_Table extends WP_List_Table {
|
|
1012 |
'name' => __( 'Name', 'email-subscribers' ),
|
1013 |
'email' => __( 'Email', 'email-subscribers' ),
|
1014 |
'lists' => __( 'List(s)', 'email-subscribers' ),
|
|
|
1015 |
'created_at' => __( 'Created', 'email-subscribers' ),
|
1016 |
);
|
1017 |
|
143 |
'url' => add_query_arg( 'action', 'export', 'admin.php?page=es_subscribers' ),
|
144 |
),
|
145 |
// Start-IG-Code.
|
146 |
+
/*
|
147 |
'sync' => array(
|
148 |
'label' => __( 'Sync', 'email-subscribers' ),
|
149 |
'indicator_option' => 'ig_es_show_sync_tab',
|
152 |
'action' => 'sync',
|
153 |
'url' => add_query_arg( 'action', 'sync', 'admin.php?page=es_subscribers' ),
|
154 |
),
|
155 |
+
*/
|
156 |
// End-IG-Code.
|
157 |
'manage_lists' => array(
|
158 |
'label' => __( 'Manage Lists', 'email-subscribers' ),
|
862 |
return $this->get_lists_to_show( $item['id'] );
|
863 |
case 'created_at':
|
864 |
return ig_es_format_date_time( $item[ $column_name ] );
|
865 |
+
case 'ip':
|
866 |
+
$subscribed_ip = ! empty ( $item['ip_address'] ) ? $item['ip_address'] : '-' ;
|
867 |
+
return $subscribed_ip;
|
868 |
case 'first_name':
|
869 |
case 'email':
|
870 |
default:
|
1015 |
'name' => __( 'Name', 'email-subscribers' ),
|
1016 |
'email' => __( 'Email', 'email-subscribers' ),
|
1017 |
'lists' => __( 'List(s)', 'email-subscribers' ),
|
1018 |
+
'ip' => __( 'IP', 'email-subscribers' ),
|
1019 |
'created_at' => __( 'Created', 'email-subscribers' ),
|
1020 |
);
|
1021 |
|
lite/includes/classes/class-es-forms-table.php
CHANGED
@@ -463,7 +463,7 @@ class ES_Forms_Table extends WP_List_Table {
|
|
463 |
<span><b class="text-sm font-normal text-gray-600 pb-2">
|
464 |
<?php
|
465 |
/* translators: %s: Create list page url */
|
466 |
-
echo sprintf( esc_html__('List not found. Please %s', 'email-subscribers' ), '<a href="' . esc_url( $create_list_link ) . '"> ' .
|
467 |
?>
|
468 |
</b></span>
|
469 |
<?php } ?>
|
@@ -832,6 +832,8 @@ class ES_Forms_Table extends WP_List_Table {
|
|
832 |
|
833 |
return '<code id="es-shortcode">' . $shortcode . '</code>';
|
834 |
break;
|
|
|
|
|
835 |
default:
|
836 |
return '';
|
837 |
}
|
@@ -883,10 +885,11 @@ class ES_Forms_Table extends WP_List_Table {
|
|
883 |
*/
|
884 |
public function get_columns() {
|
885 |
$columns = array(
|
886 |
-
'cb'
|
887 |
-
'name'
|
888 |
-
'shortcode'
|
889 |
-
'
|
|
|
890 |
);
|
891 |
|
892 |
return $columns;
|
463 |
<span><b class="text-sm font-normal text-gray-600 pb-2">
|
464 |
<?php
|
465 |
/* translators: %s: Create list page url */
|
466 |
+
echo sprintf( esc_html__('List not found. Please %s', 'email-subscribers' ), '<a href="' . esc_url( $create_list_link ) . '"> ' . esc_html__( 'create your first list', 'email-subscribers') . '</a>' );
|
467 |
?>
|
468 |
</b></span>
|
469 |
<?php } ?>
|
832 |
|
833 |
return '<code id="es-shortcode">' . $shortcode . '</code>';
|
834 |
break;
|
835 |
+
case 'total_active_subscribers':
|
836 |
+
return ES()->contacts_db->get_total_contacts_by_form_id( $item['id'] );
|
837 |
default:
|
838 |
return '';
|
839 |
}
|
885 |
*/
|
886 |
public function get_columns() {
|
887 |
$columns = array(
|
888 |
+
'cb' => '<input type="checkbox" />',
|
889 |
+
'name' => __( 'Name', 'email-subscribers' ),
|
890 |
+
'shortcode' => __( 'Shortcode', 'email-subscribers' ),
|
891 |
+
'total_active_subscribers' => __( 'Subscribers', 'email-subscribers' ),
|
892 |
+
'created_at' => __( 'Created', 'email-subscribers' ),
|
893 |
);
|
894 |
|
895 |
return $columns;
|
lite/includes/classes/class-es-handle-post-notification.php
CHANGED
@@ -82,81 +82,59 @@ class ES_Handle_Post_Notification {
|
|
82 |
$notifications = ES()->campaigns_db->get_campaigns_by_post_id( $post_id );
|
83 |
|
84 |
if ( count( $notifications ) > 0 ) {
|
85 |
-
$existing_contacts = array();
|
86 |
foreach ( $notifications as $notification ) {
|
87 |
$template_id = $notification['base_template_id'];
|
88 |
$template = get_post( $template_id ); // to confirm if template exists in ES->Templates
|
89 |
if ( is_object( $template ) ) {
|
90 |
$list_id = $notification['list_ids'];
|
91 |
$list_id = explode( ',', $list_id );
|
92 |
-
$subscribers = ES()->contacts_db->get_active_contacts_by_list_id( $list_id );
|
93 |
|
94 |
-
|
95 |
-
|
96 |
-
|
97 |
-
|
98 |
-
* Prepare Body
|
99 |
-
* Add entry into sent_details table
|
100 |
-
* Add entry into deliverreport table
|
101 |
-
*/
|
102 |
-
|
103 |
-
foreach ( $subscribers as $key => $subscriber ) {
|
104 |
-
if ( in_array( $subscriber['id'], $existing_contacts ) ) {
|
105 |
-
unset( $subscribers[ $key ] );
|
106 |
-
} else {
|
107 |
-
$existing_contacts[] = $subscriber['id'];
|
108 |
-
}
|
109 |
-
}
|
110 |
/*
|
111 |
-
|
112 |
-
|
|
|
113 |
*/
|
114 |
-
if ( count( $subscribers ) <= 0 ) {
|
115 |
-
continue;
|
116 |
-
}
|
117 |
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
|
126 |
-
|
127 |
-
|
128 |
-
$guid
|
129 |
-
|
130 |
-
$
|
131 |
-
|
132 |
-
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
137 |
-
|
138 |
-
|
139 |
-
|
140 |
-
|
141 |
-
|
142 |
-
|
143 |
-
|
144 |
-
|
145 |
-
|
146 |
-
|
|
|
|
|
|
|
|
|
|
|
147 |
);
|
148 |
-
|
149 |
-
// Add entry into mailing queue table
|
150 |
-
$insert = ES_DB_Mailing_Queue::add_notification( $data );
|
151 |
-
if ( $insert ) {
|
152 |
-
// Add entry into sending queue table
|
153 |
-
$delivery_data = array();
|
154 |
-
$delivery_data['hash'] = $guid;
|
155 |
-
$delivery_data['subscribers'] = $subscribers;
|
156 |
-
$delivery_data['campaign_id'] = $notification['id'];
|
157 |
-
$delivery_data['mailing_queue_id'] = $insert;
|
158 |
-
ES_DB_Sending_Queue::do_batch_insert( $delivery_data );
|
159 |
-
}
|
160 |
}
|
161 |
}
|
162 |
}
|
82 |
$notifications = ES()->campaigns_db->get_campaigns_by_post_id( $post_id );
|
83 |
|
84 |
if ( count( $notifications ) > 0 ) {
|
|
|
85 |
foreach ( $notifications as $notification ) {
|
86 |
$template_id = $notification['base_template_id'];
|
87 |
$template = get_post( $template_id ); // to confirm if template exists in ES->Templates
|
88 |
if ( is_object( $template ) ) {
|
89 |
$list_id = $notification['list_ids'];
|
90 |
$list_id = explode( ',', $list_id );
|
|
|
91 |
|
92 |
+
$post = get_post( $post_id );
|
93 |
+
|
94 |
+
if ( is_object( $post ) ) {
|
95 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
96 |
/*
|
97 |
+
* Prepare Subject
|
98 |
+
* Prepare Body
|
99 |
+
* Add entry into mailing queue table
|
100 |
*/
|
|
|
|
|
|
|
101 |
|
102 |
+
// Prepare subject
|
103 |
+
$post_subject = self::prepare_subject( $post, $template );
|
104 |
+
|
105 |
+
// Prepare body
|
106 |
+
$template_content = $template->post_content;
|
107 |
+
$post_content = self::prepare_body( $template_content, $post_id, $template_id );
|
108 |
+
|
109 |
+
$guid = ES_Common::generate_guid( 6 );
|
110 |
+
|
111 |
+
$data = array(
|
112 |
+
'hash' => $guid,
|
113 |
+
'campaign_id' => $notification['id'],
|
114 |
+
'subject' => $post_subject,
|
115 |
+
'body' => $post_content,
|
116 |
+
'count' => 0, // Subscribers count would be updated through background process when they are added in the sending_queue table.
|
117 |
+
'status' => 'Queueing',
|
118 |
+
'start_at' => '',
|
119 |
+
'finish_at' => '',
|
120 |
+
'created_at' => ig_get_current_date_time(),
|
121 |
+
'updated_at' => ig_get_current_date_time(),
|
122 |
+
'meta' => maybe_serialize(
|
123 |
+
array(
|
124 |
+
'post_id' => $post_id,
|
125 |
+
'type' => 'post_notification',
|
126 |
+
)
|
127 |
+
),
|
128 |
+
);
|
129 |
+
|
130 |
+
// Add entry into mailing queue table
|
131 |
+
$mailing_queue_id = ES_DB_Mailing_Queue::add_notification( $data );
|
132 |
+
if ( $mailing_queue_id ) {
|
133 |
+
$action_args = array(
|
134 |
+
'mailing_queue_id' => $mailing_queue_id,
|
135 |
+
'list_ids' => $list_id,
|
136 |
);
|
137 |
+
IG_ES_Background_Process_Helper::add_action_scheduler_task( 'ig_es_add_subscribers_to_sending_queue', $action_args );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
138 |
}
|
139 |
}
|
140 |
}
|
lite/includes/classes/class-es-newsletters.php
CHANGED
@@ -29,9 +29,6 @@ class ES_Newsletters {
|
|
29 |
// Ajax handler for broadcast preview
|
30 |
add_action( 'wp_ajax_ig_es_preview_broadcast', array( $this, 'preview_broadcast' ) );
|
31 |
|
32 |
-
// Ajax handler for starting processing of broadcast in background when 'Send Now' option is chosen while creating broadcast
|
33 |
-
add_action( 'wp_ajax_ig_es_trigger_broadcast_processing', array( $this, 'trigger_broadcast_processing' ) );
|
34 |
-
|
35 |
add_action( 'admin_init', array( $this, 'process_broadcast_submission' ) );
|
36 |
|
37 |
// Add tracking fields data
|
@@ -84,10 +81,6 @@ class ES_Newsletters {
|
|
84 |
|
85 |
self::es_send_email_callback( $broadcast_data );
|
86 |
|
87 |
-
if ( 'schedule_now' === $meta['scheduling_option'] ) {
|
88 |
-
ES()->init_action_scheduler_queue_runner( 'ig_es_trigger_broadcast_processing' );
|
89 |
-
}
|
90 |
-
|
91 |
$campaign_url = admin_url( 'admin.php?page=es_campaigns&action=broadcast_created' );
|
92 |
|
93 |
wp_safe_redirect( $campaign_url );
|
@@ -320,11 +313,15 @@ class ES_Newsletters {
|
|
320 |
// If broadcast is sent or being sent then don't allow scheduling to conflicts.
|
321 |
if ( ! $is_broadcast_processing ) {
|
322 |
?>
|
323 |
-
<button type="submit" id="ig_es_broadcast_submitted" name="ig_es_broadcast_submitted" class="inline-flex justify-center py-1.5 text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-transparent rounded-md md:px-2 lg:px-3 xl:px-4 hover:bg-indigo-500 hover:text-white"
|
324 |
value="submitted">
|
325 |
<?php
|
326 |
-
if ( ES()->is_pro() ) {
|
327 |
-
|
|
|
|
|
|
|
|
|
328 |
} else {
|
329 |
echo esc_html__( 'Send', 'email-subscribers' );
|
330 |
}
|
@@ -396,6 +393,8 @@ class ES_Newsletters {
|
|
396 |
echo wp_kses( $lists, $allowedtags );
|
397 |
?>
|
398 |
</select>
|
|
|
|
|
399 |
<div class="block mt-1">
|
400 |
<span id="ig_es_total_contacts"></span>
|
401 |
</div>
|
@@ -539,19 +538,24 @@ class ES_Newsletters {
|
|
539 |
|
540 |
if ( ! empty( $campaign_id ) ) {
|
541 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
542 |
ES()->campaigns_db->save_campaign( $data, $campaign_id );
|
543 |
|
544 |
$notification = ES_DB_Mailing_Queue::get_notification_by_campaign_id( $campaign_id );
|
545 |
$data['body'] = ES_Common::es_process_template_body( $data['body'], $data['base_template_id'], $campaign_id );
|
546 |
|
547 |
-
$subscribers = ES()->contacts_db->get_active_contacts_by_list_id( $list_id );
|
548 |
$guid = ES_Common::generate_guid( 6 );
|
549 |
$data = array(
|
550 |
'hash' => $guid,
|
551 |
'campaign_id' => $campaign_id,
|
552 |
'subject' => $data['subject'],
|
553 |
'body' => $data['body'],
|
554 |
-
'count' => count( $subscribers ),
|
555 |
'status' => 'In Queue',
|
556 |
'start_at' => ! empty( $data['start_at'] ) ? $data['start_at'] : '',
|
557 |
'finish_at' => '',
|
@@ -560,16 +564,16 @@ class ES_Newsletters {
|
|
560 |
'meta' => maybe_serialize( array( 'type' => 'newsletter' ) ),
|
561 |
);
|
562 |
|
|
|
|
|
|
|
|
|
563 |
if ( empty( $notification ) ) {
|
564 |
-
|
565 |
-
|
566 |
-
|
567 |
-
|
568 |
-
|
569 |
-
$delivery_data['campaign_id'] = $campaign_id;
|
570 |
-
$delivery_data['mailing_queue_id'] = $last_report_id;
|
571 |
-
ES_DB_Sending_Queue::do_batch_insert( $delivery_data );
|
572 |
-
}
|
573 |
} else {
|
574 |
$notification_id = $notification['id'];
|
575 |
$notification_status = $notification['status'];
|
@@ -579,9 +583,32 @@ class ES_Newsletters {
|
|
579 |
$data['hash'] = $notification['hash'];
|
580 |
$data['campaign_id'] = $notification['campaign_id'];
|
581 |
$data['created_at'] = $notification['created_at'];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
582 |
$notification = ES_DB_Mailing_Queue::update_notification( $notification_id, $data );
|
583 |
}
|
584 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
585 |
}
|
586 |
}
|
587 |
|
@@ -812,19 +839,6 @@ class ES_Newsletters {
|
|
812 |
return $preview_data;
|
813 |
}
|
814 |
|
815 |
-
/**
|
816 |
-
* Method to trigger immediate processing of broadcast with "Send Now" option.
|
817 |
-
*
|
818 |
-
* @return void
|
819 |
-
*
|
820 |
-
* @since 4.4.7
|
821 |
-
*/
|
822 |
-
public function trigger_broadcast_processing() {
|
823 |
-
|
824 |
-
// Start processing of broadcast which are scheduled for current date time.
|
825 |
-
do_action( 'ig_es_cron_worker' );
|
826 |
-
}
|
827 |
-
|
828 |
/**
|
829 |
* Function to add values of checkbox fields incase they are not checked.
|
830 |
*
|
29 |
// Ajax handler for broadcast preview
|
30 |
add_action( 'wp_ajax_ig_es_preview_broadcast', array( $this, 'preview_broadcast' ) );
|
31 |
|
|
|
|
|
|
|
32 |
add_action( 'admin_init', array( $this, 'process_broadcast_submission' ) );
|
33 |
|
34 |
// Add tracking fields data
|
81 |
|
82 |
self::es_send_email_callback( $broadcast_data );
|
83 |
|
|
|
|
|
|
|
|
|
84 |
$campaign_url = admin_url( 'admin.php?page=es_campaigns&action=broadcast_created' );
|
85 |
|
86 |
wp_safe_redirect( $campaign_url );
|
313 |
// If broadcast is sent or being sent then don't allow scheduling to conflicts.
|
314 |
if ( ! $is_broadcast_processing ) {
|
315 |
?>
|
316 |
+
<button type="submit" id="ig_es_broadcast_submitted" name="ig_es_broadcast_submitted" class="w-24 inline-flex justify-center py-1.5 text-sm font-medium leading-5 text-white transition duration-150 ease-in-out bg-indigo-600 border border-transparent rounded-md md:px-2 lg:px-3 xl:px-4 hover:bg-indigo-500 hover:text-white"
|
317 |
value="submitted">
|
318 |
<?php
|
319 |
+
if ( ES()->is_pro() ) {
|
320 |
+
?>
|
321 |
+
<span class="ig_es_broadcast_send_option_text">
|
322 |
+
<?php echo esc_html__( 'Schedule', 'email-subscribers' ); ?>
|
323 |
+
</span>
|
324 |
+
<?php
|
325 |
} else {
|
326 |
echo esc_html__( 'Send', 'email-subscribers' );
|
327 |
}
|
393 |
echo wp_kses( $lists, $allowedtags );
|
394 |
?>
|
395 |
</select>
|
396 |
+
<!-- Hidden field to detect whether admin has update campaign lists or not during editing of campaign -->
|
397 |
+
<input type="hidden" name="broadcast_data[existing_list_ids]" value="<?php echo esc_attr( $list_ids ); ?>">
|
398 |
<div class="block mt-1">
|
399 |
<span id="ig_es_total_contacts"></span>
|
400 |
</div>
|
538 |
|
539 |
if ( ! empty( $campaign_id ) ) {
|
540 |
|
541 |
+
$existing_list_ids = ! empty( $data['existing_list_ids'] ) ? $data['existing_list_ids'] : '';
|
542 |
+
$selected_list_ids = is_array( $list_id ) ? $list_id : array( $list_id );
|
543 |
+
|
544 |
+
if ( ! empty( $existing_list_ids ) ) {
|
545 |
+
$existing_list_ids = explode( ',', $existing_list_ids );
|
546 |
+
}
|
547 |
+
|
548 |
ES()->campaigns_db->save_campaign( $data, $campaign_id );
|
549 |
|
550 |
$notification = ES_DB_Mailing_Queue::get_notification_by_campaign_id( $campaign_id );
|
551 |
$data['body'] = ES_Common::es_process_template_body( $data['body'], $data['base_template_id'], $campaign_id );
|
552 |
|
|
|
553 |
$guid = ES_Common::generate_guid( 6 );
|
554 |
$data = array(
|
555 |
'hash' => $guid,
|
556 |
'campaign_id' => $campaign_id,
|
557 |
'subject' => $data['subject'],
|
558 |
'body' => $data['body'],
|
|
|
559 |
'status' => 'In Queue',
|
560 |
'start_at' => ! empty( $data['start_at'] ) ? $data['start_at'] : '',
|
561 |
'finish_at' => '',
|
564 |
'meta' => maybe_serialize( array( 'type' => 'newsletter' ) ),
|
565 |
);
|
566 |
|
567 |
+
$should_queue_emails = false;
|
568 |
+
$mailing_queue_id = 0;
|
569 |
+
|
570 |
+
// Add notification to mailing queue if not already added.
|
571 |
if ( empty( $notification ) ) {
|
572 |
+
// We need to set mailing queue status to Queueing to ensure it is not picked by Cron(WP Cron or ES Cron) before all of its subscribers are added to the sending queue.
|
573 |
+
$data['status'] = 'Queueing';
|
574 |
+
$data['count'] = 0; // Count would be added in background process after all subscribers are added in the sending_queue table.
|
575 |
+
$mailing_queue_id = ES_DB_Mailing_Queue::add_notification( $data );
|
576 |
+
$should_queue_emails = true;
|
|
|
|
|
|
|
|
|
577 |
} else {
|
578 |
$notification_id = $notification['id'];
|
579 |
$notification_status = $notification['status'];
|
583 |
$data['hash'] = $notification['hash'];
|
584 |
$data['campaign_id'] = $notification['campaign_id'];
|
585 |
$data['created_at'] = $notification['created_at'];
|
586 |
+
|
587 |
+
// Check if list has been updated, if yes then we need to delete emails from existing lists and requeue the emails from the updated lists.
|
588 |
+
if ( $selected_list_ids !== $existing_list_ids ) {
|
589 |
+
$should_queue_emails = true;
|
590 |
+
$mailing_queue_id = $notification_id;
|
591 |
+
$data['count'] = 0;
|
592 |
+
$data['status'] = 'Queueing';
|
593 |
+
} else {
|
594 |
+
$data['count'] = $notification['count'];
|
595 |
+
}
|
596 |
+
|
597 |
$notification = ES_DB_Mailing_Queue::update_notification( $notification_id, $data );
|
598 |
}
|
599 |
}
|
600 |
+
|
601 |
+
if ( ! empty( $mailing_queue_id ) && $should_queue_emails ) {
|
602 |
+
|
603 |
+
// Delete existing sending queue if any already present.
|
604 |
+
ES_DB_Sending_Queue::delete_sending_queue_by_mailing_id( array( $mailing_queue_id ) );
|
605 |
+
|
606 |
+
$action_args = array(
|
607 |
+
'mailing_queue_id' => $mailing_queue_id,
|
608 |
+
'list_ids' => $list_id,
|
609 |
+
);
|
610 |
+
IG_ES_Background_Process_Helper::add_action_scheduler_task( 'ig_es_add_subscribers_to_sending_queue', $action_args );
|
611 |
+
}
|
612 |
}
|
613 |
}
|
614 |
|
839 |
return $preview_data;
|
840 |
}
|
841 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
842 |
/**
|
843 |
* Function to add values of checkbox fields incase they are not checked.
|
844 |
*
|
lite/includes/classes/class-es-queue.php
CHANGED
@@ -41,6 +41,17 @@ if ( ! class_exists( 'ES_Queue' ) ) {
|
|
41 |
// add_action( 'ig_es_email_sending_error', array( &$this, 'set_status_in_queue' ), 10, 4 );
|
42 |
add_action( 'ig_es_message_sent', array( &$this, 'set_sent_status' ), 10, 3 );
|
43 |
add_action( 'ig_es_message_sent', array( &$this, 'update_email_sent_count' ), 10, 3 );
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
44 |
}
|
45 |
|
46 |
/**
|
@@ -67,7 +78,7 @@ if ( ! class_exists( 'ES_Queue' ) ) {
|
|
67 |
* Steps
|
68 |
* 1. Fetch all active campaigns
|
69 |
* 2. Loop over through and based on matched condition put campaign into mailing_queue table
|
70 |
-
* 3. And also insert subscribers for respective campaign into
|
71 |
* 4. Call es cron to send emails from queue
|
72 |
*/
|
73 |
static $campaigns_to_process;
|
@@ -154,10 +165,15 @@ if ( ! class_exists( 'ES_Queue' ) ) {
|
|
154 |
|
155 |
if ( is_array( $result ) ) {
|
156 |
|
157 |
-
$
|
158 |
-
|
159 |
-
|
160 |
-
|
|
|
|
|
|
|
|
|
|
|
161 |
}
|
162 |
}
|
163 |
}
|
@@ -346,8 +362,8 @@ if ( ! class_exists( 'ES_Queue' ) ) {
|
|
346 |
'campaign_id' => $campaign_id,
|
347 |
'subject' => $subject,
|
348 |
'body' => $content,
|
349 |
-
'count' =>
|
350 |
-
'status' => '
|
351 |
'start_at' => ! empty( $campaign['start_at'] ) ? $campaign['start_at'] : '',
|
352 |
'finish_at' => '',
|
353 |
'created_at' => ig_get_current_date_time(),
|
@@ -368,7 +384,7 @@ if ( ! class_exists( 'ES_Queue' ) ) {
|
|
368 |
}
|
369 |
|
370 |
/**
|
371 |
-
* Add contacts into
|
372 |
*
|
373 |
* @param $campaign_id
|
374 |
* @param $guid
|
@@ -805,7 +821,113 @@ if ( ! class_exists( 'ES_Queue' ) ) {
|
|
805 |
$this->update_email_sent_status( $contact_id, $campaign_id, $message_id, 'In Queue' );
|
806 |
}
|
807 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
808 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
809 |
}
|
810 |
}
|
811 |
|
41 |
// add_action( 'ig_es_email_sending_error', array( &$this, 'set_status_in_queue' ), 10, 4 );
|
42 |
add_action( 'ig_es_message_sent', array( &$this, 'set_sent_status' ), 10, 3 );
|
43 |
add_action( 'ig_es_message_sent', array( &$this, 'update_email_sent_count' ), 10, 3 );
|
44 |
+
|
45 |
+
// Action scheduler action to add subscribers to sending_queue table in background. Called through Action Scheduler library.
|
46 |
+
add_action( 'ig_es_add_subscribers_to_sending_queue', array( &$this, 'add_subscribers_to_sending_queue' ) );
|
47 |
+
|
48 |
+
// Ajax handler for running action scheduler task.
|
49 |
+
add_action( 'wp_ajax_ig_es_run_action_scheduler_task', array( 'IG_ES_Background_Process_Helper', 'run_action_scheduler_task' ) );
|
50 |
+
add_action( 'wp_ajax_nopriv_ig_es_run_action_scheduler_task', array( 'IG_ES_Background_Process_Helper', 'run_action_scheduler_task' ) );
|
51 |
+
|
52 |
+
// Ajax handler for triggering email queue sending.
|
53 |
+
add_action( 'wp_ajax_ig_es_trigger_mailing_queue_sending', array( $this, 'trigger_mailing_queue_sending' ) );
|
54 |
+
add_action( 'wp_ajax_nopriv_ig_es_trigger_mailing_queue_sending', array( $this, 'trigger_mailing_queue_sending' ) );
|
55 |
}
|
56 |
|
57 |
/**
|
78 |
* Steps
|
79 |
* 1. Fetch all active campaigns
|
80 |
* 2. Loop over through and based on matched condition put campaign into mailing_queue table
|
81 |
+
* 3. And also insert subscribers for respective campaign into sending_queue table
|
82 |
* 4. Call es cron to send emails from queue
|
83 |
*/
|
84 |
static $campaigns_to_process;
|
165 |
|
166 |
if ( is_array( $result ) ) {
|
167 |
|
168 |
+
$mailing_queue_id = $result['id'];
|
169 |
+
|
170 |
+
if ( ! empty( $mailing_queue_id ) ) {
|
171 |
+
$action_args = array(
|
172 |
+
'mailing_queue_id' => $mailing_queue_id,
|
173 |
+
'list_ids' => $list_id,
|
174 |
+
);
|
175 |
+
IG_ES_Background_Process_Helper::add_action_scheduler_task( 'ig_es_add_subscribers_to_sending_queue', $action_args );
|
176 |
+
}
|
177 |
}
|
178 |
}
|
179 |
}
|
362 |
'campaign_id' => $campaign_id,
|
363 |
'subject' => $subject,
|
364 |
'body' => $content,
|
365 |
+
'count' => 0,
|
366 |
+
'status' => 'Queueing',
|
367 |
'start_at' => ! empty( $campaign['start_at'] ) ? $campaign['start_at'] : '',
|
368 |
'finish_at' => '',
|
369 |
'created_at' => ig_get_current_date_time(),
|
384 |
}
|
385 |
|
386 |
/**
|
387 |
+
* Add contacts into sending_queue table
|
388 |
*
|
389 |
* @param $campaign_id
|
390 |
* @param $guid
|
821 |
$this->update_email_sent_status( $contact_id, $campaign_id, $message_id, 'In Queue' );
|
822 |
}
|
823 |
}
|
824 |
+
|
825 |
+
/**
|
826 |
+
* Method to add subscribers to the sending queue in background. Gets called through the Action Scheduler library.
|
827 |
+
*
|
828 |
+
* @param array $args action arguements.
|
829 |
+
*
|
830 |
+
* @since 4.6.3
|
831 |
+
*/
|
832 |
+
public function add_subscribers_to_sending_queue( $args = array() ) {
|
833 |
+
|
834 |
+
if ( empty( $args['mailing_queue_id'] ) || ! is_numeric( $args['mailing_queue_id'] ) || empty( $args['list_ids'] ) ) {
|
835 |
+
return false;
|
836 |
+
}
|
837 |
+
|
838 |
+
$batch_start_time = time();
|
839 |
|
840 |
+
/**
|
841 |
+
* By subtracting the waiting time from $batch_start_time now,
|
842 |
+
* We are allowing timeout to happen in the background process loop 3 seconds earlier.
|
843 |
+
* This earlier timeout will ensure we get engough time to make another asynchrounous request
|
844 |
+
* since we need to wait for sometime before making the asynchronous request.
|
845 |
+
**/
|
846 |
+
$batch_start_time = $batch_start_time - IG_ES_Background_Process_Helper::get_wait_seconds();
|
847 |
+
|
848 |
+
$mailing_queue_id = $args['mailing_queue_id'];
|
849 |
+
$list_ids = $args['list_ids'];
|
850 |
+
|
851 |
+
$mailing_queue = ES_DB_Mailing_Queue::get_email_by_id( $mailing_queue_id );
|
852 |
+
|
853 |
+
// Check if mailing queue exists. May have been deleted manually.
|
854 |
+
if ( empty( $mailing_queue ) ) {
|
855 |
+
return false;
|
856 |
+
}
|
857 |
+
|
858 |
+
$mailing_queue_hash = $mailing_queue['hash'];
|
859 |
+
$campaign_id = $mailing_queue['campaign_id'];
|
860 |
+
|
861 |
+
$active_subscribers = ES()->contacts_db->get_active_contacts_by_list_and_mailing_queue_id( $list_ids, $mailing_queue_id );
|
862 |
+
|
863 |
+
if ( ! empty( $active_subscribers ) ) {
|
864 |
+
$subscribers_batch_size = 5000;
|
865 |
+
|
866 |
+
// Create batches of subscribers each containing maximum subscribers equal to $subscribers_batch_size.
|
867 |
+
$subscribers_batches = array_chunk( $active_subscribers, $subscribers_batch_size );
|
868 |
+
|
869 |
+
foreach ( $subscribers_batches as $key => $subscribers ) {
|
870 |
+
|
871 |
+
$delivery_data = array();
|
872 |
+
$delivery_data['hash'] = $mailing_queue_hash;
|
873 |
+
$delivery_data['subscribers'] = $subscribers;
|
874 |
+
$delivery_data['campaign_id'] = $campaign_id;
|
875 |
+
$delivery_data['mailing_queue_id'] = $mailing_queue_id;
|
876 |
+
|
877 |
+
ES_DB_Sending_Queue::do_batch_insert( $delivery_data );
|
878 |
+
|
879 |
+
// Remove the processed batch.
|
880 |
+
unset( $subscribers_batches[ $key ] );
|
881 |
+
|
882 |
+
// Check if time limit or memory limit has been reached.
|
883 |
+
if ( IG_ES_Background_Process_Helper::time_exceeded( $batch_start_time ) || IG_ES_Background_Process_Helper::memory_exceeded() ) {
|
884 |
+
break;
|
885 |
+
}
|
886 |
+
}
|
887 |
+
|
888 |
+
$total_contacts_added = ES_DB_Sending_Queue::get_total_email_count_by_hash( $mailing_queue_hash );
|
889 |
+
ES_DB_Mailing_Queue::update_subscribers_count( $mailing_queue_hash, $total_contacts_added );
|
890 |
+
|
891 |
+
// Check if there are no batches to process.
|
892 |
+
if ( empty( $subscribers_batches ) ) {
|
893 |
+
|
894 |
+
$mailing_queue_status = 'In Queue';
|
895 |
+
// Update status to 'In Queue' so that cron(ES Cron/WP Cron) can pick it up.
|
896 |
+
ES_DB_Mailing_Queue::update_sent_status( $mailing_queue_hash, $mailing_queue_status );
|
897 |
+
} else {
|
898 |
+
/**
|
899 |
+
* If all subscribers batches are not processed(i.e. there are still emails to be added in the sending_queue table)
|
900 |
+
* Create another action scheduler task to process remaining batches.
|
901 |
+
**/
|
902 |
+
$action_args = array(
|
903 |
+
'mailing_queue_id' => $mailing_queue_id,
|
904 |
+
'list_ids' => $list_ids,
|
905 |
+
);
|
906 |
+
IG_ES_Background_Process_Helper::add_action_scheduler_task( 'ig_es_add_subscribers_to_sending_queue', $action_args, true, true );
|
907 |
+
}
|
908 |
+
} else {
|
909 |
+
$total_contacts_added = ES_DB_Sending_Queue::get_total_email_count_by_hash( $mailing_queue_hash );
|
910 |
+
// Check if there are not any queued email for this mailing queue id. If yes, then delete the mailing queue also since there is no meaning in processing an empty mailing queue.
|
911 |
+
if ( empty( $total_contacts_added ) ) {
|
912 |
+
ES_DB_Mailing_Queue::delete_notifications( array( $mailing_queue_id ) );
|
913 |
+
}
|
914 |
+
}
|
915 |
+
}
|
916 |
+
|
917 |
+
/**
|
918 |
+
* Method to trigger email sending through 'ig_es_cron_worker' cron worker.
|
919 |
+
*
|
920 |
+
* @since 4.6.3
|
921 |
+
*/
|
922 |
+
public function trigger_mailing_queue_sending() {
|
923 |
+
|
924 |
+
// Call cron action only when it is not locked.
|
925 |
+
if ( ! ES()->cron->is_locked() ) {
|
926 |
+
|
927 |
+
// Start processing of campaigns which are scheduled for current date time.
|
928 |
+
do_action( 'ig_es_cron_worker' );
|
929 |
+
}
|
930 |
+
}
|
931 |
}
|
932 |
}
|
933 |
|
lite/includes/classes/class-es-reports-table.php
CHANGED
@@ -561,7 +561,7 @@ class ES_Reports_Table extends WP_List_Table {
|
|
561 |
<?php esc_html_e( 'Preview Email', 'email-subscribers' ); ?>
|
562 |
</h2>
|
563 |
<p>
|
564 |
-
<?php echo wp_kses_post( 'This is how the email you sent may look. <br>Note: Different email services (like gmail, yahoo etc) display email content differently. So there could be a slight variation on how your customer will view the email content.', 'email-subscribers' ); ?>
|
565 |
</p>
|
566 |
<div class="tool-box">
|
567 |
<div style="padding:15px;background-color:#FFFFFF;">
|
561 |
<?php esc_html_e( 'Preview Email', 'email-subscribers' ); ?>
|
562 |
</h2>
|
563 |
<p>
|
564 |
+
<?php echo wp_kses_post( __( 'This is how the email you sent may look. <br>Note: Different email services (like gmail, yahoo etc) display email content differently. So there could be a slight variation on how your customer will view the email content.', 'email-subscribers' ) ); ?>
|
565 |
</p>
|
566 |
<div class="tool-box">
|
567 |
<div style="padding:15px;background-color:#FFFFFF;">
|
lite/includes/classes/class-es-templates-table.php
CHANGED
@@ -34,7 +34,7 @@ class ES_Templates_Table {
|
|
34 |
$template_type = ES_Common::get_campaign_types( array( 'sequence' ) );
|
35 |
?>
|
36 |
<p class="mt-3">
|
37 |
-
<label for="es_template_type"><span class="font-semibold text-sm text-gray-700"><?php esc_html_e( 'Select template type', 'email-
|
38 |
<select style="margin: 0.20rem 0;" name="es_template_type" id="es_template_type">
|
39 |
<?php
|
40 |
if ( ! empty( $template_type ) ) {
|
@@ -59,19 +59,23 @@ class ES_Templates_Table {
|
|
59 |
return;
|
60 |
}
|
61 |
?>
|
|
|
62 |
<p id="post_notification">
|
63 |
<a href="https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-post-notifications/?utm_source=es&utm_medium=in_app&utm_campaign=view_docs_help_page" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Post Notification: ', 'email-subsribers' ); ?> {{FIRSTNAME}},
|
64 |
{{LASTNAME}}, {{NAME}}, {{EMAIL}},
|
65 |
{{DATE}}, {{POSTTITLE}}, {{POSTIMAGE}}, {{POSTEXCERPT}}, {{POSTDESC}},
|
66 |
{{POSTAUTHOR}}, {{POSTLINK}}, {{POSTLINK-WITHTITLE}}, {{POSTLINK-ONLY}}, {{POSTFULL}} </p>
|
|
|
67 |
<p id="newsletter">
|
68 |
<a href="https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-newsletters/?utm_source=es&utm_medium=in_app&utm_campaign=view_docs_help_page" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Broadcast:', 'email-subscribers' ); ?> {{FIRSTNAME}}, {{LASTNAME}}, {{NAME}},
|
69 |
{{EMAIL}} </p>
|
|
|
70 |
<div id="post_digest">
|
71 |
<span style="font-size: 0.8em; margin-left: 0.3em; padding: 2px; background: #e66060; color: #fff; border-radius: 2px; ">Pro</span>
|
72 |
<a href="https://www.icegram.com/send-post-digest-using-email-subscribers-plugin/?utm_source=es&utm_medium=in_app&utm_campaign=view_post_digest_post" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Post Digest:', 'email-subscribers' ); ?>
|
73 |
{{FIRSTNAME}}, {{LASTNAME}}, {{NAME}}<div class="post_digest_block"> {{POSTDIGEST}} <br/><?php esc_html_e( 'Any keywords related Post Notification', 'email-subscribers' ); ?> <br/>{{/POSTDIGEST}} </div>
|
74 |
</div>
|
|
|
75 |
<?php
|
76 |
}
|
77 |
|
34 |
$template_type = ES_Common::get_campaign_types( array( 'sequence' ) );
|
35 |
?>
|
36 |
<p class="mt-3">
|
37 |
+
<label for="es_template_type"><span class="font-semibold text-sm text-gray-700"><?php esc_html_e( 'Select template type', 'email-subscribers' ); ?></span></label><br/>
|
38 |
<select style="margin: 0.20rem 0;" name="es_template_type" id="es_template_type">
|
39 |
<?php
|
40 |
if ( ! empty( $template_type ) ) {
|
59 |
return;
|
60 |
}
|
61 |
?>
|
62 |
+
<!-- Start-IG-Code -->
|
63 |
<p id="post_notification">
|
64 |
<a href="https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-post-notifications/?utm_source=es&utm_medium=in_app&utm_campaign=view_docs_help_page" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Post Notification: ', 'email-subsribers' ); ?> {{FIRSTNAME}},
|
65 |
{{LASTNAME}}, {{NAME}}, {{EMAIL}},
|
66 |
{{DATE}}, {{POSTTITLE}}, {{POSTIMAGE}}, {{POSTEXCERPT}}, {{POSTDESC}},
|
67 |
{{POSTAUTHOR}}, {{POSTLINK}}, {{POSTLINK-WITHTITLE}}, {{POSTLINK-ONLY}}, {{POSTFULL}} </p>
|
68 |
+
<!-- End-IG-Code -->
|
69 |
<p id="newsletter">
|
70 |
<a href="https://www.icegram.com/documentation/es-what-are-the-available-keywords-in-the-newsletters/?utm_source=es&utm_medium=in_app&utm_campaign=view_docs_help_page" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Broadcast:', 'email-subscribers' ); ?> {{FIRSTNAME}}, {{LASTNAME}}, {{NAME}},
|
71 |
{{EMAIL}} </p>
|
72 |
+
<!-- Start-IG-Code -->
|
73 |
<div id="post_digest">
|
74 |
<span style="font-size: 0.8em; margin-left: 0.3em; padding: 2px; background: #e66060; color: #fff; border-radius: 2px; ">Pro</span>
|
75 |
<a href="https://www.icegram.com/send-post-digest-using-email-subscribers-plugin/?utm_source=es&utm_medium=in_app&utm_campaign=view_post_digest_post" target="_blank"><?php esc_html_e( 'Available Keywords', 'email-subscribers' ); ?></a> <?php esc_html_e( 'for Post Digest:', 'email-subscribers' ); ?>
|
76 |
{{FIRSTNAME}}, {{LASTNAME}}, {{NAME}}<div class="post_digest_block"> {{POSTDIGEST}} <br/><?php esc_html_e( 'Any keywords related Post Notification', 'email-subscribers' ); ?> <br/>{{/POSTDIGEST}} </div>
|
77 |
</div>
|
78 |
+
<!-- End-IG-Code -->
|
79 |
<?php
|
80 |
}
|
81 |
|
lite/includes/classes/class-ig-es-background-process-helper.php
ADDED
@@ -0,0 +1,259 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* Helper class for background processing
|
4 |
+
*
|
5 |
+
* @author Icegram
|
6 |
+
* @since 4.6.3
|
7 |
+
* @version 1.0.0
|
8 |
+
*
|
9 |
+
* @package Email Subscribers
|
10 |
+
*/
|
11 |
+
|
12 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
13 |
+
exit; // Exit if accessed directly.
|
14 |
+
}
|
15 |
+
|
16 |
+
if ( ! class_exists( 'IG_ES_Background_Process_Helper' ) ) {
|
17 |
+
|
18 |
+
/**
|
19 |
+
* IG_ES_Background_Process_Helper Class.
|
20 |
+
*/
|
21 |
+
class IG_ES_Background_Process_Helper {
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Identifier
|
25 |
+
*
|
26 |
+
* @var mixed
|
27 |
+
*/
|
28 |
+
protected static $identifier;
|
29 |
+
|
30 |
+
/**
|
31 |
+
* Variable to hold instance of IG_ES_Background_Process_Helper
|
32 |
+
*
|
33 |
+
* @var $instance
|
34 |
+
*/
|
35 |
+
private static $instance = null;
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Contructor
|
39 |
+
*
|
40 |
+
* @since 4.6.3
|
41 |
+
*/
|
42 |
+
private function __construct() {
|
43 |
+
|
44 |
+
self::$identifier = 'ig_es_background_process';
|
45 |
+
}
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Get single instance of IG_ES_Background_Process_Helper
|
49 |
+
*
|
50 |
+
* @return IG_ES_Background_Process_Helper Singleton object of IG_ES_Background_Process_Helper
|
51 |
+
*
|
52 |
+
* @since 4.6.3
|
53 |
+
*/
|
54 |
+
public static function get_instance() {
|
55 |
+
// Check if instance is already exists.
|
56 |
+
if ( is_null( self::$instance ) ) {
|
57 |
+
self::$instance = new self();
|
58 |
+
}
|
59 |
+
|
60 |
+
return self::$instance;
|
61 |
+
}
|
62 |
+
|
63 |
+
/**
|
64 |
+
* Memory exceeded
|
65 |
+
*
|
66 |
+
* Ensures the batch process never exceeds 90%
|
67 |
+
* of the maximum WordPress memory.
|
68 |
+
*
|
69 |
+
* @return bool
|
70 |
+
*
|
71 |
+
* @since 4.6.3
|
72 |
+
*/
|
73 |
+
public static function memory_exceeded() {
|
74 |
+
$memory_limit = self::get_memory_limit() * 0.9; // 90% of max memory
|
75 |
+
$current_memory = memory_get_usage( true );
|
76 |
+
|
77 |
+
if ( $current_memory >= $memory_limit ) {
|
78 |
+
return true;
|
79 |
+
}
|
80 |
+
|
81 |
+
return false;
|
82 |
+
}
|
83 |
+
|
84 |
+
/**
|
85 |
+
* Get memory limit.
|
86 |
+
*
|
87 |
+
* @return int
|
88 |
+
*
|
89 |
+
* @since 4.6.3
|
90 |
+
*/
|
91 |
+
public static function get_memory_limit() {
|
92 |
+
if ( function_exists( 'ini_get' ) ) {
|
93 |
+
$memory_limit = ini_get( 'memory_limit' );
|
94 |
+
} else {
|
95 |
+
// Sensible default.
|
96 |
+
$memory_limit = '128M';
|
97 |
+
}
|
98 |
+
|
99 |
+
if ( ! $memory_limit || -1 === intval( $memory_limit ) ) {
|
100 |
+
// Unlimited, set to 32GB.
|
101 |
+
$memory_limit = '32G';
|
102 |
+
}
|
103 |
+
|
104 |
+
return wp_convert_hr_to_bytes( $memory_limit );
|
105 |
+
}
|
106 |
+
|
107 |
+
/**
|
108 |
+
* Time exceeded.
|
109 |
+
*
|
110 |
+
* Ensures the batch never exceeds a sensible time limit.
|
111 |
+
* A timeout limit of 30s is common on shared hosting.
|
112 |
+
*
|
113 |
+
* @param string $start_time start timestamp.
|
114 |
+
*
|
115 |
+
* @return bool
|
116 |
+
*
|
117 |
+
* @since 4.6.3
|
118 |
+
*/
|
119 |
+
public static function time_exceeded( $start_time = 0 ) {
|
120 |
+
|
121 |
+
$finish = $start_time + ( self::get_time_limit() * 0.6 );
|
122 |
+
$return = false;
|
123 |
+
|
124 |
+
if ( time() >= $finish ) {
|
125 |
+
$return = true;
|
126 |
+
}
|
127 |
+
|
128 |
+
return apply_filters( self::$identifier . '_time_exceeded', $return );
|
129 |
+
}
|
130 |
+
|
131 |
+
/**
|
132 |
+
* Method to get Server time limit
|
133 |
+
*
|
134 |
+
* @return int $time_limit Server time limit.
|
135 |
+
*
|
136 |
+
* @since 4.6.3
|
137 |
+
*/
|
138 |
+
public static function get_time_limit() {
|
139 |
+
if ( function_exists( 'ini_get' ) ) {
|
140 |
+
$time_limit = ini_get( 'max_execution_time' );
|
141 |
+
} else {
|
142 |
+
// Sensible default.
|
143 |
+
$time_limit = apply_filters( self::$identifier . '_default_time_limit', 20 );
|
144 |
+
}
|
145 |
+
|
146 |
+
$time_limit = (int) $time_limit;
|
147 |
+
return $time_limit;
|
148 |
+
}
|
149 |
+
|
150 |
+
/**
|
151 |
+
* Method to add new action scheduler task. Task added by this function are called by Action Scheduler library when execution time comes.
|
152 |
+
*
|
153 |
+
* @param string $action Action name.
|
154 |
+
* @param array $action_args Action arguements.
|
155 |
+
* @param bool $process_asynchronously Should process action asynchronously.
|
156 |
+
* @param bool $should_wait Should wait before making asynchronous request to process the action.
|
157 |
+
*
|
158 |
+
* @return int|bool $action_id Action ID on success or false on failure.
|
159 |
+
*
|
160 |
+
* @since 4.6.3
|
161 |
+
*/
|
162 |
+
public static function add_action_scheduler_task( $action = '', $action_args = array(), $process_asynchronously = true, $should_wait = false ) {
|
163 |
+
|
164 |
+
if ( empty( $action ) || empty( $action_args ) ) {
|
165 |
+
return false;
|
166 |
+
}
|
167 |
+
|
168 |
+
if ( function_exists( 'as_schedule_single_action' ) ) {
|
169 |
+
$action_id = as_schedule_single_action( time(), $action, array( $action_args ), 'email-subscribers' );
|
170 |
+
if ( ! empty( $action_id ) ) {
|
171 |
+
if ( $process_asynchronously ) {
|
172 |
+
$request_args = array(
|
173 |
+
'action' => 'ig_es_run_action_scheduler_task',
|
174 |
+
'action_id' => $action_id,
|
175 |
+
);
|
176 |
+
self::send_async_ajax_request( $request_args, $should_wait );
|
177 |
+
}
|
178 |
+
return $action_id;
|
179 |
+
}
|
180 |
+
}
|
181 |
+
|
182 |
+
return false;
|
183 |
+
}
|
184 |
+
|
185 |
+
/**
|
186 |
+
* Method to trigger immediate processing of action scheduler task.
|
187 |
+
*
|
188 |
+
* @since 4.6.3
|
189 |
+
*/
|
190 |
+
public static function run_action_scheduler_task() {
|
191 |
+
|
192 |
+
$action_id = ig_es_get_request_data( 'action_id' );
|
193 |
+
|
194 |
+
if ( ! empty( $action_id ) ) {
|
195 |
+
if ( class_exists( 'ActionScheduler_QueueRunner' ) ) {
|
196 |
+
$queue_runner = ActionScheduler_QueueRunner::instance();
|
197 |
+
$queue_runner->process_action( $action_id, 'email-subscribers' );
|
198 |
+
}
|
199 |
+
}
|
200 |
+
}
|
201 |
+
|
202 |
+
/**
|
203 |
+
* Method to get required waiting time in seconds before making async request.
|
204 |
+
* Chaining async requests can crash MySQL. A brief waiting period in PHP helps in preventing that.
|
205 |
+
*
|
206 |
+
* @return int Waiting time in seconds.
|
207 |
+
*
|
208 |
+
* @since 4.6.3
|
209 |
+
*/
|
210 |
+
public static function get_wait_seconds() {
|
211 |
+
return apply_filters( 'ig_es_async_request_wait_seconds', 3 );
|
212 |
+
}
|
213 |
+
|
214 |
+
/**
|
215 |
+
* Method to send asynchronous background request to admin-ajax.
|
216 |
+
*
|
217 |
+
* @param array $request_args Async request's arguments.
|
218 |
+
* @param bool $should_wait Should wait before making this async request.
|
219 |
+
*
|
220 |
+
* @return array $response Async request's response.
|
221 |
+
*
|
222 |
+
* @since 4.6.3
|
223 |
+
*/
|
224 |
+
public static function send_async_ajax_request( $request_args = array(), $should_wait = false ) {
|
225 |
+
|
226 |
+
$response = array();
|
227 |
+
|
228 |
+
if ( empty( $request_args ) ) {
|
229 |
+
return $response;
|
230 |
+
}
|
231 |
+
|
232 |
+
// Should wait before making async request.
|
233 |
+
if ( $should_wait ) {
|
234 |
+
$wait_seconds = self::get_wait_seconds();
|
235 |
+
|
236 |
+
if ( $wait_seconds ) {
|
237 |
+
|
238 |
+
// Sleep to prevent crashing of MYSQL due to chaining of async request.
|
239 |
+
sleep( $wait_seconds );
|
240 |
+
}
|
241 |
+
}
|
242 |
+
|
243 |
+
$admin_ajax_url = admin_url( 'admin-ajax.php' );
|
244 |
+
$admin_ajax_url = add_query_arg( $request_args, $admin_ajax_url );
|
245 |
+
$args = array(
|
246 |
+
'timeout' => 0.01,
|
247 |
+
'blocking' => false,
|
248 |
+
'cookies' => $_COOKIE,
|
249 |
+
'sslverify' => apply_filters( 'https_local_ssl_verify', false ),
|
250 |
+
);
|
251 |
+
|
252 |
+
// Make a asynchronous request.
|
253 |
+
$response = wp_remote_get( esc_url_raw( $admin_ajax_url ), $args );
|
254 |
+
|
255 |
+
return $response;
|
256 |
+
}
|
257 |
+
}
|
258 |
+
}
|
259 |
+
|
lite/includes/db/class-es-db-campaigns.php
CHANGED
@@ -724,4 +724,41 @@ class ES_DB_Campaigns extends ES_DB {
|
|
724 |
return $updated;
|
725 |
|
726 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
727 |
}
|
724 |
return $updated;
|
725 |
|
726 |
}
|
727 |
+
|
728 |
+
/**
|
729 |
+
* Duplicate Campaign
|
730 |
+
*
|
731 |
+
* @param $id
|
732 |
+
*
|
733 |
+
* @since 4.6.3
|
734 |
+
*/
|
735 |
+
public function duplicate_campaign( $id = null ) {
|
736 |
+
|
737 |
+
if ( ! empty( $id ) ) {
|
738 |
+
|
739 |
+
$campaign = $this->get( $id );
|
740 |
+
$campaign['status'] = IG_ES_CAMPAIGN_STATUS_IN_ACTIVE;
|
741 |
+
$campaign['name'] = __( 'Copy', 'email-subscribers' ) . ' - ' . $campaign['name'];
|
742 |
+
|
743 |
+
if ( 'newsletter' === $campaign['type'] ) {
|
744 |
+
$campaign['subject'] = __( 'Copy', 'email-subscribers' ) . ' - ' . $campaign['subject'];
|
745 |
+
}
|
746 |
+
$campaign_id = $campaign['id'];
|
747 |
+
unset( $campaign['id'] );
|
748 |
+
unset( $campaign['created_at'] );
|
749 |
+
|
750 |
+
$duplicate_campaign_id = $this->save_campaign( $campaign );
|
751 |
+
|
752 |
+
if ( 'sequence' === $campaign['type'] ) {
|
753 |
+
$sequence_campaigns = $this->get_campaign_by_parent_id( $campaign_id );
|
754 |
+
|
755 |
+
foreach ( $sequence_campaigns as $index => $child_campaign ) {
|
756 |
+
$child_campaign['parent_id'] = $duplicate_campaign_id;
|
757 |
+
unset( $child_campaign['id'] );
|
758 |
+
unset( $child_campaign['created_at'] );
|
759 |
+
$this->save_campaign( $child_campaign );
|
760 |
+
}
|
761 |
+
}
|
762 |
+
}
|
763 |
+
}
|
764 |
}
|
lite/includes/db/class-es-db-contacts.php
CHANGED
@@ -65,6 +65,7 @@ class ES_DB_Contacts extends ES_DB {
|
|
65 |
'last_name' => '%s',
|
66 |
'email' => '%s',
|
67 |
'source' => '%s',
|
|
|
68 |
'form_id' => '%d',
|
69 |
'status' => '%s',
|
70 |
'unsubscribed' => '%d',
|
@@ -93,6 +94,7 @@ class ES_DB_Contacts extends ES_DB {
|
|
93 |
'last_name' => '',
|
94 |
'email' => '',
|
95 |
'source' => '',
|
|
|
96 |
'form_id' => 0,
|
97 |
'status' => 'verified',
|
98 |
'unsubscribed' => 0,
|
@@ -260,7 +262,8 @@ class ES_DB_Contacts extends ES_DB {
|
|
260 |
}
|
261 |
|
262 |
global $wpdb;
|
263 |
-
|
|
|
264 |
if ( is_array( $list_id ) ) {
|
265 |
$list_ids_str = implode( ',', $list_id );
|
266 |
$where = $wpdb->prepare(
|
@@ -275,6 +278,41 @@ class ES_DB_Contacts extends ES_DB {
|
|
275 |
|
276 |
}
|
277 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
278 |
/**
|
279 |
* Get contacts by ids
|
280 |
*
|
@@ -840,4 +878,80 @@ class ES_DB_Contacts extends ES_DB {
|
|
840 |
}
|
841 |
|
842 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
843 |
}
|
65 |
'last_name' => '%s',
|
66 |
'email' => '%s',
|
67 |
'source' => '%s',
|
68 |
+
'ip_address' => '%s',
|
69 |
'form_id' => '%d',
|
70 |
'status' => '%s',
|
71 |
'unsubscribed' => '%d',
|
94 |
'last_name' => '',
|
95 |
'email' => '',
|
96 |
'source' => '',
|
97 |
+
'ip_address' => '',
|
98 |
'form_id' => 0,
|
99 |
'status' => 'verified',
|
100 |
'unsubscribed' => 0,
|
262 |
}
|
263 |
|
264 |
global $wpdb;
|
265 |
+
|
266 |
+
// Check if we have got array of list ids.
|
267 |
if ( is_array( $list_id ) ) {
|
268 |
$list_ids_str = implode( ',', $list_id );
|
269 |
$where = $wpdb->prepare(
|
278 |
|
279 |
}
|
280 |
|
281 |
+
/**
|
282 |
+
* Get active contacts by list_id and excluding contacts from sending queue having given mailing_queue_id
|
283 |
+
*
|
284 |
+
* @param $list_id
|
285 |
+
* @param $mailing_queue_id
|
286 |
+
*
|
287 |
+
* @return array|object|null
|
288 |
+
*
|
289 |
+
* @since 4.6.3
|
290 |
+
*
|
291 |
+
*/
|
292 |
+
public function get_active_contacts_by_list_and_mailing_queue_id( $list_id, $mailing_queue_id = 0 ) {
|
293 |
+
|
294 |
+
if ( empty( $list_id ) ) {
|
295 |
+
return array();
|
296 |
+
}
|
297 |
+
|
298 |
+
global $wpdb;
|
299 |
+
|
300 |
+
// Check if we have got array of list ids.
|
301 |
+
if ( is_array( $list_id ) ) {
|
302 |
+
$list_ids_str = implode( ',', $list_id );
|
303 |
+
$where = $wpdb->prepare(
|
304 |
+
"id IN (SELECT contact_id FROM {$wpdb->prefix}ig_lists_contacts WHERE FIND_IN_SET( list_id, %s ) AND status IN ('subscribed', 'confirmed')) AND id NOT IN(SELECT contact_id FROM {$wpdb->prefix}ig_sending_queue WHERE mailing_queue_id = %d )",
|
305 |
+
$list_ids_str,
|
306 |
+
$mailing_queue_id
|
307 |
+
);
|
308 |
+
} else {
|
309 |
+
$where = $wpdb->prepare( "id IN (SELECT contact_id FROM {$wpdb->prefix}ig_lists_contacts WHERE list_id = %d AND status IN ('subscribed', 'confirmed')) AND id NOT IN(SELECT contact_id FROM {$wpdb->prefix}ig_sending_queue WHERE mailing_queue_id = %d )", $list_id, $mailing_queue_id );
|
310 |
+
}
|
311 |
+
|
312 |
+
return $this->get_by_conditions( $where );
|
313 |
+
}
|
314 |
+
|
315 |
+
|
316 |
/**
|
317 |
* Get contacts by ids
|
318 |
*
|
878 |
}
|
879 |
|
880 |
|
881 |
+
/**
|
882 |
+
* Count contacts by Form id
|
883 |
+
*
|
884 |
+
* @param string $form_id
|
885 |
+
*
|
886 |
+
* @return string|null
|
887 |
+
*
|
888 |
+
* @since 4.6.3
|
889 |
+
*/
|
890 |
+
public function get_total_contacts_by_form_id( $form_id = '', $status = 0 ) {
|
891 |
+
|
892 |
+
global $wpdb;
|
893 |
+
|
894 |
+
$total_subscribers = '';
|
895 |
+
|
896 |
+
if ( ! empty( $form_id ) ) {
|
897 |
+
$total_subscribers = $wpdb->get_var(
|
898 |
+
$wpdb->prepare(
|
899 |
+
"SELECT count(distinct(id)) as total_active_subscribers FROM {$wpdb->prefix}ig_contacts where form_id = %d AND unsubscribed = %d" ,
|
900 |
+
$form_id,
|
901 |
+
$status
|
902 |
+
)
|
903 |
+
);
|
904 |
+
}
|
905 |
+
|
906 |
+
return $total_subscribers;
|
907 |
+
|
908 |
+
}
|
909 |
+
|
910 |
+
/**
|
911 |
+
* Migrate Ip address of subscribers from lists_contacts to contacts table
|
912 |
+
*
|
913 |
+
* @since 4.6.3
|
914 |
+
*/
|
915 |
+
public function migrate_ip_from_list_contacts_to_contacts_table() {
|
916 |
+
global $wpdb;
|
917 |
+
|
918 |
+
//Get Total count of subscribers
|
919 |
+
$total = $wpdb->get_var( "SELECT count(*) as total FROM {$wpdb->prefix}ig_contacts" );
|
920 |
+
|
921 |
+
// If we have subscribers?
|
922 |
+
if ( $total > 0 ) {
|
923 |
+
|
924 |
+
$wpdb->query(
|
925 |
+
"UPDATE {$wpdb->prefix}ig_contacts AS contact_data
|
926 |
+
LEFT JOIN {$wpdb->prefix}ig_lists_contacts AS list_data
|
927 |
+
ON contact_data.id = list_data.contact_id
|
928 |
+
SET contact_data.ip_address = list_data.subscribed_ip
|
929 |
+
WHERE contact_data.id = list_data.contact_id
|
930 |
+
AND list_data.subscribed_ip IS NOT NULL
|
931 |
+
AND list_data.subscribed_ip <> ''"
|
932 |
+
);
|
933 |
+
}
|
934 |
+
}
|
935 |
+
|
936 |
+
|
937 |
+
/**
|
938 |
+
* Insert IP along with subscriber data
|
939 |
+
*
|
940 |
+
* @param $data
|
941 |
+
* @param string $type
|
942 |
+
*
|
943 |
+
* @return array
|
944 |
+
*
|
945 |
+
* @since 4.6.3
|
946 |
+
*/
|
947 |
+
public function insert( $data, $type = '' ) {
|
948 |
+
$source = array( 'admin','import' );
|
949 |
+
if ( empty( $data['ip_address'] ) && ! in_array( $data['source'], $source ) ) {
|
950 |
+
$data['ip_address'] = ig_es_get_ip();
|
951 |
+
}
|
952 |
+
return parent::insert( $data, $type );
|
953 |
+
}
|
954 |
+
|
955 |
+
|
956 |
+
|
957 |
}
|
lite/includes/db/class-es-db-mailing-queue.php
CHANGED
@@ -440,4 +440,29 @@ class ES_DB_Mailing_Queue {
|
|
440 |
}
|
441 |
}
|
442 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
443 |
}
|
440 |
}
|
441 |
}
|
442 |
}
|
443 |
+
|
444 |
+
/**
|
445 |
+
* Method to update subscribers count in mailing queue table.
|
446 |
+
*
|
447 |
+
* @param string $hash Mailing queue hash.
|
448 |
+
* @param int $count Subscribers count.
|
449 |
+
*
|
450 |
+
* @since 4.6.3
|
451 |
+
*/
|
452 |
+
public static function update_subscribers_count( $hash = '', $count = 0 ) {
|
453 |
+
|
454 |
+
global $wpdb;
|
455 |
+
|
456 |
+
if ( empty( $hash ) ) {
|
457 |
+
return;
|
458 |
+
}
|
459 |
+
|
460 |
+
$wpdb->query(
|
461 |
+
$wpdb->prepare(
|
462 |
+
"UPDATE {$wpdb->prefix}ig_mailing_queue SET count = %d WHERE hash = %s",
|
463 |
+
$count,
|
464 |
+
$hash
|
465 |
+
)
|
466 |
+
);
|
467 |
+
}
|
468 |
}
|
lite/includes/es-backward.php
CHANGED
@@ -52,6 +52,7 @@ class es_cls_dbquery {
|
|
52 |
'created_at' => ig_get_current_date_time(),
|
53 |
);
|
54 |
$contact_id = ES()->contacts_db->get_contact_id_by_email( $email );
|
|
|
55 |
if ( ! $contact_id ) {
|
56 |
$contact_id = ES()->contacts_db->insert( $sub_data );
|
57 |
}
|
@@ -75,7 +76,7 @@ class es_cls_dbquery {
|
|
75 |
'status' => $status,
|
76 |
'optin_type' => $optin_type,
|
77 |
'subscribed_at' => ig_get_current_date_time(),
|
78 |
-
'subscribed_ip' => ig_es_get_ip()
|
79 |
);
|
80 |
|
81 |
ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $list_id );
|
52 |
'created_at' => ig_get_current_date_time(),
|
53 |
);
|
54 |
$contact_id = ES()->contacts_db->get_contact_id_by_email( $email );
|
55 |
+
|
56 |
if ( ! $contact_id ) {
|
57 |
$contact_id = ES()->contacts_db->insert( $sub_data );
|
58 |
}
|
76 |
'status' => $status,
|
77 |
'optin_type' => $optin_type,
|
78 |
'subscribed_at' => ig_get_current_date_time(),
|
79 |
+
'subscribed_ip' => ig_es_get_ip(),
|
80 |
);
|
81 |
|
82 |
ES()->lists_contacts_db->add_contact_to_lists( $list_contact_data, $list_id );
|
lite/includes/notices/views/trial-consent.php
CHANGED
@@ -27,17 +27,18 @@ $optout_url = wp_nonce_url(
|
|
27 |
<div class="notice notice-success">
|
28 |
<p>
|
29 |
<?php
|
30 |
-
|
|
|
31 |
?>
|
32 |
<br/>
|
33 |
<a href="<?php echo esc_url( $optin_url ); ?>" class="ig-es-primary-button px-3 py-1 mt-2 align-middle">
|
34 |
<?php
|
35 |
-
echo
|
36 |
?>
|
37 |
</a>
|
38 |
<a href="<?php echo esc_url( $optout_url ); ?>" class="ig-es-title-button px-3 py-1 mt-2 ml-2 align-middle">
|
39 |
<?php
|
40 |
-
echo
|
41 |
?>
|
42 |
</a>
|
43 |
</p>
|
27 |
<div class="notice notice-success">
|
28 |
<p>
|
29 |
<?php
|
30 |
+
/* translators: %s: Trial period in days */
|
31 |
+
echo esc_html__( sprintf( 'Start your %s days free trial of Email Subscribers’ premium services like email delivery check, spam protection, cron handling & lot more..', ES()->trial->get_trial_period( 'in_days' ) ), 'email-subscribers' );
|
32 |
?>
|
33 |
<br/>
|
34 |
<a href="<?php echo esc_url( $optin_url ); ?>" class="ig-es-primary-button px-3 py-1 mt-2 align-middle">
|
35 |
<?php
|
36 |
+
echo esc_html__( 'Yes, start my free trial!', 'email-subscribers' );
|
37 |
?>
|
38 |
</a>
|
39 |
<a href="<?php echo esc_url( $optout_url ); ?>" class="ig-es-title-button px-3 py-1 mt-2 ml-2 align-middle">
|
40 |
<?php
|
41 |
+
echo esc_html__( 'No, it’s ok!', 'email-subscribers' );
|
42 |
?>
|
43 |
</a>
|
44 |
</p>
|
lite/includes/pro-features.php
CHANGED
@@ -606,16 +606,14 @@ function ig_es_add_edd_tab_settings( $tab_options ) {
|
|
606 |
function ig_es_workflows_integration_metabox( $page_prefix = '' ) {
|
607 |
if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
|
608 |
|
609 |
-
add_meta_box( 'ig_es_workflow_integration_information', 'ES PRO Integrations', 'ig_es_workflows_integration_upsell', $page_prefix . '
|
610 |
}
|
611 |
}
|
612 |
|
613 |
function ig_es_show_hidden_workflow_metabox( $es_workflow_metaboxes ) {
|
614 |
|
615 |
if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
|
616 |
-
$es_workflow_metaboxes =
|
617 |
-
'ig_es_workflow_integration_description',
|
618 |
-
);
|
619 |
}
|
620 |
|
621 |
return $es_workflow_metaboxes;
|
606 |
function ig_es_workflows_integration_metabox( $page_prefix = '' ) {
|
607 |
if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
|
608 |
|
609 |
+
add_meta_box( 'ig_es_workflow_integration_information', __( 'ES PRO Integrations', 'email-subscribers' ), 'ig_es_workflows_integration_upsell', $page_prefix . '_page_es_workflows', 'side', 'default' );
|
610 |
}
|
611 |
}
|
612 |
|
613 |
function ig_es_show_hidden_workflow_metabox( $es_workflow_metaboxes ) {
|
614 |
|
615 |
if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
|
616 |
+
$es_workflow_metaboxes[] = 'ig_es_workflow_integration_description';
|
|
|
|
|
617 |
}
|
618 |
|
619 |
return $es_workflow_metaboxes;
|
lite/includes/upgrade/es-update-functions.php
CHANGED
@@ -1264,3 +1264,45 @@ function ig_es_update_457_db_version() {
|
|
1264 |
ES_Install::update_db_version( '4.5.7' );
|
1265 |
}
|
1266 |
/* --------------------- ES 4.5.7(End)--------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1264 |
ES_Install::update_db_version( '4.5.7' );
|
1265 |
}
|
1266 |
/* --------------------- ES 4.5.7(End)--------------------------- */
|
1267 |
+
|
1268 |
+
|
1269 |
+
/* --------------------- ES 4.6.3(Start)--------------------------- */
|
1270 |
+
|
1271 |
+
/**
|
1272 |
+
* Add Ip column in contacts table
|
1273 |
+
* Migrate existing Ip address from lists_contacts table to contacts table
|
1274 |
+
*
|
1275 |
+
* @since 4.6.3
|
1276 |
+
*/
|
1277 |
+
function ig_es_update_463_alter_contacts_table() {
|
1278 |
+
global $wpdb;
|
1279 |
+
|
1280 |
+
$cols = $wpdb->get_col( "SHOW COLUMNS FROM {$wpdb->prefix}ig_contacts" );
|
1281 |
+
|
1282 |
+
if ( ! in_array( 'ip_address', $cols, true ) ) {
|
1283 |
+
$wpdb->query(
|
1284 |
+
"ALTER TABLE {$wpdb->prefix}ig_contacts
|
1285 |
+
ADD COLUMN `ip_address` varchar(50) NULL AFTER `source`"
|
1286 |
+
);
|
1287 |
+
|
1288 |
+
}
|
1289 |
+
}
|
1290 |
+
|
1291 |
+
/**
|
1292 |
+
* Migrate existing Ip address from lists_contacts table to contacts table
|
1293 |
+
*
|
1294 |
+
* @since 4.6.3
|
1295 |
+
*/
|
1296 |
+
function ig_es_migrate_ip_from_list_contacts_to_contacts_table() {
|
1297 |
+
ES()->contacts_db->migrate_ip_from_list_contacts_to_contacts_table();
|
1298 |
+
}
|
1299 |
+
|
1300 |
+
/**
|
1301 |
+
* Update DB version
|
1302 |
+
*
|
1303 |
+
* @since 4.6.3
|
1304 |
+
*/
|
1305 |
+
function ig_es_update_463_db_version() {
|
1306 |
+
ES_Install::update_db_version( '4.6.3' );
|
1307 |
+
}
|
1308 |
+
/* --------------------- ES 4.6.3(End)--------------------------- */
|
lite/includes/workflows/abstracts/class-es-workflow-trigger.php
CHANGED
@@ -310,7 +310,12 @@ abstract class ES_Workflow_Trigger {
|
|
310 |
}
|
311 |
|
312 |
if ( $process_immediately ) {
|
313 |
-
|
|
|
|
|
|
|
|
|
|
|
314 |
}
|
315 |
}
|
316 |
|
310 |
}
|
311 |
|
312 |
if ( $process_immediately ) {
|
313 |
+
|
314 |
+
$request_args = array(
|
315 |
+
'action' => 'ig_es_trigger_workflow_queue_processing',
|
316 |
+
);
|
317 |
+
|
318 |
+
IG_ES_Background_Process_Helper::send_async_ajax_request( $request_args );
|
319 |
}
|
320 |
}
|
321 |
|
lite/includes/workflows/actions/class-es-action-add-to-list.php
CHANGED
@@ -42,7 +42,7 @@ class ES_Action_Add_To_List extends ES_Workflow_Action {
|
|
42 |
|
43 |
$list_field = new ES_Select();
|
44 |
$list_field->set_name( 'ig-es-list' );
|
45 |
-
$list_field->set_title( 'Select List', 'email-subscribers' );
|
46 |
$list_field->set_options( $lists );
|
47 |
$list_field->set_required();
|
48 |
$this->add_field( $list_field );
|
42 |
|
43 |
$list_field = new ES_Select();
|
44 |
$list_field->set_name( 'ig-es-list' );
|
45 |
+
$list_field->set_title( __( 'Select List', 'email-subscribers' ) );
|
46 |
$list_field->set_options( $lists );
|
47 |
$list_field->set_required();
|
48 |
$this->add_field( $list_field );
|
lite/includes/workflows/admin/class-es-workflow-admin-edit.php
CHANGED
@@ -249,7 +249,7 @@ class ES_Workflow_Admin_Edit {
|
|
249 |
*/
|
250 |
public static function add_metaboxes() {
|
251 |
|
252 |
-
$page_prefix =
|
253 |
|
254 |
$meta_box_title_for_trigger = __( 'Trigger', 'email-subscribers' );
|
255 |
$meta_box_title_for_actions = __( 'Actions', 'email-subscribers' );
|
@@ -257,14 +257,14 @@ class ES_Workflow_Admin_Edit {
|
|
257 |
$meta_box_title_for_options = __( 'Options', 'email-subscribers' );
|
258 |
// $meta_box_title_for_timing = __( 'Timing', 'email-subscribers' );
|
259 |
|
260 |
-
add_meta_box( 'ig_es_workflow_trigger', $meta_box_title_for_trigger, array( __CLASS__, 'trigger_metabox' ), $page_prefix . '
|
261 |
-
add_meta_box( 'ig_es_workflow_actions', $meta_box_title_for_actions, array( __CLASS__, 'actions_metabox' ), $page_prefix . '
|
262 |
-
add_meta_box( 'ig_es_workflow_save', $meta_box_title_for_save, array( __CLASS__, 'save_metabox' ), $page_prefix . '
|
263 |
if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
|
264 |
do_action( 'ig_es_workflows_integration', $page_prefix );
|
265 |
}
|
266 |
-
// add_meta_box( 'ig_es_workflow_options', $meta_box_title_for_options, array( __CLASS__, 'options_metabox' ), $page_prefix . '
|
267 |
-
// add_meta_box( 'ig_es_workflow_timing', $meta_box_title_for_timing, array( __CLASS__, 'timing_metabox' ), $page_prefix . '
|
268 |
}
|
269 |
|
270 |
/**
|
249 |
*/
|
250 |
public static function add_metaboxes() {
|
251 |
|
252 |
+
$page_prefix = ES()->get_admin_page_prefix();
|
253 |
|
254 |
$meta_box_title_for_trigger = __( 'Trigger', 'email-subscribers' );
|
255 |
$meta_box_title_for_actions = __( 'Actions', 'email-subscribers' );
|
257 |
$meta_box_title_for_options = __( 'Options', 'email-subscribers' );
|
258 |
// $meta_box_title_for_timing = __( 'Timing', 'email-subscribers' );
|
259 |
|
260 |
+
add_meta_box( 'ig_es_workflow_trigger', $meta_box_title_for_trigger, array( __CLASS__, 'trigger_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
|
261 |
+
add_meta_box( 'ig_es_workflow_actions', $meta_box_title_for_actions, array( __CLASS__, 'actions_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
|
262 |
+
add_meta_box( 'ig_es_workflow_save', $meta_box_title_for_save, array( __CLASS__, 'save_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
|
263 |
if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
|
264 |
do_action( 'ig_es_workflows_integration', $page_prefix );
|
265 |
}
|
266 |
+
// add_meta_box( 'ig_es_workflow_options', $meta_box_title_for_options, array( __CLASS__, 'options_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' ); // phpcs:ignore
|
267 |
+
// add_meta_box( 'ig_es_workflow_timing', $meta_box_title_for_timing, array( __CLASS__, 'timing_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' ); // phpcs:ignore
|
268 |
}
|
269 |
|
270 |
/**
|
lite/includes/workflows/class-es-workflow.php
CHANGED
@@ -341,7 +341,7 @@ class ES_Workflow {
|
|
341 |
'queue_id' => $queue_id,
|
342 |
);
|
343 |
if ( function_exists( 'as_schedule_single_action' ) ) {
|
344 |
-
as_schedule_single_action( $queue_scheduled_at, 'ig_es_process_workflow_queue', array( $action_args ) );
|
345 |
}
|
346 |
}
|
347 |
}
|
341 |
'queue_id' => $queue_id,
|
342 |
);
|
343 |
if ( function_exists( 'as_schedule_single_action' ) ) {
|
344 |
+
as_schedule_single_action( $queue_scheduled_at, 'ig_es_process_workflow_queue', array( $action_args ), 'email-subscribers' );
|
345 |
}
|
346 |
}
|
347 |
}
|
lite/includes/workflows/queue/class-es-workflow-queue-runner.php
CHANGED
@@ -35,8 +35,8 @@ class ES_Workflow_Queue_Runner {
|
|
35 |
* Init queue runner to process workflow queue
|
36 |
*/
|
37 |
public static function init() {
|
38 |
-
add_action( '
|
39 |
-
add_action( '
|
40 |
}
|
41 |
|
42 |
/**
|
35 |
* Init queue runner to process workflow queue
|
36 |
*/
|
37 |
public static function init() {
|
38 |
+
add_action( 'wp_ajax_ig_es_trigger_workflow_queue_processing', array( __CLASS__, 'init_queue_runner' ) );
|
39 |
+
add_action( 'wp_ajax_nopriv_ig_es_trigger_workflow_queue_processing', array( __CLASS__, 'init_queue_runner' ) );
|
40 |
}
|
41 |
|
42 |
/**
|
lite/public/class-email-subscribers-public.php
CHANGED
@@ -298,8 +298,8 @@ class Email_Subscribers_Public {
|
|
298 |
|
299 |
public function add_contact( $contact_data, $list_id ) {
|
300 |
|
301 |
-
$email
|
302 |
-
|
303 |
$default_data = array(
|
304 |
'status' => 'verified',
|
305 |
'hash' => ES_Common::generate_guid(),
|
@@ -325,7 +325,7 @@ class Email_Subscribers_Public {
|
|
325 |
'status' => 'subscribed',
|
326 |
'subscribed_at' => ig_get_current_date_time(),
|
327 |
'optin_type' => $optin_type,
|
328 |
-
'subscribed_ip' =>
|
329 |
);
|
330 |
|
331 |
ES()->lists_contacts_db->remove_contacts_from_lists( $contact_id, $list_id );
|
298 |
|
299 |
public function add_contact( $contact_data, $list_id ) {
|
300 |
|
301 |
+
$email = $contact_data['email'];
|
302 |
+
|
303 |
$default_data = array(
|
304 |
'status' => 'verified',
|
305 |
'hash' => ES_Common::generate_guid(),
|
325 |
'status' => 'subscribed',
|
326 |
'subscribed_at' => ig_get_current_date_time(),
|
327 |
'optin_type' => $optin_type,
|
328 |
+
'subscribed_ip' => ig_es_get_ip(),
|
329 |
);
|
330 |
|
331 |
ES()->lists_contacts_db->remove_contacts_from_lists( $contact_id, $list_id );
|
readme.txt
CHANGED
@@ -4,9 +4,9 @@ Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_i
|
|
4 |
Author URI: https://www.icegram.com/
|
5 |
Tags: email marketing, subscription, autoresponder, post notification, welcome email
|
6 |
Requires at least: 3.9
|
7 |
-
Tested up to: 5.5.
|
8 |
Requires PHP: 5.6
|
9 |
-
Stable tag: 4.6.
|
10 |
License: GPLv3
|
11 |
License URI: http://www.gnu.org/licenses
|
12 |
|
@@ -304,6 +304,13 @@ Refer [here](https://www.icegram.com/documentation/es-faq/).
|
|
304 |
|
305 |
== Changelog ==
|
306 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
307 |
**4.6.2 (27.10.2020)**
|
308 |
|
309 |
* Fix: UTM tracking related issue [PRO]
|
4 |
Author URI: https://www.icegram.com/
|
5 |
Tags: email marketing, subscription, autoresponder, post notification, welcome email
|
6 |
Requires at least: 3.9
|
7 |
+
Tested up to: 5.5.3
|
8 |
Requires PHP: 5.6
|
9 |
+
Stable tag: 4.6.3
|
10 |
License: GPLv3
|
11 |
License URI: http://www.gnu.org/licenses
|
12 |
|
304 |
|
305 |
== Changelog ==
|
306 |
|
307 |
+
**4.6.3 (09.11.2020)**
|
308 |
+
|
309 |
+
* New: Duplicate Broadcasts and Sequences [PRO]
|
310 |
+
* New: Added IP address of contacts on audience
|
311 |
+
* New: Show total contacts subscribed from a specific form
|
312 |
+
* Update: Improve email sending queue
|
313 |
+
|
314 |
**4.6.2 (27.10.2020)**
|
315 |
|
316 |
* Fix: UTM tracking related issue [PRO]
|