Version Description
Download this release
Release Info
Developer | Icegram |
Plugin | Email Subscribers & Newsletters |
Version | 4.6.9 |
Comparing to | |
See all releases |
Code changes from version 4.6.8 to 4.6.9
- email-subscribers.php +2 -2
- lite/admin/class-email-subscribers-admin.php +8 -0
- lite/admin/css/email-subscribers-admin.css +10 -0
- lite/admin/dist/main.css +1 -1
- lite/admin/js/clipboard.js +973 -0
- lite/admin/js/ig-es-workflows-variables.js +170 -0
- lite/admin/js/ig-es-workflows.js +37 -1
- lite/includes/class-email-subscribers.php +8 -1
- lite/includes/class-es-install.php +6 -0
- lite/includes/classes/class-es-reports-table.php +60 -36
- lite/includes/classes/class-ig-es-wc-session-tracker.php +2 -2
- lite/includes/db/class-es-db-actions.php +4 -3
- lite/includes/db/class-ig-es-db-wc-guest.php +44 -0
- lite/includes/es-core-functions.php +1 -1
- lite/includes/upgrade/es-update-functions.php +29 -0
- lite/includes/workflows/abstracts/class-es-workflow-action.php +9 -1
- lite/includes/workflows/abstracts/class-ig-es-workflow-variable.php +203 -0
- lite/includes/workflows/admin/class-es-workflow-admin-ajax.php +18 -0
- lite/includes/workflows/admin/class-es-workflow-admin-edit.php +43 -0
- lite/includes/workflows/admin/views/meta-box-variables.php +51 -0
- lite/includes/workflows/admin/views/modal-variable-info.php +79 -0
- lite/includes/workflows/class-es-format.php +19 -0
- lite/includes/workflows/class-es-workflow-data-layer.php +198 -0
- lite/includes/workflows/class-es-workflow-data-types.php +9 -0
- lite/includes/workflows/class-es-workflow.php +15 -14
- lite/includes/workflows/class-es-workflows-table.php +1 -1
- lite/includes/workflows/class-ig-es-replace-helper.php +87 -0
- lite/includes/workflows/class-ig-es-variables-processor.php +191 -0
- lite/includes/workflows/class-ig-es-variables.php +125 -0
- lite/includes/workflows/class-ig-es-workflow-variable-parser.php +119 -0
- lite/includes/workflows/workflow-helper-functions.php +62 -0
- readme.txt +7 -1
email-subscribers.php
CHANGED
@@ -3,7 +3,7 @@
|
|
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
|
@@ -178,7 +178,7 @@ if ( 'premium' === $ig_es_plan ) {
|
|
178 |
/* ***************************** Initial Compatibility Work (End) ******************* */
|
179 |
|
180 |
if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
|
181 |
-
define( 'ES_PLUGIN_VERSION', '4.6.
|
182 |
}
|
183 |
|
184 |
// 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.9
|
7 |
* Author: Icegram
|
8 |
* Author URI: https://www.icegram.com/
|
9 |
* Requires at least: 3.9
|
178 |
/* ***************************** Initial Compatibility Work (End) ******************* */
|
179 |
|
180 |
if ( ! defined( 'ES_PLUGIN_VERSION' ) ) {
|
181 |
+
define( 'ES_PLUGIN_VERSION', '4.6.9' );
|
182 |
}
|
183 |
|
184 |
// Plugin Folder Path.
|
lite/admin/class-email-subscribers-admin.php
CHANGED
@@ -170,7 +170,12 @@ class Email_Subscribers_Admin {
|
|
170 |
|
171 |
if ( ES()->is_es_admin_screen( $page_prefix . '_page_es_workflows' ) ) {
|
172 |
|
|
|
|
|
|
|
|
|
173 |
wp_enqueue_script( $this->email_subscribers . '-workflows', plugin_dir_url( __FILE__ ) . 'js/ig-es-workflows.js', array( 'jquery', 'jquery-ui-datepicker' ), $this->version, false );
|
|
|
174 |
|
175 |
$workflows_data = array(
|
176 |
'security' => wp_create_nonce( 'ig-es-workflow-nonce' ),
|
@@ -178,8 +183,11 @@ class Email_Subscribers_Admin {
|
|
178 |
'no_actions_message' => __( 'Please add some actions before saving the workflow.', 'email-subscribers' ),
|
179 |
'no_action_selected_message' => __( 'Please select an action that this workflow should perform before saving the workflow.', 'email-subscribers' ),
|
180 |
'trigger_change_message' => __( 'Changing the trigger will remove existing actions. Do you want to proceed anyway?.', 'email-subscribers' ),
|
|
|
181 |
);
|
182 |
|
|
|
|
|
183 |
wp_localize_script( $this->email_subscribers . '-workflows', 'ig_es_workflows_data', $workflows_data );
|
184 |
|
185 |
if ( ! function_exists( 'ig_es_wp_js_editor_admin_scripts' ) ) {
|
170 |
|
171 |
if ( ES()->is_es_admin_screen( $page_prefix . '_page_es_workflows' ) ) {
|
172 |
|
173 |
+
if ( ! wp_script_is( 'clipboard', 'registered' ) ) {
|
174 |
+
wp_enqueue_script( 'clipboard', plugin_dir_url( __FILE__ ) . 'js/clipboard.js', array( 'jquery' ), '2.0.6', false );
|
175 |
+
}
|
176 |
+
|
177 |
wp_enqueue_script( $this->email_subscribers . '-workflows', plugin_dir_url( __FILE__ ) . 'js/ig-es-workflows.js', array( 'jquery', 'jquery-ui-datepicker' ), $this->version, false );
|
178 |
+
wp_enqueue_script( $this->email_subscribers . '-workflows-variables', plugin_dir_url( __FILE__ ) . 'js/ig-es-workflows-variables.js', array( 'jquery', 'clipboard' ), $this->version, false );
|
179 |
|
180 |
$workflows_data = array(
|
181 |
'security' => wp_create_nonce( 'ig-es-workflow-nonce' ),
|
183 |
'no_actions_message' => __( 'Please add some actions before saving the workflow.', 'email-subscribers' ),
|
184 |
'no_action_selected_message' => __( 'Please select an action that this workflow should perform before saving the workflow.', 'email-subscribers' ),
|
185 |
'trigger_change_message' => __( 'Changing the trigger will remove existing actions. Do you want to proceed anyway?.', 'email-subscribers' ),
|
186 |
+
'placeholder_copied_message' => __( 'Copied!', 'email-subscribers' ),
|
187 |
);
|
188 |
|
189 |
+
$workflows_data = array_merge( $workflows_data, ES_Workflow_Admin_Edit::get_workflow_data() );
|
190 |
+
|
191 |
wp_localize_script( $this->email_subscribers . '-workflows', 'ig_es_workflows_data', $workflows_data );
|
192 |
|
193 |
if ( ! function_exists( 'ig_es_wp_js_editor_admin_scripts' ) ) {
|
lite/admin/css/email-subscribers-admin.css
CHANGED
@@ -1589,6 +1589,16 @@ body[class*="_page_es_workflows"] #post-body .postbox .inside {
|
|
1589 |
position: static;
|
1590 |
}
|
1591 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1592 |
/** Workflow CSS END */
|
1593 |
|
1594 |
.frappe-chart .x.axis .line-vertical,
|
1589 |
position: static;
|
1590 |
}
|
1591 |
|
1592 |
+
.ig-es-close-variable-info-popup {
|
1593 |
+
position: absolute;
|
1594 |
+
right: 10px;
|
1595 |
+
top: 5px;
|
1596 |
+
}
|
1597 |
+
|
1598 |
+
#ig_es_workflow_variables.postbox {
|
1599 |
+
z-index: 999;
|
1600 |
+
}
|
1601 |
+
|
1602 |
/** Workflow CSS END */
|
1603 |
|
1604 |
.frappe-chart .x.axis .line-vertical,
|
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: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{-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: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,.form-radio:checked{border-color:transparent}.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");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{-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: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:2px solid transparent;outline-offset:2px;-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:2px solid transparent;outline-offset:2px;-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:2px solid transparent!important;outline-offset:2px!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:2px solid transparent;outline-offset:2px;-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:2px solid transparent!important;outline-offset:2px!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:2px solid transparent!important;outline-offset:2px!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:2px solid transparent;outline-offset:2px;-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:1rem;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}.importing-progress,.progress{width:100%;height:2rem;--bg-opacity:1;background-color:#e5e7eb;background-color:rgba(229,231,235,var(--bg-opacity));overflow:hidden;position:relative;text-align:right;line-height:1rem;margin-top:.375rem;border-radius:.25rem}.importing-progress span.bar,.progress span.bar{display:block;position:absolute;line-height:2.5rem;padding-top:.25rem;padding-bottom:.25rem;top:0;bottom:0;left:0;border-radius:.25rem;overflow:hidden;background-image:-webkit-gradient(linear,left top,right top,from(var(--gradient-color-stops)));background-image:linear-gradient(90deg,var(--gradient-color-stops));--gradient-from-color:#42389d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color,rgba(66,56,157,0));--gradient-to-color:#6875f5;--bg-opacity:1;background-color:#8da2fb;background-color:rgba(141,162,251,var(--bg-opacity))}.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))}.divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px*var(--divide-y-reverse))}.divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--divide-opacity))}.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}.clearfix:after{content:"";display:table;clear:both}.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}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.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}.mt-10{margin-top:2.5rem}.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}.-mb-4{margin-bottom:-1rem}.-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:2px solid transparent;outline-offset:2px}.overflow-auto{overflow:auto}.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-7{padding-top:1.75rem;padding-bottom:1.75rem}.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}.pb-1\.5{padding-bottom:.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-300{--text-opacity:1;color:#d2d6dc;color:rgba(210,214,220,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-yellow-600{--text-opacity:1;color:#9f580a;color:rgba(159,88,10,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-500:hover{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,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{word-wrap:break-word;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-48{width:12rem}.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-10\/12{width:83.333333%}.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-2\/4{width:50%}.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\:ml-32{margin-left:8rem}.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-6\/12{width:50%}.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: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{-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: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,.form-radio:checked{border-color:transparent}.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");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{-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: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:2px solid transparent;outline-offset:2px;-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:2px solid transparent;outline-offset:2px;-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:2px solid transparent!important;outline-offset:2px!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:2px solid transparent;outline-offset:2px;-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:2px solid transparent!important;outline-offset:2px!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:2px solid transparent!important;outline-offset:2px!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:2px solid transparent;outline-offset:2px;-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:1rem;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}.importing-progress,.progress{width:100%;height:2rem;--bg-opacity:1;background-color:#e5e7eb;background-color:rgba(229,231,235,var(--bg-opacity));overflow:hidden;position:relative;text-align:right;line-height:1rem;margin-top:.375rem;border-radius:.25rem}.importing-progress span.bar,.progress span.bar{display:block;position:absolute;line-height:2.5rem;padding-top:.25rem;padding-bottom:.25rem;top:0;bottom:0;left:0;border-radius:.25rem;overflow:hidden;background-image:-webkit-gradient(linear,left top,right top,from(var(--gradient-color-stops)));background-image:linear-gradient(90deg,var(--gradient-color-stops));--gradient-from-color:#42389d;--gradient-color-stops:var(--gradient-from-color),var(--gradient-to-color,rgba(66,56,157,0));--gradient-to-color:#6875f5;--bg-opacity:1;background-color:#8da2fb;background-color:rgba(141,162,251,var(--bg-opacity))}.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))}.divide-y>:not(template)~:not(template){--divide-y-reverse:0;border-top-width:calc(1px*(1 - var(--divide-y-reverse)));border-bottom-width:calc(1px*var(--divide-y-reverse))}.divide-gray-200>:not(template)~:not(template){--divide-opacity:1;border-color:#e5e7eb;border-color:rgba(229,231,235,var(--divide-opacity))}.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-gray-300:hover{--bg-opacity:1;background-color:#d2d6dc;background-color:rgba(210,214,220,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}.clearfix:after{content:"";display:table;clear:both}.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}.mx-10{margin-left:2.5rem;margin-right:2.5rem}.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}.mt-10{margin-top:2.5rem}.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}.-mb-4{margin-bottom:-1rem}.-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:2px solid transparent;outline-offset:2px}.overflow-auto{overflow:auto}.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-7{padding-top:1.75rem;padding-bottom:1.75rem}.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}.pb-1\.5{padding-bottom:.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-300{--text-opacity:1;color:#d2d6dc;color:rgba(210,214,220,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-yellow-600{--text-opacity:1;color:#9f580a;color:rgba(159,88,10,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-500:hover{--text-opacity:1;color:#6b7280;color:rgba(107,114,128,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{word-wrap:break-word;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-48{width:12rem}.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-10\/12{width:83.333333%}.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-2\/4{width:50%}.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\:ml-32{margin-left:8rem}.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-6\/12{width:50%}.xl\:w-7\/12{width:58.333333%}}
|
lite/admin/js/clipboard.js
ADDED
@@ -0,0 +1,973 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/*!
|
2 |
+
* clipboard.js v2.0.6
|
3 |
+
* https://clipboardjs.com/
|
4 |
+
*
|
5 |
+
* Licensed MIT © Zeno Rocha
|
6 |
+
*/
|
7 |
+
(function webpackUniversalModuleDefinition(root, factory) {
|
8 |
+
if(typeof exports === 'object' && typeof module === 'object')
|
9 |
+
module.exports = factory();
|
10 |
+
else if(typeof define === 'function' && define.amd)
|
11 |
+
define([], factory);
|
12 |
+
else if(typeof exports === 'object')
|
13 |
+
exports["ClipboardJS"] = factory();
|
14 |
+
else
|
15 |
+
root["ClipboardJS"] = factory();
|
16 |
+
})(this, function() {
|
17 |
+
return /******/ (function(modules) { // webpackBootstrap
|
18 |
+
/******/ // The module cache
|
19 |
+
/******/ var installedModules = {};
|
20 |
+
/******/
|
21 |
+
/******/ // The require function
|
22 |
+
/******/ function __webpack_require__(moduleId) {
|
23 |
+
/******/
|
24 |
+
/******/ // Check if module is in cache
|
25 |
+
/******/ if(installedModules[moduleId]) {
|
26 |
+
/******/ return installedModules[moduleId].exports;
|
27 |
+
/******/ }
|
28 |
+
/******/ // Create a new module (and put it into the cache)
|
29 |
+
/******/ var module = installedModules[moduleId] = {
|
30 |
+
/******/ i: moduleId,
|
31 |
+
/******/ l: false,
|
32 |
+
/******/ exports: {}
|
33 |
+
/******/ };
|
34 |
+
/******/
|
35 |
+
/******/ // Execute the module function
|
36 |
+
/******/ modules[moduleId].call(module.exports, module, module.exports, __webpack_require__);
|
37 |
+
/******/
|
38 |
+
/******/ // Flag the module as loaded
|
39 |
+
/******/ module.l = true;
|
40 |
+
/******/
|
41 |
+
/******/ // Return the exports of the module
|
42 |
+
/******/ return module.exports;
|
43 |
+
/******/ }
|
44 |
+
/******/
|
45 |
+
/******/
|
46 |
+
/******/ // expose the modules object (__webpack_modules__)
|
47 |
+
/******/ __webpack_require__.m = modules;
|
48 |
+
/******/
|
49 |
+
/******/ // expose the module cache
|
50 |
+
/******/ __webpack_require__.c = installedModules;
|
51 |
+
/******/
|
52 |
+
/******/ // define getter function for harmony exports
|
53 |
+
/******/ __webpack_require__.d = function(exports, name, getter) {
|
54 |
+
/******/ if(!__webpack_require__.o(exports, name)) {
|
55 |
+
/******/ Object.defineProperty(exports, name, { enumerable: true, get: getter });
|
56 |
+
/******/ }
|
57 |
+
/******/ };
|
58 |
+
/******/
|
59 |
+
/******/ // define __esModule on exports
|
60 |
+
/******/ __webpack_require__.r = function(exports) {
|
61 |
+
/******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
|
62 |
+
/******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
|
63 |
+
/******/ }
|
64 |
+
/******/ Object.defineProperty(exports, '__esModule', { value: true });
|
65 |
+
/******/ };
|
66 |
+
/******/
|
67 |
+
/******/ // create a fake namespace object
|
68 |
+
/******/ // mode & 1: value is a module id, require it
|
69 |
+
/******/ // mode & 2: merge all properties of value into the ns
|
70 |
+
/******/ // mode & 4: return value when already ns object
|
71 |
+
/******/ // mode & 8|1: behave like require
|
72 |
+
/******/ __webpack_require__.t = function(value, mode) {
|
73 |
+
/******/ if(mode & 1) value = __webpack_require__(value);
|
74 |
+
/******/ if(mode & 8) return value;
|
75 |
+
/******/ if((mode & 4) && typeof value === 'object' && value && value.__esModule) return value;
|
76 |
+
/******/ var ns = Object.create(null);
|
77 |
+
/******/ __webpack_require__.r(ns);
|
78 |
+
/******/ Object.defineProperty(ns, 'default', { enumerable: true, value: value });
|
79 |
+
/******/ if(mode & 2 && typeof value != 'string') for(var key in value) __webpack_require__.d(ns, key, function(key) { return value[key]; }.bind(null, key));
|
80 |
+
/******/ return ns;
|
81 |
+
/******/ };
|
82 |
+
/******/
|
83 |
+
/******/ // getDefaultExport function for compatibility with non-harmony modules
|
84 |
+
/******/ __webpack_require__.n = function(module) {
|
85 |
+
/******/ var getter = module && module.__esModule ?
|
86 |
+
/******/ function getDefault() { return module['default']; } :
|
87 |
+
/******/ function getModuleExports() { return module; };
|
88 |
+
/******/ __webpack_require__.d(getter, 'a', getter);
|
89 |
+
/******/ return getter;
|
90 |
+
/******/ };
|
91 |
+
/******/
|
92 |
+
/******/ // Object.prototype.hasOwnProperty.call
|
93 |
+
/******/ __webpack_require__.o = function(object, property) { return Object.prototype.hasOwnProperty.call(object, property); };
|
94 |
+
/******/
|
95 |
+
/******/ // __webpack_public_path__
|
96 |
+
/******/ __webpack_require__.p = "";
|
97 |
+
/******/
|
98 |
+
/******/
|
99 |
+
/******/ // Load entry module and return exports
|
100 |
+
/******/ return __webpack_require__(__webpack_require__.s = 6);
|
101 |
+
/******/ })
|
102 |
+
/************************************************************************/
|
103 |
+
/******/ ([
|
104 |
+
/* 0 */
|
105 |
+
/***/ (function(module, exports) {
|
106 |
+
|
107 |
+
function select(element) {
|
108 |
+
var selectedText;
|
109 |
+
|
110 |
+
if (element.nodeName === 'SELECT') {
|
111 |
+
element.focus();
|
112 |
+
|
113 |
+
selectedText = element.value;
|
114 |
+
}
|
115 |
+
else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {
|
116 |
+
var isReadOnly = element.hasAttribute('readonly');
|
117 |
+
|
118 |
+
if (!isReadOnly) {
|
119 |
+
element.setAttribute('readonly', '');
|
120 |
+
}
|
121 |
+
|
122 |
+
element.select();
|
123 |
+
element.setSelectionRange(0, element.value.length);
|
124 |
+
|
125 |
+
if (!isReadOnly) {
|
126 |
+
element.removeAttribute('readonly');
|
127 |
+
}
|
128 |
+
|
129 |
+
selectedText = element.value;
|
130 |
+
}
|
131 |
+
else {
|
132 |
+
if (element.hasAttribute('contenteditable')) {
|
133 |
+
element.focus();
|
134 |
+
}
|
135 |
+
|
136 |
+
var selection = window.getSelection();
|
137 |
+
var range = document.createRange();
|
138 |
+
|
139 |
+
range.selectNodeContents(element);
|
140 |
+
selection.removeAllRanges();
|
141 |
+
selection.addRange(range);
|
142 |
+
|
143 |
+
selectedText = selection.toString();
|
144 |
+
}
|
145 |
+
|
146 |
+
return selectedText;
|
147 |
+
}
|
148 |
+
|
149 |
+
module.exports = select;
|
150 |
+
|
151 |
+
|
152 |
+
/***/ }),
|
153 |
+
/* 1 */
|
154 |
+
/***/ (function(module, exports) {
|
155 |
+
|
156 |
+
function E () {
|
157 |
+
// Keep this empty so it's easier to inherit from
|
158 |
+
// (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)
|
159 |
+
}
|
160 |
+
|
161 |
+
E.prototype = {
|
162 |
+
on: function (name, callback, ctx) {
|
163 |
+
var e = this.e || (this.e = {});
|
164 |
+
|
165 |
+
(e[name] || (e[name] = [])).push({
|
166 |
+
fn: callback,
|
167 |
+
ctx: ctx
|
168 |
+
});
|
169 |
+
|
170 |
+
return this;
|
171 |
+
},
|
172 |
+
|
173 |
+
once: function (name, callback, ctx) {
|
174 |
+
var self = this;
|
175 |
+
function listener () {
|
176 |
+
self.off(name, listener);
|
177 |
+
callback.apply(ctx, arguments);
|
178 |
+
};
|
179 |
+
|
180 |
+
listener._ = callback
|
181 |
+
return this.on(name, listener, ctx);
|
182 |
+
},
|
183 |
+
|
184 |
+
emit: function (name) {
|
185 |
+
var data = [].slice.call(arguments, 1);
|
186 |
+
var evtArr = ((this.e || (this.e = {}))[name] || []).slice();
|
187 |
+
var i = 0;
|
188 |
+
var len = evtArr.length;
|
189 |
+
|
190 |
+
for (i; i < len; i++) {
|
191 |
+
evtArr[i].fn.apply(evtArr[i].ctx, data);
|
192 |
+
}
|
193 |
+
|
194 |
+
return this;
|
195 |
+
},
|
196 |
+
|
197 |
+
off: function (name, callback) {
|
198 |
+
var e = this.e || (this.e = {});
|
199 |
+
var evts = e[name];
|
200 |
+
var liveEvents = [];
|
201 |
+
|
202 |
+
if (evts && callback) {
|
203 |
+
for (var i = 0, len = evts.length; i < len; i++) {
|
204 |
+
if (evts[i].fn !== callback && evts[i].fn._ !== callback)
|
205 |
+
liveEvents.push(evts[i]);
|
206 |
+
}
|
207 |
+
}
|
208 |
+
|
209 |
+
// Remove event from queue to prevent memory leak
|
210 |
+
// Suggested by https://github.com/lazd
|
211 |
+
// Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910
|
212 |
+
|
213 |
+
(liveEvents.length)
|
214 |
+
? e[name] = liveEvents
|
215 |
+
: delete e[name];
|
216 |
+
|
217 |
+
return this;
|
218 |
+
}
|
219 |
+
};
|
220 |
+
|
221 |
+
module.exports = E;
|
222 |
+
module.exports.TinyEmitter = E;
|
223 |
+
|
224 |
+
|
225 |
+
/***/ }),
|
226 |
+
/* 2 */
|
227 |
+
/***/ (function(module, exports, __webpack_require__) {
|
228 |
+
|
229 |
+
var is = __webpack_require__(3);
|
230 |
+
var delegate = __webpack_require__(4);
|
231 |
+
|
232 |
+
/**
|
233 |
+
* Validates all params and calls the right
|
234 |
+
* listener function based on its target type.
|
235 |
+
*
|
236 |
+
* @param {String|HTMLElement|HTMLCollection|NodeList} target
|
237 |
+
* @param {String} type
|
238 |
+
* @param {Function} callback
|
239 |
+
* @return {Object}
|
240 |
+
*/
|
241 |
+
function listen(target, type, callback) {
|
242 |
+
if (!target && !type && !callback) {
|
243 |
+
throw new Error('Missing required arguments');
|
244 |
+
}
|
245 |
+
|
246 |
+
if (!is.string(type)) {
|
247 |
+
throw new TypeError('Second argument must be a String');
|
248 |
+
}
|
249 |
+
|
250 |
+
if (!is.fn(callback)) {
|
251 |
+
throw new TypeError('Third argument must be a Function');
|
252 |
+
}
|
253 |
+
|
254 |
+
if (is.node(target)) {
|
255 |
+
return listenNode(target, type, callback);
|
256 |
+
}
|
257 |
+
else if (is.nodeList(target)) {
|
258 |
+
return listenNodeList(target, type, callback);
|
259 |
+
}
|
260 |
+
else if (is.string(target)) {
|
261 |
+
return listenSelector(target, type, callback);
|
262 |
+
}
|
263 |
+
else {
|
264 |
+
throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');
|
265 |
+
}
|
266 |
+
}
|
267 |
+
|
268 |
+
/**
|
269 |
+
* Adds an event listener to a HTML element
|
270 |
+
* and returns a remove listener function.
|
271 |
+
*
|
272 |
+
* @param {HTMLElement} node
|
273 |
+
* @param {String} type
|
274 |
+
* @param {Function} callback
|
275 |
+
* @return {Object}
|
276 |
+
*/
|
277 |
+
function listenNode(node, type, callback) {
|
278 |
+
node.addEventListener(type, callback);
|
279 |
+
|
280 |
+
return {
|
281 |
+
destroy: function() {
|
282 |
+
node.removeEventListener(type, callback);
|
283 |
+
}
|
284 |
+
}
|
285 |
+
}
|
286 |
+
|
287 |
+
/**
|
288 |
+
* Add an event listener to a list of HTML elements
|
289 |
+
* and returns a remove listener function.
|
290 |
+
*
|
291 |
+
* @param {NodeList|HTMLCollection} nodeList
|
292 |
+
* @param {String} type
|
293 |
+
* @param {Function} callback
|
294 |
+
* @return {Object}
|
295 |
+
*/
|
296 |
+
function listenNodeList(nodeList, type, callback) {
|
297 |
+
Array.prototype.forEach.call(nodeList, function(node) {
|
298 |
+
node.addEventListener(type, callback);
|
299 |
+
});
|
300 |
+
|
301 |
+
return {
|
302 |
+
destroy: function() {
|
303 |
+
Array.prototype.forEach.call(nodeList, function(node) {
|
304 |
+
node.removeEventListener(type, callback);
|
305 |
+
});
|
306 |
+
}
|
307 |
+
}
|
308 |
+
}
|
309 |
+
|
310 |
+
/**
|
311 |
+
* Add an event listener to a selector
|
312 |
+
* and returns a remove listener function.
|
313 |
+
*
|
314 |
+
* @param {String} selector
|
315 |
+
* @param {String} type
|
316 |
+
* @param {Function} callback
|
317 |
+
* @return {Object}
|
318 |
+
*/
|
319 |
+
function listenSelector(selector, type, callback) {
|
320 |
+
return delegate(document.body, selector, type, callback);
|
321 |
+
}
|
322 |
+
|
323 |
+
module.exports = listen;
|
324 |
+
|
325 |
+
|
326 |
+
/***/ }),
|
327 |
+
/* 3 */
|
328 |
+
/***/ (function(module, exports) {
|
329 |
+
|
330 |
+
/**
|
331 |
+
* Check if argument is a HTML element.
|
332 |
+
*
|
333 |
+
* @param {Object} value
|
334 |
+
* @return {Boolean}
|
335 |
+
*/
|
336 |
+
exports.node = function(value) {
|
337 |
+
return value !== undefined
|
338 |
+
&& value instanceof HTMLElement
|
339 |
+
&& value.nodeType === 1;
|
340 |
+
};
|
341 |
+
|
342 |
+
/**
|
343 |
+
* Check if argument is a list of HTML elements.
|
344 |
+
*
|
345 |
+
* @param {Object} value
|
346 |
+
* @return {Boolean}
|
347 |
+
*/
|
348 |
+
exports.nodeList = function(value) {
|
349 |
+
var type = Object.prototype.toString.call(value);
|
350 |
+
|
351 |
+
return value !== undefined
|
352 |
+
&& (type === '[object NodeList]' || type === '[object HTMLCollection]')
|
353 |
+
&& ('length' in value)
|
354 |
+
&& (value.length === 0 || exports.node(value[0]));
|
355 |
+
};
|
356 |
+
|
357 |
+
/**
|
358 |
+
* Check if argument is a string.
|
359 |
+
*
|
360 |
+
* @param {Object} value
|
361 |
+
* @return {Boolean}
|
362 |
+
*/
|
363 |
+
exports.string = function(value) {
|
364 |
+
return typeof value === 'string'
|
365 |
+
|| value instanceof String;
|
366 |
+
};
|
367 |
+
|
368 |
+
/**
|
369 |
+
* Check if argument is a function.
|
370 |
+
*
|
371 |
+
* @param {Object} value
|
372 |
+
* @return {Boolean}
|
373 |
+
*/
|
374 |
+
exports.fn = function(value) {
|
375 |
+
var type = Object.prototype.toString.call(value);
|
376 |
+
|
377 |
+
return type === '[object Function]';
|
378 |
+
};
|
379 |
+
|
380 |
+
|
381 |
+
/***/ }),
|
382 |
+
/* 4 */
|
383 |
+
/***/ (function(module, exports, __webpack_require__) {
|
384 |
+
|
385 |
+
var closest = __webpack_require__(5);
|
386 |
+
|
387 |
+
/**
|
388 |
+
* Delegates event to a selector.
|
389 |
+
*
|
390 |
+
* @param {Element} element
|
391 |
+
* @param {String} selector
|
392 |
+
* @param {String} type
|
393 |
+
* @param {Function} callback
|
394 |
+
* @param {Boolean} useCapture
|
395 |
+
* @return {Object}
|
396 |
+
*/
|
397 |
+
function _delegate(element, selector, type, callback, useCapture) {
|
398 |
+
var listenerFn = listener.apply(this, arguments);
|
399 |
+
|
400 |
+
element.addEventListener(type, listenerFn, useCapture);
|
401 |
+
|
402 |
+
return {
|
403 |
+
destroy: function() {
|
404 |
+
element.removeEventListener(type, listenerFn, useCapture);
|
405 |
+
}
|
406 |
+
}
|
407 |
+
}
|
408 |
+
|
409 |
+
/**
|
410 |
+
* Delegates event to a selector.
|
411 |
+
*
|
412 |
+
* @param {Element|String|Array} [elements]
|
413 |
+
* @param {String} selector
|
414 |
+
* @param {String} type
|
415 |
+
* @param {Function} callback
|
416 |
+
* @param {Boolean} useCapture
|
417 |
+
* @return {Object}
|
418 |
+
*/
|
419 |
+
function delegate(elements, selector, type, callback, useCapture) {
|
420 |
+
// Handle the regular Element usage
|
421 |
+
if (typeof elements.addEventListener === 'function') {
|
422 |
+
return _delegate.apply(null, arguments);
|
423 |
+
}
|
424 |
+
|
425 |
+
// Handle Element-less usage, it defaults to global delegation
|
426 |
+
if (typeof type === 'function') {
|
427 |
+
// Use `document` as the first parameter, then apply arguments
|
428 |
+
// This is a short way to .unshift `arguments` without running into deoptimizations
|
429 |
+
return _delegate.bind(null, document).apply(null, arguments);
|
430 |
+
}
|
431 |
+
|
432 |
+
// Handle Selector-based usage
|
433 |
+
if (typeof elements === 'string') {
|
434 |
+
elements = document.querySelectorAll(elements);
|
435 |
+
}
|
436 |
+
|
437 |
+
// Handle Array-like based usage
|
438 |
+
return Array.prototype.map.call(elements, function (element) {
|
439 |
+
return _delegate(element, selector, type, callback, useCapture);
|
440 |
+
});
|
441 |
+
}
|
442 |
+
|
443 |
+
/**
|
444 |
+
* Finds closest match and invokes callback.
|
445 |
+
*
|
446 |
+
* @param {Element} element
|
447 |
+
* @param {String} selector
|
448 |
+
* @param {String} type
|
449 |
+
* @param {Function} callback
|
450 |
+
* @return {Function}
|
451 |
+
*/
|
452 |
+
function listener(element, selector, type, callback) {
|
453 |
+
return function(e) {
|
454 |
+
e.delegateTarget = closest(e.target, selector);
|
455 |
+
|
456 |
+
if (e.delegateTarget) {
|
457 |
+
callback.call(element, e);
|
458 |
+
}
|
459 |
+
}
|
460 |
+
}
|
461 |
+
|
462 |
+
module.exports = delegate;
|
463 |
+
|
464 |
+
|
465 |
+
/***/ }),
|
466 |
+
/* 5 */
|
467 |
+
/***/ (function(module, exports) {
|
468 |
+
|
469 |
+
var DOCUMENT_NODE_TYPE = 9;
|
470 |
+
|
471 |
+
/**
|
472 |
+
* A polyfill for Element.matches()
|
473 |
+
*/
|
474 |
+
if (typeof Element !== 'undefined' && !Element.prototype.matches) {
|
475 |
+
var proto = Element.prototype;
|
476 |
+
|
477 |
+
proto.matches = proto.matchesSelector ||
|
478 |
+
proto.mozMatchesSelector ||
|
479 |
+
proto.msMatchesSelector ||
|
480 |
+
proto.oMatchesSelector ||
|
481 |
+
proto.webkitMatchesSelector;
|
482 |
+
}
|
483 |
+
|
484 |
+
/**
|
485 |
+
* Finds the closest parent that matches a selector.
|
486 |
+
*
|
487 |
+
* @param {Element} element
|
488 |
+
* @param {String} selector
|
489 |
+
* @return {Function}
|
490 |
+
*/
|
491 |
+
function closest (element, selector) {
|
492 |
+
while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {
|
493 |
+
if (typeof element.matches === 'function' &&
|
494 |
+
element.matches(selector)) {
|
495 |
+
return element;
|
496 |
+
}
|
497 |
+
element = element.parentNode;
|
498 |
+
}
|
499 |
+
}
|
500 |
+
|
501 |
+
module.exports = closest;
|
502 |
+
|
503 |
+
|
504 |
+
/***/ }),
|
505 |
+
/* 6 */
|
506 |
+
/***/ (function(module, __webpack_exports__, __webpack_require__) {
|
507 |
+
|
508 |
+
"use strict";
|
509 |
+
__webpack_require__.r(__webpack_exports__);
|
510 |
+
|
511 |
+
// EXTERNAL MODULE: ./node_modules/select/src/select.js
|
512 |
+
var src_select = __webpack_require__(0);
|
513 |
+
var select_default = /*#__PURE__*/__webpack_require__.n(src_select);
|
514 |
+
|
515 |
+
// CONCATENATED MODULE: ./src/clipboard-action.js
|
516 |
+
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
517 |
+
|
518 |
+
var _createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
519 |
+
|
520 |
+
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
521 |
+
|
522 |
+
|
523 |
+
|
524 |
+
/**
|
525 |
+
* Inner class which performs selection from either `text` or `target`
|
526 |
+
* properties and then executes copy or cut operations.
|
527 |
+
*/
|
528 |
+
|
529 |
+
var clipboard_action_ClipboardAction = function () {
|
530 |
+
/**
|
531 |
+
* @param {Object} options
|
532 |
+
*/
|
533 |
+
function ClipboardAction(options) {
|
534 |
+
_classCallCheck(this, ClipboardAction);
|
535 |
+
|
536 |
+
this.resolveOptions(options);
|
537 |
+
this.initSelection();
|
538 |
+
}
|
539 |
+
|
540 |
+
/**
|
541 |
+
* Defines base properties passed from constructor.
|
542 |
+
* @param {Object} options
|
543 |
+
*/
|
544 |
+
|
545 |
+
|
546 |
+
_createClass(ClipboardAction, [{
|
547 |
+
key: 'resolveOptions',
|
548 |
+
value: function resolveOptions() {
|
549 |
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
550 |
+
|
551 |
+
this.action = options.action;
|
552 |
+
this.container = options.container;
|
553 |
+
this.emitter = options.emitter;
|
554 |
+
this.target = options.target;
|
555 |
+
this.text = options.text;
|
556 |
+
this.trigger = options.trigger;
|
557 |
+
|
558 |
+
this.selectedText = '';
|
559 |
+
}
|
560 |
+
|
561 |
+
/**
|
562 |
+
* Decides which selection strategy is going to be applied based
|
563 |
+
* on the existence of `text` and `target` properties.
|
564 |
+
*/
|
565 |
+
|
566 |
+
}, {
|
567 |
+
key: 'initSelection',
|
568 |
+
value: function initSelection() {
|
569 |
+
if (this.text) {
|
570 |
+
this.selectFake();
|
571 |
+
} else if (this.target) {
|
572 |
+
this.selectTarget();
|
573 |
+
}
|
574 |
+
}
|
575 |
+
|
576 |
+
/**
|
577 |
+
* Creates a fake textarea element, sets its value from `text` property,
|
578 |
+
* and makes a selection on it.
|
579 |
+
*/
|
580 |
+
|
581 |
+
}, {
|
582 |
+
key: 'selectFake',
|
583 |
+
value: function selectFake() {
|
584 |
+
var _this = this;
|
585 |
+
|
586 |
+
var isRTL = document.documentElement.getAttribute('dir') == 'rtl';
|
587 |
+
|
588 |
+
this.removeFake();
|
589 |
+
|
590 |
+
this.fakeHandlerCallback = function () {
|
591 |
+
return _this.removeFake();
|
592 |
+
};
|
593 |
+
this.fakeHandler = this.container.addEventListener('click', this.fakeHandlerCallback) || true;
|
594 |
+
|
595 |
+
this.fakeElem = document.createElement('textarea');
|
596 |
+
// Prevent zooming on iOS
|
597 |
+
this.fakeElem.style.fontSize = '12pt';
|
598 |
+
// Reset box model
|
599 |
+
this.fakeElem.style.border = '0';
|
600 |
+
this.fakeElem.style.padding = '0';
|
601 |
+
this.fakeElem.style.margin = '0';
|
602 |
+
// Move element out of screen horizontally
|
603 |
+
this.fakeElem.style.position = 'absolute';
|
604 |
+
this.fakeElem.style[isRTL ? 'right' : 'left'] = '-9999px';
|
605 |
+
// Move element to the same position vertically
|
606 |
+
var yPosition = window.pageYOffset || document.documentElement.scrollTop;
|
607 |
+
this.fakeElem.style.top = yPosition + 'px';
|
608 |
+
|
609 |
+
this.fakeElem.setAttribute('readonly', '');
|
610 |
+
this.fakeElem.value = this.text;
|
611 |
+
|
612 |
+
this.container.appendChild(this.fakeElem);
|
613 |
+
|
614 |
+
this.selectedText = select_default()(this.fakeElem);
|
615 |
+
this.copyText();
|
616 |
+
}
|
617 |
+
|
618 |
+
/**
|
619 |
+
* Only removes the fake element after another click event, that way
|
620 |
+
* a user can hit `Ctrl+C` to copy because selection still exists.
|
621 |
+
*/
|
622 |
+
|
623 |
+
}, {
|
624 |
+
key: 'removeFake',
|
625 |
+
value: function removeFake() {
|
626 |
+
if (this.fakeHandler) {
|
627 |
+
this.container.removeEventListener('click', this.fakeHandlerCallback);
|
628 |
+
this.fakeHandler = null;
|
629 |
+
this.fakeHandlerCallback = null;
|
630 |
+
}
|
631 |
+
|
632 |
+
if (this.fakeElem) {
|
633 |
+
this.container.removeChild(this.fakeElem);
|
634 |
+
this.fakeElem = null;
|
635 |
+
}
|
636 |
+
}
|
637 |
+
|
638 |
+
/**
|
639 |
+
* Selects the content from element passed on `target` property.
|
640 |
+
*/
|
641 |
+
|
642 |
+
}, {
|
643 |
+
key: 'selectTarget',
|
644 |
+
value: function selectTarget() {
|
645 |
+
this.selectedText = select_default()(this.target);
|
646 |
+
this.copyText();
|
647 |
+
}
|
648 |
+
|
649 |
+
/**
|
650 |
+
* Executes the copy operation based on the current selection.
|
651 |
+
*/
|
652 |
+
|
653 |
+
}, {
|
654 |
+
key: 'copyText',
|
655 |
+
value: function copyText() {
|
656 |
+
var succeeded = void 0;
|
657 |
+
|
658 |
+
try {
|
659 |
+
succeeded = document.execCommand(this.action);
|
660 |
+
} catch (err) {
|
661 |
+
succeeded = false;
|
662 |
+
}
|
663 |
+
|
664 |
+
this.handleResult(succeeded);
|
665 |
+
}
|
666 |
+
|
667 |
+
/**
|
668 |
+
* Fires an event based on the copy operation result.
|
669 |
+
* @param {Boolean} succeeded
|
670 |
+
*/
|
671 |
+
|
672 |
+
}, {
|
673 |
+
key: 'handleResult',
|
674 |
+
value: function handleResult(succeeded) {
|
675 |
+
this.emitter.emit(succeeded ? 'success' : 'error', {
|
676 |
+
action: this.action,
|
677 |
+
text: this.selectedText,
|
678 |
+
trigger: this.trigger,
|
679 |
+
clearSelection: this.clearSelection.bind(this)
|
680 |
+
});
|
681 |
+
}
|
682 |
+
|
683 |
+
/**
|
684 |
+
* Moves focus away from `target` and back to the trigger, removes current selection.
|
685 |
+
*/
|
686 |
+
|
687 |
+
}, {
|
688 |
+
key: 'clearSelection',
|
689 |
+
value: function clearSelection() {
|
690 |
+
if (this.trigger) {
|
691 |
+
this.trigger.focus();
|
692 |
+
}
|
693 |
+
document.activeElement.blur();
|
694 |
+
window.getSelection().removeAllRanges();
|
695 |
+
}
|
696 |
+
|
697 |
+
/**
|
698 |
+
* Sets the `action` to be performed which can be either 'copy' or 'cut'.
|
699 |
+
* @param {String} action
|
700 |
+
*/
|
701 |
+
|
702 |
+
}, {
|
703 |
+
key: 'destroy',
|
704 |
+
|
705 |
+
|
706 |
+
/**
|
707 |
+
* Destroy lifecycle.
|
708 |
+
*/
|
709 |
+
value: function destroy() {
|
710 |
+
this.removeFake();
|
711 |
+
}
|
712 |
+
}, {
|
713 |
+
key: 'action',
|
714 |
+
set: function set() {
|
715 |
+
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'copy';
|
716 |
+
|
717 |
+
this._action = action;
|
718 |
+
|
719 |
+
if (this._action !== 'copy' && this._action !== 'cut') {
|
720 |
+
throw new Error('Invalid "action" value, use either "copy" or "cut"');
|
721 |
+
}
|
722 |
+
}
|
723 |
+
|
724 |
+
/**
|
725 |
+
* Gets the `action` property.
|
726 |
+
* @return {String}
|
727 |
+
*/
|
728 |
+
,
|
729 |
+
get: function get() {
|
730 |
+
return this._action;
|
731 |
+
}
|
732 |
+
|
733 |
+
/**
|
734 |
+
* Sets the `target` property using an element
|
735 |
+
* that will be have its content copied.
|
736 |
+
* @param {Element} target
|
737 |
+
*/
|
738 |
+
|
739 |
+
}, {
|
740 |
+
key: 'target',
|
741 |
+
set: function set(target) {
|
742 |
+
if (target !== undefined) {
|
743 |
+
if (target && (typeof target === 'undefined' ? 'undefined' : _typeof(target)) === 'object' && target.nodeType === 1) {
|
744 |
+
if (this.action === 'copy' && target.hasAttribute('disabled')) {
|
745 |
+
throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');
|
746 |
+
}
|
747 |
+
|
748 |
+
if (this.action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {
|
749 |
+
throw new Error('Invalid "target" attribute. You can\'t cut text from elements with "readonly" or "disabled" attributes');
|
750 |
+
}
|
751 |
+
|
752 |
+
this._target = target;
|
753 |
+
} else {
|
754 |
+
throw new Error('Invalid "target" value, use a valid Element');
|
755 |
+
}
|
756 |
+
}
|
757 |
+
}
|
758 |
+
|
759 |
+
/**
|
760 |
+
* Gets the `target` property.
|
761 |
+
* @return {String|HTMLElement}
|
762 |
+
*/
|
763 |
+
,
|
764 |
+
get: function get() {
|
765 |
+
return this._target;
|
766 |
+
}
|
767 |
+
}]);
|
768 |
+
|
769 |
+
return ClipboardAction;
|
770 |
+
}();
|
771 |
+
|
772 |
+
/* harmony default export */ var clipboard_action = (clipboard_action_ClipboardAction);
|
773 |
+
// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js
|
774 |
+
var tiny_emitter = __webpack_require__(1);
|
775 |
+
var tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);
|
776 |
+
|
777 |
+
// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js
|
778 |
+
var listen = __webpack_require__(2);
|
779 |
+
var listen_default = /*#__PURE__*/__webpack_require__.n(listen);
|
780 |
+
|
781 |
+
// CONCATENATED MODULE: ./src/clipboard.js
|
782 |
+
var clipboard_typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
|
783 |
+
|
784 |
+
var clipboard_createClass = function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; }();
|
785 |
+
|
786 |
+
function clipboard_classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
787 |
+
|
788 |
+
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
789 |
+
|
790 |
+
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
791 |
+
|
792 |
+
|
793 |
+
|
794 |
+
|
795 |
+
|
796 |
+
/**
|
797 |
+
* Base class which takes one or more elements, adds event listeners to them,
|
798 |
+
* and instantiates a new `ClipboardAction` on each click.
|
799 |
+
*/
|
800 |
+
|
801 |
+
var clipboard_Clipboard = function (_Emitter) {
|
802 |
+
_inherits(Clipboard, _Emitter);
|
803 |
+
|
804 |
+
/**
|
805 |
+
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
806 |
+
* @param {Object} options
|
807 |
+
*/
|
808 |
+
function Clipboard(trigger, options) {
|
809 |
+
clipboard_classCallCheck(this, Clipboard);
|
810 |
+
|
811 |
+
var _this = _possibleConstructorReturn(this, (Clipboard.__proto__ || Object.getPrototypeOf(Clipboard)).call(this));
|
812 |
+
|
813 |
+
_this.resolveOptions(options);
|
814 |
+
_this.listenClick(trigger);
|
815 |
+
return _this;
|
816 |
+
}
|
817 |
+
|
818 |
+
/**
|
819 |
+
* Defines if attributes would be resolved using internal setter functions
|
820 |
+
* or custom functions that were passed in the constructor.
|
821 |
+
* @param {Object} options
|
822 |
+
*/
|
823 |
+
|
824 |
+
|
825 |
+
clipboard_createClass(Clipboard, [{
|
826 |
+
key: 'resolveOptions',
|
827 |
+
value: function resolveOptions() {
|
828 |
+
var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};
|
829 |
+
|
830 |
+
this.action = typeof options.action === 'function' ? options.action : this.defaultAction;
|
831 |
+
this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;
|
832 |
+
this.text = typeof options.text === 'function' ? options.text : this.defaultText;
|
833 |
+
this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;
|
834 |
+
}
|
835 |
+
|
836 |
+
/**
|
837 |
+
* Adds a click event listener to the passed trigger.
|
838 |
+
* @param {String|HTMLElement|HTMLCollection|NodeList} trigger
|
839 |
+
*/
|
840 |
+
|
841 |
+
}, {
|
842 |
+
key: 'listenClick',
|
843 |
+
value: function listenClick(trigger) {
|
844 |
+
var _this2 = this;
|
845 |
+
|
846 |
+
this.listener = listen_default()(trigger, 'click', function (e) {
|
847 |
+
return _this2.onClick(e);
|
848 |
+
});
|
849 |
+
}
|
850 |
+
|
851 |
+
/**
|
852 |
+
* Defines a new `ClipboardAction` on each click event.
|
853 |
+
* @param {Event} e
|
854 |
+
*/
|
855 |
+
|
856 |
+
}, {
|
857 |
+
key: 'onClick',
|
858 |
+
value: function onClick(e) {
|
859 |
+
var trigger = e.delegateTarget || e.currentTarget;
|
860 |
+
|
861 |
+
if (this.clipboardAction) {
|
862 |
+
this.clipboardAction = null;
|
863 |
+
}
|
864 |
+
|
865 |
+
this.clipboardAction = new clipboard_action({
|
866 |
+
action: this.action(trigger),
|
867 |
+
target: this.target(trigger),
|
868 |
+
text: this.text(trigger),
|
869 |
+
container: this.container,
|
870 |
+
trigger: trigger,
|
871 |
+
emitter: this
|
872 |
+
});
|
873 |
+
}
|
874 |
+
|
875 |
+
/**
|
876 |
+
* Default `action` lookup function.
|
877 |
+
* @param {Element} trigger
|
878 |
+
*/
|
879 |
+
|
880 |
+
}, {
|
881 |
+
key: 'defaultAction',
|
882 |
+
value: function defaultAction(trigger) {
|
883 |
+
return getAttributeValue('action', trigger);
|
884 |
+
}
|
885 |
+
|
886 |
+
/**
|
887 |
+
* Default `target` lookup function.
|
888 |
+
* @param {Element} trigger
|
889 |
+
*/
|
890 |
+
|
891 |
+
}, {
|
892 |
+
key: 'defaultTarget',
|
893 |
+
value: function defaultTarget(trigger) {
|
894 |
+
var selector = getAttributeValue('target', trigger);
|
895 |
+
|
896 |
+
if (selector) {
|
897 |
+
return document.querySelector(selector);
|
898 |
+
}
|
899 |
+
}
|
900 |
+
|
901 |
+
/**
|
902 |
+
* Returns the support of the given action, or all actions if no action is
|
903 |
+
* given.
|
904 |
+
* @param {String} [action]
|
905 |
+
*/
|
906 |
+
|
907 |
+
}, {
|
908 |
+
key: 'defaultText',
|
909 |
+
|
910 |
+
|
911 |
+
/**
|
912 |
+
* Default `text` lookup function.
|
913 |
+
* @param {Element} trigger
|
914 |
+
*/
|
915 |
+
value: function defaultText(trigger) {
|
916 |
+
return getAttributeValue('text', trigger);
|
917 |
+
}
|
918 |
+
|
919 |
+
/**
|
920 |
+
* Destroy lifecycle.
|
921 |
+
*/
|
922 |
+
|
923 |
+
}, {
|
924 |
+
key: 'destroy',
|
925 |
+
value: function destroy() {
|
926 |
+
this.listener.destroy();
|
927 |
+
|
928 |
+
if (this.clipboardAction) {
|
929 |
+
this.clipboardAction.destroy();
|
930 |
+
this.clipboardAction = null;
|
931 |
+
}
|
932 |
+
}
|
933 |
+
}], [{
|
934 |
+
key: 'isSupported',
|
935 |
+
value: function isSupported() {
|
936 |
+
var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];
|
937 |
+
|
938 |
+
var actions = typeof action === 'string' ? [action] : action;
|
939 |
+
var support = !!document.queryCommandSupported;
|
940 |
+
|
941 |
+
actions.forEach(function (action) {
|
942 |
+
support = support && !!document.queryCommandSupported(action);
|
943 |
+
});
|
944 |
+
|
945 |
+
return support;
|
946 |
+
}
|
947 |
+
}]);
|
948 |
+
|
949 |
+
return Clipboard;
|
950 |
+
}(tiny_emitter_default.a);
|
951 |
+
|
952 |
+
/**
|
953 |
+
* Helper function to retrieve attribute value.
|
954 |
+
* @param {String} suffix
|
955 |
+
* @param {Element} element
|
956 |
+
*/
|
957 |
+
|
958 |
+
|
959 |
+
function getAttributeValue(suffix, element) {
|
960 |
+
var attribute = 'data-clipboard-' + suffix;
|
961 |
+
|
962 |
+
if (!element.hasAttribute(attribute)) {
|
963 |
+
return;
|
964 |
+
}
|
965 |
+
|
966 |
+
return element.getAttribute(attribute);
|
967 |
+
}
|
968 |
+
|
969 |
+
/* harmony default export */ var clipboard = __webpack_exports__["default"] = (clipboard_Clipboard);
|
970 |
+
|
971 |
+
/***/ })
|
972 |
+
/******/ ])["default"];
|
973 |
+
});
|
lite/admin/js/ig-es-workflows-variables.js
ADDED
@@ -0,0 +1,170 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
/**
|
2 |
+
* IG_ES_Workflows Variables
|
3 |
+
*/
|
4 |
+
|
5 |
+
jQuery(function($) {
|
6 |
+
|
7 |
+
IG_ES_Workflows.Variables = {
|
8 |
+
|
9 |
+
$meta_box: $('#ig_es_workflow_variables'),
|
10 |
+
|
11 |
+
|
12 |
+
init: function(){
|
13 |
+
|
14 |
+
this.init_clipboard();
|
15 |
+
|
16 |
+
$(document.body).on( 'change keyup', '.ig-es-workflow-variable-parameter', this.update_preview_field );
|
17 |
+
$(document.body).on( 'keypress', 'input.ig-es-workflow-variable-parameter', this.restrict_parameter_chars );
|
18 |
+
|
19 |
+
this.$meta_box.on( 'click', '.ig-es-workflow-variable', this.open_modal );
|
20 |
+
this.$meta_box.on( 'click', '.ig-es-close-variable-info-popup', this.close_modal );
|
21 |
+
|
22 |
+
$(document).keydown(function(e) {
|
23 |
+
if ( 27 === e.keyCode ) {
|
24 |
+
IG_ES_Workflows.Variables.close_modal();
|
25 |
+
}
|
26 |
+
});
|
27 |
+
},
|
28 |
+
|
29 |
+
|
30 |
+
/**
|
31 |
+
*
|
32 |
+
*/
|
33 |
+
init_clipboard: function() {
|
34 |
+
|
35 |
+
var clipboard = new ClipboardJS('.ig-es-clipboard-btn', {
|
36 |
+
text: function(trigger) {
|
37 |
+
return $('#ig_es_workflow_variable_preview_field').text();
|
38 |
+
}
|
39 |
+
});
|
40 |
+
|
41 |
+
clipboard.on('success', function(e) {
|
42 |
+
|
43 |
+
$('.ig-es-clipboard-btn').html( ig_es_workflows_data.placeholder_copied_message );
|
44 |
+
setTimeout(function(){
|
45 |
+
IG_ES_Workflows.Variables.close_modal();
|
46 |
+
}, 500 );
|
47 |
+
});
|
48 |
+
|
49 |
+
},
|
50 |
+
|
51 |
+
|
52 |
+
open_modal: function(){
|
53 |
+
|
54 |
+
var ajax_data = {
|
55 |
+
action: 'ig_es_modal_variable_info',
|
56 |
+
variable: $(this).text(),
|
57 |
+
security: ig_es_workflows_data.security,
|
58 |
+
};
|
59 |
+
|
60 |
+
$.post( ajaxurl, ajax_data, function( response ){
|
61 |
+
$('#ig-es-variable-info-popup #ig-es-workflow-variable-info-body').html(response).show();
|
62 |
+
IG_ES_Workflows.Variables.show_modal();
|
63 |
+
IG_ES_Workflows.Variables.update_preview_field();
|
64 |
+
});
|
65 |
+
},
|
66 |
+
|
67 |
+
show_modal: function() {
|
68 |
+
jQuery('#ig-es-variable-info-popup').show();
|
69 |
+
},
|
70 |
+
|
71 |
+
close_modal: function() {
|
72 |
+
$('#ig-es-variable-info-popup').hide('fast');
|
73 |
+
},
|
74 |
+
|
75 |
+
|
76 |
+
/**
|
77 |
+
* Updates the variable preview text field
|
78 |
+
*/
|
79 |
+
update_preview_field: function() {
|
80 |
+
|
81 |
+
var $preview_field = $('#ig_es_workflow_variable_preview_field');
|
82 |
+
var variable = $preview_field.data('variable');
|
83 |
+
var parameters = [];
|
84 |
+
|
85 |
+
$('.ig-es-workflow-variable-parameter').each(function(){
|
86 |
+
|
87 |
+
var $param_row = $(this).parents('.ig-es-workflow-variables-parameter-row:first');
|
88 |
+
|
89 |
+
// Check 'show' logic
|
90 |
+
if ( $param_row.data('parameter-show') ) {
|
91 |
+
|
92 |
+
var show_logic = $param_row.data('parameter-show').split('=');
|
93 |
+
|
94 |
+
var $condition_field = $('.ig-es-workflow-variable-parameter[name="' + show_logic[0] + '"]');
|
95 |
+
|
96 |
+
if ( $condition_field.length && $condition_field.val() == show_logic[1] ) {
|
97 |
+
$param_row.show();
|
98 |
+
} else {
|
99 |
+
$param_row.hide();
|
100 |
+
return; // don't add parameter to preview
|
101 |
+
}
|
102 |
+
}
|
103 |
+
|
104 |
+
var param = {
|
105 |
+
name: $(this).attr('name'),
|
106 |
+
required: $param_row.data('is-required'),
|
107 |
+
value: $(this).val()
|
108 |
+
};
|
109 |
+
|
110 |
+
parameters.push( param );
|
111 |
+
});
|
112 |
+
|
113 |
+
var string = IG_ES_Workflows.Variables.generate_variable_string( variable, parameters );
|
114 |
+
|
115 |
+
$preview_field.text( string );
|
116 |
+
},
|
117 |
+
|
118 |
+
|
119 |
+
/**
|
120 |
+
*
|
121 |
+
* @param variable
|
122 |
+
* @param parameters
|
123 |
+
*/
|
124 |
+
generate_variable_string: function( variable, parameters ) {
|
125 |
+
|
126 |
+
var string = '{{ ' + variable;
|
127 |
+
|
128 |
+
if ( parameters.length ) {
|
129 |
+
var param_parts = [];
|
130 |
+
|
131 |
+
$.each( parameters, function( i, param ) {
|
132 |
+
|
133 |
+
if ( param.value ) {
|
134 |
+
param_parts.push( param.name + ": '" + param.value + "'" );
|
135 |
+
}
|
136 |
+
else if ( param.required ) {
|
137 |
+
param_parts.push( param.name + ": '...'" );
|
138 |
+
}
|
139 |
+
});
|
140 |
+
|
141 |
+
|
142 |
+
if ( param_parts.length > 0 ) {
|
143 |
+
string += ' | ';
|
144 |
+
string += param_parts.join( ', ' );
|
145 |
+
}
|
146 |
+
}
|
147 |
+
|
148 |
+
return string + ' }}';
|
149 |
+
},
|
150 |
+
|
151 |
+
|
152 |
+
/**
|
153 |
+
*
|
154 |
+
* @param e
|
155 |
+
*/
|
156 |
+
restrict_parameter_chars: function(e) {
|
157 |
+
|
158 |
+
var restricted = [ 39, 123, 124, 125 ];
|
159 |
+
|
160 |
+
if ( $.inArray( e.which, restricted ) !== -1 ) {
|
161 |
+
return false;
|
162 |
+
}
|
163 |
+
}
|
164 |
+
|
165 |
+
};
|
166 |
+
|
167 |
+
|
168 |
+
IG_ES_Workflows.Variables.init();
|
169 |
+
|
170 |
+
});
|
lite/admin/js/ig-es-workflows.js
CHANGED
@@ -10,6 +10,7 @@
|
|
10 |
init: function() {
|
11 |
IG_ES_Workflows.init_triggers_box();
|
12 |
IG_ES_Workflows.init_actions_box();
|
|
|
13 |
IG_ES_Workflows.init_show_hide();
|
14 |
IG_ES_Workflows.init_date_pickers();
|
15 |
IG_ES_Workflows.init_workflow_status_switch();
|
@@ -174,6 +175,9 @@
|
|
174 |
return;
|
175 |
}
|
176 |
|
|
|
|
|
|
|
177 |
IG_ES_Workflows.$triggers_box.find('tbody').append( response.data.fields );
|
178 |
IG_ES_Workflows.$triggers_box.removeClass('ig-es-loading');
|
179 |
IG_ES_Workflows.$triggers_box.find('.js-trigger-description').html( '<p class="ig-es-field-description">' + response.data.trigger.description + '</p>' );
|
@@ -340,7 +344,39 @@
|
|
340 |
$('.ig-es-action:not([data-action-number=""])').remove();
|
341 |
}
|
342 |
}
|
343 |
-
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
344 |
}
|
345 |
|
346 |
IG_ES_Workflows.init();
|
10 |
init: function() {
|
11 |
IG_ES_Workflows.init_triggers_box();
|
12 |
IG_ES_Workflows.init_actions_box();
|
13 |
+
IG_ES_Workflows.init_variables_box();
|
14 |
IG_ES_Workflows.init_show_hide();
|
15 |
IG_ES_Workflows.init_date_pickers();
|
16 |
IG_ES_Workflows.init_workflow_status_switch();
|
175 |
return;
|
176 |
}
|
177 |
|
178 |
+
ig_es_workflows_data.trigger = response.data.trigger;
|
179 |
+
IG_ES_Workflows.refine_variables();
|
180 |
+
|
181 |
IG_ES_Workflows.$triggers_box.find('tbody').append( response.data.fields );
|
182 |
IG_ES_Workflows.$triggers_box.removeClass('ig-es-loading');
|
183 |
IG_ES_Workflows.$triggers_box.find('.js-trigger-description').html( '<p class="ig-es-field-description">' + response.data.trigger.description + '</p>' );
|
344 |
$('.ig-es-action:not([data-action-number=""])').remove();
|
345 |
}
|
346 |
}
|
347 |
+
},
|
348 |
+
|
349 |
+
init_variables_box: function() {
|
350 |
+
if ( ! ig_es_workflows_data.is_new ) {
|
351 |
+
IG_ES_Workflows.refine_variables();
|
352 |
+
}
|
353 |
+
},
|
354 |
+
|
355 |
+
/**
|
356 |
+
* Show or hide text var groups based on the selected trigger
|
357 |
+
*/
|
358 |
+
refine_variables: function() {
|
359 |
+
|
360 |
+
let trigger = ig_es_workflows_data.trigger;
|
361 |
+
|
362 |
+
$('.ig-es-variables-group').each(function( i, el ){
|
363 |
+
|
364 |
+
let group = $(el).data( 'ig-es-variable-group' );
|
365 |
+
|
366 |
+
if ( -1 === $.inArray( group, trigger.supplied_data_items ) ) {
|
367 |
+
$(el).addClass('hidden');
|
368 |
+
} else {
|
369 |
+
$(el).removeClass('hidden');
|
370 |
+
}
|
371 |
+
});
|
372 |
+
|
373 |
+
let shown_group = $('.ig-es-variables-group:not(.hidden)');
|
374 |
+
if ( 0 === shown_group.length ) {
|
375 |
+
$('.js-ig-es-no-variables-message').show();
|
376 |
+
} else {
|
377 |
+
$('.js-ig-es-no-variables-message').hide();
|
378 |
+
}
|
379 |
+
},
|
380 |
}
|
381 |
|
382 |
IG_ES_Workflows.init();
|
lite/includes/class-email-subscribers.php
CHANGED
@@ -771,14 +771,19 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
771 |
'lite/includes/workflows/abstracts/class-es-workflow-trigger.php',
|
772 |
'lite/includes/workflows/abstracts/class-es-workflow-action.php',
|
773 |
'lite/includes/workflows/abstracts/class-es-workflow-data-type.php',
|
|
|
774 |
|
775 |
// Workflow Utility
|
776 |
'lite/includes/workflows/class-es-clean.php',
|
777 |
'lite/includes/workflows/class-es-format.php',
|
778 |
'lite/includes/workflows/class-es-workflow-time-helper.php',
|
779 |
'lite/includes/workflows/class-es-workflow-datetime.php',
|
|
|
|
|
|
|
|
|
780 |
'lite/includes/workflows/workflow-helper-functions.php',
|
781 |
-
|
782 |
// Workflow
|
783 |
'lite/includes/workflows/class-es-workflow.php',
|
784 |
'lite/includes/workflows/class-es-workflow-factory.php',
|
@@ -788,6 +793,8 @@ if ( ! class_exists( 'Email_Subscribers' ) ) {
|
|
788 |
'lite/includes/workflows/data-types/class-es-data-type-user.php',
|
789 |
'lite/includes/workflows/class-es-workflow-data-types.php',
|
790 |
|
|
|
|
|
791 |
// Data Layer
|
792 |
'lite/includes/workflows/class-es-workflow-data-layer.php',
|
793 |
|
771 |
'lite/includes/workflows/abstracts/class-es-workflow-trigger.php',
|
772 |
'lite/includes/workflows/abstracts/class-es-workflow-action.php',
|
773 |
'lite/includes/workflows/abstracts/class-es-workflow-data-type.php',
|
774 |
+
'lite/includes/workflows/abstracts/class-ig-es-workflow-variable.php',
|
775 |
|
776 |
// Workflow Utility
|
777 |
'lite/includes/workflows/class-es-clean.php',
|
778 |
'lite/includes/workflows/class-es-format.php',
|
779 |
'lite/includes/workflows/class-es-workflow-time-helper.php',
|
780 |
'lite/includes/workflows/class-es-workflow-datetime.php',
|
781 |
+
'lite/includes/workflows/class-ig-es-variables-processor.php',
|
782 |
+
'lite/includes/workflows/class-ig-es-workflow-variable-parser.php',
|
783 |
+
'lite/includes/workflows/class-ig-es-variables.php',
|
784 |
+
'lite/includes/workflows/class-ig-es-replace-helper.php',
|
785 |
'lite/includes/workflows/workflow-helper-functions.php',
|
786 |
+
|
787 |
// Workflow
|
788 |
'lite/includes/workflows/class-es-workflow.php',
|
789 |
'lite/includes/workflows/class-es-workflow-factory.php',
|
793 |
'lite/includes/workflows/data-types/class-es-data-type-user.php',
|
794 |
'lite/includes/workflows/class-es-workflow-data-types.php',
|
795 |
|
796 |
+
'lite/includes/workflows/variables/class-es-workflow-data-types.php',
|
797 |
+
|
798 |
// Data Layer
|
799 |
'lite/includes/workflows/class-es-workflow-data-layer.php',
|
800 |
|
lite/includes/class-es-install.php
CHANGED
@@ -248,6 +248,11 @@ if ( ! class_exists( 'ES_Install' ) ) {
|
|
248 |
'ig_es_update_468_create_unsubscribe_feedback_table',
|
249 |
'ig_es_update_468_db_version',
|
250 |
),
|
|
|
|
|
|
|
|
|
|
|
251 |
);
|
252 |
|
253 |
/**
|
@@ -1223,6 +1228,7 @@ if ( ! class_exists( 'ES_Install' ) ) {
|
|
1223 |
tracking_key varchar(32) NOT NULL default '',
|
1224 |
created datetime NULL,
|
1225 |
last_active datetime NULL,
|
|
|
1226 |
language varchar(10) NOT NULL default '',
|
1227 |
most_recent_order bigint(20) NOT NULL DEFAULT 0,
|
1228 |
version bigint(20) NOT NULL default 0,
|
248 |
'ig_es_update_468_create_unsubscribe_feedback_table',
|
249 |
'ig_es_update_468_db_version',
|
250 |
),
|
251 |
+
'4.6.9' => array(
|
252 |
+
'ig_es_update_469_alter_wc_guests_table',
|
253 |
+
'ig_es_update_469_db_version',
|
254 |
+
),
|
255 |
+
|
256 |
);
|
257 |
|
258 |
/**
|
1228 |
tracking_key varchar(32) NOT NULL default '',
|
1229 |
created datetime NULL,
|
1230 |
last_active datetime NULL,
|
1231 |
+
meta longtext NOT NULL,
|
1232 |
language varchar(10) NOT NULL default '',
|
1233 |
most_recent_order bigint(20) NOT NULL DEFAULT 0,
|
1234 |
version bigint(20) NOT NULL default 0,
|
lite/includes/classes/class-es-reports-table.php
CHANGED
@@ -20,6 +20,8 @@ class ES_Reports_Table extends ES_List_Table {
|
|
20 |
)
|
21 |
);
|
22 |
|
|
|
|
|
23 |
}
|
24 |
|
25 |
public function es_reports_callback() {
|
@@ -101,6 +103,8 @@ class ES_Reports_Table extends ES_List_Table {
|
|
101 |
<?php
|
102 |
}
|
103 |
}
|
|
|
|
|
104 |
}
|
105 |
|
106 |
public function screen_option() {
|
@@ -122,42 +126,59 @@ class ES_Reports_Table extends ES_List_Table {
|
|
122 |
<tr>
|
123 |
<th width="8%" class="py-3 pl-4 es_reports_table_header"><?php esc_html_e( 'Sr No', 'email-subscribers' ); ?></th>
|
124 |
<th width="24%" class="py-3 pl-4 es_reports_table_header"><?php esc_html_e( 'Email', 'email-subscribers' ); ?></th>
|
125 |
-
<th width="12%" class="
|
126 |
<th width="22%" class="py-3 pl-2 es_reports_table_header"><?php esc_html_e( 'Sent Date', 'email-subscribers' ); ?></th>
|
127 |
-
<th width="22%" class="
|
128 |
</tr>
|
129 |
|
130 |
<?php
|
131 |
}
|
132 |
|
133 |
-
|
134 |
-
|
135 |
-
|
136 |
-
|
|
|
137 |
|
|
|
|
|
|
|
138 |
|
139 |
$insight = ig_es_get_request_data( 'insight', '' );
|
140 |
$_wpnonce = ig_es_get_request_data( '_wpnonce', '' );
|
141 |
|
142 |
if ( ES()->is_pro() || $insight ) {
|
143 |
-
do_action( 'ig_es_view_report_data', $
|
144 |
}
|
145 |
?>
|
146 |
<div class="wrap">
|
147 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
148 |
<div class="pt-3">
|
149 |
<span class="text-left text-lg font-medium leading-7 tracking-wide text-gray-600"><?php esc_html_e( 'View activity ', 'email-subscribers' ); ?></span>
|
150 |
-
|
151 |
-
<?php if ( ! ES()->is_pro() && ! $insight ) { ?>
|
152 |
-
<a href="?page=es_reports&action=view&list=<?php echo esc_attr( $id ); ?>&_wpnonce=<?php echo esc_attr( $_wpnonce ); ?>&insight=true" class="float-right ig-es-title-button px-2 py-2 mx-2 ig-es-imp-button cursor-pointer"><?php esc_html_e( 'Campaign Analytics', 'email-subscribers' ); ?></a>
|
153 |
-
<?php } ?>
|
154 |
</div>
|
155 |
-
|
156 |
-
|
157 |
-
<
|
158 |
-
|
159 |
-
|
160 |
-
</div>
|
161 |
|
162 |
<div class="mb-2 max-w-7xl flex">
|
163 |
<div class="flex w-full bg-white shadow rounded-md break-all">
|
@@ -168,7 +189,7 @@ class ES_Reports_Table extends ES_List_Table {
|
|
168 |
<?php echo wp_kses_post( $this->prepare_header_footer_row() ); ?>
|
169 |
</thead>
|
170 |
<tbody>
|
171 |
-
<?php echo wp_kses_post( $this->prepare_body( $
|
172 |
</tbody>
|
173 |
<tfoot>
|
174 |
<?php echo wp_kses_post( $this->prepare_header_footer_row() ); ?>
|
@@ -177,21 +198,16 @@ class ES_Reports_Table extends ES_List_Table {
|
|
177 |
</form>
|
178 |
</div>
|
179 |
</div>
|
180 |
-
|
181 |
-
|
182 |
-
// $wpdb->update( EMAIL_SUBSCRIBERS_STATS_TABLE, array( 'viewdate' => date( 'Y-m-d H:i:s' ) ), array( 'viewdate' => $id ) );
|
183 |
}
|
184 |
|
185 |
|
186 |
-
public function prepare_body( $
|
187 |
|
188 |
$i = 1;
|
189 |
-
foreach ( $
|
190 |
-
|
191 |
-
if ( 0 === $i % 2 ) {
|
192 |
-
$class = 'alternate';
|
193 |
-
}
|
194 |
-
|
195 |
$email_id = ! empty( $email['email'] ) ? $email['email'] : ( ! empty( $email['es_deliver_emailmail'] ) ? $email['es_deliver_emailmail'] : '' );
|
196 |
$status = ! empty( $email['status'] ) ? $email['status'] : ( ! empty( $email['es_deliver_sentstatus'] ) ? $email['es_deliver_sentstatus'] : '' );
|
197 |
$sent_at = ! empty( $email['sent_at'] ) ? $email['sent_at'] : ( ! empty( $email['es_deliver_sentdate'] ) ? $email['es_deliver_sentdate'] : '' );
|
@@ -603,7 +619,7 @@ class ES_Reports_Table extends ES_List_Table {
|
|
603 |
ES_Common::show_message( $message, 'error' );
|
604 |
} else {
|
605 |
$report_id = ig_es_get_request_data( 'list' );
|
606 |
-
|
607 |
die();
|
608 |
}
|
609 |
}
|
@@ -623,10 +639,20 @@ class ES_Reports_Table extends ES_List_Table {
|
|
623 |
}
|
624 |
}
|
625 |
|
626 |
-
public function
|
627 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
628 |
$allowedtags = ig_es_allowed_html_tags_in_esc();
|
629 |
add_filter( 'safe_style_css', 'ig_es_allowed_css_style' );
|
|
|
630 |
?>
|
631 |
<div class="wrap">
|
632 |
<h2 style="margin-bottom:1em;">
|
@@ -638,8 +664,7 @@ class ES_Reports_Table extends ES_List_Table {
|
|
638 |
<div class="tool-box">
|
639 |
<div style="padding:15px;background-color:#FFFFFF;">
|
640 |
<?php
|
641 |
-
|
642 |
-
$preview = ES_DB_Mailing_Queue::get_email_by_id( $report_id );
|
643 |
|
644 |
$es_email_type = get_option( 'ig_es_email_type' ); // Not the ideal way. Email type can differ while previewing sent email.
|
645 |
|
@@ -658,8 +683,7 @@ class ES_Reports_Table extends ES_List_Table {
|
|
658 |
<?php
|
659 |
$html = ob_get_clean();
|
660 |
|
661 |
-
|
662 |
-
|
663 |
}
|
664 |
|
665 |
/**
|
20 |
)
|
21 |
);
|
22 |
|
23 |
+
add_action( 'ig_es_view_activity_table_html', array( $this, 'view_activity_report_table' ), 10, 3 );
|
24 |
+
add_action( 'ig_es_view_email_preview', array( $this, 'display_preview_email' ), 10, 3 );
|
25 |
}
|
26 |
|
27 |
public function es_reports_callback() {
|
103 |
<?php
|
104 |
}
|
105 |
}
|
106 |
+
|
107 |
+
|
108 |
}
|
109 |
|
110 |
public function screen_option() {
|
126 |
<tr>
|
127 |
<th width="8%" class="py-3 pl-4 es_reports_table_header"><?php esc_html_e( 'Sr No', 'email-subscribers' ); ?></th>
|
128 |
<th width="24%" class="py-3 pl-4 es_reports_table_header"><?php esc_html_e( 'Email', 'email-subscribers' ); ?></th>
|
129 |
+
<th width="12%" class="py-3 pl-6 es_reports_table_header"><?php esc_html_e( 'Status', 'email-subscribers' ); ?></th>
|
130 |
<th width="22%" class="py-3 pl-2 es_reports_table_header"><?php esc_html_e( 'Sent Date', 'email-subscribers' ); ?></th>
|
131 |
+
<th width="22%" class="py-3 pl-6 es_reports_table_header"><?php esc_html_e( 'Viewed Date', 'email-subscribers' ); ?></th>
|
132 |
</tr>
|
133 |
|
134 |
<?php
|
135 |
}
|
136 |
|
137 |
+
/**
|
138 |
+
* Get view activity table data
|
139 |
+
*
|
140 |
+
*/
|
141 |
+
public function view_list( $hash ) {
|
142 |
|
143 |
+
$emails = ES_DB_Sending_Queue::get_emails_by_hash( $hash );
|
144 |
+
$email_viewed_count = ES_DB_Sending_Queue::get_viewed_count_by_hash( $hash );
|
145 |
+
$total_email_sent = ES_DB_Sending_Queue::get_total_email_count_by_hash( $hash );
|
146 |
|
147 |
$insight = ig_es_get_request_data( 'insight', '' );
|
148 |
$_wpnonce = ig_es_get_request_data( '_wpnonce', '' );
|
149 |
|
150 |
if ( ES()->is_pro() || $insight ) {
|
151 |
+
do_action( 'ig_es_view_report_data', $hash );
|
152 |
}
|
153 |
?>
|
154 |
<div class="wrap">
|
155 |
+
<?php if ( ! ES()->is_pro() && ! $insight ) { ?>
|
156 |
+
<a href="?page=es_reports&action=view&list=<?php echo esc_attr( $hash ); ?>&_wpnonce=<?php echo esc_attr( $_wpnonce ); ?>&insight=true" class="float-right ig-es-title-button px-2 py-2 mx-2 ig-es-imp-button cursor-pointer"><?php esc_html_e( 'Campaign Analytics', 'email-subscribers' ); ?></a>
|
157 |
+
<?php } ?>
|
158 |
+
</div>
|
159 |
+
|
160 |
+
<?php
|
161 |
+
do_action( 'ig_es_view_activity_table_html', $email_viewed_count, $total_email_sent, $emails ) ;
|
162 |
+
}
|
163 |
+
|
164 |
+
/**
|
165 |
+
* Display view activity table
|
166 |
+
*
|
167 |
+
* @since 4.6.9
|
168 |
+
*
|
169 |
+
*/
|
170 |
+
public function view_activity_report_table( $email_viewed_count, $total_email_sent, $view_activity_data ) {
|
171 |
+
|
172 |
+
?>
|
173 |
+
<div class="mt-6 mb-2 max-w-7xl">
|
174 |
<div class="pt-3">
|
175 |
<span class="text-left text-lg font-medium leading-7 tracking-wide text-gray-600"><?php esc_html_e( 'View activity ', 'email-subscribers' ); ?></span>
|
|
|
|
|
|
|
|
|
176 |
</div>
|
177 |
+
</div>
|
178 |
+
<div class="mt-2 mb-2 block">
|
179 |
+
<span class="pt-3 pb-4 leading-5 tracking-wide text-gray-600"><?php echo esc_html( 'Viewed ' . $email_viewed_count . '/' . $total_email_sent ); ?>
|
180 |
+
</span>
|
181 |
+
</div>
|
|
|
182 |
|
183 |
<div class="mb-2 max-w-7xl flex">
|
184 |
<div class="flex w-full bg-white shadow rounded-md break-all">
|
189 |
<?php echo wp_kses_post( $this->prepare_header_footer_row() ); ?>
|
190 |
</thead>
|
191 |
<tbody>
|
192 |
+
<?php echo wp_kses_post( $this->prepare_body( $view_activity_data ) ); ?>
|
193 |
</tbody>
|
194 |
<tfoot>
|
195 |
<?php echo wp_kses_post( $this->prepare_header_footer_row() ); ?>
|
198 |
</form>
|
199 |
</div>
|
200 |
</div>
|
201 |
+
|
202 |
+
<?php
|
|
|
203 |
}
|
204 |
|
205 |
|
206 |
+
public function prepare_body( $view_activity_data ) {
|
207 |
|
208 |
$i = 1;
|
209 |
+
foreach ( $view_activity_data as $key => $email ) {
|
210 |
+
|
|
|
|
|
|
|
|
|
211 |
$email_id = ! empty( $email['email'] ) ? $email['email'] : ( ! empty( $email['es_deliver_emailmail'] ) ? $email['es_deliver_emailmail'] : '' );
|
212 |
$status = ! empty( $email['status'] ) ? $email['status'] : ( ! empty( $email['es_deliver_sentstatus'] ) ? $email['es_deliver_sentstatus'] : '' );
|
213 |
$sent_at = ! empty( $email['sent_at'] ) ? $email['sent_at'] : ( ! empty( $email['es_deliver_sentdate'] ) ? $email['es_deliver_sentdate'] : '' );
|
619 |
ES_Common::show_message( $message, 'error' );
|
620 |
} else {
|
621 |
$report_id = ig_es_get_request_data( 'list' );
|
622 |
+
$this->preview_email_option( $report_id );
|
623 |
die();
|
624 |
}
|
625 |
}
|
639 |
}
|
640 |
}
|
641 |
|
642 |
+
public function preview_email_option( $report_id ) {
|
643 |
+
$preview = array();
|
644 |
+
$preview = ES_DB_Mailing_Queue::get_email_by_id( $report_id );
|
645 |
+
do_action( 'ig_es_view_email_preview', $preview );
|
646 |
+
}
|
647 |
+
|
648 |
+
|
649 |
+
/*
|
650 |
+
* Display the preview of the email content
|
651 |
+
*/
|
652 |
+
public function display_preview_email( $preview ) {
|
653 |
$allowedtags = ig_es_allowed_html_tags_in_esc();
|
654 |
add_filter( 'safe_style_css', 'ig_es_allowed_css_style' );
|
655 |
+
ob_start();
|
656 |
?>
|
657 |
<div class="wrap">
|
658 |
<h2 style="margin-bottom:1em;">
|
664 |
<div class="tool-box">
|
665 |
<div style="padding:15px;background-color:#FFFFFF;">
|
666 |
<?php
|
667 |
+
|
|
|
668 |
|
669 |
$es_email_type = get_option( 'ig_es_email_type' ); // Not the ideal way. Email type can differ while previewing sent email.
|
670 |
|
683 |
<?php
|
684 |
$html = ob_get_clean();
|
685 |
|
686 |
+
echo wp_kses( $html, $allowedtags );
|
|
|
687 |
}
|
688 |
|
689 |
/**
|
lite/includes/classes/class-ig-es-wc-session-tracker.php
CHANGED
@@ -128,7 +128,7 @@ class IG_ES_WC_Session_Tracker {
|
|
128 |
/**
|
129 |
* Returns the current guest from tracking cookie.
|
130 |
*
|
131 |
-
* @return
|
132 |
*/
|
133 |
public static function get_current_guest() {
|
134 |
if ( ! self::session_tracking_enabled() ) {
|
@@ -177,7 +177,7 @@ class IG_ES_WC_Session_Tracker {
|
|
177 |
* @param string $new_email
|
178 |
* @param string $language
|
179 |
*
|
180 |
-
* @return
|
181 |
*/
|
182 |
public static function set_session_by_captured_email( $new_email, $language = '' ) {
|
183 |
|
128 |
/**
|
129 |
* Returns the current guest from tracking cookie.
|
130 |
*
|
131 |
+
* @return IG_ES_Guest|bool
|
132 |
*/
|
133 |
public static function get_current_guest() {
|
134 |
if ( ! self::session_tracking_enabled() ) {
|
177 |
* @param string $new_email
|
178 |
* @param string $language
|
179 |
*
|
180 |
+
* @return IG_ES_Customer|false
|
181 |
*/
|
182 |
public static function set_session_by_captured_email( $new_email, $language = '' ) {
|
183 |
|
lite/includes/db/class-es-db-actions.php
CHANGED
@@ -378,26 +378,27 @@ class ES_DB_Actions extends ES_DB {
|
|
378 |
*
|
379 |
* @since 4.5.2
|
380 |
*/
|
381 |
-
public function get_count_based_on_id_type( $campaign_id, $type, $distinct = true ) {
|
382 |
global $wpdb;
|
383 |
|
384 |
$args = array();
|
385 |
|
386 |
$args[] = $campaign_id;
|
|
|
387 |
$args[] = $type;
|
388 |
|
389 |
$count = 0;
|
390 |
if ( $distinct ) {
|
391 |
$count = $wpdb->get_var(
|
392 |
$wpdb->prepare(
|
393 |
-
"SELECT COUNT(DISTINCT(`contact_id`)) as count FROM {$wpdb->prefix}ig_actions WHERE `campaign_id`= %d AND `type` = %d",
|
394 |
$args
|
395 |
)
|
396 |
);
|
397 |
} else {
|
398 |
$count = $wpdb->get_var(
|
399 |
$wpdb->prepare(
|
400 |
-
"SELECT COUNT(`contact_id`) as count FROM {$wpdb->prefix}ig_actions WHERE `campaign_id`= %d AND `type` = %d",
|
401 |
$args
|
402 |
)
|
403 |
);
|
378 |
*
|
379 |
* @since 4.5.2
|
380 |
*/
|
381 |
+
public function get_count_based_on_id_type( $campaign_id, $message_id, $type, $distinct = true ) {
|
382 |
global $wpdb;
|
383 |
|
384 |
$args = array();
|
385 |
|
386 |
$args[] = $campaign_id;
|
387 |
+
$args[] = $message_id;
|
388 |
$args[] = $type;
|
389 |
|
390 |
$count = 0;
|
391 |
if ( $distinct ) {
|
392 |
$count = $wpdb->get_var(
|
393 |
$wpdb->prepare(
|
394 |
+
"SELECT COUNT(DISTINCT(`contact_id`)) as count FROM {$wpdb->prefix}ig_actions WHERE `campaign_id`= %d AND `message_id`= %d AND `type` = %d",
|
395 |
$args
|
396 |
)
|
397 |
);
|
398 |
} else {
|
399 |
$count = $wpdb->get_var(
|
400 |
$wpdb->prepare(
|
401 |
+
"SELECT COUNT(`contact_id`) as count FROM {$wpdb->prefix}ig_actions WHERE `campaign_id`= %d AND `message_id`= %d AND `type` = %d",
|
402 |
$args
|
403 |
)
|
404 |
);
|
lite/includes/db/class-ig-es-db-wc-guest.php
CHANGED
@@ -76,6 +76,7 @@ class IG_ES_DB_WC_Guest extends ES_DB {
|
|
76 |
'language' => '%s',
|
77 |
'most_recent_order' => '%d',
|
78 |
'version' => '%d',
|
|
|
79 |
);
|
80 |
}
|
81 |
|
@@ -96,6 +97,7 @@ class IG_ES_DB_WC_Guest extends ES_DB {
|
|
96 |
'language' => '',
|
97 |
'most_recent_order' => 0,
|
98 |
'version' => 0,
|
|
|
99 |
);
|
100 |
}
|
101 |
|
@@ -193,4 +195,46 @@ class IG_ES_DB_WC_Guest extends ES_DB {
|
|
193 |
return $result;
|
194 |
|
195 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
196 |
}
|
76 |
'language' => '%s',
|
77 |
'most_recent_order' => '%d',
|
78 |
'version' => '%d',
|
79 |
+
'meta' => '%s',
|
80 |
);
|
81 |
}
|
82 |
|
97 |
'language' => '',
|
98 |
'most_recent_order' => 0,
|
99 |
'version' => 0,
|
100 |
+
'meta' => '',
|
101 |
);
|
102 |
}
|
103 |
|
195 |
return $result;
|
196 |
|
197 |
}
|
198 |
+
|
199 |
+
/**
|
200 |
+
* Update meta value
|
201 |
+
*
|
202 |
+
* @since 4.4.1
|
203 |
+
*
|
204 |
+
* @param int $queue_id Queue ID.
|
205 |
+
* @param array $meta_data Meta data to update.
|
206 |
+
*
|
207 |
+
* @return bool|false|int
|
208 |
+
*/
|
209 |
+
public function update_meta( $queue_id = 0, $meta_data = array() ) {
|
210 |
+
|
211 |
+
$update = false;
|
212 |
+
if ( ! empty( $queue_id ) && ! empty( $meta_data ) ) {
|
213 |
+
$queue = $this->get( $queue_id );
|
214 |
+
|
215 |
+
if ( ! empty( $queue ) ) {
|
216 |
+
|
217 |
+
if ( isset( $queue['meta'] ) ) {
|
218 |
+
$meta = maybe_unserialize( $queue['meta'] );
|
219 |
+
|
220 |
+
// If $meta is an empty or isn't an array, then convert it to an array before adding data to it.
|
221 |
+
if ( empty( $meta ) || ! is_array( $meta ) ) {
|
222 |
+
$meta = array();
|
223 |
+
}
|
224 |
+
|
225 |
+
foreach ( $meta_data as $meta_key => $meta_value ) {
|
226 |
+
$meta[ $meta_key ] = $meta_value;
|
227 |
+
}
|
228 |
+
|
229 |
+
$queue['meta'] = maybe_serialize( $meta );
|
230 |
+
|
231 |
+
$update = $this->update( $queue_id, $queue );
|
232 |
+
|
233 |
+
}
|
234 |
+
}
|
235 |
+
}
|
236 |
+
|
237 |
+
return $update;
|
238 |
+
|
239 |
+
}
|
240 |
}
|
lite/includes/es-core-functions.php
CHANGED
@@ -138,7 +138,7 @@ if ( ! function_exists( 'ig_es_format_date_time' ) ) {
|
|
138 |
*/
|
139 |
function ig_es_format_date_time( $date ) {
|
140 |
|
141 |
-
$local_timestamp = ( '0000-00-00 00:00:00' !== $date ) ? ES_Common::convert_date_to_wp_date( get_date_from_gmt( $date )) : '<i class="dashicons dashicons-es dashicons-minus"></i>';
|
142 |
|
143 |
return $local_timestamp;
|
144 |
}
|
138 |
*/
|
139 |
function ig_es_format_date_time( $date ) {
|
140 |
|
141 |
+
$local_timestamp = ( '0000-00-00 00:00:00' !== $date && ! empty( $date ) ) ? ES_Common::convert_date_to_wp_date( get_date_from_gmt( $date )) : '<i class="dashicons dashicons-es dashicons-minus"></i>';
|
142 |
|
143 |
return $local_timestamp;
|
144 |
}
|
lite/includes/upgrade/es-update-functions.php
CHANGED
@@ -1405,3 +1405,32 @@ function ig_es_update_468_db_version() {
|
|
1405 |
ES_Install::update_db_version( '4.6.8' );
|
1406 |
}
|
1407 |
/* --------------------- ES 4.6.8(End)--------------------------- */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1405 |
ES_Install::update_db_version( '4.6.8' );
|
1406 |
}
|
1407 |
/* --------------------- ES 4.6.8(End)--------------------------- */
|
1408 |
+
|
1409 |
+
/**
|
1410 |
+
* Add meta column in wc_guests table
|
1411 |
+
*
|
1412 |
+
* @since 4.6.9
|
1413 |
+
*/
|
1414 |
+
function ig_es_update_469_alter_wc_guests_table() {
|
1415 |
+
global $wpdb;
|
1416 |
+
|
1417 |
+
$cols = $wpdb->get_col( "SHOW COLUMNS FROM {$wpdb->prefix}ig_wc_guests" );
|
1418 |
+
|
1419 |
+
if ( ! in_array( 'meta', $cols, true ) ) {
|
1420 |
+
$wpdb->query(
|
1421 |
+
"ALTER TABLE {$wpdb->prefix}ig_wc_guests
|
1422 |
+
ADD COLUMN `meta` longtext NULL AFTER `last_active`"
|
1423 |
+
);
|
1424 |
+
}
|
1425 |
+
}
|
1426 |
+
|
1427 |
+
/**
|
1428 |
+
* Update DB version
|
1429 |
+
*
|
1430 |
+
* @since 4.6.9
|
1431 |
+
*/
|
1432 |
+
function ig_es_update_469_db_version() {
|
1433 |
+
ES_Install::update_db_version( '4.6.9' );
|
1434 |
+
}
|
1435 |
+
|
1436 |
+
/* --------------------- ES 4.6.9(End)--------------------------- */
|
lite/includes/workflows/abstracts/class-es-workflow-action.php
CHANGED
@@ -298,10 +298,18 @@ abstract class ES_Workflow_Action {
|
|
298 |
*
|
299 |
* @return mixed Will vary depending on the field type specified in the action's fields.
|
300 |
*/
|
301 |
-
public function get_option( $field_name ) {
|
302 |
|
303 |
$value = $this->get_option_raw( $field_name );
|
304 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
305 |
return apply_filters( 'ig_es_action_option', $value, $field_name, $this );
|
306 |
}
|
307 |
|
298 |
*
|
299 |
* @return mixed Will vary depending on the field type specified in the action's fields.
|
300 |
*/
|
301 |
+
public function get_option( $field_name, $process_variables = false, $allow_html = false ) {
|
302 |
|
303 |
$value = $this->get_option_raw( $field_name );
|
304 |
|
305 |
+
// Process the option value only if it's a string
|
306 |
+
// The value will almost always be a string but it could be a bool if the field is checkbox
|
307 |
+
if ( $value && is_string( $value ) ) {
|
308 |
+
if ( $process_variables ) {
|
309 |
+
$value = $this->workflow->variable_processor()->process_field( $value, $allow_html );
|
310 |
+
}
|
311 |
+
}
|
312 |
+
|
313 |
return apply_filters( 'ig_es_action_option', $value, $field_name, $this );
|
314 |
}
|
315 |
|
lite/includes/workflows/abstracts/class-ig-es-workflow-variable.php
ADDED
@@ -0,0 +1,203 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Base class for workflow placeholder variables
|
9 |
+
*
|
10 |
+
*/
|
11 |
+
abstract class IG_ES_Workflow_Variable {
|
12 |
+
|
13 |
+
/**
|
14 |
+
* Variable name
|
15 |
+
* wc_order.id, cart.link, user.first_name etc
|
16 |
+
*
|
17 |
+
* @var string
|
18 |
+
*/
|
19 |
+
protected $name;
|
20 |
+
|
21 |
+
/**
|
22 |
+
* Variable description
|
23 |
+
* @var string
|
24 |
+
*/
|
25 |
+
protected $description;
|
26 |
+
|
27 |
+
/**
|
28 |
+
* Stores parameter field objects.
|
29 |
+
*
|
30 |
+
* @var ES_Field[]
|
31 |
+
*/
|
32 |
+
protected $parameter_fields = array();
|
33 |
+
|
34 |
+
/**
|
35 |
+
* Variable data type
|
36 |
+
* e.g. wc_order in wc_order.id, cart in cart.link, user in user.first_name etc
|
37 |
+
*
|
38 |
+
* @var string
|
39 |
+
*/
|
40 |
+
protected $data_type;
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Variable data field
|
44 |
+
* e.g. id in wc_order.id, link in cart.link, first_name in user.first_name etc
|
45 |
+
*
|
46 |
+
* @var string
|
47 |
+
*/
|
48 |
+
protected $data_field;
|
49 |
+
|
50 |
+
/**
|
51 |
+
* Does variable support fallback value in case no value is found
|
52 |
+
*
|
53 |
+
* @var bool
|
54 |
+
*/
|
55 |
+
public $use_fallback = true;
|
56 |
+
|
57 |
+
/**
|
58 |
+
* Knows if admin details have been loaded.
|
59 |
+
*
|
60 |
+
* @var bool
|
61 |
+
*/
|
62 |
+
public $has_loaded_admin_details = false;
|
63 |
+
|
64 |
+
|
65 |
+
/**
|
66 |
+
* Optional method
|
67 |
+
*/
|
68 |
+
public function init() {}
|
69 |
+
|
70 |
+
|
71 |
+
/**
|
72 |
+
* Method to set description and other admin props
|
73 |
+
*/
|
74 |
+
public function load_admin_details() {}
|
75 |
+
|
76 |
+
|
77 |
+
public function maybe_load_admin_details() {
|
78 |
+
if ( ! $this->has_loaded_admin_details ) {
|
79 |
+
$this->load_admin_details();
|
80 |
+
$this->has_loaded_admin_details = true;
|
81 |
+
}
|
82 |
+
}
|
83 |
+
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Constructor
|
87 |
+
*/
|
88 |
+
public function __construct() {
|
89 |
+
$this->init();
|
90 |
+
}
|
91 |
+
|
92 |
+
|
93 |
+
/**
|
94 |
+
* Sets the name, data_type and data_field props
|
95 |
+
* @param $name
|
96 |
+
*/
|
97 |
+
public function setup( $name ) {
|
98 |
+
$this->name = $name;
|
99 |
+
list( $this->data_type, $this->data_field ) = explode( '.', $this->name );
|
100 |
+
}
|
101 |
+
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Get variable description
|
105 |
+
*
|
106 |
+
* @return string
|
107 |
+
*/
|
108 |
+
public function get_description() {
|
109 |
+
$this->maybe_load_admin_details();
|
110 |
+
return $this->description;
|
111 |
+
}
|
112 |
+
|
113 |
+
|
114 |
+
/**
|
115 |
+
* Get the parameter fields for the variable.
|
116 |
+
*
|
117 |
+
* @return ES_Field[]
|
118 |
+
*/
|
119 |
+
public function get_parameter_fields() {
|
120 |
+
$this->maybe_load_admin_details();
|
121 |
+
return $this->parameter_fields;
|
122 |
+
}
|
123 |
+
|
124 |
+
|
125 |
+
/**
|
126 |
+
* Get variable name
|
127 |
+
*
|
128 |
+
* @return string
|
129 |
+
*/
|
130 |
+
public function get_name() {
|
131 |
+
return $this->name;
|
132 |
+
}
|
133 |
+
|
134 |
+
|
135 |
+
/**
|
136 |
+
* Get variable data type
|
137 |
+
*
|
138 |
+
* @return string
|
139 |
+
*/
|
140 |
+
public function get_data_type() {
|
141 |
+
return $this->data_type;
|
142 |
+
}
|
143 |
+
|
144 |
+
|
145 |
+
/**
|
146 |
+
* Get variable data field
|
147 |
+
*
|
148 |
+
* @return string
|
149 |
+
*/
|
150 |
+
public function get_data_field() {
|
151 |
+
return $this->data_field;
|
152 |
+
}
|
153 |
+
|
154 |
+
/**
|
155 |
+
* Add a parameter field to the variable.
|
156 |
+
*
|
157 |
+
* @param ES_Field $field
|
158 |
+
*/
|
159 |
+
protected function add_parameter_field( ES_Field $field ) {
|
160 |
+
$this->parameter_fields[ $field->get_name() ] = $field;
|
161 |
+
}
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Add a text parameter field to the variable.
|
165 |
+
*
|
166 |
+
* @param string $name
|
167 |
+
* @param string $description
|
168 |
+
* @param bool $required
|
169 |
+
* @param string $placeholder
|
170 |
+
* @param array $extra
|
171 |
+
*/
|
172 |
+
protected function add_parameter_text_field( $name, $description, $required = false, $placeholder = '', $extra = array() ) {
|
173 |
+
$field = new ES_Text();
|
174 |
+
$field->set_name( $name );
|
175 |
+
$field->set_description( $description );
|
176 |
+
$field->set_required( $required );
|
177 |
+
$field->set_placeholder( $placeholder );
|
178 |
+
$field->meta = $extra;
|
179 |
+
|
180 |
+
$this->add_parameter_field( $field );
|
181 |
+
}
|
182 |
+
|
183 |
+
/**
|
184 |
+
* Add a select parameter field to the variable.
|
185 |
+
*
|
186 |
+
* @param string $name
|
187 |
+
* @param string $description
|
188 |
+
* @param array $options
|
189 |
+
* @param bool $required
|
190 |
+
* @param array $extra
|
191 |
+
*/
|
192 |
+
protected function add_parameter_select_field( $name, $description, $options = array(), $required = false, $extra = array() ) {
|
193 |
+
$field = new ES_Select( false );
|
194 |
+
$field->set_name( $name );
|
195 |
+
$field->set_description( $description );
|
196 |
+
$field->set_required( $required );
|
197 |
+
$field->set_options( $options );
|
198 |
+
$field->meta = $extra;
|
199 |
+
|
200 |
+
$this->add_parameter_field( $field );
|
201 |
+
}
|
202 |
+
|
203 |
+
}
|
lite/includes/workflows/admin/class-es-workflow-admin-ajax.php
CHANGED
@@ -25,12 +25,15 @@ class ES_Workflow_Admin_Ajax {
|
|
25 |
* Hook in methods
|
26 |
*
|
27 |
* @since 4.4.1
|
|
|
|
|
28 |
*/
|
29 |
public static function init() {
|
30 |
$ajax_events = array(
|
31 |
'fill_trigger_fields',
|
32 |
'fill_action_fields',
|
33 |
'toggle_workflow_status',
|
|
|
34 |
);
|
35 |
|
36 |
foreach ( $ajax_events as $ajax_event ) {
|
@@ -142,4 +145,19 @@ class ES_Workflow_Admin_Ajax {
|
|
142 |
}
|
143 |
}
|
144 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
145 |
}
|
25 |
* Hook in methods
|
26 |
*
|
27 |
* @since 4.4.1
|
28 |
+
*
|
29 |
+
* @since 4.6.9 Added modal_variable_info ajax event.
|
30 |
*/
|
31 |
public static function init() {
|
32 |
$ajax_events = array(
|
33 |
'fill_trigger_fields',
|
34 |
'fill_action_fields',
|
35 |
'toggle_workflow_status',
|
36 |
+
'modal_variable_info',
|
37 |
);
|
38 |
|
39 |
foreach ( $ajax_events as $ajax_event ) {
|
145 |
}
|
146 |
}
|
147 |
|
148 |
+
public static function modal_variable_info() {
|
149 |
+
|
150 |
+
check_ajax_referer( 'ig-es-workflow-nonce', 'security' );
|
151 |
+
|
152 |
+
$variable = IG_ES_Variables::get_variable( ES_Clean::string( ig_es_get_request_data( 'variable' ) ) );
|
153 |
+
|
154 |
+
if ( $variable ) {
|
155 |
+
ES_Workflow_Admin::get_view( 'modal-variable-info', array(
|
156 |
+
'variable' => $variable
|
157 |
+
));
|
158 |
+
die;
|
159 |
+
}
|
160 |
+
|
161 |
+
wp_die( esc_html__( 'Variable not found.', 'email-subscribers' ) );
|
162 |
+
}
|
163 |
}
|
lite/includes/workflows/admin/class-es-workflow-admin-edit.php
CHANGED
@@ -53,6 +53,33 @@ class ES_Workflow_Admin_Edit {
|
|
53 |
return $data;
|
54 |
}
|
55 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
56 |
/**
|
57 |
* Register Workflow meta boxes
|
58 |
*
|
@@ -254,11 +281,13 @@ class ES_Workflow_Admin_Edit {
|
|
254 |
$meta_box_title_for_actions = __( 'Actions', 'email-subscribers' );
|
255 |
$meta_box_title_for_save = __( 'Save', 'email-subscribers' );
|
256 |
$meta_box_title_for_options = __( 'Options', 'email-subscribers' );
|
|
|
257 |
// $meta_box_title_for_timing = __( 'Timing', 'email-subscribers' );
|
258 |
|
259 |
add_meta_box( 'ig_es_workflow_trigger', $meta_box_title_for_trigger, array( __CLASS__, 'trigger_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
|
260 |
add_meta_box( 'ig_es_workflow_actions', $meta_box_title_for_actions, array( __CLASS__, 'actions_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
|
261 |
add_meta_box( 'ig_es_workflow_save', $meta_box_title_for_save, array( __CLASS__, 'save_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
|
|
|
262 |
if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
|
263 |
do_action( 'ig_es_workflows_integration', $page_prefix );
|
264 |
}
|
@@ -394,6 +423,20 @@ class ES_Workflow_Admin_Edit {
|
|
394 |
);
|
395 |
}
|
396 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
397 |
/**
|
398 |
* Method to save workflow
|
399 |
*
|
53 |
return $data;
|
54 |
}
|
55 |
|
56 |
+
/**
|
57 |
+
* Method to get trigger data
|
58 |
+
*
|
59 |
+
* @since 4.4.1
|
60 |
+
*
|
61 |
+
* @param ES_Workflow_Trigger $trigger Workflow trigger.
|
62 |
+
*
|
63 |
+
* @return array|false
|
64 |
+
*/
|
65 |
+
public static function get_workflow_data() {
|
66 |
+
|
67 |
+
$data = array(
|
68 |
+
'is_new' => true,
|
69 |
+
);
|
70 |
+
|
71 |
+
$workflow_id = ig_es_get_request_data( 'id' );
|
72 |
+
if ( ! empty( $workflow_id ) && is_numeric( $workflow_id ) ) {
|
73 |
+
$workflow = ES_Workflow_Factory::get( $workflow_id );
|
74 |
+
if ( $workflow instanceof ES_Workflow ) {
|
75 |
+
$data['is_new'] = false;
|
76 |
+
$data['trigger'] = $workflow->get_trigger();
|
77 |
+
}
|
78 |
+
}
|
79 |
+
|
80 |
+
return $data;
|
81 |
+
}
|
82 |
+
|
83 |
/**
|
84 |
* Register Workflow meta boxes
|
85 |
*
|
281 |
$meta_box_title_for_actions = __( 'Actions', 'email-subscribers' );
|
282 |
$meta_box_title_for_save = __( 'Save', 'email-subscribers' );
|
283 |
$meta_box_title_for_options = __( 'Options', 'email-subscribers' );
|
284 |
+
$meta_box_title_for_variables = __( 'Placeholders', 'email-subscribers' );
|
285 |
// $meta_box_title_for_timing = __( 'Timing', 'email-subscribers' );
|
286 |
|
287 |
add_meta_box( 'ig_es_workflow_trigger', $meta_box_title_for_trigger, array( __CLASS__, 'trigger_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
|
288 |
add_meta_box( 'ig_es_workflow_actions', $meta_box_title_for_actions, array( __CLASS__, 'actions_metabox' ), $page_prefix . '_page_es_workflows', 'normal', 'default' );
|
289 |
add_meta_box( 'ig_es_workflow_save', $meta_box_title_for_save, array( __CLASS__, 'save_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
|
290 |
+
add_meta_box( 'ig_es_workflow_variables', $meta_box_title_for_variables, array( __CLASS__, 'variables_metabox' ), $page_prefix . '_page_es_workflows', 'side', 'default' );
|
291 |
if ( ES()->can_upsell_features( array( 'lite', 'trial' ) ) ) {
|
292 |
do_action( 'ig_es_workflows_integration', $page_prefix );
|
293 |
}
|
423 |
);
|
424 |
}
|
425 |
|
426 |
+
/**
|
427 |
+
* Variables workflow meta box
|
428 |
+
*
|
429 |
+
* @since 4.6.9
|
430 |
+
*/
|
431 |
+
public static function variables_metabox() {
|
432 |
+
ES_Workflow_Admin::get_view(
|
433 |
+
'meta-box-variables',
|
434 |
+
array(
|
435 |
+
'workflow' => self::$workflow,
|
436 |
+
)
|
437 |
+
);
|
438 |
+
}
|
439 |
+
|
440 |
/**
|
441 |
* Method to save workflow
|
442 |
*
|
lite/includes/workflows/admin/views/meta-box-variables.php
ADDED
@@ -0,0 +1,51 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
/**
|
3 |
+
* ES_Workflow object
|
4 |
+
*
|
5 |
+
* @var ES_Workflow $workflow
|
6 |
+
*/
|
7 |
+
|
8 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
9 |
+
exit;
|
10 |
+
}
|
11 |
+
|
12 |
+
?>
|
13 |
+
<div id="ig-es-variable-info-popup" style="display:none">
|
14 |
+
<div class="fixed flex inset-0 overflow-x-hidden overflow-y-auto z-50 flex justify-center w-full h-full" style="background-color: rgba(0,0,0,.5);">
|
15 |
+
<section class="absolute flex justify-center mx-auto md:mx-auto lg:mx-auto my-12 sm:my-12 lg:my-24">
|
16 |
+
<div
|
17 |
+
class="inline-block overflow-hidden text-left align-bottom transition-all transform bg-white rounded-lg shadow-xl sm:my-8 sm:align-middle sm:max-w-lg sm:w-full"
|
18 |
+
role="dialog"
|
19 |
+
aria-modal="true"
|
20 |
+
aria-labelledby="modal-headline"
|
21 |
+
>
|
22 |
+
<span class="ig-es-close-variable-info-popup cursor-pointer"><svg class="mt-1 w-6 h-6 text-red-500" fill="none" stroke="currentColor" viewBox="0 0 24 24" xmlns="http://www.w3.org/2000/svg"><path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M10 14l2-2m0 0l2-2m-2 2l-2-2m2 2l2 2m7-2a9 9 0 11-18 0 9 9 0 0118 0z"></path></svg></span>
|
23 |
+
<div id="ig-es-workflow-variable-info-body" class="px-4 pt-5 pb-4 bg-white sm:p-6 sm:pb-4">
|
24 |
+
</div>
|
25 |
+
</div>
|
26 |
+
</section>
|
27 |
+
</div>
|
28 |
+
</div>
|
29 |
+
<table class="ig-es-table">
|
30 |
+
<tr class="ig-es-table__row">
|
31 |
+
<td class="ig-es-table__col">
|
32 |
+
<div id="ig-es-workflow-variables-container" class="ig-es-workflow-variables-container">
|
33 |
+
<?php foreach ( IG_ES_Variables::get_list() as $data_type => $vars ) : ?>
|
34 |
+
<div class="ig-es-variables-group py-1" data-ig-es-variable-group="<?php echo esc_attr( $data_type ); ?>">
|
35 |
+
<?php foreach ( $vars as $variable => $file_path ) : ?>
|
36 |
+
<span class="ig-es-workflow-variable-outer inline-block items-center justify-center px-2 py-2 mr-2 mb-2 text-xs font-bold leading-none bg-gray-100 hover:bg-gray-300 rounded-full">
|
37 |
+
<span class="ig-es-workflow-variable cursor-pointer" data-ig-es-variable-slug="<?php echo esc_attr( $data_type . '.' . $variable ); ?>">
|
38 |
+
<?php echo esc_html( $data_type . '.' . $variable ); ?>
|
39 |
+
</span>
|
40 |
+
</span>
|
41 |
+
<?php endforeach; ?>
|
42 |
+
<hr>
|
43 |
+
</div>
|
44 |
+
<?php endforeach; ?>
|
45 |
+
<p class="js-ig-es-no-variables-message" style="display:none;">
|
46 |
+
<?php echo esc_html__( 'Sorry, no placeholder tags are available for this trigger', 'email-subscribers' ); ?>
|
47 |
+
</p>
|
48 |
+
</div>
|
49 |
+
</td>
|
50 |
+
</tr>
|
51 |
+
</table>
|
lite/includes/workflows/admin/views/modal-variable-info.php
ADDED
@@ -0,0 +1,79 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* IG_ES_Variable object
|
9 |
+
*
|
10 |
+
* @var IG_ES_Variable $variable
|
11 |
+
*/
|
12 |
+
|
13 |
+
?>
|
14 |
+
|
15 |
+
<div class="ig-es-modal__header text-center">
|
16 |
+
<h1><?php echo esc_html( $variable->get_name() ); ?></h1>
|
17 |
+
</div>
|
18 |
+
|
19 |
+
<div class="ig-es-modal__body">
|
20 |
+
<div class="ig-es-modal__body-inner pt-2">
|
21 |
+
|
22 |
+
<?php if ( $variable->get_description() ) : ?>
|
23 |
+
<p class="mb-2"><?php echo esc_html( $variable->get_description() ); ?></p>
|
24 |
+
<?php endif; ?>
|
25 |
+
|
26 |
+
<table class="ig-es-table ig-es-table--bordered ig-es-workflow-variable-parameters-table">
|
27 |
+
|
28 |
+
<?php foreach ( $variable->get_parameter_fields() as $field ) : ?>
|
29 |
+
|
30 |
+
<tr class="ig-es-table__row ig-es-workflow-variables-parameter-row"
|
31 |
+
data-parameter-name="<?php echo esc_attr( $field->get_name() ); ?>"
|
32 |
+
<?php
|
33 |
+
if ( isset( $field->meta['show'] ) ) :
|
34 |
+
?>
|
35 |
+
data-parameter-show="<?php echo esc_attr( $field->meta['show'] ); ?>"<?php endif; ?>
|
36 |
+
<?php echo ( $field->get_required() ? 'data-is-required="true"' : '' ); ?>
|
37 |
+
>
|
38 |
+
|
39 |
+
<td class="ig-es-table__col ig-es-table__col--label">
|
40 |
+
<strong><?php echo esc_html( $field->get_name() ); ?></strong>
|
41 |
+
<?php
|
42 |
+
if ( $field->get_required() ) :
|
43 |
+
?>
|
44 |
+
<span class="ig-es-required-asterisk"></span><?php endif; ?>
|
45 |
+
</td>
|
46 |
+
<td class="ig-es-table__col ig-es-table__col--field">
|
47 |
+
<?php $field->add_classes( 'ig-es-workflow-variable-parameter' ); ?>
|
48 |
+
<?php $field->render( '' ); ?>
|
49 |
+
<p class="field-desciption mb-2 text-xs italic font-normal leading-snug text-gray-500 helper">
|
50 |
+
<?php echo $field->get_description() ? esc_html( $field->get_description() ) : ''; ?>
|
51 |
+
</p>
|
52 |
+
</td>
|
53 |
+
</tr>
|
54 |
+
<?php endforeach; ?>
|
55 |
+
|
56 |
+
<?php if ( $variable->use_fallback ) : ?>
|
57 |
+
<tr class="ig-es-table__row">
|
58 |
+
<td class="ig-es-table__col ig-es-table__col--label">
|
59 |
+
<strong><?php echo esc_html__( 'Fallback', 'email-subscribers' ); ?></strong>
|
60 |
+
</td>
|
61 |
+
<td class="ig-es-table__col ig-es-table__col--field">
|
62 |
+
<input type="text" name="fallback" class="ig-es-field ig-es-field--type-text ig-es-workflow-variable-parameter">
|
63 |
+
<p class="field-desciption mb-2 text-xs italic font-normal leading-snug text-gray-500 helper">
|
64 |
+
<?php echo esc_html__( 'Entered text is displayed when there is no value found.', 'email-subscribers' ); ?>
|
65 |
+
</p>
|
66 |
+
</td>
|
67 |
+
</tr>
|
68 |
+
<?php endif; ?>
|
69 |
+
|
70 |
+
</table>
|
71 |
+
|
72 |
+
<div class="ig-es-workflow-variable-clipboard-form">
|
73 |
+
<div id="ig_es_workflow_variable_preview_field" class="ig-es-workflow-variable-preview-field w-full p-3 text-center mt-2 mb-2 bg-gray-100 ig-es-workflow-variable-preview-field" data-variable="<?php echo esc_attr( $variable->get_name() ); ?>">
|
74 |
+
</div>
|
75 |
+
<button type="button" class="ig-es-clipboard-btn w-full inline-flex justify-center rounded-md border border-transparent px-4 py-1 bg-white text-sm leading-5 font-medium text-white bg-indigo-600 hover:bg-indigo-500 focus:outline-none focus:shadow-outline-blue transition ease-in-out duration-150"><?php echo esc_html__( 'Copy to clipboard', 'email-subscribers' ); ?></button>
|
76 |
+
</div>
|
77 |
+
|
78 |
+
</div>
|
79 |
+
</div>
|
lite/includes/workflows/class-es-format.php
CHANGED
@@ -193,4 +193,23 @@ class ES_Format {
|
|
193 |
|
194 |
return $days[ $day ];
|
195 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
196 |
}
|
193 |
|
194 |
return $days[ $day ];
|
195 |
}
|
196 |
+
|
197 |
+
/**
|
198 |
+
* Format a price decimal value.
|
199 |
+
*
|
200 |
+
* Does NOT localize the decimal.
|
201 |
+
*
|
202 |
+
* @param float|string $number
|
203 |
+
* @param int $places
|
204 |
+
* @param bool $trim_zeros
|
205 |
+
*
|
206 |
+
* @return string
|
207 |
+
*/
|
208 |
+
public static function decimal( $number, $places = null, $trim_zeros = false ) {
|
209 |
+
if ( null === $places ) {
|
210 |
+
$places = wc_get_price_decimals();
|
211 |
+
}
|
212 |
+
|
213 |
+
return wc_format_decimal( $number, $places, $trim_zeros );
|
214 |
+
}
|
215 |
}
|
lite/includes/workflows/class-es-workflow-data-layer.php
CHANGED
@@ -104,6 +104,204 @@ class ES_Workflow_Data_Layer {
|
|
104 |
return $this->get_item( 'customer' );
|
105 |
}
|
106 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
107 |
|
108 |
/**
|
109 |
* Get cart object from data layer
|
104 |
return $this->get_item( 'customer' );
|
105 |
}
|
106 |
|
107 |
+
/**
|
108 |
+
* Gets the customer email based on the data layer.
|
109 |
+
*
|
110 |
+
* @return string
|
111 |
+
*/
|
112 |
+
public function get_customer_email() {
|
113 |
+
|
114 |
+
$customer_email = '';
|
115 |
+
$customer = $this->get_customer();
|
116 |
+
|
117 |
+
if ( $customer ) {
|
118 |
+
// If the customer has an account always use the account email over a order billing email
|
119 |
+
// The reason for this is that a customer could change their account email and their
|
120 |
+
// orders will not be updated.
|
121 |
+
$customer_email = $customer->get_email();
|
122 |
+
}
|
123 |
+
|
124 |
+
return $customer_email;
|
125 |
+
}
|
126 |
+
|
127 |
+
/**
|
128 |
+
* Gets the customer billing address 1.
|
129 |
+
*
|
130 |
+
* @return string
|
131 |
+
*/
|
132 |
+
public function get_customer_address_1() {
|
133 |
+
|
134 |
+
$prop = '';
|
135 |
+
$customer = $this->get_customer();
|
136 |
+
|
137 |
+
if ( $customer ) {
|
138 |
+
$prop = $customer->get_billing_address_1();
|
139 |
+
}
|
140 |
+
|
141 |
+
return $prop;
|
142 |
+
}
|
143 |
+
|
144 |
+
/**
|
145 |
+
* Gets the customer billing address 2.
|
146 |
+
*
|
147 |
+
* @return string
|
148 |
+
*/
|
149 |
+
public function get_customer_address_2() {
|
150 |
+
$prop = '';
|
151 |
+
$customer = $this->get_customer();
|
152 |
+
|
153 |
+
if ( $customer ) {
|
154 |
+
$prop = $customer->get_billing_address_2();
|
155 |
+
}
|
156 |
+
|
157 |
+
return $prop;
|
158 |
+
}
|
159 |
+
|
160 |
+
/**
|
161 |
+
* Gets the customer first name based on the data layer.
|
162 |
+
*
|
163 |
+
* @return string
|
164 |
+
*/
|
165 |
+
public function get_customer_first_name() {
|
166 |
+
$prop = '';
|
167 |
+
$customer = $this->get_customer();
|
168 |
+
|
169 |
+
if ( $customer ) {
|
170 |
+
$prop = $customer->get_first_name();
|
171 |
+
}
|
172 |
+
|
173 |
+
return $prop;
|
174 |
+
}
|
175 |
+
|
176 |
+
|
177 |
+
/**
|
178 |
+
* Gets the customer last name based on the data layer.
|
179 |
+
*
|
180 |
+
* @return string
|
181 |
+
*/
|
182 |
+
public function get_customer_last_name() {
|
183 |
+
$prop = '';
|
184 |
+
$customer = $this->get_customer();
|
185 |
+
|
186 |
+
if ( $customer ) {
|
187 |
+
$prop = $customer->get_last_name();
|
188 |
+
}
|
189 |
+
|
190 |
+
return $prop;
|
191 |
+
}
|
192 |
+
|
193 |
+
|
194 |
+
/**
|
195 |
+
* Gets the customer full name based on the data layer.
|
196 |
+
*
|
197 |
+
* @return string
|
198 |
+
*/
|
199 |
+
public function get_customer_full_name() {
|
200 |
+
/* translators: 1. Customer first name 2. Customer last name */
|
201 |
+
return trim( sprintf( _x( '%1$s %2$s', 'full name', 'email-subscribers' ), $this->get_customer_first_name(), $this->get_customer_last_name() ) );
|
202 |
+
}
|
203 |
+
|
204 |
+
|
205 |
+
/**
|
206 |
+
* Gets the customer billing phone.
|
207 |
+
* Doesn't parse or format.
|
208 |
+
*
|
209 |
+
* @return string
|
210 |
+
*/
|
211 |
+
public function get_customer_phone() {
|
212 |
+
$prop = '';
|
213 |
+
$customer = $this->get_customer();
|
214 |
+
|
215 |
+
if ( $customer ) {
|
216 |
+
$prop = $customer->get_billing_phone();
|
217 |
+
}
|
218 |
+
|
219 |
+
return $prop;
|
220 |
+
}
|
221 |
+
|
222 |
+
|
223 |
+
/**
|
224 |
+
* Gets the customer billing company.
|
225 |
+
*
|
226 |
+
* @return string
|
227 |
+
*/
|
228 |
+
public function get_customer_company() {
|
229 |
+
$prop = '';
|
230 |
+
$customer = $this->get_customer();
|
231 |
+
|
232 |
+
if ( $customer ) {
|
233 |
+
$prop = $customer->get_billing_company();
|
234 |
+
}
|
235 |
+
|
236 |
+
return $prop;
|
237 |
+
}
|
238 |
+
|
239 |
+
|
240 |
+
/**
|
241 |
+
* Gets the customer billing country code.
|
242 |
+
*
|
243 |
+
* @return string
|
244 |
+
*/
|
245 |
+
public function get_customer_country() {
|
246 |
+
$prop = '';
|
247 |
+
$customer = $this->get_customer();
|
248 |
+
|
249 |
+
if ( $customer ) {
|
250 |
+
$prop = $customer->get_billing_country();
|
251 |
+
}
|
252 |
+
|
253 |
+
return $prop;
|
254 |
+
}
|
255 |
+
|
256 |
+
|
257 |
+
/**
|
258 |
+
* Gets the customer billing state.
|
259 |
+
*
|
260 |
+
* @return string
|
261 |
+
*/
|
262 |
+
public function get_customer_state() {
|
263 |
+
$prop = '';
|
264 |
+
$customer = $this->get_customer();
|
265 |
+
|
266 |
+
if ( $customer ) {
|
267 |
+
$prop = $customer->get_billing_state();
|
268 |
+
}
|
269 |
+
|
270 |
+
return $prop;
|
271 |
+
}
|
272 |
+
|
273 |
+
|
274 |
+
/**
|
275 |
+
* Gets the customer billing city.
|
276 |
+
*
|
277 |
+
* @return string
|
278 |
+
*/
|
279 |
+
public function get_customer_city() {
|
280 |
+
$prop = '';
|
281 |
+
$customer = $this->get_customer();
|
282 |
+
|
283 |
+
if ( $customer ) {
|
284 |
+
$prop = $customer->get_billing_city();
|
285 |
+
}
|
286 |
+
|
287 |
+
return $prop;
|
288 |
+
}
|
289 |
+
|
290 |
+
/**
|
291 |
+
* Gets the customer billing postcode.
|
292 |
+
*
|
293 |
+
* @return string
|
294 |
+
*/
|
295 |
+
public function get_customer_postcode() {
|
296 |
+
$prop = '';
|
297 |
+
$customer = $this->get_customer();
|
298 |
+
|
299 |
+
if ( $customer ) {
|
300 |
+
$prop = $customer->get_billing_postcode();
|
301 |
+
}
|
302 |
+
|
303 |
+
return $prop;
|
304 |
+
}
|
305 |
|
306 |
/**
|
307 |
* Get cart object from data layer
|
lite/includes/workflows/class-es-workflow-data-types.php
CHANGED
@@ -62,4 +62,13 @@ class ES_Workflow_Data_Types extends ES_Workflow_Registry {
|
|
62 |
public static function after_loaded( $data_type_id, $data_type ) {
|
63 |
$data_type->set_id( $data_type_id );
|
64 |
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
65 |
}
|
62 |
public static function after_loaded( $data_type_id, $data_type ) {
|
63 |
$data_type->set_id( $data_type_id );
|
64 |
}
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Get non supported data types
|
68 |
+
*
|
69 |
+
* @return array
|
70 |
+
*/
|
71 |
+
public static function get_non_stored_data_types() {
|
72 |
+
return array( 'shop' );
|
73 |
+
}
|
74 |
}
|
lite/includes/workflows/class-es-workflow.php
CHANGED
@@ -230,6 +230,20 @@ class ES_Workflow {
|
|
230 |
return $this->created_at;
|
231 |
}
|
232 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
233 |
/**
|
234 |
* Get workflow data layer object.
|
235 |
*
|
@@ -741,18 +755,6 @@ class ES_Workflow {
|
|
741 |
return ES_Clean::string( $this->trigger_name );
|
742 |
}
|
743 |
|
744 |
-
/**
|
745 |
-
* Set the trigger for the workflow.
|
746 |
-
*
|
747 |
-
* @since 4.4.0
|
748 |
-
*
|
749 |
-
* @param $trigger_name
|
750 |
-
*/
|
751 |
-
public function set_trigger_name( $trigger_name ) {
|
752 |
-
$this->update_meta( 'trigger_name', ES_Clean::string( $trigger_name ) );
|
753 |
-
unset( $this->trigger );
|
754 |
-
}
|
755 |
-
|
756 |
/**
|
757 |
* Get the workflow trigger options.
|
758 |
* Values will be sanitized as per the fields set on the trigger object.
|
@@ -986,10 +988,9 @@ class ES_Workflow {
|
|
986 |
* Get workflow meta data from meta key.
|
987 |
*
|
988 |
* @param $key
|
989 |
-
* @param bool $single
|
990 |
* @return mixed
|
991 |
*/
|
992 |
-
public function get_meta( $key
|
993 |
return isset( $this->meta[ $key ] ) ? $this->meta[ $key ] : '';
|
994 |
}
|
995 |
|
230 |
return $this->created_at;
|
231 |
}
|
232 |
|
233 |
+
/**
|
234 |
+
* Get variable processor object
|
235 |
+
*
|
236 |
+
* @return IG_ES_Variables_Processor
|
237 |
+
*/
|
238 |
+
public function variable_processor() {
|
239 |
+
|
240 |
+
if ( ! isset( $this->variable_processor ) ) {
|
241 |
+
$this->variable_processor = new IG_ES_Variables_Processor( $this );
|
242 |
+
}
|
243 |
+
|
244 |
+
return $this->variable_processor;
|
245 |
+
}
|
246 |
+
|
247 |
/**
|
248 |
* Get workflow data layer object.
|
249 |
*
|
755 |
return ES_Clean::string( $this->trigger_name );
|
756 |
}
|
757 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
758 |
/**
|
759 |
* Get the workflow trigger options.
|
760 |
* Values will be sanitized as per the fields set on the trigger object.
|
988 |
* Get workflow meta data from meta key.
|
989 |
*
|
990 |
* @param $key
|
|
|
991 |
* @return mixed
|
992 |
*/
|
993 |
+
public function get_meta( $key ) {
|
994 |
return isset( $this->meta[ $key ] ) ? $this->meta[ $key ] : '';
|
995 |
}
|
996 |
|
lite/includes/workflows/class-es-workflows-table.php
CHANGED
@@ -84,7 +84,7 @@ class ES_Workflows_Table extends ES_List_Table {
|
|
84 |
}
|
85 |
|
86 |
/**
|
87 |
-
* Render Workflows
|
88 |
*
|
89 |
* @since 4.4.1
|
90 |
*/
|
84 |
}
|
85 |
|
86 |
/**
|
87 |
+
* Render Workflows list | Save/Edit Workflow page
|
88 |
*
|
89 |
* @since 4.4.1
|
90 |
*/
|
lite/includes/workflows/class-ig-es-replace-helper.php
ADDED
@@ -0,0 +1,87 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Class to extract placeholder tags from given string
|
5 |
+
*
|
6 |
+
* @class IG_ES_Replace_Helper
|
7 |
+
*/
|
8 |
+
class IG_ES_Replace_Helper {
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Search patterns
|
12 |
+
*
|
13 |
+
* @var array
|
14 |
+
*/
|
15 |
+
public $patterns = array(
|
16 |
+
'variables' => array(
|
17 |
+
'match' => 1,
|
18 |
+
'expression' => '/{{(.*?)}}/'
|
19 |
+
)
|
20 |
+
);
|
21 |
+
|
22 |
+
/**
|
23 |
+
* Pattern to search
|
24 |
+
*
|
25 |
+
* @var string
|
26 |
+
*/
|
27 |
+
public $selected_pattern;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* Pattern string
|
31 |
+
* @var string
|
32 |
+
*/
|
33 |
+
public $string;
|
34 |
+
|
35 |
+
/**
|
36 |
+
* Callback for preg_replace_callback function
|
37 |
+
*
|
38 |
+
* @var callable */
|
39 |
+
public $callback;
|
40 |
+
|
41 |
+
|
42 |
+
/**
|
43 |
+
* Constructor
|
44 |
+
*
|
45 |
+
* @param $string
|
46 |
+
* @param callable $callback
|
47 |
+
* @param string $pattern_name
|
48 |
+
*/
|
49 |
+
public function __construct( $string, $callback, $pattern_name = '' ) {
|
50 |
+
|
51 |
+
$this->string = $string;
|
52 |
+
$this->callback = $callback;
|
53 |
+
|
54 |
+
if ( $pattern_name && isset( $this->patterns[$pattern_name] ) ) {
|
55 |
+
$this->selected_pattern = $this->patterns[$pattern_name];
|
56 |
+
}
|
57 |
+
}
|
58 |
+
|
59 |
+
|
60 |
+
/**
|
61 |
+
* Process passed string against selected regular expression
|
62 |
+
*
|
63 |
+
* @return mixed
|
64 |
+
*/
|
65 |
+
public function process() {
|
66 |
+
|
67 |
+
if ( ! $this->selected_pattern ) {
|
68 |
+
return false;
|
69 |
+
}
|
70 |
+
|
71 |
+
return preg_replace_callback( $this->selected_pattern['expression'], array( $this, 'callback' ) , $this->string );
|
72 |
+
}
|
73 |
+
|
74 |
+
|
75 |
+
/**
|
76 |
+
* Pre process match before using the actual callback
|
77 |
+
* @param $match
|
78 |
+
* @return string
|
79 |
+
*/
|
80 |
+
public function callback( $match ) {
|
81 |
+
if ( is_array( $match ) ) {
|
82 |
+
$match = $match[ $this->selected_pattern['match'] ];
|
83 |
+
}
|
84 |
+
return call_user_func( $this->callback, $match );
|
85 |
+
}
|
86 |
+
|
87 |
+
}
|
lite/includes/workflows/class-ig-es-variables-processor.php
ADDED
@@ -0,0 +1,191 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
/**
|
4 |
+
* Process variables into values. Is used on workflows and action options.
|
5 |
+
*
|
6 |
+
* @class Variable_Processor
|
7 |
+
*/
|
8 |
+
class IG_ES_Variables_Processor {
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Workflow object
|
12 |
+
*
|
13 |
+
* @var Workflow
|
14 |
+
*/
|
15 |
+
public $workflow;
|
16 |
+
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Class constructor
|
20 |
+
*
|
21 |
+
* @param $workflow
|
22 |
+
*/
|
23 |
+
public function __construct( $workflow ) {
|
24 |
+
$this->workflow = $workflow;
|
25 |
+
}
|
26 |
+
|
27 |
+
|
28 |
+
/**
|
29 |
+
* Process field's value for placeholder tags
|
30 |
+
*
|
31 |
+
* @param $text string
|
32 |
+
* @param bool $allow_html
|
33 |
+
* @return string
|
34 |
+
*/
|
35 |
+
public function process_field( $text, $allow_html = false ) {
|
36 |
+
|
37 |
+
$replacer = new IG_ES_Replace_Helper( $text, array( $this, 'callback_process_field' ), 'variables' );
|
38 |
+
$value = $replacer->process();
|
39 |
+
|
40 |
+
if ( ! $allow_html ) {
|
41 |
+
$value = html_entity_decode( wp_strip_all_tags( $value ) );
|
42 |
+
}
|
43 |
+
|
44 |
+
return $value;
|
45 |
+
}
|
46 |
+
|
47 |
+
|
48 |
+
/**
|
49 |
+
* Callback public function to process a variable string.
|
50 |
+
*
|
51 |
+
* @param string $string
|
52 |
+
*
|
53 |
+
* @return string
|
54 |
+
*/
|
55 |
+
public function callback_process_field( $string ) {
|
56 |
+
|
57 |
+
$string = $this->sanitize( $string );
|
58 |
+
|
59 |
+
if ( self::is_excluded( $string ) ) {
|
60 |
+
return '{{' . $string . '}}';
|
61 |
+
}
|
62 |
+
|
63 |
+
$variable = self::parse_variable( $string );
|
64 |
+
|
65 |
+
if ( ! $variable ) {
|
66 |
+
return '';
|
67 |
+
}
|
68 |
+
|
69 |
+
$parameters = $variable->parameters;
|
70 |
+
$value = $this->get_variable_value( $variable->type, $variable->field, $parameters );
|
71 |
+
$value = (string) apply_filters( 'ig_es_variables_after_get_value', $value, $variable->type, $variable->field, $parameters, $this->workflow );
|
72 |
+
|
73 |
+
if ( '' === $value ) {
|
74 |
+
// backwards compatibility
|
75 |
+
if ( isset( $parameters['default'] ) ) {
|
76 |
+
$parameters['fallback'] = $parameters['default'];
|
77 |
+
}
|
78 |
+
|
79 |
+
// show default if set and no real value
|
80 |
+
if ( isset( $parameters['fallback'] ) ) {
|
81 |
+
$value = $parameters['fallback'];
|
82 |
+
}
|
83 |
+
}
|
84 |
+
|
85 |
+
return $value;
|
86 |
+
}
|
87 |
+
|
88 |
+
|
89 |
+
/**
|
90 |
+
* Get related variable which handles parsing of placeholder string
|
91 |
+
*
|
92 |
+
* @param $string
|
93 |
+
* @return IG_ES_Workflow_Variable_Parser|bool
|
94 |
+
*/
|
95 |
+
public static function parse_variable( $string ) {
|
96 |
+
$variable = new IG_ES_Workflow_Variable_Parser();
|
97 |
+
if ( $variable->parse( $string ) ) {
|
98 |
+
return $variable;
|
99 |
+
}
|
100 |
+
return false;
|
101 |
+
}
|
102 |
+
|
103 |
+
/**
|
104 |
+
* Get the value of a variable.
|
105 |
+
*
|
106 |
+
* @param string $data_type
|
107 |
+
* @param string $data_field
|
108 |
+
* @param array $parameters
|
109 |
+
*
|
110 |
+
* @return string
|
111 |
+
*/
|
112 |
+
public function get_variable_value( $data_type, $data_field, $parameters = array() ) {
|
113 |
+
|
114 |
+
// Short circuit filter for the variable value
|
115 |
+
$short_circuit = (string) apply_filters( 'ig_es_text_variable_value', false, $data_type, $data_field );
|
116 |
+
|
117 |
+
if ( $short_circuit ) {
|
118 |
+
return $short_circuit;
|
119 |
+
}
|
120 |
+
|
121 |
+
$variable_name = "$data_type.$data_field";
|
122 |
+
$variable = IG_ES_Variables::get_variable( $variable_name );
|
123 |
+
|
124 |
+
$value = '';
|
125 |
+
|
126 |
+
if ( method_exists( $variable, 'get_value' ) ) {
|
127 |
+
|
128 |
+
if ( in_array( $data_type, ES_Workflow_Data_Types::get_non_stored_data_types(), true ) ) {
|
129 |
+
$value = $variable->get_value( $parameters, $this->workflow );
|
130 |
+
} else {
|
131 |
+
$data_item = $this->workflow->get_data_item( $variable->get_data_type() );
|
132 |
+
if ( $data_item ) {
|
133 |
+
$value = $variable->get_value( $data_item, $parameters, $this->workflow );
|
134 |
+
}
|
135 |
+
}
|
136 |
+
}
|
137 |
+
|
138 |
+
return (string) apply_filters( 'ig_es_get_variable_value', (string) $value, $this, $variable );
|
139 |
+
}
|
140 |
+
|
141 |
+
|
142 |
+
/**
|
143 |
+
* Based on sanitize_title()
|
144 |
+
*
|
145 |
+
* @param $string
|
146 |
+
* @return mixed|string
|
147 |
+
*/
|
148 |
+
public static function sanitize( $string ) {
|
149 |
+
|
150 |
+
// remove style and script tags
|
151 |
+
$string = wp_strip_all_tags( $string, true );
|
152 |
+
$string = remove_accents( $string );
|
153 |
+
|
154 |
+
// remove unicode white spaces
|
155 |
+
$string = preg_replace( "#\x{00a0}#siu", ' ', $string );
|
156 |
+
|
157 |
+
$string = trim($string);
|
158 |
+
|
159 |
+
return $string;
|
160 |
+
}
|
161 |
+
|
162 |
+
|
163 |
+
/**
|
164 |
+
* Certain variables can be excluded from processing.
|
165 |
+
* Currently only {{ unsubscribe_url }}
|
166 |
+
*
|
167 |
+
* @param string $variable
|
168 |
+
* @return bool
|
169 |
+
*/
|
170 |
+
public static function is_excluded( $variable ) {
|
171 |
+
|
172 |
+
$excluded = apply_filters('ig_es_variables_processor_excluded', array(
|
173 |
+
'EMAIL',
|
174 |
+
'NAME',
|
175 |
+
'FIRSTNAME',
|
176 |
+
'LASTNAME',
|
177 |
+
'LINK',
|
178 |
+
'SUBSCRIBE-LINK',
|
179 |
+
'UNSUBSCRIBE-LINK',
|
180 |
+
'TOTAL-CONTACTS',
|
181 |
+
'GROUP',
|
182 |
+
'LIST',
|
183 |
+
'SITENAME',
|
184 |
+
'SITEURL',
|
185 |
+
));
|
186 |
+
|
187 |
+
return in_array( $variable, $excluded );
|
188 |
+
}
|
189 |
+
|
190 |
+
}
|
191 |
+
|
lite/includes/workflows/class-ig-es-variables.php
ADDED
@@ -0,0 +1,125 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Class to include registered workflow variables
|
9 |
+
*
|
10 |
+
* @class IG_ES_Variables
|
11 |
+
*/
|
12 |
+
class IG_ES_Variables {
|
13 |
+
|
14 |
+
/**
|
15 |
+
* List of already loaded variables in variable name => variable class object format
|
16 |
+
* This helps in removing the need of recreating the class object
|
17 |
+
*
|
18 |
+
* @var array
|
19 |
+
*/
|
20 |
+
private static $loaded_variables = array();
|
21 |
+
|
22 |
+
/**
|
23 |
+
* List of registered workflow variables in [variable_data_type][variable_field] => path to variable file format
|
24 |
+
*
|
25 |
+
* @var array
|
26 |
+
*/
|
27 |
+
private static $variables_list;
|
28 |
+
|
29 |
+
/**
|
30 |
+
* List of registered workflow variables in [variable_data_type] => [variable_field] format
|
31 |
+
*
|
32 |
+
* @var array
|
33 |
+
*/
|
34 |
+
private static $included_variables = array();
|
35 |
+
|
36 |
+
|
37 |
+
/**
|
38 |
+
* Get registered workflow variables list in [variable_data_type][variable_field] => path to variable file format
|
39 |
+
*
|
40 |
+
* @return array
|
41 |
+
*/
|
42 |
+
public static function get_list() {
|
43 |
+
// cache the list after first generation
|
44 |
+
if ( isset( self::$variables_list ) ) {
|
45 |
+
return self::$variables_list;
|
46 |
+
}
|
47 |
+
|
48 |
+
$variables = array();
|
49 |
+
$included_variables = self::$included_variables;
|
50 |
+
|
51 |
+
if ( ! empty( $included_variables ) ) {
|
52 |
+
// generate paths to included variables
|
53 |
+
foreach ( $included_variables as $data_type => $fields ) {
|
54 |
+
foreach ( $fields as $field ) {
|
55 |
+
$filename = str_replace( '_', '-', $data_type ) . '-' . str_replace( '_', '-', $field ) . '.php';
|
56 |
+
$variables[$data_type][$field] = ES_PLUGIN_DIR . 'lite/includes/workflows/variables/' . $filename;
|
57 |
+
}
|
58 |
+
}
|
59 |
+
}
|
60 |
+
|
61 |
+
self::$variables_list = apply_filters( 'ig_es_workflow_variables', $variables );
|
62 |
+
return self::$variables_list;
|
63 |
+
}
|
64 |
+
|
65 |
+
|
66 |
+
/**
|
67 |
+
* Get path to file which handles variable
|
68 |
+
*
|
69 |
+
* @param $data_type
|
70 |
+
* @param $data_field
|
71 |
+
* @return false|string
|
72 |
+
*/
|
73 |
+
public static function get_path_to_variable( $data_type, $data_field ) {
|
74 |
+
|
75 |
+
$list = self::get_list();
|
76 |
+
|
77 |
+
if ( isset( $list[$data_type][$data_field] ) ) {
|
78 |
+
return $list[$data_type][$data_field];
|
79 |
+
}
|
80 |
+
|
81 |
+
return false;
|
82 |
+
}
|
83 |
+
|
84 |
+
|
85 |
+
/**
|
86 |
+
* Get variable object based on variable name
|
87 |
+
* e.g. returns IG_ES_Variable_WC_Order_ID class object if variable name is wc_order.id
|
88 |
+
*
|
89 |
+
* @param $variable_name string
|
90 |
+
* @return IG_ES_Variable|false
|
91 |
+
*/
|
92 |
+
public static function get_variable( $variable_name ) {
|
93 |
+
|
94 |
+
if ( isset( self::$loaded_variables[$variable_name] ) ) {
|
95 |
+
return self::$loaded_variables[$variable_name];
|
96 |
+
}
|
97 |
+
|
98 |
+
list( $data_type, $data_field ) = explode( '.', $variable_name );
|
99 |
+
|
100 |
+
$path = self::get_path_to_variable( $data_type, $data_field );
|
101 |
+
|
102 |
+
if ( ! file_exists( $path ) ) {
|
103 |
+
|
104 |
+
if ( ! file_exists( $path ) ) {
|
105 |
+
return false;
|
106 |
+
}
|
107 |
+
}
|
108 |
+
|
109 |
+
/**
|
110 |
+
* Variable class object
|
111 |
+
* @var IG_ES_Variable $variable_object
|
112 |
+
*/
|
113 |
+
$variable_object = require_once $path;
|
114 |
+
|
115 |
+
if ( ! $variable_object ) {
|
116 |
+
return false;
|
117 |
+
}
|
118 |
+
|
119 |
+
$variable_object->setup( $variable_name );
|
120 |
+
|
121 |
+
self::$loaded_variables[$variable_name] = $variable_object;
|
122 |
+
|
123 |
+
return $variable_object;
|
124 |
+
}
|
125 |
+
}
|
lite/includes/workflows/class-ig-es-workflow-variable-parser.php
ADDED
@@ -0,0 +1,119 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
|
3 |
+
if ( ! defined( 'ABSPATH' ) ) {
|
4 |
+
exit;
|
5 |
+
}
|
6 |
+
|
7 |
+
/**
|
8 |
+
* Class to parse a variable string into separate usable parts
|
9 |
+
*
|
10 |
+
* @class IG_ES_Workflow_Variable_Parser
|
11 |
+
*/
|
12 |
+
class IG_ES_Workflow_Variable_Parser {
|
13 |
+
|
14 |
+
/**
|
15 |
+
* Variable name
|
16 |
+
* e.g. wc_order.id, cart.link, user.first_name etc
|
17 |
+
*
|
18 |
+
*
|
19 |
+
* @var string
|
20 |
+
*/
|
21 |
+
public $name;
|
22 |
+
|
23 |
+
/**
|
24 |
+
* Variable data type
|
25 |
+
* e.g. wc_order, cart, user etc
|
26 |
+
*
|
27 |
+
* @var string
|
28 |
+
*/
|
29 |
+
public $type;
|
30 |
+
|
31 |
+
/**
|
32 |
+
* Variable field name
|
33 |
+
* e.g. id in wc_order.id, link in cart.link, first_name in user.first_name etc
|
34 |
+
*
|
35 |
+
* @var string
|
36 |
+
*/
|
37 |
+
public $field;
|
38 |
+
|
39 |
+
/**
|
40 |
+
* Extra parameters attributes passed in placeholder string
|
41 |
+
* * e.g. array( 'fallback' => 'test' ) in {{ comment.id | fallback: 'test' }}
|
42 |
+
*
|
43 |
+
* @var array
|
44 |
+
*/
|
45 |
+
public $parameters;
|
46 |
+
|
47 |
+
/**
|
48 |
+
* Actual paramter string
|
49 |
+
* e.g. fallback: 'test' in {{ comment.id | fallback: 'test' }}
|
50 |
+
*
|
51 |
+
* @var string */
|
52 |
+
public $parameter_string;
|
53 |
+
|
54 |
+
|
55 |
+
/**
|
56 |
+
* Returns true on successful parsing
|
57 |
+
*
|
58 |
+
* @param $variable_string
|
59 |
+
* @return bool
|
60 |
+
*/
|
61 |
+
public function parse( $variable_string ) {
|
62 |
+
|
63 |
+
$matches = array();
|
64 |
+
$parameters = array();
|
65 |
+
|
66 |
+
// extract the variable name (first part) of the variable string, e.g. 'customer.email'
|
67 |
+
preg_match('/([a-z._0-9])+/', $variable_string, $matches, PREG_OFFSET_CAPTURE );
|
68 |
+
|
69 |
+
if ( ! $matches ) {
|
70 |
+
return false;
|
71 |
+
}
|
72 |
+
|
73 |
+
$name = $matches[0][0];
|
74 |
+
|
75 |
+
// the name must contain a period
|
76 |
+
if ( ! strstr( $name, '.' ) ) {
|
77 |
+
return false;
|
78 |
+
}
|
79 |
+
|
80 |
+
list( $type, $field ) = explode( '.', $name, 2 );
|
81 |
+
|
82 |
+
$parameter_string = trim( substr( $variable_string, $matches[1][1] + 1 ) );
|
83 |
+
$parameter_string = trim( ig_es_str_replace_first_match( $parameter_string, '|' ) ); // remove pipe
|
84 |
+
|
85 |
+
$parameters_split = preg_split('/(,)(?=(?:[^\']|\'[^\']*\')*$)/', $parameter_string );
|
86 |
+
|
87 |
+
foreach ( $parameters_split as $parameter ) {
|
88 |
+
if ( ! strstr( $parameter, ':' ) ) {
|
89 |
+
continue;
|
90 |
+
}
|
91 |
+
|
92 |
+
list( $key, $value ) = explode( ':', $parameter, 2 );
|
93 |
+
|
94 |
+
$key = ES_Clean::string( $key );
|
95 |
+
$value = ES_Clean::string( $this->unquote( $value ) );
|
96 |
+
|
97 |
+
$parameters[ $key ] = $value;
|
98 |
+
}
|
99 |
+
|
100 |
+
$this->name = $name;
|
101 |
+
$this->type = $type;
|
102 |
+
$this->field = $field;
|
103 |
+
$this->parameters = $parameters;
|
104 |
+
$this->parameter_string = $parameter_string;
|
105 |
+
|
106 |
+
return true;
|
107 |
+
|
108 |
+
}
|
109 |
+
|
110 |
+
|
111 |
+
/**
|
112 |
+
* Remove single quotes from start and end of a string
|
113 |
+
* @param $string
|
114 |
+
* @return string
|
115 |
+
*/
|
116 |
+
private function unquote( $string ) {
|
117 |
+
return trim( trim( $string ), "'" );
|
118 |
+
}
|
119 |
+
}
|
lite/includes/workflows/workflow-helper-functions.php
CHANGED
@@ -87,3 +87,65 @@ function ig_es_generate_key( $length = 25, $case_sensitive = true, $more_numbers
|
|
87 |
return $password;
|
88 |
}
|
89 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
87 |
return $password;
|
88 |
}
|
89 |
|
90 |
+
/**
|
91 |
+
* str_replace but limited to one replacement
|
92 |
+
* @param string$subject
|
93 |
+
* @param string$find
|
94 |
+
* @param string $replace
|
95 |
+
* @return string
|
96 |
+
*/
|
97 |
+
function ig_es_str_replace_first_match( $subject, $find, $replace = '' ) {
|
98 |
+
$pos = strpos($subject, $find);
|
99 |
+
if ( false !== $pos ) {
|
100 |
+
return substr_replace($subject, $replace, $pos, strlen($find));
|
101 |
+
}
|
102 |
+
return $subject;
|
103 |
+
}
|
104 |
+
|
105 |
+
/**
|
106 |
+
* Get country name from country code
|
107 |
+
*
|
108 |
+
* @param string $country_code
|
109 |
+
* @return string|bool
|
110 |
+
*
|
111 |
+
* @since 4.6.9
|
112 |
+
*/
|
113 |
+
function ig_es_get_country_name( $country_code ) {
|
114 |
+
$countries = WC()->countries->get_countries();
|
115 |
+
return isset( $countries[ $country_code ] ) ? $countries[ $country_code ] : false;
|
116 |
+
}
|
117 |
+
|
118 |
+
/**
|
119 |
+
* Get state name from country and state code
|
120 |
+
*
|
121 |
+
* @param string $country_code
|
122 |
+
* @param string $state_code
|
123 |
+
* @return string|bool
|
124 |
+
*
|
125 |
+
* @since 4.6.9
|
126 |
+
*/
|
127 |
+
function ig_es_get_state_name( $country_code, $state_code ) {
|
128 |
+
$states = WC()->countries->get_states( $country_code );
|
129 |
+
return isset( $states[ $state_code ] ) ? $states[ $state_code ] : false;
|
130 |
+
}
|
131 |
+
|
132 |
+
/**
|
133 |
+
* Get product image
|
134 |
+
*
|
135 |
+
* @param WC_Product $product
|
136 |
+
* @param string $size
|
137 |
+
* @return array|false|string
|
138 |
+
*
|
139 |
+
* @since 4.6.9
|
140 |
+
*/
|
141 |
+
function ig_es_get_wc_product_image_url( $product, $size = 'shop_catalog' ) {
|
142 |
+
|
143 |
+
$image_id = $product->get_image_id();
|
144 |
+
if ( $image_id ) {
|
145 |
+
$image_url = wp_get_attachment_image_url( $image_id, $size );
|
146 |
+
return apply_filters( 'ig_es_email_product_image_src', $image_url, $size, $product );
|
147 |
+
} else {
|
148 |
+
$image_url = wc_placeholder_img_src( $size );
|
149 |
+
return apply_filters( 'ig_es_email_product_placeholder_image_src', $image_url, $size, $product );
|
150 |
+
}
|
151 |
+
}
|
readme.txt
CHANGED
@@ -6,7 +6,7 @@ Tags: email marketing, subscription, autoresponder, post notification, welcome e
|
|
6 |
Requires at least: 3.9
|
7 |
Tested up to: 5.6
|
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,12 @@ Refer [here](https://www.icegram.com/documentation/es-faq/).
|
|
304 |
|
305 |
== Changelog ==
|
306 |
|
|
|
|
|
|
|
|
|
|
|
|
|
307 |
**4.6.8 (01.02.2021)**
|
308 |
|
309 |
* New: Allow subscribers to provide feedback for unsubscription [PRO]
|
6 |
Requires at least: 3.9
|
7 |
Tested up to: 5.6
|
8 |
Requires PHP: 5.6
|
9 |
+
Stable tag: 4.6.9
|
10 |
License: GPLv3
|
11 |
License URI: http://www.gnu.org/licenses
|
12 |
|
304 |
|
305 |
== Changelog ==
|
306 |
|
307 |
+
**4.6.9 (05.02.2021)**
|
308 |
+
|
309 |
+
* New: Added placeholder keyword support for WooCommerce [PRO]
|
310 |
+
* New: Added abandoned cart recovery related triggers [PRO]
|
311 |
+
* Update: Improve campaign reports
|
312 |
+
|
313 |
**4.6.8 (01.02.2021)**
|
314 |
|
315 |
* New: Allow subscribers to provide feedback for unsubscription [PRO]
|