Newsletter - Version 6.9.6

Version Description

  • Added 3 months option for inactive subscriber selection
  • Improved the add-ons classes
  • Improved admin messages for multilanguage blogs
  • Updated link to documentation on main settings
  • Added VK and Telegram socials
  • Removed the old bounce import on subscribe maintenance panel
  • Added Telegram and VK icon on social block component
Download this release

Release Info

Developer satollo
Plugin Icon 128x128 Newsletter
Version 6.9.6
Comparing to
See all releases

Code changes from version 6.9.5 to 6.9.6

admin.css CHANGED
@@ -2460,3 +2460,8 @@ span.tnp-email-status-sent {
2460
  .tab-min-height {
2461
  min-height: 500px;
2462
  }
 
 
 
 
 
2460
  .tab-min-height {
2461
  min-height: 500px;
2462
  }
2463
+
2464
+ .tnp-control-all-languages-notice {
2465
+ padding: 15px;
2466
+ border: 1px dashed #999;
2467
+ }
admin.min.css CHANGED
@@ -1 +1 @@
1
- #tnp-wrap *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#tnp-wrap .iris-picker,#tnp-wrap .iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#tnp-wrap *:before,#tnp-wrap *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}@media all and (max-width:1100px){.col-md-12{width:100%}.col-md-11{width:100%}.col-md-10{width:100%}.col-md-9{width:100%}.col-md-8{width:100%}.col-md-7{width:100%}.col-md-6{width:100%}.col-md-5{width:100%}.col-md-4{width:100%}.col-md-3{width:100%}.col-md-2{width:100%}.col-md-1{width:100%}}.tnp-row-padded{width:90%;margin:0 auto;display:flex;justify-content:space-between}.tnp-col-3-boxed{width:30%;border:1px solid #3c414c;padding:0 0 30px 0;border-radius:10px}.tnp-margin-top{margin-top:80px}#tnp-wrap,#tnp-header,#tnp-body p,#tnp-body td,#tnp-body td p,#tnp-body input,#tnp-body select,#tnp-body textarea{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-promotion-bar{background-color:#ff5f65;color:ddd;padding:10px 0;text-align:center;font-size:16px}#tnp-promotion-bar a{color:#fff;font-weight:normal;text-decoration:none}#tnp-header{text-align:left;font-size:12px;color:#fff;font-family:soleil,sans-serif}#tnp-header input{font-size:12px}#tnp-header a{text-decoration:none;color:white;letter-spacing:.1em}#tnp-header a:hover{color:#fff}.error a,.error a:hover{color:#000!important}.updated a,.updated a:hover{color:#000!important}.tnp-error{border-left:5px solid #d00;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-warning{border-left:5px solid #ffb900;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-message{border-left:5px solid #46b450;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4,#tnp-body p{color:#fff}#tnp-body a,#tnp-body a:active{color:#2980b9}#tnp-body a:hover{color:#3498db}#tnp-body .tnp-submit{margin-bottom:10px}#tnp-body .button,#tnp-body .button:visited,#tnp-body .button:hover,#tnp-body .button:active,#tnp-body .button:focus,#tnp-body .button-primary,#tnp-body .button-primary:visited,#tnp-body .button-primary:hover,#tnp-body .button-secondary,#tnp-body .button-secondary:visited,#tnp-body .button-secondary:hover{color:#fff;background-color:#3498db;text-shadow:none;width:auto}#tnp-body span.wp-media-buttons-icon:before{color:#fff}#tnp-body .tnp-button{color:#fff;background-color:#3498db;text-shadow:none}#tnp-body .button-primary.tnp-button-white,#tnp-body .tnp-button.tnp-button-white{color:#444!important;background-color:#fff!important;box-shadow:none!important;-webkit-box-shadow:none!important;width:auto}#tnp-body .form-table h1,#tnp-body .form-table h2,#tnp-body .form-table h4,#tnp-body .form-table h3{color:#444}#tnp-body tbody th,#tnp-body td,#tnp-body td p,#tnp-body td .button,#tnp-body td .button:visited,#tnp-body td .button:hover,#tnp-body td .button:active,#tnp-body td .button:focus{color:#444}#tnp-body td a,#tnp-body td a:visited{color:#27ae60}#tnp-body .form-table{background-color:#fff;border:1px solid #ecf0f1;margin-top:2em;border-spacing:4px;border-collapse:separate}#tnp-body .form-table th{text-align:right;font-weight:bold;max-width:200px;color:#000;background-color:#ecf0f1;vertical-align:middle}#tnp-body .form-table th small{font-weight:normal}#tnp-body .form-table textarea{width:100%}#tnp-body .form-table table{border-collapse:collapse}#tnp-body .form-table table td,.form-table table th{padding:5px;font-size:.9em;font-weight:normal;border:1px solid #eee}#tnp-body .form-table table thead th{text-align:left;font-weight:bold}#tnp-body .widefat{width:90%}#tnp-body .widefat th{text-align:left}#tnp-body .widefat thead{background-color:#3498db;font-family:soleil,sans-serif;color:#fff!important}#tnp-body .widefat thead tr th{color:#fff!important}#tnp-body .widefat td,.widefat th{vertical-align:middle}.tnp-newsletters-list tbody tr{height:70px}.widefat tr:nth-child(even){background-color:#f4faff}#tnp-body #tabs h1,#tnp-body #tabs h2,#tnp-body #tabs h3,#tnp-body #tabs h4,#tnp-body #tabs p,#tnp-body #tabs td,#tnp-body #tabs th,#tnp-body #tabs input,#tnp-body #tabs select,#tnp-body #tabs textarea,#tnp-body #tabs a{color:#444}#tnp-body #tabs .button,#tnp-body #tabs .button:visited,#tnp-body #tabs .button:hover,#tnp-body #tabs .button-primary,#tnp-body #tabs .button-primary:visited,#tnp-body #tabs .button-primary:hover,#tnp-body #tabs .button-secondary,#tnp-body #tabs .button-secondary:visited,#tnp-body #tabs .button-secondary:hover{color:#fff;width:auto}table.clicks td{border:1px solid #666;padding:2px;font-size:10px}table.clicks{border-collapse:collapse}.grid{border-collapse:collapse}.grid td,.grid th{padding:10px;border:1px solid #ddd;margin:0}.grid th{background-color:#aaa}.tnp-checkboxes label{display:block;float:left;width:220px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;margin-right:5px}.tnp-buttons{padding:10px}.newsletter-checkbox-group,.nl-checkbox-group{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item{float:left;margin-right:5px;border:1px solid #ddd;border-radius:3px;background-color:#f4f4f4;width:150px;margin-bottom:5px;padding:3px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item input{vertical-align:text-bottom}.newsletter-checkboxes-item label{display:inline}.newsletter-preferences-item{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;width:250px;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-preferences-item label{display:inline}.form-table td .nl-checkbox-group label{display:inline}.tnp-notice{padding:15px;margin:10px 0;padding-right:70px;position:relative;border:1px solid #eee;background-color:#fff;color:#444;font-size:13px;border-left:5px solid #27ae60}.tnp-notice a{color:#0073aa;text-decoration:none;font-weight:bold}.tnp-notice a.tnp-dismiss{display:block;position:absolute;right:10px;top:13px;font-size:25px;text-decoration:none;color:#666}.tnp-notice input[type=email]{margin:10px 5px 5px;width:250px;border:0;box-shadow:none;background-color:#ecf0f1;padding:8px}.tnp-notice input[type=submit]{border:0;box-shadow:none;background-color:#27ae60;padding:8px;font-family:soleil,sans-serif;font-size:13px;color:#fff;cursor:pointer}.newsletter-message{background-color:#efe;border-color:#393;border-radius:5px;border-style:solid;border-width:3px;padding:.6em;margin-bottom:.6em}.newsletter-error-span{color:#f00;font-weight:bold}.newsletter-error{background-color:#fee;border-color:#933;border-radius:5px;border-style:solid;border-width:2px;padding:.6em;margin-bottom:.6em}.newsletter-error strong,.newsletter-message strong{font-weight:bold}#newsletter-warnings{background-color:#ffebe8;border-color:#C00;border-radius:3px;border-style:solid;border-width:1px;padding:.6em;margin-bottom:.6em}.newsletter-buttons{margin-top:1em;margin-bottom:1em}.tnp-paginator{margin-top:10px;margin-bottom:5px}.newsletter-option-grid th{text-align:right;width:auto;border:0;padding:3px;font-weight:normal;vertical-align:top;padding-right:15px}.newsletter-option-grid td{border:0;padding:3px;vertical-align:top}.newsletter-box{border:1px solid #ddd;padding:10px;background-color:#fafafa;margin-bottom:15px}.newsletter-box h3{margin-top:0}.newsletter-textarea-preview{border:1px solid #ddd}.tnp-tab-notice{background-color:#fff;border:1px solid #eee;border-left:3px solid gray;padding:10px;margin:10px 0;color:#444}.tnp-tab-warning{background-color:#fff;border:1px solid #eee;border-left:3px solid orange;padding:10px;margin:10px 0;color:#444}.tnp-tab-success{background-color:#fff;border:1px solid #eee;border-left:3px solid green;padding:10px;margin:10px 0;color:#444}.tnp-tab-error{background-color:#fff;border:1px solid #eee;border-left:3px solid red;padding:10px;margin:10px 0;color:#444}.tnp-tip{margin-top:5px}.tip-button{padding:0 5px;color:#fd5f65;text-transform:uppercase;letter-spacing:.2em;font-size:10px;border:1px red solid}.tip-content{font-weight:500;font-size:11px;color:#999}p.description{font-size:12px!important}.tnp-theme-preview{display:inline-block;text-align:center}.tnp-theme-preview p{font-family:soleil;font-size:13px;letter-spacing:.2em;color:#fff}.tnp-theme-preview img:hover{box-shadow:3px 3px 8px 2px #293848}.tnp-theme-preview img{border-radius:10px;height:190px;width:auto}.tnp-theme-preview .tnp-theme-composer{height:250px;width:auto}.tnp-theme-preview .tnp-theme-html{height:250px;width:auto}.tnp-header-logo{margin-left:10px}.wp-core-ui .button-primary{background-color:#2b2f3a;color:#fff;width:auto}#tnp-body{padding:10px;background-color:#28313c}.tnp-darkbg{background-color:#34495e!important}#tnp-body h3{margin-top:25px;clear:both;margin-bottom:10px}.tnp-body-lite{background-color:#f1f1f1!important}#tnp-heading{padding:10px;margin-bottom:10px;border-radius:5px}#tnp-heading a{color:#fff;border-bottom:1px solid #fff;text-decoration:none}#tnp-heading a:hover{color:#27ae60;border-bottom:1px solid #27ae60}#tnp-heading div p{color:#565656}#tnp-heading h2{color:#fff;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:1.1rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0;margin-bottom:15px}#tnp-heading h3{color:#27ae60;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:.8rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0}#tnp-heading p{margin:0;color:#ccc}#tnp-heading .notice p{margin:.5em 0;padding:2px}#tnp-heading .tnp-btn-h1{color:#fff;background-color:#3498db;border-radius:3px;padding:6px 11px;text-decoration:none;text-transform:capitalize;font-family:soleil,sans-serif;margin-left:10px;font-size:.75rem;font-weight:300;border:0}#tnp-heading .tnp-btn-h1:hover{color:#fff;background-color:#5dade2;-webkit-transition:background-color .25s linear;transition:background-color .25s linear;-webkit-font-smoothing:subpixel-antialiased;border:0;color:#fff}.metabox-holder{width:100%}.postbox{border:0}.postbox h3 a{float:right}#dashboard-widgets .postbox-container{width:33.333%}#tnp-body .postbox p{color:#000}#dashboard-widgets .postbox-container .postbox h3{font-family:soleil,sans-serif;letter-spacing:.05rem;background-color:#415b76;color:#fff;margin:0;padding:9px}#dashboard-widgets .postbox-container h3 a{color:white;text-decoration:none;margin-left:5px;padding:2px 8px;background-color:#26c281;border-radius:2px;font-weight:300;text-transform:capitalize;font-size:.8rem}#dashboard-widgets .postbox-container h3 a:hover{color:white;text-decoration:none;margin-left:5px;background-color:#2ecc71}.postbox-container i{margin-right:3px}#tnp-dash-newsletters tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:first-of-type{width:250px;overflow:hidden}#tnp-dash-subscribers table{table-layout:fixed}#tnp-dash-documentation .inside div{margin-top:10px}#tnp-dash-documentation .inside a{text-decoration:none;color:#fff;display:block;font-family:soleil,sans-serif;padding:5px 10px}#tnp-footer{margin-top:10px;padding:20px 10px 10px 40px;background-color:#28313c;font-family:soleil,sans-serif}#tnp-footer div{width:33%;display:inline-block}#tnp-footer a{color:#fff;text-decoration:none}#tnp-footer a:hover{color:#bdc3c7}#tnp-footer input[type="submit"]{background-color:#2ecc71;border:0;padding:5px;color:#fff}#tnp-footer form{white-space:nowrap}#tnp-footer li{display:inline;margin-left:15px;padding:2px 5px;border-left:3px solid #2ecc71}#wpwrap{background-color:#222b36!important}#dashboard-widgets .button{border:0;background:0;box-shadow:none;color:#322c39}#dashboard-widgets .button:hover{background-color:#ecf0f1}.wp-core-ui .button-secondary,.wp-core-ui .button-primary{background-color:#3498db;border:0;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px;width:auto}.wp-core-ui .button-secondary,.wp-core-ui .button,.wp-core-ui .button-primary{background-color:#3498db;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px}.wp-core-ui .button-secondary:hover,.wp-core-ui .button:hover,.wp-core-ui .button-primary:hover{background-color:#5dade2;color:#fff;width:auto}span.wp-media-buttons-icon:before{color:#fff}.tnp-paginator [value="Go"]{background-color:#27ae60}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71}.notice-dismiss{padding:3px}.tnp-paginator{color:#fff;font-family:soleil,sans-serif;margin:10px 0}.tnp-paginator .button-secondary{padding:5px;line-height:normal;height:auto;font-size:12px;height:25px;border:0;border-radius:3px;vertical-align:baseline}.tnp-paginator [value="Go"]{background-color:#27ae60!important}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71!important}.tnp-paginator input{background-color:#2c3e50;border:0;border-radius:3px;color:#fff;padding:5px;line-height:normal;font-size:12px;height:25px}.tnp-subscribers-search{color:#fff;font-family:soleil,sans-serif;background-color:#2c3e50;padding:20px;border-radius:5px;margin-bottom:20px;display:inline-block}.tnp-subscribers-search select{margin-left:5px;padding:0;line-height:inherit}.tnp-video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.tnp-video-container iframe,.tnp-video-container object,.tnp-video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.bg-white{background-color:#FFF}.orange{background-color:#f39c12}.blue{background-color:#2980b9}.purple{background-color:#8e44ad}.notice a{color:#27ae60!important;text-decoration:underline!important}.tnp-chart{border:1px solid #eee;width:100%}.tnp-db-table{width:auto;background-color:#fff}.tnp-db-table thead{border-bottom:1px solid #eee}.tnp-db-table th{font-weight:bold}.tnp-db-table td,.tnp-db-table th{padding:3px;font-family:monospace;border:0}.tnp-main-status h3,.tnp-main-status h4{color:#fff}#tnp-status-table .tnp-ok{font-weight:bold;color:white;font-size:14px;background-color:#27ae60;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-ko{font-weight:bold;color:white;font-size:14px;background-color:#e74c41;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-maybe{font-weight:bold;color:white;font-size:14px;background-color:#f1c40f;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}.tnp-main-status .tnp-log-files li{padding-left:15px}.tnp-main-status .tnp-log-files li,.tnp-main-status .tnp-log-files li a{color:#fff}.tnp-main-status .tnp-log-files .tnp-log-size{font-style:italic}table.widefat{border:0;box-shadow:none}#tnp-status-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-parameters-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-body .ui-widget{font-family:soleil,sans-serif}#tnp-body #tabs{background-color:transparent;border:0!important;padding:0;margin:0}#tnp-body #tabs .ui-widget-header{background:#28313c;border:0}#tnp-body #tabs .ui-tabs-panel{padding:15px!important;background-color:#fff}#tnp-body #tabs a.ui-tabs-anchor,#tnp-body #tabs a.ui-tabs-anchor:visited{color:#444}#tnp-body .ui-tabs .ui-tabs-nav{padding:0}#tnp-body .ui-tabs .ui-tabs-nav li a{font-size:14px}#tnp-body #tabs .ui-tabs{border-color:#28313c;background-color:#28313c;border:0}#tnp-body #tabs .ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0 0;background-color:#f2f2f2}#tnp-body #tabs .ui-tabs .ui-tabs-panel{padding:1em 0;background-color:#f2f2f2;margin:0;border:0}#tnp-body .ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff!important;font-weight:normal;font-family:soleil,sans-serif}#tnp-body .ui-widget-content{background:#fff}#tnp-body .ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.tnp-extension-premium-box,.tnp-extension-free-box,.tnp-integration-box{width:300px;height:220px;background-color:#222b36;text-align:center;margin:20px;float:left;position:relative}.tnp-extension-premium-box:hover,.tnp-extension-free-box:hover,.tnp-integration-box:hover{background-color:#232c35;box-shadow:1px 1px 15px #222b36}.tnp-extension-premium-box p,.tnp-extension-free-box p,.tnp-integration-box p{padding:5px 10px;color:#72777c;font-size:14px;margin-top:0}.tnp-extension-premium-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-free-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-integration-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-premium-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-free-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-integration-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-premium-action span{color:#27ae60}.tnp-extension-free-action span{color:#27ae60}.tnp-integration-action span{color:#27ae60}.tnp-extension-activate{color:#1abc9c;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-install{color:#2980b9;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-buy{color:#f1c40f;padding:5px 8px;text-decoration:none;cursor:pointer}#tnp-body a.tnp-extension-details{color:#999;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-free{color:#d35400;padding:5px 8px;text-decoration:none;cursor:pointer;position:relative}img.tnp-extensions-free-badge{position:absolute;display:block;right:0;top:0;width:70px}.tnp-extensions-image img{margin:25px 0 -10px}#tnp-subscribe-overlay{height:100vh;width:100vw;z-index:10000;display:none;background-image:url(images/modal-background.png);background-repeat:repeat;position:fixed;top:0;left:-20px}#tnp-subscribe-modal{width:600px;background-color:rgba(255,255,255,1);margin-right:auto;margin-left:auto;margin-top:100px;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);-moz-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);box-shadow:0 0 20px 0 rgba(0,0,0,0.5);padding:25px;background-color:#1d2b38;text-align:center}#tnp-subscribe-modal img{width:30%}#tnp-subscribe-title{font-size:20px;margin-top:30px;margin-bottom:30px;line-height:30px;color:white;font-weight:200}#tnp-subscribe-email-wrapper{margin:20px}#tnp-subscribe-email-wrapper input{border:0;background-color:#223242;color:white}#tnp-subscribe-email{font-size:24px;box-sizing:border-box;width:100%;padding:10px;text-align:center}#tnp-subscribe-submit-wrapper{margin-bottom:20px}#tnp-subscribe-submit{font-size:24px;background-color:#219050;color:#fff;padding:10px 35px;border:0;font-size:17px;letter-spacing:2px}#tnp-subscribe-no-thanks{color:#666;margin-top:20px;margin-bottom:20px}#tnp-body div.tnp-emails-theme-options{background-color:#fff;padding:10px;margin-top:14px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.cd-slider-wrapper{position:relative;width:100%;height:90vh;overflow:hidden;margin:0 auto}.cd-slider-wrapper .cd-slider,.cd-slider-wrapper .cd-slider>li{height:100%;width:100%}.tnp-logo-big{width:300px}.tnp-row{display:table-row}.tnp-third{width:33%;float:left}.tnp-welcome-confirm-button{color:#fff;padding:10px 30px;background-color:#2ecc71;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none;display:inline-block;text-align:center;margin:20px auto 0}.tnp-welcome-confirm-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-confirm-button:visited{color:#fff;text-decoration:none}.tnp-welcome-link-button{color:#fff;padding:10px 30px;background-color:#3498db;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none}.tnp-welcome-link-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-link-button:visited{color:#fff;text-decoration:none}#tnp-welcome input[type="text"],#tnp-welcome input[type="email"]{max-width:90%}.tnp-welcome-next{background-color:#2ecc71;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-next:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-next:visited{color:#fff;text-decoration:none}.tnp-welcome-prev{background-color:#3498db;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 0 0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-prev:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-prev:visited{color:#fff;text-decoration:none}.tnp-welcome-next svg{margin-left:10px}.tnp-welcome-prev svg{margin-right:10px}.cd-slider input{width:250px;height:40px;border:1px solid #6c7280;background:#454a56;color:white;color:white;padding:0 10px}.cd-slider>li{position:absolute;top:0;left:0;opacity:0;display:table;background-position:center center;background-repeat:no-repeat;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cd-slider>li.visible{position:relative;z-index:2;opacity:1}.cd-slider>li:first-of-type{background-color:#2b313a}.cd-slider>li:nth-of-type(2){background-color:#2b313a}.cd-slider>li:nth-of-type(3){background-color:#2b313a}.cd-slider>li:nth-of-type(4){background-color:#2b313a}.cd-slider>li:first-of-type,.cd-slider>li:nth-of-type(2),.cd-slider>li:nth-of-type(3),.cd-slider>li:nth-of-type(4){background-size:cover}.cd-slider>li>div{display:table-cell;vertical-align:middle;text-align:center}.cd-slider>li h2,.cd-slider>li p{text-shadow:0 1px 3px rgba(0,0,0,0.1);line-height:1.2;margin:0 auto 14px;color:#fff;width:90%;max-width:320px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}.cd-slider>li .cd-btn{display:inline-block;padding:1.2em 1.4em;margin-top:.8em;background-color:rgba(0,0,0,0.6);border-radius:.25em;font-size:1.3rem;font-weight:700;letter-spacing:1px;color:#fff;text-transform:uppercase;-webkit-transition:background-color .2s;-moz-transition:background-color .2s;transition:background-color .2s}.no-touch .cd-slider>li .cd-btn:hover{background-color:rgba(0,0,0,0.8)}@media only screen and (min-width:768px){.cd-slider>li h2,.cd-slider>li p{max-width:520px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}}@media only screen and (min-width:1170px){.cd-slider>li h2,.cd-slider>li p{margin-bottom:20px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:center;color:#b8c3c9;margin:30px auto}}.cd-slider-navigation{position:relative;bottom:110px;z-index:3;display:flex;justify-content:center}.cd-svg-cover{position:absolute;z-index:1;left:0;top:0;height:100%;width:100%;opacity:0}.cd-svg-cover path{fill:#ed6a6a}.cd-svg-cover.is-animating{z-index:4;opacity:1;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;transition:opacity .6s}.switch{position:relative;display:inline-block;width:60px;height:34px}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:"";height:26px;width:26px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;transition:.4s}input:checked+.slider{background-color:#2196f3}input:focus+.slider{box-shadow:0 0 1px #2196f3}input:checked+.slider:before{-webkit-transform:translateX(26px);-ms-transform:translateX(26px);transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}#tnp-body div.tnp-emails-theme-options table.form-table{margin:0}#tnp-body div.tnp-emails-theme-options h3{color:#000}.tnp-emails-edit #options-subject{font-size:16px;display:inline-block;margin:20px 0;width:auto;border-radius:4px;padding:5px 10px}.tnp-suggest-button{font-family:soleil,sans-serif;margin-left:8px;border-radius:3px;background-color:#2980b9;padding:10px 15px 8px;font-size:14px;color:#fff!important;text-decoration:none}.tnp-suggest-button:hover{background-color:#3f8dbf}.tnp-popup-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.8);z-index:10000}.tnp-popup{width:40vw;height:66vh;overflow:auto;margin:100px auto 0 auto;background-color:#181818;padding:20px;position:relative}.tnp-popup-close{display:block;position:absolute;top:5px;right:5px;background-color:#181818;color:#fff;font-size:40px;padding:10px;text-align:right;cursor:pointer}.tnp-subjects-header{font-size:16px;color:#fff;padding:0 70px 20px 20px;font-family:soleil,sans-serif;border-bottom:1px solid #282828}#tnp-edit-subjects-list{padding:0 70px 20px 20px}#tnp-edit-subjects-list a{padding:5px}#tnp-edit-subjects-list svg{margin:0 10px 0 0;vertical-align:middle}.tnp-subject-category{color:#565656;margin:25px 0 10px 0;font-size:12px;text-transform:uppercase;letter-spacing:.1em}#tnp-edit-emoji-list{font-size:28px}#tnp-edit-emoji-list a{display:inline-block;margin-right:5px;margin-bottom:5px}.tnp-list-conditions p{margin:0 10px}.tnp-lists .tnp-notes{margin:0;font-size:.9em}iframe.tnp-editor-preview-mobile{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;box-shadow:1px 1px 10px #777;border-radius:10px;padding:5px;width:320px;height:500px;float:left}iframe.tnp-editor-preview-desktop{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;border-radius:10px;box-shadow:1px 1px 10px #777;padding:15px;width:650px;margin-right:20px;height:500px;float:left}#tnp-license-control{border-left:5px solid #27ae60;display:inline-block;padding:15px 20px;margin-left:-10px;margin-top:15px;border-radius:2px;background-color:#fff}#tnp-license-control form{margin-bottom:10px;margin-top:10px}#tnp-license-control form input{padding-left:10px}#tnp-license-control a{border-bottom:0;color:#27ae60}#tnp-nl-status{width:100%;background:#fffafa;padding:15px 25px 15px 25px;border-left:10px solid #27ae60;border-radius:0 5px 5px 0}#tnp-nl-status p{font-size:17px}.tnp-nl-status-row{margin:10px 0}.tnp-nl-status-title{font-size:26px;line-height:32px;margin:5px 0 0 0;color:#3498db;font-weight:900;vertical-align:middle}.tnp-nl-status-title-value{font-size:13px;line-height:32px;margin:0 0 0 5px;color:#fff;background-color:#95a5a6;border-radius:4px;text-transform:uppercase;letter-spacing:1px;vertical-align:sub}.tnp-nl-status-schedule-targeting{font-size:15px;color:#34495e}.tnp-nl-status-schedule-value{font-size:15px;color:#34495e}.tnp-status-header #options-subject{width:calc(100% - 150px)}.tnp-one-third{width:40%;display:inline-block;vertical-align:top}.tnp-two-thirds{width:59%;display:inline-block;vertical-align:top}.tnp-progress{display:flex;height:1.5rem;overflow:hidden;font-size:.75rem;background-color:#c9cccf;border-radius:.25rem;margin:0;min-width:100px}.tnp-progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}.tnp-progress.sent .tnp-progress-bar{background-color:green}.tnp-progress-numbers{text-align:center;color:#666}.tnp-progress-date{color:#666;font-style:italic}span.tnp-email-status-new{background-color:#8e44ad;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-paused{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sending{background-color:#27ae60;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-scheduled{background-color:#e67e22;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sent{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}.tnp-themes-new{border-bottom:2px solid #243342;margin-bottom:30px;padding-bottom:30px}#tnp-schedule-button{background-color:#e67e22!important}#tnp-schedule-button:hover{background-color:#ec913f!important}.tnp-button-cancel{background-color:#e74c3c!important}.tnpc-preview{margin-top:10px}.tnpc-preview .fake-browser-ui iframe{width:700px}.tnpc-preview .fake-mobile-browser-ui iframe{width:320px}.fake-browser-ui{padding:30px 0 0;border-radius:3px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;vertical-align:top;margin-left:20px}.fake-mobile-browser-ui{padding:30px 10px 37px;border-radius:10px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;margin-left:30px}.fake-browser-ui .frame{display:block;height:25px;position:absolute;top:12px;left:8px}.fake-mobile-browser-ui .frame{display:block;height:25px;margin-top:10px}.fake-browser-ui span{height:12px;width:12px;border-radius:8px;background-color:#eee;border:1px solid #dadada;float:left;margin:0 0 0 4px}.fake-mobile-browser-ui span{height:50px;width:50px;border-radius:60px;background-color:#eee;border:2px solid #ccc;display:block;margin:auto}.fake-browser-ui .bt-1{background-color:#ed594a}.fake-browser-ui .bt-2{background-color:#fdd800}.fake-browser-ui .bt-3{background-color:#5ac05a}#tnp-promo{text-align:left;background-color:#222b36;margin:20px;border-radius:5px;padding:20px 40px}#tnp-promo .tnp-promo-how-to{width:50%;padding:5px 20px;margin-top:30px;margin-bottom:30px;border-left:2px solid #f1c40f}#tnp-promo .tnp-promo-how-to h3{color:#ecf0f1;margin:0;line-height:36px}#tnp-promo .tnp-promo-how-to p{color:#ecf0f1;margin:0;font-size:16px;line-height:26px}#tnp-promo .tnp-promo-buttons{margin:50px 0}#tnp-promo .tnp-promo-button{background:#27ae60;text-decoration:none;color:white;padding:15px 20px;font-size:15px;border-radius:2px}#tnp-promo .tnp-promo-button:hover{background:#2ecc71;color:white}#tnp-promo .tnp-promo-button i{margin-right:3px}#tnp-body td a.tnp-table-link,#tnp-body td a.tnp-table-link:visited{color:#444}#tnp-body td a.tnp-table-link:hover{color:#3498db}.text-left{text-align:left}
1
+ #tnp-wrap *{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}#tnp-wrap .iris-picker,#tnp-wrap .iris-picker *{-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}#tnp-wrap *:before,#tnp-wrap *:after{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row:before,.row:after{display:table;content:" "}.row:after{clear:both}.col-xs-1,.col-sm-1,.col-md-1,.col-lg-1,.col-xs-2,.col-sm-2,.col-md-2,.col-lg-2,.col-xs-3,.col-sm-3,.col-md-3,.col-lg-3,.col-xs-4,.col-sm-4,.col-md-4,.col-lg-4,.col-xs-5,.col-sm-5,.col-md-5,.col-lg-5,.col-xs-6,.col-sm-6,.col-md-6,.col-lg-6,.col-xs-7,.col-sm-7,.col-md-7,.col-lg-7,.col-xs-8,.col-sm-8,.col-md-8,.col-lg-8,.col-xs-9,.col-sm-9,.col-md-9,.col-lg-9,.col-xs-10,.col-sm-10,.col-md-10,.col-lg-10,.col-xs-11,.col-sm-11,.col-md-11,.col-lg-11,.col-xs-12,.col-sm-12,.col-md-12,.col-lg-12{position:relative;min-height:1px;padding-right:15px;padding-left:15px}.col-xs-1,.col-xs-2,.col-xs-3,.col-xs-4,.col-xs-5,.col-xs-6,.col-xs-7,.col-xs-8,.col-xs-9,.col-xs-10,.col-xs-11,.col-xs-12{float:left}.col-md-1,.col-md-2,.col-md-3,.col-md-4,.col-md-5,.col-md-6,.col-md-7,.col-md-8,.col-md-9,.col-md-10,.col-md-11,.col-md-12{float:left}.col-md-12{width:100%}.col-md-11{width:91.66666667%}.col-md-10{width:83.33333333%}.col-md-9{width:75%}.col-md-8{width:66.66666667%}.col-md-7{width:58.33333333%}.col-md-6{width:50%}.col-md-5{width:41.66666667%}.col-md-4{width:33.33333333%}.col-md-3{width:25%}.col-md-2{width:16.66666667%}.col-md-1{width:8.33333333%}@media all and (max-width:1100px){.col-md-12{width:100%}.col-md-11{width:100%}.col-md-10{width:100%}.col-md-9{width:100%}.col-md-8{width:100%}.col-md-7{width:100%}.col-md-6{width:100%}.col-md-5{width:100%}.col-md-4{width:100%}.col-md-3{width:100%}.col-md-2{width:100%}.col-md-1{width:100%}}.tnp-row-padded{width:90%;margin:0 auto;display:flex;justify-content:space-between}.tnp-col-3-boxed{width:30%;border:1px solid #3c414c;padding:0 0 30px 0;border-radius:10px}.tnp-margin-top{margin-top:80px}#tnp-wrap,#tnp-header,#tnp-body p,#tnp-body td,#tnp-body td p,#tnp-body input,#tnp-body select,#tnp-body textarea{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4{font-family:soleil,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}#tnp-promotion-bar{background-color:#ff5f65;color:ddd;padding:10px 0;text-align:center;font-size:16px}#tnp-promotion-bar a{color:#fff;font-weight:normal;text-decoration:none}#tnp-header{text-align:left;font-size:12px;color:#fff;font-family:soleil,sans-serif}#tnp-header input{font-size:12px}#tnp-header a{text-decoration:none;color:white;letter-spacing:.1em}#tnp-header a:hover{color:#fff}.error a,.error a:hover{color:#000!important}.updated a,.updated a:hover{color:#000!important}.tnp-error{border-left:5px solid #d00;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-warning{border-left:5px solid #ffb900;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}.tnp-message{border-left:5px solid #46b450;background-color:#fff;padding:15px;margin:15px 0;font-size:1.2em;line-height:1.5em}#tnp-body h1,#tnp-body h2,#tnp-body h3,#tnp-body h4,#tnp-body p{color:#fff}#tnp-body a,#tnp-body a:active{color:#2980b9}#tnp-body a:hover{color:#3498db}#tnp-body .tnp-submit{margin-bottom:10px}#tnp-body .button,#tnp-body .button:visited,#tnp-body .button:hover,#tnp-body .button:active,#tnp-body .button:focus,#tnp-body .button-primary,#tnp-body .button-primary:visited,#tnp-body .button-primary:hover,#tnp-body .button-secondary,#tnp-body .button-secondary:visited,#tnp-body .button-secondary:hover{color:#fff;background-color:#3498db;text-shadow:none;width:auto}#tnp-body span.wp-media-buttons-icon:before{color:#fff}#tnp-body .tnp-button{color:#fff;background-color:#3498db;text-shadow:none}#tnp-body .button-primary.tnp-button-white,#tnp-body .tnp-button.tnp-button-white{color:#444!important;background-color:#fff!important;box-shadow:none!important;-webkit-box-shadow:none!important;width:auto}#tnp-body .form-table h1,#tnp-body .form-table h2,#tnp-body .form-table h4,#tnp-body .form-table h3{color:#444}#tnp-body tbody th,#tnp-body td,#tnp-body td p,#tnp-body td .button,#tnp-body td .button:visited,#tnp-body td .button:hover,#tnp-body td .button:active,#tnp-body td .button:focus{color:#444}#tnp-body td a,#tnp-body td a:visited{color:#27ae60}#tnp-body .form-table{background-color:#fff;border:1px solid #ecf0f1;margin-top:2em;border-spacing:4px;border-collapse:separate}#tnp-body .form-table th{text-align:right;font-weight:bold;max-width:200px;color:#000;background-color:#ecf0f1;vertical-align:middle}#tnp-body .form-table th small{font-weight:normal}#tnp-body .form-table textarea{width:100%}#tnp-body .form-table table{border-collapse:collapse}#tnp-body .form-table table td,.form-table table th{padding:5px;font-size:.9em;font-weight:normal;border:1px solid #eee}#tnp-body .form-table table thead th{text-align:left;font-weight:bold}#tnp-body .widefat{width:90%}#tnp-body .widefat th{text-align:left}#tnp-body .widefat thead{background-color:#3498db;font-family:soleil,sans-serif;color:#fff!important}#tnp-body .widefat thead tr th{color:#fff!important}#tnp-body .widefat td,.widefat th{vertical-align:middle}.tnp-newsletters-list tbody tr{height:70px}.widefat tr:nth-child(even){background-color:#f4faff}#tnp-body #tabs h1,#tnp-body #tabs h2,#tnp-body #tabs h3,#tnp-body #tabs h4,#tnp-body #tabs p,#tnp-body #tabs td,#tnp-body #tabs th,#tnp-body #tabs input,#tnp-body #tabs select,#tnp-body #tabs textarea,#tnp-body #tabs a{color:#444}#tnp-body #tabs .button,#tnp-body #tabs .button:visited,#tnp-body #tabs .button:hover,#tnp-body #tabs .button-primary,#tnp-body #tabs .button-primary:visited,#tnp-body #tabs .button-primary:hover,#tnp-body #tabs .button-secondary,#tnp-body #tabs .button-secondary:visited,#tnp-body #tabs .button-secondary:hover{color:#fff;width:auto}table.clicks td{border:1px solid #666;padding:2px;font-size:10px}table.clicks{border-collapse:collapse}.grid{border-collapse:collapse}.grid td,.grid th{padding:10px;border:1px solid #ddd;margin:0}.grid th{background-color:#aaa}.tnp-checkboxes label{display:block;float:left;width:220px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;margin-right:5px}.tnp-buttons{padding:10px}.newsletter-checkbox-group,.nl-checkbox-group{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item{float:left;margin-right:5px;border:1px solid #ddd;border-radius:3px;background-color:#f4f4f4;width:150px;margin-bottom:5px;padding:3px;white-space:nowrap;overflow:hidden}.newsletter-checkboxes-item input{vertical-align:text-bottom}.newsletter-checkboxes-item label{display:inline}.newsletter-preferences-item{float:left;margin-right:5px;border:1px solid #ccc;background-color:#f4f4f4;width:250px;margin-bottom:5px;padding:5px;white-space:nowrap;overflow:hidden}.newsletter-preferences-item label{display:inline}.form-table td .nl-checkbox-group label{display:inline}.tnp-notice{padding:15px;margin:10px 0;padding-right:70px;position:relative;border:1px solid #eee;background-color:#fff;color:#444;font-size:13px;border-left:5px solid #27ae60}.tnp-notice a{color:#0073aa;text-decoration:none;font-weight:bold}.tnp-notice a.tnp-dismiss{display:block;position:absolute;right:10px;top:13px;font-size:25px;text-decoration:none;color:#666}.tnp-notice input[type=email]{margin:10px 5px 5px;width:250px;border:0;box-shadow:none;background-color:#ecf0f1;padding:8px}.tnp-notice input[type=submit]{border:0;box-shadow:none;background-color:#27ae60;padding:8px;font-family:soleil,sans-serif;font-size:13px;color:#fff;cursor:pointer}.newsletter-message{background-color:#efe;border-color:#393;border-radius:5px;border-style:solid;border-width:3px;padding:.6em;margin-bottom:.6em}.newsletter-error-span{color:#f00;font-weight:bold}.newsletter-error{background-color:#fee;border-color:#933;border-radius:5px;border-style:solid;border-width:2px;padding:.6em;margin-bottom:.6em}.newsletter-error strong,.newsletter-message strong{font-weight:bold}#newsletter-warnings{background-color:#ffebe8;border-color:#C00;border-radius:3px;border-style:solid;border-width:1px;padding:.6em;margin-bottom:.6em}.newsletter-buttons{margin-top:1em;margin-bottom:1em}.tnp-paginator{margin-top:10px;margin-bottom:5px}.newsletter-option-grid th{text-align:right;width:auto;border:0;padding:3px;font-weight:normal;vertical-align:top;padding-right:15px}.newsletter-option-grid td{border:0;padding:3px;vertical-align:top}.newsletter-box{border:1px solid #ddd;padding:10px;background-color:#fafafa;margin-bottom:15px}.newsletter-box h3{margin-top:0}.newsletter-textarea-preview{border:1px solid #ddd}.tnp-tab-notice{background-color:#fff;border:1px solid #eee;border-left:3px solid gray;padding:10px;margin:10px 0;color:#444}.tnp-tab-warning{background-color:#fff;border:1px solid #eee;border-left:3px solid orange;padding:10px;margin:10px 0;color:#444}.tnp-tab-success{background-color:#fff;border:1px solid #eee;border-left:3px solid green;padding:10px;margin:10px 0;color:#444}.tnp-tab-error{background-color:#fff;border:1px solid #eee;border-left:3px solid red;padding:10px;margin:10px 0;color:#444}.tnp-tip{margin-top:5px}.tip-button{padding:0 5px;color:#fd5f65;text-transform:uppercase;letter-spacing:.2em;font-size:10px;border:1px red solid}.tip-content{font-weight:500;font-size:11px;color:#999}p.description{font-size:12px!important}.tnp-theme-preview{display:inline-block;text-align:center}.tnp-theme-preview p{font-family:soleil;font-size:13px;letter-spacing:.2em;color:#fff}.tnp-theme-preview img:hover{box-shadow:3px 3px 8px 2px #293848}.tnp-theme-preview img{border-radius:10px;height:190px;width:auto}.tnp-theme-preview .tnp-theme-composer{height:250px;width:auto}.tnp-theme-preview .tnp-theme-html{height:250px;width:auto}.tnp-header-logo{margin-left:10px}.wp-core-ui .button-primary{background-color:#2b2f3a;color:#fff;width:auto}#tnp-body{padding:10px;background-color:#28313c}.tnp-darkbg{background-color:#34495e!important}#tnp-body h3{margin-top:25px;clear:both;margin-bottom:10px}.tnp-body-lite{background-color:#f1f1f1!important}#tnp-heading{padding:10px;margin-bottom:10px;border-radius:5px}#tnp-heading a{color:#fff;border-bottom:1px solid #fff;text-decoration:none}#tnp-heading a:hover{color:#27ae60;border-bottom:1px solid #27ae60}#tnp-heading div p{color:#565656}#tnp-heading h2{color:#fff;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:1.1rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0;margin-bottom:15px}#tnp-heading h3{color:#27ae60;font-family:soleil,sans-serif;letter-spacing:.1rem;font-size:.8rem;line-height:1.8rem;text-transform:uppercase;vertical-align:middle;font-weight:700;padding:0;margin:0}#tnp-heading p{margin:0;color:#ccc}#tnp-heading .notice p{margin:.5em 0;padding:2px}#tnp-heading .tnp-btn-h1{color:#fff;background-color:#3498db;border-radius:3px;padding:6px 11px;text-decoration:none;text-transform:capitalize;font-family:soleil,sans-serif;margin-left:10px;font-size:.75rem;font-weight:300;border:0}#tnp-heading .tnp-btn-h1:hover{color:#fff;background-color:#5dade2;-webkit-transition:background-color .25s linear;transition:background-color .25s linear;-webkit-font-smoothing:subpixel-antialiased;border:0;color:#fff}.metabox-holder{width:100%}.postbox{border:0}.postbox h3 a{float:right}#dashboard-widgets .postbox-container{width:33.333%}#tnp-body .postbox p{color:#000}#dashboard-widgets .postbox-container .postbox h3{font-family:soleil,sans-serif;letter-spacing:.05rem;background-color:#415b76;color:#fff;margin:0;padding:9px}#dashboard-widgets .postbox-container h3 a{color:white;text-decoration:none;margin-left:5px;padding:2px 8px;background-color:#26c281;border-radius:2px;font-weight:300;text-transform:capitalize;font-size:.8rem}#dashboard-widgets .postbox-container h3 a:hover{color:white;text-decoration:none;margin-left:5px;background-color:#2ecc71}.postbox-container i{margin-right:3px}#tnp-dash-newsletters tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:last-of-type{width:80px;text-align:right}#tnp-dash-subscribers tr td:first-of-type{width:250px;overflow:hidden}#tnp-dash-subscribers table{table-layout:fixed}#tnp-dash-documentation .inside div{margin-top:10px}#tnp-dash-documentation .inside a{text-decoration:none;color:#fff;display:block;font-family:soleil,sans-serif;padding:5px 10px}#tnp-footer{margin-top:10px;padding:20px 10px 10px 40px;background-color:#28313c;font-family:soleil,sans-serif}#tnp-footer div{width:33%;display:inline-block}#tnp-footer a{color:#fff;text-decoration:none}#tnp-footer a:hover{color:#bdc3c7}#tnp-footer input[type="submit"]{background-color:#2ecc71;border:0;padding:5px;color:#fff}#tnp-footer form{white-space:nowrap}#tnp-footer li{display:inline;margin-left:15px;padding:2px 5px;border-left:3px solid #2ecc71}#wpwrap{background-color:#222b36!important}#dashboard-widgets .button{border:0;background:0;box-shadow:none;color:#322c39}#dashboard-widgets .button:hover{background-color:#ecf0f1}.wp-core-ui .button-secondary,.wp-core-ui .button-primary{background-color:#3498db;border:0;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px;width:auto}.wp-core-ui .button-secondary,.wp-core-ui .button,.wp-core-ui .button-primary{background-color:#3498db;box-shadow:none;color:#fff;font-family:soleil,sans-serif;margin:0 2px}.wp-core-ui .button-secondary:hover,.wp-core-ui .button:hover,.wp-core-ui .button-primary:hover{background-color:#5dade2;color:#fff;width:auto}span.wp-media-buttons-icon:before{color:#fff}.tnp-paginator [value="Go"]{background-color:#27ae60}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71}.notice-dismiss{padding:3px}.tnp-paginator{color:#fff;font-family:soleil,sans-serif;margin:10px 0}.tnp-paginator .button-secondary{padding:5px;line-height:normal;height:auto;font-size:12px;height:25px;border:0;border-radius:3px;vertical-align:baseline}.tnp-paginator [value="Go"]{background-color:#27ae60!important}.tnp-paginator [value="Go"]:hover{background-color:#2ecc71!important}.tnp-paginator input{background-color:#2c3e50;border:0;border-radius:3px;color:#fff;padding:5px;line-height:normal;font-size:12px;height:25px}.tnp-subscribers-search{color:#fff;font-family:soleil,sans-serif;background-color:#2c3e50;padding:20px;border-radius:5px;margin-bottom:20px;display:inline-block}.tnp-subscribers-search select{margin-left:5px;padding:0;line-height:inherit}.tnp-video-container{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.tnp-video-container iframe,.tnp-video-container object,.tnp-video-container embed{position:absolute;top:0;left:0;width:100%;height:100%}.bg-white{background-color:#FFF}.orange{background-color:#f39c12}.blue{background-color:#2980b9}.purple{background-color:#8e44ad}.notice a{color:#27ae60!important;text-decoration:underline!important}.tnp-chart{border:1px solid #eee;width:100%}.tnp-db-table{width:auto;background-color:#fff}.tnp-db-table thead{border-bottom:1px solid #eee}.tnp-db-table th{font-weight:bold}.tnp-db-table td,.tnp-db-table th{padding:3px;font-family:monospace;border:0}.tnp-main-status h3,.tnp-main-status h4{color:#fff}#tnp-status-table .tnp-ok{font-weight:bold;color:white;font-size:14px;background-color:#27ae60;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-ko{font-weight:bold;color:white;font-size:14px;background-color:#e74c41;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}#tnp-status-table .tnp-maybe{font-weight:bold;color:white;font-size:14px;background-color:#f1c40f;padding:2px 10px;border-radius:10px;display:inline-block;width:75px;text-align:center}.tnp-main-status .tnp-log-files li{padding-left:15px}.tnp-main-status .tnp-log-files li,.tnp-main-status .tnp-log-files li a{color:#fff}.tnp-main-status .tnp-log-files .tnp-log-size{font-style:italic}table.widefat{border:0;box-shadow:none}#tnp-status-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-parameters-table tbody tr:nth-child(2n+1){background-color:#ecf0f1;border-radius:2px;margin:5px}#tnp-body .ui-widget{font-family:soleil,sans-serif}#tnp-body #tabs{background-color:transparent;border:0!important;padding:0;margin:0}#tnp-body #tabs .ui-widget-header{background:#28313c;border:0}#tnp-body #tabs .ui-tabs-panel{padding:15px!important;background-color:#fff}#tnp-body #tabs a.ui-tabs-anchor,#tnp-body #tabs a.ui-tabs-anchor:visited{color:#444}#tnp-body .ui-tabs .ui-tabs-nav{padding:0}#tnp-body .ui-tabs .ui-tabs-nav li a{font-size:14px}#tnp-body #tabs .ui-tabs{border-color:#28313c;background-color:#28313c;border:0}#tnp-body #tabs .ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0 0;background-color:#f2f2f2}#tnp-body #tabs .ui-tabs .ui-tabs-panel{padding:1em 0;background-color:#f2f2f2;margin:0;border:0}#tnp-body .ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{background:#fff!important;font-weight:normal;font-family:soleil,sans-serif}#tnp-body .ui-widget-content{background:#fff}#tnp-body .ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.tnp-extension-premium-box,.tnp-extension-free-box,.tnp-integration-box{width:300px;height:220px;background-color:#222b36;text-align:center;margin:20px;float:left;position:relative}.tnp-extension-premium-box:hover,.tnp-extension-free-box:hover,.tnp-integration-box:hover{background-color:#232c35;box-shadow:1px 1px 15px #222b36}.tnp-extension-premium-box p,.tnp-extension-free-box p,.tnp-integration-box p{padding:5px 10px;color:#72777c;font-size:14px;margin-top:0}.tnp-extension-premium-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-free-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-integration-box h3{font-family:soleil,sans-serif;padding:5px 8px!important;border-radius:3px;display:inline-block;font-size:16px;color:#fff;margin-bottom:0!important;margin-top:25px!important;font-weight:300;width:auto!important;border-bottom:none!important}.tnp-extension-premium-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-free-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-integration-action{bottom:0;position:absolute;width:100%;padding:12px;font-family:soleil,sans-serif}.tnp-extension-premium-action span{color:#27ae60}.tnp-extension-free-action span{color:#27ae60}.tnp-integration-action span{color:#27ae60}.tnp-extension-activate{color:#1abc9c;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-install{color:#2980b9;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-buy{color:#f1c40f;padding:5px 8px;text-decoration:none;cursor:pointer}#tnp-body a.tnp-extension-details{color:#999;padding:5px 8px;text-decoration:none;cursor:pointer}.tnp-extension-free{color:#d35400;padding:5px 8px;text-decoration:none;cursor:pointer;position:relative}img.tnp-extensions-free-badge{position:absolute;display:block;right:0;top:0;width:70px}.tnp-extensions-image img{margin:25px 0 -10px}#tnp-subscribe-overlay{height:100vh;width:100vw;z-index:10000;display:none;background-image:url(images/modal-background.png);background-repeat:repeat;position:fixed;top:0;left:-20px}#tnp-subscribe-modal{width:600px;background-color:rgba(255,255,255,1);margin-right:auto;margin-left:auto;margin-top:100px;-webkit-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);-moz-box-shadow:0 0 20px 0 rgba(0,0,0,0.5);box-shadow:0 0 20px 0 rgba(0,0,0,0.5);padding:25px;background-color:#1d2b38;text-align:center}#tnp-subscribe-modal img{width:30%}#tnp-subscribe-title{font-size:20px;margin-top:30px;margin-bottom:30px;line-height:30px;color:white;font-weight:200}#tnp-subscribe-email-wrapper{margin:20px}#tnp-subscribe-email-wrapper input{border:0;background-color:#223242;color:white}#tnp-subscribe-email{font-size:24px;box-sizing:border-box;width:100%;padding:10px;text-align:center}#tnp-subscribe-submit-wrapper{margin-bottom:20px}#tnp-subscribe-submit{font-size:24px;background-color:#219050;color:#fff;padding:10px 35px;border:0;font-size:17px;letter-spacing:2px}#tnp-subscribe-no-thanks{color:#666;margin-top:20px;margin-bottom:20px}#tnp-body div.tnp-emails-theme-options{background-color:#fff;padding:10px;margin-top:14px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{border:0;background:#ecf0f1;font-family:soleil,sans-serif}.cd-slider-wrapper{position:relative;width:100%;height:90vh;overflow:hidden;margin:0 auto}.cd-slider-wrapper .cd-slider,.cd-slider-wrapper .cd-slider>li{height:100%;width:100%}.tnp-logo-big{width:300px}.tnp-row{display:table-row}.tnp-third{width:33%;float:left}.tnp-welcome-confirm-button{color:#fff;padding:10px 30px;background-color:#2ecc71;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none;display:inline-block;text-align:center;margin:20px auto 0}.tnp-welcome-confirm-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-confirm-button:visited{color:#fff;text-decoration:none}.tnp-welcome-link-button{color:#fff;padding:10px 30px;background-color:#3498db;font-weight:700;font-size:15px;box-shadow:0 20px 38px rgba(0,0,0,0.16);text-decoration:none}.tnp-welcome-link-button:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-link-button:visited{color:#fff;text-decoration:none}#tnp-welcome input[type="text"],#tnp-welcome input[type="email"]{max-width:90%}.tnp-welcome-next{background-color:#2ecc71;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-next:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-next:visited{color:#fff;text-decoration:none}.tnp-welcome-prev{background-color:#3498db;padding:10px 20px;color:white;text-decoration:none;font-weight:600;font-size:16px;margin:0 0 0 10px;box-shadow:0 10px 30px rgba(0,0,0,0.16);width:-moz-fit-content;width:-webkit-fit-content;width:fit-content;display:flex;align-items:center}.tnp-welcome-prev:hover{box-shadow:0 0 38px rgba(0,0,0,0.16);color:#fff}.tnp-welcome-prev:visited{color:#fff;text-decoration:none}.tnp-welcome-next svg{margin-left:10px}.tnp-welcome-prev svg{margin-right:10px}.cd-slider input{width:250px;height:40px;border:1px solid #6c7280;background:#454a56;color:white;color:white;padding:0 10px}.cd-slider>li{position:absolute;top:0;left:0;opacity:0;display:table;background-position:center center;background-repeat:no-repeat;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.cd-slider>li.visible{position:relative;z-index:2;opacity:1}.cd-slider>li:first-of-type{background-color:#2b313a}.cd-slider>li:nth-of-type(2){background-color:#2b313a}.cd-slider>li:nth-of-type(3){background-color:#2b313a}.cd-slider>li:nth-of-type(4){background-color:#2b313a}.cd-slider>li:first-of-type,.cd-slider>li:nth-of-type(2),.cd-slider>li:nth-of-type(3),.cd-slider>li:nth-of-type(4){background-size:cover}.cd-slider>li>div{display:table-cell;vertical-align:middle;text-align:center}.cd-slider>li h2,.cd-slider>li p{text-shadow:0 1px 3px rgba(0,0,0,0.1);line-height:1.2;margin:0 auto 14px;color:#fff;width:90%;max-width:320px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}.cd-slider>li .cd-btn{display:inline-block;padding:1.2em 1.4em;margin-top:.8em;background-color:rgba(0,0,0,0.6);border-radius:.25em;font-size:1.3rem;font-weight:700;letter-spacing:1px;color:#fff;text-transform:uppercase;-webkit-transition:background-color .2s;-moz-transition:background-color .2s;transition:background-color .2s}.no-touch .cd-slider>li .cd-btn:hover{background-color:rgba(0,0,0,0.8)}@media only screen and (min-width:768px){.cd-slider>li h2,.cd-slider>li p{max-width:520px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:left;color:#b8c3c9;margin:40px auto}}@media only screen and (min-width:1170px){.cd-slider>li h2,.cd-slider>li p{margin-bottom:20px}.cd-slider>li h2{font-size:40px}.cd-slider>li p{font-size:18px;line-height:26px;text-align:center;color:#b8c3c9;margin:30px auto}}.cd-slider-navigation{position:relative;bottom:110px;z-index:3;display:flex;justify-content:center}.cd-svg-cover{position:absolute;z-index:1;left:0;top:0;height:100%;width:100%;opacity:0}.cd-svg-cover path{fill:#ed6a6a}.cd-svg-cover.is-animating{z-index:4;opacity:1;-webkit-transition:opacity .6s;-moz-transition:opacity .6s;transition:opacity .6s}.switch{position:relative;display:inline-block;width:60px;height:34px}.switch input{display:none}.slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.4s;transition:.4s}.slider:before{position:absolute;content:"";height:26px;width:26px;left:4px;bottom:4px;background-color:white;-webkit-transition:.4s;transition:.4s}input:checked+.slider{background-color:#2196f3}input:focus+.slider{box-shadow:0 0 1px #2196f3}input:checked+.slider:before{-webkit-transform:translateX(26px);-ms-transform:translateX(26px);transform:translateX(26px)}.slider.round{border-radius:34px}.slider.round:before{border-radius:50%}#tnp-body div.tnp-emails-theme-options table.form-table{margin:0}#tnp-body div.tnp-emails-theme-options h3{color:#000}.tnp-emails-edit #options-subject{font-size:16px;display:inline-block;margin:20px 0;width:auto;border-radius:4px;padding:5px 10px}.tnp-suggest-button{font-family:soleil,sans-serif;margin-left:8px;border-radius:3px;background-color:#2980b9;padding:10px 15px 8px;font-size:14px;color:#fff!important;text-decoration:none}.tnp-suggest-button:hover{background-color:#3f8dbf}.tnp-popup-overlay{display:none;position:fixed;top:0;left:0;width:100%;height:100%;background-color:rgba(0,0,0,.8);z-index:10000}.tnp-popup{width:40vw;height:66vh;overflow:auto;margin:100px auto 0 auto;background-color:#181818;padding:20px;position:relative}.tnp-popup-close{display:block;position:absolute;top:5px;right:5px;background-color:#181818;color:#fff;font-size:40px;padding:10px;text-align:right;cursor:pointer}.tnp-subjects-header{font-size:16px;color:#fff;padding:0 70px 20px 20px;font-family:soleil,sans-serif;border-bottom:1px solid #282828}#tnp-edit-subjects-list{padding:0 70px 20px 20px}#tnp-edit-subjects-list a{padding:5px}#tnp-edit-subjects-list svg{margin:0 10px 0 0;vertical-align:middle}.tnp-subject-category{color:#565656;margin:25px 0 10px 0;font-size:12px;text-transform:uppercase;letter-spacing:.1em}#tnp-edit-emoji-list{font-size:28px}#tnp-edit-emoji-list a{display:inline-block;margin-right:5px;margin-bottom:5px}.tnp-list-conditions p{margin:0 10px}.tnp-lists .tnp-notes{margin:0;font-size:.9em}iframe.tnp-editor-preview-mobile{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;box-shadow:1px 1px 10px #777;border-radius:10px;padding:5px;width:320px;height:500px;float:left}iframe.tnp-editor-preview-desktop{box-sizing:border-box;background-color:#fff;border:1px solid #bbb;border-radius:10px;box-shadow:1px 1px 10px #777;padding:15px;width:650px;margin-right:20px;height:500px;float:left}#tnp-license-control{border-left:5px solid #27ae60;display:inline-block;padding:15px 20px;margin-left:-10px;margin-top:15px;border-radius:2px;background-color:#fff}#tnp-license-control form{margin-bottom:10px;margin-top:10px}#tnp-license-control form input{padding-left:10px}#tnp-license-control a{border-bottom:0;color:#27ae60}#tnp-nl-status{width:100%;background:#fffafa;padding:15px 25px 15px 25px;border-left:10px solid #27ae60;border-radius:0 5px 5px 0}#tnp-nl-status p{font-size:17px}.tnp-nl-status-row{margin:10px 0}.tnp-nl-status-title{font-size:26px;line-height:32px;margin:5px 0 0 0;color:#3498db;font-weight:900;vertical-align:middle}.tnp-nl-status-title-value{font-size:13px;line-height:32px;margin:0 0 0 5px;color:#fff;background-color:#95a5a6;border-radius:4px;text-transform:uppercase;letter-spacing:1px;vertical-align:sub}.tnp-nl-status-schedule-targeting{font-size:15px;color:#34495e}.tnp-nl-status-schedule-value{font-size:15px;color:#34495e}.tnp-status-header #options-subject{width:calc(100% - 150px)}.tnp-one-third{width:40%;display:inline-block;vertical-align:top}.tnp-two-thirds{width:59%;display:inline-block;vertical-align:top}.tnp-progress{display:flex;height:1.5rem;overflow:hidden;font-size:.75rem;background-color:#c9cccf;border-radius:.25rem;margin:0;min-width:100px}.tnp-progress-bar{display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;-ms-flex-pack:center;justify-content:center;color:#fff;text-align:center;white-space:nowrap;background-color:#007bff;transition:width .6s ease}.tnp-progress.sent .tnp-progress-bar{background-color:green}.tnp-progress-numbers{text-align:center;color:#666}.tnp-progress-date{color:#666;font-style:italic}span.tnp-email-status-new{background-color:#8e44ad;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-paused{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sending{background-color:#27ae60;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-scheduled{background-color:#e67e22;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}span.tnp-email-status-sent{background-color:#95a5a6;padding:2px 10px;border-radius:4px;color:#fff;white-space:nowrap}.tnp-themes-new{border-bottom:2px solid #243342;margin-bottom:30px;padding-bottom:30px}#tnp-schedule-button{background-color:#e67e22!important}#tnp-schedule-button:hover{background-color:#ec913f!important}.tnp-button-cancel{background-color:#e74c3c!important}.tnpc-preview{margin-top:10px}.tnpc-preview .fake-browser-ui iframe{width:700px}.tnpc-preview .fake-mobile-browser-ui iframe{width:320px}.fake-browser-ui{padding:30px 0 0;border-radius:3px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;vertical-align:top;margin-left:20px}.fake-mobile-browser-ui{padding:30px 10px 37px;border-radius:10px;border-bottom:10px solid #ccc;background:#ddd;display:inline-block;position:relative;line-height:0;margin-left:30px}.fake-browser-ui .frame{display:block;height:25px;position:absolute;top:12px;left:8px}.fake-mobile-browser-ui .frame{display:block;height:25px;margin-top:10px}.fake-browser-ui span{height:12px;width:12px;border-radius:8px;background-color:#eee;border:1px solid #dadada;float:left;margin:0 0 0 4px}.fake-mobile-browser-ui span{height:50px;width:50px;border-radius:60px;background-color:#eee;border:2px solid #ccc;display:block;margin:auto}.fake-browser-ui .bt-1{background-color:#ed594a}.fake-browser-ui .bt-2{background-color:#fdd800}.fake-browser-ui .bt-3{background-color:#5ac05a}#tnp-promo{text-align:left;background-color:#222b36;margin:20px;border-radius:5px;padding:20px 40px}#tnp-promo .tnp-promo-how-to{width:50%;padding:5px 20px;margin-top:30px;margin-bottom:30px;border-left:2px solid #f1c40f}#tnp-promo .tnp-promo-how-to h3{color:#ecf0f1;margin:0;line-height:36px}#tnp-promo .tnp-promo-how-to p{color:#ecf0f1;margin:0;font-size:16px;line-height:26px}#tnp-promo .tnp-promo-buttons{margin:50px 0}#tnp-promo .tnp-promo-button{background:#27ae60;text-decoration:none;color:white;padding:15px 20px;font-size:15px;border-radius:2px}#tnp-promo .tnp-promo-button:hover{background:#2ecc71;color:white}#tnp-promo .tnp-promo-button i{margin-right:3px}#tnp-body td a.tnp-table-link,#tnp-body td a.tnp-table-link:visited{color:#444}#tnp-body td a.tnp-table-link:hover{color:#3498db}.text-left{text-align:left}.tab-min-height{min-height:500px}.tnp-control-all-languages-notice{padding:15px;border:1px dashed #999}
emails/blocks/posts/block.php CHANGED
@@ -18,6 +18,7 @@ $defaults = array(
18
  'title_font_family' => 'Helvetica, Arial, sans-serif',
19
  'title_font_size' => '25',
20
  'title_font_color' => '#333333',
 
21
  'max' => 4,
22
  'button_label' => __('Read more...', 'newsletter'),
23
  'categories' => '',
@@ -55,6 +56,7 @@ $excerpt_length = $options['excerpt_length'];
55
 
56
  $title_font_family = $options['title_font_family'];
57
  $title_font_size = $options['title_font_size'];
 
58
 
59
  $show_image = !empty($options['show_image']);
60
 
18
  'title_font_family' => 'Helvetica, Arial, sans-serif',
19
  'title_font_size' => '25',
20
  'title_font_color' => '#333333',
21
+ 'title_font_weight' => 'normal',
22
  'max' => 4,
23
  'button_label' => __('Read more...', 'newsletter'),
24
  'categories' => '',
56
 
57
  $title_font_family = $options['title_font_family'];
58
  $title_font_size = $options['title_font_size'];
59
+ $title_font_weight = $options['title_font_weight'];
60
 
61
  $show_image = !empty($options['show_image']);
62
 
emails/blocks/posts/layout-big-image.php CHANGED
@@ -14,7 +14,7 @@ $size = ['width' => 600, 'height' => 0];
14
  padding: 0 0 5px 0;
15
  font-size: <?php echo $title_font_size ?>px;
16
  font-family: <?php echo $title_font_family ?>;
17
- font-weight: normal;
18
  color: <?php echo $options['title_font_color'] ?>;
19
  line-height: normal;
20
  }
14
  padding: 0 0 5px 0;
15
  font-size: <?php echo $title_font_size ?>px;
16
  font-family: <?php echo $title_font_family ?>;
17
+ font-weight: <?php echo $title_font_weight ?>;
18
  color: <?php echo $options['title_font_color'] ?>;
19
  line-height: normal;
20
  }
emails/blocks/posts/layout-one.php CHANGED
@@ -14,7 +14,7 @@ $size = ['width' => 300, 'height' => 0];
14
  padding: 0 0 5px 0;
15
  font-size: <?php echo $title_font_size ?>px;
16
  font-family: <?php echo $title_font_family ?>;
17
- font-weight: normal;
18
  color: <?php echo $options['title_font_color'] ?>;
19
  line-height: normal;
20
  }
14
  padding: 0 0 5px 0;
15
  font-size: <?php echo $title_font_size ?>px;
16
  font-family: <?php echo $title_font_family ?>;
17
+ font-weight: <?php echo $title_font_weight ?>;
18
  color: <?php echo $options['title_font_color'] ?>;
19
  line-height: normal;
20
  }
emails/blocks/posts/layout-two.php CHANGED
@@ -14,6 +14,7 @@ $size = array('width' => 240, 'height' => 160, "crop" => true);
14
  font-family: <?php echo $title_font_family ?>;
15
  color: <?php echo $options['title_font_color'] ?>;
16
  font-size: <?php echo $title_font_size ?>px;
 
17
  line-height: 1.3em;
18
  }
19
  .post-excerpt {
14
  font-family: <?php echo $title_font_family ?>;
15
  color: <?php echo $options['title_font_color'] ?>;
16
  font-size: <?php echo $title_font_size ?>px;
17
+ font-weight: <?php echo $title_font_weight ?>;
18
  line-height: 1.3em;
19
  }
20
  .post-excerpt {
emails/blocks/social/block.php CHANGED
@@ -3,7 +3,7 @@
3
  * Name: Social links
4
  * Section: footer
5
  * Description: Link with icons to social profiles
6
- *
7
  */
8
 
9
  /* @var $options array */
@@ -98,6 +98,22 @@ $configured = false;
98
  <a href="<?php echo esc_url($block_options['vimeo_url']) ?>"><img src="<?php echo $social_icon_url ?>/vimeo.png" alt="Vimeo"></a>
99
  </span>
100
  <?php } ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
101
  <?php if (!$configured) { ?>
102
  <p>Configure your social links in the <a href="?page=newsletter_main_info">Social configuration section</a>.<br/>
103
  Then remove and add again this block.</p>
3
  * Name: Social links
4
  * Section: footer
5
  * Description: Link with icons to social profiles
6
+ *
7
  */
8
 
9
  /* @var $options array */
98
  <a href="<?php echo esc_url($block_options['vimeo_url']) ?>"><img src="<?php echo $social_icon_url ?>/vimeo.png" alt="Vimeo"></a>
99
  </span>
100
  <?php } ?>
101
+ <?php
102
+ if (!empty($block_options['telegram_url'])) {
103
+ $configured = true;
104
+ ?>
105
+ <span class="tnpc-row-edit" data-type="image">
106
+ <a href="<?php echo esc_url($block_options['telegram_url']) ?>"><img src="<?php echo $social_icon_url ?>/telegram.png" alt="Telegram"></a>
107
+ </span>
108
+ <?php } ?>
109
+ <?php
110
+ if (!empty($block_options['vk_url'])) {
111
+ $configured = true;
112
+ ?>
113
+ <span class="tnpc-row-edit" data-type="image">
114
+ <a href="<?php echo esc_url($block_options['vk_url']) ?>"><img src="<?php echo $social_icon_url ?>/vk.png" alt="VK"></a>
115
+ </span>
116
+ <?php } ?>
117
  <?php if (!$configured) { ?>
118
  <p>Configure your social links in the <a href="?page=newsletter_main_info">Social configuration section</a>.<br/>
119
  Then remove and add again this block.</p>
emails/edit.php CHANGED
@@ -316,19 +316,18 @@ if ($email['status'] != 'sent') {
316
  <?php } ?>
317
 
318
  <?php if ($email['status'] != 'sending' && $email['status'] != 'sent') $controls->button_save(); ?>
319
- <?php if ($email['status'] == 'new') { ?>
320
- <?php $controls->button_confirm('send', __('Send now', 'newsletter'), __('Start real delivery?', 'newsletter')); ?>
 
 
 
321
  <a id="tnp-schedule-button" class="button-secondary" href="javascript:tnp_toggle_schedule()"><i class="far fa-clock"></i> <?php _e("Schedule") ?></a>
322
  <span id="tnp-schedule" style="display: none;">
323
  <?php $controls->datetime('send_on') ?>
324
- <?php $controls->button_confirm('schedule', __('Schedule', 'newsletter'), __('Schedule delivery?', 'newsletter')); ?>
325
  <a class="button-secondary tnp-button-cancel" href="javascript:tnp_toggle_schedule()"><?php _e("Cancel") ?></a>
326
  </span>
327
- <?php } ?>
328
- <?php if ($email['status'] == 'sending') $controls->button_confirm('pause', __('Pause', 'newsletter'), __('Pause the delivery?', 'newsletter')); ?>
329
- <?php if ($email['status'] == 'paused') $controls->button_confirm('continue', __('Continue', 'newsletter'), 'Continue the delivery?'); ?>
330
- <?php if ($email['status'] == 'paused') $controls->button_confirm('abort', __('Stop', 'newsletter'), __('This totally stop the delivery, ok?', 'newsletter')); ?>
331
-
332
  </div>
333
 
334
  <?php $controls->text('subject', null, 'Subject'); ?>
316
  <?php } ?>
317
 
318
  <?php if ($email['status'] != 'sending' && $email['status'] != 'sent') $controls->button_save(); ?>
319
+ <?php if ($email['status'] == 'new' ) $controls->button_confirm('send', __('Send now', 'newsletter'), __('Start real delivery?', 'newsletter')); ?>
320
+ <?php if ($email['status'] == 'sending') $controls->button_confirm('pause', __('Pause', 'newsletter'), __('Pause the delivery?', 'newsletter')); ?>
321
+ <?php if ($email['status'] == 'paused') $controls->button_confirm('continue', __('Continue', 'newsletter'), 'Continue the delivery?'); ?>
322
+ <?php if ($email['status'] == 'paused') $controls->button_confirm('abort', __('Stop', 'newsletter'), __('This totally stop the delivery, ok?', 'newsletter')); ?>
323
+ <?php if ($email['status'] == 'new' || ( $email['status'] == 'paused' && $email['send_on'] > time() )) { ?>
324
  <a id="tnp-schedule-button" class="button-secondary" href="javascript:tnp_toggle_schedule()"><i class="far fa-clock"></i> <?php _e("Schedule") ?></a>
325
  <span id="tnp-schedule" style="display: none;">
326
  <?php $controls->datetime('send_on') ?>
327
+ <?php $controls->button_confirm('schedule', __('Schedule', 'newsletter'), __('Schedule delivery?', 'newsletter')); ?>
328
  <a class="button-secondary tnp-button-cancel" href="javascript:tnp_toggle_schedule()"><?php _e("Cancel") ?></a>
329
  </span>
330
+ <?php } ?>
 
 
 
 
331
  </div>
332
 
333
  <?php $controls->text('subject', null, 'Subject'); ?>
emails/index.php CHANGED
@@ -2,6 +2,8 @@
2
  defined('ABSPATH') || exit;
3
 
4
  require_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
 
 
5
  $controls = new NewsletterControls();
6
  $module = NewsletterEmails::instance();
7
 
@@ -31,7 +33,17 @@ if ($controls->is_action('delete_selected')) {
31
  $controls->messages .= $r . ' message(s) deleted';
32
  }
33
 
34
- $emails = $module->get_emails('message');
 
 
 
 
 
 
 
 
 
 
35
  ?>
36
 
37
  <div class="wrap tnp-emails tnp-emails-index" id="tnp-wrap">
@@ -49,10 +61,11 @@ $emails = $module->get_emails('message');
49
  <form method="post" action="">
50
  <?php $controls->init(); ?>
51
 
52
- <p>
53
- <a href="<?php echo $module->get_admin_page_url('theme'); ?>" class="button-primary"><?php _e('New newsletter', 'newsletter') ?></a>
54
- <?php $controls->button_confirm('delete_selected', __('Delete selected newsletters', 'newsletter')); ?>
55
- </p>
 
56
  <table class="widefat tnp-newsletters-list" style="width: 100%">
57
  <thead>
58
  <tr>
@@ -94,11 +107,11 @@ $emails = $module->get_emails('message');
94
  <td>
95
  <?php echo $module->get_edit_button($email) ?>
96
  </td>
97
-
98
  <td>
99
- <a class="button-primary" href="<?php echo NewsletterStatistics::instance()->get_statistics_url($email->id); ?>"><i class="fa fa-chart-bar"></i> <?php _e('Statistics', 'newsletter') ?></a>
100
  </td>
101
- <td><a class="button-primary" target="_blank" rel="noopener" href="<?php echo home_url('/')?>?na=view&id=<?php echo $email->id; ?>"><i class="fa fa-eye"></i>&nbsp;<?php _e('View', 'newsletter')?></a></td>
102
  <td><?php $controls->button_copy($email->id); ?></td>
103
  <td><?php $controls->button_delete($email->id); ?></td>
104
  </tr>
2
  defined('ABSPATH') || exit;
3
 
4
  require_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
5
+ require_once NEWSLETTER_INCLUDES_DIR . '/paginator.php';
6
+
7
  $controls = new NewsletterControls();
8
  $module = NewsletterEmails::instance();
9
 
33
  $controls->messages .= $r . ' message(s) deleted';
34
  }
35
 
36
+ /* ====================================== */
37
+ /* ======= PAGINATION CONTROLLERS ======= */
38
+ /* ====================================== */
39
+
40
+ $pagination_controller = new TNP_Pagination_Controller( NEWSLETTER_EMAILS_TABLE, 'id', [ 'type' => 'message' ] );
41
+ $emails = $pagination_controller->get_items();
42
+
43
+ /* ====================================== */
44
+ /* ===== END PAGINATION CONTROLLERS ===== */
45
+ /* ====================================== */
46
+
47
  ?>
48
 
49
  <div class="wrap tnp-emails tnp-emails-index" id="tnp-wrap">
61
  <form method="post" action="">
62
  <?php $controls->init(); ?>
63
 
64
+ <a href="<?php echo $module->get_admin_page_url('theme'); ?>" class="button-primary"><?php _e('New newsletter', 'newsletter') ?></a>
65
+ <?php $controls->button_confirm('delete_selected', __('Delete selected newsletters', 'newsletter')); ?>
66
+
67
+ <?php $pagination_controller->display_paginator(); ?>
68
+
69
  <table class="widefat tnp-newsletters-list" style="width: 100%">
70
  <thead>
71
  <tr>
107
  <td>
108
  <?php echo $module->get_edit_button($email) ?>
109
  </td>
110
+
111
  <td>
112
+ <a class="button-primary" href="<?php echo NewsletterStatistics::instance()->get_statistics_url($email->id); ?>"><i class="fas fa-chart-bar"></i> <?php _e('Statistics', 'newsletter') ?></a>
113
  </td>
114
+ <td><a class="button-primary" target="_blank" rel="noopener" href="<?php echo home_url('/')?>?na=view&id=<?php echo $email->id; ?>"><i class="fas fa-eye"></i>&nbsp;<?php _e('View', 'newsletter')?></a></td>
115
  <td><?php $controls->button_copy($email->id); ?></td>
116
  <td><?php $controls->button_delete($email->id); ?></td>
117
  </tr>
emails/themes/default/images/soundcloud.png CHANGED
Binary file
emails/themes/default/images/telegram.png ADDED
Binary file
emails/themes/default/images/vk.png ADDED
Binary file
emails/tnp-composer/index-v2.php CHANGED
@@ -91,7 +91,9 @@ $fields = new NewsletterFields($controls);
91
 
92
  <form id="tnpc-global-styles-form">
93
 
94
- <?php $fields->color('options_composer_background', __('Background color', 'newsletter'), ['default'=>'#f4f4f4']) ?>
 
 
95
  </form>
96
 
97
  </div>
91
 
92
  <form id="tnpc-global-styles-form">
93
 
94
+ <?php $fields->color( 'options_composer_background', __( 'Background color', 'newsletter' ), [ 'default' => '#f4f4f4' ] ) ?>
95
+ <?php $fields->text( 'options_preheader', __( 'Snippet', 'newsletter' ), ['description'=>'Short content preview shown by Gmail']) ?>
96
+
97
  </form>
98
 
99
  </div>
includes/addon.php CHANGED
@@ -10,6 +10,7 @@ class NewsletterAddon {
10
  var $name;
11
  var $options;
12
  var $version;
 
13
 
14
  public function __construct($name, $version = '0.0.0') {
15
  $this->name = $name;
@@ -43,6 +44,18 @@ class NewsletterAddon {
43
 
44
  }
45
 
 
 
 
 
 
 
 
 
 
 
 
 
46
  /**
47
  * General logger for this add-on.
48
  *
@@ -70,13 +83,26 @@ class NewsletterAddon {
70
  /**
71
  * Loads and prepares the options. It can be used to late initialize the options to save some resources on
72
  * add-ons which do not need to do something on each page load.
73
- * @return array
74
  */
75
  function setup_options() {
76
  if ($this->options) {
77
  return;
78
  }
79
- $this->options = get_option('newsletter_' . $this->name, array());
 
 
 
 
 
 
 
 
 
 
 
 
 
 
80
  }
81
 
82
  /**
@@ -84,17 +110,45 @@ class NewsletterAddon {
84
  * property.
85
  * @param array $options
86
  */
87
- function save_options($options) {
88
- update_option('newsletter_' . $this->name, $options);
89
- $this->options = $options;
 
 
 
 
90
  }
91
 
92
  function merge_defaults($defaults) {
93
- $options = get_option('newsletter_' . $this->name, array());
94
  $options = array_merge($defaults, $options);
95
  $this->save_options($options);
96
  }
97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  /**
99
  * Equivalent to $wpdb->query() but logs the event in case of error.
100
  *
@@ -116,7 +170,7 @@ class NewsletterAddon {
116
  }
117
 
118
  /**
119
- * Used by mailers add-ons as base-class. Some specific options collected by the mailer
120
  * are interpreted automatically.
121
  *
122
  * They are:
@@ -163,8 +217,8 @@ class NewsletterMailerAddon extends NewsletterAddon {
163
  update_option('newsletter_' . $this->name . '_last_run', $time);
164
  }
165
 
166
- function save_options($options) {
167
- parent::save_options($options);
168
  $this->enabled = !empty($options['enabled']);
169
  }
170
 
@@ -200,7 +254,7 @@ class NewsletterMailerAddon extends NewsletterAddon {
200
  if ($type) {
201
  $message->subject .= ' - ' . $type . ' only';
202
  }
203
-
204
  $message->from = Newsletter::instance()->options['sender_email'];
205
  $message->from_name = Newsletter::instance()->options['sender_name'];
206
  return $message;
10
  var $name;
11
  var $options;
12
  var $version;
13
+ var $labels;
14
 
15
  public function __construct($name, $version = '0.0.0') {
16
  $this->name = $name;
44
 
45
  }
46
 
47
+ function get_current_language() {
48
+ return Newsletter::instance()->get_current_language();
49
+ }
50
+
51
+ function is_all_languages() {
52
+ return Newsletter::instance()->is_all_languages();
53
+ }
54
+
55
+ function is_allowed() {
56
+ return Newsletter::instance()->is_allowed();
57
+ }
58
+
59
  /**
60
  * General logger for this add-on.
61
  *
83
  /**
84
  * Loads and prepares the options. It can be used to late initialize the options to save some resources on
85
  * add-ons which do not need to do something on each page load.
 
86
  */
87
  function setup_options() {
88
  if ($this->options) {
89
  return;
90
  }
91
+ $this->options = get_option('newsletter_' . $this->name, []);
92
+ }
93
+
94
+ /**
95
+ * Retrieve the stored options, merged with the specified language set.
96
+ *
97
+ * @param string $language
98
+ * @return array
99
+ */
100
+ function get_options($language = '') {
101
+ if ($language) {
102
+ return array_merge(get_option('newsletter_' . $this->name, []), get_option('newsletter_' . $this->name . '_' . $language, []));
103
+ } else {
104
+ return get_option('newsletter_' . $this->name, []);
105
+ }
106
  }
107
 
108
  /**
110
  * property.
111
  * @param array $options
112
  */
113
+ function save_options($options, $language = '') {
114
+ if ($language) {
115
+ update_option('newsletter_' . $this->name . '_' . $language, $options);
116
+ } else {
117
+ update_option('newsletter_' . $this->name, $options);
118
+ $this->options = $options;
119
+ }
120
  }
121
 
122
  function merge_defaults($defaults) {
123
+ $options = get_option('newsletter_' . $this->name, []);
124
  $options = array_merge($defaults, $options);
125
  $this->save_options($options);
126
  }
127
 
128
+ /**
129
+ *
130
+ */
131
+ function setup_labels() {
132
+ if (!$this->labels) {
133
+ $labels = [];
134
+ }
135
+ }
136
+
137
+ function get_label($key) {
138
+ if (!$this->options)
139
+ $this->setup_options();
140
+
141
+ if (!empty($this->options[$key])) {
142
+ return $this->options[$key];
143
+ }
144
+
145
+ if (!$this->labels)
146
+ $this->setup_labels();
147
+
148
+ // We assume the required key is defined. If not there is an error elsewhere.
149
+ return $this->labels[$key];
150
+ }
151
+
152
  /**
153
  * Equivalent to $wpdb->query() but logs the event in case of error.
154
  *
170
  }
171
 
172
  /**
173
+ * Used by mailer add-ons as base-class. Some specific options collected by the mailer
174
  * are interpreted automatically.
175
  *
176
  * They are:
217
  update_option('newsletter_' . $this->name . '_last_run', $time);
218
  }
219
 
220
+ function save_options($options, $language = '') {
221
+ parent::save_options($options, $language);
222
  $this->enabled = !empty($options['enabled']);
223
  }
224
 
254
  if ($type) {
255
  $message->subject .= ' - ' . $type . ' only';
256
  }
257
+
258
  $message->from = Newsletter::instance()->options['sender_email'];
259
  $message->from_name = Newsletter::instance()->options['sender_name'];
260
  return $message;
includes/composer.php CHANGED
@@ -91,10 +91,25 @@ class TNP_Composer {
91
  $open .= "\n</style>\n";
92
  $open .= "</head>\n";
93
  $open .= '<body style="margin: 0; padding: 0;" dir="' . (is_rtl() ? 'rtl' : 'ltr') . '">';
94
- $open .= "\n";
 
 
95
  return $open;
96
  }
97
 
 
 
 
 
 
 
 
 
 
 
 
 
 
98
  static function get_html_close($email) {
99
  return "</body>\n</html>";
100
  }
@@ -255,9 +270,26 @@ class TNP_Composer {
255
  return false;
256
  }
257
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
258
  static function button($options, $prefix = 'button') {
259
  $defaults = [
260
- 'button_url' => '#',
261
  $prefix . '_font_family' => 'Helvetica, Arial, sans-serif',
262
  $prefix . '_label' => 'Click Here',
263
  $prefix . '_font_color' => '#ffffff',
@@ -265,9 +297,9 @@ class TNP_Composer {
265
  $prefix . '_font_size' => 20,
266
  $prefix . '_background' => '#256F9C',
267
  ];
268
-
269
  $options = array_merge($defaults, $options);
270
-
271
  $b = '<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:separate;line-height:100%;">';
272
  $b .= '<tr>';
273
  $b .= '<td align="center" bgcolor="' . $options[$prefix . '_background'] . '" role="presentation" style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:' . $options[$prefix . '_background'] . '" valign="middle">';
@@ -282,7 +314,7 @@ class TNP_Composer {
282
 
283
  /**
284
  * Generates an IMG tag, linked if the media has an URL.
285
- *
286
  * @param TNP_Media $media
287
  * @return string
288
  */
@@ -308,7 +340,7 @@ class TNP_Composer {
308
  * Returns a WP media ID for the specified post (or false if nothing can be found)
309
  * looking for the featured image or, if missing, taking the first media in the gallery and
310
  * if again missing, searching the first reference to a media in the post content.
311
- *
312
  * @param int $post_id
313
  * @return int
314
  */
@@ -371,6 +403,7 @@ class TNP_Composer_Grid_System {
371
  public function __construct($columns_per_row) {
372
  $this->cells_per_row = $columns_per_row;
373
  $this->cells_counter = 0;
 
374
  }
375
 
376
  public function __toString() {
91
  $open .= "\n</style>\n";
92
  $open .= "</head>\n";
93
  $open .= '<body style="margin: 0; padding: 0;" dir="' . (is_rtl() ? 'rtl' : 'ltr') . '">';
94
+ $open .= "\n";
95
+ $open .= self::get_html_preheader( $email );
96
+
97
  return $open;
98
  }
99
 
100
+ static private function get_html_preheader( $email ) {
101
+
102
+ if ( empty ( $email->options['preheader'] ) ) {
103
+ return "";
104
+ }
105
+
106
+ $preheader_text = $email->options['preheader'];
107
+ $html = "<div style=\"display:none;font-size:1px;color:#ffffff;line-height:1px;max-height:0px;max-width:0px;opacity:0;overflow:hidden;\">$preheader_text</div>";
108
+ $html .= "\n";
109
+
110
+ return $html;
111
+ }
112
+
113
  static function get_html_close($email) {
114
  return "</body>\n</html>";
115
  }
270
  return false;
271
  }
272
 
273
+ /**
274
+ * Creates the HTML for a button extrating from the options, with the provided prefix, the button attributes:
275
+ *
276
+ * - [prefix]_url The button URL
277
+ * - [prefix]_font_family
278
+ * - [prefix]_font_size
279
+ * - [prefix]_font_weight
280
+ * - [prefix]_label
281
+ * - [prefix]_font_color The label color
282
+ * - [prefix]_background The button color
283
+ *
284
+ * TODO: Add radius and possiblt the alignment
285
+ *
286
+ * @param array $options
287
+ * @param string $prefix
288
+ * @return string
289
+ */
290
  static function button($options, $prefix = 'button') {
291
  $defaults = [
292
+ $prefix . '_url' => '#',
293
  $prefix . '_font_family' => 'Helvetica, Arial, sans-serif',
294
  $prefix . '_label' => 'Click Here',
295
  $prefix . '_font_color' => '#ffffff',
297
  $prefix . '_font_size' => 20,
298
  $prefix . '_background' => '#256F9C',
299
  ];
300
+
301
  $options = array_merge($defaults, $options);
302
+
303
  $b = '<table border="0" cellpadding="0" cellspacing="0" role="presentation" style="border-collapse:separate;line-height:100%;">';
304
  $b .= '<tr>';
305
  $b .= '<td align="center" bgcolor="' . $options[$prefix . '_background'] . '" role="presentation" style="border:none;border-radius:3px;cursor:auto;mso-padding-alt:10px 25px;background:' . $options[$prefix . '_background'] . '" valign="middle">';
314
 
315
  /**
316
  * Generates an IMG tag, linked if the media has an URL.
317
+ *
318
  * @param TNP_Media $media
319
  * @return string
320
  */
340
  * Returns a WP media ID for the specified post (or false if nothing can be found)
341
  * looking for the featured image or, if missing, taking the first media in the gallery and
342
  * if again missing, searching the first reference to a media in the post content.
343
+ *
344
  * @param int $post_id
345
  * @return int
346
  */
403
  public function __construct($columns_per_row) {
404
  $this->cells_per_row = $columns_per_row;
405
  $this->cells_counter = 0;
406
+ $this->rows = [];
407
  }
408
 
409
  public function __toString() {
includes/controls.php CHANGED
@@ -427,6 +427,12 @@ class NewsletterControls {
427
  }
428
  $this->warnings[] = 'You are configuring the language <strong>' . $newsletter->get_language_label($current_language) . '</strong>. Switch to "all languages" to see all options.';
429
  }
 
 
 
 
 
 
430
 
431
  function hint($text, $url = '') {
432
  echo '<div class="hints">';
@@ -1208,6 +1214,11 @@ class NewsletterControls {
1208
  $lists = $this->get_list_options($empty_label);
1209
  $this->select($name, $lists);
1210
  }
 
 
 
 
 
1211
 
1212
  /**
1213
  * Generates an associative array with the active lists to be used in a select.
@@ -1225,6 +1236,18 @@ class NewsletterControls {
1225
  }
1226
  return $lists;
1227
  }
 
 
 
 
 
 
 
 
 
 
 
 
1228
 
1229
  function date($name) {
1230
  $this->hidden($name);
427
  }
428
  $this->warnings[] = 'You are configuring the language <strong>' . $newsletter->get_language_label($current_language) . '</strong>. Switch to "all languages" to see all options.';
429
  }
430
+
431
+ function switch_to_all_languages_notice() {
432
+ echo '<div class="tnp-control-all-languages-notice">';
433
+ _e('Switch the administration side to "all languages" to set these options', 'newsletter');
434
+ echo '</div>';
435
+ }
436
 
437
  function hint($text, $url = '') {
438
  echo '<div class="hints">';
1214
  $lists = $this->get_list_options($empty_label);
1215
  $this->select($name, $lists);
1216
  }
1217
+
1218
+ function public_lists_select($name = 'list', $empty_label = null) {
1219
+ $lists = $this->get_public_list_options($empty_label);
1220
+ $this->select($name, $lists);
1221
+ }
1222
 
1223
  /**
1224
  * Generates an associative array with the active lists to be used in a select.
1236
  }
1237
  return $lists;
1238
  }
1239
+
1240
+ function get_public_list_options($empty_label = null) {
1241
+ $objs = Newsletter::instance()->get_lists_public();
1242
+ $lists = array();
1243
+ if ($empty_label) {
1244
+ $lists[''] = $empty_label;
1245
+ }
1246
+ foreach ($objs as $list) {
1247
+ $lists['' . $list->id] = '(' . $list->id . ') ' . esc_html($list->name);
1248
+ }
1249
+ return $lists;
1250
+ }
1251
 
1252
  function date($name) {
1253
  $this->hidden($name);
includes/mailer.php CHANGED
@@ -112,14 +112,13 @@ class NewsletterMailer {
112
  }
113
 
114
  /**
115
- *
116
  * @return NewsletterLogger
117
  */
118
  function get_logger() {
119
  if ($this->logger) {
120
  return $this->logger;
121
  }
122
- $this->logger = new NewsletterLogger('mailer-' . $this->name);
123
  return $this->logger;
124
  }
125
 
112
  }
113
 
114
  /**
 
115
  * @return NewsletterLogger
116
  */
117
  function get_logger() {
118
  if ($this->logger) {
119
  return $this->logger;
120
  }
121
+ $this->logger = new NewsletterLogger($this->name . '-mailer');
122
  return $this->logger;
123
  }
124
 
includes/module.php CHANGED
@@ -106,7 +106,7 @@ class TNP_Profile {
106
  function is_private() {
107
  return $this->status == self::STATUS_PRIVATE;
108
  }
109
-
110
  function show_on_profile() {
111
  return $this->status == self::STATUS_PROFILE_ONLY || $this->status == self::STATUS_PUBLIC;
112
  }
@@ -363,6 +363,8 @@ class NewsletterModule {
363
  */
364
  var $themes;
365
  var $components;
 
 
366
 
367
  function __construct($module, $version, $module_id = null, $components = array()) {
368
  $this->module = $module;
@@ -1059,7 +1061,7 @@ class NewsletterModule {
1059
  return $email->total > 0 ? intval($email->sent / $email->total * 100) : 0;
1060
  }
1061
 
1062
- function show_email_progress_bar($email, $attrs = array()) {
1063
 
1064
  $email = (object) $email;
1065
 
@@ -1069,6 +1071,7 @@ class NewsletterModule {
1069
  if ($attrs['scheduled']) {
1070
  echo '<span class="tnp-progress-date">', $this->format_date($email->send_on), '</span>';
1071
  }
 
1072
  } else if ($email->status == 'new') {
1073
  echo '';
1074
  return;
@@ -1078,11 +1081,6 @@ class NewsletterModule {
1078
  $percent = $this->get_email_progress($email);
1079
  }
1080
 
1081
-
1082
- $label = $percent;
1083
- if ($attrs['format'] == 'numbers') {
1084
- $label = $email->sent . ' ' . __('of', 'newsletter') . ' ' . $email->total;
1085
- }
1086
  echo '<div class="tnp-progress ', $email->status, '">';
1087
  echo '<div class="tnp-progress-bar" role="progressbar" style="width: ', $percent, '%;">&nbsp;', $percent, '%&nbsp;</div>';
1088
  echo '</div>';
@@ -1339,10 +1337,10 @@ class NewsletterModule {
1339
  function get_profiles($language = '') {
1340
  return TNP_Profile_Service::get_profiles($language);
1341
  }
1342
-
1343
  /**
1344
  * Returns a list of TNP_Profile which are public.
1345
- *
1346
  * @staticvar array $profiles
1347
  * @param string $language
1348
  * @return TNP_Profile[]
@@ -1352,17 +1350,17 @@ class NewsletterModule {
1352
  if (isset($profiles[$language])) {
1353
  return $profiles[$language];
1354
  }
1355
-
1356
  $profiles[$language] = [];
1357
  $all = $this->get_profiles($language);
1358
  foreach ($all as $profile) {
1359
  if ($profile->is_private()) continue;
1360
-
1361
  $profiles[$language]['' . $profile->id] = $profile;
1362
  }
1363
  return $profiles[$language];
1364
  }
1365
-
1366
  /**
1367
  * Really bad name!
1368
  * @staticvar array $profiles
@@ -1374,16 +1372,16 @@ class NewsletterModule {
1374
  if (isset($profiles[$language])) {
1375
  return $profiles[$language];
1376
  }
1377
-
1378
  $profiles[$language] = [];
1379
  $all = $this->get_profiles($language);
1380
  foreach ($all as $profile) {
1381
  if (!$profile->show_on_profile()) continue;
1382
-
1383
  $profiles[$language]['' . $profile->id] = $profile;
1384
  }
1385
  return $profiles[$language];
1386
- }
1387
 
1388
  /**
1389
  * @param string $language The language for the list labels (it does not affect the lists returned)
@@ -2065,8 +2063,9 @@ class NewsletterModule {
2065
 
2066
  public static function antibot_form_check($captcha = false) {
2067
 
2068
- if (!NEWSLETTER_ANTIBOT)
2069
- return true;
 
2070
 
2071
  if (strtolower($_SERVER['REQUEST_METHOD']) != 'post') {
2072
  return false;
@@ -2248,6 +2247,10 @@ class NewsletterModule {
2248
  $text = str_replace("\n", "\r\n", $text);
2249
  return $text;
2250
  }
 
 
 
 
2251
 
2252
  /**
2253
  * Return the current language code. Optionally, if a user is passed and it has a language
@@ -2262,6 +2265,10 @@ class NewsletterModule {
2262
  if ($user && $user->language) {
2263
  return $user->language;
2264
  }
 
 
 
 
2265
 
2266
  // WPML
2267
  if (class_exists('SitePress')) {
106
  function is_private() {
107
  return $this->status == self::STATUS_PRIVATE;
108
  }
109
+
110
  function show_on_profile() {
111
  return $this->status == self::STATUS_PROFILE_ONLY || $this->status == self::STATUS_PUBLIC;
112
  }
363
  */
364
  var $themes;
365
  var $components;
366
+
367
+ static $current_language = '';
368
 
369
  function __construct($module, $version, $module_id = null, $components = array()) {
370
  $this->module = $module;
1061
  return $email->total > 0 ? intval($email->sent / $email->total * 100) : 0;
1062
  }
1063
 
1064
+ function show_email_progress_bar($email, $attrs = []) {
1065
 
1066
  $email = (object) $email;
1067
 
1071
  if ($attrs['scheduled']) {
1072
  echo '<span class="tnp-progress-date">', $this->format_date($email->send_on), '</span>';
1073
  }
1074
+ return;
1075
  } else if ($email->status == 'new') {
1076
  echo '';
1077
  return;
1081
  $percent = $this->get_email_progress($email);
1082
  }
1083
 
 
 
 
 
 
1084
  echo '<div class="tnp-progress ', $email->status, '">';
1085
  echo '<div class="tnp-progress-bar" role="progressbar" style="width: ', $percent, '%;">&nbsp;', $percent, '%&nbsp;</div>';
1086
  echo '</div>';
1337
  function get_profiles($language = '') {
1338
  return TNP_Profile_Service::get_profiles($language);
1339
  }
1340
+
1341
  /**
1342
  * Returns a list of TNP_Profile which are public.
1343
+ *
1344
  * @staticvar array $profiles
1345
  * @param string $language
1346
  * @return TNP_Profile[]
1350
  if (isset($profiles[$language])) {
1351
  return $profiles[$language];
1352
  }
1353
+
1354
  $profiles[$language] = [];
1355
  $all = $this->get_profiles($language);
1356
  foreach ($all as $profile) {
1357
  if ($profile->is_private()) continue;
1358
+
1359
  $profiles[$language]['' . $profile->id] = $profile;
1360
  }
1361
  return $profiles[$language];
1362
  }
1363
+
1364
  /**
1365
  * Really bad name!
1366
  * @staticvar array $profiles
1372
  if (isset($profiles[$language])) {
1373
  return $profiles[$language];
1374
  }
1375
+
1376
  $profiles[$language] = [];
1377
  $all = $this->get_profiles($language);
1378
  foreach ($all as $profile) {
1379
  if (!$profile->show_on_profile()) continue;
1380
+
1381
  $profiles[$language]['' . $profile->id] = $profile;
1382
  }
1383
  return $profiles[$language];
1384
+ }
1385
 
1386
  /**
1387
  * @param string $language The language for the list labels (it does not affect the lists returned)
2063
 
2064
  public static function antibot_form_check($captcha = false) {
2065
 
2066
+ if ( defined( 'NEWSLETTER_ANTIBOT' ) && ! NEWSLETTER_ANTIBOT ) {
2067
+ return true;
2068
+ }
2069
 
2070
  if (strtolower($_SERVER['REQUEST_METHOD']) != 'post') {
2071
  return false;
2247
  $text = str_replace("\n", "\r\n", $text);
2248
  return $text;
2249
  }
2250
+
2251
+ function set_current_language($language) {
2252
+ self::$current_language = $language;
2253
+ }
2254
 
2255
  /**
2256
  * Return the current language code. Optionally, if a user is passed and it has a language
2265
  if ($user && $user->language) {
2266
  return $user->language;
2267
  }
2268
+
2269
+ if (!empty(self::$current_language)) {
2270
+ return self::$current_language;
2271
+ }
2272
 
2273
  // WPML
2274
  if (class_exists('SitePress')) {
includes/paginator.php ADDED
@@ -0,0 +1,147 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+
3
+ require_once NEWSLETTER_INCLUDES_DIR . '/controls.php';
4
+
5
+ class TNP_Pagination_Controller {
6
+
7
+ private $items_per_page;
8
+ private $total_items;
9
+ private $filters;
10
+ private $columns;
11
+ private $controls;
12
+ private $items;
13
+ private $current_page;
14
+ private $last_page;
15
+ private $table;
16
+ private $orderby_column;
17
+
18
+ public function __construct( $table, $orderby_column, $filters = [], $items_per_page = 20, $columns = [] ) {
19
+ $this->table = $table;
20
+ $this->orderby_column = $orderby_column;
21
+ $this->items_per_page = $items_per_page;
22
+ $this->columns = $columns;
23
+ $this->filters = $filters;
24
+ $this->total_items = $this->get_total_items();
25
+ $this->controls = new NewsletterControls();
26
+ $this->current_page = $this->compute_current_page();
27
+ }
28
+
29
+ public function get_current_page() {
30
+ return $this->current_page;
31
+ }
32
+
33
+ private function compute_current_page() {
34
+
35
+ $current_page = ! empty( $this->controls->data['search_page'] ) ? (int) $this->controls->data['search_page'] : 1;
36
+
37
+ if ( $this->controls->is_action( 'last' ) ) {
38
+ $current_page = $this->get_last_page();
39
+ }
40
+ if ( $this->controls->is_action( 'first' ) || $this->controls->is_action( 'search' ) ) {
41
+ $current_page = 1;
42
+ }
43
+ if ( $this->controls->is_action( 'next' ) ) {
44
+ $current_page ++;
45
+ }
46
+ if ( $this->controls->is_action( 'prev' ) ) {
47
+ $current_page --;
48
+ }
49
+
50
+ // Eventually fix the page
51
+ if ( $current_page <= 0 ) {
52
+ $current_page = 1;
53
+ }
54
+
55
+ if ( $current_page > $this->get_last_page() ) {
56
+ $current_page = $this->get_last_page();
57
+ }
58
+
59
+ $this->controls->data['search_page'] = $current_page;
60
+
61
+ return $current_page;
62
+
63
+ }
64
+
65
+ public function get_last_page() {
66
+
67
+ if ( is_null( $this->last_page ) ) {
68
+ $this->last_page = (int) floor( $this->total_items / $this->items_per_page ) + ( $this->total_items % $this->items_per_page > 0 ? 1 : 0 );
69
+ }
70
+
71
+ return $this->last_page;
72
+
73
+ }
74
+
75
+ public function get_items() {
76
+
77
+ if ( is_null( $this->items ) ) {
78
+ if ( $this->total_items > 0 ) {
79
+ global $wpdb;
80
+ $query = $wpdb->prepare( "SELECT " . $this->get_columns_query() . " FROM " . $this->table . $this->get_where_clause() . " ORDER BY " . $this->orderby_column . " DESC LIMIT %d,%d",
81
+ ( $this->current_page - 1 ) * $this->items_per_page, $this->items_per_page );
82
+
83
+ $this->items = $wpdb->get_results( $query, OBJECT );
84
+ } else {
85
+ $this->items = [];
86
+ }
87
+ }
88
+
89
+ return $this->items;
90
+
91
+ }
92
+
93
+ private function get_columns_query() {
94
+ if ( empty( $this->columns ) ) {
95
+ return " * ";
96
+ } else {
97
+ return " " . implode( ',', $this->columns ) . " ";
98
+ }
99
+ }
100
+
101
+ public function get_total_items() {
102
+
103
+ if ( is_null( $this->total_items ) ) {
104
+ $this->total_items = Newsletter::instance()->store->get_count( $this->table, $this->get_where_clause() );
105
+ }
106
+
107
+ return $this->total_items;
108
+ }
109
+
110
+ private function get_where_clause() {
111
+ if ( empty( $this->filters ) ) {
112
+ return ' ';
113
+ }
114
+
115
+ $where = ' where ';
116
+ foreach ( $this->filters as $column => $value ) {
117
+ $where .= "$column=%s ";
118
+ }
119
+
120
+ global $wpdb;
121
+ $where = $wpdb->prepare( $where, array_values( $this->filters ) );
122
+
123
+ return $where;
124
+ }
125
+
126
+ public function display_paginator() {
127
+
128
+ ?>
129
+
130
+ <div class="tnp-paginator">
131
+
132
+ <?php $this->controls->button( 'first', '«' ); ?>
133
+ <?php $this->controls->button( 'prev', '‹' ); ?>
134
+ <?php $this->controls->text( 'search_page', 3 ); ?>
135
+ of <?php echo $this->last_page ?> <?php $this->controls->button( 'go', __( 'Go', 'newsletter' ) ); ?>
136
+ <?php $this->controls->button( 'next', '›' ); ?>
137
+ <?php $this->controls->button( 'last', '»' ); ?>
138
+ <?php echo $this->get_total_items() ?> <?php _e( 'newsletter(s) found', 'newsletter' ) ?>
139
+
140
+ </div>
141
+
142
+ <?php
143
+
144
+ }
145
+
146
+
147
+ }
main/defaults-info.php CHANGED
@@ -15,5 +15,7 @@ $options = array(
15
  'tumblr_url' => '',
16
  'youtube_url' => '',
17
  'vimeo_url' => '',
18
- 'soundcloud_url' => ''
 
 
19
  );
15
  'tumblr_url' => '',
16
  'youtube_url' => '',
17
  'vimeo_url' => '',
18
+ 'soundcloud_url' => '',
19
+ 'telegram_url' => '',
20
+ 'vk_url' => ''
21
  );
main/defaults.php CHANGED
@@ -22,7 +22,7 @@ $options = array(
22
  'page'=>0,
23
  'disable_cron_notice'=>0,
24
  'do_shortcodes'=>0,
25
-
26
  'header_logo' => '',
27
  'header_title' => get_bloginfo('name'),
28
  'header_sub' => get_bloginfo('description'),
@@ -37,5 +37,7 @@ $options = array(
37
  'tumblr_url' => '',
38
  'youtube_url' => '',
39
  'vimeo_url' => '',
40
- 'soundcloud_url' => ''
 
 
41
  );
22
  'page'=>0,
23
  'disable_cron_notice'=>0,
24
  'do_shortcodes'=>0,
25
+
26
  'header_logo' => '',
27
  'header_title' => get_bloginfo('name'),
28
  'header_sub' => get_bloginfo('description'),
37
  'tumblr_url' => '',
38
  'youtube_url' => '',
39
  'vimeo_url' => '',
40
+ 'soundcloud_url' => '',
41
+ 'telegram_url' => '',
42
+ 'vk_url' => ''
43
  );
main/info.php CHANGED
@@ -94,7 +94,7 @@ if (!$controls->is_action()) {
94
  <?php $controls->text('footer_legal', 40); ?>
95
  </td>
96
  </tr>
97
- </table>
98
  </div>
99
 
100
  <div id="tabs-social">
@@ -154,6 +154,18 @@ if (!$controls->is_action()) {
154
  <?php $controls->text('soundcloud_url', 40); ?>
155
  </td>
156
  </tr>
 
 
 
 
 
 
 
 
 
 
 
 
157
  </table>
158
  </div>
159
  </div>
94
  <?php $controls->text('footer_legal', 40); ?>
95
  </td>
96
  </tr>
97
+ </table>
98
  </div>
99
 
100
  <div id="tabs-social">
154
  <?php $controls->text('soundcloud_url', 40); ?>
155
  </td>
156
  </tr>
157
+ <tr>
158
+ <th>Telegram URL</th>
159
+ <td>
160
+ <?php $controls->text('telegram_url', 40); ?>
161
+ </td>
162
+ </tr>
163
+ <tr>
164
+ <th>VK URL</th>
165
+ <td>
166
+ <?php $controls->text('vk_url', 40); ?>
167
+ </td>
168
+ </tr>
169
  </table>
170
  </div>
171
  </div>
main/main.php CHANGED
@@ -33,9 +33,10 @@ if (!$controls->is_action()) {
33
  } else {
34
  $controls->data['return_path'] = $this->normalize_email($controls->data['return_path']);
35
  }
36
-
37
- $controls->data['scheduler_max'] = (int)$controls->data['scheduler_max'];
38
- if ($controls->data['scheduler_max'] < 10) $controls->data['scheduler_max'] = 10;
 
39
 
40
 
41
  if (!$this->is_email($controls->data['reply_to'], true)) {
@@ -70,7 +71,7 @@ if (!$controls->is_action()) {
70
  $page['comment_status'] = 'closed';
71
  $page['ping_status'] = 'closed';
72
  $page['post_category'] = array(1);
73
-
74
  $current_language = $this->get_current_language();
75
  $this->switch_language('');
76
  // Insert the post into the database
@@ -79,7 +80,7 @@ if (!$controls->is_action()) {
79
 
80
  $controls->data['page'] = $page_id;
81
  $this->merge_options($controls->data);
82
-
83
  $controls->messages = 'A new page has been created';
84
  }
85
  }
@@ -259,21 +260,6 @@ if (!empty($return_path)) {
259
  </p>
260
 
261
  <table class="form-table">
262
- <tr>
263
- <th><?php _e('Disable standard styles', 'newsletter') ?></th>
264
- <td>
265
- <?php $controls->yesno('css_disabled'); ?>
266
- </td>
267
- </tr>
268
- <tr>
269
- <th><?php _e('Custom styles', 'newsletter') ?></th>
270
- <td>
271
- <?php if (apply_filters('newsletter_enqueue_style', true) === false) { ?>
272
- <p><strong>Warning: Newsletter styles and custom styles are disable by your theme or a plugin.</strong></p>
273
- <?php } ?>
274
- <?php $controls->textarea('css'); ?>
275
- </td>
276
- </tr>
277
  <tr>
278
  <th><?php _e('Allowed roles', 'newsletter') ?></th>
279
  <td>
@@ -292,65 +278,85 @@ if (!empty($return_path)) {
292
 
293
  </td>
294
  </tr>
295
-
296
  <tr>
297
  <th>
298
- <?php _e('Log level', 'newsletter') ?>
 
299
  </th>
300
  <td>
301
- <?php $controls->log_level('log_level'); ?>
302
  </td>
303
  </tr>
304
- <!--
305
  <tr>
306
  <th>
307
- <?php _e('Disable the scheduler notice', 'newsletter') ?>
 
308
  </th>
309
  <td>
310
- <?php $controls->yesno('disable_cron_notice'); ?>
311
  </td>
312
  </tr>
313
- -->
314
  <tr>
315
- <th><?php _e('IP addresses', 'newsletter') ?></th>
 
 
 
316
  <td>
317
- <?php $controls->select('ip', array('' => __('Store', 'newsletter'), 'anonymize' => __('Anonymize', 'newsletter'), 'skip' => __('Do not store', 'newsletter'))); ?>
318
  </td>
319
  </tr>
320
 
321
  <tr>
322
- <th><?php _e('Newsletters tracking default', 'newsletter') ?></th>
323
  <td>
324
- <?php $controls->yesno('track'); ?>
325
- <p class="description">It can be changed on each newsletter.</p>
326
  </td>
327
  </tr>
328
-
329
  <tr>
330
- <th><?php _e('Debug mode', 'newsletter') ?></th>
331
  <td>
332
- <?php $controls->yesno('debug', 40); ?>
 
 
 
333
  </td>
334
  </tr>
 
 
 
 
 
 
 
 
 
 
335
 
336
  <tr>
337
- <th><?php _e('Email encoding', 'newsletter') ?></th>
 
 
 
338
  <td>
339
- <?php $controls->select('content_transfer_encoding', array('' => 'Default', '8bit' => '8 bit', 'base64' => 'Base 64', 'binary' => 'Binary', 'quoted-printable' => 'Quoted printable', '7bit' => '7 bit')); ?>
340
- <?php $controls->help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#encoding') ?>
341
  </td>
342
  </tr>
343
 
344
  <tr>
345
  <th>
346
- <?php _e('Execute shortcodes on newsletters', 'newsletter') ?>
347
- <?php $controls->field_help("https://www.thenewsletterplugin.com/documentation/newsletter-configuration#shortcodes") ?>
348
  </th>
349
  <td>
350
- <?php $controls->yesno('do_shortcodes', 40); ?>
351
- <?php $controls->field_help("https://www.thenewsletterplugin.com/documentation/newsletter-configuration#shortcodes") ?>
352
  </td>
353
  </tr>
 
 
354
  </table>
355
 
356
  </div>
33
  } else {
34
  $controls->data['return_path'] = $this->normalize_email($controls->data['return_path']);
35
  }
36
+
37
+ $controls->data['scheduler_max'] = (int) $controls->data['scheduler_max'];
38
+ if ($controls->data['scheduler_max'] < 10)
39
+ $controls->data['scheduler_max'] = 10;
40
 
41
 
42
  if (!$this->is_email($controls->data['reply_to'], true)) {
71
  $page['comment_status'] = 'closed';
72
  $page['ping_status'] = 'closed';
73
  $page['post_category'] = array(1);
74
+
75
  $current_language = $this->get_current_language();
76
  $this->switch_language('');
77
  // Insert the post into the database
80
 
81
  $controls->data['page'] = $page_id;
82
  $this->merge_options($controls->data);
83
+
84
  $controls->messages = 'A new page has been created';
85
  }
86
  }
260
  </p>
261
 
262
  <table class="form-table">
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
263
  <tr>
264
  <th><?php _e('Allowed roles', 'newsletter') ?></th>
265
  <td>
278
 
279
  </td>
280
  </tr>
281
+
282
  <tr>
283
  <th>
284
+ <?php _e('Tracking default', 'newsletter') ?>
285
+ <?php $controls->field_help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#tracking') ?>
286
  </th>
287
  <td>
288
+ <?php $controls->yesno('track'); ?>
289
  </td>
290
  </tr>
291
+
292
  <tr>
293
  <th>
294
+ <?php _e('Execute shortcodes on newsletters', 'newsletter') ?>
295
+ <?php $controls->field_help("https://www.thenewsletterplugin.com/documentation/newsletter-configuration#shortcodes") ?>
296
  </th>
297
  <td>
298
+ <?php $controls->yesno('do_shortcodes', 40); ?>
299
  </td>
300
  </tr>
301
+
302
  <tr>
303
+ <th>
304
+ <?php _e('Log level', 'newsletter') ?>
305
+ <?php $controls->field_help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#log') ?>
306
+ </th>
307
  <td>
308
+ <?php $controls->log_level('log_level'); ?>
309
  </td>
310
  </tr>
311
 
312
  <tr>
313
+ <th><?php _e('Disable standard styles', 'newsletter') ?></th>
314
  <td>
315
+ <?php $controls->yesno('css_disabled'); ?>
 
316
  </td>
317
  </tr>
318
+
319
  <tr>
320
+ <th><?php _e('Custom styles', 'newsletter') ?></th>
321
  <td>
322
+ <?php if (apply_filters('newsletter_enqueue_style', true) === false) { ?>
323
+ <p><strong>Warning: Newsletter styles and custom styles are disable by your theme or a plugin.</strong></p>
324
+ <?php } ?>
325
+ <?php $controls->textarea('css'); ?>
326
  </td>
327
  </tr>
328
+
329
+
330
+ <tr>
331
+ <th><?php _e('IP addresses', 'newsletter') ?></th>
332
+ <td>
333
+ <?php $controls->select('ip', array('' => __('Store', 'newsletter'), 'anonymize' => __('Anonymize', 'newsletter'), 'skip' => __('Do not store', 'newsletter'))); ?>
334
+ </td>
335
+ </tr>
336
+
337
+
338
 
339
  <tr>
340
+ <th>
341
+ <?php _e('Debug mode', 'newsletter') ?>
342
+ <?php $controls->field_help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#debug') ?>
343
+ </th>
344
  <td>
345
+ <?php $controls->yesno('debug', 40); ?>
 
346
  </td>
347
  </tr>
348
 
349
  <tr>
350
  <th>
351
+ <?php _e('Email encoding', 'newsletter') ?>
352
+ <?php $controls->field_help('https://www.thenewsletterplugin.com/plugins/newsletter/newsletter-configuration#encoding') ?>
353
  </th>
354
  <td>
355
+ <?php $controls->select('content_transfer_encoding', array('' => 'Default', '8bit' => '8 bit', 'base64' => 'Base 64', 'binary' => 'Binary', 'quoted-printable' => 'Quoted printable', '7bit' => '7 bit')); ?>
 
356
  </td>
357
  </tr>
358
+
359
+
360
  </table>
361
 
362
  </div>
plugin.php CHANGED
@@ -4,7 +4,7 @@
4
  Plugin Name: Newsletter
5
  Plugin URI: https://www.thenewsletterplugin.com/plugins/newsletter
6
  Description: Newsletter is a cool plugin to create your own subscriber list, to send newsletters, to build your business. <strong>Before update give a look to <a href="https://www.thenewsletterplugin.com/category/release">this page</a> to know what's changed.</strong>
7
- Version: 6.9.4
8
  Author: Stefano Lissa & The Newsletter Team
9
  Author URI: https://www.thenewsletterplugin.com
10
  Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
@@ -35,17 +35,13 @@ if (version_compare(phpversion(), '5.6', '<')) {
35
  return;
36
  }
37
 
38
- define('NEWSLETTER_VERSION', '6.9.4');
39
 
40
  global $newsletter, $wpdb;
41
 
42
  if (!defined('NEWSLETTER_BETA'))
43
  define('NEWSLETTER_BETA', false);
44
 
45
- // For acceptance tests, DO NOT CHANGE
46
- if (!defined('NEWSLETTER_ANTIBOT'))
47
- define('NEWSLETTER_ANTIBOT', true);
48
-
49
  // For acceptance tests, DO NOT CHANGE
50
  if (!defined('NEWSLETTER_DEBUG'))
51
  define('NEWSLETTER_DEBUG', false);
4
  Plugin Name: Newsletter
5
  Plugin URI: https://www.thenewsletterplugin.com/plugins/newsletter
6
  Description: Newsletter is a cool plugin to create your own subscriber list, to send newsletters, to build your business. <strong>Before update give a look to <a href="https://www.thenewsletterplugin.com/category/release">this page</a> to know what's changed.</strong>
7
+ Version: 6.9.6
8
  Author: Stefano Lissa & The Newsletter Team
9
  Author URI: https://www.thenewsletterplugin.com
10
  Disclaimer: Use at your own risk. No warranty expressed or implied is provided.
35
  return;
36
  }
37
 
38
+ define('NEWSLETTER_VERSION', '6.9.6');
39
 
40
  global $newsletter, $wpdb;
41
 
42
  if (!defined('NEWSLETTER_BETA'))
43
  define('NEWSLETTER_BETA', false);
44
 
 
 
 
 
45
  // For acceptance tests, DO NOT CHANGE
46
  if (!defined('NEWSLETTER_DEBUG'))
47
  define('NEWSLETTER_DEBUG', false);
profile/index.php CHANGED
@@ -143,9 +143,7 @@ if ($controls->is_action()) {
143
  </table>
144
  <?php } else { ?>
145
 
146
- <p>Switch to "All languages" to manage these options.</p>
147
-
148
-
149
 
150
  <?php } ?>
151
  </div>
143
  </table>
144
  <?php } else { ?>
145
 
146
+ <?php $controls->switch_to_all_languages_notice(); ?>
 
 
147
 
148
  <?php } ?>
149
  </div>
readme.txt CHANGED
@@ -1,10 +1,12 @@
1
  === Newsletter ===
2
  Tags: email, email marketing, newsletter, newsletter subscribers, welcome email, signup forms, contact, lead generation, popup, marketing automation
3
  Requires at least: 3.4.0
4
- Tested up to: 5.5.1
5
- Stable tag: 6.9.4
6
  Requires PHP: 5.6
7
  Contributors: satollo,webagile,michael-travan
 
 
8
 
9
  Add a real newsletter system to your blog. For free. With unlimited newsletters and subscribers.
10
 
@@ -52,6 +54,8 @@ Improve The Newsletter Plugin with these free addons:
52
  * [Locked Content](https://www.thenewsletterplugin.com/documentation/locked-content-extension) - open up your premium content only after subscription
53
  * [Newsletter REST API](https://www.thenewsletterplugin.com/documentation/developers/newsletter-api-2/) - adds a tier of REST api to integrate with the Newsletter core services
54
  * [BuddyPress integration](https://wordpress.org/plugins/newsletter-buddypress/) - subscription opt-in inside BuddyPress signup form
 
 
55
 
56
  (*easily add them from our [Addons panel](https://www.thenewsletterplugin.com/documentation/install-extensions)*)
57
 
@@ -59,11 +63,11 @@ Improve The Newsletter Plugin with these free addons:
59
 
60
  Need *more power*? Feel *something's missing*? The Newsletter Plugin features can be easily extended through our **premium, professional Addons**! Let us introduce just two of them : )
61
 
 
 
62
  * [Extended Composer Blocks](https://www.thenewsletterplugin.com/composer) - adds new blocks to the drag & drop composer
63
  * [WooCommerce Integration](https://www.thenewsletterplugin.com/woocommerce) - subscribe customers to a mailing list and generate product newletters.
64
  * [Reports](https://www.thenewsletterplugin.com/reports) - improves the internal statistics collection system and provides better reports of data collected for each sent email. And retargeting. Neat.
65
- * [Automated](https://www.thenewsletterplugin.com/automated) - generates and sends your newsletters using your blog last posts, even custom ones like events or products. Just sit and watch!
66
- * [Autoresponder](https://www.thenewsletterplugin.com/autoresponder) - creates email series to follow up your subscribers
67
  * [Leads](https://www.thenewsletterplugin.com/leads) adds a fancy subscription popup box or a fixed bar to your website that will boost your conversion rate
68
  * [Amazon SES and other mail providers integration](https://www.thenewsletterplugin.com/integrations) - seamlessly integrate Amazon SES and other email service providers with The Newsletter Plugin. Hassle-free.
69
  * [Contact Form 7 Integration](https://www.thenewsletterplugin.com/documentation/contact-form-7-extension) - integrate the subscription on Contact Form 7 forms
@@ -113,6 +117,24 @@ Thank you, The Newsletter Team
113
 
114
  == Changelog ==
115
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  = 6.9.4 =
117
 
118
  * Fixed the profile save
1
  === Newsletter ===
2
  Tags: email, email marketing, newsletter, newsletter subscribers, welcome email, signup forms, contact, lead generation, popup, marketing automation
3
  Requires at least: 3.4.0
4
+ Tested up to: 5.5.3
5
+ Stable tag: 6.9.6
6
  Requires PHP: 5.6
7
  Contributors: satollo,webagile,michael-travan
8
+ License: GPLv2 or later
9
+ License URI: https://www.gnu.org/licenses/gpl-2.0.html
10
 
11
  Add a real newsletter system to your blog. For free. With unlimited newsletters and subscribers.
12
 
54
  * [Locked Content](https://www.thenewsletterplugin.com/documentation/locked-content-extension) - open up your premium content only after subscription
55
  * [Newsletter REST API](https://www.thenewsletterplugin.com/documentation/developers/newsletter-api-2/) - adds a tier of REST api to integrate with the Newsletter core services
56
  * [BuddyPress integration](https://wordpress.org/plugins/newsletter-buddypress/) - subscription opt-in inside BuddyPress signup form
57
+ * [Sendinblue integration](https://www.thenewsletterplugin.com/documentation/addons/delivery-addons/sendinblue-extension/) - deliver your newsletters with Sendinblue
58
+
59
 
60
  (*easily add them from our [Addons panel](https://www.thenewsletterplugin.com/documentation/install-extensions)*)
61
 
63
 
64
  Need *more power*? Feel *something's missing*? The Newsletter Plugin features can be easily extended through our **premium, professional Addons**! Let us introduce just two of them : )
65
 
66
+ * [Automated](https://www.thenewsletterplugin.com/automated) - generates and sends your newsletters using your blog last posts, even custom ones like events or products. Just sit and watch!
67
+ * [Autoresponder](https://www.thenewsletterplugin.com/autoresponder) - creates email series to follow up your subscribers
68
  * [Extended Composer Blocks](https://www.thenewsletterplugin.com/composer) - adds new blocks to the drag & drop composer
69
  * [WooCommerce Integration](https://www.thenewsletterplugin.com/woocommerce) - subscribe customers to a mailing list and generate product newletters.
70
  * [Reports](https://www.thenewsletterplugin.com/reports) - improves the internal statistics collection system and provides better reports of data collected for each sent email. And retargeting. Neat.
 
 
71
  * [Leads](https://www.thenewsletterplugin.com/leads) adds a fancy subscription popup box or a fixed bar to your website that will boost your conversion rate
72
  * [Amazon SES and other mail providers integration](https://www.thenewsletterplugin.com/integrations) - seamlessly integrate Amazon SES and other email service providers with The Newsletter Plugin. Hassle-free.
73
  * [Contact Form 7 Integration](https://www.thenewsletterplugin.com/documentation/contact-form-7-extension) - integrate the subscription on Contact Form 7 forms
117
 
118
  == Changelog ==
119
 
120
+ = 6.9.6 =
121
+
122
+ * Added 3 months option for inactive subscriber selection
123
+ * Improved the add-ons classes
124
+ * Improved admin messages for multilanguage blogs
125
+ * Updated link to documentation on main settings
126
+ * Added VK and Telegram socials
127
+ * Removed the old bounce import on subscribe maintenance panel
128
+ * Added Telegram and VK icon on social block component
129
+
130
+ = 6.9.5 =
131
+
132
+ * Added pagination on newsletters page table
133
+ * Changed label text for empty language in edit user page
134
+ * Added preheader text on email
135
+ * If email is paused but scheduled in the future it is now possible to change the sending date
136
+ * Fixed font weight selection for titles on posts block
137
+
138
  = 6.9.4 =
139
 
140
  * Fixed the profile save
statistics/index.php CHANGED
@@ -64,7 +64,7 @@ if (empty($emails)) {
64
  <?php include NEWSLETTER_DIR . '/tnp-header.php' ?>
65
  <div id="tnp-heading">
66
  <h2><?php _e('Overall basic statistics (last 20 newsletters)', 'newsletter') ?></h2>
67
- <p>More details, including Automated and Autoresponder newsletter statistics are available with the <a href="https://www.thenewsletterplugin.com/reports" target="_blank">Reports Addon</a>.</p>
68
  </div>
69
 
70
  <div id="tnp-body" class="tnp-statistics">
64
  <?php include NEWSLETTER_DIR . '/tnp-header.php' ?>
65
  <div id="tnp-heading">
66
  <h2><?php _e('Overall basic statistics (last 20 newsletters)', 'newsletter') ?></h2>
67
+ <p>More details, including Automated and Autoresponder newsletter statistics are available with the <a href="https://www.thenewsletterplugin.com/reports?utm_source=plugin&utm_campaign=newsletter-reports" target="_blank">Reports Addon</a>.</p>
68
  </div>
69
 
70
  <div id="tnp-body" class="tnp-statistics">
subscription/options.php CHANGED
@@ -163,7 +163,7 @@ if ($controls->is_action()) {
163
  </tr>
164
  </table>
165
  <?php } else { ?>
166
- <p>Switch to "All languages" to manage these options.</p>
167
  <?php } ?>
168
 
169
  </div>
163
  </tr>
164
  </table>
165
  <?php } else { ?>
166
+ <?php $controls->switch_to_all_languages_notice(); ?>
167
  <?php } ?>
168
 
169
  </div>
subscription/subscription.php CHANGED
@@ -285,15 +285,15 @@ class NewsletterSubscription extends NewsletterModule {
285
  }
286
 
287
  function first_install() {
288
-
289
  }
290
 
291
  function admin_menu() {
292
  $this->add_menu_page('options', 'List building');
293
- $this->add_menu_page('antibot', 'Security');
294
  $this->add_admin_page('profile', 'Subscription Form');
 
295
  $this->add_admin_page('forms', 'Forms');
296
- $this->add_admin_page('lists', 'Lists');
297
  $this->add_admin_page('template', 'Template');
298
  }
299
 
@@ -1104,7 +1104,7 @@ class NewsletterSubscription extends NewsletterModule {
1104
  }
1105
 
1106
  function get_form_javascript() {
1107
-
1108
  }
1109
 
1110
  /**
@@ -1156,14 +1156,14 @@ class NewsletterSubscription extends NewsletterModule {
1156
  }
1157
 
1158
  /** Generates the hidden field for lists which should be implicitely set with a subscription form.
1159
- *
1160
  * @param string $lists Comma separated directly from the shortcode "lists" attribute
1161
  * @param string $language ???
1162
  * @return string
1163
  */
1164
  function get_form_implicit_lists($lists, $language = '') {
1165
  $buffer = '';
1166
-
1167
  $arr = explode(',', $lists);
1168
 
1169
  foreach ($arr as $a) {
@@ -1194,7 +1194,7 @@ class NewsletterSubscription extends NewsletterModule {
1194
  /**
1195
  * Builds all the hidden fields of a subscription form. Implicit lists, confirmation url,
1196
  * referrer, language, ...
1197
- *
1198
  * @param array $attrs Attributes of form shortcode
1199
  * @return string HTML with the hidden fields
1200
  */
@@ -1236,7 +1236,7 @@ class NewsletterSubscription extends NewsletterModule {
1236
 
1237
  $language = $this->get_current_language();
1238
  $b .= '<input type="hidden" name="nlang" value="' . esc_attr($language) . '">';
1239
-
1240
  return $b;
1241
  }
1242
 
@@ -1272,7 +1272,7 @@ class NewsletterSubscription extends NewsletterModule {
1272
  /**
1273
  * Creates a notices to be displayed near a subscription form field to inform of worng configurations.
1274
  * It is created only if the current user looking at the form is the administrator.
1275
- *
1276
  * @param string $message
1277
  * @return string
1278
  */
@@ -1387,12 +1387,12 @@ class NewsletterSubscription extends NewsletterModule {
1387
  if (isset($attrs['layout']) && $attrs['layout'] === 'dropdown') {
1388
 
1389
  $buffer .= '<div class="tnp-field tnp-lists">';
 
 
1390
  $buffer .= '<select class="tnp-lists" name="nl[]" required>';
1391
- // There is not a default "label" for the block of lists, so it can only be specified in the shortcode attrs as "label"
1392
- $buffer .= $this->_shortcode_label('lists', $attrs);
1393
 
1394
  if (!empty($attrs['first_option_label'])) {
1395
- $buffer .= '<option value="">' . esc_html($attrs['first_option_label']) . '</option>';
1396
  }
1397
 
1398
  foreach ($lists as $list) {
@@ -1548,7 +1548,7 @@ class NewsletterSubscription extends NewsletterModule {
1548
  function get_subscription_form($referrer = '', $action = null, $attrs = []) {
1549
  $language = $this->get_current_language();
1550
  $options_profile = $this->get_options('profile', $language);
1551
-
1552
  if (!is_array($attrs)) {
1553
  $attrs = [];
1554
  }
@@ -1603,7 +1603,10 @@ class NewsletterSubscription extends NewsletterModule {
1603
  if (empty($attrs['lists_field_empty_label'])) {
1604
  $attrs['lists_field_empty_label'] = '';
1605
  }
1606
- $buffer .= $this->shortcode_newsletter_field(['name' => 'lists', 'layout' => 'dropdown', 'first_option_label' => $attrs['lists_field_empty_label']]);
 
 
 
1607
  } else {
1608
  $buffer .= $this->shortcode_newsletter_field(['name' => 'lists']);
1609
  }
@@ -1711,9 +1714,9 @@ class NewsletterSubscription extends NewsletterModule {
1711
  }
1712
 
1713
  /**
1714
- * Builds the minimal subscription form, with only the email field and inline
1715
  * submit button. If enabled the privacy checkbox is added.
1716
- *
1717
  * @param type $attrs
1718
  * @return string
1719
  */
285
  }
286
 
287
  function first_install() {
288
+
289
  }
290
 
291
  function admin_menu() {
292
  $this->add_menu_page('options', 'List building');
293
+ $this->add_admin_page('lists', 'Lists');
294
  $this->add_admin_page('profile', 'Subscription Form');
295
+ $this->add_menu_page('antibot', 'Security');
296
  $this->add_admin_page('forms', 'Forms');
 
297
  $this->add_admin_page('template', 'Template');
298
  }
299
 
1104
  }
1105
 
1106
  function get_form_javascript() {
1107
+
1108
  }
1109
 
1110
  /**
1156
  }
1157
 
1158
  /** Generates the hidden field for lists which should be implicitely set with a subscription form.
1159
+ *
1160
  * @param string $lists Comma separated directly from the shortcode "lists" attribute
1161
  * @param string $language ???
1162
  * @return string
1163
  */
1164
  function get_form_implicit_lists($lists, $language = '') {
1165
  $buffer = '';
1166
+
1167
  $arr = explode(',', $lists);
1168
 
1169
  foreach ($arr as $a) {
1194
  /**
1195
  * Builds all the hidden fields of a subscription form. Implicit lists, confirmation url,
1196
  * referrer, language, ...
1197
+ *
1198
  * @param array $attrs Attributes of form shortcode
1199
  * @return string HTML with the hidden fields
1200
  */
1236
 
1237
  $language = $this->get_current_language();
1238
  $b .= '<input type="hidden" name="nlang" value="' . esc_attr($language) . '">';
1239
+
1240
  return $b;
1241
  }
1242
 
1272
  /**
1273
  * Creates a notices to be displayed near a subscription form field to inform of worng configurations.
1274
  * It is created only if the current user looking at the form is the administrator.
1275
+ *
1276
  * @param string $message
1277
  * @return string
1278
  */
1387
  if (isset($attrs['layout']) && $attrs['layout'] === 'dropdown') {
1388
 
1389
  $buffer .= '<div class="tnp-field tnp-lists">';
1390
+ // There is not a default "label" for the block of lists, so it can only be specified in the shortcode attrs as "label"
1391
+ $buffer .= $this->_shortcode_label('lists', $attrs);
1392
  $buffer .= '<select class="tnp-lists" name="nl[]" required>';
 
 
1393
 
1394
  if (!empty($attrs['first_option_label'])) {
1395
+ $buffer .= '<option value="" selected="true" disabled="disabled">' . esc_html($attrs['first_option_label']) . '</option>';
1396
  }
1397
 
1398
  foreach ($lists as $list) {
1548
  function get_subscription_form($referrer = '', $action = null, $attrs = []) {
1549
  $language = $this->get_current_language();
1550
  $options_profile = $this->get_options('profile', $language);
1551
+
1552
  if (!is_array($attrs)) {
1553
  $attrs = [];
1554
  }
1603
  if (empty($attrs['lists_field_empty_label'])) {
1604
  $attrs['lists_field_empty_label'] = '';
1605
  }
1606
+ if (empty($attrs['lists_field_label'])) {
1607
+ $attrs['lists_field_label'] = '';
1608
+ }
1609
+ $buffer .= $this->shortcode_newsletter_field(['name' => 'lists', 'layout' => 'dropdown', 'first_option_label' => $attrs['lists_field_empty_label'], 'label' => $attrs['lists_field_label']]);
1610
  } else {
1611
  $buffer .= $this->shortcode_newsletter_field(['name' => 'lists']);
1612
  }
1714
  }
1715
 
1716
  /**
1717
+ * Builds the minimal subscription form, with only the email field and inline
1718
  * submit button. If enabled the privacy checkbox is added.
1719
+ *
1720
  * @param type $attrs
1721
  * @return string
1722
  */
tnp-header.php CHANGED
@@ -73,20 +73,27 @@ $warning |= empty($status_options['mail']);
73
  </li>
74
  <li><a href="#"><i class="fas fa-list"></i> <?php _e('List Building', 'newsletter') ?> <i class="fas fa-chevron-down"></i></a>
75
  <ul>
76
- <li><a href="?page=newsletter_subscription_options"><i class="fas fa-sign-in-alt"></i> <?php _e('Subscription', 'newsletter') ?>
77
- <small><?php _e('The subscription process in detail', 'newsletter') ?></small></a></li>
78
-
79
- <li><a href="?page=newsletter_subscription_antibot"><i class="fas fa-lock"></i> <?php _e('Security', 'newsletter') ?>
80
- <small><?php _e('Spam subscriptions control', 'newsletter') ?></small></a></li>
81
-
82
  <li>
83
  <a href="?page=newsletter_subscription_profile"><i class="fas fa-check-square"></i> <?php _e('Subscription Form Fields, Buttons, Labels', 'newsletter') ?>
84
  <small><?php _e('When and what data to collect', 'newsletter') ?></small></a>
85
  </li>
 
 
 
 
 
 
86
  <li>
87
  <a href="?page=newsletter_subscription_lists"><i class="fas fa-th-list"></i> <?php _e('Lists', 'newsletter') ?>
88
  <small><?php _e('Profile the subscribers for a better targeting', 'newsletter') ?></small></a>
89
  </li>
 
 
 
 
 
 
 
90
  <li>
91
  <a href="?page=newsletter_unsubscription_index"><i class="fas fa-sign-out-alt"></i> <?php _e('Unsubscription', 'newsletter') ?>
92
  <small><?php _e('How to give the last goodbye (or avoid it!)', 'newsletter') ?></small></a>
73
  </li>
74
  <li><a href="#"><i class="fas fa-list"></i> <?php _e('List Building', 'newsletter') ?> <i class="fas fa-chevron-down"></i></a>
75
  <ul>
 
 
 
 
 
 
76
  <li>
77
  <a href="?page=newsletter_subscription_profile"><i class="fas fa-check-square"></i> <?php _e('Subscription Form Fields, Buttons, Labels', 'newsletter') ?>
78
  <small><?php _e('When and what data to collect', 'newsletter') ?></small></a>
79
  </li>
80
+
81
+ <li>
82
+ <a href="?page=newsletter_subscription_options"><i class="fas fa-sign-in-alt"></i> <?php _e('Subscription', 'newsletter') ?>
83
+ <small><?php _e('The subscription process in detail', 'newsletter') ?></small></a>
84
+ </li>
85
+
86
  <li>
87
  <a href="?page=newsletter_subscription_lists"><i class="fas fa-th-list"></i> <?php _e('Lists', 'newsletter') ?>
88
  <small><?php _e('Profile the subscribers for a better targeting', 'newsletter') ?></small></a>
89
  </li>
90
+
91
+ <li>
92
+ <a href="?page=newsletter_subscription_antibot"><i class="fas fa-lock"></i> <?php _e('Security', 'newsletter') ?>
93
+ <small><?php _e('Spam subscriptions control', 'newsletter') ?></small></a>
94
+ </li>
95
+
96
+
97
  <li>
98
  <a href="?page=newsletter_unsubscription_index"><i class="fas fa-sign-out-alt"></i> <?php _e('Unsubscription', 'newsletter') ?>
99
  <small><?php _e('How to give the last goodbye (or avoid it!)', 'newsletter') ?></small></a>
unsubscription/index.php CHANGED
@@ -9,9 +9,7 @@ $current_language = $this->get_current_language();
9
 
10
  $is_all_languages = $this->is_all_languages();
11
 
12
- if (!$is_all_languages) {
13
- $controls->warnings[] = 'You are configuring the language <strong>' . $current_language . '</strong>. Switch to "all languages" to see all options.';
14
- }
15
 
16
  if (!$controls->is_action()) {
17
  $controls->data = $this->get_options('', $current_language);
@@ -93,7 +91,12 @@ if (!$controls->is_action()) {
93
  </td>
94
  </tr>
95
 
96
- <tr>
 
 
 
 
 
97
  <th><?php _e('Cancellation requests via email', 'newsletter') ?></th>
98
  <td>
99
  <?php $controls->text_email('list_unsubscribe_mailto_header'); ?>
@@ -116,6 +119,11 @@ if (!$controls->is_action()) {
116
  </td>
117
  </tr>
118
  </table>
 
 
 
 
 
119
  </div>
120
 
121
  <div id="tabs-reactivation">
9
 
10
  $is_all_languages = $this->is_all_languages();
11
 
12
+ $controls->add_language_warning();
 
 
13
 
14
  if (!$controls->is_action()) {
15
  $controls->data = $this->get_options('', $current_language);
91
  </td>
92
  </tr>
93
 
94
+ </table>
95
+
96
+ <h3>Advanced</h3>
97
+ <?php if ($is_all_languages) { ?>
98
+ <table class="form-table">
99
+ <tr>
100
  <th><?php _e('Cancellation requests via email', 'newsletter') ?></th>
101
  <td>
102
  <?php $controls->text_email('list_unsubscribe_mailto_header'); ?>
119
  </td>
120
  </tr>
121
  </table>
122
+ <?php } else { ?>
123
+
124
+ <?php $controls->switch_to_all_languages_notice(); ?>
125
+
126
+ <?php } ?>
127
  </div>
128
 
129
  <div id="tabs-reactivation">
users/edit.php CHANGED
@@ -146,14 +146,14 @@ function percentValue($value, $total) {
146
  <tr>
147
  <th><?php _e('Status', 'newsletter'); ?></th>
148
  <td>
149
- <?php $controls->select('status', array('C' => __('Confirmed', 'newsletter'), 'S' => __('Not confirmed', 'newsletter'),
150
  'U' => __('Unsubscribed', 'newsletter'), 'B' => __('Bounced', 'newsletter'))); ?>
151
  </td>
152
  </tr>
153
  <tr>
154
  <th><?php _e('Language', 'newsletter'); ?></th>
155
  <td>
156
- <?php $controls->language(); ?>
157
  </td>
158
  </tr>
159
  <tr>
146
  <tr>
147
  <th><?php _e('Status', 'newsletter'); ?></th>
148
  <td>
149
+ <?php $controls->select('status', array('C' => __('Confirmed', 'newsletter'), 'S' => __('Not confirmed', 'newsletter'),
150
  'U' => __('Unsubscribed', 'newsletter'), 'B' => __('Bounced', 'newsletter'))); ?>
151
  </td>
152
  </tr>
153
  <tr>
154
  <th><?php _e('Language', 'newsletter'); ?></th>
155
  <td>
156
+ <?php $controls->language('language', __('None', 'newsletter') ); ?>
157
  </td>
158
  </tr>
159
  <tr>
users/massive.php CHANGED
@@ -86,9 +86,10 @@ if ($controls->is_action('list_none')) {
86
  }
87
 
88
  if ($controls->is_action('update_inactive')) {
 
89
  $wpdb->query("update `{$wpdb->prefix}newsletter` n join (select user_id, max(s.time) as max_time from `{$wpdb->prefix}newsletter_sent` s where s.open>0 group by user_id) as ss
90
  on n.id=ss.user_id set last_activity=ss.max_time");
91
-
92
  $inactive_time = (int) $controls->data['inactive_time'];
93
 
94
  $where = 'last_activity > 0 and last_activity<' . (time() - $inactive_time * 30 * 24 * 3600);
@@ -96,57 +97,6 @@ if ($controls->is_action('update_inactive')) {
96
  $count = $wpdb->query("update " . NEWSLETTER_USERS_TABLE . ' set list_' . ((int) $controls->data['list_inactive']) . '=1 where ' . $where);
97
  $controls->messages = $count . ' subscribers updated';
98
  }
99
-
100
- if ($controls->is_action('bounces')) {
101
- $lines = explode("\n", $controls->data['bounced_emails']);
102
- $total = 0;
103
- $marked = 0;
104
- $error = 0;
105
- $not_found = 0;
106
- $already_bounced = 0;
107
- $results = '';
108
- foreach ($lines as &$email) {
109
- $email = trim($email);
110
- if (empty($email))
111
- continue;
112
-
113
- $total++;
114
-
115
- $email = NewsletterModule::normalize_email($email);
116
- if (empty($email)) {
117
- $results .= '[INVALID] ' . $email . "\n";
118
- $error++;
119
- continue;
120
- }
121
-
122
- $user = NewsletterUsers::instance()->get_user($email);
123
-
124
- if ($user == null) {
125
- $results .= '[NOT FOUND] ' . $email . "\n";
126
- $not_found++;
127
- continue;
128
- }
129
-
130
- if ($user->status == 'B') {
131
- $results .= '[ALREADY BOUNCED] ' . $email . "\n";
132
- $already_bounced++;
133
- continue;
134
- }
135
-
136
- $r = $wpdb->query($wpdb->prepare('update ' . NEWSLETTER_USERS_TABLE . " set status='B' where email=%s limit 1", $email));
137
- if ($r === 1) {
138
- $results .= '[BOUNCED] ' . $email . "\n";
139
- $marked++;
140
- continue;
141
- }
142
- }
143
-
144
- $controls->messages .= 'Total: ' . $total . '<br>';
145
- $controls->messages .= 'Bounce: ' . $marked . '<br>';
146
- $controls->messages .= 'Errors: ' . $error . '<br>';
147
- $controls->messages .= 'Not found: ' . $not_found . '<br>';
148
- $controls->messages .= 'Already bounced: ' . $already_bounced . '<br>';
149
- }
150
  ?>
151
 
152
  <div class="wrap tnp-users tnp-users-massive" id="tnp-wrap">
@@ -178,7 +128,6 @@ if ($controls->is_action('bounces')) {
178
  <ul>
179
  <li><a href="#tabs-1"><?php _e('General', 'newsletter') ?></a></li>
180
  <li><a href="#tabs-2"><?php _e('Lists', 'newsletter') ?></a></li>
181
- <li><a href="#tabs-4"><?php _e('Bounces', 'newsletter') ?></a></li>
182
  </ul>
183
 
184
  <div id="tabs-1">
@@ -245,6 +194,7 @@ if ($controls->is_action('bounces')) {
245
  <td>
246
  <?php
247
  $controls->select('inactive_time', array(
 
248
  '6' => '6 ' . __('months', 'newsletter'),
249
  '12' => '1 ' . __('year', 'newsletter'),
250
  '24' => '2 ' . __('years', 'newsletter'),
@@ -257,22 +207,22 @@ if ($controls->is_action('bounces')) {
257
  '108' => '9 ' . __('years', 'newsletter'),
258
  '120' => '10 ' . __('years', 'newsletter')
259
  ))
260
- ?>
261
  to
262
  <?php $controls->lists_select('list_inactive'); ?>
263
-
264
  </td>
265
  <td>
266
  <?php $controls->button_confirm('update_inactive', __('Update', 'newsletter')); ?>
267
  </td>
268
  </tr>
269
-
270
  <?php if ($this->is_multilanguage()) { ?>
271
  <tr>
272
  <td>Language</td>
273
  <td>
274
  <?php _e('Set to', 'newsletter') ?>
275
- <?php $controls->language('language', false) ?> <?php _e('subscribers without a language', 'newsletter') ?>
276
  </td>
277
  <td>
278
  <?php $controls->button_confirm('language', '&raquo;'); ?>
@@ -312,33 +262,10 @@ if ($controls->is_action('bounces')) {
312
  <?php $controls->lists_select('list_3') ?> <?php _e('subscribers without a list', 'newsletter') ?> <?php $controls->button_confirm('list_none', '&raquo;'); ?>
313
  </td>
314
  </tr>
315
-
316
-
317
-
318
- </table>
319
- </div>
320
 
321
 
322
 
323
- <div id="tabs-4">
324
- <p>
325
- Import a set of bounced email addresses: they will be marked as "bounced" and no more contacted. Sending
326
- messages to bounced address (many times) can put your server in some black list.
327
- </p>
328
-
329
- <table class="form-table">
330
- <tr>
331
- <th><?php _e('Bounced addresses', 'newsletter') ?></th>
332
- <td>
333
- <?php $controls->textarea('bounced_emails'); ?>
334
- <p class="description">
335
- <?php _e('One email address per line.', 'newsletter') ?>
336
- </p>
337
- </td>
338
- </tr>
339
  </table>
340
-
341
- <?php $controls->button_confirm('bounces', 'Mark those emails as bounced'); ?>
342
  </div>
343
 
344
  </div>
86
  }
87
 
88
  if ($controls->is_action('update_inactive')) {
89
+ //Update users 'last_activity' column
90
  $wpdb->query("update `{$wpdb->prefix}newsletter` n join (select user_id, max(s.time) as max_time from `{$wpdb->prefix}newsletter_sent` s where s.open>0 group by user_id) as ss
91
  on n.id=ss.user_id set last_activity=ss.max_time");
92
+
93
  $inactive_time = (int) $controls->data['inactive_time'];
94
 
95
  $where = 'last_activity > 0 and last_activity<' . (time() - $inactive_time * 30 * 24 * 3600);
97
  $count = $wpdb->query("update " . NEWSLETTER_USERS_TABLE . ' set list_' . ((int) $controls->data['list_inactive']) . '=1 where ' . $where);
98
  $controls->messages = $count . ' subscribers updated';
99
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
100
  ?>
101
 
102
  <div class="wrap tnp-users tnp-users-massive" id="tnp-wrap">
128
  <ul>
129
  <li><a href="#tabs-1"><?php _e('General', 'newsletter') ?></a></li>
130
  <li><a href="#tabs-2"><?php _e('Lists', 'newsletter') ?></a></li>
 
131
  </ul>
132
 
133
  <div id="tabs-1">
194
  <td>
195
  <?php
196
  $controls->select('inactive_time', array(
197
+ '3' => '3 ' . __('months', 'newsletter'),
198
  '6' => '6 ' . __('months', 'newsletter'),
199
  '12' => '1 ' . __('year', 'newsletter'),
200
  '24' => '2 ' . __('years', 'newsletter'),
207
  '108' => '9 ' . __('years', 'newsletter'),
208
  '120' => '10 ' . __('years', 'newsletter')
209
  ))
210
+ ?>
211
  to
212
  <?php $controls->lists_select('list_inactive'); ?>
213
+
214
  </td>
215
  <td>
216
  <?php $controls->button_confirm('update_inactive', __('Update', 'newsletter')); ?>
217
  </td>
218
  </tr>
219
+
220
  <?php if ($this->is_multilanguage()) { ?>
221
  <tr>
222
  <td>Language</td>
223
  <td>
224
  <?php _e('Set to', 'newsletter') ?>
225
+ <?php $controls->language('language', false) ?> <?php _e('subscribers without a language', 'newsletter') ?>
226
  </td>
227
  <td>
228
  <?php $controls->button_confirm('language', '&raquo;'); ?>
262
  <?php $controls->lists_select('list_3') ?> <?php _e('subscribers without a list', 'newsletter') ?> <?php $controls->button_confirm('list_none', '&raquo;'); ?>
263
  </td>
264
  </tr>
 
 
 
 
 
265
 
266
 
267
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
268
  </table>
 
 
269
  </div>
270
 
271
  </div>