From d8349db01912bdda468ff6932421473c7f964122 Mon Sep 17 00:00:00 2001 From: Armand Tresova Date: Tue, 17 Mar 2026 21:28:44 -0400 Subject: [PATCH 1/8] Validated cooked-recipe-card & cooked-category shortcodes style attribute #97 --- includes/class.cooked-shortcodes.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/includes/class.cooked-shortcodes.php b/includes/class.cooked-shortcodes.php index 83c1ad1..e4b82fc 100644 --- a/includes/class.cooked-shortcodes.php +++ b/includes/class.cooked-shortcodes.php @@ -198,7 +198,8 @@ public function cooked_recipe_card_shortcode( $atts, $content = null ) { $recipe_id = intval( $atts['id'] ); $category_id = intval( $atts['category'] ); $width = Cooked_Functions::sanitize_text_field( $atts['width'] ); - $style = Cooked_Functions::sanitize_text_field( $atts['style'] ); + $valid_styles = [ 'modern', 'modern-centered' ]; + $style = in_array( $atts['style'], $valid_styles, true ) ? $atts['style'] : false; $hide_image = Cooked_Functions::sanitize_text_field( $atts['hide_image'] ); $hide_total = Cooked_Functions::sanitize_text_field( $atts['hide_total'] ); $hide_title = Cooked_Functions::sanitize_text_field( $atts['hide_title'] ); @@ -228,7 +229,8 @@ public function cooked_categories_shortcode( $atts, $content = null ) { $hide_empty = Cooked_Functions::sanitize_text_field( $atts['hide_empty'] ); $child_of = Cooked_Functions::sanitize_text_field( $atts['child_of'] ); - $style = Cooked_Functions::sanitize_text_field( $atts['style'] ); + $valid_styles = [ 'block', 'list' ]; + $style = in_array( $atts['style'], $valid_styles, true ) ? $atts['style'] : 'block'; $parents_only = $child_of ? false : true; ob_start(); From 4d9f4f8730d80235e9b7af92b25c5d5616600fa7 Mon Sep 17 00:00:00 2001 From: Armand Tresova Date: Tue, 17 Mar 2026 21:42:17 -0400 Subject: [PATCH 2/8] Fixed Migrations and Imports Don't Handle Ingredient Substitutions #125 --- includes/class.cooked-delicious-recipes.php | 3 +++ includes/class.cooked-recipe-maker.php | 3 +++ includes/class.cooked-recipes.php | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/includes/class.cooked-delicious-recipes.php b/includes/class.cooked-delicious-recipes.php index d6abd51..f18711d 100644 --- a/includes/class.cooked-delicious-recipes.php +++ b/includes/class.cooked-delicious-recipes.php @@ -147,6 +147,9 @@ public static function import_recipe($id) { 'name' => (!empty($ingredient['ingredient']) ? $ingredient['ingredient'] : ''), 'url' => '', 'description' => (!empty($ingredient['notes']) ? $ingredient['notes'] : ''), + 'sub_amount' => '', + 'sub_measurement' => '', + 'sub_name' => '', ]; } } diff --git a/includes/class.cooked-recipe-maker.php b/includes/class.cooked-recipe-maker.php index aeca158..d5202dc 100644 --- a/includes/class.cooked-recipe-maker.php +++ b/includes/class.cooked-recipe-maker.php @@ -148,6 +148,9 @@ public static function import_recipe($id) { 'name' => (!empty($ingredient['name']) ? $ingredient['name'] : ''), 'url' => '', 'description' => (!empty($ingredient['notes']) ? $ingredient['notes'] : ''), + 'sub_amount' => '', + 'sub_measurement' => '', + 'sub_name' => '', ]; } } diff --git a/includes/class.cooked-recipes.php b/includes/class.cooked-recipes.php index ea8d778..c970606 100644 --- a/includes/class.cooked-recipes.php +++ b/includes/class.cooked-recipes.php @@ -1349,6 +1349,9 @@ public static function sync_c2_recipe_settings( $c2_recipe_settings, $recipe_id $recipe_settings['ingredients'][$rand_id]['amount'] = $ing['amount']; $recipe_settings['ingredients'][$rand_id]['measurement'] = $ing['measurement']; $recipe_settings['ingredients'][$rand_id]['name'] = $ing['name']; + $recipe_settings['ingredients'][$rand_id]['sub_amount'] = ''; + $recipe_settings['ingredients'][$rand_id]['sub_measurement'] = ''; + $recipe_settings['ingredients'][$rand_id]['sub_name'] = ''; elseif ( isset($ing['type']) && $ing['type'] == 'section' ): $recipe_settings['ingredients'][$rand_id]['section_heading_name'] = $ing['value']; else: @@ -1358,6 +1361,9 @@ public static function sync_c2_recipe_settings( $c2_recipe_settings, $recipe_id $recipe_settings['ingredients'][$rand_id]['amount'] = false; $recipe_settings['ingredients'][$rand_id]['measurement'] = false; $recipe_settings['ingredients'][$rand_id]['name'] = $ing; + $recipe_settings['ingredients'][$rand_id]['sub_amount'] = ''; + $recipe_settings['ingredients'][$rand_id]['sub_measurement'] = ''; + $recipe_settings['ingredients'][$rand_id]['sub_name'] = ''; endif; endif; endforeach; From 01b1ddad68e64145f45e4fc3c5f97fd2d40324b6 Mon Sep 17 00:00:00 2001 From: Armand Tresova Date: Wed, 18 Mar 2026 14:22:33 -0400 Subject: [PATCH 3/8] Fixed Potential Performance Issues When Updating Recipe Template in Bulk #123 --- assets/admin/js/cooked-functions.js | 98 ++++++++++++------------- assets/admin/js/cooked-functions.min.js | 2 +- includes/class.cooked-ajax.php | 87 +++++++++++++--------- 3 files changed, 100 insertions(+), 87 deletions(-) diff --git a/assets/admin/js/cooked-functions.js b/assets/admin/js/cooked-functions.js index 638fbe1..00dd580 100644 --- a/assets/admin/js/cooked-functions.js +++ b/assets/admin/js/cooked-functions.js @@ -178,32 +178,29 @@ var cookedSortableTouchHandler = function(event) { if (confirm_save && !thisButton.hasClass('disabled')) { thisContainer.find('.button, .button-primary').addClass('disabled'); - var ajax__save_default_new = $.post( + $.post( cooked_admin_functions_js_vars.ajax_url, { action: 'cooked_save_default', 'default_content': recipe_editor_content, nonce: cooked_save_default_nonce }, - function(result) { - var ajax__save_default_all = $.post( + function() { + $.post( cooked_admin_functions_js_vars.ajax_url, { - action: 'cooked_get_recipe_ids', + action: 'cooked_get_recipe_count', nonce: cooked_save_default_bulk_nonce }, - function(json_recipe_ids) { + function(response) { thisButton.removeClass("button-primary").addClass("button"); - if (json_recipe_ids) { - var recipe_ids = JSON.parse(json_recipe_ids), - total_recipes = Object.keys(recipe_ids).length; - - if (total_recipes > 0) { - cooked_set_default_template(json_recipe_ids, total_recipes, recipe_editor_content, cooked_save_default_bulk_nonce, instance); - } + if (response && response.success && response.data.total > 0) { + cooked_recipe_update_counter = 0; + cooked_set_default_template(0, response.data.total, recipe_editor_content, cooked_save_default_bulk_nonce, instance); } - } + }, + 'json' ); } ); @@ -794,54 +791,55 @@ var cookedSortableTouchHandler = function(event) { })( jQuery ); var cooked_recipe_update_counter = 0; +var cooked_bulk_per_page = 20; -function cooked_set_default_template(recipe_ids, total_recipes, content, nonce, instance) { - var temp_counter = 0, - total_counter = 0, - progress_percent = 0; - - if (total_recipes > 0) { - var progress = jQuery('#cooked-template-progress'); - var progress_bar = progress.find('.cooked-progress-bar'); - var progress_text = jQuery('#cooked-template-progress-text'); - - if (!progress.hasClass('cooked-active')) { - progress.addClass('cooked-active'); - progress_text.addClass('cooked-active'); - progress_bar.css({ "width" : "0%" }); - instance.reposition(); - } +function cooked_set_default_template(page, total_recipes, content, nonce, instance) { + if (total_recipes <= 0) { + return; + } + + var progress = jQuery('#cooked-template-progress'); + var progress_bar = progress.find('.cooked-progress-bar'); + var progress_text = jQuery('#cooked-template-progress-text'); - var ajax__bulk_save_default_template = jQuery.post( - cooked_admin_functions_js_vars.ajax_url, - { - action: 'cooked_save_default_bulk', - recipe_ids: recipe_ids, - default_content: content, - nonce: nonce - }, - function(new_recipe_ids) { - if (new_recipe_ids && new_recipe_ids != 'false' && new_recipe_ids != false) { - var leftover_recipe_ids = JSON.parse(new_recipe_ids), - leftover_recipes = Object.keys(leftover_recipe_ids).length; - - cooked_recipe_update_counter = total_recipes - leftover_recipes; - - progress_percent = Math.round((cooked_recipe_update_counter / total_recipes ) * 100); - progress_bar.css({ "width" : progress_percent + "%" }); - progress_text.text(cooked_recipe_update_counter + " / " + total_recipes); - cooked_set_default_template(new_recipe_ids, total_recipes, content, nonce, instance); + if (!progress.hasClass('cooked-active')) { + progress.addClass('cooked-active'); + progress_text.addClass('cooked-active'); + progress_bar.css({ "width" : "0%" }); + instance.reposition(); + } + + jQuery.post( + cooked_admin_functions_js_vars.ajax_url, + { + action: 'cooked_save_default_bulk', + page: page, + default_content: content, + nonce: nonce + }, + function(response) { + if (response && response.success) { + cooked_recipe_update_counter = Math.min((page + 1) * cooked_bulk_per_page, total_recipes); + + var progress_percent = Math.round((cooked_recipe_update_counter / total_recipes) * 100); + progress_bar.css({ "width" : progress_percent + "%" }); + progress_text.text(cooked_recipe_update_counter + " / " + total_recipes); + + if (response.data.has_more) { + cooked_set_default_template(page + 1, total_recipes, content, nonce, instance); } else { jQuery('.cooked-save-default-all').text(cooked_admin_functions_js_vars.i18n_applied); progress_bar.css({ "width" : "100%" }); + progress_text.text(total_recipes + " / " + total_recipes); progress.removeClass('cooked-active'); progress_text.removeClass('cooked-active').text(""); instance.reposition(); } } - ); - }; + }, + 'json' + ); } function cooked_updateTotalTimeValue( prepTime, cookTime ) { diff --git a/assets/admin/js/cooked-functions.min.js b/assets/admin/js/cooked-functions.min.js index 2d9cc3e..8981ee5 100644 --- a/assets/admin/js/cooked-functions.min.js +++ b/assets/admin/js/cooked-functions.min.js @@ -1 +1 @@ -var $_CookedConditionalTimeout=!1,cookedSortableTouchHandler=function(e){var t={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"},o=e.target.closest(".cooked-icon-drag");o&&o.closest(".cooked-sortable")&&e.changedTouches&&e.changedTouches.length&&t[e.type]&&(o=e.changedTouches[0],e.preventDefault(),t=new MouseEvent(t[e.type],{bubbles:!0,cancelable:!0,view:window,detail:1,screenX:o.screenX,screenY:o.screenY,clientX:o.clientX,clientY:o.clientY,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null}),o.target.dispatchEvent(t))},cooked_recipe_update_counter=((p=>{p(document).ready(function(){var r,o,t,e,i,n,a,d,c,s=p(".cooked-color-field"),l=p("#cooked_recipe_settings").find("select"),u=p("#cooked-recipe-tabs"),k=(p("#cooked-settings-wrap"),p("#cooked_recipe_settings")),_=k.find("input#submit");$_CookedTooltips=p(".cooked-tooltip"),$_CookedConditionals=p(".cooked-conditional-hidden"),$_CookedSortable=p(".cooked-sortable"),$_CookedRecipeSaveDefault=p(".cooked-layout-save-default"),$_CookedShortcodeField=p(".cooked-shortcode-field"),$_CookedIngredientBuilder=p("#cooked-ingredients-builder"),$_CookedAutoNutritionButton=p(".cooked-auto-nutrition-button"),$_CookedDirectionBuilder=p("#cooked-directions-builder"),$_CookedRecipeGallery=p("#cooked-recipe-image-gallery"),$_CookedNutritionFactsTab=p("#cooked-recipe-tab-content-nutrition"),$_CookedSettingsPanel=p("#cooked-settings-panel"),$_CookedSettingsTabs=p("#cooked-settings-tabs"),s.length&&s.wpColorPicker(),$_CookedSortable.length&&(document.addEventListener("touchstart",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchmove",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchend",cookedSortableTouchHandler,{passive:!1}),$_CookedSortable.find(".cooked-icon-drag").length?$_CookedSortable.sortable({handle:".cooked-icon-drag",stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder();var t=t.item.find("textarea"),o=!(!cooked_admin_functions_js_vars.wp_editor_roles_allowed||"undefined"==typeof wp||!wp.editor||"function"!=typeof wp.editor.remove||"function"!=typeof wp.editor.initialize);t.length&&o&&(o=t.attr("name"),t=t.attr("id"),wp.editor.remove(t),wp.editor.initialize(t,{tinymce:{wpautop:!1,toolbar1:"bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,wp_link_advanced,unlink,fullscreen",toolbar2:"",toolbar3:"",toolbar4:"",height:100,textarea_name:o,plugins:"link lists fullscreen wordpress wplink",setup:function(e){}},quicktags:!0,mediaButtons:!1}))}}):$_CookedSortable.sortable({stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder()}})),$_CookedRecipeSaveDefault.length&&($_CookedRecipeSaveDefault.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],trigger:"click",animation:"grow",delay:0,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0,functionReady:function(c,e){p(".cooked-save-default-all").on("click",function(e){e.preventDefault();var o,i=p(this),e=i.data("nonce"),n=i.data("bulk-nonce"),t=i.parent(),a=confirm(cooked_admin_functions_js_vars.i18n_confirm_save_default_all),d=p("#_recipe_settings_content"),r=tinymce.get("_recipe_settings_content");o=null===r?d.val():r.getContent(),a&&!i.hasClass("disabled")&&(t.find(".button, .button-primary").addClass("disabled"),p.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:o,nonce:e},function(e){p.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_get_recipe_ids",nonce:n},function(e){var t;i.removeClass("button-primary").addClass("button"),e&&(t=JSON.parse(e),0<(t=Object.keys(t).length))&&cooked_set_default_template(e,t,o,n,c)})}))}),p(".cooked-save-default-new").on("click",function(e){e.preventDefault();var t=p(this),e=t.data("nonce"),o=t.parent(),i=p("#_recipe_settings_content"),n=tinymce.get("_recipe_settings_content");i=null===n?i.val():n.getContent(),t.hasClass("disabled")||(o.find(".button, .button-primary").addClass("disabled"),p.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:i,nonce:e},function(e){t.text(cooked_admin_functions_js_vars.i18n_saved),o.find(".button-primary").removeClass("disabled")}).fail(function(e){}))})}}),p(".cooked-layout-load-default").on("click",function(e){e.preventDefault();var e=p(this),t=e.parent(),o=confirm(cooked_admin_functions_js_vars.i18n_confirm_load_default),i=p("#_recipe_settings_content"),n=tinymce.get("_recipe_settings_content");o&&!e.hasClass("disabled")&&(t.find(".button, .button-primary").addClass("disabled"),p.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_load_default"},function(e){null===n?i.val(e):(i.val(e),n.setContent(e)),t.find(".button, .button-primary").removeClass("disabled")}).fail(function(e){t.find(".button, .button-primary").removeClass("disabled")}))})),l.length&&l.each(function(){p(this).wrap('
')}),$_CookedTooltips.length&&$_CookedTooltips.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],animation:"grow",delay:100,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0}),$_CookedShortcodeField.length&&$_CookedShortcodeField.on("click",function(e){p(this).select()}),$_CookedConditionals.length&&(r=[],$_CookedConditionals.each(function(){var e=p(this),t=p(this).data("condition"),o=p(this).data("value"),i=p("#"+t),o=!!o&&o.split(" "),n=e.is("li")||e.is("span")?"inline-block":"block";i.is(":checkbox")&&i.is(":checked")||i.is(":radio")&&i.is(":checked")||!(i.is(":checkbox")&&!i.is(":checked")||i.is(":radio")&&!i.is(":checked"))&&(!i.is(":checkbox")&&!o&&i.val()||!i.is(":checkbox")&&o&&-1 a").attr("href")).split("#"))[1],p(".cooked-settings-tab-content").hide(),p("#cooked-settings-tab-content-"+n).show(),l.on("click",function(e){p(".tab-content").hide();var t=p(this).find("a"),t=($_CookedSettingsTabs.find("li").removeClass("active"),p(this).addClass("active"),t.attr("href"));"migration"==(t=(t=t.split("#"))[1])?_.hide():_.show(),p(".cooked-settings-tab-content").hide(),p("#cooked-settings-tab-content-"+t).show(),p("#cooked-settings-panel").hasClass("stuck")?window.scrollTo(0,130):window.scrollTo(0,0)})),$_CookedIngredientBuilder.length&&(cooked_reset_ingredient_builder(),$_CookedIngredientBuilder.on("keydown",'input[data-ingredient-part="name"]',function(e){9!==e.keyCode&&13!==e.keyCode||p(this).parents(".cooked-ingredient-block").is(":last-child")&&(e.preventDefault(),p("#cooked-recipe-tab-content-ingredients").find(".cooked-add-ingredient-button").trigger("click"),$_CookedIngredientBuilder.find('.cooked-ingredient-block:last-child input[data-ingredient-part="amount"]').focus())}),$_CookedIngredientBuilder.parent().on("click",".cooked-show-substitution",function(e){e.preventDefault();e=p(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-ingredient-part="sub_amount"]').focus())}),$_CookedIngredientBuilder.on("keyup change",'input[data-ingredient-part="sub_amount"], input[data-ingredient-part="sub_name"], select[data-ingredient-part="sub_measurement"]',function(e){var t=p(this).parents(".recipe-setting-block"),o=t.find('input[data-ingredient-part="sub_name"]').val();o&&o.trim()?t.addClass("cooked-has-substitution"):t.removeClass("cooked-has-substitution")}),$_CookedAutoNutritionButton.length&&$_CookedIngredientBuilder.on("change",'input[data-ingredient-part="name"]',function(e){var t=!1;$_CookedIngredientBuilder.find('input[data-ingredient-part="name"]').each(function(){if(""!=p(this).val())return!(t=!0)}),t?$_CookedAutoNutritionButton.prop("disabled",!1):$_CookedAutoNutritionButton.prop("disabled",!0)}),$_CookedIngredientBuilder.on("keyup",'input[data-ingredient-part="url"]',function(e){var t=p(this).val(),o=p(this).parents(".recipe-setting-block");t?o.addClass("cooked-has-url"):o.removeClass("cooked-has-url")}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-ingredient-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-ingredient-template").clone().removeClass("cooked-template cooked-ingredient-template").addClass("cooked-ingredient-block");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-ingredient-block cooked-ingredient-heading");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-delete-ingredient",function(e){e.preventDefault(),p(this).parent().remove(),cooked_reset_ingredient_builder()})),$_CookedDirectionBuilder.length&&(cooked_reset_direction_builder(),$_CookedDirectionBuilder.parent().on("click",".cooked-show-heading-element",function(e){e.preventDefault();e=p(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-direction-part="section_heading_element"]').focus())}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-direction-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-direction-template").clone().removeClass("cooked-template cooked-direction-template").addClass("cooked-direction-block");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-direction-block cooked-direction-heading");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-delete-direction",function(e){e.preventDefault();var t,e=p(this).parent();cooked_admin_functions_js_vars.wp_editor_roles_allowed&&"undefined"!=typeof wp&&wp.editor&&"function"==typeof wp.editor.remove&&(t=e.find('textarea[data-direction-part="content"]').attr("id"))&&wp.editor.remove(t),e.remove(),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".remove-image-button",function(e){e.preventDefault();e=p(this).parent();e.removeClass("cooked-has-image"),e.find("img").attr("src","").removeAttr("srcset").removeAttr("sizes"),e.find('input[data-direction-part="image"]').val(""),cooked_reset_direction_builder()}),p("body").on("click",".cooked-direction-img-placeholder, .cooked-direction-img",function(e){e.preventDefault(),p(this).parent().find(".direction-image-button").trigger("click")}),p("body").on("click",".direction-image-button",function(e){var t=p(this);d=t.data("id"),e.preventDefault(),a||(a=wp.media.frames.direction_image_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_image_title,button:{text:cooked_admin_functions_js_vars.i18n_image_button},library:{type:"image"}})).on("select",function(){var e=a.state().get("selection").first().toJSON();p("#direction-"+d+"-image-src").attr("src",e.sizes.thumbnail.url).removeAttr("srcset").removeAttr("sizes").parent().addClass("cooked-has-image"),p('input[name="_recipe_settings[directions]['+d+'][image]"]').val(e.id),p('.direction-image-button[data-id="'+d+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_change)}),a.open()})),$_CookedRecipeGallery.length&&(cooked_init_gallery_sorting(),p("body").on("click",".cooked-gallery-add-button",function(e){p(this);e.preventDefault(),c||(c=wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_gallery_image_title,button:{text:cooked_admin_functions_js_vars.i18n_gallery_image_title},library:{type:"image"},multiple:!0})).on("select",function(){var e,t,o,i=c.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,p("#cooked-recipe-image-gallery").append(''));cooked_init_gallery_sorting()}),c.open()}),p("body").on("click",".cooked-recipe-gallery-item img",function(e){e.preventDefault(),p(this).parent().find(".cooked-gallery-edit-button").trigger("click")}),p("body").on("click",".cooked-gallery-edit-button",function(e){var n=p(this),t=n.data("attachment-id"),a=(e.preventDefault(),wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_edit_image_title,button:{text:cooked_admin_functions_js_vars.i18n_edit_image_button},library:{type:"image"},multiple:!1}));a.on("open",function(){var e=a.state().get("selection");(attachment=wp.media.attachment(t)).fetch(),e.add(attachment?[attachment]:[])}),a.open(),a.on("select",function(){var e,t,o,i=a.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,n.parent().replaceWith(''));cooked_init_gallery_sorting()})}),$_CookedRecipeGallery.on("click",".remove-image-button",function(e){var t=p(this);d=t.data("id"),e.preventDefault(),d?(p("#direction-"+d+"-image-src").parent().removeClass("cooked-has-image").prop("src",!1),p('input[name="_recipe_settings[directions]['+d+'][image]"]').val(""),p('.direction-image-button[data-id="'+d+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_title)):t.parent().remove()})),$_CookedNutritionFactsTab.length&&(init_nutrition_facts($_CookedNutritionFactsTab),$_CookedNutritionFactsTab.on("keyup","input",function(e){init_nutrition_facts($_CookedNutritionFactsTab)})),p("#cooked-prep-time").length&&p("#cooked-prep-time,#cooked-cook-time").on("change",function(){cooked_updateTotalTimeValue(parseInt(p("#cooked-prep-time").val()),parseInt(p("#cooked-cook-time").val()))})})})(jQuery),0);function cooked_set_default_template(e,o,i,n,a){var d,r,c,s;0{p(document).ready(function(){var c,o,t,e,i,n,a,d,r,s=p(".cooked-color-field"),l=p("#cooked_recipe_settings").find("select"),u=p("#cooked-recipe-tabs"),_=(p("#cooked-settings-wrap"),p("#cooked_recipe_settings")),k=_.find("input#submit");$_CookedTooltips=p(".cooked-tooltip"),$_CookedConditionals=p(".cooked-conditional-hidden"),$_CookedSortable=p(".cooked-sortable"),$_CookedRecipeSaveDefault=p(".cooked-layout-save-default"),$_CookedShortcodeField=p(".cooked-shortcode-field"),$_CookedIngredientBuilder=p("#cooked-ingredients-builder"),$_CookedAutoNutritionButton=p(".cooked-auto-nutrition-button"),$_CookedDirectionBuilder=p("#cooked-directions-builder"),$_CookedRecipeGallery=p("#cooked-recipe-image-gallery"),$_CookedNutritionFactsTab=p("#cooked-recipe-tab-content-nutrition"),$_CookedSettingsPanel=p("#cooked-settings-panel"),$_CookedSettingsTabs=p("#cooked-settings-tabs"),s.length&&s.wpColorPicker(),$_CookedSortable.length&&(document.addEventListener("touchstart",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchmove",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchend",cookedSortableTouchHandler,{passive:!1}),$_CookedSortable.find(".cooked-icon-drag").length?$_CookedSortable.sortable({handle:".cooked-icon-drag",stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder();var t=t.item.find("textarea"),o=!(!cooked_admin_functions_js_vars.wp_editor_roles_allowed||"undefined"==typeof wp||!wp.editor||"function"!=typeof wp.editor.remove||"function"!=typeof wp.editor.initialize);t.length&&o&&(o=t.attr("name"),t=t.attr("id"),wp.editor.remove(t),wp.editor.initialize(t,{tinymce:{wpautop:!1,toolbar1:"bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,wp_link_advanced,unlink,fullscreen",toolbar2:"",toolbar3:"",toolbar4:"",height:100,textarea_name:o,plugins:"link lists fullscreen wordpress wplink",setup:function(e){}},quicktags:!0,mediaButtons:!1}))}}):$_CookedSortable.sortable({stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder()}})),$_CookedRecipeSaveDefault.length&&($_CookedRecipeSaveDefault.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],trigger:"click",animation:"grow",delay:0,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0,functionReady:function(r,e){p(".cooked-save-default-all").on("click",function(e){e.preventDefault();var t,o=p(this),e=o.data("nonce"),i=o.data("bulk-nonce"),n=o.parent(),a=confirm(cooked_admin_functions_js_vars.i18n_confirm_save_default_all),d=p("#_recipe_settings_content"),c=tinymce.get("_recipe_settings_content");t=null===c?d.val():c.getContent(),a&&!o.hasClass("disabled")&&(n.find(".button, .button-primary").addClass("disabled"),p.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:t,nonce:e},function(){p.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_get_recipe_count",nonce:i},function(e){o.removeClass("button-primary").addClass("button"),e&&e.success&&0')}),$_CookedTooltips.length&&$_CookedTooltips.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],animation:"grow",delay:100,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0}),$_CookedShortcodeField.length&&$_CookedShortcodeField.on("click",function(e){p(this).select()}),$_CookedConditionals.length&&(c=[],$_CookedConditionals.each(function(){var e=p(this),t=p(this).data("condition"),o=p(this).data("value"),i=p("#"+t),o=!!o&&o.split(" "),n=e.is("li")||e.is("span")?"inline-block":"block";i.is(":checkbox")&&i.is(":checked")||i.is(":radio")&&i.is(":checked")||!(i.is(":checkbox")&&!i.is(":checked")||i.is(":radio")&&!i.is(":checked"))&&(!i.is(":checkbox")&&!o&&i.val()||!i.is(":checkbox")&&o&&-1 a").attr("href")).split("#"))[1],p(".cooked-settings-tab-content").hide(),p("#cooked-settings-tab-content-"+n).show(),l.on("click",function(e){p(".tab-content").hide();var t=p(this).find("a"),t=($_CookedSettingsTabs.find("li").removeClass("active"),p(this).addClass("active"),t.attr("href"));"migration"==(t=(t=t.split("#"))[1])?k.hide():k.show(),p(".cooked-settings-tab-content").hide(),p("#cooked-settings-tab-content-"+t).show(),p("#cooked-settings-panel").hasClass("stuck")?window.scrollTo(0,130):window.scrollTo(0,0)})),$_CookedIngredientBuilder.length&&(cooked_reset_ingredient_builder(),$_CookedIngredientBuilder.on("keydown",'input[data-ingredient-part="name"]',function(e){9!==e.keyCode&&13!==e.keyCode||p(this).parents(".cooked-ingredient-block").is(":last-child")&&(e.preventDefault(),p("#cooked-recipe-tab-content-ingredients").find(".cooked-add-ingredient-button").trigger("click"),$_CookedIngredientBuilder.find('.cooked-ingredient-block:last-child input[data-ingredient-part="amount"]').focus())}),$_CookedIngredientBuilder.parent().on("click",".cooked-show-substitution",function(e){e.preventDefault();e=p(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-ingredient-part="sub_amount"]').focus())}),$_CookedIngredientBuilder.on("keyup change",'input[data-ingredient-part="sub_amount"], input[data-ingredient-part="sub_name"], select[data-ingredient-part="sub_measurement"]',function(e){var t=p(this).parents(".recipe-setting-block"),o=t.find('input[data-ingredient-part="sub_name"]').val();o&&o.trim()?t.addClass("cooked-has-substitution"):t.removeClass("cooked-has-substitution")}),$_CookedAutoNutritionButton.length&&$_CookedIngredientBuilder.on("change",'input[data-ingredient-part="name"]',function(e){var t=!1;$_CookedIngredientBuilder.find('input[data-ingredient-part="name"]').each(function(){if(""!=p(this).val())return!(t=!0)}),t?$_CookedAutoNutritionButton.prop("disabled",!1):$_CookedAutoNutritionButton.prop("disabled",!0)}),$_CookedIngredientBuilder.on("keyup",'input[data-ingredient-part="url"]',function(e){var t=p(this).val(),o=p(this).parents(".recipe-setting-block");t?o.addClass("cooked-has-url"):o.removeClass("cooked-has-url")}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-ingredient-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-ingredient-template").clone().removeClass("cooked-template cooked-ingredient-template").addClass("cooked-ingredient-block");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-ingredient-block cooked-ingredient-heading");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-delete-ingredient",function(e){e.preventDefault(),p(this).parent().remove(),cooked_reset_ingredient_builder()})),$_CookedDirectionBuilder.length&&(cooked_reset_direction_builder(),$_CookedDirectionBuilder.parent().on("click",".cooked-show-heading-element",function(e){e.preventDefault();e=p(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-direction-part="section_heading_element"]').focus())}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-direction-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-direction-template").clone().removeClass("cooked-template cooked-direction-template").addClass("cooked-direction-block");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-direction-block cooked-direction-heading");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-delete-direction",function(e){e.preventDefault();var t,e=p(this).parent();cooked_admin_functions_js_vars.wp_editor_roles_allowed&&"undefined"!=typeof wp&&wp.editor&&"function"==typeof wp.editor.remove&&(t=e.find('textarea[data-direction-part="content"]').attr("id"))&&wp.editor.remove(t),e.remove(),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".remove-image-button",function(e){e.preventDefault();e=p(this).parent();e.removeClass("cooked-has-image"),e.find("img").attr("src","").removeAttr("srcset").removeAttr("sizes"),e.find('input[data-direction-part="image"]').val(""),cooked_reset_direction_builder()}),p("body").on("click",".cooked-direction-img-placeholder, .cooked-direction-img",function(e){e.preventDefault(),p(this).parent().find(".direction-image-button").trigger("click")}),p("body").on("click",".direction-image-button",function(e){var t=p(this);d=t.data("id"),e.preventDefault(),a||(a=wp.media.frames.direction_image_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_image_title,button:{text:cooked_admin_functions_js_vars.i18n_image_button},library:{type:"image"}})).on("select",function(){var e=a.state().get("selection").first().toJSON();p("#direction-"+d+"-image-src").attr("src",e.sizes.thumbnail.url).removeAttr("srcset").removeAttr("sizes").parent().addClass("cooked-has-image"),p('input[name="_recipe_settings[directions]['+d+'][image]"]').val(e.id),p('.direction-image-button[data-id="'+d+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_change)}),a.open()})),$_CookedRecipeGallery.length&&(cooked_init_gallery_sorting(),p("body").on("click",".cooked-gallery-add-button",function(e){p(this);e.preventDefault(),r||(r=wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_gallery_image_title,button:{text:cooked_admin_functions_js_vars.i18n_gallery_image_title},library:{type:"image"},multiple:!0})).on("select",function(){var e,t,o,i=r.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,p("#cooked-recipe-image-gallery").append(''));cooked_init_gallery_sorting()}),r.open()}),p("body").on("click",".cooked-recipe-gallery-item img",function(e){e.preventDefault(),p(this).parent().find(".cooked-gallery-edit-button").trigger("click")}),p("body").on("click",".cooked-gallery-edit-button",function(e){var n=p(this),t=n.data("attachment-id"),a=(e.preventDefault(),wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_edit_image_title,button:{text:cooked_admin_functions_js_vars.i18n_edit_image_button},library:{type:"image"},multiple:!1}));a.on("open",function(){var e=a.state().get("selection");(attachment=wp.media.attachment(t)).fetch(),e.add(attachment?[attachment]:[])}),a.open(),a.on("select",function(){var e,t,o,i=a.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,n.parent().replaceWith(''));cooked_init_gallery_sorting()})}),$_CookedRecipeGallery.on("click",".remove-image-button",function(e){var t=p(this);d=t.data("id"),e.preventDefault(),d?(p("#direction-"+d+"-image-src").parent().removeClass("cooked-has-image").prop("src",!1),p('input[name="_recipe_settings[directions]['+d+'][image]"]').val(""),p('.direction-image-button[data-id="'+d+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_title)):t.parent().remove()})),$_CookedNutritionFactsTab.length&&(init_nutrition_facts($_CookedNutritionFactsTab),$_CookedNutritionFactsTab.on("keyup","input",function(e){init_nutrition_facts($_CookedNutritionFactsTab)})),p("#cooked-prep-time").length&&p("#cooked-prep-time,#cooked-cook-time").on("change",function(){cooked_updateTotalTimeValue(parseInt(p("#cooked-prep-time").val()),parseInt(p("#cooked-cook-time").val()))})})})(jQuery),0),cooked_bulk_per_page=20;function cooked_set_default_template(o,i,n,a,d){var c,r,s;i<=0||(c=jQuery("#cooked-template-progress"),r=c.find(".cooked-progress-bar"),s=jQuery("#cooked-template-progress-text"),c.hasClass("cooked-active")||(c.addClass("cooked-active"),s.addClass("cooked-active"),r.css({width:"0%"}),d.reposition()),jQuery.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default_bulk",page:o,default_content:n,nonce:a},function(e){var t;e&&e.success&&(cooked_recipe_update_counter=Math.min((o+1)*cooked_bulk_per_page,i),t=Math.round(cooked_recipe_update_counter/i*100),r.css({width:t+"%"}),s.text(cooked_recipe_update_counter+" / "+i),e.data.has_more?cooked_set_default_template(o+1,i,n,a,d):(jQuery(".cooked-save-default-all").text(cooked_admin_functions_js_vars.i18n_applied),r.css({width:"100%"}),s.text(i+" / "+i),c.removeClass("cooked-active"),s.removeClass("cooked-active").text(""),d.reposition()))},"json"))}function cooked_updateTotalTimeValue(e,t){jQuery("#cooked-total-time").val(e+t)}function cooked_init_gallery_sorting(){jQuery("#cooked-recipe-image-gallery").sortable()}function init_nutrition_facts(e){e.find("input").each(function(){var e,t=jQuery(this),o=t.attr("id"),t=t.val(),i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]').length;jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').length&&(t?(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text(t),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).show(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).show(),i&&(e=(i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]')).data("pdv"))&&(thisPercent=Math.ceil(t/e*100),i.text(thisPercent))):(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text("___"),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).hide(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).hide()))})}function cooked_reset_ingredient_builder(){var e=jQuery(".cooked-ingredient-block"),t=0,i=0,o=!1;0 'cp_recipe', + 'posts_per_page' => 1, + 'post_status' => 'any', + 'fields' => 'ids', + ]; + + $query = new WP_Query( $args ); + wp_send_json_success( [ 'total' => $query->found_posts ] ); + } + public function save_default_bulk() { - $bulk_amount = 5; + $per_page = 20; if (!wp_verify_nonce($_POST['nonce'], 'cooked_save_default_bulk') || !current_user_can('edit_cooked_default_template')) { wp_die(); } - if (isset($_POST['recipe_ids'])) { - $recipe_ids = json_decode($_POST['recipe_ids'], true); - if (is_array($recipe_ids) && !empty($recipe_ids)) { - $_recipe_ids = []; - foreach ($recipe_ids as $_rid) { - $safe_id = intval($_rid); - if ($safe_id) { - $_recipe_ids[] = $_rid; - } - } - $recipe_ids = $_recipe_ids; - } else { - return false; - } + if (!isset($_POST['default_content'])) { + wp_send_json_error( [ 'message' => __( 'No default content provided.', 'cooked' ) ] ); + } - $leftover_recipe_ids = array_slice($recipe_ids, $bulk_amount); - $recipe_ids = array_slice($recipe_ids, 0, $bulk_amount); + $page = isset($_POST['page']) ? absint($_POST['page']) : 0; + $content = wp_kses_post($_POST['default_content']); - if (empty($recipe_ids)) { - echo 'false'; - wp_die(); - } else { - foreach ($recipe_ids as $rid) { - $recipe_settings = get_post_meta($rid, '_recipe_settings', true); - if (!empty($recipe_settings)) { - $recipe_settings['content'] = wp_kses_post($_POST['default_content']); - update_post_meta($rid, '_recipe_settings', $recipe_settings); - } - } + $args = [ + 'post_type' => 'cp_recipe', + 'posts_per_page' => $per_page, + 'offset' => $page * $per_page, + 'post_status' => 'any', + 'fields' => 'ids', + 'orderby' => 'ID', + 'order' => 'ASC', + ]; - if (!empty($leftover_recipe_ids)) { - echo wp_json_encode($leftover_recipe_ids); - wp_die(); - } else { - echo 'false'; - wp_die(); - } + $query = new WP_Query( $args ); + $recipe_ids = $query->posts; + $updated = 0; + + foreach ($recipe_ids as $rid) { + $recipe_settings = get_post_meta($rid, '_recipe_settings', true); + if (!empty($recipe_settings)) { + $recipe_settings['content'] = $content; + update_post_meta($rid, '_recipe_settings', $recipe_settings); + $updated++; } } - wp_die(); + $processed = ( $page * $per_page ) + count( $recipe_ids ); + $has_more = $processed < $query->found_posts; + + wp_send_json_success( [ + 'updated' => $updated, + 'has_more' => $has_more, + ] ); } public function save_default() { From 92fc4d1ee2d060418714033ee2ff42ce0a3af835 Mon Sep 17 00:00:00 2001 From: Armand Tresova Date: Tue, 7 Apr 2026 19:06:04 -0400 Subject: [PATCH 4/8] Fixed bug with Cooked Classic Migration --- assets/admin/js/cooked-migration.js | 6 +++--- assets/admin/js/cooked-migration.min.js | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/assets/admin/js/cooked-migration.js b/assets/admin/js/cooked-migration.js index e3c26b4..904a05f 100644 --- a/assets/admin/js/cooked-migration.js +++ b/assets/admin/js/cooked-migration.js @@ -17,7 +17,7 @@ e.preventDefault(); var thisButton = $(this), - confirm_migrate = confirm(cooked_migration_js_vars.i18n_confirm_migrate_recipe); + confirm_migrate = confirm(cooked_migration_js_vars.i18n_confirm_migrate_recipes); if (confirm_migrate && !thisButton.hasClass('disabled')) { thisButton.addClass('disabled').attr('disabled', true); @@ -34,7 +34,7 @@ total_recipes = Object.keys(recipe_ids).length; if (total_recipes > 0) { - cooked_migrate_recipes(json_recipe_ids, total_recipe); + cooked_migrate_recipes(json_recipe_ids, total_recipes); } } } @@ -401,4 +401,4 @@ function cooked_import_recipes(recipe_ids, total_recipes, import_type) { } }) } -} \ No newline at end of file +} diff --git a/assets/admin/js/cooked-migration.min.js b/assets/admin/js/cooked-migration.min.js index 26c3f10..24373ef 100644 --- a/assets/admin/js/cooked-migration.min.js +++ b/assets/admin/js/cooked-migration.min.js @@ -1 +1 @@ -(d=>{d(document).ready(function(){var e=d("#cooked-migration-button"),o=d("#cooked-import-button"),i=d("#cooked-csv-import-button"),r=(d("#cooked-csv-import-form"),d("#cooked-migration-progress"),d("#cooked-migration-progress-text"),d("#cooked-csv-import-progress")),a=d("#cooked-csv-import-progress-text");e.length&&e.on("click",function(e){e.preventDefault();e=d(this);confirm(cooked_migration_js_vars.i18n_confirm_migrate_recipe)&&!e.hasClass("disabled")&&(e.addClass("disabled").attr("disabled",!0),e.hide(),d.post(cooked_migration_js_vars.ajax_url,{action:"cooked_get_migrate_ids"},function(e){var o;e&&(o=JSON.parse(e),0

    ",e.data.errors.forEach(function(e){o+="
  • "+e+"
  • "}),o+="
",s.html(o).show()),setTimeout(function(){r.hide(),a.hide(),d("#cooked-csv-import-completed").show(),i.hide(),t.hide()},2e3)):(s.html("

"+(e.data.message||cooked_migration_js_vars.i18n_import_failed)+"

").show(),i.removeClass("disabled").attr("disabled",!1),t.attr("disabled",!1),r.removeClass("cooked-active"),a.removeClass("cooked-active"))},"json").fail(function(){s.html("

"+cooked_migration_js_vars.i18n_failed_process_csv+"

").show(),i.removeClass("disabled").attr("disabled",!1),t.attr("disabled",!1),r.removeClass("cooked-active"),a.removeClass("cooked-active")})):(s.html("

"+(e.data.message||cooked_migration_js_vars.i18n_file_upload_failed)+"

").show(),i.removeClass("disabled").attr("disabled",!1),t.attr("disabled",!1),r.removeClass("cooked-active"),a.removeClass("cooked-active"))},error:function(){s.html("

"+cooked_migration_js_vars.i18n_failed_upload_csv+"

").show(),i.removeClass("disabled").attr("disabled",!1),t.attr("disabled",!1),r.removeClass("cooked-active"),a.removeClass("cooked-active")}})):s.html("

"+cooked_migration_js_vars.i18n_csv_invalid_file+"

").show():s.html("

"+cooked_migration_js_vars.i18n_csv_no_file+"

").show()})})})(jQuery);{function cookedDecimalAdjust(e,o,i){return void 0===i||0==+i?Math[e](o):(i=+i,null===(o=+o)||isNaN(o)||"number"!=typeof i||i%1!=0?NaN:o<0?-cookedDecimalAdjust(e,-o,i):(o=o.toString().split("e"),+((o=(o=Math[e](+(o[0]+"e"+(o[1]?+o[1]-i:-i)))).toString().split("e"))[0]+"e"+(o[1]?+o[1]+i:i))))}}Math.round10||(Math.round10=function(e,o){return cookedDecimalAdjust("round",e,o)});var cooked_recipe_migrate_counter=0,progressIterations=0;function cooked_migrate_recipes(e,r){var a,d,c,o,n=0;0"+t+" "+cooked_migration_js_vars.i18n_hrs+", "+s+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):1<=s?c.html(i+" / "+o+""+s+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):c.text(i+" / "+o)):c.text(i+" / "+o),cooked_migrate_recipes(e,r)):(a.hide(),c.hide(),jQuery(".recipe-setting-block.migrate_button").find("h3").hide(),jQuery(".recipe-setting-block.migrate_button").find("p:nth-child(2)").hide(),jQuery(".recipe-setting-block.migrate_button").find("ul.cooked-admin-ul").hide(),jQuery("#cooked-migration-button").hide(),jQuery("#cooked-migration-completed").addClass("cooked-active"))}))}function cooked_import_recipes(e,r,a){var d,c,n,o,_=0;0"+t+" "+cooked_migration_js_vars.i18n_hrs+", "+s+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):1<=s?n.html(i+" / "+o+""+s+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):n.text(i+" / "+o)):n.text(i+" / "+o),cooked_import_recipes(e,r,a)):(d.hide(),n.hide(),jQuery(".recipe-setting-block.import_button").find("h3").hide(),jQuery(".recipe-setting-block.import_button").find("p:nth-child(2)").hide(),jQuery(".recipe-setting-block.import_button").find(".cooked-import-note").hide(),jQuery(".recipe-setting-block.import_button").find("ul.cooked-admin-ul").hide(),jQuery("#cooked-import-button").hide(),jQuery("#cooked-import-completed").addClass("cooked-active"))}))} \ No newline at end of file +(d=>{d(document).ready(function(){var e=d("#cooked-migration-button"),o=d("#cooked-import-button"),i=d("#cooked-csv-import-button"),r=(d("#cooked-csv-import-form"),d("#cooked-migration-progress"),d("#cooked-migration-progress-text"),d("#cooked-csv-import-progress")),a=d("#cooked-csv-import-progress-text");e.length&&e.on("click",function(e){e.preventDefault();e=d(this);confirm(cooked_migration_js_vars.i18n_confirm_migrate_recipes)&&!e.hasClass("disabled")&&(e.addClass("disabled").attr("disabled",!0),e.hide(),d.post(cooked_migration_js_vars.ajax_url,{action:"cooked_get_migrate_ids"},function(e){var o;e&&(o=JSON.parse(e),0<(o=Object.keys(o).length))&&cooked_migrate_recipes(e,o)}))}),o.length&&o.on("click",function(e){e.preventDefault();var i=d(this),t=i.data("import-type");confirm(cooked_migration_js_vars.i18n_confirm_import_recipes)&&!i.hasClass("disabled")&&(i.addClass("disabled").attr("disabled",!0),i.hide(),d.post(cooked_migration_js_vars.ajax_url,{action:"cooked_get_import_ids",import_type:t},function(e){var o;e?(o=JSON.parse(e),0<(o=Object.keys(o).length)&&cooked_import_recipes(e,o,t)):(console.log(cooked_migration_js_vars.i18n_something_wrong),i.addClass("disabled").attr("disabled",!1),i.show())}))}),i.length&&i.on("click",function(e){e.preventDefault();var o,i=d(this),t=d("#cooked-csv-file"),e=t[0].files[0],s=d("#cooked-csv-import-errors");s.hide().empty(),e?"text/csv"===e.type||e.name.endsWith(".csv")?i.hasClass("disabled")||confirm(cooked_migration_js_vars.i18n_confirm_csv_import)&&(i.addClass("disabled").attr("disabled",!0),t.attr("disabled",!0),(o=new FormData).append("action","cooked_upload_csv"),o.append("csv_file",e),r.hasClass("cooked-active")||(r.addClass("cooked-active"),a.addClass("cooked-active"),r.find(".cooked-progress-bar").css({width:"0%"}),a.text(cooked_migration_js_vars.i18n_uploading)),d.ajax({url:cooked_migration_js_vars.ajax_url,type:"POST",data:o,processData:!1,contentType:!1,success:function(e){e.success?(a.text(cooked_migration_js_vars.i18n_processing),r.find(".cooked-progress-bar").css({width:"50%"}),d.post(cooked_migration_js_vars.ajax_url,{action:"cooked_process_csv",transient_key:e.data.transient_key},function(e){var o;e.success?(r.find(".cooked-progress-bar").css({width:"100%"}),a.text(e.data.success+" / "+e.data.total+" "+cooked_migration_js_vars.i18n_recipes_imported),e.data.errors&&0"+cooked_migration_js_vars.i18n_errors+"

    ",e.data.errors.forEach(function(e){o+="
  • "+e+"
  • "}),o+="
",s.html(o).show()),setTimeout(function(){r.hide(),a.hide(),d("#cooked-csv-import-completed").show(),i.hide(),t.hide()},2e3)):(s.html("

"+(e.data.message||cooked_migration_js_vars.i18n_import_failed)+"

").show(),i.removeClass("disabled").attr("disabled",!1),t.attr("disabled",!1),r.removeClass("cooked-active"),a.removeClass("cooked-active"))},"json").fail(function(){s.html("

"+cooked_migration_js_vars.i18n_failed_process_csv+"

").show(),i.removeClass("disabled").attr("disabled",!1),t.attr("disabled",!1),r.removeClass("cooked-active"),a.removeClass("cooked-active")})):(s.html("

"+(e.data.message||cooked_migration_js_vars.i18n_file_upload_failed)+"

").show(),i.removeClass("disabled").attr("disabled",!1),t.attr("disabled",!1),r.removeClass("cooked-active"),a.removeClass("cooked-active"))},error:function(){s.html("

"+cooked_migration_js_vars.i18n_failed_upload_csv+"

").show(),i.removeClass("disabled").attr("disabled",!1),t.attr("disabled",!1),r.removeClass("cooked-active"),a.removeClass("cooked-active")}})):s.html("

"+cooked_migration_js_vars.i18n_csv_invalid_file+"

").show():s.html("

"+cooked_migration_js_vars.i18n_csv_no_file+"

").show()})})})(jQuery);{function cookedDecimalAdjust(e,o,i){return void 0===i||0==+i?Math[e](o):(i=+i,null===(o=+o)||isNaN(o)||"number"!=typeof i||i%1!=0?NaN:o<0?-cookedDecimalAdjust(e,-o,i):(o=o.toString().split("e"),+((o=(o=Math[e](+(o[0]+"e"+(o[1]?+o[1]-i:-i)))).toString().split("e"))[0]+"e"+(o[1]?+o[1]+i:i))))}}Math.round10||(Math.round10=function(e,o){return cookedDecimalAdjust("round",e,o)});var cooked_recipe_migrate_counter=0,progressIterations=0;function cooked_migrate_recipes(e,r){var a,d,c,o,n=0;0"+t+" "+cooked_migration_js_vars.i18n_hrs+", "+s+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):1<=s?c.html(i+" / "+o+""+s+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):c.text(i+" / "+o)):c.text(i+" / "+o),cooked_migrate_recipes(e,r)):(a.hide(),c.hide(),jQuery(".recipe-setting-block.migrate_button").find("h3").hide(),jQuery(".recipe-setting-block.migrate_button").find("p:nth-child(2)").hide(),jQuery(".recipe-setting-block.migrate_button").find("ul.cooked-admin-ul").hide(),jQuery("#cooked-migration-button").hide(),jQuery("#cooked-migration-completed").addClass("cooked-active"))}))}function cooked_import_recipes(e,r,a){var d,c,n,o,_=0;0"+t+" "+cooked_migration_js_vars.i18n_hrs+", "+s+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):1<=s?n.html(i+" / "+o+""+s+" "+cooked_migration_js_vars.i18n_mins+" "+cooked_migration_js_vars.i18n_remaining+""):n.text(i+" / "+o)):n.text(i+" / "+o),cooked_import_recipes(e,r,a)):(d.hide(),n.hide(),jQuery(".recipe-setting-block.import_button").find("h3").hide(),jQuery(".recipe-setting-block.import_button").find("p:nth-child(2)").hide(),jQuery(".recipe-setting-block.import_button").find(".cooked-import-note").hide(),jQuery(".recipe-setting-block.import_button").find("ul.cooked-admin-ul").hide(),jQuery("#cooked-import-button").hide(),jQuery("#cooked-import-completed").addClass("cooked-active"))}))} \ No newline at end of file From 42991251c99d70cfe8a51f228e30dae9f3d50a5c Mon Sep 17 00:00:00 2001 From: Armand Tresova Date: Sat, 18 Apr 2026 23:38:07 -0400 Subject: [PATCH 5/8] Add ability to bulk insert ingredients and directions #52 --- .github/dependabot.yml | 11 +- assets/admin/css/style.css | 212 ++++++++++ assets/admin/css/style.min.css | 2 +- assets/admin/js/cooked-functions.js | 412 +++++++++++++++++- assets/admin/js/cooked-functions.min.js | 2 +- assets/admin/js/cooked-migration.js | 218 +++++----- composer.json | 2 +- composer.lock | 2 +- cooked.php | 4 +- includes/class.cooked-admin-enqueues.php | 13 + includes/class.cooked-ajax.php | 115 +++++ includes/class.cooked-recipe-meta.php | 45 ++ languages/cooked.po | 487 ++++++++++++--------- languages/cooked.pot | 515 +++++++++++++---------- package-lock.json | 275 ++++++------ package.json | 2 +- readme.txt | 14 +- vendor/composer/installed.php | 8 +- 18 files changed, 1642 insertions(+), 697 deletions(-) diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 9b6de3f..b5670f1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -6,10 +6,15 @@ version: 2 updates: - - package-ecosystem: composer + - package-ecosystem: "composer" target-branch: develop - directory: / + directory: "/" schedule: - interval: weekly + interval: "weekly" allow: - dependency-type: production + - package-ecosystem: "npm" + target-branch: develop + directory: "/" + schedule: + interval: "weekly" diff --git a/assets/admin/css/style.css b/assets/admin/css/style.css index fdb546e..e8b0938 100644 --- a/assets/admin/css/style.css +++ b/assets/admin/css/style.css @@ -711,3 +711,215 @@ body .button.button-cooked-reset:hover { color:#555; } box-sizing: border-box; padding-right: 10px; } + +/* Bulk Add Modal */ +.cooked-bulk-add-overlay { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.6); + z-index: 100100; + display: flex; + align-items: center; + justify-content: center; +} +.cooked-bulk-add-modal { + background: #fff; + border-radius: 6px; + width: 600px; + max-width: 90vw; + max-height: 80vh; + display: flex; + flex-direction: column; + box-shadow: 0 5px 30px rgba(0, 0, 0, 0.3); +} +.cooked-bulk-add-header { + display: flex; + align-items: center; + justify-content: space-between; + padding: 16px 20px; + border-bottom: 1px solid #ddd; +} +.cooked-bulk-add-header h2 { + margin: 0; + font-size: 18px; + line-height: 1.3; +} +.cooked-bulk-add-close { + font-size: 24px; + text-decoration: none; + color: #666; + line-height: 1; + padding: 0 4px; +} +.cooked-bulk-add-close:hover { color: #d63638; } +.cooked-bulk-add-body { + padding: 20px; + overflow-y: auto; + flex: 1; +} +.cooked-bulk-add-help { + margin-top: 0; + color: #666; + font-size: 13px; +} +#cooked-bulk-add-textarea { + width: 100%; + min-height: 160px; + font-size: 14px; + padding: 10px; + box-sizing: border-box; + resize: vertical; +} +.cooked-bulk-add-preview { + margin-top: 16px; +} +.cooked-bulk-add-preview-label { + margin: 0 0 8px; + font-size: 13px; +} +.cooked-bulk-add-preview-notice-ingredients { + display: none; + margin: 10px 0 0; + font-size: 12px; + line-height: 1.45; + color: #b45309; + font-weight: 700; + gap: 6px; + align-items: flex-start; +} +#cooked-bulk-add-preview[data-bulk-type="ingredients"] .cooked-bulk-add-preview-notice-ingredients { + display: flex; +} +.cooked-bulk-add-preview-notice-mark { + flex-shrink: 0; + font-weight: 700; + line-height: 1.45; + color: #b45309; +} +.cooked-bulk-add-preview-notice-text { + flex: 1; + min-width: 0; + font-weight: 700; + color: #b45309; +} +.cooked-bulk-add-preview-list { + max-height: 200px; + overflow-y: auto; + border: 1px solid #ddd; + border-radius: 4px; + padding: 4px; +} +.cooked-bulk-add-preview-row { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 6px; + border-bottom: 1px solid #f0f0f0; +} +.cooked-bulk-add-preview-row:last-child { border-bottom: 0; } +.cooked-bulk-add-heading-toggle { + display: flex; + align-items: center; + gap: 4px; + white-space: nowrap; + font-size: 12px; + color: #666; + cursor: pointer; + flex-shrink: 0; +} +.cooked-bulk-add-heading-toggle input[type="checkbox"] { margin: 0; } +.cooked-bulk-add-preview-text { + flex: 1; + border: 1px solid #ddd; + border-radius: 3px; + padding: 4px 8px; + font-size: 13px; +} +.cooked-bulk-add-preview-row:not(.cooked-bulk-add-preview-row-ingredient).cooked-bulk-add-is-heading .cooked-bulk-add-preview-text { font-weight: 700; } +.cooked-bulk-add-preview-row-ingredient .cooked-bulk-add-heading-line-wrap { + display: none; + flex: 1; + align-items: center; + gap: 8px; + min-width: 0; +} +.cooked-bulk-add-preview-row-ingredient.cooked-bulk-add-is-heading .cooked-bulk-add-heading-line-wrap { display: flex; } +.cooked-bulk-add-preview-row-ingredient.cooked-bulk-add-is-heading .cooked-bulk-add-parsed-amount, +.cooked-bulk-add-preview-row-ingredient.cooked-bulk-add-is-heading .cooked-bulk-add-parsed-unit, +.cooked-bulk-add-preview-row-ingredient.cooked-bulk-add-is-heading .cooked-bulk-add-parsed-name { display: none; } +.cooked-bulk-add-heading-line-label { + flex-shrink: 0; + font-size: 12px; + font-weight: 600; + color: #666; +} +.cooked-bulk-add-preview-row-ingredient .cooked-bulk-add-heading-line-wrap .cooked-bulk-add-preview-text { + flex: 1; + min-width: 0; + border: 1px solid #ddd; + border-radius: 3px; + padding: 4px 8px; + font-size: 13px; + font-weight: 600; +} +.cooked-bulk-add-preview-header { + display: flex; + align-items: center; + gap: 8px; + padding: 4px 6px 6px; + border-bottom: 1px solid #ddd; + font-size: 11px; + font-weight: 600; + color: #999; + text-transform: uppercase; + letter-spacing: 0.5px; +} +.cooked-bulk-add-col-heading { flex-shrink: 0; width: 108px; } +.cooked-bulk-add-col-amount { width: 72px; flex-shrink: 0; } +.cooked-bulk-add-col-unit { width: 108px; flex-shrink: 0; } +.cooked-bulk-add-col-name { flex: 1; } +.cooked-bulk-add-parsed-amount { + width: 72px; + flex-shrink: 0; + border: 1px solid #ddd; + border-radius: 3px; + padding: 4px 6px; + font-size: 13px; + text-align: center; +} +.cooked-bulk-add-parsed-unit { + width: 108px; + flex-shrink: 0; + border: 1px solid #ddd; + border-radius: 3px; + padding: 4px 6px; + font-size: 13px; +} +.cooked-bulk-add-parsed-name { + flex: 1; + border: 1px solid #ddd; + border-radius: 3px; + padding: 4px 6px; + font-size: 13px; +} +.cooked-bulk-add-footer { + display: flex; + align-items: center; + justify-content: flex-end; + gap: 8px; + padding: 14px 20px; + border-top: 1px solid #ddd; +} +.cooked-bulk-add-footer .button, +.cooked-bulk-add-footer .button.button-primary { + float: none; + margin: 0; + vertical-align: middle; +} +.cooked-bulk-add-spinner { + float: none !important; + margin: 0 !important; +} diff --git a/assets/admin/css/style.min.css b/assets/admin/css/style.min.css index 55b25f5..39da16c 100644 --- a/assets/admin/css/style.min.css +++ b/assets/admin/css/style.min.css @@ -1 +1 @@ -.cooked-clearfix:after{content:"";display:table;clear:both}#post-body-content #postdivrich{display:none}body.post-type-cp_recipe .wp-list-table tfoot th.check-column,body.post-type-cp_recipe .wp-list-table thead th.check-column{padding:15px 0 0 7px}body.post-type-cp_recipe .wp-list-table tfoot td,body.post-type-cp_recipe .wp-list-table tfoot th,body.post-type-cp_recipe .wp-list-table thead td,body.post-type-cp_recipe .wp-list-table thead th{padding:10px 10px}body.post-type-cp_recipe .wp-list-table tfoot th.sortable a,body.post-type-cp_recipe .wp-list-table tfoot th.sorted a,body.post-type-cp_recipe .wp-list-table thead th.sortable a,body.post-type-cp_recipe .wp-list-table thead th.sorted a{padding-left:0;padding-right:0}body.post-type-cp_recipe .wp-list-table tbody th.check-column{padding:15px 0 0 10px}body.post-type-cp_recipe .wp-list-table tbody td,body.post-type-cp_recipe .wp-list-table tbody th{padding:12px 10px}body.post-type-cp_recipe .wp-list-table tbody td.column-title strong{margin-top:6px}body.post-type-cp_recipe .wp-list-table tbody td.column-title strong .row-title{padding-top:10px;font-size:1rem!important}th.column-featured_image{width:50px;text-align:center}td.column-featured_image{width:50px;text-align:center}.cooked-admin-recipes-list-image img{width:49px;height:auto;border-radius:3px;position:relative;top:3px}body.post-type-cp_recipe #titlediv #title{box-shadow:none;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:0 12px;font-weight:400;font-size:19px;letter-spacing:0;height:44px}body.post-type-cp_recipe #titlediv #title-prompt-text{font-size:15px;color:#888;font-weight:400;letter-spacing:0;padding:12px 15px}body.post-type-cp_recipe .mce-fullscreen{z-index:100100!important}#cooked-settings-prewrap{display:flex;justify-content:center}#cooked-settings-wrap{position:relative;border-radius:10px;margin:40px 40px 40px 20px;max-width:1200px;min-width:1000px;background:#fff;box-shadow:0 4px 4px rgba(0,0,0,.05),0 8px 8px rgba(0,0,0,.05),0 32px 32px rgba(0,0,0,.05),0 64px 64px rgba(0,0,0,.05)}#cooked-settings-wrap.is-stuck{position:static!important}#cooked-settings-wrap .cooked-settings-update-button{position:absolute;top:30px;right:30px}#cooked-settings-wrap .cooked-settings-update-button>.button-primary{box-shadow:none;border:none}#cooked-settings-wrap.is-stuck .cooked-settings-update-button{position:fixed;top:40px;right:11px;z-index:100001}#cooked_recipe_settings .hndle,#cooked_recipe_settings button.handlediv{display:none}#cooked_recipe_settings .inside{padding:0;margin:0}#cooked-recipe-tabs{list-style:none;padding:0;margin:0;position:absolute;top:0;left:0;width:100%}#cooked-recipe-tabs li{font-size:.9rem;line-height:3rem;height:3rem;font-weight:500;display:inline-block;padding:0 1.25rem;margin:0;color:#fff}#cooked-recipe-tabs li:hover{cursor:pointer}#cooked-recipe-tabs li.active,#cooked-recipe-tabs li.active:hover{cursor:default}#cooked-recipe-tabs li:last-child{border-right:none!important}#cooked-recipe-tabs li.cooked-loading{opacity:0;background:0 0;color:#fff;position:absolute;top:0;right:0;cursor:default;font-size:14px;width:40px;height:40px;text-align:center;display:block;line-height:40px;padding:0}#cooked-recipe-tabs li.cooked-loading:hover{background:0 0;color:#fff}#cooked_recipe_settings.cooked-loading #cooked-recipe-tabs li.cooked-loading{opacity:1}#cooked_recipe_settings .inside{padding-top:41px}#cooked_recipe_settings.stuck #cooked-recipe-tabs{position:fixed;width:auto;top:32px;left:23px;z-index:100000;margin-left:160px;box-shadow:0 3px 50px rgba(0,0,0,.25)}#cooked_recipe_settings.stuck #cooked-recipe-tabs li.cooked-loading{right:160px}.cooked-recipe-tab-content-wrapper .cooked-recipe-tab-content{display:none}.cooked-recipe-tab-content-wrapper .cooked-recipe-tab-content:first-child{display:block}.cooked-left{float:left;display:inline-block;width:auto}.cooked-right{float:right;display:inline-block;width:auto}#cooked_field--cooked_pro_license_key{font-family:monospace}#cooked_recipe_settings .cooked-bm-5{margin-bottom:5px!important}#cooked_recipe_settings .cooked-bm-10{margin-bottom:10px!important}#cooked_recipe_settings .cooked-tm-10{margin-top:10px!important}#cooked_recipe_settings .cooked-bm-15{margin-bottom:15px!important}#cooked_recipe_settings .cooked-bm-20{margin-bottom:20px!important}#cooked_recipe_settings .cooked-bm-30{margin-bottom:30px!important}#cooked_recipe_settings .cooked-bm-5-up{margin-bottom:-5px!important}#cooked_recipe_settings .cooked-bm-10-up{margin-bottom:-10px!important}#cooked_recipe_settings .cooked-bm-15-up{margin-bottom:-15px!important}#cooked_recipe_settings .cooked-bm-20-up{margin-bottom:-20px!important}#cooked_recipe_settings .cooked-bm-30-up{margin-bottom:-30px!important}#cooked_recipe_settings .cooked-hr{border:none;border-top:2px solid #ddd;margin:10px 0 0 0;padding:15px 0 0 0}#cooked_recipe_settings .cooked-conditional-hidden{display:none}#cooked_recipe_settings .cooked-recipe-tab-content{padding:23px 30px 15px 30px}#cooked_recipe_settings .recipe-setting-block{margin:0 0 20px;width:100%}#cooked_recipe_settings .recipe-setting-block p{font-size:.9rem;line-height:1.5rem;margin:0 0 1rem;padding:0}#cooked_recipe_settings .recipe-setting-block p.cooked-padded{line-height:1.75rem;font-size:.85rem}#cooked_recipe_settings .recipe-setting-block .cooked-conditional-hidden{padding:0}#cooked_recipe_settings textarea{width:100%;height:75px;padding:15px;box-sizing:border-box;position:relative;top:5px}#cooked_recipe_settings .recipe-setting-block>label.cooked-select-label{top:5px}#cooked_recipe_settings select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;box-shadow:none;border-radius:3px;padding:0 45px 0 9px;line-height:31px;height:33px;box-sizing:border-box;background:#fff}#cooked_recipe_settings .cooked-select-wrapper{background:#fff;position:relative;width:auto;display:inline-block;border-radius:3px;margin:0 5px 0 0}#cooked_recipe_settings .cooked-select-wrapper select{margin:0;background:0 0;position:relative}#cooked_recipe_settings .cooked-select-wrapper:before{font-family:CookedIcons;display:block;width:15px;height:15px;line-height:14px;color:#000;font-size:14px;content:"\f00b";position:absolute;right:12px;top:11px;color:rgba(0,0,0,.3)}#cooked_recipe_settings .cooked-select-wrapper:hover:before{color:#000}#cooked_recipe_settings .cooked-select-wrapper:hover select{border-color:#ccc}#cooked_recipe_settings .cooked-checkbox-radio-label{position:relative;left:1px}#cooked_recipe_settings .recipe-setting-block input[type=checkbox],#cooked_recipe_settings .recipe-setting-block input[type=radio]{margin-top:0}#cooked_recipe_settings .recipe-setting-block input[type=number]{width:65px}#cooked_recipe_settings .recipe-setting-block input[type=password],#cooked_recipe_settings .recipe-setting-block input[type=text]{width:75%}#cooked_recipe_settings .recipe-setting-block input[type=number],#cooked_recipe_settings .recipe-setting-block input[type=password],#cooked_recipe_settings .recipe-setting-block input[type=text]{margin:0 6px 5px 0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;height:33px;box-shadow:none;position:relative;top:2px;padding:0 10px}#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs .cooked-measurement-column{width:43%;margin-right:3%;display:inline-block}#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs .cooked-select-wrapper,#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs input,#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs label{width:100%;display:block}#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs .cooked-select-wrapper select{width:100%}#cooked_recipe_settings .recipe-setting-block input[type=number],#cooked_recipe_settings .recipe-setting-block input[type=password].cooked-small-textfield,#cooked_recipe_settings .recipe-setting-block input[type=text].cooked-small-textfield{width:150px}#cooked_recipe_settings small{display:block;line-height:1.5;font-size:12px;color:#888;padding:10px 0 0}#cooked_recipe_settings .recipe-setting-block em{color:#aaa}#cooked_recipe_settings .recipe-setting-block,#cooked_recipe_settings .recipe-setting-block .cooked-repositioned{display:block;position:relative;box-sizing:border-box;line-height:1}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned{padding-left:157px}#cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{width:70%;position:relative;z-index:2;padding:.5rem 0 .5rem;margin:0;font-size:1rem;line-height:1.5rem;font-weight:600}#cooked_recipe_settings .recipe-setting-block strong.cooked-heading{font-size:14px}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned>label{position:absolute;top:1px;left:0;width:147px;cursor:default;font-weight:600}#cooked_recipe_settings .recipe-setting-block .cooked-tooltip-icon{color:#aaa;cursor:help;display:inline-block;margin-left:10px}#cooked_recipe_settings .recipe-setting-block .cooked-tooltip-icon:hover{color:#eee}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned>.cooked-checkbox-radio-label{top:7px}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned>label{top:auto;height:33px;line-height:30px;padding:0;width:130px}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned:first-child label:first-child{padding-top:12px;margin-top:-12px}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned span.cooked-padded{padding:0 0 15px;display:block;line-height:1.9}#cooked_recipe_settings .recipe-setting-block .wp-picker-container .cooked-color-field.wp-color-picker{padding:5px;height:25px;top:0;margin:0;width:74px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #ccc}#cooked_recipe_settings .recipe-setting-block input[type=text].cooked-shortcode-field{font-family:monospace;background:#f5f5f5;font-size:12px}#cooked_recipe_settings .cooked-banner-block{margin:30px -30px -17px;display:block;box-sizing:content-box;padding:10px 30px 15px;background:#f9f9f9;width:100%;border-top:1px solid #e5e5e5}#cooked_recipe_settings .cooked-advanced-options-hr{border:none;border-bottom:1px solid #ddd;height:1px;padding:10px 0 0 0;margin:0 0 20px}#cooked_recipe_settings .recipe-setting-block input.cooked-time-picker{top:0;width:100%;padding-right:70%;margin:0 0 3px}#cooked_recipe_settings .recipe-setting-block .cooked-time-picker-text{position:absolute;bottom:13px;right:40px;color:#888}#cooked_recipe_settings .cooked-alert-block{background:#fffbdc;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;margin:10px 0 15px;padding:10px 22px 2px;border:2px solid #ece8c4}#cooked_recipe_settings .recipe-setting-block.cooked-template{display:none}#cooked_recipe_settings ul.cooked-admin-ul{font-size:.9rem;margin:0 0 1rem 2rem;list-style:disc}#cooked_recipe_settings ul.cooked-admin-ul li{font-size:.9rem;padding:0;margin:0 0 .5rem}#cooked_recipe_settings .cooked-html-block{background:#fff;width:auto;min-width:300px;display:inline-block;padding:.5rem 1.3rem .25rem;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}#cooked_recipe_settings .recipe-setting-block .cooked-html-block h3.cooked-settings-title{width:100%;color:#333}#cooked_recipe_settings .recipe-setting-block .cooked-html-block.valid{background:#fff;border:2px solid #0aa780;box-shadow:none;border-radius:5px}#cooked_recipe_settings .recipe-setting-block .cooked-html-block.valid>.cooked-settings-title{color:#0aa780}#cooked_recipe_settings .recipe-setting-block .cooked-html-block.expired{border:2px solid #ca4a20}#cooked-directions-builder .cooked-direction-block.cooked-expanded>.cooked-heading-name,#cooked-directions-builder .cooked-direction-block.cooked-has-heading-element>.cooked-heading-name,#cooked-directions-builder .cooked-direction-block:hover>.cooked-heading-name,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-heading-name,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-heading-element>.cooked-heading-name,#cooked-ingredients-builder .cooked-ingredient-block:hover>.cooked-heading-name{padding-right:32px}#cooked-directions-builder .cooked-direction-block .cooked-show-heading-element,#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-heading-element{opacity:0;cursor:pointer;font-size:14px;position:absolute;top:14px;right:35px}#cooked-directions-builder .cooked-direction-block .cooked-show-heading-element .cooked-icon,#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-heading-element .cooked-icon{color:#888}#cooked-directions-builder .cooked-direction-block.cooked-expanded .cooked-show-heading-element,#cooked-directions-builder .cooked-direction-block.cooked-has-heading-element .cooked-show-heading-element,#cooked-directions-builder .cooked-direction-block:hover .cooked-show-heading-element,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded .cooked-show-heading-element,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-heading-element .cooked-show-heading-element,#cooked-ingredients-builder .cooked-ingredient-block:hover .cooked-show-heading-element{opacity:1}#cooked-directions-builder .cooked-direction-block .cooked-show-heading-element .cooked-icon:hover,#cooked-directions-builder .cooked-direction-block.cooked-expanded .cooked-show-heading-element .cooked-icon,#cooked-directions-builder .cooked-direction-block.cooked-has-heading-element .cooked-show-heading-element .cooked-icon,#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-heading-element .cooked-icon:hover,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded .cooked-show-heading-element .cooked-icon,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-heading-element .cooked-show-heading-element .cooked-icon{color:#0685ba}#cooked-directions-builder .cooked-direction-block>.cooked-heading-element,#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-element{display:none;width:65%;float:right;margin-top:4px;padding-right:32px}#cooked-directions-builder .cooked-direction-block>.cooked-heading-element select,#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-element select{color:#0685ba;width:100%}#cooked-directions-builder .cooked-direction-block>.cooked-heading-element label,#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-element label{font-weight:600}#cooked-directions-builder .cooked-direction-block.cooked-expanded>.cooked-heading-element,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-heading-element{display:block}#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-substitution{opacity:0;cursor:pointer;font-size:14px;position:absolute;top:15px;right:58px}#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-substitution .cooked-icon{color:#888}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded .cooked-show-substitution,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-substitution .cooked-show-substitution,#cooked-ingredients-builder .cooked-ingredient-block:hover .cooked-show-substitution{opacity:1;right:50px}#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-substitution .cooked-icon:hover,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded .cooked-show-substitution .cooked-icon,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-substitution .cooked-show-substitution .cooked-icon{color:#0685ba}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-ingredient-name,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-substitution>.cooked-ingredient-name,#cooked-ingredients-builder .cooked-ingredient-block:hover>.cooked-ingredient-name{padding-right:32px}#cooked_recipe_settings .switchery-small,body.post-type-cp_recipe .switchery-small{height:1rem;width:1.75rem;border-radius:1rem;margin-right:.4rem}#cooked_recipe_settings .switchery-small>small,body.post-type-cp_recipe .switchery-small>small{width:1rem;height:1rem;padding:0}.cooked-tooltip-buttons .cooked-icon-spin{margin-top:10px;font-size:15px}.cooked-tooltip-buttons .cooked-saved-default{height:28px;line-height:28px;font-weight:700;font-size:15px;color:#888}.cooked-progress{display:none;position:relative;background:#eee;width:100%;height:6px;padding:0;border-radius:3px;margin:10px 0 0 0}.cooked-progress-text{display:none;font-size:10px;color:#aaa;padding:2px 0 5px}.cooked-progress-text.cooked-active,.cooked-progress.cooked-active{display:block}.cooked-progress .cooked-progress-bar{display:block;position:absolute;background:#0085ba;width:0%;height:6px;top:0;left:0;border-radius:3px}#cooked-import-progress.cooked-progress,#cooked-migration-progress.cooked-progress{background:#ccc;margin:25px 0 0 0;border-radius:6px;height:12px;max-width:600px}#cooked-import-progress.cooked-progress .cooked-progress-bar,#cooked-migration-progress.cooked-progress .cooked-progress-bar{border-radius:6px;height:12px}#cooked-import-progress-text.cooked-progress-text,#cooked-migration-progress-text.cooked-progress-text{font-size:11px;color:#888;max-width:600px}#cooked-import-completed,#cooked-migration-completed{display:none}#cooked-import-completed.cooked-active,#cooked-migration-completed.cooked-active{display:block}#cooked-csv-import-progress.cooked-progress{background:#ccc;margin:25px 0 0 0;border-radius:6px;height:12px;max-width:600px}#cooked-csv-import-progress.cooked-progress .cooked-progress-bar{border-radius:6px;height:12px}#cooked-csv-import-progress-text.cooked-progress-text{font-size:11px;color:#888;max-width:600px}#cooked-csv-import-completed{display:none}#cooked-csv-import-completed.cooked-active{display:block}#cooked-csv-import-form{max-width:100%;box-sizing:border-box}#cooked-csv-import-form input[type=file]{max-width:100%;box-sizing:border-box;width:100%}#cooked-csv-import-errors{max-width:100%;box-sizing:border-box;word-wrap:break-word}#cooked-import-progress.cooked-progress,#cooked-migration-progress.cooked-progress,#cooked-related-progress.cooked-progress{background:#ccc;margin:25px 0 0 0;border-radius:6px;height:12px;max-width:600px}#cooked-import-progress.cooked-progress .cooked-progress-bar,#cooked-migration-progress.cooked-progress .cooked-progress-bar,#cooked-related-progress.cooked-progress .cooked-progress-bar{border-radius:6px;height:12px}#cooked-import-progress-text.cooked-progress-text,#cooked-migration-progress-text.cooked-progress-text,#cooked-related-progress-text.cooked-progress-text{font-size:11px;color:#888;max-width:600px}#cooked-import-completed,#cooked-migration-completed,#cooked-related-completed{display:none}#cooked-import-completed.cooked-active,#cooked-migration-completed.cooked-active,#cooked-related-completed.cooked-active{display:block}.cooked-related-status{margin:0 0 12px 0;padding:8px 12px;font-size:13px;line-height:1.4;border-radius:4px;border-left:3px solid #00a878;background:#f0f9f6;color:#2d4a42;max-width:480px}#cooked-related-last-done.cooked-related-status{border-left-color:#8c9b99;background:#f6f8f7;color:#5c6b69}#cooked_recipe_settings .cooked-layout-save-default{position:relative;top:-2px;z-index:10;margin:0 0 0 15px;padding:0 8px 1px}#cooked_recipe_settings .cooked-layout-load-default{position:relative;top:-2px;z-index:10;margin:0 0 0 10px;padding:0 8px 1px}body .button.button-cooked-reset{color:#999}body .button.button-cooked-reset:hover{color:#555}#cooked_recipe_settings .cooked-ingredient-headers{display:block;padding:5px 25px 0 35px}#cooked_recipe_settings .cooked-ingredient-headers span{font-size:.7rem;font-weight:700;letter-spacing:.03rem;text-transform:uppercase;color:#0085ba;box-sizing:border-box;display:inline-block;float:left}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-amount{width:15%}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-measurement{width:20%}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-item{width:65%}#cooked-ingredients-builder{margin:0 0 20px}#cooked-ingredients-builder .cooked-ingredient-block{display:block;padding:5px 45px 5px 35px}#cooked-ingredients-builder .cooked-ingredient-block:hover{background:#eee}#cooked-ingredients-builder .cooked-ingredient-block input[type=number],#cooked-ingredients-builder .cooked-ingredient-block input[type=text],#cooked-ingredients-builder .cooked-ingredient-block select{margin:0;display:block;top:0}#cooked-ingredients-builder .cooked-ingredient-block>div{display:inline-block;float:left;box-sizing:border-box;padding-right:10px}#cooked-ingredients-builder .cooked-ingredient-block>div input[type=text]{width:100%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-amount{width:15%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-measurement{width:20%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-measurement .cooked-select-wrapper{width:100%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-measurement .cooked-select-wrapper select{width:100%}#cooked-ingredients-builder .cooked-ingredient-block .cooked-substitution-fields>.cooked-ingredient-measurement .cooked-select-wrapper{width:100%}#cooked-ingredients-builder .cooked-ingredient-block .cooked-substitution-fields>.cooked-ingredient-measurement .cooked-select-wrapper select{width:100%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-name{width:65%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-name{width:100%}#cooked-ingredients-builder .cooked-ingredient-block>div small.cooked-input-ex{display:block;padding:5px 0 0 2px}#cooked-ingredients-builder .cooked-ingredient-block{margin:0}#cooked-ingredients-builder .cooked-ingredient-block i.cooked-icon-drag{cursor:move;color:#ccc;font-size:32px;position:absolute;top:5px;left:1px;touch-action:none}#cooked-ingredients-builder .cooked-ingredient-block:hover i.cooked-icon-drag{color:#888}#cooked-ingredients-builder .cooked-ingredient-block.ui-sortable-helper{background:#f5f5f5;box-shadow:0 10px 20px rgba(0,0,0,.15);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}#cooked-ingredients-builder .cooked-ingredient-block.ui-sortable-placeholder{visibility:visible!important;background:#eee;display:block;width:100%;height:43px;border-top:6px solid #fff;border-bottom:6px solid #fff}#cooked-ingredients-builder .cooked-ingredient-block .cooked-delete-ingredient{cursor:pointer;font-size:14px;position:absolute;top:14px;right:11px}#cooked-ingredients-builder .cooked-ingredient-block .cooked-delete-ingredient .cooked-icon{color:#fff}#cooked-ingredients-builder .cooked-ingredient-block:hover .cooked-delete-ingredient .cooked-icon{color:#888}#cooked-ingredients-builder .cooked-ingredient-block .cooked-delete-ingredient .cooked-icon:hover{color:#de2020}#cooked-ingredients-builder .cooked-ingredient-block.cooked-ingredient-heading{margin:10px 0}#cooked-ingredients-builder .cooked-ingredient-block.cooked-ingredient-heading>div input[type=text]{padding:0 7px;font-size:16px;background:#f9f9f9;font-weight:600}#cooked-directions-builder{margin:0 0 20px}#cooked-directions-builder .cooked-direction-block{display:block;padding:15px 25px 15px 35px}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading{padding:5px 25px 5px 35px}#cooked-directions-builder .cooked-direction-block:hover{background:#f5f5f5}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading:hover{background:#eee}#cooked-directions-builder .cooked-direction-block textarea{margin:0;display:block;height:191px;top:0}#cooked-directions-builder .cooked-direction-block>div{display:inline-block;float:left;box-sizing:border-box;padding-right:15px}#cooked-directions-builder .cooked-direction-block>div:last-child{padding:0}#cooked-directions-builder .cooked-direction-block>div input[type=text]{width:100%}#cooked-directions-builder .cooked-direction-block .mce-statusbar{display:none}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image{width:120px;position:absolute;top:15px;left:35px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image img{cursor:pointer;display:none;border-radius:3px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .cooked-direction-img-placeholder{box-sizing:border-box;cursor:pointer;border-radius:3px;width:100%;padding-bottom:100%;background:0 0;border:2px dashed #ddd;border-radius:3px;margin-top:15px}#cooked-directions-builder .cooked-direction-block:hover>.cooked-direction-image .cooked-direction-img-placeholder{background:0 0}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .cooked-direction-img-placeholder:hover{background:#ddd;border:2px solid #ddd}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .direction-image-button{width:100%;text-align:center}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .remove-image-button{display:none;position:absolute;top:43px;right:15px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image.cooked-has-image .remove-image-button{display:inline-block;padding:10px;background:rgba(0,0,0,.25);color:#fff}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image.cooked-has-image .remove-image-button:hover{background:#ff0100}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image.cooked-has-image img{width:100%;height:auto;display:block;margin:15px 0 0}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image.cooked-has-image .cooked-direction-img-placeholder{display:none}#cooked-directions-builder .cooked-direction-block>.cooked-direction-content{width:100%;padding-left:120px}#cooked-directions-builder .cooked-direction-block .cooked-direction-number{opacity:.4;position:absolute;display:inline-block;font-weight:800;top:17px;left:35px;font-size:1.25rem;line-height:1}#cooked-directions-builder .cooked-direction-block.cooked-direction-has-number>.cooked-direction-image{left:65px}#cooked-directions-builder .cooked-direction-block.cooked-direction-has-number>.cooked-direction-content{padding-left:175px}#cooked-directions-builder .cooked-direction-block.cooked-direction-has-number-wide>.cooked-direction-content{padding-left:185px}#cooked-directions-builder .cooked-direction-block>.cooked-heading-name{width:100%}#cooked-directions-builder .cooked-direction-block{margin:0}#cooked-directions-builder .cooked-direction-block i.cooked-icon-drag{cursor:move;color:#ccc;font-size:32px;position:absolute;top:13px;left:1px;touch-action:none}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading i.cooked-icon-drag{top:5px}#cooked-directions-builder .cooked-direction-block:hover i.cooked-icon-drag{color:#888}#cooked-directions-builder .cooked-direction-block.ui-sortable-helper{background:#f5f5f5;box-shadow:0 10px 20px rgba(0,0,0,.15);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}#cooked-directions-builder .cooked-direction-block.ui-sortable-placeholder{visibility:visible!important;background:#eee;display:block;width:100%;height:221px;border-top:6px solid #fff;border-bottom:6px solid #fff}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading.ui-sortable-placeholder{height:43px}#cooked-directions-builder .cooked-direction-block .cooked-delete-direction{cursor:pointer;font-size:14px;position:absolute;right:14px}#cooked-directions-builder .cooked-direction-block .cooked-delete-direction .cooked-icon{color:#fff}#cooked-directions-builder .cooked-direction-block:hover .cooked-delete-direction .cooked-icon{color:#888}#cooked-directions-builder .cooked-direction-block .cooked-delete-direction .cooked-icon:hover{color:#de2020}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading{margin:10px 0}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading>div input[type=text]{padding:0 7px;font-size:16px;background:#f9f9f9;font-weight:600;top:0;margin:0}#cooked-directions-builder .cooked-direction-block .cooked-delete-direction{top:16px}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading .cooked-delete-direction{top:14px}#cooked-recipe-image-gallery{margin:0 -1% 0}#cooked-recipe-image-gallery .cooked-recipe-gallery-item{position:relative;overflow:hidden;cursor:move;box-sizing:border-box;display:inline-block;width:18%;height:auto;padding:0;margin:0 1% 2% 1%}#cooked-recipe-image-gallery .cooked-recipe-gallery-item:hover{opacity:.9}#cooked-recipe-image-gallery .cooked-recipe-gallery-item img{width:100%;height:auto;border-radius:3px;display:block;margin:0;padding:0;border:none}#cooked-recipe-image-gallery .cooked-recipe-gallery-item.ui-sortable-helper,#cooked-recipe-image-gallery .cooked-recipe-gallery-item.ui-sortable-helper:hover{opacity:.75;box-shadow:0 10px 20px rgba(0,0,0,.15)}#cooked-recipe-image-gallery .cooked-recipe-gallery-item.ui-sortable-placeholder{width:18%;height:auto;visibility:visible!important;border-radius:3px;background:#ddd;display:inline-block}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .remove-image-button{border-radius:0 3px 0 0;display:inline-block;position:absolute;top:0;right:0;padding:10px;background:rgba(0,0,0,.25);color:#fff}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .remove-image-button:hover{background:#ff0100}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .cooked-gallery-edit-button{border-radius:3px 0 0 0;display:inline-block;position:absolute;top:0;left:0;padding:10px;background:rgba(0,0,0,.25);color:#fff}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .cooked-gallery-edit-button:hover{background:#0084bc}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .cooked-gallery-item-title{position:absolute;left:0;bottom:0;box-sizing:border-box;width:100%;border-radius:0 0 3px 3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;padding:10px 10px 11px;text-align:center;background:#000;background:rgba(0,0,0,.3);color:#fff;font-size:12px}#cooked-recipe-image-gallery .cooked-recipe-gallery-item:hover .cooked-gallery-item-title{background:#000;background:rgba(0,0,0,.75)}#cooked-recipe-image-gallery .cooked-recipe-gallery-item.ui-sortable-helper{-webkit-animation:cooked-wiggle .4s infinite;-moz-animation:cooked-wiggle .4s infinite;-o-animation:cooked-wiggle .4s infinite;animation:cooked-wiggle .4s infinite}#cooked_recipe_settings label.cooked-nutrition-label{display:block;font-size:.7rem;letter-spacing:.03rem;font-weight:700;text-transform:uppercase;line-height:1;margin:0 0 7px}#cooked_recipe_settings #cooked-nutrition-label{line-height:1.6;font-size:1.1rem;border:1px solid #aaa;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:5%;margin:0 0 2rem;font-family:Helvetica,Arial,sans-serif;container-name:nutrition-label;container-type:inline-size}#cooked_recipe_settings #cooked-nutrition-label h2{font-size:2.5rem;line-height:1;letter-spacing:0;font-weight:800;padding:0 0 .5rem 0;margin:0 0 .4rem;color:#333;border-bottom:1px solid #aaa}#cooked_recipe_settings #cooked-nutrition-label p.cooked-daily-value-text{padding:.5rem 0 0 0;margin:0;font-size:.9rem}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-servings p{font-size:1.5rem}#cooked_recipe_settings #cooked-nutrition-label ul{list-style:none;margin:0;padding:0}#cooked_recipe_settings #cooked-nutrition-label li{position:relative;margin:0;padding:0 0 3px 0;border-top:1px solid #aaa}#cooked_recipe_settings #cooked-nutrition-label li li{padding:3px 0 0;margin:3px 0 0}#cooked_recipe_settings #cooked-nutrition-label li:after{content:"";display:table;clear:both}#cooked_recipe_settings #cooked-nutrition-label li.no-after:after{content:none}#cooked_recipe_settings #cooked-nutrition-label li.cooked-nut-spacer{border:none;height:.6rem;padding:0;background:#333}#cooked_recipe_settings #cooked-nutrition-label ul li.cooked-nut-no-border,#cooked_recipe_settings #cooked-nutrition-label>ul>li:first-child{border:none}#cooked_recipe_settings #cooked-nutrition-label li ul{padding:0;margin:0 0 0 20px}#cooked_recipe_settings #cooked-nutrition-label li ul.cooked-right{margin:0}#cooked_recipe_settings #cooked-nutrition-label li ul.cooked-right li{border:none;padding:0;margin:0}#cooked_recipe_settings #cooked-nutrition-label li.cooked-calories ul.cooked-right li strong.cooked-nut-label{font-size:2.5rem;line-height:1}#cooked_recipe_settings #cooked-nutrition-label .cooked-calories{border-top:none;display:flex;justify-content:space-between;align-items:baseline;padding:0}#cooked_recipe_settings #cooked-nutrition-label .cooked-calories strong,#cooked_recipe_settings #cooked-nutrition-label .cooked-calories strong.cooked-nut-label{font-size:2rem;font-weight:800}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-servings li{border:none}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-servings{margin:0}#cooked_recipe_settings #cooked-nutrition-label .cooked-nut-hr{border:none;border-top:1.3rem solid #333;margin:.1rem 0 0;padding:0}#cooked_recipe_settings #cooked-nutrition-label strong{font-weight:800}#cooked_recipe_settings #cooked-nutrition-label .cooked-serving-size strong,#cooked_recipe_settings #cooked-nutrition-label .cooked-serving-size strong.cooked-nut-label{font-size:1.5rem;font-weight:800}#cooked_recipe_settings #cooked-nutrition-label strong.cooked-nut-heading{font-size:1rem}#cooked_recipe_settings #cooked-nutrition-label strong.cooked-nut-label{font-weight:400}#cooked_recipe_settings #cooked-nutrition-label .cooked-nut-right{float:right}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-bottom{margin:0 0 .75rem}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-bottom li{border-top:none;border-bottom:1px solid #aaa;float:left;width:100%;box-sizing:border-box}#cooked_recipe_settings .cooked-measurement-inputs .cooked-select-wrapper:before{top:8px}.cooked-auto-nutrition{display:flex;justify-content:end;margin:0 0 1rem}#cooked-tooltip-auto-nutrition-notice{margin:0}.cooked-settings-header{border-radius:10px 10px 0 0;width:auto;height:90px;line-height:85px;padding:0 30px;font-weight:600;box-sizing:border-box;background:#33373c;color:#fff;font-size:29px;letter-spacing:-.03rem}.cooked-settings-header .cooked-icon{color:#00e0a9}.cooked-settings-submit-wrap{padding:0 0 35px 35px;margin:-20px 0 0}#cooked_recipe_settings .recipe-setting-block .cooked-permalink-field-wrapper span{font-size:14px;display:inline-block;line-height:32px;padding:5px 0 0 0}#cooked_recipe_settings .recipe-setting-block input[type=text].cooked-permalink-field{position:relative;top:0;display:inline-block;width:150px;margin:0 10px}#cooked-settings-panel{position:relative;margin:0;padding:0}#cooked-settings-tabs{display:flex;width:auto;padding:0 20px 0 0;margin:0;list-style:none}#cooked-settings-tabs li{font-size:13px;line-height:1;font-weight:400;display:block;padding:0;margin:0;color:#fff}#cooked-settings-tabs li .cooked-icon{font-size:14px}#cooked-settings-tabs li .cooked-icon.cooked-icon-recipe-icon{font-size:20px;top:2px;position:relative}#cooked-settings-tabs li:hover{cursor:pointer}#cooked-settings-tabs li.active,#cooked-settings-tabs li.active:hover{cursor:default}#cooked-settings-tabs a{line-height:41px;font-size:.9rem;letter-spacing:.03rem;padding:2px 15px 4px;display:block;outline:0;box-shadow:none;border:none;white-space:nowrap}#cooked-settings-panel.stuck{padding-top:41px}#cooked-settings-panel.stuck #cooked-settings-tabs{position:fixed;width:calc(100% - 180px);top:32px;left:0;z-index:100000;margin-left:160px}#cooked-settings-panel .cooked-settings-tab-content-wrapper .cooked-settings-tab-content{display:none}#cooked-settings-panel .cooked-settings-tab-content-wrapper .cooked-settings-tab-content:first-child{display:block}#cooked-settings-panel .cooked-settings-tab-content{padding:25px 35px;margin-right:0}#cooked-settings-panel #cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{padding-bottom:.2rem}#cooked_recipe_settings .cooked-setting-column-14{position:relative;width:25%;float:left;padding-right:20px;box-sizing:border-box}#cooked_recipe_settings .cooked-setting-column-13{position:relative;width:33%;float:left;padding-right:20px;box-sizing:border-box}#cooked_recipe_settings .cooked-setting-column-23{position:relative;width:66%;float:left;padding-right:20px;box-sizing:border-box}#cooked_recipe_settings .cooked-setting-column-12{position:relative;width:50%;float:left;padding-right:20px;box-sizing:border-box}#cooked_recipe_settings .cooked-setting-column-12 input[type=text],#cooked_recipe_settings .cooked-setting-column-13 input[type=text],#cooked_recipe_settings .cooked-setting-column-14 input[type=text],#cooked_recipe_settings .cooked-setting-column-23 input[type=text],#cooked_recipe_settings .recipe-setting-block input[type=text].cooked-shortcode-field{width:95%}#cooked_recipe_settings .cooked-setting-column-12 .cooked-select-wrapper,#cooked_recipe_settings .cooked-setting-column-12 select,#cooked_recipe_settings .cooked-setting-column-13 .cooked-select-wrapper,#cooked_recipe_settings .cooked-setting-column-13 select,#cooked_recipe_settings .cooked-setting-column-14 .cooked-select-wrapper,#cooked_recipe_settings .cooked-setting-column-14 select,#cooked_recipe_settings .cooked-setting-column-23 select{width:100%}#cooked_recipe_settings .cooked-setting-column-14.cooked-tb-col{padding:0}#cooked-welcome-screen{padding:15px 50px 0 30px;position:relative}#cooked-welcome-screen .cooked-badge{position:absolute;top:0;right:0}#cooked-welcome-screen .cooked-badge img{border:none;width:150px;height:150px;display:block;margin:0}#cooked-welcome-screen .about-text{margin-bottom:40px;line-height:1.8;font-size:17px;margin-right:260px}#cooked-welcome-screen .about-wrap{margin:25px auto 0;max-width:1000px}#cooked-welcome-screen .about-wrap h1{font-size:2.25rem}#cooked-welcome-screen .about-wrap p{font-size:1rem;margin:0 0 2rem;line-height:1.7rem}#cooked-welcome-screen #cooked-welcome-panel{background:#fff;padding:30px 30px 15px 30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;border:none;box-shadow:0 4px 4px rgba(0,0,0,.05),0 8px 8px rgba(0,0,0,.05),0 32px 32px rgba(0,0,0,.05),0 64px 64px rgba(0,0,0,.05)}#cooked-welcome-screen #cooked-welcome-panel img.cooked-welcome-banner{border:none;display:block;padding:0;margin:0 0 30px;box-sizing:border-box;border-radius:5px 5px 0 0}#cooked-welcome-screen #cooked-welcome-panel .cooked-welcome-panel-intro{text-align:center;margin:0 50px 2rem;padding:15px 0;border-bottom:1px solid #e5e5e5}#cooked-welcome-screen #cooked-welcome-panel .cooked-welcome-panel-intro h1{font-size:1.75rem;margin:0 0 1rem;padding:0}#cooked-welcome-screen #cooked-welcome-panel .cooked-welcome-panel-intro p{max-width:600px;font-size:1.1rem;line-height:1.8rem;margin:0 auto 2rem;padding:0}#cooked-welcome-screen .cooked-welcome-panel a{text-decoration:none}#cooked-welcome-screen .cooked-welcome-panel-column{display:block!important}#cooked-welcome-screen .cooked-welcome-panel-column>strong{font-size:1rem}#cooked-welcome-screen .cooked-welcome-panel-column h3{font-size:1.75rem;margin:0 0 1rem;position:relative}#cooked-welcome-screen .cooked-welcome-panel-column h3 a{position:absolute;top:0;right:0;font-size:12px;font-weight:400}#cooked-welcome-screen .cooked-welcome-panel-column h3 a i.fa{position:relative;top:1px}#cooked-welcome-screen .cooked-welcome-panel-column h4{font-size:1.25rem;margin:0 0 1rem;position:relative}#cooked-welcome-screen .cooked-welcome-panel-column h4 a{position:absolute;top:0;right:0;font-size:12px;font-weight:400}#cooked-welcome-screen .cooked-welcome-panel-column h4 a i.fa{position:relative;top:1px}#cooked-welcome-screen .cooked-welcome-panel-column.cooked-welcome-panel-full{width:100%;padding-right:0;float:none}#cooked-welcome-screen .cooked-welcome-panel-column.cooked-welcome-panel-last{width:70%;padding-right:0;float:right}#cooked-welcome-screen .cooked-welcome-panel-column .fa-external-link{color:#888}#cooked-welcome-screen .cooked-welcome-panel-content{min-height:1px;padding:10px 50px 20px;margin:0}#cooked-welcome-screen .cooked-welcome-panel .cooked-welcome-panel-column-container{display:flex;justify-content:between!important;padding:0!important;flex-wrap:wrap}#cooked-welcome-screen .cooked-welcome-panel-column{box-sizing:border-box;padding-right:2rem;width:30%}#cooked-welcome-screen .cooked-pro-features{width:85%;margin:0 auto;padding:0 0 10px;display:flex;flex-wrap:wrap}#cooked-welcome-screen ul.cooked-whatsnew-list{margin-right:0}#cooked-welcome-screen ul.cooked-whatsnew-list li{line-height:1.7;position:relative;margin-right:0;border-top:1px solid #e5e5e5;padding:8px 0 4px 0}#cooked-welcome-screen ul.cooked-whatsnew-list li:first-child{border:none;padding-top:0}#cooked-welcome-screen ul.cooked-whatsnew-list em.fix,#cooked-welcome-screen ul.cooked-whatsnew-list strong.new,#cooked-welcome-screen ul.cooked-whatsnew-list strong.tweak{position:absolute;font-style:normal;display:inline-block;background:#aaa;text-transform:uppercase;top:11px;left:0;color:#fff;font-weight:600;-moz-border-radius:3px;-webkit-border-radius:3px;text-align:center;width:38px;border-radius:3px;font-size:10px;line-height:19px;height:19px;padding:0 6px;margin:0 6px 0 0}#cooked-welcome-screen ul.cooked-whatsnew-list li:first-child em.fix,#cooked-welcome-screen ul.cooked-whatsnew-list li:first-child strong.new,#cooked-welcome-screen ul.cooked-whatsnew-list li:first-child strong.tweak{top:3px}#cooked-welcome-screen ul.cooked-whatsnew-list strong.new{background:#56c477}#cooked-welcome-screen ul.cooked-whatsnew-list strong.tweak{background:#0073aa}#cooked-welcome-screen ul.cooked-whatsnew-list em.fix{background:#ffad10}#cooked-welcome-screen ul li.cooked-pro i.cooked-icon{color:#ffad10}#cooked-welcome-screen ul li.cooked-pro a{font-weight:600;color:#ffad10}#cooked-welcome-screen ul li.cooked-pro a:hover{color:#d3910f}#cooked-welcome-screen ul.cooked-whatsnew-pro{margin-bottom:0;flex:1 0 auto;width:33.333%}#cooked-welcome-screen ul.cooked-whatsnew-pro li{padding-left:0;font-size:1.15rem;font-weight:400}#cooked-welcome-screen ul.cooked-whatsnew-pro li i.cooked-icon-star{color:#ffad10;margin:0 7px 0 0;font-size:19px;position:relative;top:1px}#cooked-welcome-screen .cooked-welcome-bottom{text-align:center;background:#f9f9f9;margin:30px -80px -15px;border-top:1px solid #f1f1f1}#cooked-welcome-screen .cooked-pro-button{display:inline-block;clear:both;text-align:center;width:auto;margin:30px auto;padding:20px 25px 21px;font-size:1.25rem;line-height:1rem;font-weight:600;color:#fff;background:#ffad10;border-radius:50px}#cooked-welcome-screen .cooked-pro-button:hover{background:#e08704}#cooked-welcome-screen .cooked-coupon-code{color:#4c5e65;display:inline-block;font-size:17px;padding:0 0 0 1.5rem}@media screen and (max-width:1050px){#cooked-welcome-screen ul.cooked-whatsnew-pro{width:100%;margin-top:0}#cooked-welcome-screen ul.cooked-whatsnew-pro:first-child{margin-top:10px}#cooked-welcome-screen ul.cooked-whatsnew-pro li:first-child{border-top:1px solid #e5e5e5;padding-top:8px}#cooked-welcome-screen ul.cooked-whatsnew-pro:first-child li:first-child{border:none;padding-top:0}}@media screen and (max-width:870px){#cooked-welcome-screen .cooked-pro-features{width:90%}#cooked-welcome-screen .cooked-welcome-panel-column{padding-right:0}#cooked-welcome-screen .cooked-welcome-panel-column.cooked-welcome-panel-last{width:100%;padding-top:20px}#cooked-welcome-screen .about-wrap{margin-top:0}#cooked-welcome-screen .cooked-welcome-panel .cooked-welcome-panel-column li{display:block}}@media screen and (max-width:782px){#cooked-welcome-screen .cooked-pro-features{width:100%}#cooked-welcome-screen{padding:15px 40px 0 30px}#cooked-welcome-screen .cooked-badge{display:none}#cooked-welcome-screen .about-text,#cooked-welcome-screen .about-wrap h1{margin-right:0}#cooked-welcome-screen .cooked-welcome-panel-column h3 a{display:block;position:relative}}@media screen and (max-width:500px){#cooked-welcome-screen #cooked-welcome-panel img.cooked-welcome-banner{display:none}#cooked-welcome-screen .about-wrap h1{font-size:1.8rem}#cooked-welcome-screen .about-text{font-size:15px}}#cooked_recipe_settings #cooked-nutrition-label .cooked-nut-label,#cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{color:#0173aa}#cooked_recipe_settings .recipe-setting-block.cooked-danger h3.cooked-settings-title{color:#d44d1f}#cooked_recipe_settings .cooked-alert-block h3.cooked-settings-title{color:#c02a2a}#cooked-recipe-tabs{background:#fff}#cooked-recipe-tabs li{background:#454b52;color:#fff;color:rgba(255,255,255,.75);border-right:1px solid rgba(0,0,0,.15)}#cooked-recipe-tabs li:hover{background:#535a62;color:#fff;border-right:1px solid rgba(0,0,0,.15)}#cooked-recipe-tabs li.active{background:#fff;color:#333;border-right:1px solid #fff}#cooked-settings-tabs{background:#454b52}#cooked-settings-tabs a{color:#fff;text-decoration:none}#cooked-settings-tabs li{background:#454b52;color:#fff;color:rgba(255,255,255,.75)}#cooked-settings-tabs li:hover{background:#535a62;color:#fff}#cooked-settings-tabs li.active{background:#fff}#cooked-settings-tabs li.active a{color:#000}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .cooked-direction-img-placeholder,#cooked-migration-progress.cooked-progress .cooked-progress-bar,#cooked-related-progress.cooked-progress .cooked-progress-bar,#cooked_recipe_settings .cooked-select-wrapper:before,#cooked_recipe_settings .cooked-tooltip-icon,#cooked_recipe_settings select{-webkit-transition:all .15s ease-out;-moz-transition:all .15s ease-out;transition:all .15s ease-out}#cooked-recipe-image-gallery .cooked-recipe-gallery-item{-webkit-transition:transform .15s ease-out;-moz-transition:all .15s ease-out;transition:transform .15s ease-out}#cooked-recipe-tabs li.cooked-loading{-webkit-transition:opacity .15s ease-out;-moz-transition:all .15s ease-out;transition:opacity .15s ease-out}@-webkit-keyframes cooked-wiggle{0%{-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.03)}100%{-webkit-transform:scale(1)}}@-moz-keyframes cooked-wiggle{0%{-moz-transform:scale(1)}50%{-moz-transform:scale(1.03)}100%{-moz-transform:scale(1)}}@-o-keyframes cooked-wiggle{0%{-o-transform:scale(1)}50%{-o-transform:scale(1.03)}100%{-o-transform:scale(1)}}@keyframes cooked-wiggle{0%{transform:scale(1)}50%{transform:scale(1.03)}100%{transform:scale(1)}}@media screen and (max-width:1150px){#cooked-recipe-tabs li{font-size:.8rem;padding:0 1.2rem 0 .7rem}#cooked-recipe-tabs li .cooked-icon{display:none}}@media screen and (max-width:960px){#cooked_recipe_settings.stuck #cooked-recipe-tabs{margin-left:36px}}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields{width:100%;float:left;clear:both;margin-top:10px;padding-top:10px;padding-right:0;padding-left:0;margin-left:0;box-sizing:border-box;padding-bottom:5px;position:relative}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields .cooked-ingredient-amount{width:15%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields .cooked-ingredient-measurement{width:20%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields .cooked-ingredient-name{width:65%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields .cooked-sub-label{color:#7c7c7c;font-size:14px;font-weight:300}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields>div{display:inline-block;float:left;box-sizing:border-box;padding-right:10px} \ No newline at end of file +.cooked-clearfix:after{content:"";display:table;clear:both}#post-body-content #postdivrich{display:none}body.post-type-cp_recipe .wp-list-table tfoot th.check-column,body.post-type-cp_recipe .wp-list-table thead th.check-column{padding:15px 0 0 7px}body.post-type-cp_recipe .wp-list-table tfoot td,body.post-type-cp_recipe .wp-list-table tfoot th,body.post-type-cp_recipe .wp-list-table thead td,body.post-type-cp_recipe .wp-list-table thead th{padding:10px 10px}body.post-type-cp_recipe .wp-list-table tfoot th.sortable a,body.post-type-cp_recipe .wp-list-table tfoot th.sorted a,body.post-type-cp_recipe .wp-list-table thead th.sortable a,body.post-type-cp_recipe .wp-list-table thead th.sorted a{padding-left:0;padding-right:0}body.post-type-cp_recipe .wp-list-table tbody th.check-column{padding:15px 0 0 10px}body.post-type-cp_recipe .wp-list-table tbody td,body.post-type-cp_recipe .wp-list-table tbody th{padding:12px 10px}body.post-type-cp_recipe .wp-list-table tbody td.column-title strong{margin-top:6px}body.post-type-cp_recipe .wp-list-table tbody td.column-title strong .row-title{padding-top:10px;font-size:1rem!important}th.column-featured_image{width:50px;text-align:center}td.column-featured_image{width:50px;text-align:center}.cooked-admin-recipes-list-image img{width:49px;height:auto;border-radius:3px;position:relative;top:3px}body.post-type-cp_recipe #titlediv #title{box-shadow:none;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:0 12px;font-weight:400;font-size:19px;letter-spacing:0;height:44px}body.post-type-cp_recipe #titlediv #title-prompt-text{font-size:15px;color:#888;font-weight:400;letter-spacing:0;padding:12px 15px}body.post-type-cp_recipe .mce-fullscreen{z-index:100100!important}#cooked-settings-prewrap{display:flex;justify-content:center}#cooked-settings-wrap{position:relative;border-radius:10px;margin:40px 40px 40px 20px;max-width:1200px;min-width:1000px;background:#fff;box-shadow:0 4px 4px rgba(0,0,0,.05),0 8px 8px rgba(0,0,0,.05),0 32px 32px rgba(0,0,0,.05),0 64px 64px rgba(0,0,0,.05)}#cooked-settings-wrap.is-stuck{position:static!important}#cooked-settings-wrap .cooked-settings-update-button{position:absolute;top:30px;right:30px}#cooked-settings-wrap .cooked-settings-update-button>.button-primary{box-shadow:none;border:none}#cooked-settings-wrap.is-stuck .cooked-settings-update-button{position:fixed;top:40px;right:11px;z-index:100001}#cooked_recipe_settings .hndle,#cooked_recipe_settings button.handlediv{display:none}#cooked_recipe_settings .inside{padding:0;margin:0}#cooked-recipe-tabs{list-style:none;padding:0;margin:0;position:absolute;top:0;left:0;width:100%}#cooked-recipe-tabs li{font-size:.9rem;line-height:3rem;height:3rem;font-weight:500;display:inline-block;padding:0 1.25rem;margin:0;color:#fff}#cooked-recipe-tabs li:hover{cursor:pointer}#cooked-recipe-tabs li.active,#cooked-recipe-tabs li.active:hover{cursor:default}#cooked-recipe-tabs li:last-child{border-right:none!important}#cooked-recipe-tabs li.cooked-loading{opacity:0;background:0 0;color:#fff;position:absolute;top:0;right:0;cursor:default;font-size:14px;width:40px;height:40px;text-align:center;display:block;line-height:40px;padding:0}#cooked-recipe-tabs li.cooked-loading:hover{background:0 0;color:#fff}#cooked_recipe_settings.cooked-loading #cooked-recipe-tabs li.cooked-loading{opacity:1}#cooked_recipe_settings .inside{padding-top:41px}#cooked_recipe_settings.stuck #cooked-recipe-tabs{position:fixed;width:auto;top:32px;left:23px;z-index:100000;margin-left:160px;box-shadow:0 3px 50px rgba(0,0,0,.25)}#cooked_recipe_settings.stuck #cooked-recipe-tabs li.cooked-loading{right:160px}.cooked-recipe-tab-content-wrapper .cooked-recipe-tab-content{display:none}.cooked-recipe-tab-content-wrapper .cooked-recipe-tab-content:first-child{display:block}.cooked-left{float:left;display:inline-block;width:auto}.cooked-right{float:right;display:inline-block;width:auto}#cooked_field--cooked_pro_license_key{font-family:monospace}#cooked_recipe_settings .cooked-bm-5{margin-bottom:5px!important}#cooked_recipe_settings .cooked-bm-10{margin-bottom:10px!important}#cooked_recipe_settings .cooked-tm-10{margin-top:10px!important}#cooked_recipe_settings .cooked-bm-15{margin-bottom:15px!important}#cooked_recipe_settings .cooked-bm-20{margin-bottom:20px!important}#cooked_recipe_settings .cooked-bm-30{margin-bottom:30px!important}#cooked_recipe_settings .cooked-bm-5-up{margin-bottom:-5px!important}#cooked_recipe_settings .cooked-bm-10-up{margin-bottom:-10px!important}#cooked_recipe_settings .cooked-bm-15-up{margin-bottom:-15px!important}#cooked_recipe_settings .cooked-bm-20-up{margin-bottom:-20px!important}#cooked_recipe_settings .cooked-bm-30-up{margin-bottom:-30px!important}#cooked_recipe_settings .cooked-hr{border:none;border-top:2px solid #ddd;margin:10px 0 0 0;padding:15px 0 0 0}#cooked_recipe_settings .cooked-conditional-hidden{display:none}#cooked_recipe_settings .cooked-recipe-tab-content{padding:23px 30px 15px 30px}#cooked_recipe_settings .recipe-setting-block{margin:0 0 20px;width:100%}#cooked_recipe_settings .recipe-setting-block p{font-size:.9rem;line-height:1.5rem;margin:0 0 1rem;padding:0}#cooked_recipe_settings .recipe-setting-block p.cooked-padded{line-height:1.75rem;font-size:.85rem}#cooked_recipe_settings .recipe-setting-block .cooked-conditional-hidden{padding:0}#cooked_recipe_settings textarea{width:100%;height:75px;padding:15px;box-sizing:border-box;position:relative;top:5px}#cooked_recipe_settings .recipe-setting-block>label.cooked-select-label{top:5px}#cooked_recipe_settings select{cursor:pointer;-webkit-appearance:none;-moz-appearance:none;appearance:none;box-shadow:none;border-radius:3px;padding:0 45px 0 9px;line-height:31px;height:33px;box-sizing:border-box;background:#fff}#cooked_recipe_settings .cooked-select-wrapper{background:#fff;position:relative;width:auto;display:inline-block;border-radius:3px;margin:0 5px 0 0}#cooked_recipe_settings .cooked-select-wrapper select{margin:0;background:0 0;position:relative}#cooked_recipe_settings .cooked-select-wrapper:before{font-family:CookedIcons;display:block;width:15px;height:15px;line-height:14px;color:#000;font-size:14px;content:"\f00b";position:absolute;right:12px;top:11px;color:rgba(0,0,0,.3)}#cooked_recipe_settings .cooked-select-wrapper:hover:before{color:#000}#cooked_recipe_settings .cooked-select-wrapper:hover select{border-color:#ccc}#cooked_recipe_settings .cooked-checkbox-radio-label{position:relative;left:1px}#cooked_recipe_settings .recipe-setting-block input[type=checkbox],#cooked_recipe_settings .recipe-setting-block input[type=radio]{margin-top:0}#cooked_recipe_settings .recipe-setting-block input[type=number]{width:65px}#cooked_recipe_settings .recipe-setting-block input[type=password],#cooked_recipe_settings .recipe-setting-block input[type=text]{width:75%}#cooked_recipe_settings .recipe-setting-block input[type=number],#cooked_recipe_settings .recipe-setting-block input[type=password],#cooked_recipe_settings .recipe-setting-block input[type=text]{margin:0 6px 5px 0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;height:33px;box-shadow:none;position:relative;top:2px;padding:0 10px}#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs .cooked-measurement-column{width:43%;margin-right:3%;display:inline-block}#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs .cooked-select-wrapper,#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs input,#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs label{width:100%;display:block}#cooked_recipe_settings .recipe-setting-block p.cooked-measurement-inputs .cooked-select-wrapper select{width:100%}#cooked_recipe_settings .recipe-setting-block input[type=number],#cooked_recipe_settings .recipe-setting-block input[type=password].cooked-small-textfield,#cooked_recipe_settings .recipe-setting-block input[type=text].cooked-small-textfield{width:150px}#cooked_recipe_settings small{display:block;line-height:1.5;font-size:12px;color:#888;padding:10px 0 0}#cooked_recipe_settings .recipe-setting-block em{color:#aaa}#cooked_recipe_settings .recipe-setting-block,#cooked_recipe_settings .recipe-setting-block .cooked-repositioned{display:block;position:relative;box-sizing:border-box;line-height:1}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned{padding-left:157px}#cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{width:70%;position:relative;z-index:2;padding:.5rem 0 .5rem;margin:0;font-size:1rem;line-height:1.5rem;font-weight:600}#cooked_recipe_settings .recipe-setting-block strong.cooked-heading{font-size:14px}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned>label{position:absolute;top:1px;left:0;width:147px;cursor:default;font-weight:600}#cooked_recipe_settings .recipe-setting-block .cooked-tooltip-icon{color:#aaa;cursor:help;display:inline-block;margin-left:10px}#cooked_recipe_settings .recipe-setting-block .cooked-tooltip-icon:hover{color:#eee}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned>.cooked-checkbox-radio-label{top:7px}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned>label{top:auto;height:33px;line-height:30px;padding:0;width:130px}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned:first-child label:first-child{padding-top:12px;margin-top:-12px}#cooked_recipe_settings .recipe-setting-block .cooked-repositioned span.cooked-padded{padding:0 0 15px;display:block;line-height:1.9}#cooked_recipe_settings .recipe-setting-block .wp-picker-container .cooked-color-field.wp-color-picker{padding:5px;height:25px;top:0;margin:0;width:74px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;border:1px solid #ccc}#cooked_recipe_settings .recipe-setting-block input[type=text].cooked-shortcode-field{font-family:monospace;background:#f5f5f5;font-size:12px}#cooked_recipe_settings .cooked-banner-block{margin:30px -30px -17px;display:block;box-sizing:content-box;padding:10px 30px 15px;background:#f9f9f9;width:100%;border-top:1px solid #e5e5e5}#cooked_recipe_settings .cooked-advanced-options-hr{border:none;border-bottom:1px solid #ddd;height:1px;padding:10px 0 0 0;margin:0 0 20px}#cooked_recipe_settings .recipe-setting-block input.cooked-time-picker{top:0;width:100%;padding-right:70%;margin:0 0 3px}#cooked_recipe_settings .recipe-setting-block .cooked-time-picker-text{position:absolute;bottom:13px;right:40px;color:#888}#cooked_recipe_settings .cooked-alert-block{background:#fffbdc;-moz-border-radius:10px;-webkit-border-radius:10px;border-radius:10px;margin:10px 0 15px;padding:10px 22px 2px;border:2px solid #ece8c4}#cooked_recipe_settings .recipe-setting-block.cooked-template{display:none}#cooked_recipe_settings ul.cooked-admin-ul{font-size:.9rem;margin:0 0 1rem 2rem;list-style:disc}#cooked_recipe_settings ul.cooked-admin-ul li{font-size:.9rem;padding:0;margin:0 0 .5rem}#cooked_recipe_settings .cooked-html-block{background:#fff;width:auto;min-width:300px;display:inline-block;padding:.5rem 1.3rem .25rem;border-radius:3px;box-shadow:0 1px 3px rgba(0,0,0,.15)}#cooked_recipe_settings .recipe-setting-block .cooked-html-block h3.cooked-settings-title{width:100%;color:#333}#cooked_recipe_settings .recipe-setting-block .cooked-html-block.valid{background:#fff;border:2px solid #0aa780;box-shadow:none;border-radius:5px}#cooked_recipe_settings .recipe-setting-block .cooked-html-block.valid>.cooked-settings-title{color:#0aa780}#cooked_recipe_settings .recipe-setting-block .cooked-html-block.expired{border:2px solid #ca4a20}#cooked-directions-builder .cooked-direction-block.cooked-expanded>.cooked-heading-name,#cooked-directions-builder .cooked-direction-block.cooked-has-heading-element>.cooked-heading-name,#cooked-directions-builder .cooked-direction-block:hover>.cooked-heading-name,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-heading-name,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-heading-element>.cooked-heading-name,#cooked-ingredients-builder .cooked-ingredient-block:hover>.cooked-heading-name{padding-right:32px}#cooked-directions-builder .cooked-direction-block .cooked-show-heading-element,#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-heading-element{opacity:0;cursor:pointer;font-size:14px;position:absolute;top:14px;right:35px}#cooked-directions-builder .cooked-direction-block .cooked-show-heading-element .cooked-icon,#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-heading-element .cooked-icon{color:#888}#cooked-directions-builder .cooked-direction-block.cooked-expanded .cooked-show-heading-element,#cooked-directions-builder .cooked-direction-block.cooked-has-heading-element .cooked-show-heading-element,#cooked-directions-builder .cooked-direction-block:hover .cooked-show-heading-element,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded .cooked-show-heading-element,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-heading-element .cooked-show-heading-element,#cooked-ingredients-builder .cooked-ingredient-block:hover .cooked-show-heading-element{opacity:1}#cooked-directions-builder .cooked-direction-block .cooked-show-heading-element .cooked-icon:hover,#cooked-directions-builder .cooked-direction-block.cooked-expanded .cooked-show-heading-element .cooked-icon,#cooked-directions-builder .cooked-direction-block.cooked-has-heading-element .cooked-show-heading-element .cooked-icon,#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-heading-element .cooked-icon:hover,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded .cooked-show-heading-element .cooked-icon,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-heading-element .cooked-show-heading-element .cooked-icon{color:#0685ba}#cooked-directions-builder .cooked-direction-block>.cooked-heading-element,#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-element{display:none;width:65%;float:right;margin-top:4px;padding-right:32px}#cooked-directions-builder .cooked-direction-block>.cooked-heading-element select,#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-element select{color:#0685ba;width:100%}#cooked-directions-builder .cooked-direction-block>.cooked-heading-element label,#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-element label{font-weight:600}#cooked-directions-builder .cooked-direction-block.cooked-expanded>.cooked-heading-element,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-heading-element{display:block}#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-substitution{opacity:0;cursor:pointer;font-size:14px;position:absolute;top:15px;right:58px}#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-substitution .cooked-icon{color:#888}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded .cooked-show-substitution,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-substitution .cooked-show-substitution,#cooked-ingredients-builder .cooked-ingredient-block:hover .cooked-show-substitution{opacity:1;right:50px}#cooked-ingredients-builder .cooked-ingredient-block .cooked-show-substitution .cooked-icon:hover,#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded .cooked-show-substitution .cooked-icon,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-substitution .cooked-show-substitution .cooked-icon{color:#0685ba}#cooked-ingredients-builder .cooked-ingredient-block.cooked-expanded>.cooked-ingredient-name,#cooked-ingredients-builder .cooked-ingredient-block.cooked-has-substitution>.cooked-ingredient-name,#cooked-ingredients-builder .cooked-ingredient-block:hover>.cooked-ingredient-name{padding-right:32px}#cooked_recipe_settings .switchery-small,body.post-type-cp_recipe .switchery-small{height:1rem;width:1.75rem;border-radius:1rem;margin-right:.4rem}#cooked_recipe_settings .switchery-small>small,body.post-type-cp_recipe .switchery-small>small{width:1rem;height:1rem;padding:0}.cooked-tooltip-buttons .cooked-icon-spin{margin-top:10px;font-size:15px}.cooked-tooltip-buttons .cooked-saved-default{height:28px;line-height:28px;font-weight:700;font-size:15px;color:#888}.cooked-progress{display:none;position:relative;background:#eee;width:100%;height:6px;padding:0;border-radius:3px;margin:10px 0 0 0}.cooked-progress-text{display:none;font-size:10px;color:#aaa;padding:2px 0 5px}.cooked-progress-text.cooked-active,.cooked-progress.cooked-active{display:block}.cooked-progress .cooked-progress-bar{display:block;position:absolute;background:#0085ba;width:0%;height:6px;top:0;left:0;border-radius:3px}#cooked-import-progress.cooked-progress,#cooked-migration-progress.cooked-progress{background:#ccc;margin:25px 0 0 0;border-radius:6px;height:12px;max-width:600px}#cooked-import-progress.cooked-progress .cooked-progress-bar,#cooked-migration-progress.cooked-progress .cooked-progress-bar{border-radius:6px;height:12px}#cooked-import-progress-text.cooked-progress-text,#cooked-migration-progress-text.cooked-progress-text{font-size:11px;color:#888;max-width:600px}#cooked-import-completed,#cooked-migration-completed{display:none}#cooked-import-completed.cooked-active,#cooked-migration-completed.cooked-active{display:block}#cooked-csv-import-progress.cooked-progress{background:#ccc;margin:25px 0 0 0;border-radius:6px;height:12px;max-width:600px}#cooked-csv-import-progress.cooked-progress .cooked-progress-bar{border-radius:6px;height:12px}#cooked-csv-import-progress-text.cooked-progress-text{font-size:11px;color:#888;max-width:600px}#cooked-csv-import-completed{display:none}#cooked-csv-import-completed.cooked-active{display:block}#cooked-csv-import-form{max-width:100%;box-sizing:border-box}#cooked-csv-import-form input[type=file]{max-width:100%;box-sizing:border-box;width:100%}#cooked-csv-import-errors{max-width:100%;box-sizing:border-box;word-wrap:break-word}#cooked-import-progress.cooked-progress,#cooked-migration-progress.cooked-progress,#cooked-related-progress.cooked-progress{background:#ccc;margin:25px 0 0 0;border-radius:6px;height:12px;max-width:600px}#cooked-import-progress.cooked-progress .cooked-progress-bar,#cooked-migration-progress.cooked-progress .cooked-progress-bar,#cooked-related-progress.cooked-progress .cooked-progress-bar{border-radius:6px;height:12px}#cooked-import-progress-text.cooked-progress-text,#cooked-migration-progress-text.cooked-progress-text,#cooked-related-progress-text.cooked-progress-text{font-size:11px;color:#888;max-width:600px}#cooked-import-completed,#cooked-migration-completed,#cooked-related-completed{display:none}#cooked-import-completed.cooked-active,#cooked-migration-completed.cooked-active,#cooked-related-completed.cooked-active{display:block}.cooked-related-status{margin:0 0 12px 0;padding:8px 12px;font-size:13px;line-height:1.4;border-radius:4px;border-left:3px solid #00a878;background:#f0f9f6;color:#2d4a42;max-width:480px}#cooked-related-last-done.cooked-related-status{border-left-color:#8c9b99;background:#f6f8f7;color:#5c6b69}#cooked_recipe_settings .cooked-layout-save-default{position:relative;top:-2px;z-index:10;margin:0 0 0 15px;padding:0 8px 1px}#cooked_recipe_settings .cooked-layout-load-default{position:relative;top:-2px;z-index:10;margin:0 0 0 10px;padding:0 8px 1px}body .button.button-cooked-reset{color:#999}body .button.button-cooked-reset:hover{color:#555}#cooked_recipe_settings .cooked-ingredient-headers{display:block;padding:5px 25px 0 35px}#cooked_recipe_settings .cooked-ingredient-headers span{font-size:.7rem;font-weight:700;letter-spacing:.03rem;text-transform:uppercase;color:#0085ba;box-sizing:border-box;display:inline-block;float:left}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-amount{width:15%}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-measurement{width:20%}#cooked_recipe_settings .cooked-ingredient-headers span.cooked-ingredient-header-item{width:65%}#cooked-ingredients-builder{margin:0 0 20px}#cooked-ingredients-builder .cooked-ingredient-block{display:block;padding:5px 45px 5px 35px}#cooked-ingredients-builder .cooked-ingredient-block:hover{background:#eee}#cooked-ingredients-builder .cooked-ingredient-block input[type=number],#cooked-ingredients-builder .cooked-ingredient-block input[type=text],#cooked-ingredients-builder .cooked-ingredient-block select{margin:0;display:block;top:0}#cooked-ingredients-builder .cooked-ingredient-block>div{display:inline-block;float:left;box-sizing:border-box;padding-right:10px}#cooked-ingredients-builder .cooked-ingredient-block>div input[type=text]{width:100%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-amount{width:15%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-measurement{width:20%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-measurement .cooked-select-wrapper{width:100%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-measurement .cooked-select-wrapper select{width:100%}#cooked-ingredients-builder .cooked-ingredient-block .cooked-substitution-fields>.cooked-ingredient-measurement .cooked-select-wrapper{width:100%}#cooked-ingredients-builder .cooked-ingredient-block .cooked-substitution-fields>.cooked-ingredient-measurement .cooked-select-wrapper select{width:100%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-ingredient-name{width:65%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-heading-name{width:100%}#cooked-ingredients-builder .cooked-ingredient-block>div small.cooked-input-ex{display:block;padding:5px 0 0 2px}#cooked-ingredients-builder .cooked-ingredient-block{margin:0}#cooked-ingredients-builder .cooked-ingredient-block i.cooked-icon-drag{cursor:move;color:#ccc;font-size:32px;position:absolute;top:5px;left:1px;touch-action:none}#cooked-ingredients-builder .cooked-ingredient-block:hover i.cooked-icon-drag{color:#888}#cooked-ingredients-builder .cooked-ingredient-block.ui-sortable-helper{background:#f5f5f5;box-shadow:0 10px 20px rgba(0,0,0,.15);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}#cooked-ingredients-builder .cooked-ingredient-block.ui-sortable-placeholder{visibility:visible!important;background:#eee;display:block;width:100%;height:43px;border-top:6px solid #fff;border-bottom:6px solid #fff}#cooked-ingredients-builder .cooked-ingredient-block .cooked-delete-ingredient{cursor:pointer;font-size:14px;position:absolute;top:14px;right:11px}#cooked-ingredients-builder .cooked-ingredient-block .cooked-delete-ingredient .cooked-icon{color:#fff}#cooked-ingredients-builder .cooked-ingredient-block:hover .cooked-delete-ingredient .cooked-icon{color:#888}#cooked-ingredients-builder .cooked-ingredient-block .cooked-delete-ingredient .cooked-icon:hover{color:#de2020}#cooked-ingredients-builder .cooked-ingredient-block.cooked-ingredient-heading{margin:10px 0}#cooked-ingredients-builder .cooked-ingredient-block.cooked-ingredient-heading>div input[type=text]{padding:0 7px;font-size:16px;background:#f9f9f9;font-weight:600}#cooked-directions-builder{margin:0 0 20px}#cooked-directions-builder .cooked-direction-block{display:block;padding:15px 25px 15px 35px}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading{padding:5px 25px 5px 35px}#cooked-directions-builder .cooked-direction-block:hover{background:#f5f5f5}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading:hover{background:#eee}#cooked-directions-builder .cooked-direction-block textarea{margin:0;display:block;height:191px;top:0}#cooked-directions-builder .cooked-direction-block>div{display:inline-block;float:left;box-sizing:border-box;padding-right:15px}#cooked-directions-builder .cooked-direction-block>div:last-child{padding:0}#cooked-directions-builder .cooked-direction-block>div input[type=text]{width:100%}#cooked-directions-builder .cooked-direction-block .mce-statusbar{display:none}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image{width:120px;position:absolute;top:15px;left:35px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image img{cursor:pointer;display:none;border-radius:3px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .cooked-direction-img-placeholder{box-sizing:border-box;cursor:pointer;border-radius:3px;width:100%;padding-bottom:100%;background:0 0;border:2px dashed #ddd;border-radius:3px;margin-top:15px}#cooked-directions-builder .cooked-direction-block:hover>.cooked-direction-image .cooked-direction-img-placeholder{background:0 0}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .cooked-direction-img-placeholder:hover{background:#ddd;border:2px solid #ddd}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .direction-image-button{width:100%;text-align:center}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .remove-image-button{display:none;position:absolute;top:43px;right:15px}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image.cooked-has-image .remove-image-button{display:inline-block;padding:10px;background:rgba(0,0,0,.25);color:#fff}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image.cooked-has-image .remove-image-button:hover{background:#ff0100}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image.cooked-has-image img{width:100%;height:auto;display:block;margin:15px 0 0}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image.cooked-has-image .cooked-direction-img-placeholder{display:none}#cooked-directions-builder .cooked-direction-block>.cooked-direction-content{width:100%;padding-left:120px}#cooked-directions-builder .cooked-direction-block .cooked-direction-number{opacity:.4;position:absolute;display:inline-block;font-weight:800;top:17px;left:35px;font-size:1.25rem;line-height:1}#cooked-directions-builder .cooked-direction-block.cooked-direction-has-number>.cooked-direction-image{left:65px}#cooked-directions-builder .cooked-direction-block.cooked-direction-has-number>.cooked-direction-content{padding-left:175px}#cooked-directions-builder .cooked-direction-block.cooked-direction-has-number-wide>.cooked-direction-content{padding-left:185px}#cooked-directions-builder .cooked-direction-block>.cooked-heading-name{width:100%}#cooked-directions-builder .cooked-direction-block{margin:0}#cooked-directions-builder .cooked-direction-block i.cooked-icon-drag{cursor:move;color:#ccc;font-size:32px;position:absolute;top:13px;left:1px;touch-action:none}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading i.cooked-icon-drag{top:5px}#cooked-directions-builder .cooked-direction-block:hover i.cooked-icon-drag{color:#888}#cooked-directions-builder .cooked-direction-block.ui-sortable-helper{background:#f5f5f5;box-shadow:0 10px 20px rgba(0,0,0,.15);-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}#cooked-directions-builder .cooked-direction-block.ui-sortable-placeholder{visibility:visible!important;background:#eee;display:block;width:100%;height:221px;border-top:6px solid #fff;border-bottom:6px solid #fff}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading.ui-sortable-placeholder{height:43px}#cooked-directions-builder .cooked-direction-block .cooked-delete-direction{cursor:pointer;font-size:14px;position:absolute;right:14px}#cooked-directions-builder .cooked-direction-block .cooked-delete-direction .cooked-icon{color:#fff}#cooked-directions-builder .cooked-direction-block:hover .cooked-delete-direction .cooked-icon{color:#888}#cooked-directions-builder .cooked-direction-block .cooked-delete-direction .cooked-icon:hover{color:#de2020}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading{margin:10px 0}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading>div input[type=text]{padding:0 7px;font-size:16px;background:#f9f9f9;font-weight:600;top:0;margin:0}#cooked-directions-builder .cooked-direction-block .cooked-delete-direction{top:16px}#cooked-directions-builder .cooked-direction-block.cooked-direction-heading .cooked-delete-direction{top:14px}#cooked-recipe-image-gallery{margin:0 -1% 0}#cooked-recipe-image-gallery .cooked-recipe-gallery-item{position:relative;overflow:hidden;cursor:move;box-sizing:border-box;display:inline-block;width:18%;height:auto;padding:0;margin:0 1% 2% 1%}#cooked-recipe-image-gallery .cooked-recipe-gallery-item:hover{opacity:.9}#cooked-recipe-image-gallery .cooked-recipe-gallery-item img{width:100%;height:auto;border-radius:3px;display:block;margin:0;padding:0;border:none}#cooked-recipe-image-gallery .cooked-recipe-gallery-item.ui-sortable-helper,#cooked-recipe-image-gallery .cooked-recipe-gallery-item.ui-sortable-helper:hover{opacity:.75;box-shadow:0 10px 20px rgba(0,0,0,.15)}#cooked-recipe-image-gallery .cooked-recipe-gallery-item.ui-sortable-placeholder{width:18%;height:auto;visibility:visible!important;border-radius:3px;background:#ddd;display:inline-block}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .remove-image-button{border-radius:0 3px 0 0;display:inline-block;position:absolute;top:0;right:0;padding:10px;background:rgba(0,0,0,.25);color:#fff}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .remove-image-button:hover{background:#ff0100}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .cooked-gallery-edit-button{border-radius:3px 0 0 0;display:inline-block;position:absolute;top:0;left:0;padding:10px;background:rgba(0,0,0,.25);color:#fff}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .cooked-gallery-edit-button:hover{background:#0084bc}#cooked-recipe-image-gallery .cooked-recipe-gallery-item .cooked-gallery-item-title{position:absolute;left:0;bottom:0;box-sizing:border-box;width:100%;border-radius:0 0 3px 3px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;display:block;padding:10px 10px 11px;text-align:center;background:#000;background:rgba(0,0,0,.3);color:#fff;font-size:12px}#cooked-recipe-image-gallery .cooked-recipe-gallery-item:hover .cooked-gallery-item-title{background:#000;background:rgba(0,0,0,.75)}#cooked-recipe-image-gallery .cooked-recipe-gallery-item.ui-sortable-helper{-webkit-animation:cooked-wiggle .4s infinite;-moz-animation:cooked-wiggle .4s infinite;-o-animation:cooked-wiggle .4s infinite;animation:cooked-wiggle .4s infinite}#cooked_recipe_settings label.cooked-nutrition-label{display:block;font-size:.7rem;letter-spacing:.03rem;font-weight:700;text-transform:uppercase;line-height:1;margin:0 0 7px}#cooked_recipe_settings #cooked-nutrition-label{line-height:1.6;font-size:1.1rem;border:1px solid #aaa;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;padding:5%;margin:0 0 2rem;font-family:Helvetica,Arial,sans-serif;container-name:nutrition-label;container-type:inline-size}#cooked_recipe_settings #cooked-nutrition-label h2{font-size:2.5rem;line-height:1;letter-spacing:0;font-weight:800;padding:0 0 .5rem 0;margin:0 0 .4rem;color:#333;border-bottom:1px solid #aaa}#cooked_recipe_settings #cooked-nutrition-label p.cooked-daily-value-text{padding:.5rem 0 0 0;margin:0;font-size:.9rem}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-servings p{font-size:1.5rem}#cooked_recipe_settings #cooked-nutrition-label ul{list-style:none;margin:0;padding:0}#cooked_recipe_settings #cooked-nutrition-label li{position:relative;margin:0;padding:0 0 3px 0;border-top:1px solid #aaa}#cooked_recipe_settings #cooked-nutrition-label li li{padding:3px 0 0;margin:3px 0 0}#cooked_recipe_settings #cooked-nutrition-label li:after{content:"";display:table;clear:both}#cooked_recipe_settings #cooked-nutrition-label li.no-after:after{content:none}#cooked_recipe_settings #cooked-nutrition-label li.cooked-nut-spacer{border:none;height:.6rem;padding:0;background:#333}#cooked_recipe_settings #cooked-nutrition-label ul li.cooked-nut-no-border,#cooked_recipe_settings #cooked-nutrition-label>ul>li:first-child{border:none}#cooked_recipe_settings #cooked-nutrition-label li ul{padding:0;margin:0 0 0 20px}#cooked_recipe_settings #cooked-nutrition-label li ul.cooked-right{margin:0}#cooked_recipe_settings #cooked-nutrition-label li ul.cooked-right li{border:none;padding:0;margin:0}#cooked_recipe_settings #cooked-nutrition-label li.cooked-calories ul.cooked-right li strong.cooked-nut-label{font-size:2.5rem;line-height:1}#cooked_recipe_settings #cooked-nutrition-label .cooked-calories{border-top:none;display:flex;justify-content:space-between;align-items:baseline;padding:0}#cooked_recipe_settings #cooked-nutrition-label .cooked-calories strong,#cooked_recipe_settings #cooked-nutrition-label .cooked-calories strong.cooked-nut-label{font-size:2rem;font-weight:800}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-servings li{border:none}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-servings{margin:0}#cooked_recipe_settings #cooked-nutrition-label .cooked-nut-hr{border:none;border-top:1.3rem solid #333;margin:.1rem 0 0;padding:0}#cooked_recipe_settings #cooked-nutrition-label strong{font-weight:800}#cooked_recipe_settings #cooked-nutrition-label .cooked-serving-size strong,#cooked_recipe_settings #cooked-nutrition-label .cooked-serving-size strong.cooked-nut-label{font-size:1.5rem;font-weight:800}#cooked_recipe_settings #cooked-nutrition-label strong.cooked-nut-heading{font-size:1rem}#cooked_recipe_settings #cooked-nutrition-label strong.cooked-nut-label{font-weight:400}#cooked_recipe_settings #cooked-nutrition-label .cooked-nut-right{float:right}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-bottom{margin:0 0 .75rem}#cooked_recipe_settings #cooked-nutrition-label ul.cooked-nut-bottom li{border-top:none;border-bottom:1px solid #aaa;float:left;width:100%;box-sizing:border-box}#cooked_recipe_settings .cooked-measurement-inputs .cooked-select-wrapper:before{top:8px}.cooked-auto-nutrition{display:flex;justify-content:end;margin:0 0 1rem}#cooked-tooltip-auto-nutrition-notice{margin:0}.cooked-settings-header{border-radius:10px 10px 0 0;width:auto;height:90px;line-height:85px;padding:0 30px;font-weight:600;box-sizing:border-box;background:#33373c;color:#fff;font-size:29px;letter-spacing:-.03rem}.cooked-settings-header .cooked-icon{color:#00e0a9}.cooked-settings-submit-wrap{padding:0 0 35px 35px;margin:-20px 0 0}#cooked_recipe_settings .recipe-setting-block .cooked-permalink-field-wrapper span{font-size:14px;display:inline-block;line-height:32px;padding:5px 0 0 0}#cooked_recipe_settings .recipe-setting-block input[type=text].cooked-permalink-field{position:relative;top:0;display:inline-block;width:150px;margin:0 10px}#cooked-settings-panel{position:relative;margin:0;padding:0}#cooked-settings-tabs{display:flex;width:auto;padding:0 20px 0 0;margin:0;list-style:none}#cooked-settings-tabs li{font-size:13px;line-height:1;font-weight:400;display:block;padding:0;margin:0;color:#fff}#cooked-settings-tabs li .cooked-icon{font-size:14px}#cooked-settings-tabs li .cooked-icon.cooked-icon-recipe-icon{font-size:20px;top:2px;position:relative}#cooked-settings-tabs li:hover{cursor:pointer}#cooked-settings-tabs li.active,#cooked-settings-tabs li.active:hover{cursor:default}#cooked-settings-tabs a{line-height:41px;font-size:.9rem;letter-spacing:.03rem;padding:2px 15px 4px;display:block;outline:0;box-shadow:none;border:none;white-space:nowrap}#cooked-settings-panel.stuck{padding-top:41px}#cooked-settings-panel.stuck #cooked-settings-tabs{position:fixed;width:calc(100% - 180px);top:32px;left:0;z-index:100000;margin-left:160px}#cooked-settings-panel .cooked-settings-tab-content-wrapper .cooked-settings-tab-content{display:none}#cooked-settings-panel .cooked-settings-tab-content-wrapper .cooked-settings-tab-content:first-child{display:block}#cooked-settings-panel .cooked-settings-tab-content{padding:25px 35px;margin-right:0}#cooked-settings-panel #cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{padding-bottom:.2rem}#cooked_recipe_settings .cooked-setting-column-14{position:relative;width:25%;float:left;padding-right:20px;box-sizing:border-box}#cooked_recipe_settings .cooked-setting-column-13{position:relative;width:33%;float:left;padding-right:20px;box-sizing:border-box}#cooked_recipe_settings .cooked-setting-column-23{position:relative;width:66%;float:left;padding-right:20px;box-sizing:border-box}#cooked_recipe_settings .cooked-setting-column-12{position:relative;width:50%;float:left;padding-right:20px;box-sizing:border-box}#cooked_recipe_settings .cooked-setting-column-12 input[type=text],#cooked_recipe_settings .cooked-setting-column-13 input[type=text],#cooked_recipe_settings .cooked-setting-column-14 input[type=text],#cooked_recipe_settings .cooked-setting-column-23 input[type=text],#cooked_recipe_settings .recipe-setting-block input[type=text].cooked-shortcode-field{width:95%}#cooked_recipe_settings .cooked-setting-column-12 .cooked-select-wrapper,#cooked_recipe_settings .cooked-setting-column-12 select,#cooked_recipe_settings .cooked-setting-column-13 .cooked-select-wrapper,#cooked_recipe_settings .cooked-setting-column-13 select,#cooked_recipe_settings .cooked-setting-column-14 .cooked-select-wrapper,#cooked_recipe_settings .cooked-setting-column-14 select,#cooked_recipe_settings .cooked-setting-column-23 select{width:100%}#cooked_recipe_settings .cooked-setting-column-14.cooked-tb-col{padding:0}#cooked-welcome-screen{padding:15px 50px 0 30px;position:relative}#cooked-welcome-screen .cooked-badge{position:absolute;top:0;right:0}#cooked-welcome-screen .cooked-badge img{border:none;width:150px;height:150px;display:block;margin:0}#cooked-welcome-screen .about-text{margin-bottom:40px;line-height:1.8;font-size:17px;margin-right:260px}#cooked-welcome-screen .about-wrap{margin:25px auto 0;max-width:1000px}#cooked-welcome-screen .about-wrap h1{font-size:2.25rem}#cooked-welcome-screen .about-wrap p{font-size:1rem;margin:0 0 2rem;line-height:1.7rem}#cooked-welcome-screen #cooked-welcome-panel{background:#fff;padding:30px 30px 15px 30px;-moz-border-radius:15px;-webkit-border-radius:15px;border-radius:15px;border:none;box-shadow:0 4px 4px rgba(0,0,0,.05),0 8px 8px rgba(0,0,0,.05),0 32px 32px rgba(0,0,0,.05),0 64px 64px rgba(0,0,0,.05)}#cooked-welcome-screen #cooked-welcome-panel img.cooked-welcome-banner{border:none;display:block;padding:0;margin:0 0 30px;box-sizing:border-box;border-radius:5px 5px 0 0}#cooked-welcome-screen #cooked-welcome-panel .cooked-welcome-panel-intro{text-align:center;margin:0 50px 2rem;padding:15px 0;border-bottom:1px solid #e5e5e5}#cooked-welcome-screen #cooked-welcome-panel .cooked-welcome-panel-intro h1{font-size:1.75rem;margin:0 0 1rem;padding:0}#cooked-welcome-screen #cooked-welcome-panel .cooked-welcome-panel-intro p{max-width:600px;font-size:1.1rem;line-height:1.8rem;margin:0 auto 2rem;padding:0}#cooked-welcome-screen .cooked-welcome-panel a{text-decoration:none}#cooked-welcome-screen .cooked-welcome-panel-column{display:block!important}#cooked-welcome-screen .cooked-welcome-panel-column>strong{font-size:1rem}#cooked-welcome-screen .cooked-welcome-panel-column h3{font-size:1.75rem;margin:0 0 1rem;position:relative}#cooked-welcome-screen .cooked-welcome-panel-column h3 a{position:absolute;top:0;right:0;font-size:12px;font-weight:400}#cooked-welcome-screen .cooked-welcome-panel-column h3 a i.fa{position:relative;top:1px}#cooked-welcome-screen .cooked-welcome-panel-column h4{font-size:1.25rem;margin:0 0 1rem;position:relative}#cooked-welcome-screen .cooked-welcome-panel-column h4 a{position:absolute;top:0;right:0;font-size:12px;font-weight:400}#cooked-welcome-screen .cooked-welcome-panel-column h4 a i.fa{position:relative;top:1px}#cooked-welcome-screen .cooked-welcome-panel-column.cooked-welcome-panel-full{width:100%;padding-right:0;float:none}#cooked-welcome-screen .cooked-welcome-panel-column.cooked-welcome-panel-last{width:70%;padding-right:0;float:right}#cooked-welcome-screen .cooked-welcome-panel-column .fa-external-link{color:#888}#cooked-welcome-screen .cooked-welcome-panel-content{min-height:1px;padding:10px 50px 20px;margin:0}#cooked-welcome-screen .cooked-welcome-panel .cooked-welcome-panel-column-container{display:flex;justify-content:between!important;padding:0!important;flex-wrap:wrap}#cooked-welcome-screen .cooked-welcome-panel-column{box-sizing:border-box;padding-right:2rem;width:30%}#cooked-welcome-screen .cooked-pro-features{width:85%;margin:0 auto;padding:0 0 10px;display:flex;flex-wrap:wrap}#cooked-welcome-screen ul.cooked-whatsnew-list{margin-right:0}#cooked-welcome-screen ul.cooked-whatsnew-list li{line-height:1.7;position:relative;margin-right:0;border-top:1px solid #e5e5e5;padding:8px 0 4px 0}#cooked-welcome-screen ul.cooked-whatsnew-list li:first-child{border:none;padding-top:0}#cooked-welcome-screen ul.cooked-whatsnew-list em.fix,#cooked-welcome-screen ul.cooked-whatsnew-list strong.new,#cooked-welcome-screen ul.cooked-whatsnew-list strong.tweak{position:absolute;font-style:normal;display:inline-block;background:#aaa;text-transform:uppercase;top:11px;left:0;color:#fff;font-weight:600;-moz-border-radius:3px;-webkit-border-radius:3px;text-align:center;width:38px;border-radius:3px;font-size:10px;line-height:19px;height:19px;padding:0 6px;margin:0 6px 0 0}#cooked-welcome-screen ul.cooked-whatsnew-list li:first-child em.fix,#cooked-welcome-screen ul.cooked-whatsnew-list li:first-child strong.new,#cooked-welcome-screen ul.cooked-whatsnew-list li:first-child strong.tweak{top:3px}#cooked-welcome-screen ul.cooked-whatsnew-list strong.new{background:#56c477}#cooked-welcome-screen ul.cooked-whatsnew-list strong.tweak{background:#0073aa}#cooked-welcome-screen ul.cooked-whatsnew-list em.fix{background:#ffad10}#cooked-welcome-screen ul li.cooked-pro i.cooked-icon{color:#ffad10}#cooked-welcome-screen ul li.cooked-pro a{font-weight:600;color:#ffad10}#cooked-welcome-screen ul li.cooked-pro a:hover{color:#d3910f}#cooked-welcome-screen ul.cooked-whatsnew-pro{margin-bottom:0;flex:1 0 auto;width:33.333%}#cooked-welcome-screen ul.cooked-whatsnew-pro li{padding-left:0;font-size:1.15rem;font-weight:400}#cooked-welcome-screen ul.cooked-whatsnew-pro li i.cooked-icon-star{color:#ffad10;margin:0 7px 0 0;font-size:19px;position:relative;top:1px}#cooked-welcome-screen .cooked-welcome-bottom{text-align:center;background:#f9f9f9;margin:30px -80px -15px;border-top:1px solid #f1f1f1}#cooked-welcome-screen .cooked-pro-button{display:inline-block;clear:both;text-align:center;width:auto;margin:30px auto;padding:20px 25px 21px;font-size:1.25rem;line-height:1rem;font-weight:600;color:#fff;background:#ffad10;border-radius:50px}#cooked-welcome-screen .cooked-pro-button:hover{background:#e08704}#cooked-welcome-screen .cooked-coupon-code{color:#4c5e65;display:inline-block;font-size:17px;padding:0 0 0 1.5rem}@media screen and (max-width:1050px){#cooked-welcome-screen ul.cooked-whatsnew-pro{width:100%;margin-top:0}#cooked-welcome-screen ul.cooked-whatsnew-pro:first-child{margin-top:10px}#cooked-welcome-screen ul.cooked-whatsnew-pro li:first-child{border-top:1px solid #e5e5e5;padding-top:8px}#cooked-welcome-screen ul.cooked-whatsnew-pro:first-child li:first-child{border:none;padding-top:0}}@media screen and (max-width:870px){#cooked-welcome-screen .cooked-pro-features{width:90%}#cooked-welcome-screen .cooked-welcome-panel-column{padding-right:0}#cooked-welcome-screen .cooked-welcome-panel-column.cooked-welcome-panel-last{width:100%;padding-top:20px}#cooked-welcome-screen .about-wrap{margin-top:0}#cooked-welcome-screen .cooked-welcome-panel .cooked-welcome-panel-column li{display:block}}@media screen and (max-width:782px){#cooked-welcome-screen .cooked-pro-features{width:100%}#cooked-welcome-screen{padding:15px 40px 0 30px}#cooked-welcome-screen .cooked-badge{display:none}#cooked-welcome-screen .about-text,#cooked-welcome-screen .about-wrap h1{margin-right:0}#cooked-welcome-screen .cooked-welcome-panel-column h3 a{display:block;position:relative}}@media screen and (max-width:500px){#cooked-welcome-screen #cooked-welcome-panel img.cooked-welcome-banner{display:none}#cooked-welcome-screen .about-wrap h1{font-size:1.8rem}#cooked-welcome-screen .about-text{font-size:15px}}#cooked_recipe_settings #cooked-nutrition-label .cooked-nut-label,#cooked_recipe_settings .recipe-setting-block h3.cooked-settings-title{color:#0173aa}#cooked_recipe_settings .recipe-setting-block.cooked-danger h3.cooked-settings-title{color:#d44d1f}#cooked_recipe_settings .cooked-alert-block h3.cooked-settings-title{color:#c02a2a}#cooked-recipe-tabs{background:#fff}#cooked-recipe-tabs li{background:#454b52;color:#fff;color:rgba(255,255,255,.75);border-right:1px solid rgba(0,0,0,.15)}#cooked-recipe-tabs li:hover{background:#535a62;color:#fff;border-right:1px solid rgba(0,0,0,.15)}#cooked-recipe-tabs li.active{background:#fff;color:#333;border-right:1px solid #fff}#cooked-settings-tabs{background:#454b52}#cooked-settings-tabs a{color:#fff;text-decoration:none}#cooked-settings-tabs li{background:#454b52;color:#fff;color:rgba(255,255,255,.75)}#cooked-settings-tabs li:hover{background:#535a62;color:#fff}#cooked-settings-tabs li.active{background:#fff}#cooked-settings-tabs li.active a{color:#000}#cooked-directions-builder .cooked-direction-block>.cooked-direction-image .cooked-direction-img-placeholder,#cooked-migration-progress.cooked-progress .cooked-progress-bar,#cooked-related-progress.cooked-progress .cooked-progress-bar,#cooked_recipe_settings .cooked-select-wrapper:before,#cooked_recipe_settings .cooked-tooltip-icon,#cooked_recipe_settings select{-webkit-transition:all .15s ease-out;-moz-transition:all .15s ease-out;transition:all .15s ease-out}#cooked-recipe-image-gallery .cooked-recipe-gallery-item{-webkit-transition:transform .15s ease-out;-moz-transition:all .15s ease-out;transition:transform .15s ease-out}#cooked-recipe-tabs li.cooked-loading{-webkit-transition:opacity .15s ease-out;-moz-transition:all .15s ease-out;transition:opacity .15s ease-out}@-webkit-keyframes cooked-wiggle{0%{-webkit-transform:scale(1)}50%{-webkit-transform:scale(1.03)}100%{-webkit-transform:scale(1)}}@-moz-keyframes cooked-wiggle{0%{-moz-transform:scale(1)}50%{-moz-transform:scale(1.03)}100%{-moz-transform:scale(1)}}@-o-keyframes cooked-wiggle{0%{-o-transform:scale(1)}50%{-o-transform:scale(1.03)}100%{-o-transform:scale(1)}}@keyframes cooked-wiggle{0%{transform:scale(1)}50%{transform:scale(1.03)}100%{transform:scale(1)}}@media screen and (max-width:1150px){#cooked-recipe-tabs li{font-size:.8rem;padding:0 1.2rem 0 .7rem}#cooked-recipe-tabs li .cooked-icon{display:none}}@media screen and (max-width:960px){#cooked_recipe_settings.stuck #cooked-recipe-tabs{margin-left:36px}}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields{width:100%;float:left;clear:both;margin-top:10px;padding-top:10px;padding-right:0;padding-left:0;margin-left:0;box-sizing:border-box;padding-bottom:5px;position:relative}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields .cooked-ingredient-amount{width:15%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields .cooked-ingredient-measurement{width:20%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields .cooked-ingredient-name{width:65%}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields .cooked-sub-label{color:#7c7c7c;font-size:14px;font-weight:300}#cooked-ingredients-builder .cooked-ingredient-block>.cooked-substitution-fields>div{display:inline-block;float:left;box-sizing:border-box;padding-right:10px}.cooked-bulk-add-overlay{position:fixed;top:0;left:0;right:0;bottom:0;background:rgba(0,0,0,.6);z-index:100100;display:flex;align-items:center;justify-content:center}.cooked-bulk-add-modal{background:#fff;border-radius:6px;width:600px;max-width:90vw;max-height:80vh;display:flex;flex-direction:column;box-shadow:0 5px 30px rgba(0,0,0,.3)}.cooked-bulk-add-header{display:flex;align-items:center;justify-content:space-between;padding:16px 20px;border-bottom:1px solid #ddd}.cooked-bulk-add-header h2{margin:0;font-size:18px;line-height:1.3}.cooked-bulk-add-close{font-size:24px;text-decoration:none;color:#666;line-height:1;padding:0 4px}.cooked-bulk-add-close:hover{color:#d63638}.cooked-bulk-add-body{padding:20px;overflow-y:auto;flex:1}.cooked-bulk-add-help{margin-top:0;color:#666;font-size:13px}#cooked-bulk-add-textarea{width:100%;min-height:160px;font-size:14px;padding:10px;box-sizing:border-box;resize:vertical}.cooked-bulk-add-preview{margin-top:16px}.cooked-bulk-add-preview-label{margin:0 0 8px;font-size:13px}.cooked-bulk-add-preview-notice-ingredients{display:none;margin:10px 0 0;font-size:12px;line-height:1.45;color:#b45309;font-weight:700;gap:6px;align-items:flex-start}#cooked-bulk-add-preview[data-bulk-type=ingredients] .cooked-bulk-add-preview-notice-ingredients{display:flex}.cooked-bulk-add-preview-notice-mark{flex-shrink:0;font-weight:700;line-height:1.45;color:#b45309}.cooked-bulk-add-preview-notice-text{flex:1;min-width:0;font-weight:700;color:#b45309}.cooked-bulk-add-preview-list{max-height:200px;overflow-y:auto;border:1px solid #ddd;border-radius:4px;padding:4px}.cooked-bulk-add-preview-row{display:flex;align-items:center;gap:8px;padding:4px 6px;border-bottom:1px solid #f0f0f0}.cooked-bulk-add-preview-row:last-child{border-bottom:0}.cooked-bulk-add-heading-toggle{display:flex;align-items:center;gap:4px;white-space:nowrap;font-size:12px;color:#666;cursor:pointer;flex-shrink:0}.cooked-bulk-add-heading-toggle input[type=checkbox]{margin:0}.cooked-bulk-add-preview-text{flex:1;border:1px solid #ddd;border-radius:3px;padding:4px 8px;font-size:13px}.cooked-bulk-add-preview-row:not(.cooked-bulk-add-preview-row-ingredient).cooked-bulk-add-is-heading .cooked-bulk-add-preview-text{font-weight:700}.cooked-bulk-add-preview-row-ingredient .cooked-bulk-add-heading-line-wrap{display:none;flex:1;align-items:center;gap:8px;min-width:0}.cooked-bulk-add-preview-row-ingredient.cooked-bulk-add-is-heading .cooked-bulk-add-heading-line-wrap{display:flex}.cooked-bulk-add-preview-row-ingredient.cooked-bulk-add-is-heading .cooked-bulk-add-parsed-amount,.cooked-bulk-add-preview-row-ingredient.cooked-bulk-add-is-heading .cooked-bulk-add-parsed-name,.cooked-bulk-add-preview-row-ingredient.cooked-bulk-add-is-heading .cooked-bulk-add-parsed-unit{display:none}.cooked-bulk-add-heading-line-label{flex-shrink:0;font-size:12px;font-weight:600;color:#666}.cooked-bulk-add-preview-row-ingredient .cooked-bulk-add-heading-line-wrap .cooked-bulk-add-preview-text{flex:1;min-width:0;border:1px solid #ddd;border-radius:3px;padding:4px 8px;font-size:13px;font-weight:600}.cooked-bulk-add-preview-header{display:flex;align-items:center;gap:8px;padding:4px 6px 6px;border-bottom:1px solid #ddd;font-size:11px;font-weight:600;color:#999;text-transform:uppercase;letter-spacing:.5px}.cooked-bulk-add-col-heading{flex-shrink:0;width:108px}.cooked-bulk-add-col-amount{width:72px;flex-shrink:0}.cooked-bulk-add-col-unit{width:108px;flex-shrink:0}.cooked-bulk-add-col-name{flex:1}.cooked-bulk-add-parsed-amount{width:72px;flex-shrink:0;border:1px solid #ddd;border-radius:3px;padding:4px 6px;font-size:13px;text-align:center}.cooked-bulk-add-parsed-unit{width:108px;flex-shrink:0;border:1px solid #ddd;border-radius:3px;padding:4px 6px;font-size:13px}.cooked-bulk-add-parsed-name{flex:1;border:1px solid #ddd;border-radius:3px;padding:4px 6px;font-size:13px}.cooked-bulk-add-footer{display:flex;align-items:center;justify-content:flex-end;gap:8px;padding:14px 20px;border-top:1px solid #ddd}.cooked-bulk-add-footer .button,.cooked-bulk-add-footer .button.button-primary{float:none;margin:0;vertical-align:middle}.cooked-bulk-add-spinner{float:none!important;margin:0!important} \ No newline at end of file diff --git a/assets/admin/js/cooked-functions.js b/assets/admin/js/cooked-functions.js index 00dd580..5e0bed7 100644 --- a/assets/admin/js/cooked-functions.js +++ b/assets/admin/js/cooked-functions.js @@ -1,6 +1,6 @@ var $_CookedConditionalTimeout = false; -// Touch event support for sortable drag handles on mobile devices +/** Maps touch events on sortable drag handles to mouse events so sortable works on touch devices. */ var cookedSortableTouchHandler = function(event) { var target = event.target; var types = { @@ -663,6 +663,9 @@ var cookedSortableTouchHandler = function(event) { }); } + // Bulk Add Modal + cooked_init_bulk_add($); + if ( $_CookedRecipeGallery.length ) { var gallery_images_frame; @@ -793,6 +796,7 @@ var cookedSortableTouchHandler = function(event) { var cooked_recipe_update_counter = 0; var cooked_bulk_per_page = 20; +/** Applies default recipe content in paginated AJAX batches and updates the progress UI. */ function cooked_set_default_template(page, total_recipes, content, nonce, instance) { if (total_recipes <= 0) { return; @@ -842,6 +846,7 @@ function cooked_set_default_template(page, total_recipes, content, nonce, instan ); } +/** Sets the total time field to prep time plus cook time. */ function cooked_updateTotalTimeValue( prepTime, cookTime ) { var totalTimeInput = jQuery( '#cooked-total-time' ), totalTime = prepTime + cookTime; @@ -856,6 +861,7 @@ function cooked_init_gallery_sorting() { jQuery('#cooked-recipe-image-gallery').sortable(); } +/** Syncs nutrition tab inputs with the live nutrition label preview (values and daily-value percents). */ function init_nutrition_facts( nutritionTab ) { nutritionTab.find('input').each(function() { var thisInput = jQuery(this), @@ -1106,3 +1112,407 @@ function cooked_init_conditional_field(thisID) { }, 25); }); } + +/** Wires the bulk-add modal (preview, parse, submit) for ingredients and directions. */ +function cooked_init_bulk_add($) { + var $overlay = $('#cooked-bulk-add-overlay'); + if (!$overlay.length) return; + + var $textarea = $('#cooked-bulk-add-textarea'), + $preview = $('#cooked-bulk-add-preview'), + $previewList = $('#cooked-bulk-add-preview-list'), + $title = $('#cooked-bulk-add-title'), + $typeField = $('#cooked-bulk-add-type'), + $submitBtn = $overlay.find('.cooked-bulk-add-submit'), + $spinner = $overlay.find('.cooked-bulk-add-spinner'), + jsVars = cooked_admin_functions_js_vars, + parseTimer = null, + lastParsedText = ''; + + /** Opens the bulk-add overlay for the given type and sets copy/placeholders. */ + function openModal(type) { + $typeField.val(type); + $textarea.val(''); + $previewList.empty(); + $preview.attr('data-bulk-type', ''); + $preview.hide(); + $submitBtn.attr('disabled', 'disabled'); + $spinner.hide(); + lastParsedText = ''; + + if (type === 'ingredients') { + $title.text(jsVars.i18n_bulk_add_ingredients); + $textarea.attr('placeholder', jsVars.i18n_bulk_add_placeholder_ingredients); + $submitBtn.text(jsVars.i18n_bulk_add_submit_ingredients); + } else { + $title.text(jsVars.i18n_bulk_add_directions); + $textarea.attr('placeholder', jsVars.i18n_bulk_add_placeholder_directions); + $submitBtn.text(jsVars.i18n_bulk_add_submit_directions); + } + + $overlay.show(); + $textarea.focus(); + } + + /** Hides the bulk-add overlay and clears its state. */ + function closeModal() { + $overlay.hide(); + $textarea.val(''); + $previewList.empty(); + $preview.attr('data-bulk-type', ''); + $preview.hide(); + lastParsedText = ''; + if (parseTimer) clearTimeout(parseTimer); + } + + /** Strips leading list markers from a single line of bulk text. */ + function cleanLine(line) { + line = line.trim(); + line = line.replace(/^(\d+\)\s+|\d+\.\s+|[a-z]+\)\s+|[•·\-\*]\s+|[A-Z]+\.\s+|[IVX]+\.\s+)/, ''); + return line.trim(); + } + + /** Splits bulk textarea content into non-empty cleaned lines. */ + function parseTextToLines(text) { + var lines = text.split(/[\r\n]+/); + var result = []; + for (var i = 0; i < lines.length; i++) { + var cleaned = cleanLine(lines[i]); + if (cleaned) { + result.push(cleaned); + } + } + return result; + } + + /** Escapes a string for safe insertion into HTML attribute strings. */ + function escHtml(str) { + return $('').text(str).html(); + } + + /** Renders bulk directions preview rows from parsed lines. */ + function renderDirectionsPreview(lines) { + $previewList.empty(); + if (!lines.length) { + $preview.attr('data-bulk-type', ''); + $preview.hide(); + $submitBtn.attr('disabled', 'disabled'); + return; + } + $preview.attr('data-bulk-type', 'directions'); + $preview.show(); + $submitBtn.removeAttr('disabled'); + + for (var i = 0; i < lines.length; i++) { + var $row = $('
'); + var $cb = $(''); + var $text = $(''); + $row.append($cb).append($text); + $previewList.append($row); + } + } + + /** Renders bulk ingredients preview rows (optionally with server-parsed amount/unit/name). */ + function renderIngredientsPreview(lines, parsed) { + $previewList.empty(); + if (!lines.length) { + $preview.attr('data-bulk-type', ''); + $preview.hide(); + $submitBtn.attr('disabled', 'disabled'); + return; + } + $preview.attr('data-bulk-type', 'ingredients'); + $preview.show(); + $submitBtn.removeAttr('disabled'); + + if (!$previewList.find('.cooked-bulk-add-preview-header').length) { + $previewList.prepend( + '
' + + '' + + '' + escHtml(jsVars.i18n_bulk_add_amount) + '' + + '' + escHtml(jsVars.i18n_bulk_add_unit) + '' + + '' + escHtml(jsVars.i18n_bulk_add_name) + '' + + '
' + ); + } + + for (var i = 0; i < lines.length; i++) { + var p = parsed && parsed[i] ? parsed[i] : { amount: '', measurement: '', name: lines[i] }; + var $row = $('
'); + var $cb = $(''); + var $headingWrap = $('
'); + var $headingLbl = $('').text(jsVars.i18n_bulk_add_heading_line_label); + var $lineInput = $('').val(lines[i]); + $headingWrap.append($headingLbl).append($lineInput); + var $amt = $(''); + var $unit = $(''); + var $name = $(''); + $row.append($cb).append($headingWrap).append($amt).append($unit).append($name); + $previewList.append($row); + } + } + + /** Fetches AJAX-parsed ingredient lines and refreshes the preview. */ + function fetchIngredientParse(lines) { + if (!lines.length) { + renderIngredientsPreview([], null); + return; + } + + $spinner.show().css('visibility', 'visible'); + + $.post(jsVars.ajax_url, { + action: 'cooked_parse_bulk_ingredients', + nonce: jsVars.cooked_bulk_add_nonce, + lines: lines + }, function(response) { + $spinner.hide(); + var parsed = (response.success && response.data && response.data.parsed) ? response.data.parsed : null; + renderIngredientsPreview(lines, parsed); + }).fail(function() { + $spinner.hide(); + renderIngredientsPreview(lines, null); + }); + } + + $textarea.on('input', function() { + var type = $typeField.val(); + var lines = parseTextToLines($(this).val()); + var textKey = lines.join('\n'); + + if (type === 'directions') { + renderDirectionsPreview(lines); + } else { + if (textKey === lastParsedText) return; + lastParsedText = textKey; + renderIngredientsPreview(lines, null); + if (parseTimer) clearTimeout(parseTimer); + parseTimer = setTimeout(function() { + fetchIngredientParse(lines); + }, 400); + } + }); + + $(document).on('click', '.cooked-bulk-add-button', function(e) { + e.preventDefault(); + var type = $(this).data('type'); + openModal(type); + }); + + $overlay.on('click', '.cooked-bulk-add-close, .cooked-bulk-add-cancel', function(e) { + e.preventDefault(); + closeModal(); + }); + + $overlay.on('click', function(e) { + if ($(e.target).is($overlay)) { + closeModal(); + } + }); + + $(document).on('keydown', function(e) { + if (e.key === 'Escape' && $overlay.is(':visible')) { + closeModal(); + } + }); + + $previewList.on('change', 'input[type="checkbox"]', function() { + var $row = $(this).closest('.cooked-bulk-add-preview-row'); + var isHeading = $(this).is(':checked'); + $row.toggleClass('cooked-bulk-add-is-heading', isHeading); + }); + + $submitBtn.on('click', function(e) { + e.preventDefault(); + if ($(this).attr('disabled')) return; + + var type = $typeField.val(); + var items = []; + + if (type === 'ingredients') { + $previewList.find('.cooked-bulk-add-preview-row').each(function() { + var $row = $(this); + var isHeading = $row.find('input[type="checkbox"]').is(':checked'); + var text = $row.find('.cooked-bulk-add-preview-text').val().trim(); + if (!text) return; + + if (isHeading) { + items.push({ text: text, heading: true }); + } else { + items.push({ + heading: false, + amount: $row.find('.cooked-bulk-add-parsed-amount').val().trim(), + measurement: $row.find('.cooked-bulk-add-parsed-unit').val().trim(), + name: $row.find('.cooked-bulk-add-parsed-name').val().trim() || text + }); + } + }); + } else { + $previewList.find('.cooked-bulk-add-preview-row').each(function() { + var $row = $(this); + var text = $row.find('.cooked-bulk-add-preview-text').val().trim(); + var isHeading = $row.find('input[type="checkbox"]').is(':checked'); + if (text) { + items.push({ text: text, heading: isHeading }); + } + }); + } + + if (!items.length) return; + + if (type === 'directions') { + cooked_bulk_add_directions(items); + closeModal(); + } else { + cooked_bulk_add_ingredients_parsed(items); + closeModal(); + } + }); +} + +/** Returns true if an ingredient row has no meaningful field values (heading or line fields). */ +function cooked_is_ingredient_block_empty($block) { + if ($block.hasClass('cooked-ingredient-heading')) { + return ($block.find('[data-ingredient-part="section_heading_name"]').val() || '').trim() === ''; + } + var hasContent = false; + $block.find('[data-ingredient-part]').each(function() { + var part = jQuery(this).data('ingredient-part'); + if (part === 'section_heading_element') { + return; + } + var $f = jQuery(this); + var v = $f.is('select') ? $f.val() : ($f.val() || '').trim(); + if (v !== null && v !== '' && String(v).trim() !== '') { + hasContent = true; + return false; + } + }); + return !hasContent; +} + +/** Plain-text direction step content from TinyMCE or textarea (HTML stripped, NBSPs normalized). */ +function cooked_direction_block_content_text($block) { + var $ta = $block.find('textarea[data-direction-part="content"]'); + if (!$ta.length) { + return ''; + } + var id = $ta.attr('id'); + var raw = ''; + if (id && typeof tinymce !== 'undefined' && tinymce.get(id)) { + raw = tinymce.get(id).getContent() || ''; + } else { + raw = $ta.val() || ''; + } + return jQuery('
').html(raw).text().replace(/\u00a0/g, ' ').trim(); +} + +/** Returns true if a direction row is empty (no heading text, image, or body content). */ +function cooked_is_direction_block_empty($block) { + if ($block.hasClass('cooked-direction-heading')) { + return ($block.find('[data-direction-part="section_heading_name"]').val() || '').trim() === ''; + } + if (($block.find('input[data-direction-part="image"]').val() || '').trim() !== '') { + return false; + } + return cooked_direction_block_content_text($block) === ''; +} + +/** Removes ingredient rows that are empty before bulk-adding new items. */ +function cooked_bulk_remove_empty_ingredient_rows() { + jQuery('#cooked-ingredients-builder').children('.cooked-ingredient-block').each(function() { + var $b = jQuery(this); + if (cooked_is_ingredient_block_empty($b)) { + $b.remove(); + } + }); +} + +/** Removes empty direction rows before bulk-adding, and removes WP editors when needed. */ +function cooked_bulk_remove_empty_direction_rows() { + var canRemoveWpEditor = !!( + cooked_admin_functions_js_vars.wp_editor_roles_allowed && + typeof wp !== 'undefined' && + wp.editor && + typeof wp.editor.remove === 'function' + ); + + jQuery('#cooked-directions-builder').children('.cooked-direction-block').each(function() { + var $b = jQuery(this); + if (!cooked_is_direction_block_empty($b)) { + return; + } + if (canRemoveWpEditor) { + var $ta = $b.find('textarea[data-direction-part="content"]'); + var fieldID = $ta.attr('id'); + if (fieldID) { + wp.editor.remove(fieldID); + } + } + $b.remove(); + }); +} + +/** Appends direction rows from bulk-add items (headings or plain steps) and resets the builder. */ +function cooked_bulk_add_directions(items) { + cooked_bulk_remove_empty_direction_rows(); + + var $_builder = jQuery('#cooked-directions-builder'); + var $_parent = $_builder.parent(); + + for (var i = 0; i < items.length; i++) { + var item = items[i]; + + if (item.heading) { + var $heading = $_parent.find('.cooked-heading-template').clone() + .removeClass('cooked-template cooked-heading-template') + .addClass('cooked-direction-block cooked-direction-heading'); + $heading.find('[data-direction-part="section_heading_name"]').val(item.text); + $_builder.append($heading); + } else { + var $direction = $_parent.find('.cooked-direction-template').clone() + .removeClass('cooked-template cooked-direction-template') + .addClass('cooked-direction-block'); + $direction.find('[data-direction-part="content"]').val(item.text); + $_builder.append($direction); + } + } + + cooked_reset_direction_builder(); +} + +/** Appends ingredient rows from bulk-add items (headings or amount/unit/name) and resets the builder. */ +function cooked_bulk_add_ingredients_parsed(items) { + cooked_bulk_remove_empty_ingredient_rows(); + + var $_builder = jQuery('#cooked-ingredients-builder'); + var $_parent = $_builder.parent(); + + for (var i = 0; i < items.length; i++) { + var item = items[i]; + + if (item.heading) { + var $heading = $_parent.find('.cooked-heading-template').clone() + .removeClass('cooked-template cooked-heading-template') + .addClass('cooked-ingredient-block cooked-ingredient-heading'); + $heading.find('[data-ingredient-part="section_heading_name"]').val(item.text); + $_builder.append($heading); + } else { + var $ingredient = $_parent.find('.cooked-ingredient-template').clone() + .removeClass('cooked-template cooked-ingredient-template') + .addClass('cooked-ingredient-block'); + + $ingredient.find('[data-ingredient-part="amount"]').val(item.amount || ''); + + if (item.measurement) { + $ingredient.find('[data-ingredient-part="measurement"]').val(item.measurement); + } + + $ingredient.find('[data-ingredient-part="name"]').val(item.name || ''); + + $_builder.append($ingredient); + } + } + + cooked_reset_ingredient_builder(); +} diff --git a/assets/admin/js/cooked-functions.min.js b/assets/admin/js/cooked-functions.min.js index 8981ee5..12e54b8 100644 --- a/assets/admin/js/cooked-functions.min.js +++ b/assets/admin/js/cooked-functions.min.js @@ -1 +1 @@ -var $_CookedConditionalTimeout=!1,cookedSortableTouchHandler=function(e){var t={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"},o=e.target.closest(".cooked-icon-drag");o&&o.closest(".cooked-sortable")&&e.changedTouches&&e.changedTouches.length&&t[e.type]&&(o=e.changedTouches[0],e.preventDefault(),t=new MouseEvent(t[e.type],{bubbles:!0,cancelable:!0,view:window,detail:1,screenX:o.screenX,screenY:o.screenY,clientX:o.clientX,clientY:o.clientY,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null}),o.target.dispatchEvent(t))},cooked_recipe_update_counter=((p=>{p(document).ready(function(){var c,o,t,e,i,n,a,d,r,s=p(".cooked-color-field"),l=p("#cooked_recipe_settings").find("select"),u=p("#cooked-recipe-tabs"),_=(p("#cooked-settings-wrap"),p("#cooked_recipe_settings")),k=_.find("input#submit");$_CookedTooltips=p(".cooked-tooltip"),$_CookedConditionals=p(".cooked-conditional-hidden"),$_CookedSortable=p(".cooked-sortable"),$_CookedRecipeSaveDefault=p(".cooked-layout-save-default"),$_CookedShortcodeField=p(".cooked-shortcode-field"),$_CookedIngredientBuilder=p("#cooked-ingredients-builder"),$_CookedAutoNutritionButton=p(".cooked-auto-nutrition-button"),$_CookedDirectionBuilder=p("#cooked-directions-builder"),$_CookedRecipeGallery=p("#cooked-recipe-image-gallery"),$_CookedNutritionFactsTab=p("#cooked-recipe-tab-content-nutrition"),$_CookedSettingsPanel=p("#cooked-settings-panel"),$_CookedSettingsTabs=p("#cooked-settings-tabs"),s.length&&s.wpColorPicker(),$_CookedSortable.length&&(document.addEventListener("touchstart",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchmove",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchend",cookedSortableTouchHandler,{passive:!1}),$_CookedSortable.find(".cooked-icon-drag").length?$_CookedSortable.sortable({handle:".cooked-icon-drag",stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder();var t=t.item.find("textarea"),o=!(!cooked_admin_functions_js_vars.wp_editor_roles_allowed||"undefined"==typeof wp||!wp.editor||"function"!=typeof wp.editor.remove||"function"!=typeof wp.editor.initialize);t.length&&o&&(o=t.attr("name"),t=t.attr("id"),wp.editor.remove(t),wp.editor.initialize(t,{tinymce:{wpautop:!1,toolbar1:"bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,wp_link_advanced,unlink,fullscreen",toolbar2:"",toolbar3:"",toolbar4:"",height:100,textarea_name:o,plugins:"link lists fullscreen wordpress wplink",setup:function(e){}},quicktags:!0,mediaButtons:!1}))}}):$_CookedSortable.sortable({stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder()}})),$_CookedRecipeSaveDefault.length&&($_CookedRecipeSaveDefault.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],trigger:"click",animation:"grow",delay:0,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0,functionReady:function(r,e){p(".cooked-save-default-all").on("click",function(e){e.preventDefault();var t,o=p(this),e=o.data("nonce"),i=o.data("bulk-nonce"),n=o.parent(),a=confirm(cooked_admin_functions_js_vars.i18n_confirm_save_default_all),d=p("#_recipe_settings_content"),c=tinymce.get("_recipe_settings_content");t=null===c?d.val():c.getContent(),a&&!o.hasClass("disabled")&&(n.find(".button, .button-primary").addClass("disabled"),p.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:t,nonce:e},function(){p.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_get_recipe_count",nonce:i},function(e){o.removeClass("button-primary").addClass("button"),e&&e.success&&0')}),$_CookedTooltips.length&&$_CookedTooltips.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],animation:"grow",delay:100,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0}),$_CookedShortcodeField.length&&$_CookedShortcodeField.on("click",function(e){p(this).select()}),$_CookedConditionals.length&&(c=[],$_CookedConditionals.each(function(){var e=p(this),t=p(this).data("condition"),o=p(this).data("value"),i=p("#"+t),o=!!o&&o.split(" "),n=e.is("li")||e.is("span")?"inline-block":"block";i.is(":checkbox")&&i.is(":checked")||i.is(":radio")&&i.is(":checked")||!(i.is(":checkbox")&&!i.is(":checked")||i.is(":radio")&&!i.is(":checked"))&&(!i.is(":checkbox")&&!o&&i.val()||!i.is(":checkbox")&&o&&-1 a").attr("href")).split("#"))[1],p(".cooked-settings-tab-content").hide(),p("#cooked-settings-tab-content-"+n).show(),l.on("click",function(e){p(".tab-content").hide();var t=p(this).find("a"),t=($_CookedSettingsTabs.find("li").removeClass("active"),p(this).addClass("active"),t.attr("href"));"migration"==(t=(t=t.split("#"))[1])?k.hide():k.show(),p(".cooked-settings-tab-content").hide(),p("#cooked-settings-tab-content-"+t).show(),p("#cooked-settings-panel").hasClass("stuck")?window.scrollTo(0,130):window.scrollTo(0,0)})),$_CookedIngredientBuilder.length&&(cooked_reset_ingredient_builder(),$_CookedIngredientBuilder.on("keydown",'input[data-ingredient-part="name"]',function(e){9!==e.keyCode&&13!==e.keyCode||p(this).parents(".cooked-ingredient-block").is(":last-child")&&(e.preventDefault(),p("#cooked-recipe-tab-content-ingredients").find(".cooked-add-ingredient-button").trigger("click"),$_CookedIngredientBuilder.find('.cooked-ingredient-block:last-child input[data-ingredient-part="amount"]').focus())}),$_CookedIngredientBuilder.parent().on("click",".cooked-show-substitution",function(e){e.preventDefault();e=p(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-ingredient-part="sub_amount"]').focus())}),$_CookedIngredientBuilder.on("keyup change",'input[data-ingredient-part="sub_amount"], input[data-ingredient-part="sub_name"], select[data-ingredient-part="sub_measurement"]',function(e){var t=p(this).parents(".recipe-setting-block"),o=t.find('input[data-ingredient-part="sub_name"]').val();o&&o.trim()?t.addClass("cooked-has-substitution"):t.removeClass("cooked-has-substitution")}),$_CookedAutoNutritionButton.length&&$_CookedIngredientBuilder.on("change",'input[data-ingredient-part="name"]',function(e){var t=!1;$_CookedIngredientBuilder.find('input[data-ingredient-part="name"]').each(function(){if(""!=p(this).val())return!(t=!0)}),t?$_CookedAutoNutritionButton.prop("disabled",!1):$_CookedAutoNutritionButton.prop("disabled",!0)}),$_CookedIngredientBuilder.on("keyup",'input[data-ingredient-part="url"]',function(e){var t=p(this).val(),o=p(this).parents(".recipe-setting-block");t?o.addClass("cooked-has-url"):o.removeClass("cooked-has-url")}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-ingredient-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-ingredient-template").clone().removeClass("cooked-template cooked-ingredient-template").addClass("cooked-ingredient-block");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-ingredient-block cooked-ingredient-heading");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-delete-ingredient",function(e){e.preventDefault(),p(this).parent().remove(),cooked_reset_ingredient_builder()})),$_CookedDirectionBuilder.length&&(cooked_reset_direction_builder(),$_CookedDirectionBuilder.parent().on("click",".cooked-show-heading-element",function(e){e.preventDefault();e=p(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-direction-part="section_heading_element"]').focus())}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-direction-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-direction-template").clone().removeClass("cooked-template cooked-direction-template").addClass("cooked-direction-block");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-direction-block cooked-direction-heading");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-delete-direction",function(e){e.preventDefault();var t,e=p(this).parent();cooked_admin_functions_js_vars.wp_editor_roles_allowed&&"undefined"!=typeof wp&&wp.editor&&"function"==typeof wp.editor.remove&&(t=e.find('textarea[data-direction-part="content"]').attr("id"))&&wp.editor.remove(t),e.remove(),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".remove-image-button",function(e){e.preventDefault();e=p(this).parent();e.removeClass("cooked-has-image"),e.find("img").attr("src","").removeAttr("srcset").removeAttr("sizes"),e.find('input[data-direction-part="image"]').val(""),cooked_reset_direction_builder()}),p("body").on("click",".cooked-direction-img-placeholder, .cooked-direction-img",function(e){e.preventDefault(),p(this).parent().find(".direction-image-button").trigger("click")}),p("body").on("click",".direction-image-button",function(e){var t=p(this);d=t.data("id"),e.preventDefault(),a||(a=wp.media.frames.direction_image_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_image_title,button:{text:cooked_admin_functions_js_vars.i18n_image_button},library:{type:"image"}})).on("select",function(){var e=a.state().get("selection").first().toJSON();p("#direction-"+d+"-image-src").attr("src",e.sizes.thumbnail.url).removeAttr("srcset").removeAttr("sizes").parent().addClass("cooked-has-image"),p('input[name="_recipe_settings[directions]['+d+'][image]"]').val(e.id),p('.direction-image-button[data-id="'+d+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_change)}),a.open()})),$_CookedRecipeGallery.length&&(cooked_init_gallery_sorting(),p("body").on("click",".cooked-gallery-add-button",function(e){p(this);e.preventDefault(),r||(r=wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_gallery_image_title,button:{text:cooked_admin_functions_js_vars.i18n_gallery_image_title},library:{type:"image"},multiple:!0})).on("select",function(){var e,t,o,i=r.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,p("#cooked-recipe-image-gallery").append(''));cooked_init_gallery_sorting()}),r.open()}),p("body").on("click",".cooked-recipe-gallery-item img",function(e){e.preventDefault(),p(this).parent().find(".cooked-gallery-edit-button").trigger("click")}),p("body").on("click",".cooked-gallery-edit-button",function(e){var n=p(this),t=n.data("attachment-id"),a=(e.preventDefault(),wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_edit_image_title,button:{text:cooked_admin_functions_js_vars.i18n_edit_image_button},library:{type:"image"},multiple:!1}));a.on("open",function(){var e=a.state().get("selection");(attachment=wp.media.attachment(t)).fetch(),e.add(attachment?[attachment]:[])}),a.open(),a.on("select",function(){var e,t,o,i=a.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,n.parent().replaceWith(''));cooked_init_gallery_sorting()})}),$_CookedRecipeGallery.on("click",".remove-image-button",function(e){var t=p(this);d=t.data("id"),e.preventDefault(),d?(p("#direction-"+d+"-image-src").parent().removeClass("cooked-has-image").prop("src",!1),p('input[name="_recipe_settings[directions]['+d+'][image]"]').val(""),p('.direction-image-button[data-id="'+d+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_title)):t.parent().remove()})),$_CookedNutritionFactsTab.length&&(init_nutrition_facts($_CookedNutritionFactsTab),$_CookedNutritionFactsTab.on("keyup","input",function(e){init_nutrition_facts($_CookedNutritionFactsTab)})),p("#cooked-prep-time").length&&p("#cooked-prep-time,#cooked-cook-time").on("change",function(){cooked_updateTotalTimeValue(parseInt(p("#cooked-prep-time").val()),parseInt(p("#cooked-cook-time").val()))})})})(jQuery),0),cooked_bulk_per_page=20;function cooked_set_default_template(o,i,n,a,d){var c,r,s;i<=0||(c=jQuery("#cooked-template-progress"),r=c.find(".cooked-progress-bar"),s=jQuery("#cooked-template-progress-text"),c.hasClass("cooked-active")||(c.addClass("cooked-active"),s.addClass("cooked-active"),r.css({width:"0%"}),d.reposition()),jQuery.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default_bulk",page:o,default_content:n,nonce:a},function(e){var t;e&&e.success&&(cooked_recipe_update_counter=Math.min((o+1)*cooked_bulk_per_page,i),t=Math.round(cooked_recipe_update_counter/i*100),r.css({width:t+"%"}),s.text(cooked_recipe_update_counter+" / "+i),e.data.has_more?cooked_set_default_template(o+1,i,n,a,d):(jQuery(".cooked-save-default-all").text(cooked_admin_functions_js_vars.i18n_applied),r.css({width:"100%"}),s.text(i+" / "+i),c.removeClass("cooked-active"),s.removeClass("cooked-active").text(""),d.reposition()))},"json"))}function cooked_updateTotalTimeValue(e,t){jQuery("#cooked-total-time").val(e+t)}function cooked_init_gallery_sorting(){jQuery("#cooked-recipe-image-gallery").sortable()}function init_nutrition_facts(e){e.find("input").each(function(){var e,t=jQuery(this),o=t.attr("id"),t=t.val(),i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]').length;jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').length&&(t?(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text(t),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).show(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).show(),i&&(e=(i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]')).data("pdv"))&&(thisPercent=Math.ceil(t/e*100),i.text(thisPercent))):(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text("___"),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).hide(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).hide()))})}function cooked_reset_ingredient_builder(){var e=jQuery(".cooked-ingredient-block"),t=0,i=0,o=!1;0{_(document).ready(function(){var c,o,t,e,i,n,d,a,r,l=_(".cooked-color-field"),s=_("#cooked_recipe_settings").find("select"),u=_("#cooked-recipe-tabs"),k=(_("#cooked-settings-wrap"),_("#cooked_recipe_settings")),p=k.find("input#submit");$_CookedTooltips=_(".cooked-tooltip"),$_CookedConditionals=_(".cooked-conditional-hidden"),$_CookedSortable=_(".cooked-sortable"),$_CookedRecipeSaveDefault=_(".cooked-layout-save-default"),$_CookedShortcodeField=_(".cooked-shortcode-field"),$_CookedIngredientBuilder=_("#cooked-ingredients-builder"),$_CookedAutoNutritionButton=_(".cooked-auto-nutrition-button"),$_CookedDirectionBuilder=_("#cooked-directions-builder"),$_CookedRecipeGallery=_("#cooked-recipe-image-gallery"),$_CookedNutritionFactsTab=_("#cooked-recipe-tab-content-nutrition"),$_CookedSettingsPanel=_("#cooked-settings-panel"),$_CookedSettingsTabs=_("#cooked-settings-tabs"),l.length&&l.wpColorPicker(),$_CookedSortable.length&&(document.addEventListener("touchstart",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchmove",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchend",cookedSortableTouchHandler,{passive:!1}),$_CookedSortable.find(".cooked-icon-drag").length?$_CookedSortable.sortable({handle:".cooked-icon-drag",stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder();var t=t.item.find("textarea"),o=!(!cooked_admin_functions_js_vars.wp_editor_roles_allowed||"undefined"==typeof wp||!wp.editor||"function"!=typeof wp.editor.remove||"function"!=typeof wp.editor.initialize);t.length&&o&&(o=t.attr("name"),t=t.attr("id"),wp.editor.remove(t),wp.editor.initialize(t,{tinymce:{wpautop:!1,toolbar1:"bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,wp_link_advanced,unlink,fullscreen",toolbar2:"",toolbar3:"",toolbar4:"",height:100,textarea_name:o,plugins:"link lists fullscreen wordpress wplink",setup:function(e){}},quicktags:!0,mediaButtons:!1}))}}):$_CookedSortable.sortable({stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder()}})),$_CookedRecipeSaveDefault.length&&($_CookedRecipeSaveDefault.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],trigger:"click",animation:"grow",delay:0,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0,functionReady:function(r,e){_(".cooked-save-default-all").on("click",function(e){e.preventDefault();var t,o=_(this),e=o.data("nonce"),i=o.data("bulk-nonce"),n=o.parent(),d=confirm(cooked_admin_functions_js_vars.i18n_confirm_save_default_all),a=_("#_recipe_settings_content"),c=tinymce.get("_recipe_settings_content");t=null===c?a.val():c.getContent(),d&&!o.hasClass("disabled")&&(n.find(".button, .button-primary").addClass("disabled"),_.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:t,nonce:e},function(){_.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_get_recipe_count",nonce:i},function(e){o.removeClass("button-primary").addClass("button"),e&&e.success&&0')}),$_CookedTooltips.length&&$_CookedTooltips.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],animation:"grow",delay:100,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0}),$_CookedShortcodeField.length&&$_CookedShortcodeField.on("click",function(e){_(this).select()}),$_CookedConditionals.length&&(c=[],$_CookedConditionals.each(function(){var e=_(this),t=_(this).data("condition"),o=_(this).data("value"),i=_("#"+t),o=!!o&&o.split(" "),n=e.is("li")||e.is("span")?"inline-block":"block";i.is(":checkbox")&&i.is(":checked")||i.is(":radio")&&i.is(":checked")||!(i.is(":checkbox")&&!i.is(":checked")||i.is(":radio")&&!i.is(":checked"))&&(!i.is(":checkbox")&&!o&&i.val()||!i.is(":checkbox")&&o&&-1<_.inArray(i.val(),o)||!i.is(":radio")&&!o&&i.val()||!i.is(":radio")&&o&&-1<_.inArray(i.val(),o))?e.css({display:n}):e.hide(),-1==_.inArray(t,c)&&c.push(t);for(var d=c.length,a=0;a a").attr("href")).split("#"))[1],_(".cooked-settings-tab-content").hide(),_("#cooked-settings-tab-content-"+n).show(),s.on("click",function(e){_(".tab-content").hide();var t=_(this).find("a"),t=($_CookedSettingsTabs.find("li").removeClass("active"),_(this).addClass("active"),t.attr("href"));"migration"==(t=(t=t.split("#"))[1])?p.hide():p.show(),_(".cooked-settings-tab-content").hide(),_("#cooked-settings-tab-content-"+t).show(),_("#cooked-settings-panel").hasClass("stuck")?window.scrollTo(0,130):window.scrollTo(0,0)})),$_CookedIngredientBuilder.length&&(cooked_reset_ingredient_builder(),$_CookedIngredientBuilder.on("keydown",'input[data-ingredient-part="name"]',function(e){9!==e.keyCode&&13!==e.keyCode||_(this).parents(".cooked-ingredient-block").is(":last-child")&&(e.preventDefault(),_("#cooked-recipe-tab-content-ingredients").find(".cooked-add-ingredient-button").trigger("click"),$_CookedIngredientBuilder.find('.cooked-ingredient-block:last-child input[data-ingredient-part="amount"]').focus())}),$_CookedIngredientBuilder.parent().on("click",".cooked-show-substitution",function(e){e.preventDefault();e=_(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-ingredient-part="sub_amount"]').focus())}),$_CookedIngredientBuilder.on("keyup change",'input[data-ingredient-part="sub_amount"], input[data-ingredient-part="sub_name"], select[data-ingredient-part="sub_measurement"]',function(e){var t=_(this).parents(".recipe-setting-block"),o=t.find('input[data-ingredient-part="sub_name"]').val();o&&o.trim()?t.addClass("cooked-has-substitution"):t.removeClass("cooked-has-substitution")}),$_CookedAutoNutritionButton.length&&$_CookedIngredientBuilder.on("change",'input[data-ingredient-part="name"]',function(e){var t=!1;$_CookedIngredientBuilder.find('input[data-ingredient-part="name"]').each(function(){if(""!=_(this).val())return!(t=!0)}),t?$_CookedAutoNutritionButton.prop("disabled",!1):$_CookedAutoNutritionButton.prop("disabled",!0)}),$_CookedIngredientBuilder.on("keyup",'input[data-ingredient-part="url"]',function(e){var t=_(this).val(),o=_(this).parents(".recipe-setting-block");t?o.addClass("cooked-has-url"):o.removeClass("cooked-has-url")}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-ingredient-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-ingredient-template").clone().removeClass("cooked-template cooked-ingredient-template").addClass("cooked-ingredient-block");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-ingredient-block cooked-ingredient-heading");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-delete-ingredient",function(e){e.preventDefault(),_(this).parent().remove(),cooked_reset_ingredient_builder()})),$_CookedDirectionBuilder.length&&(cooked_reset_direction_builder(),$_CookedDirectionBuilder.parent().on("click",".cooked-show-heading-element",function(e){e.preventDefault();e=_(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-direction-part="section_heading_element"]').focus())}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-direction-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-direction-template").clone().removeClass("cooked-template cooked-direction-template").addClass("cooked-direction-block");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-direction-block cooked-direction-heading");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-delete-direction",function(e){e.preventDefault();var t,e=_(this).parent();cooked_admin_functions_js_vars.wp_editor_roles_allowed&&"undefined"!=typeof wp&&wp.editor&&"function"==typeof wp.editor.remove&&(t=e.find('textarea[data-direction-part="content"]').attr("id"))&&wp.editor.remove(t),e.remove(),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".remove-image-button",function(e){e.preventDefault();e=_(this).parent();e.removeClass("cooked-has-image"),e.find("img").attr("src","").removeAttr("srcset").removeAttr("sizes"),e.find('input[data-direction-part="image"]').val(""),cooked_reset_direction_builder()}),_("body").on("click",".cooked-direction-img-placeholder, .cooked-direction-img",function(e){e.preventDefault(),_(this).parent().find(".direction-image-button").trigger("click")}),_("body").on("click",".direction-image-button",function(e){var t=_(this);a=t.data("id"),e.preventDefault(),d||(d=wp.media.frames.direction_image_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_image_title,button:{text:cooked_admin_functions_js_vars.i18n_image_button},library:{type:"image"}})).on("select",function(){var e=d.state().get("selection").first().toJSON();_("#direction-"+a+"-image-src").attr("src",e.sizes.thumbnail.url).removeAttr("srcset").removeAttr("sizes").parent().addClass("cooked-has-image"),_('input[name="_recipe_settings[directions]['+a+'][image]"]').val(e.id),_('.direction-image-button[data-id="'+a+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_change)}),d.open()})),cooked_init_bulk_add(_),$_CookedRecipeGallery.length&&(cooked_init_gallery_sorting(),_("body").on("click",".cooked-gallery-add-button",function(e){_(this);e.preventDefault(),r||(r=wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_gallery_image_title,button:{text:cooked_admin_functions_js_vars.i18n_gallery_image_title},library:{type:"image"},multiple:!0})).on("select",function(){var e,t,o,i=r.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,_("#cooked-recipe-image-gallery").append(''));cooked_init_gallery_sorting()}),r.open()}),_("body").on("click",".cooked-recipe-gallery-item img",function(e){e.preventDefault(),_(this).parent().find(".cooked-gallery-edit-button").trigger("click")}),_("body").on("click",".cooked-gallery-edit-button",function(e){var n=_(this),t=n.data("attachment-id"),d=(e.preventDefault(),wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_edit_image_title,button:{text:cooked_admin_functions_js_vars.i18n_edit_image_button},library:{type:"image"},multiple:!1}));d.on("open",function(){var e=d.state().get("selection");(attachment=wp.media.attachment(t)).fetch(),e.add(attachment?[attachment]:[])}),d.open(),d.on("select",function(){var e,t,o,i=d.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,n.parent().replaceWith(''));cooked_init_gallery_sorting()})}),$_CookedRecipeGallery.on("click",".remove-image-button",function(e){var t=_(this);a=t.data("id"),e.preventDefault(),a?(_("#direction-"+a+"-image-src").parent().removeClass("cooked-has-image").prop("src",!1),_('input[name="_recipe_settings[directions]['+a+'][image]"]').val(""),_('.direction-image-button[data-id="'+a+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_title)):t.parent().remove()})),$_CookedNutritionFactsTab.length&&(init_nutrition_facts($_CookedNutritionFactsTab),$_CookedNutritionFactsTab.on("keyup","input",function(e){init_nutrition_facts($_CookedNutritionFactsTab)})),_("#cooked-prep-time").length&&_("#cooked-prep-time,#cooked-cook-time").on("change",function(){cooked_updateTotalTimeValue(parseInt(_("#cooked-prep-time").val()),parseInt(_("#cooked-cook-time").val()))})})})(jQuery),0),cooked_bulk_per_page=20;function cooked_set_default_template(o,i,n,d,a){var c,r,l;i<=0||(c=jQuery("#cooked-template-progress"),r=c.find(".cooked-progress-bar"),l=jQuery("#cooked-template-progress-text"),c.hasClass("cooked-active")||(c.addClass("cooked-active"),l.addClass("cooked-active"),r.css({width:"0%"}),a.reposition()),jQuery.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default_bulk",page:o,default_content:n,nonce:d},function(e){var t;e&&e.success&&(cooked_recipe_update_counter=Math.min((o+1)*cooked_bulk_per_page,i),t=Math.round(cooked_recipe_update_counter/i*100),r.css({width:t+"%"}),l.text(cooked_recipe_update_counter+" / "+i),e.data.has_more?cooked_set_default_template(o+1,i,n,d,a):(jQuery(".cooked-save-default-all").text(cooked_admin_functions_js_vars.i18n_applied),r.css({width:"100%"}),l.text(i+" / "+i),c.removeClass("cooked-active"),l.removeClass("cooked-active").text(""),a.reposition()))},"json"))}function cooked_updateTotalTimeValue(e,t){jQuery("#cooked-total-time").val(e+t)}function cooked_init_gallery_sorting(){jQuery("#cooked-recipe-image-gallery").sortable()}function init_nutrition_facts(e){e.find("input").each(function(){var e,t=jQuery(this),o=t.attr("id"),t=t.val(),i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]').length;jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').length&&(t?(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text(t),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).show(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).show(),i&&(e=(i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]')).data("pdv"))&&(thisPercent=Math.ceil(t/e*100),i.text(thisPercent))):(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text("___"),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).hide(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).hide()))})}function cooked_reset_ingredient_builder(){var e=jQuery(".cooked-ingredient-block"),t=0,i=0,o=!1;0").text(e).html()}function f(e,t){if(u.empty(),e.length){s.attr("data-bulk-type","ingredients"),s.show(),k.removeAttr("disabled"),u.find(".cooked-bulk-add-preview-header").length||u.prepend('
'+h(_.i18n_bulk_add_amount)+''+h(_.i18n_bulk_add_unit)+''+h(_.i18n_bulk_add_name)+"
");for(var o=0;o
'),d=l('"),a=l('
'),c=l('').text(_.i18n_bulk_add_heading_line_label),r=l('').val(e[o]),c=(a.append(c).append(r),l('')),r=l(''),i=l('');n.append(d).append(a).append(c).append(r).append(i),u.append(n)}}else s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled")}i.length&&(t=l("#cooked-bulk-add-textarea"),s=l("#cooked-bulk-add-preview"),u=l("#cooked-bulk-add-preview-list"),o=l("#cooked-bulk-add-title"),r=l("#cooked-bulk-add-type"),k=i.find(".cooked-bulk-add-submit"),p=i.find(".cooked-bulk-add-spinner"),_=cooked_admin_functions_js_vars,m=null,g="",t.on("input",function(){var e=r.val(),o=(e=>{for(var t=e.split(/[\r\n]+/),o=[],i=0;i
'),a=l('"),c=l('');d.append(a).append(c),u.append(d)}}else s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled")}else t!==g&&(g=t,f(o,null),m&&clearTimeout(m),m=setTimeout(function(){var t;(t=o).length?(p.show().css("visibility","visible"),l.post(_.ajax_url,{action:"cooked_parse_bulk_ingredients",nonce:_.cooked_bulk_add_nonce,lines:t},function(e){p.hide();e=e.success&&e.data&&e.data.parsed?e.data.parsed:null;f(t,e)}).fail(function(){p.hide(),f(t,null)})):f([],null)},400))}),l(document).on("click",".cooked-bulk-add-button",function(e){e.preventDefault();var e=l(this).data("type");e=e,r.val(e),t.val(""),u.empty(),s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled"),p.hide(),g="","ingredients"===e?(o.text(_.i18n_bulk_add_ingredients),t.attr("placeholder",_.i18n_bulk_add_placeholder_ingredients),k.text(_.i18n_bulk_add_submit_ingredients)):(o.text(_.i18n_bulk_add_directions),t.attr("placeholder",_.i18n_bulk_add_placeholder_directions),k.text(_.i18n_bulk_add_submit_directions)),i.show(),t.focus()}),i.on("click",".cooked-bulk-add-close, .cooked-bulk-add-cancel",function(e){e.preventDefault(),n()}),i.on("click",function(e){l(e.target).is(i)&&n()}),l(document).on("keydown",function(e){"Escape"===e.key&&i.is(":visible")&&n()}),u.on("change",'input[type="checkbox"]',function(){var e=l(this).closest(".cooked-bulk-add-preview-row"),t=l(this).is(":checked");e.toggleClass("cooked-bulk-add-is-heading",t)}),k.on("click",function(e){var i;e.preventDefault(),l(this).attr("disabled")||(e=r.val(),i=[],"ingredients"===e?u.find(".cooked-bulk-add-preview-row").each(function(){var e=l(this),t=e.find('input[type="checkbox"]').is(":checked"),o=e.find(".cooked-bulk-add-preview-text").val().trim();o&&i.push(t?{text:o,heading:!0}:{heading:!1,amount:e.find(".cooked-bulk-add-parsed-amount").val().trim(),measurement:e.find(".cooked-bulk-add-parsed-unit").val().trim(),name:e.find(".cooked-bulk-add-parsed-name").val().trim()||o})}):u.find(".cooked-bulk-add-preview-row").each(function(){var e=l(this),t=e.find(".cooked-bulk-add-preview-text").val().trim(),e=e.find('input[type="checkbox"]').is(":checked");t&&i.push({text:t,heading:e})}),i.length&&(("directions"===e?cooked_bulk_add_directions:cooked_bulk_add_ingredients_parsed)(i),n()))}))}function cooked_is_ingredient_block_empty(e){var t;return e.hasClass("cooked-ingredient-heading")?""===(e.find('[data-ingredient-part="section_heading_name"]').val()||"").trim():(t=!1,e.find("[data-ingredient-part]").each(function(){var e;return"section_heading_element"!==jQuery(this).data("ingredient-part")&&null!==(e=(e=jQuery(this)).is("select")?e.val():(e.val()||"").trim())&&""!==e&&""!==String(e).trim()?!(t=!0):void 0}),!t)}function cooked_direction_block_content_text(e){var t,o,e=e.find('textarea[data-direction-part="content"]');return e.length?(o="",o=(t=e.attr("id"))&&"undefined"!=typeof tinymce&&tinymce.get(t)?tinymce.get(t).getContent()||"":e.val()||"",jQuery("
").html(o).text().replace(/\u00a0/g," ").trim()):""}function cooked_is_direction_block_empty(e){return e.hasClass("cooked-direction-heading")?""===(e.find('[data-direction-part="section_heading_name"]').val()||"").trim():""===(e.find('input[data-direction-part="image"]').val()||"").trim()&&""===cooked_direction_block_content_text(e)}function cooked_bulk_remove_empty_ingredient_rows(){jQuery("#cooked-ingredients-builder").children(".cooked-ingredient-block").each(function(){var e=jQuery(this);cooked_is_ingredient_block_empty(e)&&e.remove()})}function cooked_bulk_remove_empty_direction_rows(){var o=!(!cooked_admin_functions_js_vars.wp_editor_roles_allowed||"undefined"==typeof wp||!wp.editor||"function"!=typeof wp.editor.remove);jQuery("#cooked-directions-builder").children(".cooked-direction-block").each(function(){var e,t=jQuery(this);cooked_is_direction_block_empty(t)&&(o&&(e=t.find('textarea[data-direction-part="content"]').attr("id"))&&wp.editor.remove(e),t.remove())})}function cooked_bulk_add_directions(e){cooked_bulk_remove_empty_direction_rows();for(var t=jQuery("#cooked-directions-builder"),o=t.parent(),i=0;i 0) { - cooked_migrate_recipes(json_recipe_ids, total_recipes); - } - } - } + function (json_recipe_ids) { + if (json_recipe_ids) { + var recipe_ids = JSON.parse(json_recipe_ids), + total_recipes = Object.keys(recipe_ids).length; + + if (total_recipes > 0) { + cooked_migrate_recipes(json_recipe_ids, total_recipes); + } + } + } ); - } + } }); } // Import Button Exists? - if ($_CookedImportButton.length) { - $_CookedImportButton.on('click', function(e) { - e.preventDefault(); + if ($_CookedImportButton.length) { + $_CookedImportButton.on('click', function(e) { + e.preventDefault(); - var thisButton = $(this), + var thisButton = $(this), import_type = thisButton.data('import-type'), - confirm_import = confirm(cooked_migration_js_vars.i18n_confirm_import_recipes); + confirm_import = confirm(cooked_migration_js_vars.i18n_confirm_import_recipes); - if (confirm_import && !thisButton.hasClass('disabled')) { - thisButton.addClass('disabled').attr('disabled', true); - thisButton.hide(); + if (confirm_import && !thisButton.hasClass('disabled')) { + thisButton.addClass('disabled').attr('disabled', true); + thisButton.hide(); - var ajax__bulk_import_recipes = $.post( - cooked_migration_js_vars.ajax_url, - { + var ajax__bulk_import_recipes = $.post( + cooked_migration_js_vars.ajax_url, + { action: 'cooked_get_import_ids', import_type: import_type }, - function (json_recipe_ids) { - if (json_recipe_ids) { - var recipe_ids = JSON.parse(json_recipe_ids), - total_recipes = Object.keys(recipe_ids).length; - - if (total_recipes > 0) { - cooked_import_recipes(json_recipe_ids, total_recipes, import_type); - } - } else { + function (json_recipe_ids) { + if (json_recipe_ids) { + var recipe_ids = JSON.parse(json_recipe_ids), + total_recipes = Object.keys(recipe_ids).length; + + if (total_recipes > 0) { + cooked_import_recipes(json_recipe_ids, total_recipes, import_type); + } + } else { console.log(cooked_migration_js_vars.i18n_something_wrong); thisButton.addClass('disabled').attr('disabled', false); - thisButton.show(); + thisButton.show(); } - }, + }, ); - } + } }); } @@ -242,20 +242,20 @@ var cooked_recipe_migrate_counter = 0; var progressIterations = 0; function cooked_migrate_recipes(recipe_ids, total_recipes ) { - var temp_counter = 0, - total_counter = 0, - progress_percent = 0; - - if (total_recipes > 0) { - var progress = jQuery( '#cooked-migration-progress' ); - var progress_bar = progress.find( '.cooked-progress-bar' ); - var progress_text = jQuery( '#cooked-migration-progress-text' ); - - if ( !progress.hasClass('cooked-active') ) { - progress.addClass('cooked-active'); - progress_text.addClass('cooked-active'); - progress_bar.css( { "width" : "0%" } ); - } + var temp_counter = 0, + total_counter = 0, + progress_percent = 0; + + if (total_recipes > 0) { + var progress = jQuery( '#cooked-migration-progress' ); + var progress_bar = progress.find( '.cooked-progress-bar' ); + var progress_text = jQuery( '#cooked-migration-progress-text' ); + + if ( !progress.hasClass('cooked-active') ) { + progress.addClass('cooked-active'); + progress_text.addClass('cooked-active'); + progress_bar.css( { "width" : "0%" } ); + } var this_recipe_ids = JSON.parse( recipe_ids ), this_total_recipe_ids = Object.keys(this_recipe_ids).length; @@ -263,18 +263,18 @@ function cooked_migrate_recipes(recipe_ids, total_recipes ) { var formattedTotal = total_recipes; formattedTotal.toLocaleString(); - var ajax__bulk_migrate_recipes = jQuery.post( + var ajax__bulk_migrate_recipes = jQuery.post( cooked_migration_js_vars.ajax_url, { action: 'cooked_migrate_recipes', recipe_ids: recipe_ids }, function( new_recipe_ids ) { - if ( new_recipe_ids && new_recipe_ids != 'false' && new_recipe_ids != false ){ - var leftover_recipe_ids = JSON.parse( new_recipe_ids ), - leftover_recipes = Object.keys(leftover_recipe_ids).length; + if ( new_recipe_ids && new_recipe_ids != 'false' && new_recipe_ids != false ){ + var leftover_recipe_ids = JSON.parse( new_recipe_ids ), + leftover_recipes = Object.keys(leftover_recipe_ids).length; - cooked_recipe_migrate_counter = total_recipes - leftover_recipes; + cooked_recipe_migrate_counter = total_recipes - leftover_recipes; var formattedTotal = total_recipes; formattedTotal.toLocaleString(); @@ -282,9 +282,9 @@ function cooked_migrate_recipes(recipe_ids, total_recipes ) { var formattedComplete = cooked_recipe_migrate_counter; formattedComplete.toLocaleString(); - progress_percent = Math.round10( ( cooked_recipe_migrate_counter / total_recipes ) * 100, -1 ); + progress_percent = Math.round10( ( cooked_recipe_migrate_counter / total_recipes ) * 100, -1 ); if ( progress_percent < 2 ) { progress_percent = 2; } - progress_bar.css( { "width" : progress_percent + "%" } ); + progress_bar.css( { "width" : progress_percent + "%" } ); var remainingProgress = 100 - progress_percent; var estimatedCompletionTime = Math.round( ( remainingProgress / progress_percent ) * progressIterations ); @@ -306,36 +306,36 @@ function cooked_migrate_recipes(recipe_ids, total_recipes ) { progress_text.text( formattedComplete + " / " + formattedTotal ); } - cooked_migrate_recipes( new_recipe_ids, total_recipes ); - } else { - progress.hide(); - progress_text.hide(); + cooked_migrate_recipes( new_recipe_ids, total_recipes ); + } else { + progress.hide(); + progress_text.hide(); - jQuery('.recipe-setting-block.migrate_button').find('h3').hide(); - jQuery('.recipe-setting-block.migrate_button').find('p:nth-child(2)').hide(); + jQuery('.recipe-setting-block.migrate_button').find('h3').hide(); + jQuery('.recipe-setting-block.migrate_button').find('p:nth-child(2)').hide(); jQuery('.recipe-setting-block.migrate_button').find('ul.cooked-admin-ul').hide(); - jQuery('#cooked-migration-button').hide(); - jQuery('#cooked-migration-completed').addClass('cooked-active'); - } - } + jQuery('#cooked-migration-button').hide(); + jQuery('#cooked-migration-completed').addClass('cooked-active'); + } + } ) - } + } } function cooked_import_recipes(recipe_ids, total_recipes, import_type) { - var progress_percent = 0; + var progress_percent = 0; - if (total_recipes > 0) { - var progress = jQuery( '#cooked-import-progress' ); - var progress_bar = progress.find( '.cooked-progress-bar' ); - var progress_text = jQuery( '#cooked-import-progress-text' ); + if (total_recipes > 0) { + var progress = jQuery( '#cooked-import-progress' ); + var progress_bar = progress.find( '.cooked-progress-bar' ); + var progress_text = jQuery( '#cooked-import-progress-text' ); - if (!progress.hasClass('cooked-active')) { - progress.addClass('cooked-active'); - progress_text.addClass('cooked-active'); - progress_bar.css( { "width" : "0%" } ); - } + if (!progress.hasClass('cooked-active')) { + progress.addClass('cooked-active'); + progress_text.addClass('cooked-active'); + progress_bar.css( { "width" : "0%" } ); + } var this_recipe_ids = JSON.parse(recipe_ids), this_total_recipe_ids = Object.keys(this_recipe_ids).length; @@ -343,7 +343,7 @@ function cooked_import_recipes(recipe_ids, total_recipes, import_type) { var formattedTotal = total_recipes; formattedTotal.toLocaleString(); - var ajax__bulk_migrate_recipes = jQuery.post( + var ajax__bulk_migrate_recipes = jQuery.post( cooked_migration_js_vars.ajax_url, { action: 'cooked_import_recipes', @@ -351,11 +351,11 @@ function cooked_import_recipes(recipe_ids, total_recipes, import_type) { import_type: import_type }, function (new_recipe_ids) { - if (new_recipe_ids && new_recipe_ids != 'false' && new_recipe_ids != false) { - var leftover_recipe_ids = JSON.parse( new_recipe_ids ), - leftover_recipes = Object.keys(leftover_recipe_ids).length; + if (new_recipe_ids && new_recipe_ids != 'false' && new_recipe_ids != false) { + var leftover_recipe_ids = JSON.parse( new_recipe_ids ), + leftover_recipes = Object.keys(leftover_recipe_ids).length; - cooked_recipe_migrate_counter = total_recipes - leftover_recipes; + cooked_recipe_migrate_counter = total_recipes - leftover_recipes; var formattedTotal = total_recipes; formattedTotal.toLocaleString(); @@ -363,9 +363,9 @@ function cooked_import_recipes(recipe_ids, total_recipes, import_type) { var formattedComplete = cooked_recipe_migrate_counter; formattedComplete.toLocaleString(); - progress_percent = Math.round10( ( cooked_recipe_migrate_counter / total_recipes ) * 100, -1 ); + progress_percent = Math.round10( ( cooked_recipe_migrate_counter / total_recipes ) * 100, -1 ); if ( progress_percent < 2 ) { progress_percent = 2; } - progress_bar.css({ "width" : progress_percent + "%" }); + progress_bar.css({ "width" : progress_percent + "%" }); var remainingProgress = 100 - progress_percent; var estimatedCompletionTime = Math.round( ( remainingProgress / progress_percent ) * progressIterations ); @@ -387,18 +387,18 @@ function cooked_import_recipes(recipe_ids, total_recipes, import_type) { progress_text.text( formattedComplete + " / " + formattedTotal ); } - cooked_import_recipes( new_recipe_ids, total_recipes, import_type ); - } else { - progress.hide(); - progress_text.hide(); + cooked_import_recipes( new_recipe_ids, total_recipes, import_type ); + } else { + progress.hide(); + progress_text.hide(); - jQuery('.recipe-setting-block.import_button').find('h3').hide(); - jQuery('.recipe-setting-block.import_button').find('p:nth-child(2)').hide(); + jQuery('.recipe-setting-block.import_button').find('h3').hide(); + jQuery('.recipe-setting-block.import_button').find('p:nth-child(2)').hide(); jQuery('.recipe-setting-block.import_button').find('.cooked-import-note').hide(); jQuery('.recipe-setting-block.import_button').find('ul.cooked-admin-ul').hide(); - jQuery('#cooked-import-button').hide(); - jQuery('#cooked-import-completed').addClass('cooked-active'); - } - }) - } + jQuery('#cooked-import-button').hide(); + jQuery('#cooked-import-completed').addClass('cooked-active'); + } + }) + } } diff --git a/composer.json b/composer.json index 2cdad74..51b6d80 100644 --- a/composer.json +++ b/composer.json @@ -6,7 +6,7 @@ "recipe" ], "homepage": "https://wordpress.org/plugins/cooked/", - "version": "1.13.0", + "version": "1.14.0", "type": "wordpress-plugin", "license": "GPL-3.0-or-later", "prefer-stable": true, diff --git a/composer.lock b/composer.lock index 734c712..dd13b69 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "a4203b5d737ffaa046a8695c4a300dc7", + "content-hash": "93dff3879d013694a97a2b65c557b9d8", "packages": [ { "name": "nxp/math-executor", diff --git a/cooked.php b/cooked.php index 125f27a..230b73b 100644 --- a/cooked.php +++ b/cooked.php @@ -6,7 +6,7 @@ Description: A recipe plugin for WordPress. Author: Gora Tech Author URI: https://goratech.dev -Version: 1.13.0 +Version: 1.14.0 Text Domain: cooked Domain Path: languages License: GPL2 @@ -31,7 +31,7 @@ require_once __DIR__ . '/vendor/autoload.php'; define( 'COOKED_DEV', false ); -define( 'COOKED_VERSION', '1.13.0' ); +define( 'COOKED_VERSION', '1.14.0' ); if ( ! class_exists( 'Cooked_Plugin' ) ) : diff --git a/includes/class.cooked-admin-enqueues.php b/includes/class.cooked-admin-enqueues.php index 1a752cd..9580d5f 100644 --- a/includes/class.cooked-admin-enqueues.php +++ b/includes/class.cooked-admin-enqueues.php @@ -166,6 +166,19 @@ public function admin_enqueues( $hook ) { /* translators: 1: date and time, 2: number of recipes */ 'i18n_last_calculated' => __( 'Last: %1$s · %2$s recipes', 'cooked' ), 'wp_editor_roles_allowed' => esc_attr($wp_editor_roles_allowed), + 'cooked_bulk_add_nonce' => wp_create_nonce( 'cooked_bulk_add' ), + 'i18n_bulk_add_ingredients' => __( 'Bulk Add Ingredients', 'cooked' ), + 'i18n_bulk_add_directions' => __( 'Bulk Add Directions', 'cooked' ), + 'i18n_bulk_add_placeholder_ingredients' => __( "2 cups flour\n1 tsp salt\n1/2 cup sugar\n3 large eggs", 'cooked' ), + 'i18n_bulk_add_placeholder_directions' => __( "Preheat oven to 350°F.\nMix dry ingredients together.\nAdd wet ingredients and stir.", 'cooked' ), + 'i18n_bulk_add_section_heading' => __( 'Section heading', 'cooked' ), + 'i18n_bulk_add_parsing' => __( 'Parsing...', 'cooked' ), + 'i18n_bulk_add_submit_ingredients' => __( 'Add Ingredients', 'cooked' ), + 'i18n_bulk_add_submit_directions' => __( 'Add Directions', 'cooked' ), + 'i18n_bulk_add_amount' => __( 'Amount', 'cooked' ), + 'i18n_bulk_add_unit' => __( 'Measurement', 'cooked' ), + 'i18n_bulk_add_name' => __( 'Item', 'cooked' ), + 'i18n_bulk_add_heading_line_label' => __( 'Heading text', 'cooked' ), ]; // Cooked Admin Style Assets diff --git a/includes/class.cooked-ajax.php b/includes/class.cooked-ajax.php index bd300f4..2f01fe9 100644 --- a/includes/class.cooked-ajax.php +++ b/includes/class.cooked-ajax.php @@ -56,6 +56,10 @@ function __construct() { // CSV Import - Process file add_action( 'wp_ajax_cooked_process_csv', [&$this, 'process_csv']); + + // Bulk Add - Parse Ingredients + add_action( 'wp_ajax_cooked_parse_bulk_ingredients', [&$this, 'parse_bulk_ingredients'] ); + add_action( 'wp_ajax_nopriv_cooked_parse_bulk_ingredients', [&$this, 'parse_bulk_ingredients'] ); } public function get_migrate_ids() { @@ -460,4 +464,115 @@ public function process_csv() { ]); } } + + public function parse_bulk_ingredients() { + if ( ! check_ajax_referer( 'cooked_bulk_add', 'nonce', false ) ) { + wp_send_json_error( [ 'message' => __( 'Security check failed.', 'cooked' ) ] ); + } + + $lines = isset( $_POST['lines'] ) ? (array) $_POST['lines'] : []; + + if ( empty( $lines ) ) { + wp_send_json_error( [ 'message' => __( 'No ingredients provided.', 'cooked' ) ] ); + } + + $measurements = Cooked_Measurements::get(); + + $variations_map = []; + foreach ( $measurements as $key => $m ) { + if ( ! empty( $m['variations'] ) ) { + foreach ( $m['variations'] as $variation ) { + $variations_map[ $variation ] = $key; + } + } + } + + // Sort variations longest-first to avoid partial matches. + $variation_strings = array_keys( $variations_map ); + usort( $variation_strings, function( $a, $b ) { + return strlen( $b ) - strlen( $a ); + }); + + $escaped = array_map( function( $v ) { + return preg_quote( $v, '/' ); + }, $variation_strings ); + + $units_pattern = '/^(' . implode( '|', $escaped ) . ')\.?\s+/iu'; + + $parsed = []; + + foreach ( $lines as $index => $line ) { + // Do not use Cooked_Functions::sanitize_text_field() here — it runs htmlentities() and turns + // Unicode like en dash or ½ into – / ½, which breaks parsing and leaks into output. + $line = is_string( $line ) ? $line : ''; + $line = wp_unslash( $line ); + $line = html_entity_decode( $line, ENT_QUOTES | ENT_HTML5, 'UTF-8' ); + $line = trim( sanitize_text_field( $line ) ); + + if ( '' === $line ) { + $parsed[ $index ] = [ 'amount' => '', 'measurement' => '', 'name' => '' ]; + continue; + } + + $raw = $line; + $amount = ''; + $measurement = ''; + + $raw = str_replace( "\xE2\x81\x84", '/', $raw ); + + $fraction_map = [ + "\xC2\xBC" => '1/4', "\xC2\xBD" => '1/2', "\xC2\xBE" => '3/4', + "\xE2\x85\x93" => '1/3', "\xE2\x85\x94" => '2/3', + "\xE2\x85\x95" => '1/5', "\xE2\x85\x96" => '2/5', + "\xE2\x85\x97" => '3/5', "\xE2\x85\x98" => '4/5', + "\xE2\x85\x99" => '1/6', "\xE2\x85\x9A" => '5/6', + "\xE2\x85\x9B" => '1/8', "\xE2\x85\x9C" => '3/8', + "\xE2\x85\x9D" => '5/8', "\xE2\x85\x9E" => '7/8', + ]; + // "1½" must become "1 1/2", not "11/2". + foreach ( $fraction_map as $symbol => $replacement ) { + $raw = preg_replace( '/(\d)' . preg_quote( $symbol, '/' ) . '/u', '$1 ' . $replacement, $raw ); + } + foreach ( $fraction_map as $symbol => $replacement ) { + $raw = str_replace( $symbol, $replacement, $raw ); + } + + // Allow en dash (U+2013) and em dash (U+2014) in amounts like "2–3". + $amount_regex = '/^\s*([\d][\s\/\-\d.,\x{2013}\x{2014}]*)\s*/u'; + if ( preg_match( $amount_regex, $raw, $match ) ) { + $amount = trim( $match[1] ); + $raw = trim( substr( $raw, strlen( $match[0] ) ) ); + } + + if ( preg_match( $units_pattern, $raw, $match ) ) { + $matched_variation = trim( rtrim( $match[1], '.' ) ); + $matched_lower = strtolower( $matched_variation ); + + foreach ( $variations_map as $variation => $key ) { + if ( strtolower( $variation ) === $matched_lower ) { + $measurement = $key; + break; + } + } + + $raw = trim( substr( $raw, strlen( $match[0] ) ) ); + } + + $name = trim( $raw ); + + if ( ! $name ) { + $amount = ''; + $measurement = ''; + $name = trim( $line ); + } + + $parsed[ $index ] = [ + 'amount' => $amount, + 'measurement' => $measurement, + 'name' => $name, + ]; + } + + wp_send_json_success( [ 'parsed' => $parsed ] ); + } } diff --git a/includes/class.cooked-recipe-meta.php b/includes/class.cooked-recipe-meta.php index 93257be..7ce06e9 100644 --- a/includes/class.cooked-recipe-meta.php +++ b/includes/class.cooked-recipe-meta.php @@ -209,6 +209,45 @@ public function render_recipe_meta_box() { // Add an nonce field so we can check for it later. wp_nonce_field( 'cooked_recipe_custom_box', 'cooked_recipe_custom_box_nonce' ); } + + public static function bulk_add_modal() { + // Frontend submit form uses cooked-button + colors.php; wp-admin uses core .button styles. + if ( is_admin() ) { + $bulk_cancel_class = 'button cooked-bulk-add-cancel'; + $bulk_submit_class = 'button button-primary cooked-bulk-add-submit'; + } else { + $bulk_cancel_class = 'cooked-button cooked-secondary-button cooked-bulk-add-cancel'; + $bulk_submit_class = 'cooked-button cooked-bulk-add-submit'; + } + ?> + +   +  

@@ -843,8 +883,11 @@ function cooked_render_recipe_fields( $post_id ) {

+   + +  

@@ -1590,6 +1633,8 @@ function cooked_render_recipe_fields( $post_id ) {
+ + Note: Author links require the Browse/Search Recipes Page to be set up correctly to function properly." msgstr "" -#: includes/class.cooked-recipe-meta.php:523 -#: includes/class.cooked-recipe-meta.php:615 -#: includes/class.cooked-recipe-meta.php:681 +#: includes/class.cooked-recipe-meta.php:562 +#: includes/class.cooked-recipe-meta.php:654 +#: includes/class.cooked-recipe-meta.php:721 msgid "Substitution:" msgstr "" -#: includes/class.cooked-recipe-meta.php:536 -#: includes/class.cooked-recipe-meta.php:628 -#: includes/class.cooked-recipe-meta.php:694 +#: includes/class.cooked-recipe-meta.php:575 +#: includes/class.cooked-recipe-meta.php:667 +#: includes/class.cooked-recipe-meta.php:734 msgid "ex. Apple Sauce, Tofu, etc." msgstr "" @@ -2239,36 +2242,36 @@ msgstr "" msgid "or" msgstr "" -#: includes/class.cooked-recipe-meta.php:1459 +#: includes/class.cooked-recipe-meta.php:1502 msgid "Next & Previous Recipe Navigation" msgstr "" -#: includes/class.cooked-recipe-meta.php:1460 +#: includes/class.cooked-recipe-meta.php:1503 msgid "This will display navigation links to the next and previous recipes." msgstr "" -#: includes/class.cooked-recipe-meta.php:1464 +#: includes/class.cooked-recipe-meta.php:1507 msgid "This shortcode automatically displays the previous and next recipe links based on the current recipe page. No parameters are required." msgstr "" -#: includes/class.cooked-recipe-meta.php:1469 +#: includes/class.cooked-recipe-meta.php:1512 msgid "Usage" msgstr "" -#: includes/class.cooked-recipe-meta.php:1471 +#: includes/class.cooked-recipe-meta.php:1514 msgid "Simply add the shortcode to your recipe template or content area. The navigation will automatically show the previous and next recipes based on recipe ID order." msgstr "" -#: includes/class.cooked-recipe-meta.php:1484 +#: includes/class.cooked-recipe-meta.php:1527 #: includes/class.cooked-related-recipes.php:34 msgid "Related Recipes" msgstr "" -#: includes/class.cooked-shortcodes.php:1131 +#: includes/class.cooked-shortcodes.php:1133 msgid "Recipe not found." msgstr "" -#: includes/class.cooked-shortcodes.php:1146 +#: includes/class.cooked-shortcodes.php:1148 msgid "No related recipes found." msgstr "" @@ -2286,100 +2289,101 @@ msgstr "" msgid "Create translations of your browse page in %s for full multilingual support." msgstr "" -#: includes/class.cooked-recipe-meta.php:1493 +#: includes/class.cooked-recipe-meta.php:1536 msgid "Specify a recipe ID. If not provided, uses the current recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:1500 +#: includes/class.cooked-recipe-meta.php:1543 msgid "Set the heading text for the related recipes section." msgstr "" -#: includes/class.cooked-recipe-meta.php:1527 +#: includes/class.cooked-recipe-meta.php:1570 msgid "Hide recipe card images." msgstr "" -#: includes/class.cooked-recipe-meta.php:1534 +#: includes/class.cooked-recipe-meta.php:1577 msgid "Hide recipe card excerpts." msgstr "" -#: includes/class.cooked-recipe-meta.php:1544 +#: includes/class.cooked-recipe-meta.php:1587 msgid "Hide recipe card authors." msgstr "" -#: includes/class.cooked-recipe-meta.php:1566 +#: includes/class.cooked-recipe-meta.php:1609 msgid "Recipe ID" msgstr "" -#: includes/class.cooked-recipe-meta.php:1567 +#: includes/class.cooked-admin-enqueues.php:174 +#: includes/class.cooked-recipe-meta.php:1610 msgid "Section heading" msgstr "" -#: includes/class.cooked-recipe-meta.php:1568 +#: includes/class.cooked-recipe-meta.php:1611 msgid "Number of recipes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1569 +#: includes/class.cooked-recipe-meta.php:1612 msgid "Grid columns" msgstr "" -#: includes/class.cooked-recipe-meta.php:1570 -#: includes/class.cooked-recipe-meta.php:1571 -#: includes/class.cooked-recipe-meta.php:1572 -#: includes/class.cooked-recipe-meta.php:1573 +#: includes/class.cooked-recipe-meta.php:1613 +#: includes/class.cooked-recipe-meta.php:1614 +#: includes/class.cooked-recipe-meta.php:1615 +#: includes/class.cooked-recipe-meta.php:1616 msgid "true/false" msgstr "" -#: includes/class.cooked-recipe-meta.php:1575 +#: includes/class.cooked-recipe-meta.php:1618 msgid "Example" msgstr "" -#: includes/class.cooked-shortcodes.php:1114 +#: includes/class.cooked-shortcodes.php:1116 msgid "Invalid recipe ID specified. Please provide a valid numeric recipe ID." msgstr "" -#: includes/class.cooked-shortcodes.php:1124 +#: includes/class.cooked-shortcodes.php:1126 msgid "No recipe found. Please specify a recipe ID using the id attribute, or use this shortcode on a recipe page." msgstr "" -#: includes/class.cooked-shortcodes.php:1135 +#: includes/class.cooked-shortcodes.php:1137 #, php-format msgid "The specified ID (%d) is not a recipe." msgstr "" -#: includes/class.cooked-shortcodes.php:1137 +#: includes/class.cooked-shortcodes.php:1139 #, php-format msgid "No post found with ID %d." msgstr "" -#: includes/class.cooked-shortcodes.php:1149 +#: includes/class.cooked-shortcodes.php:1151 msgid "This may be because there are no other recipes in the current language with matching attributes." msgstr "" -#: includes/class.cooked-shortcodes.php:1151 +#: includes/class.cooked-shortcodes.php:1153 msgid "Try adjusting the matching criteria or ensure you have other published recipes with shared categories, tags, or ingredients." msgstr "" -#: includes/class.cooked-recipe-meta.php:1485 +#: includes/class.cooked-recipe-meta.php:1528 msgid "Displays a grid of related recipes based on shared terms in any of the recipe taxonomies (categories, cuisines, cooking methods, tags, diets), shown in random order. No cache or pre-calculation." msgstr "" -#: includes/class.cooked-recipe-meta.php:1510 +#: includes/class.cooked-recipe-meta.php:1553 msgid "Number of recipes to display (default: 4)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1517 +#: includes/class.cooked-recipe-meta.php:1560 msgid "Number of columns in the grid (default: 2)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1551 +#: includes/class.cooked-recipe-meta.php:1594 msgid "Toggle which taxonomies are used: match_categories, match_cuisines, match_cooking_methods, match_tags, match_diets (default: true)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1558 +#: includes/class.cooked-recipe-meta.php:1601 msgid "Matching options:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1559 +#: includes/class.cooked-recipe-meta.php:1602 msgid "Set to false to exclude a taxonomy from related recipes, e.g. match_cuisines=\"false\" to ignore cuisines." msgstr "" @@ -2482,7 +2486,7 @@ msgid "Failed to upload CSV file." msgstr "" #: includes/class.cooked-admin-enqueues.php:161 -#: includes/class.cooked-ajax.php:379 +#: includes/class.cooked-ajax.php:398 msgid "File upload failed." msgstr "" @@ -2508,29 +2512,30 @@ msgstr "" msgid "Last: %1$s · %2$s recipes" msgstr "" -#: includes/class.cooked-ajax.php:346 +#: includes/class.cooked-ajax.php:316 +#: includes/class.cooked-ajax.php:365 msgid "No default content provided." msgstr "" -#: includes/class.cooked-ajax.php:375 -#: includes/class.cooked-ajax.php:411 +#: includes/class.cooked-ajax.php:394 +#: includes/class.cooked-ajax.php:430 msgid "You do not have permission to import recipes." msgstr "" -#: includes/class.cooked-ajax.php:385 +#: includes/class.cooked-ajax.php:404 msgid "Invalid file type. Please upload a CSV file." msgstr "" -#: includes/class.cooked-ajax.php:418 +#: includes/class.cooked-ajax.php:437 msgid "CSV file not found. Please upload again." msgstr "" -#: includes/class.cooked-ajax.php:434 +#: includes/class.cooked-ajax.php:453 #, php-format msgid "Successfully imported %d recipe(s)." msgstr "" -#: includes/class.cooked-ajax.php:443 +#: includes/class.cooked-ajax.php:462 msgid "No recipes were imported." msgstr "" @@ -2647,3 +2652,71 @@ msgstr "" #: includes/class.cooked-import.php:167 msgid "Restricted diet type (Schema.org RestrictedDiet), separated by comma" msgstr "" + +#: includes/class.cooked-admin-enqueues.php:170 +msgid "Bulk Add Ingredients" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:171 +msgid "Bulk Add Directions" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:172 +msgid "" +"2 cups flour\n" +"1 tsp salt\n" +"1/2 cup sugar\n" +"3 large eggs" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:173 +msgid "" +"Preheat oven to 350°F.\n" +"Mix dry ingredients together.\n" +"Add wet ingredients and stir." +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:175 +msgid "Parsing..." +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:176 +msgid "Add Ingredients" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:177 +msgid "Add Directions" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:181 +msgid "Heading text" +msgstr "" + +#: includes/class.cooked-ajax.php:470 +msgid "Security check failed." +msgstr "" + +#: includes/class.cooked-ajax.php:476 +msgid "No ingredients provided." +msgstr "" + +#: includes/class.cooked-recipe-meta.php:230 +msgid "Enter one item per line. Use the checkboxes below to mark section headings." +msgstr "" + +#: includes/class.cooked-recipe-meta.php:233 +msgid "Preview" +msgstr "" + +#: includes/class.cooked-recipe-meta.php:237 +msgid "Please review the parsed fields before adding. Automatic parsing may misread amounts—for example, a range written as 2-3 could appear as 23 unless you correct it." +msgstr "" + +#: includes/class.cooked-recipe-meta.php:242 +msgid "Cancel" +msgstr "" + +#: includes/class.cooked-recipe-meta.php:684 +#: includes/class.cooked-recipe-meta.php:890 +msgid "Bulk Add" +msgstr "" diff --git a/languages/cooked.pot b/languages/cooked.pot index 4459be8..30b6284 100644 --- a/languages/cooked.pot +++ b/languages/cooked.pot @@ -2,14 +2,14 @@ # This file is distributed under the GPL2. msgid "" msgstr "" -"Project-Id-Version: Cooked - Recipe Management 1.13.0\n" +"Project-Id-Version: Cooked - Recipe Management 1.14.0\n" "Report-Msgid-Bugs-To: https://wordpress.org/support/plugin/cooked\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" "MIME-Version: 1.0\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" -"POT-Creation-Date: 2026-02-24T19:15:02-05:00\n" +"POT-Creation-Date: 2026-04-18T23:32:28-04:00\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "X-Generator: WP-CLI 2.12.0\n" "X-Domain: cooked\n" @@ -44,14 +44,14 @@ msgid "remaining" msgstr "" #: includes/class.cooked-admin-enqueues.php:138 -#: includes/class.cooked-recipe-meta.php:759 -#: includes/class.cooked-recipe-meta.php:815 -#: includes/class.cooked-recipe-meta.php:856 +#: includes/class.cooked-recipe-meta.php:799 +#: includes/class.cooked-recipe-meta.php:855 +#: includes/class.cooked-recipe-meta.php:899 msgid "Add Image" msgstr "" #: includes/class.cooked-admin-enqueues.php:139 -#: includes/class.cooked-recipe-meta.php:759 +#: includes/class.cooked-recipe-meta.php:799 msgid "Change Image" msgstr "" @@ -60,7 +60,7 @@ msgid "Use this Image" msgstr "" #: includes/class.cooked-admin-enqueues.php:141 -#: includes/class.cooked-recipe-meta.php:1088 +#: includes/class.cooked-recipe-meta.php:1131 msgid "Add to Gallery" msgstr "" @@ -139,7 +139,7 @@ msgid "Failed to upload CSV file." msgstr "" #: includes/class.cooked-admin-enqueues.php:161 -#: includes/class.cooked-ajax.php:379 +#: includes/class.cooked-ajax.php:398 msgid "File upload failed." msgstr "" @@ -165,6 +165,65 @@ msgstr "" msgid "Last: %1$s · %2$s recipes" msgstr "" +#: includes/class.cooked-admin-enqueues.php:170 +msgid "Bulk Add Ingredients" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:171 +msgid "Bulk Add Directions" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:172 +msgid "" +"2 cups flour\n" +"1 tsp salt\n" +"1/2 cup sugar\n" +"3 large eggs" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:173 +msgid "" +"Preheat oven to 350°F.\n" +"Mix dry ingredients together.\n" +"Add wet ingredients and stir." +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:174 +#: includes/class.cooked-recipe-meta.php:1610 +msgid "Section heading" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:175 +msgid "Parsing..." +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:176 +msgid "Add Ingredients" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:177 +msgid "Add Directions" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:178 +#: includes/class.cooked-recipe-meta.php:513 +msgid "Amount" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:179 +#: includes/class.cooked-recipe-meta.php:514 +msgid "Measurement" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:180 +#: includes/class.cooked-recipe-meta.php:515 +msgid "Item" +msgstr "" + +#: includes/class.cooked-admin-enqueues.php:181 +msgid "Heading text" +msgstr "" + #: includes/class.cooked-admin-menus.php:36 #: includes/class.cooked-admin-menus.php:59 #: includes/class.cooked-post-types.php:450 @@ -213,54 +272,63 @@ msgstr "" msgid "You do not have sufficient permissions to access this page." msgstr "" -#: includes/class.cooked-ajax.php:180 +#: includes/class.cooked-ajax.php:187 #: includes/class.cooked-csv-import.php:307 #: includes/class.cooked-functions.php:134 #: includes/class.cooked-recipe-meta.php:176 -#: includes/class.cooked-recipe-meta.php:263 -#: includes/class.cooked-recipe-meta.php:1166 +#: includes/class.cooked-recipe-meta.php:302 +#: includes/class.cooked-recipe-meta.php:1209 #: includes/class.cooked-recipes.php:635 #: includes/class.cooked-recipes.php:667 msgid "Ingredients" msgstr "" -#: includes/class.cooked-ajax.php:180 +#: includes/class.cooked-ajax.php:187 #: includes/class.cooked-csv-import.php:307 #: includes/class.cooked-functions.php:135 #: includes/class.cooked-recipe-meta.php:176 -#: includes/class.cooked-recipe-meta.php:269 -#: includes/class.cooked-recipe-meta.php:1197 +#: includes/class.cooked-recipe-meta.php:308 +#: includes/class.cooked-recipe-meta.php:1240 #: includes/class.cooked-recipes.php:639 #: includes/class.cooked-recipes.php:668 msgid "Directions" msgstr "" -#: includes/class.cooked-ajax.php:346 +#: includes/class.cooked-ajax.php:316 +#: includes/class.cooked-ajax.php:365 msgid "No default content provided." msgstr "" -#: includes/class.cooked-ajax.php:375 -#: includes/class.cooked-ajax.php:411 +#: includes/class.cooked-ajax.php:394 +#: includes/class.cooked-ajax.php:430 msgid "You do not have permission to import recipes." msgstr "" -#: includes/class.cooked-ajax.php:385 +#: includes/class.cooked-ajax.php:404 msgid "Invalid file type. Please upload a CSV file." msgstr "" -#: includes/class.cooked-ajax.php:418 +#: includes/class.cooked-ajax.php:437 msgid "CSV file not found. Please upload again." msgstr "" -#: includes/class.cooked-ajax.php:434 +#: includes/class.cooked-ajax.php:453 #, php-format msgid "Successfully imported %d recipe(s)." msgstr "" -#: includes/class.cooked-ajax.php:443 +#: includes/class.cooked-ajax.php:462 msgid "No recipes were imported." msgstr "" +#: includes/class.cooked-ajax.php:470 +msgid "Security check failed." +msgstr "" + +#: includes/class.cooked-ajax.php:476 +msgid "No ingredients provided." +msgstr "" + #: includes/class.cooked-cli.php:41 msgid "Please provide a tool name. Use `wp cooked tools list` to see available tools." msgstr "" @@ -308,7 +376,7 @@ msgid "Error importing WP Delicious recipe." msgstr "" #: includes/class.cooked-enqueues.php:56 -#: includes/class.cooked-recipe-meta.php:1412 +#: includes/class.cooked-recipe-meta.php:1455 msgid "Timer" msgstr "" @@ -319,7 +387,7 @@ msgid "What's new in %s?" msgstr "" #: includes/class.cooked-functions.php:127 -#: includes/class.cooked-shortcodes.php:656 +#: includes/class.cooked-shortcodes.php:658 msgid "Print" msgstr "" @@ -336,7 +404,7 @@ msgid "Information" msgstr "" #: includes/class.cooked-functions.php:132 -#: includes/class.cooked-recipe-meta.php:1357 +#: includes/class.cooked-recipe-meta.php:1400 #: includes/class.cooked-settings.php:231 msgid "Excerpt" msgstr "" @@ -347,15 +415,15 @@ msgstr "" #: includes/class.cooked-functions.php:136 #: includes/class.cooked-import.php:161 -#: includes/class.cooked-recipe-meta.php:1381 +#: includes/class.cooked-recipe-meta.php:1424 #: includes/class.cooked-recipes.php:642 #: includes/class.cooked-settings.php:232 -#: includes/class.cooked-shortcodes.php:775 +#: includes/class.cooked-shortcodes.php:777 msgid "Notes" msgstr "" #: includes/class.cooked-functions.php:137 -#: includes/class.cooked-recipe-meta.php:275 +#: includes/class.cooked-recipe-meta.php:314 msgid "Nutrition" msgstr "" @@ -1183,558 +1251,563 @@ msgstr "" msgid "Error importing WP Recipe Maker recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:221 +#: includes/class.cooked-recipe-meta.php:230 +msgid "Enter one item per line. Use the checkboxes below to mark section headings." +msgstr "" + +#: includes/class.cooked-recipe-meta.php:233 +msgid "Preview" +msgstr "" + +#: includes/class.cooked-recipe-meta.php:237 +msgid "Please review the parsed fields before adding. Automatic parsing may misread amounts—for example, a range written as 2-3 could appear as 23 unless you correct it." +msgstr "" + +#: includes/class.cooked-recipe-meta.php:242 +msgid "Cancel" +msgstr "" + +#: includes/class.cooked-recipe-meta.php:260 msgid "Display Recipe" msgstr "" -#: includes/class.cooked-recipe-meta.php:222 +#: includes/class.cooked-recipe-meta.php:261 msgid "This shortcode displays the recipe in its entirety, using the \"Recipe Template\" field in the first tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:257 +#: includes/class.cooked-recipe-meta.php:296 msgid "Layout" msgstr "" -#: includes/class.cooked-recipe-meta.php:281 -#: includes/class.cooked-recipe-meta.php:1278 +#: includes/class.cooked-recipe-meta.php:320 +#: includes/class.cooked-recipe-meta.php:1321 msgid "Gallery" msgstr "" -#: includes/class.cooked-recipe-meta.php:287 +#: includes/class.cooked-recipe-meta.php:326 msgid "Shortcodes" msgstr "" -#: includes/class.cooked-recipe-meta.php:344 +#: includes/class.cooked-recipe-meta.php:383 msgid "Recipe Review Required" msgstr "" #. translators: for displaying singular or plural versions depending on the number of recipes. -#: includes/class.cooked-recipe-meta.php:347 +#: includes/class.cooked-recipe-meta.php:386 #, php-format msgid "It looks like this recipe is from a different version of %s. Please review and click \"Update\" to save it." msgstr "" -#: includes/class.cooked-recipe-meta.php:355 +#: includes/class.cooked-recipe-meta.php:394 msgid "Recipe Shortcode" msgstr "" -#: includes/class.cooked-recipe-meta.php:356 +#: includes/class.cooked-recipe-meta.php:395 msgid "You can use the following shortcode to display your recipe anywhere:" msgstr "" -#: includes/class.cooked-recipe-meta.php:370 +#: includes/class.cooked-recipe-meta.php:409 msgid "Recipe Template" msgstr "" -#: includes/class.cooked-recipe-meta.php:370 +#: includes/class.cooked-recipe-meta.php:409 msgid "Default Recipe Template" msgstr "" -#: includes/class.cooked-recipe-meta.php:370 +#: includes/class.cooked-recipe-meta.php:409 msgid "Choose from the options below to use this layout as the default for new recipes or for all recipes." msgstr "" -#: includes/class.cooked-recipe-meta.php:370 +#: includes/class.cooked-recipe-meta.php:409 msgid "Save as Default" msgstr "" -#: includes/class.cooked-recipe-meta.php:370 +#: includes/class.cooked-recipe-meta.php:409 msgid "Apply to All" msgstr "" -#: includes/class.cooked-recipe-meta.php:370 +#: includes/class.cooked-recipe-meta.php:409 msgid "Reset" msgstr "" -#: includes/class.cooked-recipe-meta.php:370 +#: includes/class.cooked-recipe-meta.php:409 msgid "Using the built-in recipe shortcodes found on the \"Shortcodes\" tab, you can create the layout of your recipe below. Use the \"Save as Default\" button to save your template." msgstr "" -#: includes/class.cooked-recipe-meta.php:388 +#: includes/class.cooked-recipe-meta.php:427 msgid "Recipe Excerpt" msgstr "" -#: includes/class.cooked-recipe-meta.php:388 +#: includes/class.cooked-recipe-meta.php:427 msgid "The excerpt is used on recipe listing templates, where the full recipe should not be displayed." msgstr "" -#: includes/class.cooked-recipe-meta.php:411 +#: includes/class.cooked-recipe-meta.php:450 msgid "SEO Description" msgstr "" -#: includes/class.cooked-recipe-meta.php:411 +#: includes/class.cooked-recipe-meta.php:450 msgid "This description is used for SEO purposes and is optional. By default, Cooked will use the Recipe Excerpt above if available or the Recipe Title if not." msgstr "" -#: includes/class.cooked-recipe-meta.php:422 +#: includes/class.cooked-recipe-meta.php:461 #: includes/class.cooked-settings.php:230 msgid "Difficulty Level" msgstr "" -#: includes/class.cooked-recipe-meta.php:431 -#: includes/class.cooked-recipe-meta.php:1140 +#: includes/class.cooked-recipe-meta.php:470 +#: includes/class.cooked-recipe-meta.php:1183 #: includes/class.cooked-settings.php:233 -#: includes/class.cooked-shortcodes.php:449 -#: includes/class.cooked-shortcodes.php:671 +#: includes/class.cooked-shortcodes.php:451 +#: includes/class.cooked-shortcodes.php:673 msgid "Prep Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:433 -#: includes/class.cooked-recipe-meta.php:438 -#: includes/class.cooked-recipe-meta.php:443 +#: includes/class.cooked-recipe-meta.php:472 +#: includes/class.cooked-recipe-meta.php:477 +#: includes/class.cooked-recipe-meta.php:482 msgid "minutes" msgstr "" -#: includes/class.cooked-recipe-meta.php:436 -#: includes/class.cooked-recipe-meta.php:1141 +#: includes/class.cooked-recipe-meta.php:475 +#: includes/class.cooked-recipe-meta.php:1184 #: includes/class.cooked-settings.php:234 -#: includes/class.cooked-shortcodes.php:450 -#: includes/class.cooked-shortcodes.php:680 +#: includes/class.cooked-shortcodes.php:452 +#: includes/class.cooked-shortcodes.php:682 msgid "Cook Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:441 -#: includes/class.cooked-recipe-meta.php:1142 +#: includes/class.cooked-recipe-meta.php:480 +#: includes/class.cooked-recipe-meta.php:1185 #: includes/class.cooked-settings.php:235 -#: includes/class.cooked-shortcodes.php:451 -#: includes/class.cooked-shortcodes.php:691 -#: includes/class.cooked-shortcodes.php:698 +#: includes/class.cooked-shortcodes.php:453 +#: includes/class.cooked-shortcodes.php:693 +#: includes/class.cooked-shortcodes.php:700 msgid "Total Time" msgstr "" -#: includes/class.cooked-recipe-meta.php:449 +#: includes/class.cooked-recipe-meta.php:488 msgid "Recipe Notes" msgstr "" -#: includes/class.cooked-recipe-meta.php:449 +#: includes/class.cooked-recipe-meta.php:488 msgid "The notes are displayed in the recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:474 -msgid "Amount" -msgstr "" - -#: includes/class.cooked-recipe-meta.php:475 -msgid "Measurement" -msgstr "" - -#: includes/class.cooked-recipe-meta.php:476 -msgid "Item" -msgstr "" - -#: includes/class.cooked-recipe-meta.php:514 -#: includes/class.cooked-recipe-meta.php:606 -#: includes/class.cooked-recipe-meta.php:672 +#: includes/class.cooked-recipe-meta.php:553 +#: includes/class.cooked-recipe-meta.php:645 +#: includes/class.cooked-recipe-meta.php:712 msgid "ex. Eggs, Milk, etc." msgstr "" -#: includes/class.cooked-recipe-meta.php:523 -#: includes/class.cooked-recipe-meta.php:615 -#: includes/class.cooked-recipe-meta.php:681 +#: includes/class.cooked-recipe-meta.php:562 +#: includes/class.cooked-recipe-meta.php:654 +#: includes/class.cooked-recipe-meta.php:721 msgid "Substitution:" msgstr "" -#: includes/class.cooked-recipe-meta.php:536 -#: includes/class.cooked-recipe-meta.php:628 -#: includes/class.cooked-recipe-meta.php:694 +#: includes/class.cooked-recipe-meta.php:575 +#: includes/class.cooked-recipe-meta.php:667 +#: includes/class.cooked-recipe-meta.php:734 msgid "ex. Apple Sauce, Tofu, etc." msgstr "" -#: includes/class.cooked-recipe-meta.php:547 -#: includes/class.cooked-recipe-meta.php:702 -#: includes/class.cooked-recipe-meta.php:775 -#: includes/class.cooked-recipe-meta.php:869 +#: includes/class.cooked-recipe-meta.php:586 +#: includes/class.cooked-recipe-meta.php:742 +#: includes/class.cooked-recipe-meta.php:815 +#: includes/class.cooked-recipe-meta.php:912 msgid "Section Heading" msgstr "" -#: includes/class.cooked-recipe-meta.php:551 -#: includes/class.cooked-recipe-meta.php:706 -#: includes/class.cooked-recipe-meta.php:779 -#: includes/class.cooked-recipe-meta.php:873 +#: includes/class.cooked-recipe-meta.php:590 +#: includes/class.cooked-recipe-meta.php:746 +#: includes/class.cooked-recipe-meta.php:819 +#: includes/class.cooked-recipe-meta.php:916 msgid "Heading Element:" msgstr "" -#: includes/class.cooked-recipe-meta.php:642 +#: includes/class.cooked-recipe-meta.php:681 msgid "Add Ingredient" msgstr "" -#: includes/class.cooked-recipe-meta.php:643 -#: includes/class.cooked-recipe-meta.php:847 +#: includes/class.cooked-recipe-meta.php:682 +#: includes/class.cooked-recipe-meta.php:888 msgid "Add Section Heading" msgstr "" -#: includes/class.cooked-recipe-meta.php:846 +#: includes/class.cooked-recipe-meta.php:684 +#: includes/class.cooked-recipe-meta.php:890 +msgid "Bulk Add" +msgstr "" + +#: includes/class.cooked-recipe-meta.php:887 msgid "Add Direction" msgstr "" -#: includes/class.cooked-recipe-meta.php:904 +#: includes/class.cooked-recipe-meta.php:947 msgid "Nutrition Information" msgstr "" -#: includes/class.cooked-recipe-meta.php:942 -#: includes/class.cooked-shortcodes.php:1062 +#: includes/class.cooked-recipe-meta.php:985 +#: includes/class.cooked-shortcodes.php:1064 msgid "Nutrition Facts" msgstr "" -#: includes/class.cooked-recipe-meta.php:960 -#: includes/class.cooked-shortcodes.php:1030 +#: includes/class.cooked-recipe-meta.php:1003 +#: includes/class.cooked-shortcodes.php:1032 msgid "Amount per serving" msgstr "" -#: includes/class.cooked-recipe-meta.php:970 -#: includes/class.cooked-shortcodes.php:1040 +#: includes/class.cooked-recipe-meta.php:1013 +#: includes/class.cooked-shortcodes.php:1042 msgid "% Daily Value *" msgstr "" -#: includes/class.cooked-recipe-meta.php:989 -#: includes/class.cooked-shortcodes.php:972 +#: includes/class.cooked-recipe-meta.php:1032 +#: includes/class.cooked-shortcodes.php:974 msgid "Includes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1021 -#: includes/class.cooked-shortcodes.php:1066 +#: includes/class.cooked-recipe-meta.php:1064 +#: includes/class.cooked-shortcodes.php:1068 msgid "The % Daily Value (DV) tells you how much a nutrient in a serving of food contributes to a daily diet. 2,000 calories a day is used for general nutrition advice." msgstr "" -#: includes/class.cooked-recipe-meta.php:1037 +#: includes/class.cooked-recipe-meta.php:1080 msgid "Recipe Gallery Type" msgstr "" -#: includes/class.cooked-recipe-meta.php:1050 +#: includes/class.cooked-recipe-meta.php:1093 msgid "Choose one..." msgstr "" #. translators: a title for the video section of the recipe editor, where users can paste a YouToub or Vimeo URL into the field below. -#: includes/class.cooked-recipe-meta.php:1064 +#: includes/class.cooked-recipe-meta.php:1107 #, php-format msgid "%1$s or %2$s Video" msgstr "" #. translators: a message describing how to display a video from YouTube or Vimeo. -#: includes/class.cooked-recipe-meta.php:1068 +#: includes/class.cooked-recipe-meta.php:1111 #, php-format msgid "If you would like to display a video as the first item in your gallery, you can paste a valid %1$s or %2$s URL below." msgstr "" -#: includes/class.cooked-recipe-meta.php:1073 +#: includes/class.cooked-recipe-meta.php:1116 msgid "Gallery Items" msgstr "" -#: includes/class.cooked-recipe-meta.php:1104 +#: includes/class.cooked-recipe-meta.php:1147 msgid "Recipe Information" msgstr "" -#: includes/class.cooked-recipe-meta.php:1105 +#: includes/class.cooked-recipe-meta.php:1148 msgid "This will display the recipe author, cooking times, etc." msgstr "" #. translators: "include and exclude" section title #. translators: "left and right" section title -#: includes/class.cooked-recipe-meta.php:1114 -#: includes/class.cooked-recipe-meta.php:1124 +#: includes/class.cooked-recipe-meta.php:1157 +#: includes/class.cooked-recipe-meta.php:1167 #, php-format msgid "\"%1$s\" and \"%2$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1116 +#: includes/class.cooked-recipe-meta.php:1159 msgid "This will allow you to include or exclude content from the shortcode output." msgstr "" -#: includes/class.cooked-recipe-meta.php:1125 +#: includes/class.cooked-recipe-meta.php:1168 msgid "Used like \"include\", but will position the content to the left or right." msgstr "" -#: includes/class.cooked-recipe-meta.php:1135 -#: includes/class.cooked-recipe-meta.php:1181 -#: includes/class.cooked-recipe-meta.php:1212 -#: includes/class.cooked-recipe-meta.php:1237 -#: includes/class.cooked-recipe-meta.php:1261 -#: includes/class.cooked-recipe-meta.php:1321 -#: includes/class.cooked-recipe-meta.php:1366 -#: includes/class.cooked-recipe-meta.php:1396 -#: includes/class.cooked-recipe-meta.php:1441 -#: includes/class.cooked-recipe-meta.php:1564 +#: includes/class.cooked-recipe-meta.php:1178 +#: includes/class.cooked-recipe-meta.php:1224 +#: includes/class.cooked-recipe-meta.php:1255 +#: includes/class.cooked-recipe-meta.php:1280 +#: includes/class.cooked-recipe-meta.php:1304 +#: includes/class.cooked-recipe-meta.php:1364 +#: includes/class.cooked-recipe-meta.php:1409 +#: includes/class.cooked-recipe-meta.php:1439 +#: includes/class.cooked-recipe-meta.php:1484 +#: includes/class.cooked-recipe-meta.php:1607 msgid "Available Variables" msgstr "" -#: includes/class.cooked-recipe-meta.php:1139 +#: includes/class.cooked-recipe-meta.php:1182 #: includes/class.cooked-settings.php:228 -#: includes/class.cooked-shortcodes.php:446 -#: includes/class.cooked-shortcodes.php:624 +#: includes/class.cooked-shortcodes.php:448 +#: includes/class.cooked-shortcodes.php:626 msgid "Author" msgstr "" -#: includes/class.cooked-recipe-meta.php:1143 -#: includes/class.cooked-shortcodes.php:447 -#: includes/class.cooked-shortcodes.php:635 +#: includes/class.cooked-recipe-meta.php:1186 +#: includes/class.cooked-shortcodes.php:449 +#: includes/class.cooked-shortcodes.php:637 msgid "Difficulty" msgstr "" -#: includes/class.cooked-recipe-meta.php:1144 +#: includes/class.cooked-recipe-meta.php:1187 msgid "Servings Switcher" msgstr "" -#: includes/class.cooked-recipe-meta.php:1145 +#: includes/class.cooked-recipe-meta.php:1188 #: includes/class.cooked-settings.php:229 -#: includes/class.cooked-shortcodes.php:718 -#: includes/class.cooked-shortcodes.php:721 +#: includes/class.cooked-shortcodes.php:720 +#: includes/class.cooked-shortcodes.php:723 #: includes/class.cooked-taxonomies.php:39 msgid "Category" msgstr "" -#: includes/class.cooked-recipe-meta.php:1146 +#: includes/class.cooked-recipe-meta.php:1189 msgid "Print Mode" msgstr "" -#: includes/class.cooked-recipe-meta.php:1147 +#: includes/class.cooked-recipe-meta.php:1190 msgid "Full-Screen Mode" msgstr "" -#: includes/class.cooked-recipe-meta.php:1167 +#: includes/class.cooked-recipe-meta.php:1210 msgid "This will display the list of ingredients, added via the \"Ingredients\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1173 +#: includes/class.cooked-recipe-meta.php:1216 msgid "This will allow you to hide or show the checkboxes:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1183 +#: includes/class.cooked-recipe-meta.php:1226 msgid "Show checkboxes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1184 +#: includes/class.cooked-recipe-meta.php:1227 msgid "Hide checkboxes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1198 +#: includes/class.cooked-recipe-meta.php:1241 msgid "This will display the list of directions, added via the \"Directions\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1204 +#: includes/class.cooked-recipe-meta.php:1247 msgid "This will allow you to hide or show the numbers:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1214 +#: includes/class.cooked-recipe-meta.php:1257 msgid "Show numbers" msgstr "" -#: includes/class.cooked-recipe-meta.php:1215 +#: includes/class.cooked-recipe-meta.php:1258 msgid "Hide numbers" msgstr "" -#: includes/class.cooked-recipe-meta.php:1228 +#: includes/class.cooked-recipe-meta.php:1271 msgid "Featured Image" msgstr "" -#: includes/class.cooked-recipe-meta.php:1229 +#: includes/class.cooked-recipe-meta.php:1272 msgid "This will display the featured image, if one is set." msgstr "" -#: includes/class.cooked-recipe-meta.php:1239 -#: includes/class.cooked-recipe-meta.php:1263 -#: includes/class.cooked-recipe-meta.php:1368 +#: includes/class.cooked-recipe-meta.php:1282 +#: includes/class.cooked-recipe-meta.php:1306 +#: includes/class.cooked-recipe-meta.php:1411 msgid "None" msgstr "" -#: includes/class.cooked-recipe-meta.php:1252 +#: includes/class.cooked-recipe-meta.php:1295 msgid "Nutrition Label" msgstr "" -#: includes/class.cooked-recipe-meta.php:1253 +#: includes/class.cooked-recipe-meta.php:1296 msgid "This will display the Nutrition Facts label, if data is present." msgstr "" -#: includes/class.cooked-recipe-meta.php:1279 +#: includes/class.cooked-recipe-meta.php:1322 msgid "This will display the gallery, if one is set or created from the \"Gallery\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1287 +#: includes/class.cooked-recipe-meta.php:1330 msgid "Set the width of the gallery." msgstr "" -#: includes/class.cooked-recipe-meta.php:1294 +#: includes/class.cooked-recipe-meta.php:1337 msgid "Set the image size ratio." msgstr "" -#: includes/class.cooked-recipe-meta.php:1304 +#: includes/class.cooked-recipe-meta.php:1347 msgid "Set the navigation style." msgstr "" -#: includes/class.cooked-recipe-meta.php:1311 +#: includes/class.cooked-recipe-meta.php:1354 msgid "Enable or disable \"Full-Screen\" mode." msgstr "" #. translators: related to the width of slideshows: "80% or 300px" section title -#: includes/class.cooked-recipe-meta.php:1326 +#: includes/class.cooked-recipe-meta.php:1369 #, php-format msgid "ex: \"%1$s\" or \"%2$s\"" msgstr "" #. translators: related to the image ratio for slideshows: "ex: 800/600" section title -#: includes/class.cooked-recipe-meta.php:1331 +#: includes/class.cooked-recipe-meta.php:1374 #, php-format msgid "ex: \"%s\"" msgstr "" #. translators: related to the navigation style for slideshows: "dots, thumbs or false" section title -#: includes/class.cooked-recipe-meta.php:1336 +#: includes/class.cooked-recipe-meta.php:1379 #, php-format msgid "\"%1$s\", \"%2$s\", or \"%3$s\"" msgstr "" #. translators: related to allowing full screen for slideshows: "true or false" section title -#: includes/class.cooked-recipe-meta.php:1341 +#: includes/class.cooked-recipe-meta.php:1384 #, php-format msgid "\"%1$s\" or \"%2$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1358 +#: includes/class.cooked-recipe-meta.php:1401 msgid "This will display the excerpt, if one is available from the \"Layout & Content\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1382 +#: includes/class.cooked-recipe-meta.php:1425 msgid "This will display the notes, if one is available from the \"Layout & Content\" tab." msgstr "" -#: includes/class.cooked-recipe-meta.php:1388 +#: includes/class.cooked-recipe-meta.php:1431 msgid "This will allow you to hide or show the header for the notes section:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1398 +#: includes/class.cooked-recipe-meta.php:1441 msgid "Show header" msgstr "" -#: includes/class.cooked-recipe-meta.php:1399 +#: includes/class.cooked-recipe-meta.php:1442 msgid "Hide header" msgstr "" -#: includes/class.cooked-recipe-meta.php:1413 +#: includes/class.cooked-recipe-meta.php:1456 msgid "This will display a special link to start a cooking timer." msgstr "" #. translators: "seconds, minutes and hours" section title -#: includes/class.cooked-recipe-meta.php:1422 +#: includes/class.cooked-recipe-meta.php:1465 #, php-format msgid "\"%1$s\", \"%2$s\" and \"%3$s\"" msgstr "" -#: includes/class.cooked-recipe-meta.php:1424 +#: includes/class.cooked-recipe-meta.php:1467 msgid "Use just one or a combination of all three to set the timer length" msgstr "" -#: includes/class.cooked-recipe-meta.php:1431 +#: includes/class.cooked-recipe-meta.php:1474 msgid "Add a short description for this timer, if applicable." msgstr "" -#: includes/class.cooked-recipe-meta.php:1443 +#: includes/class.cooked-recipe-meta.php:1486 msgid "Time in seconds" msgstr "" -#: includes/class.cooked-recipe-meta.php:1444 +#: includes/class.cooked-recipe-meta.php:1487 msgid "Time in minutes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1445 +#: includes/class.cooked-recipe-meta.php:1488 msgid "Time in hours" msgstr "" -#: includes/class.cooked-recipe-meta.php:1446 +#: includes/class.cooked-recipe-meta.php:1489 msgid "Timer Description" msgstr "" -#: includes/class.cooked-recipe-meta.php:1459 +#: includes/class.cooked-recipe-meta.php:1502 msgid "Next & Previous Recipe Navigation" msgstr "" -#: includes/class.cooked-recipe-meta.php:1460 +#: includes/class.cooked-recipe-meta.php:1503 msgid "This will display navigation links to the next and previous recipes." msgstr "" -#: includes/class.cooked-recipe-meta.php:1464 +#: includes/class.cooked-recipe-meta.php:1507 msgid "This shortcode automatically displays the previous and next recipe links based on the current recipe page. No parameters are required." msgstr "" -#: includes/class.cooked-recipe-meta.php:1469 +#: includes/class.cooked-recipe-meta.php:1512 msgid "Usage" msgstr "" -#: includes/class.cooked-recipe-meta.php:1471 +#: includes/class.cooked-recipe-meta.php:1514 msgid "Simply add the shortcode to your recipe template or content area. The navigation will automatically show the previous and next recipes based on recipe ID order." msgstr "" -#: includes/class.cooked-recipe-meta.php:1484 +#: includes/class.cooked-recipe-meta.php:1527 #: includes/class.cooked-related-recipes.php:34 msgid "Related Recipes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1485 +#: includes/class.cooked-recipe-meta.php:1528 msgid "Displays a grid of related recipes based on shared terms in any of the recipe taxonomies (categories, cuisines, cooking methods, tags, diets), shown in random order. No cache or pre-calculation." msgstr "" -#: includes/class.cooked-recipe-meta.php:1493 +#: includes/class.cooked-recipe-meta.php:1536 msgid "Specify a recipe ID. If not provided, uses the current recipe." msgstr "" -#: includes/class.cooked-recipe-meta.php:1500 +#: includes/class.cooked-recipe-meta.php:1543 msgid "Set the heading text for the related recipes section." msgstr "" -#: includes/class.cooked-recipe-meta.php:1510 +#: includes/class.cooked-recipe-meta.php:1553 msgid "Number of recipes to display (default: 4)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1517 +#: includes/class.cooked-recipe-meta.php:1560 msgid "Number of columns in the grid (default: 2)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1527 +#: includes/class.cooked-recipe-meta.php:1570 msgid "Hide recipe card images." msgstr "" -#: includes/class.cooked-recipe-meta.php:1534 +#: includes/class.cooked-recipe-meta.php:1577 msgid "Hide recipe card excerpts." msgstr "" -#: includes/class.cooked-recipe-meta.php:1544 +#: includes/class.cooked-recipe-meta.php:1587 msgid "Hide recipe card authors." msgstr "" -#: includes/class.cooked-recipe-meta.php:1551 +#: includes/class.cooked-recipe-meta.php:1594 msgid "Toggle which taxonomies are used: match_categories, match_cuisines, match_cooking_methods, match_tags, match_diets (default: true)." msgstr "" -#: includes/class.cooked-recipe-meta.php:1558 +#: includes/class.cooked-recipe-meta.php:1601 msgid "Matching options:" msgstr "" -#: includes/class.cooked-recipe-meta.php:1559 +#: includes/class.cooked-recipe-meta.php:1602 msgid "Set to false to exclude a taxonomy from related recipes, e.g. match_cuisines=\"false\" to ignore cuisines." msgstr "" -#: includes/class.cooked-recipe-meta.php:1566 +#: includes/class.cooked-recipe-meta.php:1609 msgid "Recipe ID" msgstr "" -#: includes/class.cooked-recipe-meta.php:1567 -msgid "Section heading" -msgstr "" - -#: includes/class.cooked-recipe-meta.php:1568 +#: includes/class.cooked-recipe-meta.php:1611 msgid "Number of recipes" msgstr "" -#: includes/class.cooked-recipe-meta.php:1569 +#: includes/class.cooked-recipe-meta.php:1612 msgid "Grid columns" msgstr "" -#: includes/class.cooked-recipe-meta.php:1570 -#: includes/class.cooked-recipe-meta.php:1571 -#: includes/class.cooked-recipe-meta.php:1572 -#: includes/class.cooked-recipe-meta.php:1573 +#: includes/class.cooked-recipe-meta.php:1613 +#: includes/class.cooked-recipe-meta.php:1614 +#: includes/class.cooked-recipe-meta.php:1615 +#: includes/class.cooked-recipe-meta.php:1616 msgid "true/false" msgstr "" -#: includes/class.cooked-recipe-meta.php:1575 +#: includes/class.cooked-recipe-meta.php:1618 msgid "Example" msgstr "" @@ -1818,7 +1891,7 @@ msgid "Triple (%s Servings)" msgstr "" #: includes/class.cooked-recipes.php:865 -#: includes/class.cooked-shortcodes.php:448 +#: includes/class.cooked-shortcodes.php:450 msgid "Yields" msgstr "" @@ -2268,45 +2341,45 @@ msgstr "" msgid "Public recipes are currently disabled. You can change this at the bottom of the %s page." msgstr "" -#: includes/class.cooked-shortcodes.php:298 +#: includes/class.cooked-shortcodes.php:300 msgid "(recipe not found or in draft status)" msgstr "" -#: includes/class.cooked-shortcodes.php:662 +#: includes/class.cooked-shortcodes.php:664 msgid "Fullscreen" msgstr "" -#: includes/class.cooked-shortcodes.php:1114 +#: includes/class.cooked-shortcodes.php:1116 msgid "Invalid recipe ID specified. Please provide a valid numeric recipe ID." msgstr "" -#: includes/class.cooked-shortcodes.php:1124 +#: includes/class.cooked-shortcodes.php:1126 msgid "No recipe found. Please specify a recipe ID using the id attribute, or use this shortcode on a recipe page." msgstr "" -#: includes/class.cooked-shortcodes.php:1131 +#: includes/class.cooked-shortcodes.php:1133 msgid "Recipe not found." msgstr "" -#: includes/class.cooked-shortcodes.php:1135 +#: includes/class.cooked-shortcodes.php:1137 #, php-format msgid "The specified ID (%d) is not a recipe." msgstr "" -#: includes/class.cooked-shortcodes.php:1137 +#: includes/class.cooked-shortcodes.php:1139 #, php-format msgid "No post found with ID %d." msgstr "" -#: includes/class.cooked-shortcodes.php:1146 +#: includes/class.cooked-shortcodes.php:1148 msgid "No related recipes found." msgstr "" -#: includes/class.cooked-shortcodes.php:1149 +#: includes/class.cooked-shortcodes.php:1151 msgid "This may be because there are no other recipes in the current language with matching attributes." msgstr "" -#: includes/class.cooked-shortcodes.php:1151 +#: includes/class.cooked-shortcodes.php:1153 msgid "Try adjusting the matching criteria or ensure you have other published recipes with shared categories, tags, or ingredients." msgstr "" diff --git a/package-lock.json b/package-lock.json index f3e3eda..07f1a42 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "cooked", - "version": "1.13.0", + "version": "1.14.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "cooked", - "version": "1.13.0", + "version": "1.14.0", "license": "ISC", "devDependencies": { "@playwright/test": "^1.48.2", @@ -101,12 +101,11 @@ } }, "node_modules/@opentelemetry/api": { - "version": "1.9.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", - "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.1.tgz", + "integrity": "sha512-gLyJlPHPZYdAk1JENA9LeHejZe1Ti77/pTeFm/nMXmQH/HFZlcS/O2XJB+L8fkbrNSqhdtlvjBVjxwUYanNH5Q==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=8.0.0" } @@ -130,7 +129,6 @@ "integrity": "sha512-s5vvxXPVdjqS3kTLKMeBMvop9hbWkwzBpu+mUO2M7sZtlkyDJGwFe33wRKnbaYDo8ExRVBIIdwIGrqpxHuKttA==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=14" }, @@ -144,7 +142,6 @@ "integrity": "sha512-OOCM2C/QIURhJMuKaekP3TRBxBKxG/TWWA0TL2J6nXUtDnuCtccy49LUJF8xPFXMX+0LMcxFpCo8M9cGY1W6rQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/semantic-conventions": "1.28.0" }, @@ -171,7 +168,6 @@ "integrity": "sha512-BdBGhQBh8IjZ2oIIX6F2/Q3LKm/FDDKi6ccYKcBTeilh6SNdNKveDOLk73BkSJjQLJk6qe4Yh+hHw1UPhCDdrg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/api-logs": "0.57.2", "@types/shimmer": "^1.2.0", @@ -602,7 +598,6 @@ "integrity": "sha512-5UxZqiAgLYGFjS4s9qm5mBVo433u+dSPUFWVWXmLAD4wB65oMCoXaJP1KJa9DIYYMeHu3z4BZcStG3LC593cWA==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/semantic-conventions": "1.28.0" @@ -630,7 +625,6 @@ "integrity": "sha512-jVPgBbH1gCy2Lb7X0AVQ8XAfgg0pJ4nvl8/IiQA6nxOsPvS+0zMJaFSs2ltXe0J6C8dqjcnpyqINDJmU30+uOg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { "@opentelemetry/core": "1.30.1", "@opentelemetry/resources": "1.30.1", @@ -654,12 +648,11 @@ } }, "node_modules/@opentelemetry/semantic-conventions": { - "version": "1.39.0", - "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.39.0.tgz", - "integrity": "sha512-R5R9tb2AXs2IRLNKLBJDynhkfmx7mX0vi8NkhZb3gUkPWHn6HXk5J8iQ/dql0U3ApfWym4kXXmBDRGO+oeOfjg==", + "version": "1.40.0", + "resolved": "https://registry.npmjs.org/@opentelemetry/semantic-conventions/-/semantic-conventions-1.40.0.tgz", + "integrity": "sha512-cifvXDhcqMwwTlTK04GBNeIe7yyo28Mfby85QXFe1Yk8nmi36Ab/5UQwptOx84SsoGNRg+EVSjwzfSZMy6pmlw==", "dev": true, "license": "Apache-2.0", - "peer": true, "engines": { "node": ">=14" } @@ -991,9 +984,9 @@ } }, "node_modules/@parcel/watcher/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", "dev": true, "license": "MIT", "optional": true, @@ -1016,14 +1009,13 @@ } }, "node_modules/@playwright/test": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.58.2.tgz", - "integrity": "sha512-akea+6bHYBBfA9uQqSYmlJXn61cTa+jbO87xVLCWbTqbWadRVmhxlXATaOjOgcBaWU4ePo0wB41KMFv3o35IXA==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.59.1.tgz", + "integrity": "sha512-PG6q63nQg5c9rIi4/Z5lR5IVF7yU5MqmKaPOe0HSc0O2cX1fPi96sUQu5j7eo4gKCkB2AnNGoWt7y4/Xx3Kcqg==", "dev": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "playwright": "1.58.2" + "playwright": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -1230,12 +1222,11 @@ } }, "node_modules/@types/node": { - "version": "20.19.33", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.33.tgz", - "integrity": "sha512-Rs1bVAIdBs5gbTIKza/tgpMuG1k3U/UMJLWecIMxNdJFDMzcM5LOiLVRYh3PilWEYDIeUDv7bpiHPLPsbydGcw==", + "version": "20.19.39", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.19.39.tgz", + "integrity": "sha512-orrrD74MBUyK8jOAD/r0+lfa1I2MO6I+vAkmAWzMYbCcgrN4lCrmK52gRFQq/JRxfYPfonkr4b0jcY7Olqdqbw==", "dev": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~6.21.0" } @@ -1291,9 +1282,9 @@ } }, "node_modules/@wordpress/e2e-test-utils-playwright": { - "version": "1.40.0", - "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.40.0.tgz", - "integrity": "sha512-7EMx/5R0l9mlR4s01I06x8bw7qq30VlU98T/tvYJa+ycFQK3oetkoPyiNfki2Y2SILQGjI3Mu4MSV1NPCa/mEw==", + "version": "1.44.0", + "resolved": "https://registry.npmjs.org/@wordpress/e2e-test-utils-playwright/-/e2e-test-utils-playwright-1.44.0.tgz", + "integrity": "sha512-iUKHGH8TjW1s0cpkcHF6y/APOmy4YnwBfzdBNCITK4+4fuSZnTV7vZyzBU3adthGcBSMGQ9w8MTE2AzGLtlG3w==", "dev": true, "license": "GPL-2.0-or-later", "dependencies": { @@ -1318,7 +1309,6 @@ "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", "dev": true, "license": "MIT", - "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -1509,9 +1499,9 @@ } }, "node_modules/axe-core": { - "version": "4.11.1", - "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.1.tgz", - "integrity": "sha512-BASOg+YwO2C+346x3LZOeoovTIoTrRqEsqMa6fmfAV0P+U9mFr9NsyOEpiYvFjbc64NMrSswhV50WdXzdb/Z5A==", + "version": "4.11.3", + "resolved": "https://registry.npmjs.org/axe-core/-/axe-core-4.11.3.tgz", + "integrity": "sha512-zBQouZixDTbo3jMGqHKyePxYxr1e5W8UdTmBQ7sNtaA9M2bE32daxxPLS/jojhKOHxQ7LWwPjfiwf/fhaJWzlg==", "dev": true, "license": "MPL-2.0", "engines": { @@ -1549,14 +1539,11 @@ } }, "node_modules/balanced-match": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-4.0.4.tgz", - "integrity": "sha512-BLrgEcRTwX2o6gGxGOCNyMvGSp35YofuYzw9h1IMTRmKqttAZZVU67bdb9Pr2vUHA8+j3i2tJfjO6C6+4myGTA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", "dev": true, - "license": "MIT", - "engines": { - "node": "18 || 20 || >=22" - } + "license": "MIT" }, "node_modules/bare-events": { "version": "2.8.2", @@ -1564,7 +1551,6 @@ "integrity": "sha512-riJjyv1/mHLIPX4RwiK+oW9/4c3TEUeORHKefKAKnZ5kyslbN+HXowtbaVEqt4IMUB7OXlfixcs6gsFeo/jhiQ==", "dev": true, "license": "Apache-2.0", - "peer": true, "peerDependencies": { "bare-abort-controller": "*" }, @@ -1575,12 +1561,11 @@ } }, "node_modules/bare-fs": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.5.4.tgz", - "integrity": "sha512-POK4oplfA7P7gqvetNmCs4CNtm9fNsx+IAh7jH7GgU0OJdge2rso0R20TNWVq6VoWcCvsTdlNDaleLHGaKx8CA==", + "version": "4.7.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-4.7.1.tgz", + "integrity": "sha512-WDRsyVN52eAx/lBamKD6uyw8H4228h/x0sGGGegOamM2cd7Pag88GfMQalobXI+HaEUxpCkbKQUDOQqt9wawRw==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-events": "^2.5.4", "bare-path": "^3.0.0", @@ -1601,12 +1586,11 @@ } }, "node_modules/bare-os": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.6.2.tgz", - "integrity": "sha512-T+V1+1srU2qYNBmJCXZkUY5vQ0B4FSlL3QDROnKQYOqeiQR8UbjNHlPa+TIbM4cuidiN9GaTaOZgSEgsvPbh5A==", + "version": "3.8.7", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-3.8.7.tgz", + "integrity": "sha512-G4Gr1UsGeEy2qtDTZwL7JFLo2wapUarz7iTMcYcMFdS89AIQuBoyjgXZz0Utv7uHs3xA9LckhVbeBi8lEQrC+w==", "dev": true, "license": "Apache-2.0", - "optional": true, "engines": { "bare": ">=1.14.0" } @@ -1617,27 +1601,29 @@ "integrity": "sha512-tyfW2cQcB5NN8Saijrhqn0Zh7AnFNsnczRcuWODH0eYAXBsJ5gVxAUuNr7tsHSC6IZ77cA0SitzT+s47kot8Mw==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-os": "^3.0.1" } }, "node_modules/bare-stream": { - "version": "2.8.0", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.8.0.tgz", - "integrity": "sha512-reUN0M2sHRqCdG4lUK3Fw8w98eeUIZHL5c3H7Mbhk2yVBL+oofgaIp0ieLfD5QXwPCypBpmEEKU2WZKzbAk8GA==", + "version": "2.13.0", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.13.0.tgz", + "integrity": "sha512-3zAJRZMDFGjdn+RVnNpF9kuELw+0Fl3lpndM4NcEOhb9zwtSo/deETfuIwMSE5BXanA0FrN1qVjffGwAg2Y7EA==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { - "streamx": "^2.21.0", + "streamx": "^2.25.0", "teex": "^1.0.1" }, "peerDependencies": { + "bare-abort-controller": "*", "bare-buffer": "*", "bare-events": "*" }, "peerDependenciesMeta": { + "bare-abort-controller": { + "optional": true + }, "bare-buffer": { "optional": true }, @@ -1647,12 +1633,11 @@ } }, "node_modules/bare-url": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.3.2.tgz", - "integrity": "sha512-ZMq4gd9ngV5aTMa5p9+UfY0b3skwhHELaDkhEHetMdX0LRkW9kzaym4oo/Eh+Ghm0CCDuMTsRIGM/ytUc1ZYmw==", + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/bare-url/-/bare-url-2.4.1.tgz", + "integrity": "sha512-fZapLWNB25gS+etK27NV9KgBNXgo2yeYHuj+OyPblQd6GYAE3JVy6aKxszMV5jhGGFwraXQKA5fldvf3lMyEqw==", "dev": true, "license": "Apache-2.0", - "optional": true, "dependencies": { "bare-path": "^3.0.0" } @@ -1679,9 +1664,9 @@ "license": "MIT" }, "node_modules/basic-ftp": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.2.0.tgz", - "integrity": "sha512-VoMINM2rqJwJgfdHq6RiUudKt2BV+FY5ZFezP/ypmwayk68+NzzAQy4XXLlqsGD4MCzq3DrmNFD/uUmBJuGoXw==", + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.3.0.tgz", + "integrity": "sha512-5K9eNNn7ywHPsYnFwjKgYH8Hf8B5emh7JKcPaVjjrMJFQQwGpwowEnZNEtHs7DfR7hCZsmaK3VA4HUK0YarT+w==", "dev": true, "license": "MIT", "engines": { @@ -1714,16 +1699,13 @@ } }, "node_modules/brace-expansion": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-5.0.3.tgz", - "integrity": "sha512-fy6KJm2RawA5RcHkLa1z/ScpBeA762UF9KmZQxwIbDtRJrgLzM10depAiEQ+CXYcoiqW1/m96OAAoke2nE9EeA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.1.0.tgz", + "integrity": "sha512-TN1kCZAgdgweJhWWpgKYrQaMNHcDULHkWwQIspdtjV4Y5aurRdZpjAqn6yX3FPqTA9ngHCc4hJxMAMgGfve85w==", "dev": true, "license": "MIT", "dependencies": { - "balanced-match": "^4.0.2" - }, - "engines": { - "node": "18 || 20 || >=22" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -2107,8 +2089,7 @@ "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1507524.tgz", "integrity": "sha512-OjaNE7qpk6GRTXtqQjAE5bGx6+c4F1zZH0YXtpZQLM92HNXx4zMAaqlKhP4T52DosG6hDW8gPMNhGOF8xbwk/w==", "dev": true, - "license": "BSD-3-Clause", - "peer": true + "license": "BSD-3-Clause" }, "node_modules/dot-case": { "version": "3.0.4", @@ -2182,6 +2163,16 @@ "node": ">=8.6" } }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, "node_modules/escalade": { "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", @@ -2897,9 +2888,9 @@ } }, "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.3.tgz", + "integrity": "sha512-ej4AhfhfL2Q2zpMmLo7U1Uv9+PyhIZpgQLGT1F9miIGmiCJIoCgSmczFdrc97mWT4kVY72KA+WnnhJ5pghSvSg==", "dev": true, "license": "MIT", "dependencies": { @@ -3013,9 +3004,9 @@ "license": "MIT" }, "node_modules/immutable": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.4.tgz", - "integrity": "sha512-p6u1bG3YSnINT5RQmx/yRZBpenIl30kVxkTLDyHLIMk0gict704Q9n+thfDI7lTRm9vXdDYutVzXhzcThxTnXA==", + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", "dev": true, "license": "MIT" }, @@ -3470,9 +3461,9 @@ } }, "node_modules/lodash-es": { - "version": "4.17.23", - "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.17.23.tgz", - "integrity": "sha512-kVI48u3PZr38HdYz98UmfPnXl2DXrpdctLrFLCd3kOx1xUkOmpFPx7gCWWM5MPkL/fD8zb+Ph0QzjGFs4+hHWg==", + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", "dev": true, "license": "MIT" }, @@ -3579,13 +3570,13 @@ } }, "node_modules/minimatch": { - "version": "9.0.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.6.tgz", - "integrity": "sha512-kQAVowdR33euIqeA0+VZTDqU+qo1IeVY+hrKYtZMio3Pg0P0vuh/kwRylLUddJhB6pf3q/botcOvRtx4IN1wqQ==", + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", "dev": true, "license": "ISC", "dependencies": { - "brace-expansion": "^5.0.2" + "brace-expansion": "^2.0.2" }, "engines": { "node": ">=16 || 14 >=14.17" @@ -3626,9 +3617,9 @@ } }, "node_modules/netmask": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", - "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.1.1.tgz", + "integrity": "sha512-eonl3sLUha+S1GzTPxychyhnUzKyeQkZ7jLjKrBagJgPla13F+uQ71HgpFefyHgqrjEbCPkDArxYsjY8/+gLKA==", "dev": true, "license": "MIT", "engines": { @@ -3880,9 +3871,9 @@ } }, "node_modules/pg-protocol": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.11.0.tgz", - "integrity": "sha512-pfsxk2M9M3BuGgDOfuy37VNRRX3jmKgMjcvAcWqNDpZSf4cUmv8HSOl5ViRQFsfARFn0KuUQTgLxVMbNq5NW3g==", + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.13.0.tgz", + "integrity": "sha512-zzdvXfS6v89r6v7OcFCHfHlyG/wvry1ALxZo4LqgUoy7W9xhBDMaqOuMiF3qEV45VqsN6rdlcehHrfDtlCPc8w==", "dev": true, "license": "MIT" }, @@ -3911,9 +3902,9 @@ "license": "ISC" }, "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", "dev": true, "license": "MIT", "engines": { @@ -3924,13 +3915,13 @@ } }, "node_modules/playwright": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.58.2.tgz", - "integrity": "sha512-vA30H8Nvkq/cPBnNw4Q8TWz1EJyqgpuinBcHET0YVJVFldr8JDNiU9LaWAE1KqSkRYazuaBhTpB5ZzShOezQ6A==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright/-/playwright-1.59.1.tgz", + "integrity": "sha512-C8oWjPR3F81yljW9o5OxcWzfh6avkVwDD2VYdwIGqTkl+OGFISgypqzfu7dOe4QNLL2aqcWBmI3PMtLIK233lw==", "dev": true, "license": "Apache-2.0", "dependencies": { - "playwright-core": "1.58.2" + "playwright-core": "1.59.1" }, "bin": { "playwright": "cli.js" @@ -3943,9 +3934,9 @@ } }, "node_modules/playwright-core": { - "version": "1.58.2", - "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.58.2.tgz", - "integrity": "sha512-yZkEtftgwS8CsfYo7nm0KE8jsvm6i/PTgVtB8DL726wNf6H2IMsDuxCpJj59KDaxCtSnrWan2AeDqM7JBaultg==", + "version": "1.59.1", + "resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.59.1.tgz", + "integrity": "sha512-HBV/RJg81z5BiiZ9yPzIiClYV/QMsDCKUyogwH9p3MCP6IYjUFu/MActgYAvK0oWyV9NlwM3GLBjADyWgydVyg==", "dev": true, "license": "Apache-2.0", "bin": { @@ -4087,9 +4078,9 @@ "license": "MIT" }, "node_modules/pump": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.3.tgz", - "integrity": "sha512-todwxLMY7/heScKmntwQG8CXVkWUOdYxIvY2s0VWAAMh/nd8SoYiRaKjlr7+iCs984f2P8zvrfWcDDYVb73NfA==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.4.tgz", + "integrity": "sha512-VS7sjc6KR7e1ukRFhQSY5LM2uBWAUPiOPa/A3mkKmiMwSmRFUITt0xuj+/lesgnCv+dPIEYlkzrcyXgquIHMcA==", "dev": true, "license": "MIT", "dependencies": { @@ -4098,17 +4089,17 @@ } }, "node_modules/puppeteer-core": { - "version": "24.37.5", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.37.5.tgz", - "integrity": "sha512-ybL7iE78YPN4T6J+sPLO7r0lSByp/0NN6PvfBEql219cOnttoTFzCWKiBOjstXSqi/OKpwae623DWAsL7cn2MQ==", + "version": "24.41.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.41.0.tgz", + "integrity": "sha512-rLIUri7E/NQ3APSEYCCozaSJx0u8Tu9wxO6BJwnvXmIgILSK3L0TombaVh3izp1njAGrO6H2ru0hcIrLF+gWLw==", "dev": true, "license": "Apache-2.0", "dependencies": { "@puppeteer/browsers": "2.13.0", "chromium-bidi": "14.0.0", "debug": "^4.4.3", - "devtools-protocol": "0.0.1566079", - "typed-query-selector": "^2.12.0", + "devtools-protocol": "0.0.1595872", + "typed-query-selector": "^2.12.1", "webdriver-bidi-protocol": "0.4.1", "ws": "^8.19.0" }, @@ -4117,16 +4108,16 @@ } }, "node_modules/puppeteer-core/node_modules/devtools-protocol": { - "version": "0.0.1566079", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1566079.tgz", - "integrity": "sha512-MJfAEA1UfVhSs7fbSQOG4czavUp1ajfg6prlAN0+cmfa2zNjaIbvq8VneP7do1WAQQIvgNJWSMeP6UyI90gIlQ==", + "version": "0.0.1595872", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1595872.tgz", + "integrity": "sha512-kRfgp8vWVjBu/fbYCiVFiOqsCk3CrMKEo3WbgGT2NXK2dG7vawWPBljixajVgGK9II8rDO9G0oD0zLt3I1daRg==", "dev": true, "license": "BSD-3-Clause" }, "node_modules/puppeteer-core/node_modules/ws": { - "version": "8.19.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.19.0.tgz", - "integrity": "sha512-blAT2mjOEIi0ZzruJfIhb3nps74PRWTCz1IjglWEEpQl5XS/UNama6u2/rjFkDDouqr4L67ry+1aGIALViWjDg==", + "version": "8.20.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.20.0.tgz", + "integrity": "sha512-sAt8BhgNbzCtgGbt2OxmpuryO63ZoDk/sqaB/znQm94T4fCEsy/yV+7CdC1kJhOU9lboAEU7R3kquuycDoibVA==", "dev": true, "license": "MIT", "engines": { @@ -4239,12 +4230,13 @@ } }, "node_modules/resolve": { - "version": "1.22.11", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", - "integrity": "sha512-RfqAvLnMl313r7c9oclB1HhUEAezcpLjz95wFH4LVuhk9JF/r22qmVP9AMmOU4vMX7Q8pN8jwNg/CSpdFnMjTQ==", + "version": "1.22.12", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.12.tgz", + "integrity": "sha512-TyeJ1zif53BPfHootBGwPRYT1RUt6oGWsaQr8UyZW/eAm9bKoijtvruSDEmZHm92CwS9nj7/fWttqPCgzep8CA==", "dev": true, "license": "MIT", "dependencies": { + "es-errors": "^1.3.0", "is-core-module": "^2.16.1", "path-parse": "^1.0.7", "supports-preserve-symlinks-flag": "^1.0.0" @@ -4336,14 +4328,14 @@ "license": "MIT" }, "node_modules/sass": { - "version": "1.97.3", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.97.3.tgz", - "integrity": "sha512-fDz1zJpd5GycprAbu4Q2PV/RprsRtKC/0z82z0JLgdytmcq0+ujJbJ/09bPGDxCLkKY3Np5cRAOcWiVkLXJURg==", + "version": "1.99.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", + "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", "dev": true, "license": "MIT", "dependencies": { "chokidar": "^4.0.0", - "immutable": "^5.0.2", + "immutable": "^5.1.5", "source-map-js": ">=0.6.2 <2.0.0" }, "bin": { @@ -4546,9 +4538,9 @@ "license": "MIT" }, "node_modules/streamx": { - "version": "2.23.0", - "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.23.0.tgz", - "integrity": "sha512-kn+e44esVfn2Fa/O0CPFcex27fjIL6MkVae0Mm6q+E6f0hWv578YCERbv+4m02cjxvDsPKLnmxral/rR6lBMAg==", + "version": "2.25.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.25.0.tgz", + "integrity": "sha512-0nQuG6jf1w+wddNEEXCF4nTg3LtufWINB5eFEN+5TNZW7KWJp6x87+JFL43vaAUPyCfH1wID+mNVyW6OHtFamg==", "dev": true, "license": "MIT", "dependencies": { @@ -4660,9 +4652,9 @@ } }, "node_modules/tar-fs": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.1.tgz", - "integrity": "sha512-LZA0oaPOc2fVo82Txf3gw+AkEd38szODlptMYejQUhndHMLQ9M059uXR+AfS7DNo0NpINvSqDsvyaCrBVkptWg==", + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.1.2.tgz", + "integrity": "sha512-QGxxTxxyleAdyM3kpFs14ymbYmNFrfY+pHj7Z8FgtbZ7w2//VAgLMac7sT6nRpIHjppXO2AwwEOg0bPFVRcmXw==", "dev": true, "license": "MIT", "dependencies": { @@ -4675,13 +4667,14 @@ } }, "node_modules/tar-stream": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", - "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.8.tgz", + "integrity": "sha512-U6QpVRyCGHva435KoNWy9PRoi2IFYCgtEhq9nmrPPpbRacPs9IH4aJ3gbrFC8dPcXvdSZ4XXfXT5Fshbp2MtlQ==", "dev": true, "license": "MIT", "dependencies": { "b4a": "^1.6.4", + "bare-fs": "^4.5.5", "fast-fifo": "^1.2.0", "streamx": "^2.15.0" } @@ -4724,20 +4717,20 @@ } }, "node_modules/tldts-core": { - "version": "7.0.23", - "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.23.tgz", - "integrity": "sha512-0g9vrtDQLrNIiCj22HSe9d4mLVG3g5ph5DZ8zCKBr4OtrspmNB6ss7hVyzArAeE88ceZocIEGkyW1Ime7fxPtQ==", + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts-core/-/tldts-core-7.0.28.tgz", + "integrity": "sha512-7W5Efjhsc3chVdFhqtaU0KtK32J37Zcr9RKtID54nG+tIpcY79CQK/veYPODxtD/LJ4Lue66jvrQzIX2Z2/pUQ==", "dev": true, "license": "MIT" }, "node_modules/tldts-icann": { - "version": "7.0.23", - "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-7.0.23.tgz", - "integrity": "sha512-LMc6V1KOHFjKDU8wyDsIEJdV8o2bpc2OaYw2NxncJB2oZxJMPpiNVAbiu1HnqsUy81fkK1QWwFztVqY81hUFEg==", + "version": "7.0.28", + "resolved": "https://registry.npmjs.org/tldts-icann/-/tldts-icann-7.0.28.tgz", + "integrity": "sha512-brkN3yIgYTzBpSxB71XYBwUMDgutmKmA+6TWzgGD/EPcvCc6LHMTRaYj9ik1u3BxhSW53qIK/7cgjA2rF7BgbA==", "dev": true, "license": "MIT", "dependencies": { - "tldts-core": "^7.0.23" + "tldts-core": "^7.0.28" } }, "node_modules/to-regex-range": { @@ -4787,9 +4780,9 @@ } }, "node_modules/typed-query-selector": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.0.tgz", - "integrity": "sha512-SbklCd1F0EiZOyPiW192rrHZzZ5sBijB6xM+cpmrwDqObvdtunOHHIk9fCGsoK5JVIYXoyEp4iEdE3upFH3PAg==", + "version": "2.12.1", + "resolved": "https://registry.npmjs.org/typed-query-selector/-/typed-query-selector-2.12.1.tgz", + "integrity": "sha512-uzR+FzI8qrUEIu96oaeBJmd9E7CFEiQ3goA5qCVgc4s5llSubcfGHq9yUstZx/k4s9dXHVKsE35YWoFyvEqEHA==", "dev": true, "license": "MIT" }, diff --git a/package.json b/package.json index c8bd75c..589fe64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "cooked", - "version": "1.13.0", + "version": "1.14.0", "description": "Cooked is the absolute best way to create & display recipes with WordPress. SEO optimized (rich snippets), galleries, cooking timers, printable recipes and much more.", "main": "index.js", "scripts": { diff --git a/readme.txt b/readme.txt index 8ddc143..7d2e567 100644 --- a/readme.txt +++ b/readme.txt @@ -2,8 +2,8 @@ Contributors: xjsv, boxystudio Tags: recipe, recipes, food, cooking, nutrition Requires at least: 4.7 -Tested up to: 6.9.1 -Stable tag: 1.13.0 +Tested up to: 6.9.4 +Stable tag: 1.14.0 Requires PHP: 7.4 License: GPLv2 or later License URI: https://www.gnu.org/licenses/gpl-2.0.html @@ -80,12 +80,18 @@ Please report security bugs found in the source code of the Cooked plugin throug == Upgrade Notice == -Version 1.13.0 includes CSV import functionality, changes to the [cooked-related-recipes] shortcode, and other minor improvements and bug fixes. +Version 1.14.0 includes == Changelog == += 1.14.0 = +* **NEW:** Added a new "Add Bulk Ingredients" and "Add Bulk Directions" buttons to the recipe builder. +* **FIX:** Validated style attribute for the [cooked-recipe-card] and [cooked-categories] shortcodes. +* **TWEAK:** Added Ingredient Substitution fields to the migration and imports features. +* **TWEAK:** Updated the "Apply to All" template update feature to fix potential performance issues with large recipe collections. + = 1.13.0 = -* **NEW:** Added CSV import functionality for bulk importing recipes from CSV files. Supports all recipe fields including ingredients with substitutions, directions, nutrition data, categories, and tags. +* **NEW:** Added CSV import functionality for bulk importing recipes from CSV files. Supports all recipe fields including ingredients with substitutions, directions, nutrition data, categories, and tags (thanks to @mgiannopoulos24). * **TWEAK:** Simplified the way the [cooked-related-recipes] shortcode works. * **FIX:** Fixed a bug with the recipe directions and ingredients not being sortable in mobile devices. * **FIX:** Fixed a bug when toggling full screen view in recipe fields that use the WP Editor. diff --git a/vendor/composer/installed.php b/vendor/composer/installed.php index 90e264a..98ed554 100644 --- a/vendor/composer/installed.php +++ b/vendor/composer/installed.php @@ -1,8 +1,8 @@ array( 'name' => 'xjsv/cooked', - 'pretty_version' => '1.13.0', - 'version' => '1.13.0.0', + 'pretty_version' => '1.14.0', + 'version' => '1.14.0.0', 'reference' => null, 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', @@ -20,8 +20,8 @@ 'dev_requirement' => false, ), 'xjsv/cooked' => array( - 'pretty_version' => '1.13.0', - 'version' => '1.13.0.0', + 'pretty_version' => '1.14.0', + 'version' => '1.14.0.0', 'reference' => null, 'type' => 'wordpress-plugin', 'install_path' => __DIR__ . '/../../', From 04d3e7a406f475b7e91422513a2536a5f5cb3823 Mon Sep 17 00:00:00 2001 From: Armand Tresova Date: Mon, 20 Apr 2026 20:34:22 -0400 Subject: [PATCH 6/8] Removed automatic removal of empty ingredient or directions --- assets/admin/js/cooked-functions.js | 87 ------------------------- assets/admin/js/cooked-functions.min.js | 2 +- 2 files changed, 1 insertion(+), 88 deletions(-) diff --git a/assets/admin/js/cooked-functions.js b/assets/admin/js/cooked-functions.js index 5e0bed7..021d0a5 100644 --- a/assets/admin/js/cooked-functions.js +++ b/assets/admin/js/cooked-functions.js @@ -1370,93 +1370,8 @@ function cooked_init_bulk_add($) { }); } -/** Returns true if an ingredient row has no meaningful field values (heading or line fields). */ -function cooked_is_ingredient_block_empty($block) { - if ($block.hasClass('cooked-ingredient-heading')) { - return ($block.find('[data-ingredient-part="section_heading_name"]').val() || '').trim() === ''; - } - var hasContent = false; - $block.find('[data-ingredient-part]').each(function() { - var part = jQuery(this).data('ingredient-part'); - if (part === 'section_heading_element') { - return; - } - var $f = jQuery(this); - var v = $f.is('select') ? $f.val() : ($f.val() || '').trim(); - if (v !== null && v !== '' && String(v).trim() !== '') { - hasContent = true; - return false; - } - }); - return !hasContent; -} - -/** Plain-text direction step content from TinyMCE or textarea (HTML stripped, NBSPs normalized). */ -function cooked_direction_block_content_text($block) { - var $ta = $block.find('textarea[data-direction-part="content"]'); - if (!$ta.length) { - return ''; - } - var id = $ta.attr('id'); - var raw = ''; - if (id && typeof tinymce !== 'undefined' && tinymce.get(id)) { - raw = tinymce.get(id).getContent() || ''; - } else { - raw = $ta.val() || ''; - } - return jQuery('
').html(raw).text().replace(/\u00a0/g, ' ').trim(); -} - -/** Returns true if a direction row is empty (no heading text, image, or body content). */ -function cooked_is_direction_block_empty($block) { - if ($block.hasClass('cooked-direction-heading')) { - return ($block.find('[data-direction-part="section_heading_name"]').val() || '').trim() === ''; - } - if (($block.find('input[data-direction-part="image"]').val() || '').trim() !== '') { - return false; - } - return cooked_direction_block_content_text($block) === ''; -} - -/** Removes ingredient rows that are empty before bulk-adding new items. */ -function cooked_bulk_remove_empty_ingredient_rows() { - jQuery('#cooked-ingredients-builder').children('.cooked-ingredient-block').each(function() { - var $b = jQuery(this); - if (cooked_is_ingredient_block_empty($b)) { - $b.remove(); - } - }); -} - -/** Removes empty direction rows before bulk-adding, and removes WP editors when needed. */ -function cooked_bulk_remove_empty_direction_rows() { - var canRemoveWpEditor = !!( - cooked_admin_functions_js_vars.wp_editor_roles_allowed && - typeof wp !== 'undefined' && - wp.editor && - typeof wp.editor.remove === 'function' - ); - - jQuery('#cooked-directions-builder').children('.cooked-direction-block').each(function() { - var $b = jQuery(this); - if (!cooked_is_direction_block_empty($b)) { - return; - } - if (canRemoveWpEditor) { - var $ta = $b.find('textarea[data-direction-part="content"]'); - var fieldID = $ta.attr('id'); - if (fieldID) { - wp.editor.remove(fieldID); - } - } - $b.remove(); - }); -} - /** Appends direction rows from bulk-add items (headings or plain steps) and resets the builder. */ function cooked_bulk_add_directions(items) { - cooked_bulk_remove_empty_direction_rows(); - var $_builder = jQuery('#cooked-directions-builder'); var $_parent = $_builder.parent(); @@ -1483,8 +1398,6 @@ function cooked_bulk_add_directions(items) { /** Appends ingredient rows from bulk-add items (headings or amount/unit/name) and resets the builder. */ function cooked_bulk_add_ingredients_parsed(items) { - cooked_bulk_remove_empty_ingredient_rows(); - var $_builder = jQuery('#cooked-ingredients-builder'); var $_parent = $_builder.parent(); diff --git a/assets/admin/js/cooked-functions.min.js b/assets/admin/js/cooked-functions.min.js index 12e54b8..a93de4f 100644 --- a/assets/admin/js/cooked-functions.min.js +++ b/assets/admin/js/cooked-functions.min.js @@ -1 +1 @@ -var $_CookedConditionalTimeout=!1,cookedSortableTouchHandler=function(e){var t={touchstart:"mousedown",touchmove:"mousemove",touchend:"mouseup"},o=e.target.closest(".cooked-icon-drag");o&&o.closest(".cooked-sortable")&&e.changedTouches&&e.changedTouches.length&&t[e.type]&&(o=e.changedTouches[0],e.preventDefault(),t=new MouseEvent(t[e.type],{bubbles:!0,cancelable:!0,view:window,detail:1,screenX:o.screenX,screenY:o.screenY,clientX:o.clientX,clientY:o.clientY,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null}),o.target.dispatchEvent(t))},cooked_recipe_update_counter=((_=>{_(document).ready(function(){var c,o,t,e,i,n,d,a,r,l=_(".cooked-color-field"),s=_("#cooked_recipe_settings").find("select"),u=_("#cooked-recipe-tabs"),k=(_("#cooked-settings-wrap"),_("#cooked_recipe_settings")),p=k.find("input#submit");$_CookedTooltips=_(".cooked-tooltip"),$_CookedConditionals=_(".cooked-conditional-hidden"),$_CookedSortable=_(".cooked-sortable"),$_CookedRecipeSaveDefault=_(".cooked-layout-save-default"),$_CookedShortcodeField=_(".cooked-shortcode-field"),$_CookedIngredientBuilder=_("#cooked-ingredients-builder"),$_CookedAutoNutritionButton=_(".cooked-auto-nutrition-button"),$_CookedDirectionBuilder=_("#cooked-directions-builder"),$_CookedRecipeGallery=_("#cooked-recipe-image-gallery"),$_CookedNutritionFactsTab=_("#cooked-recipe-tab-content-nutrition"),$_CookedSettingsPanel=_("#cooked-settings-panel"),$_CookedSettingsTabs=_("#cooked-settings-tabs"),l.length&&l.wpColorPicker(),$_CookedSortable.length&&(document.addEventListener("touchstart",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchmove",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchend",cookedSortableTouchHandler,{passive:!1}),$_CookedSortable.find(".cooked-icon-drag").length?$_CookedSortable.sortable({handle:".cooked-icon-drag",stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder();var t=t.item.find("textarea"),o=!(!cooked_admin_functions_js_vars.wp_editor_roles_allowed||"undefined"==typeof wp||!wp.editor||"function"!=typeof wp.editor.remove||"function"!=typeof wp.editor.initialize);t.length&&o&&(o=t.attr("name"),t=t.attr("id"),wp.editor.remove(t),wp.editor.initialize(t,{tinymce:{wpautop:!1,toolbar1:"bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,wp_link_advanced,unlink,fullscreen",toolbar2:"",toolbar3:"",toolbar4:"",height:100,textarea_name:o,plugins:"link lists fullscreen wordpress wplink",setup:function(e){}},quicktags:!0,mediaButtons:!1}))}}):$_CookedSortable.sortable({stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder()}})),$_CookedRecipeSaveDefault.length&&($_CookedRecipeSaveDefault.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],trigger:"click",animation:"grow",delay:0,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0,functionReady:function(r,e){_(".cooked-save-default-all").on("click",function(e){e.preventDefault();var t,o=_(this),e=o.data("nonce"),i=o.data("bulk-nonce"),n=o.parent(),d=confirm(cooked_admin_functions_js_vars.i18n_confirm_save_default_all),a=_("#_recipe_settings_content"),c=tinymce.get("_recipe_settings_content");t=null===c?a.val():c.getContent(),d&&!o.hasClass("disabled")&&(n.find(".button, .button-primary").addClass("disabled"),_.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:t,nonce:e},function(){_.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_get_recipe_count",nonce:i},function(e){o.removeClass("button-primary").addClass("button"),e&&e.success&&0')}),$_CookedTooltips.length&&$_CookedTooltips.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],animation:"grow",delay:100,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0}),$_CookedShortcodeField.length&&$_CookedShortcodeField.on("click",function(e){_(this).select()}),$_CookedConditionals.length&&(c=[],$_CookedConditionals.each(function(){var e=_(this),t=_(this).data("condition"),o=_(this).data("value"),i=_("#"+t),o=!!o&&o.split(" "),n=e.is("li")||e.is("span")?"inline-block":"block";i.is(":checkbox")&&i.is(":checked")||i.is(":radio")&&i.is(":checked")||!(i.is(":checkbox")&&!i.is(":checked")||i.is(":radio")&&!i.is(":checked"))&&(!i.is(":checkbox")&&!o&&i.val()||!i.is(":checkbox")&&o&&-1<_.inArray(i.val(),o)||!i.is(":radio")&&!o&&i.val()||!i.is(":radio")&&o&&-1<_.inArray(i.val(),o))?e.css({display:n}):e.hide(),-1==_.inArray(t,c)&&c.push(t);for(var d=c.length,a=0;a a").attr("href")).split("#"))[1],_(".cooked-settings-tab-content").hide(),_("#cooked-settings-tab-content-"+n).show(),s.on("click",function(e){_(".tab-content").hide();var t=_(this).find("a"),t=($_CookedSettingsTabs.find("li").removeClass("active"),_(this).addClass("active"),t.attr("href"));"migration"==(t=(t=t.split("#"))[1])?p.hide():p.show(),_(".cooked-settings-tab-content").hide(),_("#cooked-settings-tab-content-"+t).show(),_("#cooked-settings-panel").hasClass("stuck")?window.scrollTo(0,130):window.scrollTo(0,0)})),$_CookedIngredientBuilder.length&&(cooked_reset_ingredient_builder(),$_CookedIngredientBuilder.on("keydown",'input[data-ingredient-part="name"]',function(e){9!==e.keyCode&&13!==e.keyCode||_(this).parents(".cooked-ingredient-block").is(":last-child")&&(e.preventDefault(),_("#cooked-recipe-tab-content-ingredients").find(".cooked-add-ingredient-button").trigger("click"),$_CookedIngredientBuilder.find('.cooked-ingredient-block:last-child input[data-ingredient-part="amount"]').focus())}),$_CookedIngredientBuilder.parent().on("click",".cooked-show-substitution",function(e){e.preventDefault();e=_(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-ingredient-part="sub_amount"]').focus())}),$_CookedIngredientBuilder.on("keyup change",'input[data-ingredient-part="sub_amount"], input[data-ingredient-part="sub_name"], select[data-ingredient-part="sub_measurement"]',function(e){var t=_(this).parents(".recipe-setting-block"),o=t.find('input[data-ingredient-part="sub_name"]').val();o&&o.trim()?t.addClass("cooked-has-substitution"):t.removeClass("cooked-has-substitution")}),$_CookedAutoNutritionButton.length&&$_CookedIngredientBuilder.on("change",'input[data-ingredient-part="name"]',function(e){var t=!1;$_CookedIngredientBuilder.find('input[data-ingredient-part="name"]').each(function(){if(""!=_(this).val())return!(t=!0)}),t?$_CookedAutoNutritionButton.prop("disabled",!1):$_CookedAutoNutritionButton.prop("disabled",!0)}),$_CookedIngredientBuilder.on("keyup",'input[data-ingredient-part="url"]',function(e){var t=_(this).val(),o=_(this).parents(".recipe-setting-block");t?o.addClass("cooked-has-url"):o.removeClass("cooked-has-url")}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-ingredient-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-ingredient-template").clone().removeClass("cooked-template cooked-ingredient-template").addClass("cooked-ingredient-block");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-ingredient-block cooked-ingredient-heading");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-delete-ingredient",function(e){e.preventDefault(),_(this).parent().remove(),cooked_reset_ingredient_builder()})),$_CookedDirectionBuilder.length&&(cooked_reset_direction_builder(),$_CookedDirectionBuilder.parent().on("click",".cooked-show-heading-element",function(e){e.preventDefault();e=_(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-direction-part="section_heading_element"]').focus())}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-direction-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-direction-template").clone().removeClass("cooked-template cooked-direction-template").addClass("cooked-direction-block");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-direction-block cooked-direction-heading");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-delete-direction",function(e){e.preventDefault();var t,e=_(this).parent();cooked_admin_functions_js_vars.wp_editor_roles_allowed&&"undefined"!=typeof wp&&wp.editor&&"function"==typeof wp.editor.remove&&(t=e.find('textarea[data-direction-part="content"]').attr("id"))&&wp.editor.remove(t),e.remove(),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".remove-image-button",function(e){e.preventDefault();e=_(this).parent();e.removeClass("cooked-has-image"),e.find("img").attr("src","").removeAttr("srcset").removeAttr("sizes"),e.find('input[data-direction-part="image"]').val(""),cooked_reset_direction_builder()}),_("body").on("click",".cooked-direction-img-placeholder, .cooked-direction-img",function(e){e.preventDefault(),_(this).parent().find(".direction-image-button").trigger("click")}),_("body").on("click",".direction-image-button",function(e){var t=_(this);a=t.data("id"),e.preventDefault(),d||(d=wp.media.frames.direction_image_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_image_title,button:{text:cooked_admin_functions_js_vars.i18n_image_button},library:{type:"image"}})).on("select",function(){var e=d.state().get("selection").first().toJSON();_("#direction-"+a+"-image-src").attr("src",e.sizes.thumbnail.url).removeAttr("srcset").removeAttr("sizes").parent().addClass("cooked-has-image"),_('input[name="_recipe_settings[directions]['+a+'][image]"]').val(e.id),_('.direction-image-button[data-id="'+a+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_change)}),d.open()})),cooked_init_bulk_add(_),$_CookedRecipeGallery.length&&(cooked_init_gallery_sorting(),_("body").on("click",".cooked-gallery-add-button",function(e){_(this);e.preventDefault(),r||(r=wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_gallery_image_title,button:{text:cooked_admin_functions_js_vars.i18n_gallery_image_title},library:{type:"image"},multiple:!0})).on("select",function(){var e,t,o,i=r.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,_("#cooked-recipe-image-gallery").append(''));cooked_init_gallery_sorting()}),r.open()}),_("body").on("click",".cooked-recipe-gallery-item img",function(e){e.preventDefault(),_(this).parent().find(".cooked-gallery-edit-button").trigger("click")}),_("body").on("click",".cooked-gallery-edit-button",function(e){var n=_(this),t=n.data("attachment-id"),d=(e.preventDefault(),wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_edit_image_title,button:{text:cooked_admin_functions_js_vars.i18n_edit_image_button},library:{type:"image"},multiple:!1}));d.on("open",function(){var e=d.state().get("selection");(attachment=wp.media.attachment(t)).fetch(),e.add(attachment?[attachment]:[])}),d.open(),d.on("select",function(){var e,t,o,i=d.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,n.parent().replaceWith(''));cooked_init_gallery_sorting()})}),$_CookedRecipeGallery.on("click",".remove-image-button",function(e){var t=_(this);a=t.data("id"),e.preventDefault(),a?(_("#direction-"+a+"-image-src").parent().removeClass("cooked-has-image").prop("src",!1),_('input[name="_recipe_settings[directions]['+a+'][image]"]').val(""),_('.direction-image-button[data-id="'+a+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_title)):t.parent().remove()})),$_CookedNutritionFactsTab.length&&(init_nutrition_facts($_CookedNutritionFactsTab),$_CookedNutritionFactsTab.on("keyup","input",function(e){init_nutrition_facts($_CookedNutritionFactsTab)})),_("#cooked-prep-time").length&&_("#cooked-prep-time,#cooked-cook-time").on("change",function(){cooked_updateTotalTimeValue(parseInt(_("#cooked-prep-time").val()),parseInt(_("#cooked-cook-time").val()))})})})(jQuery),0),cooked_bulk_per_page=20;function cooked_set_default_template(o,i,n,d,a){var c,r,l;i<=0||(c=jQuery("#cooked-template-progress"),r=c.find(".cooked-progress-bar"),l=jQuery("#cooked-template-progress-text"),c.hasClass("cooked-active")||(c.addClass("cooked-active"),l.addClass("cooked-active"),r.css({width:"0%"}),a.reposition()),jQuery.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default_bulk",page:o,default_content:n,nonce:d},function(e){var t;e&&e.success&&(cooked_recipe_update_counter=Math.min((o+1)*cooked_bulk_per_page,i),t=Math.round(cooked_recipe_update_counter/i*100),r.css({width:t+"%"}),l.text(cooked_recipe_update_counter+" / "+i),e.data.has_more?cooked_set_default_template(o+1,i,n,d,a):(jQuery(".cooked-save-default-all").text(cooked_admin_functions_js_vars.i18n_applied),r.css({width:"100%"}),l.text(i+" / "+i),c.removeClass("cooked-active"),l.removeClass("cooked-active").text(""),a.reposition()))},"json"))}function cooked_updateTotalTimeValue(e,t){jQuery("#cooked-total-time").val(e+t)}function cooked_init_gallery_sorting(){jQuery("#cooked-recipe-image-gallery").sortable()}function init_nutrition_facts(e){e.find("input").each(function(){var e,t=jQuery(this),o=t.attr("id"),t=t.val(),i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]').length;jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').length&&(t?(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text(t),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).show(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).show(),i&&(e=(i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]')).data("pdv"))&&(thisPercent=Math.ceil(t/e*100),i.text(thisPercent))):(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text("___"),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).hide(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).hide()))})}function cooked_reset_ingredient_builder(){var e=jQuery(".cooked-ingredient-block"),t=0,i=0,o=!1;0").text(e).html()}function f(e,t){if(u.empty(),e.length){s.attr("data-bulk-type","ingredients"),s.show(),k.removeAttr("disabled"),u.find(".cooked-bulk-add-preview-header").length||u.prepend('
'+h(_.i18n_bulk_add_amount)+''+h(_.i18n_bulk_add_unit)+''+h(_.i18n_bulk_add_name)+"
");for(var o=0;o
'),d=l('"),a=l('
'),c=l('').text(_.i18n_bulk_add_heading_line_label),r=l('').val(e[o]),c=(a.append(c).append(r),l('')),r=l(''),i=l('');n.append(d).append(a).append(c).append(r).append(i),u.append(n)}}else s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled")}i.length&&(t=l("#cooked-bulk-add-textarea"),s=l("#cooked-bulk-add-preview"),u=l("#cooked-bulk-add-preview-list"),o=l("#cooked-bulk-add-title"),r=l("#cooked-bulk-add-type"),k=i.find(".cooked-bulk-add-submit"),p=i.find(".cooked-bulk-add-spinner"),_=cooked_admin_functions_js_vars,m=null,g="",t.on("input",function(){var e=r.val(),o=(e=>{for(var t=e.split(/[\r\n]+/),o=[],i=0;i
'),a=l('"),c=l('');d.append(a).append(c),u.append(d)}}else s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled")}else t!==g&&(g=t,f(o,null),m&&clearTimeout(m),m=setTimeout(function(){var t;(t=o).length?(p.show().css("visibility","visible"),l.post(_.ajax_url,{action:"cooked_parse_bulk_ingredients",nonce:_.cooked_bulk_add_nonce,lines:t},function(e){p.hide();e=e.success&&e.data&&e.data.parsed?e.data.parsed:null;f(t,e)}).fail(function(){p.hide(),f(t,null)})):f([],null)},400))}),l(document).on("click",".cooked-bulk-add-button",function(e){e.preventDefault();var e=l(this).data("type");e=e,r.val(e),t.val(""),u.empty(),s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled"),p.hide(),g="","ingredients"===e?(o.text(_.i18n_bulk_add_ingredients),t.attr("placeholder",_.i18n_bulk_add_placeholder_ingredients),k.text(_.i18n_bulk_add_submit_ingredients)):(o.text(_.i18n_bulk_add_directions),t.attr("placeholder",_.i18n_bulk_add_placeholder_directions),k.text(_.i18n_bulk_add_submit_directions)),i.show(),t.focus()}),i.on("click",".cooked-bulk-add-close, .cooked-bulk-add-cancel",function(e){e.preventDefault(),n()}),i.on("click",function(e){l(e.target).is(i)&&n()}),l(document).on("keydown",function(e){"Escape"===e.key&&i.is(":visible")&&n()}),u.on("change",'input[type="checkbox"]',function(){var e=l(this).closest(".cooked-bulk-add-preview-row"),t=l(this).is(":checked");e.toggleClass("cooked-bulk-add-is-heading",t)}),k.on("click",function(e){var i;e.preventDefault(),l(this).attr("disabled")||(e=r.val(),i=[],"ingredients"===e?u.find(".cooked-bulk-add-preview-row").each(function(){var e=l(this),t=e.find('input[type="checkbox"]').is(":checked"),o=e.find(".cooked-bulk-add-preview-text").val().trim();o&&i.push(t?{text:o,heading:!0}:{heading:!1,amount:e.find(".cooked-bulk-add-parsed-amount").val().trim(),measurement:e.find(".cooked-bulk-add-parsed-unit").val().trim(),name:e.find(".cooked-bulk-add-parsed-name").val().trim()||o})}):u.find(".cooked-bulk-add-preview-row").each(function(){var e=l(this),t=e.find(".cooked-bulk-add-preview-text").val().trim(),e=e.find('input[type="checkbox"]').is(":checked");t&&i.push({text:t,heading:e})}),i.length&&(("directions"===e?cooked_bulk_add_directions:cooked_bulk_add_ingredients_parsed)(i),n()))}))}function cooked_is_ingredient_block_empty(e){var t;return e.hasClass("cooked-ingredient-heading")?""===(e.find('[data-ingredient-part="section_heading_name"]').val()||"").trim():(t=!1,e.find("[data-ingredient-part]").each(function(){var e;return"section_heading_element"!==jQuery(this).data("ingredient-part")&&null!==(e=(e=jQuery(this)).is("select")?e.val():(e.val()||"").trim())&&""!==e&&""!==String(e).trim()?!(t=!0):void 0}),!t)}function cooked_direction_block_content_text(e){var t,o,e=e.find('textarea[data-direction-part="content"]');return e.length?(o="",o=(t=e.attr("id"))&&"undefined"!=typeof tinymce&&tinymce.get(t)?tinymce.get(t).getContent()||"":e.val()||"",jQuery("
").html(o).text().replace(/\u00a0/g," ").trim()):""}function cooked_is_direction_block_empty(e){return e.hasClass("cooked-direction-heading")?""===(e.find('[data-direction-part="section_heading_name"]').val()||"").trim():""===(e.find('input[data-direction-part="image"]').val()||"").trim()&&""===cooked_direction_block_content_text(e)}function cooked_bulk_remove_empty_ingredient_rows(){jQuery("#cooked-ingredients-builder").children(".cooked-ingredient-block").each(function(){var e=jQuery(this);cooked_is_ingredient_block_empty(e)&&e.remove()})}function cooked_bulk_remove_empty_direction_rows(){var o=!(!cooked_admin_functions_js_vars.wp_editor_roles_allowed||"undefined"==typeof wp||!wp.editor||"function"!=typeof wp.editor.remove);jQuery("#cooked-directions-builder").children(".cooked-direction-block").each(function(){var e,t=jQuery(this);cooked_is_direction_block_empty(t)&&(o&&(e=t.find('textarea[data-direction-part="content"]').attr("id"))&&wp.editor.remove(e),t.remove())})}function cooked_bulk_add_directions(e){cooked_bulk_remove_empty_direction_rows();for(var t=jQuery("#cooked-directions-builder"),o=t.parent(),i=0;i{_(document).ready(function(){var c,o,t,e,i,n,d,a,r,l=_(".cooked-color-field"),s=_("#cooked_recipe_settings").find("select"),u=_("#cooked-recipe-tabs"),k=(_("#cooked-settings-wrap"),_("#cooked_recipe_settings")),p=k.find("input#submit");$_CookedTooltips=_(".cooked-tooltip"),$_CookedConditionals=_(".cooked-conditional-hidden"),$_CookedSortable=_(".cooked-sortable"),$_CookedRecipeSaveDefault=_(".cooked-layout-save-default"),$_CookedShortcodeField=_(".cooked-shortcode-field"),$_CookedIngredientBuilder=_("#cooked-ingredients-builder"),$_CookedAutoNutritionButton=_(".cooked-auto-nutrition-button"),$_CookedDirectionBuilder=_("#cooked-directions-builder"),$_CookedRecipeGallery=_("#cooked-recipe-image-gallery"),$_CookedNutritionFactsTab=_("#cooked-recipe-tab-content-nutrition"),$_CookedSettingsPanel=_("#cooked-settings-panel"),$_CookedSettingsTabs=_("#cooked-settings-tabs"),l.length&&l.wpColorPicker(),$_CookedSortable.length&&(document.addEventListener("touchstart",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchmove",cookedSortableTouchHandler,{passive:!1}),document.addEventListener("touchend",cookedSortableTouchHandler,{passive:!1}),$_CookedSortable.find(".cooked-icon-drag").length?$_CookedSortable.sortable({handle:".cooked-icon-drag",stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder();var t=t.item.find("textarea"),o=!(!cooked_admin_functions_js_vars.wp_editor_roles_allowed||"undefined"==typeof wp||!wp.editor||"function"!=typeof wp.editor.remove||"function"!=typeof wp.editor.initialize);t.length&&o&&(o=t.attr("name"),t=t.attr("id"),wp.editor.remove(t),wp.editor.initialize(t,{tinymce:{wpautop:!1,toolbar1:"bold,italic,underline,blockquote,strikethrough,bullist,numlist,alignleft,aligncenter,alignright,undo,redo,wp_link_advanced,unlink,fullscreen",toolbar2:"",toolbar3:"",toolbar4:"",height:100,textarea_name:o,plugins:"link lists fullscreen wordpress wplink",setup:function(e){}},quicktags:!0,mediaButtons:!1}))}}):$_CookedSortable.sortable({stop:function(e,t){t.item.closest("#cooked-directions-builder").length&&cooked_reset_direction_builder()}})),$_CookedRecipeSaveDefault.length&&($_CookedRecipeSaveDefault.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],trigger:"click",animation:"grow",delay:0,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0,functionReady:function(r,e){_(".cooked-save-default-all").on("click",function(e){e.preventDefault();var t,o=_(this),e=o.data("nonce"),i=o.data("bulk-nonce"),n=o.parent(),d=confirm(cooked_admin_functions_js_vars.i18n_confirm_save_default_all),a=_("#_recipe_settings_content"),c=tinymce.get("_recipe_settings_content");t=null===c?a.val():c.getContent(),d&&!o.hasClass("disabled")&&(n.find(".button, .button-primary").addClass("disabled"),_.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default",default_content:t,nonce:e},function(){_.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_get_recipe_count",nonce:i},function(e){o.removeClass("button-primary").addClass("button"),e&&e.success&&0')}),$_CookedTooltips.length&&$_CookedTooltips.tooltipster({theme:["tooltipster-light","tooltipster-sideTip-cooked"],animation:"grow",delay:100,speed:200,maxWidth:275,contentAsHTML:!0,interactive:!0}),$_CookedShortcodeField.length&&$_CookedShortcodeField.on("click",function(e){_(this).select()}),$_CookedConditionals.length&&(c=[],$_CookedConditionals.each(function(){var e=_(this),t=_(this).data("condition"),o=_(this).data("value"),i=_("#"+t),o=!!o&&o.split(" "),n=e.is("li")||e.is("span")?"inline-block":"block";i.is(":checkbox")&&i.is(":checked")||i.is(":radio")&&i.is(":checked")||!(i.is(":checkbox")&&!i.is(":checked")||i.is(":radio")&&!i.is(":checked"))&&(!i.is(":checkbox")&&!o&&i.val()||!i.is(":checkbox")&&o&&-1<_.inArray(i.val(),o)||!i.is(":radio")&&!o&&i.val()||!i.is(":radio")&&o&&-1<_.inArray(i.val(),o))?e.css({display:n}):e.hide(),-1==_.inArray(t,c)&&c.push(t);for(var d=c.length,a=0;a a").attr("href")).split("#"))[1],_(".cooked-settings-tab-content").hide(),_("#cooked-settings-tab-content-"+n).show(),s.on("click",function(e){_(".tab-content").hide();var t=_(this).find("a"),t=($_CookedSettingsTabs.find("li").removeClass("active"),_(this).addClass("active"),t.attr("href"));"migration"==(t=(t=t.split("#"))[1])?p.hide():p.show(),_(".cooked-settings-tab-content").hide(),_("#cooked-settings-tab-content-"+t).show(),_("#cooked-settings-panel").hasClass("stuck")?window.scrollTo(0,130):window.scrollTo(0,0)})),$_CookedIngredientBuilder.length&&(cooked_reset_ingredient_builder(),$_CookedIngredientBuilder.on("keydown",'input[data-ingredient-part="name"]',function(e){9!==e.keyCode&&13!==e.keyCode||_(this).parents(".cooked-ingredient-block").is(":last-child")&&(e.preventDefault(),_("#cooked-recipe-tab-content-ingredients").find(".cooked-add-ingredient-button").trigger("click"),$_CookedIngredientBuilder.find('.cooked-ingredient-block:last-child input[data-ingredient-part="amount"]').focus())}),$_CookedIngredientBuilder.parent().on("click",".cooked-show-substitution",function(e){e.preventDefault();e=_(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-ingredient-part="sub_amount"]').focus())}),$_CookedIngredientBuilder.on("keyup change",'input[data-ingredient-part="sub_amount"], input[data-ingredient-part="sub_name"], select[data-ingredient-part="sub_measurement"]',function(e){var t=_(this).parents(".recipe-setting-block"),o=t.find('input[data-ingredient-part="sub_name"]').val();o&&o.trim()?t.addClass("cooked-has-substitution"):t.removeClass("cooked-has-substitution")}),$_CookedAutoNutritionButton.length&&$_CookedIngredientBuilder.on("change",'input[data-ingredient-part="name"]',function(e){var t=!1;$_CookedIngredientBuilder.find('input[data-ingredient-part="name"]').each(function(){if(""!=_(this).val())return!(t=!0)}),t?$_CookedAutoNutritionButton.prop("disabled",!1):$_CookedAutoNutritionButton.prop("disabled",!0)}),$_CookedIngredientBuilder.on("keyup",'input[data-ingredient-part="url"]',function(e){var t=_(this).val(),o=_(this).parents(".recipe-setting-block");t?o.addClass("cooked-has-url"):o.removeClass("cooked-has-url")}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-ingredient-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-ingredient-template").clone().removeClass("cooked-template cooked-ingredient-template").addClass("cooked-ingredient-block");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedIngredientBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-ingredient-block cooked-ingredient-heading");$_CookedIngredientBuilder.append(e),cooked_reset_ingredient_builder()}),$_CookedIngredientBuilder.parent().on("click",".cooked-delete-ingredient",function(e){e.preventDefault(),_(this).parent().remove(),cooked_reset_ingredient_builder()})),$_CookedDirectionBuilder.length&&(cooked_reset_direction_builder(),$_CookedDirectionBuilder.parent().on("click",".cooked-show-heading-element",function(e){e.preventDefault();e=_(this).parent();e.hasClass("cooked-expanded")?e.removeClass("cooked-expanded"):(e.addClass("cooked-expanded"),e.find('input[data-direction-part="section_heading_element"]').focus())}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-direction-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-direction-template").clone().removeClass("cooked-template cooked-direction-template").addClass("cooked-direction-block");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-add-heading-button",function(e){e.preventDefault();e=$_CookedDirectionBuilder.parent().find(".cooked-heading-template").clone().removeClass("cooked-template cooked-heading-template").addClass("cooked-direction-block cooked-direction-heading");$_CookedDirectionBuilder.append(e),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".cooked-delete-direction",function(e){e.preventDefault();var t,e=_(this).parent();cooked_admin_functions_js_vars.wp_editor_roles_allowed&&"undefined"!=typeof wp&&wp.editor&&"function"==typeof wp.editor.remove&&(t=e.find('textarea[data-direction-part="content"]').attr("id"))&&wp.editor.remove(t),e.remove(),cooked_reset_direction_builder()}),$_CookedDirectionBuilder.parent().on("click",".remove-image-button",function(e){e.preventDefault();e=_(this).parent();e.removeClass("cooked-has-image"),e.find("img").attr("src","").removeAttr("srcset").removeAttr("sizes"),e.find('input[data-direction-part="image"]').val(""),cooked_reset_direction_builder()}),_("body").on("click",".cooked-direction-img-placeholder, .cooked-direction-img",function(e){e.preventDefault(),_(this).parent().find(".direction-image-button").trigger("click")}),_("body").on("click",".direction-image-button",function(e){var t=_(this);a=t.data("id"),e.preventDefault(),d||(d=wp.media.frames.direction_image_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_image_title,button:{text:cooked_admin_functions_js_vars.i18n_image_button},library:{type:"image"}})).on("select",function(){var e=d.state().get("selection").first().toJSON();_("#direction-"+a+"-image-src").attr("src",e.sizes.thumbnail.url).removeAttr("srcset").removeAttr("sizes").parent().addClass("cooked-has-image"),_('input[name="_recipe_settings[directions]['+a+'][image]"]').val(e.id),_('.direction-image-button[data-id="'+a+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_change)}),d.open()})),cooked_init_bulk_add(_),$_CookedRecipeGallery.length&&(cooked_init_gallery_sorting(),_("body").on("click",".cooked-gallery-add-button",function(e){_(this);e.preventDefault(),r||(r=wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_gallery_image_title,button:{text:cooked_admin_functions_js_vars.i18n_gallery_image_title},library:{type:"image"},multiple:!0})).on("select",function(){var e,t,o,i=r.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,_("#cooked-recipe-image-gallery").append(''));cooked_init_gallery_sorting()}),r.open()}),_("body").on("click",".cooked-recipe-gallery-item img",function(e){e.preventDefault(),_(this).parent().find(".cooked-gallery-edit-button").trigger("click")}),_("body").on("click",".cooked-gallery-edit-button",function(e){var n=_(this),t=n.data("attachment-id"),d=(e.preventDefault(),wp.media.frames.gallery_images_frame=wp.media({title:cooked_admin_functions_js_vars.i18n_edit_image_title,button:{text:cooked_admin_functions_js_vars.i18n_edit_image_button},library:{type:"image"},multiple:!1}));d.on("open",function(){var e=d.state().get("selection");(attachment=wp.media.attachment(t)).fetch(),e.add(attachment?[attachment]:[])}),d.open(),d.on("select",function(){var e,t,o,i=d.state().get("selection").toJSON();for(e in i)i.hasOwnProperty(e)&&(o=(t=i[e]).sizes.thumbnail.url,n.parent().replaceWith(''));cooked_init_gallery_sorting()})}),$_CookedRecipeGallery.on("click",".remove-image-button",function(e){var t=_(this);a=t.data("id"),e.preventDefault(),a?(_("#direction-"+a+"-image-src").parent().removeClass("cooked-has-image").prop("src",!1),_('input[name="_recipe_settings[directions]['+a+'][image]"]').val(""),_('.direction-image-button[data-id="'+a+'"]').prop("value",cooked_admin_functions_js_vars.i18n_image_title)):t.parent().remove()})),$_CookedNutritionFactsTab.length&&(init_nutrition_facts($_CookedNutritionFactsTab),$_CookedNutritionFactsTab.on("keyup","input",function(e){init_nutrition_facts($_CookedNutritionFactsTab)})),_("#cooked-prep-time").length&&_("#cooked-prep-time,#cooked-cook-time").on("change",function(){cooked_updateTotalTimeValue(parseInt(_("#cooked-prep-time").val()),parseInt(_("#cooked-cook-time").val()))})})})(jQuery),0),cooked_bulk_per_page=20;function cooked_set_default_template(o,i,n,d,a){var c,r,l;i<=0||(c=jQuery("#cooked-template-progress"),r=c.find(".cooked-progress-bar"),l=jQuery("#cooked-template-progress-text"),c.hasClass("cooked-active")||(c.addClass("cooked-active"),l.addClass("cooked-active"),r.css({width:"0%"}),a.reposition()),jQuery.post(cooked_admin_functions_js_vars.ajax_url,{action:"cooked_save_default_bulk",page:o,default_content:n,nonce:d},function(e){var t;e&&e.success&&(cooked_recipe_update_counter=Math.min((o+1)*cooked_bulk_per_page,i),t=Math.round(cooked_recipe_update_counter/i*100),r.css({width:t+"%"}),l.text(cooked_recipe_update_counter+" / "+i),e.data.has_more?cooked_set_default_template(o+1,i,n,d,a):(jQuery(".cooked-save-default-all").text(cooked_admin_functions_js_vars.i18n_applied),r.css({width:"100%"}),l.text(i+" / "+i),c.removeClass("cooked-active"),l.removeClass("cooked-active").text(""),a.reposition()))},"json"))}function cooked_updateTotalTimeValue(e,t){jQuery("#cooked-total-time").val(e+t)}function cooked_init_gallery_sorting(){jQuery("#cooked-recipe-image-gallery").sortable()}function init_nutrition_facts(e){e.find("input").each(function(){var e,t=jQuery(this),o=t.attr("id"),t=t.val(),i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]').length;jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').length&&(t?(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text(t),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).show(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).show(),i&&(e=(i=jQuery('.cooked-nut-percent[data-labeltype="'+o+'"]')).data("pdv"))&&(thisPercent=Math.ceil(t/e*100),i.text(thisPercent))):(jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').text("___"),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("li").eq(0).hide(),jQuery('.cooked-nut-label[data-labeltype="'+o+'"]').parents("p").eq(0).hide()))})}function cooked_reset_ingredient_builder(){var e=jQuery(".cooked-ingredient-block"),t=0,i=0,o=!1;0").text(e).html()}function b(e,t){if(u.empty(),e.length){s.attr("data-bulk-type","ingredients"),s.show(),k.removeAttr("disabled"),u.find(".cooked-bulk-add-preview-header").length||u.prepend('
'+h(_.i18n_bulk_add_amount)+''+h(_.i18n_bulk_add_unit)+''+h(_.i18n_bulk_add_name)+"
");for(var o=0;o
'),d=l('"),a=l('
'),c=l('').text(_.i18n_bulk_add_heading_line_label),r=l('').val(e[o]),c=(a.append(c).append(r),l('')),r=l(''),i=l('');n.append(d).append(a).append(c).append(r).append(i),u.append(n)}}else s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled")}i.length&&(t=l("#cooked-bulk-add-textarea"),s=l("#cooked-bulk-add-preview"),u=l("#cooked-bulk-add-preview-list"),o=l("#cooked-bulk-add-title"),r=l("#cooked-bulk-add-type"),k=i.find(".cooked-bulk-add-submit"),p=i.find(".cooked-bulk-add-spinner"),_=cooked_admin_functions_js_vars,g=null,m="",t.on("input",function(){var e=r.val(),o=(e=>{for(var t=e.split(/[\r\n]+/),o=[],i=0;i'),a=l('"),c=l('');d.append(a).append(c),u.append(d)}}else s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled")}else t!==m&&(m=t,b(o,null),g&&clearTimeout(g),g=setTimeout(function(){var t;(t=o).length?(p.show().css("visibility","visible"),l.post(_.ajax_url,{action:"cooked_parse_bulk_ingredients",nonce:_.cooked_bulk_add_nonce,lines:t},function(e){p.hide();e=e.success&&e.data&&e.data.parsed?e.data.parsed:null;b(t,e)}).fail(function(){p.hide(),b(t,null)})):b([],null)},400))}),l(document).on("click",".cooked-bulk-add-button",function(e){e.preventDefault();var e=l(this).data("type");e=e,r.val(e),t.val(""),u.empty(),s.attr("data-bulk-type",""),s.hide(),k.attr("disabled","disabled"),p.hide(),m="","ingredients"===e?(o.text(_.i18n_bulk_add_ingredients),t.attr("placeholder",_.i18n_bulk_add_placeholder_ingredients),k.text(_.i18n_bulk_add_submit_ingredients)):(o.text(_.i18n_bulk_add_directions),t.attr("placeholder",_.i18n_bulk_add_placeholder_directions),k.text(_.i18n_bulk_add_submit_directions)),i.show(),t.focus()}),i.on("click",".cooked-bulk-add-close, .cooked-bulk-add-cancel",function(e){e.preventDefault(),n()}),i.on("click",function(e){l(e.target).is(i)&&n()}),l(document).on("keydown",function(e){"Escape"===e.key&&i.is(":visible")&&n()}),u.on("change",'input[type="checkbox"]',function(){var e=l(this).closest(".cooked-bulk-add-preview-row"),t=l(this).is(":checked");e.toggleClass("cooked-bulk-add-is-heading",t)}),k.on("click",function(e){var i;e.preventDefault(),l(this).attr("disabled")||(e=r.val(),i=[],"ingredients"===e?u.find(".cooked-bulk-add-preview-row").each(function(){var e=l(this),t=e.find('input[type="checkbox"]').is(":checked"),o=e.find(".cooked-bulk-add-preview-text").val().trim();o&&i.push(t?{text:o,heading:!0}:{heading:!1,amount:e.find(".cooked-bulk-add-parsed-amount").val().trim(),measurement:e.find(".cooked-bulk-add-parsed-unit").val().trim(),name:e.find(".cooked-bulk-add-parsed-name").val().trim()||o})}):u.find(".cooked-bulk-add-preview-row").each(function(){var e=l(this),t=e.find(".cooked-bulk-add-preview-text").val().trim(),e=e.find('input[type="checkbox"]').is(":checked");t&&i.push({text:t,heading:e})}),i.length&&(("directions"===e?cooked_bulk_add_directions:cooked_bulk_add_ingredients_parsed)(i),n()))}))}function cooked_bulk_add_directions(e){for(var t=jQuery("#cooked-directions-builder"),o=t.parent(),i=0;i Date: Mon, 20 Apr 2026 20:42:01 -0400 Subject: [PATCH 7/8] Updated Readme --- readme.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.txt b/readme.txt index 7d2e567..6e8cb71 100644 --- a/readme.txt +++ b/readme.txt @@ -80,7 +80,7 @@ Please report security bugs found in the source code of the Cooked plugin throug == Upgrade Notice == -Version 1.14.0 includes +Version 1.14.0 adds bulk ingredient and direction entry, validates shortcode style attributes, extends migration and imports with ingredient substitution fields, and speeds up “Apply to All” template updates on large sites. == Changelog == From b99cf37c4d27cc5520d1f0708c3605e793888904 Mon Sep 17 00:00:00 2001 From: Armand Tresova Date: Mon, 20 Apr 2026 21:06:37 -0400 Subject: [PATCH 8/8] Bumped Tested up to: 7.0 --- readme.txt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.txt b/readme.txt index 6e8cb71..4f35878 100644 --- a/readme.txt +++ b/readme.txt @@ -1,8 +1,8 @@ === Cooked - Recipe Management === Contributors: xjsv, boxystudio Tags: recipe, recipes, food, cooking, nutrition -Requires at least: 4.7 -Tested up to: 6.9.4 +Requires at least: 5.0.0 +Tested up to: 7.0 Stable tag: 1.14.0 Requires PHP: 7.4 License: GPLv2 or later