Version Description
- New Feature: Remove Google Font Requests (including link/font preloads, @import/@font-face from CSS files & STYLE tags, resource hints)
- Minify/Combine CSS Improvement: Any @import found including a local CSS in another CSS file is fetched (and minified/optimized if necessary) and added to the parent file (this reduces HTTP requests, saving additional round-trip times to the overall page load) - Read more: https://gtmetrix.com/avoid-css-import.html
- Hardcoded CSS/JS (not enqueued the WordPress way) from the same domain (local) get minified/optimized
- Bug Fix: In rare cases, when viewing the homepage assets in the Dashboard, the wrong page is checked (e.g. a post instead of the actual homepage) because specific themes/plugins do not use wp_reset_postdata() to restore $post global to its original value (none in this instance)
- Bug Fix: If Google Fonts loading type is async (optional with preload) then make sure it's applied even if there's only one LINK request
Download this release
Release Info
Developer | gabelivan |
Plugin | Asset CleanUp: Page Speed Booster |
Version | 1.3.4.2 |
Comparing to | |
See all releases |
Code changes from version 1.3.4.1 to 1.3.4.2
- assets/script.min.js +1 -1
- assets/style.min.css +1 -1
- classes/CleanUp.php +20 -33
- classes/FileSystem.php +12 -2
- classes/OptimiseAssets/CombineCss.php +17 -35
- classes/OptimiseAssets/CombineCssImports.php +509 -0
- classes/OptimiseAssets/FontsGoogle.php +87 -66
- classes/OptimiseAssets/FontsGoogleRemove.php +161 -0
- classes/OptimiseAssets/MinifyCss.php +2 -1
- classes/OptimiseAssets/OptimizeCommon.php +67 -2
- classes/OptimiseAssets/OptimizeCss.php +136 -59
- classes/OptimiseAssets/OptimizeJs.php +118 -89
- classes/OwnAssets.php +4 -3
- classes/Settings.php +15 -1
- readme.txt +21 -5
- templates/_admin-page-settings-plugin-areas/_fonts-google.php +28 -188
- templates/_admin-page-settings-plugin-areas/_fonts-google/_optimize-area.php +203 -0
- templates/_admin-page-settings-plugin-areas/_fonts-google/_remove-area.php +70 -0
- templates/_admin-page-settings-plugin-areas/_optimize-js.php +10 -4
- templates/admin-page-settings-plugin.php +16 -3
- templates/meta-box-loaded-assets/_asset-style-single-row.php +11 -3
- wpacu.php +2 -2
assets/script.min.js
CHANGED
@@ -1 +1 @@
|
|
1 |
-
function wpacuTabOpenSettingsArea(a,b){a.preventDefault();var c,d,e;for(d=document.getElementsByClassName("wpacu-settings-tab-content"),c=0;c<d.length;c++)d[c].style.display="none";for(e=document.getElementsByClassName("wpacu-settings-tab-link"),c=0;c<e.length;c++)e[c].className=e[c].className.replace(" active","");document.getElementById(b).style.display="table-cell",jQuery('a[href="#'+b+'"]').addClass("active"),jQuery("#wpacu-selected-tab-area").val(b)}jQuery(document).ready(function(a){function b(){if(!a("#wpacu_ajax_fetch_assets_list_dashboard_view").length)return!1;var b={};"direct"===wpacu_object.dom_get_type?(b[wpacu_object.plugin_name+"_load"]=1,b[wpacu_object.plugin_name+"_time_r"]=(new Date).getTime(),a.ajax({method:"GET",url:wpacu_object.page_url,data:b,cache:!1,complete:function(b,c){if("error"===b.statusText){var d=wpacu_object.ajax_direct_fetch_error;d=d.replace(/\{wpacu_output\}/,b.responseText),d=d.replace(/\{wpacu_status_code_error\}/,b.status),a("#wpacu_meta_box_content").html(d)}}}).done(function(b){var c=b.substring(b.lastIndexOf(wpacu_object.start_del)+wpacu_object.start_del.length,b.lastIndexOf(wpacu_object.end_del)),d={action:wpacu_object.plugin_name+"_get_loaded_assets",wpacu_list:c,post_id:wpacu_object.post_id,page_url:wpacu_object.page_url,tag_id:wpacu_object.tag_id,time_r:(new Date).getTime()};a.post(wpacu_object.ajax_url,d,function(b){if(!b)return!1;a("#wpacu_meta_box_content").html(b),a("#wpacu_home_page_form").length>0&&a("#submit").show(),setTimeout(function(){e.load(),a(".wpacu_asset_row").removeClass("wpacu-loading"),a("#wpacu-assets-reloading").remove()},200)})})):"wp_remote_post"===wpacu_object.dom_get_type&&(b={action:wpacu_object.plugin_name+"_get_loaded_assets",post_id:wpacu_object.post_id,page_url:wpacu_object.page_url,tag_id:wpacu_object.tag_id,time_r:(new Date).getTime()},a.post(wpacu_object.ajax_url,b,function(b){if(!b)return!1;a("#wpacu_meta_box_content").html(b),a("#wpacu_home_page_form").length>0&&a("#submit").show(),setTimeout(function(){e.load()},200)}))}a("#wpacu_minify_css_enable, #wpacu_combine_loaded_css_enable, #wpacu_minify_js_enable, #wpacu_combine_loaded_js_enable").click(function(){a(this).prop("checked")?a('[data-linked-to="'+a(this).attr("id")+'"]').find(".wpacu-circle-status").addClass("wpacu-on").removeClass("wpacu-off"):a('[data-linked-to="'+a(this).attr("id")+'"]').find(".wpacu-circle-status").addClass("wpacu-off").removeClass("wpacu-on")}),a("#wpacu-mark-license-valid-button").click(function(){return confirm(wpacu_object.mark_license_valid_confirm)}),a("#wpacu-license-form").submit(function(){a("#edd_license_activate_btn").attr("disabled","disabled"),a("#edd_license_deactivate_btn").attr("disabled","disabled"),a(".wpacu-license-spinner").show()});var c,d;a("#wpacu-reset-drop-down").on("change keyup keydown mouseup mousedown click",function(){""===a(this).val()?(a("#wpacu-warning-read").removeClass("wpacu-visible"),a("#wpacu-reset-submit-btn").attr("disabled","disabled").removeClass("button-primary").addClass("button-secondary")):("reset_everything"===a(this).val()?a("#wpacu-license-data-remove-area").addClass("wpacu-visible"):a("#wpacu-license-data-remove-area").removeClass("wpacu-visible"),a("#wpacu-warning-read").addClass("wpacu-visible"),a("#wpacu-reset-submit-btn").removeAttr("disabled").removeClass("button-secondary").addClass("button-primary")),a(".wpacu-tools-area .wpacu-warning").hide(),c=a(this).find("option:selected"),a("#"+c.attr("data-id")).show()}),a("#wpacu-reset-submit-btn").on("click",function(){if("reset_settings"===a("#wpacu-reset-drop-down").val()?d=wpacu_object.reset_settings_confirm_msg:"reset_everything_except_settings"===a("#wpacu-reset-drop-down").val()?d=wpacu_object.reset_everything_except_settings_confirm_msg:"reset_everything"===a("#wpacu-reset-drop-down").val()&&(d=wpacu_object.reset_everything_confirm_msg),!confirm(d))return!1;a("#wpacu-action-confirmed").val("yes"),setTimeout(function(){"yes"===a("#wpacu-action-confirmed").val()&&a("#wpacu-tools-form").submit()},1e3)}),a("#wpacu-import-form").submit(function(){if(!confirm(wpacu_object.import_confirm_msg))return!1;a(this).find("button").addClass("wpacu-importing").prop("disabled",!0)});var e={load:function(){var b;a(".input-unload-on-this-page").on("click change",function(){a(this).prop("checked")?(e.uncheckAllOtherUnloadRules(a(this)),a(this).closest("tr").addClass("wpacu_not_load")):a(this).closest("tr").removeClass("wpacu_not_load")}),a(".wpacu-plugin-check-all").on("click",function(b){b.preventDefault();var c=a(this).attr("data-wpacu-plugin");a('table.wpacu_list_by_location[data-wpacu-plugin="'+c+'"]').find(".input-unload-on-this-page.wpacu-not-locked").prop("checked",!0).closest("tr").addClass("wpacu_not_load")}),a(".wpacu-plugin-uncheck-all").on("click",function(b){b.preventDefault();var c=a(this).attr("data-wpacu-plugin");a('table.wpacu_list_by_location[data-wpacu-plugin="'+c+'"]').find(".input-unload-on-this-page.wpacu-not-locked").prop("checked",!1).closest("tr").removeClass("wpacu_not_load")}),a(".wpacu_global_unload").click(function(){b=a(this).attr("data-handle"),a(this).prop("checked")?(a(this).parent("label").addClass("wpacu_input_load_checked"),a(this).closest("tr").addClass("wpacu_not_load"),e.uncheckAllOtherUnloadRules(a(this))):(a(this).parent("label").removeClass("wpacu_input_load_checked"),a(this).closest("tr").removeClass("wpacu_not_load"))}),a(".wpacu_keep_bulk_rule").click(function(){a(this).prop("checked")&&a(this).parents("li").next().removeClass("remove_rule")}),a(".wpacu_remove_bulk_rule").click(function(){a(this).prop("checked")&&a(this).parents("li").addClass("remove_rule")}),a(".wpacu_bulk_unload").click(function(){b=a(this).attr("data-handle"),a(this).prop("checked")?(a(this).parent("label").addClass("wpacu_input_load_checked"),a(this).closest("tr").addClass("wpacu_not_load"),e.uncheckAllOtherUnloadRules(a(this))):(a(this).parent("label").removeClass("wpacu_input_load_checked"),a(this).closest("tr").removeClass("wpacu_not_load"))}),a(".wpacu_load_it_option").click(function(){var b=a(this).attr("data-handle");if(a(this).prop("checked")){a(this).parent("label").addClass("wpacu_global_unload_exception");var c="";a(this).hasClass("wpacu_style")?c="style":a(this).hasClass("wpacu_script")&&(c="script"),a("#"+c+"_"+b).prop("checked",!1).trigger("change")}else a(this).parent("label").removeClass("wpacu_global_unload_exception")}),a(".wpacu-add-handle-note").on("click",function(b){b.preventDefault();var c,d=a(this).attr("data-handle");a(this).hasClass("wpacu-for-script")?c=a('.wpacu-handle-notes-field[data-script-handle="'+d+'"]'):a(this).hasClass("wpacu-for-style")&&(c=a('.wpacu-handle-notes-field[data-style-handle="'+d+'"]')),c.is(":hidden")?c.show():c.hide()}),a(".wpacu-external-file-size").on("click",function(b){b.preventDefault();var c,d=a(this);d.hide(),c=d.next(),c.show(),a.post(wpacu_object.ajax_url,{action:"get_external_file_size",wpacu_remote_file:d.attr("data-src")},function(a){c.html(a)})})},uncheckAllOtherUnloadRules:function(a){a.closest("tr").find(".wpacu_unload_rule_input").not(a).prop("checked",!1).parent("label").removeClass("wpacu_input_load_checked")}};a("#wpacu_post_type_select").change(function(){a("#wpacu_post_type_form").submit()}),a("#wpacu_taxonomy_select").change(function(){a("#wpacu_taxonomy_form").submit()}),a("#wpacu_dashboard").click(function(){a(this).prop("checked")?(a("#wpacu-settings-assets-retrieval-mode").show(),a("#wpacu_hide_meta_boxes_for_post_types_chosen .chosen-choices, #wpacu-hide-meta-boxes-for-post-types-info").css({opacity:1})):(a("#wpacu-settings-assets-retrieval-mode").hide(),a("#wpacu_hide_meta_boxes_for_post_types_chosen .chosen-choices, #wpacu-hide-meta-boxes-for-post-types-info").css({opacity:.4}))}),a(".wpacu-dom-get-type-selection").change(function(){a(this).is(":checked")&&(a(".wpacu-dom-get-type-info").hide(),a("#"+a(this).attr("data-target")).fadeIn("fast"))}),a("#wpacu_frontend").click(function(){a(this).prop("checked")?a("#wpacu-settings-frontend-exceptions").show():a("#wpacu-settings-frontend-exceptions").hide()}),a(".google_fonts_combine_type").change(function(){a(".wpacu_google_fonts_combine_type_area").hide(),"async"===a(this).val()?a("#wpacu_google_fonts_combine_type_async_info_area").fadeIn():"async_preload"===a(this).val()?a("#wpacu_google_fonts_combine_type_async_preload_info_area").fadeIn():a("#wpacu_google_fonts_combine_type_rb_info_area").fadeIn()}),a("#wpacu_assets_list_layout").on("click change",function(){"by-location"===a(this).val()?a("#wpacu-assets-list-by-location-selected").fadeIn("fast"):a("#wpacu-assets-list-by-location-selected").fadeOut("fast")}),a("#wpacu_disable_jquery_migrate").on("click",function(){return!a(this).is(":checked")||(!(!a(this).is(":checked")||!confirm(wpacu_object.jquery_migration_disable_confirm_msg))||(a(this).prop("checked",!1),!1))}),a("#wpacu_disable_comment_reply").on("click",function(){return!a(this).is(":checked")||(!(!a(this).is(":checked")||!confirm(wpacu_object.comment_reply_disable_confirm_msg))||(a(this).prop("checked",!1),!1))}),a("[data-target-opacity]").click(function(){a(this).prop("checked")?a("#"+a(this).attr("data-target-opacity")).css({opacity:1}):a("#"+a(this).attr("data-target-opacity")).css({opacity:.4})}),a(".wpacu-combine-loaded-js-level").change(function(){a(this).is(":checked")&&(a(".wpacu_combine_loaded_js_level_area").removeClass("wpacu_active"),a("#"+a(this).attr("data-target")).addClass("wpacu_active"))});var f=a('#wpacu-update-button-area input[type="submit"]');f.click(function(){a("#wpacu-updating-settings").show()});var g=a("#wpacu-update-front-settings-area .wpacu_update_btn");if(g.parents("form").submit(function(){return g.attr("disabled",!0).addClass("wpacu_submitting"),a("#wpacu-updating-front-settings").show(),!0}),a("form#wpacu-settings-form, form#wpacu_home_page_form").submit(function(){return f.attr("disabled",!0),!0}),a(".wpacu_remove_rule").click(function(){var b=a(this).parents(".wpacu_global_rule_row");a(this).prop("checked")?b.addClass("selected"):b.removeClass("selected")}),a(".wpacu_restore_position").click(function(){var b=a(this).parents(".wpacu_restore_position_row");a(this).prop("checked")?b.addClass("wpacu_selected"):b.removeClass("wpacu_selected")}),a(".wpacu_remove_global_attr").click(function(){var b=a(this).parents(".wpacu_remove_global_attr_row");a(this).prop("checked")?b.addClass("wpacu_selected"):b.removeClass("wpacu_selected")}),a("#wpacu_wrap_assets").length>0&&setTimeout(function(){e.load()},200),"undefined"==typeof wpacu_object||a("#wpacu_meta_box_content").length<1)return!1;b(),a(document).on("click",".wp-admin.post-php .edit-post-header__settings button.is-primary",function(){var c=function(){if(0===a(".edit-post-header__settings .is-saving").length){if(a("#wpacu_unload_assets_area_loaded").length>0&&a("#wpacu_unload_assets_area_loaded").val()){a("#wpacu-assets-reloading").remove();var c='<span id="wpacu-assets-reloading" class="editor-post-saved-state is-wpacu-reloading">'+wpacu_object.reload_icon+wpacu_object.reload_msg+"</span>";a(".wp-admin.post-php .edit-post-header__settings").prepend(c)}a(".wpacu_asset_row").addClass("wpacu-loading"),b(),clearInterval(d)}},d=setInterval(c,900)})});
|
1 |
+
function wpacuTabOpenSettingsArea(a,b){a.preventDefault();var c,d,e;for(d=document.getElementsByClassName("wpacu-settings-tab-content"),c=0;c<d.length;c++)d[c].style.display="none";for(e=document.getElementsByClassName("wpacu-settings-tab-link"),c=0;c<e.length;c++)e[c].className=e[c].className.replace(" active","");document.getElementById(b).style.display="table-cell",jQuery('a[href="#'+b+'"]').addClass("active"),jQuery("#wpacu-selected-tab-area").val(b)}jQuery(document).ready(function(a){function b(){if(!a("#wpacu_ajax_fetch_assets_list_dashboard_view").length)return!1;var b={};"direct"===wpacu_object.dom_get_type?(b[wpacu_object.plugin_name+"_load"]=1,b[wpacu_object.plugin_name+"_time_r"]=(new Date).getTime(),a.ajax({method:"GET",url:wpacu_object.page_url,data:b,cache:!1,complete:function(b,c){if("error"===b.statusText){var d=wpacu_object.ajax_direct_fetch_error;d=d.replace(/\{wpacu_output\}/,b.responseText),d=d.replace(/\{wpacu_status_code_error\}/,b.status),a("#wpacu_meta_box_content").html(d)}}}).done(function(b){var c=b.substring(b.lastIndexOf(wpacu_object.start_del)+wpacu_object.start_del.length,b.lastIndexOf(wpacu_object.end_del)),d={action:wpacu_object.plugin_name+"_get_loaded_assets",wpacu_list:c,post_id:wpacu_object.post_id,page_url:wpacu_object.page_url,tag_id:wpacu_object.tag_id,time_r:(new Date).getTime()};a.post(wpacu_object.ajax_url,d,function(b){if(!b)return!1;a("#wpacu_meta_box_content").html(b),a("#wpacu_home_page_form").length>0&&a("#submit").show(),setTimeout(function(){e.load(),a(".wpacu_asset_row").removeClass("wpacu-loading"),a("#wpacu-assets-reloading").remove()},200)})})):"wp_remote_post"===wpacu_object.dom_get_type&&(b={action:wpacu_object.plugin_name+"_get_loaded_assets",post_id:wpacu_object.post_id,page_url:wpacu_object.page_url,tag_id:wpacu_object.tag_id,time_r:(new Date).getTime()},a.post(wpacu_object.ajax_url,b,function(b){if(!b)return!1;a("#wpacu_meta_box_content").html(b),a("#wpacu_home_page_form").length>0&&a("#submit").show(),setTimeout(function(){e.load()},200)}))}a('input[name="wpacu_sub_tab_area"]').click(function(){a(this).prop("checked")&&a("#wpacu-selected-sub-tab-area").val(a(this).val())}),a("#wpacu_minify_css_enable, #wpacu_combine_loaded_css_enable, #wpacu_minify_js_enable, #wpacu_combine_loaded_js_enable").click(function(){a(this).prop("checked")?a('[data-linked-to="'+a(this).attr("id")+'"]').find(".wpacu-circle-status").addClass("wpacu-on").removeClass("wpacu-off"):a('[data-linked-to="'+a(this).attr("id")+'"]').find(".wpacu-circle-status").addClass("wpacu-off").removeClass("wpacu-on")}),a("#wpacu-mark-license-valid-button").click(function(){return confirm(wpacu_object.mark_license_valid_confirm)}),a("#wpacu-license-form").submit(function(){a("#edd_license_activate_btn").attr("disabled","disabled"),a("#edd_license_deactivate_btn").attr("disabled","disabled"),a(".wpacu-license-spinner").show()});var c,d;a("#wpacu-reset-drop-down").on("change keyup keydown mouseup mousedown click",function(){""===a(this).val()?(a("#wpacu-warning-read").removeClass("wpacu-visible"),a("#wpacu-reset-submit-btn").attr("disabled","disabled").removeClass("button-primary").addClass("button-secondary")):("reset_everything"===a(this).val()?a("#wpacu-license-data-remove-area").addClass("wpacu-visible"):a("#wpacu-license-data-remove-area").removeClass("wpacu-visible"),a("#wpacu-warning-read").addClass("wpacu-visible"),a("#wpacu-reset-submit-btn").removeAttr("disabled").removeClass("button-secondary").addClass("button-primary")),a(".wpacu-tools-area .wpacu-warning").hide(),c=a(this).find("option:selected"),a("#"+c.attr("data-id")).show()}),a("#wpacu-reset-submit-btn").on("click",function(){if("reset_settings"===a("#wpacu-reset-drop-down").val()?d=wpacu_object.reset_settings_confirm_msg:"reset_everything_except_settings"===a("#wpacu-reset-drop-down").val()?d=wpacu_object.reset_everything_except_settings_confirm_msg:"reset_everything"===a("#wpacu-reset-drop-down").val()&&(d=wpacu_object.reset_everything_confirm_msg),!confirm(d))return!1;a("#wpacu-action-confirmed").val("yes"),setTimeout(function(){"yes"===a("#wpacu-action-confirmed").val()&&a("#wpacu-tools-form").submit()},1e3)}),a("#wpacu-import-form").submit(function(){if(!confirm(wpacu_object.import_confirm_msg))return!1;a(this).find("button").addClass("wpacu-importing").prop("disabled",!0)});var e={load:function(){var b;a(".input-unload-on-this-page").on("click change",function(){a(this).prop("checked")?(e.uncheckAllOtherUnloadRules(a(this)),a(this).closest("tr").addClass("wpacu_not_load")):a(this).closest("tr").removeClass("wpacu_not_load")}),a(".wpacu-plugin-check-all").on("click",function(b){b.preventDefault();var c=a(this).attr("data-wpacu-plugin");a('table.wpacu_list_by_location[data-wpacu-plugin="'+c+'"]').find(".input-unload-on-this-page.wpacu-not-locked").prop("checked",!0).closest("tr").addClass("wpacu_not_load")}),a(".wpacu-plugin-uncheck-all").on("click",function(b){b.preventDefault();var c=a(this).attr("data-wpacu-plugin");a('table.wpacu_list_by_location[data-wpacu-plugin="'+c+'"]').find(".input-unload-on-this-page.wpacu-not-locked").prop("checked",!1).closest("tr").removeClass("wpacu_not_load")}),a(".wpacu_global_unload").click(function(){b=a(this).attr("data-handle"),a(this).prop("checked")?(a(this).parent("label").addClass("wpacu_input_load_checked"),a(this).closest("tr").addClass("wpacu_not_load"),e.uncheckAllOtherUnloadRules(a(this))):(a(this).parent("label").removeClass("wpacu_input_load_checked"),a(this).closest("tr").removeClass("wpacu_not_load"))}),a(".wpacu_keep_bulk_rule").click(function(){a(this).prop("checked")&&a(this).parents("li").next().removeClass("remove_rule")}),a(".wpacu_remove_bulk_rule").click(function(){a(this).prop("checked")&&a(this).parents("li").addClass("remove_rule")}),a(".wpacu_bulk_unload").click(function(){b=a(this).attr("data-handle"),a(this).prop("checked")?(a(this).parent("label").addClass("wpacu_input_load_checked"),a(this).closest("tr").addClass("wpacu_not_load"),e.uncheckAllOtherUnloadRules(a(this))):(a(this).parent("label").removeClass("wpacu_input_load_checked"),a(this).closest("tr").removeClass("wpacu_not_load"))}),a(".wpacu_load_it_option").click(function(){var b=a(this).attr("data-handle");if(a(this).prop("checked")){a(this).parent("label").addClass("wpacu_global_unload_exception");var c="";a(this).hasClass("wpacu_style")?c="style":a(this).hasClass("wpacu_script")&&(c="script"),a("#"+c+"_"+b).prop("checked",!1).trigger("change")}else a(this).parent("label").removeClass("wpacu_global_unload_exception")}),a(".wpacu-add-handle-note").on("click",function(b){b.preventDefault();var c,d=a(this).attr("data-handle");a(this).hasClass("wpacu-for-script")?c=a('.wpacu-handle-notes-field[data-script-handle="'+d+'"]'):a(this).hasClass("wpacu-for-style")&&(c=a('.wpacu-handle-notes-field[data-style-handle="'+d+'"]')),c.is(":hidden")?c.show():c.hide()}),a(".wpacu-external-file-size").on("click",function(b){b.preventDefault();var c,d=a(this);d.hide(),c=d.next(),c.show(),a.post(wpacu_object.ajax_url,{action:"get_external_file_size",wpacu_remote_file:d.attr("data-src")},function(a){c.html(a)})})},uncheckAllOtherUnloadRules:function(a){a.closest("tr").find(".wpacu_unload_rule_input").not(a).prop("checked",!1).parent("label").removeClass("wpacu_input_load_checked")}};a("#wpacu_post_type_select").change(function(){a("#wpacu_post_type_form").submit()}),a("#wpacu_taxonomy_select").change(function(){a("#wpacu_taxonomy_form").submit()}),a("#wpacu_dashboard").click(function(){a(this).prop("checked")?(a("#wpacu-settings-assets-retrieval-mode").show(),a("#wpacu_hide_meta_boxes_for_post_types_chosen .chosen-choices, #wpacu-hide-meta-boxes-for-post-types-info").css({opacity:1})):(a("#wpacu-settings-assets-retrieval-mode").hide(),a("#wpacu_hide_meta_boxes_for_post_types_chosen .chosen-choices, #wpacu-hide-meta-boxes-for-post-types-info").css({opacity:.4}))}),a(".wpacu-dom-get-type-selection").change(function(){a(this).is(":checked")&&(a(".wpacu-dom-get-type-info").hide(),a("#"+a(this).attr("data-target")).fadeIn("fast"))}),a("#wpacu_frontend").click(function(){a(this).prop("checked")?a("#wpacu-settings-frontend-exceptions").show():a("#wpacu-settings-frontend-exceptions").hide()}),a(".google_fonts_combine_type").change(function(){a(".wpacu_google_fonts_combine_type_area").hide(),"async"===a(this).val()?a("#wpacu_google_fonts_combine_type_async_info_area").fadeIn():"async_preload"===a(this).val()?a("#wpacu_google_fonts_combine_type_async_preload_info_area").fadeIn():a("#wpacu_google_fonts_combine_type_rb_info_area").fadeIn()}),a("#wpacu_assets_list_layout").on("click change",function(){"by-location"===a(this).val()?a("#wpacu-assets-list-by-location-selected").fadeIn("fast"):a("#wpacu-assets-list-by-location-selected").fadeOut("fast")}),a("#wpacu_disable_jquery_migrate").on("click",function(){return!a(this).is(":checked")||(!(!a(this).is(":checked")||!confirm(wpacu_object.jquery_migration_disable_confirm_msg))||(a(this).prop("checked",!1),!1))}),a("#wpacu_disable_comment_reply").on("click",function(){return!a(this).is(":checked")||(!(!a(this).is(":checked")||!confirm(wpacu_object.comment_reply_disable_confirm_msg))||(a(this).prop("checked",!1),!1))}),a("[data-target-opacity]").click(function(){a(this).prop("checked")?a("#"+a(this).attr("data-target-opacity")).css({opacity:1}):a("#"+a(this).attr("data-target-opacity")).css({opacity:.4})}),a(".wpacu-combine-loaded-js-level").change(function(){a(this).is(":checked")&&(a(".wpacu_combine_loaded_js_level_area").removeClass("wpacu_active"),a("#"+a(this).attr("data-target")).addClass("wpacu_active"))});var f=a('#wpacu-update-button-area input[type="submit"]');f.click(function(){a("#wpacu-updating-settings").show()});var g=a("#wpacu-update-front-settings-area .wpacu_update_btn");if(g.parents("form").submit(function(){return g.attr("disabled",!0).addClass("wpacu_submitting"),a("#wpacu-updating-front-settings").show(),!0}),a("form#wpacu-settings-form, form#wpacu_home_page_form").submit(function(){return f.attr("disabled",!0),!0}),a(".wpacu_remove_rule").click(function(){var b=a(this).parents(".wpacu_global_rule_row");a(this).prop("checked")?b.addClass("selected"):b.removeClass("selected")}),a(".wpacu_restore_position").click(function(){var b=a(this).parents(".wpacu_restore_position_row");a(this).prop("checked")?b.addClass("wpacu_selected"):b.removeClass("wpacu_selected")}),a(".wpacu_remove_global_attr").click(function(){var b=a(this).parents(".wpacu_remove_global_attr_row");a(this).prop("checked")?b.addClass("wpacu_selected"):b.removeClass("wpacu_selected")}),a("#wpacu_wrap_assets").length>0&&setTimeout(function(){e.load()},200),"undefined"==typeof wpacu_object||a("#wpacu_meta_box_content").length<1)return!1;b(),a(document).on("click",".wp-admin.post-php .edit-post-header__settings button.is-primary",function(){var c=function(){if(0===a(".edit-post-header__settings .is-saving").length){if(a("#wpacu_unload_assets_area_loaded").length>0&&a("#wpacu_unload_assets_area_loaded").val()){a("#wpacu-assets-reloading").remove();var c='<span id="wpacu-assets-reloading" class="editor-post-saved-state is-wpacu-reloading">'+wpacu_object.reload_icon+wpacu_object.reload_msg+"</span>";a(".wp-admin.post-php .edit-post-header__settings").prepend(c)}a(".wpacu_asset_row").addClass("wpacu-loading"),b(),clearInterval(d)}},d=setInterval(c,900)})});
|
assets/style.min.css
CHANGED
@@ -1 +1 @@
|
|
1 |
-
#wpacu-pages-info-area{width:98%}#wpacu-top-area{margin:15px 0;padding:0 10px}#wpacu-quick-actions{color:#74777b;float:right;width:auto;margin-right:30px;background:rgba(40,44,42,.05);border-radius:10px;padding:6px 12px}#wpacu-quick-actions .wpacu-actions-title{font-weight:200;letter-spacing:.5px}#wpacu-quick-actions a{color:#004567;text-decoration:none}#wpacu-quick-actions a:hover{color:#0073aa}#wpacu-logo-wrap{width:auto;display:inline-block;position:relative}#wpacu-logo-wrap a{display:block}#wpacu-logo-wrap img{width:352px;height:79px}#wpacu-logo-wrap .wpacu-pro-sign{position:absolute;height:auto;font-family:FiraSans-Medium,proxima-nova-1,Montserrat,Helvetica,sans-serif;font-size:13px;font-weight:600;letter-spacing:1px;padding:5px 11px;border-radius:15px;right:-60px;top:30px;width:auto;display:inline-block;text-align:center}#wpacu-logo-wrap .wpacu-pro-sign.wpacu-lite{color:#74777b;background:rgba(40,44,42,.05)}#wpacu-logo-wrap .wpacu-pro-sign.wpacu-pro{color:#004567;background-color:rgba(40,44,42,.05)}.wpacu-tabs{position:relative;overflow:hidden;margin:0 auto 20px;width:100%;font-weight:300;font-size:20px}.wpacu-tabs nav{text-align:center}.wpacu-tabs nav ul{position:relative;display:-ms-flexbox;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:flex;margin:0 auto;padding:0;max-width:1200px;list-style:none;-ms-box-orient:horizontal;-ms-box-pack:center;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center}.wpacu-tabs nav ul li{position:relative;z-index:1;display:block;margin:0;text-align:center;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1}.wpacu-tabs nav ul li span.extra-info{position:absolute;font-size:12px;left:0;right:50%;bottom:12px;-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.wpacu-tabs nav ul li span.extra-info .dashicons{font-size:16px;margin-right:-3px;margin-top:1px}.wpacu-tabs nav ul li span.extra-info.license-status.inactive{color:#c00}.wpacu-tabs nav ul li span.extra-info.license-status.active{color:green}.wpacu-tabs nav ul li span.extra-info.assets-unloaded-false{color:#004567}.wpacu-tabs nav ul li span.extra-info.assets-unloaded-true,.wpacu-tabs nav ul li span.extra-info.bulk-unloads-true{color:green}.wpacu-tabs nav a{position:relative;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:2.5}.wpacu-tabs nav a span{vertical-align:middle;font-size:14px}.wpacu-tabs nav li.wpacu-tab-current a{color:#74777b}.wpacu-tabs nav a:focus{outline:0}.wpacu-tabs .dashicons{font-size:20px}.no-js .wpacu-content-wrap section{display:block;padding-bottom:2em;border-bottom:1px solid rgba(255,255,255,.6)}.no-flexbox nav ul{display:block}.no-flexbox nav ul li{min-width:15%;display:inline-block}@media screen and (max-width:58em){.wpacu-tabs nav a.icon span{display:none}.wpacu-tabs nav a:before{margin-right:0}}.wpacu-tabs-style-underline nav{background:#fff}.wpacu-tabs-style-underline nav a{color:#74777b;font-size:18px;text-transform:uppercase;text-decoration:none;padding:.25em 0 .5em;border-left:1px solid #e7ecea;-webkit-transition:color .2s;transition:color .2s}.wpacu-tabs-style-underline nav li:last-child a{border-right:1px solid #e7ecea}.wpacu-tabs-style-underline nav li a::after{position:absolute;bottom:0;left:0;width:100%;height:6px;background:#2CC185;content:'';-webkit-transition:-webkit-transform .3s;transition:transform .3s;-webkit-transform:translate3d(0,150%,0);transform:translate3d(0,150%,0)}.wpacu-tabs-style-underline nav li.wpacu-tab-current a::after{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.wpacu-tabs-style-underline nav a span{font-weight:700}.wpacu-tabs-style-topline{max-width:1200px;margin:20px auto 30px 0;width:100%;font-weight:300;text-decoration:none}.wpacu-tabs-style-topline nav li{border:1px solid rgba(40,44,42,.1)}.wpacu-tabs-style-topline nav li:not(:last-child){border-right:none}.wpacu-tabs-style-topline nav li.wpacu-tab-current{border-top-color:#008f9c;border-bottom:none}.wpacu-tabs-style-topline nav a{padding:20px 18px;background:rgba(40,44,42,.05);color:#74777b;line-height:1;-webkit-transition:color .2s;transition:color .2s;text-decoration:none}.wpacu-tabs-style-topline nav a:focus,.wpacu-tabs-style-topline nav a:hover{background:0 0;color:#008f9c}.wpacu-tabs-style-topline nav li.wpacu-tab-current a{background:0 0;box-shadow:inset 0 3px 0 #008f9c;color:#008f9c}.wpacu-tabs-style-topline nav li.wpacu-tab-current a span:not(.dashicons){font-weight:600}.wpacu-tabs-style-topline nav a span{text-transform:uppercase;font-weight:400}.wpacu-tab-nav-wrapper{border-bottom:none!important}.wpacu-tab-nav-wrapper .nav-tab.nav-tab-active{background:#fff;position:relative}.wpacu-tab-nav-wrapper .nav-tab.nav-tab-active:after{content:'';width:100%;bottom:-2px;left:0;position:absolute;border-bottom:2px solid #fff}.wpacu-script-attributes-area{margin:20px 0 0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings{padding:5px 7px!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings.wpacu-first{margin:0 28px 0 0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings label{margin:0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings li{margin:0 16px 0 0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings li:first-child{margin:0 10px 0 0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings li:last-child{margin:0 2px 0 0!important}.wpacu-script-attributes-area .wpacu-script-attributes-settings{background:#fff!important;border:1px solid #eee!important;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;padding:5px 10px!important;list-style:none;display:inline-block;margin:0}.wpacu-script-attributes-area .wpacu-script-attributes-settings input[type=radio]{width:auto;padding:0;margin:0 5px 0 0}.wpacu-script-attributes-area .wpacu-script-attributes-settings.wpacu-first{margin:0 34px 0 0!important}.wpacu-script-attributes-area .wpacu-script-attributes-settings li{float:left;margin:0 17px 0 0}.wpacu-script-attributes-area .wpacu-script-attributes-settings li:first-child{margin:0 10px 0 0!important}.wpacu-script-attributes-area .wpacu-script-attributes-settings li:last-child{margin:0}.wpacu-script-attributes-area .wpacu-script-attributes-settings:hover{background:#f2faf2}tr.wpacu_location_changed>td{border-left:#004567 4px solid}tr.wpacu_not_load td,tr.wpacu_not_load th{background:#FFE1E1!important}tr.wpacu_not_load td .wpacu-assets-inline-code-wrap,tr.wpacu_not_load td .wpacu-script-attributes-area,tr.wpacu_not_load th .wpacu-assets-inline-code-wrap,tr.wpacu_not_load th .wpacu-script-attributes-area{filter:alpha(opacity=45);opacity:.45}.dashicons-wpacu{width:17px;height:17px;margin:2px 0 0;font-size:16px;text-decoration:none;color:inherit!important}#wpacu_meta_box_content,.wpacu_widefat{width:99%}.wpacu_widefat .check-column.wpacu_check{padding:10px}body[class*=wpassetcleanup] #footer-left{border-left:2px solid green;padding-left:10px}#wpassetcleanup_asset_list small{width:auto;float:none;display:inline}#wpacu_meta_box_content .emoji{font-size:18px}#wpacu_meta_box_content h3{margin-left:0;padding-left:0}#wpacu_meta_box_content div.wpacu_note{padding:10px;background-color:#f5f5f5}#wpacu_meta_box_content .dashicons.dashicons-warning{color:#c00}#wpacu_meta_box_content .wpacu_verified{padding:10px;background-color:#f5f5f5;border-left:1px solid #ddd}#wpacu_meta_box_content .wpacu_verified span{color:#0073aa;font-weight:700}#wpacu_meta_box_content div.wpacu_warning{border:1px solid #c00}#wpacu_meta_box_content ul.wpacu_asset_options{margin:0;padding:0}#wpacu_meta_box_content ul.wpacu_asset_options li{list-style:none;display:inline-block}#wpacu_meta_box_content ul.wpacu_asset_options label{font-weight:400;margin-right:5px;margin-top:5px;margin-bottom:5px}.wpacu-updated-frontend{font-weight:400;background-color:#fff;border-left:4px solid #46b450;border-top:1px solid #46b450;border-right:1px solid #46b450;border-bottom:1px solid #46b450;padding:9px 14px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.wpacu-updated-frontend span.dashicons-yes{color:#46b450;font-size:26px}#wpacu-update-front-settings-area{margin:10px 0;display:inline-block;position:relative}#wpacu-updating-front-settings{display:none;position:absolute;top:5px;right:-35px}#wpacu_wrap_assets{color:#000!important;text-align:left!important;clear:both!important;width:90%!important;padding:20px!important;margin:30px 0 0 15px!important;border:1px solid #cdcdcd;z-index:10000!important;position:relative!important;background-color:#fff!important}#wpacu_wrap_assets div.wpacu_warning{border:1px solid #c00;padding:5px 10px}#wpacu_wrap_assets small{display:inline!important;margin:0!important;letter-spacing:normal!important}#wpacu_wrap_assets input[type=checkbox]{width:auto!important;margin-right:4px!important}#wpacu_wrap_assets img:not(.wpacu-ajax-loader){display:inline-block!important}#wpacu_wrap_assets p{line-height:22px!important;margin:10px 0!important;text-align:left!important;font-weight:400!important}#wpacu_wrap_assets p:first-child,.wpacu_verified{margin:0 0 10px!important}#wpacu_wrap_assets h1{margin:0 0 20px!important;font-size:160%!important;text-align:left!important}#wpacu_wrap_assets h3{margin:20px 0;font-size:130%}.wpacu_asset_row:first-child td{border-top:1px solid #cdcdcd}.wpacu_asset_row td{border-left:1px solid #cdcdcd;border-right:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd}.wpacu_asset_row.wpacu_notice_row td{position:relative;padding:5px;border-bottom:1px solid transparent}.wpacu_asset_row.wpacu_notice_row td div.wpacu-warning{width:auto;margin:5px;font-style:italic}.wpacu_asset_row:not(.wpacu_notice_row) td{padding:18px!important;position:relative}.wpacu_asset_row:not(.wpacu_notice_row) td.selected,.wpacu_asset_row:not(.wpacu_notice_row) td:hover{-moz-box-shadow:inset 0 0 12px #cdcdcd;-webkit-box-shadow:inset 0 0 12px #cdcdcd;box-shadow:inset 0 0 12px #cdcdcd}.wpacu_asset_row:not(.wpacu_notice_row) td p{padding:0!important;margin-bottom:10px!important;word-wrap:break-word!important;-ms-word-break:break-all;word-break:break-word}.wpacu_asset_row:not(.wpacu_notice_row) td label{width:auto!important;margin:0!important;cursor:pointer!important;display:inline-block!important;font-size:100%!important;font-weight:400!important}.wpacu_asset_row:not(.wpacu_notice_row) td label span:not(.dashicons){font-size:100%!important}.wpacu_asset_row:not(.wpacu_notice_row) td.wpacu_check{width:50px!important}.asset-table-extra-info td{padding:5px!important}body.wp-admin .wpacu_asset_row td.wpacu_check{width:25px!important}.wpacu_asset_row .dashicons-warning{color:red!important}label.wpacu_add_global{cursor:pointer!important}label.wpacu_input_load_checked{font-weight:700;color:#d54e21}label.wpacu_global_unload_exception{font-weight:700!important}tr.wpacu_global_rule_row.selected{background:#e7e7e7}.nav-tab-wrapper{border-bottom:1px solid #ccc;width:95%}.nav-tab-wrapper.nav-assets-manager .nav-tab{font-size:13px;font-weight:500;padding:6px 10px}.nav-tab-wrapper.nav-assets-manager .nav-tab.for-pro{padding:6px 8px 6px 3px}ul.wpacu_asset_options{margin:0 10px 0 0;padding:0}ul.wpacu_asset_options li{margin:0 10px 0 0;list-style:none;display:inline-block;line-height:normal}ul.wpacu_asset_options li.remove_rule label{font-weight:700}ul.wpacu_asset_options label{margin-right:20px;font-weight:400}ul.wpacu_asset_options label input{margin-right:4px}.wpacu_list_table,.wpacu_list_table div,.wpacu_list_table li,.wpacu_list_table p{font-weight:400}.wpacu_striped>tbody>:nth-child(even),ul.wpacu_striped>:nth-child(even){background-color:#fff!important}.wpacu_striped>tbody>:nth-child(odd),ul.wpacu_striped>:nth-child(odd){background-color:#f9f9f9!important}.wpacu_update_btn{-moz-box-shadow:inset 0 1px 0 0 #54a3f7!important;-webkit-box-shadow:inset 0 1px 0 0 #54a3f7!important;box-shadow:inset 0 1px 0 0 #54a3f7!important;background:-webkit-gradient(linear,left top,left bottom,color-stop(.05,#007dc1),color-stop(1,#0061a7))!important;background:-moz-linear-gradient(top,#007dc1 5%,#0061a7 100%)!important;background:-webkit-linear-gradient(top,#007dc1 5%,#0061a7 100%)!important;background:-o-linear-gradient(top,#007dc1 5%,#0061a7 100%)!important;background:-ms-linear-gradient(top,#007dc1 5%,#0061a7 100%)!important;background:linear-gradient(to bottom,#007dc1 5%,#0061a7 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#007dc1', endColorstr='#0061a7', GradientType=0)!important;background-color:#007dc1!important;-moz-border-radius:3px!important;-webkit-border-radius:3px!important;border-radius:3px!important;border:1px solid #124d77!important;display:inline-block!important;cursor:pointer!important;color:#fff!important;font-size:15px!important;padding:10px 24px!important;text-decoration:none!important;text-shadow:0 1px 0 #154682!important;height:auto!important;line-height:normal!important}.wpacu-btns .btn:focus,.wpacu-btns .btn:hover,.wpacu-btns a{text-decoration:none}.wpacu_update_btn.wpacu_submitting,.wpacu_update_btn:hover{background:-webkit-gradient(linear,left top,left bottom,color-stop(.05,#0061a7),color-stop(1,#007dc1))!important;background:-moz-linear-gradient(top,#0061a7 5%,#007dc1 100%)!important;background:-webkit-linear-gradient(top,#0061a7 5%,#007dc1 100%)!important;background:-o-linear-gradient(top,#0061a7 5%,#007dc1 100%)!important;background:-ms-linear-gradient(top,#0061a7 5%,#007dc1 100%)!important;background:linear-gradient(to bottom,#0061a7 5%,#007dc1 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0061a7', endColorstr='#007dc1', GradientType=0)!important;background-color:#0061a7!important}.wpacu_update_btn.wpacu_submitting{cursor:default!important}.wpacu_update_btn:active{position:relative!important;top:1px!important}.wpacu-btns .btn{display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;-webkit-border-radius:.25rem;-moz-border-radius:.25rem;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wpacu-btns .btn.focus,.wpacu-btns .btn:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.25);box-shadow:0 0 0 2px rgba(2,117,216,.25)}.wpacu-btns .btn.disabled,.wpacu-btns .btn:disabled{cursor:not-allowed;opacity:.65}.wpacu-btns .btn.active,.wpacu-btns .btn:active{background-image:none}.wpacu-btns a.btn.disabled,.wpacu-btns fieldset[disabled] a.btn{pointer-events:none}.wpacu-btns .btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.wpacu-btns .btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.wpacu-btns .btn-primary.focus,.wpacu-btns .btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.wpacu-btns .btn-primary.disabled,.wpacu-btns .btn-primary:disabled{background-color:#0275d8;border-color:#0275d8}.wpacu-btns .btn-primary.active,.wpacu-btns .btn-primary:active,.wpacu-btns .show>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.wpacu-btns .btn-secondary{color:#292b2c;background-color:#fff;border-color:#ccc}.wpacu-btns .btn-secondary:hover{color:#292b2c;background-color:#e6e6e6;border-color:#adadad}.wpacu-btns .btn-secondary.focus,.wpacu-btns .btn-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.wpacu-btns .btn-secondary.disabled,.wpacu-btns .btn-secondary:disabled{background-color:#fff;border-color:#ccc}.wpacu-btns .btn-secondary.active,.wpacu-btns .btn-secondary:active,.wpacu-btns .show>.btn-secondary.dropdown-toggle{color:#292b2c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.wpacu-btns .btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.wpacu-btns .btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.wpacu-btns .btn-info.focus,.wpacu-btns .btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.wpacu-btns .btn-info.disabled,.wpacu-btns .btn-info:disabled{background-color:#5bc0de;border-color:#5bc0de}.wpacu-btns .btn-info.active,.wpacu-btns .btn-info:active,.wpacu-btns .show>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.wpacu-btns .btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.wpacu-btns .btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.wpacu-btns .btn-success.focus,.wpacu-btns .btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.wpacu-btns .btn-success.disabled,.wpacu-btns .btn-success:disabled{background-color:#5cb85c;border-color:#5cb85c}.wpacu-btns .btn-success.active,.wpacu-btns .btn-success:active,.wpacu-btns .show>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.wpacu-btns .btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.wpacu-btns .btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.wpacu-btns .btn-warning.focus,.wpacu-btns .btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.wpacu-btns .btn-warning.disabled,.wpacu-btns .btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.wpacu-btns .btn-warning.active,.wpacu-btns .btn-warning:active,.wpacu-btns .show>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.wpacu-btns .btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.wpacu-btns .btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.wpacu-btns .btn-danger.focus,.wpacu-btns .btn-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.wpacu-btns .btn-danger.disabled,.wpacu-btns .btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.wpacu-btns .btn-danger.active,.wpacu-btns .btn-danger:active,.wpacu-btns .show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.wpacu-btns .btn-outline-primary{color:#0275d8;background-image:none;background-color:transparent;border-color:#0275d8}.wpacu-btns .btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.wpacu-btns .btn-outline-primary.focus,.wpacu-btns .btn-outline-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.wpacu-btns .btn-outline-primary.disabled,.wpacu-btns .btn-outline-primary:disabled{color:#0275d8;background-color:transparent}.wpacu-btns .btn-outline-primary.active,.wpacu-btns .btn-outline-primary:active,.wpacu-btns .show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.wpacu-btns .btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.wpacu-btns .btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.wpacu-btns .btn-outline-secondary.focus,.wpacu-btns .btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.wpacu-btns .btn-outline-secondary.disabled,.wpacu-btns .btn-outline-secondary:disabled{color:#ccc;background-color:transparent}.wpacu-btns .btn-outline-secondary.active,.wpacu-btns .btn-outline-secondary:active,.wpacu-btns .show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.wpacu-btns .btn-outline-info{color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.wpacu-btns .btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.wpacu-btns .btn-outline-info.focus,.wpacu-btns .btn-outline-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.wpacu-btns .btn-outline-info.disabled,.wpacu-btns .btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.wpacu-btns .btn-outline-info.active,.wpacu-btns .btn-outline-info:active,.wpacu-btns .show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.wpacu-btns .btn-outline-success{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.wpacu-btns .btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.wpacu-btns .btn-outline-success.focus,.wpacu-btns .btn-outline-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.wpacu-btns .btn-outline-success.disabled,.wpacu-btns .btn-outline-success:disabled{color:#5cb85c;background-color:transparent}.wpacu-btns .btn-outline-success.active,.wpacu-btns .btn-outline-success:active,.wpacu-btns .show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.wpacu-btns .btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.wpacu-btns .btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.wpacu-btns .btn-outline-warning.focus,.wpacu-btns .btn-outline-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.wpacu-btns .btn-outline-warning.disabled,.wpacu-btns .btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.wpacu-btns .btn-outline-warning.active,.wpacu-btns .btn-outline-warning:active,.wpacu-btns .show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.wpacu-btns .btn-outline-danger{color:#d9534f;background-image:none;background-color:transparent;border-color:#d9534f}.wpacu-btns .btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.wpacu-btns .btn-outline-danger.focus,.wpacu-btns .btn-outline-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.wpacu-btns .btn-outline-danger.disabled,.wpacu-btns .btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.wpacu-btns .btn-outline-danger.active,.wpacu-btns .btn-outline-danger:active,.wpacu-btns .show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.wpacu-btns .btn-link{font-weight:400;color:#0275d8;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.wpacu-btns .btn-link,.wpacu-btns .btn-link.active,.wpacu-btns .btn-link:active,.wpacu-btns .btn-link:disabled{background-color:transparent}.wpacu-btns .btn-link,.wpacu-btns .btn-link:active,.wpacu-btns .btn-link:focus,.wpacu-btns .btn-link:hover{border-color:transparent}.wpacu-btns .btn-link:focus,.wpacu-btns .btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.wpacu-btns .btn-link:disabled{color:#636c72}.wpacu-btns .btn-link:disabled:focus,.wpacu-btns .btn-link:disabled:hover{text-decoration:none}.wpacu-btns .btn-group-lg>.btn,.wpacu-btns .btn-lg{padding:.75rem 1.5rem;font-size:1.25rem;-webkit-border-radius:.3rem;-moz-border-radius:.3rem;border-radius:.3rem}.wpacu-btns .btn-group-sm>.btn,.wpacu-btns .btn-sm{padding:.25rem .5rem;font-size:.875rem;-webkit-border-radius:.2rem;-moz-border-radius:.2rem;border-radius:.2rem}.wpacu-btns .btn-block{display:block;width:100%}.wpacu-btns .btn-block+.btn-block{margin-top:.5rem}.wpacu-btns input[type=reset].btn-block,.wpacu-btns input[type=button].btn-block,.wpacu-btns input[type=submit].btn-block{width:100%}.wpacu-btns .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.go-pro-button{background-color:#4CAF50;border:2px solid #4CAF50;color:#fff;padding:12px 18px;text-align:center;text-decoration:none;display:inline-block;font-size:16px;margin:4px 2px;cursor:pointer;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;-webkit-transition-duration:.4s;transition-duration:.4s}.go-pro-button:hover{background-color:#fff;color:#000;border:2px solid #4CAF50;text-decoration:none}.wpacu-restore-pos-btn{font-size:14px!important;line-height:normal!important;height:42px!important;padding:0 18px!important;margin-top:10px!important}body.wp-admin .wpacu_asset_row .go-pro-link-no-style .wpacu-tooltip{padding:8px 2px}body.wp-admin .go-pro-link-no-style .wpacu-tooltip{text-shadow:none;font-weight:400;font-size:12px;line-height:16px;padding:8px 11px}.go-pro-link-no-style{position:relative;display:inline-block;color:inherit;text-decoration:none}.go-pro-link-no-style:not(.nav-tab){font-style:italic}.go-pro-link-no-style.no-transition .wpacu-tooltip{-webkit-transition:0s all ease;transition:0s all ease;-webkit-transition-delay:0s;transition-delay:0s}.go-pro-link-no-style>img{max-width:20px;max-height:20px}.go-pro-link-no-style .wpacu-tooltip{font-size:14px;line-height:18px;position:absolute;z-index:1;visibility:hidden;width:160px;background-color:#00a7a7;color:#fff;text-align:center;padding:8px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;bottom:100%;bottom:calc(100% + 15px);left:50%;margin-left:-65px;-webkit-transition:.1s all ease;transition:.1s all ease;-webkit-transition-delay:0s;transition-delay:0s}.go-pro-link-no-style .wpacu-tooltip:after{content:"";position:absolute;border-width:10px;border-style:solid;top:100%;left:50%;left:calc(50% - 10px);border-color:#00a7a7 transparent transparent}.go-pro-link-no-style .wpacu-tooltip.wpacu-on-pages-btn{cursor:pointer;margin-left:-77px;width:130px}.go-pro-link-no-style .wpacu-tooltip.wpacu-larger{width:240px}.go-pro-link-no-style:hover .wpacu-tooltip{visibility:visible}.wpacu_list_table tr:first-child .wordpress-core-file .wpacu-tooltip{bottom:-40px;left:120px;margin-left:-86px}.wpacu_list_table tr:first-child .wordpress-core-file .wpacu-tooltip:after{top:41px;left:-20px;border-color:transparent #c00 transparent transparent}.wordpress-core-file{position:relative;display:inline-block;font-style:normal;color:inherit;text-decoration:none}.wordpress-core-file .wpacu-tooltip{font-size:14px;line-height:18px;position:absolute;z-index:1;visibility:hidden;width:160px;background-color:#c00;color:#fff;text-align:center;padding:6px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;bottom:100%;bottom:calc(100% + 15px);left:50%;margin-left:-86px;-webkit-transition:.1s all ease;transition:.1s all ease;-webkit-transition-delay:0s;transition-delay:0s}.wordpress-core-file .wpacu-tooltip:after{content:"";position:absolute;border-width:10px;border-style:solid;top:100%;left:50%;left:calc(50% - 10px);border-color:#c00 transparent transparent}.wordpress-core-file:hover .wpacu-tooltip{visibility:visible}.ajax-direct-call-error-area{background:#fff;padding:10px;border:1px solid #c00;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px}.ajax-direct-call-error-area td{padding:6px}.ajax-direct-call-error-area .note{margin-top:0;padding-top:0}.ajax-direct-call-error-area .error-code{color:#c00;font-weight:700}.ajax-wp-remote-post-call-error-area{background:#fff;padding:20px}.ajax-wp-remote-post-call-error-area .table-data{background:0 0;border:1px solid #c66;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.ajax-wp-remote-post-call-error-area .table-data td{padding:10px}.wrap-upgrade-info{background:#fff;padding:0 15px;border:1px solid #cdcdcd;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.wpacu-notice{margin:20px 20px 0 0!important}.wpacu-notice p{font-weight:600!important;font-style:italic}.wpacu-notice .dashicons{font-weight:inherit!important;color:#46b450!important;margin-right:4px;vertical-align:text-bottom;font-size:27px}.wpacu-notice-info{padding:12px 12px 12px 16px;background:#fff;border-left:4px solid #008f9c}.wpacu-notice-info p{margin-top:8px}.wpacu-notice-info p:first-child{margin-top:0}.wpacu-notice-info p:last-child{margin-bottom:0}.wpacu-warning{font-size:15px;padding:10px;background:#fffcec;border:1px solid #fdd5c9;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0 0 5px;width:100%}.pro-page-unlock-notice{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;padding:10px;background:#f2faf2;border:1px solid #c0e8c0;width:auto;display:block}.wpacu-license-area .notice,.wpacu-settings-area .notice{margin-left:0;padding:10px!important;width:97%;box-sizing:border-box;font-weight:600;font-style:italic}.wpacu-license-area .notice .dashicons,.wpacu-settings-area .notice .dashicons{color:green}#wpacu-dom-get-type-selections,.wpacu-radio-selections{float:none;clear:both;width:auto;display:inline-block;margin-bottom:0;margin-top:0}#wpacu-dom-get-type-selections.wpacu-vertical,.wpacu-radio-selections.wpacu-vertical{display:block;margin-top:15px;margin-bottom:18px}#wpacu-dom-get-type-selections.wpacu-vertical li,.wpacu-radio-selections.wpacu-vertical li{float:none;margin-bottom:12px}#wpacu-dom-get-type-selections.wpacu-vertical li:last-child,.wpacu-radio-selections.wpacu-vertical li:last-child{margin-bottom:0}#wpacu-dom-get-type-selections li,.wpacu-radio-selections li{margin-right:30px;float:left;margin-bottom:0}#wpacu-dom-get-type-selections li:first-child,.wpacu-radio-selections li:first-child{margin-right:15px}#wpacu-dom-get-type-selections li:last-child,.wpacu-radio-selections li:last-child{margin-right:0}.wpacu_combine_loaded_js_level_area{display:none;background:0 0;border-left:2px solid #008f9c;padding-top:8px;padding-bottom:8px;padding-right:10px;padding-left:10px;margin:20px 0 15px}.wpacu_combine_loaded_js_level_area.wpacu_active{display:block}#wpacu-dom-get-type-infos{margin-bottom:0}#wpacu-dom-get-type-infos li{margin-bottom:0;line-height:20px}.wpacu-wrap li,.wpacu-wrap p,.wpacu-wrap td{font-weight:400}.wpacu-wrap small{width:auto;float:none;display:inline}.wpacu-wrap.wpacu-settings-show-all .wpacu-settings-tab-content{display:block;width:100%}.wpacu-wrap.wpacu-settings-show-all .wpacu-settings-area-title{color:#004567;padding:16px 15px;background:#f8f8f8;border-left:5px solid #004567b0;border-top:1px solid #e7e7e7;border-right:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;font-size:1.45em;font-weight:500}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch .wpacu_slider.wpacu_round,.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch .wpacu_slider.wpacu_round{border-radius:29px}.wpacu-wrap.wpacu-settings-show-all #wpacu-update-button-area{margin:0}.wpacu-wrap.wpacu-settings-show-all #wpacu-update-button-area .button{padding:11px 28px;height:auto;font-size:18px}.wpacu-wrap.wpacu-settings-show-all #wpacu-updating-settings{margin-left:224px;top:25px}.wpacu-wrap.wpacu-switch-standard .asset-cleanup-pro_page_wpassetcleanup_settings .wpacu_switch,.wpacu-wrap.wpacu-switch-standard .asset-cleanup_page_wpassetcleanup_settings .wpacu_switch{width:auto;height:auto}.wpacu-wrap.wpacu-switch-standard .asset-cleanup-pro_page_wpassetcleanup_settings .wpacu_switch input,.wpacu-wrap.wpacu-switch-standard .asset-cleanup_page_wpassetcleanup_settings .wpacu_switch input{display:block}.wpacu-wrap.wpacu-switch-standard .asset-cleanup-pro_page_wpassetcleanup_settings .wpacu_switch input[type=checkbox],.wpacu-wrap.wpacu-switch-standard .asset-cleanup_page_wpassetcleanup_settings .wpacu_switch input[type=checkbox]{margin:0 0 3px}.wpacu-wrap.wpacu-switch-standard .asset-cleanup-pro_page_wpassetcleanup_settings .wpacu_switch .wpacu_slider,.wpacu-wrap.wpacu-switch-standard .asset-cleanup_page_wpassetcleanup_settings .wpacu_switch .wpacu_slider{display:none}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch{position:relative;display:inline-block;width:52px;height:29px}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch input{display:none}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch:not(.wpacu_switch_standard) .wpacu_slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.2s;transition:.2s}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch:not(.wpacu_switch_standard) .wpacu_slider:before{position:absolute;content:'';height:22px;width:22px;left:4px;bottom:4px;background-color:#fff;-webkit-transition:.2s;transition:.2s}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch input:checked+.wpacu_slider{background-color:#52af00}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch input:focus+.wpacu_slider{box-shadow:0 0 1px #52af00}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch input:checked+.wpacu_slider:before{-webkit-transform:translateX(22px);-ms-transform:translateX(22px);transform:translateX(22px)}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch .wpacu_slider.wpacu_round:before{border-radius:50%}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch.wpacu_disabled,.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch.wpacu_locked_for_pro{opacity:.3}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch.wpacu_disabled:before{content:"\f160";font-family:Dashicons,Arial,"Times New Roman","Bitstream Charter",Times,serif;position:absolute;font-size:23px;top:5px;right:2px;z-index:1000}.asset-cleanup-pro_page_wpassetcleanup_settings .setting_title p.wpacu_subtitle,.asset-cleanup_page_wpassetcleanup_settings .setting_title p.wpacu_subtitle{margin-top:4px;line-height:1.4}.asset-cleanup-pro_page_wpassetcleanup_settings .setting_title p.wpacu_subtitle em,.asset-cleanup_page_wpassetcleanup_settings .setting_title p.wpacu_subtitle em{font-weight:200}.asset-cleanup-pro_page_wpassetcleanup_settings .setting_title p.wpacu_read_more,.asset-cleanup_page_wpassetcleanup_settings .setting_title p.wpacu_read_more{margin-top:-10px;font-style:italic;font-size:12px}.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_inline_code_status_choices,.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices,.asset-cleanup-pro_page_wpassetcleanup_settings .input_style_choices,.asset-cleanup_page_wpassetcleanup_settings .assets_list_inline_code_status_choices,.asset-cleanup_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices,.asset-cleanup_page_wpassetcleanup_settings .input_style_choices{list-style:none;margin:0}.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_inline_code_status_choices li,.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices li,.asset-cleanup-pro_page_wpassetcleanup_settings .input_style_choices li,.asset-cleanup_page_wpassetcleanup_settings .assets_list_inline_code_status_choices li,.asset-cleanup_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices li,.asset-cleanup_page_wpassetcleanup_settings .input_style_choices li{float:left;margin-right:30px}.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_inline_code_status_choices li:last-child,.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices li:last-child,.asset-cleanup-pro_page_wpassetcleanup_settings .input_style_choices li:last-child,.asset-cleanup_page_wpassetcleanup_settings .assets_list_inline_code_status_choices li:last-child,.asset-cleanup_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices li:last-child,.asset-cleanup_page_wpassetcleanup_settings .input_style_choices li:last-child{margin-right:0}#wpacu-assets-list-by-location-selected{background:0 0;border:1px solid #e7e7e7;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;padding:8px;clear:both}.notice.notice-success+.wpacu-wrap.wpacu-settings-area{margin-top:20px}.wpacu-license-action-btn-area{margin-top:0;position:relative;display:inline-block}.wpacu-license-spinner{display:none;position:absolute;right:-30px;top:4px}.wpacu-license-spinner img{width:20px;height:20px}#wpacu-activation-issues-info{border-radius:10px;width:90%;margin-top:20px;font-size:14px;padding:6px 20px;background:#fff;border:1px solid #e7e7e7}#wpacu-activation-issues-info ol li{font-size:13px;margin-bottom:10px}#wpacu-mark-license-area-wrap{margin:15px 0}.wpacu-form-table.wpacu-license th{width:150px}.wpacu-form-table th{vertical-align:top;text-align:left;padding:5px 20px 20px 0;width:200px;line-height:1.3;font-weight:600}.wpacu-form-table th label{color:#23282d;font-weight:600;font-size:14px;text-shadow:none;vertical-align:middle;cursor:pointer}.wpacu-form-table td{padding-bottom:25px}.wpacu-form-table td:last-child p:last-child{margin:0}.wpacu-form-table .wpacu-fancy-checkbox input[type=checkbox],.wpacu-form-table label input[type=checkbox]{height:20px;width:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.wpacu-form-table .wpacu-fancy-checkbox input[type=checkbox]:checked,.wpacu-form-table .wpacu-fancy-checkbox input[type=checkbox]:hover,.wpacu-form-table label input[type=checkbox]:checked,.wpacu-form-table label input[type=checkbox]:hover{border:1px solid green}.wpacu-form-table .wpacu-fancy-checkbox input[type=checkbox]:checked:before,.wpacu-form-table label input[type=checkbox]:checked:before{color:#52af00;font:400 24px/1 dashicons}.wpacu-form-table .wpacu-fancy-radio input[type=radio]{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;position:relative;height:20px;width:20px;margin:2px 0 0}.wpacu-form-table .wpacu-fancy-radio input[type=radio]:checked,.wpacu-form-table .wpacu-fancy-radio input[type=radio]:hover{border:1px solid green}.wpacu-form-table .wpacu-fancy-radio input[type=radio]:checked:before{margin:0;line-height:inherit;text-indent:inherit;content:'';position:absolute;top:4px;left:4px;width:10px;height:10px;border-radius:50%;background:#52af00;color:#52af00;font:400 24px/1 dashicons}#wpacu-settings-vertical-tab-wrap{display:table;width:100%}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text{margin:4px 0 0}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small{font-weight:lighter}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small span.wpacu-status-wrap{position:relative;padding-left:14px}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small span.wpacu-status-wrap span.wpacu-circle-status{position:absolute;left:0;top:2px;height:10px;width:10px;border-radius:50%;display:inline-block;opacity:.75}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small span.wpacu-status-wrap span.wpacu-circle-status.wpacu-on{background:#52af00}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small span.wpacu-status-wrap span.wpacu-circle-status.wpacu-off{background:#ccc}#wpacu-settings-vertical-tab-wrap *{box-sizing:border-box}.wpacu-settings-tab{display:table-cell;width:20%;height:100%;vertical-align:top}.wpacu-settings-tab a{text-decoration:none;border-left:3px solid transparent;display:block;background-color:#f1f1f1;color:#004567;padding:17px 16px;width:100%;outline:0;text-align:left;cursor:pointer;font-size:14px;font-weight:600;border-bottom:1px solid #ccc}.wpacu-settings-tab a:first-child{border-top:1px solid transparent!important}.wpacu-settings-tab a:last-child{border-bottom:1px solid transparent!important}.wpacu-settings-tab a:hover{background-color:#fff;border-left:3px solid #004567;position:relative}.wpacu-settings-tab a.active{color:#004567;background-color:#fff;border-left:3px solid #004567;position:relative;border-bottom:1px solid #ccc}.wpacu-settings-tab a.active:after{content:'';position:absolute;height:100%;width:1px;top:0;right:-1px;background-color:#fff}.wpacu-settings-tab-content{background-color:#fff;display:none;padding:12px 18px;width:79%;border-left:none;height:100%;border-top-right-radius:10px;border-bottom-right-radius:10px}.wpacu-settings-tab-content h2{padding:0 0 15px;border-bottom:1px solid #e7e7e7}.wpacu-settings-tab-content.active{display:table-cell}#wpacu_minify_css_exceptions_area,#wpacu_minify_js_exceptions_area{margin:16px 0 0}#wpacu-update-button-area{position:relative;margin-left:20%}#wpacu-update-button-area.no-left-margin{margin-left:0}#wpacu-update-button-area p{margin-top:10px}#wpacu-update-button-area .button{padding:5px 18px;height:38px;font-size:15px}#wpacu-updating-settings{position:absolute;margin-left:183px;top:19px;display:none}#combine_loaded_js_info_area{position:relative}#combine_loaded_js_info_area.locked-for-pro:before{position:absolute;content:'';height:100%;width:100%;background:#fff;opacity:.5;z-index:10000}.google_fonts_load_types{clear:both;margin:20px 0 15px;display:flex}.google_fonts_load_types>div{text-align:left}.google_fonts_load_types>div input{float:left;margin:0 7px 20px 0!important}body.wp-admin .wpacu-handle-notes{margin-top:10px!important}body.wp-admin .wpacu-handle-notes p{margin-top:0!important}body.wp-admin .wpacu-handle-notes p a{font-size:inherit}body.wp-admin .wpacu-handle-notes p a span.dashicons{font-size:19px;width:19px;height:19px;vertical-align:bottom;text-decoration:none}.wpacu-handle-notes{margin-top:12px!important;padding-top:5px;border-top:1px solid #e7e7e7}.wpacu-handle-notes .wpacu-handle-notes-field{display:none}.wpacu-handle-notes .wpacu-handle-notes-field>textarea{font-size:85%;padding:6px;width:320px;max-width:100%}.wpacu-handle-notes p{margin:10px 0 0!important}.wpacu-handle-notes p a.wpacu-add-handle-note{text-decoration:none;font-size:80%;display:inline-block;color:inherit}.wpacu-handle-notes p a.wpacu-add-handle-note span.dashicons{font-size:18px;width:18px;height:18px}.wrap_bulk_unload_options{width:auto;display:inline-flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wrap_bulk_unload_options .wpacu_asset_options_wrap{flex-grow:1;margin:5px 10px 14px 0!important;padding:8px 10px 2px!important}.wrap_bulk_unload_options .wpacu_asset_options_wrap .wpacu_slider_text{position:relative!important;vertical-align:top;left:inherit!important;top:inherit!important}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch{position:relative;display:inline-block;min-width:52px;width:52px;height:29px;margin-right:5px!important}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch input{display:none}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch .wpacu_slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.15s;transition:.15s}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch .wpacu_slider:before{position:absolute;content:'';height:22px;width:22px;left:4px;bottom:4px;background-color:#fff;-webkit-transition:.15s;transition:.15s}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch input:checked+.wpacu_slider{background-color:#C00}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch input:focus+.wpacu_slider{box-shadow:0 0 1px #C00}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch input:checked+.wpacu_slider:before{-webkit-transform:translateX(22px);-ms-transform:translateX(22px);transform:translateX(22px)}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch .wpacu_slider.wpacu_round:before{border-radius:50%}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_slider_text{position:absolute;left:62px;top:3px}.editor-post-saved-state.is-wpacu-reloading{animation:edit-post__loading-fade-animation .5s infinite}body.wp-admin .wpacu_asset_row.wpacu-loading{position:relative}body.wp-admin .wpacu_asset_row.wpacu-loading .wpacu-ajax-loader{display:block!important}body.wp-admin .wpacu_asset_row .wpacu-ajax-loader{display:none;width:58px;height:58px;position:absolute;bottom:0;right:0;opacity:.75}.wpacu_asset_row input{width:auto;height:auto;min-height:16px}.wpacu_asset_row .tip{background:inherit;border-left:4px solid #e7e7e7;margin:5px 0;padding:7px;font-style:italic;font-size:small;line-height:1.4}.wpacu_asset_row td{width:100%;text-align:left}.wpacu_asset_row td p:last-child{margin-bottom:0!important}.wpacu_asset_row td .wpacu_asset_options_wrap{padding:8px 10px;margin:15px 0;background:#fff;border:1px solid #eee;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.wpacu_asset_row td .wpacu_asset_options_wrap p:first-child{margin-top:0;margin-bottom:8px!important}.wpacu_asset_row p.wpacu_handle{margin-top:0}.wpacu_asset_row li.wpacu_unload_this_page{display:block!important;position:relative}.wpacu-clearfix:after,.wpacu-clearfix:before{display:table;content:''}.wpacu-contract-expand-area{width:100%;margin:20px 0 0}.wpacu-contract-expand-area .col-left{float:left}.wpacu-contract-expand-area .col-left h4{margin-bottom:0}.wpacu-contract-expand-area .col-right{float:right}.wpacu-clearfix:after{clear:both}.wpacu-wp-button{color:#555;border-color:#ccc;background:#f7f7f7;box-shadow:0 1px 0 #ccc;vertical-align:top}body.wp-admin .wpacu-wp-button{font-size:13px;line-height:26px;height:28px}.wpacu-wp-button.wpacu-wp-button-secondary{display:inline-block;text-decoration:none;height:auto;margin:0 5px 0 0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wpacu-wp-button:hover{background:#fafafa;border-color:#999;color:#23282d}.distinguish-asset-list{list-style:none;margin-left:0;margin-bottom:5px;display:inline-block}.distinguish-asset-list li{float:left;margin-right:20px}.distinguish-asset-list li:last-child{margin-right:0}body[class*=asset-cleanup-pro] a.wpacu-plugin-contracted-wrap-link{padding:16px 6px 16px 41px!important}body[class*=asset-cleanup-pro] .wpacu-area-open .wpacu-plugin-toggle-all{font-size:12px!important;width:calc(100% - 26px)!important}body.wp-admin .wpacu-area-expanded .wpacu-plugin-toggle-all{top:5px}body.wp-admin .wpacu-area-expanded .wpacu-plugin-toggle-all ul li{font-size:12px!important}.wpacu-assets-collapsible-wrap{border:1px solid #cdcdcd}.wpacu-assets-collapsible-wrap.wpacu-by-location{margin-bottom:15px}.wpacu-assets-collapsible-wrap.wpacu-wrap-all{margin-top:20px}.wpacu-assets-collapsible-wrap.wpacu-wrap-area{margin-top:10px}.wpacu-assets-collapsible-wrap.wpacu-by-location>a.wpacu-assets-collapsible{padding:15px 15px 15px 43px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu_list_table{border-width:0;margin:0;border-spacing:inherit;width:100%;box-shadow:3px 3px 2px #ddd;border-bottom-right-radius:5px;border-top-right-radius:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location span.wpacu-child-location-name{font-weight:600}.wpacu-assets-collapsible-wrap.wpacu-by-location span.wpacu-child-location-version{font-weight:200}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area[data-wpacu-plugin=oxygen] .icon-area{border-radius:50%}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area .wpacu-plugin-toggle-all{display:inline-block;padding:0;font-size:13px;width:100%;width:calc(100% + 46px);min-width:250px;position:absolute;left:100%;left:calc(100% + 6px);margin:0;top:4px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area .wpacu-plugin-toggle-all ul{display:inline-block;margin:0;list-style:none;padding-left:13px;padding-top:0}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area .wpacu-plugin-toggle-all ul li{padding:0;margin:0;line-height:normal;font-size:14px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area .wpacu-plugin-toggle-all ul li:first-child{font-style:italic;margin-bottom:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content>table:last-child{margin-bottom:20px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title{display:inline;position:relative;z-index:1}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title:after{content:'';position:absolute;width:100%;left:0;bottom:0;height:1px;background-color:#fdfdfd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-plugin-assets-wrap{padding:0 0 10px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-plugin-assets-wrap.wpacu-area-open .wpacu-plugin-toggle-all{display:inline-block;padding:7px 12px 16px;font-size:14px;width:100%;text-align:left;border-left:1px solid #cdcdcd;border-right:1px solid #cdcdcd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-plugin-assets-wrap.wpacu-area-open.wpacu-plugin-assets-last{margin-bottom:18px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link{color:inherit;text-decoration:none;font-weight:inherit;font-style:inherit;font-size:105%;line-height:initial;height:auto;margin:14px 0 0;padding:13px 6px 14px 39px;position:relative;display:block}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link:after{position:absolute;font-size:18px;font-family:Dashicons;right:12px;top:14px;content:"\f132"}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-link-open:after{content:"\f460"}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-link-closed{border:1px solid #cdcdcd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link:hover{border:1px solid #878787;background:#f9f9f9}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link:hover.wpacu-link-closed{box-shadow:3px 3px 2px #ddd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-link-open{border-top:1px solid #cdcdcd;border-left:1px solid #cdcdcd;border-right:1px solid #cdcdcd;border-bottom:none}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-link-closed.wpacu-last-wrap-link{margin-bottom:20px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .icon-plugin-default{top:10px;left:10px;width:30px;height:30px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .icon-plugin-default .icon-area{width:30px;height:30px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .icon-plugin-default .icon-area:before{font-size:22px;line-height:22px;top:4px;left:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .wpacu-area-title{position:relative;padding:17px 10px 16px 46px;z-index:1}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .wpacu-area-title:after{content:'';position:absolute;width:100%;left:0;bottom:0;height:1px;background-color:#fdfdfd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-area-last{margin-bottom:18px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-area-open{padding:0;max-height:100%}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-area-closed{padding:0;overflow:hidden;max-height:0}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content>table:last-child{margin-bottom:20px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title{margin-top:0;margin-bottom:-1px;padding:14px 10px 16px 12px!important}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title.wpacu-theme-has-icon{padding:18px 10px 16px 58px!important}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-assets-collapsible-content .wpacu-location-child-area{margin-top:22px;margin-bottom:-1px;font-size:110%;line-height:initial}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-assets-collapsible-content .wpacu-location-child-area.wpacu-location-child-area-first{margin-top:2px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-assets-collapsible-content .wpacu-location-child-area.wpacu-area-expanded .wpacu-area-title{display:inline-block;z-index:1;padding:17px 10px 16px 46px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title{display:inline;border-top-right-radius:8px;border-top-left-radius:8px;background-color:#f9f9f9;border-left:1px solid #cdcdcd;border-top:1px solid #cdcdcd;border-bottom:1px solid transparent;border-right:1px solid #cdcdcd;position:relative}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-plugin-default{position:absolute;padding:0;top:10px;left:10px;width:37px;height:37px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-plugin-default:not(.has-icon){color:#b4b9be;background-color:#eee;box-shadow:inset 0 0 10px rgba(160,165,170,.15);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-plugin-default:not(.has-icon) .icon-area:before{content:"\f106";font-family:Dashicons;position:absolute;font-size:28px;line-height:28px;top:5px;left:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-plugin-default .icon-area{position:relative;width:37px;height:37px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-theme{position:absolute;padding:0;top:10px;left:10px;width:37px;height:37px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-theme .icon-area{position:relative;width:37px;height:37px}.wpacu-assets-collapsible-wrap.wpacu-wp_core{border:1px solid #c00}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content{padding:0}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content .wpacu_list_table,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content .wpacu_list_table{width:100%;margin:0}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row td,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row td{border-left:hidden;border-right:hidden;border-bottom:1px solid #cdcdcd}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row:last-child,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row:last-child{margin-bottom:0!important}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row:last-child td:last-child,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row:last-child td:last-child{border-bottom:hidden}a.wpacu-assets-collapsible{color:#000;font-size:20px;text-decoration:none;display:block;position:relative;background-color:#f1f3f8;cursor:pointer;padding:15px 15px 15px 36px;width:auto;border:none;text-align:left;outline:0}a.wpacu-assets-collapsible>span.dashicons{font-size:25px;line-height:normal;position:absolute;top:15px;top:calc(50% - 21px);left:22px;-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}a.wpacu-assets-collapsible:hover{background-color:#f1f3f8;text-decoration:none}a.wpacu-assets-collapsible:after{position:absolute;font-size:22px;font-family:Dashicons;right:14px;top:16px}a.wpacu-assets-collapsible:not(.wpacu-assets-collapsible-active):after{content:"\f132"}a.wpacu-assets-collapsible.wpacu-assets-collapsible-active{background-color:#f1f3f8}a.wpacu-assets-collapsible.wpacu-assets-collapsible-active:after{content:"\f460"}.wpacu-assets-collapsible-content{padding:0 16px;max-height:0;overflow:hidden;background-color:#fbfbfb8c}.wpacu-assets-collapsible-content .wpacu-assets-note{margin:0;padding:15px 15px 10px}.wpacu-assets-collapsible-content>div:not(.wpacu-assets-table-list-wrap){padding:16px 0 0}.wpacu-assets-collapsible-content>div>p:first-child{margin-top:0}.wpacu-assets-collapsible-content.wpacu-open{max-height:100%}a.wpacu-assets-inline-code-collapsible{color:inherit;font-size:14px;text-decoration:none;display:inline-block;position:relative;cursor:pointer;width:auto;outline:0;background:#f1f3f8;border:1px solid #cdcdcd;padding:4px 21px 4px 8px;margin:0 0 0 6px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}a.wpacu-assets-inline-code-collapsible:hover{border:1px solid #5c5c5c}a.wpacu-assets-inline-code-collapsible:after{position:absolute;font-size:15px;font-family:Dashicons;right:-3px;top:-1px;width:14px;height:14px;-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}a.wpacu-assets-inline-code-collapsible:not(.wpacu-assets-inline-code-collapsible-active):after{content:"\f132"}a.wpacu-assets-inline-code-collapsible.wpacu-assets-inline-code-collapsible-active:after{content:"\f460"}.wpacu-assets-inline-code-collapsible-content{font-size:80%;padding:0 8px;max-height:0;overflow:hidden;background-color:#fbfbfb8c}.wpacu-assets-inline-code-collapsible-content>div{padding:7px 8px 0}.wpacu-assets-inline-code-collapsible-content>div>p{line-height:normal!important}.wpacu-assets-inline-code-collapsible-content>div>p:first-child{margin-top:0}.wpacu-assets-inline-code-collapsible-content.wpacu-open{max-height:100%}.wpacu_asset_row p div.select{display:inline-block}.wpacu-wrap-choose-position{display:inline}.wpacu-wrap-choose-position>div{display:inline-block}.wpacu-wrap-choose-position select{width:auto;font-size:inherit;display:inline;margin-left:6px;margin-right:4px}.wpacu-wrap-choose-position>.select>.select{display:inline}.wpacu-wrap-choose-position>.select>.select select{padding-right:30px}.wpacu-wrap-choose-position>.select>.select:after{right:15px;top:-4px}.wpacu_table_wrap{margin:20px 0 0}.wpacu_table_wrap>table{border:1px solid #cdcdcd}.wpacu_table_wrap .table{width:100%;max-width:100%;margin-bottom:1rem;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.wpacu_table_wrap .table td,.wpacu_table_wrap .table th{padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.wpacu_table_wrap .table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.wpacu_table_wrap .table tbody+tbody{border-top:2px solid #eceeef}.wpacu_table_wrap .table .table{background-color:#fff}.wpacu_table_wrap .table-sm td,.wpacu_table_wrap .table-sm th{padding:.3rem}.wpacu_table_wrap .table-bordered,.wpacu_table_wrap .table-bordered td,.wpacu_table_wrap .table-bordered th{border:1px solid #eceeef}.wpacu_table_wrap .table-bordered thead td,.wpacu_table_wrap .table-bordered thead th{border-bottom-width:2px}.wpacu_table_wrap .table-striped tbody tr:nth-of-type(even){background-color:#f9f9f9}.wpacu_table_wrap .table-striped tbody tr:nth-of-type(odd){background-color:#fff}.wpacu_table_wrap .table-active,.wpacu_table_wrap .table-active>td,.wpacu_table_wrap .table-active>th,.wpacu_table_wrap .table-hover .table-active:hover,.wpacu_table_wrap .table-hover .table-active:hover>td,.wpacu_table_wrap .table-hover .table-active:hover>th,.wpacu_table_wrap .table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.wpacu_table_wrap .table-success,.wpacu_table_wrap .table-success>td,.wpacu_table_wrap .table-success>th{background-color:#dff0d8}.wpacu_table_wrap .table-hover .table-success:hover,.wpacu_table_wrap .table-hover .table-success:hover>td,.wpacu_table_wrap .table-hover .table-success:hover>th{background-color:#d0e9c6}.wpacu_table_wrap .table-info,.wpacu_table_wrap .table-info>td,.wpacu_table_wrap .table-info>th{background-color:#d9edf7}.wpacu_table_wrap .table-hover .table-info:hover,.wpacu_table_wrap .table-hover .table-info:hover>td,.wpacu_table_wrap .table-hover .table-info:hover>th{background-color:#c4e3f3}.wpacu_table_wrap .table-warning,.wpacu_table_wrap .table-warning>td,.wpacu_table_wrap .table-warning>th{background-color:#fcf8e3}.wpacu_table_wrap .table-hover .table-warning:hover,.wpacu_table_wrap .table-hover .table-warning:hover>td,.wpacu_table_wrap .table-hover .table-warning:hover>th{background-color:#faf2cc}.wpacu_table_wrap .table-danger,.wpacu_table_wrap .table-danger>td,.wpacu_table_wrap .table-danger>th{background-color:#f2dede}.wpacu_table_wrap .table-hover .table-danger:hover,.wpacu_table_wrap .table-hover .table-danger:hover>td,.wpacu_table_wrap .table-hover .table-danger:hover>th{background-color:#ebcccc}.wpacu_table_wrap .thead-inverse th{color:#fff;background-color:#292b2c}.wpacu_table_wrap .thead-default th{color:#464a4c;background-color:#eceeef}.wpacu_table_wrap .table-inverse{color:#fff;background-color:#292b2c}.wpacu_table_wrap .table-inverse td,.wpacu_table_wrap .table-inverse th,.wpacu_table_wrap .table-inverse thead th{border-color:#fff}.wpacu_table_wrap .table-inverse.table-bordered,.wpacu_table_wrap .table-responsive.table-bordered{border:0}.wpacu_table_wrap .table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.wp-list-table .wpacu_remove_global_attr_row.wpacu_selected,.wp-list-table .wpacu_restore_position_row.wpacu_selected{background:#e7e7e7}ul.hire-reasons{margin-bottom:20px}ul.hire-reasons li{font-size:14px;line-height:22px;margin-bottom:12px}ul.hire-reasons li .dashicons{font-size:23px;line-height:23px}ul.hire-reasons li .dashicons.dashicons-yes{color:green}ol.getting-started li{font-size:14px;line-height:22px;margin-bottom:8px}.wpacu-get-help-wrap p{font-size:14px}.wpacu-get-help-wrap .help-content-wrap{margin:20px 0 25px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-moz-flex;display:-webkit-flex;display:flex;width:100%}@media only screen and (min-width:768px){.wpacu-get-help-wrap .help-content-wrap{-webkit-box-align:start;-ms-flex-align:start;-ms-grid-row-align:flex-start;align-items:flex-start}}@media only screen and (max-width:767px){.wpacu-get-help-wrap .help-content-wrap{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.wpacu-get-help-wrap .help-content-wrap .help-content{padding:15px;background:#fff;border:1px solid #E0E0E0;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;box-shadow:2px 3px 8px 0 #231f2038;flex:1 1 50%;margin-bottom:10px}.wpacu-get-help-wrap .help-content-wrap .help-content .content-title{margin:5px 0 15px}.wpacu-get-help-wrap .help-content-wrap .help-content .cols-wrap{width:100%;margin:0 auto;display:table}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area{margin:5px 0 0;position:relative}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area.col-left{float:left;width:48%}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area.col-right{float:right;width:48%}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area.activate-plugin img{max-width:280px}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area img{width:99%;margin:8px 0;border:1px solid #cdcdcd;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.wpacu-get-help-wrap .help-content-wrap .help-content.upgrade-help{order:2}@media only screen and (min-width:768px){.wpacu-get-help-wrap .help-content-wrap .help-content{margin-right:24px}.wpacu-get-help-wrap .help-content-wrap .help-content.upgrade-help{margin-right:0}}.wpacu-get-help-wrap .help-content-wrap .help-content.tech-help{order:1}@media only screen and (max-width:767px){.wpacu-get-help-wrap .help-content-wrap .help-content.tech-help{margin-bottom:30px}}.wpacu-get-help-wrap .help-content-wrap .help-content ul{list-style:none;padding-left:0}.wpacu-get-help-wrap .help-content-wrap .help-content ul li{font-size:14px;line-height:22px;margin-bottom:15px}.wpacu-get-help-wrap .help-content-wrap .help-content p:last-child,.wpacu-get-help-wrap .help-content-wrap .help-content ul li:last-child{margin-bottom:0}#wpacu-license-data-remove-area{display:none;margin:10px 0 25px}#wpacu-license-data-remove-area.wpacu-visible{display:block}span#wpacu-license-data-removed-msg{display:block;padding-left:26px}#wpacu-warning-read{display:none;margin:10px 0}#wpacu-warning-read span.dashicons-warning{color:#c00}#wpacu-warning-read.wpacu-visible{display:block}#wpacu-reset-submit-area{margin:10px 0;clear:both}#wpacu-reset-submit-btn{margin:10px 0 0}.wpacu-tools-area{margin:10px 20px 0 2px}.wpacu-tools-area .wpacu-tools-container{background:#fff;padding:15px;border:1px solid #cdcdcd;width:96%}.wpacu-tools-area .wpacu-tools-container form>div:first-child{margin:0 0 10px}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning{display:none;box-sizing:border-box;margin-top:10px}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning p{margin:0 0 10px;line-height:22px}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning p:only-child{margin:0}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning ul{font-size:13px;list-style-type:disc;padding-left:30px}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning.wpacu-visible{display:block}.wpacu-tools-area .wpacu-export-import-area{padding:10px}.wpacu-tools-area .wpacu-export-import-area form>p:first-of-type{margin-top:0}.wpacu-tools-area .wpacu-export-import-area form>p:last-of-type{margin-bottom:0}.wpacu-tools-area .wpacu-export-import-area:hover{background:rgba(40,44,42,.05);box-shadow:inset 0 0 10px rgba(160,165,170,.15)}.wpacu-tools-area .wpacu-export-import-area+hr{display:block;height:1px;border:0;border-top:1px solid #cdcdcd;margin:10px 0;padding:0}#wpacu-import-form button.wpacu-importing img.wpacu-spinner{display:inline-block}#wpacu-import-form button img.wpacu-spinner{display:none;margin:0 0 0 5px;height:16px;width:16px;vertical-align:middle}.wpacu-about-wrap .wpacu-about-text img{width:auto;height:150px;position:absolute;top:20px;right:-20px}@media only screen and (max-width:767px){.wpacu-about-wrap h1{margin:20px}.wpacu-about-wrap .wpacu-about-text img{display:none}.wpacu-about-wrap .wpacu-about-text{margin:20px}}.wpacu-about-wrap .about-wrap-content .area-title{font-size:19px;line-height:19px;margin-bottom:0}.wpacu-about-wrap hr{margin:10px 0}.wpacu-lite-vs-pro-wrap ul{display:flex;top:0;z-index:10;padding-bottom:14px}.wpacu-lite-vs-pro-wrap li{list-style:none;flex:1}.wpacu-lite-vs-pro-wrap li:last-child{border-right:1px solid #DDD}.wpacu-lite-vs-pro-wrap button{width:100%;border:1px solid #DDD;border-right:0;border-top:0;padding:10px;background:#FFF;font-size:14px;font-weight:700;height:60px;color:#999}.wpacu-lite-vs-pro-wrap li.active button{background:#F5F5F5;color:#000}.wpacu-lite-vs-pro-wrap table{border-collapse:collapse;table-layout:fixed;width:100%}.wpacu-lite-vs-pro-wrap th{background:inherit}.wpacu-lite-vs-pro-wrap tr.first{background:inherit;font-size:18px}.wpacu-lite-vs-pro-wrap tr.first .bg-lite{border-top:4px solid #6d6e70;background:#fff;color:#6d6e70}.wpacu-lite-vs-pro-wrap tr.first .bg-pro{border-top:4px solid green;background:#fff;color:green}.wpacu-lite-vs-pro-wrap tr:not(.first){background:#fff}.wpacu-lite-vs-pro-wrap tr:not(:last-child):hover{background:#f8f8f8}.wpacu-lite-vs-pro-wrap td,.wpacu-lite-vs-pro-wrap th{height:53px;border:1px solid #DDD;padding:10px 16px;empty-cells:show;text-align:left}@media only screen and (max-width:767px){.wpacu-lite-vs-pro-wrap td,.wpacu-lite-vs-pro-wrap th{font-size:14px}}.wpacu-lite-vs-pro-wrap td+td,.wpacu-lite-vs-pro-wrap th+th{text-align:center;display:none}.wpacu-lite-vs-pro-wrap td.default{display:table-cell}.wpacu-lite-vs-pro-wrap .txt-l{font-size:28px;font-weight:700}.wpacu-lite-vs-pro-wrap .txt-top{position:relative;top:-9px;left:-2px}.wpacu-lite-vs-pro-wrap svg{width:18px;height:18px}.wpacu-lite-vs-pro-wrap svg path{fill:green}.wpacu-lite-vs-pro-wrap .tick{color:#2CA01C}.wpacu-lite-vs-pro-wrap .tick img{fill:#2CA01C}@media only screen and (max-width:767px){.wpacu-lite-vs-pro-wrap .txt-l{font-size:20px}.wpacu-lite-vs-pro-wrap .tick{font-size:15px}}.wpacu-lite-vs-pro-wrap .na{font-size:18px;opacity:.3;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"}.wpacu-lite-vs-pro-wrap .hide{border:0;background:0 0}.wpacu-lite-vs-pro-wrap td,.wpacu-lite-vs-pro-wrap th{display:table-cell!important;width:auto}.wpacu-lite-vs-pro-wrap td+td,.wpacu-lite-vs-pro-wrap th+th{width:130px}@media only screen and (max-width:767px){.wpacu-lite-vs-pro-wrap .na{font-size:15px}.wpacu-lite-vs-pro-wrap td+td,.wpacu-lite-vs-pro-wrap th+th{width:42px}}@media only screen and (min-width:768px){.wpacu-lite-vs-pro-wrap td .button{font-size:16px!important}}@media only screen and (max-width:767px){.wpacu-lite-vs-pro-wrap td .button{font-size:14px!important;padding:0 20px!important}.wpacu-lite-vs-pro-wrap td .button.button-primary{margin-top:6px;margin-bottom:14px}}@media only screen and (min-width:768px){.wpacu-lite-vs-pro-wrap{margin-bottom:40px;clear:both}}.wpacu-video-areas>div{padding:20px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.wpacu-video-areas>div:nth-child(odd){background:#fff}.wpacu-video-areas>div:nth-child(even){background:inherit}@media only screen and (min-width:1200px){.wpacu-video-areas .wpacu-video-area-wrapper{margin:0 0 15px;display:flex}.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-col-right{padding:0 20px 0 25px}}@media only screen and (min-width:992px) and (max-width:1199px){.wpacu-video-areas .wpacu-video-area-wrapper{margin:0 0 40px}}.wpacu-video-areas .wpacu-video-area-wrapper ol{font-size:14px}.wpacu-video-areas .wpacu-video-area-wrapper ul{font-size:14px;list-style:disc;margin-left:22px}@media only screen and (min-width:1200px){.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-col-right p:first-child{margin-top:0}.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-col-right p:last-child{margin-bottom:0}}@media only screen and (max-width:1199px){.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-video-wrapper{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-video-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}}#wpassetcleanup_asset_list.postbox h2{padding-left:52px!important;position:relative}#wpassetcleanup_asset_list.postbox h2:before{content:'';position:absolute;background-image:url(images/wpacu-logo-transparent-bg-v1.png);background-size:cover;top:6px;left:13px;width:33px;height:26px;opacity:.8;-webkit-filter:grayscale(100%);filter:grayscale(100%)}body.wp-admin .wpacu-modal{display:none;position:fixed;z-index:1000000;padding-top:15%;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,.4)}body.wp-admin .wpacu-modal-content{background-color:#fefefe;margin:auto;padding:20px;border:1px solid #888;width:80%;max-width:600px;border-radius:10px}body.wp-admin .wpacu-close{color:#aaa;float:right;font-size:28px;font-weight:700}body.wp-admin .wpacu-close:focus,body.wp-admin .wpacu-close:hover{color:#000;text-decoration:none;cursor:pointer}.wpacu-bulk-changes-tabs{display:table;position:relative;overflow:hidden;margin:0;width:100%}.wpacu-bulk-changes-tabs li{border-top:1px solid rgba(40,44,42,.1);border-left:1px solid rgba(40,44,42,.1);border-bottom:1px solid rgba(40,44,42,.1);float:left;line-height:38px;padding:0;position:relative;margin-bottom:12px}.wpacu-bulk-changes-tabs li:last-child{border-right:1px solid rgba(40,44,42,.1)}.wpacu-bulk-changes-tabs a{position:relative;background:rgba(40,44,42,.05);color:#004567;font-size:14px;font-weight:500;display:block;letter-spacing:0;outline:0;padding:6px 20px;text-decoration:none;border-top:3px solid transparent}.wpacu-bulk-changes-tabs a:hover{background:#f1f1f1;border-top:3px solid transparent}.wpacu-bulk-changes-tabs .current a{background:#fff;border-top:3px solid #004567}.wpacu-bulk-changes-tabs .current a:hover{background:#fff}.wpacu-bulk-changes-tabs .current a:after,.wpacu-bulk-changes-tabs .current a:before{top:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.wpacu-bulk-changes-tabs .current a:after{border-color:rgba(136,183,213,0);border-top-color:#fff;border-width:12px;margin-left:-12px}.wpacu-bulk-changes-tabs .current a:before{border-color:rgba(194,225,245,0);border-top-color:rgba(40,44,42,.1);border-width:13px;margin-left:-13px}
|
1 |
+
#wpacu-logo-wrap .wpacu-pro-sign.wpacu-lite,#wpacu-quick-actions{color:#74777b;background:rgba(40,44,42,.05)}#wpacu-pages-info-area{width:98%}#wpacu-top-area{margin:15px 0;padding:0 10px}#wpacu-quick-actions{float:right;width:auto;margin-right:30px;border-radius:10px;padding:6px 12px}#wpacu-quick-actions .wpacu-actions-title{font-weight:200;letter-spacing:.5px}#wpacu-quick-actions a{color:#004567;text-decoration:none}#wpacu-quick-actions a:hover{color:#0073aa}#wpacu-logo-wrap{width:auto;display:inline-block;position:relative}#wpacu-logo-wrap a{display:block}#wpacu-logo-wrap img{width:352px;height:79px}#wpacu-logo-wrap .wpacu-pro-sign{position:absolute;height:auto;font-family:FiraSans-Medium,proxima-nova-1,Montserrat,Helvetica,sans-serif;font-size:13px;font-weight:600;letter-spacing:1px;padding:5px 11px;border-radius:15px;right:-60px;top:30px;width:auto;display:inline-block;text-align:center}#wpacu-logo-wrap .wpacu-pro-sign.wpacu-pro{color:#004567;background-color:rgba(40,44,42,.05)}.wpacu-tabs{position:relative;overflow:hidden;margin:0 auto 20px;width:100%;font-weight:300;font-size:20px}.wpacu-tabs nav{text-align:center}.wpacu-tabs nav ul{position:relative;display:-ms-flexbox;display:-webkit-flex;display:-moz-flex;display:-ms-flex;display:flex;margin:0 auto;padding:0;max-width:1200px;list-style:none;-ms-box-orient:horizontal;-ms-box-pack:center;-webkit-flex-flow:row wrap;-moz-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-justify-content:center;-moz-justify-content:center;-ms-justify-content:center;justify-content:center}.wpacu-tabs nav ul li{position:relative;z-index:1;display:block;margin:0;text-align:center;-webkit-flex:1;-moz-flex:1;-ms-flex:1;flex:1}.wpacu-tabs nav ul li span.extra-info{position:absolute;font-size:12px;left:0;right:50%;bottom:12px;-webkit-transform:translate(50%,50%);transform:translate(50%,50%)}.wpacu-tabs nav ul li span.extra-info .dashicons{font-size:16px;margin-right:-3px;margin-top:1px}.wpacu-tabs nav ul li span.extra-info.license-status.inactive{color:#c00}.wpacu-tabs nav ul li span.extra-info.license-status.active{color:green}.wpacu-tabs nav ul li span.extra-info.assets-unloaded-false{color:#004567}.wpacu-tabs nav ul li span.extra-info.assets-unloaded-true,.wpacu-tabs nav ul li span.extra-info.bulk-unloads-true{color:green}.wpacu-tabs nav a{position:relative;display:block;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;line-height:2.5}.wpacu-tabs nav a span{vertical-align:middle;font-size:14px}.wpacu-tabs nav li.wpacu-tab-current a{color:#74777b}.wpacu-tabs nav a:focus{outline:0}.wpacu-tabs .dashicons{font-size:20px}.no-js .wpacu-content-wrap section{display:block;padding-bottom:2em;border-bottom:1px solid rgba(255,255,255,.6)}.no-flexbox nav ul{display:block}.no-flexbox nav ul li{min-width:15%;display:inline-block}@media screen and (max-width:58em){.wpacu-tabs nav a.icon span{display:none}.wpacu-tabs nav a:before{margin-right:0}}.wpacu-tabs-style-underline nav{background:#fff}.wpacu-tabs-style-underline nav a{color:#74777b;font-size:18px;text-transform:uppercase;text-decoration:none;padding:.25em 0 .5em;border-left:1px solid #e7ecea;-webkit-transition:color .2s;transition:color .2s}.wpacu-tabs-style-underline nav li:last-child a{border-right:1px solid #e7ecea}.wpacu-tabs-style-underline nav li a::after{position:absolute;bottom:0;left:0;width:100%;height:6px;background:#2CC185;content:'';-webkit-transition:-webkit-transform .3s;transition:transform .3s;-webkit-transform:translate3d(0,150%,0);transform:translate3d(0,150%,0)}.wpacu-tabs-style-underline nav li.wpacu-tab-current a::after{-webkit-transform:translate3d(0,0,0);transform:translate3d(0,0,0)}.wpacu-tabs-style-underline nav a span{font-weight:700}.wpacu-tabs-style-topline{max-width:1200px;margin:20px auto 30px 0;width:100%;font-weight:300;text-decoration:none}.wpacu-tabs-style-topline nav li{border:1px solid rgba(40,44,42,.1)}.wpacu-tabs-style-topline nav li:not(:last-child){border-right:none}.wpacu-tabs-style-topline nav li.wpacu-tab-current{border-top-color:#008f9c;border-bottom:none}.wpacu-tabs-style-topline nav a{padding:20px 18px;background:rgba(40,44,42,.05);color:#74777b;line-height:1;-webkit-transition:color .2s;transition:color .2s;text-decoration:none}.wpacu-tabs-style-topline nav a:focus,.wpacu-tabs-style-topline nav a:hover{background:0 0;color:#008f9c}.wpacu-tabs-style-topline nav li.wpacu-tab-current a{background:0 0;box-shadow:inset 0 3px 0 #008f9c;color:#008f9c}.wpacu-tabs-style-topline nav li.wpacu-tab-current a span:not(.dashicons){font-weight:600}.wpacu-tabs-style-topline nav a span{text-transform:uppercase;font-weight:400}.wpacu-tab-nav-wrapper{border-bottom:none!important}.wpacu-tab-nav-wrapper .nav-tab.nav-tab-active{background:#fff;position:relative}.wpacu-tab-nav-wrapper .nav-tab.nav-tab-active:after{content:'';width:100%;bottom:-2px;left:0;position:absolute;border-bottom:2px solid #fff}.wpacu-script-attributes-area{margin:20px 0 0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings{padding:5px 7px!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings.wpacu-first{margin:0 28px 0 0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings label{margin:0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings li{margin:0 16px 0 0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings li:first-child{margin:0 10px 0 0!important}.wpacu-script-attributes-area.wpacu-lite ul.wpacu-script-attributes-settings li:last-child{margin:0 2px 0 0!important}.wpacu-script-attributes-area .wpacu-script-attributes-settings{background:#fff!important;border:1px solid #eee!important;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;padding:5px 10px!important;list-style:none;display:inline-block;margin:0}.wpacu-script-attributes-area .wpacu-script-attributes-settings input[type=radio]{width:auto;padding:0;margin:0 5px 0 0}.wpacu-script-attributes-area .wpacu-script-attributes-settings.wpacu-first{margin:0 34px 0 0!important}.wpacu-script-attributes-area .wpacu-script-attributes-settings li{float:left;margin:0 17px 0 0}.wpacu-script-attributes-area .wpacu-script-attributes-settings li:first-child{margin:0 10px 0 0!important}.wpacu-script-attributes-area .wpacu-script-attributes-settings li:last-child{margin:0}.wpacu-script-attributes-area .wpacu-script-attributes-settings:hover{background:#f2faf2}tr.wpacu_location_changed>td{border-left:#004567 4px solid}tr.wpacu_not_load td,tr.wpacu_not_load th{background:#FFE1E1!important}tr.wpacu_not_load td .wpacu-assets-inline-code-wrap,tr.wpacu_not_load td .wpacu-script-attributes-area,tr.wpacu_not_load th .wpacu-assets-inline-code-wrap,tr.wpacu_not_load th .wpacu-script-attributes-area{filter:alpha(opacity=45);opacity:.45}.dashicons-wpacu{width:17px;height:17px;margin:2px 0 0;font-size:16px;text-decoration:none;color:inherit!important}#wpacu_meta_box_content,.wpacu_widefat{width:99%}.wpacu_widefat .check-column.wpacu_check{padding:10px}body[class*=wpassetcleanup] #footer-left{border-left:2px solid green;padding-left:10px}#wpassetcleanup_asset_list small{width:auto;float:none;display:inline}#wpacu_meta_box_content .emoji{font-size:18px}#wpacu_meta_box_content h3{margin-left:0;padding-left:0}#wpacu_meta_box_content div.wpacu_note{padding:10px;background-color:#f5f5f5}#wpacu_meta_box_content .dashicons.dashicons-warning{color:#c00}#wpacu_meta_box_content .wpacu_verified{padding:10px;background-color:#f5f5f5;border-left:1px solid #ddd}#wpacu_meta_box_content .wpacu_verified span{color:#0073aa;font-weight:700}#wpacu_meta_box_content div.wpacu_warning{border:1px solid #c00}#wpacu_meta_box_content ul.wpacu_asset_options{margin:0;padding:0}#wpacu_meta_box_content ul.wpacu_asset_options li{list-style:none;display:inline-block}#wpacu_meta_box_content ul.wpacu_asset_options label{font-weight:400;margin-right:5px;margin-top:5px;margin-bottom:5px}.wpacu-updated-frontend{font-weight:400;background-color:#fff;border-left:4px solid #46b450;border-top:1px solid #46b450;border-right:1px solid #46b450;border-bottom:1px solid #46b450;padding:9px 14px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.wpacu-updated-frontend span.dashicons-yes{color:#46b450;font-size:26px}#wpacu-update-front-settings-area{margin:10px 0;display:inline-block;position:relative}#wpacu-updating-front-settings{display:none;position:absolute;top:5px;right:-35px}#wpacu_wrap_assets{color:#000!important;text-align:left!important;clear:both!important;width:90%!important;padding:20px!important;margin:30px 0 0 15px!important;border:1px solid #cdcdcd;z-index:10000!important;position:relative!important;background-color:#fff!important}#wpacu_wrap_assets div.wpacu_warning{border:1px solid #c00;padding:5px 10px}#wpacu_wrap_assets small{display:inline!important;margin:0!important;letter-spacing:normal!important}#wpacu_wrap_assets input[type=checkbox]{width:auto!important;margin-right:4px!important}#wpacu_wrap_assets img:not(.wpacu-ajax-loader){display:inline-block!important}#wpacu_wrap_assets p{line-height:22px!important;margin:10px 0!important;text-align:left!important;font-weight:400!important}#wpacu_wrap_assets p:first-child,.wpacu_verified{margin:0 0 10px!important}#wpacu_wrap_assets h1{margin:0 0 20px!important;font-size:160%!important;text-align:left!important}#wpacu_wrap_assets h3{margin:20px 0;font-size:130%}.wpacu_asset_row:first-child td{border-top:1px solid #cdcdcd}.wpacu_asset_row td{border-left:1px solid #cdcdcd;border-right:1px solid #cdcdcd;border-bottom:1px solid #cdcdcd}.wpacu_asset_row.wpacu_notice_row td{position:relative;padding:5px;border-bottom:1px solid transparent}.wpacu_asset_row.wpacu_notice_row td div.wpacu-warning{width:auto;margin:5px;font-style:italic}.wpacu_asset_row:not(.wpacu_notice_row) td{padding:18px!important;position:relative}.wpacu_asset_row:not(.wpacu_notice_row) td.selected,.wpacu_asset_row:not(.wpacu_notice_row) td:hover{-moz-box-shadow:inset 0 0 12px #cdcdcd;-webkit-box-shadow:inset 0 0 12px #cdcdcd;box-shadow:inset 0 0 12px #cdcdcd}.wpacu_asset_row:not(.wpacu_notice_row) td p{padding:0!important;margin-bottom:10px!important;word-wrap:break-word!important;-ms-word-break:break-all;word-break:break-word}.wpacu_asset_row:not(.wpacu_notice_row) td label{width:auto!important;margin:0!important;cursor:pointer!important;display:inline-block!important;font-size:100%!important;font-weight:400!important}.wpacu_asset_row:not(.wpacu_notice_row) td label span:not(.dashicons){font-size:100%!important}.wpacu_asset_row:not(.wpacu_notice_row) td.wpacu_check{width:50px!important}.asset-table-extra-info td{padding:5px!important}body.wp-admin .wpacu_asset_row td.wpacu_check{width:25px!important}.wpacu_asset_row .dashicons-warning{color:red!important}label.wpacu_add_global{cursor:pointer!important}label.wpacu_input_load_checked{font-weight:700;color:#d54e21}label.wpacu_global_unload_exception{font-weight:700!important}tr.wpacu_global_rule_row.selected{background:#e7e7e7}.nav-tab-wrapper{border-bottom:1px solid #ccc;width:95%}.nav-tab-wrapper.nav-assets-manager .nav-tab{font-size:13px;font-weight:500;padding:6px 10px}.nav-tab-wrapper.nav-assets-manager .nav-tab.for-pro{padding:6px 8px 6px 3px}ul.wpacu_asset_options{margin:0 10px 0 0;padding:0}ul.wpacu_asset_options li{margin:0 10px 0 0;list-style:none;display:inline-block;line-height:normal}ul.wpacu_asset_options li.remove_rule label{font-weight:700}ul.wpacu_asset_options label{margin-right:20px;font-weight:400}ul.wpacu_asset_options label input{margin-right:4px}.wpacu_list_table,.wpacu_list_table div,.wpacu_list_table li,.wpacu_list_table p{font-weight:400}.wpacu_striped>tbody>:nth-child(even),ul.wpacu_striped>:nth-child(even){background-color:#fff!important}.wpacu_striped>tbody>:nth-child(odd),ul.wpacu_striped>:nth-child(odd){background-color:#f9f9f9!important}.wpacu_update_btn{-moz-box-shadow:inset 0 1px 0 0 #54a3f7!important;-webkit-box-shadow:inset 0 1px 0 0 #54a3f7!important;box-shadow:inset 0 1px 0 0 #54a3f7!important;background:-webkit-gradient(linear,left top,left bottom,color-stop(.05,#007dc1),color-stop(1,#0061a7))!important;background:-moz-linear-gradient(top,#007dc1 5%,#0061a7 100%)!important;background:-webkit-linear-gradient(top,#007dc1 5%,#0061a7 100%)!important;background:-o-linear-gradient(top,#007dc1 5%,#0061a7 100%)!important;background:-ms-linear-gradient(top,#007dc1 5%,#0061a7 100%)!important;background:linear-gradient(to bottom,#007dc1 5%,#0061a7 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#007dc1', endColorstr='#0061a7', GradientType=0)!important;background-color:#007dc1!important;-moz-border-radius:3px!important;-webkit-border-radius:3px!important;border-radius:3px!important;border:1px solid #124d77!important;display:inline-block!important;cursor:pointer!important;color:#fff!important;font-size:15px!important;padding:10px 24px!important;text-decoration:none!important;text-shadow:0 1px 0 #154682!important;height:auto!important;line-height:normal!important}.wpacu-btns .btn:focus,.wpacu-btns .btn:hover,.wpacu-btns a{text-decoration:none}.wpacu_update_btn.wpacu_submitting,.wpacu_update_btn:hover{background:-webkit-gradient(linear,left top,left bottom,color-stop(.05,#0061a7),color-stop(1,#007dc1))!important;background:-moz-linear-gradient(top,#0061a7 5%,#007dc1 100%)!important;background:-webkit-linear-gradient(top,#0061a7 5%,#007dc1 100%)!important;background:-o-linear-gradient(top,#0061a7 5%,#007dc1 100%)!important;background:-ms-linear-gradient(top,#0061a7 5%,#007dc1 100%)!important;background:linear-gradient(to bottom,#0061a7 5%,#007dc1 100%)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0061a7', endColorstr='#007dc1', GradientType=0)!important;background-color:#0061a7!important}.wpacu_update_btn.wpacu_submitting{cursor:default!important}.wpacu_update_btn:active{position:relative!important;top:1px!important}.wpacu-btns .btn{display:inline-block;font-weight:400;line-height:1.25;text-align:center;white-space:nowrap;vertical-align:middle;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;border:1px solid transparent;padding:.5rem 1rem;font-size:1rem;-webkit-border-radius:.25rem;-moz-border-radius:.25rem;border-radius:.25rem;-webkit-transition:all .2s ease-in-out;-o-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wpacu-btns .btn.focus,.wpacu-btns .btn:focus{outline:0;-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.25);box-shadow:0 0 0 2px rgba(2,117,216,.25)}.wpacu-btns .btn.disabled,.wpacu-btns .btn:disabled{cursor:not-allowed;opacity:.65}.wpacu-btns .btn.active,.wpacu-btns .btn:active{background-image:none}.wpacu-btns a.btn.disabled,.wpacu-btns fieldset[disabled] a.btn{pointer-events:none}.wpacu-btns .btn-primary{color:#fff;background-color:#0275d8;border-color:#0275d8}.wpacu-btns .btn-primary:hover{color:#fff;background-color:#025aa5;border-color:#01549b}.wpacu-btns .btn-primary.focus,.wpacu-btns .btn-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.wpacu-btns .btn-primary.disabled,.wpacu-btns .btn-primary:disabled{background-color:#0275d8;border-color:#0275d8}.wpacu-btns .btn-primary.active,.wpacu-btns .btn-primary:active,.wpacu-btns .show>.btn-primary.dropdown-toggle{color:#fff;background-color:#025aa5;background-image:none;border-color:#01549b}.wpacu-btns .btn-secondary{color:#292b2c;background-color:#fff;border-color:#ccc}.wpacu-btns .btn-secondary:hover{color:#292b2c;background-color:#e6e6e6;border-color:#adadad}.wpacu-btns .btn-secondary.focus,.wpacu-btns .btn-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.wpacu-btns .btn-secondary.disabled,.wpacu-btns .btn-secondary:disabled{background-color:#fff;border-color:#ccc}.wpacu-btns .btn-secondary.active,.wpacu-btns .btn-secondary:active,.wpacu-btns .show>.btn-secondary.dropdown-toggle{color:#292b2c;background-color:#e6e6e6;background-image:none;border-color:#adadad}.wpacu-btns .btn-info{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.wpacu-btns .btn-info:hover{color:#fff;background-color:#31b0d5;border-color:#2aabd2}.wpacu-btns .btn-info.focus,.wpacu-btns .btn-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.wpacu-btns .btn-info.disabled,.wpacu-btns .btn-info:disabled{background-color:#5bc0de;border-color:#5bc0de}.wpacu-btns .btn-info.active,.wpacu-btns .btn-info:active,.wpacu-btns .show>.btn-info.dropdown-toggle{color:#fff;background-color:#31b0d5;background-image:none;border-color:#2aabd2}.wpacu-btns .btn-success{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.wpacu-btns .btn-success:hover{color:#fff;background-color:#449d44;border-color:#419641}.wpacu-btns .btn-success.focus,.wpacu-btns .btn-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.wpacu-btns .btn-success.disabled,.wpacu-btns .btn-success:disabled{background-color:#5cb85c;border-color:#5cb85c}.wpacu-btns .btn-success.active,.wpacu-btns .btn-success:active,.wpacu-btns .show>.btn-success.dropdown-toggle{color:#fff;background-color:#449d44;background-image:none;border-color:#419641}.wpacu-btns .btn-warning{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.wpacu-btns .btn-warning:hover{color:#fff;background-color:#ec971f;border-color:#eb9316}.wpacu-btns .btn-warning.focus,.wpacu-btns .btn-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.wpacu-btns .btn-warning.disabled,.wpacu-btns .btn-warning:disabled{background-color:#f0ad4e;border-color:#f0ad4e}.wpacu-btns .btn-warning.active,.wpacu-btns .btn-warning:active,.wpacu-btns .show>.btn-warning.dropdown-toggle{color:#fff;background-color:#ec971f;background-image:none;border-color:#eb9316}.wpacu-btns .btn-danger{color:#fff;background-color:#d9534f;border-color:#d9534f}.wpacu-btns .btn-danger:hover{color:#fff;background-color:#c9302c;border-color:#c12e2a}.wpacu-btns .btn-danger.focus,.wpacu-btns .btn-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.wpacu-btns .btn-danger.disabled,.wpacu-btns .btn-danger:disabled{background-color:#d9534f;border-color:#d9534f}.wpacu-btns .btn-danger.active,.wpacu-btns .btn-danger:active,.wpacu-btns .show>.btn-danger.dropdown-toggle{color:#fff;background-color:#c9302c;background-image:none;border-color:#c12e2a}.wpacu-btns .btn-outline-primary{color:#0275d8;background-image:none;background-color:transparent;border-color:#0275d8}.wpacu-btns .btn-outline-primary:hover{color:#fff;background-color:#0275d8;border-color:#0275d8}.wpacu-btns .btn-outline-primary.focus,.wpacu-btns .btn-outline-primary:focus{-webkit-box-shadow:0 0 0 2px rgba(2,117,216,.5);box-shadow:0 0 0 2px rgba(2,117,216,.5)}.wpacu-btns .btn-outline-primary.disabled,.wpacu-btns .btn-outline-primary:disabled{color:#0275d8;background-color:transparent}.wpacu-btns .btn-outline-primary.active,.wpacu-btns .btn-outline-primary:active,.wpacu-btns .show>.btn-outline-primary.dropdown-toggle{color:#fff;background-color:#0275d8;border-color:#0275d8}.wpacu-btns .btn-outline-secondary{color:#ccc;background-image:none;background-color:transparent;border-color:#ccc}.wpacu-btns .btn-outline-secondary:hover{color:#fff;background-color:#ccc;border-color:#ccc}.wpacu-btns .btn-outline-secondary.focus,.wpacu-btns .btn-outline-secondary:focus{-webkit-box-shadow:0 0 0 2px rgba(204,204,204,.5);box-shadow:0 0 0 2px rgba(204,204,204,.5)}.wpacu-btns .btn-outline-secondary.disabled,.wpacu-btns .btn-outline-secondary:disabled{color:#ccc;background-color:transparent}.wpacu-btns .btn-outline-secondary.active,.wpacu-btns .btn-outline-secondary:active,.wpacu-btns .show>.btn-outline-secondary.dropdown-toggle{color:#fff;background-color:#ccc;border-color:#ccc}.wpacu-btns .btn-outline-info{color:#5bc0de;background-image:none;background-color:transparent;border-color:#5bc0de}.wpacu-btns .btn-outline-info:hover{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.wpacu-btns .btn-outline-info.focus,.wpacu-btns .btn-outline-info:focus{-webkit-box-shadow:0 0 0 2px rgba(91,192,222,.5);box-shadow:0 0 0 2px rgba(91,192,222,.5)}.wpacu-btns .btn-outline-info.disabled,.wpacu-btns .btn-outline-info:disabled{color:#5bc0de;background-color:transparent}.wpacu-btns .btn-outline-info.active,.wpacu-btns .btn-outline-info:active,.wpacu-btns .show>.btn-outline-info.dropdown-toggle{color:#fff;background-color:#5bc0de;border-color:#5bc0de}.wpacu-btns .btn-outline-success{color:#5cb85c;background-image:none;background-color:transparent;border-color:#5cb85c}.wpacu-btns .btn-outline-success:hover{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.wpacu-btns .btn-outline-success.focus,.wpacu-btns .btn-outline-success:focus{-webkit-box-shadow:0 0 0 2px rgba(92,184,92,.5);box-shadow:0 0 0 2px rgba(92,184,92,.5)}.wpacu-btns .btn-outline-success.disabled,.wpacu-btns .btn-outline-success:disabled{color:#5cb85c;background-color:transparent}.wpacu-btns .btn-outline-success.active,.wpacu-btns .btn-outline-success:active,.wpacu-btns .show>.btn-outline-success.dropdown-toggle{color:#fff;background-color:#5cb85c;border-color:#5cb85c}.wpacu-btns .btn-outline-warning{color:#f0ad4e;background-image:none;background-color:transparent;border-color:#f0ad4e}.wpacu-btns .btn-outline-warning:hover{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.wpacu-btns .btn-outline-warning.focus,.wpacu-btns .btn-outline-warning:focus{-webkit-box-shadow:0 0 0 2px rgba(240,173,78,.5);box-shadow:0 0 0 2px rgba(240,173,78,.5)}.wpacu-btns .btn-outline-warning.disabled,.wpacu-btns .btn-outline-warning:disabled{color:#f0ad4e;background-color:transparent}.wpacu-btns .btn-outline-warning.active,.wpacu-btns .btn-outline-warning:active,.wpacu-btns .show>.btn-outline-warning.dropdown-toggle{color:#fff;background-color:#f0ad4e;border-color:#f0ad4e}.wpacu-btns .btn-outline-danger{color:#d9534f;background-image:none;background-color:transparent;border-color:#d9534f}.wpacu-btns .btn-outline-danger:hover{color:#fff;background-color:#d9534f;border-color:#d9534f}.wpacu-btns .btn-outline-danger.focus,.wpacu-btns .btn-outline-danger:focus{-webkit-box-shadow:0 0 0 2px rgba(217,83,79,.5);box-shadow:0 0 0 2px rgba(217,83,79,.5)}.wpacu-btns .btn-outline-danger.disabled,.wpacu-btns .btn-outline-danger:disabled{color:#d9534f;background-color:transparent}.wpacu-btns .btn-outline-danger.active,.wpacu-btns .btn-outline-danger:active,.wpacu-btns .show>.btn-outline-danger.dropdown-toggle{color:#fff;background-color:#d9534f;border-color:#d9534f}.wpacu-btns .btn-link{font-weight:400;color:#0275d8;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0}.wpacu-btns .btn-link,.wpacu-btns .btn-link.active,.wpacu-btns .btn-link:active,.wpacu-btns .btn-link:disabled{background-color:transparent}.wpacu-btns .btn-link,.wpacu-btns .btn-link:active,.wpacu-btns .btn-link:focus,.wpacu-btns .btn-link:hover{border-color:transparent}.wpacu-btns .btn-link:focus,.wpacu-btns .btn-link:hover{color:#014c8c;text-decoration:underline;background-color:transparent}.wpacu-btns .btn-link:disabled{color:#636c72}.wpacu-btns .btn-link:disabled:focus,.wpacu-btns .btn-link:disabled:hover{text-decoration:none}.wpacu-btns .btn-group-lg>.btn,.wpacu-btns .btn-lg{padding:.75rem 1.5rem;font-size:1.25rem;-webkit-border-radius:.3rem;-moz-border-radius:.3rem;border-radius:.3rem}.wpacu-btns .btn-group-sm>.btn,.wpacu-btns .btn-sm{padding:.25rem .5rem;font-size:.875rem;-webkit-border-radius:.2rem;-moz-border-radius:.2rem;border-radius:.2rem}.wpacu-btns .btn-block{display:block;width:100%}.go-pro-button,.go-pro-link-no-style,.wordpress-core-file{display:inline-block;text-decoration:none}.wpacu-btns .btn-block+.btn-block{margin-top:.5rem}.wpacu-btns input[type=reset].btn-block,.wpacu-btns input[type=button].btn-block,.wpacu-btns input[type=submit].btn-block{width:100%}.wpacu-btns .fade{opacity:0;-webkit-transition:opacity .15s linear;-o-transition:opacity .15s linear;transition:opacity .15s linear}.go-pro-button{background-color:#4CAF50;border:2px solid #4CAF50;color:#fff;padding:12px 18px;text-align:center;font-size:16px;margin:4px 2px;cursor:pointer;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;-webkit-transition-duration:.4s;transition-duration:.4s}.go-pro-button:hover{background-color:#fff;color:#000;border:2px solid #4CAF50;text-decoration:none}.wpacu-restore-pos-btn{font-size:14px!important;line-height:normal!important;height:42px!important;padding:0 18px!important;margin-top:10px!important}body.wp-admin .wpacu_asset_row .go-pro-link-no-style .wpacu-tooltip{padding:8px 2px}body.wp-admin .go-pro-link-no-style .wpacu-tooltip{text-shadow:none;font-weight:400;font-size:12px;line-height:16px;padding:8px 11px}.go-pro-link-no-style{position:relative;color:inherit}.go-pro-link-no-style:not(.nav-tab){font-style:italic}.go-pro-link-no-style.no-transition .wpacu-tooltip{-webkit-transition:0s all ease;transition:0s all ease;-webkit-transition-delay:0s;transition-delay:0s}.go-pro-link-no-style>img{max-width:20px;max-height:20px}.go-pro-link-no-style .wpacu-tooltip{font-size:14px;line-height:18px;position:absolute;z-index:1;visibility:hidden;width:160px;background-color:#00a7a7;color:#fff;text-align:center;padding:8px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;bottom:100%;bottom:calc(100% + 15px);left:50%;margin-left:-65px;-webkit-transition:.1s all ease;transition:.1s all ease;-webkit-transition-delay:0s;transition-delay:0s}.go-pro-link-no-style .wpacu-tooltip:after{content:"";position:absolute;border-width:10px;border-style:solid;top:100%;left:50%;left:calc(50% - 10px);border-color:#00a7a7 transparent transparent}.go-pro-link-no-style .wpacu-tooltip.wpacu-on-pages-btn{cursor:pointer;margin-left:-77px;width:130px}.go-pro-link-no-style .wpacu-tooltip.wpacu-larger{width:240px}.go-pro-link-no-style:hover .wpacu-tooltip{visibility:visible}.wpacu_list_table tr:first-child .wordpress-core-file .wpacu-tooltip{bottom:-40px;left:120px;margin-left:-86px}.wpacu_list_table tr:first-child .wordpress-core-file .wpacu-tooltip:after{top:41px;left:-20px;border-color:transparent #c00 transparent transparent}.wordpress-core-file{position:relative;font-style:normal;color:inherit}.wordpress-core-file .wpacu-tooltip{font-size:14px;line-height:18px;position:absolute;z-index:1;visibility:hidden;width:160px;background-color:#c00;color:#fff;text-align:center;padding:6px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;bottom:100%;bottom:calc(100% + 15px);left:50%;margin-left:-86px;-webkit-transition:.1s all ease;transition:.1s all ease;-webkit-transition-delay:0s;transition-delay:0s}.wordpress-core-file .wpacu-tooltip:after{content:"";position:absolute;border-width:10px;border-style:solid;top:100%;left:50%;left:calc(50% - 10px);border-color:#c00 transparent transparent}.wordpress-core-file:hover .wpacu-tooltip{visibility:visible}.ajax-direct-call-error-area{background:#fff;padding:10px;border:1px solid #c00;-webkit-border-radius:8px;-moz-border-radius:8px;border-radius:8px}.ajax-direct-call-error-area td{padding:6px}.ajax-direct-call-error-area .note{margin-top:0;padding-top:0}.ajax-direct-call-error-area .error-code{color:#c00;font-weight:700}.ajax-wp-remote-post-call-error-area{background:#fff;padding:20px}.ajax-wp-remote-post-call-error-area .table-data{background:0 0;border:1px solid #c66;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.ajax-wp-remote-post-call-error-area .table-data td{padding:10px}.wrap-upgrade-info{background:#fff;padding:0 15px;border:1px solid #cdcdcd;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.wpacu-notice{margin:20px 20px 0 0!important}.wpacu-notice p{font-weight:600!important;font-style:italic}.wpacu-notice .dashicons{font-weight:inherit!important;color:#46b450!important;margin-right:4px;vertical-align:text-bottom;font-size:27px}.wpacu-notice-info{padding:12px 12px 12px 16px;background:#fff;border-left:4px solid #008f9c}.wpacu-notice-info p{margin-top:8px}.wpacu-notice-info p:first-child{margin-top:0}.wpacu-notice-info p:last-child{margin-bottom:0}.wpacu-warning{font-size:15px;padding:10px;background:#fffcec;border:1px solid #fdd5c9;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;margin:0 0 5px;width:100%}.pro-page-unlock-notice{-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;padding:10px;background:#f2faf2;border:1px solid #c0e8c0;width:auto;display:block}.wpacu-license-area .notice,.wpacu-settings-area .notice{margin-left:0;padding:10px!important;width:97%;box-sizing:border-box;font-weight:600;font-style:italic}.wpacu-license-area .notice .dashicons,.wpacu-settings-area .notice .dashicons{color:green}#wpacu-dom-get-type-selections,.wpacu-radio-selections{float:none;clear:both;width:auto;display:inline-block;margin-bottom:0;margin-top:0}#wpacu-dom-get-type-selections.wpacu-vertical,.wpacu-radio-selections.wpacu-vertical{display:block;margin-top:15px;margin-bottom:18px}#wpacu-dom-get-type-selections.wpacu-vertical li,.wpacu-radio-selections.wpacu-vertical li{float:none;margin-bottom:12px}#wpacu-dom-get-type-selections.wpacu-vertical li:last-child,.wpacu-radio-selections.wpacu-vertical li:last-child{margin-bottom:0}#wpacu-dom-get-type-selections li,.wpacu-radio-selections li{margin-right:30px;float:left;margin-bottom:0}#wpacu-dom-get-type-selections li:first-child,.wpacu-radio-selections li:first-child{margin-right:15px}#wpacu-dom-get-type-selections li:last-child,.wpacu-radio-selections li:last-child{margin-right:0}.wpacu_combine_loaded_js_level_area{display:none;background:0 0;border-left:2px solid #008f9c;padding-top:8px;padding-bottom:8px;padding-right:10px;padding-left:10px;margin:20px 0 15px}.wpacu_combine_loaded_js_level_area.wpacu_active{display:block}#wpacu-dom-get-type-infos{margin-bottom:0}#wpacu-dom-get-type-infos li{margin-bottom:0;line-height:20px}.wpacu-wrap li,.wpacu-wrap p,.wpacu-wrap td{font-weight:400}.wpacu-wrap small{width:auto;float:none;display:inline}.wpacu-wrap.wpacu-settings-show-all .wpacu-settings-tab-content{display:block;width:100%}.wpacu-wrap.wpacu-settings-show-all .wpacu-settings-area-title{color:#004567;padding:16px 15px;background:#f8f8f8;border-left:5px solid #004567b0;border-top:1px solid #e7e7e7;border-right:1px solid #e7e7e7;border-bottom:1px solid #e7e7e7;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;font-size:1.45em;font-weight:500}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch .wpacu_slider.wpacu_round,.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch .wpacu_slider.wpacu_round{border-radius:29px}.wpacu-wrap.wpacu-settings-show-all #wpacu-update-button-area{margin:0}.wpacu-wrap.wpacu-settings-show-all #wpacu-update-button-area .button{padding:11px 28px;height:auto;font-size:18px}.wpacu-wrap.wpacu-settings-show-all #wpacu-updating-settings{margin-left:224px;top:25px}.wpacu-wrap.wpacu-switch-standard .asset-cleanup-pro_page_wpassetcleanup_settings .wpacu_switch,.wpacu-wrap.wpacu-switch-standard .asset-cleanup_page_wpassetcleanup_settings .wpacu_switch{width:auto;height:auto}.wpacu-wrap.wpacu-switch-standard .asset-cleanup-pro_page_wpassetcleanup_settings .wpacu_switch input,.wpacu-wrap.wpacu-switch-standard .asset-cleanup_page_wpassetcleanup_settings .wpacu_switch input{display:block}.wpacu-wrap.wpacu-switch-standard .asset-cleanup-pro_page_wpassetcleanup_settings .wpacu_switch input[type=checkbox],.wpacu-wrap.wpacu-switch-standard .asset-cleanup_page_wpassetcleanup_settings .wpacu_switch input[type=checkbox]{margin:0 0 3px}.wpacu-wrap.wpacu-switch-standard .asset-cleanup-pro_page_wpassetcleanup_settings .wpacu_switch .wpacu_slider,.wpacu-wrap.wpacu-switch-standard .asset-cleanup_page_wpassetcleanup_settings .wpacu_switch .wpacu_slider{display:none}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch{position:relative;display:inline-block;width:52px;height:29px}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch input{display:none}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch:not(.wpacu_switch_standard) .wpacu_slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.2s;transition:.2s}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch:not(.wpacu_switch_standard) .wpacu_slider:before{position:absolute;content:'';height:22px;width:22px;left:4px;bottom:4px;background-color:#fff;-webkit-transition:.2s;transition:.2s}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch input:checked+.wpacu_slider{background-color:#52af00}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch input:focus+.wpacu_slider{box-shadow:0 0 1px #52af00}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch input:checked+.wpacu_slider:before{-webkit-transform:translateX(22px);-ms-transform:translateX(22px);transform:translateX(22px)}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch .wpacu_slider.wpacu_round:before{border-radius:50%}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch.wpacu_disabled,.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch.wpacu_locked_for_pro{opacity:.3}.wpacu-wrap.wpacu-switch-enhanced .wpacu_switch.wpacu_disabled:before{content:"\f160";font-family:Dashicons,Arial,"Times New Roman","Bitstream Charter",Times,serif;position:absolute;font-size:23px;top:5px;right:2px;z-index:1000}.asset-cleanup-pro_page_wpassetcleanup_settings .setting_title p.wpacu_subtitle,.asset-cleanup_page_wpassetcleanup_settings .setting_title p.wpacu_subtitle{margin-top:4px;line-height:1.4}.asset-cleanup-pro_page_wpassetcleanup_settings .setting_title p.wpacu_subtitle em,.asset-cleanup_page_wpassetcleanup_settings .setting_title p.wpacu_subtitle em{font-weight:200}.asset-cleanup-pro_page_wpassetcleanup_settings .setting_title p.wpacu_read_more,.asset-cleanup_page_wpassetcleanup_settings .setting_title p.wpacu_read_more{margin-top:-10px;font-style:italic;font-size:12px}.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_inline_code_status_choices,.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices,.asset-cleanup-pro_page_wpassetcleanup_settings .input_style_choices,.asset-cleanup_page_wpassetcleanup_settings .assets_list_inline_code_status_choices,.asset-cleanup_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices,.asset-cleanup_page_wpassetcleanup_settings .input_style_choices{list-style:none;margin:0}.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_inline_code_status_choices li,.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices li,.asset-cleanup-pro_page_wpassetcleanup_settings .input_style_choices li,.asset-cleanup_page_wpassetcleanup_settings .assets_list_inline_code_status_choices li,.asset-cleanup_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices li,.asset-cleanup_page_wpassetcleanup_settings .input_style_choices li{float:left;margin-right:30px}.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_inline_code_status_choices li:last-child,.asset-cleanup-pro_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices li:last-child,.asset-cleanup-pro_page_wpassetcleanup_settings .input_style_choices li:last-child,.asset-cleanup_page_wpassetcleanup_settings .assets_list_inline_code_status_choices li:last-child,.asset-cleanup_page_wpassetcleanup_settings .assets_list_layout_areas_status_choices li:last-child,.asset-cleanup_page_wpassetcleanup_settings .input_style_choices li:last-child{margin-right:0}#wpacu-assets-list-by-location-selected{background:0 0;border:1px solid #e7e7e7;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;padding:8px;clear:both}.notice.notice-success+.wpacu-wrap.wpacu-settings-area{margin-top:20px}.wpacu-license-action-btn-area{margin-top:0;position:relative;display:inline-block}.wpacu-license-spinner{display:none;position:absolute;right:-30px;top:4px}.wpacu-license-spinner img{width:20px;height:20px}#wpacu-activation-issues-info{border-radius:10px;width:90%;margin-top:20px;font-size:14px;padding:6px 20px;background:#fff;border:1px solid #e7e7e7}#wpacu-activation-issues-info ol li{font-size:13px;margin-bottom:10px}#wpacu-mark-license-area-wrap{margin:15px 0}.wpacu-form-table.wpacu-license th{width:150px}.wpacu-form-table th{vertical-align:top;text-align:left;padding:5px 20px 20px 0;width:200px;line-height:1.3;font-weight:600}.wpacu-form-table th label{color:#23282d;font-weight:600;font-size:14px;text-shadow:none;vertical-align:middle;cursor:pointer}.wpacu-form-table td{padding-bottom:25px}.wpacu-form-table td:last-child p:last-child{margin:0}.wpacu-form-table .wpacu-fancy-checkbox input[type=checkbox],.wpacu-form-table label input[type=checkbox]{height:20px;width:20px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.wpacu-form-table .wpacu-fancy-checkbox input[type=checkbox]:checked,.wpacu-form-table .wpacu-fancy-checkbox input[type=checkbox]:hover,.wpacu-form-table label input[type=checkbox]:checked,.wpacu-form-table label input[type=checkbox]:hover{border:1px solid green}.wpacu-form-table .wpacu-fancy-checkbox input[type=checkbox]:checked:before,.wpacu-form-table label input[type=checkbox]:checked:before{color:#52af00;font:400 24px/1 dashicons}.wpacu-form-table .wpacu-fancy-radio input[type=radio]{-webkit-border-radius:50%;-moz-border-radius:50%;border-radius:50%;position:relative;height:20px;width:20px;margin:2px 0 0}.wpacu-form-table .wpacu-fancy-radio input[type=radio]:checked,.wpacu-form-table .wpacu-fancy-radio input[type=radio]:hover{border:1px solid green}.wpacu-form-table .wpacu-fancy-radio input[type=radio]:checked:before{margin:0;line-height:inherit;text-indent:inherit;content:'';position:absolute;top:4px;left:4px;width:10px;height:10px;border-radius:50%;background:#52af00;color:#52af00;font:400 24px/1 dashicons}#wpacu-settings-vertical-tab-wrap{display:table;width:100%}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text{margin:4px 0 0}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small{font-weight:lighter}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small span.wpacu-status-wrap{position:relative;padding-left:14px}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small span.wpacu-status-wrap span.wpacu-circle-status{position:absolute;left:0;top:2px;height:10px;width:10px;border-radius:50%;display:inline-block;opacity:.75}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small span.wpacu-status-wrap span.wpacu-circle-status.wpacu-on{background:#52af00}#wpacu-settings-vertical-tab-wrap .wpacu-tab-extra-text small span.wpacu-status-wrap span.wpacu-circle-status.wpacu-off{background:#ccc}#wpacu-settings-vertical-tab-wrap *{box-sizing:border-box}.wpacu-settings-tab{display:table-cell;width:20%;height:100%;vertical-align:top}.wpacu-settings-tab a{text-decoration:none;border-left:3px solid transparent;display:block;background-color:#f1f1f1;color:#004567;padding:17px 16px;width:100%;outline:0;text-align:left;cursor:pointer;font-size:14px;font-weight:600;border-bottom:1px solid #ccc}.wpacu-settings-tab a:first-child{border-top:1px solid transparent!important}.wpacu-settings-tab a:last-child{border-bottom:1px solid transparent!important}.wpacu-settings-tab a:hover{background-color:#fff;border-left:3px solid #004567;position:relative}.wpacu-settings-tab a.active{color:#004567;background-color:#fff;border-left:3px solid #004567;position:relative;border-bottom:1px solid #ccc}.wpacu-settings-tab a.active:after{content:'';position:absolute;height:100%;width:1px;top:0;right:-1px;background-color:#fff}.wpacu-settings-tab-content{background-color:#fff;display:none;padding:12px 18px;width:79%;border-left:none;height:100%;border-top-right-radius:10px;border-bottom-right-radius:10px}.wpacu-settings-tab-content h2{padding:0 0 15px;border-bottom:1px solid #e7e7e7}.wpacu-settings-tab-content.active{display:table-cell}#wpacu_minify_css_exceptions_area,#wpacu_minify_js_exceptions_area{margin:16px 0 0}#wpacu-update-button-area{position:relative;margin-left:20%}#wpacu-update-button-area.no-left-margin{margin-left:0}#wpacu-update-button-area p{margin-top:10px}#wpacu-update-button-area .button{padding:5px 18px;height:38px;font-size:15px}#wpacu-updating-settings{position:absolute;margin-left:183px;top:19px;display:none}#combine_loaded_js_info_area{position:relative}#combine_loaded_js_info_area.locked-for-pro:before{position:absolute;content:'';height:100%;width:100%;background:#fff;opacity:.5;z-index:10000}.google_fonts_load_types{clear:both;margin:20px 0 15px;display:flex}.google_fonts_load_types>div{text-align:left}.google_fonts_load_types>div input{float:left;margin:0 7px 20px 0!important}.wpacu-sub-tabs-wrap{min-width:320px;margin:0 auto}.wpacu-sub-tabs-wrap input.wpacu-nav-input{display:none}.wpacu-sub-tabs-wrap label.wpacu-nav-label{display:inline-block;margin:0 0 -1px;padding:15px 25px;font-weight:600;text-align:center;color:#74777b;border-left:1px solid transparent;border-right:1px solid transparent;border-top:3px solid transparent;border-bottom:0}.wpacu-sub-tabs-wrap label.wpacu-nav-label:hover{cursor:pointer}.wpacu-sub-tabs-wrap input.wpacu-nav-input:checked+label.wpacu-nav-label{color:#004567;border-left:1px solid #ccc;border-right:1px solid #ccc;border-top:3px solid #004567;border-bottom:1px solid #fff}.wpacu-sub-tabs-wrap section{display:none;padding:20px 0 0;border-top:1px solid #ccc}#wpacu-google-fonts-optimize-tab-item:checked~#wpacu-google-fonts-optimize-tab-item-area,#wpacu-google-fonts-remove-tab-item:checked~#wpacu-google-fonts-remove-tab-item-area{display:block}body.wp-admin .wpacu-handle-notes{margin-top:10px!important}body.wp-admin .wpacu-handle-notes p{margin-top:0!important}body.wp-admin .wpacu-handle-notes p a{font-size:inherit}body.wp-admin .wpacu-handle-notes p a span.dashicons{font-size:19px;width:19px;height:19px;vertical-align:bottom;text-decoration:none}.wpacu-handle-notes{margin-top:12px!important;padding-top:5px;border-top:1px solid #e7e7e7}.wpacu-handle-notes .wpacu-handle-notes-field{display:none}.wpacu-handle-notes .wpacu-handle-notes-field>textarea{font-size:85%;padding:6px;width:320px;max-width:100%}.wpacu-handle-notes p{margin:10px 0 0!important}.wpacu-handle-notes p a.wpacu-add-handle-note{text-decoration:none;font-size:80%;display:inline-block;color:inherit}.wpacu-handle-notes p a.wpacu-add-handle-note span.dashicons{font-size:18px;width:18px;height:18px}.wrap_bulk_unload_options{width:auto;display:inline-flex;-webkit-flex-wrap:wrap;flex-wrap:wrap}.wrap_bulk_unload_options .wpacu_asset_options_wrap{flex-grow:1;margin:5px 10px 14px 0!important;padding:8px 10px 2px!important}.wrap_bulk_unload_options .wpacu_asset_options_wrap .wpacu_slider_text{position:relative!important;vertical-align:top;left:inherit!important;top:inherit!important}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch{position:relative;display:inline-block;min-width:52px;width:52px;height:29px;margin-right:5px!important}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch input{display:none}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch .wpacu_slider{position:absolute;cursor:pointer;top:0;left:0;right:0;bottom:0;background-color:#ccc;-webkit-transition:.15s;transition:.15s}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch .wpacu_slider:before{position:absolute;content:'';height:22px;width:22px;left:4px;bottom:4px;background-color:#fff;-webkit-transition:.15s;transition:.15s}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch input:checked+.wpacu_slider{background-color:#C00}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch input:focus+.wpacu_slider{box-shadow:0 0 1px #C00}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch input:checked+.wpacu_slider:before{-webkit-transform:translateX(22px);-ms-transform:translateX(22px);transform:translateX(22px)}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_switch .wpacu_slider.wpacu_round:before{border-radius:50%}.wpacu-switch-enhanced .wpacu_asset_row .wpacu_slider_text{position:absolute;left:62px;top:3px}.editor-post-saved-state.is-wpacu-reloading{animation:edit-post__loading-fade-animation .5s infinite}body.wp-admin .wpacu_asset_row.wpacu-loading{position:relative}body.wp-admin .wpacu_asset_row.wpacu-loading .wpacu-ajax-loader{display:block!important}body.wp-admin .wpacu_asset_row .wpacu-ajax-loader{display:none;width:58px;height:58px;position:absolute;bottom:0;right:0;opacity:.75}.wpacu_asset_row input{width:auto;height:auto;min-height:16px}.wpacu_asset_row .tip{background:inherit;border-left:4px solid #e7e7e7;margin:5px 0;padding:7px;font-style:italic;font-size:small;line-height:1.4}.wpacu_asset_row td{width:100%;text-align:left}.wpacu_asset_row td p:last-child{margin-bottom:0!important}.wpacu_asset_row td .wpacu_asset_options_wrap{padding:8px 10px;margin:15px 0;background:#fff;border:1px solid #eee;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.wpacu_asset_row td .wpacu_asset_options_wrap p:first-child{margin-top:0;margin-bottom:8px!important}.wpacu_asset_row p.wpacu_handle{margin-top:0}.wpacu_asset_row li.wpacu_unload_this_page{display:block!important;position:relative}.wpacu-clearfix:after,.wpacu-clearfix:before{display:table;content:''}.wpacu-contract-expand-area{width:100%;margin:20px 0 0}.wpacu-contract-expand-area .col-left{float:left}.wpacu-contract-expand-area .col-left h4{margin-bottom:0}.wpacu-contract-expand-area .col-right{float:right}.wpacu-clearfix:after{clear:both}.wpacu-wp-button{color:#555;border-color:#ccc;background:#f7f7f7;box-shadow:0 1px 0 #ccc;vertical-align:top}body.wp-admin .wpacu-wp-button{font-size:13px;line-height:26px;height:28px}.wpacu-wp-button.wpacu-wp-button-secondary{display:inline-block;text-decoration:none;height:auto;margin:0 5px 0 0;padding:0 10px 1px;cursor:pointer;border-width:1px;border-style:solid;-webkit-appearance:none;border-radius:3px;white-space:nowrap;box-sizing:border-box}.wpacu-wp-button:hover{background:#fafafa;border-color:#999;color:#23282d}.distinguish-asset-list{list-style:none;margin-left:0;margin-bottom:5px;display:inline-block}.distinguish-asset-list li{float:left;margin-right:20px}.distinguish-asset-list li:last-child{margin-right:0}body[class*=asset-cleanup-pro] a.wpacu-plugin-contracted-wrap-link{padding:16px 6px 16px 41px!important}body[class*=asset-cleanup-pro] .wpacu-area-open .wpacu-plugin-toggle-all{font-size:12px!important;width:calc(100% - 26px)!important}body.wp-admin .wpacu-area-expanded .wpacu-plugin-toggle-all{top:5px}body.wp-admin .wpacu-area-expanded .wpacu-plugin-toggle-all ul li{font-size:12px!important}.wpacu-assets-collapsible-wrap{border:1px solid #cdcdcd}.wpacu-assets-collapsible-wrap.wpacu-by-location{margin-bottom:15px}.wpacu-assets-collapsible-wrap.wpacu-wrap-all{margin-top:20px}.wpacu-assets-collapsible-wrap.wpacu-wrap-area{margin-top:10px}.wpacu-assets-collapsible-wrap.wpacu-by-location>a.wpacu-assets-collapsible{padding:15px 15px 15px 43px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu_list_table{border-width:0;margin:0;border-spacing:inherit;width:100%;box-shadow:3px 3px 2px #ddd;border-bottom-right-radius:5px;border-top-right-radius:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location span.wpacu-child-location-name{font-weight:600}.wpacu-assets-collapsible-wrap.wpacu-by-location span.wpacu-child-location-version{font-weight:200}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area[data-wpacu-plugin=oxygen] .icon-area{border-radius:50%}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area .wpacu-plugin-toggle-all{display:inline-block;padding:0;font-size:13px;width:100%;width:calc(100% + 46px);min-width:250px;position:absolute;left:100%;left:calc(100% + 6px);margin:0;top:4px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area .wpacu-plugin-toggle-all ul{display:inline-block;margin:0;list-style:none;padding-left:13px;padding-top:0}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area .wpacu-plugin-toggle-all ul li{padding:0;margin:0;line-height:normal;font-size:14px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-location-child-area .wpacu-plugin-toggle-all ul li:first-child{font-style:italic;margin-bottom:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content>table:last-child{margin-bottom:20px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title{display:inline;position:relative;z-index:1}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title:after{content:'';position:absolute;width:100%;left:0;bottom:0;height:1px;background-color:#fdfdfd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-plugin-assets-wrap{padding:0 0 10px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-plugin-assets-wrap.wpacu-area-open .wpacu-plugin-toggle-all{display:inline-block;padding:7px 12px 16px;font-size:14px;width:100%;text-align:left;border-left:1px solid #cdcdcd;border-right:1px solid #cdcdcd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-plugin-assets-wrap.wpacu-area-open.wpacu-plugin-assets-last{margin-bottom:18px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link{color:inherit;text-decoration:none;font-weight:inherit;font-style:inherit;font-size:105%;line-height:initial;height:auto;margin:14px 0 0;padding:13px 6px 14px 39px;position:relative;display:block}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link:after{position:absolute;font-size:18px;font-family:Dashicons;right:12px;top:14px;content:"\f132"}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-link-open:after{content:"\f460"}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-link-closed{border:1px solid #cdcdcd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link:hover{border:1px solid #878787;background:#f9f9f9}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link:hover.wpacu-link-closed{box-shadow:3px 3px 2px #ddd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-link-open{border-top:1px solid #cdcdcd;border-left:1px solid #cdcdcd;border-right:1px solid #cdcdcd;border-bottom:none}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-link-closed.wpacu-last-wrap-link{margin-bottom:20px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .icon-plugin-default{top:10px;left:10px;width:30px;height:30px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .icon-plugin-default .icon-area{width:30px;height:30px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .icon-plugin-default .icon-area:before{font-size:22px;line-height:22px;top:4px;left:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .wpacu-area-title{position:relative;padding:17px 10px 16px 46px;z-index:1}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link .wpacu-area-title:after{content:'';position:absolute;width:100%;left:0;bottom:0;height:1px;background-color:#fdfdfd}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content a.wpacu-plugin-contracted-wrap-link.wpacu-area-last{margin-bottom:18px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-area-open{padding:0;max-height:100%}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content .wpacu-area-closed{padding:0;overflow:hidden;max-height:0}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-plugins .wpacu-assets-collapsible-content>table:last-child{margin-bottom:20px}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title{margin-top:0;margin-bottom:-1px;padding:14px 10px 16px 12px!important}.wpacu-assets-collapsible-wrap.wpacu-by-location.wpacu-themes .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title.wpacu-theme-has-icon{padding:18px 10px 16px 58px!important}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-assets-collapsible-content .wpacu-location-child-area{margin-top:22px;margin-bottom:-1px;font-size:110%;line-height:initial}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-assets-collapsible-content .wpacu-location-child-area.wpacu-location-child-area-first{margin-top:2px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-assets-collapsible-content .wpacu-location-child-area.wpacu-area-expanded .wpacu-area-title{display:inline-block;z-index:1;padding:17px 10px 16px 46px}.wpacu-assets-collapsible-wrap.wpacu-by-location .wpacu-assets-collapsible-content .wpacu-location-child-area .wpacu-area-title{display:inline;border-top-right-radius:8px;border-top-left-radius:8px;background-color:#f9f9f9;border-left:1px solid #cdcdcd;border-top:1px solid #cdcdcd;border-bottom:1px solid transparent;border-right:1px solid #cdcdcd;position:relative}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-plugin-default{position:absolute;padding:0;top:10px;left:10px;width:37px;height:37px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-plugin-default:not(.has-icon){color:#b4b9be;background-color:#eee;box-shadow:inset 0 0 10px rgba(160,165,170,.15);-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-plugin-default:not(.has-icon) .icon-area:before{content:"\f106";font-family:Dashicons;position:absolute;font-size:28px;line-height:28px;top:5px;left:5px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-plugin-default .icon-area{position:relative;width:37px;height:37px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-theme{position:absolute;padding:0;top:10px;left:10px;width:37px;height:37px}.wpacu-assets-collapsible-wrap.wpacu-by-location .icon-theme .icon-area{position:relative;width:37px;height:37px}.wpacu-assets-collapsible-wrap.wpacu-wp_core{border:1px solid #c00}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content{padding:0}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content .wpacu_list_table,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content .wpacu_list_table{width:100%;margin:0}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row td,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row td{border-left:hidden;border-right:hidden;border-bottom:1px solid #cdcdcd}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row:last-child,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row:last-child{margin-bottom:0!important}.wpacu-assets-collapsible-wrap.wpacu-external .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row:last-child td:last-child,.wpacu-assets-collapsible-wrap.wpacu-wp_core .wpacu-assets-collapsible-content .wpacu_list_table .wpacu_asset_row:last-child td:last-child{border-bottom:hidden}a.wpacu-assets-collapsible{color:#000;font-size:20px;text-decoration:none;display:block;position:relative;background-color:#f1f3f8;cursor:pointer;padding:15px 15px 15px 36px;width:auto;border:none;text-align:left;outline:0}a.wpacu-assets-collapsible>span.dashicons{font-size:25px;line-height:normal;position:absolute;top:15px;top:calc(50% - 21px);left:22px;-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}a.wpacu-assets-collapsible:hover{background-color:#f1f3f8;text-decoration:none}a.wpacu-assets-collapsible:after{position:absolute;font-size:22px;font-family:Dashicons;right:14px;top:16px}a.wpacu-assets-collapsible:not(.wpacu-assets-collapsible-active):after{content:"\f132"}a.wpacu-assets-collapsible.wpacu-assets-collapsible-active{background-color:#f1f3f8}a.wpacu-assets-collapsible.wpacu-assets-collapsible-active:after{content:"\f460"}.wpacu-assets-collapsible-content{padding:0 16px;max-height:0;overflow:hidden;background-color:#fbfbfb8c}.wpacu-assets-collapsible-content .wpacu-assets-note{margin:0;padding:15px 15px 10px}.wpacu-assets-collapsible-content>div:not(.wpacu-assets-table-list-wrap){padding:16px 0 0}.wpacu-assets-collapsible-content>div>p:first-child{margin-top:0}.wpacu-assets-collapsible-content.wpacu-open{max-height:100%}a.wpacu-assets-inline-code-collapsible{color:inherit;font-size:14px;text-decoration:none;display:inline-block;position:relative;cursor:pointer;width:auto;outline:0;background:#f1f3f8;border:1px solid #cdcdcd;padding:4px 21px 4px 8px;margin:0 0 0 6px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px}a.wpacu-assets-inline-code-collapsible:hover{border:1px solid #5c5c5c}a.wpacu-assets-inline-code-collapsible:after{position:absolute;font-size:15px;font-family:Dashicons;right:-3px;top:-1px;width:14px;height:14px;-webkit-transform:translate(-50%,50%);transform:translate(-50%,50%)}a.wpacu-assets-inline-code-collapsible:not(.wpacu-assets-inline-code-collapsible-active):after{content:"\f132"}a.wpacu-assets-inline-code-collapsible.wpacu-assets-inline-code-collapsible-active:after{content:"\f460"}.wpacu-assets-inline-code-collapsible-content{font-size:80%;padding:0 8px;max-height:0;overflow:hidden;background-color:#fbfbfb8c}.wpacu-assets-inline-code-collapsible-content>div{padding:7px 8px 0}.wpacu-assets-inline-code-collapsible-content>div>p{line-height:normal!important}.wpacu-assets-inline-code-collapsible-content>div>p:first-child{margin-top:0}.wpacu-assets-inline-code-collapsible-content.wpacu-open{max-height:100%}.wpacu_asset_row p div.select{display:inline-block}.wpacu-wrap-choose-position{display:inline}.wpacu-wrap-choose-position>div{display:inline-block}.wpacu-wrap-choose-position select{width:auto;font-size:inherit;display:inline;margin-left:6px;margin-right:4px}.wpacu-wrap-choose-position>.select>.select{display:inline}.wpacu-wrap-choose-position>.select>.select select{padding-right:30px}.wpacu-wrap-choose-position>.select>.select:after{right:15px;top:-4px}.wpacu_table_wrap{margin:20px 0 0}.wpacu_table_wrap>table{border:1px solid #cdcdcd}.wpacu_table_wrap .table{width:100%;max-width:100%;margin-bottom:1rem;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.wpacu_table_wrap .table td,.wpacu_table_wrap .table th{padding:.75rem;vertical-align:top;border-top:1px solid #eceeef}.wpacu_table_wrap .table thead th{vertical-align:bottom;border-bottom:2px solid #eceeef}.wpacu_table_wrap .table tbody+tbody{border-top:2px solid #eceeef}.wpacu_table_wrap .table .table{background-color:#fff}.wpacu_table_wrap .table-sm td,.wpacu_table_wrap .table-sm th{padding:.3rem}.wpacu_table_wrap .table-bordered,.wpacu_table_wrap .table-bordered td,.wpacu_table_wrap .table-bordered th{border:1px solid #eceeef}.wpacu_table_wrap .table-bordered thead td,.wpacu_table_wrap .table-bordered thead th{border-bottom-width:2px}.wpacu_table_wrap .table-striped tbody tr:nth-of-type(even){background-color:#f9f9f9}.wpacu_table_wrap .table-striped tbody tr:nth-of-type(odd){background-color:#fff}.wpacu_table_wrap .table-active,.wpacu_table_wrap .table-active>td,.wpacu_table_wrap .table-active>th,.wpacu_table_wrap .table-hover .table-active:hover,.wpacu_table_wrap .table-hover .table-active:hover>td,.wpacu_table_wrap .table-hover .table-active:hover>th,.wpacu_table_wrap .table-hover tbody tr:hover{background-color:rgba(0,0,0,.075)}.wpacu_table_wrap .table-success,.wpacu_table_wrap .table-success>td,.wpacu_table_wrap .table-success>th{background-color:#dff0d8}.wpacu_table_wrap .table-hover .table-success:hover,.wpacu_table_wrap .table-hover .table-success:hover>td,.wpacu_table_wrap .table-hover .table-success:hover>th{background-color:#d0e9c6}.wpacu_table_wrap .table-info,.wpacu_table_wrap .table-info>td,.wpacu_table_wrap .table-info>th{background-color:#d9edf7}.wpacu_table_wrap .table-hover .table-info:hover,.wpacu_table_wrap .table-hover .table-info:hover>td,.wpacu_table_wrap .table-hover .table-info:hover>th{background-color:#c4e3f3}.wpacu_table_wrap .table-warning,.wpacu_table_wrap .table-warning>td,.wpacu_table_wrap .table-warning>th{background-color:#fcf8e3}.wpacu_table_wrap .table-hover .table-warning:hover,.wpacu_table_wrap .table-hover .table-warning:hover>td,.wpacu_table_wrap .table-hover .table-warning:hover>th{background-color:#faf2cc}.wpacu_table_wrap .table-danger,.wpacu_table_wrap .table-danger>td,.wpacu_table_wrap .table-danger>th{background-color:#f2dede}.wpacu_table_wrap .table-hover .table-danger:hover,.wpacu_table_wrap .table-hover .table-danger:hover>td,.wpacu_table_wrap .table-hover .table-danger:hover>th{background-color:#ebcccc}.wpacu_table_wrap .thead-inverse th{color:#fff;background-color:#292b2c}.wpacu_table_wrap .thead-default th{color:#464a4c;background-color:#eceeef}.wpacu_table_wrap .table-inverse{color:#fff;background-color:#292b2c}.wpacu_table_wrap .table-inverse td,.wpacu_table_wrap .table-inverse th,.wpacu_table_wrap .table-inverse thead th{border-color:#fff}.wpacu_table_wrap .table-inverse.table-bordered,.wpacu_table_wrap .table-responsive.table-bordered{border:0}.wpacu_table_wrap .table-responsive{display:block;width:100%;overflow-x:auto;-ms-overflow-style:-ms-autohiding-scrollbar}.wp-list-table .wpacu_remove_global_attr_row.wpacu_selected,.wp-list-table .wpacu_restore_position_row.wpacu_selected{background:#e7e7e7}ul.hire-reasons{margin-bottom:20px}ul.hire-reasons li{font-size:14px;line-height:22px;margin-bottom:12px}ul.hire-reasons li .dashicons{font-size:23px;line-height:23px}ul.hire-reasons li .dashicons.dashicons-yes{color:green}ol.getting-started li{font-size:14px;line-height:22px;margin-bottom:8px}.wpacu-get-help-wrap p{font-size:14px}.wpacu-get-help-wrap .help-content-wrap{margin:20px 0 25px;display:-webkit-box;display:-moz-box;display:-ms-flexbox;display:-moz-flex;display:-webkit-flex;display:flex;width:100%}@media only screen and (min-width:768px){.wpacu-get-help-wrap .help-content-wrap{-webkit-box-align:start;-ms-flex-align:start;-ms-grid-row-align:flex-start;align-items:flex-start}}@media only screen and (max-width:767px){.wpacu-get-help-wrap .help-content-wrap{-webkit-box-orient:vertical;-webkit-box-direction:normal;-ms-flex-direction:column;flex-direction:column}}.wpacu-get-help-wrap .help-content-wrap .help-content{padding:15px;background:#fff;border:1px solid #E0E0E0;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px;box-shadow:2px 3px 8px 0 #231f2038;flex:1 1 50%;margin-bottom:10px}.wpacu-get-help-wrap .help-content-wrap .help-content .content-title{margin:5px 0 15px}.wpacu-get-help-wrap .help-content-wrap .help-content .cols-wrap{width:100%;margin:0 auto;display:table}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area{margin:5px 0 0;position:relative}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area.col-left{float:left;width:48%}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area.col-right{float:right;width:48%}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area.activate-plugin img{max-width:280px}.wpacu-get-help-wrap .help-content-wrap .help-content .wpacu-image-area img{width:99%;margin:8px 0;border:1px solid #cdcdcd;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.wpacu-get-help-wrap .help-content-wrap .help-content.upgrade-help{order:2}@media only screen and (min-width:768px){.wpacu-get-help-wrap .help-content-wrap .help-content{margin-right:24px}.wpacu-get-help-wrap .help-content-wrap .help-content.upgrade-help{margin-right:0}}.wpacu-get-help-wrap .help-content-wrap .help-content.tech-help{order:1}@media only screen and (max-width:767px){.wpacu-get-help-wrap .help-content-wrap .help-content.tech-help{margin-bottom:30px}}.wpacu-get-help-wrap .help-content-wrap .help-content ul{list-style:none;padding-left:0}.wpacu-get-help-wrap .help-content-wrap .help-content ul li{font-size:14px;line-height:22px;margin-bottom:15px}.wpacu-get-help-wrap .help-content-wrap .help-content p:last-child,.wpacu-get-help-wrap .help-content-wrap .help-content ul li:last-child{margin-bottom:0}#wpacu-license-data-remove-area{display:none;margin:10px 0 25px}#wpacu-license-data-remove-area.wpacu-visible{display:block}span#wpacu-license-data-removed-msg{display:block;padding-left:26px}#wpacu-warning-read{display:none;margin:10px 0}#wpacu-warning-read span.dashicons-warning{color:#c00}#wpacu-warning-read.wpacu-visible{display:block}#wpacu-reset-submit-area{margin:10px 0;clear:both}#wpacu-reset-submit-btn{margin:10px 0 0}.wpacu-tools-area{margin:10px 20px 0 2px}.wpacu-tools-area .wpacu-tools-container{background:#fff;padding:15px;border:1px solid #cdcdcd;width:96%}.wpacu-tools-area .wpacu-tools-container form>div:first-child{margin:0 0 10px}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning{display:none;box-sizing:border-box;margin-top:10px}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning p{margin:0 0 10px;line-height:22px}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning p:only-child{margin:0}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning ul{font-size:13px;list-style-type:disc;padding-left:30px}.wpacu-tools-area .wpacu-tools-container form .wpacu-warning.wpacu-visible{display:block}.wpacu-tools-area .wpacu-export-import-area{padding:10px}.wpacu-tools-area .wpacu-export-import-area form>p:first-of-type{margin-top:0}.wpacu-tools-area .wpacu-export-import-area form>p:last-of-type{margin-bottom:0}.wpacu-tools-area .wpacu-export-import-area:hover{background:rgba(40,44,42,.05);box-shadow:inset 0 0 10px rgba(160,165,170,.15)}.wpacu-tools-area .wpacu-export-import-area+hr{display:block;height:1px;border:0;border-top:1px solid #cdcdcd;margin:10px 0;padding:0}#wpacu-import-form button.wpacu-importing img.wpacu-spinner{display:inline-block}#wpacu-import-form button img.wpacu-spinner{display:none;margin:0 0 0 5px;height:16px;width:16px;vertical-align:middle}.wpacu-about-wrap .wpacu-about-text img{width:auto;height:150px;position:absolute;top:20px;right:-20px}@media only screen and (max-width:767px){.wpacu-about-wrap h1{margin:20px}.wpacu-about-wrap .wpacu-about-text img{display:none}.wpacu-about-wrap .wpacu-about-text{margin:20px}}.wpacu-about-wrap .about-wrap-content .area-title{font-size:19px;line-height:19px;margin-bottom:0}.wpacu-about-wrap hr{margin:10px 0}.wpacu-lite-vs-pro-wrap ul{display:flex;top:0;z-index:10;padding-bottom:14px}.wpacu-lite-vs-pro-wrap li{list-style:none;flex:1}.wpacu-lite-vs-pro-wrap li:last-child{border-right:1px solid #DDD}.wpacu-lite-vs-pro-wrap button{width:100%;border:1px solid #DDD;border-right:0;border-top:0;padding:10px;background:#FFF;font-size:14px;font-weight:700;height:60px;color:#999}.wpacu-lite-vs-pro-wrap li.active button{background:#F5F5F5;color:#000}.wpacu-lite-vs-pro-wrap table{border-collapse:collapse;table-layout:fixed;width:100%}.wpacu-lite-vs-pro-wrap th{background:inherit}.wpacu-lite-vs-pro-wrap tr.first{background:inherit;font-size:18px}.wpacu-lite-vs-pro-wrap tr.first .bg-lite{border-top:4px solid #6d6e70;background:#fff;color:#6d6e70}.wpacu-lite-vs-pro-wrap tr.first .bg-pro{border-top:4px solid green;background:#fff;color:green}.wpacu-lite-vs-pro-wrap tr:not(.first){background:#fff}.wpacu-lite-vs-pro-wrap tr:not(:last-child):hover{background:#f8f8f8}.wpacu-lite-vs-pro-wrap td,.wpacu-lite-vs-pro-wrap th{height:53px;border:1px solid #DDD;padding:10px 16px;empty-cells:show;text-align:left}@media only screen and (max-width:767px){.wpacu-lite-vs-pro-wrap td,.wpacu-lite-vs-pro-wrap th{font-size:14px}}.wpacu-lite-vs-pro-wrap td+td,.wpacu-lite-vs-pro-wrap th+th{text-align:center;display:none}.wpacu-lite-vs-pro-wrap td.default{display:table-cell}.wpacu-lite-vs-pro-wrap .txt-l{font-size:28px;font-weight:700}.wpacu-lite-vs-pro-wrap .txt-top{position:relative;top:-9px;left:-2px}.wpacu-lite-vs-pro-wrap svg{width:18px;height:18px}.wpacu-lite-vs-pro-wrap svg path{fill:green}.wpacu-lite-vs-pro-wrap .tick{color:#2CA01C}.wpacu-lite-vs-pro-wrap .tick img{fill:#2CA01C}@media only screen and (max-width:767px){.wpacu-lite-vs-pro-wrap .txt-l{font-size:20px}.wpacu-lite-vs-pro-wrap .tick{font-size:15px}}.wpacu-lite-vs-pro-wrap .na{font-size:18px;opacity:.3;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=30)"}.wpacu-lite-vs-pro-wrap .hide{border:0;background:0 0}.wpacu-lite-vs-pro-wrap td,.wpacu-lite-vs-pro-wrap th{display:table-cell!important;width:auto}.wpacu-lite-vs-pro-wrap td+td,.wpacu-lite-vs-pro-wrap th+th{width:130px}@media only screen and (max-width:767px){.wpacu-lite-vs-pro-wrap .na{font-size:15px}.wpacu-lite-vs-pro-wrap td+td,.wpacu-lite-vs-pro-wrap th+th{width:42px}}@media only screen and (min-width:768px){.wpacu-lite-vs-pro-wrap td .button{font-size:16px!important}}@media only screen and (max-width:767px){.wpacu-lite-vs-pro-wrap td .button{font-size:14px!important;padding:0 20px!important}.wpacu-lite-vs-pro-wrap td .button.button-primary{margin-top:6px;margin-bottom:14px}}@media only screen and (min-width:768px){.wpacu-lite-vs-pro-wrap{margin-bottom:40px;clear:both}}.wpacu-video-areas>div{padding:20px;-webkit-border-radius:10px;-moz-border-radius:10px;border-radius:10px}.wpacu-video-areas>div:nth-child(odd){background:#fff}.wpacu-video-areas>div:nth-child(even){background:inherit}@media only screen and (min-width:1200px){.wpacu-video-areas .wpacu-video-area-wrapper{margin:0 0 15px;display:flex}.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-col-right{padding:0 20px 0 25px}}@media only screen and (min-width:992px) and (max-width:1199px){.wpacu-video-areas .wpacu-video-area-wrapper{margin:0 0 40px}}.wpacu-video-areas .wpacu-video-area-wrapper ol{font-size:14px}.wpacu-video-areas .wpacu-video-area-wrapper ul{font-size:14px;list-style:disc;margin-left:22px}@media only screen and (min-width:1200px){.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-col-right p:first-child{margin-top:0}.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-col-right p:last-child{margin-bottom:0}}@media only screen and (max-width:1199px){.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-video-wrapper{position:relative;padding-bottom:56.25%;padding-top:30px;height:0;overflow:hidden}.wpacu-video-areas .wpacu-video-area-wrapper .wpacu-video-wrapper iframe{position:absolute;top:0;left:0;width:100%;height:100%}}#wpassetcleanup_asset_list.postbox h2{padding-left:52px!important;position:relative}#wpassetcleanup_asset_list.postbox h2:before{content:'';position:absolute;background-image:url(images/wpacu-logo-transparent-bg-v1.png);background-size:cover;top:6px;left:13px;width:33px;height:26px;opacity:.8;-webkit-filter:grayscale(100%);filter:grayscale(100%)}body.wp-admin .wpacu-modal{display:none;position:fixed;z-index:1000000;padding-top:15%;left:0;top:0;width:100%;height:100%;overflow:auto;background-color:#000;background-color:rgba(0,0,0,.4)}body.wp-admin .wpacu-modal-content{background-color:#fefefe;margin:auto;padding:20px;border:1px solid #888;width:80%;max-width:600px;border-radius:10px}body.wp-admin .wpacu-close{color:#aaa;float:right;font-size:28px;font-weight:700}body.wp-admin .wpacu-close:focus,body.wp-admin .wpacu-close:hover{color:#000;text-decoration:none;cursor:pointer}.wpacu-bulk-changes-tabs{display:table;position:relative;overflow:hidden;margin:0;width:100%}.wpacu-bulk-changes-tabs li{border-top:1px solid rgba(40,44,42,.1);border-left:1px solid rgba(40,44,42,.1);border-bottom:1px solid rgba(40,44,42,.1);float:left;line-height:38px;padding:0;position:relative;margin-bottom:12px}.wpacu-bulk-changes-tabs li:last-child{border-right:1px solid rgba(40,44,42,.1)}.wpacu-bulk-changes-tabs a{position:relative;background:rgba(40,44,42,.05);color:#004567;font-size:14px;font-weight:500;display:block;letter-spacing:0;outline:0;padding:6px 20px;text-decoration:none;border-top:3px solid transparent}.wpacu-bulk-changes-tabs a:hover{background:#f1f1f1;border-top:3px solid transparent}.wpacu-bulk-changes-tabs .current a{background:#fff;border-top:3px solid #004567}.wpacu-bulk-changes-tabs .current a:hover{background:#fff}.wpacu-bulk-changes-tabs .current a:after,.wpacu-bulk-changes-tabs .current a:before{top:100%;left:50%;border:solid transparent;content:" ";height:0;width:0;position:absolute;pointer-events:none}.wpacu-bulk-changes-tabs .current a:after{border-color:rgba(136,183,213,0);border-top-color:#fff;border-width:12px;margin-left:-12px}.wpacu-bulk-changes-tabs .current a:before{border-color:rgba(194,225,245,0);border-top-color:rgba(40,44,42,.1);border-width:13px;margin-left:-13px}
|
classes/CleanUp.php
CHANGED
@@ -83,24 +83,6 @@ class CleanUp
|
|
83 |
add_filter('feed_links_show_comments_feed', '__return_false');
|
84 |
}
|
85 |
|
86 |
-
// Remove "WordPress version" and all other "generator" meta tags?
|
87 |
-
if ($settings['remove_generator_tag']) {
|
88 |
-
add_action('wp_loaded', static function () {
|
89 |
-
ob_start(static function ($htmlSource) {
|
90 |
-
return self::removeMetaGenerators($htmlSource);
|
91 |
-
});
|
92 |
-
}, PHP_INT_MAX);
|
93 |
-
}
|
94 |
-
|
95 |
-
// Remove valid HTML Comments
|
96 |
-
if ($settings['remove_html_comments']) {
|
97 |
-
add_action('wp_loaded', static function () {
|
98 |
-
ob_start(static function ($htmlSource) {
|
99 |
-
return self::removeHtmlComments($htmlSource);
|
100 |
-
});
|
101 |
-
}, PHP_INT_MAX);
|
102 |
-
}
|
103 |
-
|
104 |
// Disable XML-RPC protocol support (partially or completely)
|
105 |
if (in_array($settings['disable_xmlrpc'], array('disable_all', 'disable_pingback'))) {
|
106 |
// Partially or Completely Options / Pingback will be disabled
|
@@ -110,25 +92,30 @@ class CleanUp
|
|
110 |
if ($settings['disable_xmlrpc'] === 'disable_all') {
|
111 |
add_filter('xmlrpc_enabled', '__return_false');
|
112 |
}
|
|
|
|
|
113 |
|
114 |
-
|
115 |
-
|
116 |
-
|
117 |
-
|
118 |
-
|
119 |
-
|
120 |
-
|
121 |
-
|
122 |
-
|
|
|
123 |
|
124 |
-
|
125 |
-
|
126 |
-
|
|
|
127 |
|
128 |
-
|
129 |
-
|
130 |
-
});
|
131 |
}
|
|
|
|
|
132 |
}
|
133 |
|
134 |
/**
|
83 |
add_filter('feed_links_show_comments_feed', '__return_false');
|
84 |
}
|
85 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
86 |
// Disable XML-RPC protocol support (partially or completely)
|
87 |
if (in_array($settings['disable_xmlrpc'], array('disable_all', 'disable_pingback'))) {
|
88 |
// Partially or Completely Options / Pingback will be disabled
|
92 |
if ($settings['disable_xmlrpc'] === 'disable_all') {
|
93 |
add_filter('xmlrpc_enabled', '__return_false');
|
94 |
}
|
95 |
+
}
|
96 |
+
}
|
97 |
|
98 |
+
/**
|
99 |
+
* Called in OptimiseAssets/OptimizeCommon.php
|
100 |
+
*
|
101 |
+
* @param $htmlSource
|
102 |
+
*
|
103 |
+
* @return string|string[]|null
|
104 |
+
*/
|
105 |
+
public static function cleanPingbackLinkRel($htmlSource)
|
106 |
+
{
|
107 |
+
$pingBackUrl = get_bloginfo('pingback_url');
|
108 |
|
109 |
+
$matchRegExps = array(
|
110 |
+
'#<link rel=("|\')pingback("|\') href=("|\')'.$pingBackUrl.'("|\')( /|)>#',
|
111 |
+
'#<link href=("|\')'.$pingBackUrl.'("|\') rel=("|\')pingback("|\')( /|)>#'
|
112 |
+
);
|
113 |
|
114 |
+
foreach ($matchRegExps as $matchRegExp) {
|
115 |
+
$htmlSource = preg_replace($matchRegExp, '', $htmlSource);
|
|
|
116 |
}
|
117 |
+
|
118 |
+
return $htmlSource;
|
119 |
}
|
120 |
|
121 |
/**
|
classes/FileSystem.php
CHANGED
@@ -1,6 +1,8 @@
|
|
1 |
<?php
|
2 |
namespace WpAssetCleanUp;
|
3 |
|
|
|
|
|
4 |
/**
|
5 |
* Class FileSystem
|
6 |
* @package WpAssetCleanUp
|
@@ -38,10 +40,11 @@ class FileSystem
|
|
38 |
|
39 |
/**
|
40 |
* @param $localPathToFile
|
|
|
41 |
*
|
42 |
-
* @return
|
43 |
*/
|
44 |
-
public static function file_get_contents($localPathToFile)
|
45 |
{
|
46 |
// Fallback
|
47 |
if (! self::init()) {
|
@@ -49,6 +52,13 @@ class FileSystem
|
|
49 |
}
|
50 |
|
51 |
global $wp_filesystem;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
52 |
return $wp_filesystem->get_contents($localPathToFile);
|
53 |
}
|
54 |
|
1 |
<?php
|
2 |
namespace WpAssetCleanUp;
|
3 |
|
4 |
+
use WpAssetCleanUp\OptimiseAssets\CombineCssImports;
|
5 |
+
|
6 |
/**
|
7 |
* Class FileSystem
|
8 |
* @package WpAssetCleanUp
|
40 |
|
41 |
/**
|
42 |
* @param $localPathToFile
|
43 |
+
* @param string $alter
|
44 |
*
|
45 |
+
* @return false|string
|
46 |
*/
|
47 |
+
public static function file_get_contents($localPathToFile, $alter = '')
|
48 |
{
|
49 |
// Fallback
|
50 |
if (! self::init()) {
|
52 |
}
|
53 |
|
54 |
global $wp_filesystem;
|
55 |
+
|
56 |
+
if ($alter === 'combine_css_imports') {
|
57 |
+
// This custom class does not minify as it's custom made for combining @import
|
58 |
+
$optimizer = new CombineCssImports($localPathToFile);
|
59 |
+
return $optimizer->minify();
|
60 |
+
}
|
61 |
+
|
62 |
return $wp_filesystem->get_contents($localPathToFile);
|
63 |
}
|
64 |
|
classes/OptimiseAssets/CombineCss.php
CHANGED
@@ -62,14 +62,14 @@ class CombineCss
|
|
62 |
foreach (array('head', 'body') as $docLocationTag) {
|
63 |
$combinedUriPathsGroup = $localAssetsPathsGroup = $linkHrefsGroup = array();
|
64 |
|
65 |
-
$docLocationElements = $documentForCSS->getElementsByTagName(
|
66 |
if ($docLocationElements === null) { continue; }
|
67 |
|
68 |
$xpath = new \DOMXpath($documentForCSS);
|
69 |
$linkStylesheetTags = $xpath->query('/html/'.$docLocationTag.'/link[@rel="stylesheet"]');
|
70 |
if ($linkStylesheetTags === null) { continue; }
|
71 |
|
72 |
-
foreach (
|
73 |
$linkAttributes = array();
|
74 |
foreach ($tagObject->attributes as $attrObj) { $linkAttributes[$attrObj->nodeName] = trim($attrObj->nodeValue); }
|
75 |
|
@@ -103,7 +103,7 @@ class CombineCss
|
|
103 |
|
104 |
// It will skip external stylesheets (from a different domain)
|
105 |
if ( $localAssetPath ) {
|
106 |
-
$combinedUriPathsGroup[$mediaValue][] = OptimizeCommon::getHrefRelPath(
|
107 |
$localAssetsPathsGroup[$mediaValue][$href] = $localAssetPath;
|
108 |
$linkHrefsGroup[$mediaValue][] = $href;
|
109 |
}
|
@@ -180,8 +180,7 @@ HTML;
|
|
180 |
$htmlSourceBeforeAnyLinkTagReplacement = $htmlSource;
|
181 |
|
182 |
// Detect first LINK tag from the <$locationTag> and replace it with the final combined LINK tag
|
183 |
-
$firstLinkTag = OptimizeCss::getFirstLinkTag($storageJsonContentLocation['link_hrefs'][0],
|
184 |
-
$htmlSource);
|
185 |
|
186 |
if ($firstLinkTag) {
|
187 |
$htmlSource = str_replace($firstLinkTag, $finalCssTag, $htmlSource);
|
@@ -322,11 +321,11 @@ HTML;
|
|
322 |
$skipIfFileExists = true;
|
323 |
|
324 |
if ($skipIfFileExists || ! file_exists($localFinalCssFile)) {
|
325 |
-
// Change $
|
326 |
-
$
|
327 |
|
328 |
foreach ($localAssetsPaths as $assetHref => $localAssetsPath) {
|
329 |
-
if ($cssContent = trim(FileSystem::file_get_contents($localAssetsPath))) {
|
330 |
$pathToAssetDir = OptimizeCommon::getPathToAssetDir($assetHref);
|
331 |
|
332 |
// Does it have a source map? Strip it
|
@@ -334,14 +333,19 @@ HTML;
|
|
334 |
$cssContent = OptimizeCommon::stripSourceMap($cssContent);
|
335 |
}
|
336 |
|
337 |
-
$
|
338 |
-
$
|
339 |
}
|
340 |
}
|
341 |
|
342 |
-
|
|
|
343 |
|
344 |
-
if (
|
|
|
|
|
|
|
|
|
345 |
if ($dirToUserCachedFile !== '' && isset($current_user->ID) && $current_user->ID > 0 && ! is_dir($localDirForCssFile)) {
|
346 |
$makeLocalDirForCss = @mkdir($localDirForCssFile);
|
347 |
|
@@ -350,7 +354,7 @@ HTML;
|
|
350 |
}
|
351 |
}
|
352 |
|
353 |
-
FileSystem::file_put_contents($localFinalCssFile, $
|
354 |
}
|
355 |
}
|
356 |
|
@@ -361,28 +365,6 @@ HTML;
|
|
361 |
);
|
362 |
}
|
363 |
|
364 |
-
/**
|
365 |
-
* Source: https://www.minifier.org/ | https://github.com/matthiasmullie/minify
|
366 |
-
*
|
367 |
-
* @param $content
|
368 |
-
*
|
369 |
-
* @return string
|
370 |
-
*/
|
371 |
-
public static function moveImportsToTop($content)
|
372 |
-
{
|
373 |
-
if (preg_match_all('/(;?)(@import (?<url>url\()?(?P<quotes>["\']?).+?(?P=quotes)(?(url)\)));?/', $content, $matches)) {
|
374 |
-
// remove from content
|
375 |
-
foreach ($matches[0] as $import) {
|
376 |
-
$content = str_replace($import, '', $content);
|
377 |
-
}
|
378 |
-
|
379 |
-
// add to top
|
380 |
-
$content = implode(';', $matches[2]).';'.trim($content, ';');
|
381 |
-
}
|
382 |
-
|
383 |
-
return $content;
|
384 |
-
}
|
385 |
-
|
386 |
/**
|
387 |
* @return bool
|
388 |
*/
|
62 |
foreach (array('head', 'body') as $docLocationTag) {
|
63 |
$combinedUriPathsGroup = $localAssetsPathsGroup = $linkHrefsGroup = array();
|
64 |
|
65 |
+
$docLocationElements = $documentForCSS->getElementsByTagName($docLocationTag)->item(0);
|
66 |
if ($docLocationElements === null) { continue; }
|
67 |
|
68 |
$xpath = new \DOMXpath($documentForCSS);
|
69 |
$linkStylesheetTags = $xpath->query('/html/'.$docLocationTag.'/link[@rel="stylesheet"]');
|
70 |
if ($linkStylesheetTags === null) { continue; }
|
71 |
|
72 |
+
foreach ($linkStylesheetTags as $tagObject) {
|
73 |
$linkAttributes = array();
|
74 |
foreach ($tagObject->attributes as $attrObj) { $linkAttributes[$attrObj->nodeName] = trim($attrObj->nodeValue); }
|
75 |
|
103 |
|
104 |
// It will skip external stylesheets (from a different domain)
|
105 |
if ( $localAssetPath ) {
|
106 |
+
$combinedUriPathsGroup[$mediaValue][] = OptimizeCommon::getHrefRelPath($href);
|
107 |
$localAssetsPathsGroup[$mediaValue][$href] = $localAssetPath;
|
108 |
$linkHrefsGroup[$mediaValue][] = $href;
|
109 |
}
|
180 |
$htmlSourceBeforeAnyLinkTagReplacement = $htmlSource;
|
181 |
|
182 |
// Detect first LINK tag from the <$locationTag> and replace it with the final combined LINK tag
|
183 |
+
$firstLinkTag = OptimizeCss::getFirstLinkTag($storageJsonContentLocation['link_hrefs'][0], $htmlSource);
|
|
|
184 |
|
185 |
if ($firstLinkTag) {
|
186 |
$htmlSource = str_replace($firstLinkTag, $finalCssTag, $htmlSource);
|
321 |
$skipIfFileExists = true;
|
322 |
|
323 |
if ($skipIfFileExists || ! file_exists($localFinalCssFile)) {
|
324 |
+
// Change $finalCombinedCssContent as paths to fonts and images that are relative (e.g. ../, ../../) have to be updated
|
325 |
+
$finalCombinedCssContent = '';
|
326 |
|
327 |
foreach ($localAssetsPaths as $assetHref => $localAssetsPath) {
|
328 |
+
if ($cssContent = trim(FileSystem::file_get_contents($localAssetsPath, 'combine_css_imports'))) {
|
329 |
$pathToAssetDir = OptimizeCommon::getPathToAssetDir($assetHref);
|
330 |
|
331 |
// Does it have a source map? Strip it
|
333 |
$cssContent = OptimizeCommon::stripSourceMap($cssContent);
|
334 |
}
|
335 |
|
336 |
+
$finalCombinedCssContent .= '/*! '.str_replace(ABSPATH, '/', $localAssetsPath)." */\n";
|
337 |
+
$finalCombinedCssContent .= OptimizeCss::maybeFixCssContent($cssContent, $pathToAssetDir . '/') . "\n";
|
338 |
}
|
339 |
}
|
340 |
|
341 |
+
// Move any @imports to top; This also strips any @imports to Google Fonts if the option is chosen
|
342 |
+
$finalCombinedCssContent = trim(OptimizeCss::importsUpdate($finalCombinedCssContent));
|
343 |
|
344 |
+
if (Main::instance()->settings['google_fonts_remove']) {
|
345 |
+
$finalCombinedCssContent = FontsGoogleRemove::cleanFontFaceReferences($finalCombinedCssContent);
|
346 |
+
}
|
347 |
+
|
348 |
+
if ($finalCombinedCssContent) {
|
349 |
if ($dirToUserCachedFile !== '' && isset($current_user->ID) && $current_user->ID > 0 && ! is_dir($localDirForCssFile)) {
|
350 |
$makeLocalDirForCss = @mkdir($localDirForCssFile);
|
351 |
|
354 |
}
|
355 |
}
|
356 |
|
357 |
+
FileSystem::file_put_contents($localFinalCssFile, $finalCombinedCssContent);
|
358 |
}
|
359 |
}
|
360 |
|
365 |
);
|
366 |
}
|
367 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
368 |
/**
|
369 |
* @return bool
|
370 |
*/
|
classes/OptimiseAssets/CombineCssImports.php
ADDED
@@ -0,0 +1,509 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace WpAssetCleanUp\OptimiseAssets;
|
3 |
+
|
4 |
+
use MatthiasMullie\Minify\Minify;
|
5 |
+
|
6 |
+
use MatthiasMullie\Minify\Exceptions\FileImportException;
|
7 |
+
use MatthiasMullie\PathConverter\ConverterInterface;
|
8 |
+
use MatthiasMullie\PathConverter\Converter;
|
9 |
+
|
10 |
+
/**
|
11 |
+
* Combine CSS Imports extended from CSS minifier
|
12 |
+
*
|
13 |
+
* Please report bugs on https://github.com/matthiasmullie/minify/issues
|
14 |
+
*
|
15 |
+
* @package Minify
|
16 |
+
* @author Matthias Mullie <minify@mullie.eu>
|
17 |
+
* @author Tijs Verkoyen <minify@verkoyen.eu>
|
18 |
+
* @copyright Copyright (c) 2012, Matthias Mullie. All rights reserved
|
19 |
+
* @license MIT License
|
20 |
+
*/
|
21 |
+
class CombineCssImports extends Minify
|
22 |
+
{
|
23 |
+
/**
|
24 |
+
* @var int maximum inport size in kB
|
25 |
+
*/
|
26 |
+
protected $maxImportSize = 5;
|
27 |
+
|
28 |
+
/**
|
29 |
+
* @var string[] valid import extensions
|
30 |
+
*/
|
31 |
+
protected $importExtensions = array(
|
32 |
+
'gif' => 'data:image/gif',
|
33 |
+
'png' => 'data:image/png',
|
34 |
+
'jpe' => 'data:image/jpeg',
|
35 |
+
'jpg' => 'data:image/jpeg',
|
36 |
+
'jpeg' => 'data:image/jpeg',
|
37 |
+
'svg' => 'data:image/svg+xml',
|
38 |
+
'woff' => 'data:application/x-font-woff',
|
39 |
+
'tif' => 'image/tiff',
|
40 |
+
'tiff' => 'image/tiff',
|
41 |
+
'xbm' => 'image/x-xbitmap',
|
42 |
+
);
|
43 |
+
|
44 |
+
/**
|
45 |
+
* Set the maximum size if files to be imported.
|
46 |
+
*
|
47 |
+
* Files larger than this size (in kB) will not be imported into the CSS.
|
48 |
+
* Importing files into the CSS as data-uri will save you some connections,
|
49 |
+
* but we should only import relatively small decorative images so that our
|
50 |
+
* CSS file doesn't get too bulky.
|
51 |
+
*
|
52 |
+
* @param int $size Size in kB
|
53 |
+
*/
|
54 |
+
public function setMaxImportSize($size)
|
55 |
+
{
|
56 |
+
$this->maxImportSize = $size;
|
57 |
+
}
|
58 |
+
|
59 |
+
/**
|
60 |
+
* Set the type of extensions to be imported into the CSS (to save network
|
61 |
+
* connections).
|
62 |
+
* Keys of the array should be the file extensions & respective values
|
63 |
+
* should be the data type.
|
64 |
+
*
|
65 |
+
* @param string[] $extensions Array of file extensions
|
66 |
+
*/
|
67 |
+
public function setImportExtensions(array $extensions)
|
68 |
+
{
|
69 |
+
$this->importExtensions = $extensions;
|
70 |
+
}
|
71 |
+
|
72 |
+
/**
|
73 |
+
* Move any import statements to the top.
|
74 |
+
*
|
75 |
+
* @param string $content Nearly finished CSS content
|
76 |
+
*
|
77 |
+
* @return string
|
78 |
+
*/
|
79 |
+
protected function moveImportsToTop($content)
|
80 |
+
{
|
81 |
+
if (preg_match_all('/(;?)(@import (?<url>url\()?(?P<quotes>["\']?).+?(?P=quotes)(?(url)\)));?/', $content, $matches)) {
|
82 |
+
// remove from content
|
83 |
+
foreach ($matches[0] as $import) {
|
84 |
+
$content = str_replace($import, '', $content);
|
85 |
+
}
|
86 |
+
|
87 |
+
// add to top
|
88 |
+
$content = implode(';', $matches[2]).';'.trim($content, ';');
|
89 |
+
}
|
90 |
+
|
91 |
+
return $content;
|
92 |
+
}
|
93 |
+
|
94 |
+
/**
|
95 |
+
* Combine CSS from import statements.
|
96 |
+
*
|
97 |
+
* @import's will be loaded and their content merged into the original file,
|
98 |
+
* to save HTTP requests.
|
99 |
+
*
|
100 |
+
* @param string $source The file to combine imports for
|
101 |
+
* @param string $content The CSS content to combine imports for
|
102 |
+
* @param string[] $parents Parent paths, for circular reference checks
|
103 |
+
*
|
104 |
+
* @return string
|
105 |
+
*
|
106 |
+
* @throws FileImportException
|
107 |
+
*/
|
108 |
+
protected function combineImports($source, $content, $parents)
|
109 |
+
{
|
110 |
+
$importRegexes = array(
|
111 |
+
// @import url(xxx)
|
112 |
+
'/
|
113 |
+
# import statement
|
114 |
+
@import
|
115 |
+
|
116 |
+
# whitespace
|
117 |
+
\s+
|
118 |
+
|
119 |
+
# open url()
|
120 |
+
url\(
|
121 |
+
|
122 |
+
# (optional) open path enclosure
|
123 |
+
(?P<quotes>["\']?)
|
124 |
+
|
125 |
+
# fetch path
|
126 |
+
(?P<path>.+?)
|
127 |
+
|
128 |
+
# (optional) close path enclosure
|
129 |
+
(?P=quotes)
|
130 |
+
|
131 |
+
# close url()
|
132 |
+
\)
|
133 |
+
|
134 |
+
# (optional) trailing whitespace
|
135 |
+
\s*
|
136 |
+
|
137 |
+
# (optional) media statement(s)
|
138 |
+
(?P<media>[^;]*)
|
139 |
+
|
140 |
+
# (optional) trailing whitespace
|
141 |
+
\s*
|
142 |
+
|
143 |
+
# (optional) closing semi-colon
|
144 |
+
;?
|
145 |
+
|
146 |
+
/ix',
|
147 |
+
|
148 |
+
// @import 'xxx'
|
149 |
+
'/
|
150 |
+
|
151 |
+
# import statement
|
152 |
+
@import
|
153 |
+
|
154 |
+
# whitespace
|
155 |
+
\s+
|
156 |
+
|
157 |
+
# open path enclosure
|
158 |
+
(?P<quotes>["\'])
|
159 |
+
|
160 |
+
# fetch path
|
161 |
+
(?P<path>.+?)
|
162 |
+
|
163 |
+
# close path enclosure
|
164 |
+
(?P=quotes)
|
165 |
+
|
166 |
+
# (optional) trailing whitespace
|
167 |
+
\s*
|
168 |
+
|
169 |
+
# (optional) media statement(s)
|
170 |
+
(?P<media>[^;]*)
|
171 |
+
|
172 |
+
# (optional) trailing whitespace
|
173 |
+
\s*
|
174 |
+
|
175 |
+
# (optional) closing semi-colon
|
176 |
+
;?
|
177 |
+
|
178 |
+
/ix',
|
179 |
+
);
|
180 |
+
|
181 |
+
// find all relative imports in css
|
182 |
+
$matches = array();
|
183 |
+
foreach ($importRegexes as $importRegex) {
|
184 |
+
if (preg_match_all($importRegex, $content, $regexMatches, PREG_SET_ORDER)) {
|
185 |
+
$matches = array_merge($matches, $regexMatches);
|
186 |
+
}
|
187 |
+
}
|
188 |
+
|
189 |
+
$search = array();
|
190 |
+
$replace = array();
|
191 |
+
|
192 |
+
// loop the matches
|
193 |
+
foreach ($matches as $match) {
|
194 |
+
// get the path for the file that will be imported
|
195 |
+
$importPath = dirname($source).'/'.$match['path'];
|
196 |
+
|
197 |
+
// only replace the import with the content if we can grab the
|
198 |
+
// content of the file
|
199 |
+
if (!$this->canImportByPath($match['path']) || !$this->canImportFile($importPath)) {
|
200 |
+
continue;
|
201 |
+
}
|
202 |
+
|
203 |
+
// check if current file was not imported previously in the same
|
204 |
+
// import chain.
|
205 |
+
if (in_array($importPath, $parents)) {
|
206 |
+
throw new FileImportException('Failed to import file "'.$importPath.'": circular reference detected.');
|
207 |
+
}
|
208 |
+
|
209 |
+
// grab referenced file & optimize it (which may include importing
|
210 |
+
// yet other @import statements recursively)
|
211 |
+
$minifier = new static($importPath);
|
212 |
+
$minifier->setMaxImportSize($this->maxImportSize);
|
213 |
+
$minifier->setImportExtensions($this->importExtensions);
|
214 |
+
$importContent = $minifier->execute($source, $parents);
|
215 |
+
|
216 |
+
// check if this is only valid for certain media
|
217 |
+
if (!empty($match['media'])) {
|
218 |
+
$importContent = '@media '.$match['media'].'{'.$importContent.'}';
|
219 |
+
}
|
220 |
+
|
221 |
+
// add to replacement array
|
222 |
+
$search[] = $match[0];
|
223 |
+
$replace[] = $importContent;
|
224 |
+
}
|
225 |
+
|
226 |
+
// replace the import statements
|
227 |
+
return str_replace($search, $replace, $content);
|
228 |
+
}
|
229 |
+
|
230 |
+
/**
|
231 |
+
* @param $css
|
232 |
+
*
|
233 |
+
* @return mixed
|
234 |
+
*/
|
235 |
+
protected function alterImportsBetweenComments($css)
|
236 |
+
{
|
237 |
+
preg_match_all('~/\*.*?@import(.*?)\*/~', $css, $commentsMatches);
|
238 |
+
|
239 |
+
if (isset($commentsMatches[0]) && ! empty($commentsMatches[0])) {
|
240 |
+
foreach ($commentsMatches[0] as $commentMatch) {
|
241 |
+
$newComment = str_replace('@import', '(wpacu)(at)import', $commentMatch);
|
242 |
+
$css = str_replace($commentMatch, $newComment, $css);
|
243 |
+
}
|
244 |
+
}
|
245 |
+
|
246 |
+
return $css;
|
247 |
+
}
|
248 |
+
|
249 |
+
|
250 |
+
/**
|
251 |
+
* Import files into the CSS, base64-ized.
|
252 |
+
*
|
253 |
+
* @url(image.jpg) images will be loaded and their content merged into the
|
254 |
+
* original file, to save HTTP requests.
|
255 |
+
*
|
256 |
+
* @param string $source The file to import files for
|
257 |
+
* @param string $content The CSS content to import files for
|
258 |
+
*
|
259 |
+
* @return string
|
260 |
+
*/
|
261 |
+
protected function importFiles($source, $content)
|
262 |
+
{
|
263 |
+
$regex = '/url\((["\']?)(.+?)\\1\)/i';
|
264 |
+
if ($this->importExtensions && preg_match_all($regex, $content, $matches, PREG_SET_ORDER)) {
|
265 |
+
$search = array();
|
266 |
+
$replace = array();
|
267 |
+
|
268 |
+
// loop the matches
|
269 |
+
foreach ($matches as $match) {
|
270 |
+
$extension = substr(strrchr($match[2], '.'), 1);
|
271 |
+
if ($extension && !array_key_exists($extension, $this->importExtensions)) {
|
272 |
+
continue;
|
273 |
+
}
|
274 |
+
|
275 |
+
// get the path for the file that will be imported
|
276 |
+
$path = $match[2];
|
277 |
+
$path = dirname($source).'/'.$path;
|
278 |
+
|
279 |
+
// only replace the import with the content if we're able to get
|
280 |
+
// the content of the file, and it's relatively small
|
281 |
+
if ($this->canImportFile($path) && $this->canImportBySize($path)) {
|
282 |
+
// grab content && base64-ize
|
283 |
+
$importContent = $this->load($path);
|
284 |
+
$importContent = base64_encode($importContent);
|
285 |
+
|
286 |
+
// build replacement
|
287 |
+
$search[] = $match[0];
|
288 |
+
$replace[] = 'url('.$this->importExtensions[$extension].';base64,'.$importContent.')';
|
289 |
+
}
|
290 |
+
}
|
291 |
+
|
292 |
+
// replace the import statements
|
293 |
+
$content = str_replace($search, $replace, $content);
|
294 |
+
}
|
295 |
+
|
296 |
+
return $content;
|
297 |
+
}
|
298 |
+
|
299 |
+
/**
|
300 |
+
* Perform CSS optimizations.
|
301 |
+
*
|
302 |
+
* @param string[optional] $path Path to write the data to
|
303 |
+
* @param string[] $parents Parent paths, for circular reference checks
|
304 |
+
*
|
305 |
+
* @return string The minified data
|
306 |
+
*/
|
307 |
+
public function execute($path = null, $parents = array())
|
308 |
+
{
|
309 |
+
$content = '';
|
310 |
+
|
311 |
+
// loop CSS data (raw data and files)
|
312 |
+
foreach ($this->data as $source => $css) {
|
313 |
+
// Some developers might have wrapped @import between comments
|
314 |
+
// No import for those ones
|
315 |
+
$css = $this->alterImportsBetweenComments($css);
|
316 |
+
|
317 |
+
$source = is_int($source) ? '' : $source;
|
318 |
+
$parents = $source ? array_merge($parents, array($source)) : $parents;
|
319 |
+
$css = $this->combineImports($source, $css, $parents);
|
320 |
+
$css = $this->importFiles($source, $css);
|
321 |
+
|
322 |
+
/*
|
323 |
+
* If we'll save to a new path, we'll have to fix the relative paths
|
324 |
+
* to be relative no longer to the source file, but to the new path.
|
325 |
+
* If we don't write to a file, fall back to same path so no
|
326 |
+
* conversion happens (because we still want it to go through most
|
327 |
+
* of the move code, which also addresses url() & @import syntax...)
|
328 |
+
*/
|
329 |
+
$converter = $this->getPathConverter($source, $path ?: $source);
|
330 |
+
$css = $this->move($converter, $css);
|
331 |
+
|
332 |
+
// combine css
|
333 |
+
$content .= $css;
|
334 |
+
}
|
335 |
+
|
336 |
+
$content = $this->moveImportsToTop($content);
|
337 |
+
|
338 |
+
return $content;
|
339 |
+
}
|
340 |
+
|
341 |
+
/**
|
342 |
+
* Moving a css file should update all relative urls.
|
343 |
+
* Relative references (e.g. ../images/image.gif) in a certain css file,
|
344 |
+
* will have to be updated when a file is being saved at another location
|
345 |
+
* (e.g. ../../images/image.gif, if the new CSS file is 1 folder deeper).
|
346 |
+
*
|
347 |
+
* @param ConverterInterface $converter Relative path converter
|
348 |
+
* @param string $content The CSS content to update relative urls for
|
349 |
+
*
|
350 |
+
* @return string
|
351 |
+
*/
|
352 |
+
protected function move(ConverterInterface $converter, $content)
|
353 |
+
{
|
354 |
+
/*
|
355 |
+
* Relative path references will usually be enclosed by url(). @import
|
356 |
+
* is an exception, where url() is not necessary around the path (but is
|
357 |
+
* allowed).
|
358 |
+
* This *could* be 1 regular expression, where both regular expressions
|
359 |
+
* in this array are on different sides of a |. But we're using named
|
360 |
+
* patterns in both regexes, the same name on both regexes. This is only
|
361 |
+
* possible with a (?J) modifier, but that only works after a fairly
|
362 |
+
* recent PCRE version. That's why I'm doing 2 separate regular
|
363 |
+
* expressions & combining the matches after executing of both.
|
364 |
+
*/
|
365 |
+
$relativeRegexes = array(
|
366 |
+
// url(xxx)
|
367 |
+
'/
|
368 |
+
# open url()
|
369 |
+
url\(
|
370 |
+
|
371 |
+
\s*
|
372 |
+
|
373 |
+
# open path enclosure
|
374 |
+
(?P<quotes>["\'])?
|
375 |
+
|
376 |
+
# fetch path
|
377 |
+
(?P<path>.+?)
|
378 |
+
|
379 |
+
# close path enclosure
|
380 |
+
(?(quotes)(?P=quotes))
|
381 |
+
|
382 |
+
\s*
|
383 |
+
|
384 |
+
# close url()
|
385 |
+
\)
|
386 |
+
|
387 |
+
/ix',
|
388 |
+
|
389 |
+
// @import "xxx"
|
390 |
+
'/
|
391 |
+
# import statement
|
392 |
+
@import
|
393 |
+
|
394 |
+
# whitespace
|
395 |
+
\s+
|
396 |
+
|
397 |
+
# we don\'t have to check for @import url(), because the
|
398 |
+
# condition above will already catch these
|
399 |
+
|
400 |
+
# open path enclosure
|
401 |
+
(?P<quotes>["\'])
|
402 |
+
|
403 |
+
# fetch path
|
404 |
+
(?P<path>.+?)
|
405 |
+
|
406 |
+
# close path enclosure
|
407 |
+
(?P=quotes)
|
408 |
+
|
409 |
+
/ix',
|
410 |
+
);
|
411 |
+
|
412 |
+
// find all relative urls in css
|
413 |
+
$matches = array();
|
414 |
+
foreach ($relativeRegexes as $relativeRegex) {
|
415 |
+
if (preg_match_all($relativeRegex, $content, $regexMatches, PREG_SET_ORDER)) {
|
416 |
+
$matches = array_merge($matches, $regexMatches);
|
417 |
+
}
|
418 |
+
}
|
419 |
+
|
420 |
+
$search = array();
|
421 |
+
$replace = array();
|
422 |
+
|
423 |
+
// loop all urls
|
424 |
+
foreach ($matches as $match) {
|
425 |
+
// determine if it's a url() or an @import match
|
426 |
+
$type = (strpos($match[0], '@import') === 0 ? 'import' : 'url');
|
427 |
+
|
428 |
+
$url = $match['path'];
|
429 |
+
if ($this->canImportByPath($url)) {
|
430 |
+
// attempting to interpret GET-params makes no sense, so let's discard them for awhile
|
431 |
+
$params = strrchr($url, '?');
|
432 |
+
$url = $params ? substr($url, 0, -strlen($params)) : $url;
|
433 |
+
|
434 |
+
// fix relative url
|
435 |
+
$url = $converter->convert($url);
|
436 |
+
|
437 |
+
// now that the path has been converted, re-apply GET-params
|
438 |
+
$url .= $params;
|
439 |
+
}
|
440 |
+
|
441 |
+
/*
|
442 |
+
* Urls with control characters above 0x7e should be quoted.
|
443 |
+
* According to Mozilla's parser, whitespace is only allowed at the
|
444 |
+
* end of unquoted urls.
|
445 |
+
* Urls with `)` (as could happen with data: uris) should also be
|
446 |
+
* quoted to avoid being confused for the url() closing parentheses.
|
447 |
+
* And urls with a # have also been reported to cause issues.
|
448 |
+
* Urls with quotes inside should also remain escaped.
|
449 |
+
*
|
450 |
+
* @see https://developer.mozilla.org/nl/docs/Web/CSS/url#The_url()_functional_notation
|
451 |
+
* @see https://hg.mozilla.org/mozilla-central/rev/14abca4e7378
|
452 |
+
* @see https://github.com/matthiasmullie/minify/issues/193
|
453 |
+
*/
|
454 |
+
$url = trim($url);
|
455 |
+
if (preg_match('/[\s\)\'"#\x{7f}-\x{9f}]/u', $url)) {
|
456 |
+
$url = $match['quotes'] . $url . $match['quotes'];
|
457 |
+
}
|
458 |
+
|
459 |
+
// build replacement
|
460 |
+
$search[] = $match[0];
|
461 |
+
if ($type === 'url') {
|
462 |
+
$replace[] = 'url('.$url.')';
|
463 |
+
} elseif ($type === 'import') {
|
464 |
+
$replace[] = '@import "'.$url.'"';
|
465 |
+
}
|
466 |
+
}
|
467 |
+
|
468 |
+
// replace urls
|
469 |
+
return str_replace($search, $replace, $content);
|
470 |
+
}
|
471 |
+
|
472 |
+
/**
|
473 |
+
* Check if file is small enough to be imported.
|
474 |
+
*
|
475 |
+
* @param string $path The path to the file
|
476 |
+
*
|
477 |
+
* @return bool
|
478 |
+
*/
|
479 |
+
protected function canImportBySize($path)
|
480 |
+
{
|
481 |
+
return ($size = @filesize($path)) && $size <= $this->maxImportSize * 1024;
|
482 |
+
}
|
483 |
+
|
484 |
+
/**
|
485 |
+
* Check if file a file can be imported, going by the path.
|
486 |
+
*
|
487 |
+
* @param string $path
|
488 |
+
*
|
489 |
+
* @return bool
|
490 |
+
*/
|
491 |
+
protected function canImportByPath($path)
|
492 |
+
{
|
493 |
+
return preg_match('/^(data:|https?:|\\/)/', $path) === 0;
|
494 |
+
}
|
495 |
+
|
496 |
+
/**
|
497 |
+
* Return a converter to update relative paths to be relative to the new
|
498 |
+
* destination.
|
499 |
+
*
|
500 |
+
* @param string $source
|
501 |
+
* @param string $target
|
502 |
+
*
|
503 |
+
* @return ConverterInterface
|
504 |
+
*/
|
505 |
+
protected function getPathConverter($source, $target)
|
506 |
+
{
|
507 |
+
return new Converter($source, $target);
|
508 |
+
}
|
509 |
+
}
|
classes/OptimiseAssets/FontsGoogle.php
CHANGED
@@ -25,7 +25,7 @@ class FontsGoogle
|
|
25 |
*/
|
26 |
public function init()
|
27 |
{
|
28 |
-
add_filter('wp_resource_hints', array($this, 'resourceHints'),
|
29 |
add_action('wp_head', array($this, 'preloadFontFiles'), 1);
|
30 |
|
31 |
add_action('init', function() {
|
@@ -37,8 +37,6 @@ class FontsGoogle
|
|
37 |
|
38 |
add_filter('style_loader_src', array($this, 'alterGoogleFontLink'));
|
39 |
}, 20);
|
40 |
-
|
41 |
-
add_action('wp_loaded', array($this, 'alterHtmlSource'), PHP_INT_MAX);
|
42 |
}
|
43 |
|
44 |
/**
|
@@ -55,7 +53,19 @@ class FontsGoogle
|
|
55 |
return $urls;
|
56 |
}
|
57 |
|
58 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
59 |
$urls[] = array(
|
60 |
'href' => 'https://fonts.gstatic.com/',
|
61 |
'crossorigin'
|
@@ -109,100 +119,111 @@ class FontsGoogle
|
|
109 |
}
|
110 |
|
111 |
/**
|
|
|
112 |
*
|
|
|
113 |
*/
|
114 |
-
public function alterHtmlSource()
|
115 |
{
|
116 |
// don't apply any changes if not in the front-end view (e.g. Dashboard view)
|
117 |
// or test mode is enabled and a guest user is accessing the page
|
118 |
if (Main::instance()->preventAssetsSettings()) {
|
119 |
-
return;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
120 |
}
|
121 |
|
122 |
-
|
123 |
-
|
124 |
-
|
125 |
-
$altHtmlSource = preg_replace('/<!--(.|\s)*?-->/', '', $altHtmlSource);
|
126 |
|
127 |
-
|
128 |
-
|
129 |
-
|
130 |
-
}
|
131 |
|
132 |
-
|
133 |
-
|
|
|
|
|
134 |
|
135 |
-
|
|
|
136 |
|
137 |
-
|
138 |
-
if (isset($matchesFromLinkTags[0]) && ! empty($matchesFromLinkTags[0])) {
|
139 |
-
$finalCombinableLinks = $preloadedLinks = array();
|
140 |
|
141 |
-
|
142 |
-
|
|
|
143 |
|
144 |
-
|
145 |
-
|
146 |
-
|| (strpos($linkTag, '"') !== false && (substr_count($linkTag, '"') % 2))
|
147 |
-
|| (trim(strip_tags($linkTag)) !== '')) {
|
148 |
-
continue;
|
149 |
-
}
|
150 |
|
151 |
-
|
152 |
-
|
|
|
|
|
|
|
|
|
153 |
|
154 |
-
|
155 |
-
|
156 |
-
parse_str($urlParse, $qStr);
|
157 |
|
158 |
-
|
159 |
-
|
160 |
-
|
161 |
-
}
|
162 |
-
// [END] Remove invalid requests with no font family
|
163 |
|
164 |
-
|
165 |
-
|
166 |
-
|
|
|
|
|
167 |
|
168 |
-
|
169 |
-
|
|
|
170 |
|
171 |
-
|
172 |
-
|
173 |
-
}
|
174 |
-
}
|
175 |
|
176 |
-
|
177 |
-
|
178 |
-
$preloadedLinks[] = $finalLinkHref;
|
179 |
}
|
|
|
180 |
|
181 |
-
|
|
|
|
|
182 |
}
|
183 |
|
184 |
-
$
|
|
|
185 |
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
|
190 |
-
|
191 |
-
|
|
|
192 |
}
|
193 |
}
|
|
|
194 |
|
195 |
-
|
196 |
-
|
197 |
-
|
198 |
-
|
199 |
-
}
|
200 |
}
|
|
|
201 |
|
202 |
-
|
203 |
|
204 |
-
|
205 |
-
});
|
206 |
}
|
207 |
|
208 |
/**
|
25 |
*/
|
26 |
public function init()
|
27 |
{
|
28 |
+
add_filter('wp_resource_hints', array($this, 'resourceHints'), PHP_INT_MAX, 2);
|
29 |
add_action('wp_head', array($this, 'preloadFontFiles'), 1);
|
30 |
|
31 |
add_action('init', function() {
|
37 |
|
38 |
add_filter('style_loader_src', array($this, 'alterGoogleFontLink'));
|
39 |
}, 20);
|
|
|
|
|
40 |
}
|
41 |
|
42 |
/**
|
53 |
return $urls;
|
54 |
}
|
55 |
|
56 |
+
// Are the Google Fonts removed? Do not add it and strip any existing ones
|
57 |
+
if (! empty($urls) && Main::instance()->settings['google_fonts_remove']) {
|
58 |
+
foreach ($urls as $urlKey => $urlValue) {
|
59 |
+
if ((stripos($urlValue, 'fonts.googleapis.com') !== false) || (stripos($urlValue, 'fonts.gstatic.com') !== false)) {
|
60 |
+
unset($urls[$urlKey]);
|
61 |
+
}
|
62 |
+
}
|
63 |
+
|
64 |
+
return $urls; // Finally, return the list after any removals
|
65 |
+
}
|
66 |
+
|
67 |
+
// "Remove Google Fonts" has to be turned off
|
68 |
+
if ('preconnect' === $relationType && ! Main::instance()->settings['google_fonts_remove'] && Main::instance()->settings['google_fonts_preconnect']) {
|
69 |
$urls[] = array(
|
70 |
'href' => 'https://fonts.gstatic.com/',
|
71 |
'crossorigin'
|
119 |
}
|
120 |
|
121 |
/**
|
122 |
+
* @param $htmlSource
|
123 |
*
|
124 |
+
* @return false|mixed|string|void
|
125 |
*/
|
126 |
+
public static function alterHtmlSource($htmlSource)
|
127 |
{
|
128 |
// don't apply any changes if not in the front-end view (e.g. Dashboard view)
|
129 |
// or test mode is enabled and a guest user is accessing the page
|
130 |
if (Main::instance()->preventAssetsSettings()) {
|
131 |
+
return $htmlSource;
|
132 |
+
}
|
133 |
+
|
134 |
+
/*
|
135 |
+
* Remove Google Fonts and stop here as optimization is no longer relevant
|
136 |
+
*/
|
137 |
+
if (Main::instance()->settings['google_fonts_remove']) {
|
138 |
+
return FontsGoogleRemove::cleanHtmlSource($htmlSource);
|
139 |
}
|
140 |
|
141 |
+
/*
|
142 |
+
* Optimize Google Fonts
|
143 |
+
*/
|
|
|
144 |
|
145 |
+
// Cleaner HTML Source
|
146 |
+
$altHtmlSource = preg_replace('@<(script|style|noscript)[^>]*?>.*?</\\1>@si', '', $htmlSource);
|
147 |
+
$altHtmlSource = preg_replace('/<!--(.|\s)*?-->/', '', $altHtmlSource);
|
|
|
148 |
|
149 |
+
// Do not continue if there is no single reference to the string we look for in the clean HTML source
|
150 |
+
if (stripos($altHtmlSource, self::$containsStr) === false) {
|
151 |
+
return $htmlSource;
|
152 |
+
}
|
153 |
|
154 |
+
// Get all valid LINKs that have the $string within them
|
155 |
+
$strContainsFormat = preg_quote(self::$containsStr, '/');
|
156 |
|
157 |
+
preg_match_all('#<link[^>]*' . $strContainsFormat . '.*(>)#Usmi', $altHtmlSource, $matchesFromLinkTags, PREG_SET_ORDER);
|
|
|
|
|
158 |
|
159 |
+
// Needs to match at least one to carry on with the replacements
|
160 |
+
if (isset($matchesFromLinkTags[0]) && ! empty($matchesFromLinkTags[0])) {
|
161 |
+
$finalCombinableLinks = $preloadedLinks = array();
|
162 |
|
163 |
+
foreach ($matchesFromLinkTags as $linkIndex => $linkTagArray) {
|
164 |
+
$linkTag = $finalLinkTag = trim(trim($linkTagArray[0], '"\''));
|
|
|
|
|
|
|
|
|
165 |
|
166 |
+
// Extra checks to make sure it's a valid LINK tag
|
167 |
+
if ( (strpos($linkTag, "'") !== false && (substr_count($linkTag, "'") % 2))
|
168 |
+
|| (strpos($linkTag, '"') !== false && (substr_count($linkTag, '"') % 2))
|
169 |
+
|| (trim(strip_tags($linkTag)) !== '')) {
|
170 |
+
continue;
|
171 |
+
}
|
172 |
|
173 |
+
preg_match_all('#href=(["\'])' . '(.*)' . '(["\'])#Usmi', $linkTag, $outputMatches);
|
174 |
+
$linkHrefOriginal = $finalLinkHref = trim($outputMatches[2][0], '"\'');
|
|
|
175 |
|
176 |
+
// [START] Remove invalid requests with no font family
|
177 |
+
$urlParse = parse_url(str_replace('&', '&', $linkHrefOriginal), PHP_URL_QUERY);
|
178 |
+
parse_str($urlParse, $qStr);
|
|
|
|
|
179 |
|
180 |
+
if (isset($qStr['family']) && ! $qStr['family']) {
|
181 |
+
$htmlSource = str_replace($linkTag, '', $htmlSource);
|
182 |
+
continue;
|
183 |
+
}
|
184 |
+
// [END] Remove invalid requests with no font family
|
185 |
|
186 |
+
// If anything is set apart from '[none set]', proceed
|
187 |
+
if (Main::instance()->settings['google_fonts_display']) {
|
188 |
+
$newLinkHref = $finalLinkHref = self::alterGoogleFontLink($linkHrefOriginal);
|
189 |
|
190 |
+
if ($newLinkHref !== $linkHrefOriginal) {
|
191 |
+
$finalLinkTag = str_replace($linkHrefOriginal, $newLinkHref, $linkTag);
|
|
|
|
|
192 |
|
193 |
+
// Finally, alter the HTML source
|
194 |
+
$htmlSource = str_replace($linkTag, $finalLinkTag, $htmlSource);
|
|
|
195 |
}
|
196 |
+
}
|
197 |
|
198 |
+
if (preg_match('/rel=(["\'])preload(["\'])/i', $finalLinkTag)
|
199 |
+
|| strpos($finalLinkTag, 'data-wpacu-to-be-preloaded-basic')) {
|
200 |
+
$preloadedLinks[] = $finalLinkHref;
|
201 |
}
|
202 |
|
203 |
+
$finalCombinableLinks[] = array('href' => $finalLinkHref, 'tag' => $finalLinkTag);
|
204 |
+
}
|
205 |
|
206 |
+
$preloadedLinks = array_unique($preloadedLinks);
|
207 |
+
|
208 |
+
// Remove data for preloaded LINKs
|
209 |
+
if (! empty($preloadedLinks)) {
|
210 |
+
foreach ($finalCombinableLinks as $fclIndex => $combinableLinkData) {
|
211 |
+
if (in_array($combinableLinkData['href'], $preloadedLinks)) {
|
212 |
+
unset($finalCombinableLinks[$fclIndex]);
|
213 |
}
|
214 |
}
|
215 |
+
}
|
216 |
|
217 |
+
// Only proceed with the optimization/combine if there's obviously at least 2 combinable URL requests to Google Fonts
|
218 |
+
// OR the loading type is different than render-blocking
|
219 |
+
if (Main::instance()->settings['google_fonts_combine'] && (Main::instance()->settings['google_fonts_combine_type'] || count($finalCombinableLinks) > 1)) {
|
220 |
+
$htmlSource = self::combineGoogleFontLinks($finalCombinableLinks, $htmlSource);
|
|
|
221 |
}
|
222 |
+
}
|
223 |
|
224 |
+
$htmlSource = self::alterGoogleFontUrlFromInlineStyleTags($htmlSource);
|
225 |
|
226 |
+
return $htmlSource;
|
|
|
227 |
}
|
228 |
|
229 |
/**
|
classes/OptimiseAssets/FontsGoogleRemove.php
ADDED
@@ -0,0 +1,161 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
namespace WpAssetCleanUp\OptimiseAssets;
|
3 |
+
|
4 |
+
/**
|
5 |
+
* Class FontsGoogle
|
6 |
+
* @package WpAssetCleanUp\OptimiseAssets
|
7 |
+
*/
|
8 |
+
class FontsGoogleRemove
|
9 |
+
{
|
10 |
+
/**
|
11 |
+
* @var array
|
12 |
+
*/
|
13 |
+
public static $stringsToCheck = array(
|
14 |
+
'//fonts.googleapis.com',
|
15 |
+
'//fonts.gstatic.com'
|
16 |
+
);
|
17 |
+
|
18 |
+
/**
|
19 |
+
* Called late from OptimizeCss after all other optimizations are done (e.g. minify, combine)
|
20 |
+
*
|
21 |
+
* @param $htmlSource
|
22 |
+
*
|
23 |
+
* @return mixed
|
24 |
+
*/
|
25 |
+
public static function cleanHtmlSource($htmlSource)
|
26 |
+
{
|
27 |
+
$htmlSource = self::cleanLinkTags($htmlSource);
|
28 |
+
$htmlSource = self::cleanFromInlineStyleTags($htmlSource);
|
29 |
+
|
30 |
+
return $htmlSource;
|
31 |
+
}
|
32 |
+
|
33 |
+
/**
|
34 |
+
* @param $htmlSource
|
35 |
+
*
|
36 |
+
* @return mixed
|
37 |
+
*/
|
38 |
+
public static function cleanLinkTags($htmlSource)
|
39 |
+
{
|
40 |
+
// Cleaner HTML Source
|
41 |
+
$altHtmlSource = preg_replace('@<(script|style)[^>]*?>.*?</\\1>@si', '', $htmlSource);
|
42 |
+
$altHtmlSource = preg_replace('/<!--(.|\s)*?-->/', '', $altHtmlSource);
|
43 |
+
|
44 |
+
// Do not continue if there is no single reference to the string we look for in the clean HTML source
|
45 |
+
if (stripos($altHtmlSource, FontsGoogle::$containsStr) === false) {
|
46 |
+
return $htmlSource;
|
47 |
+
}
|
48 |
+
|
49 |
+
// Get all valid LINKs that have the self::$stringsToCheck within them
|
50 |
+
$strContainsArray = array_map(static function($containsStr) {
|
51 |
+
return preg_quote($containsStr, '/');
|
52 |
+
}, self::$stringsToCheck);
|
53 |
+
|
54 |
+
$strContainsFormat = implode('|', $strContainsArray);
|
55 |
+
|
56 |
+
preg_match_all('#<link[^>]*(' . $strContainsFormat . ').*(>)#Usmi', $altHtmlSource, $matchesFromLinkTags, PREG_SET_ORDER);
|
57 |
+
|
58 |
+
// Needs to match at least one to carry on with the replacements
|
59 |
+
if (isset($matchesFromLinkTags[0]) && ! empty($matchesFromLinkTags[0])) {
|
60 |
+
foreach ($matchesFromLinkTags as $linkIndex => $linkTagArray) {
|
61 |
+
$linkTag = trim(trim($linkTagArray[0], '"\''));
|
62 |
+
$htmlSource = str_ireplace(array($linkTag."\n", $linkTag), '', $htmlSource);
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
+
return $htmlSource;
|
67 |
+
}
|
68 |
+
|
69 |
+
/**
|
70 |
+
* @param $htmlSource
|
71 |
+
*
|
72 |
+
* @return mixed
|
73 |
+
*/
|
74 |
+
public static function cleanFromInlineStyleTags($htmlSource)
|
75 |
+
{
|
76 |
+
if (! preg_match('/(;?)(@import (?<url>url\(|\()?(?P<quotes>["\'()]?).+?(?P=quotes)(?(url)\)));?/', $htmlSource)) {
|
77 |
+
return $htmlSource;
|
78 |
+
}
|
79 |
+
|
80 |
+
preg_match_all('#<\s*?style\b[^>]*>(.*?)</style\b[^>]*>#s', $htmlSource, $styleMatches, PREG_SET_ORDER);
|
81 |
+
|
82 |
+
if (empty($styleMatches)) {
|
83 |
+
return $htmlSource;
|
84 |
+
}
|
85 |
+
|
86 |
+
// Go through each STYLE tag
|
87 |
+
foreach ($styleMatches as $styleInlineArray) {
|
88 |
+
list($styleInlineTag, $styleInlineContent) = $styleInlineArray;
|
89 |
+
|
90 |
+
$newStyleInlineTag = $styleInlineTag;
|
91 |
+
$newStyleInlineContent = $styleInlineContent;
|
92 |
+
|
93 |
+
// Is the content relevant?
|
94 |
+
preg_match_all('/(;?)(@import (?<url>url\(|\()?(?P<quotes>["\'()]?).+?(?P=quotes)(?(url)\)));?/', $styleInlineContent, $matches);
|
95 |
+
|
96 |
+
if (isset($matches[0]) && ! empty($matches[0])) {
|
97 |
+
foreach ($matches[0] as $matchedImport) {
|
98 |
+
$newStyleInlineContent = str_replace($matchedImport, '', $newStyleInlineContent);
|
99 |
+
}
|
100 |
+
|
101 |
+
$newStyleInlineContent = trim($newStyleInlineContent);
|
102 |
+
|
103 |
+
// Is the STYLE tag empty after the @imports are removed? It happens on some websites; strip the tag, no point of having it empty
|
104 |
+
if ($newStyleInlineContent === '') {
|
105 |
+
$htmlSource = str_replace($styleInlineTag, '', $htmlSource);
|
106 |
+
} else {
|
107 |
+
$newStyleInlineTag = str_replace($styleInlineContent, $newStyleInlineContent, $styleInlineTag);
|
108 |
+
$htmlSource = str_replace($styleInlineTag, $newStyleInlineTag, $htmlSource);
|
109 |
+
}
|
110 |
+
}
|
111 |
+
|
112 |
+
$styleTagAfterImportsCleaned = $newStyleInlineTag;
|
113 |
+
$styleTagAfterFontFaceCleaned = trim(self::cleanFontFaceReferences($newStyleInlineContent));
|
114 |
+
$newStyleInlineTag = str_replace($newStyleInlineContent, $styleTagAfterFontFaceCleaned, $newStyleInlineTag);
|
115 |
+
|
116 |
+
$htmlSource = str_replace($styleTagAfterImportsCleaned, $newStyleInlineTag, $htmlSource);
|
117 |
+
}
|
118 |
+
|
119 |
+
return $htmlSource;
|
120 |
+
}
|
121 |
+
|
122 |
+
/**
|
123 |
+
* @param $importsAddToTop
|
124 |
+
*
|
125 |
+
* @return mixed
|
126 |
+
*/
|
127 |
+
public static function stripGoogleApisImport($importsAddToTop)
|
128 |
+
{
|
129 |
+
// Remove any Google Fonts imports
|
130 |
+
foreach ($importsAddToTop as $importKey => $importToPrepend) {
|
131 |
+
if (stripos($importToPrepend, '//fonts.googleapis.com/') !== false) {
|
132 |
+
unset($importsAddToTop[$importKey]);
|
133 |
+
}
|
134 |
+
}
|
135 |
+
|
136 |
+
return $importsAddToTop;
|
137 |
+
}
|
138 |
+
|
139 |
+
/**
|
140 |
+
* @param $cssContent
|
141 |
+
*
|
142 |
+
* @return mixed
|
143 |
+
*/
|
144 |
+
public static function cleanFontFaceReferences($cssContent)
|
145 |
+
{
|
146 |
+
preg_match_all('#@font-face(|\s+){(.*?)}#si', $cssContent, $matchesFromCssCode, PREG_SET_ORDER);
|
147 |
+
|
148 |
+
if (! empty($matchesFromCssCode)) {
|
149 |
+
foreach ($matchesFromCssCode as $matches) {
|
150 |
+
$fontFaceSyntax = $matches[0];
|
151 |
+
preg_match_all('/url(\s+|)\((?![\'"]?(?:data):)[\'"]?([^\'")]*)[\'"]?\)/i', $matches[0], $matchesFromUrlSyntax);
|
152 |
+
|
153 |
+
if (! empty($matchesFromUrlSyntax) && stripos(implode('', $matchesFromUrlSyntax[0]), '//fonts.gstatic.com/') !== false) {
|
154 |
+
$cssContent = str_replace($fontFaceSyntax, '', $cssContent);
|
155 |
+
}
|
156 |
+
}
|
157 |
+
}
|
158 |
+
|
159 |
+
return $cssContent;
|
160 |
+
}
|
161 |
+
}
|
classes/OptimiseAssets/MinifyCss.php
CHANGED
@@ -106,7 +106,8 @@ class MinifyCss
|
|
106 |
|
107 |
// Files within /wp-content/uploads/ or /wp-content/cache/
|
108 |
// Could belong to plugins such as "Elementor, "Oxygen" etc.
|
109 |
-
'#/wp-content/uploads/(.*?).css#',
|
|
|
110 |
'#/wp-content/cache/(.*?).css#'
|
111 |
|
112 |
);
|
106 |
|
107 |
// Files within /wp-content/uploads/ or /wp-content/cache/
|
108 |
// Could belong to plugins such as "Elementor, "Oxygen" etc.
|
109 |
+
'#/wp-content/uploads/elementor/(.*?).css#',
|
110 |
+
'#/wp-content/uploads/oxygen/(.*?).css#',
|
111 |
'#/wp-content/cache/(.*?).css#'
|
112 |
|
113 |
);
|
classes/OptimiseAssets/OptimizeCommon.php
CHANGED
@@ -1,8 +1,10 @@
|
|
1 |
<?php
|
2 |
namespace WpAssetCleanUp\OptimiseAssets;
|
3 |
|
|
|
4 |
use WpAssetCleanUp\FileSystem;
|
5 |
use WpAssetCleanUp\Main;
|
|
|
6 |
use WpAssetCleanUp\Misc;
|
7 |
use WpAssetCleanUp\Plugin;
|
8 |
use WpAssetCleanUp\Tools;
|
@@ -34,7 +36,7 @@ class OptimizeCommon
|
|
34 |
// Is WP Rocket's page cache cleared? Clear Asset CleanUp's CSS cache files too
|
35 |
if (array_key_exists('action', $_GET) && $_GET['action'] === 'purge_cache') {
|
36 |
// Leave its default parameters, no redirect needed
|
37 |
-
add_action('init', function() {
|
38 |
OptimizeCommon::clearAllCache();
|
39 |
}, PHP_INT_MAX);
|
40 |
}
|
@@ -42,6 +44,38 @@ class OptimizeCommon
|
|
42 |
add_action('admin_post_assetcleanup_clear_assets_cache', function() {
|
43 |
self::clearAllCache(true);
|
44 |
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
45 |
}
|
46 |
|
47 |
/**
|
@@ -170,6 +204,35 @@ class OptimizeCommon
|
|
170 |
return $pathToAssetDir;
|
171 |
}
|
172 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
173 |
/**
|
174 |
* @param $href
|
175 |
*
|
@@ -503,7 +566,9 @@ SQL;
|
|
503 |
}
|
504 |
}
|
505 |
|
506 |
-
//
|
|
|
|
|
507 |
@rmdir(WP_CONTENT_DIR . OptimizeCss::getRelPathCssCacheDir().'min');
|
508 |
@rmdir(WP_CONTENT_DIR . OptimizeJs::getRelPathJsCacheDir().'min');
|
509 |
@rmdir(WP_CONTENT_DIR . OptimizeCss::getRelPathCssCacheDir().'one');
|
1 |
<?php
|
2 |
namespace WpAssetCleanUp\OptimiseAssets;
|
3 |
|
4 |
+
use WpAssetCleanUp\CleanUp;
|
5 |
use WpAssetCleanUp\FileSystem;
|
6 |
use WpAssetCleanUp\Main;
|
7 |
+
use WpAssetCleanUp\Menu;
|
8 |
use WpAssetCleanUp\Misc;
|
9 |
use WpAssetCleanUp\Plugin;
|
10 |
use WpAssetCleanUp\Tools;
|
36 |
// Is WP Rocket's page cache cleared? Clear Asset CleanUp's CSS cache files too
|
37 |
if (array_key_exists('action', $_GET) && $_GET['action'] === 'purge_cache') {
|
38 |
// Leave its default parameters, no redirect needed
|
39 |
+
add_action('init', static function() {
|
40 |
OptimizeCommon::clearAllCache();
|
41 |
}, PHP_INT_MAX);
|
42 |
}
|
44 |
add_action('admin_post_assetcleanup_clear_assets_cache', function() {
|
45 |
self::clearAllCache(true);
|
46 |
});
|
47 |
+
|
48 |
+
add_action('wp_loaded', array($this, 'alterHtmlSource'), 1);
|
49 |
+
}
|
50 |
+
|
51 |
+
/**
|
52 |
+
*
|
53 |
+
*/
|
54 |
+
public function alterHtmlSource()
|
55 |
+
{
|
56 |
+
if (is_admin()) { // don't apply any changes if not in the front-end view (e.g. Dashboard view)
|
57 |
+
return;
|
58 |
+
}
|
59 |
+
|
60 |
+
ob_start(static function($htmlSource) {
|
61 |
+
// Do not do any optimization if "Test Mode" is Enabled
|
62 |
+
if (! Menu::userCanManageAssets() && Main::instance()->settings['test_mode']) {
|
63 |
+
return $htmlSource;
|
64 |
+
}
|
65 |
+
|
66 |
+
$htmlSource = OptimizeCss::alterHtmlSource($htmlSource);
|
67 |
+
$htmlSource = OptimizeJs::alterHtmlSource($htmlSource);
|
68 |
+
|
69 |
+
$htmlSource = Main::instance()->settings['remove_generator_tag'] ? CleanUp::removeMetaGenerators($htmlSource) : $htmlSource;
|
70 |
+
$htmlSource = Main::instance()->settings['remove_html_comments'] ? CleanUp::removeHtmlComments($htmlSource) : $htmlSource;
|
71 |
+
|
72 |
+
if (in_array(Main::instance()->settings['disable_xmlrpc'], array('disable_all', 'disable_pingback'))) {
|
73 |
+
// Also clean it up from the <head> in case it's hardcoded
|
74 |
+
$htmlSource = CleanUp::cleanPingbackLinkRel($htmlSource);
|
75 |
+
}
|
76 |
+
|
77 |
+
return $htmlSource;
|
78 |
+
});
|
79 |
}
|
80 |
|
81 |
/**
|
204 |
return $pathToAssetDir;
|
205 |
}
|
206 |
|
207 |
+
/**
|
208 |
+
* @param $sourceTag
|
209 |
+
* @param string $forAttr
|
210 |
+
*
|
211 |
+
* @return array|bool
|
212 |
+
*/
|
213 |
+
public static function getLocalCleanSourceFromTag($sourceTag, $forAttr)
|
214 |
+
{
|
215 |
+
preg_match_all('#'.$forAttr.'=(["\'])' . '(.*)' . '(["\'])#Usmi', $sourceTag, $outputMatchesSource);
|
216 |
+
|
217 |
+
$sourceFromTag = (isset($outputMatchesSource[2][0]) && $outputMatchesSource[2][0])
|
218 |
+
? trim($outputMatchesSource[2][0], '"\'')
|
219 |
+
: false;
|
220 |
+
|
221 |
+
if ($sourceFromTag && stripos($sourceFromTag, site_url()) !== false) {
|
222 |
+
$cleanLinkHrefFromTag = trim($sourceFromTag, '?&');
|
223 |
+
|
224 |
+
$afterQuestionMark = WPACU_PLUGIN_VERSION;
|
225 |
+
|
226 |
+
if (strpos($sourceFromTag, '?') !== false) {
|
227 |
+
list($cleanLinkHrefFromTag, $afterQuestionMark) = explode('?', $sourceFromTag);
|
228 |
+
}
|
229 |
+
|
230 |
+
return array('source' => $cleanLinkHrefFromTag, 'after_question_mark' => $afterQuestionMark);
|
231 |
+
}
|
232 |
+
|
233 |
+
return false;
|
234 |
+
}
|
235 |
+
|
236 |
/**
|
237 |
* @param $href
|
238 |
*
|
566 |
}
|
567 |
}
|
568 |
|
569 |
+
//removeIf(develoment)
|
570 |
+
// Remove "min" and "one" directories (created with Pro Version < 1.1.3.8 | Lite Version < 1.3.3.7) if they are empty
|
571 |
+
//endRemoveIf(develoment)
|
572 |
@rmdir(WP_CONTENT_DIR . OptimizeCss::getRelPathCssCacheDir().'min');
|
573 |
@rmdir(WP_CONTENT_DIR . OptimizeJs::getRelPathJsCacheDir().'min');
|
574 |
@rmdir(WP_CONTENT_DIR . OptimizeCss::getRelPathCssCacheDir().'one');
|
classes/OptimiseAssets/OptimizeCss.php
CHANGED
@@ -26,7 +26,6 @@ class OptimizeCss
|
|
26 |
public function init()
|
27 |
{
|
28 |
add_action('wp_footer', array($this, 'prepareOptimizeList'), PHP_INT_MAX);
|
29 |
-
add_action('wp_loaded', array($this, 'alterHtmlSource'), 1);
|
30 |
}
|
31 |
|
32 |
/**
|
@@ -42,12 +41,32 @@ class OptimizeCss
|
|
42 |
return;
|
43 |
}
|
44 |
|
45 |
-
$cssOptimizeList = array();
|
46 |
-
|
47 |
// [Start] Collect for caching
|
48 |
$wpStylesDone = $wp_styles->done;
|
49 |
$wpStylesRegistered = $wp_styles->registered;
|
50 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
foreach ($wpStylesDone as $handle) {
|
52 |
if (! isset($wpStylesRegistered[$handle])) {
|
53 |
continue;
|
@@ -55,7 +74,7 @@ class OptimizeCss
|
|
55 |
|
56 |
$value = $wpStylesRegistered[$handle];
|
57 |
|
58 |
-
$optimizeValues =
|
59 |
|
60 |
if (! empty($optimizeValues)) {
|
61 |
$cssOptimizeList[] = $optimizeValues;
|
@@ -66,6 +85,7 @@ class OptimizeCss
|
|
66 |
return;
|
67 |
}
|
68 |
|
|
|
69 |
wp_cache_add('wpacu_css_optimize_list', $cssOptimizeList);
|
70 |
// [End] Collect for caching
|
71 |
}
|
@@ -75,7 +95,7 @@ class OptimizeCss
|
|
75 |
*
|
76 |
* @return mixed
|
77 |
*/
|
78 |
-
public function maybeOptimizeIt($value)
|
79 |
{
|
80 |
global $wp_version;
|
81 |
|
@@ -198,7 +218,7 @@ class OptimizeCss
|
|
198 |
|
199 |
$pathToAssetDir = OptimizeCommon::getPathToAssetDir($src);
|
200 |
|
201 |
-
$cssContent = FileSystem::file_get_contents($localAssetPath);
|
202 |
|
203 |
$sourceBeforeOptimization = str_replace(ABSPATH, '/', $localAssetPath);
|
204 |
}
|
@@ -214,14 +234,22 @@ class OptimizeCss
|
|
214 |
$cssContent = FontsGoogle::alterGoogleFontUrlFromCssContent($cssContent);
|
215 |
}
|
216 |
|
|
|
|
|
|
|
217 |
if ($doFileMinify) {
|
218 |
// Minify this file?
|
219 |
$cssContent = MinifyCss::applyMinification($cssContent) ?: $cssContent;
|
220 |
}
|
221 |
|
|
|
|
|
|
|
|
|
|
|
222 |
if ($isCssFile && trim($cssContentBefore) === trim($cssContent)) {
|
223 |
-
//
|
224 |
-
return
|
225 |
}
|
226 |
|
227 |
$cssContent = self::maybeFixCssContent($cssContent, $pathToAssetDir . '/'); // Path
|
@@ -277,76 +305,70 @@ class OptimizeCss
|
|
277 |
}
|
278 |
|
279 |
/**
|
|
|
280 |
*
|
|
|
281 |
*/
|
282 |
-
public function alterHtmlSource()
|
283 |
{
|
284 |
-
|
285 |
-
|
|
|
286 |
}
|
287 |
|
288 |
-
|
289 |
-
|
290 |
-
|
291 |
-
|
292 |
-
}
|
293 |
-
|
294 |
-
// There has to be at least one "<link", otherwise, it could be a feed request or something similar (not page, post, homepage etc.)
|
295 |
-
if (stripos($htmlSource, '<link') === false) {
|
296 |
-
return $htmlSource;
|
297 |
-
}
|
298 |
-
|
299 |
-
// Are there any assets unloaded where their "children" are ignored?
|
300 |
-
// Since they weren't dequeued the WP way (to avoid unloading the "children"), they will be stripped here
|
301 |
-
if (! Main::instance()->preventAssetsSettings()) {
|
302 |
-
$ignoreChild = Main::instance()->getIgnoreChildren();
|
303 |
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
}
|
308 |
}
|
309 |
}
|
|
|
310 |
|
311 |
-
|
312 |
-
|
313 |
-
|
314 |
|
315 |
-
|
316 |
-
|
317 |
|
318 |
-
|
319 |
-
|
320 |
-
|
321 |
|
322 |
-
|
323 |
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
|
329 |
-
|
330 |
-
|
331 |
-
|
332 |
-
}
|
333 |
}
|
|
|
334 |
|
335 |
-
|
336 |
-
|
337 |
-
|
338 |
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
|
343 |
-
|
344 |
-
|
345 |
-
|
346 |
-
|
347 |
|
348 |
-
|
349 |
-
|
|
|
|
|
350 |
}
|
351 |
|
352 |
/**
|
@@ -461,6 +483,7 @@ class OptimizeCss
|
|
461 |
public static function updateHtmlSourceOriginalToOptimizedCss($htmlSource)
|
462 |
{
|
463 |
$cssOptimizeList = wp_cache_get('wpacu_css_optimize_list');
|
|
|
464 |
|
465 |
if (empty($cssOptimizeList)) {
|
466 |
return $htmlSource;
|
@@ -480,7 +503,31 @@ class OptimizeCss
|
|
480 |
continue;
|
481 |
}
|
482 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
483 |
foreach ($cssOptimizeList as $listValues) {
|
|
|
|
|
484 |
// If the minified files are deleted (e.g. /wp-content/cache/ is cleared)
|
485 |
// do not replace the CSS file path to avoid breaking the website
|
486 |
if (! file_exists(rtrim(ABSPATH, '/') . $listValues[1])) {
|
@@ -599,6 +646,9 @@ class OptimizeCss
|
|
599 |
OptimizeCommon::getPathToAssetDir($linkHrefOriginal) . '/'
|
600 |
);
|
601 |
|
|
|
|
|
|
|
602 |
if ($minifyInlineTags) {
|
603 |
$cssContent = MinifyCss::applyMinification($cssContent);
|
604 |
}
|
@@ -610,6 +660,33 @@ class OptimizeCss
|
|
610 |
return $htmlSource;
|
611 |
}
|
612 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
613 |
/**
|
614 |
* @param string $returnType
|
615 |
*
|
26 |
public function init()
|
27 |
{
|
28 |
add_action('wp_footer', array($this, 'prepareOptimizeList'), PHP_INT_MAX);
|
|
|
29 |
}
|
30 |
|
31 |
/**
|
41 |
return;
|
42 |
}
|
43 |
|
|
|
|
|
44 |
// [Start] Collect for caching
|
45 |
$wpStylesDone = $wp_styles->done;
|
46 |
$wpStylesRegistered = $wp_styles->registered;
|
47 |
|
48 |
+
// Collect all enqueued clean (no query strings) HREFs to later compare them against any hardcoded CSS
|
49 |
+
$allEnqueuedCleanLinkHrefs = array();
|
50 |
+
|
51 |
+
foreach ($wpStylesDone as $styleHandle) {
|
52 |
+
if (isset(Main::instance()->wpAllStyles['registered'][$styleHandle]->src) && ($src = Main::instance()->wpAllStyles['registered'][$styleHandle]->src)) {
|
53 |
+
$localAssetPath = OptimizeCommon::getLocalAssetPath($src, 'css');
|
54 |
+
|
55 |
+
if (! $localAssetPath || ! file_exists($localAssetPath)) {
|
56 |
+
continue; // not a local file
|
57 |
+
}
|
58 |
+
|
59 |
+
ob_start();
|
60 |
+
$wp_styles->do_item($styleHandle);
|
61 |
+
$linkSourceTag = trim(ob_get_clean());
|
62 |
+
|
63 |
+
$cleanLinkHrefFromTagArray = OptimizeCommon::getLocalCleanSourceFromTag($linkSourceTag, 'href');
|
64 |
+
$allEnqueuedCleanLinkHrefs[] = $cleanLinkHrefFromTagArray['source'];
|
65 |
+
}
|
66 |
+
}
|
67 |
+
|
68 |
+
$cssOptimizeList = array();
|
69 |
+
|
70 |
foreach ($wpStylesDone as $handle) {
|
71 |
if (! isset($wpStylesRegistered[$handle])) {
|
72 |
continue;
|
74 |
|
75 |
$value = $wpStylesRegistered[$handle];
|
76 |
|
77 |
+
$optimizeValues = self::maybeOptimizeIt($value);
|
78 |
|
79 |
if (! empty($optimizeValues)) {
|
80 |
$cssOptimizeList[] = $optimizeValues;
|
85 |
return;
|
86 |
}
|
87 |
|
88 |
+
wp_cache_add('wpacu_css_enqueued_hrefs', $allEnqueuedCleanLinkHrefs);
|
89 |
wp_cache_add('wpacu_css_optimize_list', $cssOptimizeList);
|
90 |
// [End] Collect for caching
|
91 |
}
|
95 |
*
|
96 |
* @return mixed
|
97 |
*/
|
98 |
+
public static function maybeOptimizeIt($value)
|
99 |
{
|
100 |
global $wp_version;
|
101 |
|
218 |
|
219 |
$pathToAssetDir = OptimizeCommon::getPathToAssetDir($src);
|
220 |
|
221 |
+
$cssContent = FileSystem::file_get_contents($localAssetPath, 'combine_css_imports');
|
222 |
|
223 |
$sourceBeforeOptimization = str_replace(ABSPATH, '/', $localAssetPath);
|
224 |
}
|
234 |
$cssContent = FontsGoogle::alterGoogleFontUrlFromCssContent($cssContent);
|
235 |
}
|
236 |
|
237 |
+
// Move any @imports to top; This also strips any @imports to Google Fonts if the option is chosen
|
238 |
+
$cssContent = self::importsUpdate($cssContent);
|
239 |
+
|
240 |
if ($doFileMinify) {
|
241 |
// Minify this file?
|
242 |
$cssContent = MinifyCss::applyMinification($cssContent) ?: $cssContent;
|
243 |
}
|
244 |
|
245 |
+
if (Main::instance()->settings['google_fonts_remove']) {
|
246 |
+
$cssContent = FontsGoogleRemove::cleanFontFaceReferences($cssContent);
|
247 |
+
}
|
248 |
+
|
249 |
+
// No changes were made, thus, there's no point in changing the original file location
|
250 |
if ($isCssFile && trim($cssContentBefore) === trim($cssContent)) {
|
251 |
+
// There's no point in changing the original file location
|
252 |
+
return false;
|
253 |
}
|
254 |
|
255 |
$cssContent = self::maybeFixCssContent($cssContent, $pathToAssetDir . '/'); // Path
|
305 |
}
|
306 |
|
307 |
/**
|
308 |
+
* @param $htmlSource
|
309 |
*
|
310 |
+
* @return mixed|void
|
311 |
*/
|
312 |
+
public static function alterHtmlSource($htmlSource)
|
313 |
{
|
314 |
+
// There has to be at least one "<link" or "<style", otherwise, it could be a feed request or something similar (not page, post, homepage etc.)
|
315 |
+
if (stripos($htmlSource, '<link') === false && stripos($htmlSource, '<style') === false) {
|
316 |
+
return $htmlSource;
|
317 |
}
|
318 |
|
319 |
+
// Are there any assets unloaded where their "children" are ignored?
|
320 |
+
// Since they weren't dequeued the WP way (to avoid unloading the "children"), they will be stripped here
|
321 |
+
if (! Main::instance()->preventAssetsSettings()) {
|
322 |
+
$ignoreChild = Main::instance()->getIgnoreChildren();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
323 |
|
324 |
+
if (isset($ignoreChild['styles']) && ! empty($ignoreChild['styles'])) {
|
325 |
+
foreach ($ignoreChild['styles'] as $styleSrc) {
|
326 |
+
$htmlSource = CleanUp::cleanLinkTagFromHtmlSource($styleSrc, $htmlSource);
|
|
|
327 |
}
|
328 |
}
|
329 |
+
}
|
330 |
|
331 |
+
if (self::isInlineCssEnabled()) {
|
332 |
+
$htmlSource = self::doInline($htmlSource);
|
333 |
+
}
|
334 |
|
335 |
+
// 'wpacu_css_optimize_list' caching list is also checked; if it's empty, no minification is made
|
336 |
+
$htmlSource = self::updateHtmlSourceOriginalToOptimizedCss($htmlSource);
|
337 |
|
338 |
+
if (! Main::instance()->preventAssetsSettings()) {
|
339 |
+
$htmlSource = Preloads::instance()->doChanges($htmlSource);
|
340 |
+
}
|
341 |
|
342 |
+
$proceedWithCombineOnThisPage = true;
|
343 |
|
344 |
+
// If "Do not combine CSS on this page" is checked in "Asset CleanUp: Options" side meta box
|
345 |
+
// Works for posts, pages and custom post types
|
346 |
+
if (defined('WPACU_CURRENT_PAGE_ID') && WPACU_CURRENT_PAGE_ID > 0) {
|
347 |
+
$pageOptions = MetaBoxes::getPageOptions(WPACU_CURRENT_PAGE_ID);
|
348 |
|
349 |
+
// 'no_css_optimize' refers to avoid the combination of CSS files
|
350 |
+
if ( isset( $pageOptions['no_css_optimize'] ) && $pageOptions['no_css_optimize'] ) {
|
351 |
+
$proceedWithCombineOnThisPage = false;
|
|
|
352 |
}
|
353 |
+
}
|
354 |
|
355 |
+
if ($proceedWithCombineOnThisPage) {
|
356 |
+
$htmlSource = CombineCss::doCombine($htmlSource);
|
357 |
+
}
|
358 |
|
359 |
+
if (! Main::instance()->preventAssetsSettings() && Main::instance()->settings['minify_loaded_css'] && Main::instance()->settings['minify_loaded_css_inline']) {
|
360 |
+
$htmlSource = MinifyCss::minifyInlineStyleTags($htmlSource);
|
361 |
+
}
|
362 |
|
363 |
+
// Final cleanups
|
364 |
+
$htmlSource = preg_replace('#<link(\s+|)data-wpacu-link-href-before=(["\'])' . '(.*)' . '(\1)#Usmi', '<link ', $htmlSource);
|
365 |
+
$htmlSource = preg_replace('#<link(\s+|)data-wpacu-style-handle=(["\'])' . '(.*)' . '(\1)#Usmi', '<link ', $htmlSource);
|
366 |
+
$htmlSource = preg_replace('#<link data-wpacu-to-be-preloaded-basic=\'1\' data-wpacu-style-handle=(["\'])' . '(.*)' . '(\1)#Usmi', '<link data-wpacu-to-be-preloaded-basic=\'1\' ', $htmlSource);
|
367 |
|
368 |
+
// Alter HTML Source for Google Fonts Optimization / Removal
|
369 |
+
$htmlSource = FontsGoogle::alterHtmlSource($htmlSource);
|
370 |
+
|
371 |
+
return $htmlSource;
|
372 |
}
|
373 |
|
374 |
/**
|
483 |
public static function updateHtmlSourceOriginalToOptimizedCss($htmlSource)
|
484 |
{
|
485 |
$cssOptimizeList = wp_cache_get('wpacu_css_optimize_list');
|
486 |
+
$allEnqueuedCleanLinkHrefs = wp_cache_get('wpacu_css_enqueued_hrefs');
|
487 |
|
488 |
if (empty($cssOptimizeList)) {
|
489 |
return $htmlSource;
|
503 |
continue;
|
504 |
}
|
505 |
|
506 |
+
// Is it a local CSS? Check if it's hardcoded (not enqueued the WordPress way)
|
507 |
+
if ($cleanLinkHrefFromTagArray = OptimizeCommon::getLocalCleanSourceFromTag($linkSourceTag, 'href')) {
|
508 |
+
$cleanLinkHrefFromTag = $cleanLinkHrefFromTagArray['source'];
|
509 |
+
$afterQuestionMark = $cleanLinkHrefFromTagArray['after_question_mark'];
|
510 |
+
|
511 |
+
if (! in_array($cleanLinkHrefFromTag, $allEnqueuedCleanLinkHrefs)) {
|
512 |
+
// Not in the final enqueued list? Most likely hardcoded (not added via wp_enqueue_scripts())
|
513 |
+
// Emulate the object value (as the enqueued styles)
|
514 |
+
$value = (object)array(
|
515 |
+
'handle' => md5($cleanLinkHrefFromTag),
|
516 |
+
'src' => $cleanLinkHrefFromTag,
|
517 |
+
'ver' => md5($afterQuestionMark)
|
518 |
+
);
|
519 |
+
|
520 |
+
$optimizeValues = self::maybeOptimizeIt($value);
|
521 |
+
|
522 |
+
if (! empty($optimizeValues)) {
|
523 |
+
$cssOptimizeList[] = $optimizeValues;
|
524 |
+
}
|
525 |
+
}
|
526 |
+
}
|
527 |
+
|
528 |
foreach ($cssOptimizeList as $listValues) {
|
529 |
+
// The contents of the CSS file has been changed and thus, we will replace the source path from LINK with the cached (e.g. minified) one
|
530 |
+
|
531 |
// If the minified files are deleted (e.g. /wp-content/cache/ is cleared)
|
532 |
// do not replace the CSS file path to avoid breaking the website
|
533 |
if (! file_exists(rtrim(ABSPATH, '/') . $listValues[1])) {
|
646 |
OptimizeCommon::getPathToAssetDir($linkHrefOriginal) . '/'
|
647 |
);
|
648 |
|
649 |
+
// Move any @imports to top; This also strips any @imports to Google Fonts if the option is chosen
|
650 |
+
$cssContent = self::importsUpdate($cssContent);
|
651 |
+
|
652 |
if ($minifyInlineTags) {
|
653 |
$cssContent = MinifyCss::applyMinification($cssContent);
|
654 |
}
|
660 |
return $htmlSource;
|
661 |
}
|
662 |
|
663 |
+
/**
|
664 |
+
* Source: https://www.minifier.org/ | https://github.com/matthiasmullie/minify
|
665 |
+
*
|
666 |
+
* @param $content
|
667 |
+
*
|
668 |
+
* @return string
|
669 |
+
*/
|
670 |
+
public static function importsUpdate($content)
|
671 |
+
{
|
672 |
+
if (preg_match_all('/(;?)(@import (?<url>url\()?(?P<quotes>["\']?).+?(?P=quotes)(?(url)\)));?/', $content, $matches)) {
|
673 |
+
// Remove from content (they will be appended to the top if they qualify)
|
674 |
+
foreach ($matches[0] as $import) {
|
675 |
+
$content = str_replace($import, '', $content);
|
676 |
+
}
|
677 |
+
|
678 |
+
// Strip any @imports to Google Fonts if it's the case
|
679 |
+
$importsAddToTop = Main::instance()->settings['google_fonts_remove'] ? FontsGoogleRemove::stripGoogleApisImport($matches[2]) : $matches[2];
|
680 |
+
|
681 |
+
// Add to top if there are any imports left
|
682 |
+
if (! empty($importsAddToTop)) {
|
683 |
+
$content = implode(';', $importsAddToTop) . ';' . trim($content, ';');
|
684 |
+
}
|
685 |
+
}
|
686 |
+
|
687 |
+
return $content;
|
688 |
+
}
|
689 |
+
|
690 |
/**
|
691 |
* @param string $returnType
|
692 |
*
|
classes/OptimiseAssets/OptimizeJs.php
CHANGED
@@ -4,7 +4,6 @@ namespace WpAssetCleanUp\OptimiseAssets;
|
|
4 |
use WpAssetCleanUp\FileSystem;
|
5 |
use WpAssetCleanUp\CleanUp;
|
6 |
use WpAssetCleanUp\Main;
|
7 |
-
use WpAssetCleanUp\Menu;
|
8 |
use WpAssetCleanUp\MetaBoxes;
|
9 |
use WpAssetCleanUp\Misc;
|
10 |
use WpAssetCleanUp\Preloads;
|
@@ -26,7 +25,6 @@ class OptimizeJs
|
|
26 |
public function init()
|
27 |
{
|
28 |
add_action('wp_print_footer_scripts', array($this, 'prepareOptimizeList'), PHP_INT_MAX);
|
29 |
-
add_action('wp_loaded', array($this, 'alterHtmlSource'), 1);
|
30 |
}
|
31 |
|
32 |
/**
|
@@ -45,18 +43,39 @@ class OptimizeJs
|
|
45 |
|
46 |
$wpScriptsList = array_unique(array_merge($wp_scripts->done, $wp_scripts->queue));
|
47 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
48 |
// [Start] Collect for caching
|
49 |
foreach ($wpScriptsList as $handle) {
|
50 |
if (! isset($wp_scripts->registered[$handle])) { continue; }
|
51 |
|
52 |
$value = $wp_scripts->registered[$handle];
|
53 |
-
$optimizeValues =
|
54 |
|
55 |
if ( ! empty( $optimizeValues ) ) {
|
56 |
$jsOptimizeList[] = $optimizeValues;
|
57 |
}
|
58 |
}
|
59 |
|
|
|
60 |
wp_cache_add('wpacu_js_optimize_list', $jsOptimizeList);
|
61 |
// [End] Collect for caching
|
62 |
}
|
@@ -66,7 +85,7 @@ class OptimizeJs
|
|
66 |
*
|
67 |
* @return array
|
68 |
*/
|
69 |
-
public function maybeOptimizeIt($value)
|
70 |
{
|
71 |
global $wp_version;
|
72 |
|
@@ -114,32 +133,20 @@ class OptimizeJs
|
|
114 |
return array();
|
115 |
}
|
116 |
|
117 |
-
$
|
118 |
-
|
119 |
-
$posLastSlash = strrpos($assetHref, '/');
|
120 |
-
$pathToAssetDir = substr($assetHref, 0, $posLastSlash);
|
121 |
-
|
122 |
-
$parseUrl = parse_url($pathToAssetDir);
|
123 |
-
|
124 |
-
if (isset($parseUrl['scheme']) && $parseUrl['scheme'] !== '') {
|
125 |
-
$pathToAssetDir = str_replace(
|
126 |
-
array('http://'.$parseUrl['host'], 'https://'.$parseUrl['host']),
|
127 |
-
'',
|
128 |
-
$pathToAssetDir
|
129 |
-
);
|
130 |
-
} elseif (strpos($pathToAssetDir, '//') === 0) {
|
131 |
-
$pathToAssetDir = str_replace(
|
132 |
-
array('//'.$parseUrl['host'], '//'.$parseUrl['host']),
|
133 |
-
'',
|
134 |
-
$pathToAssetDir
|
135 |
-
);
|
136 |
-
}
|
137 |
|
138 |
-
|
139 |
-
$jsContent =
|
140 |
|
141 |
$jsContent = MinifyJs::applyMinification($jsContent);
|
142 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
143 |
// Relative path to the new file
|
144 |
// Save it to /wp-content/cache/js/{OptimizeCommon::$optimizedSingleFilesDir}/
|
145 |
if ($fileVer !== $wp_version) {
|
@@ -194,6 +201,7 @@ class OptimizeJs
|
|
194 |
public static function updateHtmlSourceOriginalToOptimizedJs($htmlSource)
|
195 |
{
|
196 |
$jsOptimizeList = wp_cache_get('wpacu_js_optimize_list');
|
|
|
197 |
|
198 |
if (empty($jsOptimizeList)) {
|
199 |
return $htmlSource;
|
@@ -209,6 +217,29 @@ class OptimizeJs
|
|
209 |
continue;
|
210 |
}
|
211 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
212 |
foreach ($jsOptimizeList as $listValues) {
|
213 |
// If the minified files are deleted (e.g. /wp-content/cache/ is cleared)
|
214 |
// do not replace the JS file path to avoid breaking the website
|
@@ -263,85 +294,76 @@ class OptimizeJs
|
|
263 |
}
|
264 |
|
265 |
/**
|
|
|
266 |
*
|
|
|
267 |
*/
|
268 |
-
public function alterHtmlSource()
|
269 |
{
|
270 |
-
|
271 |
-
|
|
|
272 |
}
|
273 |
|
274 |
-
|
275 |
-
|
276 |
-
|
277 |
-
|
278 |
-
}
|
279 |
|
280 |
-
|
281 |
-
|
282 |
-
|
283 |
-
}
|
284 |
-
|
285 |
-
// Are there any assets unloaded where their "children" are ignored?
|
286 |
-
// Since they weren't dequeued the WP way (to avoid unloading the "children"), they will be stripped here
|
287 |
-
if (! Main::instance()->preventAssetsSettings()) {
|
288 |
-
$ignoreChild = Main::instance()->getIgnoreChildren();
|
289 |
-
|
290 |
-
if (isset($ignoreChild['scripts']) && ! empty($ignoreChild['scripts'])) {
|
291 |
-
foreach ($ignoreChild['scripts'] as $scriptSrc) {
|
292 |
-
$htmlSource = CleanUp::cleanScriptTagFromHtmlSource($scriptSrc, $htmlSource);
|
293 |
-
}
|
294 |
}
|
295 |
}
|
|
|
296 |
|
297 |
-
|
298 |
-
|
299 |
-
|
300 |
-
|
301 |
-
|
302 |
-
|
303 |
-
|
304 |
-
|
305 |
-
|
306 |
-
|
307 |
-
if (! Main::instance()->preventAssetsSettings()) {
|
308 |
-
$preloads = Preloads::instance()->getPreloads();
|
309 |
|
310 |
-
|
311 |
-
|
312 |
-
}
|
313 |
|
314 |
-
|
|
|
315 |
}
|
316 |
|
317 |
-
$
|
|
|
318 |
|
319 |
-
|
320 |
-
// Works for posts, pages and custom post types
|
321 |
-
if (defined('WPACU_CURRENT_PAGE_ID') && WPACU_CURRENT_PAGE_ID > 0) {
|
322 |
-
$pageOptions = MetaBoxes::getPageOptions( WPACU_CURRENT_PAGE_ID );
|
323 |
|
324 |
-
|
325 |
-
|
326 |
-
|
327 |
-
|
328 |
-
}
|
329 |
|
330 |
-
|
331 |
-
|
|
|
332 |
}
|
|
|
333 |
|
334 |
-
|
335 |
-
|
336 |
-
|
|
|
|
|
|
|
|
|
337 |
|
338 |
-
|
339 |
-
|
340 |
-
|
341 |
-
|
342 |
|
343 |
-
|
344 |
-
});
|
345 |
}
|
346 |
|
347 |
/**
|
@@ -405,12 +427,19 @@ class OptimizeJs
|
|
405 |
// Relative URIs for CSS Paths
|
406 |
// For code such as:
|
407 |
// $(this).css("background", "url('../images/image-1.jpg')");
|
408 |
-
|
409 |
-
|
410 |
-
|
411 |
-
|
|
|
|
|
|
|
|
|
|
|
412 |
);
|
413 |
|
|
|
|
|
414 |
$jsContent = trim($jsContent);
|
415 |
|
416 |
if (substr($jsContent, -1) !== ';') {
|
4 |
use WpAssetCleanUp\FileSystem;
|
5 |
use WpAssetCleanUp\CleanUp;
|
6 |
use WpAssetCleanUp\Main;
|
|
|
7 |
use WpAssetCleanUp\MetaBoxes;
|
8 |
use WpAssetCleanUp\Misc;
|
9 |
use WpAssetCleanUp\Preloads;
|
25 |
public function init()
|
26 |
{
|
27 |
add_action('wp_print_footer_scripts', array($this, 'prepareOptimizeList'), PHP_INT_MAX);
|
|
|
28 |
}
|
29 |
|
30 |
/**
|
43 |
|
44 |
$wpScriptsList = array_unique(array_merge($wp_scripts->done, $wp_scripts->queue));
|
45 |
|
46 |
+
// Collect all enqueued clean (no query strings) HREFs to later compare them against any hardcoded JS
|
47 |
+
$allEnqueuedCleanScriptSrcs = array();
|
48 |
+
|
49 |
+
foreach ($wpScriptsList as $scriptHandle) {
|
50 |
+
if (isset(Main::instance()->wpAllScripts['registered'][$scriptHandle]->src) && ($src = Main::instance()->wpAllScripts['registered'][$scriptHandle]->src)) {
|
51 |
+
$localAssetPath = OptimizeCommon::getLocalAssetPath($src, 'js');
|
52 |
+
|
53 |
+
if (! $localAssetPath || ! file_exists($localAssetPath)) {
|
54 |
+
continue; // not a local file
|
55 |
+
}
|
56 |
+
|
57 |
+
ob_start();
|
58 |
+
$wp_scripts->do_item($scriptHandle);
|
59 |
+
$scriptSourceTag = trim(ob_get_clean());
|
60 |
+
|
61 |
+
$cleanScriptSrcFromTagArray = OptimizeCommon::getLocalCleanSourceFromTag($scriptSourceTag, 'src');
|
62 |
+
$allEnqueuedCleanScriptSrcs[] = $cleanScriptSrcFromTagArray['source'];
|
63 |
+
}
|
64 |
+
}
|
65 |
+
|
66 |
// [Start] Collect for caching
|
67 |
foreach ($wpScriptsList as $handle) {
|
68 |
if (! isset($wp_scripts->registered[$handle])) { continue; }
|
69 |
|
70 |
$value = $wp_scripts->registered[$handle];
|
71 |
+
$optimizeValues = self::maybeOptimizeIt($value);
|
72 |
|
73 |
if ( ! empty( $optimizeValues ) ) {
|
74 |
$jsOptimizeList[] = $optimizeValues;
|
75 |
}
|
76 |
}
|
77 |
|
78 |
+
wp_cache_add('wpacu_js_enqueued_srcs', $allEnqueuedCleanScriptSrcs);
|
79 |
wp_cache_add('wpacu_js_optimize_list', $jsOptimizeList);
|
80 |
// [End] Collect for caching
|
81 |
}
|
85 |
*
|
86 |
* @return array
|
87 |
*/
|
88 |
+
public static function maybeOptimizeIt($value)
|
89 |
{
|
90 |
global $wp_version;
|
91 |
|
133 |
return array();
|
134 |
}
|
135 |
|
136 |
+
$pathToAssetDir = OptimizeCommon::getPathToAssetDir($value->src);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
137 |
|
138 |
+
|
139 |
+
$jsContent = $jsContentBefore = FileSystem::file_get_contents($localAssetPath);
|
140 |
|
141 |
$jsContent = MinifyJs::applyMinification($jsContent);
|
142 |
|
143 |
+
if (trim($jsContent, '; ') === trim($jsContentBefore, '; ')) {
|
144 |
+
// The JS file is already minified / No need to copy it in to the cache (save disk space)
|
145 |
+
return array();
|
146 |
+
}
|
147 |
+
|
148 |
+
$jsContent = self::maybeDoJsFixes($jsContent, $pathToAssetDir . '/'); // Minify it and save it to /wp-content/cache/js/min/
|
149 |
+
|
150 |
// Relative path to the new file
|
151 |
// Save it to /wp-content/cache/js/{OptimizeCommon::$optimizedSingleFilesDir}/
|
152 |
if ($fileVer !== $wp_version) {
|
201 |
public static function updateHtmlSourceOriginalToOptimizedJs($htmlSource)
|
202 |
{
|
203 |
$jsOptimizeList = wp_cache_get('wpacu_js_optimize_list');
|
204 |
+
$allEnqueuedCleanScriptSrcs = wp_cache_get('wpacu_js_enqueued_srcs');
|
205 |
|
206 |
if (empty($jsOptimizeList)) {
|
207 |
return $htmlSource;
|
217 |
continue;
|
218 |
}
|
219 |
|
220 |
+
// Is it a local JS? Check if it's hardcoded (not enqueued the WordPress way)
|
221 |
+
if ($cleanScriptSrcFromTagArray = OptimizeCommon::getLocalCleanSourceFromTag($scriptSourceTag, 'src')) {
|
222 |
+
$cleanScriptSrcFromTag = $cleanScriptSrcFromTagArray['source'];
|
223 |
+
$afterQuestionMark = $cleanScriptSrcFromTagArray['after_question_mark'];
|
224 |
+
|
225 |
+
if (! in_array($cleanScriptSrcFromTag, $allEnqueuedCleanScriptSrcs)) {
|
226 |
+
// Not in the final enqueued list? Most likely hardcoded (not added via wp_enqueue_scripts())
|
227 |
+
// Emulate the object value (as the enqueued styles)
|
228 |
+
$value = (object)array(
|
229 |
+
'handle' => md5($cleanScriptSrcFromTag),
|
230 |
+
'src' => $cleanScriptSrcFromTag,
|
231 |
+
'ver' => md5($afterQuestionMark)
|
232 |
+
);
|
233 |
+
|
234 |
+
$optimizeValues = self::maybeOptimizeIt($value);
|
235 |
+
|
236 |
+
if (! empty($optimizeValues)) {
|
237 |
+
$jsOptimizeList[] = $optimizeValues;
|
238 |
+
}
|
239 |
+
}
|
240 |
+
}
|
241 |
+
|
242 |
+
|
243 |
foreach ($jsOptimizeList as $listValues) {
|
244 |
// If the minified files are deleted (e.g. /wp-content/cache/ is cleared)
|
245 |
// do not replace the JS file path to avoid breaking the website
|
294 |
}
|
295 |
|
296 |
/**
|
297 |
+
* @param $htmlSource
|
298 |
*
|
299 |
+
* @return mixed|void
|
300 |
*/
|
301 |
+
public static function alterHtmlSource($htmlSource)
|
302 |
{
|
303 |
+
// There has to be at least one "<script", otherwise, it could be a feed request or something similar (not page, post, homepage etc.)
|
304 |
+
if (stripos($htmlSource, '<script') === false) {
|
305 |
+
return $htmlSource;
|
306 |
}
|
307 |
|
308 |
+
// Are there any assets unloaded where their "children" are ignored?
|
309 |
+
// Since they weren't dequeued the WP way (to avoid unloading the "children"), they will be stripped here
|
310 |
+
if (! Main::instance()->preventAssetsSettings()) {
|
311 |
+
$ignoreChild = Main::instance()->getIgnoreChildren();
|
|
|
312 |
|
313 |
+
if (isset($ignoreChild['scripts']) && ! empty($ignoreChild['scripts'])) {
|
314 |
+
foreach ($ignoreChild['scripts'] as $scriptSrc) {
|
315 |
+
$htmlSource = CleanUp::cleanScriptTagFromHtmlSource($scriptSrc, $htmlSource);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
316 |
}
|
317 |
}
|
318 |
+
}
|
319 |
|
320 |
+
/*
|
321 |
+
* The JavaScript files only get cached if they are minified
|
322 |
+
* #minifying
|
323 |
+
* STEP 2: Load minify-able caching list and replace the original source URLs with the new cached ones
|
324 |
+
*/
|
325 |
+
if (MinifyJs::isMinifyJsEnabled()) {
|
326 |
+
// 'wpacu_js_optimize_list' caching list is also checked; if it's empty, no minification is made
|
327 |
+
$htmlSource = self::updateHtmlSourceOriginalToOptimizedJs($htmlSource);
|
328 |
+
}
|
|
|
|
|
|
|
329 |
|
330 |
+
if (! Main::instance()->preventAssetsSettings()) {
|
331 |
+
$preloads = Preloads::instance()->getPreloads();
|
|
|
332 |
|
333 |
+
if (isset($preloads['scripts']) && ! empty($preloads['scripts'])) {
|
334 |
+
$htmlSource = Preloads::appendPreloadsForScriptsToHead($htmlSource);
|
335 |
}
|
336 |
|
337 |
+
$htmlSource = str_replace(Preloads::DEL_SCRIPTS_PRELOADS, '', $htmlSource);
|
338 |
+
}
|
339 |
|
340 |
+
$proceedWithCombineOnThisPage = true;
|
|
|
|
|
|
|
341 |
|
342 |
+
// If "Do not combine JS on this page" is checked in "Asset CleanUp Options" side meta box
|
343 |
+
// Works for posts, pages and custom post types
|
344 |
+
if (defined('WPACU_CURRENT_PAGE_ID') && WPACU_CURRENT_PAGE_ID > 0) {
|
345 |
+
$pageOptions = MetaBoxes::getPageOptions( WPACU_CURRENT_PAGE_ID );
|
|
|
346 |
|
347 |
+
// 'no_js_optimize' refers to avoid the combination of JS files
|
348 |
+
if ( isset( $pageOptions['no_js_optimize'] ) && $pageOptions['no_js_optimize'] ) {
|
349 |
+
$proceedWithCombineOnThisPage = false;
|
350 |
}
|
351 |
+
}
|
352 |
|
353 |
+
if ($proceedWithCombineOnThisPage) {
|
354 |
+
$htmlSource = CombineJs::doCombine($htmlSource);
|
355 |
+
}
|
356 |
+
|
357 |
+
if (! Main::instance()->preventAssetsSettings() && Main::instance()->settings['minify_loaded_js'] && Main::instance()->settings['minify_loaded_js_inline']) {
|
358 |
+
$htmlSource = MinifyJs::minifyInlineScriptTags($htmlSource);
|
359 |
+
}
|
360 |
|
361 |
+
// Final cleanups
|
362 |
+
$htmlSource = preg_replace('#<script(\s+|)data-wpacu-script-src-before=(["\'])' . '(.*)' . '(\1)#Usmi', '<script ', $htmlSource);
|
363 |
+
$htmlSource = preg_replace('#<script(\s+|)data-wpacu-script-handle=(["\'])' . '(.*)' . '(\1)#Usmi', '<script ', $htmlSource);
|
364 |
+
$htmlSource = preg_replace('#<script data-wpacu-to-be-preloaded-basic=\'1\' data-wpacu-script-handle=(["\'])' . '(.*)' . '(\1)#Usmi', '<script data-wpacu-to-be-preloaded-basic=\'1\' ', $htmlSource);
|
365 |
|
366 |
+
return $htmlSource;
|
|
|
367 |
}
|
368 |
|
369 |
/**
|
427 |
// Relative URIs for CSS Paths
|
428 |
// For code such as:
|
429 |
// $(this).css("background", "url('../images/image-1.jpg')");
|
430 |
+
|
431 |
+
$jsContentPathReps = array(
|
432 |
+
'url("../' => 'url("'.$appendBefore.'../',
|
433 |
+
"url('../" => "url('".$appendBefore.'../',
|
434 |
+
'url(../' => 'url('.$appendBefore.'../',
|
435 |
+
|
436 |
+
'url("./' => 'url("'.$appendBefore.'./',
|
437 |
+
"url('./" => "url('".$appendBefore.'./',
|
438 |
+
'url(./' => 'url('.$appendBefore.'./'
|
439 |
);
|
440 |
|
441 |
+
$jsContent = str_replace(array_keys($jsContentPathReps), array_values($jsContentPathReps), $jsContent);
|
442 |
+
|
443 |
$jsContent = trim($jsContent);
|
444 |
|
445 |
if (substr($jsContent, -1) !== ';') {
|
classes/OwnAssets.php
CHANGED
@@ -189,6 +189,7 @@ class OwnAssets
|
|
189 |
global $post, $pagenow;
|
190 |
|
191 |
$page = Misc::getVar('get', 'page');
|
|
|
192 |
|
193 |
$getPostId = (isset($_GET['post'], $_GET['action']) && $_GET['action'] === 'edit' && $pagenow === 'post.php') ? (int)$_GET['post'] : '';
|
194 |
|
@@ -198,9 +199,9 @@ class OwnAssets
|
|
198 |
$postId = $getPostId;
|
199 |
}
|
200 |
|
201 |
-
|
202 |
-
|
203 |
-
|
204 |
|
205 |
$scriptRelPath = '/assets/script.min.js';
|
206 |
|
189 |
global $post, $pagenow;
|
190 |
|
191 |
$page = Misc::getVar('get', 'page');
|
192 |
+
$pageRequestFor = Misc::getVar('get', 'wpacu_for') ?: 'homepage';
|
193 |
|
194 |
$getPostId = (isset($_GET['post'], $_GET['action']) && $_GET['action'] === 'edit' && $pagenow === 'post.php') ? (int)$_GET['post'] : '';
|
195 |
|
199 |
$postId = $getPostId;
|
200 |
}
|
201 |
|
202 |
+
if (($page === WPACU_PLUGIN_ID . '_assets_manager' && $pageRequestFor === 'homepage') || $postId < 1) {
|
203 |
+
$postId = 0; // for home page
|
204 |
+
}
|
205 |
|
206 |
$scriptRelPath = '/assets/script.min.js';
|
207 |
|
classes/Settings.php
CHANGED
@@ -140,6 +140,9 @@ class Settings
|
|
140 |
// Google Fonts: Preload Files
|
141 |
'google_fonts_preload_files',
|
142 |
|
|
|
|
|
|
|
143 |
// [wpacu_lite]
|
144 |
// Do not trigger Freemius Popup on Deactivation
|
145 |
'disable_freemius'
|
@@ -558,10 +561,21 @@ class Settings
|
|
558 |
public function redirectAfterUpdate()
|
559 |
{
|
560 |
$tabArea = Misc::getVar('post', 'wpacu_selected_tab_area', 'wpacu-setting-plugin-usage-settings');
|
|
|
561 |
|
562 |
set_transient('wpacu_settings_updated', 1, 30);
|
563 |
|
564 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
565 |
exit();
|
566 |
}
|
567 |
}
|
140 |
// Google Fonts: Preload Files
|
141 |
'google_fonts_preload_files',
|
142 |
|
143 |
+
// Google Fonts: Remove all traces
|
144 |
+
'google_fonts_remove',
|
145 |
+
|
146 |
// [wpacu_lite]
|
147 |
// Do not trigger Freemius Popup on Deactivation
|
148 |
'disable_freemius'
|
561 |
public function redirectAfterUpdate()
|
562 |
{
|
563 |
$tabArea = Misc::getVar('post', 'wpacu_selected_tab_area', 'wpacu-setting-plugin-usage-settings');
|
564 |
+
$subTabArea = Misc::getVar('post', 'wpacu_selected_sub_tab_area', '');
|
565 |
|
566 |
set_transient('wpacu_settings_updated', 1, 30);
|
567 |
|
568 |
+
$wpacuQueryString = array(
|
569 |
+
'page' => 'wpassetcleanup_settings',
|
570 |
+
'wpacu_selected_tab_area' => $tabArea,
|
571 |
+
'wpacu_time' => time()
|
572 |
+
);
|
573 |
+
|
574 |
+
if ($subTabArea) {
|
575 |
+
$wpacuQueryString['wpacu_selected_sub_tab_area'] = $subTabArea;
|
576 |
+
}
|
577 |
+
|
578 |
+
wp_redirect(add_query_arg($wpacuQueryString, admin_url('admin.php')));
|
579 |
exit();
|
580 |
}
|
581 |
}
|
readme.txt
CHANGED
@@ -4,7 +4,7 @@ Tags: pagespeed, page speed, dequeue, minify css, performance
|
|
4 |
Donate link: https://gabelivan.com/items/wp-asset-cleanup-pro/?utm_source=wp_org_lite&utm_medium=donate
|
5 |
Requires at least: 4.4
|
6 |
Tested up to: 5.2.2
|
7 |
-
Stable tag: 1.3.4.
|
8 |
License: GPLv3
|
9 |
License URI: http://www.gnu.org/licenses/gpl.html
|
10 |
|
@@ -29,9 +29,6 @@ The plugin works best in combination with a cache plugin such as [WP Rocket](htt
|
|
29 |
* Minify & Combine remaining loaded CSS & JavaScript files
|
30 |
* Inline Chosen CSS Files
|
31 |
* Defer combined JavaScript files by applying "defer" attribute to the SCRIPT tags
|
32 |
-
* Combine all Google Font requests into fewer (usually one) requests, saving one round trip to the server for each additional font requested
|
33 |
-
* Apply "font-display" CSS property to all loaded Google Font requests
|
34 |
-
* Enable preconnect resource hint for fonts.gstatic.com in case you use Google Fonts; don't let the browser wait until it fetches the CSS for loading the font files before it begins DNS/TCP/TLS
|
35 |
* Site-wide removal for Emojis, Dashicons for guest users and Comment Reply if they are not used
|
36 |
* Reduces the HTML code of the actual page (that's even better if GZIP compression is enabled)
|
37 |
* Makes source code easier to scan in case you're a developer and want to search for something
|
@@ -40,6 +37,18 @@ The plugin works best in combination with a cache plugin such as [WP Rocket](htt
|
|
40 |
* Google will love your website more as it would be faster and fast page load is nowadays a factor in search ranking
|
41 |
* Your server access log files (e.g the Apache ones) will be easier to scan and would take less space on your server
|
42 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
43 |
= Remove useless links, meta tags and HTML comments within the HEAD and BODY (footer) tags of the website =
|
44 |
* Really Simple Discovery (RSD) link tag
|
45 |
* Windows Live Writer link tag
|
@@ -166,6 +175,13 @@ With the recently released "Test Mode" feature, you can safely unload assets on
|
|
166 |
4. Homepage CSS & JS Management (List sorted by location)
|
167 |
|
168 |
== Changelog ==
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
169 |
= 1.3.4.1 =
|
170 |
* Combined CSS files are now grouped by the LINKs media attribute (before, only "all" (default) stylesheets were combined); e.g. if there are three "print" stylesheet and four "only screen and (max-width: 1024px)", then two separate combined CSS files will be created for each media type
|
171 |
* Make sure the "media" attribute is always added to the STYLE tag if a certain one (besides 'all') was set
|
@@ -182,7 +198,7 @@ With the recently released "Test Mode" feature, you can safely unload assets on
|
|
182 |
* Changed the vertical "Settings" menu by renaming "Minify CSS & JS Files" & "Combine CSS & JS Files" to "Optimize CSS" & Optimize JavaScript; Added the status of the minify/combine below the menu titles to easily check what optimizations were done
|
183 |
* Improved the way JS files are combined; If "Defer loading JavaScript combined files" is enabled in "Optimize JavaScript", make sure that any external script between the first and last combined JS tags has "defer" attribute applied to it to avoid any JS errors in case a "child" JS file is loaded before a combined "parent" one.
|
184 |
* Option to minify inline content between from STYLE and SCRIPT (without any "src" attribute) tags
|
185 |
-
* Optimize minify CSS/JS feature to use less resource when
|
186 |
* Option to choose between "Render-blocking" and "Asynchronous via Web Font Loader (webfont.js)" when loading the combined Google Font requests
|
187 |
* Bug Fix: Sometimes the dynamically created drop-down from "Hide all meta boxes for the following public post types" (in "Settings" -> "Plugin Usage Preferences") via jQuery Chosen plugin was returning an empty (0px in width) selector
|
188 |
|
4 |
Donate link: https://gabelivan.com/items/wp-asset-cleanup-pro/?utm_source=wp_org_lite&utm_medium=donate
|
5 |
Requires at least: 4.4
|
6 |
Tested up to: 5.2.2
|
7 |
+
Stable tag: 1.3.4.2
|
8 |
License: GPLv3
|
9 |
License URI: http://www.gnu.org/licenses/gpl.html
|
10 |
|
29 |
* Minify & Combine remaining loaded CSS & JavaScript files
|
30 |
* Inline Chosen CSS Files
|
31 |
* Defer combined JavaScript files by applying "defer" attribute to the SCRIPT tags
|
|
|
|
|
|
|
32 |
* Site-wide removal for Emojis, Dashicons for guest users and Comment Reply if they are not used
|
33 |
* Reduces the HTML code of the actual page (that's even better if GZIP compression is enabled)
|
34 |
* Makes source code easier to scan in case you're a developer and want to search for something
|
37 |
* Google will love your website more as it would be faster and fast page load is nowadays a factor in search ranking
|
38 |
* Your server access log files (e.g the Apache ones) will be easier to scan and would take less space on your server
|
39 |
|
40 |
+
= Google Fonts Optimization / Removal =
|
41 |
+
* Combine all Google Font requests into fewer (usually one) requests, saving one round trip to the server for each additional font requested
|
42 |
+
* Choose between three methods of delivery: Render-blocking, Asynchronous via Web Font Loader (webfont.js) or Asynchronous by preloading the CSS stylesheet
|
43 |
+
* Option to preload Google Font Files from fonts.gstatic.com (e.g. ending in .woff2)
|
44 |
+
* Apply "font-display" CSS property to all loaded Google Font requests
|
45 |
+
* Enable preconnect resource hint for fonts.gstatic.com in case you use Google Fonts; don't let the browser wait until it fetches the CSS for loading the font files before it begins DNS/TCP/TLS
|
46 |
+
* Remove all Google Font requests including link/font preloads, @import/@font-face from CSS files & STYLE tags, resource hints
|
47 |
+
|
48 |
+
= Local Fonts Optimization =
|
49 |
+
* Preload local font files (ending in .woff, .woff2, .ttf, etc.)
|
50 |
+
* Apply "font-display" CSS property value to LINK / STYLE tags (Pro version)
|
51 |
+
|
52 |
= Remove useless links, meta tags and HTML comments within the HEAD and BODY (footer) tags of the website =
|
53 |
* Really Simple Discovery (RSD) link tag
|
54 |
* Windows Live Writer link tag
|
175 |
4. Homepage CSS & JS Management (List sorted by location)
|
176 |
|
177 |
== Changelog ==
|
178 |
+
= 1.3.4.2 =
|
179 |
+
* New Feature: Remove Google Font Requests (including link/font preloads, @import/@font-face from CSS files & STYLE tags, resource hints)
|
180 |
+
* Minify/Combine CSS Improvement: Any @import found including a local CSS in another CSS file is fetched (and minified/optimized if necessary) and added to the parent file (this reduces HTTP requests, saving additional round-trip times to the overall page load) - Read more: https://gtmetrix.com/avoid-css-import.html
|
181 |
+
* Hardcoded CSS/JS (not enqueued the WordPress way) from the same domain (local) get minified/optimized
|
182 |
+
* Bug Fix: In rare cases, when viewing the homepage assets in the Dashboard, the wrong page is checked (e.g. a post instead of the actual homepage) because specific themes/plugins do not use wp_reset_postdata() to restore $post global to its original value (none in this instance)
|
183 |
+
* Bug Fix: If Google Fonts loading type is async (optional with preload) then make sure it's applied even if there's only one LINK request
|
184 |
+
|
185 |
= 1.3.4.1 =
|
186 |
* Combined CSS files are now grouped by the LINKs media attribute (before, only "all" (default) stylesheets were combined); e.g. if there are three "print" stylesheet and four "only screen and (max-width: 1024px)", then two separate combined CSS files will be created for each media type
|
187 |
* Make sure the "media" attribute is always added to the STYLE tag if a certain one (besides 'all') was set
|
198 |
* Changed the vertical "Settings" menu by renaming "Minify CSS & JS Files" & "Combine CSS & JS Files" to "Optimize CSS" & Optimize JavaScript; Added the status of the minify/combine below the menu titles to easily check what optimizations were done
|
199 |
* Improved the way JS files are combined; If "Defer loading JavaScript combined files" is enabled in "Optimize JavaScript", make sure that any external script between the first and last combined JS tags has "defer" attribute applied to it to avoid any JS errors in case a "child" JS file is loaded before a combined "parent" one.
|
200 |
* Option to minify inline content between from STYLE and SCRIPT (without any "src" attribute) tags
|
201 |
+
* Optimize minify CSS/JS feature to use less resource when dynamically generating the optimized (cached) files; Minification is performed via a new library (ref: https://www.minifier.org/)
|
202 |
* Option to choose between "Render-blocking" and "Asynchronous via Web Font Loader (webfont.js)" when loading the combined Google Font requests
|
203 |
* Bug Fix: Sometimes the dynamically created drop-down from "Hide all meta boxes for the following public post types" (in "Settings" -> "Plugin Usage Preferences") via jQuery Chosen plugin was returning an empty (0px in width) selector
|
204 |
|
templates/_admin-page-settings-plugin-areas/_fonts-google.php
CHANGED
@@ -19,195 +19,35 @@ $ddOptions = array(
|
|
19 |
?>
|
20 |
<div id="<?php echo $tabIdArea; ?>" class="wpacu-settings-tab-content" <?php echo $styleTabContent; ?>>
|
21 |
<h2 class="wpacu-settings-area-title"><?php _e('Google Fonts: Load Optimizer', 'wp-asset-clean-up'); ?></h2>
|
22 |
-
<table class="wpacu-form-table">
|
23 |
-
<tr valign="top">
|
24 |
-
<th scope="row" class="setting_title">
|
25 |
-
<label for="wpacu_google_fonts_combine"><?php _e('Combine Multiple Requests Into Fewer Ones', 'wp-asset-clean-up'); ?></label>
|
26 |
-
<p class="wpacu_subtitle"><small><em>And choose the loading option</em></small></p>
|
27 |
-
</th>
|
28 |
-
<td>
|
29 |
-
<label class="wpacu_switch">
|
30 |
-
<input id="wpacu_google_fonts_combine"
|
31 |
-
type="checkbox"
|
32 |
-
data-target-opacity="google_fonts_combine_wrap"
|
33 |
-
<?php echo (($data['google_fonts_combine'] == 1) ? 'checked="checked"' : ''); ?>
|
34 |
-
name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_combine]"
|
35 |
-
value="1" /> <span class="wpacu_slider wpacu_round"></span> </label>
|
36 |
|
37 |
-
|
38 |
-
|
39 |
-
|
40 |
-
|
41 |
-
|
42 |
-
|
43 |
-
|
44 |
-
|
45 |
-
|
46 |
-
|
47 |
-
|
48 |
-
|
49 |
-
|
50 |
-
|
51 |
-
|
52 |
-
|
53 |
-
|
54 |
-
|
55 |
-
|
56 |
-
|
57 |
-
|
58 |
-
|
59 |
-
|
60 |
-
|
61 |
-
|
62 |
-
|
63 |
-
|
64 |
-
|
65 |
-
<p><strong>Example</strong> The following LINK tags will be converted into an inline JavaScript tag place:</p>
|
66 |
-
|
67 |
-
<ul>
|
68 |
-
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Droid+Sans"></code></li>
|
69 |
-
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:bold"></code></li>
|
70 |
-
</ul>
|
71 |
-
<hr />
|
72 |
-
<ul>
|
73 |
-
<li>
|
74 |
-
<code>
|
75 |
-
<?php
|
76 |
-
$asyncWebFontLoaderSnippet = <<<HTML
|
77 |
-
<script id='wpacu-google-fonts-async-load' type='text/javascript'>
|
78 |
-
WebFontConfig = { google: { families: ['Droid+Sans', 'Inconsolata:bold'] } };
|
79 |
-
(function(wpacuD) {
|
80 |
-
var wpacuWf = wpacuD.createElement('script'), wpacuS = wpacuD.scripts[0];
|
81 |
-
wpacuWf.src = ('https:' === document.location.protocol ? 'https' : 'http')
|
82 |
-
+ '://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js';
|
83 |
-
wpacuWf.async = true;
|
84 |
-
wpacuS.parentNode.insertBefore(wpacuWf, wpacuS);
|
85 |
-
})(document);
|
86 |
-
</script><noscript><link rel="stylesheet" id="wpacu-combined-google-fonts-css" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold"></noscript>
|
87 |
-
HTML;
|
88 |
-
|
89 |
-
echo nl2br($asyncWebFontLoaderSnippet);
|
90 |
-
?>
|
91 |
-
</code>
|
92 |
-
<p style="margin-top: 5px;"><small><strong>Note:</strong> The inline tag's contents will be minified in the resulting HTML code. A NOSCRIPT tag is appended to the SCRIPT tag as a fallback in case JavaScript is disabled for any reason.</small></p>
|
93 |
-
</li>
|
94 |
-
</ul>
|
95 |
-
|
96 |
-
<p>Using the Web Font Loader asynchronously avoids blocking your page while loading the JavaScript. A <strong>disadvantage</strong> is that the rest of the page might render before the Web Font Loader is loaded and executed, which can cause a <strong>Flash of Unstyled Text (FOUT)</strong>.</p>
|
97 |
-
</div>
|
98 |
-
<!-- /Async info -->
|
99 |
-
|
100 |
-
<!-- Async preload info -->
|
101 |
-
<div id="wpacu_google_fonts_combine_type_async_preload_info_area" class="wpacu_google_fonts_combine_type_area" <?php if ($data['google_fonts_combine_type'] !== 'async_preload') { echo 'style="display: none;"'; } ?>>
|
102 |
-
<p><strong>Example</strong> The following LINK tags will be converted into a non-render blocking LINK "preload" tag:</p>
|
103 |
-
|
104 |
-
<ul>
|
105 |
-
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Droid+Sans"></code></li>
|
106 |
-
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:bold"></code></li>
|
107 |
-
</ul>
|
108 |
-
<hr />
|
109 |
-
<ul>
|
110 |
-
<li>
|
111 |
-
<code>
|
112 |
-
<?php
|
113 |
-
$asyncPreloadSnippet = <<<HTML
|
114 |
-
<link rel="preload" as="style" onload="this.rel='stylesheet'" id="wpacu-combined-google-fonts-css-preload" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold">
|
115 |
-
<noscript><link rel="stylesheet" id="wpacu-combined-google-fonts-css" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold"></noscript>
|
116 |
-
HTML;
|
117 |
-
echo nl2br($asyncPreloadSnippet);
|
118 |
-
?>
|
119 |
-
</code>
|
120 |
-
<p style="margin-top: 5px;"><small><strong>Note:</strong> A NOSCRIPT tag is appended to the LINK "preload" tag as a fallback in case JavaScript is disabled for any reason. For some browsers like Mozilla Firefox that don't support preloading as well as Google Chrome, an extra fallback script is loaded in the HEAD section of the website. <a target="_blank" href="https://github.com/filamentgroup/loadCSS">Read more about loadCSS</a></small></p>
|
121 |
-
</li>
|
122 |
-
</ul>
|
123 |
-
</div>
|
124 |
-
<!-- /Async preload info -->
|
125 |
-
</div>
|
126 |
-
</td>
|
127 |
-
</tr>
|
128 |
-
<tr valign="top">
|
129 |
-
<th scope="row" class="setting_title">
|
130 |
-
<?php echo sprintf(__('Apply %s CSS property value', 'wp-asset-clean-up'), '<span style="background: #f5f5f5; padding: 4px;">font-display:</span>'); ?>
|
131 |
-
</th>
|
132 |
-
<td>
|
133 |
-
<select name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_display]">
|
134 |
-
<option value="">Do not apply (default)</option>
|
135 |
-
<?php
|
136 |
-
foreach ($ddOptions as $ddOptionValue => $ddOptionText) {
|
137 |
-
$selectedOption = ($data['google_fonts_display'] === $ddOptionValue) ? 'selected="selected"' : '';
|
138 |
-
echo '<option '.$selectedOption.' value="'.$ddOptionValue.'">'.$ddOptionText.'</option>'."\n";
|
139 |
-
}
|
140 |
-
?>
|
141 |
-
</select>
|
142 |
-
|
143 |
-
<?php _e('This feature applies site-wide "&display=" with the chosen value to all the Google Font URL requests (if the parameter is not already set in the URL).', 'wp-asset-clean-up'); ?>
|
144 |
-
<?php _e('This will result in printing of "font-display" CSS property within @font-face.', 'wp-asset-clean-up'); ?>
|
145 |
-
<span style="color: #0073aa;" class="dashicons dashicons-info"></span> <a id="wpacu-google-fonts-display-info-target" href="#wpacu-google-fonts-display-info"><?php _e('Read more', 'wp-asset-clean-up'); ?></a>
|
146 |
-
|
147 |
-
<hr />
|
148 |
-
<ul>
|
149 |
-
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Mono<strong>&display=swap</strong>"></code></li>
|
150 |
-
<li><code><link rel="stylesheet" id="wpacu-combined-google-fonts-css" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold<strong>&display=swap</strong>"></code></li>
|
151 |
-
</ul>
|
152 |
-
<hr />
|
153 |
-
|
154 |
-
<p><?php echo __('Deciding the behavior for a web font as it is loading can be an important performance tuning technique. If applied, this option ensures text remains visible during webfont load.', 'wp-asset-clean-up'); ?> <?php _e('The <code>font-display</code> CSS property defines how font files are loaded and display by the browser.', 'wp-asset-clean-up'); ?></p>
|
155 |
-
|
156 |
-
<strong>Read more about this:</strong>
|
157 |
-
<a target="_blank" href="https://css-tricks.com/hey-hey-font-display/">Hey hey `font-display`</a> |
|
158 |
-
<a target="_blank" href="https://css-tricks.com/font-display-masses/">`font-display` for the Masses</a> |
|
159 |
-
<a target="_blank" href="https://developers.google.com/web/updates/2016/02/font-display">Controlling Font Performance with font-display</a> |
|
160 |
-
<a target="_blank" href="https://font-display.glitch.me/">https://font-display.glitch.me/</a> |
|
161 |
-
<a target="_blank" href="https://vimeo.com/241111413">Video: Fontastic Web Performance</a>
|
162 |
-
</td>
|
163 |
-
</tr>
|
164 |
-
<tr valign="top">
|
165 |
-
<th scope="row" class="setting_title">
|
166 |
-
<?php _e('Preconnect?', 'wp-asset-clean-up'); ?>
|
167 |
-
<p class="wpacu_subtitle"><small><em><?php _e('Don\'t let the browser wait until it sees the CSS call font files before it begins DNS/TCP/TLS', 'wp-asset-clean-up'); ?></em></small></p>
|
168 |
-
</th>
|
169 |
-
<td>
|
170 |
-
<label class="wpacu_switch">
|
171 |
-
<input id="wpacu_google_fonts_preconnect"
|
172 |
-
type="checkbox"
|
173 |
-
data-target-opacity="google_fonts_preconnect_wrap"
|
174 |
-
<?php echo (($data['google_fonts_preconnect'] == 1) ? 'checked="checked"' : ''); ?>
|
175 |
-
name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_preconnect]"
|
176 |
-
value="1" /> <span class="wpacu_slider wpacu_round"></span> </label>
|
177 |
-
If you know your website requests resources from Google Fonts (fonts.gstatic.com), then adding the preconnect resource hint will instruct the browser to preconnect to Google Fonts while it is loading the CSS, saving load time.
|
178 |
-
<hr />
|
179 |
-
<div id="google_fonts_preconnect_wrap">
|
180 |
-
<p style="margin-bottom: 5px;">This will generate the following output within <code><HEAD></code> and <code></HEAD></code>:</p>
|
181 |
-
<code><link href='https://fonts.gstatic.com' crossorigin rel='preconnect' /></code>
|
182 |
-
</div>
|
183 |
-
</td>
|
184 |
-
</tr>
|
185 |
-
<tr valign="top">
|
186 |
-
<th scope="row" class="setting_title">
|
187 |
-
<?php _e('Preload Google Font Files', 'wp-asset-clean-up'); ?>
|
188 |
-
<p class="wpacu_subtitle"><small><em><?php _e('One per line', 'wp-asset-clean-up'); ?>, only external Google Font Files are allowed</em></small></p>
|
189 |
-
</th>
|
190 |
-
<td>
|
191 |
-
<div style="margin: 0 0 6px;"><?php _e('If you wish to preload any of the Google Font Files (e.g. ending in .woff2), you can add their URL here (one per line)', 'wp-asset-clean-up'); ?>:</div>
|
192 |
-
<textarea style="width:100%;"
|
193 |
-
rows="5"
|
194 |
-
name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_preload_files]"><?php echo $data['google_fonts_preload_files']; ?></textarea>
|
195 |
-
<hr />
|
196 |
-
<p>To get the URL to the actual font file, you have to open the Google Fonts Link (e.g. https://fonts.googleapis.com/css?family=Open+Sans:bold), locate the actual @font-face (or all of them, depends on the circumstances), and then copy the value of the <code>url</code> within the 'src:' property.</p>
|
197 |
-
<strong>Examples:</strong>
|
198 |
-
<div style="margin-top: 5px;">
|
199 |
-
<div><code>https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2</code></div>
|
200 |
-
<div><code>https://fonts.gstatic.com/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhFq3-cXbKDO1w.woff2</code></div>
|
201 |
-
</div>
|
202 |
-
<hr />
|
203 |
-
<strong>Generated Output</strong>, printed within <code><HEAD></code> and <code></HEAD></code>
|
204 |
-
<div style="margin-top: 5px;">
|
205 |
-
<div style="margin-bottom: 8px;"><code><link rel="preload" as="font" href="https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2" data-wpacu-preload-font="1" crossorigin></code></div>
|
206 |
-
<div style="margin-bottom: 8px;"><code><link rel="preload" as="font" href="https://fonts.gstatic.com/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhFq3-cXbKDO1w.woff2" data-wpacu-preload-font="1" crossorigin></code></div>
|
207 |
-
</div>
|
208 |
-
</td>
|
209 |
-
</tr>
|
210 |
-
</table>
|
211 |
</div>
|
212 |
|
213 |
<div id="wpacu-google-fonts-display-info" class="wpacu-modal" style="padding-top: 70px;">
|
19 |
?>
|
20 |
<div id="<?php echo $tabIdArea; ?>" class="wpacu-settings-tab-content" <?php echo $styleTabContent; ?>>
|
21 |
<h2 class="wpacu-settings-area-title"><?php _e('Google Fonts: Load Optimizer', 'wp-asset-clean-up'); ?></h2>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
22 |
|
23 |
+
<div class="wpacu-sub-tabs-wrap"> <!-- Sub-tabs wrap -->
|
24 |
+
<!-- Sub-nav menu -->
|
25 |
+
<input class="wpacu-nav-input"
|
26 |
+
id="wpacu-google-fonts-optimize-tab-item"
|
27 |
+
type="radio"
|
28 |
+
name="wpacu_sub_tab_area"
|
29 |
+
value="wpacu-google-fonts-optimize"
|
30 |
+
<?php if (in_array($selectedSubTabArea, array('wpacu-google-fonts-optimize', ''))) { ?>checked="checked"<?php } ?> />
|
31 |
+
<label class="wpacu-nav-label"
|
32 |
+
for="wpacu-google-fonts-optimize-tab-item">Optimize Font Delivery</label>
|
33 |
+
|
34 |
+
<input class="wpacu-nav-input"
|
35 |
+
id="wpacu-google-fonts-remove-tab-item"
|
36 |
+
type="radio"
|
37 |
+
name="wpacu_sub_tab_area"
|
38 |
+
value="wpacu-google-fonts-remove"
|
39 |
+
<?php if ($selectedSubTabArea === 'wpacu-google-fonts-remove') { ?>checked="checked"<?php } ?> />
|
40 |
+
<label class="wpacu-nav-label"
|
41 |
+
for="wpacu-google-fonts-remove-tab-item">Remove All</label>
|
42 |
+
<!-- /Sub-nav menu -->
|
43 |
+
|
44 |
+
<section class="wpacu-sub-tabs-item" id="wpacu-google-fonts-optimize-tab-item-area">
|
45 |
+
<?php include_once __DIR__.'/_fonts-google/_optimize-area.php'; ?>
|
46 |
+
</section>
|
47 |
+
<section class="wpacu-sub-tabs-item" id="wpacu-google-fonts-remove-tab-item-area">
|
48 |
+
<?php include_once __DIR__.'/_fonts-google/_remove-area.php'; ?>
|
49 |
+
</section>
|
50 |
+
</div> <!-- /Sub-tabs wrap -->
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
51 |
</div>
|
52 |
|
53 |
<div id="wpacu-google-fonts-display-info" class="wpacu-modal" style="padding-top: 70px;">
|
templates/_admin-page-settings-plugin-areas/_fonts-google/_optimize-area.php
ADDED
@@ -0,0 +1,203 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
if (! isset($data)) {
|
3 |
+
exit;
|
4 |
+
}
|
5 |
+
?>
|
6 |
+
|
7 |
+
<?php
|
8 |
+
if ($data['google_fonts_remove']) {
|
9 |
+
?>
|
10 |
+
<div class="wpacu-warning" style="font-size: inherit;"><span class="dashicons dashicons-warning"></span> As the option to remove Google Fonts is turned <strong>on</strong>, the options below are irrelevant. If you turn <strong>off</strong> "Remove Google Fonts" and save settings, this notice will disappear and the options below will take effect as the fonts will be loading.</div>
|
11 |
+
<?php
|
12 |
+
}
|
13 |
+
?>
|
14 |
+
|
15 |
+
<table class="wpacu-form-table">
|
16 |
+
<tr valign="top">
|
17 |
+
<th scope="row" class="setting_title">
|
18 |
+
<label for="wpacu_google_fonts_combine"><?php _e('Combine Multiple Requests Into Fewer Ones', 'wp-asset-clean-up'); ?></label>
|
19 |
+
<p class="wpacu_subtitle"><small><em>And choose the loading option</em></small></p>
|
20 |
+
</th>
|
21 |
+
<td>
|
22 |
+
<label class="wpacu_switch">
|
23 |
+
<input id="wpacu_google_fonts_combine"
|
24 |
+
type="checkbox"
|
25 |
+
data-target-opacity="google_fonts_combine_wrap"
|
26 |
+
<?php echo (($data['google_fonts_combine'] == 1) ? 'checked="checked"' : ''); ?>
|
27 |
+
name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_combine]"
|
28 |
+
value="1" /> <span class="wpacu_slider wpacu_round"></span> </label>
|
29 |
+
|
30 |
+
<?php _e('This option combines multiple font requests into fewer requests', 'wp-asset-clean-up'); ?>. Once it's active, you can choose how the load takes place, depending on your website, by choosing one of the radio options below. <strong>You can enable this option even if you know you have one LINK request. If no combination will take place, the loading type below will be applied.</strong> Note that the asynchronous loading could cause a <strong>FOUT</strong> (flash of unstyled text) until the Google fonts get loaded, so it's recommended to test it out after the change.
|
31 |
+
|
32 |
+
<div id="google_fonts_combine_wrap" <?php if (! $data['google_fonts_combine']) { ?>style="opacity: 0.4;"<?php } ?>>
|
33 |
+
<div class="google_fonts_load_types">
|
34 |
+
<div style="flex-basis: 70%; padding-right: 20px;" class="wpacu-fancy-radio"><label for="google_fonts_combine_type_rb"><input id="google_fonts_combine_type_rb" class="google_fonts_combine_type" type="radio" name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_combine_type]" <?php if (! $data['google_fonts_combine_type']) { ?>checked="checked"<?php } ?> value="" />Render-blocking (default)</label></div>
|
35 |
+
<div style="flex-basis: 90%; padding-right: 20px;" class="wpacu-fancy-radio"><label for="google_fonts_combine_type_async"><input id="google_fonts_combine_type_async" class="google_fonts_combine_type" type="radio" name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_combine_type]" <?php if ($data['google_fonts_combine_type'] === 'async') { ?>checked="checked"<?php } ?> value="async" />Asynchronous via Web Font Loader (webfont.js)</label></div>
|
36 |
+
<div style="flex-basis: 90%;" class="wpacu-fancy-radio"><label for="google_fonts_combine_type_async_preload"><input id="google_fonts_combine_type_async_preload" class="google_fonts_combine_type" type="radio" name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_combine_type]" <?php if ($data['google_fonts_combine_type'] === 'async_preload') { ?>checked="checked"<?php } ?> value="async_preload" />Asynchronous by preloading the CSS stylesheet</label></div>
|
37 |
+
</div>
|
38 |
+
|
39 |
+
<!-- Render-blocking (default) info -->
|
40 |
+
<div id="wpacu_google_fonts_combine_type_rb_info_area" class="wpacu_google_fonts_combine_type_area" <?php if ($data['google_fonts_combine_type']) { echo 'style="display: none;"'; } ?>>
|
41 |
+
<p><strong>Example</strong> The following LINK tags will be merged into one tag:</p>
|
42 |
+
|
43 |
+
<ul>
|
44 |
+
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Droid+Sans"></code></li>
|
45 |
+
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:bold"></code></li>
|
46 |
+
</ul>
|
47 |
+
<hr />
|
48 |
+
<ul>
|
49 |
+
<li><code><link rel="stylesheet" id="wpacu-combined-google-fonts-css" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold"></code></li>
|
50 |
+
</ul>
|
51 |
+
|
52 |
+
<p><strong>Result:</strong> This simple feature saves one round trip to the server for each additional font requested (reducing the number of HTTP requests), and also protects against blocking on older browsers which only have 2 connections open per domain at a time.</p>
|
53 |
+
</div>
|
54 |
+
<!-- /Render-blocking (default) info -->
|
55 |
+
|
56 |
+
<!-- Async info -->
|
57 |
+
<div id="wpacu_google_fonts_combine_type_async_info_area" class="wpacu_google_fonts_combine_type_area" <?php if ($data['google_fonts_combine_type'] !== 'async') { echo 'style="display: none;"'; } ?>>
|
58 |
+
<p><strong>Example</strong> The following LINK tags will be converted into an inline JavaScript tag place:</p>
|
59 |
+
|
60 |
+
<ul>
|
61 |
+
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Droid+Sans"></code></li>
|
62 |
+
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:bold"></code></li>
|
63 |
+
</ul>
|
64 |
+
<hr />
|
65 |
+
<ul>
|
66 |
+
<li>
|
67 |
+
<code>
|
68 |
+
<?php
|
69 |
+
$asyncWebFontLoaderSnippet = <<<HTML
|
70 |
+
<script id='wpacu-google-fonts-async-load' type='text/javascript'>
|
71 |
+
WebFontConfig = { google: { families: ['Droid+Sans', 'Inconsolata:bold'] } };
|
72 |
+
(function(wpacuD) {
|
73 |
+
var wpacuWf = wpacuD.createElement('script'), wpacuS = wpacuD.scripts[0];
|
74 |
+
wpacuWf.src = ('https:' === document.location.protocol ? 'https' : 'http')
|
75 |
+
+ '://ajax.googleapis.com/ajax/libs/webfont/1.6.26/webfont.js';
|
76 |
+
wpacuWf.async = true;
|
77 |
+
wpacuS.parentNode.insertBefore(wpacuWf, wpacuS);
|
78 |
+
})(document);
|
79 |
+
</script><noscript><link rel="stylesheet" id="wpacu-combined-google-fonts-css" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold"></noscript>
|
80 |
+
HTML;
|
81 |
+
echo nl2br($asyncWebFontLoaderSnippet);
|
82 |
+
?>
|
83 |
+
</code>
|
84 |
+
<p style="margin-top: 5px;"><small><strong>Note:</strong> The inline tag's contents will be minified in the resulting HTML code. A NOSCRIPT tag is appended to the SCRIPT tag as a fallback in case JavaScript is disabled for any reason.</small></p>
|
85 |
+
</li>
|
86 |
+
</ul>
|
87 |
+
|
88 |
+
<p>Using the Web Font Loader asynchronously avoids blocking your page while loading the JavaScript. A <strong>disadvantage</strong> is that the rest of the page might render before the Web Font Loader is loaded and executed, which can cause a <strong>Flash of Unstyled Text (FOUT)</strong>.</p>
|
89 |
+
</div>
|
90 |
+
<!-- /Async info -->
|
91 |
+
|
92 |
+
<!-- Async preload info -->
|
93 |
+
<div id="wpacu_google_fonts_combine_type_async_preload_info_area" class="wpacu_google_fonts_combine_type_area" <?php if ($data['google_fonts_combine_type'] !== 'async_preload') { echo 'style="display: none;"'; } ?>>
|
94 |
+
<p><strong>Example</strong> The following LINK tags will be converted into a non-render blocking LINK "preload" tag:</p>
|
95 |
+
|
96 |
+
<ul>
|
97 |
+
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Droid+Sans"></code></li>
|
98 |
+
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Inconsolata:bold"></code></li>
|
99 |
+
</ul>
|
100 |
+
<hr />
|
101 |
+
<ul>
|
102 |
+
<li>
|
103 |
+
<code>
|
104 |
+
<?php
|
105 |
+
$asyncPreloadSnippet = <<<HTML
|
106 |
+
<link rel="preload" as="style" onload="this.rel='stylesheet'" id="wpacu-combined-google-fonts-css-preload" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold">
|
107 |
+
<noscript><link rel="stylesheet" id="wpacu-combined-google-fonts-css" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold"></noscript>
|
108 |
+
HTML;
|
109 |
+
|
110 |
+
echo nl2br($asyncPreloadSnippet);
|
111 |
+
?>
|
112 |
+
</code>
|
113 |
+
<p style="margin-top: 5px;"><small><strong>Note:</strong> A NOSCRIPT tag is appended to the LINK "preload" tag as a fallback in case JavaScript is disabled for any reason. For some browsers like Mozilla Firefox that don't support preloading as well as Google Chrome, an extra fallback script is loaded in the HEAD section of the website. <a target="_blank" href="https://github.com/filamentgroup/loadCSS">Read more about loadCSS</a></small></p>
|
114 |
+
</li>
|
115 |
+
</ul>
|
116 |
+
</div>
|
117 |
+
<!-- /Async preload info -->
|
118 |
+
</div>
|
119 |
+
</td>
|
120 |
+
</tr>
|
121 |
+
<tr valign="top">
|
122 |
+
<th scope="row" class="setting_title">
|
123 |
+
<?php echo sprintf(__('Apply %s CSS property value', 'wp-asset-clean-up'), '<span style="background: #f5f5f5; padding: 4px;">font-display:</span>'); ?>
|
124 |
+
</th>
|
125 |
+
<td>
|
126 |
+
<select name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_display]">
|
127 |
+
<option value="">Do not apply (default)</option>
|
128 |
+
<?php
|
129 |
+
foreach ($ddOptions as $ddOptionValue => $ddOptionText) {
|
130 |
+
$selectedOption = ($data['google_fonts_display'] === $ddOptionValue) ? 'selected="selected"' : '';
|
131 |
+
echo '<option '.$selectedOption.' value="'.$ddOptionValue.'">'.$ddOptionText.'</option>'."\n";
|
132 |
+
}
|
133 |
+
?>
|
134 |
+
</select>
|
135 |
+
|
136 |
+
<?php _e('This feature applies site-wide "&display=" with the chosen value to all the Google Font URL requests (if the parameter is not already set in the URL).', 'wp-asset-clean-up'); ?>
|
137 |
+
<?php _e('This will result in printing of "font-display" CSS property within @font-face.', 'wp-asset-clean-up'); ?>
|
138 |
+
<span style="color: #0073aa;" class="dashicons dashicons-info"></span> <a id="wpacu-google-fonts-display-info-target" href="#wpacu-google-fonts-display-info"><?php _e('Read more', 'wp-asset-clean-up'); ?></a>
|
139 |
+
|
140 |
+
<hr />
|
141 |
+
<ul>
|
142 |
+
<li><code><link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto+Mono<strong>&display=swap</strong>"></code></li>
|
143 |
+
<li><code><link rel="stylesheet" id="wpacu-combined-google-fonts-css" href="https://fonts.googleapis.com/css?family=Droid+Sans|Inconsolata:bold<strong>&display=swap</strong>"></code></li>
|
144 |
+
</ul>
|
145 |
+
<hr />
|
146 |
+
|
147 |
+
<p><?php echo __('Deciding the behavior for a web font as it is loading can be an important performance tuning technique. If applied, this option ensures text remains visible during webfont load.', 'wp-asset-clean-up'); ?> <?php _e('The <code>font-display</code> CSS property defines how font files are loaded and display by the browser.', 'wp-asset-clean-up'); ?></p>
|
148 |
+
|
149 |
+
<strong>Read more about this:</strong>
|
150 |
+
<a target="_blank" href="https://css-tricks.com/hey-hey-font-display/">Hey hey `font-display`</a> |
|
151 |
+
<a target="_blank" href="https://css-tricks.com/font-display-masses/">`font-display` for the Masses</a> |
|
152 |
+
<a target="_blank" href="https://developers.google.com/web/updates/2016/02/font-display">Controlling Font Performance with font-display</a> |
|
153 |
+
<a target="_blank" href="https://font-display.glitch.me/">https://font-display.glitch.me/</a> |
|
154 |
+
<a target="_blank" href="https://vimeo.com/241111413">Video: Fontastic Web Performance</a>
|
155 |
+
</td>
|
156 |
+
</tr>
|
157 |
+
<tr valign="top">
|
158 |
+
<th scope="row" class="setting_title">
|
159 |
+
<?php _e('Preconnect?', 'wp-asset-clean-up'); ?>
|
160 |
+
<p class="wpacu_subtitle"><small><em><?php _e('Don\'t let the browser wait until it sees the CSS call font files before it begins DNS/TCP/TLS', 'wp-asset-clean-up'); ?></em></small></p>
|
161 |
+
</th>
|
162 |
+
<td>
|
163 |
+
<label class="wpacu_switch">
|
164 |
+
<input id="wpacu_google_fonts_preconnect"
|
165 |
+
type="checkbox"
|
166 |
+
data-target-opacity="google_fonts_preconnect_wrap"
|
167 |
+
<?php echo (($data['google_fonts_preconnect'] == 1) ? 'checked="checked"' : ''); ?>
|
168 |
+
name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_preconnect]"
|
169 |
+
value="1" /> <span class="wpacu_slider wpacu_round"></span> </label>
|
170 |
+
If you know your website requests resources from Google Fonts (fonts.gstatic.com), then adding the preconnect resource hint will instruct the browser to preconnect to Google Fonts while it is loading the CSS, saving load time.
|
171 |
+
<hr />
|
172 |
+
<div id="google_fonts_preconnect_wrap">
|
173 |
+
<p style="margin-bottom: 5px;">This will generate the following output within <code><HEAD></code> and <code></HEAD></code>:</p>
|
174 |
+
<code><link href='https://fonts.gstatic.com' crossorigin rel='preconnect' /></code>
|
175 |
+
</div>
|
176 |
+
</td>
|
177 |
+
</tr>
|
178 |
+
<tr valign="top">
|
179 |
+
<th scope="row" class="setting_title">
|
180 |
+
<?php _e('Preload Google Font Files', 'wp-asset-clean-up'); ?>
|
181 |
+
<p class="wpacu_subtitle"><small><em><?php _e('One per line', 'wp-asset-clean-up'); ?>, only external Google Font Files are allowed</em></small></p>
|
182 |
+
</th>
|
183 |
+
<td>
|
184 |
+
<div style="margin: 0 0 6px;"><?php _e('If you wish to preload any of the Google Font Files (e.g. ending in .woff2), you can add their URL here (one per line)', 'wp-asset-clean-up'); ?>:</div>
|
185 |
+
<textarea style="width:100%;"
|
186 |
+
rows="5"
|
187 |
+
name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_preload_files]"><?php echo $data['google_fonts_preload_files']; ?></textarea>
|
188 |
+
<hr />
|
189 |
+
<p>To get the URL to the actual font file, you have to open the Google Fonts Link (e.g. https://fonts.googleapis.com/css?family=Open+Sans:bold), locate the actual @font-face (or all of them, depends on the circumstances), and then copy the value of the <code>url</code> within the 'src:' property.</p>
|
190 |
+
<strong>Examples:</strong>
|
191 |
+
<div style="margin-top: 5px;">
|
192 |
+
<div><code>https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2</code></div>
|
193 |
+
<div><code>https://fonts.gstatic.com/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhFq3-cXbKDO1w.woff2</code></div>
|
194 |
+
</div>
|
195 |
+
<hr />
|
196 |
+
<strong>Generated Output</strong>, printed within <code><HEAD></code> and <code></HEAD></code>
|
197 |
+
<div style="margin-top: 5px;">
|
198 |
+
<div style="margin-bottom: 8px;"><code><link rel="preload" as="font" href="https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu72xKKTU1Kvnz.woff2" data-wpacu-preload-font="1" crossorigin></code></div>
|
199 |
+
<div style="margin-bottom: 8px;"><code><link rel="preload" as="font" href="https://fonts.gstatic.com/s/robotomono/v7/L0x5DF4xlVMF-BfR8bXMIjhFq3-cXbKDO1w.woff2" data-wpacu-preload-font="1" crossorigin></code></div>
|
200 |
+
</div>
|
201 |
+
</td>
|
202 |
+
</tr>
|
203 |
+
</table>
|
templates/_admin-page-settings-plugin-areas/_fonts-google/_remove-area.php
ADDED
@@ -0,0 +1,70 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
<?php
|
2 |
+
use WpAssetCleanUp\OptimiseAssets\OptimizeCommon;
|
3 |
+
|
4 |
+
if (! isset($data)) {
|
5 |
+
exit;
|
6 |
+
}
|
7 |
+
?>
|
8 |
+
<table class="wpacu-form-table">
|
9 |
+
<tr valign="top">
|
10 |
+
<th scope="row" class="setting_title">
|
11 |
+
<label for="wpacu_google_fonts_remove"><?php _e('Remove Google Fonts', 'wp-asset-clean-up'); ?></label>
|
12 |
+
</th>
|
13 |
+
<td style="padding-bottom: 10px;">
|
14 |
+
<label class="wpacu_switch">
|
15 |
+
<input id="wpacu_google_fonts_remove"
|
16 |
+
type="checkbox"
|
17 |
+
data-target-opacity="google_fonts_remove_wrap"
|
18 |
+
<?php echo (($data['google_fonts_remove'] == 1) ? 'checked="checked"' : ''); ?>
|
19 |
+
name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[google_fonts_remove]"
|
20 |
+
value="1" /> <span class="wpacu_slider wpacu_round"></span></label>
|
21 |
+
This option removes the Google Fonts requests from your website including: <code><LINK></code> tags (included preloaded ones), @import within CSS stylesheet files / <code><STYLE></code> tags and any @font-face that loads font files from <em>fonts.gstatic.com</em>)
|
22 |
+
</td>
|
23 |
+
</tr>
|
24 |
+
</table>
|
25 |
+
<div id="google_fonts_remove_wrap" style="padding: 0 10px 10px; <?php if (! $data['google_fonts_remove']) { ?>opacity: 0.4;<?php } ?>">
|
26 |
+
<hr />
|
27 |
+
|
28 |
+
<p style="margin-bottom: 10px;"><strong style="border-bottom: 1px dotted black;">Possible reasons to remove Google Font requests</strong></p>
|
29 |
+
<ul style="list-style: circle; margin-left: 22px; margin-top: 0;">
|
30 |
+
<li>You have your own font files that you wish to implement and don't need to have any requests to Google Fonts</li>
|
31 |
+
<li>You're already using your own local fonts and you just installed a plugin that makes requests to Google Fonts leading to extra external requests which are affecting the performance</li>
|
32 |
+
</ul>
|
33 |
+
|
34 |
+
<hr />
|
35 |
+
|
36 |
+
<p style="margin-bottom: 10px;"><strong style="border-bottom: 1px dotted black;">What kind of content will be stripped?</strong> * some examples:</p>
|
37 |
+
|
38 |
+
<strong>⟶ LINK tags</strong>
|
39 |
+
<ul style="list-style: none; margin-left: 0; margin-top: 8px; margin-bottom: 20px;">
|
40 |
+
<li><code><link rel='stylesheet' href='https://fonts.googleapis.com/css?family=Roboto' /></code></li>
|
41 |
+
<li><code><link rel='preload' as='style' href='https://fonts.googleapis.com/css?family=Roboto' /></code></li>
|
42 |
+
<li><code><link rel='preload' as='font' href='https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2' crossorigin /></code></li>
|
43 |
+
<li><code><link rel='dns-prefetch' href='//fonts.googleapis.com' /></code></li>
|
44 |
+
<li><code><link rel='preconnect' href='https://fonts.gstatic.com' crossorigin /></code></li>
|
45 |
+
</ul>
|
46 |
+
|
47 |
+
<strong>⟶ @import & @font-face in CSS files (from the same domain) or STYLE tags</strong>
|
48 |
+
<ul style="list-style: none; margin-left: 0; margin-top: 8px;">
|
49 |
+
<li><code>@import "https://fonts.googleapis.com/css?family=Open+Sans+Condensed:300";</code></li>
|
50 |
+
<li><code>@import url("https://fonts.googleapis.com/css?family=Verdana:700");</code></li>
|
51 |
+
<li><?php
|
52 |
+
$cssFontFaceSample = <<<CSS
|
53 |
+
@font-face {
|
54 |
+
font-family: 'Roboto';
|
55 |
+
font-style: normal;
|
56 |
+
font-weight: 400;
|
57 |
+
src: local('Roboto'), local('Roboto-Regular'), url(https://fonts.gstatic.com/s/roboto/v20/KFOmCnqEu92Fr1Mu7mxKKTU1Kvnz.woff2) format('woff2');
|
58 |
+
unicode-range: U+1F00-1FFF;
|
59 |
+
}
|
60 |
+
CSS;
|
61 |
+
|
62 |
+
echo '<code>'.$cssFontFaceSample.'</code>';
|
63 |
+
?></li>
|
64 |
+
</ul>
|
65 |
+
<p style="margin-bottom: 6px;"><strong style="border-bottom: 1px dotted black;">Is this solution working 100% for any website?</strong></p>
|
66 |
+
If you're already using "WebFontConfig" and it's hardcoded in your theme or one of the plugins, it's not easy to strip it via an universal pattern as its code can be scattered in various places and some attempts to strip it off might broke the JavaScript file that triggers it. Thus, in rare cases, you might have some traces left of Google Font requests and you'll need to strip that manually.
|
67 |
+
|
68 |
+
<p style="margin-top: 10px; font-size: inherit;" class="wpacu-warning"><strong>Note:</strong> After you enable this option, any options from "Optimize Font Delivery" won't trigger anymore. If @import or @font-face matches are found in CSS files, the new updated files will be cached and stored in <strong>/<?php echo str_replace(ABSPATH, '', WP_CONTENT_DIR) . OptimizeCommon::getRelPathPluginCacheDir(); ?></strong>. The original files (from either plugins or the theme) won't be altered in any way.</p>
|
69 |
+
</div>
|
70 |
+
|
templates/_admin-page-settings-plugin-areas/_optimize-js.php
CHANGED
@@ -13,8 +13,11 @@ $tabIdArea = 'wpacu-setting-optimize-js';
|
|
13 |
$styleTabContent = ($selectedTabArea === $tabIdArea) ? 'style="display: table-cell;"' : '';
|
14 |
|
15 |
// [wpacu_lite]
|
|
|
16 |
$availableForProInlineJsLink = WPACU_PLUGIN_GO_PRO_URL . '?utm_source=optimize_js&utm_medium=inline_chosen_js_files';
|
17 |
-
|
|
|
|
|
18 |
// [/wpacu_lite]
|
19 |
?>
|
20 |
<div id="<?php echo $tabIdArea; ?>" class="wpacu-settings-tab-content" <?php echo $styleTabContent; ?>>
|
@@ -142,9 +145,12 @@ $availableForProInlineJs = '<a class="go-pro-link-no-style" target="_blank" href
|
|
142 |
</p>
|
143 |
|
144 |
<div style="padding: 10px; background: #f2faf2;" class="wpacu-fancy-checkbox">
|
145 |
-
<?php echo $
|
146 |
-
<input id="combine_loaded_js_append_handle_extra_checkbox"
|
147 |
-
|
|
|
|
|
|
|
148 |
<label for="combine_loaded_js_append_handle_extra_checkbox">Add inline tag contents associated with a script (handle) to the combined group of files before/after the main script's contents</label>
|
149 |
<p style="margin-top: 10px;"><small>When a file is added to a combined group of files, the CDATA as well as any other inline content (e.g. added via <code style="font-size: inherit;">wp_add_inline_script()</code>) associated with it will also be added to the combined files. This reduces the number of DOM elements as well makes sure that, in case, the combined file is deferred, the code from the inline tags is triggered at the same time as the one from the file</small></p>
|
150 |
</div>
|
13 |
$styleTabContent = ($selectedTabArea === $tabIdArea) ? 'style="display: table-cell;"' : '';
|
14 |
|
15 |
// [wpacu_lite]
|
16 |
+
$availableForProAppendInlineJsLink = WPACU_PLUGIN_GO_PRO_URL . '?utm_source=optimize_js&utm_medium=append_assoc_inline_to_combined_js';
|
17 |
$availableForProInlineJsLink = WPACU_PLUGIN_GO_PRO_URL . '?utm_source=optimize_js&utm_medium=inline_chosen_js_files';
|
18 |
+
|
19 |
+
$availableForProAppendInlineJs = '<a class="go-pro-link-no-style" target="_blank" href="'.$availableForProAppendInlineJsLink.'"><span class="wpacu-tooltip" style="width: 186px;">'.__('This is a feature available in the Pro version! Unlock it!', 'wp-asset-clean-up').'</span> <img style="opacity: 0.6;" width="20" height="20" src="'.WPACU_PLUGIN_URL.'/assets/icons/icon-lock.svg" valign="top" alt="" /></a>';
|
20 |
+
$availableForProInlineJs = '<a class="go-pro-link-no-style" target="_blank" href="'.$availableForProInlineJsLink.'"><span class="wpacu-tooltip" style="width: 186px;">'.__('This is a feature available in the Pro version! Unlock it!', 'wp-asset-clean-up').'</span> <img style="opacity: 0.6;" width="20" height="20" src="'.WPACU_PLUGIN_URL.'/assets/icons/icon-lock.svg" valign="top" alt="" /></a>';
|
21 |
// [/wpacu_lite]
|
22 |
?>
|
23 |
<div id="<?php echo $tabIdArea; ?>" class="wpacu-settings-tab-content" <?php echo $styleTabContent; ?>>
|
145 |
</p>
|
146 |
|
147 |
<div style="padding: 10px; background: #f2faf2;" class="wpacu-fancy-checkbox">
|
148 |
+
<?php echo $availableForProAppendInlineJs; ?>
|
149 |
+
<input style="opacity: 0.4;" id="combine_loaded_js_append_handle_extra_checkbox"
|
150 |
+
<?php echo (($data['combine_loaded_js_append_handle_extra'] == 1) ? 'checked="checked"' : ''); ?>
|
151 |
+
type="checkbox"
|
152 |
+
name="<?php echo WPACU_PLUGIN_ID . '_settings'; ?>[combine_loaded_js_append_handle_extra]"
|
153 |
+
value="1" />
|
154 |
<label for="combine_loaded_js_append_handle_extra_checkbox">Add inline tag contents associated with a script (handle) to the combined group of files before/after the main script's contents</label>
|
155 |
<p style="margin-top: 10px;"><small>When a file is added to a combined group of files, the CDATA as well as any other inline content (e.g. added via <code style="font-size: inherit;">wp_add_inline_script()</code>) associated with it will also be added to the combined files. This reduces the number of DOM elements as well makes sure that, in case, the combined file is deferred, the code from the inline tags is triggered at the same time as the one from the file</small></p>
|
156 |
</div>
|
templates/admin-page-settings-plugin.php
CHANGED
@@ -23,7 +23,7 @@ $wikiStatus = ($data['wiki_read'] == 1) ? '<small style="font-weight: 200; color
|
|
23 |
: '<small style="font-weight: 200; color: #cc0000;"><span class="dashicons dashicons-warning" style="width: 15px; height: 15px; margin: 2px 0 0 0; font-size: 16px;"></span> '.__('unread', 'wp-asset-clean-up').'</small>';
|
24 |
|
25 |
$showSettingsType = array_key_exists('wpacu_show_all', $_GET) ? 'all' : 'tabs';
|
26 |
-
$selectedTabArea = '';
|
27 |
|
28 |
if ($showSettingsType === 'tabs') {
|
29 |
$settingsTabs = array(
|
@@ -39,6 +39,11 @@ if ($showSettingsType === 'tabs') {
|
|
39 |
'wpacu-setting-disable-xml-rpc' => __( 'Disable XML-RPC', 'wp-asset-clean-up' ),
|
40 |
);
|
41 |
|
|
|
|
|
|
|
|
|
|
|
42 |
$settingsTabActive = 'wpacu-setting-plugin-usage-settings';
|
43 |
|
44 |
// Is 'Stripping the "fat"' marked as read? Mark the "General & Files Management" as the default tab
|
@@ -49,9 +54,13 @@ if ($showSettingsType === 'tabs') {
|
|
49 |
? $_REQUEST['wpacu_selected_tab_area'] // after update
|
50 |
: $defaultTabArea; // default
|
51 |
|
52 |
-
if ($selectedTabArea && array_key_exists(
|
53 |
$settingsTabActive = $selectedTabArea;
|
54 |
}
|
|
|
|
|
|
|
|
|
55 |
}
|
56 |
?>
|
57 |
<div class="wpacu-wrap wpacu-settings-area <?php if ($showSettingsType === 'all') { echo 'wpacu-settings-show-all'; } ?> <?php if ($data['input_style'] !== 'standard') { ?>wpacu-switch-enhanced<?php } else { ?>wpacu-switch-standard<?php } ?>">
|
@@ -94,7 +103,7 @@ if ($showSettingsType === 'tabs') {
|
|
94 |
}
|
95 |
|
96 |
if ($settingsTabKey === 'wpacu-setting-google-fonts') {
|
97 |
-
$wpacuNavTextSub .= '<div style="margin-top: 3px;"><small style="font-weight: lighter;">Combine, Async Load, Font-Display, Preconnect, Preload</small></div>';
|
98 |
}
|
99 |
?>
|
100 |
<a href="#<?php echo $settingsTabKey; ?>"
|
@@ -135,6 +144,10 @@ if ($showSettingsType === 'tabs') {
|
|
135 |
name="wpacu_selected_tab_area"
|
136 |
id="wpacu-selected-tab-area"
|
137 |
value="<?php echo $selectedTabArea; ?>" />
|
|
|
|
|
|
|
|
|
138 |
</form>
|
139 |
</div>
|
140 |
|
23 |
: '<small style="font-weight: 200; color: #cc0000;"><span class="dashicons dashicons-warning" style="width: 15px; height: 15px; margin: 2px 0 0 0; font-size: 16px;"></span> '.__('unread', 'wp-asset-clean-up').'</small>';
|
24 |
|
25 |
$showSettingsType = array_key_exists('wpacu_show_all', $_GET) ? 'all' : 'tabs';
|
26 |
+
$selectedTabArea = $selectedSubTabArea = '';
|
27 |
|
28 |
if ($showSettingsType === 'tabs') {
|
29 |
$settingsTabs = array(
|
39 |
'wpacu-setting-disable-xml-rpc' => __( 'Disable XML-RPC', 'wp-asset-clean-up' ),
|
40 |
);
|
41 |
|
42 |
+
$settingsSubTabs = array(
|
43 |
+
'wpacu-google-fonts-optimize',
|
44 |
+
'wpacu-google-fonts-remove'
|
45 |
+
);
|
46 |
+
|
47 |
$settingsTabActive = 'wpacu-setting-plugin-usage-settings';
|
48 |
|
49 |
// Is 'Stripping the "fat"' marked as read? Mark the "General & Files Management" as the default tab
|
54 |
? $_REQUEST['wpacu_selected_tab_area'] // after update
|
55 |
: $defaultTabArea; // default
|
56 |
|
57 |
+
if ($selectedTabArea && array_key_exists($selectedTabArea, $settingsTabs)) {
|
58 |
$settingsTabActive = $selectedTabArea;
|
59 |
}
|
60 |
+
|
61 |
+
$selectedSubTabArea = isset($_REQUEST['wpacu_selected_sub_tab_area']) // after update
|
62 |
+
? $_REQUEST['wpacu_selected_sub_tab_area']
|
63 |
+
: ''; // default
|
64 |
}
|
65 |
?>
|
66 |
<div class="wpacu-wrap wpacu-settings-area <?php if ($showSettingsType === 'all') { echo 'wpacu-settings-show-all'; } ?> <?php if ($data['input_style'] !== 'standard') { ?>wpacu-switch-enhanced<?php } else { ?>wpacu-switch-standard<?php } ?>">
|
103 |
}
|
104 |
|
105 |
if ($settingsTabKey === 'wpacu-setting-google-fonts') {
|
106 |
+
$wpacuNavTextSub .= '<div style="margin-top: 3px;"><small style="font-weight: lighter;">Combine, Async Load, Font-Display, Preconnect, Preload, Removal</small></div>';
|
107 |
}
|
108 |
?>
|
109 |
<a href="#<?php echo $settingsTabKey; ?>"
|
144 |
name="wpacu_selected_tab_area"
|
145 |
id="wpacu-selected-tab-area"
|
146 |
value="<?php echo $selectedTabArea; ?>" />
|
147 |
+
<input type="hidden"
|
148 |
+
name="wpacu_selected_sub_tab_area"
|
149 |
+
id="wpacu-selected-sub-tab-area"
|
150 |
+
value="<?php echo $selectedSubTabArea; ?>" />
|
151 |
</form>
|
152 |
</div>
|
153 |
|
templates/meta-box-loaded-assets/_asset-style-single-row.php
CHANGED
@@ -54,12 +54,12 @@ sort($childHandles);
|
|
54 |
$ver = (isset($data['row']['obj']->ver) && trim($data['row']['obj']->ver)) ? $data['row']['obj']->ver : $data['wp_version'];
|
55 |
$data['row']['obj']->preload_status = 'not_preloaded'; // default
|
56 |
|
57 |
-
$styleHandleHasSrc = false;
|
58 |
|
59 |
if (isset($data['row']['obj']->src, $data['row']['obj']->srcHref) && $data['row']['obj']->src && $data['row']['obj']->srcHref) {
|
60 |
$styleHandleHasSrc = true;
|
61 |
|
62 |
-
$isGoogleFontLink = stripos($data['row']['obj']->srcHref, 'fonts.googleapis.com')
|
63 |
|
64 |
// Formatting for Google Fonts
|
65 |
if ($isGoogleFontLink) {
|
@@ -80,11 +80,15 @@ sort($childHandles);
|
|
80 |
$toUnderline = 'display='.$data['plugin_settings']['google_fonts_display'];
|
81 |
$relSrc = str_replace($toUnderline, '<u style="background: #f2faf2;">'.$toUnderline.'</u>', $relSrc);
|
82 |
|
83 |
-
|
84 |
|
85 |
if ($isGoogleFontLink) {
|
86 |
$appendAfterSrcHref .= (strpos($data['row']['obj']->srcHref, '?') === false) ? '?' : '&';
|
87 |
$appendAfterSrcHref .= 'ver=' . $ver;
|
|
|
|
|
|
|
|
|
88 |
}
|
89 |
|
90 |
$isCssPreload = (isset($data['preloads']['styles'][$data['row']['obj']->handle]) && $data['preloads']['styles'][$data['row']['obj']->handle])
|
@@ -94,6 +98,10 @@ sort($childHandles);
|
|
94 |
if ($isCssPreload) {
|
95 |
$data['row']['obj']->preload_status = 'preloaded';
|
96 |
}
|
|
|
|
|
|
|
|
|
97 |
?>
|
98 |
<p>
|
99 |
<?php _e('Source:', 'wp-asset-clean-up'); ?> <a target="_blank" style="color: green;" href="<?php echo $data['row']['obj']->srcHref . $appendAfterSrcHref; ?>"><?php echo $relSrc; ?></a>
|
54 |
$ver = (isset($data['row']['obj']->ver) && trim($data['row']['obj']->ver)) ? $data['row']['obj']->ver : $data['wp_version'];
|
55 |
$data['row']['obj']->preload_status = 'not_preloaded'; // default
|
56 |
|
57 |
+
$styleHandleHasSrc = $showGoogleFontRemoveNotice = false;
|
58 |
|
59 |
if (isset($data['row']['obj']->src, $data['row']['obj']->srcHref) && $data['row']['obj']->src && $data['row']['obj']->srcHref) {
|
60 |
$styleHandleHasSrc = true;
|
61 |
|
62 |
+
$isGoogleFontLink = stripos($data['row']['obj']->srcHref, '//fonts.googleapis.com/') !== false;
|
63 |
|
64 |
// Formatting for Google Fonts
|
65 |
if ($isGoogleFontLink) {
|
80 |
$toUnderline = 'display='.$data['plugin_settings']['google_fonts_display'];
|
81 |
$relSrc = str_replace($toUnderline, '<u style="background: #f2faf2;">'.$toUnderline.'</u>', $relSrc);
|
82 |
|
83 |
+
$appendAfterSrcHref = '';
|
84 |
|
85 |
if ($isGoogleFontLink) {
|
86 |
$appendAfterSrcHref .= (strpos($data['row']['obj']->srcHref, '?') === false) ? '?' : '&';
|
87 |
$appendAfterSrcHref .= 'ver=' . $ver;
|
88 |
+
|
89 |
+
if ($data['plugin_settings']['google_fonts_remove']) {
|
90 |
+
$showGoogleFontRemoveNotice = '<span style="color:#c00;">This resource is not loaded as "Remove Google Fonts" is enabled in "Settings" -> "Google Fonts".</span>';
|
91 |
+
}
|
92 |
}
|
93 |
|
94 |
$isCssPreload = (isset($data['preloads']['styles'][$data['row']['obj']->handle]) && $data['preloads']['styles'][$data['row']['obj']->handle])
|
98 |
if ($isCssPreload) {
|
99 |
$data['row']['obj']->preload_status = 'preloaded';
|
100 |
}
|
101 |
+
|
102 |
+
if ($showGoogleFontRemoveNotice) {
|
103 |
+
echo $showGoogleFontRemoveNotice;
|
104 |
+
}
|
105 |
?>
|
106 |
<p>
|
107 |
<?php _e('Source:', 'wp-asset-clean-up'); ?> <a target="_blank" style="color: green;" href="<?php echo $data['row']['obj']->srcHref . $appendAfterSrcHref; ?>"><?php echo $relSrc; ?></a>
|
wpacu.php
CHANGED
@@ -2,7 +2,7 @@
|
|
2 |
/*
|
3 |
* Plugin Name: Asset CleanUp: Page Speed Booster
|
4 |
* Plugin URI: https://wordpress.org/plugins/wp-asset-clean-up/
|
5 |
-
* Version: 1.3.4.
|
6 |
* Description: Unload Chosen Scripts & Styles from Posts/Pages to reduce HTTP Requests, Combine/Minify CSS/JS files
|
7 |
* Author: Gabriel Livan
|
8 |
* Author URI: http://gabelivan.com/
|
@@ -12,7 +12,7 @@
|
|
12 |
|
13 |
// Is the Pro version triggered before the Lite one and are both plugins active?
|
14 |
if (! defined('WPACU_PLUGIN_VERSION')) {
|
15 |
-
define('WPACU_PLUGIN_VERSION', '1.3.4.
|
16 |
}
|
17 |
|
18 |
// Exit if accessed directly
|
2 |
/*
|
3 |
* Plugin Name: Asset CleanUp: Page Speed Booster
|
4 |
* Plugin URI: https://wordpress.org/plugins/wp-asset-clean-up/
|
5 |
+
* Version: 1.3.4.2
|
6 |
* Description: Unload Chosen Scripts & Styles from Posts/Pages to reduce HTTP Requests, Combine/Minify CSS/JS files
|
7 |
* Author: Gabriel Livan
|
8 |
* Author URI: http://gabelivan.com/
|
12 |
|
13 |
// Is the Pro version triggered before the Lite one and are both plugins active?
|
14 |
if (! defined('WPACU_PLUGIN_VERSION')) {
|
15 |
+
define('WPACU_PLUGIN_VERSION', '1.3.4.2');
|
16 |
}
|
17 |
|
18 |
// Exit if accessed directly
|