Email Subscribers & Newsletters - Version 4.6.9

Version Description

Download this release

Release Info

Developer Icegram
Plugin Icon 128x128 Email Subscribers & Newsletters
Version 4.6.9
Comparing to
See all releases

Code changes from version 4.6.8 to 4.6.9

Files changed (32) hide show
  1. email-subscribers.php +2 -2
  2. lite/admin/class-email-subscribers-admin.php +8 -0
  3. lite/admin/css/email-subscribers-admin.css +10 -0
  4. lite/admin/dist/main.css +1 -1
  5. lite/admin/js/clipboard.js +973 -0
  6. lite/admin/js/ig-es-workflows-variables.js +170 -0
  7. lite/admin/js/ig-es-workflows.js +37 -1
  8. lite/includes/class-email-subscribers.php +8 -1
  9. lite/includes/class-es-install.php +6 -0
  10. lite/includes/classes/class-es-reports-table.php +60 -36
  11. lite/includes/classes/class-ig-es-wc-session-tracker.php +2 -2
  12. lite/includes/db/class-es-db-actions.php +4 -3
  13. lite/includes/db/class-ig-es-db-wc-guest.php +44 -0
  14. lite/includes/es-core-functions.php +1 -1
  15. lite/includes/upgrade/es-update-functions.php +29 -0
  16. lite/includes/workflows/abstracts/class-es-workflow-action.php +9 -1
  17. lite/includes/workflows/abstracts/class-ig-es-workflow-variable.php +203 -0
  18. lite/includes/workflows/admin/class-es-workflow-admin-ajax.php +18 -0
  19. lite/includes/workflows/admin/class-es-workflow-admin-edit.php +43 -0
  20. lite/includes/workflows/admin/views/meta-box-variables.php +51 -0
  21. lite/includes/workflows/admin/views/modal-variable-info.php +79 -0
  22. lite/includes/workflows/class-es-format.php +19 -0
  23. lite/includes/workflows/class-es-workflow-data-layer.php +198 -0
  24. lite/includes/workflows/class-es-workflow-data-types.php +9 -0
  25. lite/includes/workflows/class-es-workflow.php +15 -14
  26. lite/includes/workflows/class-es-workflows-table.php +1 -1
  27. lite/includes/workflows/class-ig-es-replace-helper.php +87 -0
  28. lite/includes/workflows/class-ig-es-variables-processor.php +191 -0
  29. lite/includes/workflows/class-ig-es-variables.php +125 -0
  30. lite/includes/workflows/class-ig-es-workflow-variable-parser.php +119 -0
  31. lite/includes/workflows/workflow-helper-functions.php +62 -0
  32. 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.8
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.8' );
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=" py-3 pl-6 es_reports_table_header"><?php esc_html_e( 'Status', 'email-subscribers' ); ?></th>
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=" py-3 pl-6 es_reports_table_header"><?php esc_html_e( 'Viewed Date', 'email-subscribers' ); ?></th>
128
  </tr>
129
 
130
  <?php
131
  }
132
 
133
- public function view_list( $id ) {
134
- $emails = ES_DB_Sending_Queue::get_emails_by_hash( $id );
135
- $email_viewed_count = ES_DB_Sending_Queue::get_viewed_count_by_hash( $id );
136
- $total_email_sent = ES_DB_Sending_Queue::get_total_email_count_by_hash( $id );
 
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', $id, $emails );
144
  }
145
  ?>
146
  <div class="wrap">
147
- <div class="mt-6 mb-2 max-w-7xl">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
- </div>
156
-
157
- <div class="mt-2 mb-2 block">
158
- <span class="pt-3 pb-4 leading-5 tracking-wide text-gray-600"><?php echo esc_html( 'Viewed ' . $email_viewed_count . '/' . $total_email_sent ); ?>
159
- </span>
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( $emails ) ); ?>
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
- </div>
181
- <?php
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( $emails ) {
187
 
188
  $i = 1;
189
- foreach ( $emails as $key => $email ) {
190
- $class = '';
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
- echo wp_kses( $this->preview_email( $report_id ), $allowedtags );
607
  die();
608
  }
609
  }
@@ -623,10 +639,20 @@ class ES_Reports_Table extends ES_List_Table {
623
  }
624
  }
625
 
626
- public function preview_email( $report_id ) {
627
- ob_start();
 
 
 
 
 
 
 
 
 
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
- $preview = array();
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
- return $html;
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 Guest|bool
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 Customer|false
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, $single = true ) {
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 table
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.8
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]